1#!/usr/local/bin/python3.8
2# vim:fileencoding=utf-8
3
4
5__license__ = 'GPL v3'
6__copyright__ = '2013, Kovid Goyal <kovid at kovidgoyal.net>'
7
8from qt.core import QTextCharFormat, QTextFormat
9
10from calibre.ebooks.oeb.base import OEB_DOCS, OEB_STYLES
11from calibre.ebooks.oeb.polish.container import guess_type
12
13_xml_types = {'application/oebps-page-map+xml', 'application/vnd.adobe-page-template+xml', 'application/page-template+xml'} | {
14            guess_type('a.'+x) for x in ('ncx', 'opf', 'svg', 'xpgt', 'xml')}
15_js_types = {'application/javascript', 'application/x-javascript'}
16
17
18def syntax_from_mime(name, mime):
19    for syntax, types in (('html', OEB_DOCS), ('css', OEB_STYLES), ('xml', _xml_types)):
20        if mime in types:
21            return syntax
22    if mime in _js_types:
23        return 'javascript'
24    if mime.startswith('text/'):
25        return 'text'
26    if mime.startswith('image/') and mime.partition('/')[-1].lower() in {
27        'jpeg', 'jpg', 'gif', 'png', 'webp'}:
28        return 'raster_image'
29    if mime.endswith('+xml'):
30        return 'xml'
31
32
33all_text_syntaxes = frozenset({'text', 'html', 'xml', 'css', 'javascript'})
34
35
36def editor_from_syntax(syntax, parent=None):
37    if syntax in all_text_syntaxes:
38        from calibre.gui2.tweak_book.editor.widget import Editor
39        return Editor(syntax, parent=parent)
40    elif syntax == 'raster_image':
41        from calibre.gui2.tweak_book.editor.image import Editor
42        return Editor(syntax, parent=parent)
43
44
45SYNTAX_PROPERTY = QTextFormat.Property.UserProperty
46SPELL_PROPERTY = SYNTAX_PROPERTY + 1
47SPELL_LOCALE_PROPERTY = SPELL_PROPERTY + 1
48LINK_PROPERTY = SPELL_LOCALE_PROPERTY + 1
49TAG_NAME_PROPERTY = LINK_PROPERTY + 1
50CSS_PROPERTY = TAG_NAME_PROPERTY + 1
51CLASS_ATTRIBUTE_PROPERTY = CSS_PROPERTY + 1
52
53
54def syntax_text_char_format(*args):
55    ans = QTextCharFormat(*args)
56    ans.setProperty(SYNTAX_PROPERTY, True)
57    return ans
58
59
60class StoreLocale:
61
62    __slots__ = ('enabled',)
63
64    def __init__(self):
65        self.enabled = False
66
67    def __enter__(self):
68        self.enabled = True
69
70    def __exit__(self, *args):
71        self.enabled = False
72
73
74store_locale = StoreLocale()
75