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