From 7e3ef0ebd0c3453ce351af70ccdb25e93de1d7a9 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Thu, 24 Nov 2016 21:55:13 +0000 Subject: Add HTML path parser --- mammoth/styles/parser/html_path_parser.py | 64 +++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 mammoth/styles/parser/html_path_parser.py (limited to 'mammoth/styles/parser/html_path_parser.py') 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"), + )) -- cgit v1.2.3