1local info = {
2 version = 1.003,
3 comment = "scintilla lpeg lexer for web",
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 P, R, S = lpeg.P, lpeg.R, lpeg.S
10
11local lexers = require("scite-context-lexer")
12
13local patterns = lexers.patterns
14local token = lexers.token
15
16local weblexer = lexers.new("web","scite-context-lexer-web")
17local webwhitespace = weblexer.whitespace
18
19local space = patterns.space
20local any = patterns.any
21local restofline = patterns.restofline
22local eol = patterns.eol
23
24local period = P(".")
25local percent = P("%")
26
27local spacing = token(webwhitespace, space^1)
28local rest = token("default", any)
29
30local eop = P("@>")
31local eos = eop * P("+")^-1 * P("=")
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52local somespace = space^1
53
54local texpart = token("label",P("@")) * #somespace
55 + token("label",P("@") * P("*")^1) * token("function",(1-period)^1) * token("label",period)
56local midpart = token("label",P("@d")) * #somespace
57 + token("label",P("@f")) * #somespace
58local cpppart = token("label",P("@c")) * #somespace
59 + token("label",P("@p")) * #somespace
60 + token("label",P("@") * S("<(")) * token("function",(1-eop)^1) * token("label",eos)
61
62local anypart = P("@") * ( P("*")^1 + S("dfcp") + space^1 + S("<(") * (1-eop)^1 * eos )
63local limbo = 1 - anypart - percent
64
65weblexer.backtracker = eol^1 * P("@ @c")
66
67weblexer.foretracker = anypart
68
69local texlexer = lexers.load("scite-context-lexer-tex-web")
70local cpplexer = lexers.load("scite-context-lexer-cpp-web")
71
72
73
74
75lexers.embed(weblexer, texlexer, texpart + limbo, #anypart)
76lexers.embed(weblexer, cpplexer, cpppart + midpart, #anypart)
77
78local texcomment = token("comment", percent * restofline^0)
79
80weblexer.rules = {
81 { "whitespace", spacing },
82 { "texcomment", texcomment },
83 { "rest", rest },
84}
85
86return weblexer
87 |