@@ -20,7 +20,7 @@ | |||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |||
# SOFTWARE. | |||
"""Contains data regarding certain HTML tags.""" | |||
"""Contains data about certain markup, like HTML tags and external links.""" | |||
from __future__ import unicode_literals | |||
@@ -25,7 +25,7 @@ from __future__ import unicode_literals | |||
from . import Node, Text | |||
from .extras import Attribute | |||
from ..compat import str | |||
from ..tag_defs import is_visible | |||
from ..definitions import is_visible | |||
from ..utils import parse_anything | |||
__all__ = ["Tag"] | |||
@@ -152,7 +152,7 @@ class Tag(Node): | |||
This makes the tag look like a lone close tag. It is technically | |||
invalid and is only parsable Wikicode when the tag itself is | |||
single-only, like ``<br>`` and ``<img>``. See | |||
:py:func:`.tag_defs.is_single_only`. | |||
:py:func:`.definitions.is_single_only`. | |||
""" | |||
return self._invalid | |||
@@ -161,7 +161,7 @@ class Tag(Node): | |||
"""Whether the tag is implicitly self-closing, with no ending slash. | |||
This is only possible for specific "single" tags like ``<br>`` and | |||
``<li>``. See :py:func:`.tag_defs.is_single`. This field only has an | |||
``<li>``. See :py:func:`.definitions.is_single`. This field only has an | |||
effect if :py:attr:`self_closing` is also ``True``. | |||
""" | |||
return self._implicit | |||
@@ -37,12 +37,12 @@ static int heading_level_from_context(int n) | |||
} | |||
/* | |||
Call the given function in tag_defs, using 'tag' as a parameter, and return | |||
its output as a bool. | |||
Call the given function in definitions.py, using 'tag' as a parameter, and | |||
return its output as a bool. | |||
*/ | |||
static int call_tag_def_func(const char* funcname, PyObject* tag) | |||
static int call_def_func(const char* funcname, PyObject* tag) | |||
{ | |||
PyObject* func = PyObject_GetAttrString(tag_defs, funcname); | |||
PyObject* func = PyObject_GetAttrString(definitions, funcname); | |||
PyObject* result = PyObject_CallFunctionObjArgs(func, tag, NULL); | |||
int ans = (result == Py_True) ? 1 : 0; | |||
@@ -2416,13 +2416,13 @@ static int load_tokens(void) | |||
return 0; | |||
} | |||
static int load_tag_defs(void) | |||
static int load_definitions(void) | |||
{ | |||
PyObject *tempmod, | |||
*globals = PyEval_GetGlobals(), | |||
*locals = PyEval_GetLocals(), | |||
*fromlist = PyList_New(1), | |||
*modname = IMPORT_NAME_FUNC("tag_defs"); | |||
*modname = IMPORT_NAME_FUNC("definitions"); | |||
char *name = "mwparserfromhell"; | |||
if (!fromlist || !modname) | |||
@@ -2432,7 +2432,7 @@ static int load_tag_defs(void) | |||
Py_DECREF(fromlist); | |||
if (!tempmod) | |||
return -1; | |||
tag_defs = PyObject_GetAttrString(tempmod, "tag_defs"); | |||
definitions = PyObject_GetAttrString(tempmod, "definitions"); | |||
Py_DECREF(tempmod); | |||
return 0; | |||
} | |||
@@ -2455,7 +2455,7 @@ PyMODINIT_FUNC INIT_FUNC_NAME(void) | |||
NOARGS = PyTuple_New(0); | |||
if (!EMPTY || !NOARGS) | |||
INIT_ERROR; | |||
if (load_entitydefs() || load_tokens() || load_tag_defs()) | |||
if (load_entitydefs() || load_tokens() || load_definitions()) | |||
INIT_ERROR; | |||
#ifdef IS_PY3K | |||
return module; | |||
@@ -62,7 +62,7 @@ static char** entitydefs; | |||
static PyObject* EMPTY; | |||
static PyObject* NOARGS; | |||
static PyObject* tag_defs; | |||
static PyObject* definitions; | |||
/* Tokens: */ | |||
@@ -241,9 +241,9 @@ typedef struct { | |||
/* Macros for accessing HTML tag definitions: */ | |||
#define GET_HTML_TAG(markup) (markup == *":" ? "dd" : markup == *";" ? "dt" : "li") | |||
#define IS_PARSABLE(tag) (call_tag_def_func("is_parsable", tag)) | |||
#define IS_SINGLE(tag) (call_tag_def_func("is_single", tag)) | |||
#define IS_SINGLE_ONLY(tag) (call_tag_def_func("is_single_only", tag)) | |||
#define IS_PARSABLE(tag) (call_def_func("is_parsable", tag)) | |||
#define IS_SINGLE(tag) (call_def_func("is_single", tag)) | |||
#define IS_SINGLE_ONLY(tag) (call_def_func("is_single_only", tag)) | |||
/* Function prototypes: */ | |||
@@ -26,7 +26,7 @@ import re | |||
from . import contexts, tokens | |||
from ..compat import htmlentities | |||
from ..tag_defs import get_html_tag, is_parsable, is_single, is_single_only | |||
from ..definitions import get_html_tag, is_parsable, is_single, is_single_only | |||
__all__ = ["Tokenizer"] | |||
@@ -60,7 +60,7 @@ class Tokenizer(object): | |||
START = object() | |||
END = object() | |||
MARKERS = ["{", "}", "[", "]", "<", ">", "|", "=", "&", "'", "#", "*", ";", | |||
":", "/", "-", "\n", END] | |||
":", "/", "-", "\n", START, END] | |||
MAX_DEPTH = 40 | |||
MAX_CYCLES = 100000 | |||
regex = re.compile(r"([{}\[\]<>|=&'#*;:/\\\"\-!\n])", flags=re.IGNORECASE) | |||
@@ -311,10 +311,30 @@ class Tokenizer(object): | |||
self._head += 1 | |||
return self._pop() | |||
def _really_parse_external_link(self, brackets): | |||
"""Really parse an external link.""" | |||
# link = self._parse(contexts.EXT_LINK_URL) | |||
raise BadRoute() | |||
def _parse_external_link(self, brackets): | |||
"""Parse an external link at the head of the wikicode string.""" | |||
self._emit_text(self._read()) | |||
# raise NotImplementedError() | |||
reset = self._head | |||
self._head += 1 | |||
try: | |||
bad_context = self._context & contexts.INVALID_LINK | |||
if bad_context or not self._can_recurse(): | |||
raise BadRoute() | |||
link = self._really_parse_external_link(brackets) | |||
except BadRoute: | |||
self._head = reset | |||
if not brackets and self._context & contexts.DL_TERM: | |||
self._handle_dl_term() | |||
else: | |||
self._emit_text(self._read()) | |||
else: | |||
self._emit(tokens.ExternalLinkOpen(brackets)) | |||
self._emit_all(link) | |||
self._emit(tokens.ExternalLinkClose()) | |||
def _parse_heading(self): | |||
"""Parse a section heading at the head of the wikicode string.""" | |||
@@ -912,11 +932,10 @@ class Tokenizer(object): | |||
self._handle_wikilink_separator() | |||
elif this == next == "]" and self._context & contexts.WIKILINK: | |||
return self._handle_wikilink_end() | |||
elif this == "[" and not self._context & contexts.INVALID_LINK: ## or this == ":" | |||
if self._can_recurse(): | |||
self._parse_external_link(brackets=this == "[") | |||
else: | |||
self._emit_text("[") | |||
elif this == "[": | |||
self._parse_external_link(True) | |||
elif this == ":" and self._read(-1) not in self.MARKERS: | |||
self._parse_external_link(False) | |||
elif this == "=" and not self._global & contexts.GL_HEADING: | |||
if self._read(-1) in ("\n", self.START): | |||
self._parse_heading() | |||