1%D \module 2%D [ file=s-lan-04, 3%D version=2011.05.01, 4%D title=\CONTEXT\ Style File, 5%D subtitle=Language Environment 4, 6%D author=Hans Hagen, 7%D date=\currentdate, 8%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] 9%C 10%C This module is part of the \CONTEXT\ macro||package and is 11%C therefore copyrighted by \PRAGMA. See mreadme.pdf for 12%C details. 13 14%D For Mojca. 15 16% \enabletrackers[fonts.goodies,languages.patterns] 17 18% TODO: lm, lo, mn 19 20\startluacode 21 local a_colormodel = attributes.private('colormodel') 22 23 local nodecodes = nodes.nodecodes 24 local nodepool = nodes.pool 25 local disc = nodecodes.disc 26 local glyph = nodecodes.glyph 27 local quads = fonts.hashes.quads 28 local newkern = nodepool.kern 29 local newrule = nodepool.rule 30 local newglue = nodepool.glue 31 32 local get_attribute = node.has_attribute 33 34 local tracers = nodes.tracers 35 local colortracers = tracers and tracers.colors 36 local setnodecolor = colortracers.set 37 38 local function identify(head,marked) 39 local current, prev = head, nil 40 while current do 41 local id = current.id 42 local next = current.next 43 if id == disc then 44 if prev and next.id == glyph then -- catch other usage of disc 45 marked[#marked+1] = prev 46 end 47 elseif id == glyph then 48 prev = current 49 end 50 current = next 51 end 52 end 53 54 local function strip(head,marked) 55 for i=1,#marked do 56 local prev = marked[i] 57 nodes.remove(head,prev.next,true) 58 end 59 end 60 61 local function mark(head,marked,what,how) 62 -- local xquad = quads[marked[1].font] 63 head, prev = node.insert_after(head,prev,newkern(1000)) 64 for i=1,#marked do 65 local prev = marked[i] 66 local font = prev.font 67 local quad = quads[font] 68 head, prev = node.insert_after(head,prev,newkern(-quad/20)) 69 -- head, prev = node.insert_after(head,prev,newkern(0)) 70 if what then 71-- local rule = newrule(quad/10,.75*quad,-0.3*quad) 72 local rule = newrule(quad/10,.15*quad,0*quad) 73 head, prev = node.insert_after(head,prev,rule) 74 setnodecolor(rule,how,get_attribute(prev,a_colormodel)) 75 else 76-- local rule = newrule(quad/10,.15*quad,.3*quad) 77 local rule = newrule(quad/10,.75*quad,0*quad) 78 head, prev = node.insert_after(head,prev,rule) 79 setnodecolor(rule,how,get_attribute(prev,a_colormodel)) 80 end 81 head, prev = node.insert_after(head,prev,newkern(-quad/20)) 82-- head, prev = node.insert_after(head,prev,newkern(0)) 83 head, prev = node.insert_after(head,prev,newglue(0)) 84 end 85-- head, prev = node.insert_after(head,prev,newkern(quad/40)) 86 end 87 88 local language_one, language_two, tag_one, tag_two 89 90 function nodes.showhyphens(head) 91 local marked_1, marked_2 = { }, { } 92 if language_one then 93 for n in node.traverse_id(glyph,head) do 94 n.lang = language_one 95 end 96 lang.hyphenate(head,node.slide(head)) 97 identify(head,marked_1) 98 strip(head,marked_1) 99 end 100 if language_two then 101 for n in node.traverse_id(glyph,head) do 102 n.lang = language_two 103 end 104 lang.hyphenate(head,node.slide(head)) 105 identify(head,marked_2) 106 strip(head,marked_2) 107 end 108 mark(head,marked_1,true,"hyphenation:"..tag_one) 109 if not tag_2 ~= nil then 110 mark(head,marked_2,false,"hyphenation:"..tag_two) 111 end 112 if language_one then 113 for n in node.traverse_id(glyph,head) do 114 n.lang = language_one 115 end 116 lang.hyphenate(head,node.slide(head)) 117 end 118 return head, true 119 end 120 121 function languages.startcomparepatterns(list) 122 local list = utilities.parsers.settings_to_array(list) 123 tag_one = list[1] 124 tag_two = list[2] 125 language_one = tag_one and languages.getnumber(tag_one) 126 language_two = tag_two and languages.getnumber(tag_two) 127 -- nodes.tasks.appendaction("processors","words","nodes.showhyphens") 128 nodes.tasks.appendaction("processors","before","nodes.showhyphens") 129 nodes.tasks.enableaction("processors","nodes.showhyphens") 130 end 131 132 function languages.stopcomparepatterns() 133 nodes.tasks.disableaction("processors","nodes.showhyphens") 134 end 135 136\stopluacode 137 138\unprotect 139 140\def\startcomparepatterns[#1]% 141 {\bgroup 142 \language\zerocount 143 \setupalign[\v!nothyphenated]% 144 \ctxlua{languages.startcomparepatterns("#1")}} 145 146\def\stopcomparepatterns 147 {\ctxlua{languages.stopcomparepatterns()}% 148 \egroup} 149 150\protect 151 152\definecolor[hyphenation:ka] [b=1.] 153\definecolor[hyphenation:ka2] [r=.8] 154\definecolor[hyphenation:en] [g=.8] 155% \definecolor[hyphenation:nl] [b=.8] 156 157% \doifnotmode{demo}{\endinput} 158 159\installlanguage 160 [ka] 161 [patterns=ka, 162 lefthyphenchar=-1, 163 righthyphenchar=-1, 164 ] 165\installlanguage 166 [ka2] 167 [patterns=ka, % use different patterns 168 lefthyphenchar=-1, 169 righthyphenchar=-1, 170 ] 171\mainlanguage 172 [ka] 173 174\starttypescript[serif][arial] 175 \definefontsynonym [Serif] [file:Arial Unicode.ttf] [features=default] 176\stoptypescript 177 178\starttypescript[arial] 179 \definetypeface [arial] [rm] [serif] [arial] [default] 180\stoptypescript 181 182 183\setupbodyfont[arial] 184 185\setupwhitespace 186 [big] 187 188\definecolor[colorscheme:3:1][r=.8,b=.8] 189\definecolor[colorscheme:3:2][b=1.] 190\definecolor[colorscheme:3:3][b=.8] 191\definecolor[colorscheme:3:4][b=.8] 192\definecolor[colorscheme:3:5][b=.4] 193\definecolor[colorscheme:3:6][b=.3] 194\definecolor[colorscheme:3:7][r=.5] 195\definecolor[colorscheme:3:8][g=.5] 196 197\starttext 198 199\setfontcolorscheme[3] 200 201\startcomparepatterns[ka,ka] 202 \input ka-text-plain.txt\par 203\stopcomparepatterns 204 205% Reference syllabification: 206% 207% \catcode`\=\active 208% \def{\color[red]{\kern-0.5pt\vrule width1pt height 10pt depth0pt\kern-0.5pt}\hskip0pt} 209% \input ka-text-hyphenated.txt\par 210 211\stoptext 212