summaryrefslogtreecommitdiff
path: root/tex/context/base/typo-fln.lua
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/typo-fln.lua')
-rw-r--r--tex/context/base/typo-fln.lua117
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" }
+}