diff --git a/src/calibre/gui2/tweak_book/editor/syntax/base.py b/src/calibre/gui2/tweak_book/editor/syntax/base.py index e9ce07dfb9..4524bd1934 100644 --- a/src/calibre/gui2/tweak_book/editor/syntax/base.py +++ b/src/calibre/gui2/tweak_book/editor/syntax/base.py @@ -19,13 +19,12 @@ class SimpleState(object): def value(self): return self.parse -def run_loop(state, state_map, set_format, formats, text): +def run_loop(state, state_map, formats, text): i = 0 while i < len(text): fmt = state_map[state.parse](state, text, i, formats) for num, f in fmt: - if f is not None: - set_format(i, num, f) + yield i, num, f i += num class SyntaxHighlighter(QSyntaxHighlighter): @@ -57,7 +56,9 @@ class SyntaxHighlighter(QSyntaxHighlighter): if state == -1: state = 0 state = self.state_class(state) - run_loop(state, self.state_map, self.setFormat, self.formats, unicode(text)) + for i, num, fmt in run_loop(state, self.state_map, self.formats, unicode(text)): + if fmt is not None: + self.setFormat(i, num, fmt) self.setCurrentBlockState(state.value) except: import traceback diff --git a/src/calibre/gui2/tweak_book/editor/syntax/html.py b/src/calibre/gui2/tweak_book/editor/syntax/html.py index c9aa5a6f73..189c67706e 100644 --- a/src/calibre/gui2/tweak_book/editor/syntax/html.py +++ b/src/calibre/gui2/tweak_book/editor/syntax/html.py @@ -10,7 +10,9 @@ import re from PyQt4.Qt import (QTextCharFormat, QFont) -from calibre.gui2.tweak_book.editor.syntax.base import SyntaxHighlighter +from calibre.gui2.tweak_book.editor.syntax.base import SyntaxHighlighter, run_loop +from calibre.gui2.tweak_book.editor.syntax.css import create_formats as create_css_formats, state_map as css_state_map, State as CSSState + from html5lib.constants import cdataElements, rcdataElements cdata_tags = cdataElements | rcdataElements @@ -43,6 +45,7 @@ class State(object): SQ_VAL = 8 DQ_VAL = 9 CDATA = 10 + CSS = 11 TAGS = {x:i+1 for i, x in enumerate(cdata_tags | bold_tags | italic_tags)} TAGS_RMAP = {v:k for k, v in TAGS.iteritems()} @@ -53,15 +56,43 @@ class State(object): self.bold = (num >> 4) & 0b11111111 self.italic = (num >> 12) & 0b11111111 self.tag = self.TAGS_RMAP.get(num >> 20, self.UNKNOWN_TAG) + self.css = 0 + if self.parse == State.CSS: + self.css = num >> 4 @property def value(self): + if self.parse == State.CSS: + return ((self.parse & 0b1111) | (self.css << 4)) tag = self.TAGS.get(self.tag.lower(), 0) return ((self.parse & 0b1111) | ((max(0, self.bold) & 0b11111111) << 4) | ((max(0, self.italic) & 0b11111111) << 12) | (tag << 20)) + def clear(self): + self.parse = self.bold = self.italic = self.css = 0 + self.tag = self.UNKNOWN_TAG + +def css(state, text, i, formats): + ' Inside a +