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
+