25 sys.path.append(os.path.dirname(__file__))
 
   26 from xml.sax 
import handler
 
   27 from xml.sax.saxutils 
import escape, quoteattr
 
   28 from xml.dom 
import Node
 
   30 from opendocument 
import load
 
   32 from namespaces 
import ANIMNS, CHARTNS, CONFIGNS, DCNS, DR3DNS, DRAWNS, FONS, \
 
   33   FORMNS, MATHNS, METANS, NUMBERNS, OFFICENS, PRESENTATIONNS, SCRIPTNS, \
 
   34   SMILNS, STYLENS, SVGNS, TABLENS, TEXTNS, XLINKNS
 
   73             (FONS,
u"background-color"): self.
c_fo,
 
   74             (FONS,
u"border"): self.
c_fo,
 
   75             (FONS,
u"border-bottom"): self.
c_fo,
 
   76             (FONS,
u"border-left"): self.
c_fo,
 
   77             (FONS,
u"border-right"): self.
c_fo,
 
   78             (FONS,
u"border-top"): self.
c_fo,
 
   79             (FONS,
u"color"): self.
c_fo,
 
   80             (FONS,
u"font-family"): self.
c_fo,
 
   81             (FONS,
u"font-size"): self.
c_fo,
 
   82             (FONS,
u"font-style"): self.
c_fo,
 
   83             (FONS,
u"font-variant"): self.
c_fo,
 
   84             (FONS,
u"font-weight"): self.
c_fo,
 
   85             (FONS,
u"line-height"): self.
c_fo,
 
   86             (FONS,
u"margin"): self.
c_fo,
 
   87             (FONS,
u"margin-bottom"): self.
c_fo,
 
   88             (FONS,
u"margin-left"): self.
c_fo,
 
   89             (FONS,
u"margin-right"): self.
c_fo,
 
   90             (FONS,
u"margin-top"): self.
c_fo,
 
   91             (FONS,
u"min-height"): self.
c_fo,
 
   92             (FONS,
u"padding"): self.
c_fo,
 
   93             (FONS,
u"padding-bottom"): self.
c_fo,
 
   94             (FONS,
u"padding-left"): self.
c_fo,
 
   95             (FONS,
u"padding-right"): self.
c_fo,
 
   96             (FONS,
u"padding-top"): self.
c_fo,
 
  100             (FONS,
u"text-indent") :self.
c_fo,
 
  102             (STYLENS,
u'column-width') : self.
c_width,
 
  103             (STYLENS,
u"font-name"): self.
c_fn,
 
  104             (STYLENS,
u'horizontal-pos'): self.
c_hp,
 
  108             (STYLENS,
u'width') : self.
c_width,
 
  121         htmlgeneric = 
"sans-serif" 
  122         if   generic == 
"roman": htmlgeneric = 
"serif" 
  123         elif generic == 
"swiss": htmlgeneric = 
"sans-serif" 
  124         elif generic == 
"modern": htmlgeneric = 
"monospace" 
  125         elif generic == 
"decorative": htmlgeneric = 
"sans-serif" 
  126         elif generic == 
"script": htmlgeneric = 
"monospace" 
  127         elif generic == 
"system": htmlgeneric = 
"serif" 
  128         self.
fontdict[name] = (family, htmlgeneric)
 
  136         sdict[
'background-image'] = 
"url('%s')" % self.
fillimages[val]
 
  140     def c_fo(self, ruleset, sdict, rule, val):
 
  142         sdict[selector] = val
 
  147         if val == 
'collapsing':
 
  148             sdict[
'border-collapse'] =
'collapse' 
  150             sdict[
'border-collapse'] =
'separate' 
  160         if align == 
"start": align = 
"left" 
  161         if align == 
"end": align = 
"right" 
  162         sdict[
'text-align'] = align
 
  169     def c_fn(self, ruleset, sdict, rule, fontstyle):
 
  170         generic = ruleset.get((STYLENS,
'font-family-generic') )
 
  171         if generic 
is not None:
 
  172             self.
save_font(fontstyle, fontstyle, generic)
 
  173         family, htmlgeneric = self.fontdict.get(fontstyle, (fontstyle, 
'serif'))
 
  174         sdict[
'font-family'] = 
'%s, %s'  % (family, htmlgeneric)
 
  196         textpos = tp.split(
' ')
 
  197         if len(textpos) == 2 
and textpos[0] != 
"0%":
 
  199             sdict[
'font-size'] = textpos[1]
 
  200         if textpos[0] == 
"super":
 
  201             sdict[
'vertical-align'] = 
"33%" 
  202         elif textpos[0] == 
"sub":
 
  203             sdict[
'vertical-align'] = 
"-33%" 
  205             sdict[
'vertical-align'] = textpos[0]
 
  207     def c_hp(self, ruleset, sdict, rule, hpos):
 
  211         wrap = ruleset.get((STYLENS,
'wrap'),
'parallel')
 
  214             sdict[
'margin-left'] = 
"auto" 
  215             sdict[
'margin-right'] = 
"auto" 
  221         if hpos 
in (
"right",
"outside"):
 
  222             if wrap 
in ( 
"left", 
"parallel",
"dynamic"):
 
  223                 sdict[
'float'] = 
"right" 
  224             elif wrap == 
"run-through":
 
  225                 sdict[
'position'] = 
"absolute"  
  227                 sdict[
'right'] = 
"0";
 
  229                 sdict[
'margin-left'] = 
"auto" 
  230                 sdict[
'margin-right'] = 
"0cm" 
  231         elif hpos 
in (
"left", 
"inside"):
 
  232             if wrap 
in ( 
"right", 
"parallel",
"dynamic"):
 
  233                 sdict[
'float'] = 
"left" 
  234             elif wrap == 
"run-through":
 
  235                 sdict[
'position'] = 
"absolute"  
  239                 sdict[
'margin-left'] = 
"0cm" 
  240                 sdict[
'margin-right'] = 
"auto" 
  241         elif hpos 
in (
"from-left", 
"from-inside"):
 
  242             if wrap 
in ( 
"right", 
"parallel"):
 
  243                 sdict[
'float'] = 
"left" 
  245                 sdict[
'position'] = 
"relative"  
  246                 if (SVGNS,
'x') 
in ruleset:
 
  247                     sdict[
'left'] = ruleset[(SVGNS,
'x')]
 
  261         if val 
and val != 
"none":
 
  262             sdict[
'text-decoration'] = 
"underline" 
  269         if val 
and val != 
"none":
 
  270             sdict[
'text-decoration'] = 
"line-through" 
  275         sdict[
'height'] = val
 
  284         for rule,val 
in ruleset.items():
 
  288             method = self.ruleconversions.get(rule, 
None )
 
  290                 procedures.append([method, ruleset, sdict, rule, val])
 
  294         for p 
in filter(
lambda x: x[0] != self.
c_hp, procedures):
 
  295             method, ruleset, sdict, rule, val = p
 
  296             method(ruleset, sdict, rule, val)
 
  297         for p 
in filter(
lambda x: x[0] == self.
c_hp, procedures):
 
  298             method, ruleset, sdict, rule, val = p
 
  299             method(ruleset, sdict, rule, val)
 
  309         self.stack.append( (tag, attrs) )
 
  312         item = self.stack.pop()
 
  316         item = self.
stack[-1]
 
  322         for tag, attrs 
in self.
stack:
 
  328         for ttag, tattrs 
in self.
stack:
 
  329             if ttag == tag: c = c + 1
 
  335    'S-Strong_20_Emphasis':
'strong',
 
  337    'S-Definition':
'dfn',
 
  339    'P-Heading_20_1':
'h1',
 
  340    'P-Heading_20_2':
'h2',
 
  341    'P-Heading_20_3':
'h3',
 
  342    'P-Heading_20_4':
'h4',
 
  343    'P-Heading_20_5':
'h5',
 
  344    'P-Heading_20_6':
'h6',
 
  346    'P-Addressee':
'address',
 
  349    'P-Preformatted_20_Text':
'pre',
 
  364     def __init__(self, generate_css=True, embedable=False):
 
  386         (NUMBERNS, 
"boolean-style"):(self.
s_ignorexml, 
None),
 
  387         (NUMBERNS, 
"currency-style"):(self.
s_ignorexml, 
None),
 
  389         (NUMBERNS, 
"number-style"):(self.
s_ignorexml, 
None),
 
  404         (PRESENTATIONNS, 
"notes"):(self.
s_ignorexml, 
None),
 
  406         (STYLENS, 
"default-page-layout"):(self.
s_ignorexml, 
None),
 
  413         (STYLENS, 
"handout-master"):(self.
s_ignorexml, 
None),
 
  428         (TABLENS, 
'covered-table-cell'): (self.
s_ignorexml, 
None),
 
  435         (TEXTNS, 
"bibliography-configuration"):(self.
s_ignorexml, 
None),
 
  444         (TEXTNS, 
"linenumbering-configuration"):(self.
s_ignorexml, 
None),
 
  449         (TEXTNS, 
"list-style"):(
None, 
None),
 
  453         (TEXTNS, 
"notes-configuration"):(self.
s_ignorexml, 
None),
 
  456         (TEXTNS, 
's'): (self.
s_text_s, 
None),
 
  464             self.make_embedable()
 
  475         self.
elements[(OFFICENS, 
u"text")] = (
None,
None)
 
  476         self.
elements[(OFFICENS, 
u"spreadsheet")] = (
None,
None)
 
  477         self.
elements[(OFFICENS, 
u"presentation")] = (
None,
None)
 
  478         self.
elements[(OFFICENS, 
u"document-content")] = (
None,
None)
 
  489             self.metatags.append(
'<link rel="stylesheet" type="text/css" href="%s" media="%s"/>\n' % (stylefilename,media))
 
  491             self.metatags.append(
'<link rel="stylesheet" type="text/css" href="%s"/>\n' % (stylefilename))
 
  493     def _resetfootnotes(self):
 
  499     def _resetobject(self):
 
  513         self.
headinglevels = [0, 0,0,0,0,0, 0,0,0,0,0] 
 
  534         d = 
''.join(self.
data)
 
  540     def opentag(self, tag, attrs={}, block=False):
 
  541         self.htmlstack.append((tag,attrs,block))
 
  543         for key,val 
in attrs.items():
 
  544             a.append(
'''%s=%s''' % (key, quoteattr(val)))
 
  548             self.
writeout(
"<%s %s>" % (tag, 
" ".join(a)))
 
  562         for key,val 
in attrs.items():
 
  563             a.append(
'''%s=%s''' % (key, quoteattr(val)))
 
  564         self.
writeout(
"<%s %s/>\n" % (tag, 
" ".join(a)))
 
  571             self.data.append(data)
 
  576             method = self.elements.get(tag, (
None, 
None) )[0]
 
  581         self.tagstack.push( tag, attrs )
 
  584         stag, attrs = self.tagstack.pop()
 
  586             method = self.elements.get(tag, (
None, 
None) )[1]
 
  626         c = attrs.get((TEXTNS,
'style-name'),
'')
 
  627         c = c.replace(
".",
"_")
 
  635         return self.anchors.get(name)
 
  660         self.metatags.append(
'<meta name="%s" content=%s/>\n' % (tag[1], quoteattr(
''.join(self.
data))))
 
  668         self.metatags.append(
'<meta http-equiv="content-language" content="%s"/>\n' % escape(self.
language))
 
  676         self.metatags.append(
'<meta http-equiv="creator" content="%s"/>\n' % escape(self.
creator))
 
  683         anchor_type = attrs.get((TEXTNS,
'anchor-type'),
'notfound')
 
  685         name = 
"G-" + attrs.get( (DRAWNS,
'style-name'), 
"")
 
  687             name = 
"PR-" + attrs.get( (PRESENTATIONNS,
'style-name'), 
"")
 
  688         name = name.replace(
".",
"_")
 
  689         if anchor_type == 
"paragraph":
 
  690             style = 
'position:absolute;' 
  691         elif anchor_type == 
'char':
 
  692             style = 
"position:absolute;" 
  693         elif anchor_type == 
'as-char':
 
  697             style = 
"position: absolute;" 
  698         if (SVGNS,
"width")
in attrs:
 
  699             style = style + 
"width:" + attrs[(SVGNS,
"width")] + 
";" 
  700         if (SVGNS,
"height") 
in attrs:
 
  701             style = style + 
"height:" +  attrs[(SVGNS,
"height")] + 
";" 
  702         if (SVGNS,
"x") 
in attrs:
 
  703             style = style + 
"left:" +  attrs[(SVGNS,
"x")] + 
";" 
  704         if (SVGNS,
"y") 
in attrs:
 
  705             style = style + 
"top:" +  attrs[(SVGNS,
"y")] + 
";" 
  707             self.
opentag(htmltag, {
'class': name, 
'style': style})
 
  721         anchor_type = attrs.get((TEXTNS,
'anchor-type'),
'notfound')
 
  723         name = 
"G-" + attrs.get( (DRAWNS,
'style-name'), 
"")
 
  725             name = 
"PR-" + attrs.get( (PRESENTATIONNS,
'style-name'), 
"")
 
  726         name = name.replace(
".",
"_")
 
  727         if anchor_type == 
"paragraph":
 
  728             style = 
'position:relative;' 
  729         elif anchor_type == 
'char':
 
  730             style = 
"position:relative;" 
  731         elif anchor_type == 
'as-char':
 
  735             style = 
"position:absolute;" 
  736         if (SVGNS,
"width") 
in attrs:
 
  737             style = style + 
"width:" + attrs[(SVGNS,
"width")] + 
";" 
  738         if (SVGNS,
"height") 
in attrs:
 
  739             style = style + 
"height:" +  attrs[(SVGNS,
"height")] + 
";" 
  740         if (SVGNS,
"x") 
in attrs:
 
  741             style = style + 
"left:" +  attrs[(SVGNS,
"x")] + 
";" 
  742         if (SVGNS,
"y") 
in attrs:
 
  743             style = style + 
"top:" +  attrs[(SVGNS,
"y")] + 
";" 
  745             self.
opentag(htmltag, {
'class': name, 
'style': style})
 
  756         name = attrs.get( (DRAWNS,
'name'), 
"NoName")
 
  757         imghref = attrs[(XLINKNS,
"href")]
 
  759         self.cs.fillimages[name] = imghref
 
  772         parent = self.tagstack.stackparent()
 
  773         anchor_type = parent.get((TEXTNS,
'anchor-type'))
 
  774         imghref = attrs[(XLINKNS,
"href")]
 
  776         htmlattrs = {
'alt':
"", 
'src':imghref }
 
  778             if anchor_type != 
"char":
 
  779                 htmlattrs[
'style'] = 
"display: block;" 
  786         objhref = attrs[(XLINKNS,
"href")]
 
  793         for c 
in self.document.childnodes:
 
  794             if c.folder == objhref:
 
  801         class_id = attrs[(DRAWNS,
"class-id")]
 
  802         if class_id 
and class_id.lower() == 
"00020803-0000-0000-c000-000000000046": 
 
  803             tagattrs = { 
'name':
'object_ole_graph', 
'class':
'ole-graph' }
 
  813         name = attrs.get( (DRAWNS,
'name'), 
"NoName")
 
  814         stylename = attrs.get( (DRAWNS,
'style-name'), 
"")
 
  815         stylename = stylename.replace(
".",
"_")
 
  816         masterpage = attrs.get( (DRAWNS,
'master-page-name'),
"")
 
  817         masterpage = masterpage.replace(
".",
"_")
 
  819             self.
opentag(
'fieldset', {
'class':
"DP-%s MP-%s" % (stylename, masterpage) })
 
  831         if (FONS,
"min-height") 
in attrs:
 
  832             style = style + 
"min-height:" +  attrs[(FONS,
"min-height")] + 
";" 
  845             self.
opentag(
'style', {
'type':
"text/css"}, 
True)
 
  852         self.
opentag(
'body', block=
True)
 
  855 img { width: 100%; height: 100%; } 
  856 * { padding: 0; margin: 0;  background-color:white; } 
  857 body { margin: 0 1em; } 
  858 ol, ul { padding-left: 2em; } 
  863             styles = self.styledict.get(name)
 
  865             if '__style-family'in styles 
and styles[
'__style-family'] 
in self.
styledict:
 
  866                 familystyle = self.
styledict[styles[
'__style-family']].copy()
 
  867                 del styles[
'__style-family']
 
  868                 for style, val 
in styles.items():
 
  869                     familystyle[style] = val
 
  872             while '__parent-style-name' in styles 
and styles[
'__parent-style-name'] 
in self.
styledict:
 
  873                 parentstyle = self.
styledict[styles[
'__parent-style-name']].copy()
 
  874                 del styles[
'__parent-style-name']
 
  875                 for style, val 
in styles.items():
 
  876                     parentstyle[style] = val
 
  882             styles = self.styledict.get(name)
 
  883             css2 = self.cs.convert_styles(styles)
 
  885             for style, val 
in css2.items():
 
  886                 self.
writeout(
"\t%s: %s;\n" % (style, val) )
 
  893             self.
opentag(
'ol', {
'style':
'border-top: 1px solid black'}, 
True)
 
  899             self.
opentag(
'li', { 
'id':
"footnote-%d" % key })
 
  908         if self.
xmlfile == 
'styles.xml':
 
  916         self.
writeout(
'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" ')
 
  917         self.
writeout(
'"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">\n')
 
  918         self.
opentag(
'html', {
'xmlns':
"http://www.w3.org/1999/xhtml"}, 
True)
 
  919         self.
opentag(
'head', block=
True)
 
  920         self.
emptytag(
'meta', { 
'http-equiv':
"Content-Type", 
'content':
"text/html;charset=UTF-8"})
 
  940         self.
styledict[
'p'] = {(FONS,
u'font-size'): 
u"24pt" }
 
  941         self.
styledict[
'presentation'] = {(FONS,
u'font-size'): 
u"24pt" }
 
  961         self.
styledict[
'frame'] = { (STYLENS,
'wrap'): 
u'parallel'}
 
  973         for key,attr 
in attrs.items():
 
  977     familymap = {
'frame':
'frame', 
'paragraph':
'p', 
'presentation':
'presentation',
 
  978         'text':
'span',
'section':
'div',
 
  979         'table':
'table',
'table-cell':
'td',
'table-column':
'col',
 
  980         'table-row':
'tr',
'graphic':
'graphic' }
 
  986         family = attrs[(STYLENS,
'family')]
 
  987         htmlfamily = self.familymap.get(family,
'unknown')
 
 1003         name = attrs[(STYLENS,
"name")]
 
 1004         family = attrs[(SVGNS,
"font-family")]
 
 1005         generic = attrs.get( (STYLENS,
'font-family-generic'),
"" )
 
 1006         self.cs.save_font(name, family, generic)
 
 1009         self.
opentag(
'div', { 
'id':
"footer" })
 
 1023         self.
opentag(
'div', { 
'id':
"header" })
 
 1050         name = attrs[(STYLENS,
'name')]
 
 1051         name = name.replace(
".",
"_")
 
 1066         name = attrs[(STYLENS,
'name')]
 
 1067         name = name.replace(
".",
"_")
 
 1073         pagelayout = attrs.get( (STYLENS,
'page-layout-name'), 
None)
 
 1075             pagelayout = 
".PL-" + pagelayout
 
 1078                 for style, val 
in styles.items():
 
 1085     _familyshort = {
'drawing-page':
'DP', 
'paragraph':
'P', 
'presentation':
'PR',
 
 1086         'text':
'S', 
'section':
'D',
 
 1087          'table':
'T', 
'table-cell':
'TD', 
'table-column':
'TC',
 
 1088          'table-row':
'TR', 
'graphic':
'G' }
 
 1098         name = attrs[(STYLENS,
'name')]
 
 1099         name = name.replace(
".",
"_")
 
 1100         family = attrs[(STYLENS,
'family')]
 
 1101         htmlfamily = self.familymap.get(family,
'unknown')
 
 1102         sfamily = self._familyshort.get(family,
'X')
 
 1103         name = 
"%s%s-%s" % (self.
autoprefix, sfamily, name)
 
 1104         parent = attrs.get( (STYLENS,
'parent-style-name') )
 
 1114             parent = 
"%s-%s" % (sfamily, parent)
 
 1115             parent = special_styles.get(parent, 
"."+parent)
 
 1118                 for style, val 
in styles.items():
 
 1133         c = attrs.get( (TABLENS,
'style-name'), 
None)
 
 1135             c = c.replace(
".",
"_")
 
 1136             self.
opentag(
'table',{ 
'class': 
"T-%s" % c })
 
 1155         rowspan = attrs.get( (TABLENS,
'number-rows-spanned') )
 
 1157             htmlattrs[
'rowspan'] = rowspan
 
 1158         colspan = attrs.get( (TABLENS,
'number-columns-spanned') )
 
 1160             htmlattrs[
'colspan'] = colspan
 
 1162         c = attrs.get( (TABLENS,
'style-name') )
 
 1164             htmlattrs[
'class'] = 
'TD-%s' % c.replace(
".",
"_")
 
 1178         c = attrs.get( (TABLENS,
'style-name'), 
None)
 
 1179         repeated = int(attrs.get( (TABLENS,
'number-columns-repeated'), 1))
 
 1182             htmlattrs[
'class'] = 
"TC-%s" % c.replace(
".",
"_")
 
 1183         for x 
in range(repeated):
 
 1191         c = attrs.get( (TABLENS,
'style-name'), 
None)
 
 1194             htmlattrs[
'class'] = 
"TR-%s" % c.replace(
".",
"_")
 
 1209         href = attrs[(XLINKNS,
"href")].split(
"|")[0]
 
 1212         self.
opentag(
'a', {
'href':href})
 
 1225         name = attrs[(TEXTNS,
'name')]
 
 1228         self.
opentag(
'span', {
'id':html_id})
 
 1235         name = attrs[(TEXTNS,
'ref-name')]
 
 1238         self.
opentag(
'a', {
'href':html_id})
 
 1244         level = int(attrs[(TEXTNS,
'outline-level')])
 
 1245         if level > 6: level = 6 
 
 1246         if level < 1: level = 1
 
 1249         for x 
in range(level + 1,10):
 
 1251         special = special_styles.get(
"P-"+name)
 
 1255             self.
opentag(
'h%s' % level, {
'class':
"P-%s" % name })
 
 1265         level = int(attrs[(TEXTNS,
'outline-level')])
 
 1266         if level > 6: level = 6 
 
 1267         if level < 1: level = 1
 
 1269         outline = 
'.'.join(map(str,lev) )
 
 1270         heading = 
''.join(self.
data)
 
 1272         anchor = self.
get_anchor(
"%s.%s" % ( outline, heading))
 
 1273         self.
opentag(
'a', {
'id': anchor} )
 
 1291         name = attrs.get( (TEXTNS,
'style-name') )
 
 1292         level = self.tagstack.count_tags(tag) + 1
 
 1294             name = name.replace(
".",
"_")
 
 1299             name = self.tagstack.rfindattr( (TEXTNS,
'style-name') )
 
 1300         list_class = 
"%s_%d" % (name, level)
 
 1302             self.
opentag(
'%s' % self.listtypes.get(list_class,
'ul'), {
'class': list_class })
 
 1304             self.
opentag(
'%s' % self.listtypes.get(list_class,
'ul'))
 
 1311         name = attrs.get( (TEXTNS,
'style-name') )
 
 1312         level = self.tagstack.count_tags(tag) + 1
 
 1314             name = name.replace(
".",
"_")
 
 1319             name = self.tagstack.rfindattr( (TEXTNS,
'style-name') )
 
 1320         list_class = 
"%s_%d" % (name, level)
 
 1321         self.
closetag(self.listtypes.get(list_class,
'ul'))
 
 1343         name = self.tagstack.rfindattr( (STYLENS,
'name') )
 
 1344         level = attrs[(TEXTNS,
'level')]
 
 1346         list_class = 
"%s_%s" % (name, level)
 
 1348         self.
currentstyle = 
".%s_%s" % ( name.replace(
".",
"_"), level)
 
 1353         listtype = (
"square", 
"disc", 
"circle")[level % 3]
 
 1361         name = self.tagstack.stackparent()[(STYLENS,
'name')]
 
 1362         level = attrs[(TEXTNS,
'level')]
 
 1363         num_format = attrs.get( (STYLENS,
'name'),
"1")
 
 1364         list_class = 
"%s_%s" % (name, level)
 
 1366         self.
currentstyle = 
".%s_%s" % ( name.replace(
".",
"_"), level)
 
 1370         if   num_format == 
"1": listtype = 
"decimal" 
 1371         elif num_format == 
"I": listtype = 
"upper-roman" 
 1372         elif num_format == 
"i": listtype = 
"lower-roman" 
 1373         elif num_format == 
"A": listtype = 
"upper-alpha" 
 1374         elif num_format == 
"a": listtype = 
"lower-alpha" 
 1375         else: listtype = 
"decimal" 
 1394             self.notebody.append(s)
 
 1407         mark = 
''.join(self.
data)
 
 1414         if sys.version_info.major==3:
 
 1427         c = attrs.get( (TEXTNS,
'style-name'), 
None)
 
 1429             c = c.replace(
".",
"_")
 
 1430             specialtag = special_styles.get(
"P-"+c)
 
 1431             if specialtag 
is None:
 
 1434                     htmlattrs[
'class'] = 
"P-%s" % c
 
 1435         self.
opentag(specialtag, htmlattrs)
 
 1443         c = attrs.get( (TEXTNS,
'style-name'), 
None)
 
 1445             c = c.replace(
".",
"_")
 
 1446             specialtag = special_styles.get(
"P-"+c)
 
 1447             if specialtag 
is None:
 
 1458         c = attrs.get( (TEXTNS,
'c'),
"1")
 
 1459         for x 
in range(int(c)):
 
 1468         c = attrs.get( (TEXTNS,
'style-name'), 
None)
 
 1471             c = c.replace(
".",
"_")
 
 1472             special = special_styles.get(
"S-"+c)
 
 1474                 htmlattrs[
'class'] = 
"S-%s" % c
 
 1475         self.
opentag(
'span', htmlattrs)
 
 1523         assert(type(odffile)==type(
u"") 
or 'rb' in repr(odffile) 
or 'BufferedReader' in repr(odffile)  
or 'BytesIO' in repr(odffile))
 
 1527         if type(odffile)==type(
u""):
 
 1533     def _walknode(self, node):
 
 1534         if node.nodeType == Node.ELEMENT_NODE:
 
 1536             for c 
in node.childNodes:
 
 1539         if node.nodeType == Node.TEXT_NODE 
or node.nodeType == Node.CDATA_SECTION_NODE:
 
 1540             if sys.version_info.major==3:
 
 1554         assert(type(odffile)==type(
u"") 
or 'rb' in repr(odffile) 
or 'BufferedReader' in repr(odffile)  
or 'BytesIO' in repr(odffile))
 
 1560         assert(type(result)==type(
u""))
 
 1563     def _wlines(self,s):
 
 1564         if s != 
'': self.lines.append(s)
 
 1570         return ''.join(self.
lines)
 
 1572     def _writecss(self, s):
 
 1573         if s != 
'': self._csslines.append(s)
 
 1575     def _writenothing(self, s):
 
 1594     def save(self, outputfile, addsuffix=False):
 
 1595         if outputfile == 
'-':
 
 1596             outputfp = sys.stdout
 
 1599                 outputfile = outputfile + 
".html" 
 1600             outputfp = file(outputfile, 
"w")
 
 1601         outputfp.write(self.
xhtml().encode(
'us-ascii',
'xmlcharrefreplace'))
 
 1609     def __init__(self, lines, generate_css=True, embedable=False):
 
 1633         (NUMBERNS, 
"boolean-style"):(self.
s_ignorexml, 
None),
 
 1634         (NUMBERNS, 
"currency-style"):(self.
s_ignorexml, 
None),
 
 1635         (NUMBERNS, 
"date-style"):(self.
s_ignorexml, 
None),
 
 1636         (NUMBERNS, 
"number-style"):(self.
s_ignorexml, 
None),
 
 1637         (NUMBERNS, 
"text-style"):(self.
s_ignorexml, 
None),
 
 1648         (PRESENTATIONNS, 
"notes"):(self.
s_ignorexml, 
None),
 
 1672         (TABLENS, 
'covered-table-cell'): (self.
s_ignorexml, 
None),
 
 1679         (TEXTNS, 
"bibliography-configuration"):(self.
s_ignorexml, 
None),
 
 1684         (TEXTNS, 
"linenumbering-configuration"):(self.
s_ignorexml, 
None),
 
 1689         (TEXTNS, 
"list-style"):(
None, 
None),
 
 1693         (TEXTNS, 
"notes-configuration"):(self.
s_ignorexml, 
None),
 
 1696         (TEXTNS, 
's'): (self.
s_text_s, 
None),
 
 1702         (TEXTNS, 
"page-number"):(
None, 
None),
 
def xhtml
Returns the xhtml. 
def e_draw_textbox
End the  
def opentag
Create an open HTML tag. 
def e_text_x_source
Various indexes and tables of contents. 
def set_embedable
Tells the converter to only output the parts inside the  
def c_page_width
Set width of box HTML doesn't really have a page-width. 
def e_dc_creator
Set the content creator. 
def c_text_underline_style
Set underline decoration HTML doesn't really have a page-width. 
def e_dc_metatag
Any other meta data is added as a  element. 
def s_ignorecont
Stop processing the text nodes. 
def c_border_model
Convert to CSS2 border model. 
def e_text_list_level_style_bullet
def convert_styles
Rule is a tuple of (namespace, name). 
def s_draw_object
A  is embedded object in the document (e.g. 
def s_draw_object_ole
A  is embedded OLE object in the document (e.g. 
def e_text_p
End Paragraph. 
def s_text_list_level_style_number
def s_text_tab
Move to the next tabstop. 
def s_style_font_face
It is possible that the HTML browser doesn't know how to show a particular font. 
def s_draw_frame
A  is made into a  in HTML which is then styled. 
def s_style_master_page
Collect the formatting for the page layout style. 
def e_text_list
End a list. 
def s_style_default_page_layout
Collect the formatting for the default page layout style. 
def e_dc_title
Get the title from the meta data and create a HTML 
 def s_style_page_layout
Collect the formatting for the page layout style. 
def c_page_height
Set height of box. 
def e_text_list_item
End list item. 
def s_custom_shape
A  is made into a  in HTML which is then styled. 
def s_text_x_source
Various indexes and tables of contents. 
def e_text_h
Headings end Side-effect: If there is no title in the metadata, then it is taken from the first headi...
def c_fo
XSL formatting attributes. 
def s_office_master_styles
def e_table_table_row
End a table row. 
def s_text_list_item
Start list item. 
def c_drawfillimage
Fill a figure with an image. 
def save_font
It is possible that the HTML browser doesn't know how to show a particular font. 
def s_text_span
The  element matches the  element in HTML. 
def load
Loads a document into the parser and parses it. 
def s_draw_image
A  becomes an  element. 
def rewritelink
Intended to be overloaded if you don't store your pictures in a Pictures subfolder. 
def e_style_default_style
def s_style_style
Collect the formatting for the style. 
def odf2xhtml
Load a file and return the XHTML. 
def save
Save the HTML under the filename. 
def s_text_h
Headings start. 
def c_text_line_through_style
Set underline decoration HTML doesn't really have a page-width. 
def e_dc_contentlanguage
Set the content language. 
def s_text_list
Start a list (. 
def css
Returns the CSS content. 
def s_text_line_break
Force a line break ( ) 
def e_office_presentation
def s_draw_page
A  is a slide in a presentation. 
def s_style_default_style
A default style is like a style on an HTML tag. 
def s_text_a
Anchors start. 
def c_text_position
Text position. 
def s_text_list_level_style_bullet
CSS doesn't have the ability to set the glyph to a particular character, so we just go through the av...
def s_table_table_cell
Start a table cell. 
def e_table_table_cell
End a table cell. 
def s_text_s
Generate a number of spaces. 
def e_text_list_level_style_number
def e_custom_shape
End the  
def c_fn
Generate the CSS font family A generic font can be found in two ways. 
def s_processcont
Start processing the text nodes. 
def s_text_bookmark_ref
Bookmark reference. 
def s_text_bookmark
Bookmark definition. 
The ODF2XHTML parses an ODF file and produces XHTML. 
def e_style_style
End this style. 
def get_anchor
Create a unique anchor id for a href name. 
def e_table_table
End a table. 
def classname
Generate a class name from a style name. 
def e_style_page_layout
End this style. 
The ODF2XHTML parses an ODF file and produces XHTML. 
def e_office_document_content
Last tag. 
def set_plain
Tell the parser to not generate CSS. 
The purpose of the StyleToCSS class is to contain the rules to convert ODF styles to CSS2...
def closetag
Close an open HTML tag. 
def s_office_text
OpenDocument text. 
def s_office_presentation
For some odd reason, OpenOffice Impress doesn't define a default-style for the 'paragraph'. 
def s_table_table
Start a table. 
def s_table_table_row
Start a table row. 
def s_style_handle_properties
Copy all attributes to a struct. 
def c_text_align
Text align. 
def s_ignorexml
Ignore this xml element and all children of it It will automatically stop ignoring. 
def s_office_document_content
First tag in the content.xml file. 
def s_office_automatic_styles
def e_text_a
End an anchor or bookmark reference. 
def s_table_table_column
Start a table column. 
def c_width
Set width of box. 
def add_style_file
Add a link to an external style file.