BVB Source Codes

DeDRM_tools Show flatxml2html.py Source code

Return Download DeDRM_tools: download flatxml2html.py Source code - Download DeDRM_tools Source code - Type:.py
  1. #! /usr/bin/python
  2. # vim:ts=4:sw=4:softtabstop=4:smarttab:expandtab
  3. # For use with Topaz Scripts Version 2.6
  4.  
  5. import sys
  6. import csv
  7. import os
  8. import math
  9. import getopt
  10. from struct import pack
  11. from struct import unpack
  12.  
  13.  
  14. class DocParser(object):
  15.     def __init__(self, flatxml, classlst, fileid, bookDir, gdict, fixedimage):
  16.         self.id = os.path.basename(fileid).replace('.dat','')
  17.         self.svgcount = 0
  18.         self.docList = flatxml.split('\n')
  19.         self.docSize = len(self.docList)
  20.         self.classList = {}
  21.         self.bookDir = bookDir
  22.         self.gdict = gdict
  23.         tmpList = classlst.split('\n')
  24.         for pclass in tmpList:
  25.             if pclass != '':
  26.                 # remove the leading period from the css name
  27.                 cname = pclass[1:]
  28.             self.classList[cname] = True
  29.         self.fixedimage = fixedimage
  30.         self.ocrtext = []
  31.         self.link_id = []
  32.         self.link_title = []
  33.         self.link_page = []
  34.         self.link_href = []
  35.         self.link_type = []
  36.         self.dehyphen_rootid = []
  37.         self.paracont_stemid = []
  38.         self.parastems_stemid = []
  39.  
  40.  
  41.     def getGlyph(self, gid):
  42.         result = ''
  43.         id='id="gl%d"' % gid
  44.         return self.gdict.lookup(id)
  45.  
  46.     def glyphs_to_image(self, glyphList):
  47.  
  48.         def extract(path, key):
  49.             b = path.find(key) + len(key)
  50.             e = path.find(' ',b)
  51.             return int(path[b:e])
  52.  
  53.         svgDir = os.path.join(self.bookDir,'svg')
  54.  
  55.         imgDir = os.path.join(self.bookDir,'img')
  56.         imgname = self.id + '_%04d.svg' % self.svgcount
  57.         imgfile = os.path.join(imgDir,imgname)
  58.  
  59.         # get glyph information
  60.         gxList = self.getData('info.glyph.x',0,-1)
  61.         gyList = self.getData('info.glyph.y',0,-1)
  62.         gidList = self.getData('info.glyph.glyphID',0,-1)
  63.  
  64.         gids = []
  65.         maxws = []
  66.         maxhs = []
  67.         xs = []
  68.         ys = []
  69.         gdefs = []
  70.  
  71.         # get path defintions, positions, dimensions for each glyph
  72.         # that makes up the image, and find min x and min y to reposition origin
  73.         minx = -1
  74.         miny = -1
  75.         for j in glyphList:
  76.             gid = gidList[j]
  77.             gids.append(gid)
  78.  
  79.             xs.append(gxList[j])
  80.             if minx == -1: minx = gxList[j]
  81.             else : minx = min(minx, gxList[j])
  82.  
  83.             ys.append(gyList[j])
  84.             if miny == -1: miny = gyList[j]
  85.             else : miny = min(miny, gyList[j])
  86.  
  87.             path = self.getGlyph(gid)
  88.             gdefs.append(path)
  89.  
  90.             maxws.append(extract(path,'width='))
  91.             maxhs.append(extract(path,'height='))
  92.  
  93.  
  94.         # change the origin to minx, miny and calc max height and width
  95.         maxw = maxws[0] + xs[0] - minx
  96.         maxh = maxhs[0] + ys[0] - miny
  97.         for j in xrange(0, len(xs)):
  98.             xs[j] = xs[j] - minx
  99.             ys[j] = ys[j] - miny
  100.             maxw = max( maxw, (maxws[j] + xs[j]) )
  101.             maxh = max( maxh, (maxhs[j] + ys[j]) )
  102.  
  103.         # open the image file for output
  104.         ifile = open(imgfile,'w')
  105.         ifile.write('<?xml version="1.0" standalone="no"?>\n')
  106.         ifile.write('<!DOCTYPE svg PUBLIC "-//W3C/DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">\n')
  107.         ifile.write('<svg width="%dpx" height="%dpx" viewBox="0 0 %d %d" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1">\n' % (math.floor(maxw/10), math.floor(maxh/10), maxw, maxh))
  108.         ifile.write('<defs>\n')
  109.         for j in xrange(0,len(gdefs)):
  110.             ifile.write(gdefs[j])
  111.         ifile.write('</defs>\n')
  112.         for j in xrange(0,len(gids)):
  113.             ifile.write('<use xlink:href="#gl%d" x="%d" y="%d" />\n' % (gids[j], xs[j], ys[j]))
  114.         ifile.write('</svg>')
  115.         ifile.close()
  116.  
  117.         return 0
  118.  
  119.  
  120.  
  121.     # return tag at line pos in document
  122.     def lineinDoc(self, pos) :
  123.         if (pos >= 0) and (pos < self.docSize) :
  124.             item = self.docList[pos]
  125.             if item.find('=') >= 0:
  126.                 (name, argres) = item.split('=',1)
  127.             else :
  128.                 name = item
  129.                 argres = ''
  130.         return name, argres
  131.  
  132.  
  133.     # find tag in doc if within pos to end inclusive
  134.     def findinDoc(self, tagpath, pos, end) :
  135.         result = None
  136.         if end == -1 :
  137.             end = self.docSize
  138.         else:
  139.             end = min(self.docSize, end)
  140.         foundat = -1
  141.         for j in xrange(pos, end):
  142.             item = self.docList[j]
  143.             if item.find('=') >= 0:
  144.                 (name, argres) = item.split('=',1)
  145.             else :
  146.                 name = item
  147.                 argres = ''
  148.             if name.endswith(tagpath) :
  149.                 result = argres
  150.                 foundat = j
  151.                 break
  152.         return foundat, result
  153.  
  154.  
  155.     # return list of start positions for the tagpath
  156.     def posinDoc(self, tagpath):
  157.         startpos = []
  158.         pos = 0
  159.         res = ""
  160.         while res != None :
  161.             (foundpos, res) = self.findinDoc(tagpath, pos, -1)
  162.             if res != None :
  163.                 startpos.append(foundpos)
  164.             pos = foundpos + 1
  165.         return startpos
  166.  
  167.  
  168.     # returns a vector of integers for the tagpath
  169.     def getData(self, tagpath, pos, end):
  170.         argres=[]
  171.         (foundat, argt) = self.findinDoc(tagpath, pos, end)
  172.         if (argt != None) and (len(argt) > 0) :
  173.             argList = argt.split('|')
  174.             argres = [ int(strval) for strval in argList]
  175.         return argres
  176.  
  177.  
  178.     # get the class
  179.     def getClass(self, pclass):
  180.         nclass = pclass
  181.  
  182.         # class names are an issue given topaz may start them with numerals (not allowed),
  183.         # use a mix of cases (which cause some browsers problems), and actually
  184.         # attach numbers after "_reclustered*" to the end to deal classeses that inherit
  185.         # from a base class (but then not actually provide all of these _reclustereed
  186.         # classes in the stylesheet!
  187.  
  188.         # so we clean this up by lowercasing, prepend 'cl-', and getting any baseclass
  189.         # that exists in the stylesheet first, and then adding this specific class
  190.         # after
  191.  
  192.         # also some class names have spaces in them so need to convert to dashes
  193.         if nclass != None :
  194.             nclass = nclass.replace(' ','-')
  195.             classres = ''
  196.             nclass = nclass.lower()
  197.             nclass = 'cl-' + nclass
  198.             baseclass = ''
  199.             # graphic is the base class for captions
  200.             if nclass.find('cl-cap-') >=0 :
  201.                 classres = 'graphic' + ' '
  202.             else :
  203.                 # strip to find baseclass
  204.                 p = nclass.find('_')
  205.                 if p > 0 :
  206.                     baseclass = nclass[0:p]
  207.                     if baseclass in self.classList:
  208.                         classres += baseclass + ' '
  209.             classres += nclass
  210.             nclass = classres
  211.         return nclass
  212.  
  213.  
  214.     # develop a sorted description of the starting positions of
  215.     # groups and regions on the page, as well as the page type
  216.     def PageDescription(self):
  217.  
  218.         def compare(x, y):
  219.             (xtype, xval) = x
  220.             (ytype, yval) = y
  221.             if xval > yval:
  222.                 return 1
  223.             if xval == yval:
  224.                 return 0
  225.             return -1
  226.  
  227.         result = []
  228.         (pos, pagetype) = self.findinDoc('page.type',0,-1)
  229.  
  230.         groupList = self.posinDoc('page.group')
  231.         groupregionList = self.posinDoc('page.group.region')
  232.         pageregionList = self.posinDoc('page.region')
  233.         # integrate into one list
  234.         for j in groupList:
  235.             result.append(('grpbeg',j))
  236.         for j in groupregionList:
  237.             result.append(('gregion',j))
  238.         for j in pageregionList:
  239.             result.append(('pregion',j))
  240.         result.sort(compare)
  241.  
  242.         # insert group end and page end indicators
  243.         inGroup = False
  244.         j = 0
  245.         while True:
  246.             if j == len(result): break
  247.             rtype = result[j][0]
  248.             rval = result[j][1]
  249.             if not inGroup and (rtype == 'grpbeg') :
  250.                 inGroup = True
  251.                 j = j + 1
  252.             elif inGroup and (rtype in ('grpbeg', 'pregion')):
  253.                 result.insert(j,('grpend',rval))
  254.                 inGroup = False
  255.             else:
  256.                 j = j + 1
  257.         if inGroup:
  258.             result.append(('grpend',-1))
  259.         result.append(('pageend', -1))
  260.         return pagetype, result
  261.  
  262.  
  263.  
  264.     # build a description of the paragraph
  265.     def getParaDescription(self, start, end, regtype):
  266.  
  267.         result = []
  268.  
  269.         # paragraph
  270.         (pos, pclass) = self.findinDoc('paragraph.class',start,end)
  271.  
  272.         pclass = self.getClass(pclass)
  273.  
  274.         # if paragraph uses extratokens (extra glyphs) then make it fixed
  275.         (pos, extraglyphs) = self.findinDoc('paragraph.extratokens',start,end)
  276.  
  277.         # build up a description of the paragraph in result and return it
  278.         # first check for the  basic - all words paragraph
  279.         (pos, sfirst) = self.findinDoc('paragraph.firstWord',start,end)
  280.         (pos, slast) = self.findinDoc('paragraph.lastWord',start,end)
  281.         if (sfirst != None) and (slast != None) :
  282.             first = int(sfirst)
  283.             last = int(slast)
  284.  
  285.             makeImage = (regtype == 'vertical') or (regtype == 'table')
  286.             makeImage = makeImage or (extraglyphs != None)
  287.             if self.fixedimage:
  288.                 makeImage = makeImage or (regtype == 'fixed')
  289.  
  290.             if (pclass != None):
  291.                 makeImage = makeImage or (pclass.find('.inverted') >= 0)
  292.                 if self.fixedimage :
  293.                     makeImage = makeImage or (pclass.find('cl-f-') >= 0)
  294.  
  295.             # before creating an image make sure glyph info exists
  296.             gidList = self.getData('info.glyph.glyphID',0,-1)
  297.  
  298.             makeImage = makeImage & (len(gidList) > 0)
  299.  
  300.             if not makeImage :
  301.                 # standard all word paragraph
  302.                 for wordnum in xrange(first, last):
  303.                     result.append(('ocr', wordnum))
  304.                 return pclass, result
  305.  
  306.             # convert paragraph to svg image
  307.             # translate first and last word into first and last glyphs
  308.             # and generate inline image and include it
  309.             glyphList = []
  310.             firstglyphList = self.getData('word.firstGlyph',0,-1)
  311.             gidList = self.getData('info.glyph.glyphID',0,-1)
  312.             firstGlyph = firstglyphList[first]
  313.             if last < len(firstglyphList):
  314.                 lastGlyph = firstglyphList[last]
  315.             else :
  316.                 lastGlyph = len(gidList)
  317.  
  318.             # handle case of white sapce paragraphs with no actual glyphs in them
  319.             # by reverting to text based paragraph
  320.             if firstGlyph >= lastGlyph:
  321.                 # revert to standard text based paragraph
  322.                 for wordnum in xrange(first, last):
  323.                     result.append(('ocr', wordnum))
  324.                 return pclass, result
  325.  
  326.             for glyphnum in xrange(firstGlyph, lastGlyph):
  327.                 glyphList.append(glyphnum)
  328.             # include any extratokens if they exist
  329.             (pos, sfg) = self.findinDoc('extratokens.firstGlyph',start,end)
  330.             (pos, slg) = self.findinDoc('extratokens.lastGlyph',start,end)
  331.             if (sfg != None) and (slg != None):
  332.                 for glyphnum in xrange(int(sfg), int(slg)):
  333.                     glyphList.append(glyphnum)
  334.             num = self.svgcount
  335.             self.glyphs_to_image(glyphList)
  336.             self.svgcount += 1
  337.             result.append(('svg', num))
  338.             return pclass, result
  339.  
  340.         # this type of paragraph may be made up of multiple spans, inline
  341.         # word monograms (images), and words with semantic meaning,
  342.         # plus glyphs used to form starting letter of first word
  343.  
  344.         # need to parse this type line by line
  345.         line = start + 1
  346.         word_class = ''
  347.  
  348.         # if end is -1 then we must search to end of document
  349.         if end == -1 :
  350.             end = self.docSize
  351.  
  352.         # seems some xml has last* coming before first* so we have to
  353.         # handle any order
  354.         sp_first = -1
  355.         sp_last = -1
  356.  
  357.         gl_first = -1
  358.         gl_last = -1
  359.  
  360.         ws_first = -1
  361.         ws_last = -1
  362.  
  363.         word_class = ''
  364.  
  365.         word_semantic_type = ''
  366.  
  367.         while (line < end) :
  368.  
  369.             (name, argres) = self.lineinDoc(line)
  370.  
  371.             if name.endswith('span.firstWord') :
  372.                 sp_first = int(argres)
  373.  
  374.             elif name.endswith('span.lastWord') :
  375.                 sp_last = int(argres)
  376.  
  377.             elif name.endswith('word.firstGlyph') :
  378.                 gl_first = int(argres)
  379.  
  380.             elif name.endswith('word.lastGlyph') :
  381.                 gl_last = int(argres)
  382.  
  383.             elif name.endswith('word_semantic.firstWord'):
  384.                 ws_first = int(argres)
  385.  
  386.             elif name.endswith('word_semantic.lastWord'):
  387.                 ws_last = int(argres)
  388.  
  389.             elif name.endswith('word.class'):
  390.                 # we only handle spaceafter word class
  391.                 try:
  392.                     (cname, space) = argres.split('-',1)
  393.                     if space == '' : space = '0'
  394.                     if (cname == 'spaceafter') and (int(space) > 0) :
  395.                         word_class = 'sa'
  396.                 except:
  397.                     pass
  398.  
  399.             elif name.endswith('word.img.src'):
  400.                 result.append(('img' + word_class, int(argres)))
  401.                 word_class = ''
  402.  
  403.             elif name.endswith('region.img.src'):
  404.                 result.append(('img' + word_class, int(argres)))
  405.  
  406.             if (sp_first != -1) and (sp_last != -1):
  407.                 for wordnum in xrange(sp_first, sp_last):
  408.                     result.append(('ocr', wordnum))
  409.                 sp_first = -1
  410.                 sp_last = -1
  411.  
  412.             if (gl_first != -1) and (gl_last != -1):
  413.                 glyphList = []
  414.                 for glyphnum in xrange(gl_first, gl_last):
  415.                     glyphList.append(glyphnum)
  416.                 num = self.svgcount
  417.                 self.glyphs_to_image(glyphList)
  418.                 self.svgcount += 1
  419.                 result.append(('svg', num))
  420.                 gl_first = -1
  421.                 gl_last = -1
  422.  
  423.             if (ws_first != -1) and (ws_last != -1):
  424.                 for wordnum in xrange(ws_first, ws_last):
  425.                     result.append(('ocr', wordnum))
  426.                 ws_first = -1
  427.                 ws_last = -1
  428.  
  429.             line += 1
  430.  
  431.         return pclass, result
  432.  
  433.  
  434.     def buildParagraph(self, pclass, pdesc, type, regtype) :
  435.         parares = ''
  436.         sep =''
  437.  
  438.         classres = ''
  439.         if pclass :
  440.             classres = ' class="' + pclass + '"'
  441.  
  442.         br_lb = (regtype == 'fixed') or (regtype == 'chapterheading') or (regtype == 'vertical')
  443.  
  444.         handle_links = len(self.link_id) > 0
  445.  
  446.         if (type == 'full') or (type == 'begin') :
  447.             parares += '<p' + classres + '>'
  448.  
  449.         if (type == 'end'):
  450.             parares += ' '
  451.  
  452.         lstart = len(parares)
  453.  
  454.         cnt = len(pdesc)
  455.  
  456.         for j in xrange( 0, cnt) :
  457.  
  458.             (wtype, num) = pdesc[j]
  459.  
  460.             if wtype == 'ocr' :
  461.                 try:
  462.                     word = self.ocrtext[num]
  463.                 except:
  464.                     word = ""
  465.  
  466.                 sep = ' '
  467.  
  468.                 if handle_links:
  469.                     link = self.link_id[num]
  470.                     if (link > 0):
  471.                         linktype = self.link_type[link-1]
  472.                         title = self.link_title[link-1]
  473.                         if (title == "") or (parares.rfind(title) < 0):
  474.                             title=parares[lstart:]
  475.                         if linktype == 'external' :
  476.                             linkhref = self.link_href[link-1]
  477.                             linkhtml = '<a href="%s">' % linkhref
  478.                         else :
  479.                             if len(self.link_page) >= link :
  480.                                 ptarget = self.link_page[link-1] - 1
  481.                                 linkhtml = '<a href="#page%04d">' % ptarget
  482.                             else :
  483.                                 # just link to the current page
  484.                                 linkhtml = '<a href="#' + self.id + '">'
  485.                         linkhtml += title + '</a>'
  486.                         pos = parares.rfind(title)
  487.                         if pos >= 0:
  488.                             parares = parares[0:pos] + linkhtml + parares[pos+len(title):]
  489.                         else :
  490.                             parares += linkhtml
  491.                         lstart = len(parares)
  492.                         if word == '_link_' : word = ''
  493.                     elif (link < 0) :
  494.                         if word == '_link_' : word = ''
  495.  
  496.                 if word == '_lb_':
  497.                     if ((num-1) in self.dehyphen_rootid ) or handle_links:
  498.                         word = ''
  499.                         sep = ''
  500.                     elif br_lb :
  501.                         word = '<br />\n'
  502.                         sep = ''
  503.                     else :
  504.                         word = '\n'
  505.                         sep = ''
  506.  
  507.                 if num in self.dehyphen_rootid :
  508.                     word = word[0:-1]
  509.                     sep = ''
  510.  
  511.                 parares += word + sep
  512.  
  513.             elif wtype == 'img' :
  514.                 sep = ''
  515.                 parares += '<img src="img/img%04d.jpg" alt="" />' % num
  516.                 parares += sep
  517.  
  518.             elif wtype == 'imgsa' :
  519.                 sep = ' '
  520.                 parares += '<img src="img/img%04d.jpg" alt="" />' % num
  521.                 parares += sep
  522.  
  523.             elif wtype == 'svg' :
  524.                 sep = ''
  525.                 parares += '<img src="img/' + self.id + '_%04d.svg" alt="" />' % num
  526.                 parares += sep
  527.  
  528.         if len(sep) > 0 : parares = parares[0:-1]
  529.         if (type == 'full') or (type == 'end') :
  530.             parares += '</p>'
  531.         return parares
  532.  
  533.  
  534.     def buildTOCEntry(self, pdesc) :
  535.         parares = ''
  536.         sep =''
  537.         tocentry = ''
  538.         handle_links = len(self.link_id) > 0
  539.  
  540.         lstart = 0
  541.  
  542.         cnt = len(pdesc)
  543.         for j in xrange( 0, cnt) :
  544.  
  545.             (wtype, num) = pdesc[j]
  546.  
  547.             if wtype == 'ocr' :
  548.                 word = self.ocrtext[num]
  549.                 sep = ' '
  550.  
  551.                 if handle_links:
  552.                     link = self.link_id[num]
  553.                     if (link > 0):
  554.                         linktype = self.link_type[link-1]
  555.                         title = self.link_title[link-1]
  556.                         title = title.rstrip('. ')
  557.                         alt_title = parares[lstart:]
  558.                         alt_title = alt_title.strip()
  559.                         # now strip off the actual printed page number
  560.                         alt_title = alt_title.rstrip('01234567890ivxldIVXLD-.')
  561.                         alt_title = alt_title.rstrip('. ')
  562.                         # skip over any external links - can't have them in a books toc
  563.                         if linktype == 'external' :
  564.                             title = ''
  565.                             alt_title = ''
  566.                             linkpage = ''
  567.                         else :
  568.                             if len(self.link_page) >= link :
  569.                                 ptarget = self.link_page[link-1] - 1
  570.                                 linkpage = '%04d' % ptarget
  571.                             else :
  572.                                 # just link to the current page
  573.                                 linkpage = self.id[4:]
  574.                         if len(alt_title) >= len(title):
  575.                             title = alt_title
  576.                         if title != '' and linkpage != '':
  577.                             tocentry += title + '|' + linkpage + '\n'
  578.                         lstart = len(parares)
  579.                         if word == '_link_' : word = ''
  580.                     elif (link < 0) :
  581.                         if word == '_link_' : word = ''
  582.  
  583.                 if word == '_lb_':
  584.                     word = ''
  585.                     sep = ''
  586.  
  587.                 if num in self.dehyphen_rootid :
  588.                     word = word[0:-1]
  589.                     sep = ''
  590.  
  591.                 parares += word + sep
  592.  
  593.             else :
  594.                 continue
  595.  
  596.         return tocentry
  597.  
  598.  
  599.  
  600.  
  601.     # walk the document tree collecting the information needed
  602.     # to build an html page using the ocrText
  603.  
  604.     def process(self):
  605.  
  606.         tocinfo = ''
  607.         hlst = []
  608.  
  609.         # get the ocr text
  610.         (pos, argres) = self.findinDoc('info.word.ocrText',0,-1)
  611.         if argres :  self.ocrtext = argres.split('|')
  612.  
  613.         # get information to dehyphenate the text
  614.         self.dehyphen_rootid = self.getData('info.dehyphen.rootID',0,-1)
  615.  
  616.         # determine if first paragraph is continued from previous page
  617.         (pos, self.parastems_stemid) = self.findinDoc('info.paraStems.stemID',0,-1)
  618.         first_para_continued = (self.parastems_stemid  != None)
  619.  
  620.         # determine if last paragraph is continued onto the next page
  621.         (pos, self.paracont_stemid) = self.findinDoc('info.paraCont.stemID',0,-1)
  622.         last_para_continued = (self.paracont_stemid != None)
  623.  
  624.         # collect link ids
  625.         self.link_id = self.getData('info.word.link_id',0,-1)
  626.  
  627.         # collect link destination page numbers
  628.         self.link_page = self.getData('info.links.page',0,-1)
  629.  
  630.         # collect link types (container versus external)
  631.         (pos, argres) = self.findinDoc('info.links.type',0,-1)
  632.         if argres :  self.link_type = argres.split('|')
  633.  
  634.         # collect link destinations
  635.         (pos, argres) = self.findinDoc('info.links.href',0,-1)
  636.         if argres :  self.link_href = argres.split('|')
  637.  
  638.         # collect link titles
  639.         (pos, argres) = self.findinDoc('info.links.title',0,-1)
  640.         if argres :
  641.             self.link_title = argres.split('|')
  642.         else:
  643.             self.link_title.append('')
  644.  
  645.         # get a descriptions of the starting points of the regions
  646.         # and groups on the page
  647.         (pagetype, pageDesc) = self.PageDescription()
  648.         regcnt = len(pageDesc) - 1
  649.  
  650.         anchorSet = False
  651.         breakSet = False
  652.         inGroup = False
  653.  
  654.         # process each region on the page and convert what you can to html
  655.  
  656.         for j in xrange(regcnt):
  657.  
  658.             (etype, start) = pageDesc[j]
  659.             (ntype, end) = pageDesc[j+1]
  660.  
  661.  
  662.             # set anchor for link target on this page
  663.             if not anchorSet and not first_para_continued:
  664.                 hlst.append('<div style="visibility: hidden; height: 0; width: 0;" id="')
  665.                 hlst.append(self.id + '" title="pagetype_' + pagetype + '"></div>\n')
  666.                 anchorSet = True
  667.  
  668.             # handle groups of graphics with text captions
  669.             if (etype == 'grpbeg'):
  670.                 (pos, grptype) = self.findinDoc('group.type', start, end)
  671.                 if grptype != None:
  672.                     if grptype == 'graphic':
  673.                         gcstr = ' class="' + grptype + '"'
  674.                         hlst.append('<div' + gcstr + '>')
  675.                         inGroup = True
  676.  
  677.             elif (etype == 'grpend'):
  678.                 if inGroup:
  679.                     hlst.append('</div>\n')
  680.                     inGroup = False
  681.  
  682.             else:
  683.                 (pos, regtype) = self.findinDoc('region.type',start,end)
  684.  
  685.                 if regtype == 'graphic' :
  686.                     (pos, simgsrc) = self.findinDoc('img.src',start,end)
  687.                     if simgsrc:
  688.                         if inGroup:
  689.                             hlst.append('<img src="img/img%04d.jpg" alt="" />' % int(simgsrc))
  690.                         else:
  691.                             hlst.append('<div class="graphic"><img src="img/img%04d.jpg" alt="" /></div>' % int(simgsrc))
  692.  
  693.                 elif regtype == 'chapterheading' :
  694.                     (pclass, pdesc) = self.getParaDescription(start,end, regtype)
  695.                     if not breakSet:
  696.                         hlst.append('<div style="page-break-after: always;">&nbsp;</div>\n')
  697.                         breakSet = True
  698.                     tag = 'h1'
  699.                     if pclass and (len(pclass) >= 7):
  700.                         if pclass[3:7] == 'ch1-' : tag = 'h1'
  701.                         if pclass[3:7] == 'ch2-' : tag = 'h2'
  702.                         if pclass[3:7] == 'ch3-' : tag = 'h3'
  703.                         hlst.append('<' + tag + ' class="' + pclass + '">')
  704.                     else:
  705.                         hlst.append('<' + tag + '>')
  706.                     hlst.append(self.buildParagraph(pclass, pdesc, 'middle', regtype))
  707.                     hlst.append('</' + tag + '>')
  708.  
  709.                 elif (regtype == 'text') or (regtype == 'fixed') or (regtype == 'insert') or (regtype == 'listitem'):
  710.                     ptype = 'full'
  711.                     # check to see if this is a continution from the previous page
  712.                     if first_para_continued :
  713.                         ptype = 'end'
  714.                         first_para_continued = False
  715.                     (pclass, pdesc) = self.getParaDescription(start,end, regtype)
  716.                     if pclass and (len(pclass) >= 6) and (ptype == 'full'):
  717.                         tag = 'p'
  718.                         if pclass[3:6] == 'h1-' : tag = 'h4'
  719.                         if pclass[3:6] == 'h2-' : tag = 'h5'
  720.                         if pclass[3:6] == 'h3-' : tag = 'h6'
  721.                         hlst.append('<' + tag + ' class="' + pclass + '">')
  722.                         hlst.append(self.buildParagraph(pclass, pdesc, 'middle', regtype))
  723.                         hlst.append('</' + tag + '>')
  724.                     else :
  725.                         hlst.append(self.buildParagraph(pclass, pdesc, ptype, regtype))
  726.  
  727.                 elif (regtype == 'tocentry') :
  728.                     ptype = 'full'
  729.                     if first_para_continued :
  730.                         ptype = 'end'
  731.                         first_para_continued = False
  732.                     (pclass, pdesc) = self.getParaDescription(start,end, regtype)
  733.                     tocinfo += self.buildTOCEntry(pdesc)
  734.                     hlst.append(self.buildParagraph(pclass, pdesc, ptype, regtype))
  735.  
  736.                 elif (regtype == 'vertical') or (regtype == 'table') :
  737.                     ptype = 'full'
  738.                     if inGroup:
  739.                         ptype = 'middle'
  740.                     if first_para_continued :
  741.                         ptype = 'end'
  742.                         first_para_continued = False
  743.                     (pclass, pdesc) = self.getParaDescription(start, end, regtype)
  744.                     hlst.append(self.buildParagraph(pclass, pdesc, ptype, regtype))
  745.  
  746.  
  747.                 elif (regtype == 'synth_fcvr.center'):
  748.                     (pos, simgsrc) = self.findinDoc('img.src',start,end)
  749.                     if simgsrc:
  750.                         hlst.append('<div class="graphic"><img src="img/img%04d.jpg" alt="" /></div>' % int(simgsrc))
  751.  
  752.                 else :
  753.                     print '          Making region type', regtype,
  754.                     (pos, temp) = self.findinDoc('paragraph',start,end)
  755.                     (pos2, temp) = self.findinDoc('span',start,end)
  756.                     if pos != -1 or pos2 != -1:
  757.                         print ' a "text" region'
  758.                         orig_regtype = regtype
  759.                         regtype = 'fixed'
  760.                         ptype = 'full'
  761.                         # check to see if this is a continution from the previous page
  762.                         if first_para_continued :
  763.                             ptype = 'end'
  764.                             first_para_continued = False
  765.                         (pclass, pdesc) = self.getParaDescription(start,end, regtype)
  766.                         if not pclass:
  767.                             if orig_regtype.endswith('.right')     : pclass = 'cl-right'
  768.                             elif orig_regtype.endswith('.center')  : pclass = 'cl-center'
  769.                             elif orig_regtype.endswith('.left')    : pclass = 'cl-left'
  770.                             elif orig_regtype.endswith('.justify') : pclass = 'cl-justify'
  771.                         if pclass and (ptype == 'full') and (len(pclass) >= 6):
  772.                             tag = 'p'
  773.                             if pclass[3:6] == 'h1-' : tag = 'h4'
  774.                             if pclass[3:6] == 'h2-' : tag = 'h5'
  775.                             if pclass[3:6] == 'h3-' : tag = 'h6'
  776.                             hlst.append('<' + tag + ' class="' + pclass + '">')
  777.                             hlst.append(self.buildParagraph(pclass, pdesc, 'middle', regtype))
  778.                             hlst.append('</' + tag + '>')
  779.                         else :
  780.                             hlst.append(self.buildParagraph(pclass, pdesc, ptype, regtype))
  781.                     else :
  782.                         print ' a "graphic" region'
  783.                         (pos, simgsrc) = self.findinDoc('img.src',start,end)
  784.                         if simgsrc:
  785.                             hlst.append('<div class="graphic"><img src="img/img%04d.jpg" alt="" /></div>' % int(simgsrc))
  786.  
  787.  
  788.         htmlpage = "".join(hlst)
  789.         if last_para_continued :
  790.             if htmlpage[-4:] == '</p>':
  791.                 htmlpage = htmlpage[0:-4]
  792.             last_para_continued = False
  793.  
  794.         return htmlpage, tocinfo
  795.  
  796.  
  797. def convert2HTML(flatxml, classlst, fileid, bookDir, gdict, fixedimage):
  798.     # create a document parser
  799.     dp = DocParser(flatxml, classlst, fileid, bookDir, gdict, fixedimage)
  800.     htmlpage, tocinfo = dp.process()
  801.     return htmlpage, tocinfo
  802.  
downloadflatxml2html.py Source code - Download DeDRM_tools Source code
Related Source Codes/Software:
kcp - KCP - A Fast and Reliable ARQ Protocol 2017-04-08
cloc - cloc counts blank lines, comment lines, and physic... 2017-04-08
nvidia-docker - Build and run Docker containers leveraging NVIDIA ... 2017-04-08
quickstart - Angular 2 QuickStart - source from the documentati... 2017-04-08
jQuery-Autocomplete - Ajax Autocomplete for jQuery allows you to easily ... 2017-04-08
fuckitjs - The Original Javascript Error Steamroller 2017-04-09
eslint-plugin-react - React specific linting rules for ESLint 2017-04-09
husky - 2017-04-09
electron-builder - A complete solution to package and build a ready f... 2017-04-09
jsfeat - JavaScript Computer Vision library. 2017-04-16
flakes - Flakes is an Admin Template Framework. A combinati... 2017-04-15
capstone - Capstone disassembly/disassembler framework: Core ... 2017-04-15
nginx-resources - A collection of resources covering Nginx, Nginx + ... 2017-04-15
utron - A lightweight MVC framework for Go(Golang) 2017-04-15
cfssl - CFSSL: Cloudflare's PKI and TLS toolkit ... 2017-04-15
HandBrake - HandBrake's main development repository ... 2017-04-15
Awesome-Networking - A curated list of awesome networking libraries, re... 2017-04-15
react-sortable-hoc - A set of higher-order components to turn any list ... 2017-04-15
jugglingdb - Multi-database ORM for nodejs: redis, mongodb, mys... 2017-04-15

 Back to top