1if not modules then modules = { } end modules [ ' strc-rsc ' ] = {
2 version = 1 . 001 ,
3 comment = " companion to strc-ref.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
15local lpegmatch , lpegpatterns = lpeg . match , lpeg . patterns
16local lpegP , lpegS , lpegCs , lpegCt , lpegCf , lpegCc , lpegC , lpegCg = lpeg . P , lpeg . S , lpeg . Cs , lpeg . Ct , lpeg . Cf , lpeg . Cc , lpeg . C , lpeg . Cg
17local find = string . find
18
19local spaces = lpegP ( " " ) ^ 0
20local lparent = lpegP ( " ( " )
21local rparent = lpegP ( " ) " )
22local lbrace = lpegP ( " { " )
23local rbrace = lpegP ( " } " )
24local tcolon = lpegP ( " ::: " )
25local dcolon = lpegP ( " :: " )
26local scolon = lpegP ( " : " )
27local backslash = lpegP ( " \\ " )
28
29 lparent = spaces * lparent * spaces
30 rparent = spaces * rparent * spaces
31 lbrace = spaces * lbrace * spaces
32 rbrace = spaces * rbrace * spaces
33 tcolon = spaces * tcolon * spaces
34 dcolon = spaces * dcolon * spaces
35
36local endofall = spaces * lpegP ( -1 )
37
38
39
40local s_token = 1 - lparent - lbrace
41local i_token = 1 - lparent - lbrace - endofall
42local f_token = 1 - lparent - lbrace - dcolon
43local c_token = 1 - lparent - lbrace - tcolon
44
45
46
47local o_token = lpegpatterns . nestedparents
48 + ( 1 - rparent - lbrace )
49local a_token = lpegpatterns . nestedbraces
50 + ( 1 - rbrace )
51local q_token = lpegpatterns . unsingle
52 + lpegpatterns . undouble
53
54local hastexcode = lpegCg ( lpegCc ( " has_tex " ) * lpegCc ( true ) )
55local component = lpegCg ( lpegCc ( " component " ) * lpegCs ( c_token ^ 1 ) )
56local outer = lpegCg ( lpegCc ( " outer " ) * lpegCs ( f_token ^ 1 ) )
57
58local operation = lpegCg ( lpegCc ( " operation " ) * lpegCs ( q_token + o_token ^ 1 ) )
59local arguments = lpegCg ( lpegCc ( " arguments " ) * lpegCs ( q_token + a_token ^ 0 ) )
60local special = lpegCg ( lpegCc ( " special " ) * lpegCs ( s_token ^ 1 ) )
61local inner = lpegCg ( lpegCc ( " inner " ) * lpegCs ( i_token ^ 1 ) )
62
63 arguments = ( lbrace * arguments * rbrace ) ^ -1
64 component = component * tcolon
65 outer = outer * dcolon
66 operation = outer ^ -1 * operation
67 inner = inner * arguments
68 special = special * lparent * ( operation * arguments ) ^ -1 * rparent
69
70local referencesplitter = spaces
71 * lpegCf ( lpegCt ( " " ) * ( component + outer ) ^ -1 * ( special + inner ) ^ -1 * endofall , rawset )
72
73local prefixsplitter = lpegCs ( lpegP ( ( 1 - scolon ) ^ 1 * scolon ) )
74 * # - scolon
75 * lpegCs ( lpegP ( 1 ) ^ 1 )
76
77local componentsplitter = lpegCs ( lpegP ( ( 1 - scolon ) ^ 1 ) )
78 * scolon * # - scolon
79 * lpegCs ( lpegP ( 1 ) ^ 1 )
80
81prefixsplitter = componentsplitter
82
83local function splitreference ( str )
84 if str and str ~ = " " then
85 local t = lpegmatch ( referencesplitter , str )
86 if t then
87 local a = t . arguments
88 if a and find ( a , " \\ " , 1 , true ) then
89 t . has_tex = true
90 else
91 local o = t . arguments
92 if o and find ( o , " \\ " , 1 , true ) then
93 t . has_tex = true
94 end
95 end
96 return t
97 end
98 end
99end
100
101local function splitprefix ( str )
102 return lpegmatch ( prefixsplitter , str )
103end
104
105local function splitcomponent ( str )
106 return lpegmatch ( componentsplitter , str )
107end
108
109
110
111structures = structures or { }
112structures . references = structures . references or { }
113local references = structures . references
114
115references . referencesplitter = referencesplitter
116references . splitreference = splitreference
117references . prefixsplitter = prefixsplitter
118references . splitprefix = splitprefix
119references . componentsplitter = componentsplitter
120references . splitcomponent = splitcomponent
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194 |