summaryrefslogtreecommitdiff
path: root/tex/context/base/typo-pag.lua
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/typo-pag.lua')
-rw-r--r--tex/context/base/typo-pag.lua99
1 files changed, 59 insertions, 40 deletions
diff --git a/tex/context/base/typo-pag.lua b/tex/context/base/typo-pag.lua
index 0dd75ddf9..53f79fcfc 100644
--- a/tex/context/base/typo-pag.lua
+++ b/tex/context/base/typo-pag.lua
@@ -6,6 +6,14 @@ if not modules then modules = { } end modules ['typo-pag'] = {
license = "see context related readme files"
}
+
+builders = builders or { }
+local builders = builders
+
+builders.paragraphs = builders.paragraphs or { }
+local parbuilders = builders.paragraphs
+
+local nodes = nodes
local nodecodes = nodes.nodecodes
local hlist_code = nodecodes.hlist
@@ -14,13 +22,23 @@ local glue_code = nodecodes.glue
local kern_code = nodecodes.kern
local penalty_code = nodecodes.penalty
-local insert_node_after = node.insert_after
-local new_penalty = nodes.pool.penalty
-
local unsetvalue = attributes.unsetvalue
-
local a_keeptogether = attributes.private("keeptogether")
+local nuts = nodes.nuts
+local tonut = nuts.tonut
+
+local getfield = nuts.getfield
+local setfield = nuts.setfield
+local getnext = nuts.getnext
+local getprev = nuts.getprev
+local getid = nuts.getid
+local getattr = nuts.getattr
+local setattr = nuts.setattr
+
+local insert_node_after = nuts.insert_after
+local new_penalty = nuts.pool.penalty
+
local trace_keeptogether = false
local report_keeptogether = logs.reporter("parbuilders","keeptogether")
@@ -33,11 +51,14 @@ trackers.register("parbuilders.keeptogether", function(v) trace_keeptogether =
-- todo: also support lines = 3 etc (e.g. dropped caps) but how to set that
-- when no hlists are there ? ... maybe the local_par
-function builders.paragraphs.registertogether(line,specification) -- might change
+function parbuilders.registertogether(line,specification) -- might change
+ if not specification then
+ return
+ end
if not enabled then
nodes.tasks.enableaction("finalizers","builders.paragraphs.keeptogether")
end
- local a = line[a_keeptogether]
+ local a = getattr(line,a_keeptogether)
local c = a and cache[a]
if c then
local height = specification.height
@@ -64,23 +85,21 @@ function builders.paragraphs.registertogether(line,specification) -- might chang
if not specification.slack then
specification.slack = 0
end
- line[a_keeptogether] = last
+ setattr(line,a_keeptogether,last)
end
if trace_keeptogether then
local a = a or last
local c = cache[a]
- if trace_keeptogether then
- local noflines = specification.lineheight
- local height = c.height
- local depth = c.depth
- local slack = c.slack
- if not noflines or noflines == 0 then
- noflines = "unknown"
- else
- noflines = math.round((height + depth - slack) / noflines)
- end
- report_keeptogether("registered, index %s, height %p, depth %p, slack %p, noflines %a",a,height,depth,slack,noflines)
+ local noflines = specification.lineheight
+ local height = c.height
+ local depth = c.depth
+ local slack = c.slack
+ if not noflines or noflines == 0 then
+ noflines = "unknown"
+ else
+ noflines = math.round((height + depth - slack) / noflines)
end
+ report_keeptogether("registered, index %s, height %p, depth %p, slack %p, noflines %a",a,height,depth,slack,noflines)
end
end
@@ -88,24 +107,24 @@ local function keeptogether(start,a)
if start then
local specification = cache[a]
if a then
- local current = start.next
+ local current = getnext(start)
local previous = start
- local total = previous.depth
+ local total = getfield(previous,"depth")
local slack = specification.slack
local threshold = specification.depth - slack
if trace_keeptogether then
report_keeptogether("%s, index %s, total %p, threshold %p, slack %p","list",a,total,threshold,slack)
end
while current do
- local id = current.id
+ local id = getid(current)
if id == vlist_code or id == hlist_code then
- total = total + current.height + current.depth
+ total = total + getfield(current,"height") + getfield(current,"depth")
if trace_keeptogether then
report_keeptogether("%s, index %s, total %p, threshold %p","list",a,total,threshold)
end
if total <= threshold then
- if previous.id == penalty_code then
- previous.penalty = 10000
+ if getid(previous) == penalty_code then
+ setfield(previous,"penalty",10000)
else
insert_node_after(head,previous,new_penalty(10000))
end
@@ -114,13 +133,13 @@ local function keeptogether(start,a)
end
elseif id == glue_code then
-- hm, breakpoint, maybe turn this into kern
- total = total + current.spec.width
+ total = total + getfield(getfield(current,"spec"),"width")
if trace_keeptogether then
report_keeptogether("%s, index %s, total %p, threshold %p","glue",a,total,threshold)
end
if total <= threshold then
- if previous.id == penalty_code then
- previous.penalty = 10000
+ if getid(previous) == penalty_code then
+ setfield(previous,"penalty",10000)
else
insert_node_after(head,previous,new_penalty(10000))
end
@@ -128,13 +147,13 @@ local function keeptogether(start,a)
break
end
elseif id == kern_code then
- total = total + current.kern
+ total = total + getfield(current,"kern")
if trace_keeptogether then
report_keeptogether("%s, index %s, total %s, threshold %s","kern",a,total,threshold)
end
if total <= threshold then
- if previous.id == penalty_code then
- previous.penalty = 10000
+ if getid(previous) == penalty_code then
+ setfield(previous,"penalty",10000)
else
insert_node_after(head,previous,new_penalty(10000))
end
@@ -143,16 +162,16 @@ local function keeptogether(start,a)
end
elseif id == penalty_code then
if total <= threshold then
- if previous.id == penalty_code then
- previous.penalty = 10000
+ if getid(previous) == penalty_code then
+ setfield(previous,"penalty",10000)
end
- current.penalty = 10000
+ setfield(current,"penalty",10000)
else
break
end
end
previous = current
- current = current.next
+ current = getnext(current)
end
end
end
@@ -160,20 +179,20 @@ end
-- also look at first non glue/kern node e.g for a dropped caps
-function builders.paragraphs.keeptogether(head)
+function parbuilders.keeptogether(head)
local done = false
- local current = head
+ local current = tonut(head)
while current do
- if current.id == hlist_code then
- local a = current[a_keeptogether]
+ if getid(current) == hlist_code then
+ local a = getattr(current,a_keeptogether)
if a and a > 0 then
keeptogether(current,a)
- current[a_keeptogether] = unsetvalue
+ setattr(current,a_keeptogether,unsetvalue)
cache[a] = nil
done = true
end
end
- current = current.next
+ current = getnext(current)
end
return head, done
end