summaryrefslogtreecommitdiff
path: root/tex/context/base/mkxl/typo-wrp.lmt
diff options
context:
space:
mode:
Diffstat (limited to 'tex/context/base/mkxl/typo-wrp.lmt')
-rw-r--r--tex/context/base/mkxl/typo-wrp.lmt81
1 files changed, 81 insertions, 0 deletions
diff --git a/tex/context/base/mkxl/typo-wrp.lmt b/tex/context/base/mkxl/typo-wrp.lmt
new file mode 100644
index 000000000..5b31c4015
--- /dev/null
+++ b/tex/context/base/mkxl/typo-wrp.lmt
@@ -0,0 +1,81 @@
+if not modules then modules = { } end modules ['typo-wrp'] = {
+ version = 1.001,
+ comment = "companion to typo-wrp.mkiv",
+ author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
+ copyright = "PRAGMA ADE / ConTeXt Development Team",
+ license = "see context related readme files"
+}
+
+-- begin/end par wrapping stuff ... more to come
+
+local boundary_code = nodes.nodecodes.boundary
+local wordboundary_code = nodes.boundarycodes.word
+
+local nuts = nodes.nuts
+
+local findtail = nuts.tail
+local getprev = nuts.getprev
+local setnext = nuts.setnext
+local getid = nuts.getid
+local getsubtype = nuts.getsubtype
+local getattr = nuts.getattr
+local flushnodelist = nuts.flushlist
+
+local enableaction = nodes.tasks.enableaction
+
+local wrappers = { }
+typesetters.wrappers = wrappers
+
+local trace_wrappers = trackers.register("typesetters.wrappers",function(v) trace_wrappers = v end)
+local report = logs.reporter("paragraphs","wrappers")
+
+-- In luametatex we don't have the parfilskip attached yet but we can have final glue
+-- anyway. This check is very bound to the \crlf definition where we get:
+--
+-- ... boundary [strut: hlist] [break: glue penalty] boundary
+
+local a_crlf = attributes.private("crlf")
+
+local function remove_dangling_crlf(head,tail)
+ if head and tail then
+ if getid(tail) == boundary_code and getsubtype(tail) == wordboundary_code then
+ -- findnode could run backwards
+ if getattr(tail,a_crlf) then
+ local t = tail
+ while t do
+ t = getprev(t)
+ if not t then
+ break
+ elseif getid(t) == boundary_code and getsubtype(t) == wordboundary_code then
+ if t ~= head then
+ if trace_wrappers then
+ report("removing a probably unwanted end-of-par break in line %s (guess)",tex.inputlineno)
+ end
+ tail = getprev(t)
+ setnext(tail)
+ flushnodelist(t)
+ end
+ break
+ end
+ end
+ end
+ end
+ end
+ return head, tail
+end
+
+function wrappers.handler(head)
+ if head then
+ local tail = findtail(head)
+ head, tail = remove_dangling_crlf(head,tail) -- will be action chain
+ end
+ return head
+end
+
+interfaces.implement {
+ name = "enablecrlf",
+ onlyonce = true,
+ actions = function()
+ enableaction("processors","typesetters.wrappers.handler")
+ end
+}