aboutsummaryrefslogtreecommitdiff
path: root/mammoth/styles/parser/html_path_parser.py
diff options
context:
space:
mode:
Diffstat (limited to 'mammoth/styles/parser/html_path_parser.py')
-rw-r--r--mammoth/styles/parser/html_path_parser.py64
1 files changed, 64 insertions, 0 deletions
diff --git a/mammoth/styles/parser/html_path_parser.py b/mammoth/styles/parser/html_path_parser.py
new file mode 100644
index 0000000..e8f448e
--- /dev/null
+++ b/mammoth/styles/parser/html_path_parser.py
@@ -0,0 +1,64 @@
+from ... import html_paths
+from .tokeniser import TokenType
+from .token_parser import parse_identifier, try_parse_class_name
+
+
+def parse_html_path(tokens):
+ if tokens.try_skip(TokenType.SYMBOL, "!"):
+ return html_paths.ignore
+ else:
+ return html_paths.path(_parse_html_path_elements(tokens))
+
+
+def _parse_html_path_elements(tokens):
+ elements = []
+
+ if tokens.peek_token_type() == TokenType.IDENTIFIER:
+ elements.append(_parse_element(tokens))
+
+ while tokens.try_skip_many(((TokenType.WHITESPACE, None), (TokenType.SYMBOL, ">"))):
+ tokens.skip(TokenType.WHITESPACE)
+ elements.append(_parse_element(tokens))
+
+ return elements
+
+
+def _parse_element(tokens):
+ tag_names = _parse_tag_names(tokens)
+ class_names = _parse_class_names(tokens)
+ is_fresh = _parse_is_fresh(tokens)
+
+ return html_paths.element(
+ tag_names,
+ class_names=class_names,
+ fresh=is_fresh,
+ )
+
+
+def _parse_tag_names(tokens):
+ tag_names = [parse_identifier(tokens)]
+
+ while tokens.try_skip(TokenType.SYMBOL, "|"):
+ tag_names.append(parse_identifier(tokens))
+
+ return tag_names
+
+
+def _parse_class_names(tokens):
+ class_names = []
+
+ while True:
+ class_name = try_parse_class_name(tokens)
+ if class_name is None:
+ break
+ else:
+ class_names.append(class_name)
+
+ return class_names
+
+
+def _parse_is_fresh(tokens):
+ return tokens.try_skip_many((
+ (TokenType.SYMBOL, ":"),
+ (TokenType.IDENTIFIER, "fresh"),
+ ))