diff --git a/src/libprs500/ebooks/lrf/html/convert_from.py b/src/libprs500/ebooks/lrf/html/convert_from.py index 21f63eaf59..055422aec5 100644 --- a/src/libprs500/ebooks/lrf/html/convert_from.py +++ b/src/libprs500/ebooks/lrf/html/convert_from.py @@ -807,7 +807,7 @@ class HTMLConverter(object): dec = css['text-decoration'].lower() linepos = 'after' if dec == 'underline' else 'before' if dec == 'overline' else None if linepos is not None: - elem = EmpLine(elem, lineposition=linepos) + elem = EmpLine(elem, emplineposition=linepos) self.current_para.append(elem) diff --git a/src/libprs500/ebooks/lrf/lrs/convert_from.py b/src/libprs500/ebooks/lrf/lrs/convert_from.py index c1af9d2579..abbd257056 100644 --- a/src/libprs500/ebooks/lrf/lrs/convert_from.py +++ b/src/libprs500/ebooks/lrf/lrs/convert_from.py @@ -31,14 +31,14 @@ from libprs500.ebooks.lrf.pylrs.pylrs import \ Paragraph, CR, Italic, Bold, ImageStream, \ CharButton, Button, PushButton, JumpTo, \ Plot, Image, RuledLine, Canvas, DropCaps, \ - Sup, Sub, Span, Text, \ + Sup, Sub, Span, Text, EmpLine, Font, \ LrsError, Space, Box, ButtonBlock, NoBR from libprs500 import __appname__, __version__ class LrsParser(object): filterAttrib = ['objid', 'refobj', 'objlabel', 'pagestyle', 'blockstyle', 'textstyle', 'stylelabel', - 'evenheaderid', 'oddheaderid', 'evenfooterid', 'oddfooterid'] + 'evenheaderid', 'oddheaderid', 'evenfooterid', 'oddfooterid', 'page_tree_id', 'refstream'] def __init__(self, file): self.file = file self.book = Book() @@ -53,6 +53,9 @@ class LrsParser(object): self.footers = list() self.headers = list() self.putobjs = list() + self.plots = list() + self.images = list() + self.imageblocks = list() self.root = ElementTree(file=file) # @@ -65,22 +68,45 @@ class LrsParser(object): id = element.attrib['objid'] if id not in self.objects: self.objects[id] = element + elif self.equal_element(self.objects[id], element): + continue elif self.objects[id] != element: - raise LrsError, "multiple objects with same objid=%d, %s and %s"%(id, element.tag, self.objects[id].tag) - if id == objid: - break + raise LrsError, "multiple objects with same objid=%s, %s and %s"%(id, element.tag, self.objects[id].tag) if objid in self.objects: return self.objects[objid] return None # - # compare two attrib dictionaries for equivalence + # put the tag and attributes into one string + # + def element_dump(self, element): + str = "" + str += "<%s"%element.tag + keys = element.attrib.keys() + keys.sort() + for key in keys: + str += " %s=\"%s\""%(key,element.attrib[key]) + # should do something about sub elements and sub text + str += "/>" + return str + + # + # compare two elements for identical tags and attributes + # + def equal_element(self, e1, e2): + return e1.tag == e2.tag and self._equal_attrib(e1, e2, ignore=[]) + + # + # compare two element attrib dictionaries for equivalence + # ignoring some attributes # def equal_attrib(self, e1, e2): + return self._equal_attrib(e1, e2, ignore=LrsParser.filterAttrib) + + def _equal_attrib(self, e1, e2, ignore): #print "comparing %s to %s in equal_attrib"%(e1.tag,e2.tag) a1 = e1.attrib a2 = e2.attrib - ignore = LrsParser.filterAttrib for name in a1.keys(): if name in ignore: continue @@ -112,11 +138,9 @@ class LrsParser(object): if name == 'objid': if id not in self.objects: self.objects[id] = element - elif self.objects[id] != element: + elif self.objects[id] != element and not self.equal_element(self.objects[id], element): raise LrsError, "multiple objects with same objid=%s, %s and %s"%(id, element.tag, self.objects[id].tag) - del attrib[name] - return attrib # @@ -257,12 +281,20 @@ class LrsParser(object): obj.append(Text(text.text)) for element in text: - print "No text processor for ", element.tag + print "No text processor for %s", self.element_dump(element) if element.tail != None: obj.append(Text(element.tail)) return obj + # + # occurs in draw_char, simple_char2, ... + # + def process_Plot(self, plot): + self.plots.append(plot) + plot.lrsplot = Plot(None, **self.process_attrib(plot)) + return plot.lrsplot + def process_draw_char(self, draw_char, obj): """Process an element in the DrawChar set""" @@ -271,49 +303,49 @@ class LrsParser(object): for element in draw_char: if element.tag == "Span": - obj.append(self.process_draw_char(element, Span(**element.attrib))) + obj.append(self.process_draw_char(element, Span(**self.process_attrib(element)))) elif element.tag == "Plot": - obj.append(self.process_text(element, Plot(**element.attrib))) + obj.append(self.process_text(element, self.process_Plot(element))) elif element.tag == "CR": obj.append(CR()) elif element.tag == "Space": - obj.append(Space(**element.attrib)) + obj.append(Space(**self.process_attrib(element))) elif element.tag == "CharButton": self.charbuttons.append(element) element.lrscharbutton = CharButton(None, **self.process_attrib(element)) obj.append(self.process_simple_char1(element, element.lrscharbutton)) elif element.tag == "Sup": - obj.append(self.process_simple_char0(element, Sup(element.text))) + obj.append(self.process_simple_char0(element, Sup())) elif element.tag == "Sub": - obj.append(self.process_simple_char0(element, Sub(element.text))) + obj.append(self.process_simple_char0(element, Sub())) elif element.tag == "NoBR": obj.append(self.process_simple_char1(element, NoBR())) elif element.tag == "DrawChar": - obj.append(self.process_simple_char0(element, DropCaps(**element.attrib))) + obj.append(self.process_simple_char0(element, DropCaps(**self.process_attrib(element)))) elif element.tag == "Box": - obj.append(self.process_simple_char0(element, Box(**element.attrib))) + obj.append(self.process_simple_char0(element, Box(**self.process_attrib(element)))) elif element.tag == "Italic": obj.append(self.process_draw_char(element, Italic())) elif element.tag == "Bold": obj.append(self.process_draw_char(element, Bold())) # elif element.tag == "Fill": - # obj.append(Fill(**element.attrib)) + # obj.append(Fill(**self.process_attrib(element))) # elif element.tag == "Rubi": - # obj.append(process_Rubi(element)) + # obj.append(self.process_Rubi(element)) # elif element.tag == "Yoko": - # obj.append(process_simple_char0(element, Yoko(**element.attrib))) + # obj.append(self.process_simple_char0(element, Yoko(**self.process_attrib(element)))) # elif element.tag == "Tate": - # obj.append(process_simple_char2(element, Tate(**element.attrib))) + # obj.append(self.process_simple_char2(element, Tate(**self.process_attrib(element)))) # elif element.tag == "Nekase": - # obj.append(process_simple_char2(element, Nekase(**element.attrib))) - # elif element.tag == "EmpLine": - # obj.append(process_simple_char0(element, EmpLine(**element.attrib))) + # obj.append(self.process_simple_char2(element, Nekase(**self.process_attrib(element)))) + elif element.tag == "EmpLine": + obj.append(self.process_simple_char0(element, EmpLine(**self.process_attrib(element)))) # elif element.tag == "EmpDots": - # obj.append(process_simple_char0(element, EmpDots(**element.attrib))) + # obj.append(self.process_simple_char0(element, EmpDots(**self.process_attrib(element)))) # elif element.tag == "Gaiji": - # obj.append(process_text(element, Gaiji(**element.attrib))) + # obj.append(self.process_text(element, Gaiji(**self.process_attrib(element)))) # elif element.tag == "AltString": - # obj.append(process_AltString(element)) + # obj.append(self.process_AltString(element)) else: print "No DrawChar set processor for ", element.tag if element.tail != None: @@ -327,12 +359,14 @@ class LrsParser(object): if simple_char0.text != None: obj.append(Text(simple_char0.text)) for element in simple_char0: - # if element.tag == "Gaiji": - # obj.append(process_text(element, Gaiji(**element.attrib))) + if element.tag == "Plot": + obj.append(self.process_text(element, self.process_Plot(element))) + # elif element.tag == "Gaiji": + # obj.append(process_text(element, Gaiji(**self.process_attrib(element)))) # elif element.tag == "AltString": # obj.append(process_AltString(element)) - # else: - print "No SimpleChar0 set processor for ", element.tag + else: + print "No SimpleChar0 set processor for ", element.tag if element.tail != None: obj.append(Text(element.tail)) @@ -341,27 +375,26 @@ class LrsParser(object): def process_simple_char1(self, simple_char1, obj): """Process an element in the SimpleChar1 set""" - if simple_char1.text != None: obj.append(Text(simple_char1.text)) for element in simple_char1: if element.tag == "Box": - obj.append(self.process_simple_char0(element), Box(**element.attrib)) + obj.append(self.process_simple_char0(element), Box(**self.process_attrib(element))) elif element.tag == "Sub": - obj.append(self.process_simple_char0(element, Sub(**element.attrib))) + obj.append(self.process_simple_char0(element, Sub(**self.process_attrib(element)))) elif element.tag == "Sup": - obj.append(self.process_simple_char0(element, Sup(**element.attrib))) + obj.append(self.process_simple_char0(element, Sup(**self.process_attrib(element)))) elif element.tag == "Space": - obj.append(Space(**element.attrib)) + obj.append(Space(**self.process_attrib(element))) # elif element.tag == "Rubi": # obj.append(process_Rubi(element)) # elif element.tag == "Gaiji": - # obj.append(process_text(element, Gaiji(**element.attrib))) + # obj.append(process_text(element, Gaiji(**self.process_attrib(element)))) # elif element.tag == "EmpDots": - # obj.append(process_simple_char0(element, EmpDots(**element.attrib))) + # obj.append(process_simple_char0(element, EmpDots(**self.process_attrib(element)))) # elif element.tag == "EmpLine": - # obj.append(process_simple_char0(element, EmpLine(**element.attrib))) + # obj.append(process_simple_char0(element, EmpLine(**self.process_attrib(element)))) # elif element.tag == "AltString": # obj.append(process_AltString(element)) else: @@ -379,9 +412,9 @@ class LrsParser(object): for element in simple_char2: if element.tag == "Plot": - obj.append(self.process_text(element, Plot(**element.attrib))) + obj.append(self.process_text(element, self.process_Plot(element))) # elif element.tag == "Gaiji": - # obj.append(process_text(element, Gaiji(**element.attrib))) + # obj.append(process_text(element, Gaiji(**self.process_attrib(element)))) # elif element.tag == "AltString": # obj.append(process_AltString(element)) else: @@ -391,6 +424,13 @@ class LrsParser(object): return obj + # + # occurs in ,
,