From 213c105666a669349dfa607a163da245df9af466 Mon Sep 17 00:00:00 2001 From: David Winegar Date: Tue, 22 Jul 2014 14:31:37 -0700 Subject: [PATCH] Table tags are no longer self-closing Table tags no longer self-closing. Rows and cells now contain their contents. Also refactored out an `emit_table_tag` method. Note: this will require changes to the Tag node and possibly the builder, those changes will be in the next commit. --- mwparserfromhell/parser/contexts.py | 9 +- mwparserfromhell/parser/tokenizer.c | 289 +++++++++++++++++------------------ mwparserfromhell/parser/tokenizer.h | 11 +- mwparserfromhell/parser/tokenizer.py | 83 +++++----- tests/tokenizer/tables.mwtest | 44 +++--- 5 files changed, 218 insertions(+), 218 deletions(-) diff --git a/mwparserfromhell/parser/contexts.py b/mwparserfromhell/parser/contexts.py index 6dd5319..ef44ce2 100644 --- a/mwparserfromhell/parser/contexts.py +++ b/mwparserfromhell/parser/contexts.py @@ -167,11 +167,12 @@ SAFETY_CHECK = (HAS_TEXT + FAIL_ON_TEXT + FAIL_NEXT + FAIL_ON_LBRACE + TABLE_OPEN = 1 << 30 TABLE_CELL_OPEN = 1 << 31 TABLE_CELL_STYLE = 1 << 32 -TABLE_TD_LINE = 1 << 33 -TABLE_TH_LINE = 1 << 34 +TABLE_ROW_OPEN = 1 << 33 +TABLE_TD_LINE = 1 << 34 +TABLE_TH_LINE = 1 << 35 TABLE_CELL_LINE_CONTEXTS = TABLE_TD_LINE + TABLE_TH_LINE + TABLE_CELL_STYLE -TABLE = (TABLE_OPEN + TABLE_CELL_OPEN + TABLE_CELL_STYLE + TABLE_TD_LINE + - TABLE_TH_LINE) +TABLE = (TABLE_OPEN + TABLE_CELL_OPEN + TABLE_CELL_STYLE + + TABLE_ROW_OPEN + + TABLE_TD_LINE + TABLE_TH_LINE) # Global contexts: diff --git a/mwparserfromhell/parser/tokenizer.c b/mwparserfromhell/parser/tokenizer.c index 1d2964e..c062404 100644 --- a/mwparserfromhell/parser/tokenizer.c +++ b/mwparserfromhell/parser/tokenizer.c @@ -2454,6 +2454,88 @@ static PyObject* Tokenizer_handle_end(Tokenizer* self, uint64_t context) } /* + Emit a table tag. +*/ +static int Tokenizer_emit_table_tag(Tokenizer* self, const char* open_open_markup, + const char* tag, PyObject* style, PyObject* padding, + const char* close_open_markup, PyObject* contents, + const char* open_close_markup) +{ + PyObject *open_open_kwargs, *open_open_markup_unicode, *close_open_kwargs, *close_open_markup_unicode, + *open_close_kwargs, *open_close_markup_unicode; + + open_open_kwargs = PyDict_New(); + if (!open_open_kwargs) + goto fail_decref_all; + open_open_markup_unicode = PyUnicode_FromString(open_open_markup); + if (!open_open_markup_unicode) { + Py_DECREF(open_open_kwargs); + goto fail_decref_all; + } + PyDict_SetItemString(open_open_kwargs, "wiki_markup", open_open_markup_unicode); + Py_DECREF(open_open_markup_unicode); + if (Tokenizer_emit_kwargs(self, TagOpenOpen, open_open_kwargs)) + goto fail_decref_all; + if (Tokenizer_emit_text(self, tag)) + goto fail_decref_all; + + if (style) { + if (Tokenizer_emit_all(self, style)) + goto fail_decref_all; + Py_DECREF(style); + } + + close_open_kwargs = PyDict_New(); + if (!close_open_kwargs) + goto fail_decref_padding_contents; + if (close_open_markup && strlen(close_open_markup) != 0) { + close_open_markup_unicode = PyUnicode_FromString(close_open_markup); + if (!close_open_markup_unicode) { + Py_DECREF(close_open_kwargs); + goto fail_decref_padding_contents; + } + PyDict_SetItemString(close_open_kwargs, "wiki_markup", close_open_markup_unicode); + Py_DECREF(close_open_markup_unicode); + } + PyDict_SetItemString(close_open_kwargs, "padding", padding); + Py_DECREF(padding); + if (Tokenizer_emit_kwargs(self, TagCloseOpen, close_open_kwargs)) + goto fail_decref_contents; + + if (contents) { + if (Tokenizer_emit_all(self, contents)) + goto fail_decref_contents; + Py_DECREF(contents); + } + + open_close_kwargs = PyDict_New(); + if (!open_close_kwargs) + return -1; + open_close_markup_unicode = PyUnicode_FromString(open_close_markup); + if (!open_close_markup_unicode) { + Py_DECREF(open_close_kwargs); + return -1; + } + PyDict_SetItemString(open_close_kwargs, "wiki_markup", open_close_markup_unicode); + Py_DECREF(open_close_markup_unicode); + if (Tokenizer_emit_kwargs(self, TagOpenClose, open_close_kwargs)) + return -1; + if (Tokenizer_emit_text(self, tag)) + return -1; + if (Tokenizer_emit(self, TagCloseClose)) + return -1; + return 0; + + fail_decref_all: + Py_XDECREF(style); + fail_decref_padding_contents: + Py_DECREF(padding); + fail_decref_contents: + Py_DECREF(contents); + return -1; +} + +/* Parse until ``end_token`` as style attributes for a table. */ static PyObject* Tokenizer_parse_as_table_style(Tokenizer* self, char end_token, @@ -2521,8 +2603,7 @@ static int Tokenizer_handle_table_start(Tokenizer* self) { self->head += 2; Py_ssize_t reset = self->head; - PyObject *style, *open_open_kwargs, *close_open_kwargs, *open_close_kwargs, - *padding, *newline_character, *open_wiki_markup, *close_wiki_markup; + PyObject *style, *padding, *newline_character; PyObject *table = NULL; if(Tokenizer_push(self, LC_TABLE_OPEN)) @@ -2573,68 +2654,11 @@ static int Tokenizer_handle_table_start(Tokenizer* self) self->head += 2; } - open_open_kwargs = PyDict_New(); - if (!open_open_kwargs) - goto fail_decref_all; - open_wiki_markup = PyUnicode_FromString("{|"); - if (!open_wiki_markup) { - Py_DECREF(open_open_kwargs); - goto fail_decref_all; - } - PyDict_SetItemString(open_open_kwargs, "wiki_markup", open_wiki_markup); - Py_DECREF(open_wiki_markup); - if (Tokenizer_emit_kwargs(self, TagOpenOpen, open_open_kwargs)) - goto fail_decref_all; - if (Tokenizer_emit_text(self, "table")) - goto fail_decref_all; - - if (style) { - if (Tokenizer_emit_all(self, style)) - goto fail_decref_padding_table; - Py_DECREF(style); - } - - close_open_kwargs = PyDict_New(); - if (!close_open_kwargs) - goto fail_decref_padding_table; - PyDict_SetItemString(close_open_kwargs, "padding", padding); - Py_DECREF(padding); - if (Tokenizer_emit_kwargs(self, TagCloseOpen, close_open_kwargs)) - goto fail_decref_table; - - if (table) { - if (Tokenizer_emit_all(self, table)) - goto fail_decref_table; - Py_DECREF(table); - } - - open_close_kwargs = PyDict_New(); - if (!open_close_kwargs) - return -1; - close_wiki_markup = PyUnicode_FromString("|}"); - if (!close_wiki_markup) { - Py_DECREF(open_close_kwargs); - return -1; - } - PyDict_SetItemString(open_close_kwargs, "wiki_markup", close_wiki_markup); - Py_DECREF(close_wiki_markup); - if (Tokenizer_emit_kwargs(self, TagOpenClose, open_close_kwargs)) - return -1; - if (Tokenizer_emit_text(self, "table")) - return -1; - if (Tokenizer_emit(self, TagCloseClose)) + if (Tokenizer_emit_table_tag(self, "{|", "table", style, padding, NULL, table, "|}")) return -1; // offset displacement done by _parse() self->head--; return 0; - - fail_decref_all: - Py_DECREF(style); - fail_decref_padding_table: - Py_DECREF(padding); - fail_decref_table: - Py_XDECREF(table); - return -1; } /* @@ -2651,67 +2675,60 @@ static PyObject * Tokenizer_handle_table_end(Tokenizer* self) */ static int Tokenizer_handle_table_row(Tokenizer* self) { + if (!Tokenizer_CAN_RECURSE(self)) { + if (Tokenizer_emit_text(self, "|-")) + return -1; + self->head += 1; + return 0; + } + Py_ssize_t reset = self->head; self->head += 2; - PyObject *padding, *open_kwargs, *close_kwargs, *wiki_markup; - PyObject *style = NULL; + PyObject *padding, *style, *row; - // If we can't recurse, still tokenize tag but parse style attrs as text - if (Tokenizer_CAN_RECURSE(self)) { - if(Tokenizer_push(self, LC_TABLE_OPEN)) - return -1; - padding = Tokenizer_parse_as_table_style(self, '\n', 0); - if (BAD_ROUTE) { - self->head = reset; - return 0; - } - if (!padding) - return -1; - style = Tokenizer_pop(self); - if (!style) { - Py_DECREF(padding); - return -1; - } - } else { - padding = PyUnicode_FromString(""); - if (!padding) - return -1; + if(Tokenizer_push(self, LC_TABLE_OPEN | LC_TABLE_ROW_OPEN)) + return -1; + padding = Tokenizer_parse_as_table_style(self, '\n', 0); + if (BAD_ROUTE) { + self->head = reset; + return 0; } - - open_kwargs = PyDict_New(); - if (!open_kwargs) - goto fail_decref_all; - wiki_markup = PyUnicode_FromString("|-"); - if (!wiki_markup) { - Py_DECREF(open_kwargs); - goto fail_decref_all; + if (!padding) + return -1; + style = Tokenizer_pop(self); + if (!style) { + Py_DECREF(padding); + return -1; } - PyDict_SetItemString(open_kwargs, "wiki_markup", wiki_markup); - Py_DECREF(wiki_markup); - if (Tokenizer_emit_kwargs(self, TagOpenOpen, open_kwargs)) - goto fail_decref_all; - if (Tokenizer_emit_text(self, "tr")) - goto fail_decref_all; - - if (style) { - if (Tokenizer_emit_all(self, style)) - goto fail_decref_all; + // don't parse the style separator + self->head++; + row = Tokenizer_parse(self, LC_TABLE_OPEN | LC_TABLE_ROW_OPEN, 1); + if (BAD_ROUTE) { + Py_DECREF(padding); Py_DECREF(style); + self->head = reset; + return 0; + } + if (!row) { + Py_DECREF(padding); + Py_DECREF(style); + Py_DECREF(row); + return -1; } - close_kwargs = PyDict_New(); - if (!close_kwargs) - goto fail_decref_all; - PyDict_SetItemString(close_kwargs, "padding", padding); - Py_DECREF(padding); - if (Tokenizer_emit_kwargs(self, TagCloseSelfclose, close_kwargs)) + if (Tokenizer_emit_table_tag(self, "|-", "tr", style, padding, NULL, row, "")) return -1; + // offset displacement done by _parse() + self->head--; return 0; +} - fail_decref_all: - Py_XDECREF(style); - Py_DECREF(padding); - return -1; +/* + Return the stack in order to handle the table row end. +*/ +static PyObject* Tokenizer_handle_table_row_end(Tokenizer* self) +{ + return Tokenizer_pop(self); } /* @@ -2732,9 +2749,9 @@ static int Tokenizer_handle_table_cell(Tokenizer* self, const char *markup, uint64_t cell_context; Py_ssize_t reset = self->head; self->head += strlen(markup); - PyObject *padding; - PyObject *cell, *open_kwargs, *close_kwargs, *open_wiki_markup, *close_wiki_markup; + PyObject *padding, *cell; PyObject *style = NULL; + const char *close_open_markup = NULL; cell = Tokenizer_parse(self, LC_TABLE_OPEN | LC_TABLE_CELL_OPEN | LC_TABLE_CELL_STYLE | line_context, 1); if (BAD_ROUTE) { @@ -2783,54 +2800,16 @@ static int Tokenizer_handle_table_cell(Tokenizer* self, const char *markup, } } - open_kwargs = PyDict_New(); - if (!open_kwargs) - goto fail_decref_all; - close_kwargs = PyDict_New(); - if (!close_kwargs) - goto fail_decref_all; - open_wiki_markup = PyUnicode_FromString(markup); - if (!open_wiki_markup) - goto fail_decref_all; - PyDict_SetItemString(open_kwargs, "wiki_markup", open_wiki_markup); - Py_DECREF(open_wiki_markup); - if (Tokenizer_emit_kwargs(self, TagOpenOpen, open_kwargs)) - goto fail_decref_all; - if (Tokenizer_emit_text(self, tag)) - goto fail_decref_all; - if (style) { - if (Tokenizer_emit_all(self, style)) - goto fail_decref_all; - close_wiki_markup = PyUnicode_FromString("|"); - if (!close_wiki_markup) - goto fail_decref_all; - PyDict_SetItemString(close_kwargs, "wiki_markup", close_wiki_markup); - Py_DECREF(close_wiki_markup); - Py_DECREF(style); + close_open_markup = "|"; } - - PyDict_SetItemString(close_kwargs, "padding", padding); - Py_DECREF(padding); - if (Tokenizer_emit_kwargs(self, TagCloseSelfclose, close_kwargs)) - goto fail_decref_cell; - if (Tokenizer_emit_all(self, cell)) - goto fail_decref_cell; - Py_DECREF(cell); + if (Tokenizer_emit_table_tag(self, markup, tag, style, padding, close_open_markup, cell, "")) + return -1; // keep header/cell line contexts self->topstack->context |= cell_context & (LC_TABLE_TH_LINE | LC_TABLE_TD_LINE); // offset displacement done by parse() self->head--; return 0; - - fail_decref_all: - Py_XDECREF(style); - Py_DECREF(padding); - Py_XDECREF(open_kwargs); - Py_XDECREF(close_kwargs); - fail_decref_cell: - Py_DECREF(cell); - return -1; } /* @@ -3139,12 +3118,16 @@ static PyObject* Tokenizer_parse(Tokenizer* self, uint64_t context, int push) if (this == '|' && next == '}') { if (this_context & LC_TABLE_CELL_OPEN) return Tokenizer_handle_table_cell_end(self, 0); + if (this_context & LC_TABLE_ROW_OPEN) + return Tokenizer_handle_table_row_end(self); else return Tokenizer_handle_table_end(self); } else if (this == '|' && next == '-') { if (this_context & LC_TABLE_CELL_OPEN) return Tokenizer_handle_table_cell_end(self, 0); + if (this_context & LC_TABLE_ROW_OPEN) + return Tokenizer_handle_table_row_end(self); else if (Tokenizer_handle_table_row(self)) return NULL; } diff --git a/mwparserfromhell/parser/tokenizer.h b/mwparserfromhell/parser/tokenizer.h index de7b7d4..57a0121 100644 --- a/mwparserfromhell/parser/tokenizer.h +++ b/mwparserfromhell/parser/tokenizer.h @@ -157,14 +157,15 @@ static PyObject* TagCloseClose; #define LC_FAIL_ON_RBRACE 0x0000000010000000 #define LC_FAIL_ON_EQUALS 0x0000000020000000 -// TODO realign all -#define LC_TABLE 0x00000007C0000000 -#define LC_TABLE_CELL_LINE_CONTEXTS 0x0000000700000000 +#define LC_TABLE 0x0000000FC0000000 +#define LC_TABLE_CELL_LINE_CONTEXTS 0x0000000D00000000 #define LC_TABLE_OPEN 0x0000000040000000 #define LC_TABLE_CELL_OPEN 0x0000000080000000 #define LC_TABLE_CELL_STYLE 0x0000000100000000 -#define LC_TABLE_TD_LINE 0x0000000200000000 -#define LC_TABLE_TH_LINE 0x0000000400000000 +#define LC_TABLE_ROW_OPEN 0x0000000200000000 +#define LC_TABLE_TD_LINE 0x0000000400000000 +#define LC_TABLE_TH_LINE 0x0000000800000000 + /* Global contexts: */ #define GL_HEADING 0x1 diff --git a/mwparserfromhell/parser/tokenizer.py b/mwparserfromhell/parser/tokenizer.py index e8f21c0..6ae6050 100644 --- a/mwparserfromhell/parser/tokenizer.py +++ b/mwparserfromhell/parser/tokenizer.py @@ -1002,6 +1002,23 @@ class Tokenizer(object): self._fail_route() return self._pop() + def _emit_table_tag(self, open_open_markup, tag, style, padding, + close_open_markup, contents, open_close_markup): + """Emit a table tag.""" + self._emit(tokens.TagOpenOpen(wiki_markup=open_open_markup)) + self._emit_text(tag) + if style: + self._emit_all(style) + if close_open_markup: + self._emit(tokens.TagCloseOpen(wiki_markup=close_open_markup, padding=padding)) + else: + self._emit(tokens.TagCloseOpen(padding=padding)) + if contents: + self._emit_all(contents) + self._emit(tokens.TagOpenClose(wiki_markup=open_close_markup)) + self._emit_text(tag) + self._emit(tokens.TagCloseClose()) + def _parse_as_table_style(self, end_token, break_on_table_end=False): """Parse until ``end_token`` as style attributes for a table.""" data = _TagOpenData() @@ -1052,17 +1069,7 @@ class Tokenizer(object): self._head = reset - 1 self._emit_text("{|") else: - self._emit(tokens.TagOpenOpen(wiki_markup="{|")) - self._emit_text("table") - if style: - self._emit_all(style) - self._emit(tokens.TagCloseOpen(padding=padding)) - if table: - self._emit_all(table) - self._emit(tokens.TagOpenClose(wiki_markup="|}")) - self._emit_text("table") - self._emit(tokens.TagCloseClose()) - # offset displacement done by _parse() + self._emit_table_tag("{|", "table", style, padding, None, table, "|}") self._head -= 1 def _handle_table_end(self): @@ -1072,23 +1079,31 @@ class Tokenizer(object): def _handle_table_row(self): """Parse as style until end of the line, then continue.""" + if not self._can_recurse(): + self._emit_text("|-") + self._head += 1 + return + reset = self._head self._head += 2 style, padding = None, "" - # If we can't recurse, still tokenize tag but parse style attrs as text - if self._can_recurse(): - try: - self._push(contexts.TABLE_OPEN) - padding = self._parse_as_table_style("\n") - style = self._pop() - except BadRoute: - self._head = reset - raise - self._emit(tokens.TagOpenOpen(wiki_markup="|-")) - self._emit_text("tr") - if style: - self._emit_all(style) - self._emit(tokens.TagCloseSelfclose(padding=padding)) + try: + self._push(contexts.TABLE_OPEN | contexts.TABLE_ROW_OPEN) + padding = self._parse_as_table_style("\n") + style = self._pop() + # don't parse the style separator + self._head += 1 + row = self._parse(contexts.TABLE_OPEN | contexts.TABLE_ROW_OPEN) + except BadRoute: + self._head = reset + raise + self._emit_table_tag("|-", "tr", style, padding, None, row, "") + # offset displacement done by parse() + self._head -= 1 + + def _handle_table_row_end(self): + """Return the stack in order to handle the table row end.""" + return self._pop() def _handle_table_cell(self, markup, tag, line_context): """Parse as normal syntax unless we hit a style marker, then parse style @@ -1101,7 +1116,7 @@ class Tokenizer(object): old_context = self._context reset = self._head self._head += len(markup) - reset_for_style, padding = False, "" + reset_for_style, padding, style = False, "", None try: cell = self._parse(contexts.TABLE_OPEN | contexts.TABLE_CELL_OPEN | line_context | contexts.TABLE_CELL_STYLE) cell_context = self._context @@ -1124,14 +1139,8 @@ class Tokenizer(object): except BadRoute: self._head = reset raise - self._emit(tokens.TagOpenOpen(wiki_markup=markup)) - self._emit_text(tag) - if reset_for_style: - self._emit_all(style) - self._emit(tokens.TagCloseSelfclose(wiki_markup="|", padding=padding)) - else: - self._emit(tokens.TagCloseSelfclose(padding=padding)) - self._emit_all(cell) + close_open_markup = "|" if reset_for_style else None + self._emit_table_tag(markup, tag, style, padding, close_open_markup, cell, "") # keep header/cell line contexts self._context |= cell_context & (contexts.TABLE_TH_LINE | contexts.TABLE_TD_LINE) # offset displacement done by parse() @@ -1140,6 +1149,8 @@ class Tokenizer(object): def _handle_table_cell_end(self, reset_for_style=False): """Returns the current context, with the TABLE_CELL_STYLE flag set if it is necessary to reset and parse style attributes.""" + if self._context & (contexts.FAIL & ~contexts.TABLE): + raise BadRoute if reset_for_style: self._context |= contexts.TABLE_CELL_STYLE else: @@ -1328,10 +1339,14 @@ class Tokenizer(object): if this == "|" and next == "}": if self._context & contexts.TABLE_CELL_OPEN: return self._handle_table_cell_end() + if self._context & contexts.TABLE_ROW_OPEN: + return self._handle_table_row_end() return self._handle_table_end() elif this == "|" and next == "-": if self._context & contexts.TABLE_CELL_OPEN: return self._handle_table_cell_end() + if self._context & contexts.TABLE_ROW_OPEN: + return self._handle_table_row_end() self._handle_table_row() elif this == "|": if self._context & contexts.TABLE_CELL_OPEN: diff --git a/tests/tokenizer/tables.mwtest b/tests/tokenizer/tables.mwtest index c684451..455da67 100644 --- a/tests/tokenizer/tables.mwtest +++ b/tests/tokenizer/tables.mwtest @@ -106,42 +106,42 @@ output: [Text(text="foo \n foo \t {|\n|}")] name: table_row_simple label: Simple table row. input: "{|\n |- \n|}" -output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding="\n"), Text(text=" "), TagOpenOpen(wiki_markup="|-"), Text(text="tr"), TagCloseSelfclose(padding=" \n"), TagOpenClose(wiki_markup="|}"), Text(text="table"), TagCloseClose()] +output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding="\n"), Text(text=" "), TagOpenOpen(wiki_markup="|-"), Text(text="tr"), TagCloseOpen(padding=" \n"), TagOpenClose(wiki_markup=""), Text(text="tr"), TagCloseClose(), TagOpenClose(wiki_markup="|}"), Tag Text(text="table"), TagCloseClose()] --- name: table_row_multiple label: Simple table row. input: "{|\n |- \n|- \n |-\n |}" -output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding="\n"), Text(text=" "), TagOpenOpen(wiki_markup="|-"), Text(text="tr"), TagCloseSelfclose(padding=" \n"), TagOpenOpen(wiki_markup="|-"), Text(text="tr"), TagCloseSelfclose(padding=" \n"), Text(text=" "), TagOpenOpen(wiki_markup="|-"), Text(text="tr"), TagCloseSelfclose(padding="\n"), Text(text=" "), TagOpenClose(wiki_markup="|}"), Text(text="table"), TagCloseClose()] +output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding="\n"), Text(text=" "), TagOpenOpen(wiki_markup="|-"), Text(text="tr"), TagCloseOpen(padding=" \n"), TagOpenClose(wiki_markup=""), Text(text="tr"), TagCloseClose(), TagOpenOpen(wiki_markup="|-"), Text(text="tr"), TagCloseOpen(padding=" \n"), Text(text=" "), TagOpenClose(wiki_markup=""), Text(text="tr"), TagCloseClose(), TagOpenOpen(wiki_markup="|-"), Text(text="tr"), TagCloseOpen(padding="\n"), Text(text=" "), TagOpenClose(wiki_markup=""), Text(text="tr"), TagCloseClose(), TagOpenClose(wiki_markup="|}"), Text(text="table"), TagCloseClose()] --- name: table_cell_simple label: Simple table cell. input: "{|\n | foo \n|}" -output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding="\n"), Text(text=" "), TagOpenOpen(wiki_markup="|"), Text(text="td"), TagCloseSelfclose(padding=""), Text(text=" foo \n"), TagOpenClose(wiki_markup="|}"), Text(text="table"), TagCloseClose()] +output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding="\n"), Text(text=" "), TagOpenOpen(wiki_markup="|"), Text(text="td"), TagCloseOpen(padding=""), Text(text=" foo \n"), TagOpenClose(wiki_markup=""), Text(text="td"), TagCloseClose(), TagOpenClose(wiki_markup="|}"), Text(text="table"), TagCloseClose()] --- name: table_cell_inline label: Multiple inline table cells. input: "{|\n | foo || bar || test \n|}" -output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding="\n"), Text(text=" "), TagOpenOpen(wiki_markup="|"), Text(text="td"), TagCloseSelfclose(padding=""), Text(text=" foo "), TagOpenOpen(wiki_markup="||"), Text(text="td"), TagCloseSelfclose(padding=""), Text(text=" bar "),TagOpenOpen(wiki_markup="||"), Text(text="td"), TagCloseSelfclose(padding=""), Text(text=" test \n"), TagOpenClose(wiki_markup="|}"), Text(text="table"), TagCloseClose()] +output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding="\n"), Text(text=" "), TagOpenOpen(wiki_markup="|"), Text(text="td"), TagCloseOpen(padding=""), Text(text=" foo "), TagOpenClose(wiki_markup=""), Text(text="td"), TagCloseClose(), TagOpenOpen(wiki_markup="||"), Text(text="td"), TagCloseOpen(padding=""), Text(text=" bar "), TagOpenClose(wiki_markup=""), Text(text="td"), TagCloseClose(), TagOpenOpen(wiki_markup="||"), Text(text="td"), TagCloseOpen(padding=""), Text(text=" test \n"), TagOpenClose(wiki_markup=""), Text(text="td"), TagCloseClose(), TagOpenClose(wiki_markup="|}"), Text(text="table"), TagCloseClose()] --- name: table_cell_fake_close label: Looks like a table close but is not. input: "{|\n | |} \n|}" -output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding="\n"), Text(text=" "), TagOpenOpen(wiki_markup="|"), Text(text="td"), TagCloseSelfclose(wiki_markup="|", padding=" "), Text(text="} \n"), TagOpenClose(wiki_markup="|}"), Text(text="table"), TagCloseClose()] +output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding="\n"), Text(text=" "), TagOpenOpen(wiki_markup="|"), Text(text="td"), TagCloseOpen(wiki_markup="|", padding=" "), Text(text="} \n"), TagOpenClose(wiki_markup=""), Text(text="td"), TagCloseClose(), TagOpenClose(wiki_markup="|}"), Text(text="table"), TagCloseClose()] --- name: table_cell_more_fake_close label: Looks like a table close but is not. input: "{|\n || |} \n|}" -output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding="\n"), Text(text=" "), TagOpenOpen(wiki_markup="|"), Text(text="td"), TagCloseSelfclose(wiki_markup="|", padding=""), Text(text=" |} \n"), TagOpenClose(wiki_markup="|}"), Text(text="table"), TagCloseClose()] +output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding="\n"), Text(text=" "), TagOpenOpen(wiki_markup="|"), Text(text="td"), TagCloseOpen(wiki_markup="|", padding=""), Text(text=" |} \n"), TagOpenClose(wiki_markup=""), Text(text="td"), TagCloseClose(), TagOpenClose(wiki_markup="|}"), Text(text="table"), TagCloseClose()] --- @@ -155,28 +155,28 @@ output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding name: table_header_simple label: Simple header cell. input: "{|\n ! foo \n|}" -output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding="\n"), Text(text=" "), TagOpenOpen(wiki_markup="!"), Text(text="th"), TagCloseSelfclose(padding=""), Text(text=" foo \n"), TagOpenClose(wiki_markup="|}"), Text(text="table"), TagCloseClose()] +output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding="\n"), Text(text=" "), TagOpenOpen(wiki_markup="!"), Text(text="th"), TagCloseOpen(padding=""), Text(text=" foo \n"), TagOpenClose(wiki_markup=""), Text(text="th"), TagCloseClose(), TagOpenClose(wiki_markup="|}"), Text(text="table"), TagCloseClose()] --- name: table_header_inline label: Multiple inline header cells. input: "{|\n ! foo || bar !! test \n|}" -output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding="\n"), Text(text=" "), TagOpenOpen(wiki_markup="!"), Text(text="th"), TagCloseSelfclose(padding=""), Text(text=" foo "), TagOpenOpen(wiki_markup="||"), Text(text="th"), TagCloseSelfclose(padding=""), Text(text=" bar "),TagOpenOpen(wiki_markup="!!"), Text(text="th"), TagCloseSelfclose(padding=""), Text(text=" test \n"), TagOpenClose(wiki_markup="|}"), Text(text="table"), TagCloseClose()] +output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding="\n"), Text(text=" "), TagOpenOpen(wiki_markup="!"), Text(text="th"), TagCloseOpen(padding=""), Text(text=" foo "), TagOpenClose(wiki_markup=""), Text(text="th"), TagCloseClose(), TagOpenOpen(wiki_markup="||"), Text(text="th"), TagCloseOpen(padding=""), Text(text=" bar "), TagOpenClose(wiki_markup=""), Text(text="th"), TagCloseClose(), TagOpenOpen(wiki_markup="!!"), Text(text="th"), TagCloseOpen(padding=""), Text(text=" test \n"), TagOpenClose(wiki_markup=""), Text(text="th"), TagCloseClose(), TagOpenClose(wiki_markup="|}"), Text(text="table"), TagCloseClose()] --- name: nowiki_inside_table label: Nowiki handles pipe characters in tables. input: "{|\n | foo | |- {| |} || ! !! bar \n|}" -output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding="\n"), Text(text=" "), TagOpenOpen(wiki_markup="|"), Text(text="td"), TagCloseSelfclose(padding=""), Text(text=" foo "), TagOpenOpen(), Text(text="nowiki"), TagCloseOpen(padding=""), Text(text="| |- {| |} || ! !!"), TagOpenClose(), Text(text="nowiki"), TagCloseClose(), Text(text=" bar \n"), TagOpenClose(wiki_markup="|}"), Text(text="table"), TagCloseClose()] +output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding="\n"), Text(text=" "), TagOpenOpen(wiki_markup="|"), Text(text="td"), TagCloseOpen(padding=""), Text(text=" foo "), TagOpenOpen(), Text(text="nowiki"), TagCloseOpen(padding=""), Text(text="| |- {| |} || ! !!"), TagOpenClose(), Text(text="nowiki"), TagCloseClose(), Text(text=" bar \n"), TagOpenClose(wiki_markup=""), Text(text="td"), TagCloseClose(), TagOpenClose(wiki_markup="|}"), Text(text="table"), TagCloseClose()] --- name: table_text_outside_cell label: Parse text inside table but outside of a cell. input: "{|\n bar \n | foo \n|}" -output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding="\n"), Text(text=" bar \n "), TagOpenOpen(wiki_markup="|"), Text(text="td"), TagCloseSelfclose(padding=""), Text(text=" foo \n"), TagOpenClose(wiki_markup="|}"), Text(text="table"), TagCloseClose()] +output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding="\n"), Text(text=" bar \n "), TagOpenOpen(wiki_markup="|"), Text(text="td"), TagCloseOpen(padding=""), Text(text=" foo \n"), TagOpenClose(wiki_markup=""), Text(text="td"), TagCloseClose(), TagOpenClose(wiki_markup="|}"), Text(text="table"), TagCloseClose()] --- @@ -197,84 +197,84 @@ output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding name: template_inside_table_cell label: Template within table cell. input: "{|\n |{{foo\n|bar=baz}} \n|}" -output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding="\n"), Text(text=" "), TagOpenOpen(wiki_markup="|"), Text(text="td"), TagCloseSelfclose(padding=""), TemplateOpen(), Text(text="foo\n"), TemplateParamSeparator(), Text(text="bar"), TemplateParamEquals(), Text(text="baz"), TemplateClose(), Text(text=" \n"), TagOpenClose(wiki_markup="|}"), Text(text="table"), TagCloseClose()] +output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding="\n"), Text(text=" "), TagOpenOpen(wiki_markup="|"), Text(text="td"), TagCloseOpen(padding=""), TemplateOpen(), Text(text="foo\n"), TemplateParamSeparator(), Text(text="bar"), TemplateParamEquals(), Text(text="baz"), TemplateClose(), Text(text=" \n"), TagOpenClose(wiki_markup=""), Text(text="td"), TagCloseClose(), TagOpenClose(wiki_markup="|}"), Text(text="table"), TagCloseClose()] --- name: table_cell_attributes label: Parse table cell style attributes. input: "{| \n | name="foo bar"| test \n|}" -output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding=" \n"), Text(text=" "), TagOpenOpen(wiki_markup="|"), Text(text="td"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="name"), TagAttrEquals(), TagAttrQuote(char="\""), Text(text="foo bar"), TagCloseSelfclose(wiki_markup="|", padding=""), Text(text=" test \n"), TagOpenClose(wiki_markup="|}"), Text(text="table"), TagCloseClose()] +output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding=" \n"), Text(text=" "), TagOpenOpen(wiki_markup="|"), Text(text="td"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="name"), TagAttrEquals(), TagAttrQuote(char="\""), Text(text="foo bar"), TagCloseOpen(wiki_markup="|", padding=""), Text(text=" test \n"), TagOpenClose(wiki_markup=""), Text(text="td"), TagCloseClose(), TagOpenClose(wiki_markup="|}"), Text(text="table"), TagCloseClose()] --- name: table_cell_empty_attributes label: Parse table cell with style markers but no attributes. input: "{| \n | | test \n|}" -output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding=" \n"), Text(text=" "), TagOpenOpen(wiki_markup="|"), Text(text="td"), TagCloseSelfclose(wiki_markup="|", padding=" "), Text(text=" test \n"), TagOpenClose(wiki_markup="|}"), Text(text="table"), TagCloseClose()] +output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding=" \n"), Text(text=" "), TagOpenOpen(wiki_markup="|"), Text(text="td"), TagCloseOpen(wiki_markup="|", padding=" "), Text(text=" test \n"), TagOpenClose(wiki_markup=""), Text(text="td"), TagCloseClose(), TagOpenClose(wiki_markup="|}"), Text(text="table"), TagCloseClose()] --- name: table_cell_with_dash label: Parse a situation in which a cell line looks like a row line. input: "{|\n ||- \n|}" -output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding="\n"), Text(text=" "), TagOpenOpen(wiki_markup="|"), Text(text="td"), TagCloseSelfclose(wiki_markup="|", padding=""), Text(text="- \n"), TagOpenClose(wiki_markup="|}"), Text(text="table"), TagCloseClose()] +output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding="\n"), Text(text=" "), TagOpenOpen(wiki_markup="|"), Text(text="td"), TagCloseOpen(wiki_markup="|", padding=""), Text(text="- \n"), TagOpenClose(wiki_markup=""), Text(text="td"), TagCloseClose(), TagOpenClose(wiki_markup="|}"), Text(text="table"), TagCloseClose()] --- name: table_cell_attributes_quote_with_pipe label: Pipe inside an attribute quote should still be used as a style separator. input: "{| \n | name="foo|bar"| test \n|}" -output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding=" \n"), Text(text=" "), TagOpenOpen(wiki_markup="|"), Text(text="td"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="name"), TagAttrEquals(), Text(text="\"foo"), TagCloseSelfclose(wiki_markup="|", padding=""), Text(text="bar\"| test \n"), TagOpenClose(wiki_markup="|}"), Text(text="table"), TagCloseClose()] +output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding=" \n"), Text(text=" "), TagOpenOpen(wiki_markup="|"), Text(text="td"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="name"), TagAttrEquals(), Text(text="\"foo"), TagCloseOpen(wiki_markup="|", padding=""), Text(text="bar\"| test \n"), TagOpenClose(wiki_markup=""), Text(text="td"), TagCloseClose(), TagOpenClose(wiki_markup="|}"), Text(text="table"), TagCloseClose()] --- name: table_cell_attributes_name_with_pipe label: Pipe inside an attribute name should still be used as a style separator. input: "{| \n | name|="foo bar" | test \n|}" -output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding=" \n"), Text(text=" "), TagOpenOpen(wiki_markup="|"), Text(text="td"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="name"), TagCloseSelfclose(wiki_markup="|", padding=""), Text(text="=\"foo bar\" | test \n"), TagOpenClose(wiki_markup="|}"), Text(text="table"), TagCloseClose()] +output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding=" \n"), Text(text=" "), TagOpenOpen(wiki_markup="|"), Text(text="td"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="name"), TagCloseOpen(wiki_markup="|", padding=""), Text(text="=\"foo bar\" | test \n"), TagOpenClose(wiki_markup=""), Text(text="td"), TagCloseClose(), TagOpenClose(wiki_markup="|}"), Text(text="table"), TagCloseClose()] --- name: table_cell_attributes_pipe_after_equals label: Pipe inside an attribute should still be used as a style separator after an equals. input: "{| \n | name=|"foo|bar"| test \n|}" -output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding=" \n"), Text(text=" "), TagOpenOpen(wiki_markup="|"), Text(text="td"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="name"), TagAttrEquals(), TagCloseSelfclose(wiki_markup="|", padding=""), Text(text="\"foo|bar\"| test \n"), TagOpenClose(wiki_markup="|}"), Text(text="table"), TagCloseClose()] +output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding=" \n"), Text(text=" "), TagOpenOpen(wiki_markup="|"), Text(text="td"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="name"), TagAttrEquals(), TagCloseOpen(wiki_markup="|", padding=""), Text(text="\"foo|bar\"| test \n"), TagOpenClose(wiki_markup=""), Text(text="td"), TagCloseClose(), TagOpenClose(wiki_markup="|}"), Text(text="table"), TagCloseClose()] --- name: table_cell_attributes_templates label: Pipe inside attributes shouldn't be style separator. input: "{| \n | {{comment|template=baz}} | test \n|}" -output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding=" \n"), Text(text=" "), TagOpenOpen(wiki_markup="|"), Text(text="td"), TagAttrStart(pad_after_eq="", pad_first=" ", pad_before_eq=" "), TemplateOpen(), Text(text="comment"), TemplateParamSeparator(), Text(text="template"), TemplateParamEquals(), Text(text="baz"), TemplateClose(), TagCloseSelfclose(wiki_markup="|", padding=""), Text(text=" test \n"), TagOpenClose(wiki_markup="|}"), Text(text="table"), TagCloseClose()] +output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding=" \n"), Text(text=" "), TagOpenOpen(wiki_markup="|"), Text(text="td"), TagAttrStart(pad_after_eq="", pad_first=" ", pad_before_eq=" "), TemplateOpen(), Text(text="comment"), TemplateParamSeparator(), Text(text="template"), TemplateParamEquals(), Text(text="baz"), TemplateClose(), TagCloseOpen(wiki_markup="|", padding=""), Text(text=" test \n"), TagOpenClose(wiki_markup=""), Text(text="td"), TagCloseClose(), TagOpenClose(wiki_markup="|}"), Text(text="table"), TagCloseClose()] --- name: header_cell_attributes label: Parse header cell style attributes. input: "{| \n ! name="foo bar"| test \n|}" -output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding=" \n"), Text(text=" "), TagOpenOpen(wiki_markup="!"), Text(text="th"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="name"), TagAttrEquals(), TagAttrQuote(char="\""), Text(text="foo bar"), TagCloseSelfclose(wiki_markup="|", padding=""), Text(text=" test \n"), TagOpenClose(wiki_markup="|}"), Text(text="table"), TagCloseClose()] +output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding=" \n"), Text(text=" "), TagOpenOpen(wiki_markup="!"), Text(text="th"), TagAttrStart(pad_first=" ", pad_before_eq="", pad_after_eq=""), Text(text="name"), TagAttrEquals(), TagAttrQuote(char="\""), Text(text="foo bar"), TagCloseOpen(wiki_markup="|", padding=""), Text(text=" test \n"), TagOpenClose(wiki_markup=""), Text(text="th"), TagCloseClose(), TagOpenClose(wiki_markup="|}"), Text(text="table"), TagCloseClose()] --- name: inline_cell_attributes label: Parse cell style attributes of inline cells. input: "{| \n ! name="foo bar" | test ||color="red"| markup!!foo | time \n|}" -output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding=" \n"), Text(text=" "), TagOpenOpen(wiki_markup="!"), Text(text="th"), TagAttrStart(pad_after_eq="", pad_first=" ", pad_before_eq=""), Text(text="name"), TagAttrEquals(), TagAttrQuote(char="\""), Text(text="foo bar"), TagCloseSelfclose(wiki_markup="|", padding=" "), Text(text=" test "), TagOpenOpen(wiki_markup="||"), Text(text="th"), TagAttrStart(pad_first="", pad_before_eq="", pad_after_eq=""), Text(text="color"), TagAttrEquals(), TagAttrQuote(char="\""), Text(text="red"), TagCloseSelfclose(wiki_markup="|", padding=""), Text(text=" markup"), TagOpenOpen(wiki_markup="!!"), Text(text="th"), TagAttrStart(pad_first="", pad_before_eq=" ", pad_after_eq=""), Text(text="foo"), TagCloseSelfclose(wiki_markup="|", padding=""), Text(text=" time \n"), TagOpenClose(wiki_markup="|}"), Text(text="table"), TagCloseClose()] +output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding=" \n"), Text(text=" "), TagOpenOpen(wiki_markup="!"), Text(text="th"), TagAttrStart(pad_after_eq="", pad_first=" ", pad_before_eq=""), Text(text="name"), TagAttrEquals(), TagAttrQuote(char="\""), Text(text="foo bar"), TagCloseOpen(wiki_markup="|", padding=" "), Text(text=" test "), TagOpenClose(wiki_markup=""), Text(text="th"), TagCloseClose(), TagOpenOpen(wiki_markup="||"), Text(text="th"), TagAttrStart(pad_first="", pad_before_eq="", pad_after_eq=""), Text(text="color"), TagAttrEquals(), TagAttrQuote(char="\""), Text(text="red"), TagCloseOpen(wiki_markup="|", padding=""), Text(text=" markup"), TagOpenClose(wiki_markup=""), Text(text="th"), TagCloseClose(), TagOpenOpen(wiki_markup="!!"), Text(text="th"), TagAttrStart(pad_first="", pad_before_eq=" ", pad_after_eq=""), Text(text="foo"), TagCloseOpen(wiki_markup="|", padding=""), Text(text=" time \n"), TagOpenClose(wiki_markup=""), Text(text="th"), TagCloseClose(), TagOpenClose(wiki_markup="|}"), 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(padding=" \n"), Text(text=" "), 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(padding="\n"), TagOpenClose(wiki_markup="|}"), Text(text="table"), TagCloseClose()] +output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding=" \n"), Text(text=" "), 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"), TagCloseOpen(padding="\n"), TagOpenClose(wiki_markup=""), Text(text="tr"), TagCloseClose(), TagOpenClose(wiki_markup="|}"), 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" \t \n|}" -output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding=" \t \n"), Text(text=" "), 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(padding=" \t \n"), TagOpenClose(wiki_markup="|}"), Text(text="table"), TagCloseClose()] +output: [TagOpenOpen(wiki_markup="{|"), Text(text="table"), TagCloseOpen(padding=" \t \n"), Text(text=" "), 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"), TagCloseOpen(padding=" \t \n"), TagOpenClose(wiki_markup=""), Text(text="tr"), TagCloseClose(), TagOpenClose(wiki_markup="|}"), Text(text="table"), TagCloseClose()] ---