aboutsummaryrefslogtreecommitdiff
path: root/mammoth/styles/parser/document_matcher_parser.py
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-11-24 21:38:10 +0000
committerMichael Williamson <mike@zwobble.org>2016-11-24 21:38:10 +0000
commit1de9198f0c69152fe6f474185ac351e9500a4ce8 (patch)
treefa3eb932fa35f796548304a7454fb2eb83717d0e /mammoth/styles/parser/document_matcher_parser.py
parent056a2173eeb6d0469fde9a24e1db81d67f8722f5 (diff)
Implement document matcher parser
Diffstat (limited to 'mammoth/styles/parser/document_matcher_parser.py')
-rw-r--r--mammoth/styles/parser/document_matcher_parser.py71
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