tweaks and optimizations

svn: r13230
This commit is contained in:
Gerald Britton 2009-09-21 20:52:36 +00:00
parent 82b9c0b0f7
commit 2e3ba0d954

View File

@ -86,7 +86,9 @@ _XMLNS = "http://www.w3.org/1999/xhtml"
#
#------------------------------------------------------------------------
_START_CLOSE = (
# Set of html tags that do not use a complementary closing tag, but close with
# /> instead
_START_CLOSE = set([
'area',
'base',
'br',
@ -97,7 +99,7 @@ _START_CLOSE = (
'link',
'meta',
'param'
)
])
#------------------------------------------------------------------------
#
@ -121,7 +123,7 @@ class Html(list):
"""
HTML class: Manages a rooted tree of HTML objects
"""
__slots__ = ['items', 'indent', 'inline', 'end']
__slots__ = ['items', 'indent', 'inline', 'close']
#
@staticmethod
def xmldecl(version=1.0, encoding="UTF-8", standalone="no"):
@ -271,7 +273,8 @@ class Html(list):
page at: http://www.gramps-project.org/wiki/index.php?title=Libhtml
"""
super(Html, self).__init__([]) # instantiate object
attr, indent, close, inline = '', True, True, False
attr = ''
self.indent, self.close, self.inline = True, True, False
#
# Handle keyword arguments passed to this constructor.
# Keywords that we process directly are handled.
@ -281,32 +284,29 @@ class Html(list):
for keyw, arg in keywargs.iteritems():
if (keyw in ['indent', 'close', 'inline'] and
arg in [True, False, None]):
exec '%s = %s' % (keyw, arg) # keep these settings
setattr(self,keyw, arg)
elif keyw == 'attr': # pass attributes along
attr += ' ' + arg
elif keyw[-1] == '_': # avoid Python conflicts
attr += ' %s="%s"' % (keyw[:-1], arg) # pass keyword arg along
else:
attr += ' %s="%s"' % (keyw, arg) # pass keyword arg along
#
self.indent = indent
self.inline = inline
self.end = close
#
if tag[0] == '<': # if caller provided preformatted tag?
self[0:] = [tag] # add it in
self.end = None
self.close = None # caller must close the tag
else:
if tag in _START_CLOSE: # if tag in special list
self.end = close = False # it needs no closing tag
if tag in _START_CLOSE: # if tag in special list
self.close = False # it needs no closing tag
begin = '<%s%s%s>' % ( # build opening tag with attributes
tag,
attr,
('' if close or close is None else ' /')
('' if self.close is not False else ' /')
)
#
# Use slice syntax since we don't override slicing
self[0:] = [begin] + list(args) # add beginning tag
if close: # if need closing tab
if self.close: # if need closing tab
self[len(self):] = ['</%s>' % tag] # add it on the end
#
def __add(self, value):
@ -322,22 +322,18 @@ class Html(list):
"""
if isinstance(value, Html) or not hasattr(value, '__iter__'):
value = [value]
index = len(self) - (1 if self.end else 0)
index = len(self) - (1 if self.close else 0)
self[index:index] = value
return self
#
def __add__(self, value):
"""
Overload method for + and += operators
"""
return self.__add(value)
__iadd__ = __add__
__iadd__ = __add__ = __add
#
def append(self, value):
"""
Append a new value
"""
self.__add(value)
#
extend = append
#
def replace(self, cur_value, value):
@ -548,7 +544,7 @@ class Html(list):
#
# Register Plugin
#
# -------------------------------------------
# ------------------------------------------
try:
PluginManager.get_instance().register_plugin(
@ -560,3 +556,16 @@ try:
)
except NameError:
print 'Plugin not registered.'
#-------------------------------------------
#
# Unit tests
#
#-------------------------------------------
def htmltest():
pass
if __name__ == '__main__':
from libhtmltest import htmltest
htmltest()