|
|
@@ -80,7 +80,7 @@ static PyObject* strip_tag_name(PyObject* token) |
|
|
|
Py_DECREF(text); |
|
|
|
if (!rstripped) |
|
|
|
return NULL; |
|
|
|
lowered = PyObject_CallMethod(rstripped, "rstrip", NULL); |
|
|
|
lowered = PyObject_CallMethod(rstripped, "lower", NULL); |
|
|
|
Py_DECREF(rstripped); |
|
|
|
return lowered; |
|
|
|
} |
|
|
@@ -998,24 +998,14 @@ Tokenizer_handle_free_link_text(Tokenizer* self, int* parens, |
|
|
|
return error; \ |
|
|
|
} |
|
|
|
|
|
|
|
// punct = tuple(",;\.:!?)") |
|
|
|
// if "(" in this and ")" in punct: |
|
|
|
// punct = punct[:-1] # ')' is not longer valid punctuation |
|
|
|
// if this.endswith(punct): |
|
|
|
// for i in reversed(range(-len(this), 0)): |
|
|
|
// if i == -len(this) or this[i - 1] not in punct: |
|
|
|
// break |
|
|
|
// stripped = this[:i] |
|
|
|
// if stripped and tail: |
|
|
|
// self._emit_text(tail) |
|
|
|
// tail = "" |
|
|
|
// tail += this[i:] |
|
|
|
// this = stripped |
|
|
|
// elif tail: |
|
|
|
// self._emit_text(tail) |
|
|
|
// tail = "" |
|
|
|
// self._emit_text(this) |
|
|
|
// return punct, tail |
|
|
|
if (this == *"(" && !(*parens)) |
|
|
|
*parens = 1; |
|
|
|
else if (this == *"," || this == *";" || this == *"\\" || this == *"." || |
|
|
|
this == *":" || this == *"!" || this == *"?" || |
|
|
|
(!(*parens) && this == *")")) |
|
|
|
return Textbuffer_write(tail, this); |
|
|
|
else |
|
|
|
PUSH_TAIL_BUFFER(*tail, -1) |
|
|
|
return Tokenizer_emit_char(self, this); |
|
|
|
} |
|
|
|
|
|
|
@@ -1102,14 +1092,31 @@ Tokenizer_really_parse_external_link(Tokenizer* self, int brackets, |
|
|
|
static int |
|
|
|
Tokenizer_remove_uri_scheme_from_textbuffer(Tokenizer* self, PyObject* link) |
|
|
|
{ |
|
|
|
// scheme = link[0].text.split(":", 1)[0] |
|
|
|
// length = len(scheme) |
|
|
|
// while length: |
|
|
|
// if length < len(self._textbuffer[-1]): |
|
|
|
// self._textbuffer[-1] = self._textbuffer[-1][:-length] |
|
|
|
// break |
|
|
|
// length -= len(self._textbuffer[-1]) |
|
|
|
// self._textbuffer.pop() |
|
|
|
PyObject *text = PyObject_GetAttrString(PyList_GET_ITEM(link, 0), "text"), |
|
|
|
*split, *scheme; |
|
|
|
Py_ssize_t length; |
|
|
|
Textbuffer* temp; |
|
|
|
|
|
|
|
if (!text) |
|
|
|
return -1; |
|
|
|
split = PyObject_CallMethod(text, "split", "si", ":", 1); |
|
|
|
Py_DECREF(text); |
|
|
|
if (!split) |
|
|
|
return -1; |
|
|
|
scheme = PyList_GET_ITEM(split, 0); |
|
|
|
length = PyUnicode_GET_SIZE(scheme); |
|
|
|
while (length) { |
|
|
|
temp = self->topstack->textbuffer; |
|
|
|
if (length <= temp->size) { |
|
|
|
temp->size -= length; |
|
|
|
break; |
|
|
|
} |
|
|
|
length -= temp->size; |
|
|
|
self->topstack->textbuffer = temp->next; |
|
|
|
free(temp->data); |
|
|
|
free(temp); |
|
|
|
} |
|
|
|
Py_DECREF(split); |
|
|
|
return 0; |
|
|
|
} |
|
|
|
|
|
|
|