1if not modules then modules = { } end modules ['buff-imp-mp'] = {
2 version = 1.001,
3 comment = "companion to buff-imp-mp.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
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25local P, S, V, patterns = lpeg.P, lpeg.S, lpeg.V, lpeg.patterns
26
27local context = context
28local verbatim = context.verbatim
29local makepattern = visualizers.makepattern
30
31local MetapostSnippet = context.MetapostSnippet
32local startMetapostSnippet = context.startMetapostSnippet
33local stopMetapostSnippet = context.stopMetapostSnippet
34
35local MetapostSnippetConstructor = verbatim.MetapostSnippetConstructor
36local MetapostSnippetBoundary = verbatim.MetapostSnippetBoundary
37local MetapostSnippetSpecial = verbatim.MetapostSnippetSpecial
38local MetapostSnippetComment = verbatim.MetapostSnippetComment
39local MetapostSnippetCommentText = verbatim.MetapostSnippetCommentText
40local MetapostSnippetQuote = verbatim.MetapostSnippetQuote
41local MetapostSnippetString = verbatim.MetapostSnippetString
42local MetapostSnippetNamePrimitive = verbatim.MetapostSnippetNamePrimitive
43local MetapostSnippetNamePlain = verbatim.MetapostSnippetNamePlain
44local MetapostSnippetNameMetafun = verbatim.MetapostSnippetNameMetafun
45local MetapostSnippetName = verbatim.MetapostSnippetName
46
47local primitives, plain, metafun
48
49local function initialize()
50 local mps = dofile(resolvers.findfile("mult-mps.lua","tex")) or {
51 primitives = { },
52 plain = { },
53 metafun = { },
54 }
55 primitives = table.tohash(mps.primitives)
56 plain = table.tohash(mps.plain)
57 metafun = table.tohash(mps.metafun)
58end
59
60local function visualizename(s)
61 if not primitives then
62 initialize()
63 end
64 if primitives[s] then
65 MetapostSnippetNamePrimitive(s)
66 elseif plain[s] then
67 MetapostSnippetNamePlain(s)
68 elseif metafun[s] then
69 MetapostSnippetNameMetafun(s)
70 else
71 MetapostSnippetName(s)
72 end
73end
74
75local handler = visualizers.newhandler {
76 startinline = function() MetapostSnippet(false,"{") end,
77 stopinline = function() context("}") end,
78 startdisplay = function() startMetapostSnippet() end,
79 stopdisplay = function() stopMetapostSnippet() end ,
80 constructor = function(s) MetapostSnippetConstructor(s) end,
81 boundary = function(s) MetapostSnippetBoundary(s) end,
82 special = function(s) MetapostSnippetSpecial(s) end,
83 comment = function(s) MetapostSnippetComment(s) end,
84 commenttext = function(s) MetapostSnippetCommentText(s) end,
85 string = function(s) MetapostSnippetString(s) end,
86 quote = function(s) MetapostSnippetQuote(s) end,
87 name = visualizename,
88}
89
90local comment = P("%")
91local name = (patterns.letter + S("_"))^1
92local constructor = S("$@#")
93local boundary = S('()[]:=<>;"')
94local special = S("-+/*|`!?^&%.,")
95
96local grammar = visualizers.newgrammar("default", { "visualizer",
97
98 comment = makepattern(handler,"comment",comment)
99 * makepattern(handler,"commenttext",(patterns.anything - patterns.newline)^0),
100 dstring = makepattern(handler,"quote",patterns.dquote)
101 * makepattern(handler,"string",patterns.nodquote)
102 * makepattern(handler,"quote",patterns.dquote),
103 name = makepattern(handler,"name",name),
104 constructor = makepattern(handler,"constructor",constructor),
105 boundary = makepattern(handler,"boundary",boundary),
106 special = makepattern(handler,"special",special),
107
108 pattern =
109 V("comment") + V("dstring") + V("name") + V("constructor") + V("boundary") + V("special")
110 + V("newline") * V("emptyline")^0 * V("beginline")
111 + V("space")
112 + V("default"),
113
114 visualizer =
115 V("pattern")^1
116
117} )
118
119local parser = P(grammar)
120
121visualizers.register("mp", { parser = parser, handler = handler, grammar = grammar } )
122 |