Started styling attributes for table row and table start. Still not entirely sure about this, definitely need to make changes regarding padding.tags/v0.4
| @@ -1007,23 +1007,53 @@ class Tokenizer(object): | |||||
| # TODO - fail all other contexts on start? | # TODO - fail all other contexts on start? | ||||
| self._head += 2 | self._head += 2 | ||||
| reset = self._head - 1 | reset = self._head - 1 | ||||
| style = None | |||||
| try: | try: | ||||
| self._push(contexts.TABLE_OPEN) | |||||
| style = self._parse_as_table_style("\n", break_on_table_end=True) | |||||
| if len(style) == 0: | |||||
| self._head = reset + 1 | |||||
| table = self._parse(contexts.TABLE_OPEN) | table = self._parse(contexts.TABLE_OPEN) | ||||
| except BadRoute: | except BadRoute: | ||||
| self._head = reset | self._head = reset | ||||
| self._emit_text("{|") | self._emit_text("{|") | ||||
| else: | else: | ||||
| self._emit_style_tag("table", "{|", table) | |||||
| self._emit(tokens.TagOpenOpen(wiki_markup="{|")) | |||||
| self._emit_text("table") | |||||
| if style: | |||||
| self._emit_all(style) | |||||
| self._emit(tokens.TagCloseOpen()) | |||||
| self._emit_all(table) | |||||
| self._emit(tokens.TagOpenClose()) | |||||
| self._emit_text("table") | |||||
| self._emit(tokens.TagCloseClose()) | |||||
| # self._emit_style_tag("table", "{|", table) | |||||
| def _handle_table_end(self): | def _handle_table_end(self): | ||||
| self._head += 2 | self._head += 2 | ||||
| return self._pop() | return self._pop() | ||||
| def _handle_table_row(self): | def _handle_table_row(self): | ||||
| self._head += 1 | |||||
| self._emit(tokens.TagOpenOpen(wiki_markup="|-")) | |||||
| self._emit_text("tr") | |||||
| self._emit(tokens.TagCloseSelfclose()) | |||||
| reset = self._head | |||||
| self._head += 2 | |||||
| try: | |||||
| self._push(contexts.TABLE_OPEN) | |||||
| style = self._parse_as_table_style("\n") | |||||
| if len(style) == 0: | |||||
| self._head = reset + 2 | |||||
| except BadRoute: | |||||
| self._head = reset | |||||
| raise | |||||
| else: | |||||
| self._emit(tokens.TagOpenOpen(wiki_markup="|-")) | |||||
| self._emit_text("tr") | |||||
| if style: | |||||
| # this looks highly suspicious | |||||
| # if type(style[0] == tokens.Text): | |||||
| # style.pop(0) | |||||
| self._emit_all(style) | |||||
| self._emit(tokens.TagCloseSelfclose()) | |||||
| self._head -= 1 | |||||
| def _handle_table_cell(self, markup, tag, line_context): | def _handle_table_cell(self, markup, tag, line_context): | ||||
| """Parse as normal syntax unless we hit a style marker, then parse as HTML attributes""" | """Parse as normal syntax unless we hit a style marker, then parse as HTML attributes""" | ||||
| @@ -1047,9 +1077,10 @@ class Tokenizer(object): | |||||
| self._head = reset + len(markup) | self._head = reset + len(markup) | ||||
| try: | try: | ||||
| style = self._parse_as_table_style("|") | style = self._parse_as_table_style("|") | ||||
| # Don't parse the style separator | |||||
| self._head += 1 | |||||
| (cell_context, cell) = self._parse(table_context) | (cell_context, cell) = self._parse(table_context) | ||||
| except BadRoute: | except BadRoute: | ||||
| assert False | |||||
| self._head = reset | self._head = reset | ||||
| raise | raise | ||||
| self._emit(tokens.TagOpenOpen(wiki_markup=markup)) | self._emit(tokens.TagOpenOpen(wiki_markup=markup)) | ||||
| @@ -1066,7 +1097,7 @@ class Tokenizer(object): | |||||
| # offset displacement done by _parse() | # offset displacement done by _parse() | ||||
| self._head -= 1 | self._head -= 1 | ||||
| def _parse_as_table_style(self, end_token): | |||||
| def _parse_as_table_style(self, end_token, break_on_table_end=False): | |||||
| data = _TagOpenData() | data = _TagOpenData() | ||||
| data.context = _TagOpenData.CX_ATTR_READY | data.context = _TagOpenData.CX_ATTR_READY | ||||
| while True: | while True: | ||||
| @@ -1086,7 +1117,9 @@ class Tokenizer(object): | |||||
| elif this == end_token and can_exit: | elif this == end_token and can_exit: | ||||
| if data.context & (data.CX_ATTR_NAME | data.CX_ATTR_VALUE): | if data.context & (data.CX_ATTR_NAME | data.CX_ATTR_VALUE): | ||||
| self._push_tag_buffer(data) | self._push_tag_buffer(data) | ||||
| self._head += 1 | |||||
| # self._head += 1 | |||||
| return self._pop() | |||||
| elif break_on_table_end and this == "|" and next == "}": | |||||
| return self._pop() | return self._pop() | ||||
| else: | else: | ||||
| self._handle_tag_data(data, this) | self._handle_tag_data(data, this) | ||||
| @@ -127,7 +127,7 @@ output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(), Text | |||||
| name: table_cell_attributes_name_with_pipe | name: table_cell_attributes_name_with_pipe | ||||
| label: Pipe inside an attribute name should still be used as a style separator. | label: Pipe inside an attribute name should still be used as a style separator. | ||||
| input: "{| \n | name|="foo bar"| test \n|}" | input: "{| \n | name|="foo bar"| test \n|}" | ||||
| output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(), Text(text=" \n "), TagOpenOpen(wiki_markup="|"), Text(text="td"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="name"), TagCloseSelfclose(), Text(text="=\"foo bar"| test \n"), TagOpenClose(), Text(text="table"), TagCloseClose()] | |||||
| output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(), Text(text=" \n "), TagOpenOpen(wiki_markup="|"), Text(text="td"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="name"), TagCloseSelfclose(), Text(text="=\"foo bar\"| test \n"), TagOpenClose(), Text(text="table"), TagCloseClose()] | |||||
| --- | --- | ||||
| @@ -135,3 +135,25 @@ name: table_cell_attributes_pipe_after_equals | |||||
| label: Pipe inside an attribute should still be used as a style separator after an equals. | label: Pipe inside an attribute should still be used as a style separator after an equals. | ||||
| input: "{| \n | name=|"foo|bar"| test \n|}" | input: "{| \n | name=|"foo|bar"| test \n|}" | ||||
| output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(), Text(text=" \n "), TagOpenOpen(wiki_markup="|"), Text(text="td"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="name"), TagAttrEquals(), TagCloseSelfclose(), Text(text="\"foo|bar\"| test \n"), TagOpenClose(), Text(text="table"), TagCloseClose()] | output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(), Text(text=" \n "), TagOpenOpen(wiki_markup="|"), Text(text="td"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="name"), TagAttrEquals(), TagCloseSelfclose(), Text(text="\"foo|bar\"| test \n"), TagOpenClose(), Text(text="table"), TagCloseClose()] | ||||
| --- | |||||
| name: table_row_attributes | |||||
| label: Parse table row style attributes. | |||||
| input: "{| \n |- name="foo bar"\n|}" | |||||
| output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(), Text(text=" \n "), TagOpenOpen(wiki_markup="|-"), Text(text="tr"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="name"), TagAttrEquals(), TagAttrQuote(char="\""), Text(text="foo bar"), TagCloseSelfclose(), Text(text="\n"), TagOpenClose(), Text(text="table"), TagCloseClose()] | |||||
| --- | |||||
| name: table_row_attributes_crazy_whitespace | |||||
| label: Parse table row style attributes with different whitespace. | |||||
| input: "{| \t \n |- \t name="foo bar"\n|}" | |||||
| output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(), Text(text=" \t \n "), TagOpenOpen(wiki_markup="|-"), Text(text="tr"), TagAttrStart(pad_first=" \t ", pad_before_eq="", pad_after_eq=""), Text(text="name"), TagAttrEquals(), TagAttrQuote(char="\""), Text(text="foo bar"), TagCloseSelfclose(), Text(text="\n"), TagOpenClose(), Text(text="table"), TagCloseClose()] | |||||
| --- | |||||
| name: table_attributes | |||||
| label: Parse table style attributes. | |||||
| input: "{| name="foo bar"\n|}" | |||||
| output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"),TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="name"), TagAttrEquals(), TagAttrQuote(char="\""), Text(text="foo bar"), TagCloseOpen(), Text(text="\n"), TagOpenClose(), Text(text="table"), TagCloseClose()] | |||||