diff --git a/src/libprs500/ebooks/lrf/__init__.py b/src/libprs500/ebooks/lrf/__init__.py index 0f6519b296..6eefbaa450 100644 --- a/src/libprs500/ebooks/lrf/__init__.py +++ b/src/libprs500/ebooks/lrf/__init__.py @@ -125,6 +125,8 @@ def option_parser(usage): help='Add a header to all the pages with title and author.') laf.add_option('--headerformat', default="%t by %a", dest='headerformat', type='string', help='Set the format of the header. %a is replaced by the author and %t by the title. Default is %default') + laf.add_option('--override-css', default=None, dest='_override_css', type='string', + help='Override the CSS. Can be either a path to a CSS stylesheet or a string. If it is a string it is interpreted as CSS.') page = parser.add_option_group('PAGE OPTIONS') profiles = profile_map.keys() diff --git a/src/libprs500/ebooks/lrf/html/convert_from.py b/src/libprs500/ebooks/lrf/html/convert_from.py index 37dcb6dc4f..4a531d99e9 100644 --- a/src/libprs500/ebooks/lrf/html/convert_from.py +++ b/src/libprs500/ebooks/lrf/html/convert_from.py @@ -47,7 +47,14 @@ from libprs500.ptempfile import PersistentTemporaryFile from libprs500.ebooks.metadata.opf import OPFReader from libprs500.devices.interface import Device from libprs500.ebooks.lrf.html.color_map import lrs_color - + +def update_css(ncss, ocss): + for key in ncss.keys(): + if ocss.has_key(key): + ocss[key].update(ncss[key]) + else: + ocss[key] = ncss[key] + class HTMLConverter(object): SELECTOR_PAT = re.compile(r"([A-Za-z0-9\-\_\:\.]+[A-Za-z0-9\-\_\:\.\s\,]*)\s*\{([^\}]*)\}") PAGE_BREAK_PAT = re.compile(r'page-break-(?:after|before)\s*:\s*(\w+)', re.IGNORECASE) @@ -199,6 +206,23 @@ class HTMLConverter(object): self.list_counter = 1 self.book = book #: The Book object representing a BBeB book + + self.override_css = {} + self.override_pcss = {} + if self._override_css is not None: + if os.access(self._override_css, os.R_OK): + src = open(self._override_css, 'rb').read() + else: + src = self._override_css + match = self.PAGE_BREAK_PAT.search(src) + if match and not re.match('avoid', match.group(1), re.IGNORECASE): + self.page_break_found = True + ncss, npcss = self.parse_css(src) + if ncss: + update_css(ncss, self.override_css) + if npcss: + update_css(npcss, self.override_pcss) + self.start_on_file(path, is_root=True) def is_baen(self, soup): @@ -1236,12 +1260,6 @@ class HTMLConverter(object): else: self.logger.debug("Failed to process: %s", str(tag)) elif tagname in ['style', 'link']: - def update_css(ncss, ocss): - for key in ncss.keys(): - if ocss.has_key(key): - ocss[key].update(ncss[key]) - else: - ocss[key] = ncss[key] ncss, npcss = {}, {} if tagname == 'style': for c in tag.contents: @@ -1265,8 +1283,10 @@ class HTMLConverter(object): pass if ncss: update_css(ncss, self.css) + self.css.update(self.override_css) if npcss: update_css(npcss, self.pseudo_css) + self.pseudo_css.update(self.override_pcss) elif tagname == 'pre': self.end_current_para() self.end_current_block() diff --git a/src/libprs500/gui2/dialogs/lrf_single.py b/src/libprs500/gui2/dialogs/lrf_single.py index df71096618..456fdc942c 100644 --- a/src/libprs500/gui2/dialogs/lrf_single.py +++ b/src/libprs500/gui2/dialogs/lrf_single.py @@ -15,7 +15,8 @@ import os from PyQt4.QtCore import QObject, SIGNAL, Qt -from PyQt4.QtGui import QAbstractSpinBox, QLineEdit, QCheckBox, QDialog, QPixmap +from PyQt4.QtGui import QAbstractSpinBox, QLineEdit, QCheckBox, QDialog, \ + QPixmap, QTextEdit from libprs500.gui2.dialogs.lrf_single_ui import Ui_LRFSingleDialog from libprs500.gui2.dialogs.choose_format import ChooseFormatDialog @@ -108,6 +109,8 @@ class LRFSingleDialog(QDialog, Ui_LRFSingleDialog): obj.setValue(cmdline[i+1]) elif isinstance(obj, QLineEdit): obj.setText(cmdline[i+1]) + elif isinstance(obj, QTextEdit): + obj.setPlainText(cmdline[i+1]) profile = cmdline[cmdline.index('--profile')+1] self.gui_profile.setCurrentIndex(self.gui_profile.findText(profile)) for prepro in self.PREPROCESS_OPTIONS: @@ -197,6 +200,8 @@ class LRFSingleDialog(QDialog, Ui_LRFSingleDialog): obj.setValue(default) elif isinstance(obj, QLineEdit) and default: obj.setText(default) + elif isinstance(obj, QTextEdit) and default: + obj.setPlainText(default) elif isinstance(obj, QCheckBox): state = Qt.Checked if default else Qt.Unchecked obj.setCheckState(state) @@ -266,6 +271,10 @@ class LRFSingleDialog(QDialog, Ui_LRFSingleDialog): val = qstring_to_unicode(obj.text()) if val: cmd.extend([opt, val]) + elif isinstance(obj, QTextEdit): + val = qstring_to_unicode(obj.toPlainText()) + if val: + cmd.extend([opt, val]) elif isinstance(obj, QCheckBox): if obj.checkState() == Qt.Checked: cmd.append(opt) diff --git a/src/libprs500/gui2/dialogs/lrf_single.ui b/src/libprs500/gui2/dialogs/lrf_single.ui index c8c304c663..5eddeb779e 100644 --- a/src/libprs500/gui2/dialogs/lrf_single.ui +++ b/src/libprs500/gui2/dialogs/lrf_single.ui @@ -468,7 +468,7 @@ - + QAbstractSpinBox::PlusMinus @@ -503,7 +503,7 @@ - + QAbstractSpinBox::PlusMinus @@ -538,7 +538,7 @@ - + @@ -597,18 +597,15 @@ + + + + Override<br>CSS + + + - - - Qt::Vertical - - - - 20 - 41 - - - +