diff --git a/src/libprs500/ebooks/lrf/html/convert_from.py b/src/libprs500/ebooks/lrf/html/convert_from.py index d7170bfe83..5db614ec25 100644 --- a/src/libprs500/ebooks/lrf/html/convert_from.py +++ b/src/libprs500/ebooks/lrf/html/convert_from.py @@ -14,6 +14,7 @@ ## You should have received a copy of the GNU General Public License along ## with this program; if not, write to the Free Software Foundation, Inc., ## 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +from libprs500.ebooks.lrf.pylrs.pylrs import EmpLine """ Code to convert HTML ebooks into LRF ebooks. @@ -127,7 +128,8 @@ class HTMLConverter(object): 'center' : {'text-align' : 'center'}, 'th' : {'font-size' : 'large', 'font-weight':'bold'}, 'big' : {'font-size' : 'large', 'font-weight':'bold'}, - '.libprs500_dropcaps' : {'font-size': 'xx-large'}, + '.libprs500_dropcaps' : {'font-size': 'xx-large'}, + 'u' : {'text-decoration': 'underline'}, } def __init__(self, book, fonts, options, logger, path): @@ -635,6 +637,11 @@ class HTMLConverter(object): for prop in unneeded: fp.pop(prop) elem = Span(text=src, **fp) if (fp or force_span_use) else src + if css.has_key('text-decoration'): + 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) self.current_para.append(elem) diff --git a/src/libprs500/ebooks/lrf/html/demo/demo.html b/src/libprs500/ebooks/lrf/html/demo/demo.html index 3085c6a6fe..e5aa54d835 100644 --- a/src/libprs500/ebooks/lrf/html/demo/demo.html +++ b/src/libprs500/ebooks/lrf/html/demo/demo.html @@ -11,7 +11,7 @@

Demo of html2lrf

- This file contains a demonstration of the capabilities of html2lrf, the HTML to LRF converter from libprs500. To obtain libprs500 visit
https://libprs500.kovidgoyal.net + This document contains a demonstration of the capabilities of html2lrf, the HTML to LRF converter from libprs500. To obtain libprs500 visit
https://libprs500.kovidgoyal.net


Table of Contents

@@ -96,13 +96,14 @@

Text formatting

A simple paragraph of formatted - text, with a ruled line following it. + text, with a ruled line following it. Superscripts and Subscripts.


+

A similar - paragraph, but now using + paragraph, but now using CSS to perform the text formatting.


diff --git a/src/libprs500/ebooks/lrf/pylrs/pylrf.py b/src/libprs500/ebooks/lrf/pylrs/pylrf.py index ab711f2502..d4b97df603 100644 --- a/src/libprs500/ebooks/lrf/pylrs/pylrf.py +++ b/src/libprs500/ebooks/lrf/pylrs/pylrf.py @@ -102,8 +102,7 @@ def writeIdList(f, idList): def writeColor(f, color): # TODO: allow color names, web format - color = int(color, 0) - f.write(struct.pack(">I", color)) + f.write(struct.pack(">I", int(color, 0))) def writeLineWidth(f, width): writeWord(f, int(width)//5) @@ -147,7 +146,7 @@ def writeRuledLine(f, lineInfo): writeWord(f, LINE_TYPE_ENCODING[lineType]) writeWord(f, lineWidth) writeColor(f, lineColor) - + LRF_SIGNATURE = "L\x00R\x00F\x00\x00\x00" diff --git a/src/libprs500/ebooks/lrf/pylrs/pylrs.py b/src/libprs500/ebooks/lrf/pylrs/pylrs.py index 115a2a970c..635b752d9e 100644 --- a/src/libprs500/ebooks/lrf/pylrs/pylrs.py +++ b/src/libprs500/ebooks/lrf/pylrs/pylrs.py @@ -525,15 +525,17 @@ class Book(Delegator): method(content) - def renderLrs(self, lrsFilename): - lrsFile = codecs.open(lrsFilename, "wb", encoding="utf-16") + def renderLrs(self, lrsFile): + if isinstance(lrsFile, basestring): + lrsFile = codecs.open(lrsFile, "wb", encoding="utf-16") self.render(lrsFile) lrsFile.close() - def renderLrf(self, lrfFilename): + def renderLrf(self, lrfFile): self.appendReferencedObjects(self) - lrfFile = file(lrfFilename, "wb") + if isinstance(lrfFile, basestring): + lrfFile = file(lrfFile, "wb") lrfWriter = LrfWriter(self.sourceencoding) lrfWriter.optimizeTags = self.optimizeTags @@ -1045,7 +1047,7 @@ class StyleDefault(LrsAttributes): defaults = dict(rubyalign="start", rubyadjust="none", rubyoverhang="none", empdotsposition="before", empdotsfontname="Dutch801 Rm BT Roman", - empdotscode="0x002e", emplineposition="before", + empdotscode="0x002e", emplineposition="after", emplinetype = "solid", setwaitprop="noreplay") alsoAllow = ["refempdotsfont"] @@ -1143,17 +1145,17 @@ class TextStyle(LrsStyle): """ baseDefaults = dict( columnsep="0", charspace="0", - textlinewidth="0", align="head", linecolor="0x00000000", + textlinewidth="10", align="head", linecolor="0x00000000", column="1", fontsize="100", fontwidth="-10", fontescapement="0", fontorientation="0", fontweight="400", fontfacename="Dutch801 Rm BT Roman", textcolor="0x00000000", wordspace="25", letterspace="0", baselineskip="120", linespace="10", parindent="0", parskip="0", - textbgcolor="0xFF000000") + textbgcolor="0xFF000000", emplinetype="solid", emplineposition="after") alsoAllow = ["empdotscode", "empdotsfontname", "refempdotsfont", "rubyadjust", "rubyalign", "rubyoverhang", - "empdotsposition", "emplineposition", "emplinetype"] + "empdotsposition"] validSettings = baseDefaults.keys() + alsoAllow @@ -1682,9 +1684,6 @@ class Italic(LrsSimpleChar1, LrsTextTag): def __init__(self, text=None): LrsTextTag.__init__(self, text, [LrsSimpleChar1]) - - - class Sub(LrsSimpleChar1, LrsTextTag): def __init__(self, text=None): LrsTextTag.__init__(self, text, []) @@ -1797,13 +1796,43 @@ class Span(LrsSimpleChar1, LrsContainer): def toElement(self, se): - element = Element("Span") + element = Element('Span') for (key, value) in self.attrs.items(): element.set(key, str(value)) appendTextElements(element, self.contents, se) return element +class EmpLine(LrsTextTag, LrsSimpleChar1): + linetypes = ['none', 'solid', 'dotted', 'dashed', 'double'] + linepositions = ['before', 'after'] + + def __init__(self, text=None, lineposition='before', linetype='solid'): + LrsTextTag.__init__(self, text, [LrsSimpleChar1]) + if lineposition not in self.__class__.linepositions: + raise LrsError('lineposition for an EmpLine must be one of: '+str(self.__class__.linepositions)) + if linetype not in self.__class__.linetypes: + raise LrsError('linetype for an EmpLine must be one of: '+str(self.__class__.linetypes)) + + self.emplinetype=linetype + self.emplineposition=lineposition + + def toLrfContainer(self, lrfWriter, parent): + parent.appendLrfTag(LrfTag(self.__class__.__name__, (self.emplineposition, self.emplinetype))) + parent.appendLrfTag(LrfTag('emplineposition', self.emplineposition)) + parent.appendLrfTag(LrfTag('emplinetype', self.emplinetype)) + for content in self.contents: + content.toLrfContainer(lrfWriter, parent) + + parent.appendLrfTag(LrfTag(self.__class__.__name__ + "End")) + + def toElement(self, se): + element = Element(self.__class__.__name__) + element.set('emplineposition', self.emplineposition) + element.set('emplinetype', self.emplinetype) + + appendTextElements(element, self.contents, se) + return element class Bold(Span): """