1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
|
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 nodecodes = nodes.nodecodes
local gluecodes = nodes.gluecodes
local penaltycodes = nodes.penaltycodes
local boundarycodes = nodes.boundarycodes
local glue_code = nodecodes.glue
local penalty_code = nodecodes.penalty
local boundary_code = nodecodes.boundary
local parfillskip_code = gluecodes.parfillskip
local userpenalty_code = penaltycodes.userpenalty
local linepenalty_code = penaltycodes.linepenalty
local linebreakpenalty_code = penaltycodes.linebreakpenalty
local wordboundary_code = boundarycodes.word
local nuts = nodes.nuts
local find_node_tail = nuts.tail
local getprev = nuts.getprev
local getid = nuts.getid
local getsubtype = nuts.getsubtype
local getpenalty = nuts.getpenalty
local remove_node = nuts.remove
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")
-- we really need to pass tail too ... but then we need to check all the plugins
-- bah ... slowdown
-- This check is very tight to the crlf definition. We check for:
--
-- [break -10000] [wordboundary] [line(break)penalty] [parfillskip]
--
-- If needed we can extend this checker for other cases but then we will also
-- use attributes.
local function remove_dangling_crlf(head,tail)
if head and tail and getid(tail) == glue_code and getsubtype(tail) == parfillskip_code then
tail = getprev(tail)
if tail and getid(tail) == penalty_code then
local subtype = getsubtype(tail)
if subtype == linepenalty_code or subtype == linebreakpenalty_code then
tail = getprev(tail)
if tail and getid(tail) == boundary_code and getsubtype(tail) == wordboundary_code then
tail = getprev(tail)
if tail ~= head and getid(tail) == penalty_code and getsubtype(tail) == userpenalty_code and getpenalty(tail) == -10000 then
if trace_wrappers then
report("removing a probably unwanted end-of-par break in line %s (guess)",tex.inputlineno)
end
remove_node(head,tail,true)
return head, tail
end
end
end
end
end
return head, tail
end
function wrappers.handler(head)
if head then
local tail = find_node_tail(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
}
|