1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
|
"""
This module contains core code edits:
- TextEdit: code edit specialised for plain text
- GenericCodeEdit: generic code editor, not that smart and slow.
Use it as a fallback and look other pyqode packages for language
specific cod edits.
"""
import sys
from pyqode.core.backend import server
from pyqode.core.api import CodeEdit, Panel, SyntaxHighlighter, \
CharBasedFoldDetector, IndentFoldDetector, ColorScheme
class TextCodeEdit(CodeEdit):
"""
CodeEdit specialised for plain text.
Especially useful for long text file such as log files because it's syntax
highlighter does not do anything.
"""
class TextSH(SyntaxHighlighter):
"""
Empty highlighter, does not do anything (very fast at loading very
big files).
"""
def highlight_block(self, text, user_data):
"""
Does nothing
"""
pass
mimetypes = ['text/x-plain', 'text/x-log', 'text/plain']
DEFAULT_SERVER = server.__file__
def __init__(self, parent=None, server_script=None,
interpreter=sys.executable, args=None,
create_default_actions=True, color_scheme='qt',
reuse_backend=False):
from pyqode.core import panels
from pyqode.core import modes
if server_script is None:
server_script = TextCodeEdit.DEFAULT_SERVER
super(TextCodeEdit, self).__init__(parent, create_default_actions)
self.backend.start(server_script, interpreter, args,
reuse=reuse_backend)
# append panels
self.panels.append(panels.SearchAndReplacePanel(),
Panel.Position.BOTTOM)
self.panels.append(panels.FoldingPanel())
self.panels.append(panels.LineNumberPanel())
# append modes
self.modes.append(modes.AutoCompleteMode())
self.modes.append(modes.ExtendedSelectionMode())
self.modes.append(modes.CaseConverterMode())
self.modes.append(modes.FileWatcherMode())
self.modes.append(modes.CaretLineHighlighterMode())
self.modes.append(modes.RightMarginMode())
self.modes.append(TextCodeEdit.TextSH(
self.document(), ColorScheme(color_scheme)))
self.modes.append(modes.ZoomMode())
self.modes.append(modes.OccurrencesHighlighterMode())
self.modes.append(modes.CodeCompletionMode())
self.modes.append(modes.AutoIndentMode())
self.modes.append(modes.IndenterMode())
self.modes.append(modes.SymbolMatcherMode())
self.panels.append(panels.EncodingPanel(), Panel.Position.TOP)
self.panels.append(panels.ReadOnlyPanel(), Panel.Position.TOP)
def clone(self):
clone = self.__class__(
parent=self.parent(), server_script=self.backend.server_script,
interpreter=self.backend.interpreter, args=self.backend.args,
color_scheme=self.syntax_highlighter.color_scheme.name)
return clone
class GenericCodeEdit(CodeEdit):
"""
This generic code edit uses the PygmentSH for syntax highlighting and
commpletion engine based on the document words. It is not very smart and
is probably 2 times slower than a native specialised code edit.
It is meant to be used as a fallback editor in case you're missing a
specialised editor.
"""
# generic
mimetypes = []
#: the list of mimetypes that use char based fold detector
_char_based_mimetypes = [
'text/x-php',
'text/x-c++hdr',
'text/x-c++src',
'text/x-chdr',
'text/x-csrc',
'text/x-csharp',
'application/javascript'
]
DEFAULT_SERVER = server.__file__
def __init__(self, parent=None, server_script=None,
interpreter=sys.executable, args=None,
create_default_actions=True, color_scheme='qt',
reuse_backend=False):
super(GenericCodeEdit, self).__init__(parent, create_default_actions)
from pyqode.core import panels
from pyqode.core import modes
if server_script is None:
server_script = GenericCodeEdit.DEFAULT_SERVER
self.backend.start(server_script, interpreter, args,
reuse=reuse_backend)
# append panels
self.panels.append(panels.LineNumberPanel())
self.panels.append(panels.SearchAndReplacePanel(),
Panel.Position.BOTTOM)
self.panels.append(panels.FoldingPanel())
# append modes
self.modes.append(modes.CursorHistoryMode())
self.modes.append(modes.AutoCompleteMode())
self.modes.append(modes.ExtendedSelectionMode())
self.modes.append(modes.CaseConverterMode())
self.modes.append(modes.FileWatcherMode())
self.modes.append(modes.CaretLineHighlighterMode())
self.modes.append(modes.RightMarginMode())
self.modes.append(modes.PygmentsSyntaxHighlighter(
self.document(), color_scheme=ColorScheme(color_scheme)))
self.modes.append(modes.ZoomMode())
self.modes.append(modes.CodeCompletionMode())
self.modes.append(modes.AutoIndentMode())
self.modes.append(modes.IndenterMode())
self.modes.append(modes.SymbolMatcherMode())
self.modes.append(modes.OccurrencesHighlighterMode())
self.modes.append(modes.SmartBackSpaceMode())
self.panels.append(panels.EncodingPanel(), Panel.Position.TOP)
self.panels.append(panels.ReadOnlyPanel(), Panel.Position.TOP)
def setPlainText(self, txt, mime_type='', encoding=''):
if mime_type is None:
mime_type = self.file.mimetype
if encoding is None:
encoding = self.file.encoding
try:
self.syntax_highlighter.set_lexer_from_filename(self.file.path)
try:
mimetype = self.syntax_highlighter._lexer.mimetypes[0]
except (AttributeError, IndexError):
mimetype = ''
if mimetype in self._char_based_mimetypes:
self.syntax_highlighter.fold_detector = CharBasedFoldDetector()
else:
self.syntax_highlighter.fold_detector = IndentFoldDetector()
except AttributeError:
# syntax highlighter removed, e.g. file size > FileManager.limit
pass
super(GenericCodeEdit, self).setPlainText(txt, mime_type, encoding)
def clone(self):
clone = self.__class__(
parent=self.parent(), server_script=self.backend.server_script,
interpreter=self.backend.interpreter, args=self.backend.args,
color_scheme=self.syntax_highlighter.color_scheme.name)
return clone
|