PrEditor 2.1.0__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.
Files changed (179) hide show
  1. preditor/__init__.py +315 -0
  2. preditor/__main__.py +13 -0
  3. preditor/about_module.py +165 -0
  4. preditor/cli.py +192 -0
  5. preditor/config.py +318 -0
  6. preditor/constants.py +13 -0
  7. preditor/contexts.py +210 -0
  8. preditor/cores/__init__.py +0 -0
  9. preditor/cores/core.py +20 -0
  10. preditor/dccs/.hab.json +10 -0
  11. preditor/dccs/maya/PrEditor_maya.mod +1 -0
  12. preditor/dccs/maya/README.md +22 -0
  13. preditor/dccs/maya/plug-ins/PrEditor_maya.py +141 -0
  14. preditor/dccs/studiomax/PackageContents.xml +32 -0
  15. preditor/dccs/studiomax/PrEditor-PrEditor_Show.mcr +8 -0
  16. preditor/dccs/studiomax/README.md +17 -0
  17. preditor/dccs/studiomax/preditor.ms +16 -0
  18. preditor/dccs/studiomax/preditor_menu.mnx +7 -0
  19. preditor/debug.py +149 -0
  20. preditor/delayable_engine/__init__.py +302 -0
  21. preditor/delayable_engine/delayables.py +85 -0
  22. preditor/enum.py +728 -0
  23. preditor/excepthooks.py +165 -0
  24. preditor/gui/__init__.py +56 -0
  25. preditor/gui/app.py +163 -0
  26. preditor/gui/codehighlighter.py +289 -0
  27. preditor/gui/completer.py +237 -0
  28. preditor/gui/console.py +605 -0
  29. preditor/gui/console_base.py +911 -0
  30. preditor/gui/dialog.py +181 -0
  31. preditor/gui/drag_tab_bar.py +625 -0
  32. preditor/gui/editor_chooser.py +57 -0
  33. preditor/gui/errordialog.py +69 -0
  34. preditor/gui/find_files.py +137 -0
  35. preditor/gui/fuzzy_search/__init__.py +0 -0
  36. preditor/gui/fuzzy_search/fuzzy_search.py +97 -0
  37. preditor/gui/group_tab_widget/__init__.py +0 -0
  38. preditor/gui/group_tab_widget/group_tab_widget.py +528 -0
  39. preditor/gui/group_tab_widget/grouped_tab_menu.py +35 -0
  40. preditor/gui/group_tab_widget/grouped_tab_models.py +107 -0
  41. preditor/gui/group_tab_widget/grouped_tab_widget.py +223 -0
  42. preditor/gui/group_tab_widget/one_tab_widget.py +96 -0
  43. preditor/gui/level_buttons.py +358 -0
  44. preditor/gui/logger_window_handler.py +77 -0
  45. preditor/gui/logger_window_plugin.py +35 -0
  46. preditor/gui/loggerwindow.py +2405 -0
  47. preditor/gui/newtabwidget.py +69 -0
  48. preditor/gui/output_console.py +11 -0
  49. preditor/gui/qtdesigner/__init__.py +21 -0
  50. preditor/gui/qtdesigner/_log_plugin.py +29 -0
  51. preditor/gui/qtdesigner/console_base_plugin.py +48 -0
  52. preditor/gui/qtdesigner/console_predit_plugin.py +48 -0
  53. preditor/gui/set_text_editor_path_dialog.py +61 -0
  54. preditor/gui/status_label.py +99 -0
  55. preditor/gui/suggest_path_quotes_dialog.py +50 -0
  56. preditor/gui/ui/editor_chooser.ui +93 -0
  57. preditor/gui/ui/errordialog.ui +74 -0
  58. preditor/gui/ui/find_files.ui +140 -0
  59. preditor/gui/ui/loggerwindow.ui +1909 -0
  60. preditor/gui/ui/set_text_editor_path_dialog.ui +189 -0
  61. preditor/gui/ui/suggest_path_quotes_dialog.ui +225 -0
  62. preditor/gui/window.py +161 -0
  63. preditor/gui/workbox_mixin.py +1139 -0
  64. preditor/gui/workbox_text_edit.py +136 -0
  65. preditor/gui/workboxwidget.py +315 -0
  66. preditor/logging_config.py +55 -0
  67. preditor/osystem.py +401 -0
  68. preditor/plugins.py +118 -0
  69. preditor/prefs.py +381 -0
  70. preditor/resource/environment_variables.html +26 -0
  71. preditor/resource/error_mail.html +85 -0
  72. preditor/resource/error_mail_inline.html +41 -0
  73. preditor/resource/img/README.md +17 -0
  74. preditor/resource/img/arrow_forward.png +0 -0
  75. preditor/resource/img/check-bold.png +0 -0
  76. preditor/resource/img/chevron-down.png +0 -0
  77. preditor/resource/img/chevron-up.png +0 -0
  78. preditor/resource/img/close-thick.png +0 -0
  79. preditor/resource/img/comment-edit.png +0 -0
  80. preditor/resource/img/content-copy.png +0 -0
  81. preditor/resource/img/content-cut.png +0 -0
  82. preditor/resource/img/content-duplicate.png +0 -0
  83. preditor/resource/img/content-paste.png +0 -0
  84. preditor/resource/img/content-save.png +0 -0
  85. preditor/resource/img/debug_disabled.png +0 -0
  86. preditor/resource/img/eye-check.png +0 -0
  87. preditor/resource/img/file-plus.png +0 -0
  88. preditor/resource/img/file-remove.png +0 -0
  89. preditor/resource/img/format-align-left.png +0 -0
  90. preditor/resource/img/format-letter-case-lower.png +0 -0
  91. preditor/resource/img/format-letter-case-upper.png +0 -0
  92. preditor/resource/img/format-letter-case.svg +1 -0
  93. preditor/resource/img/information.png +0 -0
  94. preditor/resource/img/logging_critical.png +0 -0
  95. preditor/resource/img/logging_custom.png +0 -0
  96. preditor/resource/img/logging_debug.png +0 -0
  97. preditor/resource/img/logging_error.png +0 -0
  98. preditor/resource/img/logging_info.png +0 -0
  99. preditor/resource/img/logging_not_set.png +0 -0
  100. preditor/resource/img/logging_warning.png +0 -0
  101. preditor/resource/img/marker.png +0 -0
  102. preditor/resource/img/play.png +0 -0
  103. preditor/resource/img/playlist-play.png +0 -0
  104. preditor/resource/img/plus-minus-variant.png +0 -0
  105. preditor/resource/img/preditor.ico +0 -0
  106. preditor/resource/img/preditor.png +0 -0
  107. preditor/resource/img/preditor.psd +0 -0
  108. preditor/resource/img/preditor.svg +44 -0
  109. preditor/resource/img/regex.svg +1 -0
  110. preditor/resource/img/restart.svg +1 -0
  111. preditor/resource/img/skip-forward-outline.png +0 -0
  112. preditor/resource/img/skip-next-outline.png +0 -0
  113. preditor/resource/img/skip-next.png +0 -0
  114. preditor/resource/img/skip-previous.png +0 -0
  115. preditor/resource/img/subdirectory-arrow-right.png +0 -0
  116. preditor/resource/img/text-search-variant.png +0 -0
  117. preditor/resource/img/warning-big.png +0 -0
  118. preditor/resource/lang/python.json +30 -0
  119. preditor/resource/pref_updates/pref_updates.json +17 -0
  120. preditor/resource/settings.ini +25 -0
  121. preditor/resource/stylesheet/Bright.css +76 -0
  122. preditor/resource/stylesheet/Dark.css +210 -0
  123. preditor/scintilla/__init__.py +40 -0
  124. preditor/scintilla/delayables/__init__.py +11 -0
  125. preditor/scintilla/delayables/smart_highlight.py +97 -0
  126. preditor/scintilla/delayables/spell_check.py +174 -0
  127. preditor/scintilla/documenteditor.py +1924 -0
  128. preditor/scintilla/finddialog.py +68 -0
  129. preditor/scintilla/lang/__init__.py +80 -0
  130. preditor/scintilla/lang/config/bash.ini +15 -0
  131. preditor/scintilla/lang/config/batch.ini +14 -0
  132. preditor/scintilla/lang/config/cpp.ini +19 -0
  133. preditor/scintilla/lang/config/css.ini +19 -0
  134. preditor/scintilla/lang/config/eyeonscript.ini +17 -0
  135. preditor/scintilla/lang/config/html.ini +21 -0
  136. preditor/scintilla/lang/config/javascript.ini +24 -0
  137. preditor/scintilla/lang/config/lua.ini +16 -0
  138. preditor/scintilla/lang/config/maxscript.ini +20 -0
  139. preditor/scintilla/lang/config/mel.ini +18 -0
  140. preditor/scintilla/lang/config/mu.ini +22 -0
  141. preditor/scintilla/lang/config/nsi.ini +19 -0
  142. preditor/scintilla/lang/config/perl.ini +19 -0
  143. preditor/scintilla/lang/config/puppet.ini +19 -0
  144. preditor/scintilla/lang/config/python.ini +28 -0
  145. preditor/scintilla/lang/config/ruby.ini +19 -0
  146. preditor/scintilla/lang/config/sql.ini +7 -0
  147. preditor/scintilla/lang/config/xml.ini +21 -0
  148. preditor/scintilla/lang/config/yaml.ini +18 -0
  149. preditor/scintilla/lang/language.py +240 -0
  150. preditor/scintilla/lexers/__init__.py +0 -0
  151. preditor/scintilla/lexers/cpplexer.py +22 -0
  152. preditor/scintilla/lexers/javascriptlexer.py +27 -0
  153. preditor/scintilla/lexers/maxscriptlexer.py +235 -0
  154. preditor/scintilla/lexers/mellexer.py +369 -0
  155. preditor/scintilla/lexers/mulexer.py +33 -0
  156. preditor/scintilla/lexers/pythonlexer.py +42 -0
  157. preditor/scintilla/ui/finddialog.ui +160 -0
  158. preditor/settings.py +71 -0
  159. preditor/stream/__init__.py +72 -0
  160. preditor/stream/console_handler.py +169 -0
  161. preditor/stream/director.py +144 -0
  162. preditor/stream/manager.py +97 -0
  163. preditor/streamhandler_helper.py +46 -0
  164. preditor/utils/__init__.py +191 -0
  165. preditor/utils/call_stack.py +86 -0
  166. preditor/utils/cute.py +106 -0
  167. preditor/utils/stylesheets.py +54 -0
  168. preditor/utils/text_search.py +338 -0
  169. preditor/version.py +34 -0
  170. preditor/weakref.py +363 -0
  171. preditor-2.1.0.dist-info/METADATA +308 -0
  172. preditor-2.1.0.dist-info/RECORD +179 -0
  173. preditor-2.1.0.dist-info/WHEEL +5 -0
  174. preditor-2.1.0.dist-info/entry_points.txt +19 -0
  175. preditor-2.1.0.dist-info/licenses/LICENSE +165 -0
  176. preditor-2.1.0.dist-info/top_level.txt +3 -0
  177. tests/encodings/test_ecoding.py +33 -0
  178. tests/find_files/test_find_files.py +74 -0
  179. tests/ide/test_delayable_engine.py +171 -0
@@ -0,0 +1,174 @@
1
+ from __future__ import absolute_import, print_function
2
+
3
+ import logging
4
+ import re
5
+ import string
6
+
7
+ from Qt.QtCore import Qt
8
+ from Qt.QtGui import QColor
9
+
10
+ from ...delayable_engine.delayables import RangeDelayable
11
+ from .. import QsciScintilla, lang
12
+
13
+ logger = logging.getLogger(__name__)
14
+
15
+
16
+ try: # noqa: C901
17
+ import aspell
18
+ except ImportError:
19
+ # if we can't import aspell don't define the SpellCheckDelayable class
20
+ logger.debug('Unable to import aspell')
21
+ else:
22
+
23
+ class SpellCheckDelayable(RangeDelayable):
24
+ """Spell check some text in the document.
25
+
26
+ IF the document is not visible, the spell check will be skipped.
27
+
28
+ Loop Args:
29
+ start_pos (int): The document position to start spell checking.
30
+ end_pos (int or None): The document position to stop spell checking.
31
+ If None, then check to the end of the document.
32
+ """
33
+
34
+ indicator_number = 31
35
+ key = 'spell_check'
36
+
37
+ def __init__(self, engine):
38
+ super(SpellCheckDelayable, self).__init__(engine)
39
+ self.chunk_re = re.compile('([^A-Za-z0-9]*)([A-Za-z0-9]*)')
40
+ self.camel_case_re = re.compile(
41
+ '.+?(?:(?<=[a-z])(?=[A-Z])|(?<=[A-Z])(?=[A-Z][a-z])|$)'
42
+ )
43
+
44
+ def add_document(self, document):
45
+ # Create the speller for the document
46
+ document.__speller__ = aspell.Speller()
47
+
48
+ # https://www.scintilla.org/ScintillaDox.html#SCI_INDICSETSTYLE
49
+ # https://qscintilla.com/#clickable_text/indicators
50
+ document.indicatorDefine(
51
+ QsciScintilla.IndicatorStyle.SquiggleLowIndicator, self.indicator_number
52
+ )
53
+ document.SendScintilla(
54
+ QsciScintilla.SCI_SETINDICATORCURRENT, self.indicator_number
55
+ )
56
+ document.setIndicatorForegroundColor(
57
+ QColor(Qt.GlobalColor.red), self.indicator_number
58
+ )
59
+
60
+ document.SCN_MODIFIED.connect(document.onTextModified)
61
+
62
+ # Update __speller__ dictionary with programming language words
63
+ # and force spellcheck of the document
64
+ self.reset_session(document)
65
+
66
+ def camel_case_split(self, identifier):
67
+ return [m.group(0) for m in self.camel_case_re.finditer(identifier)]
68
+
69
+ def clear_markings(self, document):
70
+ """Remove markings made by this Delayable for the given document.
71
+
72
+ Args:
73
+ document (blurdev.scintilla.documenteditor.DocumentEditor): The document
74
+ to clear spell check markings from.
75
+ """
76
+ document.SendScintilla(
77
+ QsciScintilla.SCI_SETINDICATORCURRENT, self.indicator_number
78
+ )
79
+ document.SendScintilla(
80
+ QsciScintilla.SCI_INDICATORCLEARRANGE, 0, len(document.text())
81
+ )
82
+
83
+ def loop(self, document, start_pos, end_pos):
84
+ # If end_pos is None, use the whole document
85
+ end_pos = len(document.text()) if end_pos is None else end_pos
86
+ match = next(self.chunk_re.finditer(document.text(start_pos, end_pos)))
87
+ if match:
88
+ start = start_pos
89
+ space, result = tuple(match.groups())
90
+ if space:
91
+ # If the user inserted space between two words, that space
92
+ # will still be marked as incorrect. Clear its indicator.
93
+ document.SendScintilla(
94
+ QsciScintilla.SCI_SETINDICATORCURRENT, self.indicator_number
95
+ )
96
+ document.SendScintilla(
97
+ QsciScintilla.SCI_INDICATORCLEARRANGE, start, len(space)
98
+ )
99
+ start += len(space)
100
+ for word in self.camel_case_split(result):
101
+ length_word = len(word)
102
+ if any(
103
+ letter in string.digits for letter in word
104
+ ) or document.__speller__.check(word):
105
+ document.SendScintilla(
106
+ QsciScintilla.SCI_SETINDICATORCURRENT, self.indicator_number
107
+ )
108
+ document.SendScintilla(
109
+ QsciScintilla.SCI_INDICATORCLEARRANGE, start, length_word
110
+ )
111
+ else:
112
+ document.SendScintilla(
113
+ QsciScintilla.SCI_SETINDICATORCURRENT, self.indicator_number
114
+ )
115
+ document.SendScintilla(
116
+ QsciScintilla.SCI_INDICATORFILLRANGE, start, length_word
117
+ )
118
+ start += length_word
119
+
120
+ if start < end_pos:
121
+ # There is more text to process
122
+ return (start, end_pos)
123
+
124
+ return
125
+
126
+ def remove_document(self, document):
127
+ try:
128
+ document.SCN_MODIFIED.disconnect(document.onTextModified)
129
+ except TypeError:
130
+ pass
131
+
132
+ self.clear_markings(document)
133
+
134
+ def reset_session(self, document):
135
+ """Resets the speller dictionary and adds document language
136
+ specific words"""
137
+ if document.__speller__ is None:
138
+ return
139
+ elif not document.lexer() or not document._language:
140
+ # Force spellcheck of the documents
141
+ self.engine.enqueue(document, self.key, 0, None)
142
+ return
143
+
144
+ keywords = ''
145
+ language = lang.byName(document._language)
146
+ max_int = {
147
+ key for _, keys in language.lexerColorTypes().items() for key in keys
148
+ }
149
+ # The SQL lexer returns an empty maxEnumIntList
150
+ max_int = max(max_int) if max_int else 0
151
+ for i in range(max_int):
152
+ lexer_keywords = document.lexer().keywords(i)
153
+ if lexer_keywords:
154
+ keywords += ' ' + lexer_keywords
155
+ document.__speller__.clearSession()
156
+
157
+ if not keywords:
158
+ return
159
+
160
+ for keyword in keywords.split():
161
+ # Split along whitespace
162
+ # Convert '-' to '_' because aspell doesn't process them
163
+ keyword = keyword.replace('-', '_')
164
+ # Strip '_' because aspell doesn't process them
165
+ keyword = keyword.strip('_')
166
+ # Remove non-alpha chars because aspell doesn't process them
167
+ keyword = ''.join(i for i in keyword if i.isalpha())
168
+ for word in keyword.split('_'):
169
+ # Split along '_' because aspell doesn't process them
170
+ if '' != word:
171
+ document.__speller__.addtoSession(word)
172
+
173
+ # Force spellcheck of the documents
174
+ self.engine.enqueue(document, self.key, 0, None)