2
2
"""Plim lexer"""
3
3
import functools
4
4
import re
5
- from typing import Optional , Tuple , Any , Mapping , Callable , Iterator
5
+ from typing import Optional , Tuple , Any , Mapping , Callable , Iterator , Sequence
6
6
7
7
import markdown2
8
8
from pyrsistent import v
175
175
176
176
# Searchers
177
177
# ==================================================================================
178
+ SourceIter = Iterator [tuple [int , str ]]
179
+ Parsed = Tuple [str , int , str , str ]
180
+
178
181
def search_quotes (line : str , escape_char : str = '\\ ' , quotes_re = QUOTES_RE ) -> Optional [int ]:
179
182
"""
180
183
:param line: may be empty
@@ -255,7 +258,7 @@ def extract_embedding_quotes(content) -> Optional[Tuple[Any, Any, Any]]:
255
258
256
259
257
260
def _extract_braces_expression (
258
- line : str , source : Iterator [ Tuple [ Any , str ]] , starting_braces_re , open_braces_re , closing_braces_re
261
+ line : str , source : SourceIter , starting_braces_re , open_braces_re , closing_braces_re
259
262
) -> Optional [Tuple [Any , Any , Any ]]:
260
263
"""
261
264
@@ -323,16 +326,16 @@ def _extract_braces_expression(
323
326
)
324
327
325
328
326
- def extract_identifier (line , source , identifier_start = '#' , terminators = ('.' , ' ' , CLOSE_BRACE , INLINE_TAG_SEPARATOR )):
329
+ def extract_identifier (line : str , source , identifier_start : str = '#' ,
330
+ terminators : Sequence [str ] = v ('.' , ' ' , CLOSE_BRACE , INLINE_TAG_SEPARATOR )
331
+ ) -> Optional [Tuple [str , str , Any ]]:
327
332
"""
328
333
329
334
:param line: Current line. It may be empty.
330
335
:type line: str or unicode
331
336
:param source:
332
- :type source: str
333
337
:param identifier_start:
334
338
:param terminators:
335
- :type terminators: tuple or set
336
339
"""
337
340
if not line or not line .startswith (identifier_start ):
338
341
return None
@@ -536,7 +539,7 @@ def extract_tag_attribute(line: str, source: str, syntax, inside_parentheses=Fal
536
539
return None
537
540
538
541
539
- def extract_line_break (tail , source ):
542
+ def extract_line_break (tail , source : SourceIter ):
540
543
"""
541
544
Checks the first character of the tail.
542
545
@@ -558,7 +561,7 @@ def extract_line_break(tail, source):
558
561
return found , tail , source
559
562
560
563
561
- def extract_statement_expression (tail : str , source : str ) -> Tuple [str , str ]:
564
+ def extract_statement_expression (tail : str , source : SourceIter ) -> Tuple [str , str ]:
562
565
"""
563
566
564
567
:param tail:
@@ -806,7 +809,7 @@ def parse_doctype(indent_level, current_line, ___, source, syntax):
806
809
return DOCTYPES .get (doctype , DOCTYPES ['5' ]), indent_level , '' , source
807
810
808
811
809
- def parse_handlebars (indent_level , current_line , ___ , source , syntax ):
812
+ def parse_handlebars (indent_level : int , current_line , ___ , source : SourceIter , syntax ) -> Parsed :
810
813
"""
811
814
812
815
:param indent_level:
@@ -829,7 +832,7 @@ def parse_handlebars(indent_level, current_line, ___, source, syntax):
829
832
return processed_tag , tail_indent , tail_line , source
830
833
831
834
832
- def parse_tag_tree (indent_level , current_line , ___ , source , syntax ):
835
+ def parse_tag_tree (indent_level : int , current_line : str , ___ : Any , source : SourceIter , syntax ) -> Parsed :
833
836
"""
834
837
835
838
:param indent_level:
@@ -961,7 +964,7 @@ def parse_python_new_style(indent_level, __, matched, source, syntax):
961
964
962
965
963
966
964
- def parse_mako_text (indent , __ , matched , source , syntax ) -> Tuple [ str , int , str , str ] :
967
+ def parse_mako_text (indent , __ , matched , source , syntax ) -> Parsed :
965
968
"""
966
969
967
970
:param indent:
@@ -1060,7 +1063,7 @@ def parse_comment(indent_level, __, ___, source, syntax):
1060
1063
return '' , 0 , '' , source
1061
1064
1062
1065
1063
- def parse_statements (indent_level , __ , matched , source , syntax ) -> Tuple [ str , int , str , str ] :
1066
+ def parse_statements (indent_level : int , __ : Any , matched , source : SourceIter , syntax ) -> Parsed :
1064
1067
"""
1065
1068
1066
1069
:param indent_level:
@@ -1095,7 +1098,9 @@ def parse_statements(indent_level, __, matched, source, syntax) -> Tuple[str, in
1095
1098
else :
1096
1099
tail_indent , tail_line = scan_line (tail_line )
1097
1100
1098
- def complete_statement (buf , tail_indent , tail_line , source , statement , syntax ):
1101
+ def complete_statement (
1102
+ buf : list [str ], tail_indent : int , tail_line : str , source , statement : str , syntax
1103
+ ) -> Parsed :
1099
1104
buf .extend ([
1100
1105
'\n ' ,
1101
1106
syntax .STATEMENT_END_START_SEQUENCE ,
@@ -1216,7 +1221,7 @@ def complete_statement(buf, tail_indent, tail_line, source, statement, syntax):
1216
1221
1217
1222
1218
1223
1219
- def parse_foreign_statements (indent_level , __ , matched , source , syntax ):
1224
+ def parse_foreign_statements (indent_level : int , __ : Any , matched , source : SourceIter , syntax ):
1220
1225
"""
1221
1226
1222
1227
:param indent_level:
@@ -1237,7 +1242,7 @@ def parse_foreign_statements(indent_level, __, matched, source, syntax):
1237
1242
return parse_statements (indent_level , __ , matched , source , syntax )
1238
1243
1239
1244
1240
- def parse_explicit_literal (indent_level , current_line , ___ , source , syntax , parse_embedded ) -> Tuple [ str , int , str , str ] :
1245
+ def parse_explicit_literal (indent_level , current_line , ___ , source , syntax , parse_embedded ) -> Parsed :
1241
1246
"""
1242
1247
Parses lines and blocks started with the "|" (pipe) or "," (comma) character.
1243
1248
@@ -1254,7 +1259,7 @@ def parse_explicit_literal(indent_level, current_line, ___, source, syntax, pars
1254
1259
trailing_space_required = current_line [0 ] == LITERAL_CONTENT_SPACE_PREFIX
1255
1260
1256
1261
# ---------------------------------
1257
- def prepare_result (buf ) :
1262
+ def prepare_result (buf : Sequence [ str ]) -> str :
1258
1263
result = joined (buf ).rstrip ()
1259
1264
if trailing_space_required :
1260
1265
result = u ("{} " ).format (result )
@@ -1296,14 +1301,13 @@ def prepare_result(buf):
1296
1301
parse_explicit_literal_no_embedded = functools .partial (parse_explicit_literal , parse_embedded = False )
1297
1302
1298
1303
1299
- def _parse_embedded_markup (content , syntax ):
1304
+ def _parse_embedded_markup (content : str , syntax ) -> str :
1300
1305
"""
1301
1306
1302
1307
:param content:
1303
1308
:param syntax: an instance of one of :class:`plim.syntax.BaseSyntax` children.
1304
1309
:type syntax: :class:`plim.syntax.BaseSyntax`
1305
1310
:return:
1306
- :rtype: str
1307
1311
"""
1308
1312
buf = []
1309
1313
tail = content
@@ -1351,7 +1355,7 @@ def _inject_n_filter(line: str) -> str:
1351
1355
return line
1352
1356
1353
1357
1354
- def parse_variable (indent_level , __ , matched , source , syntax ) -> Tuple [ str , int , str , str ] :
1358
+ def parse_variable (indent_level : int , __ , matched , source : SourceIter , syntax ) -> Parsed :
1355
1359
""" = variable or == variable
1356
1360
1357
1361
:param indent_level:
@@ -1389,7 +1393,7 @@ def parse_variable(indent_level, __, matched, source, syntax) -> Tuple[str, int,
1389
1393
return buf_str , 0 , '' , source
1390
1394
1391
1395
1392
- def parse_early_return (indent_level , __ , matched , source , syntax ) -> Tuple [ str , int , str , str ] :
1396
+ def parse_early_return (indent_level , __ , matched , source , syntax ) -> Parsed :
1393
1397
"""
1394
1398
1395
1399
:param indent_level:
@@ -1403,7 +1407,7 @@ def parse_early_return(indent_level, __, matched, source, syntax) -> Tuple[str,
1403
1407
return u ('\n <% {keyword} %>\n ' ).format (keyword = matched .group ('keyword' )), indent_level , '' , source
1404
1408
1405
1409
1406
- def parse_implicit_literal (indent_level , __ , matched , source , syntax ) -> Tuple [ str , int , str , str ] :
1410
+ def parse_implicit_literal (indent_level , __ , matched , source : SourceIter , syntax ) -> Parsed :
1407
1411
"""
1408
1412
1409
1413
:param indent_level:
@@ -1423,7 +1427,7 @@ def parse_implicit_literal(indent_level, __, matched, source, syntax) -> Tuple[s
1423
1427
)
1424
1428
1425
1429
1426
- def parse_raw_html (indent_level , current_line , ___ , source , syntax ) -> Tuple [ str , int , str , str ] :
1430
+ def parse_raw_html (indent_level , current_line , ___ , source , syntax ) -> Parsed :
1427
1431
"""
1428
1432
1429
1433
:param indent_level:
@@ -1457,7 +1461,7 @@ def parse_raw_html(indent_level, current_line, ___, source, syntax) -> Tuple[str
1457
1461
return joined (buf ), 0 , '' , source
1458
1462
1459
1463
1460
- def parse_mako_one_liners (indent_level , __ , matched , source , syntax ) -> Tuple [ str , int , str , str ] :
1464
+ def parse_mako_one_liners (indent_level , __ , matched , source , syntax ) -> Parsed :
1461
1465
"""
1462
1466
1463
1467
:param indent_level:
@@ -1478,7 +1482,7 @@ def parse_mako_one_liners(indent_level, __, matched, source, syntax) -> Tuple[st
1478
1482
return joined (buf ), indent_level , '' , source
1479
1483
1480
1484
1481
- def parse_def_block (indent_level : int , __ , matched , source : str , syntax ) -> Tuple [ str , int , str , str ] :
1485
+ def parse_def_block (indent_level : int , __ , matched , source : str , syntax ) -> Parsed :
1482
1486
"""
1483
1487
1484
1488
:param indent_level:
@@ -1522,7 +1526,7 @@ def parse_def_block(indent_level: int, __, matched, source: str, syntax) -> Tupl
1522
1526
return joined (buf ), 0 , '' , source
1523
1527
1524
1528
1525
- def parse_plim_tail (lineno , indent_level , tail_line , source , syntax ):
1529
+ def parse_plim_tail (lineno : int , indent_level , tail_line , source : SourceIter , syntax ) -> Parsed :
1526
1530
"""
1527
1531
1528
1532
:param lineno:
@@ -1546,7 +1550,7 @@ def parse_plim_tail(lineno, indent_level, tail_line, source, syntax):
1546
1550
1547
1551
# Miscellaneous utilities
1548
1552
# ==================================================================================
1549
- def enumerate_source (source : str ) -> Iterator [ Tuple [ int , str ]] :
1553
+ def enumerate_source (source : str ) -> SourceIter :
1550
1554
"""
1551
1555
1552
1556
:param source:
0 commit comments