| @@ -53,7 +53,7 @@ Local (stack-specific) contexts: | |||||
| * :py:const:`EXT_LINK` | * :py:const:`EXT_LINK` | ||||
| * :py:const:`EXT_LINK_URL` | |||||
| * :py:const:`EXT_LINK_URI` | |||||
| * :py:const:`EXT_LINK_TITLE` | * :py:const:`EXT_LINK_TITLE` | ||||
| * :py:const:`EXT_LINK_BRACKETS` | * :py:const:`EXT_LINK_BRACKETS` | ||||
| @@ -119,10 +119,10 @@ WIKILINK_TITLE = 1 << 5 | |||||
| WIKILINK_TEXT = 1 << 6 | WIKILINK_TEXT = 1 << 6 | ||||
| WIKILINK = WIKILINK_TITLE + WIKILINK_TEXT | WIKILINK = WIKILINK_TITLE + WIKILINK_TEXT | ||||
| EXT_LINK_URL = 1 << 7 | |||||
| EXT_LINK_URI = 1 << 7 | |||||
| EXT_LINK_TITLE = 1 << 8 | EXT_LINK_TITLE = 1 << 8 | ||||
| EXT_LINK_BRACKETS = 1 << 9 | EXT_LINK_BRACKETS = 1 << 9 | ||||
| EXT_LINK = EXT_LINK_URL + EXT_LINK_TITLE + EXT_LINK_BRACKETS | |||||
| EXT_LINK = EXT_LINK_URI + EXT_LINK_TITLE + EXT_LINK_BRACKETS | |||||
| HEADING_LEVEL_1 = 1 << 10 | HEADING_LEVEL_1 = 1 << 10 | ||||
| HEADING_LEVEL_2 = 1 << 11 | HEADING_LEVEL_2 = 1 << 11 | ||||
| @@ -163,7 +163,7 @@ GL_HEADING = 1 << 0 | |||||
| # Aggregate contexts: | # Aggregate contexts: | ||||
| FAIL = TEMPLATE + ARGUMENT + WIKILINK + EXT_LINK + HEADING + TAG + STYLE | FAIL = TEMPLATE + ARGUMENT + WIKILINK + EXT_LINK + HEADING + TAG + STYLE | ||||
| UNSAFE = (TEMPLATE_NAME + WIKILINK_TITLE + TEMPLATE_PARAM_KEY + ARGUMENT_NAME + | |||||
| TAG_CLOSE) | |||||
| UNSAFE = (TEMPLATE_NAME + WIKILINK + EXT_LINK_TITLE + TEMPLATE_PARAM_KEY + | |||||
| ARGUMENT_NAME + TAG_CLOSE) | |||||
| DOUBLE = TEMPLATE_PARAM_KEY + TAG_CLOSE | DOUBLE = TEMPLATE_PARAM_KEY + TAG_CLOSE | ||||
| INVALID_LINK = TEMPLATE_NAME + ARGUMENT_NAME + WIKILINK_TITLE + EXT_LINK_URL | |||||
| INVALID_LINK = TEMPLATE_NAME + ARGUMENT_NAME + WIKILINK + EXT_LINK | |||||
| @@ -2050,18 +2050,17 @@ static int Tokenizer_verify_safe(Tokenizer* self, int context, Py_UNICODE data) | |||||
| if (context & LC_FAIL_NEXT) { | if (context & LC_FAIL_NEXT) { | ||||
| return -1; | return -1; | ||||
| } | } | ||||
| if (context & LC_WIKILINK_TITLE) { | |||||
| if (data == *"]" || data == *"{") | |||||
| if (context & LC_WIKILINK) { | |||||
| if (context & LC_WIKILINK_TEXT) | |||||
| return (data == *"[" && Tokenizer_READ(self, 1) == *"[") ? -1 : 0; | |||||
| else if (data == *"]" || data == *"{") | |||||
| self->topstack->context |= LC_FAIL_NEXT; | self->topstack->context |= LC_FAIL_NEXT; | ||||
| else if (data == *"\n" || data == *"[" || data == *"}") | else if (data == *"\n" || data == *"[" || data == *"}") | ||||
| return -1; | return -1; | ||||
| return 0; | return 0; | ||||
| } | } | ||||
| if (context & LC_TAG_CLOSE) { | |||||
| if (data == *"<") | |||||
| return -1; | |||||
| return 0; | |||||
| } | |||||
| if (context & LC_TAG_CLOSE) | |||||
| return (data == *"<") ? -1 : 0; | |||||
| if (context & LC_TEMPLATE_NAME) { | if (context & LC_TEMPLATE_NAME) { | ||||
| if (data == *"{" || data == *"}" || data == *"[") { | if (data == *"{" || data == *"}" || data == *"[") { | ||||
| self->topstack->context |= LC_FAIL_NEXT; | self->topstack->context |= LC_FAIL_NEXT; | ||||
| @@ -163,9 +163,9 @@ static PyObject* TagCloseClose; | |||||
| /* Aggregate contexts: */ | /* Aggregate contexts: */ | ||||
| #define AGG_FAIL (LC_TEMPLATE | LC_ARGUMENT | LC_WIKILINK | LC_HEADING | LC_TAG | LC_STYLE) | #define AGG_FAIL (LC_TEMPLATE | LC_ARGUMENT | LC_WIKILINK | LC_HEADING | LC_TAG | LC_STYLE) | ||||
| #define AGG_UNSAFE (LC_TEMPLATE_NAME | LC_WIKILINK_TITLE | LC_TEMPLATE_PARAM_KEY | LC_ARGUMENT_NAME) | |||||
| #define AGG_UNSAFE (LC_TEMPLATE_NAME | LC_WIKILINK | LC_EXT_LINK_TITLE | LC_TEMPLATE_PARAM_KEY | LC_ARGUMENT_NAME) | |||||
| #define AGG_DOUBLE (LC_TEMPLATE_PARAM_KEY | LC_TAG_CLOSE) | #define AGG_DOUBLE (LC_TEMPLATE_PARAM_KEY | LC_TAG_CLOSE) | ||||
| #define AGG_INVALID_LINK (LC_TEMPLATE_NAME | LC_ARGUMENT_NAME | LC_WIKILINK_TITLE | LC_EXT_LINK_URL) | |||||
| #define AGG_INVALID_LINK (LC_TEMPLATE_NAME | LC_ARGUMENT_NAME | LC_WIKILINK | LC_EXT_LINK_URL) | |||||
| /* Tag contexts: */ | /* Tag contexts: */ | ||||
| @@ -835,12 +835,16 @@ class Tokenizer(object): | |||||
| context = self._context | context = self._context | ||||
| if context & contexts.FAIL_NEXT: | if context & contexts.FAIL_NEXT: | ||||
| return False | return False | ||||
| if context & contexts.WIKILINK_TITLE: | |||||
| if this == "]" or this == "{": | |||||
| if context & contexts.WIKILINK: | |||||
| if context & contexts.WIKILINK_TEXT: | |||||
| return not (this == self._read(1) == "[") | |||||
| elif this == "]" or this == "{": | |||||
| self._context |= contexts.FAIL_NEXT | self._context |= contexts.FAIL_NEXT | ||||
| elif this == "\n" or this == "[" or this == "}": | elif this == "\n" or this == "[" or this == "}": | ||||
| return False | return False | ||||
| return True | return True | ||||
| elif context & contexts.EXT_LINK_TITLE: | |||||
| return this != "\n" | |||||
| elif context & contexts.TEMPLATE_NAME: | elif context & contexts.TEMPLATE_NAME: | ||||
| if this == "{" or this == "}" or this == "[": | if this == "{" or this == "}" or this == "[": | ||||
| self._context |= contexts.FAIL_NEXT | self._context |= contexts.FAIL_NEXT | ||||
| @@ -936,6 +940,8 @@ class Tokenizer(object): | |||||
| self._parse_external_link(True) | self._parse_external_link(True) | ||||
| elif this == ":" and self._read(-1) not in self.MARKERS: | elif this == ":" and self._read(-1) not in self.MARKERS: | ||||
| self._parse_external_link(False) | self._parse_external_link(False) | ||||
| elif this == "]" and self._context & contexts.EXT_LINK_TITLE: | |||||
| return self._pop() | |||||
| elif this == "=" and not self._global & contexts.GL_HEADING: | elif this == "=" and not self._global & contexts.GL_HEADING: | ||||
| if self._read(-1) in ("\n", self.START): | if self._read(-1) in ("\n", self.START): | ||||
| self._parse_heading() | self._parse_heading() | ||||