diff options
| author | Michael Williamson <mike@zwobble.org> | 2016-11-24 21:38:10 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2016-11-24 21:38:10 +0000 |
| commit | 1de9198f0c69152fe6f474185ac351e9500a4ce8 (patch) | |
| tree | fa3eb932fa35f796548304a7454fb2eb83717d0e /mammoth/styles/parser/document_matcher_parser.py | |
| parent | 056a2173eeb6d0469fde9a24e1db81d67f8722f5 (diff) | |
Implement document matcher parser
Diffstat (limited to 'mammoth/styles/parser/document_matcher_parser.py')
| -rw-r--r-- | mammoth/styles/parser/document_matcher_parser.py | 71 |
1 files changed, 71 insertions, 0 deletions
diff --git a/mammoth/styles/parser/document_matcher_parser.py b/mammoth/styles/parser/document_matcher_parser.py new file mode 100644 index 0000000..77eae3e --- /dev/null +++ b/mammoth/styles/parser/document_matcher_parser.py @@ -0,0 +1,71 @@ +from ... import documents, document_matchers +from .tokeniser import TokenType +from .token_parser import try_parse_class_name, parse_string + + +def parse_document_matcher(tokens): + if tokens.try_skip(TokenType.IDENTIFIER, "p"): + style_id = try_parse_class_name(tokens) + style_name = _parse_style_name(tokens) + numbering = _parse_numbering(tokens) + + return document_matchers.paragraph( + style_id=style_id, + style_name=style_name, + numbering=numbering, + ) + + elif tokens.try_skip(TokenType.IDENTIFIER, "r"): + style_id = try_parse_class_name(tokens) + style_name = _parse_style_name(tokens) + + return document_matchers.run( + style_id=style_id, + style_name=style_name, + ) + + elif tokens.try_skip(TokenType.IDENTIFIER, "b"): + return document_matchers.bold + + elif tokens.try_skip(TokenType.IDENTIFIER, "i"): + return document_matchers.italic + + elif tokens.try_skip(TokenType.IDENTIFIER, "u"): + return document_matchers.underline + + elif tokens.try_skip(TokenType.IDENTIFIER, "strike"): + return document_matchers.strikethrough + + elif tokens.try_skip(TokenType.IDENTIFIER, "comment-reference"): + return document_matchers.comment_reference + + +def _parse_style_name(tokens): + if tokens.try_skip(TokenType.SYMBOL, "["): + tokens.skip(TokenType.IDENTIFIER, "style-name") + tokens.skip(TokenType.SYMBOL, "=") + name = parse_string(tokens) + tokens.skip(TokenType.SYMBOL, "]") + return name + else: + return None + + +def _parse_numbering(tokens): + if tokens.try_skip(TokenType.SYMBOL, ":"): + is_ordered = _parse_list_type(tokens) + tokens.skip(TokenType.SYMBOL, "(") + level = int(tokens.next_value(TokenType.INTEGER)) - 1 + tokens.skip(TokenType.SYMBOL, ")") + return documents.numbering_level(level, is_ordered=is_ordered) + + +def _parse_list_type(tokens): + list_type = tokens.next_value(TokenType.IDENTIFIER) + if list_type == "ordered-list": + return True + elif list_type == "unordered-list": + return False + else: + pass + # TODO: raise |
