summaryrefslogtreecommitdiff
path: root/tex/context/base/spac-ali.lua
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/spac-ali.lua')
-rw-r--r--tex/context/base/spac-ali.lua132
1 files changed, 132 insertions, 0 deletions
diff --git a/tex/context/base/spac-ali.lua b/tex/context/base/spac-ali.lua
new file mode 100644
index 000000000..37bff74d1
--- /dev/null
+++ b/tex/context/base/spac-ali.lua
@@ -0,0 +1,132 @@
+if not modules then modules = { } end modules ['spac-ali'] = {
+ version = 1.001,
+ comment = "companion to spac-ali.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+local div = math.div
+
+local tasks = nodes.tasks
+local appendaction = tasks.appendaction
+local prependaction = tasks.prependaction
+local disableaction = tasks.disableaction
+local enableaction = tasks.enableaction
+
+local has_attribute = node.has_attribute
+local unset_attribute = node.unset_attribute
+local slide_nodes = node.slide
+local hpack_nodes = node.hpack -- nodes.fasthpack not really faster here
+
+local link_nodes = nodes.link
+
+local nodecodes = nodes.nodecodes
+local listcodes = nodes.listcodes
+
+local hlist_code = nodecodes.hlist
+local vlist_code = nodecodes.vlist
+local line_code = listcodes.line
+
+local nodepool = nodes.pool
+
+local new_stretch = nodepool.stretch
+
+local a_realign = attributes.private("realign")
+
+local texattribute = tex.attribute
+local texcount = tex.count
+
+local isleftpage = layouts.status.isleftpage
+
+local alignments = { }
+typesetters.alignments = alignments
+
+local report_realign = logs.reporter("typesetters","margindata")
+local trace_realign = trackers.register("typesetters.margindata", function(v) trace_margindata = v end)
+
+local nofrealigned = 0
+
+-- leftskip rightskip parfillskip
+-- raggedleft 0 + 0 -
+-- raggedright 0 0 fil
+-- raggedcenter 0 + 0 + -
+
+local function handler(head,leftpage,realpageno)
+ local current = head
+ local done = false
+ while current do
+ local id = current.id
+ if id == hlist_code then
+ if current.subtype == line_code then
+ local a = has_attribute(current,a_realign)
+ if not a or a == 0 then
+ -- skip
+ else
+ local align = a % 10
+ local pageno = div(a,10)
+ if pageno == realpageno then
+ -- already ok
+ else
+ local action = 0
+ if align == 1 then -- flushright
+ action = leftpage and 1 or 2
+ elseif align == 2 then -- flushleft
+ action = leftpage and 2 or 1
+ end
+ if action == 1 then
+ current.list = hpack_nodes(link_nodes(current.list,new_stretch(3)),current.width,"exactly")
+ if trace_realign then
+ report_realign("flush left: align %s, page %s, realpage %s",align,pageno,realpageno)
+ end
+ elseif action == 2 then
+ current.list = hpack_nodes(link_nodes(new_stretch(3),current.list),current.width,"exactly")
+ if trace_realign then
+ report_realign("flush right: align %s, page %s, realpage %s",align,pageno,realpageno)
+ end
+ elseif trace_realign then
+ report_realign("invalid: align %s, page %s, realpage %s",align,pageno,realpageno)
+ end
+ done = true
+ nofrealigned = nofrealigned + 1
+ end
+ unset_attribute(current,a_realign)
+ end
+ end
+ handler(current.list,leftpage,realpageno)
+ elseif id == vlist_code then
+ handler(current.list,leftpage,realpageno)
+ end
+ current = current.next
+ end
+ return head, done
+end
+
+function alignments.handler(head)
+ local leftpage = isleftpage(true,false)
+ local realpageno = texcount.realpageno
+ return handler(head,leftpage,realpageno)
+end
+
+local enabled = false
+
+function alignments.set(n)
+ if not enabled then
+ enableaction("shipouts","typesetters.alignments.handler")
+ enabled = true
+ if trace_realign then
+ report_realign("enabled")
+ end
+ end
+ texattribute[a_realign] = texcount.realpageno * 10 + n
+end
+
+commands.setrealign = alignments.set
+
+statistics.register("realigning", function()
+ if nofrealigned > 0 then
+ return string.format("%s processed",nofrealigned)
+ else
+ return nil
+ end
+end)