| @@ -1829,13 +1829,64 @@ static int Tokenizer_parse_tag(Tokenizer* self) | |||||
| static int Tokenizer_emit_style_tag(Tokenizer* self, char tag, int ticks, | static int Tokenizer_emit_style_tag(Tokenizer* self, char tag, int ticks, | ||||
| PyObject* body) | PyObject* body) | ||||
| { | { | ||||
| // self._emit(tokens.TagOpenOpen(wiki_markup=markup)) | |||||
| // self._emit_text(tag) | |||||
| // self._emit(tokens.TagCloseOpen()) | |||||
| // self._emit_all(body) | |||||
| // self._emit(tokens.TagOpenClose()) | |||||
| // self._emit_text(tag) | |||||
| // self._emit(tokens.TagCloseClose()) | |||||
| PyObject *markup, *kwargs, *token; | |||||
| char chr_markup[4]; | |||||
| int i; | |||||
| for (i = 0; i < ticks; i++) chr_markup[i] = *"'"; | |||||
| chr_markup[ticks] = *""; | |||||
| markup = PyBytes_FromString(chr_markup); | |||||
| if (!markup) | |||||
| return -1; | |||||
| kwargs = PyDict_New(); | |||||
| if (!kwargs) { | |||||
| Py_DECREF(markup); | |||||
| return -1; | |||||
| } | |||||
| PyDict_SetItemString(kwargs, "wiki_markup", markup); | |||||
| Py_DECREF(markup); | |||||
| token = PyObject_Call(TagOpenOpen, NOARGS, kwargs); | |||||
| if (!token) { | |||||
| Py_DECREF(kwargs); | |||||
| return -1; | |||||
| } | |||||
| Py_DECREF(kwargs); | |||||
| if (Tokenizer_emit(self, token)) { | |||||
| Py_DECREF(token); | |||||
| return -1; | |||||
| } | |||||
| Py_DECREF(token); | |||||
| if (Tokenizer_emit_text(self, tag)) | |||||
| return -1; | |||||
| token = PyObject_CallObject(TagCloseOpen, NULL); | |||||
| if (!token) | |||||
| return -1; | |||||
| if (Tokenizer_emit(self, token)) { | |||||
| Py_DECREF(token); | |||||
| return -1; | |||||
| } | |||||
| Py_DECREF(token); | |||||
| if (Tokenizer_emit_all(self, body)) | |||||
| return -1; | |||||
| token = PyObject_CallObject(TagOpenClose, NULL); | |||||
| if (!token) | |||||
| return -1; | |||||
| if (Tokenizer_emit(self, token)) { | |||||
| Py_DECREF(token); | |||||
| return -1; | |||||
| } | |||||
| Py_DECREF(token); | |||||
| if (Tokenizer_emit_text(self, tag)) | |||||
| return -1; | |||||
| token = PyObject_CallObject(TagCloseClose, NULL); | |||||
| if (!token) | |||||
| return -1; | |||||
| if (Tokenizer_emit(self, token)) { | |||||
| Py_DECREF(token); | |||||
| return -1; | |||||
| } | |||||
| Py_DECREF(token); | |||||
| return 0; | |||||
| } | } | ||||
| /* | /* | ||||
| @@ -1843,16 +1894,27 @@ static int Tokenizer_emit_style_tag(Tokenizer* self, char tag, int ticks, | |||||
| */ | */ | ||||
| static int Tokenizer_parse_italics(Tokenizer* self) | static int Tokenizer_parse_italics(Tokenizer* self) | ||||
| { | { | ||||
| // reset = self._head | |||||
| // try: | |||||
| // stack = self._parse(contexts.STYLE_ITALICS) | |||||
| // except BadRoute as route: | |||||
| // self._head = reset | |||||
| // if route.context & contexts.STYLE_PASS_AGAIN: | |||||
| // stack = self._parse(route.context | contexts.STYLE_SECOND_PASS) | |||||
| // else: | |||||
| // return self._emit_text("''") | |||||
| // self._emit_style_tag("i", "''", stack) | |||||
| Py_ssize_t reset = self->head; | |||||
| int context; | |||||
| PyObject *stack; | |||||
| stack = Tokenizer_parse(self, LC_STYLE_ITALICS, 1); | |||||
| if (BAD_ROUTE) { | |||||
| RESET_ROUTE(); | |||||
| self->head = reset; | |||||
| if (BAD_ROUTE_CONTEXT & LC_STYLE_PASS_AGAIN) { | |||||
| context = LC_STYLE_ITALICS | LC_STYLE_SECOND_PASS; | |||||
| stack = Tokenizer_parse(self, context, 1); | |||||
| } | |||||
| else { | |||||
| if (Tokenizer_emit_text(self, *"'")) | |||||
| return -1; | |||||
| return Tokenizer_emit_text(self, *"'"); | |||||
| } | |||||
| } | |||||
| if (!stack) | |||||
| return -1; | |||||
| return Tokenizer_emit_style_tag(self, *"i", 2, stack); | |||||
| } | } | ||||
| /* | /* | ||||
| @@ -1860,22 +1922,30 @@ static int Tokenizer_parse_italics(Tokenizer* self) | |||||
| */ | */ | ||||
| static int Tokenizer_parse_bold(Tokenizer* self) | static int Tokenizer_parse_bold(Tokenizer* self) | ||||
| { | { | ||||
| // reset = self._head | |||||
| // try: | |||||
| // stack = self._parse(contexts.STYLE_BOLD) | |||||
| // except BadRoute: | |||||
| // self._head = reset | |||||
| // if self._context & contexts.STYLE_SECOND_PASS: | |||||
| // self._emit_text("'") | |||||
| // return True ## we can return 1 for this and -1 for errors (switch case) | |||||
| // elif self._context & contexts.STYLE_ITALICS: | |||||
| // self._context |= contexts.STYLE_PASS_AGAIN | |||||
| // self._emit_text("'''") | |||||
| // else: | |||||
| // self._emit_text("'") | |||||
| // self._parse_italics() | |||||
| // else: | |||||
| // self._emit_style_tag("b", "'''", stack) | |||||
| Py_ssize_t reset = self->head; | |||||
| PyObject *stack; | |||||
| stack = Tokenizer_parse(self, LC_STYLE_BOLD, 1); | |||||
| if (BAD_ROUTE) { | |||||
| RESET_ROUTE(); | |||||
| self->head = reset; | |||||
| if (self->topstack->context & LC_STYLE_SECOND_PASS) | |||||
| return Tokenizer_emit_text(self, *"'") ? -1 : 1; | |||||
| if (self->topstack->context & LC_STYLE_ITALICS) { | |||||
| self->topstack->context |= LC_STYLE_PASS_AGAIN; | |||||
| if (Tokenizer_emit_text(self, *"'")) | |||||
| return -1; | |||||
| if (Tokenizer_emit_text(self, *"'")) | |||||
| return -1; | |||||
| return Tokenizer_emit_text(self, *"'"); | |||||
| } | |||||
| if (Tokenizer_emit_text(self, *"'")) | |||||
| return -1; | |||||
| return Tokenizer_parse_italics(self); | |||||
| } | |||||
| if (!stack) | |||||
| return -1; | |||||
| return Tokenizer_emit_style_tag(self, *"b", 3, stack); | |||||
| } | } | ||||
| /* | /* | ||||