Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit7092294

Browse files
committed
Make code DRYer, and make it possible for this to work under Py2 and Py3.
1 parent84412cf commit7092294

File tree

5 files changed

+41
-53
lines changed

5 files changed

+41
-53
lines changed

‎html5lib/treebuilders/dom.py‎

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,28 +1,12 @@
11

22
fromxml.domimportminidom,Node,XML_NAMESPACE,XMLNS_NAMESPACE
3-
try:
4-
fromtypesimportModuleType
5-
except:
6-
fromnewimportmoduleasModuleType
73
importre
84
importweakref
95

106
from .import_base
117
fromhtml5libimportconstants,ihatexml
128
fromhtml5lib.constantsimportnamespaces
13-
14-
moduleCache= {}
15-
16-
defgetDomModule(DomImplementation):
17-
name="_"+DomImplementation.__name__+"builder"
18-
ifnameinmoduleCache:
19-
returnmoduleCache[name]
20-
else:
21-
mod=ModuleType(name)
22-
objs=getDomBuilder(DomImplementation)
23-
mod.__dict__.update(objs)
24-
moduleCache[name]=mod
25-
returnmod
9+
fromhtml5lib.utilsimportmoduleFactoryFactory
2610

2711
defgetDomBuilder(DomImplementation):
2812
Dom=DomImplementation
@@ -285,6 +269,11 @@ def dom2sax(node, handler, nsmap={'xml':XML_NAMESPACE}):
285269

286270
returnlocals()
287271

272+
273+
# The actual means to get a module!
274+
getDomModule=moduleFactoryFactory(getDomBuilder)
275+
276+
288277
# Keep backwards compatibility with things that directly load
289278
# classes/functions from this module
290279
forkey,valueinlist(getDomModule(minidom).__dict__.items()):

‎html5lib/treebuilders/etree.py‎

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,13 @@
1-
try:
2-
fromtypesimportModuleType
3-
except:
4-
fromnewimportmoduleasModuleType
51
importre
6-
importtypes
72

83
from .import_base
94
fromhtml5libimportihatexml
105
fromhtml5libimportconstants
116
fromhtml5lib.constantsimportnamespaces
7+
fromhtml5lib.utilsimportmoduleFactoryFactory
128

139
tag_regexp=re.compile("{([^}]*)}(.*)")
1410

15-
moduleCache= {}
16-
17-
defgetETreeModule(ElementTreeImplementation,fullTree=False):
18-
name="_"+ElementTreeImplementation.__name__+"builder"
19-
ifnameinmoduleCache:
20-
returnmoduleCache[name]
21-
else:
22-
mod=ModuleType("_"+ElementTreeImplementation.__name__+"builder")
23-
objs=getETreeBuilder(ElementTreeImplementation,fullTree)
24-
mod.__dict__.update(objs)
25-
moduleCache[name]=mod
26-
returnmod
27-
2811
defgetETreeBuilder(ElementTreeImplementation,fullTree=False):
2912
ElementTree=ElementTreeImplementation
3013
classElement(_base.Node):
@@ -342,3 +325,6 @@ def getFragment(self):
342325
return_base.TreeBuilder.getFragment(self)._element
343326

344327
returnlocals()
328+
329+
330+
getETreeModule=moduleFactoryFactory(getETreeBuilder)

‎html5lib/treewalkers/__init__.py‎

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
returning an iterator generating tokens.
99
"""
1010

11+
fromimportlibimportimport_module
12+
1113
treeWalkerCache= {}
1214

1315
defgetTreeWalker(treeType,implementation=None,**kwargs):
@@ -34,7 +36,7 @@ def getTreeWalker(treeType, implementation=None, **kwargs):
3436
treeType=treeType.lower()
3537
iftreeTypenotintreeWalkerCache:
3638
iftreeTypein ("dom","pulldom","simpletree"):
37-
mod=__import__(treeType,globals())
39+
mod=import_module("."+treeType,"html5lib.treewalkers")
3840
treeWalkerCache[treeType]=mod.TreeWalker
3941
eliftreeType=="genshi":
4042
from .importgenshistream

‎html5lib/treewalkers/etree.py‎

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,15 @@
11
importgettext
22
_=gettext.gettext
33

4-
try:
5-
fromtypesimportModuleType
6-
except:
7-
fromnewimportmoduleasModuleType
84
importcopy
95
importre
106

117
from .import_base
128
fromhtml5lib.constantsimportvoidElements
9+
fromhtml5lib.utilsimportmoduleFactorFactory
1310

1411
tag_regexp=re.compile("{([^}]*)}(.*)")
1512

16-
moduleCache= {}
17-
18-
defgetETreeModule(ElementTreeImplementation):
19-
name="_"+ElementTreeImplementation.__name__+"builder"
20-
ifnameinmoduleCache:
21-
returnmoduleCache[name]
22-
else:
23-
mod=ModuleType("_"+ElementTreeImplementation.__name__+"builder")
24-
objs=getETreeBuilder(ElementTreeImplementation)
25-
mod.__dict__.update(objs)
26-
moduleCache[name]=mod
27-
returnmod
28-
2913
defgetETreeBuilder(ElementTreeImplementation):
3014
ElementTree=ElementTreeImplementation
3115

@@ -139,3 +123,5 @@ def getParentNode(self, node):
139123
returnparent,list(parents[-1]).index(parent),parents,None
140124

141125
returnlocals()
126+
127+
getETreeModule=moduleFactoryFactory(getETreeBuilder)

‎html5lib/utils.py‎

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
fromsetsimportSetasset
66
fromsetsimportImmutableSetasfrozenset
77

8+
fromtypesimportModuleType
9+
10+
811
classMethodDispatcher(dict):
912
"""Dict with 2 special properties:
1013
@@ -173,3 +176,25 @@ def surrogatePairToCodepoint(data):
173176
char_val= (0x10000+ (ord(data[0])-0xD800)*0x400+
174177
(ord(data[1])-0xDC00))
175178
returnchar_val
179+
180+
# Module Factory Factory (no, this isn't Java, I know)
181+
# Here to stop this being duplicated all over the place.
182+
183+
defmoduleFactoryFactory(factory):
184+
moduleCache= {}
185+
defmoduleFactory(baseModule,*args,**kwargs):
186+
iftype(ModuleType.__name__)isstr:
187+
name="_%s_factory"%baseModule.__name__
188+
else:
189+
name=b"_%s_factory"%baseModule.__name__
190+
191+
ifnameinmoduleCache:
192+
returnmoduleCache[name]
193+
else:
194+
mod=ModuleType(name)
195+
objs=factory(baseModule,*args,**kwargs)
196+
mod.__dict__.update(objs)
197+
moduleCache[name]=mod
198+
returnmod
199+
200+
returnmoduleFactory

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp