mapres 3.dev27__py3-none-any.whl → 3.dev28__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
mapres/tokenizer.py CHANGED
@@ -16,9 +16,8 @@ class TokenType(Enum):
16
16
  PIPE_CLOSE = auto()
17
17
  PERCENT_OPEN = auto()
18
18
  PERCENT_CLOSE = auto()
19
- # # LPAREN and RPAREN tokens were deprecated in mapres 3-dev.27 to fix a bug in the parser that caused it to fail on nested calls
20
- # LPAREN = auto()
21
- # RPAREN = auto()
19
+ LPAREN = auto()
20
+ RPAREN = auto()
22
21
 
23
22
 
24
23
  class Token:
@@ -94,6 +93,18 @@ class Tokenizer:
94
93
  start = self.i
95
94
  self.advance(2)
96
95
  ident = self._read_ident()
96
+ # ident == None means _read_ident already emitted IDENT and nested tokens
97
+ if ident is None:
98
+ # nested call already emitted; expect closing '}}'
99
+ if self.match('}}'):
100
+ self.advance(2)
101
+ self.emit(TokenType.BRACE_CLOSE)
102
+ continue
103
+ # fallback to literal
104
+ self.i = start
105
+ buf.append(self.peek())
106
+ self.advance()
107
+ continue
97
108
  if ident is not None and self.match('}}'):
98
109
  self.emit(TokenType.BRACE_OPEN)
99
110
  self.emit(TokenType.IDENT, ident)
@@ -111,6 +122,16 @@ class Tokenizer:
111
122
  start = self.i
112
123
  self.advance(2)
113
124
  ident = self._read_ident()
125
+ if ident is None:
126
+ # nested call already emitted; expect closing '}'
127
+ if self.peek() == '}':
128
+ self.advance()
129
+ self.emit(TokenType.DOLLAR_CLOSE)
130
+ continue
131
+ self.i = start
132
+ buf.append(self.peek())
133
+ self.advance()
134
+ continue
114
135
  if ident is not None and self.peek() == '}':
115
136
  self.emit(TokenType.DOLLAR_OPEN)
116
137
  self.emit(TokenType.IDENT, ident)
@@ -145,6 +166,16 @@ class Tokenizer:
145
166
  start = self.i
146
167
  self.advance()
147
168
  ident = self._read_ident()
169
+ if ident is None:
170
+ # nested call already emitted; expect closing '>'
171
+ if self.peek() == '>':
172
+ self.advance()
173
+ self.emit(TokenType.ANGLE_CLOSE)
174
+ continue
175
+ self.i = start
176
+ buf.append(self.peek())
177
+ self.advance()
178
+ continue
148
179
  if ident is not None and self.peek() == '>':
149
180
  self.emit(TokenType.ANGLE_OPEN)
150
181
  self.emit(TokenType.IDENT, ident)
@@ -162,6 +193,16 @@ class Tokenizer:
162
193
  start = self.i
163
194
  self.advance()
164
195
  ident = self._read_ident()
196
+ if ident is None:
197
+ # nested call already emitted; expect closing '|'
198
+ if self.peek() == '|':
199
+ self.advance()
200
+ self.emit(TokenType.PIPE_CLOSE)
201
+ continue
202
+ self.i = start
203
+ buf.append(self.peek())
204
+ self.advance()
205
+ continue
165
206
  if ident is not None and self.peek() == '|':
166
207
  self.emit(TokenType.PIPE_OPEN)
167
208
  self.emit(TokenType.IDENT, ident)
@@ -179,6 +220,16 @@ class Tokenizer:
179
220
  start = self.i
180
221
  self.advance()
181
222
  ident = self._read_ident()
223
+ if ident is None:
224
+ # nested call already emitted; expect closing '%'
225
+ if self.peek() == '%':
226
+ self.advance()
227
+ self.emit(TokenType.PERCENT_CLOSE)
228
+ continue
229
+ self.i = start
230
+ buf.append(self.peek())
231
+ self.advance()
232
+ continue
182
233
  if ident is not None and self.peek() == '%':
183
234
  self.emit(TokenType.PERCENT_OPEN)
184
235
  self.emit(TokenType.IDENT, ident)
@@ -196,6 +247,16 @@ class Tokenizer:
196
247
  start = self.i
197
248
  self.advance()
198
249
  ident = self._read_ident()
250
+ if ident is None:
251
+ # nested call already emitted; expect closing ':'
252
+ if self.peek() == ':':
253
+ self.advance()
254
+ self.emit(TokenType.COLON_CLOSE)
255
+ continue
256
+ self.i = start
257
+ buf.append(self.peek())
258
+ self.advance()
259
+ continue
199
260
  if ident is not None and self.peek() == ':':
200
261
  self.emit(TokenType.COLON_OPEN)
201
262
  self.emit(TokenType.IDENT, ident)
@@ -207,19 +268,6 @@ class Tokenizer:
207
268
  self.advance()
208
269
  continue
209
270
 
210
- # # --- parens --- (This block was deprecated in mapres 3-dev.27)
211
- # if ch == '(':
212
- # flush_text()
213
- # self.emit(TokenType.LPAREN)
214
- # self.advance()
215
- # continue
216
-
217
- # if ch == ')':
218
- # flush_text()
219
- # self.emit(TokenType.RPAREN)
220
- # self.advance()
221
- # continue
222
-
223
271
  # fallback TEXT
224
272
  buf.append(ch)
225
273
  self.advance()
@@ -246,4 +294,32 @@ class Tokenizer:
246
294
  ident = self.text[start:self.i]
247
295
  if ident.startswith('_') or ident.endswith('_') or '-' in ident:
248
296
  return None
297
+
298
+ # unified nested-call support: if '(' immediately follows the ident,
299
+ # emit IDENT + LPAREN + nested TEXT + RPAREN and return None.
300
+ if self.peek() == '(':
301
+ # emit IDENT token
302
+ self.emit(TokenType.IDENT, ident)
303
+
304
+ # consume '(' and emit LPAREN
305
+ self.advance()
306
+ self.emit(TokenType.LPAREN)
307
+
308
+ # capture nested content as TEXT until the next ')'
309
+ nested_start = self.i
310
+ while self.peek() not in (')', ''):
311
+ self.advance()
312
+ nested_text = self.text[nested_start:self.i]
313
+ if nested_text:
314
+ self.emit(TokenType.TEXT, nested_text)
315
+
316
+ # consume ')' and emit RPAREN if present
317
+ if self.peek() == ')':
318
+ self.advance()
319
+ self.emit(TokenType.RPAREN)
320
+
321
+ # signal to caller that tokens were emitted already
322
+ return None
323
+
324
+ # no nested call; return the identifier string
249
325
  return ident
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: mapres
3
- Version: 3.dev27
3
+ Version: 3.dev28
4
4
  Summary: A powerfull mapping utility
5
5
  Author: iFamished
6
6
  License: MIT
@@ -7,13 +7,13 @@ mapres/exceptions.py,sha256=D2XKnrMkZDyUXQt2PmaKbj08FObWU00yXKGHwNpjvww,222
7
7
  mapres/layers.py,sha256=sFc1eUOBg2BoB2cBXIleq8RMYcg5GZpUoCnGh-uKN6U,1380
8
8
  mapres/parser.py,sha256=q3PgyvXJn9c-EJJYyibw7sHJ0Y9soirgB10OyTKaT9s,3657
9
9
  mapres/resolver.py,sha256=ldSNSUg-yvk2LJnpyGpexYvPiVACFa4IMGHOFejGY_0,3889
10
- mapres/tokenizer.py,sha256=HXZBIlTbPA7T-w4kGHTLdHwuPokmXA5TQTrr2PzNeLA,8002
10
+ mapres/tokenizer.py,sha256=FLrO4pNKEmsFTUXXOUQ-GLIozzs18hbMRmWV_ccwt7M,11095
11
11
  mapres/utils.py,sha256=Bv8iEeK03QtGtqY9GnBAgE4Bul56mGvAkLt96z6kU2k,137
12
12
  mapres/maps/__init__.py,sha256=lIRRfem1Fw4iynuwUQ7BY5qrC4fbJKxqLivao2_Dtm4,239
13
13
  mapres/maps/color.py,sha256=noRTGFNo9xLl5YEhX0tttV6i_oDAiptXmRVnkr5EzwM,1348
14
14
  mapres/maps/time.py,sha256=TyncycYoIGVZWps32qWlFy2a2hTayvZWVHu9uh2nid8,2050
15
- mapres-3.dev27.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
16
- mapres-3.dev27.dist-info/METADATA,sha256=00k_RRbyvuSG2qfbrJERAQ-48ZvcQBBbfyuMUHXhZ3Q,1476
17
- mapres-3.dev27.dist-info/WHEEL,sha256=K260EYznzXsJYBQGqmI8VTxEdiZYNvDZwW9cBh9-_MA,91
18
- mapres-3.dev27.dist-info/top_level.txt,sha256=5LMVQqJdtyjxfzv7wJBOZ-360m0Yc79w_-Y7s3n6cTw,7
19
- mapres-3.dev27.dist-info/RECORD,,
15
+ mapres-3.dev28.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
16
+ mapres-3.dev28.dist-info/METADATA,sha256=7qyVrSLnMSxSGJiTU5HCcvdNpa7DOy3iCLTcPohv8Kk,1476
17
+ mapres-3.dev28.dist-info/WHEEL,sha256=K260EYznzXsJYBQGqmI8VTxEdiZYNvDZwW9cBh9-_MA,91
18
+ mapres-3.dev28.dist-info/top_level.txt,sha256=5LMVQqJdtyjxfzv7wJBOZ-360m0Yc79w_-Y7s3n6cTw,7
19
+ mapres-3.dev28.dist-info/RECORD,,