1if not modules then modules = { } end modules ['buff-imp-nested'] = {
2 version = 1.001,
3 comment = "companion to buff-imp-nested.mkiv",
4 author = "Hans Hagen, PRAGMA-ADE, Hasselt NL",
5 copyright = "PRAGMA ADE / ConTeXt Development Team",
6 license = "see context related readme files"
7}
8
9local lpegmatch, patterns = lpeg.match, lpeg.patterns
10local P, V, Carg = lpeg.P, lpeg.V, lpeg.Carg
11
12local context = context
13local verbatim = context.verbatim
14local variables = interfaces.variables
15
16local makepattern = visualizers.makepattern
17local getvisualizer = visualizers.getvisualizer
18
19local nested = nil
20
21local donestedtypingstart = context.donestedtypingstart
22local donestedtypingstop = context.donestedtypingstop
23
24local v_none = variables.none
25local v_slanted = variables.slanted
26
27local handler = visualizers.newhandler {
28 initialize = function(settings)
29 local option = settings and settings.option
30 if not option or option == "" then
31 nested = nil
32 elseif option == v_slanted then
33 nested = nil
34 elseif option == v_none then
35 nested = nil
36 else
37 nested = getvisualizer(option,"direct")
38 end
39 end,
40 open = function()
41 donestedtypingstart()
42 end,
43 close = function()
44 donestedtypingstop()
45 end,
46 content = function(s)
47 if nested then
48 nested(s)
49 else
50 verbatim(s)
51 end
52 end,
53}
54
55local open = P("<<")
56local close = P(">>")
57local rest = (1 - open - close - patterns.space - patterns.newline)^1
58
59local grammar = visualizers.newgrammar("default", {
60
61 initialize = patterns.beginofstring * Carg(1) / handler.initialize,
62
63 open = makepattern(handler,"open",open),
64 close = makepattern(handler,"close",close),
65 rest = makepattern(handler,"content",rest),
66
67 nested = V("open") * (V("pattern")^0) * V("close"),
68 pattern = V("line") + V("space") + V("nested") + V("rest"),
69
70 visualizer = V("initialize") * (V("pattern")^1)
71
72} )
73
74local parser = P(grammar)
75
76visualizers.register("nested", { parser = parser, handler = handler, grammar = grammar } )
77
78
79
80
81 |