| @@ -22,7 +22,7 @@ | |||
| from ..string_mixin import StringMixIn | |||
| __all__ = ["Node"] | |||
| __all__ = ["Node", "Text", "Heading", "HTMLEntity", "Tag", "Template"] | |||
| class Node(StringMixIn): | |||
| def __iternodes__(self, getter): | |||
| @@ -20,4 +20,18 @@ | |||
| # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |||
| # SOFTWARE. | |||
| from .demo import DemoParser as Parser | |||
| from .builder import Builder | |||
| from .tokenizer import Tokenizer | |||
| __all__ = ["Parser"] | |||
| class Parser(object): | |||
| def __init__(self, text): | |||
| self.text = text | |||
| self._tokenizer = Tokenizer() | |||
| self._builder = Builder() | |||
| def parse(self): | |||
| tokens = self._tokenizer.tokenize(self.text) | |||
| code = self._builder.build(tokens) | |||
| return code | |||
| @@ -0,0 +1,36 @@ | |||
| # -*- coding: utf-8 -*- | |||
| # | |||
| # Copyright (C) 2012 Ben Kurtovic <ben.kurtovic@verizon.net> | |||
| # | |||
| # Permission is hereby granted, free of charge, to any person obtaining a copy | |||
| # of this software and associated documentation files (the "Software"), to deal | |||
| # in the Software without restriction, including without limitation the rights | |||
| # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||
| # copies of the Software, and to permit persons to whom the Software is | |||
| # furnished to do so, subject to the following conditions: | |||
| # | |||
| # The above copyright notice and this permission notice shall be included in | |||
| # all copies or substantial portions of the Software. | |||
| # | |||
| # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
| # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
| # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||
| # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
| # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||
| # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |||
| # SOFTWARE. | |||
| __all__ = ["BuildStack"] | |||
| class BuildStack(object): | |||
| def __init__(self): | |||
| pass | |||
| def write(self, item): | |||
| pass | |||
| def push(self): | |||
| pass | |||
| def pop(self): | |||
| pass | |||
| @@ -0,0 +1,93 @@ | |||
| # -*- coding: utf-8 -*- | |||
| # | |||
| # Copyright (C) 2012 Ben Kurtovic <ben.kurtovic@verizon.net> | |||
| # | |||
| # Permission is hereby granted, free of charge, to any person obtaining a copy | |||
| # of this software and associated documentation files (the "Software"), to deal | |||
| # in the Software without restriction, including without limitation the rights | |||
| # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||
| # copies of the Software, and to permit persons to whom the Software is | |||
| # furnished to do so, subject to the following conditions: | |||
| # | |||
| # The above copyright notice and this permission notice shall be included in | |||
| # all copies or substantial portions of the Software. | |||
| # | |||
| # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
| # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
| # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||
| # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
| # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||
| # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |||
| # SOFTWARE. | |||
| import re | |||
| from . import tokens | |||
| from .build_stack import BuildStack | |||
| from ..nodes import Template, Text | |||
| from ..nodes.extras import Parameter | |||
| from ..smart_list import SmartList | |||
| from ..wikicode import Wikicode | |||
| __all__ = ["Builder"] | |||
| class Builder(object): | |||
| def __init__(self): | |||
| self._tokens = [] | |||
| self._stack = BuildStack() | |||
| def _pop(self): | |||
| return Wikicode(SmartList(stack.pop())) | |||
| def _handle_parameter(self, key): | |||
| showkey = False | |||
| self._stack.push() | |||
| while self._tokens: | |||
| token = self._tokens.pop(0) | |||
| if isinstance(token, tokens.TEMPLATE_PARAM_EQUALS): | |||
| key = self._pop() | |||
| showkey = True | |||
| self._stack.push() | |||
| elif isinstance(token, (tokens.TEMPLATE_PARAM_SEPARATOR, | |||
| tokens.TEMPLATE_CLOSE)): | |||
| self._tokens.insert(0, token) | |||
| value = self._pop() | |||
| return Parameter(key, value, showkey) | |||
| else: | |||
| self._stack.write(self._handle_token()) | |||
| def _handle_template(self): | |||
| params = [] | |||
| int_keys = set() | |||
| int_key_range = {1} | |||
| self._stack.push() | |||
| while self._tokens: | |||
| token = self._tokens.pop(0) | |||
| if isinstance(token, tokens.TEMPLATE_PARAM_SEPARATOR): | |||
| if not params: | |||
| name = self._pop() | |||
| param = self._handle_parameter(min(int_key_range - int_keys)) | |||
| if re.match(r"[1-9][0-9]*$", param.key.strip()): | |||
| int_keys.add(int(param.key)) | |||
| int_key_range.add(len(int_keys) + 1) | |||
| params.append(param) | |||
| elif isinstance(token, tokens.TEMPLATE_CLOSE): | |||
| if not params: | |||
| name = self._pop() | |||
| return Template(name, params) | |||
| else: | |||
| self._stack.write(self._handle_token()) | |||
| def _handle_token(self): | |||
| token = self._tokens.pop(0) | |||
| if isinstance(token, tokens.TEXT): | |||
| return Text(token.text) | |||
| elif isinstance(token, tokens.TEMPLATE_OPEN): | |||
| return self._handle_template() | |||
| def build(self, tokens): | |||
| self._tokens = tokens | |||
| self._stack.push() | |||
| while self._tokens: | |||
| self._stack.write(self._handle_token()) | |||
| return self._pop() | |||
| @@ -1,53 +0,0 @@ | |||
| # -*- coding: utf-8 -*- | |||
| # | |||
| # Copyright (C) 2012 Ben Kurtovic <ben.kurtovic@verizon.net> | |||
| # | |||
| # Permission is hereby granted, free of charge, to any person obtaining a copy | |||
| # of this software and associated documentation files (the "Software"), to deal | |||
| # in the Software without restriction, including without limitation the rights | |||
| # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||
| # copies of the Software, and to permit persons to whom the Software is | |||
| # furnished to do so, subject to the following conditions: | |||
| # | |||
| # The above copyright notice and this permission notice shall be included in | |||
| # all copies or substantial portions of the Software. | |||
| # | |||
| # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
| # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
| # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||
| # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
| # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||
| # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |||
| # SOFTWARE. | |||
| from ..nodes import Template, Text | |||
| from ..nodes.extras import Parameter | |||
| from ..smart_list import SmartList | |||
| from ..wikicode import Wikicode | |||
| __all__ = ["DemoParser"] | |||
| class DemoParser(object): | |||
| def __init__(self, text): | |||
| self.text = text | |||
| def _tokenize(self): | |||
| return [] | |||
| def parse(self): | |||
| # Ensure text is unicode! | |||
| text = u"This is a {{test}} message with a {{template|with|foo={{params}}}}." | |||
| node1 = Text(u"This is a ") | |||
| node2 = Template(Wikicode([Text(u"test")])) | |||
| node3 = Text(u" message with a ") | |||
| node4_param1_name = Wikicode([Text(u"1")]) | |||
| node4_param1_value = Wikicode([Text(u"with")]) | |||
| node4_param1 = Parameter(node4_param1_name, node4_param1_value, showkey=False) | |||
| node4_param2_name = Wikicode([Text(u"foo")]) | |||
| node4_param2_value = Wikicode([Template(Wikicode([Text(u"params")]))]) | |||
| node4_param2 = Parameter(node4_param2_name, node4_param2_value, showkey=True) | |||
| node4 = Template(Wikicode([Text(u"template")]), [node4_param1, node4_param2]) | |||
| node5 = Text(u".") | |||
| parsed = Wikicode(SmartList([node1, node2, node3, node4, node5])) | |||
| return parsed | |||
| @@ -0,0 +1,30 @@ | |||
| # -*- coding: utf-8 -*- | |||
| # | |||
| # Copyright (C) 2012 Ben Kurtovic <ben.kurtovic@verizon.net> | |||
| # | |||
| # Permission is hereby granted, free of charge, to any person obtaining a copy | |||
| # of this software and associated documentation files (the "Software"), to deal | |||
| # in the Software without restriction, including without limitation the rights | |||
| # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||
| # copies of the Software, and to permit persons to whom the Software is | |||
| # furnished to do so, subject to the following conditions: | |||
| # | |||
| # The above copyright notice and this permission notice shall be included in | |||
| # all copies or substantial portions of the Software. | |||
| # | |||
| # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
| # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
| # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||
| # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
| # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||
| # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |||
| # SOFTWARE. | |||
| from . import tokens | |||
| __all__ = ["Tokenizer"] | |||
| class Tokenizer(object): | |||
| def tokenize(self, text): | |||
| tokens = [tokens.Text(text=text)] | |||
| return tokens | |||
| @@ -0,0 +1,65 @@ | |||
| # -*- coding: utf-8 -*- | |||
| # | |||
| # Copyright (C) 2012 Ben Kurtovic <ben.kurtovic@verizon.net> | |||
| # | |||
| # Permission is hereby granted, free of charge, to any person obtaining a copy | |||
| # of this software and associated documentation files (the "Software"), to deal | |||
| # in the Software without restriction, including without limitation the rights | |||
| # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||
| # copies of the Software, and to permit persons to whom the Software is | |||
| # furnished to do so, subject to the following conditions: | |||
| # | |||
| # The above copyright notice and this permission notice shall be included in | |||
| # all copies or substantial portions of the Software. | |||
| # | |||
| # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
| # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
| # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||
| # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
| # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, | |||
| # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |||
| # SOFTWARE. | |||
| __all__ = ["Token"] | |||
| class Token(object): | |||
| def __init__(self, **kwargs): | |||
| self.__kwargs = kwargs | |||
| def __getattr__(self, key): | |||
| return self.__kwargs[key] | |||
| def __setattr__(self, key, value): | |||
| self.__kwargs[key] = value | |||
| def __delattr__(self, key): | |||
| del self.__kwargs[key] | |||
| def make(name): | |||
| __all__.append(name) | |||
| return type(name, (Token,), {}) | |||
| TEXT = make("TEXT") | |||
| TEMPLATE_OPEN = make("TEMPLATE_OPEN") # {{ | |||
| TEMPLATE_PARAM_SEPARATOR = make("TEMPLATE_PARAM_SEPARATOR") # | | |||
| TEMPLATE_PARAM_EQUALS = make("TEMPLATE_PARAM_EQUALS") # = | |||
| TEMPLATE_CLOSE = make("TEMPLATE_CLOSE") # }} | |||
| HTML_ENTITY_START = make("HTML_ENTITY_START") # & | |||
| HTML_ENTITY_NUMERIC = make("HTML_ENTITY_NUMERIC") # # | |||
| HTML_ENTITY_HEX = make("HTML_ENTITY_HEX") # x | |||
| HTML_ENTITY_END = make("HTML_ENTITY_END") # ; | |||
| HEADING_BLOCK = make("HEADING_BLOCK") # =... | |||
| TAG_OPEN_OPEN = make("TAG_OPEN_OPEN") # < | |||
| TAG_ATTR_EQUALS = make("TAG_ATTR_EQUALS") # = | |||
| TAG_ATTR_QUOTE = make("TAG_ATTR_QUOTE") # " | |||
| TAG_CLOSE_OPEN = make("TAG_CLOSE_OPEN") # > | |||
| TAG_CLOSE_SELFCLOSE = make("TAG_CLOSE_SELFCLOSE") # /> | |||
| TAG_OPEN_CLOSE = make("TAG_OPEN_CLOSE") # </ | |||
| TAG_CLOSE_CLOSE = make("TAG_CLOSE_CLOSE") # > | |||
| del make | |||