PrEditor 0.0.0.dev1__py2.py3-none-any.whl → 0.1.0__py2.py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of PrEditor might be problematic. Click here for more details.
- PrEditor-0.1.0.dist-info/LICENSE +165 -0
- PrEditor-0.1.0.dist-info/METADATA +212 -0
- PrEditor-0.1.0.dist-info/RECORD +149 -0
- {PrEditor-0.0.0.dev1.dist-info → PrEditor-0.1.0.dist-info}/WHEEL +1 -1
- PrEditor-0.1.0.dist-info/entry_points.txt +18 -0
- PrEditor-0.1.0.dist-info/top_level.txt +1 -0
- preditor/__init__.py +301 -0
- {blurdev → preditor}/__main__.py +13 -13
- preditor/about_module.py +166 -0
- preditor/cli.py +192 -0
- {blurdev → preditor}/contexts.py +119 -119
- preditor/cores/core.py +65 -0
- preditor/dccs/maya/PrEditor_maya.mod +2 -0
- preditor/dccs/maya/plug-ins/PrEditor_maya.py +108 -0
- preditor/debug.py +294 -0
- blurdev/scintilla/delayable_engine.py → preditor/delayable_engine/__init__.py +310 -299
- blurdev/scintilla/delayables/base.py → preditor/delayable_engine/delayables.py +85 -85
- {blurdev → preditor}/enum.py +728 -1003
- {blurdev → preditor}/gui/__init__.py +84 -125
- preditor/gui/app.py +159 -0
- {blurdev → preditor}/gui/codehighlighter.py +209 -219
- {blurdev → preditor}/gui/completer.py +226 -236
- {blurdev → preditor}/gui/console.py +801 -858
- {blurdev → preditor}/gui/dialog.py +200 -216
- preditor/gui/drag_tab_bar.py +190 -0
- preditor/gui/editor_chooser.py +57 -0
- {blurdev → preditor}/gui/errordialog.py +100 -97
- preditor/gui/fuzzy_search/fuzzy_search.py +93 -0
- preditor/gui/group_tab_widget/__init__.py +319 -0
- preditor/gui/group_tab_widget/grouped_tab_menu.py +35 -0
- preditor/gui/group_tab_widget/grouped_tab_models.py +108 -0
- preditor/gui/group_tab_widget/grouped_tab_widget.py +75 -0
- preditor/gui/group_tab_widget/one_tab_widget.py +54 -0
- preditor/gui/level_buttons.py +349 -0
- {blurdev → preditor}/gui/logger_window_handler.py +46 -45
- {blurdev → preditor}/gui/loggerwindow.py +1205 -1417
- {blurdev → preditor}/gui/newtabwidget.py +69 -68
- {blurdev → preditor}/gui/redmine_login_dialog.py +63 -61
- {blurdev → preditor}/gui/set_text_editor_path_dialog.py +59 -57
- preditor/gui/ui/editor_chooser.ui +93 -0
- {blurdev → preditor}/gui/ui/errordialog.ui +81 -81
- {blurdev → preditor}/gui/ui/loggerwindow.ui +1030 -864
- {blurdev → preditor}/gui/ui/redmine_login_dialog.ui +124 -124
- {blurdev → preditor}/gui/ui/set_text_editor_path_dialog.ui +149 -149
- {blurdev → preditor}/gui/window.py +183 -199
- preditor/gui/workbox_mixin.py +357 -0
- preditor/gui/workbox_text_edit.py +117 -0
- preditor/gui/workboxwidget.py +276 -0
- preditor/logging_config.py +52 -0
- preditor/osystem.py +401 -0
- preditor/plugins.py +65 -0
- preditor/prefs.py +74 -0
- {blurdev → preditor}/resource/environment_variables.html +26 -38
- {blurdev → preditor}/resource/error_mail.html +85 -85
- {blurdev → preditor}/resource/error_mail_inline.html +41 -41
- preditor/resource/img/README.md +7 -0
- preditor/resource/img/arrow_forward.png +0 -0
- preditor/resource/img/check-bold.png +0 -0
- preditor/resource/img/chevron-down.png +0 -0
- preditor/resource/img/chevron-up.png +0 -0
- preditor/resource/img/close-thick.png +0 -0
- preditor/resource/img/comment-edit.png +0 -0
- preditor/resource/img/content-copy.png +0 -0
- preditor/resource/img/content-cut.png +0 -0
- preditor/resource/img/content-duplicate.png +0 -0
- preditor/resource/img/content-paste.png +0 -0
- preditor/resource/img/content-save.png +0 -0
- preditor/resource/img/debug_disabled.png +0 -0
- preditor/resource/img/eye-check.png +0 -0
- preditor/resource/img/file-plus.png +0 -0
- preditor/resource/img/file-remove.png +0 -0
- preditor/resource/img/format-align-left.png +0 -0
- preditor/resource/img/format-letter-case-lower.png +0 -0
- preditor/resource/img/format-letter-case-upper.png +0 -0
- preditor/resource/img/information.png +0 -0
- preditor/resource/img/logging_critical.png +0 -0
- preditor/resource/img/logging_custom.png +0 -0
- preditor/resource/img/logging_debug.png +0 -0
- preditor/resource/img/logging_error.png +0 -0
- preditor/resource/img/logging_info.png +0 -0
- preditor/resource/img/logging_not_set.png +0 -0
- preditor/resource/img/logging_warning.png +0 -0
- preditor/resource/img/marker.png +0 -0
- preditor/resource/img/play.png +0 -0
- preditor/resource/img/playlist-play.png +0 -0
- preditor/resource/img/plus-minus-variant.png +0 -0
- preditor/resource/img/preditor.ico +0 -0
- preditor/resource/img/preditor.png +0 -0
- preditor/resource/img/preditor.psd +0 -0
- preditor/resource/img/preditor.svg +44 -0
- preditor/resource/img/restart.svg +1 -0
- preditor/resource/img/skip-forward-outline.png +0 -0
- preditor/resource/img/skip-next-outline.png +0 -0
- preditor/resource/img/skip-next.png +0 -0
- preditor/resource/img/skip-previous.png +0 -0
- preditor/resource/img/subdirectory-arrow-right.png +0 -0
- preditor/resource/img/text-search-variant.png +0 -0
- {blurdev → preditor}/resource/lang/python.json +30 -30
- preditor/resource/settings.ini +25 -0
- {blurdev/resource/stylesheet/logger → preditor/resource/stylesheet}/Bright.css +56 -61
- {blurdev → preditor}/resource/stylesheet/Dark.css +190 -132
- {blurdev → preditor}/scintilla/__init__.py +22 -28
- preditor/scintilla/delayables/__init__.py +11 -0
- {blurdev → preditor}/scintilla/delayables/smart_highlight.py +94 -93
- {blurdev → preditor}/scintilla/delayables/spell_check.py +173 -172
- {blurdev → preditor}/scintilla/documenteditor.py +2039 -2115
- {blurdev → preditor}/scintilla/finddialog.py +68 -81
- {blurdev → preditor}/scintilla/lang/__init__.py +80 -93
- {blurdev → preditor}/scintilla/lang/config/bash.ini +15 -15
- {blurdev → preditor}/scintilla/lang/config/batch.ini +14 -14
- {blurdev → preditor}/scintilla/lang/config/cpp.ini +19 -19
- {blurdev → preditor}/scintilla/lang/config/css.ini +19 -19
- {blurdev → preditor}/scintilla/lang/config/eyeonscript.ini +17 -17
- {blurdev → preditor}/scintilla/lang/config/html.ini +21 -21
- {blurdev → preditor}/scintilla/lang/config/javascript.ini +24 -24
- {blurdev → preditor}/scintilla/lang/config/lua.ini +16 -16
- {blurdev → preditor}/scintilla/lang/config/maxscript.ini +20 -20
- {blurdev → preditor}/scintilla/lang/config/mel.ini +18 -18
- {blurdev → preditor}/scintilla/lang/config/mu.ini +22 -22
- {blurdev → preditor}/scintilla/lang/config/nsi.ini +5 -5
- {blurdev → preditor}/scintilla/lang/config/perl.ini +19 -19
- {blurdev → preditor}/scintilla/lang/config/puppet.ini +19 -19
- {blurdev → preditor}/scintilla/lang/config/python.ini +28 -28
- {blurdev → preditor}/scintilla/lang/config/ruby.ini +19 -19
- {blurdev → preditor}/scintilla/lang/config/sql.ini +7 -7
- {blurdev → preditor}/scintilla/lang/config/xml.ini +21 -21
- {blurdev → preditor}/scintilla/lang/config/yaml.ini +18 -18
- {blurdev → preditor}/scintilla/lang/language.py +240 -250
- preditor/scintilla/lexers/__init__.py +0 -0
- {blurdev → preditor}/scintilla/lexers/cpplexer.py +21 -30
- {blurdev → preditor}/scintilla/lexers/javascriptlexer.py +25 -34
- {blurdev → preditor}/scintilla/lexers/maxscriptlexer.py +234 -253
- {blurdev → preditor}/scintilla/lexers/mellexer.py +368 -376
- {blurdev → preditor}/scintilla/lexers/mulexer.py +32 -41
- {blurdev → preditor}/scintilla/lexers/pythonlexer.py +41 -50
- {blurdev → preditor}/scintilla/ui/finddialog.ui +160 -160
- preditor/settings.py +71 -0
- preditor/stream/__init__.py +80 -0
- preditor/stream/director.py +56 -0
- preditor/stream/manager.py +74 -0
- preditor/streamhandler_helper.py +46 -0
- preditor/utils/__init__.py +0 -0
- preditor/utils/cute.py +30 -0
- preditor/utils/stylesheets.py +54 -0
- {blurdev → preditor}/version.py +5 -5
- preditor/weakref.py +363 -0
- PrEditor-0.0.0.dev1.dist-info/METADATA +0 -51
- PrEditor-0.0.0.dev1.dist-info/RECORD +0 -279
- PrEditor-0.0.0.dev1.dist-info/top_level.txt +0 -1
- blurdev/__init__.py +0 -356
- blurdev/cores/__init__.py +0 -98
- blurdev/cores/application.py +0 -26
- blurdev/cores/core.py +0 -634
- blurdev/debug.py +0 -593
- blurdev/external.py +0 -391
- blurdev/gui/level_buttons.py +0 -585
- blurdev/gui/workboxwidget.py +0 -205
- blurdev/logger.py +0 -238
- blurdev/osystem.py +0 -813
- blurdev/prefs.py +0 -33
- blurdev/protocols/__init__.py +0 -71
- blurdev/protocols/write_std_output_handler.py +0 -83
- blurdev/resource/designer_plugins.xml +0 -9
- blurdev/resource/error_email_old.html +0 -41
- blurdev/resource/img/add.png +0 -0
- blurdev/resource/img/ajax-loader.gif +0 -0
- blurdev/resource/img/application.png +0 -0
- blurdev/resource/img/applications.png +0 -0
- blurdev/resource/img/assburner.png +0 -0
- blurdev/resource/img/assfreezer.png +0 -0
- blurdev/resource/img/bar.gif +0 -0
- blurdev/resource/img/blank.png +0 -0
- blurdev/resource/img/blurdev.png +0 -0
- blurdev/resource/img/calendar_disabled.png +0 -0
- blurdev/resource/img/calendar_enabled.png +0 -0
- blurdev/resource/img/cancel.png +0 -0
- blurdev/resource/img/custom.png +0 -0
- blurdev/resource/img/debug_high.png +0 -0
- blurdev/resource/img/debug_low.png +0 -0
- blurdev/resource/img/debug_mid.png +0 -0
- blurdev/resource/img/debug_off.png +0 -0
- blurdev/resource/img/django.png +0 -0
- blurdev/resource/img/doc.png +0 -0
- blurdev/resource/img/edit.png +0 -0
- blurdev/resource/img/elemental.png +0 -0
- blurdev/resource/img/explore.png +0 -0
- blurdev/resource/img/favorite.png +0 -0
- blurdev/resource/img/file.png +0 -0
- blurdev/resource/img/folder.png +0 -0
- blurdev/resource/img/ide/add.png +0 -0
- blurdev/resource/img/ide/add_note.png +0 -0
- blurdev/resource/img/ide/arrow_down.png +0 -0
- blurdev/resource/img/ide/arrow_up.png +0 -0
- blurdev/resource/img/ide/check.png +0 -0
- blurdev/resource/img/ide/class.png +0 -0
- blurdev/resource/img/ide/clean.png +0 -0
- blurdev/resource/img/ide/clearlog.png +0 -0
- blurdev/resource/img/ide/close.png +0 -0
- blurdev/resource/img/ide/comment_add.png +0 -0
- blurdev/resource/img/ide/comment_remove.png +0 -0
- blurdev/resource/img/ide/comment_toggle.png +0 -0
- blurdev/resource/img/ide/console.png +0 -0
- blurdev/resource/img/ide/copy.png +0 -0
- blurdev/resource/img/ide/copylstrip.png +0 -0
- blurdev/resource/img/ide/cut.png +0 -0
- blurdev/resource/img/ide/edit.png +0 -0
- blurdev/resource/img/ide/find.png +0 -0
- blurdev/resource/img/ide/find_replace.png +0 -0
- blurdev/resource/img/ide/findnext.png +0 -0
- blurdev/resource/img/ide/findprev.png +0 -0
- blurdev/resource/img/ide/folder_find.png +0 -0
- blurdev/resource/img/ide/function.png +0 -0
- blurdev/resource/img/ide/git-bash.png +0 -0
- blurdev/resource/img/ide/git-gui.png +0 -0
- blurdev/resource/img/ide/gitk.png +0 -0
- blurdev/resource/img/ide/goto.png +0 -0
- blurdev/resource/img/ide/goto_def.png +0 -0
- blurdev/resource/img/ide/help.png +0 -0
- blurdev/resource/img/ide/highlighter.png +0 -0
- blurdev/resource/img/ide/lowercase.png +0 -0
- blurdev/resource/img/ide/newfile.png +0 -0
- blurdev/resource/img/ide/newfolder.png +0 -0
- blurdev/resource/img/ide/newproject.png +0 -0
- blurdev/resource/img/ide/newwizard.png +0 -0
- blurdev/resource/img/ide/open.png +0 -0
- blurdev/resource/img/ide/paste.png +0 -0
- blurdev/resource/img/ide/pdb_continue.png +0 -0
- blurdev/resource/img/ide/pdb_down.png +0 -0
- blurdev/resource/img/ide/pdb_next.png +0 -0
- blurdev/resource/img/ide/pdb_step.png +0 -0
- blurdev/resource/img/ide/pdb_up.png +0 -0
- blurdev/resource/img/ide/plus_minus.png +0 -0
- blurdev/resource/img/ide/preferences.png +0 -0
- blurdev/resource/img/ide/project_find.png +0 -0
- blurdev/resource/img/ide/python.png +0 -0
- blurdev/resource/img/ide/pyular.png +0 -0
- blurdev/resource/img/ide/qt.png +0 -0
- blurdev/resource/img/ide/quit.png +0 -0
- blurdev/resource/img/ide/redo.png +0 -0
- blurdev/resource/img/ide/refresh.png +0 -0
- blurdev/resource/img/ide/remove.png +0 -0
- blurdev/resource/img/ide/ruler.png +0 -0
- blurdev/resource/img/ide/run.png +0 -0
- blurdev/resource/img/ide/runall.png +0 -0
- blurdev/resource/img/ide/runallclear.png +0 -0
- blurdev/resource/img/ide/runselected.png +0 -0
- blurdev/resource/img/ide/runselectedclear.png +0 -0
- blurdev/resource/img/ide/save.png +0 -0
- blurdev/resource/img/ide/saveas.png +0 -0
- blurdev/resource/img/ide/sdk.png +0 -0
- blurdev/resource/img/ide/separator.png +0 -0
- blurdev/resource/img/ide/tabbed.png +0 -0
- blurdev/resource/img/ide/tile.png +0 -0
- blurdev/resource/img/ide/toolbar.png +0 -0
- blurdev/resource/img/ide/undo.png +0 -0
- blurdev/resource/img/ide/uppercase.png +0 -0
- blurdev/resource/img/ide/view_as.png +0 -0
- blurdev/resource/img/ide/windowed.png +0 -0
- blurdev/resource/img/ide.ico +0 -0
- blurdev/resource/img/ide.png +0 -0
- blurdev/resource/img/ide48.png +0 -0
- blurdev/resource/img/info.png +0 -0
- blurdev/resource/img/legacy tool.png +0 -0
- blurdev/resource/img/library.png +0 -0
- blurdev/resource/img/logger/about.png +0 -0
- blurdev/resource/img/logger/arrow_forward.png +0 -0
- blurdev/resource/img/logger/clear.png +0 -0
- blurdev/resource/img/logger/close.png +0 -0
- blurdev/resource/img/logger/debug_disabled.png +0 -0
- blurdev/resource/img/logger/debug_high.png +0 -0
- blurdev/resource/img/logger/debug_low.png +0 -0
- blurdev/resource/img/logger/debug_mid.png +0 -0
- blurdev/resource/img/logger/down.png +0 -0
- blurdev/resource/img/logger/find.png +0 -0
- blurdev/resource/img/logger/logging_critical.png +0 -0
- blurdev/resource/img/logger/logging_debug.png +0 -0
- blurdev/resource/img/logger/logging_error.png +0 -0
- blurdev/resource/img/logger/logging_info.png +0 -0
- blurdev/resource/img/logger/logging_not_set.png +0 -0
- blurdev/resource/img/logger/logging_warning.png +0 -0
- blurdev/resource/img/logger/next.png +0 -0
- blurdev/resource/img/logger/play.png +0 -0
- blurdev/resource/img/logger/playlist_play.png +0 -0
- blurdev/resource/img/logger/previous.png +0 -0
- blurdev/resource/img/logger/return.png +0 -0
- blurdev/resource/img/logger/save.png +0 -0
- blurdev/resource/img/logger/subdirectory_arrow_right.png +0 -0
- blurdev/resource/img/logger/up.png +0 -0
- blurdev/resource/img/lovebar.png +0 -0
- blurdev/resource/img/new.png +0 -0
- blurdev/resource/img/new_selected.png +0 -0
- blurdev/resource/img/node.png +0 -0
- blurdev/resource/img/ok.png +0 -0
- blurdev/resource/img/options.png +0 -0
- blurdev/resource/img/packages.png +0 -0
- blurdev/resource/img/preview/add.png +0 -0
- blurdev/resource/img/preview/brush.png +0 -0
- blurdev/resource/img/preview/delete.png +0 -0
- blurdev/resource/img/preview/delte.png +0 -0
- blurdev/resource/img/preview/fill.png +0 -0
- blurdev/resource/img/preview/layers.png +0 -0
- blurdev/resource/img/preview/media.png +0 -0
- blurdev/resource/img/preview/navigate.png +0 -0
- blurdev/resource/img/preview/pencil.png +0 -0
- blurdev/resource/img/preview/select.png +0 -0
- blurdev/resource/img/preview/type.png +0 -0
- blurdev/resource/img/preview/visible.png +0 -0
- blurdev/resource/img/project.png +0 -0
- blurdev/resource/img/python_logger.ico +0 -0
- blurdev/resource/img/python_logger.png +0 -0
- blurdev/resource/img/refresh.png +0 -0
- blurdev/resource/img/remove.png +0 -0
- blurdev/resource/img/reset.png +0 -0
- blurdev/resource/img/richtext/font_bold.png +0 -0
- blurdev/resource/img/richtext/font_italic.png +0 -0
- blurdev/resource/img/richtext/link_image.png +0 -0
- blurdev/resource/img/richtext/spell_check.png +0 -0
- blurdev/resource/img/richtext/unordered_list.png +0 -0
- blurdev/resource/img/save.png +0 -0
- blurdev/resource/img/savesettings.png +0 -0
- blurdev/resource/img/settings.png +0 -0
- blurdev/resource/img/tool.png +0 -0
- blurdev/resource/img/toolbarHandleHorizontal.png +0 -0
- blurdev/resource/img/toolbarHandleVertical.png +0 -0
- blurdev/resource/img/trash.png +0 -0
- blurdev/resource/img/trax.png +0 -0
- blurdev/resource/img/tree.png +0 -0
- blurdev/resource/img/treegrunt.ico +0 -0
- blurdev/resource/img/treegrunt.png +0 -0
- blurdev/resource/img/treegruntedit.png +0 -0
- blurdev/resource/img/user interface.png +0 -0
- blurdev/resource/img/warning.png +0 -0
- blurdev/resource/img/watermark.png +0 -0
- blurdev/resource/sdk/blurdev.sdk +0 -3
- blurdev/resource/settings.ini +0 -82
- blurdev/resource/softimage/BlurApplication.dll +0 -0
- blurdev/resource/softimage/BlurApplication64.dll +0 -0
- blurdev/resource/stylesheet/Carbon.css +0 -35
- blurdev/resource/stylesheet/logger/Dark.css +0 -62
- blurdev/resource/templ/py_comment.templ +0 -1
- blurdev/resource/templ/py_debug_raise_error.templ +0 -7
- blurdev/resource/templ/py_doc_string.templ +0 -10
- blurdev/resource/templ/py_header.templ +0 -9
- blurdev/resource/templ/py_line_comment.templ +0 -1
- blurdev/resource/templ/py_log_to_file.templ +0 -22
- blurdev/resource/templ/py_module_path.templ +0 -1
- blurdev/resource/templ/py_pyqt_core.templ +0 -1
- blurdev/resource/templ/py_pyqt_gui.templ +0 -1
- blurdev/resource/templ/py_splashscreen.templ +0 -6
- blurdev/resource/templ/py_testing_note.templ +0 -1
- blurdev/resource/templ/py_testing_note_end.templ +0 -1
- blurdev/resource/tools_environments.json +0 -72
- blurdev/resource/tools_environments.xml +0 -11
- blurdev/resource/tools_environments_linux.xml +0 -11
- blurdev/resource/tools_environments_offline.xml +0 -7
- blurdev/runtimes/__init__.py +0 -2
- blurdev/runtimes/logger.py +0 -44
- blurdev/scintilla/delayables/__init__.py +0 -9
- blurdev/settings.py +0 -312
- blurdev/utils/error.py +0 -389
- {blurdev/scintilla/lexers → preditor/cores}/__init__.py +0 -0
- {blurdev/utils → preditor/gui/fuzzy_search}/__init__.py +0 -0
- {blurdev → preditor}/resource/img/warning-big.png +0 -0
|
@@ -1,172 +1,173 @@
|
|
|
1
|
-
from __future__ import print_function
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
from Qt.QtCore import Qt
|
|
9
|
-
from Qt.QtGui import QColor
|
|
10
|
-
|
|
11
|
-
from . import RangeDelayable
|
|
12
|
-
from .. import lang
|
|
13
|
-
|
|
14
|
-
logger = logging.getLogger(__name__)
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
try: # noqa: C901
|
|
18
|
-
import aspell
|
|
19
|
-
except ImportError:
|
|
20
|
-
# if we can't import aspell don't define the SpellCheckDelayable class
|
|
21
|
-
logger.debug('Unable to import aspell')
|
|
22
|
-
else:
|
|
23
|
-
|
|
24
|
-
class SpellCheckDelayable(RangeDelayable):
|
|
25
|
-
"""Spell check some text in the document.
|
|
26
|
-
|
|
27
|
-
IF the document is not visible, the spell check will be skipped.
|
|
28
|
-
|
|
29
|
-
Loop Args:
|
|
30
|
-
start_pos (int): The document position to start spell checking.
|
|
31
|
-
end_pos (int or None): The document position to stop spell checking.
|
|
32
|
-
If None, then check to the end of the document.
|
|
33
|
-
"""
|
|
34
|
-
|
|
35
|
-
indicator_number = 31
|
|
36
|
-
key = 'spell_check'
|
|
37
|
-
|
|
38
|
-
def __init__(self, engine):
|
|
39
|
-
super(SpellCheckDelayable, self).__init__(engine)
|
|
40
|
-
self.chunk_re = re.compile('([^A-Za-z0-9]*)([A-Za-z0-9]*)')
|
|
41
|
-
self.camel_case_re = re.compile(
|
|
42
|
-
'.+?(?:(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])|$)'
|
|
43
|
-
)
|
|
44
|
-
|
|
45
|
-
def add_document(self, document):
|
|
46
|
-
# Create the speller for the document
|
|
47
|
-
document.__speller__ = aspell.Speller()
|
|
48
|
-
|
|
49
|
-
# https://www.scintilla.org/ScintillaDox.html#SCI_INDICSETSTYLE
|
|
50
|
-
# https://qscintilla.com/#clickable_text/indicators
|
|
51
|
-
document.indicatorDefine(
|
|
52
|
-
QsciScintilla.SquiggleLowIndicator, self.indicator_number
|
|
53
|
-
)
|
|
54
|
-
document.SendScintilla(
|
|
55
|
-
QsciScintilla.SCI_SETINDICATORCURRENT, self.indicator_number
|
|
56
|
-
)
|
|
57
|
-
document.setIndicatorForegroundColor(QColor(Qt.red), self.indicator_number)
|
|
58
|
-
|
|
59
|
-
document.SCN_MODIFIED.connect(document.onTextModified)
|
|
60
|
-
|
|
61
|
-
# Update __speller__ dictionary with programming language words
|
|
62
|
-
# and force spellcheck of the document
|
|
63
|
-
self.reset_session(document)
|
|
64
|
-
|
|
65
|
-
def camel_case_split(self, identifier):
|
|
66
|
-
return [m.group(0) for m in self.camel_case_re.finditer(identifier)]
|
|
67
|
-
|
|
68
|
-
def clear_markings(self, document):
|
|
69
|
-
"""Remove markings made by this Delayable for the given document.
|
|
70
|
-
|
|
71
|
-
Args:
|
|
72
|
-
document (blurdev.scintilla.documenteditor.DocumentEditor): The document
|
|
73
|
-
to clear spell check markings from.
|
|
74
|
-
"""
|
|
75
|
-
document.SendScintilla(
|
|
76
|
-
QsciScintilla.SCI_SETINDICATORCURRENT, self.indicator_number
|
|
77
|
-
)
|
|
78
|
-
document.SendScintilla(
|
|
79
|
-
QsciScintilla.SCI_INDICATORCLEARRANGE, 0, len(document.text())
|
|
80
|
-
)
|
|
81
|
-
|
|
82
|
-
def loop(self, document, start_pos, end_pos):
|
|
83
|
-
# If end_pos is None, use the whole document
|
|
84
|
-
end_pos = len(document.text()) if end_pos is None else end_pos
|
|
85
|
-
match = next(self.chunk_re.finditer(document.text(start_pos, end_pos)))
|
|
86
|
-
if match:
|
|
87
|
-
start = start_pos
|
|
88
|
-
space, result = tuple(match.groups())
|
|
89
|
-
if space:
|
|
90
|
-
# If the user inserted space between two words, that space
|
|
91
|
-
# will still be marked as incorrect. Clear its indicator.
|
|
92
|
-
document.SendScintilla(
|
|
93
|
-
QsciScintilla.SCI_SETINDICATORCURRENT, self.indicator_number
|
|
94
|
-
)
|
|
95
|
-
document.SendScintilla(
|
|
96
|
-
QsciScintilla.SCI_INDICATORCLEARRANGE, start, len(space)
|
|
97
|
-
)
|
|
98
|
-
start += len(space)
|
|
99
|
-
for word in self.camel_case_split(result):
|
|
100
|
-
length_word = len(word)
|
|
101
|
-
if any(
|
|
102
|
-
letter in string.digits for letter in word
|
|
103
|
-
) or document.__speller__.check(word):
|
|
104
|
-
document.SendScintilla(
|
|
105
|
-
QsciScintilla.SCI_SETINDICATORCURRENT, self.indicator_number
|
|
106
|
-
)
|
|
107
|
-
document.SendScintilla(
|
|
108
|
-
QsciScintilla.SCI_INDICATORCLEARRANGE, start, length_word
|
|
109
|
-
)
|
|
110
|
-
else:
|
|
111
|
-
document.SendScintilla(
|
|
112
|
-
QsciScintilla.SCI_SETINDICATORCURRENT, self.indicator_number
|
|
113
|
-
)
|
|
114
|
-
document.SendScintilla(
|
|
115
|
-
QsciScintilla.SCI_INDICATORFILLRANGE, start, length_word
|
|
116
|
-
)
|
|
117
|
-
start += length_word
|
|
118
|
-
|
|
119
|
-
if start < end_pos:
|
|
120
|
-
# There is more text to process
|
|
121
|
-
return (start, end_pos)
|
|
122
|
-
|
|
123
|
-
return
|
|
124
|
-
|
|
125
|
-
def remove_document(self, document):
|
|
126
|
-
try:
|
|
127
|
-
document.SCN_MODIFIED.disconnect(document.onTextModified)
|
|
128
|
-
except TypeError:
|
|
129
|
-
pass
|
|
130
|
-
|
|
131
|
-
self.clear_markings(document)
|
|
132
|
-
|
|
133
|
-
def reset_session(self, document):
|
|
134
|
-
"""Resets the speller dictionary and adds document language
|
|
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
|
-
for
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
1
|
+
from __future__ import absolute_import, print_function
|
|
2
|
+
|
|
3
|
+
import logging
|
|
4
|
+
import re
|
|
5
|
+
import string
|
|
6
|
+
|
|
7
|
+
from PyQt5.Qsci import QsciScintilla
|
|
8
|
+
from Qt.QtCore import Qt
|
|
9
|
+
from Qt.QtGui import QColor
|
|
10
|
+
|
|
11
|
+
from ...delayable_engine.delayables import RangeDelayable
|
|
12
|
+
from .. import lang
|
|
13
|
+
|
|
14
|
+
logger = logging.getLogger(__name__)
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
try: # noqa: C901
|
|
18
|
+
import aspell
|
|
19
|
+
except ImportError:
|
|
20
|
+
# if we can't import aspell don't define the SpellCheckDelayable class
|
|
21
|
+
logger.debug('Unable to import aspell')
|
|
22
|
+
else:
|
|
23
|
+
|
|
24
|
+
class SpellCheckDelayable(RangeDelayable):
|
|
25
|
+
"""Spell check some text in the document.
|
|
26
|
+
|
|
27
|
+
IF the document is not visible, the spell check will be skipped.
|
|
28
|
+
|
|
29
|
+
Loop Args:
|
|
30
|
+
start_pos (int): The document position to start spell checking.
|
|
31
|
+
end_pos (int or None): The document position to stop spell checking.
|
|
32
|
+
If None, then check to the end of the document.
|
|
33
|
+
"""
|
|
34
|
+
|
|
35
|
+
indicator_number = 31
|
|
36
|
+
key = 'spell_check'
|
|
37
|
+
|
|
38
|
+
def __init__(self, engine):
|
|
39
|
+
super(SpellCheckDelayable, self).__init__(engine)
|
|
40
|
+
self.chunk_re = re.compile('([^A-Za-z0-9]*)([A-Za-z0-9]*)')
|
|
41
|
+
self.camel_case_re = re.compile(
|
|
42
|
+
'.+?(?:(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])|$)'
|
|
43
|
+
)
|
|
44
|
+
|
|
45
|
+
def add_document(self, document):
|
|
46
|
+
# Create the speller for the document
|
|
47
|
+
document.__speller__ = aspell.Speller()
|
|
48
|
+
|
|
49
|
+
# https://www.scintilla.org/ScintillaDox.html#SCI_INDICSETSTYLE
|
|
50
|
+
# https://qscintilla.com/#clickable_text/indicators
|
|
51
|
+
document.indicatorDefine(
|
|
52
|
+
QsciScintilla.SquiggleLowIndicator, self.indicator_number
|
|
53
|
+
)
|
|
54
|
+
document.SendScintilla(
|
|
55
|
+
QsciScintilla.SCI_SETINDICATORCURRENT, self.indicator_number
|
|
56
|
+
)
|
|
57
|
+
document.setIndicatorForegroundColor(QColor(Qt.red), self.indicator_number)
|
|
58
|
+
|
|
59
|
+
document.SCN_MODIFIED.connect(document.onTextModified)
|
|
60
|
+
|
|
61
|
+
# Update __speller__ dictionary with programming language words
|
|
62
|
+
# and force spellcheck of the document
|
|
63
|
+
self.reset_session(document)
|
|
64
|
+
|
|
65
|
+
def camel_case_split(self, identifier):
|
|
66
|
+
return [m.group(0) for m in self.camel_case_re.finditer(identifier)]
|
|
67
|
+
|
|
68
|
+
def clear_markings(self, document):
|
|
69
|
+
"""Remove markings made by this Delayable for the given document.
|
|
70
|
+
|
|
71
|
+
Args:
|
|
72
|
+
document (blurdev.scintilla.documenteditor.DocumentEditor): The document
|
|
73
|
+
to clear spell check markings from.
|
|
74
|
+
"""
|
|
75
|
+
document.SendScintilla(
|
|
76
|
+
QsciScintilla.SCI_SETINDICATORCURRENT, self.indicator_number
|
|
77
|
+
)
|
|
78
|
+
document.SendScintilla(
|
|
79
|
+
QsciScintilla.SCI_INDICATORCLEARRANGE, 0, len(document.text())
|
|
80
|
+
)
|
|
81
|
+
|
|
82
|
+
def loop(self, document, start_pos, end_pos):
|
|
83
|
+
# If end_pos is None, use the whole document
|
|
84
|
+
end_pos = len(document.text()) if end_pos is None else end_pos
|
|
85
|
+
match = next(self.chunk_re.finditer(document.text(start_pos, end_pos)))
|
|
86
|
+
if match:
|
|
87
|
+
start = start_pos
|
|
88
|
+
space, result = tuple(match.groups())
|
|
89
|
+
if space:
|
|
90
|
+
# If the user inserted space between two words, that space
|
|
91
|
+
# will still be marked as incorrect. Clear its indicator.
|
|
92
|
+
document.SendScintilla(
|
|
93
|
+
QsciScintilla.SCI_SETINDICATORCURRENT, self.indicator_number
|
|
94
|
+
)
|
|
95
|
+
document.SendScintilla(
|
|
96
|
+
QsciScintilla.SCI_INDICATORCLEARRANGE, start, len(space)
|
|
97
|
+
)
|
|
98
|
+
start += len(space)
|
|
99
|
+
for word in self.camel_case_split(result):
|
|
100
|
+
length_word = len(word)
|
|
101
|
+
if any(
|
|
102
|
+
letter in string.digits for letter in word
|
|
103
|
+
) or document.__speller__.check(word):
|
|
104
|
+
document.SendScintilla(
|
|
105
|
+
QsciScintilla.SCI_SETINDICATORCURRENT, self.indicator_number
|
|
106
|
+
)
|
|
107
|
+
document.SendScintilla(
|
|
108
|
+
QsciScintilla.SCI_INDICATORCLEARRANGE, start, length_word
|
|
109
|
+
)
|
|
110
|
+
else:
|
|
111
|
+
document.SendScintilla(
|
|
112
|
+
QsciScintilla.SCI_SETINDICATORCURRENT, self.indicator_number
|
|
113
|
+
)
|
|
114
|
+
document.SendScintilla(
|
|
115
|
+
QsciScintilla.SCI_INDICATORFILLRANGE, start, length_word
|
|
116
|
+
)
|
|
117
|
+
start += length_word
|
|
118
|
+
|
|
119
|
+
if start < end_pos:
|
|
120
|
+
# There is more text to process
|
|
121
|
+
return (start, end_pos)
|
|
122
|
+
|
|
123
|
+
return
|
|
124
|
+
|
|
125
|
+
def remove_document(self, document):
|
|
126
|
+
try:
|
|
127
|
+
document.SCN_MODIFIED.disconnect(document.onTextModified)
|
|
128
|
+
except TypeError:
|
|
129
|
+
pass
|
|
130
|
+
|
|
131
|
+
self.clear_markings(document)
|
|
132
|
+
|
|
133
|
+
def reset_session(self, document):
|
|
134
|
+
"""Resets the speller dictionary and adds document language
|
|
135
|
+
specific words"""
|
|
136
|
+
if document.__speller__ is None:
|
|
137
|
+
return
|
|
138
|
+
elif not document.lexer() or not document._language:
|
|
139
|
+
# Force spellcheck of the documents
|
|
140
|
+
self.engine.enqueue(document, self.key, 0, None)
|
|
141
|
+
return
|
|
142
|
+
|
|
143
|
+
keywords = ''
|
|
144
|
+
language = lang.byName(document._language)
|
|
145
|
+
max_int = {
|
|
146
|
+
key for _, keys in language.lexerColorTypes().items() for key in keys
|
|
147
|
+
}
|
|
148
|
+
# The SQL lexer returns an empty maxEnumIntList
|
|
149
|
+
max_int = max(max_int) if max_int else 0
|
|
150
|
+
for i in range(max_int):
|
|
151
|
+
lexer_keywords = document.lexer().keywords(i)
|
|
152
|
+
if lexer_keywords:
|
|
153
|
+
keywords += ' ' + lexer_keywords
|
|
154
|
+
document.__speller__.clearSession()
|
|
155
|
+
|
|
156
|
+
if not keywords:
|
|
157
|
+
return
|
|
158
|
+
|
|
159
|
+
for keyword in keywords.split():
|
|
160
|
+
# Split along whitespace
|
|
161
|
+
# Convert '-' to '_' because aspell doesn't process them
|
|
162
|
+
keyword = keyword.replace('-', '_')
|
|
163
|
+
# Strip '_' because aspell doesn't process them
|
|
164
|
+
keyword = keyword.strip('_')
|
|
165
|
+
# Remove non-alpha chars because aspell doesn't process them
|
|
166
|
+
keyword = ''.join(i for i in keyword if i.isalpha())
|
|
167
|
+
for word in keyword.split('_'):
|
|
168
|
+
# Split along '_' because aspell doesn't process them
|
|
169
|
+
if '' != word:
|
|
170
|
+
document.__speller__.addtoSession(word)
|
|
171
|
+
|
|
172
|
+
# Force spellcheck of the documents
|
|
173
|
+
self.engine.enqueue(document, self.key, 0, None)
|