diff --git a/src/calibre/ebooks/oeb/polish/utils.py b/src/calibre/ebooks/oeb/polish/utils.py index 3bfc465ec3..9c976b0b3c 100644 --- a/src/calibre/ebooks/oeb/polish/utils.py +++ b/src/calibre/ebooks/oeb/polish/utils.py @@ -14,6 +14,13 @@ from calibre import guess_type as _guess_type def guess_type(x): return _guess_type(x)[0] or 'application/octet-stream' +def setup_cssutils_serialization(tab_width=2): + import cssutils + prefs = cssutils.ser.prefs + prefs.indent = tab_width * ' ' + prefs.indentClosingBrace = False + prefs.omitLastSemicolon = False + class PositionFinder(object): def __init__(self, raw): diff --git a/src/calibre/gui2/tweak_book/boss.py b/src/calibre/gui2/tweak_book/boss.py index 1f755dc186..45e14dcf9f 100644 --- a/src/calibre/gui2/tweak_book/boss.py +++ b/src/calibre/gui2/tweak_book/boss.py @@ -24,7 +24,7 @@ from calibre.ebooks.oeb.polish.pretty import fix_all_html, pretty_all from calibre.ebooks.oeb.polish.replace import rename_files, replace_file, get_recommended_folders, rationalize_folders from calibre.ebooks.oeb.polish.split import split, merge, AbortError, multisplit from calibre.ebooks.oeb.polish.toc import remove_names_from_toc, find_existing_toc -from calibre.ebooks.oeb.polish.utils import link_stylesheets +from calibre.ebooks.oeb.polish.utils import link_stylesheets, setup_cssutils_serialization as scs from calibre.gui2 import error_dialog, choose_files, question_dialog, info_dialog, choose_save_file from calibre.gui2.dialogs.confirm_delete import confirm from calibre.gui2.tweak_book import set_current_container, current_container, tprefs, actions, editors @@ -54,11 +54,7 @@ def get_container(*args, **kwargs): return container def setup_cssutils_serialization(): - import cssutils - prefs = cssutils.ser.prefs - prefs.indent = tprefs['editor_tab_stop_width'] * ' ' - prefs.indentClosingBrace = False - prefs.omitLastSemicolon = False + scs(tprefs['editor_tab_stop_width']) class BusyCursor(object): diff --git a/src/calibre/gui2/tweak_book/diff/main.py b/src/calibre/gui2/tweak_book/diff/main.py index 81f2603551..db9c33d3f6 100644 --- a/src/calibre/gui2/tweak_book/diff/main.py +++ b/src/calibre/gui2/tweak_book/diff/main.py @@ -257,7 +257,7 @@ class Diff(Dialog): for i in (3, 5, 10, 50): cm.addAction(_('Show %d lines of context') % i, partial(self.change_context, i)) cm.addAction(_('Show all text'), partial(self.change_context, None)) - m.addAction(_('Beautify HTML/XML files before comparing them'), partial(self.change_beautify, True)) + m.addAction(_('Beautify files before comparing them'), partial(self.change_beautify, True)) m.addMenu(cm) l.addWidget(b, l.rowCount() - 1, l.columnCount(), 1, 1) diff --git a/src/calibre/gui2/tweak_book/diff/view.py b/src/calibre/gui2/tweak_book/diff/view.py index dcbdc85593..9dc377b85e 100644 --- a/src/calibre/gui2/tweak_book/diff/view.py +++ b/src/calibre/gui2/tweak_book/diff/view.py @@ -53,6 +53,19 @@ def beautify_text(raw, syntax): if syntax == 'xml': root = etree.fromstring(strip_encoding_declarations(raw)) pretty_xml_tree(root) + elif syntax == 'css': + import logging + from calibre.ebooks.oeb.base import serialize, _css_logger + from calibre.ebooks.oeb.polish.utils import setup_cssutils_serialization + from cssutils import CSSParser, log + setup_cssutils_serialization(tprefs['editor_tab_stop_width']) + log.setLevel(logging.WARN) + log.raiseExceptions = False + parser = CSSParser(loglevel=logging.WARNING, + # We dont care about @import rules + fetcher=lambda x: (None, None), log=_css_logger) + data = parser.parseString(raw, href='', validate=False) + return serialize(data, 'text/css') else: root = parse(raw, line_numbers=False) pretty_html_tree(None, root) @@ -668,7 +681,7 @@ class DiffSplit(QSplitter): # {{{ def add_text_diff(self, left_text, right_text, context, syntax, beautify=False): left_text = unicodedata.normalize('NFC', left_text) right_text = unicodedata.normalize('NFC', right_text) - if beautify and syntax in {'xml', 'html'}: + if beautify and syntax in {'xml', 'html', 'css'}: left_text, right_text = beautify_text(left_text, syntax), beautify_text(right_text, syntax) left_lines = self.left_lines = left_text.splitlines() right_lines = self.right_lines = right_text.splitlines()