Skip to content

Commit 8af48cf

Browse files
author
Steve Canny
committed
oxml: extract parser to docx.oxml
register_custom_element_class() needs to go with to avoid a circular import.
1 parent f64f87b commit 8af48cf

2 files changed

Lines changed: 25 additions & 18 deletions

File tree

docx/oxml/__init__.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,28 @@
55
corresponding to Open XML elements.
66
"""
77

8-
from docx.oxml.shared import register_custom_element_class
8+
from __future__ import absolute_import
9+
10+
from lxml import etree
11+
12+
from .ns import nsmap
13+
14+
15+
# configure XML parser
16+
element_class_lookup = etree.ElementNamespaceClassLookup()
17+
oxml_parser = etree.XMLParser(remove_blank_text=True)
18+
oxml_parser.set_element_class_lookup(element_class_lookup)
19+
20+
21+
def register_custom_element_class(tag, cls):
22+
"""
23+
Register *cls* to be constructed when the oxml parser encounters an
24+
element with matching *tag*. *tag* is a string of the form
25+
``nspfx:tagroot``, e.g. ``'w:document'``.
26+
"""
27+
nspfx, tagroot = tag.split(':')
28+
namespace = element_class_lookup.get_namespace(nsmap[nspfx])
29+
namespace[tagroot] = cls
930

1031

1132
# ===========================================================================

docx/oxml/shared.py

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -4,20 +4,17 @@
44
Objects shared by modules in the docx.oxml subpackage.
55
"""
66

7+
from __future__ import absolute_import
8+
79
from lxml import etree
810

911
import re
1012

13+
from . import oxml_parser
1114
from .exceptions import ValidationError
1215
from .ns import nsmap
1316

1417

15-
# configure XML parser
16-
element_class_lookup = etree.ElementNamespaceClassLookup()
17-
oxml_parser = etree.XMLParser(remove_blank_text=True)
18-
oxml_parser.set_element_class_lookup(element_class_lookup)
19-
20-
2118
# ===========================================================================
2219
# utility functions
2320
# ===========================================================================
@@ -119,17 +116,6 @@ def qn(tag):
119116
return '{%s}%s' % (uri, tagroot)
120117

121118

122-
def register_custom_element_class(tag, cls):
123-
"""
124-
Register *cls* to be constructed when the oxml parser encounters an
125-
element with matching *tag*. *tag* is a string of the form
126-
``nspfx:tagroot``, e.g. ``'w:document'``.
127-
"""
128-
nspfx, tagroot = tag.split(':')
129-
namespace = element_class_lookup.get_namespace(nsmap[nspfx])
130-
namespace[tagroot] = cls
131-
132-
133119
def serialize_for_reading(element):
134120
"""
135121
Serialize *element* to human-readable XML suitable for tests. No XML

0 commit comments

Comments
 (0)