1 -- filename : type-trans.lua
2 -- comment : Pretty printing of core transformations. Parses a specific
3 -- syntax, consisting of a before / after with a dashed lined in
4 -- between, and some extra conditions to the right of the line.
5 -- Recreates this layout using frames and line commands.
6 -- author : Matthijs Kooijman, Universiteit Twente, NL
7 -- copyright: Matthijs Kooijman
10 local utf = unicode.utf8
12 local vis = buffers.newvisualizer("trans")
15 -- A command to create a horizontal rule.
16 commands.rule = "\\HLine[width=.40 * \\the\\textwidth]"
17 -- Pretty printer to use for the stuff before and after the line
18 commands.before_pret = "lam"
19 commands.after_pret = "lam"
20 -- Frame commands to use for the left (before + line + after) and right
21 -- (conditions) parts. Should include an opening {, which will be closed
23 commands.leftframe = "\\framed[offset=0mm,location=middle,strut=no,align=right,frame=off,width=.48\\textwidth]{\\sans"
24 commands.rightframe = "\\framed[offset=0mm,location=middle,strut=no,align=right,frame=off,width=.48\\textwidth]{"
26 -- A table to keep the lines in this buffer, so we can process them all at
30 -- Some helper functions
31 local function ltrim(s)
32 return (string.gsub(s, "^%s*", ""))
35 local function rtrim(s)
36 return (string.gsub(s, "%s*$", ""))
39 -- Insert n blank lines
40 local function blanks(n)
42 buffers.visualizers.handlers.default.empty_line()
46 -- Prettyprint the given lines using the given pretty printer
47 local function prettyprint(ppr, lines)
48 -- Change the current visualizer
49 buffers.setvisualizer('lam')
52 buffers.hooks.begin_of_display()
55 _, line = buffers.typeline(lines[i], i, #lines, line)
57 buffers.hooks.end_of_display()
59 -- Change the visualizer back
60 buffers.setvisualizer('trans')
63 -- Capture all lines, without generating any output
64 function vis.begin_of_display()
66 -- Let all the lambda pretty printing in this buffer use shared subscript
68 buffers.visualizers.handlers.lam.begin_of_block()
70 function vis.begin_of_line(n)
71 -- Don't generate output here
73 function vis.flush_line(str, nested)
74 table.insert(lines, str)
75 -- Don't generate output here
77 function vis.end_of_line(n)
78 -- Don't generate output here
80 function vis.empty_line()
81 table.insert(lines, '')
82 -- Don't generate output here
85 -- We do the actual work here. Process all the lines in the buffer and
86 -- generate output for them.
87 function vis.end_of_display()
88 -- Find the horizontal rule, and see how long it is.
91 match = utf.match(lines[i], "^%-%-%-*")
99 error("No horizontal separator found in:\n" .. table.concat(lines, "\n"))
102 -- Split the input in three parts. Stuff before the line, stuff
103 -- after the line, stuff to the right of the line.
104 before, after, rights = {}, {}, {}
108 -- Split the line into a left and right part
109 left = rtrim(utf.sub(line, 1, len))
110 right = ltrim(utf.sub(line, len + 1))
111 if utf.match(left, "^%-%-%-*") then
114 if utf.len(left) > 0 then
115 if not found_line then
116 table.insert(before, left)
118 table.insert(after, left)
122 if utf.len(right) > 0 then
123 table.insert(rights, right)
128 -- Real output starts here
131 -- Ensure the left and right frames end up next to each other.
132 tex.sprint("\\dontleavehmode")
134 -- Open and fill the left frame
135 tex.sprint(commands.leftframe)
137 prettyprint('lam', before)
139 tex.sprint(commands.rule)
141 prettyprint('lam', after)
143 -- Close the left frame
146 -- Open and fill the right frame
147 tex.sprint(commands.rightframe)
149 -- Insert spacer blank lines to align the middle condition with the
151 n_blanks = #before - math.ceil((#rights - 1) / 2)
152 n_blanks = math.max(0, n_blanks)
155 -- Print the conditions
157 tex.sprint(rights[i])
158 buffers.visualizers.handlers.default.end_of_line()
161 -- Fill up the remaining space with blanks
162 n_blanks = (#before + 1 + #after) - (n_blanks + #rights)
163 n_blanks = math.max(0, n_blanks)
166 -- Close the right frame
171 buffers.visualizers.handlers.lam.end_of_block()
174 -- vim: set sw=4 sts=4 expandtab ai: