diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-11-24 21:55:13 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-11-24 21:55:13 +0000 |
| commit | 7e3ef0ebd0c3453ce351af70ccdb25e93de1d7a9 (patch) | |
| tree | baa24495768580b2a70bcd181ef1a398c435bc6d /mammoth/styles/parser/html_path_parser.py | |
| parent | cfc0df82457acff6d8ac1abf930901b8baafbe17 (diff) | |
Add HTML path parser
Diffstat (limited to 'mammoth/styles/parser/html_path_parser.py')
| -rw-r--r-- | mammoth/styles/parser/html_path_parser.py | 64 |
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"), + )) |
