1if not modules then modules = { } end modules ['buff-imp-lua'] = {
2 version = 1.001,
3 comment = "companion to buff-imp-lua.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
18local format, tohash = string.format, table.tohash
19local P, S, V, patterns = lpeg.P, lpeg.S, lpeg.V, lpeg.patterns
20local C, Cs, Cg, Cb, Cmt, Carg = lpeg.C, lpeg.Cs, lpeg.Cg, lpeg.Cb, lpeg.Cmt, lpeg.Carg
21
22local core = tohash {
23 "and", "break", "do", "else", "elseif", "end", "false", "for", "function",
24 "if", "in", "local", "nil", "not", "or", "repeat", "return", "then",
25 "true", "until", "while"
26}
27
28local base = tohash {
29 "assert", "collectgarbage", "dofile", "error", "loadfile",
30 "loadstring", "load", "print", "rawget", "rawset", "require", "tonumber",
31 "tostring", "type", "_G", "getmetatable", "ipairs", "next", "pairs",
32 "pcall", "rawequal", "setmetatable", "xpcall", "module", "select", "goto",
33}
34
35local libraries = {
36 coroutine = tohash {
37 "create", "resume", "status", "wrap", "yield", "running",
38 },
39 package = tohash{
40 "cpath", "loaded", "loadlib", "path", "config", "preload", "seeall",
41 },
42 io = tohash{
43 "close", "flush", "input", "lines", "open", "output", "read", "tmpfile",
44 "type", "write", "stdin", "stdout", "stderr", "popen",
45 },
46 math = tohash{
47 "abs", "acos", "asin", "atan", "atan2", "ceil", "cos", "deg", "exp",
48 "floor ", "ldexp", "log", "max", "min", "pi", "pow", "rad", "random",
49 "randomseed", "sin", "sqrt", "tan", "cosh", "sinh", "tanh", "huge",
50 },
51 string = tohash{
52 "byte", "char", "dump", "find", "len", "lower", "rep", "sub", "upper",
53 "format", "gfind", "gsub", "gmatch", "match", "reverse",
54 },
55 table = tohash{
56 "concat", "foreach", "foreachi", "sort", "insert", "remove", "pack",
57 "unpack",
58 },
59 os = tohash{
60 "clock", "date", "difftime", "execute", "exit", "getenv", "remove",
61 "rename", "setlocale", "time", "tmpname",
62 },
63 lpeg = tohash{
64 "print", "match", "locale", "type", "version", "setmaxstack",
65 "P", "R", "S", "C", "V", "Cs", "Ct", "Cs", "Cc", "Cp", "Carg",
66 "Cg", "Cb", "Cmt", "Cf", "B",
67 },
68
69
70}
71
72local context = context
73local verbatim = context.verbatim
74local makepattern = visualizers.makepattern
75
76local LuaSnippet = context.LuaSnippet
77local startLuaSnippet = context.startLuaSnippet
78local stopLuaSnippet = context.stopLuaSnippet
79
80local LuaSnippetBoundary = verbatim.LuaSnippetBoundary
81local LuaSnippetQuote = verbatim.LuaSnippetQuote
82local LuaSnippetString = verbatim.LuaSnippetString
83local LuaSnippetSpecial = verbatim.LuaSnippetSpecial
84local LuaSnippetComment = verbatim.LuaSnippetComment
85local LuaSnippetCommentText = verbatim.LuaSnippetCommentText
86local LuaSnippetNameCore = verbatim.LuaSnippetNameCore
87local LuaSnippetNameBase = verbatim.LuaSnippetNameBase
88local LuaSnippetNameLibraries = verbatim.LuaSnippetNameLibraries
89local LuaSnippetName = verbatim.LuaSnippetName
90
91local namespace
92
93local function visualizename_a(s)
94 if core[s] then
95 namespace = nil
96 LuaSnippetNameCore(s)
97 elseif base[s] then
98 namespace = nil
99 LuaSnippetNameBase(s)
100 else
101 namespace = libraries[s]
102 if namespace then
103 LuaSnippetNameLibraries(s)
104 else
105 LuaSnippetName(s)
106 end
107 end
108end
109
110local function visualizename_b(s)
111 if namespace and namespace[s] then
112 namespace = nil
113 LuaSnippetNameLibraries(s)
114 else
115 LuaSnippetName(s)
116 end
117end
118
119local function visualizename_c(s)
120 LuaSnippetName(s)
121end
122
123local handler = visualizers.newhandler {
124 startinline = function() LuaSnippet(false,"{") end,
125 stopinline = function() context("}") end,
126 startdisplay = function() startLuaSnippet() end,
127 stopdisplay = function() stopLuaSnippet() end ,
128 boundary = function(s) LuaSnippetBoundary(s) end,
129 special = function(s) LuaSnippetSpecial(s) end,
130 comment = function(s) LuaSnippetComment(s) end,
131 commenttext = function(s) LuaSnippetCommentText(s) end,
132 quote = function(s) LuaSnippetQuote(s) end,
133 string = function(s) LuaSnippetString(s) end,
134 period = function(s) verbatim(s) end,
135 name_a = visualizename_a,
136 name_b = visualizename_b,
137 name_c = visualizename_c,
138}
139
140
141local comment = P("--") * (patterns.anything - patterns.newline)^0
142local comment_lb = P("--[[")
143local comment_le = P("--]]")
144local comment_lt = patterns.utf8char - comment_le - patterns.newline
145
146local name = (patterns.letter + patterns.underscore)
147 * (patterns.letter + patterns.underscore + patterns.digit)^0
148local boundary = S('()[]{}')
149local special = S("-+/*^%=#~|<>") + P("..")
150
151
152
153
154local equals = P("=")^0
155local open = P("[") * Cg(equals, "init") * P("[") * P("\n")^-1
156local close = P("]") * C(equals) * P("]")
157local closeeq = Cmt(close * Cb("init"), function(s,i,a,b) return a == b end)
158local longstring = open * Cs((P(1) - closeeq)^0) * close * Carg(1)
159
160local function long(content,equals,settings)
161 handler.boundary(format("[%s[",equals or ""))
162 visualizers.write(content,settings)
163 handler.boundary(format("]%s]",equals or ""))
164end
165
166local grammar = visualizers.newgrammar("default", { "visualizer",
167 sstring =
168 makepattern(handler,"quote",patterns.dquote)
169 * (V("whitespace") + makepattern(handler,"string",(1-patterns.dquote-V("whitespace"))^1))^0
170 * makepattern(handler,"quote",patterns.dquote),
171 dstring =
172 makepattern(handler,"quote",patterns.squote)
173 * (V("whitespace") + makepattern(handler,"string",(1-patterns.squote-V("whitespace"))^1))^0
174 * makepattern(handler,"quote",patterns.squote),
175 longstring =
176 longstring / long,
177 comment =
178 makepattern(handler, "comment", comment_lb)
179 * ( makepattern(handler, "commenttext", comment_lt)
180 + V("whitespace")
181 )^0
182 * makepattern(handler, "comment", comment_le)
183 + makepattern(handler,"comment",comment),
184 name =
185 makepattern(handler,"name_a",name)
186 * ( V("optionalwhitespace")
187 * makepattern(handler,"default",patterns.period)
188 * V("optionalwhitespace")
189 * makepattern(handler,"name_b",name)
190 )^-1
191 * ( V("optionalwhitespace")
192 * makepattern(handler,"default",patterns.period)
193 * V("optionalwhitespace")
194 * makepattern(handler,"name_c",name)
195 )^0,
196
197 pattern =
198 V("comment")
199 + V("longstring")
200 + V("dstring")
201 + V("sstring")
202 + V("name")
203 + makepattern(handler,"boundary",boundary)
204 + makepattern(handler,"special",special)
205
206 + V("space")
207 + V("line")
208 + V("default"),
209
210 visualizer =
211 V("pattern")^1
212} )
213
214local parser = P(grammar)
215
216visualizers.register("lua", { parser = parser, handler = handler, grammar = grammar } )
217 |