diff options
author | Context Git Mirror Bot <phg42.2a@gmail.com> | 2015-05-16 00:15:04 +0200 |
---|---|---|
committer | Context Git Mirror Bot <phg42.2a@gmail.com> | 2015-05-16 00:15:04 +0200 |
commit | b55577d0998160c0174e250b542016ecd6ca9056 (patch) | |
tree | 27093212d5ca3e6ffe4ae434c3ec094233ed37ba /tex/context/base/typo-fln.lua | |
parent | 624cbb5da392e9403984dd1cf368c0d408b1c2a8 (diff) | |
download | context-b55577d0998160c0174e250b542016ecd6ca9056.tar.gz |
2015-05-15 23:06:00
Diffstat (limited to 'tex/context/base/typo-fln.lua')
-rw-r--r-- | tex/context/base/typo-fln.lua | 117 |
1 files changed, 77 insertions, 40 deletions
diff --git a/tex/context/base/typo-fln.lua b/tex/context/base/typo-fln.lua index 4c97af450..2076a7464 100644 --- a/tex/context/base/typo-fln.lua +++ b/tex/context/base/typo-fln.lua @@ -23,25 +23,40 @@ local firstlines = typesetters.firstlines local nodes = nodes local tasks = nodes.tasks -local getbox = nodes.getbox +local context = context +local implement = interfaces.implement + +local nuts = nodes.nuts +local tonut = nuts.tonut +local tonode = nuts.tonode + +local getnext = nuts.getnext +local getid = nuts.getid +local getfield = nuts.getfield +local setfield = nuts.setfield +local getlist = nuts.getlist +local getattr = nuts.getattr +local setattr = nuts.setattr +local getbox = nuts.getbox + local nodecodes = nodes.nodecodes local glyph_code = nodecodes.glyph local disc_code = nodecodes.disc local kern_code = nodecodes.kern -local traverse_id = nodes.traverse_id -local free_node_list = nodes.flush_list -local free_node = nodes.flush_node -local copy_node_list = nodes.copy_list -local insert_node_after = nodes.insert_after -local insert_node_before = nodes.insert_before -local hpack_node_list = nodes.hpack -local remove_node = nodes.remove +local traverse_id = nuts.traverse_id +local free_node_list = nuts.flush_list +local free_node = nuts.flush_node +local copy_node_list = nuts.copy_list +local insert_node_after = nuts.insert_after +local insert_node_before = nuts.insert_before +local hpack_node_list = nuts.hpack +local remove_node = nuts.remove -local nodepool = nodes.pool +local nodepool = nuts.pool local newpenalty = nodepool.penalty local newkern = nodepool.kern -local tracerrule = nodes.tracers.pool.nodes.rule +local tracerrule = nodes.tracers.pool.nuts.rule local actions = { } firstlines.actions = actions @@ -73,7 +88,21 @@ function firstlines.set(specification) texsetattribute(a_firstline,1) end -commands.setfirstline = firstlines.set +implement { + name = "setfirstline", + actions = firstlines.set, + arguments = { + { + { "alternative" }, + { "font", "integer" }, + { "dynamic", "integer" }, + { "ma", "integer" }, + { "ca", "integer" }, + { "ta", "integer" }, + { "n", "integer" }, + } + } +} actions[v_line] = function(head,setting) -- local attribute = fonts.specifiers.contextnumber(setting.feature) -- was experimental @@ -92,9 +121,9 @@ actions[v_line] = function(head,setting) local linebreaks = { } for g in traverse_id(glyph_code,temp) do if dynamic > 0 then - g[0] = dynamic + setattr(g,0,dynamic) end - g.font = font + setfield(g,"font",font) end local start = temp local list = temp @@ -108,7 +137,7 @@ actions[v_line] = function(head,setting) hsize = hsize - hangindent end while start do - local id = start.id + local id = getid(start) if id == glyph_code then n = n + 1 elseif id == disc_code then @@ -117,7 +146,7 @@ actions[v_line] = function(head,setting) -- this could be an option elseif n > 0 then local pack = hpack_node_list(copy_node_list(list,start)) - if pack.width > hsize then + if getfield(pack,"width") > hsize then free_node_list(pack) list = prev break @@ -128,7 +157,7 @@ actions[v_line] = function(head,setting) nofchars = n end end - start = start.next + start = getnext(start) end if not linebreaks[i] then linebreaks[i] = n @@ -139,18 +168,18 @@ actions[v_line] = function(head,setting) for i=1,noflines do local linebreak = linebreaks[i] while start and n < nofchars do - local id = start.id + local id = getid(start) if id == glyph_code then -- or id == disc_code then if dynamic > 0 then - start[0] = dynamic + setattr(start,0,dynamic) end - start.font = font + setfield(start,"font",font) if ca and ca > 0 then - start[a_colorspace] = ma == 0 and 1 or ma - start[a_color] = ca + setattr(start,a_colorspace,ma == 0 and 1 or ma) + setattr(start,a_color,ca) end if ta and ta > 0 then - start[a_transparency] = ta + setattr(start,a_transparency,ta) end n = n + 1 end @@ -163,7 +192,7 @@ actions[v_line] = function(head,setting) head, start = insert_node_after(head,start,newpenalty(-10000)) -- break break end - start = start.next + start = getnext(start) end end free_node_list(temp) @@ -182,7 +211,7 @@ actions[v_word] = function(head,setting) local ca = setting.ca local ta = setting.ta while start do - local id = start.id + local id = getid(start) -- todo: delete disc nodes if id == glyph_code then if not ok then @@ -190,16 +219,16 @@ actions[v_word] = function(head,setting) ok = true end if ca and ca > 0 then - start[a_colorspace] = ma == 0 and 1 or ma - start[a_color] = ca + setattr(start,a_colorspace,ma == 0 and 1 or ma) + setattr(start,a_color,ca) end if ta and ta > 0 then - start[a_transparency] = ta + setattr(start,a_transparency,ta) end if dynamic > 0 then - start[0] = dynamic + setattr(start,0,dynamic) end - start.font = font + setfield(start,"font",font) elseif id == disc_code then -- continue elseif id == kern_code then -- todo: fontkern @@ -210,7 +239,7 @@ actions[v_word] = function(head,setting) break end end - start = start.next + start = getnext(start) end return head, true end @@ -218,16 +247,17 @@ end actions[v_default] = actions[v_line] function firstlines.handler(head) + head = tonut(head) local start = head local attr = nil while start do - attr = start[a_firstline] + attr = getattr(start,a_firstline) if attr then break - elseif start.id == glyph then + elseif getid(start) == glyph_code then break else - start = start.next + start = getnext(start) end end if attr then @@ -240,17 +270,18 @@ function firstlines.handler(head) if trace_firstlines then report_firstlines("processing firstlines, alternative %a",alternative) end - return action(head,settings) + local head, done = action(head,settings) + return tonode(head), done end end - return head, false + return tonode(head), false end -- goodie -function commands.applytofirstcharacter(box,what) +local function applytofirstcharacter(box,what) local tbox = getbox(box) -- assumes hlist - local list = tbox.list + local list = getlist(tbox) local done = nil for n in traverse_id(glyph_code,list) do list = remove_node(list,n) @@ -258,10 +289,10 @@ function commands.applytofirstcharacter(box,what) break end if done then - tbox.list = list + setfield(tbox,"list",list) local kind = type(what) if kind == "string" then - context[what](done) + context[what](tonode(done)) elseif kind == "function" then what(done) else @@ -269,3 +300,9 @@ function commands.applytofirstcharacter(box,what) end end end + +implement { + name = "applytofirstcharacter", + actions = applytofirstcharacter, + arguments = { "integer", "string" } +} |