|
@@ -264,11 +264,12 @@ Tokenizer_write_all(Tokenizer* self, PyObject* tokenlist) |
|
|
PyObject* class = PyObject_GetAttrString(tokens, "Text"); |
|
|
PyObject* class = PyObject_GetAttrString(tokens, "Text"); |
|
|
if (!class) return -1; |
|
|
if (!class) return -1; |
|
|
|
|
|
|
|
|
|
|
|
PyObject* text; |
|
|
switch (PyObject_IsInstance(token, class)) { |
|
|
switch (PyObject_IsInstance(token, class)) { |
|
|
case 0: |
|
|
case 0: |
|
|
break; |
|
|
break; |
|
|
case 1: |
|
|
case 1: |
|
|
PyObject* text = PyObject_GetAttrString(token, "text"); |
|
|
|
|
|
|
|
|
text = PyObject_GetAttrString(token, "text"); |
|
|
if (!text) { |
|
|
if (!text) { |
|
|
Py_DECREF(class); |
|
|
Py_DECREF(class); |
|
|
return -1; |
|
|
return -1; |
|
@@ -284,7 +285,7 @@ Tokenizer_write_all(Tokenizer* self, PyObject* tokenlist) |
|
|
return -1; |
|
|
return -1; |
|
|
} |
|
|
} |
|
|
Py_DECREF(text); |
|
|
Py_DECREF(text); |
|
|
break |
|
|
|
|
|
|
|
|
break; |
|
|
case -1: |
|
|
case -1: |
|
|
Py_DECREF(class); |
|
|
Py_DECREF(class); |
|
|
return -1; |
|
|
return -1; |
|
@@ -463,13 +464,20 @@ Tokenizer_parse_template(Tokenizer* self) |
|
|
if (!template) return -1; |
|
|
if (!template) return -1; |
|
|
|
|
|
|
|
|
class = PyObject_GetAttrString(tokens, "TemplateOpen"); |
|
|
class = PyObject_GetAttrString(tokens, "TemplateOpen"); |
|
|
if (!class) return -1; |
|
|
|
|
|
|
|
|
if (!class) { |
|
|
|
|
|
Py_DECREF(template); |
|
|
|
|
|
return -1; |
|
|
|
|
|
} |
|
|
token = PyInstance_New(class, NOARGS, NOKWARGS); |
|
|
token = PyInstance_New(class, NOARGS, NOKWARGS); |
|
|
Py_DECREF(class); |
|
|
Py_DECREF(class); |
|
|
if (!token) return -1; |
|
|
|
|
|
|
|
|
if (!token) { |
|
|
|
|
|
Py_DECREF(template); |
|
|
|
|
|
return -1; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if (Tokenizer_write_first(self, token)) { |
|
|
if (Tokenizer_write_first(self, token)) { |
|
|
Py_DECREF(token); |
|
|
Py_DECREF(token); |
|
|
|
|
|
Py_DECREF(template); |
|
|
return -1; |
|
|
return -1; |
|
|
} |
|
|
} |
|
|
Py_DECREF(token); |
|
|
Py_DECREF(token); |
|
@@ -515,13 +523,20 @@ Tokenizer_parse_argument(Tokenizer* self) |
|
|
if (!argument) return -1; |
|
|
if (!argument) return -1; |
|
|
|
|
|
|
|
|
class = PyObject_GetAttrString(tokens, "ArgumentOpen"); |
|
|
class = PyObject_GetAttrString(tokens, "ArgumentOpen"); |
|
|
if (!class) return -1; |
|
|
|
|
|
|
|
|
if (!class) { |
|
|
|
|
|
Py_DECREF(argument); |
|
|
|
|
|
return -1; |
|
|
|
|
|
} |
|
|
token = PyInstance_New(class, NOARGS, NOKWARGS); |
|
|
token = PyInstance_New(class, NOARGS, NOKWARGS); |
|
|
Py_DECREF(class); |
|
|
Py_DECREF(class); |
|
|
if (!token) return -1; |
|
|
|
|
|
|
|
|
if (!token) { |
|
|
|
|
|
Py_DECREF(argument); |
|
|
|
|
|
return -1; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if (Tokenizer_write_first(self, token)) { |
|
|
if (Tokenizer_write_first(self, token)) { |
|
|
Py_DECREF(token); |
|
|
Py_DECREF(token); |
|
|
|
|
|
Py_DECREF(argument); |
|
|
return -1; |
|
|
return -1; |
|
|
} |
|
|
} |
|
|
Py_DECREF(token); |
|
|
Py_DECREF(token); |
|
@@ -830,7 +845,63 @@ Tokenizer_handle_argument_end(Tokenizer* self) |
|
|
static int |
|
|
static int |
|
|
Tokenizer_parse_wikilink(Tokenizer* self) |
|
|
Tokenizer_parse_wikilink(Tokenizer* self) |
|
|
{ |
|
|
{ |
|
|
|
|
|
self->head += 2; |
|
|
|
|
|
Py_ssize_t reset = self->head - 1; |
|
|
|
|
|
|
|
|
|
|
|
if (setjmp(exception_env) == BAD_ROUTE) { |
|
|
|
|
|
self->head = reset; |
|
|
|
|
|
PyObject* text = PyUnicode_FromString("[["); |
|
|
|
|
|
if (!text) return -1; |
|
|
|
|
|
if (Tokenizer_write_text(self, text)) { |
|
|
|
|
|
Py_XDECREF(text); |
|
|
|
|
|
return -1; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
else { |
|
|
|
|
|
PyObject *class, *token; |
|
|
|
|
|
PyObject *wikilink = Tokenizer_parse(self, LC_WIKILINK_TITLE); |
|
|
|
|
|
if (!wikilink) return -1; |
|
|
|
|
|
|
|
|
|
|
|
class = PyObject_GetAttrString(tokens, "WikilinkOpen"); |
|
|
|
|
|
if (!class) { |
|
|
|
|
|
Py_DECREF(wikilink); |
|
|
|
|
|
return -1; |
|
|
|
|
|
} |
|
|
|
|
|
token = PyInstance_New(class, NOARGS, NOKWARGS); |
|
|
|
|
|
Py_DECREF(class); |
|
|
|
|
|
if (!token) { |
|
|
|
|
|
Py_DECREF(wikilink); |
|
|
|
|
|
return -1; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (Tokenizer_write(self, token)) { |
|
|
|
|
|
Py_DECREF(token); |
|
|
|
|
|
Py_DECREF(wikilink); |
|
|
|
|
|
return -1; |
|
|
|
|
|
} |
|
|
|
|
|
Py_DECREF(token); |
|
|
|
|
|
|
|
|
|
|
|
if (Tokenizer_write_all(self, wikilink)) { |
|
|
|
|
|
Py_DECREF(wikilink); |
|
|
|
|
|
return -1; |
|
|
|
|
|
} |
|
|
|
|
|
Py_DECREF(wikilink); |
|
|
|
|
|
|
|
|
|
|
|
class = PyObject_GetAttrString(tokens, "WikilinkClose"); |
|
|
|
|
|
if (!class) return -1; |
|
|
|
|
|
token = PyInstance_New(class, NOARGS, NOKWARGS); |
|
|
|
|
|
Py_DECREF(class); |
|
|
|
|
|
if (!token) return -1; |
|
|
|
|
|
|
|
|
|
|
|
if (Tokenizer_write(self, token)) { |
|
|
|
|
|
Py_DECREF(token); |
|
|
|
|
|
return -1; |
|
|
|
|
|
} |
|
|
|
|
|
Py_DECREF(token); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return 0; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/* |
|
|
/* |
|
|