Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
erp5
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Rafael Monnerat
erp5
Commits
fac62400
Commit
fac62400
authored
Oct 27, 2017
by
Romain Courteaud
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[erp5_code_mirror] Drop the not needed src folder
parent
a3a26621
Changes
134
Show whitespace changes
Inline
Side-by-side
Showing
134 changed files
with
0 additions
and
11829 deletions
+0
-11829
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src.xml
...lateItem/portal_skins/erp5_code_mirror/codemirror/src.xml
+0
-26
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/codemirror.js.js
...al_skins/erp5_code_mirror/codemirror/src/codemirror.js.js
+0
-3
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/codemirror.js.xml
...l_skins/erp5_code_mirror/codemirror/src/codemirror.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display.xml
.../portal_skins/erp5_code_mirror/codemirror/src/display.xml
+0
-26
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/Display.js.js
...ins/erp5_code_mirror/codemirror/src/display/Display.js.js
+0
-105
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/Display.js.xml
...ns/erp5_code_mirror/codemirror/src/display/Display.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/focus.js.js
...skins/erp5_code_mirror/codemirror/src/display/focus.js.js
+0
-47
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/focus.js.xml
...kins/erp5_code_mirror/codemirror/src/display/focus.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/gutters.js.js
...ins/erp5_code_mirror/codemirror/src/display/gutters.js.js
+0
-34
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/gutters.js.xml
...ns/erp5_code_mirror/codemirror/src/display/gutters.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/highlight_worker.js.js
...code_mirror/codemirror/src/display/highlight_worker.js.js
+0
-51
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/highlight_worker.js.xml
...ode_mirror/codemirror/src/display/highlight_worker.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/line_numbers.js.js
...rp5_code_mirror/codemirror/src/display/line_numbers.js.js
+0
-48
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/line_numbers.js.xml
...p5_code_mirror/codemirror/src/display/line_numbers.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/mode_state.js.js
.../erp5_code_mirror/codemirror/src/display/mode_state.js.js
+0
-22
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/mode_state.js.xml
...erp5_code_mirror/codemirror/src/display/mode_state.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/operations.js.js
.../erp5_code_mirror/codemirror/src/display/operations.js.js
+0
-215
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/operations.js.xml
...erp5_code_mirror/codemirror/src/display/operations.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/scroll_events.js.js
...p5_code_mirror/codemirror/src/display/scroll_events.js.js
+0
-138
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/scroll_events.js.xml
...5_code_mirror/codemirror/src/display/scroll_events.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/scrollbars.js.js
.../erp5_code_mirror/codemirror/src/display/scrollbars.js.js
+0
-191
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/scrollbars.js.xml
...erp5_code_mirror/codemirror/src/display/scrollbars.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/scrolling.js.js
...s/erp5_code_mirror/codemirror/src/display/scrolling.js.js
+0
-134
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/scrolling.js.xml
.../erp5_code_mirror/codemirror/src/display/scrolling.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/selection.js.js
...s/erp5_code_mirror/codemirror/src/display/selection.js.js
+0
-136
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/selection.js.xml
.../erp5_code_mirror/codemirror/src/display/selection.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/update_display.js.js
...5_code_mirror/codemirror/src/display/update_display.js.js
+0
-229
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/update_display.js.xml
..._code_mirror/codemirror/src/display/update_display.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/update_line.js.js
...erp5_code_mirror/codemirror/src/display/update_line.js.js
+0
-186
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/update_line.js.xml
...rp5_code_mirror/codemirror/src/display/update_line.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/update_lines.js.js
...rp5_code_mirror/codemirror/src/display/update_lines.js.js
+0
-62
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/update_lines.js.xml
...p5_code_mirror/codemirror/src/display/update_lines.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/view_tracking.js.js
...p5_code_mirror/codemirror/src/display/view_tracking.js.js
+0
-153
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/view_tracking.js.xml
...5_code_mirror/codemirror/src/display/view_tracking.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit.xml
...tem/portal_skins/erp5_code_mirror/codemirror/src/edit.xml
+0
-26
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/CodeMirror.js.js
...ins/erp5_code_mirror/codemirror/src/edit/CodeMirror.js.js
+0
-213
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/CodeMirror.js.xml
...ns/erp5_code_mirror/codemirror/src/edit/CodeMirror.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/commands.js.js
...skins/erp5_code_mirror/codemirror/src/edit/commands.js.js
+0
-178
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/commands.js.xml
...kins/erp5_code_mirror/codemirror/src/edit/commands.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/deleteNearSelection.js.js
...code_mirror/codemirror/src/edit/deleteNearSelection.js.js
+0
-30
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/deleteNearSelection.js.xml
...ode_mirror/codemirror/src/edit/deleteNearSelection.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/drop_events.js.js
...ns/erp5_code_mirror/codemirror/src/edit/drop_events.js.js
+0
-119
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/drop_events.js.xml
...s/erp5_code_mirror/codemirror/src/edit/drop_events.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/fromTextArea.js.js
...s/erp5_code_mirror/codemirror/src/edit/fromTextArea.js.js
+0
-61
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/fromTextArea.js.xml
.../erp5_code_mirror/codemirror/src/edit/fromTextArea.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/global_events.js.js
.../erp5_code_mirror/codemirror/src/edit/global_events.js.js
+0
-44
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/global_events.js.xml
...erp5_code_mirror/codemirror/src/edit/global_events.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/key_events.js.js
...ins/erp5_code_mirror/codemirror/src/edit/key_events.js.js
+0
-152
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/key_events.js.xml
...ns/erp5_code_mirror/codemirror/src/edit/key_events.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/legacy.js.js
...l_skins/erp5_code_mirror/codemirror/src/edit/legacy.js.js
+0
-62
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/legacy.js.xml
..._skins/erp5_code_mirror/codemirror/src/edit/legacy.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/main.js.js
...tal_skins/erp5_code_mirror/codemirror/src/edit/main.js.js
+0
-69
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/main.js.xml
...al_skins/erp5_code_mirror/codemirror/src/edit/main.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/methods.js.js
..._skins/erp5_code_mirror/codemirror/src/edit/methods.js.js
+0
-544
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/methods.js.xml
...skins/erp5_code_mirror/codemirror/src/edit/methods.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/mouse_events.js.js
...s/erp5_code_mirror/codemirror/src/edit/mouse_events.js.js
+0
-310
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/mouse_events.js.xml
.../erp5_code_mirror/codemirror/src/edit/mouse_events.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/options.js.js
..._skins/erp5_code_mirror/codemirror/src/edit/options.js.js
+0
-190
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/options.js.xml
...skins/erp5_code_mirror/codemirror/src/edit/options.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/utils.js.js
...al_skins/erp5_code_mirror/codemirror/src/edit/utils.js.js
+0
-7
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/utils.js.xml
...l_skins/erp5_code_mirror/codemirror/src/edit/utils.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/input.xml
...em/portal_skins/erp5_code_mirror/codemirror/src/input.xml
+0
-26
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/input/ContentEditableInput.js.js
...de_mirror/codemirror/src/input/ContentEditableInput.js.js
+0
-475
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/input/ContentEditableInput.js.xml
...e_mirror/codemirror/src/input/ContentEditableInput.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/input/TextareaInput.js.js
...erp5_code_mirror/codemirror/src/input/TextareaInput.js.js
+0
-362
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/input/TextareaInput.js.xml
...rp5_code_mirror/codemirror/src/input/TextareaInput.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/input/indent.js.js
..._skins/erp5_code_mirror/codemirror/src/input/indent.js.js
+0
-71
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/input/indent.js.xml
...skins/erp5_code_mirror/codemirror/src/input/indent.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/input/input.js.js
...l_skins/erp5_code_mirror/codemirror/src/input/input.js.js
+0
-135
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/input/input.js.xml
..._skins/erp5_code_mirror/codemirror/src/input/input.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/input/keymap.js.js
..._skins/erp5_code_mirror/codemirror/src/input/keymap.js.js
+0
-140
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/input/keymap.js.xml
...skins/erp5_code_mirror/codemirror/src/input/keymap.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/input/keynames.js.js
...kins/erp5_code_mirror/codemirror/src/input/keynames.js.js
+0
-17
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/input/keynames.js.xml
...ins/erp5_code_mirror/codemirror/src/input/keynames.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/input/movement.js.js
...kins/erp5_code_mirror/codemirror/src/input/movement.js.js
+0
-109
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/input/movement.js.xml
...ins/erp5_code_mirror/codemirror/src/input/movement.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/line.xml
...tem/portal_skins/erp5_code_mirror/codemirror/src/line.xml
+0
-26
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/line/highlight.js.js
...kins/erp5_code_mirror/codemirror/src/line/highlight.js.js
+0
-203
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/line/highlight.js.xml
...ins/erp5_code_mirror/codemirror/src/line/highlight.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/line/line_data.js.js
...kins/erp5_code_mirror/codemirror/src/line/line_data.js.js
+0
-340
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/line/line_data.js.xml
...ins/erp5_code_mirror/codemirror/src/line/line_data.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/line/pos.js.js
...rtal_skins/erp5_code_mirror/codemirror/src/line/pos.js.js
+0
-40
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/line/pos.js.xml
...tal_skins/erp5_code_mirror/codemirror/src/line/pos.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/line/saw_special_spans.js.js
...5_code_mirror/codemirror/src/line/saw_special_spans.js.js
+0
-10
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/line/saw_special_spans.js.xml
..._code_mirror/codemirror/src/line/saw_special_spans.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/line/spans.js.js
...al_skins/erp5_code_mirror/codemirror/src/line/spans.js.js
+0
-372
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/line/spans.js.xml
...l_skins/erp5_code_mirror/codemirror/src/line/spans.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/line/utils_line.js.js
...ins/erp5_code_mirror/codemirror/src/line/utils_line.js.js
+0
-85
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/line/utils_line.js.xml
...ns/erp5_code_mirror/codemirror/src/line/utils_line.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/measurement.xml
...tal_skins/erp5_code_mirror/codemirror/src/measurement.xml
+0
-26
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/measurement/position_measurement.js.js
...ror/codemirror/src/measurement/position_measurement.js.js
+0
-606
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/measurement/position_measurement.js.xml
...or/codemirror/src/measurement/position_measurement.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/measurement/widgets.js.js
...erp5_code_mirror/codemirror/src/measurement/widgets.js.js
+0
-26
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/measurement/widgets.js.xml
...rp5_code_mirror/codemirror/src/measurement/widgets.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model.xml
...em/portal_skins/erp5_code_mirror/codemirror/src/model.xml
+0
-26
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model/Doc.js.js
...tal_skins/erp5_code_mirror/codemirror/src/model/Doc.js.js
+0
-422
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model/Doc.js.xml
...al_skins/erp5_code_mirror/codemirror/src/model/Doc.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model/change_measurement.js.js
...code_mirror/codemirror/src/model/change_measurement.js.js
+0
-61
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model/change_measurement.js.xml
...ode_mirror/codemirror/src/model/change_measurement.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model/changes.js.js
...skins/erp5_code_mirror/codemirror/src/model/changes.js.js
+0
-330
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model/changes.js.xml
...kins/erp5_code_mirror/codemirror/src/model/changes.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model/chunk.js.js
...l_skins/erp5_code_mirror/codemirror/src/model/chunk.js.js
+0
-167
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model/chunk.js.xml
..._skins/erp5_code_mirror/codemirror/src/model/chunk.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model/document_data.js.js
...erp5_code_mirror/codemirror/src/model/document_data.js.js
+0
-98
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model/document_data.js.xml
...rp5_code_mirror/codemirror/src/model/document_data.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model/history.js.js
...skins/erp5_code_mirror/codemirror/src/model/history.js.js
+0
-228
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model/history.js.xml
...kins/erp5_code_mirror/codemirror/src/model/history.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model/line_widget.js.js
...s/erp5_code_mirror/codemirror/src/model/line_widget.js.js
+0
-78
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model/line_widget.js.xml
.../erp5_code_mirror/codemirror/src/model/line_widget.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model/mark_text.js.js
...ins/erp5_code_mirror/codemirror/src/model/mark_text.js.js
+0
-293
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model/mark_text.js.xml
...ns/erp5_code_mirror/codemirror/src/model/mark_text.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model/selection.js.js
...ins/erp5_code_mirror/codemirror/src/model/selection.js.js
+0
-82
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model/selection.js.xml
...ns/erp5_code_mirror/codemirror/src/model/selection.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model/selection_updates.js.js
..._code_mirror/codemirror/src/model/selection_updates.js.js
+0
-206
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model/selection_updates.js.xml
...code_mirror/codemirror/src/model/selection_updates.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/modes.js.js
.../portal_skins/erp5_code_mirror/codemirror/src/modes.js.js
+0
-96
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/modes.js.xml
...portal_skins/erp5_code_mirror/codemirror/src/modes.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/util.xml
...tem/portal_skins/erp5_code_mirror/codemirror/src/util.xml
+0
-26
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/util/StringStream.js.js
...s/erp5_code_mirror/codemirror/src/util/StringStream.js.js
+0
-81
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/util/StringStream.js.xml
.../erp5_code_mirror/codemirror/src/util/StringStream.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/util/bidi.js.js
...tal_skins/erp5_code_mirror/codemirror/src/util/bidi.js.js
+0
-212
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/util/bidi.js.xml
...al_skins/erp5_code_mirror/codemirror/src/util/bidi.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/util/browser.js.js
..._skins/erp5_code_mirror/codemirror/src/util/browser.js.js
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/util/browser.js.xml
...skins/erp5_code_mirror/codemirror/src/util/browser.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/util/dom.js.js
...rtal_skins/erp5_code_mirror/codemirror/src/util/dom.js.js
+0
-91
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/util/dom.js.xml
...tal_skins/erp5_code_mirror/codemirror/src/util/dom.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/util/event.js.js
...al_skins/erp5_code_mirror/codemirror/src/util/event.js.js
+0
-103
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/util/event.js.xml
...l_skins/erp5_code_mirror/codemirror/src/util/event.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/util/feature_detection.js.js
...5_code_mirror/codemirror/src/util/feature_detection.js.js
+0
-84
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/util/feature_detection.js.xml
..._code_mirror/codemirror/src/util/feature_detection.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/util/misc.js.js
...tal_skins/erp5_code_mirror/codemirror/src/util/misc.js.js
+0
-145
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/util/misc.js.xml
...al_skins/erp5_code_mirror/codemirror/src/util/misc.js.xml
+0
-32
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/util/operation_group.js.js
...rp5_code_mirror/codemirror/src/util/operation_group.js.js
+0
-72
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/util/operation_group.js.xml
...p5_code_mirror/codemirror/src/util/operation_group.js.xml
+0
-32
No files found.
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"Folder"
module=
"OFS.Folder"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_objects
</string>
</key>
<value>
<tuple/>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
src
</string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/codemirror.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
CodeMirror
}
from
"
./edit/main
"
export
default
CodeMirror
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/codemirror.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
codemirror.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"Folder"
module=
"OFS.Folder"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_objects
</string>
</key>
<value>
<tuple/>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
display
</string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/Display.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
gecko
,
ie
,
ie_version
,
mobile
,
webkit
}
from
"
../util/browser
"
import
{
elt
}
from
"
../util/dom
"
import
{
scrollerGap
}
from
"
../util/misc
"
// The display handles the DOM integration, both for input reading
// and content drawing. It holds references to DOM nodes and
// display-related state.
export
function
Display
(
place
,
doc
,
input
)
{
let
d
=
this
this
.
input
=
input
// Covers bottom-right square when both scrollbars are present.
d
.
scrollbarFiller
=
elt
(
"
div
"
,
null
,
"
CodeMirror-scrollbar-filler
"
)
d
.
scrollbarFiller
.
setAttribute
(
"
cm-not-content
"
,
"
true
"
)
// Covers bottom of gutter when coverGutterNextToScrollbar is on
// and h scrollbar is present.
d
.
gutterFiller
=
elt
(
"
div
"
,
null
,
"
CodeMirror-gutter-filler
"
)
d
.
gutterFiller
.
setAttribute
(
"
cm-not-content
"
,
"
true
"
)
// Will contain the actual code, positioned to cover the viewport.
d
.
lineDiv
=
elt
(
"
div
"
,
null
,
"
CodeMirror-code
"
)
// Elements are added to these to represent selection and cursors.
d
.
selectionDiv
=
elt
(
"
div
"
,
null
,
null
,
"
position: relative; z-index: 1
"
)
d
.
cursorDiv
=
elt
(
"
div
"
,
null
,
"
CodeMirror-cursors
"
)
// A visibility: hidden element used to find the size of things.
d
.
measure
=
elt
(
"
div
"
,
null
,
"
CodeMirror-measure
"
)
// When lines outside of the viewport are measured, they are drawn in this.
d
.
lineMeasure
=
elt
(
"
div
"
,
null
,
"
CodeMirror-measure
"
)
// Wraps everything that needs to exist inside the vertically-padded coordinate system
d
.
lineSpace
=
elt
(
"
div
"
,
[
d
.
measure
,
d
.
lineMeasure
,
d
.
selectionDiv
,
d
.
cursorDiv
,
d
.
lineDiv
],
null
,
"
position: relative; outline: none
"
)
// Moved around its parent to cover visible view.
d
.
mover
=
elt
(
"
div
"
,
[
elt
(
"
div
"
,
[
d
.
lineSpace
],
"
CodeMirror-lines
"
)],
null
,
"
position: relative
"
)
// Set to the height of the document, allowing scrolling.
d
.
sizer
=
elt
(
"
div
"
,
[
d
.
mover
],
"
CodeMirror-sizer
"
)
d
.
sizerWidth
=
null
// Behavior of elts with overflow: auto and padding is
// inconsistent across browsers. This is used to ensure the
// scrollable area is big enough.
d
.
heightForcer
=
elt
(
"
div
"
,
null
,
null
,
"
position: absolute; height:
"
+
scrollerGap
+
"
px; width: 1px;
"
)
// Will contain the gutters, if any.
d
.
gutters
=
elt
(
"
div
"
,
null
,
"
CodeMirror-gutters
"
)
d
.
lineGutter
=
null
// Actual scrollable element.
d
.
scroller
=
elt
(
"
div
"
,
[
d
.
sizer
,
d
.
heightForcer
,
d
.
gutters
],
"
CodeMirror-scroll
"
)
d
.
scroller
.
setAttribute
(
"
tabIndex
"
,
"
-1
"
)
// The element in which the editor lives.
d
.
wrapper
=
elt
(
"
div
"
,
[
d
.
scrollbarFiller
,
d
.
gutterFiller
,
d
.
scroller
],
"
CodeMirror
"
)
// Work around IE7 z-index bug (not perfect, hence IE7 not really being supported)
if
(
ie
&&
ie_version
<
8
)
{
d
.
gutters
.
style
.
zIndex
=
-
1
;
d
.
scroller
.
style
.
paddingRight
=
0
}
if
(
!
webkit
&&
!
(
gecko
&&
mobile
))
d
.
scroller
.
draggable
=
true
if
(
place
)
{
if
(
place
.
appendChild
)
place
.
appendChild
(
d
.
wrapper
)
else
place
(
d
.
wrapper
)
}
// Current rendered range (may be bigger than the view window).
d
.
viewFrom
=
d
.
viewTo
=
doc
.
first
d
.
reportedViewFrom
=
d
.
reportedViewTo
=
doc
.
first
// Information about the rendered lines.
d
.
view
=
[]
d
.
renderedView
=
null
// Holds info about a single rendered line when it was rendered
// for measurement, while not in view.
d
.
externalMeasured
=
null
// Empty space (in pixels) above the view
d
.
viewOffset
=
0
d
.
lastWrapHeight
=
d
.
lastWrapWidth
=
0
d
.
updateLineNumbers
=
null
d
.
nativeBarWidth
=
d
.
barHeight
=
d
.
barWidth
=
0
d
.
scrollbarsClipped
=
false
// Used to only resize the line number gutter when necessary (when
// the amount of lines crosses a boundary that makes its width change)
d
.
lineNumWidth
=
d
.
lineNumInnerWidth
=
d
.
lineNumChars
=
null
// Set to true when a non-horizontal-scrolling line widget is
// added. As an optimization, line widget aligning is skipped when
// this is false.
d
.
alignWidgets
=
false
d
.
cachedCharWidth
=
d
.
cachedTextHeight
=
d
.
cachedPaddingH
=
null
// Tracks the maximum line length so that the horizontal scrollbar
// can be kept static when scrolling.
d
.
maxLine
=
null
d
.
maxLineLength
=
0
d
.
maxLineChanged
=
false
// Used for measuring wheel scrolling granularity
d
.
wheelDX
=
d
.
wheelDY
=
d
.
wheelStartX
=
d
.
wheelStartY
=
null
// True when shift is held down.
d
.
shift
=
false
// Used to track whether anything happened since the context menu
// was opened.
d
.
selForContextMenu
=
null
d
.
activeTouch
=
null
input
.
init
(
d
)
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/Display.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
Display.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/focus.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
restartBlink
}
from
"
./selection
"
import
{
webkit
}
from
"
../util/browser
"
import
{
addClass
,
rmClass
}
from
"
../util/dom
"
import
{
signal
}
from
"
../util/event
"
export
function
ensureFocus
(
cm
)
{
if
(
!
cm
.
state
.
focused
)
{
cm
.
display
.
input
.
focus
();
onFocus
(
cm
)
}
}
export
function
delayBlurEvent
(
cm
)
{
cm
.
state
.
delayingBlurEvent
=
true
setTimeout
(()
=>
{
if
(
cm
.
state
.
delayingBlurEvent
)
{
cm
.
state
.
delayingBlurEvent
=
false
onBlur
(
cm
)
}
},
100
)
}
export
function
onFocus
(
cm
,
e
)
{
if
(
cm
.
state
.
delayingBlurEvent
)
cm
.
state
.
delayingBlurEvent
=
false
if
(
cm
.
options
.
readOnly
==
"
nocursor
"
)
return
if
(
!
cm
.
state
.
focused
)
{
signal
(
cm
,
"
focus
"
,
cm
,
e
)
cm
.
state
.
focused
=
true
addClass
(
cm
.
display
.
wrapper
,
"
CodeMirror-focused
"
)
// This test prevents this from firing when a context
// menu is closed (since the input reset would kill the
// select-all detection hack)
if
(
!
cm
.
curOp
&&
cm
.
display
.
selForContextMenu
!=
cm
.
doc
.
sel
)
{
cm
.
display
.
input
.
reset
()
if
(
webkit
)
setTimeout
(()
=>
cm
.
display
.
input
.
reset
(
true
),
20
)
// Issue #1730
}
cm
.
display
.
input
.
receivedFocus
()
}
restartBlink
(
cm
)
}
export
function
onBlur
(
cm
,
e
)
{
if
(
cm
.
state
.
delayingBlurEvent
)
return
if
(
cm
.
state
.
focused
)
{
signal
(
cm
,
"
blur
"
,
cm
,
e
)
cm
.
state
.
focused
=
false
rmClass
(
cm
.
display
.
wrapper
,
"
CodeMirror-focused
"
)
}
clearInterval
(
cm
.
display
.
blinker
)
setTimeout
(()
=>
{
if
(
!
cm
.
state
.
focused
)
cm
.
display
.
shift
=
false
},
150
)
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/focus.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
focus.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/gutters.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
elt
,
removeChildren
}
from
"
../util/dom
"
import
{
indexOf
}
from
"
../util/misc
"
import
{
updateGutterSpace
}
from
"
./update_display
"
// Rebuild the gutter elements, ensure the margin to the left of the
// code matches their width.
export
function
updateGutters
(
cm
)
{
let
gutters
=
cm
.
display
.
gutters
,
specs
=
cm
.
options
.
gutters
removeChildren
(
gutters
)
let
i
=
0
for
(;
i
<
specs
.
length
;
++
i
)
{
let
gutterClass
=
specs
[
i
]
let
gElt
=
gutters
.
appendChild
(
elt
(
"
div
"
,
null
,
"
CodeMirror-gutter
"
+
gutterClass
))
if
(
gutterClass
==
"
CodeMirror-linenumbers
"
)
{
cm
.
display
.
lineGutter
=
gElt
gElt
.
style
.
width
=
(
cm
.
display
.
lineNumWidth
||
1
)
+
"
px
"
}
}
gutters
.
style
.
display
=
i
?
""
:
"
none
"
updateGutterSpace
(
cm
)
}
// Make sure the gutters options contains the element
// "CodeMirror-linenumbers" when the lineNumbers option is true.
export
function
setGuttersForLineNumbers
(
options
)
{
let
found
=
indexOf
(
options
.
gutters
,
"
CodeMirror-linenumbers
"
)
if
(
found
==
-
1
&&
options
.
lineNumbers
)
{
options
.
gutters
=
options
.
gutters
.
concat
([
"
CodeMirror-linenumbers
"
])
}
else
if
(
found
>
-
1
&&
!
options
.
lineNumbers
)
{
options
.
gutters
=
options
.
gutters
.
slice
(
0
)
options
.
gutters
.
splice
(
found
,
1
)
}
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/gutters.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
gutters.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/highlight_worker.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
getStateBefore
,
highlightLine
,
processLine
}
from
"
../line/highlight
"
import
{
copyState
}
from
"
../modes
"
import
{
bind
}
from
"
../util/misc
"
import
{
runInOp
}
from
"
./operations
"
import
{
regLineChange
}
from
"
./view_tracking
"
// HIGHLIGHT WORKER
export
function
startWorker
(
cm
,
time
)
{
if
(
cm
.
doc
.
mode
.
startState
&&
cm
.
doc
.
frontier
<
cm
.
display
.
viewTo
)
cm
.
state
.
highlight
.
set
(
time
,
bind
(
highlightWorker
,
cm
))
}
function
highlightWorker
(
cm
)
{
let
doc
=
cm
.
doc
if
(
doc
.
frontier
<
doc
.
first
)
doc
.
frontier
=
doc
.
first
if
(
doc
.
frontier
>=
cm
.
display
.
viewTo
)
return
let
end
=
+
new
Date
+
cm
.
options
.
workTime
let
state
=
copyState
(
doc
.
mode
,
getStateBefore
(
cm
,
doc
.
frontier
))
let
changedLines
=
[]
doc
.
iter
(
doc
.
frontier
,
Math
.
min
(
doc
.
first
+
doc
.
size
,
cm
.
display
.
viewTo
+
500
),
line
=>
{
if
(
doc
.
frontier
>=
cm
.
display
.
viewFrom
)
{
// Visible
let
oldStyles
=
line
.
styles
,
tooLong
=
line
.
text
.
length
>
cm
.
options
.
maxHighlightLength
let
highlighted
=
highlightLine
(
cm
,
line
,
tooLong
?
copyState
(
doc
.
mode
,
state
)
:
state
,
true
)
line
.
styles
=
highlighted
.
styles
let
oldCls
=
line
.
styleClasses
,
newCls
=
highlighted
.
classes
if
(
newCls
)
line
.
styleClasses
=
newCls
else
if
(
oldCls
)
line
.
styleClasses
=
null
let
ischange
=
!
oldStyles
||
oldStyles
.
length
!=
line
.
styles
.
length
||
oldCls
!=
newCls
&&
(
!
oldCls
||
!
newCls
||
oldCls
.
bgClass
!=
newCls
.
bgClass
||
oldCls
.
textClass
!=
newCls
.
textClass
)
for
(
let
i
=
0
;
!
ischange
&&
i
<
oldStyles
.
length
;
++
i
)
ischange
=
oldStyles
[
i
]
!=
line
.
styles
[
i
]
if
(
ischange
)
changedLines
.
push
(
doc
.
frontier
)
line
.
stateAfter
=
tooLong
?
state
:
copyState
(
doc
.
mode
,
state
)
}
else
{
if
(
line
.
text
.
length
<=
cm
.
options
.
maxHighlightLength
)
processLine
(
cm
,
line
.
text
,
state
)
line
.
stateAfter
=
doc
.
frontier
%
5
==
0
?
copyState
(
doc
.
mode
,
state
)
:
null
}
++
doc
.
frontier
if
(
+
new
Date
>
end
)
{
startWorker
(
cm
,
cm
.
options
.
workDelay
)
return
true
}
})
if
(
changedLines
.
length
)
runInOp
(
cm
,
()
=>
{
for
(
let
i
=
0
;
i
<
changedLines
.
length
;
i
++
)
regLineChange
(
cm
,
changedLines
[
i
],
"
text
"
)
})
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/highlight_worker.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
highlight_worker.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/line_numbers.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
lineNumberFor
}
from
"
../line/utils_line
"
import
{
compensateForHScroll
}
from
"
../measurement/position_measurement
"
import
{
elt
}
from
"
../util/dom
"
import
{
updateGutterSpace
}
from
"
./update_display
"
// Re-align line numbers and gutter marks to compensate for
// horizontal scrolling.
export
function
alignHorizontally
(
cm
)
{
let
display
=
cm
.
display
,
view
=
display
.
view
if
(
!
display
.
alignWidgets
&&
(
!
display
.
gutters
.
firstChild
||
!
cm
.
options
.
fixedGutter
))
return
let
comp
=
compensateForHScroll
(
display
)
-
display
.
scroller
.
scrollLeft
+
cm
.
doc
.
scrollLeft
let
gutterW
=
display
.
gutters
.
offsetWidth
,
left
=
comp
+
"
px
"
for
(
let
i
=
0
;
i
<
view
.
length
;
i
++
)
if
(
!
view
[
i
].
hidden
)
{
if
(
cm
.
options
.
fixedGutter
)
{
if
(
view
[
i
].
gutter
)
view
[
i
].
gutter
.
style
.
left
=
left
if
(
view
[
i
].
gutterBackground
)
view
[
i
].
gutterBackground
.
style
.
left
=
left
}
let
align
=
view
[
i
].
alignable
if
(
align
)
for
(
let
j
=
0
;
j
<
align
.
length
;
j
++
)
align
[
j
].
style
.
left
=
left
}
if
(
cm
.
options
.
fixedGutter
)
display
.
gutters
.
style
.
left
=
(
comp
+
gutterW
)
+
"
px
"
}
// Used to ensure that the line number gutter is still the right
// size for the current document size. Returns true when an update
// is needed.
export
function
maybeUpdateLineNumberWidth
(
cm
)
{
if
(
!
cm
.
options
.
lineNumbers
)
return
false
let
doc
=
cm
.
doc
,
last
=
lineNumberFor
(
cm
.
options
,
doc
.
first
+
doc
.
size
-
1
),
display
=
cm
.
display
if
(
last
.
length
!=
display
.
lineNumChars
)
{
let
test
=
display
.
measure
.
appendChild
(
elt
(
"
div
"
,
[
elt
(
"
div
"
,
last
)],
"
CodeMirror-linenumber CodeMirror-gutter-elt
"
))
let
innerW
=
test
.
firstChild
.
offsetWidth
,
padding
=
test
.
offsetWidth
-
innerW
display
.
lineGutter
.
style
.
width
=
""
display
.
lineNumInnerWidth
=
Math
.
max
(
innerW
,
display
.
lineGutter
.
offsetWidth
-
padding
)
+
1
display
.
lineNumWidth
=
display
.
lineNumInnerWidth
+
padding
display
.
lineNumChars
=
display
.
lineNumInnerWidth
?
last
.
length
:
-
1
display
.
lineGutter
.
style
.
width
=
display
.
lineNumWidth
+
"
px
"
updateGutterSpace
(
cm
)
return
true
}
return
false
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/line_numbers.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
line_numbers.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/mode_state.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
getMode
}
from
"
../modes
"
import
{
startWorker
}
from
"
./highlight_worker
"
import
{
regChange
}
from
"
./view_tracking
"
// Used to get the editor into a consistent state again when options change.
export
function
loadMode
(
cm
)
{
cm
.
doc
.
mode
=
getMode
(
cm
.
options
,
cm
.
doc
.
modeOption
)
resetModeState
(
cm
)
}
export
function
resetModeState
(
cm
)
{
cm
.
doc
.
iter
(
line
=>
{
if
(
line
.
stateAfter
)
line
.
stateAfter
=
null
if
(
line
.
styles
)
line
.
styles
=
null
})
cm
.
doc
.
frontier
=
cm
.
doc
.
first
startWorker
(
cm
,
100
)
cm
.
state
.
modeGen
++
if
(
cm
.
curOp
)
regChange
(
cm
)
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/mode_state.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
mode_state.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/operations.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
clipPos
}
from
"
../line/pos
"
import
{
findMaxLine
}
from
"
../line/spans
"
import
{
displayWidth
,
measureChar
,
scrollGap
}
from
"
../measurement/position_measurement
"
import
{
signal
}
from
"
../util/event
"
import
{
activeElt
}
from
"
../util/dom
"
import
{
finishOperation
,
pushOperation
}
from
"
../util/operation_group
"
import
{
ensureFocus
}
from
"
./focus
"
import
{
alignHorizontally
}
from
"
./line_numbers
"
import
{
measureForScrollbars
,
updateScrollbars
}
from
"
./scrollbars
"
import
{
setScrollLeft
}
from
"
./scroll_events
"
import
{
restartBlink
}
from
"
./selection
"
import
{
maybeScrollWindow
,
scrollPosIntoView
}
from
"
./scrolling
"
import
{
DisplayUpdate
,
maybeClipScrollbars
,
postUpdateDisplay
,
setDocumentHeight
,
updateDisplayIfNeeded
}
from
"
./update_display
"
import
{
updateHeightsInViewport
}
from
"
./update_lines
"
// Operations are used to wrap a series of changes to the editor
// state in such a way that each change won't have to update the
// cursor and display (which would be awkward, slow, and
// error-prone). Instead, display updates are batched and then all
// combined and executed at once.
let
nextOpId
=
0
// Start a new operation.
export
function
startOperation
(
cm
)
{
cm
.
curOp
=
{
cm
:
cm
,
viewChanged
:
false
,
// Flag that indicates that lines might need to be redrawn
startHeight
:
cm
.
doc
.
height
,
// Used to detect need to update scrollbar
forceUpdate
:
false
,
// Used to force a redraw
updateInput
:
null
,
// Whether to reset the input textarea
typing
:
false
,
// Whether this reset should be careful to leave existing text (for compositing)
changeObjs
:
null
,
// Accumulated changes, for firing change events
cursorActivityHandlers
:
null
,
// Set of handlers to fire cursorActivity on
cursorActivityCalled
:
0
,
// Tracks which cursorActivity handlers have been called already
selectionChanged
:
false
,
// Whether the selection needs to be redrawn
updateMaxLine
:
false
,
// Set when the widest line needs to be determined anew
scrollLeft
:
null
,
scrollTop
:
null
,
// Intermediate scroll position, not pushed to DOM yet
scrollToPos
:
null
,
// Used to scroll to a specific position
focus
:
false
,
id
:
++
nextOpId
// Unique ID
}
pushOperation
(
cm
.
curOp
)
}
// Finish an operation, updating the display and signalling delayed events
export
function
endOperation
(
cm
)
{
let
op
=
cm
.
curOp
finishOperation
(
op
,
group
=>
{
for
(
let
i
=
0
;
i
<
group
.
ops
.
length
;
i
++
)
group
.
ops
[
i
].
cm
.
curOp
=
null
endOperations
(
group
)
})
}
// The DOM updates done when an operation finishes are batched so
// that the minimum number of relayouts are required.
function
endOperations
(
group
)
{
let
ops
=
group
.
ops
for
(
let
i
=
0
;
i
<
ops
.
length
;
i
++
)
// Read DOM
endOperation_R1
(
ops
[
i
])
for
(
let
i
=
0
;
i
<
ops
.
length
;
i
++
)
// Write DOM (maybe)
endOperation_W1
(
ops
[
i
])
for
(
let
i
=
0
;
i
<
ops
.
length
;
i
++
)
// Read DOM
endOperation_R2
(
ops
[
i
])
for
(
let
i
=
0
;
i
<
ops
.
length
;
i
++
)
// Write DOM (maybe)
endOperation_W2
(
ops
[
i
])
for
(
let
i
=
0
;
i
<
ops
.
length
;
i
++
)
// Read DOM
endOperation_finish
(
ops
[
i
])
}
function
endOperation_R1
(
op
)
{
let
cm
=
op
.
cm
,
display
=
cm
.
display
maybeClipScrollbars
(
cm
)
if
(
op
.
updateMaxLine
)
findMaxLine
(
cm
)
op
.
mustUpdate
=
op
.
viewChanged
||
op
.
forceUpdate
||
op
.
scrollTop
!=
null
||
op
.
scrollToPos
&&
(
op
.
scrollToPos
.
from
.
line
<
display
.
viewFrom
||
op
.
scrollToPos
.
to
.
line
>=
display
.
viewTo
)
||
display
.
maxLineChanged
&&
cm
.
options
.
lineWrapping
op
.
update
=
op
.
mustUpdate
&&
new
DisplayUpdate
(
cm
,
op
.
mustUpdate
&&
{
top
:
op
.
scrollTop
,
ensure
:
op
.
scrollToPos
},
op
.
forceUpdate
)
}
function
endOperation_W1
(
op
)
{
op
.
updatedDisplay
=
op
.
mustUpdate
&&
updateDisplayIfNeeded
(
op
.
cm
,
op
.
update
)
}
function
endOperation_R2
(
op
)
{
let
cm
=
op
.
cm
,
display
=
cm
.
display
if
(
op
.
updatedDisplay
)
updateHeightsInViewport
(
cm
)
op
.
barMeasure
=
measureForScrollbars
(
cm
)
// If the max line changed since it was last measured, measure it,
// and ensure the document's width matches it.
// updateDisplay_W2 will use these properties to do the actual resizing
if
(
display
.
maxLineChanged
&&
!
cm
.
options
.
lineWrapping
)
{
op
.
adjustWidthTo
=
measureChar
(
cm
,
display
.
maxLine
,
display
.
maxLine
.
text
.
length
).
left
+
3
cm
.
display
.
sizerWidth
=
op
.
adjustWidthTo
op
.
barMeasure
.
scrollWidth
=
Math
.
max
(
display
.
scroller
.
clientWidth
,
display
.
sizer
.
offsetLeft
+
op
.
adjustWidthTo
+
scrollGap
(
cm
)
+
cm
.
display
.
barWidth
)
op
.
maxScrollLeft
=
Math
.
max
(
0
,
display
.
sizer
.
offsetLeft
+
op
.
adjustWidthTo
-
displayWidth
(
cm
))
}
if
(
op
.
updatedDisplay
||
op
.
selectionChanged
)
op
.
preparedSelection
=
display
.
input
.
prepareSelection
(
op
.
focus
)
}
function
endOperation_W2
(
op
)
{
let
cm
=
op
.
cm
if
(
op
.
adjustWidthTo
!=
null
)
{
cm
.
display
.
sizer
.
style
.
minWidth
=
op
.
adjustWidthTo
+
"
px
"
if
(
op
.
maxScrollLeft
<
cm
.
doc
.
scrollLeft
)
setScrollLeft
(
cm
,
Math
.
min
(
cm
.
display
.
scroller
.
scrollLeft
,
op
.
maxScrollLeft
),
true
)
cm
.
display
.
maxLineChanged
=
false
}
let
takeFocus
=
op
.
focus
&&
op
.
focus
==
activeElt
()
&&
(
!
document
.
hasFocus
||
document
.
hasFocus
())
if
(
op
.
preparedSelection
)
cm
.
display
.
input
.
showSelection
(
op
.
preparedSelection
,
takeFocus
)
if
(
op
.
updatedDisplay
||
op
.
startHeight
!=
cm
.
doc
.
height
)
updateScrollbars
(
cm
,
op
.
barMeasure
)
if
(
op
.
updatedDisplay
)
setDocumentHeight
(
cm
,
op
.
barMeasure
)
if
(
op
.
selectionChanged
)
restartBlink
(
cm
)
if
(
cm
.
state
.
focused
&&
op
.
updateInput
)
cm
.
display
.
input
.
reset
(
op
.
typing
)
if
(
takeFocus
)
ensureFocus
(
op
.
cm
)
}
function
endOperation_finish
(
op
)
{
let
cm
=
op
.
cm
,
display
=
cm
.
display
,
doc
=
cm
.
doc
if
(
op
.
updatedDisplay
)
postUpdateDisplay
(
cm
,
op
.
update
)
// Abort mouse wheel delta measurement, when scrolling explicitly
if
(
display
.
wheelStartX
!=
null
&&
(
op
.
scrollTop
!=
null
||
op
.
scrollLeft
!=
null
||
op
.
scrollToPos
))
display
.
wheelStartX
=
display
.
wheelStartY
=
null
// Propagate the scroll position to the actual DOM scroller
if
(
op
.
scrollTop
!=
null
&&
(
display
.
scroller
.
scrollTop
!=
op
.
scrollTop
||
op
.
forceScroll
))
{
doc
.
scrollTop
=
Math
.
max
(
0
,
Math
.
min
(
display
.
scroller
.
scrollHeight
-
display
.
scroller
.
clientHeight
,
op
.
scrollTop
))
display
.
scrollbars
.
setScrollTop
(
doc
.
scrollTop
)
display
.
scroller
.
scrollTop
=
doc
.
scrollTop
}
if
(
op
.
scrollLeft
!=
null
&&
(
display
.
scroller
.
scrollLeft
!=
op
.
scrollLeft
||
op
.
forceScroll
))
{
doc
.
scrollLeft
=
Math
.
max
(
0
,
Math
.
min
(
display
.
scroller
.
scrollWidth
-
display
.
scroller
.
clientWidth
,
op
.
scrollLeft
))
display
.
scrollbars
.
setScrollLeft
(
doc
.
scrollLeft
)
display
.
scroller
.
scrollLeft
=
doc
.
scrollLeft
alignHorizontally
(
cm
)
}
// If we need to scroll a specific position into view, do so.
if
(
op
.
scrollToPos
)
{
let
coords
=
scrollPosIntoView
(
cm
,
clipPos
(
doc
,
op
.
scrollToPos
.
from
),
clipPos
(
doc
,
op
.
scrollToPos
.
to
),
op
.
scrollToPos
.
margin
)
if
(
op
.
scrollToPos
.
isCursor
&&
cm
.
state
.
focused
)
maybeScrollWindow
(
cm
,
coords
)
}
// Fire events for markers that are hidden/unidden by editing or
// undoing
let
hidden
=
op
.
maybeHiddenMarkers
,
unhidden
=
op
.
maybeUnhiddenMarkers
if
(
hidden
)
for
(
let
i
=
0
;
i
<
hidden
.
length
;
++
i
)
if
(
!
hidden
[
i
].
lines
.
length
)
signal
(
hidden
[
i
],
"
hide
"
)
if
(
unhidden
)
for
(
let
i
=
0
;
i
<
unhidden
.
length
;
++
i
)
if
(
unhidden
[
i
].
lines
.
length
)
signal
(
unhidden
[
i
],
"
unhide
"
)
if
(
display
.
wrapper
.
offsetHeight
)
doc
.
scrollTop
=
cm
.
display
.
scroller
.
scrollTop
// Fire change events, and delayed event handlers
if
(
op
.
changeObjs
)
signal
(
cm
,
"
changes
"
,
cm
,
op
.
changeObjs
)
if
(
op
.
update
)
op
.
update
.
finish
()
}
// Run the given function in an operation
export
function
runInOp
(
cm
,
f
)
{
if
(
cm
.
curOp
)
return
f
()
startOperation
(
cm
)
try
{
return
f
()
}
finally
{
endOperation
(
cm
)
}
}
// Wraps a function in an operation. Returns the wrapped function.
export
function
operation
(
cm
,
f
)
{
return
function
()
{
if
(
cm
.
curOp
)
return
f
.
apply
(
cm
,
arguments
)
startOperation
(
cm
)
try
{
return
f
.
apply
(
cm
,
arguments
)
}
finally
{
endOperation
(
cm
)
}
}
}
// Used to add methods to editor and doc instances, wrapping them in
// operations.
export
function
methodOp
(
f
)
{
return
function
()
{
if
(
this
.
curOp
)
return
f
.
apply
(
this
,
arguments
)
startOperation
(
this
)
try
{
return
f
.
apply
(
this
,
arguments
)
}
finally
{
endOperation
(
this
)
}
}
}
export
function
docMethodOp
(
f
)
{
return
function
()
{
let
cm
=
this
.
cm
if
(
!
cm
||
cm
.
curOp
)
return
f
.
apply
(
this
,
arguments
)
startOperation
(
cm
)
try
{
return
f
.
apply
(
this
,
arguments
)
}
finally
{
endOperation
(
cm
)
}
}
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/operations.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
operations.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/scroll_events.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
chrome
,
gecko
,
ie
,
mac
,
presto
,
safari
,
webkit
}
from
"
../util/browser
"
import
{
e_preventDefault
}
from
"
../util/event
"
import
{
startWorker
}
from
"
./highlight_worker
"
import
{
alignHorizontally
}
from
"
./line_numbers
"
import
{
updateDisplaySimple
}
from
"
./update_display
"
// Sync the scrollable area and scrollbars, ensure the viewport
// covers the visible area.
export
function
setScrollTop
(
cm
,
val
)
{
if
(
Math
.
abs
(
cm
.
doc
.
scrollTop
-
val
)
<
2
)
return
cm
.
doc
.
scrollTop
=
val
if
(
!
gecko
)
updateDisplaySimple
(
cm
,
{
top
:
val
})
if
(
cm
.
display
.
scroller
.
scrollTop
!=
val
)
cm
.
display
.
scroller
.
scrollTop
=
val
cm
.
display
.
scrollbars
.
setScrollTop
(
val
)
if
(
gecko
)
updateDisplaySimple
(
cm
)
startWorker
(
cm
,
100
)
}
// Sync scroller and scrollbar, ensure the gutter elements are
// aligned.
export
function
setScrollLeft
(
cm
,
val
,
isScroller
)
{
if
(
isScroller
?
val
==
cm
.
doc
.
scrollLeft
:
Math
.
abs
(
cm
.
doc
.
scrollLeft
-
val
)
<
2
)
return
val
=
Math
.
min
(
val
,
cm
.
display
.
scroller
.
scrollWidth
-
cm
.
display
.
scroller
.
clientWidth
)
cm
.
doc
.
scrollLeft
=
val
alignHorizontally
(
cm
)
if
(
cm
.
display
.
scroller
.
scrollLeft
!=
val
)
cm
.
display
.
scroller
.
scrollLeft
=
val
cm
.
display
.
scrollbars
.
setScrollLeft
(
val
)
}
// Since the delta values reported on mouse wheel events are
// unstandardized between browsers and even browser versions, and
// generally horribly unpredictable, this code starts by measuring
// the scroll effect that the first few mouse wheel events have,
// and, from that, detects the way it can convert deltas to pixel
// offsets afterwards.
//
// The reason we want to know the amount a wheel event will scroll
// is that it gives us a chance to update the display before the
// actual scrolling happens, reducing flickering.
let
wheelSamples
=
0
,
wheelPixelsPerUnit
=
null
// Fill in a browser-detected starting value on browsers where we
// know one. These don't have to be accurate -- the result of them
// being wrong would just be a slight flicker on the first wheel
// scroll (if it is large enough).
if
(
ie
)
wheelPixelsPerUnit
=
-
.
53
else
if
(
gecko
)
wheelPixelsPerUnit
=
15
else
if
(
chrome
)
wheelPixelsPerUnit
=
-
.
7
else
if
(
safari
)
wheelPixelsPerUnit
=
-
1
/
3
function
wheelEventDelta
(
e
)
{
let
dx
=
e
.
wheelDeltaX
,
dy
=
e
.
wheelDeltaY
if
(
dx
==
null
&&
e
.
detail
&&
e
.
axis
==
e
.
HORIZONTAL_AXIS
)
dx
=
e
.
detail
if
(
dy
==
null
&&
e
.
detail
&&
e
.
axis
==
e
.
VERTICAL_AXIS
)
dy
=
e
.
detail
else
if
(
dy
==
null
)
dy
=
e
.
wheelDelta
return
{
x
:
dx
,
y
:
dy
}
}
export
function
wheelEventPixels
(
e
)
{
let
delta
=
wheelEventDelta
(
e
)
delta
.
x
*=
wheelPixelsPerUnit
delta
.
y
*=
wheelPixelsPerUnit
return
delta
}
export
function
onScrollWheel
(
cm
,
e
)
{
let
delta
=
wheelEventDelta
(
e
),
dx
=
delta
.
x
,
dy
=
delta
.
y
let
display
=
cm
.
display
,
scroll
=
display
.
scroller
// Quit if there's nothing to scroll here
let
canScrollX
=
scroll
.
scrollWidth
>
scroll
.
clientWidth
let
canScrollY
=
scroll
.
scrollHeight
>
scroll
.
clientHeight
if
(
!
(
dx
&&
canScrollX
||
dy
&&
canScrollY
))
return
// Webkit browsers on OS X abort momentum scrolls when the target
// of the scroll event is removed from the scrollable element.
// This hack (see related code in patchDisplay) makes sure the
// element is kept around.
if
(
dy
&&
mac
&&
webkit
)
{
outer
:
for
(
let
cur
=
e
.
target
,
view
=
display
.
view
;
cur
!=
scroll
;
cur
=
cur
.
parentNode
)
{
for
(
let
i
=
0
;
i
<
view
.
length
;
i
++
)
{
if
(
view
[
i
].
node
==
cur
)
{
cm
.
display
.
currentWheelTarget
=
cur
break
outer
}
}
}
}
// On some browsers, horizontal scrolling will cause redraws to
// happen before the gutter has been realigned, causing it to
// wriggle around in a most unseemly way. When we have an
// estimated pixels/delta value, we just handle horizontal
// scrolling entirely here. It'll be slightly off from native, but
// better than glitching out.
if
(
dx
&&
!
gecko
&&
!
presto
&&
wheelPixelsPerUnit
!=
null
)
{
if
(
dy
&&
canScrollY
)
setScrollTop
(
cm
,
Math
.
max
(
0
,
Math
.
min
(
scroll
.
scrollTop
+
dy
*
wheelPixelsPerUnit
,
scroll
.
scrollHeight
-
scroll
.
clientHeight
)))
setScrollLeft
(
cm
,
Math
.
max
(
0
,
Math
.
min
(
scroll
.
scrollLeft
+
dx
*
wheelPixelsPerUnit
,
scroll
.
scrollWidth
-
scroll
.
clientWidth
)))
// Only prevent default scrolling if vertical scrolling is
// actually possible. Otherwise, it causes vertical scroll
// jitter on OSX trackpads when deltaX is small and deltaY
// is large (issue #3579)
if
(
!
dy
||
(
dy
&&
canScrollY
))
e_preventDefault
(
e
)
display
.
wheelStartX
=
null
// Abort measurement, if in progress
return
}
// 'Project' the visible viewport to cover the area that is being
// scrolled into view (if we know enough to estimate it).
if
(
dy
&&
wheelPixelsPerUnit
!=
null
)
{
let
pixels
=
dy
*
wheelPixelsPerUnit
let
top
=
cm
.
doc
.
scrollTop
,
bot
=
top
+
display
.
wrapper
.
clientHeight
if
(
pixels
<
0
)
top
=
Math
.
max
(
0
,
top
+
pixels
-
50
)
else
bot
=
Math
.
min
(
cm
.
doc
.
height
,
bot
+
pixels
+
50
)
updateDisplaySimple
(
cm
,
{
top
:
top
,
bottom
:
bot
})
}
if
(
wheelSamples
<
20
)
{
if
(
display
.
wheelStartX
==
null
)
{
display
.
wheelStartX
=
scroll
.
scrollLeft
;
display
.
wheelStartY
=
scroll
.
scrollTop
display
.
wheelDX
=
dx
;
display
.
wheelDY
=
dy
setTimeout
(()
=>
{
if
(
display
.
wheelStartX
==
null
)
return
let
movedX
=
scroll
.
scrollLeft
-
display
.
wheelStartX
let
movedY
=
scroll
.
scrollTop
-
display
.
wheelStartY
let
sample
=
(
movedY
&&
display
.
wheelDY
&&
movedY
/
display
.
wheelDY
)
||
(
movedX
&&
display
.
wheelDX
&&
movedX
/
display
.
wheelDX
)
display
.
wheelStartX
=
display
.
wheelStartY
=
null
if
(
!
sample
)
return
wheelPixelsPerUnit
=
(
wheelPixelsPerUnit
*
wheelSamples
+
sample
)
/
(
wheelSamples
+
1
)
++
wheelSamples
},
200
)
}
else
{
display
.
wheelDX
+=
dx
;
display
.
wheelDY
+=
dy
}
}
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/scroll_events.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
scroll_events.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/scrollbars.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
addClass
,
elt
,
rmClass
}
from
"
../util/dom
"
import
{
on
}
from
"
../util/event
"
import
{
scrollGap
,
paddingVert
}
from
"
../measurement/position_measurement
"
import
{
ie
,
ie_version
,
mac
,
mac_geMountainLion
}
from
"
../util/browser
"
import
{
updateHeightsInViewport
}
from
"
./update_lines
"
import
{
Delayed
}
from
"
../util/misc
"
import
{
setScrollLeft
,
setScrollTop
}
from
"
./scroll_events
"
// SCROLLBARS
// Prepare DOM reads needed to update the scrollbars. Done in one
// shot to minimize update/measure roundtrips.
export
function
measureForScrollbars
(
cm
)
{
let
d
=
cm
.
display
,
gutterW
=
d
.
gutters
.
offsetWidth
let
docH
=
Math
.
round
(
cm
.
doc
.
height
+
paddingVert
(
cm
.
display
))
return
{
clientHeight
:
d
.
scroller
.
clientHeight
,
viewHeight
:
d
.
wrapper
.
clientHeight
,
scrollWidth
:
d
.
scroller
.
scrollWidth
,
clientWidth
:
d
.
scroller
.
clientWidth
,
viewWidth
:
d
.
wrapper
.
clientWidth
,
barLeft
:
cm
.
options
.
fixedGutter
?
gutterW
:
0
,
docHeight
:
docH
,
scrollHeight
:
docH
+
scrollGap
(
cm
)
+
d
.
barHeight
,
nativeBarWidth
:
d
.
nativeBarWidth
,
gutterWidth
:
gutterW
}
}
class
NativeScrollbars
{
constructor
(
place
,
scroll
,
cm
)
{
this
.
cm
=
cm
let
vert
=
this
.
vert
=
elt
(
"
div
"
,
[
elt
(
"
div
"
,
null
,
null
,
"
min-width: 1px
"
)],
"
CodeMirror-vscrollbar
"
)
let
horiz
=
this
.
horiz
=
elt
(
"
div
"
,
[
elt
(
"
div
"
,
null
,
null
,
"
height: 100%; min-height: 1px
"
)],
"
CodeMirror-hscrollbar
"
)
place
(
vert
);
place
(
horiz
)
on
(
vert
,
"
scroll
"
,
()
=>
{
if
(
vert
.
clientHeight
)
scroll
(
vert
.
scrollTop
,
"
vertical
"
)
})
on
(
horiz
,
"
scroll
"
,
()
=>
{
if
(
horiz
.
clientWidth
)
scroll
(
horiz
.
scrollLeft
,
"
horizontal
"
)
})
this
.
checkedZeroWidth
=
false
// Need to set a minimum width to see the scrollbar on IE7 (but must not set it on IE8).
if
(
ie
&&
ie_version
<
8
)
this
.
horiz
.
style
.
minHeight
=
this
.
vert
.
style
.
minWidth
=
"
18px
"
}
update
(
measure
)
{
let
needsH
=
measure
.
scrollWidth
>
measure
.
clientWidth
+
1
let
needsV
=
measure
.
scrollHeight
>
measure
.
clientHeight
+
1
let
sWidth
=
measure
.
nativeBarWidth
if
(
needsV
)
{
this
.
vert
.
style
.
display
=
"
block
"
this
.
vert
.
style
.
bottom
=
needsH
?
sWidth
+
"
px
"
:
"
0
"
let
totalHeight
=
measure
.
viewHeight
-
(
needsH
?
sWidth
:
0
)
// A bug in IE8 can cause this value to be negative, so guard it.
this
.
vert
.
firstChild
.
style
.
height
=
Math
.
max
(
0
,
measure
.
scrollHeight
-
measure
.
clientHeight
+
totalHeight
)
+
"
px
"
}
else
{
this
.
vert
.
style
.
display
=
""
this
.
vert
.
firstChild
.
style
.
height
=
"
0
"
}
if
(
needsH
)
{
this
.
horiz
.
style
.
display
=
"
block
"
this
.
horiz
.
style
.
right
=
needsV
?
sWidth
+
"
px
"
:
"
0
"
this
.
horiz
.
style
.
left
=
measure
.
barLeft
+
"
px
"
let
totalWidth
=
measure
.
viewWidth
-
measure
.
barLeft
-
(
needsV
?
sWidth
:
0
)
this
.
horiz
.
firstChild
.
style
.
width
=
Math
.
max
(
0
,
measure
.
scrollWidth
-
measure
.
clientWidth
+
totalWidth
)
+
"
px
"
}
else
{
this
.
horiz
.
style
.
display
=
""
this
.
horiz
.
firstChild
.
style
.
width
=
"
0
"
}
if
(
!
this
.
checkedZeroWidth
&&
measure
.
clientHeight
>
0
)
{
if
(
sWidth
==
0
)
this
.
zeroWidthHack
()
this
.
checkedZeroWidth
=
true
}
return
{
right
:
needsV
?
sWidth
:
0
,
bottom
:
needsH
?
sWidth
:
0
}
}
setScrollLeft
(
pos
)
{
if
(
this
.
horiz
.
scrollLeft
!=
pos
)
this
.
horiz
.
scrollLeft
=
pos
if
(
this
.
disableHoriz
)
this
.
enableZeroWidthBar
(
this
.
horiz
,
this
.
disableHoriz
)
}
setScrollTop
(
pos
)
{
if
(
this
.
vert
.
scrollTop
!=
pos
)
this
.
vert
.
scrollTop
=
pos
if
(
this
.
disableVert
)
this
.
enableZeroWidthBar
(
this
.
vert
,
this
.
disableVert
)
}
zeroWidthHack
()
{
let
w
=
mac
&&
!
mac_geMountainLion
?
"
12px
"
:
"
18px
"
this
.
horiz
.
style
.
height
=
this
.
vert
.
style
.
width
=
w
this
.
horiz
.
style
.
pointerEvents
=
this
.
vert
.
style
.
pointerEvents
=
"
none
"
this
.
disableHoriz
=
new
Delayed
this
.
disableVert
=
new
Delayed
}
enableZeroWidthBar
(
bar
,
delay
)
{
bar
.
style
.
pointerEvents
=
"
auto
"
function
maybeDisable
()
{
// To find out whether the scrollbar is still visible, we
// check whether the element under the pixel in the bottom
// left corner of the scrollbar box is the scrollbar box
// itself (when the bar is still visible) or its filler child
// (when the bar is hidden). If it is still visible, we keep
// it enabled, if it's hidden, we disable pointer events.
let
box
=
bar
.
getBoundingClientRect
()
let
elt
=
document
.
elementFromPoint
(
box
.
left
+
1
,
box
.
bottom
-
1
)
if
(
elt
!=
bar
)
bar
.
style
.
pointerEvents
=
"
none
"
else
delay
.
set
(
1000
,
maybeDisable
)
}
delay
.
set
(
1000
,
maybeDisable
)
}
clear
()
{
let
parent
=
this
.
horiz
.
parentNode
parent
.
removeChild
(
this
.
horiz
)
parent
.
removeChild
(
this
.
vert
)
}
}
class
NullScrollbars
{
update
()
{
return
{
bottom
:
0
,
right
:
0
}
}
setScrollLeft
()
{}
setScrollTop
()
{}
clear
()
{}
}
export
function
updateScrollbars
(
cm
,
measure
)
{
if
(
!
measure
)
measure
=
measureForScrollbars
(
cm
)
let
startWidth
=
cm
.
display
.
barWidth
,
startHeight
=
cm
.
display
.
barHeight
updateScrollbarsInner
(
cm
,
measure
)
for
(
let
i
=
0
;
i
<
4
&&
startWidth
!=
cm
.
display
.
barWidth
||
startHeight
!=
cm
.
display
.
barHeight
;
i
++
)
{
if
(
startWidth
!=
cm
.
display
.
barWidth
&&
cm
.
options
.
lineWrapping
)
updateHeightsInViewport
(
cm
)
updateScrollbarsInner
(
cm
,
measureForScrollbars
(
cm
))
startWidth
=
cm
.
display
.
barWidth
;
startHeight
=
cm
.
display
.
barHeight
}
}
// Re-synchronize the fake scrollbars with the actual size of the
// content.
function
updateScrollbarsInner
(
cm
,
measure
)
{
let
d
=
cm
.
display
let
sizes
=
d
.
scrollbars
.
update
(
measure
)
d
.
sizer
.
style
.
paddingRight
=
(
d
.
barWidth
=
sizes
.
right
)
+
"
px
"
d
.
sizer
.
style
.
paddingBottom
=
(
d
.
barHeight
=
sizes
.
bottom
)
+
"
px
"
d
.
heightForcer
.
style
.
borderBottom
=
sizes
.
bottom
+
"
px solid transparent
"
if
(
sizes
.
right
&&
sizes
.
bottom
)
{
d
.
scrollbarFiller
.
style
.
display
=
"
block
"
d
.
scrollbarFiller
.
style
.
height
=
sizes
.
bottom
+
"
px
"
d
.
scrollbarFiller
.
style
.
width
=
sizes
.
right
+
"
px
"
}
else
d
.
scrollbarFiller
.
style
.
display
=
""
if
(
sizes
.
bottom
&&
cm
.
options
.
coverGutterNextToScrollbar
&&
cm
.
options
.
fixedGutter
)
{
d
.
gutterFiller
.
style
.
display
=
"
block
"
d
.
gutterFiller
.
style
.
height
=
sizes
.
bottom
+
"
px
"
d
.
gutterFiller
.
style
.
width
=
measure
.
gutterWidth
+
"
px
"
}
else
d
.
gutterFiller
.
style
.
display
=
""
}
export
let
scrollbarModel
=
{
"
native
"
:
NativeScrollbars
,
"
null
"
:
NullScrollbars
}
export
function
initScrollbars
(
cm
)
{
if
(
cm
.
display
.
scrollbars
)
{
cm
.
display
.
scrollbars
.
clear
()
if
(
cm
.
display
.
scrollbars
.
addClass
)
rmClass
(
cm
.
display
.
wrapper
,
cm
.
display
.
scrollbars
.
addClass
)
}
cm
.
display
.
scrollbars
=
new
scrollbarModel
[
cm
.
options
.
scrollbarStyle
](
node
=>
{
cm
.
display
.
wrapper
.
insertBefore
(
node
,
cm
.
display
.
scrollbarFiller
)
// Prevent clicks in the scrollbars from killing focus
on
(
node
,
"
mousedown
"
,
()
=>
{
if
(
cm
.
state
.
focused
)
setTimeout
(()
=>
cm
.
display
.
input
.
focus
(),
0
)
})
node
.
setAttribute
(
"
cm-not-content
"
,
"
true
"
)
},
(
pos
,
axis
)
=>
{
if
(
axis
==
"
horizontal
"
)
setScrollLeft
(
cm
,
pos
)
else
setScrollTop
(
cm
,
pos
)
},
cm
)
if
(
cm
.
display
.
scrollbars
.
addClass
)
addClass
(
cm
.
display
.
wrapper
,
cm
.
display
.
scrollbars
.
addClass
)
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/scrollbars.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
scrollbars.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/scrolling.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
Pos
}
from
"
../line/pos
"
import
{
cursorCoords
,
displayHeight
,
displayWidth
,
estimateCoords
,
paddingTop
,
paddingVert
,
scrollGap
,
textHeight
}
from
"
../measurement/position_measurement
"
import
{
phantom
}
from
"
../util/browser
"
import
{
elt
}
from
"
../util/dom
"
import
{
signalDOMEvent
}
from
"
../util/event
"
import
{
setScrollLeft
,
setScrollTop
}
from
"
./scroll_events
"
// SCROLLING THINGS INTO VIEW
// If an editor sits on the top or bottom of the window, partially
// scrolled out of view, this ensures that the cursor is visible.
export
function
maybeScrollWindow
(
cm
,
coords
)
{
if
(
signalDOMEvent
(
cm
,
"
scrollCursorIntoView
"
))
return
let
display
=
cm
.
display
,
box
=
display
.
sizer
.
getBoundingClientRect
(),
doScroll
=
null
if
(
coords
.
top
+
box
.
top
<
0
)
doScroll
=
true
else
if
(
coords
.
bottom
+
box
.
top
>
(
window
.
innerHeight
||
document
.
documentElement
.
clientHeight
))
doScroll
=
false
if
(
doScroll
!=
null
&&
!
phantom
)
{
let
scrollNode
=
elt
(
"
div
"
,
"
\
u200b
"
,
null
,
`position: absolute;
top:
${
coords
.
top
-
display
.
viewOffset
-
paddingTop
(
cm
.
display
)}
px;
height:
${
coords
.
bottom
-
coords
.
top
+
scrollGap
(
cm
)
+
display
.
barHeight
}
px;
left:
${
coords
.
left
}
px; width: 2px;`
)
cm
.
display
.
lineSpace
.
appendChild
(
scrollNode
)
scrollNode
.
scrollIntoView
(
doScroll
)
cm
.
display
.
lineSpace
.
removeChild
(
scrollNode
)
}
}
// Scroll a given position into view (immediately), verifying that
// it actually became visible (as line heights are accurately
// measured, the position of something may 'drift' during drawing).
export
function
scrollPosIntoView
(
cm
,
pos
,
end
,
margin
)
{
if
(
margin
==
null
)
margin
=
0
let
coords
for
(
let
limit
=
0
;
limit
<
5
;
limit
++
)
{
let
changed
=
false
coords
=
cursorCoords
(
cm
,
pos
)
let
endCoords
=
!
end
||
end
==
pos
?
coords
:
cursorCoords
(
cm
,
end
)
let
scrollPos
=
calculateScrollPos
(
cm
,
Math
.
min
(
coords
.
left
,
endCoords
.
left
),
Math
.
min
(
coords
.
top
,
endCoords
.
top
)
-
margin
,
Math
.
max
(
coords
.
left
,
endCoords
.
left
),
Math
.
max
(
coords
.
bottom
,
endCoords
.
bottom
)
+
margin
)
let
startTop
=
cm
.
doc
.
scrollTop
,
startLeft
=
cm
.
doc
.
scrollLeft
if
(
scrollPos
.
scrollTop
!=
null
)
{
setScrollTop
(
cm
,
scrollPos
.
scrollTop
)
if
(
Math
.
abs
(
cm
.
doc
.
scrollTop
-
startTop
)
>
1
)
changed
=
true
}
if
(
scrollPos
.
scrollLeft
!=
null
)
{
setScrollLeft
(
cm
,
scrollPos
.
scrollLeft
)
if
(
Math
.
abs
(
cm
.
doc
.
scrollLeft
-
startLeft
)
>
1
)
changed
=
true
}
if
(
!
changed
)
break
}
return
coords
}
// Scroll a given set of coordinates into view (immediately).
export
function
scrollIntoView
(
cm
,
x1
,
y1
,
x2
,
y2
)
{
let
scrollPos
=
calculateScrollPos
(
cm
,
x1
,
y1
,
x2
,
y2
)
if
(
scrollPos
.
scrollTop
!=
null
)
setScrollTop
(
cm
,
scrollPos
.
scrollTop
)
if
(
scrollPos
.
scrollLeft
!=
null
)
setScrollLeft
(
cm
,
scrollPos
.
scrollLeft
)
}
// Calculate a new scroll position needed to scroll the given
// rectangle into view. Returns an object with scrollTop and
// scrollLeft properties. When these are undefined, the
// vertical/horizontal position does not need to be adjusted.
export
function
calculateScrollPos
(
cm
,
x1
,
y1
,
x2
,
y2
)
{
let
display
=
cm
.
display
,
snapMargin
=
textHeight
(
cm
.
display
)
if
(
y1
<
0
)
y1
=
0
let
screentop
=
cm
.
curOp
&&
cm
.
curOp
.
scrollTop
!=
null
?
cm
.
curOp
.
scrollTop
:
display
.
scroller
.
scrollTop
let
screen
=
displayHeight
(
cm
),
result
=
{}
if
(
y2
-
y1
>
screen
)
y2
=
y1
+
screen
let
docBottom
=
cm
.
doc
.
height
+
paddingVert
(
display
)
let
atTop
=
y1
<
snapMargin
,
atBottom
=
y2
>
docBottom
-
snapMargin
if
(
y1
<
screentop
)
{
result
.
scrollTop
=
atTop
?
0
:
y1
}
else
if
(
y2
>
screentop
+
screen
)
{
let
newTop
=
Math
.
min
(
y1
,
(
atBottom
?
docBottom
:
y2
)
-
screen
)
if
(
newTop
!=
screentop
)
result
.
scrollTop
=
newTop
}
let
screenleft
=
cm
.
curOp
&&
cm
.
curOp
.
scrollLeft
!=
null
?
cm
.
curOp
.
scrollLeft
:
display
.
scroller
.
scrollLeft
let
screenw
=
displayWidth
(
cm
)
-
(
cm
.
options
.
fixedGutter
?
display
.
gutters
.
offsetWidth
:
0
)
let
tooWide
=
x2
-
x1
>
screenw
if
(
tooWide
)
x2
=
x1
+
screenw
if
(
x1
<
10
)
result
.
scrollLeft
=
0
else
if
(
x1
<
screenleft
)
result
.
scrollLeft
=
Math
.
max
(
0
,
x1
-
(
tooWide
?
0
:
10
))
else
if
(
x2
>
screenw
+
screenleft
-
3
)
result
.
scrollLeft
=
x2
+
(
tooWide
?
0
:
10
)
-
screenw
return
result
}
// Store a relative adjustment to the scroll position in the current
// operation (to be applied when the operation finishes).
export
function
addToScrollPos
(
cm
,
left
,
top
)
{
if
(
left
!=
null
||
top
!=
null
)
resolveScrollToPos
(
cm
)
if
(
left
!=
null
)
cm
.
curOp
.
scrollLeft
=
(
cm
.
curOp
.
scrollLeft
==
null
?
cm
.
doc
.
scrollLeft
:
cm
.
curOp
.
scrollLeft
)
+
left
if
(
top
!=
null
)
cm
.
curOp
.
scrollTop
=
(
cm
.
curOp
.
scrollTop
==
null
?
cm
.
doc
.
scrollTop
:
cm
.
curOp
.
scrollTop
)
+
top
}
// Make sure that at the end of the operation the current cursor is
// shown.
export
function
ensureCursorVisible
(
cm
)
{
resolveScrollToPos
(
cm
)
let
cur
=
cm
.
getCursor
(),
from
=
cur
,
to
=
cur
if
(
!
cm
.
options
.
lineWrapping
)
{
from
=
cur
.
ch
?
Pos
(
cur
.
line
,
cur
.
ch
-
1
)
:
cur
to
=
Pos
(
cur
.
line
,
cur
.
ch
+
1
)
}
cm
.
curOp
.
scrollToPos
=
{
from
:
from
,
to
:
to
,
margin
:
cm
.
options
.
cursorScrollMargin
,
isCursor
:
true
}
}
// When an operation has its scrollToPos property set, and another
// scroll action is applied before the end of the operation, this
// 'simulates' scrolling that position into view in a cheap way, so
// that the effect of intermediate scroll commands is not ignored.
export
function
resolveScrollToPos
(
cm
)
{
let
range
=
cm
.
curOp
.
scrollToPos
if
(
range
)
{
cm
.
curOp
.
scrollToPos
=
null
let
from
=
estimateCoords
(
cm
,
range
.
from
),
to
=
estimateCoords
(
cm
,
range
.
to
)
let
sPos
=
calculateScrollPos
(
cm
,
Math
.
min
(
from
.
left
,
to
.
left
),
Math
.
min
(
from
.
top
,
to
.
top
)
-
range
.
margin
,
Math
.
max
(
from
.
right
,
to
.
right
),
Math
.
max
(
from
.
bottom
,
to
.
bottom
)
+
range
.
margin
)
cm
.
scrollTo
(
sPos
.
scrollLeft
,
sPos
.
scrollTop
)
}
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/scrolling.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
scrolling.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/selection.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
Pos
}
from
"
../line/pos
"
import
{
visualLine
}
from
"
../line/spans
"
import
{
getLine
}
from
"
../line/utils_line
"
import
{
charCoords
,
cursorCoords
,
displayWidth
,
paddingH
}
from
"
../measurement/position_measurement
"
import
{
getOrder
,
iterateBidiSections
}
from
"
../util/bidi
"
import
{
elt
}
from
"
../util/dom
"
export
function
updateSelection
(
cm
)
{
cm
.
display
.
input
.
showSelection
(
cm
.
display
.
input
.
prepareSelection
())
}
export
function
prepareSelection
(
cm
,
primary
)
{
let
doc
=
cm
.
doc
,
result
=
{}
let
curFragment
=
result
.
cursors
=
document
.
createDocumentFragment
()
let
selFragment
=
result
.
selection
=
document
.
createDocumentFragment
()
for
(
let
i
=
0
;
i
<
doc
.
sel
.
ranges
.
length
;
i
++
)
{
if
(
primary
===
false
&&
i
==
doc
.
sel
.
primIndex
)
continue
let
range
=
doc
.
sel
.
ranges
[
i
]
if
(
range
.
from
().
line
>=
cm
.
display
.
viewTo
||
range
.
to
().
line
<
cm
.
display
.
viewFrom
)
continue
let
collapsed
=
range
.
empty
()
if
(
collapsed
||
cm
.
options
.
showCursorWhenSelecting
)
drawSelectionCursor
(
cm
,
range
.
head
,
curFragment
)
if
(
!
collapsed
)
drawSelectionRange
(
cm
,
range
,
selFragment
)
}
return
result
}
// Draws a cursor for the given range
export
function
drawSelectionCursor
(
cm
,
head
,
output
)
{
let
pos
=
cursorCoords
(
cm
,
head
,
"
div
"
,
null
,
null
,
!
cm
.
options
.
singleCursorHeightPerLine
)
let
cursor
=
output
.
appendChild
(
elt
(
"
div
"
,
"
\
u00a0
"
,
"
CodeMirror-cursor
"
))
cursor
.
style
.
left
=
pos
.
left
+
"
px
"
cursor
.
style
.
top
=
pos
.
top
+
"
px
"
cursor
.
style
.
height
=
Math
.
max
(
0
,
pos
.
bottom
-
pos
.
top
)
*
cm
.
options
.
cursorHeight
+
"
px
"
if
(
pos
.
other
)
{
// Secondary cursor, shown when on a 'jump' in bi-directional text
let
otherCursor
=
output
.
appendChild
(
elt
(
"
div
"
,
"
\
u00a0
"
,
"
CodeMirror-cursor CodeMirror-secondarycursor
"
))
otherCursor
.
style
.
display
=
""
otherCursor
.
style
.
left
=
pos
.
other
.
left
+
"
px
"
otherCursor
.
style
.
top
=
pos
.
other
.
top
+
"
px
"
otherCursor
.
style
.
height
=
(
pos
.
other
.
bottom
-
pos
.
other
.
top
)
*
.
85
+
"
px
"
}
}
// Draws the given range as a highlighted selection
function
drawSelectionRange
(
cm
,
range
,
output
)
{
let
display
=
cm
.
display
,
doc
=
cm
.
doc
let
fragment
=
document
.
createDocumentFragment
()
let
padding
=
paddingH
(
cm
.
display
),
leftSide
=
padding
.
left
let
rightSide
=
Math
.
max
(
display
.
sizerWidth
,
displayWidth
(
cm
)
-
display
.
sizer
.
offsetLeft
)
-
padding
.
right
function
add
(
left
,
top
,
width
,
bottom
)
{
if
(
top
<
0
)
top
=
0
top
=
Math
.
round
(
top
)
bottom
=
Math
.
round
(
bottom
)
fragment
.
appendChild
(
elt
(
"
div
"
,
null
,
"
CodeMirror-selected
"
,
`position: absolute; left:
${
left
}
px;
top:
${
top
}
px; width:
${
width
==
null
?
rightSide
-
left
:
width
}
px;
height:
${
bottom
-
top
}
px`
))
}
function
drawForLine
(
line
,
fromArg
,
toArg
)
{
let
lineObj
=
getLine
(
doc
,
line
)
let
lineLen
=
lineObj
.
text
.
length
let
start
,
end
function
coords
(
ch
,
bias
)
{
return
charCoords
(
cm
,
Pos
(
line
,
ch
),
"
div
"
,
lineObj
,
bias
)
}
iterateBidiSections
(
getOrder
(
lineObj
),
fromArg
||
0
,
toArg
==
null
?
lineLen
:
toArg
,
(
from
,
to
,
dir
)
=>
{
let
leftPos
=
coords
(
from
,
"
left
"
),
rightPos
,
left
,
right
if
(
from
==
to
)
{
rightPos
=
leftPos
left
=
right
=
leftPos
.
left
}
else
{
rightPos
=
coords
(
to
-
1
,
"
right
"
)
if
(
dir
==
"
rtl
"
)
{
let
tmp
=
leftPos
;
leftPos
=
rightPos
;
rightPos
=
tmp
}
left
=
leftPos
.
left
right
=
rightPos
.
right
}
if
(
fromArg
==
null
&&
from
==
0
)
left
=
leftSide
if
(
rightPos
.
top
-
leftPos
.
top
>
3
)
{
// Different lines, draw top part
add
(
left
,
leftPos
.
top
,
null
,
leftPos
.
bottom
)
left
=
leftSide
if
(
leftPos
.
bottom
<
rightPos
.
top
)
add
(
left
,
leftPos
.
bottom
,
null
,
rightPos
.
top
)
}
if
(
toArg
==
null
&&
to
==
lineLen
)
right
=
rightSide
if
(
!
start
||
leftPos
.
top
<
start
.
top
||
leftPos
.
top
==
start
.
top
&&
leftPos
.
left
<
start
.
left
)
start
=
leftPos
if
(
!
end
||
rightPos
.
bottom
>
end
.
bottom
||
rightPos
.
bottom
==
end
.
bottom
&&
rightPos
.
right
>
end
.
right
)
end
=
rightPos
if
(
left
<
leftSide
+
1
)
left
=
leftSide
add
(
left
,
rightPos
.
top
,
right
-
left
,
rightPos
.
bottom
)
})
return
{
start
:
start
,
end
:
end
}
}
let
sFrom
=
range
.
from
(),
sTo
=
range
.
to
()
if
(
sFrom
.
line
==
sTo
.
line
)
{
drawForLine
(
sFrom
.
line
,
sFrom
.
ch
,
sTo
.
ch
)
}
else
{
let
fromLine
=
getLine
(
doc
,
sFrom
.
line
),
toLine
=
getLine
(
doc
,
sTo
.
line
)
let
singleVLine
=
visualLine
(
fromLine
)
==
visualLine
(
toLine
)
let
leftEnd
=
drawForLine
(
sFrom
.
line
,
sFrom
.
ch
,
singleVLine
?
fromLine
.
text
.
length
+
1
:
null
).
end
let
rightStart
=
drawForLine
(
sTo
.
line
,
singleVLine
?
0
:
null
,
sTo
.
ch
).
start
if
(
singleVLine
)
{
if
(
leftEnd
.
top
<
rightStart
.
top
-
2
)
{
add
(
leftEnd
.
right
,
leftEnd
.
top
,
null
,
leftEnd
.
bottom
)
add
(
leftSide
,
rightStart
.
top
,
rightStart
.
left
,
rightStart
.
bottom
)
}
else
{
add
(
leftEnd
.
right
,
leftEnd
.
top
,
rightStart
.
left
-
leftEnd
.
right
,
leftEnd
.
bottom
)
}
}
if
(
leftEnd
.
bottom
<
rightStart
.
top
)
add
(
leftSide
,
leftEnd
.
bottom
,
null
,
rightStart
.
top
)
}
output
.
appendChild
(
fragment
)
}
// Cursor-blinking
export
function
restartBlink
(
cm
)
{
if
(
!
cm
.
state
.
focused
)
return
let
display
=
cm
.
display
clearInterval
(
display
.
blinker
)
let
on
=
true
display
.
cursorDiv
.
style
.
visibility
=
""
if
(
cm
.
options
.
cursorBlinkRate
>
0
)
display
.
blinker
=
setInterval
(()
=>
display
.
cursorDiv
.
style
.
visibility
=
(
on
=
!
on
)
?
""
:
"
hidden
"
,
cm
.
options
.
cursorBlinkRate
)
else
if
(
cm
.
options
.
cursorBlinkRate
<
0
)
display
.
cursorDiv
.
style
.
visibility
=
"
hidden
"
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/selection.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
selection.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/update_display.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
sawCollapsedSpans
}
from
"
../line/saw_special_spans
"
import
{
heightAtLine
,
visualLineEndNo
,
visualLineNo
}
from
"
../line/spans
"
import
{
getLine
,
lineNumberFor
}
from
"
../line/utils_line
"
import
{
displayHeight
,
displayWidth
,
getDimensions
,
paddingVert
,
scrollGap
}
from
"
../measurement/position_measurement
"
import
{
mac
,
webkit
}
from
"
../util/browser
"
import
{
activeElt
,
removeChildren
}
from
"
../util/dom
"
import
{
hasHandler
,
signal
}
from
"
../util/event
"
import
{
indexOf
}
from
"
../util/misc
"
import
{
buildLineElement
,
updateLineForChanges
}
from
"
./update_line
"
import
{
startWorker
}
from
"
./highlight_worker
"
import
{
maybeUpdateLineNumberWidth
}
from
"
./line_numbers
"
import
{
measureForScrollbars
,
updateScrollbars
}
from
"
./scrollbars
"
import
{
updateSelection
}
from
"
./selection
"
import
{
updateHeightsInViewport
,
visibleLines
}
from
"
./update_lines
"
import
{
adjustView
,
countDirtyView
,
resetView
}
from
"
./view_tracking
"
// DISPLAY DRAWING
export
class
DisplayUpdate
{
constructor
(
cm
,
viewport
,
force
)
{
let
display
=
cm
.
display
this
.
viewport
=
viewport
// Store some values that we'll need later (but don't want to force a relayout for)
this
.
visible
=
visibleLines
(
display
,
cm
.
doc
,
viewport
)
this
.
editorIsHidden
=
!
display
.
wrapper
.
offsetWidth
this
.
wrapperHeight
=
display
.
wrapper
.
clientHeight
this
.
wrapperWidth
=
display
.
wrapper
.
clientWidth
this
.
oldDisplayWidth
=
displayWidth
(
cm
)
this
.
force
=
force
this
.
dims
=
getDimensions
(
cm
)
this
.
events
=
[]
}
signal
(
emitter
,
type
)
{
if
(
hasHandler
(
emitter
,
type
))
this
.
events
.
push
(
arguments
)
}
finish
()
{
for
(
let
i
=
0
;
i
<
this
.
events
.
length
;
i
++
)
signal
.
apply
(
null
,
this
.
events
[
i
])
}
}
export
function
maybeClipScrollbars
(
cm
)
{
let
display
=
cm
.
display
if
(
!
display
.
scrollbarsClipped
&&
display
.
scroller
.
offsetWidth
)
{
display
.
nativeBarWidth
=
display
.
scroller
.
offsetWidth
-
display
.
scroller
.
clientWidth
display
.
heightForcer
.
style
.
height
=
scrollGap
(
cm
)
+
"
px
"
display
.
sizer
.
style
.
marginBottom
=
-
display
.
nativeBarWidth
+
"
px
"
display
.
sizer
.
style
.
borderRightWidth
=
scrollGap
(
cm
)
+
"
px
"
display
.
scrollbarsClipped
=
true
}
}
// Does the actual updating of the line display. Bails out
// (returning false) when there is nothing to be done and forced is
// false.
export
function
updateDisplayIfNeeded
(
cm
,
update
)
{
let
display
=
cm
.
display
,
doc
=
cm
.
doc
if
(
update
.
editorIsHidden
)
{
resetView
(
cm
)
return
false
}
// Bail out if the visible area is already rendered and nothing changed.
if
(
!
update
.
force
&&
update
.
visible
.
from
>=
display
.
viewFrom
&&
update
.
visible
.
to
<=
display
.
viewTo
&&
(
display
.
updateLineNumbers
==
null
||
display
.
updateLineNumbers
>=
display
.
viewTo
)
&&
display
.
renderedView
==
display
.
view
&&
countDirtyView
(
cm
)
==
0
)
return
false
if
(
maybeUpdateLineNumberWidth
(
cm
))
{
resetView
(
cm
)
update
.
dims
=
getDimensions
(
cm
)
}
// Compute a suitable new viewport (from & to)
let
end
=
doc
.
first
+
doc
.
size
let
from
=
Math
.
max
(
update
.
visible
.
from
-
cm
.
options
.
viewportMargin
,
doc
.
first
)
let
to
=
Math
.
min
(
end
,
update
.
visible
.
to
+
cm
.
options
.
viewportMargin
)
if
(
display
.
viewFrom
<
from
&&
from
-
display
.
viewFrom
<
20
)
from
=
Math
.
max
(
doc
.
first
,
display
.
viewFrom
)
if
(
display
.
viewTo
>
to
&&
display
.
viewTo
-
to
<
20
)
to
=
Math
.
min
(
end
,
display
.
viewTo
)
if
(
sawCollapsedSpans
)
{
from
=
visualLineNo
(
cm
.
doc
,
from
)
to
=
visualLineEndNo
(
cm
.
doc
,
to
)
}
let
different
=
from
!=
display
.
viewFrom
||
to
!=
display
.
viewTo
||
display
.
lastWrapHeight
!=
update
.
wrapperHeight
||
display
.
lastWrapWidth
!=
update
.
wrapperWidth
adjustView
(
cm
,
from
,
to
)
display
.
viewOffset
=
heightAtLine
(
getLine
(
cm
.
doc
,
display
.
viewFrom
))
// Position the mover div to align with the current scroll position
cm
.
display
.
mover
.
style
.
top
=
display
.
viewOffset
+
"
px
"
let
toUpdate
=
countDirtyView
(
cm
)
if
(
!
different
&&
toUpdate
==
0
&&
!
update
.
force
&&
display
.
renderedView
==
display
.
view
&&
(
display
.
updateLineNumbers
==
null
||
display
.
updateLineNumbers
>=
display
.
viewTo
))
return
false
// For big changes, we hide the enclosing element during the
// update, since that speeds up the operations on most browsers.
let
focused
=
activeElt
()
if
(
toUpdate
>
4
)
display
.
lineDiv
.
style
.
display
=
"
none
"
patchDisplay
(
cm
,
display
.
updateLineNumbers
,
update
.
dims
)
if
(
toUpdate
>
4
)
display
.
lineDiv
.
style
.
display
=
""
display
.
renderedView
=
display
.
view
// There might have been a widget with a focused element that got
// hidden or updated, if so re-focus it.
if
(
focused
&&
activeElt
()
!=
focused
&&
focused
.
offsetHeight
)
focused
.
focus
()
// Prevent selection and cursors from interfering with the scroll
// width and height.
removeChildren
(
display
.
cursorDiv
)
removeChildren
(
display
.
selectionDiv
)
display
.
gutters
.
style
.
height
=
display
.
sizer
.
style
.
minHeight
=
0
if
(
different
)
{
display
.
lastWrapHeight
=
update
.
wrapperHeight
display
.
lastWrapWidth
=
update
.
wrapperWidth
startWorker
(
cm
,
400
)
}
display
.
updateLineNumbers
=
null
return
true
}
export
function
postUpdateDisplay
(
cm
,
update
)
{
let
viewport
=
update
.
viewport
for
(
let
first
=
true
;;
first
=
false
)
{
if
(
!
first
||
!
cm
.
options
.
lineWrapping
||
update
.
oldDisplayWidth
==
displayWidth
(
cm
))
{
// Clip forced viewport to actual scrollable area.
if
(
viewport
&&
viewport
.
top
!=
null
)
viewport
=
{
top
:
Math
.
min
(
cm
.
doc
.
height
+
paddingVert
(
cm
.
display
)
-
displayHeight
(
cm
),
viewport
.
top
)}
// Updated line heights might result in the drawn area not
// actually covering the viewport. Keep looping until it does.
update
.
visible
=
visibleLines
(
cm
.
display
,
cm
.
doc
,
viewport
)
if
(
update
.
visible
.
from
>=
cm
.
display
.
viewFrom
&&
update
.
visible
.
to
<=
cm
.
display
.
viewTo
)
break
}
if
(
!
updateDisplayIfNeeded
(
cm
,
update
))
break
updateHeightsInViewport
(
cm
)
let
barMeasure
=
measureForScrollbars
(
cm
)
updateSelection
(
cm
)
updateScrollbars
(
cm
,
barMeasure
)
setDocumentHeight
(
cm
,
barMeasure
)
}
update
.
signal
(
cm
,
"
update
"
,
cm
)
if
(
cm
.
display
.
viewFrom
!=
cm
.
display
.
reportedViewFrom
||
cm
.
display
.
viewTo
!=
cm
.
display
.
reportedViewTo
)
{
update
.
signal
(
cm
,
"
viewportChange
"
,
cm
,
cm
.
display
.
viewFrom
,
cm
.
display
.
viewTo
)
cm
.
display
.
reportedViewFrom
=
cm
.
display
.
viewFrom
;
cm
.
display
.
reportedViewTo
=
cm
.
display
.
viewTo
}
}
export
function
updateDisplaySimple
(
cm
,
viewport
)
{
let
update
=
new
DisplayUpdate
(
cm
,
viewport
)
if
(
updateDisplayIfNeeded
(
cm
,
update
))
{
updateHeightsInViewport
(
cm
)
postUpdateDisplay
(
cm
,
update
)
let
barMeasure
=
measureForScrollbars
(
cm
)
updateSelection
(
cm
)
updateScrollbars
(
cm
,
barMeasure
)
setDocumentHeight
(
cm
,
barMeasure
)
update
.
finish
()
}
}
// Sync the actual display DOM structure with display.view, removing
// nodes for lines that are no longer in view, and creating the ones
// that are not there yet, and updating the ones that are out of
// date.
function
patchDisplay
(
cm
,
updateNumbersFrom
,
dims
)
{
let
display
=
cm
.
display
,
lineNumbers
=
cm
.
options
.
lineNumbers
let
container
=
display
.
lineDiv
,
cur
=
container
.
firstChild
function
rm
(
node
)
{
let
next
=
node
.
nextSibling
// Works around a throw-scroll bug in OS X Webkit
if
(
webkit
&&
mac
&&
cm
.
display
.
currentWheelTarget
==
node
)
node
.
style
.
display
=
"
none
"
else
node
.
parentNode
.
removeChild
(
node
)
return
next
}
let
view
=
display
.
view
,
lineN
=
display
.
viewFrom
// Loop over the elements in the view, syncing cur (the DOM nodes
// in display.lineDiv) with the view as we go.
for
(
let
i
=
0
;
i
<
view
.
length
;
i
++
)
{
let
lineView
=
view
[
i
]
if
(
lineView
.
hidden
)
{
}
else
if
(
!
lineView
.
node
||
lineView
.
node
.
parentNode
!=
container
)
{
// Not drawn yet
let
node
=
buildLineElement
(
cm
,
lineView
,
lineN
,
dims
)
container
.
insertBefore
(
node
,
cur
)
}
else
{
// Already drawn
while
(
cur
!=
lineView
.
node
)
cur
=
rm
(
cur
)
let
updateNumber
=
lineNumbers
&&
updateNumbersFrom
!=
null
&&
updateNumbersFrom
<=
lineN
&&
lineView
.
lineNumber
if
(
lineView
.
changes
)
{
if
(
indexOf
(
lineView
.
changes
,
"
gutter
"
)
>
-
1
)
updateNumber
=
false
updateLineForChanges
(
cm
,
lineView
,
lineN
,
dims
)
}
if
(
updateNumber
)
{
removeChildren
(
lineView
.
lineNumber
)
lineView
.
lineNumber
.
appendChild
(
document
.
createTextNode
(
lineNumberFor
(
cm
.
options
,
lineN
)))
}
cur
=
lineView
.
node
.
nextSibling
}
lineN
+=
lineView
.
size
}
while
(
cur
)
cur
=
rm
(
cur
)
}
export
function
updateGutterSpace
(
cm
)
{
let
width
=
cm
.
display
.
gutters
.
offsetWidth
cm
.
display
.
sizer
.
style
.
marginLeft
=
width
+
"
px
"
}
export
function
setDocumentHeight
(
cm
,
measure
)
{
cm
.
display
.
sizer
.
style
.
minHeight
=
measure
.
docHeight
+
"
px
"
cm
.
display
.
heightForcer
.
style
.
top
=
measure
.
docHeight
+
"
px
"
cm
.
display
.
gutters
.
style
.
height
=
(
measure
.
docHeight
+
cm
.
display
.
barHeight
+
scrollGap
(
cm
))
+
"
px
"
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/update_display.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
update_display.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/update_line.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
buildLineContent
}
from
"
../line/line_data
"
import
{
lineNumberFor
}
from
"
../line/utils_line
"
import
{
ie
,
ie_version
}
from
"
../util/browser
"
import
{
elt
}
from
"
../util/dom
"
import
{
signalLater
}
from
"
../util/operation_group
"
// When an aspect of a line changes, a string is added to
// lineView.changes. This updates the relevant part of the line's
// DOM structure.
export
function
updateLineForChanges
(
cm
,
lineView
,
lineN
,
dims
)
{
for
(
let
j
=
0
;
j
<
lineView
.
changes
.
length
;
j
++
)
{
let
type
=
lineView
.
changes
[
j
]
if
(
type
==
"
text
"
)
updateLineText
(
cm
,
lineView
)
else
if
(
type
==
"
gutter
"
)
updateLineGutter
(
cm
,
lineView
,
lineN
,
dims
)
else
if
(
type
==
"
class
"
)
updateLineClasses
(
lineView
)
else
if
(
type
==
"
widget
"
)
updateLineWidgets
(
cm
,
lineView
,
dims
)
}
lineView
.
changes
=
null
}
// Lines with gutter elements, widgets or a background class need to
// be wrapped, and have the extra elements added to the wrapper div
function
ensureLineWrapped
(
lineView
)
{
if
(
lineView
.
node
==
lineView
.
text
)
{
lineView
.
node
=
elt
(
"
div
"
,
null
,
null
,
"
position: relative
"
)
if
(
lineView
.
text
.
parentNode
)
lineView
.
text
.
parentNode
.
replaceChild
(
lineView
.
node
,
lineView
.
text
)
lineView
.
node
.
appendChild
(
lineView
.
text
)
if
(
ie
&&
ie_version
<
8
)
lineView
.
node
.
style
.
zIndex
=
2
}
return
lineView
.
node
}
function
updateLineBackground
(
lineView
)
{
let
cls
=
lineView
.
bgClass
?
lineView
.
bgClass
+
"
"
+
(
lineView
.
line
.
bgClass
||
""
)
:
lineView
.
line
.
bgClass
if
(
cls
)
cls
+=
"
CodeMirror-linebackground
"
if
(
lineView
.
background
)
{
if
(
cls
)
lineView
.
background
.
className
=
cls
else
{
lineView
.
background
.
parentNode
.
removeChild
(
lineView
.
background
);
lineView
.
background
=
null
}
}
else
if
(
cls
)
{
let
wrap
=
ensureLineWrapped
(
lineView
)
lineView
.
background
=
wrap
.
insertBefore
(
elt
(
"
div
"
,
null
,
cls
),
wrap
.
firstChild
)
}
}
// Wrapper around buildLineContent which will reuse the structure
// in display.externalMeasured when possible.
function
getLineContent
(
cm
,
lineView
)
{
let
ext
=
cm
.
display
.
externalMeasured
if
(
ext
&&
ext
.
line
==
lineView
.
line
)
{
cm
.
display
.
externalMeasured
=
null
lineView
.
measure
=
ext
.
measure
return
ext
.
built
}
return
buildLineContent
(
cm
,
lineView
)
}
// Redraw the line's text. Interacts with the background and text
// classes because the mode may output tokens that influence these
// classes.
function
updateLineText
(
cm
,
lineView
)
{
let
cls
=
lineView
.
text
.
className
let
built
=
getLineContent
(
cm
,
lineView
)
if
(
lineView
.
text
==
lineView
.
node
)
lineView
.
node
=
built
.
pre
lineView
.
text
.
parentNode
.
replaceChild
(
built
.
pre
,
lineView
.
text
)
lineView
.
text
=
built
.
pre
if
(
built
.
bgClass
!=
lineView
.
bgClass
||
built
.
textClass
!=
lineView
.
textClass
)
{
lineView
.
bgClass
=
built
.
bgClass
lineView
.
textClass
=
built
.
textClass
updateLineClasses
(
lineView
)
}
else
if
(
cls
)
{
lineView
.
text
.
className
=
cls
}
}
function
updateLineClasses
(
lineView
)
{
updateLineBackground
(
lineView
)
if
(
lineView
.
line
.
wrapClass
)
ensureLineWrapped
(
lineView
).
className
=
lineView
.
line
.
wrapClass
else
if
(
lineView
.
node
!=
lineView
.
text
)
lineView
.
node
.
className
=
""
let
textClass
=
lineView
.
textClass
?
lineView
.
textClass
+
"
"
+
(
lineView
.
line
.
textClass
||
""
)
:
lineView
.
line
.
textClass
lineView
.
text
.
className
=
textClass
||
""
}
function
updateLineGutter
(
cm
,
lineView
,
lineN
,
dims
)
{
if
(
lineView
.
gutter
)
{
lineView
.
node
.
removeChild
(
lineView
.
gutter
)
lineView
.
gutter
=
null
}
if
(
lineView
.
gutterBackground
)
{
lineView
.
node
.
removeChild
(
lineView
.
gutterBackground
)
lineView
.
gutterBackground
=
null
}
if
(
lineView
.
line
.
gutterClass
)
{
let
wrap
=
ensureLineWrapped
(
lineView
)
lineView
.
gutterBackground
=
elt
(
"
div
"
,
null
,
"
CodeMirror-gutter-background
"
+
lineView
.
line
.
gutterClass
,
`left:
${
cm
.
options
.
fixedGutter
?
dims
.
fixedPos
:
-
dims
.
gutterTotalWidth
}
px; width:
${
dims
.
gutterTotalWidth
}
px`
)
wrap
.
insertBefore
(
lineView
.
gutterBackground
,
lineView
.
text
)
}
let
markers
=
lineView
.
line
.
gutterMarkers
if
(
cm
.
options
.
lineNumbers
||
markers
)
{
let
wrap
=
ensureLineWrapped
(
lineView
)
let
gutterWrap
=
lineView
.
gutter
=
elt
(
"
div
"
,
null
,
"
CodeMirror-gutter-wrapper
"
,
`left:
${
cm
.
options
.
fixedGutter
?
dims
.
fixedPos
:
-
dims
.
gutterTotalWidth
}
px`
)
cm
.
display
.
input
.
setUneditable
(
gutterWrap
)
wrap
.
insertBefore
(
gutterWrap
,
lineView
.
text
)
if
(
lineView
.
line
.
gutterClass
)
gutterWrap
.
className
+=
"
"
+
lineView
.
line
.
gutterClass
if
(
cm
.
options
.
lineNumbers
&&
(
!
markers
||
!
markers
[
"
CodeMirror-linenumbers
"
]))
lineView
.
lineNumber
=
gutterWrap
.
appendChild
(
elt
(
"
div
"
,
lineNumberFor
(
cm
.
options
,
lineN
),
"
CodeMirror-linenumber CodeMirror-gutter-elt
"
,
`left:
${
dims
.
gutterLeft
[
"
CodeMirror-linenumbers
"
]}
px; width:
${
cm
.
display
.
lineNumInnerWidth
}
px`
))
if
(
markers
)
for
(
let
k
=
0
;
k
<
cm
.
options
.
gutters
.
length
;
++
k
)
{
let
id
=
cm
.
options
.
gutters
[
k
],
found
=
markers
.
hasOwnProperty
(
id
)
&&
markers
[
id
]
if
(
found
)
gutterWrap
.
appendChild
(
elt
(
"
div
"
,
[
found
],
"
CodeMirror-gutter-elt
"
,
`left:
${
dims
.
gutterLeft
[
id
]}
px; width:
${
dims
.
gutterWidth
[
id
]}
px`
))
}
}
}
function
updateLineWidgets
(
cm
,
lineView
,
dims
)
{
if
(
lineView
.
alignable
)
lineView
.
alignable
=
null
for
(
let
node
=
lineView
.
node
.
firstChild
,
next
;
node
;
node
=
next
)
{
next
=
node
.
nextSibling
if
(
node
.
className
==
"
CodeMirror-linewidget
"
)
lineView
.
node
.
removeChild
(
node
)
}
insertLineWidgets
(
cm
,
lineView
,
dims
)
}
// Build a line's DOM representation from scratch
export
function
buildLineElement
(
cm
,
lineView
,
lineN
,
dims
)
{
let
built
=
getLineContent
(
cm
,
lineView
)
lineView
.
text
=
lineView
.
node
=
built
.
pre
if
(
built
.
bgClass
)
lineView
.
bgClass
=
built
.
bgClass
if
(
built
.
textClass
)
lineView
.
textClass
=
built
.
textClass
updateLineClasses
(
lineView
)
updateLineGutter
(
cm
,
lineView
,
lineN
,
dims
)
insertLineWidgets
(
cm
,
lineView
,
dims
)
return
lineView
.
node
}
// A lineView may contain multiple logical lines (when merged by
// collapsed spans). The widgets for all of them need to be drawn.
function
insertLineWidgets
(
cm
,
lineView
,
dims
)
{
insertLineWidgetsFor
(
cm
,
lineView
.
line
,
lineView
,
dims
,
true
)
if
(
lineView
.
rest
)
for
(
let
i
=
0
;
i
<
lineView
.
rest
.
length
;
i
++
)
insertLineWidgetsFor
(
cm
,
lineView
.
rest
[
i
],
lineView
,
dims
,
false
)
}
function
insertLineWidgetsFor
(
cm
,
line
,
lineView
,
dims
,
allowAbove
)
{
if
(
!
line
.
widgets
)
return
let
wrap
=
ensureLineWrapped
(
lineView
)
for
(
let
i
=
0
,
ws
=
line
.
widgets
;
i
<
ws
.
length
;
++
i
)
{
let
widget
=
ws
[
i
],
node
=
elt
(
"
div
"
,
[
widget
.
node
],
"
CodeMirror-linewidget
"
)
if
(
!
widget
.
handleMouseEvents
)
node
.
setAttribute
(
"
cm-ignore-events
"
,
"
true
"
)
positionLineWidget
(
widget
,
node
,
lineView
,
dims
)
cm
.
display
.
input
.
setUneditable
(
node
)
if
(
allowAbove
&&
widget
.
above
)
wrap
.
insertBefore
(
node
,
lineView
.
gutter
||
lineView
.
text
)
else
wrap
.
appendChild
(
node
)
signalLater
(
widget
,
"
redraw
"
)
}
}
function
positionLineWidget
(
widget
,
node
,
lineView
,
dims
)
{
if
(
widget
.
noHScroll
)
{
;(
lineView
.
alignable
||
(
lineView
.
alignable
=
[])).
push
(
node
)
let
width
=
dims
.
wrapperWidth
node
.
style
.
left
=
dims
.
fixedPos
+
"
px
"
if
(
!
widget
.
coverGutter
)
{
width
-=
dims
.
gutterTotalWidth
node
.
style
.
paddingLeft
=
dims
.
gutterTotalWidth
+
"
px
"
}
node
.
style
.
width
=
width
+
"
px
"
}
if
(
widget
.
coverGutter
)
{
node
.
style
.
zIndex
=
5
node
.
style
.
position
=
"
relative
"
if
(
!
widget
.
noHScroll
)
node
.
style
.
marginLeft
=
-
dims
.
gutterTotalWidth
+
"
px
"
}
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/update_line.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
update_line.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/update_lines.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
heightAtLine
}
from
"
../line/spans
"
import
{
getLine
,
lineAtHeight
,
updateLineHeight
}
from
"
../line/utils_line
"
import
{
paddingTop
,
textHeight
}
from
"
../measurement/position_measurement
"
import
{
ie
,
ie_version
}
from
"
../util/browser
"
// Read the actual heights of the rendered lines, and update their
// stored heights to match.
export
function
updateHeightsInViewport
(
cm
)
{
let
display
=
cm
.
display
let
prevBottom
=
display
.
lineDiv
.
offsetTop
for
(
let
i
=
0
;
i
<
display
.
view
.
length
;
i
++
)
{
let
cur
=
display
.
view
[
i
],
height
if
(
cur
.
hidden
)
continue
if
(
ie
&&
ie_version
<
8
)
{
let
bot
=
cur
.
node
.
offsetTop
+
cur
.
node
.
offsetHeight
height
=
bot
-
prevBottom
prevBottom
=
bot
}
else
{
let
box
=
cur
.
node
.
getBoundingClientRect
()
height
=
box
.
bottom
-
box
.
top
}
let
diff
=
cur
.
line
.
height
-
height
if
(
height
<
2
)
height
=
textHeight
(
display
)
if
(
diff
>
.
001
||
diff
<
-
.
001
)
{
updateLineHeight
(
cur
.
line
,
height
)
updateWidgetHeight
(
cur
.
line
)
if
(
cur
.
rest
)
for
(
let
j
=
0
;
j
<
cur
.
rest
.
length
;
j
++
)
updateWidgetHeight
(
cur
.
rest
[
j
])
}
}
}
// Read and store the height of line widgets associated with the
// given line.
function
updateWidgetHeight
(
line
)
{
if
(
line
.
widgets
)
for
(
let
i
=
0
;
i
<
line
.
widgets
.
length
;
++
i
)
line
.
widgets
[
i
].
height
=
line
.
widgets
[
i
].
node
.
parentNode
.
offsetHeight
}
// Compute the lines that are visible in a given viewport (defaults
// the the current scroll position). viewport may contain top,
// height, and ensure (see op.scrollToPos) properties.
export
function
visibleLines
(
display
,
doc
,
viewport
)
{
let
top
=
viewport
&&
viewport
.
top
!=
null
?
Math
.
max
(
0
,
viewport
.
top
)
:
display
.
scroller
.
scrollTop
top
=
Math
.
floor
(
top
-
paddingTop
(
display
))
let
bottom
=
viewport
&&
viewport
.
bottom
!=
null
?
viewport
.
bottom
:
top
+
display
.
wrapper
.
clientHeight
let
from
=
lineAtHeight
(
doc
,
top
),
to
=
lineAtHeight
(
doc
,
bottom
)
// Ensure is a {from: {line, ch}, to: {line, ch}} object, and
// forces those lines into the viewport (if possible).
if
(
viewport
&&
viewport
.
ensure
)
{
let
ensureFrom
=
viewport
.
ensure
.
from
.
line
,
ensureTo
=
viewport
.
ensure
.
to
.
line
if
(
ensureFrom
<
from
)
{
from
=
ensureFrom
to
=
lineAtHeight
(
doc
,
heightAtLine
(
getLine
(
doc
,
ensureFrom
))
+
display
.
wrapper
.
clientHeight
)
}
else
if
(
Math
.
min
(
ensureTo
,
doc
.
lastLine
())
>=
to
)
{
from
=
lineAtHeight
(
doc
,
heightAtLine
(
getLine
(
doc
,
ensureTo
))
-
display
.
wrapper
.
clientHeight
)
to
=
ensureTo
}
}
return
{
from
:
from
,
to
:
Math
.
max
(
to
,
from
+
1
)}
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/update_lines.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
update_lines.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/view_tracking.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
buildViewArray
}
from
"
../line/line_data
"
import
{
sawCollapsedSpans
}
from
"
../line/saw_special_spans
"
import
{
visualLineEndNo
,
visualLineNo
}
from
"
../line/spans
"
import
{
findViewIndex
}
from
"
../measurement/position_measurement
"
import
{
indexOf
}
from
"
../util/misc
"
// Updates the display.view data structure for a given change to the
// document. From and to are in pre-change coordinates. Lendiff is
// the amount of lines added or subtracted by the change. This is
// used for changes that span multiple lines, or change the way
// lines are divided into visual lines. regLineChange (below)
// registers single-line changes.
export
function
regChange
(
cm
,
from
,
to
,
lendiff
)
{
if
(
from
==
null
)
from
=
cm
.
doc
.
first
if
(
to
==
null
)
to
=
cm
.
doc
.
first
+
cm
.
doc
.
size
if
(
!
lendiff
)
lendiff
=
0
let
display
=
cm
.
display
if
(
lendiff
&&
to
<
display
.
viewTo
&&
(
display
.
updateLineNumbers
==
null
||
display
.
updateLineNumbers
>
from
))
display
.
updateLineNumbers
=
from
cm
.
curOp
.
viewChanged
=
true
if
(
from
>=
display
.
viewTo
)
{
// Change after
if
(
sawCollapsedSpans
&&
visualLineNo
(
cm
.
doc
,
from
)
<
display
.
viewTo
)
resetView
(
cm
)
}
else
if
(
to
<=
display
.
viewFrom
)
{
// Change before
if
(
sawCollapsedSpans
&&
visualLineEndNo
(
cm
.
doc
,
to
+
lendiff
)
>
display
.
viewFrom
)
{
resetView
(
cm
)
}
else
{
display
.
viewFrom
+=
lendiff
display
.
viewTo
+=
lendiff
}
}
else
if
(
from
<=
display
.
viewFrom
&&
to
>=
display
.
viewTo
)
{
// Full overlap
resetView
(
cm
)
}
else
if
(
from
<=
display
.
viewFrom
)
{
// Top overlap
let
cut
=
viewCuttingPoint
(
cm
,
to
,
to
+
lendiff
,
1
)
if
(
cut
)
{
display
.
view
=
display
.
view
.
slice
(
cut
.
index
)
display
.
viewFrom
=
cut
.
lineN
display
.
viewTo
+=
lendiff
}
else
{
resetView
(
cm
)
}
}
else
if
(
to
>=
display
.
viewTo
)
{
// Bottom overlap
let
cut
=
viewCuttingPoint
(
cm
,
from
,
from
,
-
1
)
if
(
cut
)
{
display
.
view
=
display
.
view
.
slice
(
0
,
cut
.
index
)
display
.
viewTo
=
cut
.
lineN
}
else
{
resetView
(
cm
)
}
}
else
{
// Gap in the middle
let
cutTop
=
viewCuttingPoint
(
cm
,
from
,
from
,
-
1
)
let
cutBot
=
viewCuttingPoint
(
cm
,
to
,
to
+
lendiff
,
1
)
if
(
cutTop
&&
cutBot
)
{
display
.
view
=
display
.
view
.
slice
(
0
,
cutTop
.
index
)
.
concat
(
buildViewArray
(
cm
,
cutTop
.
lineN
,
cutBot
.
lineN
))
.
concat
(
display
.
view
.
slice
(
cutBot
.
index
))
display
.
viewTo
+=
lendiff
}
else
{
resetView
(
cm
)
}
}
let
ext
=
display
.
externalMeasured
if
(
ext
)
{
if
(
to
<
ext
.
lineN
)
ext
.
lineN
+=
lendiff
else
if
(
from
<
ext
.
lineN
+
ext
.
size
)
display
.
externalMeasured
=
null
}
}
// Register a change to a single line. Type must be one of "text",
// "gutter", "class", "widget"
export
function
regLineChange
(
cm
,
line
,
type
)
{
cm
.
curOp
.
viewChanged
=
true
let
display
=
cm
.
display
,
ext
=
cm
.
display
.
externalMeasured
if
(
ext
&&
line
>=
ext
.
lineN
&&
line
<
ext
.
lineN
+
ext
.
size
)
display
.
externalMeasured
=
null
if
(
line
<
display
.
viewFrom
||
line
>=
display
.
viewTo
)
return
let
lineView
=
display
.
view
[
findViewIndex
(
cm
,
line
)]
if
(
lineView
.
node
==
null
)
return
let
arr
=
lineView
.
changes
||
(
lineView
.
changes
=
[])
if
(
indexOf
(
arr
,
type
)
==
-
1
)
arr
.
push
(
type
)
}
// Clear the view.
export
function
resetView
(
cm
)
{
cm
.
display
.
viewFrom
=
cm
.
display
.
viewTo
=
cm
.
doc
.
first
cm
.
display
.
view
=
[]
cm
.
display
.
viewOffset
=
0
}
function
viewCuttingPoint
(
cm
,
oldN
,
newN
,
dir
)
{
let
index
=
findViewIndex
(
cm
,
oldN
),
diff
,
view
=
cm
.
display
.
view
if
(
!
sawCollapsedSpans
||
newN
==
cm
.
doc
.
first
+
cm
.
doc
.
size
)
return
{
index
:
index
,
lineN
:
newN
}
let
n
=
cm
.
display
.
viewFrom
for
(
let
i
=
0
;
i
<
index
;
i
++
)
n
+=
view
[
i
].
size
if
(
n
!=
oldN
)
{
if
(
dir
>
0
)
{
if
(
index
==
view
.
length
-
1
)
return
null
diff
=
(
n
+
view
[
index
].
size
)
-
oldN
index
++
}
else
{
diff
=
n
-
oldN
}
oldN
+=
diff
;
newN
+=
diff
}
while
(
visualLineNo
(
cm
.
doc
,
newN
)
!=
newN
)
{
if
(
index
==
(
dir
<
0
?
0
:
view
.
length
-
1
))
return
null
newN
+=
dir
*
view
[
index
-
(
dir
<
0
?
1
:
0
)].
size
index
+=
dir
}
return
{
index
:
index
,
lineN
:
newN
}
}
// Force the view to cover a given range, adding empty view element
// or clipping off existing ones as needed.
export
function
adjustView
(
cm
,
from
,
to
)
{
let
display
=
cm
.
display
,
view
=
display
.
view
if
(
view
.
length
==
0
||
from
>=
display
.
viewTo
||
to
<=
display
.
viewFrom
)
{
display
.
view
=
buildViewArray
(
cm
,
from
,
to
)
display
.
viewFrom
=
from
}
else
{
if
(
display
.
viewFrom
>
from
)
display
.
view
=
buildViewArray
(
cm
,
from
,
display
.
viewFrom
).
concat
(
display
.
view
)
else
if
(
display
.
viewFrom
<
from
)
display
.
view
=
display
.
view
.
slice
(
findViewIndex
(
cm
,
from
))
display
.
viewFrom
=
from
if
(
display
.
viewTo
<
to
)
display
.
view
=
display
.
view
.
concat
(
buildViewArray
(
cm
,
display
.
viewTo
,
to
))
else
if
(
display
.
viewTo
>
to
)
display
.
view
=
display
.
view
.
slice
(
0
,
findViewIndex
(
cm
,
to
))
}
display
.
viewTo
=
to
}
// Count the number of lines in the view whose DOM representation is
// out of date (or nonexistent).
export
function
countDirtyView
(
cm
)
{
let
view
=
cm
.
display
.
view
,
dirty
=
0
for
(
let
i
=
0
;
i
<
view
.
length
;
i
++
)
{
let
lineView
=
view
[
i
]
if
(
!
lineView
.
hidden
&&
(
!
lineView
.
node
||
lineView
.
changes
))
++
dirty
}
return
dirty
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/display/view_tracking.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
view_tracking.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"Folder"
module=
"OFS.Folder"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_objects
</string>
</key>
<value>
<tuple/>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
edit
</string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/CodeMirror.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
Display
}
from
"
../display/Display
"
import
{
onFocus
,
onBlur
}
from
"
../display/focus
"
import
{
setGuttersForLineNumbers
,
updateGutters
}
from
"
../display/gutters
"
import
{
maybeUpdateLineNumberWidth
}
from
"
../display/line_numbers
"
import
{
endOperation
,
operation
,
startOperation
}
from
"
../display/operations
"
import
{
initScrollbars
}
from
"
../display/scrollbars
"
import
{
onScrollWheel
,
setScrollLeft
,
setScrollTop
}
from
"
../display/scroll_events
"
import
{
clipPos
,
Pos
}
from
"
../line/pos
"
import
{
posFromMouse
}
from
"
../measurement/position_measurement
"
import
{
eventInWidget
}
from
"
../measurement/widgets
"
import
Doc
from
"
../model/Doc
"
import
{
attachDoc
}
from
"
../model/document_data
"
import
{
Range
}
from
"
../model/selection
"
import
{
extendSelection
}
from
"
../model/selection_updates
"
import
{
captureRightClick
,
ie
,
ie_version
,
mobile
,
webkit
}
from
"
../util/browser
"
import
{
e_preventDefault
,
e_stop
,
on
,
signal
,
signalDOMEvent
}
from
"
../util/event
"
import
{
bind
,
copyObj
,
Delayed
}
from
"
../util/misc
"
import
{
clearDragCursor
,
onDragOver
,
onDragStart
,
onDrop
}
from
"
./drop_events
"
import
{
ensureGlobalHandlers
}
from
"
./global_events
"
import
{
onKeyDown
,
onKeyPress
,
onKeyUp
}
from
"
./key_events
"
import
{
clickInGutter
,
onContextMenu
,
onMouseDown
}
from
"
./mouse_events
"
import
{
themeChanged
}
from
"
./utils
"
import
{
defaults
,
optionHandlers
,
Init
}
from
"
./options
"
// A CodeMirror instance represents an editor. This is the object
// that user code is usually dealing with.
export
function
CodeMirror
(
place
,
options
)
{
if
(
!
(
this
instanceof
CodeMirror
))
return
new
CodeMirror
(
place
,
options
)
this
.
options
=
options
=
options
?
copyObj
(
options
)
:
{}
// Determine effective options based on given values and defaults.
copyObj
(
defaults
,
options
,
false
)
setGuttersForLineNumbers
(
options
)
let
doc
=
options
.
value
if
(
typeof
doc
==
"
string
"
)
doc
=
new
Doc
(
doc
,
options
.
mode
,
null
,
options
.
lineSeparator
)
this
.
doc
=
doc
let
input
=
new
CodeMirror
.
inputStyles
[
options
.
inputStyle
](
this
)
let
display
=
this
.
display
=
new
Display
(
place
,
doc
,
input
)
display
.
wrapper
.
CodeMirror
=
this
updateGutters
(
this
)
themeChanged
(
this
)
if
(
options
.
lineWrapping
)
this
.
display
.
wrapper
.
className
+=
"
CodeMirror-wrap
"
initScrollbars
(
this
)
this
.
state
=
{
keyMaps
:
[],
// stores maps added by addKeyMap
overlays
:
[],
// highlighting overlays, as added by addOverlay
modeGen
:
0
,
// bumped when mode/overlay changes, used to invalidate highlighting info
overwrite
:
false
,
delayingBlurEvent
:
false
,
focused
:
false
,
suppressEdits
:
false
,
// used to disable editing during key handlers when in readOnly mode
pasteIncoming
:
false
,
cutIncoming
:
false
,
// help recognize paste/cut edits in input.poll
selectingText
:
false
,
draggingText
:
false
,
highlight
:
new
Delayed
(),
// stores highlight worker timeout
keySeq
:
null
,
// Unfinished key sequence
specialChars
:
null
}
if
(
options
.
autofocus
&&
!
mobile
)
display
.
input
.
focus
()
// Override magic textarea content restore that IE sometimes does
// on our hidden textarea on reload
if
(
ie
&&
ie_version
<
11
)
setTimeout
(()
=>
this
.
display
.
input
.
reset
(
true
),
20
)
registerEventHandlers
(
this
)
ensureGlobalHandlers
()
startOperation
(
this
)
this
.
curOp
.
forceUpdate
=
true
attachDoc
(
this
,
doc
)
if
((
options
.
autofocus
&&
!
mobile
)
||
this
.
hasFocus
())
setTimeout
(
bind
(
onFocus
,
this
),
20
)
else
onBlur
(
this
)
for
(
let
opt
in
optionHandlers
)
if
(
optionHandlers
.
hasOwnProperty
(
opt
))
optionHandlers
[
opt
](
this
,
options
[
opt
],
Init
)
maybeUpdateLineNumberWidth
(
this
)
if
(
options
.
finishInit
)
options
.
finishInit
(
this
)
for
(
let
i
=
0
;
i
<
initHooks
.
length
;
++
i
)
initHooks
[
i
](
this
)
endOperation
(
this
)
// Suppress optimizelegibility in Webkit, since it breaks text
// measuring on line wrapping boundaries.
if
(
webkit
&&
options
.
lineWrapping
&&
getComputedStyle
(
display
.
lineDiv
).
textRendering
==
"
optimizelegibility
"
)
display
.
lineDiv
.
style
.
textRendering
=
"
auto
"
}
// The default configuration options.
CodeMirror
.
defaults
=
defaults
// Functions to run when options are changed.
CodeMirror
.
optionHandlers
=
optionHandlers
export
default
CodeMirror
// Attach the necessary event handlers when initializing the editor
function
registerEventHandlers
(
cm
)
{
let
d
=
cm
.
display
on
(
d
.
scroller
,
"
mousedown
"
,
operation
(
cm
,
onMouseDown
))
// Older IE's will not fire a second mousedown for a double click
if
(
ie
&&
ie_version
<
11
)
on
(
d
.
scroller
,
"
dblclick
"
,
operation
(
cm
,
e
=>
{
if
(
signalDOMEvent
(
cm
,
e
))
return
let
pos
=
posFromMouse
(
cm
,
e
)
if
(
!
pos
||
clickInGutter
(
cm
,
e
)
||
eventInWidget
(
cm
.
display
,
e
))
return
e_preventDefault
(
e
)
let
word
=
cm
.
findWordAt
(
pos
)
extendSelection
(
cm
.
doc
,
word
.
anchor
,
word
.
head
)
}))
else
on
(
d
.
scroller
,
"
dblclick
"
,
e
=>
signalDOMEvent
(
cm
,
e
)
||
e_preventDefault
(
e
))
// Some browsers fire contextmenu *after* opening the menu, at
// which point we can't mess with it anymore. Context menu is
// handled in onMouseDown for these browsers.
if
(
!
captureRightClick
)
on
(
d
.
scroller
,
"
contextmenu
"
,
e
=>
onContextMenu
(
cm
,
e
))
// Used to suppress mouse event handling when a touch happens
let
touchFinished
,
prevTouch
=
{
end
:
0
}
function
finishTouch
()
{
if
(
d
.
activeTouch
)
{
touchFinished
=
setTimeout
(()
=>
d
.
activeTouch
=
null
,
1000
)
prevTouch
=
d
.
activeTouch
prevTouch
.
end
=
+
new
Date
}
}
function
isMouseLikeTouchEvent
(
e
)
{
if
(
e
.
touches
.
length
!=
1
)
return
false
let
touch
=
e
.
touches
[
0
]
return
touch
.
radiusX
<=
1
&&
touch
.
radiusY
<=
1
}
function
farAway
(
touch
,
other
)
{
if
(
other
.
left
==
null
)
return
true
let
dx
=
other
.
left
-
touch
.
left
,
dy
=
other
.
top
-
touch
.
top
return
dx
*
dx
+
dy
*
dy
>
20
*
20
}
on
(
d
.
scroller
,
"
touchstart
"
,
e
=>
{
if
(
!
signalDOMEvent
(
cm
,
e
)
&&
!
isMouseLikeTouchEvent
(
e
))
{
d
.
input
.
ensurePolled
()
clearTimeout
(
touchFinished
)
let
now
=
+
new
Date
d
.
activeTouch
=
{
start
:
now
,
moved
:
false
,
prev
:
now
-
prevTouch
.
end
<=
300
?
prevTouch
:
null
}
if
(
e
.
touches
.
length
==
1
)
{
d
.
activeTouch
.
left
=
e
.
touches
[
0
].
pageX
d
.
activeTouch
.
top
=
e
.
touches
[
0
].
pageY
}
}
})
on
(
d
.
scroller
,
"
touchmove
"
,
()
=>
{
if
(
d
.
activeTouch
)
d
.
activeTouch
.
moved
=
true
})
on
(
d
.
scroller
,
"
touchend
"
,
e
=>
{
let
touch
=
d
.
activeTouch
if
(
touch
&&
!
eventInWidget
(
d
,
e
)
&&
touch
.
left
!=
null
&&
!
touch
.
moved
&&
new
Date
-
touch
.
start
<
300
)
{
let
pos
=
cm
.
coordsChar
(
d
.
activeTouch
,
"
page
"
),
range
if
(
!
touch
.
prev
||
farAway
(
touch
,
touch
.
prev
))
// Single tap
range
=
new
Range
(
pos
,
pos
)
else
if
(
!
touch
.
prev
.
prev
||
farAway
(
touch
,
touch
.
prev
.
prev
))
// Double tap
range
=
cm
.
findWordAt
(
pos
)
else
// Triple tap
range
=
new
Range
(
Pos
(
pos
.
line
,
0
),
clipPos
(
cm
.
doc
,
Pos
(
pos
.
line
+
1
,
0
)))
cm
.
setSelection
(
range
.
anchor
,
range
.
head
)
cm
.
focus
()
e_preventDefault
(
e
)
}
finishTouch
()
})
on
(
d
.
scroller
,
"
touchcancel
"
,
finishTouch
)
// Sync scrolling between fake scrollbars and real scrollable
// area, ensure viewport is updated when scrolling.
on
(
d
.
scroller
,
"
scroll
"
,
()
=>
{
if
(
d
.
scroller
.
clientHeight
)
{
setScrollTop
(
cm
,
d
.
scroller
.
scrollTop
)
setScrollLeft
(
cm
,
d
.
scroller
.
scrollLeft
,
true
)
signal
(
cm
,
"
scroll
"
,
cm
)
}
})
// Listen to wheel events in order to try and update the viewport on time.
on
(
d
.
scroller
,
"
mousewheel
"
,
e
=>
onScrollWheel
(
cm
,
e
))
on
(
d
.
scroller
,
"
DOMMouseScroll
"
,
e
=>
onScrollWheel
(
cm
,
e
))
// Prevent wrapper from ever scrolling
on
(
d
.
wrapper
,
"
scroll
"
,
()
=>
d
.
wrapper
.
scrollTop
=
d
.
wrapper
.
scrollLeft
=
0
)
d
.
dragFunctions
=
{
enter
:
e
=>
{
if
(
!
signalDOMEvent
(
cm
,
e
))
e_stop
(
e
)},
over
:
e
=>
{
if
(
!
signalDOMEvent
(
cm
,
e
))
{
onDragOver
(
cm
,
e
);
e_stop
(
e
)
}},
start
:
e
=>
onDragStart
(
cm
,
e
),
drop
:
operation
(
cm
,
onDrop
),
leave
:
e
=>
{
if
(
!
signalDOMEvent
(
cm
,
e
))
{
clearDragCursor
(
cm
)
}}
}
let
inp
=
d
.
input
.
getField
()
on
(
inp
,
"
keyup
"
,
e
=>
onKeyUp
.
call
(
cm
,
e
))
on
(
inp
,
"
keydown
"
,
operation
(
cm
,
onKeyDown
))
on
(
inp
,
"
keypress
"
,
operation
(
cm
,
onKeyPress
))
on
(
inp
,
"
focus
"
,
e
=>
onFocus
(
cm
,
e
))
on
(
inp
,
"
blur
"
,
e
=>
onBlur
(
cm
,
e
))
}
let
initHooks
=
[]
CodeMirror
.
defineInitHook
=
f
=>
initHooks
.
push
(
f
)
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/CodeMirror.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
CodeMirror.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/commands.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
deleteNearSelection
}
from
"
./deleteNearSelection
"
import
{
runInOp
}
from
"
../display/operations
"
import
{
ensureCursorVisible
}
from
"
../display/scrolling
"
import
{
endOfLine
}
from
"
../input/movement
"
import
{
clipPos
,
Pos
}
from
"
../line/pos
"
import
{
visualLine
,
visualLineEnd
}
from
"
../line/spans
"
import
{
getLine
,
lineNo
}
from
"
../line/utils_line
"
import
{
Range
}
from
"
../model/selection
"
import
{
selectAll
}
from
"
../model/selection_updates
"
import
{
countColumn
,
sel_dontScroll
,
sel_move
,
spaceStr
}
from
"
../util/misc
"
import
{
getOrder
}
from
"
../util/bidi
"
// Commands are parameter-less actions that can be performed on an
// editor, mostly used for keybindings.
export
let
commands
=
{
selectAll
:
selectAll
,
singleSelection
:
cm
=>
cm
.
setSelection
(
cm
.
getCursor
(
"
anchor
"
),
cm
.
getCursor
(
"
head
"
),
sel_dontScroll
),
killLine
:
cm
=>
deleteNearSelection
(
cm
,
range
=>
{
if
(
range
.
empty
())
{
let
len
=
getLine
(
cm
.
doc
,
range
.
head
.
line
).
text
.
length
if
(
range
.
head
.
ch
==
len
&&
range
.
head
.
line
<
cm
.
lastLine
())
return
{
from
:
range
.
head
,
to
:
Pos
(
range
.
head
.
line
+
1
,
0
)}
else
return
{
from
:
range
.
head
,
to
:
Pos
(
range
.
head
.
line
,
len
)}
}
else
{
return
{
from
:
range
.
from
(),
to
:
range
.
to
()}
}
}),
deleteLine
:
cm
=>
deleteNearSelection
(
cm
,
range
=>
({
from
:
Pos
(
range
.
from
().
line
,
0
),
to
:
clipPos
(
cm
.
doc
,
Pos
(
range
.
to
().
line
+
1
,
0
))
})),
delLineLeft
:
cm
=>
deleteNearSelection
(
cm
,
range
=>
({
from
:
Pos
(
range
.
from
().
line
,
0
),
to
:
range
.
from
()
})),
delWrappedLineLeft
:
cm
=>
deleteNearSelection
(
cm
,
range
=>
{
let
top
=
cm
.
charCoords
(
range
.
head
,
"
div
"
).
top
+
5
let
leftPos
=
cm
.
coordsChar
({
left
:
0
,
top
:
top
},
"
div
"
)
return
{
from
:
leftPos
,
to
:
range
.
from
()}
}),
delWrappedLineRight
:
cm
=>
deleteNearSelection
(
cm
,
range
=>
{
let
top
=
cm
.
charCoords
(
range
.
head
,
"
div
"
).
top
+
5
let
rightPos
=
cm
.
coordsChar
({
left
:
cm
.
display
.
lineDiv
.
offsetWidth
+
100
,
top
:
top
},
"
div
"
)
return
{
from
:
range
.
from
(),
to
:
rightPos
}
}),
undo
:
cm
=>
cm
.
undo
(),
redo
:
cm
=>
cm
.
redo
(),
undoSelection
:
cm
=>
cm
.
undoSelection
(),
redoSelection
:
cm
=>
cm
.
redoSelection
(),
goDocStart
:
cm
=>
cm
.
extendSelection
(
Pos
(
cm
.
firstLine
(),
0
)),
goDocEnd
:
cm
=>
cm
.
extendSelection
(
Pos
(
cm
.
lastLine
())),
goLineStart
:
cm
=>
cm
.
extendSelectionsBy
(
range
=>
lineStart
(
cm
,
range
.
head
.
line
),
{
origin
:
"
+move
"
,
bias
:
1
}
),
goLineStartSmart
:
cm
=>
cm
.
extendSelectionsBy
(
range
=>
lineStartSmart
(
cm
,
range
.
head
),
{
origin
:
"
+move
"
,
bias
:
1
}
),
goLineEnd
:
cm
=>
cm
.
extendSelectionsBy
(
range
=>
lineEnd
(
cm
,
range
.
head
.
line
),
{
origin
:
"
+move
"
,
bias
:
-
1
}
),
goLineRight
:
cm
=>
cm
.
extendSelectionsBy
(
range
=>
{
let
top
=
cm
.
charCoords
(
range
.
head
,
"
div
"
).
top
+
5
return
cm
.
coordsChar
({
left
:
cm
.
display
.
lineDiv
.
offsetWidth
+
100
,
top
:
top
},
"
div
"
)
},
sel_move
),
goLineLeft
:
cm
=>
cm
.
extendSelectionsBy
(
range
=>
{
let
top
=
cm
.
charCoords
(
range
.
head
,
"
div
"
).
top
+
5
return
cm
.
coordsChar
({
left
:
0
,
top
:
top
},
"
div
"
)
},
sel_move
),
goLineLeftSmart
:
cm
=>
cm
.
extendSelectionsBy
(
range
=>
{
let
top
=
cm
.
charCoords
(
range
.
head
,
"
div
"
).
top
+
5
let
pos
=
cm
.
coordsChar
({
left
:
0
,
top
:
top
},
"
div
"
)
if
(
pos
.
ch
<
cm
.
getLine
(
pos
.
line
).
search
(
/
\S
/
))
return
lineStartSmart
(
cm
,
range
.
head
)
return
pos
},
sel_move
),
goLineUp
:
cm
=>
cm
.
moveV
(
-
1
,
"
line
"
),
goLineDown
:
cm
=>
cm
.
moveV
(
1
,
"
line
"
),
goPageUp
:
cm
=>
cm
.
moveV
(
-
1
,
"
page
"
),
goPageDown
:
cm
=>
cm
.
moveV
(
1
,
"
page
"
),
goCharLeft
:
cm
=>
cm
.
moveH
(
-
1
,
"
char
"
),
goCharRight
:
cm
=>
cm
.
moveH
(
1
,
"
char
"
),
goColumnLeft
:
cm
=>
cm
.
moveH
(
-
1
,
"
column
"
),
goColumnRight
:
cm
=>
cm
.
moveH
(
1
,
"
column
"
),
goWordLeft
:
cm
=>
cm
.
moveH
(
-
1
,
"
word
"
),
goGroupRight
:
cm
=>
cm
.
moveH
(
1
,
"
group
"
),
goGroupLeft
:
cm
=>
cm
.
moveH
(
-
1
,
"
group
"
),
goWordRight
:
cm
=>
cm
.
moveH
(
1
,
"
word
"
),
delCharBefore
:
cm
=>
cm
.
deleteH
(
-
1
,
"
char
"
),
delCharAfter
:
cm
=>
cm
.
deleteH
(
1
,
"
char
"
),
delWordBefore
:
cm
=>
cm
.
deleteH
(
-
1
,
"
word
"
),
delWordAfter
:
cm
=>
cm
.
deleteH
(
1
,
"
word
"
),
delGroupBefore
:
cm
=>
cm
.
deleteH
(
-
1
,
"
group
"
),
delGroupAfter
:
cm
=>
cm
.
deleteH
(
1
,
"
group
"
),
indentAuto
:
cm
=>
cm
.
indentSelection
(
"
smart
"
),
indentMore
:
cm
=>
cm
.
indentSelection
(
"
add
"
),
indentLess
:
cm
=>
cm
.
indentSelection
(
"
subtract
"
),
insertTab
:
cm
=>
cm
.
replaceSelection
(
"
\t
"
),
insertSoftTab
:
cm
=>
{
let
spaces
=
[],
ranges
=
cm
.
listSelections
(),
tabSize
=
cm
.
options
.
tabSize
for
(
let
i
=
0
;
i
<
ranges
.
length
;
i
++
)
{
let
pos
=
ranges
[
i
].
from
()
let
col
=
countColumn
(
cm
.
getLine
(
pos
.
line
),
pos
.
ch
,
tabSize
)
spaces
.
push
(
spaceStr
(
tabSize
-
col
%
tabSize
))
}
cm
.
replaceSelections
(
spaces
)
},
defaultTab
:
cm
=>
{
if
(
cm
.
somethingSelected
())
cm
.
indentSelection
(
"
add
"
)
else
cm
.
execCommand
(
"
insertTab
"
)
},
// Swap the two chars left and right of each selection's head.
// Move cursor behind the two swapped characters afterwards.
//
// Doesn't consider line feeds a character.
// Doesn't scan more than one line above to find a character.
// Doesn't do anything on an empty line.
// Doesn't do anything with non-empty selections.
transposeChars
:
cm
=>
runInOp
(
cm
,
()
=>
{
let
ranges
=
cm
.
listSelections
(),
newSel
=
[]
for
(
let
i
=
0
;
i
<
ranges
.
length
;
i
++
)
{
if
(
!
ranges
[
i
].
empty
())
continue
let
cur
=
ranges
[
i
].
head
,
line
=
getLine
(
cm
.
doc
,
cur
.
line
).
text
if
(
line
)
{
if
(
cur
.
ch
==
line
.
length
)
cur
=
new
Pos
(
cur
.
line
,
cur
.
ch
-
1
)
if
(
cur
.
ch
>
0
)
{
cur
=
new
Pos
(
cur
.
line
,
cur
.
ch
+
1
)
cm
.
replaceRange
(
line
.
charAt
(
cur
.
ch
-
1
)
+
line
.
charAt
(
cur
.
ch
-
2
),
Pos
(
cur
.
line
,
cur
.
ch
-
2
),
cur
,
"
+transpose
"
)
}
else
if
(
cur
.
line
>
cm
.
doc
.
first
)
{
let
prev
=
getLine
(
cm
.
doc
,
cur
.
line
-
1
).
text
if
(
prev
)
{
cur
=
new
Pos
(
cur
.
line
,
1
)
cm
.
replaceRange
(
line
.
charAt
(
0
)
+
cm
.
doc
.
lineSeparator
()
+
prev
.
charAt
(
prev
.
length
-
1
),
Pos
(
cur
.
line
-
1
,
prev
.
length
-
1
),
cur
,
"
+transpose
"
)
}
}
}
newSel
.
push
(
new
Range
(
cur
,
cur
))
}
cm
.
setSelections
(
newSel
)
}),
newlineAndIndent
:
cm
=>
runInOp
(
cm
,
()
=>
{
let
sels
=
cm
.
listSelections
()
for
(
let
i
=
sels
.
length
-
1
;
i
>=
0
;
i
--
)
cm
.
replaceRange
(
cm
.
doc
.
lineSeparator
(),
sels
[
i
].
anchor
,
sels
[
i
].
head
,
"
+input
"
)
sels
=
cm
.
listSelections
()
for
(
let
i
=
0
;
i
<
sels
.
length
;
i
++
)
cm
.
indentLine
(
sels
[
i
].
from
().
line
,
null
,
true
)
ensureCursorVisible
(
cm
)
}),
openLine
:
cm
=>
cm
.
replaceSelection
(
"
\n
"
,
"
start
"
),
toggleOverwrite
:
cm
=>
cm
.
toggleOverwrite
()
}
function
lineStart
(
cm
,
lineN
)
{
let
line
=
getLine
(
cm
.
doc
,
lineN
)
let
visual
=
visualLine
(
line
)
if
(
visual
!=
line
)
lineN
=
lineNo
(
visual
)
return
endOfLine
(
true
,
cm
,
visual
,
lineN
,
1
)
}
function
lineEnd
(
cm
,
lineN
)
{
let
line
=
getLine
(
cm
.
doc
,
lineN
)
let
visual
=
visualLineEnd
(
line
)
if
(
visual
!=
line
)
lineN
=
lineNo
(
visual
)
return
endOfLine
(
true
,
cm
,
line
,
lineN
,
-
1
)
}
function
lineStartSmart
(
cm
,
pos
)
{
let
start
=
lineStart
(
cm
,
pos
.
line
)
let
line
=
getLine
(
cm
.
doc
,
start
.
line
)
let
order
=
getOrder
(
line
)
if
(
!
order
||
order
[
0
].
level
==
0
)
{
let
firstNonWS
=
Math
.
max
(
0
,
line
.
text
.
search
(
/
\S
/
))
let
inWS
=
pos
.
line
==
start
.
line
&&
pos
.
ch
<=
firstNonWS
&&
pos
.
ch
return
Pos
(
start
.
line
,
inWS
?
0
:
firstNonWS
,
start
.
sticky
)
}
return
start
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/commands.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
commands.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/deleteNearSelection.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
runInOp
}
from
"
../display/operations
"
import
{
ensureCursorVisible
}
from
"
../display/scrolling
"
import
{
cmp
}
from
"
../line/pos
"
import
{
replaceRange
}
from
"
../model/changes
"
import
{
lst
}
from
"
../util/misc
"
// Helper for deleting text near the selection(s), used to implement
// backspace, delete, and similar functionality.
export
function
deleteNearSelection
(
cm
,
compute
)
{
let
ranges
=
cm
.
doc
.
sel
.
ranges
,
kill
=
[]
// Build up a set of ranges to kill first, merging overlapping
// ranges.
for
(
let
i
=
0
;
i
<
ranges
.
length
;
i
++
)
{
let
toKill
=
compute
(
ranges
[
i
])
while
(
kill
.
length
&&
cmp
(
toKill
.
from
,
lst
(
kill
).
to
)
<=
0
)
{
let
replaced
=
kill
.
pop
()
if
(
cmp
(
replaced
.
from
,
toKill
.
from
)
<
0
)
{
toKill
.
from
=
replaced
.
from
break
}
}
kill
.
push
(
toKill
)
}
// Next, remove those actual ranges.
runInOp
(
cm
,
()
=>
{
for
(
let
i
=
kill
.
length
-
1
;
i
>=
0
;
i
--
)
replaceRange
(
cm
.
doc
,
""
,
kill
[
i
].
from
,
kill
[
i
].
to
,
"
+delete
"
)
ensureCursorVisible
(
cm
)
})
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/deleteNearSelection.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
deleteNearSelection.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/drop_events.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
drawSelectionCursor
}
from
"
../display/selection
"
import
{
operation
}
from
"
../display/operations
"
import
{
clipPos
}
from
"
../line/pos
"
import
{
posFromMouse
}
from
"
../measurement/position_measurement
"
import
{
eventInWidget
}
from
"
../measurement/widgets
"
import
{
makeChange
,
replaceRange
}
from
"
../model/changes
"
import
{
changeEnd
}
from
"
../model/change_measurement
"
import
{
simpleSelection
}
from
"
../model/selection
"
import
{
setSelectionNoUndo
,
setSelectionReplaceHistory
}
from
"
../model/selection_updates
"
import
{
ie
,
presto
,
safari
}
from
"
../util/browser
"
import
{
elt
,
removeChildrenAndAdd
}
from
"
../util/dom
"
import
{
e_preventDefault
,
e_stop
,
signalDOMEvent
}
from
"
../util/event
"
import
{
indexOf
}
from
"
../util/misc
"
// Kludge to work around strange IE behavior where it'll sometimes
// re-fire a series of drag-related events right after the drop (#1551)
let
lastDrop
=
0
export
function
onDrop
(
e
)
{
let
cm
=
this
clearDragCursor
(
cm
)
if
(
signalDOMEvent
(
cm
,
e
)
||
eventInWidget
(
cm
.
display
,
e
))
return
e_preventDefault
(
e
)
if
(
ie
)
lastDrop
=
+
new
Date
let
pos
=
posFromMouse
(
cm
,
e
,
true
),
files
=
e
.
dataTransfer
.
files
if
(
!
pos
||
cm
.
isReadOnly
())
return
// Might be a file drop, in which case we simply extract the text
// and insert it.
if
(
files
&&
files
.
length
&&
window
.
FileReader
&&
window
.
File
)
{
let
n
=
files
.
length
,
text
=
Array
(
n
),
read
=
0
let
loadFile
=
(
file
,
i
)
=>
{
if
(
cm
.
options
.
allowDropFileTypes
&&
indexOf
(
cm
.
options
.
allowDropFileTypes
,
file
.
type
)
==
-
1
)
return
let
reader
=
new
FileReader
reader
.
onload
=
operation
(
cm
,
()
=>
{
let
content
=
reader
.
result
if
(
/
[\x
00-
\x
08
\x
0e-
\x
1f
]{2}
/
.
test
(
content
))
content
=
""
text
[
i
]
=
content
if
(
++
read
==
n
)
{
pos
=
clipPos
(
cm
.
doc
,
pos
)
let
change
=
{
from
:
pos
,
to
:
pos
,
text
:
cm
.
doc
.
splitLines
(
text
.
join
(
cm
.
doc
.
lineSeparator
())),
origin
:
"
paste
"
}
makeChange
(
cm
.
doc
,
change
)
setSelectionReplaceHistory
(
cm
.
doc
,
simpleSelection
(
pos
,
changeEnd
(
change
)))
}
})
reader
.
readAsText
(
file
)
}
for
(
let
i
=
0
;
i
<
n
;
++
i
)
loadFile
(
files
[
i
],
i
)
}
else
{
// Normal drop
// Don't do a replace if the drop happened inside of the selected text.
if
(
cm
.
state
.
draggingText
&&
cm
.
doc
.
sel
.
contains
(
pos
)
>
-
1
)
{
cm
.
state
.
draggingText
(
e
)
// Ensure the editor is re-focused
setTimeout
(()
=>
cm
.
display
.
input
.
focus
(),
20
)
return
}
try
{
let
text
=
e
.
dataTransfer
.
getData
(
"
Text
"
)
if
(
text
)
{
let
selected
if
(
cm
.
state
.
draggingText
&&
!
cm
.
state
.
draggingText
.
copy
)
selected
=
cm
.
listSelections
()
setSelectionNoUndo
(
cm
.
doc
,
simpleSelection
(
pos
,
pos
))
if
(
selected
)
for
(
let
i
=
0
;
i
<
selected
.
length
;
++
i
)
replaceRange
(
cm
.
doc
,
""
,
selected
[
i
].
anchor
,
selected
[
i
].
head
,
"
drag
"
)
cm
.
replaceSelection
(
text
,
"
around
"
,
"
paste
"
)
cm
.
display
.
input
.
focus
()
}
}
catch
(
e
){}
}
}
export
function
onDragStart
(
cm
,
e
)
{
if
(
ie
&&
(
!
cm
.
state
.
draggingText
||
+
new
Date
-
lastDrop
<
100
))
{
e_stop
(
e
);
return
}
if
(
signalDOMEvent
(
cm
,
e
)
||
eventInWidget
(
cm
.
display
,
e
))
return
e
.
dataTransfer
.
setData
(
"
Text
"
,
cm
.
getSelection
())
e
.
dataTransfer
.
effectAllowed
=
"
copyMove
"
// Use dummy image instead of default browsers image.
// Recent Safari (~6.0.2) have a tendency to segfault when this happens, so we don't do it there.
if
(
e
.
dataTransfer
.
setDragImage
&&
!
safari
)
{
let
img
=
elt
(
"
img
"
,
null
,
null
,
"
position: fixed; left: 0; top: 0;
"
)
img
.
src
=
"
data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==
"
if
(
presto
)
{
img
.
width
=
img
.
height
=
1
cm
.
display
.
wrapper
.
appendChild
(
img
)
// Force a relayout, or Opera won't use our image for some obscure reason
img
.
_top
=
img
.
offsetTop
}
e
.
dataTransfer
.
setDragImage
(
img
,
0
,
0
)
if
(
presto
)
img
.
parentNode
.
removeChild
(
img
)
}
}
export
function
onDragOver
(
cm
,
e
)
{
let
pos
=
posFromMouse
(
cm
,
e
)
if
(
!
pos
)
return
let
frag
=
document
.
createDocumentFragment
()
drawSelectionCursor
(
cm
,
pos
,
frag
)
if
(
!
cm
.
display
.
dragCursor
)
{
cm
.
display
.
dragCursor
=
elt
(
"
div
"
,
null
,
"
CodeMirror-cursors CodeMirror-dragcursors
"
)
cm
.
display
.
lineSpace
.
insertBefore
(
cm
.
display
.
dragCursor
,
cm
.
display
.
cursorDiv
)
}
removeChildrenAndAdd
(
cm
.
display
.
dragCursor
,
frag
)
}
export
function
clearDragCursor
(
cm
)
{
if
(
cm
.
display
.
dragCursor
)
{
cm
.
display
.
lineSpace
.
removeChild
(
cm
.
display
.
dragCursor
)
cm
.
display
.
dragCursor
=
null
}
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/drop_events.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
drop_events.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/fromTextArea.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
CodeMirror
}
from
"
./CodeMirror
"
import
{
activeElt
}
from
"
../util/dom
"
import
{
off
,
on
}
from
"
../util/event
"
import
{
copyObj
}
from
"
../util/misc
"
export
function
fromTextArea
(
textarea
,
options
)
{
options
=
options
?
copyObj
(
options
)
:
{}
options
.
value
=
textarea
.
value
if
(
!
options
.
tabindex
&&
textarea
.
tabIndex
)
options
.
tabindex
=
textarea
.
tabIndex
if
(
!
options
.
placeholder
&&
textarea
.
placeholder
)
options
.
placeholder
=
textarea
.
placeholder
// Set autofocus to true if this textarea is focused, or if it has
// autofocus and no other element is focused.
if
(
options
.
autofocus
==
null
)
{
let
hasFocus
=
activeElt
()
options
.
autofocus
=
hasFocus
==
textarea
||
textarea
.
getAttribute
(
"
autofocus
"
)
!=
null
&&
hasFocus
==
document
.
body
}
function
save
()
{
textarea
.
value
=
cm
.
getValue
()}
let
realSubmit
if
(
textarea
.
form
)
{
on
(
textarea
.
form
,
"
submit
"
,
save
)
// Deplorable hack to make the submit method do the right thing.
if
(
!
options
.
leaveSubmitMethodAlone
)
{
let
form
=
textarea
.
form
realSubmit
=
form
.
submit
try
{
let
wrappedSubmit
=
form
.
submit
=
()
=>
{
save
()
form
.
submit
=
realSubmit
form
.
submit
()
form
.
submit
=
wrappedSubmit
}
}
catch
(
e
)
{}
}
}
options
.
finishInit
=
cm
=>
{
cm
.
save
=
save
cm
.
getTextArea
=
()
=>
textarea
cm
.
toTextArea
=
()
=>
{
cm
.
toTextArea
=
isNaN
// Prevent this from being ran twice
save
()
textarea
.
parentNode
.
removeChild
(
cm
.
getWrapperElement
())
textarea
.
style
.
display
=
""
if
(
textarea
.
form
)
{
off
(
textarea
.
form
,
"
submit
"
,
save
)
if
(
typeof
textarea
.
form
.
submit
==
"
function
"
)
textarea
.
form
.
submit
=
realSubmit
}
}
}
textarea
.
style
.
display
=
"
none
"
let
cm
=
CodeMirror
(
node
=>
textarea
.
parentNode
.
insertBefore
(
node
,
textarea
.
nextSibling
),
options
)
return
cm
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/fromTextArea.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
fromTextArea.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/global_events.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
onBlur
}
from
"
../display/focus
"
import
{
on
}
from
"
../util/event
"
// These must be handled carefully, because naively registering a
// handler for each editor will cause the editors to never be
// garbage collected.
function
forEachCodeMirror
(
f
)
{
if
(
!
document
.
body
.
getElementsByClassName
)
return
let
byClass
=
document
.
body
.
getElementsByClassName
(
"
CodeMirror
"
)
for
(
let
i
=
0
;
i
<
byClass
.
length
;
i
++
)
{
let
cm
=
byClass
[
i
].
CodeMirror
if
(
cm
)
f
(
cm
)
}
}
let
globalsRegistered
=
false
export
function
ensureGlobalHandlers
()
{
if
(
globalsRegistered
)
return
registerGlobalHandlers
()
globalsRegistered
=
true
}
function
registerGlobalHandlers
()
{
// When the window resizes, we need to refresh active editors.
let
resizeTimer
on
(
window
,
"
resize
"
,
()
=>
{
if
(
resizeTimer
==
null
)
resizeTimer
=
setTimeout
(()
=>
{
resizeTimer
=
null
forEachCodeMirror
(
onResize
)
},
100
)
})
// When the window loses focus, we want to show the editor as blurred
on
(
window
,
"
blur
"
,
()
=>
forEachCodeMirror
(
onBlur
))
}
// Called when the window resizes
function
onResize
(
cm
)
{
let
d
=
cm
.
display
if
(
d
.
lastWrapHeight
==
d
.
wrapper
.
clientHeight
&&
d
.
lastWrapWidth
==
d
.
wrapper
.
clientWidth
)
return
// Might be a text scaling operation, clear size caches.
d
.
cachedCharWidth
=
d
.
cachedTextHeight
=
d
.
cachedPaddingH
=
null
d
.
scrollbarsClipped
=
false
cm
.
setSize
()
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/global_events.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
global_events.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/key_events.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
signalLater
}
from
"
../util/operation_group
"
import
{
restartBlink
}
from
"
../display/selection
"
import
{
isModifierKey
,
keyName
,
lookupKey
}
from
"
../input/keymap
"
import
{
eventInWidget
}
from
"
../measurement/widgets
"
import
{
ie
,
ie_version
,
mac
,
presto
}
from
"
../util/browser
"
import
{
activeElt
,
addClass
,
rmClass
}
from
"
../util/dom
"
import
{
e_preventDefault
,
off
,
on
,
signalDOMEvent
}
from
"
../util/event
"
import
{
hasCopyEvent
}
from
"
../util/feature_detection
"
import
{
Delayed
,
Pass
}
from
"
../util/misc
"
import
{
commands
}
from
"
./commands
"
// Run a handler that was bound to a key.
function
doHandleBinding
(
cm
,
bound
,
dropShift
)
{
if
(
typeof
bound
==
"
string
"
)
{
bound
=
commands
[
bound
]
if
(
!
bound
)
return
false
}
// Ensure previous input has been read, so that the handler sees a
// consistent view of the document
cm
.
display
.
input
.
ensurePolled
()
let
prevShift
=
cm
.
display
.
shift
,
done
=
false
try
{
if
(
cm
.
isReadOnly
())
cm
.
state
.
suppressEdits
=
true
if
(
dropShift
)
cm
.
display
.
shift
=
false
done
=
bound
(
cm
)
!=
Pass
}
finally
{
cm
.
display
.
shift
=
prevShift
cm
.
state
.
suppressEdits
=
false
}
return
done
}
function
lookupKeyForEditor
(
cm
,
name
,
handle
)
{
for
(
let
i
=
0
;
i
<
cm
.
state
.
keyMaps
.
length
;
i
++
)
{
let
result
=
lookupKey
(
name
,
cm
.
state
.
keyMaps
[
i
],
handle
,
cm
)
if
(
result
)
return
result
}
return
(
cm
.
options
.
extraKeys
&&
lookupKey
(
name
,
cm
.
options
.
extraKeys
,
handle
,
cm
))
||
lookupKey
(
name
,
cm
.
options
.
keyMap
,
handle
,
cm
)
}
let
stopSeq
=
new
Delayed
function
dispatchKey
(
cm
,
name
,
e
,
handle
)
{
let
seq
=
cm
.
state
.
keySeq
if
(
seq
)
{
if
(
isModifierKey
(
name
))
return
"
handled
"
stopSeq
.
set
(
50
,
()
=>
{
if
(
cm
.
state
.
keySeq
==
seq
)
{
cm
.
state
.
keySeq
=
null
cm
.
display
.
input
.
reset
()
}
})
name
=
seq
+
"
"
+
name
}
let
result
=
lookupKeyForEditor
(
cm
,
name
,
handle
)
if
(
result
==
"
multi
"
)
cm
.
state
.
keySeq
=
name
if
(
result
==
"
handled
"
)
signalLater
(
cm
,
"
keyHandled
"
,
cm
,
name
,
e
)
if
(
result
==
"
handled
"
||
result
==
"
multi
"
)
{
e_preventDefault
(
e
)
restartBlink
(
cm
)
}
if
(
seq
&&
!
result
&&
/
\'
$/
.
test
(
name
))
{
e_preventDefault
(
e
)
return
true
}
return
!!
result
}
// Handle a key from the keydown event.
function
handleKeyBinding
(
cm
,
e
)
{
let
name
=
keyName
(
e
,
true
)
if
(
!
name
)
return
false
if
(
e
.
shiftKey
&&
!
cm
.
state
.
keySeq
)
{
// First try to resolve full name (including 'Shift-'). Failing
// that, see if there is a cursor-motion command (starting with
// 'go') bound to the keyname without 'Shift-'.
return
dispatchKey
(
cm
,
"
Shift-
"
+
name
,
e
,
b
=>
doHandleBinding
(
cm
,
b
,
true
))
||
dispatchKey
(
cm
,
name
,
e
,
b
=>
{
if
(
typeof
b
==
"
string
"
?
/^go
[
A-Z
]
/
.
test
(
b
)
:
b
.
motion
)
return
doHandleBinding
(
cm
,
b
)
})
}
else
{
return
dispatchKey
(
cm
,
name
,
e
,
b
=>
doHandleBinding
(
cm
,
b
))
}
}
// Handle a key from the keypress event
function
handleCharBinding
(
cm
,
e
,
ch
)
{
return
dispatchKey
(
cm
,
"
'
"
+
ch
+
"
'
"
,
e
,
b
=>
doHandleBinding
(
cm
,
b
,
true
))
}
let
lastStoppedKey
=
null
export
function
onKeyDown
(
e
)
{
let
cm
=
this
cm
.
curOp
.
focus
=
activeElt
()
if
(
signalDOMEvent
(
cm
,
e
))
return
// IE does strange things with escape.
if
(
ie
&&
ie_version
<
11
&&
e
.
keyCode
==
27
)
e
.
returnValue
=
false
let
code
=
e
.
keyCode
cm
.
display
.
shift
=
code
==
16
||
e
.
shiftKey
let
handled
=
handleKeyBinding
(
cm
,
e
)
if
(
presto
)
{
lastStoppedKey
=
handled
?
code
:
null
// Opera has no cut event... we try to at least catch the key combo
if
(
!
handled
&&
code
==
88
&&
!
hasCopyEvent
&&
(
mac
?
e
.
metaKey
:
e
.
ctrlKey
))
cm
.
replaceSelection
(
""
,
null
,
"
cut
"
)
}
// Turn mouse into crosshair when Alt is held on Mac.
if
(
code
==
18
&&
!
/
\b
CodeMirror-crosshair
\b
/
.
test
(
cm
.
display
.
lineDiv
.
className
))
showCrossHair
(
cm
)
}
function
showCrossHair
(
cm
)
{
let
lineDiv
=
cm
.
display
.
lineDiv
addClass
(
lineDiv
,
"
CodeMirror-crosshair
"
)
function
up
(
e
)
{
if
(
e
.
keyCode
==
18
||
!
e
.
altKey
)
{
rmClass
(
lineDiv
,
"
CodeMirror-crosshair
"
)
off
(
document
,
"
keyup
"
,
up
)
off
(
document
,
"
mouseover
"
,
up
)
}
}
on
(
document
,
"
keyup
"
,
up
)
on
(
document
,
"
mouseover
"
,
up
)
}
export
function
onKeyUp
(
e
)
{
if
(
e
.
keyCode
==
16
)
this
.
doc
.
sel
.
shift
=
false
signalDOMEvent
(
this
,
e
)
}
export
function
onKeyPress
(
e
)
{
let
cm
=
this
if
(
eventInWidget
(
cm
.
display
,
e
)
||
signalDOMEvent
(
cm
,
e
)
||
e
.
ctrlKey
&&
!
e
.
altKey
||
mac
&&
e
.
metaKey
)
return
let
keyCode
=
e
.
keyCode
,
charCode
=
e
.
charCode
if
(
presto
&&
keyCode
==
lastStoppedKey
)
{
lastStoppedKey
=
null
;
e_preventDefault
(
e
);
return
}
if
((
presto
&&
(
!
e
.
which
||
e
.
which
<
10
))
&&
handleKeyBinding
(
cm
,
e
))
return
let
ch
=
String
.
fromCharCode
(
charCode
==
null
?
keyCode
:
charCode
)
// Some browsers fire keypress events for backspace
if
(
ch
==
"
\
x08
"
)
return
if
(
handleCharBinding
(
cm
,
e
,
ch
))
return
cm
.
display
.
input
.
onKeyPress
(
e
)
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/key_events.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
key_events.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/legacy.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
scrollbarModel
}
from
"
../display/scrollbars
"
import
{
wheelEventPixels
}
from
"
../display/scroll_events
"
import
{
keyMap
,
keyName
,
isModifierKey
,
lookupKey
,
normalizeKeyMap
}
from
"
../input/keymap
"
import
{
keyNames
}
from
"
../input/keynames
"
import
{
Line
}
from
"
../line/line_data
"
import
{
cmp
,
Pos
}
from
"
../line/pos
"
import
{
changeEnd
}
from
"
../model/change_measurement
"
import
Doc
from
"
../model/Doc
"
import
{
LineWidget
}
from
"
../model/line_widget
"
import
{
SharedTextMarker
,
TextMarker
}
from
"
../model/mark_text
"
import
{
copyState
,
extendMode
,
getMode
,
innerMode
,
mimeModes
,
modeExtensions
,
modes
,
resolveMode
,
startState
}
from
"
../modes
"
import
{
addClass
,
contains
,
rmClass
}
from
"
../util/dom
"
import
{
e_preventDefault
,
e_stop
,
e_stopPropagation
,
off
,
on
,
signal
}
from
"
../util/event
"
import
{
splitLinesAuto
}
from
"
../util/feature_detection
"
import
{
countColumn
,
findColumn
,
isWordCharBasic
,
Pass
}
from
"
../util/misc
"
import
StringStream
from
"
../util/StringStream
"
import
{
commands
}
from
"
./commands
"
export
function
addLegacyProps
(
CodeMirror
)
{
CodeMirror
.
off
=
off
CodeMirror
.
on
=
on
CodeMirror
.
wheelEventPixels
=
wheelEventPixels
CodeMirror
.
Doc
=
Doc
CodeMirror
.
splitLines
=
splitLinesAuto
CodeMirror
.
countColumn
=
countColumn
CodeMirror
.
findColumn
=
findColumn
CodeMirror
.
isWordChar
=
isWordCharBasic
CodeMirror
.
Pass
=
Pass
CodeMirror
.
signal
=
signal
CodeMirror
.
Line
=
Line
CodeMirror
.
changeEnd
=
changeEnd
CodeMirror
.
scrollbarModel
=
scrollbarModel
CodeMirror
.
Pos
=
Pos
CodeMirror
.
cmpPos
=
cmp
CodeMirror
.
modes
=
modes
CodeMirror
.
mimeModes
=
mimeModes
CodeMirror
.
resolveMode
=
resolveMode
CodeMirror
.
getMode
=
getMode
CodeMirror
.
modeExtensions
=
modeExtensions
CodeMirror
.
extendMode
=
extendMode
CodeMirror
.
copyState
=
copyState
CodeMirror
.
startState
=
startState
CodeMirror
.
innerMode
=
innerMode
CodeMirror
.
commands
=
commands
CodeMirror
.
keyMap
=
keyMap
CodeMirror
.
keyName
=
keyName
CodeMirror
.
isModifierKey
=
isModifierKey
CodeMirror
.
lookupKey
=
lookupKey
CodeMirror
.
normalizeKeyMap
=
normalizeKeyMap
CodeMirror
.
StringStream
=
StringStream
CodeMirror
.
SharedTextMarker
=
SharedTextMarker
CodeMirror
.
TextMarker
=
TextMarker
CodeMirror
.
LineWidget
=
LineWidget
CodeMirror
.
e_preventDefault
=
e_preventDefault
CodeMirror
.
e_stopPropagation
=
e_stopPropagation
CodeMirror
.
e_stop
=
e_stop
CodeMirror
.
addClass
=
addClass
CodeMirror
.
contains
=
contains
CodeMirror
.
rmClass
=
rmClass
CodeMirror
.
keyNames
=
keyNames
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/legacy.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
legacy.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/main.js.js
deleted
100644 → 0
View file @
a3a26621
// EDITOR CONSTRUCTOR
import
{
CodeMirror
}
from
"
./CodeMirror
"
export
{
CodeMirror
}
from
"
./CodeMirror
"
import
{
eventMixin
}
from
"
../util/event
"
import
{
indexOf
}
from
"
../util/misc
"
import
{
defineOptions
}
from
"
./options
"
defineOptions
(
CodeMirror
)
import
addEditorMethods
from
"
./methods
"
addEditorMethods
(
CodeMirror
)
import
Doc
from
"
../model/Doc
"
// Set up methods on CodeMirror's prototype to redirect to the editor's document.
let
dontDelegate
=
"
iter insert remove copy getEditor constructor
"
.
split
(
"
"
)
for
(
let
prop
in
Doc
.
prototype
)
if
(
Doc
.
prototype
.
hasOwnProperty
(
prop
)
&&
indexOf
(
dontDelegate
,
prop
)
<
0
)
CodeMirror
.
prototype
[
prop
]
=
(
function
(
method
)
{
return
function
()
{
return
method
.
apply
(
this
.
doc
,
arguments
)}
})(
Doc
.
prototype
[
prop
])
eventMixin
(
Doc
)
// INPUT HANDLING
import
ContentEditableInput
from
"
../input/ContentEditableInput
"
import
TextareaInput
from
"
../input/TextareaInput
"
CodeMirror
.
inputStyles
=
{
"
textarea
"
:
TextareaInput
,
"
contenteditable
"
:
ContentEditableInput
}
// MODE DEFINITION AND QUERYING
import
{
defineMIME
,
defineMode
}
from
"
../modes
"
// Extra arguments are stored as the mode's dependencies, which is
// used by (legacy) mechanisms like loadmode.js to automatically
// load a mode. (Preferred mechanism is the require/define calls.)
CodeMirror
.
defineMode
=
function
(
name
/*, mode, …*/
)
{
if
(
!
CodeMirror
.
defaults
.
mode
&&
name
!=
"
null
"
)
CodeMirror
.
defaults
.
mode
=
name
defineMode
.
apply
(
this
,
arguments
)
}
CodeMirror
.
defineMIME
=
defineMIME
// Minimal default mode.
CodeMirror
.
defineMode
(
"
null
"
,
()
=>
({
token
:
stream
=>
stream
.
skipToEnd
()}))
CodeMirror
.
defineMIME
(
"
text/plain
"
,
"
null
"
)
// EXTENSIONS
CodeMirror
.
defineExtension
=
(
name
,
func
)
=>
{
CodeMirror
.
prototype
[
name
]
=
func
}
CodeMirror
.
defineDocExtension
=
(
name
,
func
)
=>
{
Doc
.
prototype
[
name
]
=
func
}
import
{
fromTextArea
}
from
"
./fromTextArea
"
CodeMirror
.
fromTextArea
=
fromTextArea
import
{
addLegacyProps
}
from
"
./legacy
"
addLegacyProps
(
CodeMirror
)
CodeMirror
.
version
=
"
5.24.2
"
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/main.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
main.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/methods.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
deleteNearSelection
}
from
"
./deleteNearSelection
"
import
{
commands
}
from
"
./commands
"
import
{
attachDoc
}
from
"
../model/document_data
"
import
{
activeElt
,
addClass
,
rmClass
}
from
"
../util/dom
"
import
{
eventMixin
,
signal
}
from
"
../util/event
"
import
{
getLineStyles
,
getStateBefore
,
takeToken
}
from
"
../line/highlight
"
import
{
indentLine
}
from
"
../input/indent
"
import
{
triggerElectric
}
from
"
../input/input
"
import
{
onKeyDown
,
onKeyPress
,
onKeyUp
}
from
"
./key_events
"
import
{
getKeyMap
}
from
"
../input/keymap
"
import
{
endOfLine
,
moveLogically
,
moveVisually
}
from
"
../input/movement
"
import
{
methodOp
,
operation
,
runInOp
}
from
"
../display/operations
"
import
{
clipLine
,
clipPos
,
equalCursorPos
,
Pos
}
from
"
../line/pos
"
import
{
charCoords
,
charWidth
,
clearCaches
,
clearLineMeasurementCache
,
coordsChar
,
cursorCoords
,
displayHeight
,
displayWidth
,
estimateLineHeights
,
fromCoordSystem
,
intoCoordSystem
,
scrollGap
,
textHeight
}
from
"
../measurement/position_measurement
"
import
{
Range
}
from
"
../model/selection
"
import
{
replaceOneSelection
,
skipAtomic
}
from
"
../model/selection_updates
"
import
{
addToScrollPos
,
calculateScrollPos
,
ensureCursorVisible
,
resolveScrollToPos
,
scrollIntoView
}
from
"
../display/scrolling
"
import
{
heightAtLine
}
from
"
../line/spans
"
import
{
updateGutterSpace
}
from
"
../display/update_display
"
import
{
indexOf
,
insertSorted
,
isWordChar
,
sel_dontScroll
,
sel_move
}
from
"
../util/misc
"
import
{
signalLater
}
from
"
../util/operation_group
"
import
{
getLine
,
isLine
,
lineAtHeight
}
from
"
../line/utils_line
"
import
{
regChange
,
regLineChange
}
from
"
../display/view_tracking
"
// The publicly visible API. Note that methodOp(f) means
// 'wrap f in an operation, performed on its `this` parameter'.
// This is not the complete set of editor methods. Most of the
// methods defined on the Doc type are also injected into
// CodeMirror.prototype, for backwards compatibility and
// convenience.
export
default
function
(
CodeMirror
)
{
let
optionHandlers
=
CodeMirror
.
optionHandlers
let
helpers
=
CodeMirror
.
helpers
=
{}
CodeMirror
.
prototype
=
{
constructor
:
CodeMirror
,
focus
:
function
(){
window
.
focus
();
this
.
display
.
input
.
focus
()},
setOption
:
function
(
option
,
value
)
{
let
options
=
this
.
options
,
old
=
options
[
option
]
if
(
options
[
option
]
==
value
&&
option
!=
"
mode
"
)
return
options
[
option
]
=
value
if
(
optionHandlers
.
hasOwnProperty
(
option
))
operation
(
this
,
optionHandlers
[
option
])(
this
,
value
,
old
)
signal
(
this
,
"
optionChange
"
,
this
,
option
)
},
getOption
:
function
(
option
)
{
return
this
.
options
[
option
]},
getDoc
:
function
()
{
return
this
.
doc
},
addKeyMap
:
function
(
map
,
bottom
)
{
this
.
state
.
keyMaps
[
bottom
?
"
push
"
:
"
unshift
"
](
getKeyMap
(
map
))
},
removeKeyMap
:
function
(
map
)
{
let
maps
=
this
.
state
.
keyMaps
for
(
let
i
=
0
;
i
<
maps
.
length
;
++
i
)
if
(
maps
[
i
]
==
map
||
maps
[
i
].
name
==
map
)
{
maps
.
splice
(
i
,
1
)
return
true
}
},
addOverlay
:
methodOp
(
function
(
spec
,
options
)
{
let
mode
=
spec
.
token
?
spec
:
CodeMirror
.
getMode
(
this
.
options
,
spec
)
if
(
mode
.
startState
)
throw
new
Error
(
"
Overlays may not be stateful.
"
)
insertSorted
(
this
.
state
.
overlays
,
{
mode
:
mode
,
modeSpec
:
spec
,
opaque
:
options
&&
options
.
opaque
,
priority
:
(
options
&&
options
.
priority
)
||
0
},
overlay
=>
overlay
.
priority
)
this
.
state
.
modeGen
++
regChange
(
this
)
}),
removeOverlay
:
methodOp
(
function
(
spec
)
{
let
overlays
=
this
.
state
.
overlays
for
(
let
i
=
0
;
i
<
overlays
.
length
;
++
i
)
{
let
cur
=
overlays
[
i
].
modeSpec
if
(
cur
==
spec
||
typeof
spec
==
"
string
"
&&
cur
.
name
==
spec
)
{
overlays
.
splice
(
i
,
1
)
this
.
state
.
modeGen
++
regChange
(
this
)
return
}
}
}),
indentLine
:
methodOp
(
function
(
n
,
dir
,
aggressive
)
{
if
(
typeof
dir
!=
"
string
"
&&
typeof
dir
!=
"
number
"
)
{
if
(
dir
==
null
)
dir
=
this
.
options
.
smartIndent
?
"
smart
"
:
"
prev
"
else
dir
=
dir
?
"
add
"
:
"
subtract
"
}
if
(
isLine
(
this
.
doc
,
n
))
indentLine
(
this
,
n
,
dir
,
aggressive
)
}),
indentSelection
:
methodOp
(
function
(
how
)
{
let
ranges
=
this
.
doc
.
sel
.
ranges
,
end
=
-
1
for
(
let
i
=
0
;
i
<
ranges
.
length
;
i
++
)
{
let
range
=
ranges
[
i
]
if
(
!
range
.
empty
())
{
let
from
=
range
.
from
(),
to
=
range
.
to
()
let
start
=
Math
.
max
(
end
,
from
.
line
)
end
=
Math
.
min
(
this
.
lastLine
(),
to
.
line
-
(
to
.
ch
?
0
:
1
))
+
1
for
(
let
j
=
start
;
j
<
end
;
++
j
)
indentLine
(
this
,
j
,
how
)
let
newRanges
=
this
.
doc
.
sel
.
ranges
if
(
from
.
ch
==
0
&&
ranges
.
length
==
newRanges
.
length
&&
newRanges
[
i
].
from
().
ch
>
0
)
replaceOneSelection
(
this
.
doc
,
i
,
new
Range
(
from
,
newRanges
[
i
].
to
()),
sel_dontScroll
)
}
else
if
(
range
.
head
.
line
>
end
)
{
indentLine
(
this
,
range
.
head
.
line
,
how
,
true
)
end
=
range
.
head
.
line
if
(
i
==
this
.
doc
.
sel
.
primIndex
)
ensureCursorVisible
(
this
)
}
}
}),
// Fetch the parser token for a given character. Useful for hacks
// that want to inspect the mode state (say, for completion).
getTokenAt
:
function
(
pos
,
precise
)
{
return
takeToken
(
this
,
pos
,
precise
)
},
getLineTokens
:
function
(
line
,
precise
)
{
return
takeToken
(
this
,
Pos
(
line
),
precise
,
true
)
},
getTokenTypeAt
:
function
(
pos
)
{
pos
=
clipPos
(
this
.
doc
,
pos
)
let
styles
=
getLineStyles
(
this
,
getLine
(
this
.
doc
,
pos
.
line
))
let
before
=
0
,
after
=
(
styles
.
length
-
1
)
/
2
,
ch
=
pos
.
ch
let
type
if
(
ch
==
0
)
type
=
styles
[
2
]
else
for
(;;)
{
let
mid
=
(
before
+
after
)
>>
1
if
((
mid
?
styles
[
mid
*
2
-
1
]
:
0
)
>=
ch
)
after
=
mid
else
if
(
styles
[
mid
*
2
+
1
]
<
ch
)
before
=
mid
+
1
else
{
type
=
styles
[
mid
*
2
+
2
];
break
}
}
let
cut
=
type
?
type
.
indexOf
(
"
overlay
"
)
:
-
1
return
cut
<
0
?
type
:
cut
==
0
?
null
:
type
.
slice
(
0
,
cut
-
1
)
},
getModeAt
:
function
(
pos
)
{
let
mode
=
this
.
doc
.
mode
if
(
!
mode
.
innerMode
)
return
mode
return
CodeMirror
.
innerMode
(
mode
,
this
.
getTokenAt
(
pos
).
state
).
mode
},
getHelper
:
function
(
pos
,
type
)
{
return
this
.
getHelpers
(
pos
,
type
)[
0
]
},
getHelpers
:
function
(
pos
,
type
)
{
let
found
=
[]
if
(
!
helpers
.
hasOwnProperty
(
type
))
return
found
let
help
=
helpers
[
type
],
mode
=
this
.
getModeAt
(
pos
)
if
(
typeof
mode
[
type
]
==
"
string
"
)
{
if
(
help
[
mode
[
type
]])
found
.
push
(
help
[
mode
[
type
]])
}
else
if
(
mode
[
type
])
{
for
(
let
i
=
0
;
i
<
mode
[
type
].
length
;
i
++
)
{
let
val
=
help
[
mode
[
type
][
i
]]
if
(
val
)
found
.
push
(
val
)
}
}
else
if
(
mode
.
helperType
&&
help
[
mode
.
helperType
])
{
found
.
push
(
help
[
mode
.
helperType
])
}
else
if
(
help
[
mode
.
name
])
{
found
.
push
(
help
[
mode
.
name
])
}
for
(
let
i
=
0
;
i
<
help
.
_global
.
length
;
i
++
)
{
let
cur
=
help
.
_global
[
i
]
if
(
cur
.
pred
(
mode
,
this
)
&&
indexOf
(
found
,
cur
.
val
)
==
-
1
)
found
.
push
(
cur
.
val
)
}
return
found
},
getStateAfter
:
function
(
line
,
precise
)
{
let
doc
=
this
.
doc
line
=
clipLine
(
doc
,
line
==
null
?
doc
.
first
+
doc
.
size
-
1
:
line
)
return
getStateBefore
(
this
,
line
+
1
,
precise
)
},
cursorCoords
:
function
(
start
,
mode
)
{
let
pos
,
range
=
this
.
doc
.
sel
.
primary
()
if
(
start
==
null
)
pos
=
range
.
head
else
if
(
typeof
start
==
"
object
"
)
pos
=
clipPos
(
this
.
doc
,
start
)
else
pos
=
start
?
range
.
from
()
:
range
.
to
()
return
cursorCoords
(
this
,
pos
,
mode
||
"
page
"
)
},
charCoords
:
function
(
pos
,
mode
)
{
return
charCoords
(
this
,
clipPos
(
this
.
doc
,
pos
),
mode
||
"
page
"
)
},
coordsChar
:
function
(
coords
,
mode
)
{
coords
=
fromCoordSystem
(
this
,
coords
,
mode
||
"
page
"
)
return
coordsChar
(
this
,
coords
.
left
,
coords
.
top
)
},
lineAtHeight
:
function
(
height
,
mode
)
{
height
=
fromCoordSystem
(
this
,
{
top
:
height
,
left
:
0
},
mode
||
"
page
"
).
top
return
lineAtHeight
(
this
.
doc
,
height
+
this
.
display
.
viewOffset
)
},
heightAtLine
:
function
(
line
,
mode
,
includeWidgets
)
{
let
end
=
false
,
lineObj
if
(
typeof
line
==
"
number
"
)
{
let
last
=
this
.
doc
.
first
+
this
.
doc
.
size
-
1
if
(
line
<
this
.
doc
.
first
)
line
=
this
.
doc
.
first
else
if
(
line
>
last
)
{
line
=
last
;
end
=
true
}
lineObj
=
getLine
(
this
.
doc
,
line
)
}
else
{
lineObj
=
line
}
return
intoCoordSystem
(
this
,
lineObj
,
{
top
:
0
,
left
:
0
},
mode
||
"
page
"
,
includeWidgets
||
end
).
top
+
(
end
?
this
.
doc
.
height
-
heightAtLine
(
lineObj
)
:
0
)
},
defaultTextHeight
:
function
()
{
return
textHeight
(
this
.
display
)
},
defaultCharWidth
:
function
()
{
return
charWidth
(
this
.
display
)
},
getViewport
:
function
()
{
return
{
from
:
this
.
display
.
viewFrom
,
to
:
this
.
display
.
viewTo
}},
addWidget
:
function
(
pos
,
node
,
scroll
,
vert
,
horiz
)
{
let
display
=
this
.
display
pos
=
cursorCoords
(
this
,
clipPos
(
this
.
doc
,
pos
))
let
top
=
pos
.
bottom
,
left
=
pos
.
left
node
.
style
.
position
=
"
absolute
"
node
.
setAttribute
(
"
cm-ignore-events
"
,
"
true
"
)
this
.
display
.
input
.
setUneditable
(
node
)
display
.
sizer
.
appendChild
(
node
)
if
(
vert
==
"
over
"
)
{
top
=
pos
.
top
}
else
if
(
vert
==
"
above
"
||
vert
==
"
near
"
)
{
let
vspace
=
Math
.
max
(
display
.
wrapper
.
clientHeight
,
this
.
doc
.
height
),
hspace
=
Math
.
max
(
display
.
sizer
.
clientWidth
,
display
.
lineSpace
.
clientWidth
)
// Default to positioning above (if specified and possible); otherwise default to positioning below
if
((
vert
==
'
above
'
||
pos
.
bottom
+
node
.
offsetHeight
>
vspace
)
&&
pos
.
top
>
node
.
offsetHeight
)
top
=
pos
.
top
-
node
.
offsetHeight
else
if
(
pos
.
bottom
+
node
.
offsetHeight
<=
vspace
)
top
=
pos
.
bottom
if
(
left
+
node
.
offsetWidth
>
hspace
)
left
=
hspace
-
node
.
offsetWidth
}
node
.
style
.
top
=
top
+
"
px
"
node
.
style
.
left
=
node
.
style
.
right
=
""
if
(
horiz
==
"
right
"
)
{
left
=
display
.
sizer
.
clientWidth
-
node
.
offsetWidth
node
.
style
.
right
=
"
0px
"
}
else
{
if
(
horiz
==
"
left
"
)
left
=
0
else
if
(
horiz
==
"
middle
"
)
left
=
(
display
.
sizer
.
clientWidth
-
node
.
offsetWidth
)
/
2
node
.
style
.
left
=
left
+
"
px
"
}
if
(
scroll
)
scrollIntoView
(
this
,
left
,
top
,
left
+
node
.
offsetWidth
,
top
+
node
.
offsetHeight
)
},
triggerOnKeyDown
:
methodOp
(
onKeyDown
),
triggerOnKeyPress
:
methodOp
(
onKeyPress
),
triggerOnKeyUp
:
onKeyUp
,
execCommand
:
function
(
cmd
)
{
if
(
commands
.
hasOwnProperty
(
cmd
))
return
commands
[
cmd
].
call
(
null
,
this
)
},
triggerElectric
:
methodOp
(
function
(
text
)
{
triggerElectric
(
this
,
text
)
}),
findPosH
:
function
(
from
,
amount
,
unit
,
visually
)
{
let
dir
=
1
if
(
amount
<
0
)
{
dir
=
-
1
;
amount
=
-
amount
}
let
cur
=
clipPos
(
this
.
doc
,
from
)
for
(
let
i
=
0
;
i
<
amount
;
++
i
)
{
cur
=
findPosH
(
this
.
doc
,
cur
,
dir
,
unit
,
visually
)
if
(
cur
.
hitSide
)
break
}
return
cur
},
moveH
:
methodOp
(
function
(
dir
,
unit
)
{
this
.
extendSelectionsBy
(
range
=>
{
if
(
this
.
display
.
shift
||
this
.
doc
.
extend
||
range
.
empty
())
return
findPosH
(
this
.
doc
,
range
.
head
,
dir
,
unit
,
this
.
options
.
rtlMoveVisually
)
else
return
dir
<
0
?
range
.
from
()
:
range
.
to
()
},
sel_move
)
}),
deleteH
:
methodOp
(
function
(
dir
,
unit
)
{
let
sel
=
this
.
doc
.
sel
,
doc
=
this
.
doc
if
(
sel
.
somethingSelected
())
doc
.
replaceSelection
(
""
,
null
,
"
+delete
"
)
else
deleteNearSelection
(
this
,
range
=>
{
let
other
=
findPosH
(
doc
,
range
.
head
,
dir
,
unit
,
false
)
return
dir
<
0
?
{
from
:
other
,
to
:
range
.
head
}
:
{
from
:
range
.
head
,
to
:
other
}
})
}),
findPosV
:
function
(
from
,
amount
,
unit
,
goalColumn
)
{
let
dir
=
1
,
x
=
goalColumn
if
(
amount
<
0
)
{
dir
=
-
1
;
amount
=
-
amount
}
let
cur
=
clipPos
(
this
.
doc
,
from
)
for
(
let
i
=
0
;
i
<
amount
;
++
i
)
{
let
coords
=
cursorCoords
(
this
,
cur
,
"
div
"
)
if
(
x
==
null
)
x
=
coords
.
left
else
coords
.
left
=
x
cur
=
findPosV
(
this
,
coords
,
dir
,
unit
)
if
(
cur
.
hitSide
)
break
}
return
cur
},
moveV
:
methodOp
(
function
(
dir
,
unit
)
{
let
doc
=
this
.
doc
,
goals
=
[]
let
collapse
=
!
this
.
display
.
shift
&&
!
doc
.
extend
&&
doc
.
sel
.
somethingSelected
()
doc
.
extendSelectionsBy
(
range
=>
{
if
(
collapse
)
return
dir
<
0
?
range
.
from
()
:
range
.
to
()
let
headPos
=
cursorCoords
(
this
,
range
.
head
,
"
div
"
)
if
(
range
.
goalColumn
!=
null
)
headPos
.
left
=
range
.
goalColumn
goals
.
push
(
headPos
.
left
)
let
pos
=
findPosV
(
this
,
headPos
,
dir
,
unit
)
if
(
unit
==
"
page
"
&&
range
==
doc
.
sel
.
primary
())
addToScrollPos
(
this
,
null
,
charCoords
(
this
,
pos
,
"
div
"
).
top
-
headPos
.
top
)
return
pos
},
sel_move
)
if
(
goals
.
length
)
for
(
let
i
=
0
;
i
<
doc
.
sel
.
ranges
.
length
;
i
++
)
doc
.
sel
.
ranges
[
i
].
goalColumn
=
goals
[
i
]
}),
// Find the word at the given position (as returned by coordsChar).
findWordAt
:
function
(
pos
)
{
let
doc
=
this
.
doc
,
line
=
getLine
(
doc
,
pos
.
line
).
text
let
start
=
pos
.
ch
,
end
=
pos
.
ch
if
(
line
)
{
let
helper
=
this
.
getHelper
(
pos
,
"
wordChars
"
)
if
((
pos
.
sticky
==
"
before
"
||
end
==
line
.
length
)
&&
start
)
--
start
;
else
++
end
let
startChar
=
line
.
charAt
(
start
)
let
check
=
isWordChar
(
startChar
,
helper
)
?
ch
=>
isWordChar
(
ch
,
helper
)
:
/
\s
/
.
test
(
startChar
)
?
ch
=>
/
\s
/
.
test
(
ch
)
:
ch
=>
(
!
/
\s
/
.
test
(
ch
)
&&
!
isWordChar
(
ch
))
while
(
start
>
0
&&
check
(
line
.
charAt
(
start
-
1
)))
--
start
while
(
end
<
line
.
length
&&
check
(
line
.
charAt
(
end
)))
++
end
}
return
new
Range
(
Pos
(
pos
.
line
,
start
),
Pos
(
pos
.
line
,
end
))
},
toggleOverwrite
:
function
(
value
)
{
if
(
value
!=
null
&&
value
==
this
.
state
.
overwrite
)
return
if
(
this
.
state
.
overwrite
=
!
this
.
state
.
overwrite
)
addClass
(
this
.
display
.
cursorDiv
,
"
CodeMirror-overwrite
"
)
else
rmClass
(
this
.
display
.
cursorDiv
,
"
CodeMirror-overwrite
"
)
signal
(
this
,
"
overwriteToggle
"
,
this
,
this
.
state
.
overwrite
)
},
hasFocus
:
function
()
{
return
this
.
display
.
input
.
getField
()
==
activeElt
()
},
isReadOnly
:
function
()
{
return
!!
(
this
.
options
.
readOnly
||
this
.
doc
.
cantEdit
)
},
scrollTo
:
methodOp
(
function
(
x
,
y
)
{
if
(
x
!=
null
||
y
!=
null
)
resolveScrollToPos
(
this
)
if
(
x
!=
null
)
this
.
curOp
.
scrollLeft
=
x
if
(
y
!=
null
)
this
.
curOp
.
scrollTop
=
y
}),
getScrollInfo
:
function
()
{
let
scroller
=
this
.
display
.
scroller
return
{
left
:
scroller
.
scrollLeft
,
top
:
scroller
.
scrollTop
,
height
:
scroller
.
scrollHeight
-
scrollGap
(
this
)
-
this
.
display
.
barHeight
,
width
:
scroller
.
scrollWidth
-
scrollGap
(
this
)
-
this
.
display
.
barWidth
,
clientHeight
:
displayHeight
(
this
),
clientWidth
:
displayWidth
(
this
)}
},
scrollIntoView
:
methodOp
(
function
(
range
,
margin
)
{
if
(
range
==
null
)
{
range
=
{
from
:
this
.
doc
.
sel
.
primary
().
head
,
to
:
null
}
if
(
margin
==
null
)
margin
=
this
.
options
.
cursorScrollMargin
}
else
if
(
typeof
range
==
"
number
"
)
{
range
=
{
from
:
Pos
(
range
,
0
),
to
:
null
}
}
else
if
(
range
.
from
==
null
)
{
range
=
{
from
:
range
,
to
:
null
}
}
if
(
!
range
.
to
)
range
.
to
=
range
.
from
range
.
margin
=
margin
||
0
if
(
range
.
from
.
line
!=
null
)
{
resolveScrollToPos
(
this
)
this
.
curOp
.
scrollToPos
=
range
}
else
{
let
sPos
=
calculateScrollPos
(
this
,
Math
.
min
(
range
.
from
.
left
,
range
.
to
.
left
),
Math
.
min
(
range
.
from
.
top
,
range
.
to
.
top
)
-
range
.
margin
,
Math
.
max
(
range
.
from
.
right
,
range
.
to
.
right
),
Math
.
max
(
range
.
from
.
bottom
,
range
.
to
.
bottom
)
+
range
.
margin
)
this
.
scrollTo
(
sPos
.
scrollLeft
,
sPos
.
scrollTop
)
}
}),
setSize
:
methodOp
(
function
(
width
,
height
)
{
let
interpret
=
val
=>
typeof
val
==
"
number
"
||
/^
\d
+$/
.
test
(
String
(
val
))
?
val
+
"
px
"
:
val
if
(
width
!=
null
)
this
.
display
.
wrapper
.
style
.
width
=
interpret
(
width
)
if
(
height
!=
null
)
this
.
display
.
wrapper
.
style
.
height
=
interpret
(
height
)
if
(
this
.
options
.
lineWrapping
)
clearLineMeasurementCache
(
this
)
let
lineNo
=
this
.
display
.
viewFrom
this
.
doc
.
iter
(
lineNo
,
this
.
display
.
viewTo
,
line
=>
{
if
(
line
.
widgets
)
for
(
let
i
=
0
;
i
<
line
.
widgets
.
length
;
i
++
)
if
(
line
.
widgets
[
i
].
noHScroll
)
{
regLineChange
(
this
,
lineNo
,
"
widget
"
);
break
}
++
lineNo
})
this
.
curOp
.
forceUpdate
=
true
signal
(
this
,
"
refresh
"
,
this
)
}),
operation
:
function
(
f
){
return
runInOp
(
this
,
f
)},
refresh
:
methodOp
(
function
()
{
let
oldHeight
=
this
.
display
.
cachedTextHeight
regChange
(
this
)
this
.
curOp
.
forceUpdate
=
true
clearCaches
(
this
)
this
.
scrollTo
(
this
.
doc
.
scrollLeft
,
this
.
doc
.
scrollTop
)
updateGutterSpace
(
this
)
if
(
oldHeight
==
null
||
Math
.
abs
(
oldHeight
-
textHeight
(
this
.
display
))
>
.
5
)
estimateLineHeights
(
this
)
signal
(
this
,
"
refresh
"
,
this
)
}),
swapDoc
:
methodOp
(
function
(
doc
)
{
let
old
=
this
.
doc
old
.
cm
=
null
attachDoc
(
this
,
doc
)
clearCaches
(
this
)
this
.
display
.
input
.
reset
()
this
.
scrollTo
(
doc
.
scrollLeft
,
doc
.
scrollTop
)
this
.
curOp
.
forceScroll
=
true
signalLater
(
this
,
"
swapDoc
"
,
this
,
old
)
return
old
}),
getInputField
:
function
(){
return
this
.
display
.
input
.
getField
()},
getWrapperElement
:
function
(){
return
this
.
display
.
wrapper
},
getScrollerElement
:
function
(){
return
this
.
display
.
scroller
},
getGutterElement
:
function
(){
return
this
.
display
.
gutters
}
}
eventMixin
(
CodeMirror
)
CodeMirror
.
registerHelper
=
function
(
type
,
name
,
value
)
{
if
(
!
helpers
.
hasOwnProperty
(
type
))
helpers
[
type
]
=
CodeMirror
[
type
]
=
{
_global
:
[]}
helpers
[
type
][
name
]
=
value
}
CodeMirror
.
registerGlobalHelper
=
function
(
type
,
name
,
predicate
,
value
)
{
CodeMirror
.
registerHelper
(
type
,
name
,
value
)
helpers
[
type
].
_global
.
push
({
pred
:
predicate
,
val
:
value
})
}
}
// Used for horizontal relative motion. Dir is -1 or 1 (left or
// right), unit can be "char", "column" (like char, but doesn't
// cross line boundaries), "word" (across next word), or "group" (to
// the start of next group of word or non-word-non-whitespace
// chars). The visually param controls whether, in right-to-left
// text, direction 1 means to move towards the next index in the
// string, or towards the character to the right of the current
// position. The resulting position will have a hitSide=true
// property if it reached the end of the document.
function
findPosH
(
doc
,
pos
,
dir
,
unit
,
visually
)
{
let
oldPos
=
pos
let
origDir
=
dir
let
lineObj
=
getLine
(
doc
,
pos
.
line
)
function
findNextLine
()
{
let
l
=
pos
.
line
+
dir
if
(
l
<
doc
.
first
||
l
>=
doc
.
first
+
doc
.
size
)
return
false
pos
=
new
Pos
(
l
,
pos
.
ch
,
pos
.
sticky
)
return
lineObj
=
getLine
(
doc
,
l
)
}
function
moveOnce
(
boundToLine
)
{
let
next
if
(
visually
)
{
next
=
moveVisually
(
doc
.
cm
,
lineObj
,
pos
,
dir
)
}
else
{
next
=
moveLogically
(
lineObj
,
pos
,
dir
)
}
if
(
next
==
null
)
{
if
(
!
boundToLine
&&
findNextLine
())
pos
=
endOfLine
(
visually
,
doc
.
cm
,
lineObj
,
pos
.
line
,
dir
)
else
return
false
}
else
{
pos
=
next
}
return
true
}
if
(
unit
==
"
char
"
)
{
moveOnce
()
}
else
if
(
unit
==
"
column
"
)
{
moveOnce
(
true
)
}
else
if
(
unit
==
"
word
"
||
unit
==
"
group
"
)
{
let
sawType
=
null
,
group
=
unit
==
"
group
"
let
helper
=
doc
.
cm
&&
doc
.
cm
.
getHelper
(
pos
,
"
wordChars
"
)
for
(
let
first
=
true
;;
first
=
false
)
{
if
(
dir
<
0
&&
!
moveOnce
(
!
first
))
break
let
cur
=
lineObj
.
text
.
charAt
(
pos
.
ch
)
||
"
\n
"
let
type
=
isWordChar
(
cur
,
helper
)
?
"
w
"
:
group
&&
cur
==
"
\n
"
?
"
n
"
:
!
group
||
/
\s
/
.
test
(
cur
)
?
null
:
"
p
"
if
(
group
&&
!
first
&&
!
type
)
type
=
"
s
"
if
(
sawType
&&
sawType
!=
type
)
{
if
(
dir
<
0
)
{
dir
=
1
;
moveOnce
();
pos
.
sticky
=
"
after
"
}
break
}
if
(
type
)
sawType
=
type
if
(
dir
>
0
&&
!
moveOnce
(
!
first
))
break
}
}
let
result
=
skipAtomic
(
doc
,
pos
,
oldPos
,
origDir
,
true
)
if
(
equalCursorPos
(
oldPos
,
result
))
result
.
hitSide
=
true
return
result
}
// For relative vertical movement. Dir may be -1 or 1. Unit can be
// "page" or "line". The resulting position will have a hitSide=true
// property if it reached the end of the document.
function
findPosV
(
cm
,
pos
,
dir
,
unit
)
{
let
doc
=
cm
.
doc
,
x
=
pos
.
left
,
y
if
(
unit
==
"
page
"
)
{
let
pageSize
=
Math
.
min
(
cm
.
display
.
wrapper
.
clientHeight
,
window
.
innerHeight
||
document
.
documentElement
.
clientHeight
)
let
moveAmount
=
Math
.
max
(
pageSize
-
.
5
*
textHeight
(
cm
.
display
),
3
)
y
=
(
dir
>
0
?
pos
.
bottom
:
pos
.
top
)
+
dir
*
moveAmount
}
else
if
(
unit
==
"
line
"
)
{
y
=
dir
>
0
?
pos
.
bottom
+
3
:
pos
.
top
-
3
}
let
target
for
(;;)
{
target
=
coordsChar
(
cm
,
x
,
y
)
if
(
!
target
.
outside
)
break
if
(
dir
<
0
?
y
<=
0
:
y
>=
doc
.
height
)
{
target
.
hitSide
=
true
;
break
}
y
+=
dir
*
5
}
return
target
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/methods.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
methods.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/mouse_events.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
delayBlurEvent
,
ensureFocus
}
from
"
../display/focus
"
import
{
operation
}
from
"
../display/operations
"
import
{
visibleLines
}
from
"
../display/update_lines
"
import
{
clipPos
,
cmp
,
maxPos
,
minPos
,
Pos
}
from
"
../line/pos
"
import
{
getLine
,
lineAtHeight
}
from
"
../line/utils_line
"
import
{
posFromMouse
}
from
"
../measurement/position_measurement
"
import
{
eventInWidget
}
from
"
../measurement/widgets
"
import
{
normalizeSelection
,
Range
,
Selection
}
from
"
../model/selection
"
import
{
extendRange
,
extendSelection
,
replaceOneSelection
,
setSelection
}
from
"
../model/selection_updates
"
import
{
captureRightClick
,
chromeOS
,
ie
,
ie_version
,
mac
,
webkit
}
from
"
../util/browser
"
import
{
activeElt
}
from
"
../util/dom
"
import
{
e_button
,
e_defaultPrevented
,
e_preventDefault
,
e_target
,
hasHandler
,
off
,
on
,
signal
,
signalDOMEvent
}
from
"
../util/event
"
import
{
dragAndDrop
}
from
"
../util/feature_detection
"
import
{
bind
,
countColumn
,
findColumn
,
sel_mouse
}
from
"
../util/misc
"
// A mouse down can be a single click, double click, triple click,
// start of selection drag, start of text drag, new cursor
// (ctrl-click), rectangle drag (alt-drag), or xwin
// middle-click-paste. Or it might be a click on something we should
// not interfere with, such as a scrollbar or widget.
export
function
onMouseDown
(
e
)
{
let
cm
=
this
,
display
=
cm
.
display
if
(
signalDOMEvent
(
cm
,
e
)
||
display
.
activeTouch
&&
display
.
input
.
supportsTouch
())
return
display
.
input
.
ensurePolled
()
display
.
shift
=
e
.
shiftKey
if
(
eventInWidget
(
display
,
e
))
{
if
(
!
webkit
)
{
// Briefly turn off draggability, to allow widgets to do
// normal dragging things.
display
.
scroller
.
draggable
=
false
setTimeout
(()
=>
display
.
scroller
.
draggable
=
true
,
100
)
}
return
}
if
(
clickInGutter
(
cm
,
e
))
return
let
start
=
posFromMouse
(
cm
,
e
)
window
.
focus
()
switch
(
e_button
(
e
))
{
case
1
:
// #3261: make sure, that we're not starting a second selection
if
(
cm
.
state
.
selectingText
)
cm
.
state
.
selectingText
(
e
)
else
if
(
start
)
leftButtonDown
(
cm
,
e
,
start
)
else
if
(
e_target
(
e
)
==
display
.
scroller
)
e_preventDefault
(
e
)
break
case
2
:
if
(
webkit
)
cm
.
state
.
lastMiddleDown
=
+
new
Date
if
(
start
)
extendSelection
(
cm
.
doc
,
start
)
setTimeout
(()
=>
display
.
input
.
focus
(),
20
)
e_preventDefault
(
e
)
break
case
3
:
if
(
captureRightClick
)
onContextMenu
(
cm
,
e
)
else
delayBlurEvent
(
cm
)
break
}
}
let
lastClick
,
lastDoubleClick
function
leftButtonDown
(
cm
,
e
,
start
)
{
if
(
ie
)
setTimeout
(
bind
(
ensureFocus
,
cm
),
0
)
else
cm
.
curOp
.
focus
=
activeElt
()
let
now
=
+
new
Date
,
type
if
(
lastDoubleClick
&&
lastDoubleClick
.
time
>
now
-
400
&&
cmp
(
lastDoubleClick
.
pos
,
start
)
==
0
)
{
type
=
"
triple
"
}
else
if
(
lastClick
&&
lastClick
.
time
>
now
-
400
&&
cmp
(
lastClick
.
pos
,
start
)
==
0
)
{
type
=
"
double
"
lastDoubleClick
=
{
time
:
now
,
pos
:
start
}
}
else
{
type
=
"
single
"
lastClick
=
{
time
:
now
,
pos
:
start
}
}
let
sel
=
cm
.
doc
.
sel
,
modifier
=
mac
?
e
.
metaKey
:
e
.
ctrlKey
,
contained
if
(
cm
.
options
.
dragDrop
&&
dragAndDrop
&&
!
cm
.
isReadOnly
()
&&
type
==
"
single
"
&&
(
contained
=
sel
.
contains
(
start
))
>
-
1
&&
(
cmp
((
contained
=
sel
.
ranges
[
contained
]).
from
(),
start
)
<
0
||
start
.
xRel
>
0
)
&&
(
cmp
(
contained
.
to
(),
start
)
>
0
||
start
.
xRel
<
0
))
leftButtonStartDrag
(
cm
,
e
,
start
,
modifier
)
else
leftButtonSelect
(
cm
,
e
,
start
,
type
,
modifier
)
}
// Start a text drag. When it ends, see if any dragging actually
// happen, and treat as a click if it didn't.
function
leftButtonStartDrag
(
cm
,
e
,
start
,
modifier
)
{
let
display
=
cm
.
display
,
startTime
=
+
new
Date
let
dragEnd
=
operation
(
cm
,
e2
=>
{
if
(
webkit
)
display
.
scroller
.
draggable
=
false
cm
.
state
.
draggingText
=
false
off
(
document
,
"
mouseup
"
,
dragEnd
)
off
(
display
.
scroller
,
"
drop
"
,
dragEnd
)
if
(
Math
.
abs
(
e
.
clientX
-
e2
.
clientX
)
+
Math
.
abs
(
e
.
clientY
-
e2
.
clientY
)
<
10
)
{
e_preventDefault
(
e2
)
if
(
!
modifier
&&
+
new
Date
-
200
<
startTime
)
extendSelection
(
cm
.
doc
,
start
)
// Work around unexplainable focus problem in IE9 (#2127) and Chrome (#3081)
if
(
webkit
||
ie
&&
ie_version
==
9
)
setTimeout
(()
=>
{
document
.
body
.
focus
();
display
.
input
.
focus
()},
20
)
else
display
.
input
.
focus
()
}
})
// Let the drag handler handle this.
if
(
webkit
)
display
.
scroller
.
draggable
=
true
cm
.
state
.
draggingText
=
dragEnd
dragEnd
.
copy
=
mac
?
e
.
altKey
:
e
.
ctrlKey
// IE's approach to draggable
if
(
display
.
scroller
.
dragDrop
)
display
.
scroller
.
dragDrop
()
on
(
document
,
"
mouseup
"
,
dragEnd
)
on
(
display
.
scroller
,
"
drop
"
,
dragEnd
)
}
// Normal selection, as opposed to text dragging.
function
leftButtonSelect
(
cm
,
e
,
start
,
type
,
addNew
)
{
let
display
=
cm
.
display
,
doc
=
cm
.
doc
e_preventDefault
(
e
)
let
ourRange
,
ourIndex
,
startSel
=
doc
.
sel
,
ranges
=
startSel
.
ranges
if
(
addNew
&&
!
e
.
shiftKey
)
{
ourIndex
=
doc
.
sel
.
contains
(
start
)
if
(
ourIndex
>
-
1
)
ourRange
=
ranges
[
ourIndex
]
else
ourRange
=
new
Range
(
start
,
start
)
}
else
{
ourRange
=
doc
.
sel
.
primary
()
ourIndex
=
doc
.
sel
.
primIndex
}
if
(
chromeOS
?
e
.
shiftKey
&&
e
.
metaKey
:
e
.
altKey
)
{
type
=
"
rect
"
if
(
!
addNew
)
ourRange
=
new
Range
(
start
,
start
)
start
=
posFromMouse
(
cm
,
e
,
true
,
true
)
ourIndex
=
-
1
}
else
if
(
type
==
"
double
"
)
{
let
word
=
cm
.
findWordAt
(
start
)
if
(
cm
.
display
.
shift
||
doc
.
extend
)
ourRange
=
extendRange
(
doc
,
ourRange
,
word
.
anchor
,
word
.
head
)
else
ourRange
=
word
}
else
if
(
type
==
"
triple
"
)
{
let
line
=
new
Range
(
Pos
(
start
.
line
,
0
),
clipPos
(
doc
,
Pos
(
start
.
line
+
1
,
0
)))
if
(
cm
.
display
.
shift
||
doc
.
extend
)
ourRange
=
extendRange
(
doc
,
ourRange
,
line
.
anchor
,
line
.
head
)
else
ourRange
=
line
}
else
{
ourRange
=
extendRange
(
doc
,
ourRange
,
start
)
}
if
(
!
addNew
)
{
ourIndex
=
0
setSelection
(
doc
,
new
Selection
([
ourRange
],
0
),
sel_mouse
)
startSel
=
doc
.
sel
}
else
if
(
ourIndex
==
-
1
)
{
ourIndex
=
ranges
.
length
setSelection
(
doc
,
normalizeSelection
(
ranges
.
concat
([
ourRange
]),
ourIndex
),
{
scroll
:
false
,
origin
:
"
*mouse
"
})
}
else
if
(
ranges
.
length
>
1
&&
ranges
[
ourIndex
].
empty
()
&&
type
==
"
single
"
&&
!
e
.
shiftKey
)
{
setSelection
(
doc
,
normalizeSelection
(
ranges
.
slice
(
0
,
ourIndex
).
concat
(
ranges
.
slice
(
ourIndex
+
1
)),
0
),
{
scroll
:
false
,
origin
:
"
*mouse
"
})
startSel
=
doc
.
sel
}
else
{
replaceOneSelection
(
doc
,
ourIndex
,
ourRange
,
sel_mouse
)
}
let
lastPos
=
start
function
extendTo
(
pos
)
{
if
(
cmp
(
lastPos
,
pos
)
==
0
)
return
lastPos
=
pos
if
(
type
==
"
rect
"
)
{
let
ranges
=
[],
tabSize
=
cm
.
options
.
tabSize
let
startCol
=
countColumn
(
getLine
(
doc
,
start
.
line
).
text
,
start
.
ch
,
tabSize
)
let
posCol
=
countColumn
(
getLine
(
doc
,
pos
.
line
).
text
,
pos
.
ch
,
tabSize
)
let
left
=
Math
.
min
(
startCol
,
posCol
),
right
=
Math
.
max
(
startCol
,
posCol
)
for
(
let
line
=
Math
.
min
(
start
.
line
,
pos
.
line
),
end
=
Math
.
min
(
cm
.
lastLine
(),
Math
.
max
(
start
.
line
,
pos
.
line
));
line
<=
end
;
line
++
)
{
let
text
=
getLine
(
doc
,
line
).
text
,
leftPos
=
findColumn
(
text
,
left
,
tabSize
)
if
(
left
==
right
)
ranges
.
push
(
new
Range
(
Pos
(
line
,
leftPos
),
Pos
(
line
,
leftPos
)))
else
if
(
text
.
length
>
leftPos
)
ranges
.
push
(
new
Range
(
Pos
(
line
,
leftPos
),
Pos
(
line
,
findColumn
(
text
,
right
,
tabSize
))))
}
if
(
!
ranges
.
length
)
ranges
.
push
(
new
Range
(
start
,
start
))
setSelection
(
doc
,
normalizeSelection
(
startSel
.
ranges
.
slice
(
0
,
ourIndex
).
concat
(
ranges
),
ourIndex
),
{
origin
:
"
*mouse
"
,
scroll
:
false
})
cm
.
scrollIntoView
(
pos
)
}
else
{
let
oldRange
=
ourRange
let
anchor
=
oldRange
.
anchor
,
head
=
pos
if
(
type
!=
"
single
"
)
{
let
range
if
(
type
==
"
double
"
)
range
=
cm
.
findWordAt
(
pos
)
else
range
=
new
Range
(
Pos
(
pos
.
line
,
0
),
clipPos
(
doc
,
Pos
(
pos
.
line
+
1
,
0
)))
if
(
cmp
(
range
.
anchor
,
anchor
)
>
0
)
{
head
=
range
.
head
anchor
=
minPos
(
oldRange
.
from
(),
range
.
anchor
)
}
else
{
head
=
range
.
anchor
anchor
=
maxPos
(
oldRange
.
to
(),
range
.
head
)
}
}
let
ranges
=
startSel
.
ranges
.
slice
(
0
)
ranges
[
ourIndex
]
=
new
Range
(
clipPos
(
doc
,
anchor
),
head
)
setSelection
(
doc
,
normalizeSelection
(
ranges
,
ourIndex
),
sel_mouse
)
}
}
let
editorSize
=
display
.
wrapper
.
getBoundingClientRect
()
// Used to ensure timeout re-tries don't fire when another extend
// happened in the meantime (clearTimeout isn't reliable -- at
// least on Chrome, the timeouts still happen even when cleared,
// if the clear happens after their scheduled firing time).
let
counter
=
0
function
extend
(
e
)
{
let
curCount
=
++
counter
let
cur
=
posFromMouse
(
cm
,
e
,
true
,
type
==
"
rect
"
)
if
(
!
cur
)
return
if
(
cmp
(
cur
,
lastPos
)
!=
0
)
{
cm
.
curOp
.
focus
=
activeElt
()
extendTo
(
cur
)
let
visible
=
visibleLines
(
display
,
doc
)
if
(
cur
.
line
>=
visible
.
to
||
cur
.
line
<
visible
.
from
)
setTimeout
(
operation
(
cm
,
()
=>
{
if
(
counter
==
curCount
)
extend
(
e
)}),
150
)
}
else
{
let
outside
=
e
.
clientY
<
editorSize
.
top
?
-
20
:
e
.
clientY
>
editorSize
.
bottom
?
20
:
0
if
(
outside
)
setTimeout
(
operation
(
cm
,
()
=>
{
if
(
counter
!=
curCount
)
return
display
.
scroller
.
scrollTop
+=
outside
extend
(
e
)
}),
50
)
}
}
function
done
(
e
)
{
cm
.
state
.
selectingText
=
false
counter
=
Infinity
e_preventDefault
(
e
)
display
.
input
.
focus
()
off
(
document
,
"
mousemove
"
,
move
)
off
(
document
,
"
mouseup
"
,
up
)
doc
.
history
.
lastSelOrigin
=
null
}
let
move
=
operation
(
cm
,
e
=>
{
if
(
!
e_button
(
e
))
done
(
e
)
else
extend
(
e
)
})
let
up
=
operation
(
cm
,
done
)
cm
.
state
.
selectingText
=
up
on
(
document
,
"
mousemove
"
,
move
)
on
(
document
,
"
mouseup
"
,
up
)
}
// Determines whether an event happened in the gutter, and fires the
// handlers for the corresponding event.
function
gutterEvent
(
cm
,
e
,
type
,
prevent
)
{
let
mX
,
mY
try
{
mX
=
e
.
clientX
;
mY
=
e
.
clientY
}
catch
(
e
)
{
return
false
}
if
(
mX
>=
Math
.
floor
(
cm
.
display
.
gutters
.
getBoundingClientRect
().
right
))
return
false
if
(
prevent
)
e_preventDefault
(
e
)
let
display
=
cm
.
display
let
lineBox
=
display
.
lineDiv
.
getBoundingClientRect
()
if
(
mY
>
lineBox
.
bottom
||
!
hasHandler
(
cm
,
type
))
return
e_defaultPrevented
(
e
)
mY
-=
lineBox
.
top
-
display
.
viewOffset
for
(
let
i
=
0
;
i
<
cm
.
options
.
gutters
.
length
;
++
i
)
{
let
g
=
display
.
gutters
.
childNodes
[
i
]
if
(
g
&&
g
.
getBoundingClientRect
().
right
>=
mX
)
{
let
line
=
lineAtHeight
(
cm
.
doc
,
mY
)
let
gutter
=
cm
.
options
.
gutters
[
i
]
signal
(
cm
,
type
,
cm
,
line
,
gutter
,
e
)
return
e_defaultPrevented
(
e
)
}
}
}
export
function
clickInGutter
(
cm
,
e
)
{
return
gutterEvent
(
cm
,
e
,
"
gutterClick
"
,
true
)
}
// CONTEXT MENU HANDLING
// To make the context menu work, we need to briefly unhide the
// textarea (making it as unobtrusive as possible) to let the
// right-click take effect on it.
export
function
onContextMenu
(
cm
,
e
)
{
if
(
eventInWidget
(
cm
.
display
,
e
)
||
contextMenuInGutter
(
cm
,
e
))
return
if
(
signalDOMEvent
(
cm
,
e
,
"
contextmenu
"
))
return
cm
.
display
.
input
.
onContextMenu
(
e
)
}
function
contextMenuInGutter
(
cm
,
e
)
{
if
(
!
hasHandler
(
cm
,
"
gutterContextMenu
"
))
return
false
return
gutterEvent
(
cm
,
e
,
"
gutterContextMenu
"
,
false
)
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/mouse_events.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
mouse_events.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/options.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
onBlur
}
from
"
../display/focus
"
import
{
setGuttersForLineNumbers
,
updateGutters
}
from
"
../display/gutters
"
import
{
alignHorizontally
}
from
"
../display/line_numbers
"
import
{
loadMode
,
resetModeState
}
from
"
../display/mode_state
"
import
{
initScrollbars
,
updateScrollbars
}
from
"
../display/scrollbars
"
import
{
updateSelection
}
from
"
../display/selection
"
import
{
regChange
}
from
"
../display/view_tracking
"
import
{
getKeyMap
}
from
"
../input/keymap
"
import
{
defaultSpecialCharPlaceholder
}
from
"
../line/line_data
"
import
{
Pos
}
from
"
../line/pos
"
import
{
findMaxLine
}
from
"
../line/spans
"
import
{
clearCaches
,
compensateForHScroll
,
estimateLineHeights
}
from
"
../measurement/position_measurement
"
import
{
replaceRange
}
from
"
../model/changes
"
import
{
mobile
,
windows
}
from
"
../util/browser
"
import
{
addClass
,
rmClass
}
from
"
../util/dom
"
import
{
off
,
on
}
from
"
../util/event
"
import
{
themeChanged
}
from
"
./utils
"
export
let
Init
=
{
toString
:
function
(){
return
"
CodeMirror.Init
"
}}
export
let
defaults
=
{}
export
let
optionHandlers
=
{}
export
function
defineOptions
(
CodeMirror
)
{
let
optionHandlers
=
CodeMirror
.
optionHandlers
function
option
(
name
,
deflt
,
handle
,
notOnInit
)
{
CodeMirror
.
defaults
[
name
]
=
deflt
if
(
handle
)
optionHandlers
[
name
]
=
notOnInit
?
(
cm
,
val
,
old
)
=>
{
if
(
old
!=
Init
)
handle
(
cm
,
val
,
old
)}
:
handle
}
CodeMirror
.
defineOption
=
option
// Passed to option handlers when there is no old value.
CodeMirror
.
Init
=
Init
// These two are, on init, called from the constructor because they
// have to be initialized before the editor can start at all.
option
(
"
value
"
,
""
,
(
cm
,
val
)
=>
cm
.
setValue
(
val
),
true
)
option
(
"
mode
"
,
null
,
(
cm
,
val
)
=>
{
cm
.
doc
.
modeOption
=
val
loadMode
(
cm
)
},
true
)
option
(
"
indentUnit
"
,
2
,
loadMode
,
true
)
option
(
"
indentWithTabs
"
,
false
)
option
(
"
smartIndent
"
,
true
)
option
(
"
tabSize
"
,
4
,
cm
=>
{
resetModeState
(
cm
)
clearCaches
(
cm
)
regChange
(
cm
)
},
true
)
option
(
"
lineSeparator
"
,
null
,
(
cm
,
val
)
=>
{
cm
.
doc
.
lineSep
=
val
if
(
!
val
)
return
let
newBreaks
=
[],
lineNo
=
cm
.
doc
.
first
cm
.
doc
.
iter
(
line
=>
{
for
(
let
pos
=
0
;;)
{
let
found
=
line
.
text
.
indexOf
(
val
,
pos
)
if
(
found
==
-
1
)
break
pos
=
found
+
val
.
length
newBreaks
.
push
(
Pos
(
lineNo
,
found
))
}
lineNo
++
})
for
(
let
i
=
newBreaks
.
length
-
1
;
i
>=
0
;
i
--
)
replaceRange
(
cm
.
doc
,
val
,
newBreaks
[
i
],
Pos
(
newBreaks
[
i
].
line
,
newBreaks
[
i
].
ch
+
val
.
length
))
})
option
(
"
specialChars
"
,
/
[\u
0000-
\u
001f
\u
007f
\u
00ad
\u
061c
\u
200b-
\u
200f
\u
2028
\u
2029
\u
feff
]
/g
,
(
cm
,
val
,
old
)
=>
{
cm
.
state
.
specialChars
=
new
RegExp
(
val
.
source
+
(
val
.
test
(
"
\t
"
)
?
""
:
"
|
\t
"
),
"
g
"
)
if
(
old
!=
Init
)
cm
.
refresh
()
})
option
(
"
specialCharPlaceholder
"
,
defaultSpecialCharPlaceholder
,
cm
=>
cm
.
refresh
(),
true
)
option
(
"
electricChars
"
,
true
)
option
(
"
inputStyle
"
,
mobile
?
"
contenteditable
"
:
"
textarea
"
,
()
=>
{
throw
new
Error
(
"
inputStyle can not (yet) be changed in a running editor
"
)
// FIXME
},
true
)
option
(
"
spellcheck
"
,
false
,
(
cm
,
val
)
=>
cm
.
getInputField
().
spellcheck
=
val
,
true
)
option
(
"
rtlMoveVisually
"
,
!
windows
)
option
(
"
wholeLineUpdateBefore
"
,
true
)
option
(
"
theme
"
,
"
default
"
,
cm
=>
{
themeChanged
(
cm
)
guttersChanged
(
cm
)
},
true
)
option
(
"
keyMap
"
,
"
default
"
,
(
cm
,
val
,
old
)
=>
{
let
next
=
getKeyMap
(
val
)
let
prev
=
old
!=
Init
&&
getKeyMap
(
old
)
if
(
prev
&&
prev
.
detach
)
prev
.
detach
(
cm
,
next
)
if
(
next
.
attach
)
next
.
attach
(
cm
,
prev
||
null
)
})
option
(
"
extraKeys
"
,
null
)
option
(
"
lineWrapping
"
,
false
,
wrappingChanged
,
true
)
option
(
"
gutters
"
,
[],
cm
=>
{
setGuttersForLineNumbers
(
cm
.
options
)
guttersChanged
(
cm
)
},
true
)
option
(
"
fixedGutter
"
,
true
,
(
cm
,
val
)
=>
{
cm
.
display
.
gutters
.
style
.
left
=
val
?
compensateForHScroll
(
cm
.
display
)
+
"
px
"
:
"
0
"
cm
.
refresh
()
},
true
)
option
(
"
coverGutterNextToScrollbar
"
,
false
,
cm
=>
updateScrollbars
(
cm
),
true
)
option
(
"
scrollbarStyle
"
,
"
native
"
,
cm
=>
{
initScrollbars
(
cm
)
updateScrollbars
(
cm
)
cm
.
display
.
scrollbars
.
setScrollTop
(
cm
.
doc
.
scrollTop
)
cm
.
display
.
scrollbars
.
setScrollLeft
(
cm
.
doc
.
scrollLeft
)
},
true
)
option
(
"
lineNumbers
"
,
false
,
cm
=>
{
setGuttersForLineNumbers
(
cm
.
options
)
guttersChanged
(
cm
)
},
true
)
option
(
"
firstLineNumber
"
,
1
,
guttersChanged
,
true
)
option
(
"
lineNumberFormatter
"
,
integer
=>
integer
,
guttersChanged
,
true
)
option
(
"
showCursorWhenSelecting
"
,
false
,
updateSelection
,
true
)
option
(
"
resetSelectionOnContextMenu
"
,
true
)
option
(
"
lineWiseCopyCut
"
,
true
)
option
(
"
readOnly
"
,
false
,
(
cm
,
val
)
=>
{
if
(
val
==
"
nocursor
"
)
{
onBlur
(
cm
)
cm
.
display
.
input
.
blur
()
cm
.
display
.
disabled
=
true
}
else
{
cm
.
display
.
disabled
=
false
}
cm
.
display
.
input
.
readOnlyChanged
(
val
)
})
option
(
"
disableInput
"
,
false
,
(
cm
,
val
)
=>
{
if
(
!
val
)
cm
.
display
.
input
.
reset
()},
true
)
option
(
"
dragDrop
"
,
true
,
dragDropChanged
)
option
(
"
allowDropFileTypes
"
,
null
)
option
(
"
cursorBlinkRate
"
,
530
)
option
(
"
cursorScrollMargin
"
,
0
)
option
(
"
cursorHeight
"
,
1
,
updateSelection
,
true
)
option
(
"
singleCursorHeightPerLine
"
,
true
,
updateSelection
,
true
)
option
(
"
workTime
"
,
100
)
option
(
"
workDelay
"
,
100
)
option
(
"
flattenSpans
"
,
true
,
resetModeState
,
true
)
option
(
"
addModeClass
"
,
false
,
resetModeState
,
true
)
option
(
"
pollInterval
"
,
100
)
option
(
"
undoDepth
"
,
200
,
(
cm
,
val
)
=>
cm
.
doc
.
history
.
undoDepth
=
val
)
option
(
"
historyEventDelay
"
,
1250
)
option
(
"
viewportMargin
"
,
10
,
cm
=>
cm
.
refresh
(),
true
)
option
(
"
maxHighlightLength
"
,
10000
,
resetModeState
,
true
)
option
(
"
moveInputWithCursor
"
,
true
,
(
cm
,
val
)
=>
{
if
(
!
val
)
cm
.
display
.
input
.
resetPosition
()
})
option
(
"
tabindex
"
,
null
,
(
cm
,
val
)
=>
cm
.
display
.
input
.
getField
().
tabIndex
=
val
||
""
)
option
(
"
autofocus
"
,
null
)
}
function
guttersChanged
(
cm
)
{
updateGutters
(
cm
)
regChange
(
cm
)
alignHorizontally
(
cm
)
}
function
dragDropChanged
(
cm
,
value
,
old
)
{
let
wasOn
=
old
&&
old
!=
Init
if
(
!
value
!=
!
wasOn
)
{
let
funcs
=
cm
.
display
.
dragFunctions
let
toggle
=
value
?
on
:
off
toggle
(
cm
.
display
.
scroller
,
"
dragstart
"
,
funcs
.
start
)
toggle
(
cm
.
display
.
scroller
,
"
dragenter
"
,
funcs
.
enter
)
toggle
(
cm
.
display
.
scroller
,
"
dragover
"
,
funcs
.
over
)
toggle
(
cm
.
display
.
scroller
,
"
dragleave
"
,
funcs
.
leave
)
toggle
(
cm
.
display
.
scroller
,
"
drop
"
,
funcs
.
drop
)
}
}
function
wrappingChanged
(
cm
)
{
if
(
cm
.
options
.
lineWrapping
)
{
addClass
(
cm
.
display
.
wrapper
,
"
CodeMirror-wrap
"
)
cm
.
display
.
sizer
.
style
.
minWidth
=
""
cm
.
display
.
sizerWidth
=
null
}
else
{
rmClass
(
cm
.
display
.
wrapper
,
"
CodeMirror-wrap
"
)
findMaxLine
(
cm
)
}
estimateLineHeights
(
cm
)
regChange
(
cm
)
clearCaches
(
cm
)
setTimeout
(()
=>
updateScrollbars
(
cm
),
100
)
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/options.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
options.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/utils.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
clearCaches
}
from
"
../measurement/position_measurement
"
export
function
themeChanged
(
cm
)
{
cm
.
display
.
wrapper
.
className
=
cm
.
display
.
wrapper
.
className
.
replace
(
/
\s
*cm-s-
\S
+/g
,
""
)
+
cm
.
options
.
theme
.
replace
(
/
(
^|
\s)\s
*/g
,
"
cm-s-
"
)
clearCaches
(
cm
)
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/edit/utils.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
utils.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/input.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"Folder"
module=
"OFS.Folder"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_objects
</string>
</key>
<value>
<tuple/>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
input
</string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/input/ContentEditableInput.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
operation
,
runInOp
}
from
"
../display/operations
"
import
{
prepareSelection
}
from
"
../display/selection
"
import
{
regChange
}
from
"
../display/view_tracking
"
import
{
applyTextInput
,
copyableRanges
,
disableBrowserMagic
,
handlePaste
,
hiddenTextarea
,
lastCopied
,
setLastCopied
}
from
"
./input
"
import
{
cmp
,
maxPos
,
minPos
,
Pos
}
from
"
../line/pos
"
import
{
getBetween
,
getLine
,
lineNo
}
from
"
../line/utils_line
"
import
{
findViewForLine
,
findViewIndex
,
mapFromLineView
,
nodeAndOffsetInLineMap
}
from
"
../measurement/position_measurement
"
import
{
replaceRange
}
from
"
../model/changes
"
import
{
simpleSelection
}
from
"
../model/selection
"
import
{
setSelection
}
from
"
../model/selection_updates
"
import
{
getBidiPartAt
,
getOrder
}
from
"
../util/bidi
"
import
{
gecko
,
ie_version
}
from
"
../util/browser
"
import
{
contains
,
range
,
removeChildrenAndAdd
,
selectInput
}
from
"
../util/dom
"
import
{
on
,
signalDOMEvent
}
from
"
../util/event
"
import
{
Delayed
,
lst
,
sel_dontScroll
}
from
"
../util/misc
"
// CONTENTEDITABLE INPUT STYLE
export
default
class
ContentEditableInput
{
constructor
(
cm
)
{
this
.
cm
=
cm
this
.
lastAnchorNode
=
this
.
lastAnchorOffset
=
this
.
lastFocusNode
=
this
.
lastFocusOffset
=
null
this
.
polling
=
new
Delayed
()
this
.
composing
=
null
this
.
gracePeriod
=
false
this
.
readDOMTimeout
=
null
}
init
(
display
)
{
let
input
=
this
,
cm
=
input
.
cm
let
div
=
input
.
div
=
display
.
lineDiv
disableBrowserMagic
(
div
,
cm
.
options
.
spellcheck
)
on
(
div
,
"
paste
"
,
e
=>
{
if
(
signalDOMEvent
(
cm
,
e
)
||
handlePaste
(
e
,
cm
))
return
// IE doesn't fire input events, so we schedule a read for the pasted content in this way
if
(
ie_version
<=
11
)
setTimeout
(
operation
(
cm
,
()
=>
{
if
(
!
input
.
pollContent
())
regChange
(
cm
)
}),
20
)
})
on
(
div
,
"
compositionstart
"
,
e
=>
{
this
.
composing
=
{
data
:
e
.
data
,
done
:
false
}
})
on
(
div
,
"
compositionupdate
"
,
e
=>
{
if
(
!
this
.
composing
)
this
.
composing
=
{
data
:
e
.
data
,
done
:
false
}
})
on
(
div
,
"
compositionend
"
,
e
=>
{
if
(
this
.
composing
)
{
if
(
e
.
data
!=
this
.
composing
.
data
)
this
.
readFromDOMSoon
()
this
.
composing
.
done
=
true
}
})
on
(
div
,
"
touchstart
"
,
()
=>
input
.
forceCompositionEnd
())
on
(
div
,
"
input
"
,
()
=>
{
if
(
!
this
.
composing
)
this
.
readFromDOMSoon
()
})
function
onCopyCut
(
e
)
{
if
(
signalDOMEvent
(
cm
,
e
))
return
if
(
cm
.
somethingSelected
())
{
setLastCopied
({
lineWise
:
false
,
text
:
cm
.
getSelections
()})
if
(
e
.
type
==
"
cut
"
)
cm
.
replaceSelection
(
""
,
null
,
"
cut
"
)
}
else
if
(
!
cm
.
options
.
lineWiseCopyCut
)
{
return
}
else
{
let
ranges
=
copyableRanges
(
cm
)
setLastCopied
({
lineWise
:
true
,
text
:
ranges
.
text
})
if
(
e
.
type
==
"
cut
"
)
{
cm
.
operation
(()
=>
{
cm
.
setSelections
(
ranges
.
ranges
,
0
,
sel_dontScroll
)
cm
.
replaceSelection
(
""
,
null
,
"
cut
"
)
})
}
}
if
(
e
.
clipboardData
)
{
e
.
clipboardData
.
clearData
()
let
content
=
lastCopied
.
text
.
join
(
"
\n
"
)
// iOS exposes the clipboard API, but seems to discard content inserted into it
e
.
clipboardData
.
setData
(
"
Text
"
,
content
)
if
(
e
.
clipboardData
.
getData
(
"
Text
"
)
==
content
)
{
e
.
preventDefault
()
return
}
}
// Old-fashioned briefly-focus-a-textarea hack
let
kludge
=
hiddenTextarea
(),
te
=
kludge
.
firstChild
cm
.
display
.
lineSpace
.
insertBefore
(
kludge
,
cm
.
display
.
lineSpace
.
firstChild
)
te
.
value
=
lastCopied
.
text
.
join
(
"
\n
"
)
let
hadFocus
=
document
.
activeElement
selectInput
(
te
)
setTimeout
(()
=>
{
cm
.
display
.
lineSpace
.
removeChild
(
kludge
)
hadFocus
.
focus
()
if
(
hadFocus
==
div
)
input
.
showPrimarySelection
()
},
50
)
}
on
(
div
,
"
copy
"
,
onCopyCut
)
on
(
div
,
"
cut
"
,
onCopyCut
)
}
prepareSelection
()
{
let
result
=
prepareSelection
(
this
.
cm
,
false
)
result
.
focus
=
this
.
cm
.
state
.
focused
return
result
}
showSelection
(
info
,
takeFocus
)
{
if
(
!
info
||
!
this
.
cm
.
display
.
view
.
length
)
return
if
(
info
.
focus
||
takeFocus
)
this
.
showPrimarySelection
()
this
.
showMultipleSelections
(
info
)
}
showPrimarySelection
()
{
let
sel
=
window
.
getSelection
(),
prim
=
this
.
cm
.
doc
.
sel
.
primary
()
let
curAnchor
=
domToPos
(
this
.
cm
,
sel
.
anchorNode
,
sel
.
anchorOffset
)
let
curFocus
=
domToPos
(
this
.
cm
,
sel
.
focusNode
,
sel
.
focusOffset
)
if
(
curAnchor
&&
!
curAnchor
.
bad
&&
curFocus
&&
!
curFocus
.
bad
&&
cmp
(
minPos
(
curAnchor
,
curFocus
),
prim
.
from
())
==
0
&&
cmp
(
maxPos
(
curAnchor
,
curFocus
),
prim
.
to
())
==
0
)
return
let
start
=
posToDOM
(
this
.
cm
,
prim
.
from
())
let
end
=
posToDOM
(
this
.
cm
,
prim
.
to
())
if
(
!
start
&&
!
end
)
return
let
view
=
this
.
cm
.
display
.
view
let
old
=
sel
.
rangeCount
&&
sel
.
getRangeAt
(
0
)
if
(
!
start
)
{
start
=
{
node
:
view
[
0
].
measure
.
map
[
2
],
offset
:
0
}
}
else
if
(
!
end
)
{
// FIXME dangerously hacky
let
measure
=
view
[
view
.
length
-
1
].
measure
let
map
=
measure
.
maps
?
measure
.
maps
[
measure
.
maps
.
length
-
1
]
:
measure
.
map
end
=
{
node
:
map
[
map
.
length
-
1
],
offset
:
map
[
map
.
length
-
2
]
-
map
[
map
.
length
-
3
]}
}
let
rng
try
{
rng
=
range
(
start
.
node
,
start
.
offset
,
end
.
offset
,
end
.
node
)
}
catch
(
e
)
{}
// Our model of the DOM might be outdated, in which case the range we try to set can be impossible
if
(
rng
)
{
if
(
!
gecko
&&
this
.
cm
.
state
.
focused
)
{
sel
.
collapse
(
start
.
node
,
start
.
offset
)
if
(
!
rng
.
collapsed
)
{
sel
.
removeAllRanges
()
sel
.
addRange
(
rng
)
}
}
else
{
sel
.
removeAllRanges
()
sel
.
addRange
(
rng
)
}
if
(
old
&&
sel
.
anchorNode
==
null
)
sel
.
addRange
(
old
)
else
if
(
gecko
)
this
.
startGracePeriod
()
}
this
.
rememberSelection
()
}
startGracePeriod
()
{
clearTimeout
(
this
.
gracePeriod
)
this
.
gracePeriod
=
setTimeout
(()
=>
{
this
.
gracePeriod
=
false
if
(
this
.
selectionChanged
())
this
.
cm
.
operation
(()
=>
this
.
cm
.
curOp
.
selectionChanged
=
true
)
},
20
)
}
showMultipleSelections
(
info
)
{
removeChildrenAndAdd
(
this
.
cm
.
display
.
cursorDiv
,
info
.
cursors
)
removeChildrenAndAdd
(
this
.
cm
.
display
.
selectionDiv
,
info
.
selection
)
}
rememberSelection
()
{
let
sel
=
window
.
getSelection
()
this
.
lastAnchorNode
=
sel
.
anchorNode
;
this
.
lastAnchorOffset
=
sel
.
anchorOffset
this
.
lastFocusNode
=
sel
.
focusNode
;
this
.
lastFocusOffset
=
sel
.
focusOffset
}
selectionInEditor
()
{
let
sel
=
window
.
getSelection
()
if
(
!
sel
.
rangeCount
)
return
false
let
node
=
sel
.
getRangeAt
(
0
).
commonAncestorContainer
return
contains
(
this
.
div
,
node
)
}
focus
()
{
if
(
this
.
cm
.
options
.
readOnly
!=
"
nocursor
"
)
{
if
(
!
this
.
selectionInEditor
())
this
.
showSelection
(
this
.
prepareSelection
(),
true
)
this
.
div
.
focus
()
}
}
blur
()
{
this
.
div
.
blur
()
}
getField
()
{
return
this
.
div
}
supportsTouch
()
{
return
true
}
receivedFocus
()
{
let
input
=
this
if
(
this
.
selectionInEditor
())
this
.
pollSelection
()
else
runInOp
(
this
.
cm
,
()
=>
input
.
cm
.
curOp
.
selectionChanged
=
true
)
function
poll
()
{
if
(
input
.
cm
.
state
.
focused
)
{
input
.
pollSelection
()
input
.
polling
.
set
(
input
.
cm
.
options
.
pollInterval
,
poll
)
}
}
this
.
polling
.
set
(
this
.
cm
.
options
.
pollInterval
,
poll
)
}
selectionChanged
()
{
let
sel
=
window
.
getSelection
()
return
sel
.
anchorNode
!=
this
.
lastAnchorNode
||
sel
.
anchorOffset
!=
this
.
lastAnchorOffset
||
sel
.
focusNode
!=
this
.
lastFocusNode
||
sel
.
focusOffset
!=
this
.
lastFocusOffset
}
pollSelection
()
{
if
(
!
this
.
composing
&&
this
.
readDOMTimeout
==
null
&&
!
this
.
gracePeriod
&&
this
.
selectionChanged
())
{
let
sel
=
window
.
getSelection
(),
cm
=
this
.
cm
this
.
rememberSelection
()
let
anchor
=
domToPos
(
cm
,
sel
.
anchorNode
,
sel
.
anchorOffset
)
let
head
=
domToPos
(
cm
,
sel
.
focusNode
,
sel
.
focusOffset
)
if
(
anchor
&&
head
)
runInOp
(
cm
,
()
=>
{
setSelection
(
cm
.
doc
,
simpleSelection
(
anchor
,
head
),
sel_dontScroll
)
if
(
anchor
.
bad
||
head
.
bad
)
cm
.
curOp
.
selectionChanged
=
true
})
}
}
pollContent
()
{
if
(
this
.
readDOMTimeout
!=
null
)
{
clearTimeout
(
this
.
readDOMTimeout
)
this
.
readDOMTimeout
=
null
}
let
cm
=
this
.
cm
,
display
=
cm
.
display
,
sel
=
cm
.
doc
.
sel
.
primary
()
let
from
=
sel
.
from
(),
to
=
sel
.
to
()
if
(
from
.
ch
==
0
&&
from
.
line
>
cm
.
firstLine
())
from
=
Pos
(
from
.
line
-
1
,
getLine
(
cm
.
doc
,
from
.
line
-
1
).
length
)
if
(
to
.
ch
==
getLine
(
cm
.
doc
,
to
.
line
).
text
.
length
&&
to
.
line
<
cm
.
lastLine
())
to
=
Pos
(
to
.
line
+
1
,
0
)
if
(
from
.
line
<
display
.
viewFrom
||
to
.
line
>
display
.
viewTo
-
1
)
return
false
let
fromIndex
,
fromLine
,
fromNode
if
(
from
.
line
==
display
.
viewFrom
||
(
fromIndex
=
findViewIndex
(
cm
,
from
.
line
))
==
0
)
{
fromLine
=
lineNo
(
display
.
view
[
0
].
line
)
fromNode
=
display
.
view
[
0
].
node
}
else
{
fromLine
=
lineNo
(
display
.
view
[
fromIndex
].
line
)
fromNode
=
display
.
view
[
fromIndex
-
1
].
node
.
nextSibling
}
let
toIndex
=
findViewIndex
(
cm
,
to
.
line
)
let
toLine
,
toNode
if
(
toIndex
==
display
.
view
.
length
-
1
)
{
toLine
=
display
.
viewTo
-
1
toNode
=
display
.
lineDiv
.
lastChild
}
else
{
toLine
=
lineNo
(
display
.
view
[
toIndex
+
1
].
line
)
-
1
toNode
=
display
.
view
[
toIndex
+
1
].
node
.
previousSibling
}
if
(
!
fromNode
)
return
false
let
newText
=
cm
.
doc
.
splitLines
(
domTextBetween
(
cm
,
fromNode
,
toNode
,
fromLine
,
toLine
))
let
oldText
=
getBetween
(
cm
.
doc
,
Pos
(
fromLine
,
0
),
Pos
(
toLine
,
getLine
(
cm
.
doc
,
toLine
).
text
.
length
))
while
(
newText
.
length
>
1
&&
oldText
.
length
>
1
)
{
if
(
lst
(
newText
)
==
lst
(
oldText
))
{
newText
.
pop
();
oldText
.
pop
();
toLine
--
}
else
if
(
newText
[
0
]
==
oldText
[
0
])
{
newText
.
shift
();
oldText
.
shift
();
fromLine
++
}
else
break
}
let
cutFront
=
0
,
cutEnd
=
0
let
newTop
=
newText
[
0
],
oldTop
=
oldText
[
0
],
maxCutFront
=
Math
.
min
(
newTop
.
length
,
oldTop
.
length
)
while
(
cutFront
<
maxCutFront
&&
newTop
.
charCodeAt
(
cutFront
)
==
oldTop
.
charCodeAt
(
cutFront
))
++
cutFront
let
newBot
=
lst
(
newText
),
oldBot
=
lst
(
oldText
)
let
maxCutEnd
=
Math
.
min
(
newBot
.
length
-
(
newText
.
length
==
1
?
cutFront
:
0
),
oldBot
.
length
-
(
oldText
.
length
==
1
?
cutFront
:
0
))
while
(
cutEnd
<
maxCutEnd
&&
newBot
.
charCodeAt
(
newBot
.
length
-
cutEnd
-
1
)
==
oldBot
.
charCodeAt
(
oldBot
.
length
-
cutEnd
-
1
))
++
cutEnd
newText
[
newText
.
length
-
1
]
=
newBot
.
slice
(
0
,
newBot
.
length
-
cutEnd
).
replace
(
/^
\u
200b+/
,
""
)
newText
[
0
]
=
newText
[
0
].
slice
(
cutFront
).
replace
(
/
\u
200b+$/
,
""
)
let
chFrom
=
Pos
(
fromLine
,
cutFront
)
let
chTo
=
Pos
(
toLine
,
oldText
.
length
?
lst
(
oldText
).
length
-
cutEnd
:
0
)
if
(
newText
.
length
>
1
||
newText
[
0
]
||
cmp
(
chFrom
,
chTo
))
{
replaceRange
(
cm
.
doc
,
newText
,
chFrom
,
chTo
,
"
+input
"
)
return
true
}
}
ensurePolled
()
{
this
.
forceCompositionEnd
()
}
reset
()
{
this
.
forceCompositionEnd
()
}
forceCompositionEnd
()
{
if
(
!
this
.
composing
)
return
clearTimeout
(
this
.
readDOMTimeout
)
this
.
composing
=
null
if
(
!
this
.
pollContent
())
regChange
(
this
.
cm
)
this
.
div
.
blur
()
this
.
div
.
focus
()
}
readFromDOMSoon
()
{
if
(
this
.
readDOMTimeout
!=
null
)
return
this
.
readDOMTimeout
=
setTimeout
(()
=>
{
this
.
readDOMTimeout
=
null
if
(
this
.
composing
)
{
if
(
this
.
composing
.
done
)
this
.
composing
=
null
else
return
}
if
(
this
.
cm
.
isReadOnly
()
||
!
this
.
pollContent
())
runInOp
(
this
.
cm
,
()
=>
regChange
(
this
.
cm
))
},
80
)
}
setUneditable
(
node
)
{
node
.
contentEditable
=
"
false
"
}
onKeyPress
(
e
)
{
if
(
e
.
charCode
==
0
)
return
e
.
preventDefault
()
if
(
!
this
.
cm
.
isReadOnly
())
operation
(
this
.
cm
,
applyTextInput
)(
this
.
cm
,
String
.
fromCharCode
(
e
.
charCode
==
null
?
e
.
keyCode
:
e
.
charCode
),
0
)
}
readOnlyChanged
(
val
)
{
this
.
div
.
contentEditable
=
String
(
val
!=
"
nocursor
"
)
}
onContextMenu
()
{}
resetPosition
()
{}
}
ContentEditableInput
.
prototype
.
needsContentAttribute
=
true
function
posToDOM
(
cm
,
pos
)
{
let
view
=
findViewForLine
(
cm
,
pos
.
line
)
if
(
!
view
||
view
.
hidden
)
return
null
let
line
=
getLine
(
cm
.
doc
,
pos
.
line
)
let
info
=
mapFromLineView
(
view
,
line
,
pos
.
line
)
let
order
=
getOrder
(
line
),
side
=
"
left
"
if
(
order
)
{
let
partPos
=
getBidiPartAt
(
order
,
pos
.
ch
)
side
=
partPos
%
2
?
"
right
"
:
"
left
"
}
let
result
=
nodeAndOffsetInLineMap
(
info
.
map
,
pos
.
ch
,
side
)
result
.
offset
=
result
.
collapse
==
"
right
"
?
result
.
end
:
result
.
start
return
result
}
function
badPos
(
pos
,
bad
)
{
if
(
bad
)
pos
.
bad
=
true
;
return
pos
}
function
domTextBetween
(
cm
,
from
,
to
,
fromLine
,
toLine
)
{
let
text
=
""
,
closing
=
false
,
lineSep
=
cm
.
doc
.
lineSeparator
()
function
recognizeMarker
(
id
)
{
return
marker
=>
marker
.
id
==
id
}
function
walk
(
node
)
{
if
(
node
.
nodeType
==
1
)
{
let
cmText
=
node
.
getAttribute
(
"
cm-text
"
)
if
(
cmText
!=
null
)
{
if
(
cmText
==
""
)
text
+=
node
.
textContent
.
replace
(
/
\u
200b/g
,
""
)
else
text
+=
cmText
return
}
let
markerID
=
node
.
getAttribute
(
"
cm-marker
"
),
range
if
(
markerID
)
{
let
found
=
cm
.
findMarks
(
Pos
(
fromLine
,
0
),
Pos
(
toLine
+
1
,
0
),
recognizeMarker
(
+
markerID
))
if
(
found
.
length
&&
(
range
=
found
[
0
].
find
()))
text
+=
getBetween
(
cm
.
doc
,
range
.
from
,
range
.
to
).
join
(
lineSep
)
return
}
if
(
node
.
getAttribute
(
"
contenteditable
"
)
==
"
false
"
)
return
for
(
let
i
=
0
;
i
<
node
.
childNodes
.
length
;
i
++
)
walk
(
node
.
childNodes
[
i
])
if
(
/^
(
pre|div|p
)
$/i
.
test
(
node
.
nodeName
))
closing
=
true
}
else
if
(
node
.
nodeType
==
3
)
{
let
val
=
node
.
nodeValue
if
(
!
val
)
return
if
(
closing
)
{
text
+=
lineSep
closing
=
false
}
text
+=
val
}
}
for
(;;)
{
walk
(
from
)
if
(
from
==
to
)
break
from
=
from
.
nextSibling
}
return
text
}
function
domToPos
(
cm
,
node
,
offset
)
{
let
lineNode
if
(
node
==
cm
.
display
.
lineDiv
)
{
lineNode
=
cm
.
display
.
lineDiv
.
childNodes
[
offset
]
if
(
!
lineNode
)
return
badPos
(
cm
.
clipPos
(
Pos
(
cm
.
display
.
viewTo
-
1
)),
true
)
node
=
null
;
offset
=
0
}
else
{
for
(
lineNode
=
node
;;
lineNode
=
lineNode
.
parentNode
)
{
if
(
!
lineNode
||
lineNode
==
cm
.
display
.
lineDiv
)
return
null
if
(
lineNode
.
parentNode
&&
lineNode
.
parentNode
==
cm
.
display
.
lineDiv
)
break
}
}
for
(
let
i
=
0
;
i
<
cm
.
display
.
view
.
length
;
i
++
)
{
let
lineView
=
cm
.
display
.
view
[
i
]
if
(
lineView
.
node
==
lineNode
)
return
locateNodeInLineView
(
lineView
,
node
,
offset
)
}
}
function
locateNodeInLineView
(
lineView
,
node
,
offset
)
{
let
wrapper
=
lineView
.
text
.
firstChild
,
bad
=
false
if
(
!
node
||
!
contains
(
wrapper
,
node
))
return
badPos
(
Pos
(
lineNo
(
lineView
.
line
),
0
),
true
)
if
(
node
==
wrapper
)
{
bad
=
true
node
=
wrapper
.
childNodes
[
offset
]
offset
=
0
if
(
!
node
)
{
let
line
=
lineView
.
rest
?
lst
(
lineView
.
rest
)
:
lineView
.
line
return
badPos
(
Pos
(
lineNo
(
line
),
line
.
text
.
length
),
bad
)
}
}
let
textNode
=
node
.
nodeType
==
3
?
node
:
null
,
topNode
=
node
if
(
!
textNode
&&
node
.
childNodes
.
length
==
1
&&
node
.
firstChild
.
nodeType
==
3
)
{
textNode
=
node
.
firstChild
if
(
offset
)
offset
=
textNode
.
nodeValue
.
length
}
while
(
topNode
.
parentNode
!=
wrapper
)
topNode
=
topNode
.
parentNode
let
measure
=
lineView
.
measure
,
maps
=
measure
.
maps
function
find
(
textNode
,
topNode
,
offset
)
{
for
(
let
i
=
-
1
;
i
<
(
maps
?
maps
.
length
:
0
);
i
++
)
{
let
map
=
i
<
0
?
measure
.
map
:
maps
[
i
]
for
(
let
j
=
0
;
j
<
map
.
length
;
j
+=
3
)
{
let
curNode
=
map
[
j
+
2
]
if
(
curNode
==
textNode
||
curNode
==
topNode
)
{
let
line
=
lineNo
(
i
<
0
?
lineView
.
line
:
lineView
.
rest
[
i
])
let
ch
=
map
[
j
]
+
offset
if
(
offset
<
0
||
curNode
!=
textNode
)
ch
=
map
[
j
+
(
offset
?
1
:
0
)]
return
Pos
(
line
,
ch
)
}
}
}
}
let
found
=
find
(
textNode
,
topNode
,
offset
)
if
(
found
)
return
badPos
(
found
,
bad
)
// FIXME this is all really shaky. might handle the few cases it needs to handle, but likely to cause problems
for
(
let
after
=
topNode
.
nextSibling
,
dist
=
textNode
?
textNode
.
nodeValue
.
length
-
offset
:
0
;
after
;
after
=
after
.
nextSibling
)
{
found
=
find
(
after
,
after
.
firstChild
,
0
)
if
(
found
)
return
badPos
(
Pos
(
found
.
line
,
found
.
ch
-
dist
),
bad
)
else
dist
+=
after
.
textContent
.
length
}
for
(
let
before
=
topNode
.
previousSibling
,
dist
=
offset
;
before
;
before
=
before
.
previousSibling
)
{
found
=
find
(
before
,
before
.
firstChild
,
-
1
)
if
(
found
)
return
badPos
(
Pos
(
found
.
line
,
found
.
ch
+
dist
),
bad
)
else
dist
+=
before
.
textContent
.
length
}
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/input/ContentEditableInput.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
ContentEditableInput.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/input/TextareaInput.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
operation
,
runInOp
}
from
"
../display/operations
"
import
{
prepareSelection
}
from
"
../display/selection
"
import
{
applyTextInput
,
copyableRanges
,
handlePaste
,
hiddenTextarea
,
lastCopied
,
setLastCopied
}
from
"
./input
"
import
{
cursorCoords
,
posFromMouse
}
from
"
../measurement/position_measurement
"
import
{
eventInWidget
}
from
"
../measurement/widgets
"
import
{
simpleSelection
}
from
"
../model/selection
"
import
{
selectAll
,
setSelection
}
from
"
../model/selection_updates
"
import
{
captureRightClick
,
ie
,
ie_version
,
ios
,
mac
,
mobile
,
presto
,
webkit
}
from
"
../util/browser
"
import
{
activeElt
,
removeChildrenAndAdd
,
selectInput
}
from
"
../util/dom
"
import
{
e_preventDefault
,
e_stop
,
off
,
on
,
signalDOMEvent
}
from
"
../util/event
"
import
{
hasCopyEvent
,
hasSelection
}
from
"
../util/feature_detection
"
import
{
Delayed
,
sel_dontScroll
}
from
"
../util/misc
"
// TEXTAREA INPUT STYLE
export
default
class
TextareaInput
{
constructor
(
cm
)
{
this
.
cm
=
cm
// See input.poll and input.reset
this
.
prevInput
=
""
// Flag that indicates whether we expect input to appear real soon
// now (after some event like 'keypress' or 'input') and are
// polling intensively.
this
.
pollingFast
=
false
// Self-resetting timeout for the poller
this
.
polling
=
new
Delayed
()
// Tracks when input.reset has punted to just putting a short
// string into the textarea instead of the full selection.
this
.
inaccurateSelection
=
false
// Used to work around IE issue with selection being forgotten when focus moves away from textarea
this
.
hasSelection
=
false
this
.
composing
=
null
}
init
(
display
)
{
let
input
=
this
,
cm
=
this
.
cm
// Wraps and hides input textarea
let
div
=
this
.
wrapper
=
hiddenTextarea
()
// The semihidden textarea that is focused when the editor is
// focused, and receives input.
let
te
=
this
.
textarea
=
div
.
firstChild
display
.
wrapper
.
insertBefore
(
div
,
display
.
wrapper
.
firstChild
)
// Needed to hide big blue blinking cursor on Mobile Safari (doesn't seem to work in iOS 8 anymore)
if
(
ios
)
te
.
style
.
width
=
"
0px
"
on
(
te
,
"
input
"
,
()
=>
{
if
(
ie
&&
ie_version
>=
9
&&
this
.
hasSelection
)
this
.
hasSelection
=
null
input
.
poll
()
})
on
(
te
,
"
paste
"
,
e
=>
{
if
(
signalDOMEvent
(
cm
,
e
)
||
handlePaste
(
e
,
cm
))
return
cm
.
state
.
pasteIncoming
=
true
input
.
fastPoll
()
})
function
prepareCopyCut
(
e
)
{
if
(
signalDOMEvent
(
cm
,
e
))
return
if
(
cm
.
somethingSelected
())
{
setLastCopied
({
lineWise
:
false
,
text
:
cm
.
getSelections
()})
if
(
input
.
inaccurateSelection
)
{
input
.
prevInput
=
""
input
.
inaccurateSelection
=
false
te
.
value
=
lastCopied
.
text
.
join
(
"
\n
"
)
selectInput
(
te
)
}
}
else
if
(
!
cm
.
options
.
lineWiseCopyCut
)
{
return
}
else
{
let
ranges
=
copyableRanges
(
cm
)
setLastCopied
({
lineWise
:
true
,
text
:
ranges
.
text
})
if
(
e
.
type
==
"
cut
"
)
{
cm
.
setSelections
(
ranges
.
ranges
,
null
,
sel_dontScroll
)
}
else
{
input
.
prevInput
=
""
te
.
value
=
ranges
.
text
.
join
(
"
\n
"
)
selectInput
(
te
)
}
}
if
(
e
.
type
==
"
cut
"
)
cm
.
state
.
cutIncoming
=
true
}
on
(
te
,
"
cut
"
,
prepareCopyCut
)
on
(
te
,
"
copy
"
,
prepareCopyCut
)
on
(
display
.
scroller
,
"
paste
"
,
e
=>
{
if
(
eventInWidget
(
display
,
e
)
||
signalDOMEvent
(
cm
,
e
))
return
cm
.
state
.
pasteIncoming
=
true
input
.
focus
()
})
// Prevent normal selection in the editor (we handle our own)
on
(
display
.
lineSpace
,
"
selectstart
"
,
e
=>
{
if
(
!
eventInWidget
(
display
,
e
))
e_preventDefault
(
e
)
})
on
(
te
,
"
compositionstart
"
,
()
=>
{
let
start
=
cm
.
getCursor
(
"
from
"
)
if
(
input
.
composing
)
input
.
composing
.
range
.
clear
()
input
.
composing
=
{
start
:
start
,
range
:
cm
.
markText
(
start
,
cm
.
getCursor
(
"
to
"
),
{
className
:
"
CodeMirror-composing
"
})
}
})
on
(
te
,
"
compositionend
"
,
()
=>
{
if
(
input
.
composing
)
{
input
.
poll
()
input
.
composing
.
range
.
clear
()
input
.
composing
=
null
}
})
}
prepareSelection
()
{
// Redraw the selection and/or cursor
let
cm
=
this
.
cm
,
display
=
cm
.
display
,
doc
=
cm
.
doc
let
result
=
prepareSelection
(
cm
)
// Move the hidden textarea near the cursor to prevent scrolling artifacts
if
(
cm
.
options
.
moveInputWithCursor
)
{
let
headPos
=
cursorCoords
(
cm
,
doc
.
sel
.
primary
().
head
,
"
div
"
)
let
wrapOff
=
display
.
wrapper
.
getBoundingClientRect
(),
lineOff
=
display
.
lineDiv
.
getBoundingClientRect
()
result
.
teTop
=
Math
.
max
(
0
,
Math
.
min
(
display
.
wrapper
.
clientHeight
-
10
,
headPos
.
top
+
lineOff
.
top
-
wrapOff
.
top
))
result
.
teLeft
=
Math
.
max
(
0
,
Math
.
min
(
display
.
wrapper
.
clientWidth
-
10
,
headPos
.
left
+
lineOff
.
left
-
wrapOff
.
left
))
}
return
result
}
showSelection
(
drawn
)
{
let
cm
=
this
.
cm
,
display
=
cm
.
display
removeChildrenAndAdd
(
display
.
cursorDiv
,
drawn
.
cursors
)
removeChildrenAndAdd
(
display
.
selectionDiv
,
drawn
.
selection
)
if
(
drawn
.
teTop
!=
null
)
{
this
.
wrapper
.
style
.
top
=
drawn
.
teTop
+
"
px
"
this
.
wrapper
.
style
.
left
=
drawn
.
teLeft
+
"
px
"
}
}
// Reset the input to correspond to the selection (or to be empty,
// when not typing and nothing is selected)
reset
(
typing
)
{
if
(
this
.
contextMenuPending
)
return
let
minimal
,
selected
,
cm
=
this
.
cm
,
doc
=
cm
.
doc
if
(
cm
.
somethingSelected
())
{
this
.
prevInput
=
""
let
range
=
doc
.
sel
.
primary
()
minimal
=
hasCopyEvent
&&
(
range
.
to
().
line
-
range
.
from
().
line
>
100
||
(
selected
=
cm
.
getSelection
()).
length
>
1000
)
let
content
=
minimal
?
"
-
"
:
selected
||
cm
.
getSelection
()
this
.
textarea
.
value
=
content
if
(
cm
.
state
.
focused
)
selectInput
(
this
.
textarea
)
if
(
ie
&&
ie_version
>=
9
)
this
.
hasSelection
=
content
}
else
if
(
!
typing
)
{
this
.
prevInput
=
this
.
textarea
.
value
=
""
if
(
ie
&&
ie_version
>=
9
)
this
.
hasSelection
=
null
}
this
.
inaccurateSelection
=
minimal
}
getField
()
{
return
this
.
textarea
}
supportsTouch
()
{
return
false
}
focus
()
{
if
(
this
.
cm
.
options
.
readOnly
!=
"
nocursor
"
&&
(
!
mobile
||
activeElt
()
!=
this
.
textarea
))
{
try
{
this
.
textarea
.
focus
()
}
catch
(
e
)
{}
// IE8 will throw if the textarea is display: none or not in DOM
}
}
blur
()
{
this
.
textarea
.
blur
()
}
resetPosition
()
{
this
.
wrapper
.
style
.
top
=
this
.
wrapper
.
style
.
left
=
0
}
receivedFocus
()
{
this
.
slowPoll
()
}
// Poll for input changes, using the normal rate of polling. This
// runs as long as the editor is focused.
slowPoll
()
{
if
(
this
.
pollingFast
)
return
this
.
polling
.
set
(
this
.
cm
.
options
.
pollInterval
,
()
=>
{
this
.
poll
()
if
(
this
.
cm
.
state
.
focused
)
this
.
slowPoll
()
})
}
// When an event has just come in that is likely to add or change
// something in the input textarea, we poll faster, to ensure that
// the change appears on the screen quickly.
fastPoll
()
{
let
missed
=
false
,
input
=
this
input
.
pollingFast
=
true
function
p
()
{
let
changed
=
input
.
poll
()
if
(
!
changed
&&
!
missed
)
{
missed
=
true
;
input
.
polling
.
set
(
60
,
p
)}
else
{
input
.
pollingFast
=
false
;
input
.
slowPoll
()}
}
input
.
polling
.
set
(
20
,
p
)
}
// Read input from the textarea, and update the document to match.
// When something is selected, it is present in the textarea, and
// selected (unless it is huge, in which case a placeholder is
// used). When nothing is selected, the cursor sits after previously
// seen text (can be empty), which is stored in prevInput (we must
// not reset the textarea when typing, because that breaks IME).
poll
()
{
let
cm
=
this
.
cm
,
input
=
this
.
textarea
,
prevInput
=
this
.
prevInput
// Since this is called a *lot*, try to bail out as cheaply as
// possible when it is clear that nothing happened. hasSelection
// will be the case when there is a lot of text in the textarea,
// in which case reading its value would be expensive.
if
(
this
.
contextMenuPending
||
!
cm
.
state
.
focused
||
(
hasSelection
(
input
)
&&
!
prevInput
&&
!
this
.
composing
)
||
cm
.
isReadOnly
()
||
cm
.
options
.
disableInput
||
cm
.
state
.
keySeq
)
return
false
let
text
=
input
.
value
// If nothing changed, bail.
if
(
text
==
prevInput
&&
!
cm
.
somethingSelected
())
return
false
// Work around nonsensical selection resetting in IE9/10, and
// inexplicable appearance of private area unicode characters on
// some key combos in Mac (#2689).
if
(
ie
&&
ie_version
>=
9
&&
this
.
hasSelection
===
text
||
mac
&&
/
[\u
f700-
\u
f7ff
]
/
.
test
(
text
))
{
cm
.
display
.
input
.
reset
()
return
false
}
if
(
cm
.
doc
.
sel
==
cm
.
display
.
selForContextMenu
)
{
let
first
=
text
.
charCodeAt
(
0
)
if
(
first
==
0x200b
&&
!
prevInput
)
prevInput
=
"
\
u200b
"
if
(
first
==
0x21da
)
{
this
.
reset
();
return
this
.
cm
.
execCommand
(
"
undo
"
)
}
}
// Find the part of the input that is actually new
let
same
=
0
,
l
=
Math
.
min
(
prevInput
.
length
,
text
.
length
)
while
(
same
<
l
&&
prevInput
.
charCodeAt
(
same
)
==
text
.
charCodeAt
(
same
))
++
same
runInOp
(
cm
,
()
=>
{
applyTextInput
(
cm
,
text
.
slice
(
same
),
prevInput
.
length
-
same
,
null
,
this
.
composing
?
"
*compose
"
:
null
)
// Don't leave long text in the textarea, since it makes further polling slow
if
(
text
.
length
>
1000
||
text
.
indexOf
(
"
\n
"
)
>
-
1
)
input
.
value
=
this
.
prevInput
=
""
else
this
.
prevInput
=
text
if
(
this
.
composing
)
{
this
.
composing
.
range
.
clear
()
this
.
composing
.
range
=
cm
.
markText
(
this
.
composing
.
start
,
cm
.
getCursor
(
"
to
"
),
{
className
:
"
CodeMirror-composing
"
})
}
})
return
true
}
ensurePolled
()
{
if
(
this
.
pollingFast
&&
this
.
poll
())
this
.
pollingFast
=
false
}
onKeyPress
()
{
if
(
ie
&&
ie_version
>=
9
)
this
.
hasSelection
=
null
this
.
fastPoll
()
}
onContextMenu
(
e
)
{
let
input
=
this
,
cm
=
input
.
cm
,
display
=
cm
.
display
,
te
=
input
.
textarea
let
pos
=
posFromMouse
(
cm
,
e
),
scrollPos
=
display
.
scroller
.
scrollTop
if
(
!
pos
||
presto
)
return
// Opera is difficult.
// Reset the current text selection only if the click is done outside of the selection
// and 'resetSelectionOnContextMenu' option is true.
let
reset
=
cm
.
options
.
resetSelectionOnContextMenu
if
(
reset
&&
cm
.
doc
.
sel
.
contains
(
pos
)
==
-
1
)
operation
(
cm
,
setSelection
)(
cm
.
doc
,
simpleSelection
(
pos
),
sel_dontScroll
)
let
oldCSS
=
te
.
style
.
cssText
,
oldWrapperCSS
=
input
.
wrapper
.
style
.
cssText
input
.
wrapper
.
style
.
cssText
=
"
position: absolute
"
let
wrapperBox
=
input
.
wrapper
.
getBoundingClientRect
()
te
.
style
.
cssText
=
`position: absolute; width: 30px; height: 30px;
top:
${
e
.
clientY
-
wrapperBox
.
top
-
5
}
px; left:
${
e
.
clientX
-
wrapperBox
.
left
-
5
}
px;
z-index: 1000; background:
${
ie
?
"
rgba(255, 255, 255, .05)
"
:
"
transparent
"
}
;
outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);`
let
oldScrollY
if
(
webkit
)
oldScrollY
=
window
.
scrollY
// Work around Chrome issue (#2712)
display
.
input
.
focus
()
if
(
webkit
)
window
.
scrollTo
(
null
,
oldScrollY
)
display
.
input
.
reset
()
// Adds "Select all" to context menu in FF
if
(
!
cm
.
somethingSelected
())
te
.
value
=
input
.
prevInput
=
"
"
input
.
contextMenuPending
=
true
display
.
selForContextMenu
=
cm
.
doc
.
sel
clearTimeout
(
display
.
detectingSelectAll
)
// Select-all will be greyed out if there's nothing to select, so
// this adds a zero-width space so that we can later check whether
// it got selected.
function
prepareSelectAllHack
()
{
if
(
te
.
selectionStart
!=
null
)
{
let
selected
=
cm
.
somethingSelected
()
let
extval
=
"
\
u200b
"
+
(
selected
?
te
.
value
:
""
)
te
.
value
=
"
\
u21da
"
// Used to catch context-menu undo
te
.
value
=
extval
input
.
prevInput
=
selected
?
""
:
"
\
u200b
"
te
.
selectionStart
=
1
;
te
.
selectionEnd
=
extval
.
length
// Re-set this, in case some other handler touched the
// selection in the meantime.
display
.
selForContextMenu
=
cm
.
doc
.
sel
}
}
function
rehide
()
{
input
.
contextMenuPending
=
false
input
.
wrapper
.
style
.
cssText
=
oldWrapperCSS
te
.
style
.
cssText
=
oldCSS
if
(
ie
&&
ie_version
<
9
)
display
.
scrollbars
.
setScrollTop
(
display
.
scroller
.
scrollTop
=
scrollPos
)
// Try to detect the user choosing select-all
if
(
te
.
selectionStart
!=
null
)
{
if
(
!
ie
||
(
ie
&&
ie_version
<
9
))
prepareSelectAllHack
()
let
i
=
0
,
poll
=
()
=>
{
if
(
display
.
selForContextMenu
==
cm
.
doc
.
sel
&&
te
.
selectionStart
==
0
&&
te
.
selectionEnd
>
0
&&
input
.
prevInput
==
"
\
u200b
"
)
{
operation
(
cm
,
selectAll
)(
cm
)
}
else
if
(
i
++
<
10
)
{
display
.
detectingSelectAll
=
setTimeout
(
poll
,
500
)
}
else
{
display
.
selForContextMenu
=
null
display
.
input
.
reset
()
}
}
display
.
detectingSelectAll
=
setTimeout
(
poll
,
200
)
}
}
if
(
ie
&&
ie_version
>=
9
)
prepareSelectAllHack
()
if
(
captureRightClick
)
{
e_stop
(
e
)
let
mouseup
=
()
=>
{
off
(
window
,
"
mouseup
"
,
mouseup
)
setTimeout
(
rehide
,
20
)
}
on
(
window
,
"
mouseup
"
,
mouseup
)
}
else
{
setTimeout
(
rehide
,
50
)
}
}
readOnlyChanged
(
val
)
{
if
(
!
val
)
this
.
reset
()
}
setUneditable
()
{}
}
TextareaInput
.
prototype
.
needsContentAttribute
=
false
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/input/TextareaInput.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
TextareaInput.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/input/indent.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
getStateBefore
}
from
"
../line/highlight
"
import
{
Pos
}
from
"
../line/pos
"
import
{
getLine
}
from
"
../line/utils_line
"
import
{
replaceRange
}
from
"
../model/changes
"
import
{
Range
}
from
"
../model/selection
"
import
{
replaceOneSelection
}
from
"
../model/selection_updates
"
import
{
countColumn
,
Pass
,
spaceStr
}
from
"
../util/misc
"
// Indent the given line. The how parameter can be "smart",
// "add"/null, "subtract", or "prev". When aggressive is false
// (typically set to true for forced single-line indents), empty
// lines are not indented, and places where the mode returns Pass
// are left alone.
export
function
indentLine
(
cm
,
n
,
how
,
aggressive
)
{
let
doc
=
cm
.
doc
,
state
if
(
how
==
null
)
how
=
"
add
"
if
(
how
==
"
smart
"
)
{
// Fall back to "prev" when the mode doesn't have an indentation
// method.
if
(
!
doc
.
mode
.
indent
)
how
=
"
prev
"
else
state
=
getStateBefore
(
cm
,
n
)
}
let
tabSize
=
cm
.
options
.
tabSize
let
line
=
getLine
(
doc
,
n
),
curSpace
=
countColumn
(
line
.
text
,
null
,
tabSize
)
if
(
line
.
stateAfter
)
line
.
stateAfter
=
null
let
curSpaceString
=
line
.
text
.
match
(
/^
\s
*/
)[
0
],
indentation
if
(
!
aggressive
&&
!
/
\S
/
.
test
(
line
.
text
))
{
indentation
=
0
how
=
"
not
"
}
else
if
(
how
==
"
smart
"
)
{
indentation
=
doc
.
mode
.
indent
(
state
,
line
.
text
.
slice
(
curSpaceString
.
length
),
line
.
text
)
if
(
indentation
==
Pass
||
indentation
>
150
)
{
if
(
!
aggressive
)
return
how
=
"
prev
"
}
}
if
(
how
==
"
prev
"
)
{
if
(
n
>
doc
.
first
)
indentation
=
countColumn
(
getLine
(
doc
,
n
-
1
).
text
,
null
,
tabSize
)
else
indentation
=
0
}
else
if
(
how
==
"
add
"
)
{
indentation
=
curSpace
+
cm
.
options
.
indentUnit
}
else
if
(
how
==
"
subtract
"
)
{
indentation
=
curSpace
-
cm
.
options
.
indentUnit
}
else
if
(
typeof
how
==
"
number
"
)
{
indentation
=
curSpace
+
how
}
indentation
=
Math
.
max
(
0
,
indentation
)
let
indentString
=
""
,
pos
=
0
if
(
cm
.
options
.
indentWithTabs
)
for
(
let
i
=
Math
.
floor
(
indentation
/
tabSize
);
i
;
--
i
)
{
pos
+=
tabSize
;
indentString
+=
"
\t
"
}
if
(
pos
<
indentation
)
indentString
+=
spaceStr
(
indentation
-
pos
)
if
(
indentString
!=
curSpaceString
)
{
replaceRange
(
doc
,
indentString
,
Pos
(
n
,
0
),
Pos
(
n
,
curSpaceString
.
length
),
"
+input
"
)
line
.
stateAfter
=
null
return
true
}
else
{
// Ensure that, if the cursor was in the whitespace at the start
// of the line, it is moved to the end of that space.
for
(
let
i
=
0
;
i
<
doc
.
sel
.
ranges
.
length
;
i
++
)
{
let
range
=
doc
.
sel
.
ranges
[
i
]
if
(
range
.
head
.
line
==
n
&&
range
.
head
.
ch
<
curSpaceString
.
length
)
{
let
pos
=
Pos
(
n
,
curSpaceString
.
length
)
replaceOneSelection
(
doc
,
i
,
new
Range
(
pos
,
pos
))
break
}
}
}
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/input/indent.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
indent.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/input/input.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
runInOp
}
from
"
../display/operations
"
import
{
ensureCursorVisible
}
from
"
../display/scrolling
"
import
{
Pos
}
from
"
../line/pos
"
import
{
getLine
}
from
"
../line/utils_line
"
import
{
makeChange
}
from
"
../model/changes
"
import
{
ios
,
webkit
}
from
"
../util/browser
"
import
{
elt
}
from
"
../util/dom
"
import
{
lst
,
map
}
from
"
../util/misc
"
import
{
signalLater
}
from
"
../util/operation_group
"
import
{
splitLinesAuto
}
from
"
../util/feature_detection
"
import
{
indentLine
}
from
"
./indent
"
// This will be set to a {lineWise: bool, text: [string]} object, so
// that, when pasting, we know what kind of selections the copied
// text was made out of.
export
let
lastCopied
=
null
export
function
setLastCopied
(
newLastCopied
)
{
lastCopied
=
newLastCopied
}
export
function
applyTextInput
(
cm
,
inserted
,
deleted
,
sel
,
origin
)
{
let
doc
=
cm
.
doc
cm
.
display
.
shift
=
false
if
(
!
sel
)
sel
=
doc
.
sel
let
paste
=
cm
.
state
.
pasteIncoming
||
origin
==
"
paste
"
let
textLines
=
splitLinesAuto
(
inserted
),
multiPaste
=
null
// When pasing N lines into N selections, insert one line per selection
if
(
paste
&&
sel
.
ranges
.
length
>
1
)
{
if
(
lastCopied
&&
lastCopied
.
text
.
join
(
"
\n
"
)
==
inserted
)
{
if
(
sel
.
ranges
.
length
%
lastCopied
.
text
.
length
==
0
)
{
multiPaste
=
[]
for
(
let
i
=
0
;
i
<
lastCopied
.
text
.
length
;
i
++
)
multiPaste
.
push
(
doc
.
splitLines
(
lastCopied
.
text
[
i
]))
}
}
else
if
(
textLines
.
length
==
sel
.
ranges
.
length
)
{
multiPaste
=
map
(
textLines
,
l
=>
[
l
])
}
}
let
updateInput
// Normal behavior is to insert the new text into every selection
for
(
let
i
=
sel
.
ranges
.
length
-
1
;
i
>=
0
;
i
--
)
{
let
range
=
sel
.
ranges
[
i
]
let
from
=
range
.
from
(),
to
=
range
.
to
()
if
(
range
.
empty
())
{
if
(
deleted
&&
deleted
>
0
)
// Handle deletion
from
=
Pos
(
from
.
line
,
from
.
ch
-
deleted
)
else
if
(
cm
.
state
.
overwrite
&&
!
paste
)
// Handle overwrite
to
=
Pos
(
to
.
line
,
Math
.
min
(
getLine
(
doc
,
to
.
line
).
text
.
length
,
to
.
ch
+
lst
(
textLines
).
length
))
else
if
(
lastCopied
&&
lastCopied
.
lineWise
&&
lastCopied
.
text
.
join
(
"
\n
"
)
==
inserted
)
from
=
to
=
Pos
(
from
.
line
,
0
)
}
updateInput
=
cm
.
curOp
.
updateInput
let
changeEvent
=
{
from
:
from
,
to
:
to
,
text
:
multiPaste
?
multiPaste
[
i
%
multiPaste
.
length
]
:
textLines
,
origin
:
origin
||
(
paste
?
"
paste
"
:
cm
.
state
.
cutIncoming
?
"
cut
"
:
"
+input
"
)}
makeChange
(
cm
.
doc
,
changeEvent
)
signalLater
(
cm
,
"
inputRead
"
,
cm
,
changeEvent
)
}
if
(
inserted
&&
!
paste
)
triggerElectric
(
cm
,
inserted
)
ensureCursorVisible
(
cm
)
cm
.
curOp
.
updateInput
=
updateInput
cm
.
curOp
.
typing
=
true
cm
.
state
.
pasteIncoming
=
cm
.
state
.
cutIncoming
=
false
}
export
function
handlePaste
(
e
,
cm
)
{
let
pasted
=
e
.
clipboardData
&&
e
.
clipboardData
.
getData
(
"
Text
"
)
if
(
pasted
)
{
e
.
preventDefault
()
if
(
!
cm
.
isReadOnly
()
&&
!
cm
.
options
.
disableInput
)
runInOp
(
cm
,
()
=>
applyTextInput
(
cm
,
pasted
,
0
,
null
,
"
paste
"
))
return
true
}
}
export
function
triggerElectric
(
cm
,
inserted
)
{
// When an 'electric' character is inserted, immediately trigger a reindent
if
(
!
cm
.
options
.
electricChars
||
!
cm
.
options
.
smartIndent
)
return
let
sel
=
cm
.
doc
.
sel
for
(
let
i
=
sel
.
ranges
.
length
-
1
;
i
>=
0
;
i
--
)
{
let
range
=
sel
.
ranges
[
i
]
if
(
range
.
head
.
ch
>
100
||
(
i
&&
sel
.
ranges
[
i
-
1
].
head
.
line
==
range
.
head
.
line
))
continue
let
mode
=
cm
.
getModeAt
(
range
.
head
)
let
indented
=
false
if
(
mode
.
electricChars
)
{
for
(
let
j
=
0
;
j
<
mode
.
electricChars
.
length
;
j
++
)
if
(
inserted
.
indexOf
(
mode
.
electricChars
.
charAt
(
j
))
>
-
1
)
{
indented
=
indentLine
(
cm
,
range
.
head
.
line
,
"
smart
"
)
break
}
}
else
if
(
mode
.
electricInput
)
{
if
(
mode
.
electricInput
.
test
(
getLine
(
cm
.
doc
,
range
.
head
.
line
).
text
.
slice
(
0
,
range
.
head
.
ch
)))
indented
=
indentLine
(
cm
,
range
.
head
.
line
,
"
smart
"
)
}
if
(
indented
)
signalLater
(
cm
,
"
electricInput
"
,
cm
,
range
.
head
.
line
)
}
}
export
function
copyableRanges
(
cm
)
{
let
text
=
[],
ranges
=
[]
for
(
let
i
=
0
;
i
<
cm
.
doc
.
sel
.
ranges
.
length
;
i
++
)
{
let
line
=
cm
.
doc
.
sel
.
ranges
[
i
].
head
.
line
let
lineRange
=
{
anchor
:
Pos
(
line
,
0
),
head
:
Pos
(
line
+
1
,
0
)}
ranges
.
push
(
lineRange
)
text
.
push
(
cm
.
getRange
(
lineRange
.
anchor
,
lineRange
.
head
))
}
return
{
text
:
text
,
ranges
:
ranges
}
}
export
function
disableBrowserMagic
(
field
,
spellcheck
)
{
field
.
setAttribute
(
"
autocorrect
"
,
"
off
"
)
field
.
setAttribute
(
"
autocapitalize
"
,
"
off
"
)
field
.
setAttribute
(
"
spellcheck
"
,
!!
spellcheck
)
}
export
function
hiddenTextarea
()
{
let
te
=
elt
(
"
textarea
"
,
null
,
null
,
"
position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; outline: none
"
)
let
div
=
elt
(
"
div
"
,
[
te
],
null
,
"
overflow: hidden; position: relative; width: 3px; height: 0px;
"
)
// The textarea is kept positioned near the cursor to prevent the
// fact that it'll be scrolled into view on input from scrolling
// our fake cursor out of view. On webkit, when wrap=off, paste is
// very slow. So make the area wide instead.
if
(
webkit
)
te
.
style
.
width
=
"
1000px
"
else
te
.
setAttribute
(
"
wrap
"
,
"
off
"
)
// If border: 0; -- iOS fails to open keyboard (issue #1287)
if
(
ios
)
te
.
style
.
border
=
"
1px solid black
"
disableBrowserMagic
(
te
)
return
div
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/input/input.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
input.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/input/keymap.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
flipCtrlCmd
,
mac
,
presto
}
from
"
../util/browser
"
import
{
map
}
from
"
../util/misc
"
import
{
keyNames
}
from
"
./keynames
"
export
let
keyMap
=
{}
keyMap
.
basic
=
{
"
Left
"
:
"
goCharLeft
"
,
"
Right
"
:
"
goCharRight
"
,
"
Up
"
:
"
goLineUp
"
,
"
Down
"
:
"
goLineDown
"
,
"
End
"
:
"
goLineEnd
"
,
"
Home
"
:
"
goLineStartSmart
"
,
"
PageUp
"
:
"
goPageUp
"
,
"
PageDown
"
:
"
goPageDown
"
,
"
Delete
"
:
"
delCharAfter
"
,
"
Backspace
"
:
"
delCharBefore
"
,
"
Shift-Backspace
"
:
"
delCharBefore
"
,
"
Tab
"
:
"
defaultTab
"
,
"
Shift-Tab
"
:
"
indentAuto
"
,
"
Enter
"
:
"
newlineAndIndent
"
,
"
Insert
"
:
"
toggleOverwrite
"
,
"
Esc
"
:
"
singleSelection
"
}
// Note that the save and find-related commands aren't defined by
// default. User code or addons can define them. Unknown commands
// are simply ignored.
keyMap
.
pcDefault
=
{
"
Ctrl-A
"
:
"
selectAll
"
,
"
Ctrl-D
"
:
"
deleteLine
"
,
"
Ctrl-Z
"
:
"
undo
"
,
"
Shift-Ctrl-Z
"
:
"
redo
"
,
"
Ctrl-Y
"
:
"
redo
"
,
"
Ctrl-Home
"
:
"
goDocStart
"
,
"
Ctrl-End
"
:
"
goDocEnd
"
,
"
Ctrl-Up
"
:
"
goLineUp
"
,
"
Ctrl-Down
"
:
"
goLineDown
"
,
"
Ctrl-Left
"
:
"
goGroupLeft
"
,
"
Ctrl-Right
"
:
"
goGroupRight
"
,
"
Alt-Left
"
:
"
goLineStart
"
,
"
Alt-Right
"
:
"
goLineEnd
"
,
"
Ctrl-Backspace
"
:
"
delGroupBefore
"
,
"
Ctrl-Delete
"
:
"
delGroupAfter
"
,
"
Ctrl-S
"
:
"
save
"
,
"
Ctrl-F
"
:
"
find
"
,
"
Ctrl-G
"
:
"
findNext
"
,
"
Shift-Ctrl-G
"
:
"
findPrev
"
,
"
Shift-Ctrl-F
"
:
"
replace
"
,
"
Shift-Ctrl-R
"
:
"
replaceAll
"
,
"
Ctrl-[
"
:
"
indentLess
"
,
"
Ctrl-]
"
:
"
indentMore
"
,
"
Ctrl-U
"
:
"
undoSelection
"
,
"
Shift-Ctrl-U
"
:
"
redoSelection
"
,
"
Alt-U
"
:
"
redoSelection
"
,
fallthrough
:
"
basic
"
}
// Very basic readline/emacs-style bindings, which are standard on Mac.
keyMap
.
emacsy
=
{
"
Ctrl-F
"
:
"
goCharRight
"
,
"
Ctrl-B
"
:
"
goCharLeft
"
,
"
Ctrl-P
"
:
"
goLineUp
"
,
"
Ctrl-N
"
:
"
goLineDown
"
,
"
Alt-F
"
:
"
goWordRight
"
,
"
Alt-B
"
:
"
goWordLeft
"
,
"
Ctrl-A
"
:
"
goLineStart
"
,
"
Ctrl-E
"
:
"
goLineEnd
"
,
"
Ctrl-V
"
:
"
goPageDown
"
,
"
Shift-Ctrl-V
"
:
"
goPageUp
"
,
"
Ctrl-D
"
:
"
delCharAfter
"
,
"
Ctrl-H
"
:
"
delCharBefore
"
,
"
Alt-D
"
:
"
delWordAfter
"
,
"
Alt-Backspace
"
:
"
delWordBefore
"
,
"
Ctrl-K
"
:
"
killLine
"
,
"
Ctrl-T
"
:
"
transposeChars
"
,
"
Ctrl-O
"
:
"
openLine
"
}
keyMap
.
macDefault
=
{
"
Cmd-A
"
:
"
selectAll
"
,
"
Cmd-D
"
:
"
deleteLine
"
,
"
Cmd-Z
"
:
"
undo
"
,
"
Shift-Cmd-Z
"
:
"
redo
"
,
"
Cmd-Y
"
:
"
redo
"
,
"
Cmd-Home
"
:
"
goDocStart
"
,
"
Cmd-Up
"
:
"
goDocStart
"
,
"
Cmd-End
"
:
"
goDocEnd
"
,
"
Cmd-Down
"
:
"
goDocEnd
"
,
"
Alt-Left
"
:
"
goGroupLeft
"
,
"
Alt-Right
"
:
"
goGroupRight
"
,
"
Cmd-Left
"
:
"
goLineLeft
"
,
"
Cmd-Right
"
:
"
goLineRight
"
,
"
Alt-Backspace
"
:
"
delGroupBefore
"
,
"
Ctrl-Alt-Backspace
"
:
"
delGroupAfter
"
,
"
Alt-Delete
"
:
"
delGroupAfter
"
,
"
Cmd-S
"
:
"
save
"
,
"
Cmd-F
"
:
"
find
"
,
"
Cmd-G
"
:
"
findNext
"
,
"
Shift-Cmd-G
"
:
"
findPrev
"
,
"
Cmd-Alt-F
"
:
"
replace
"
,
"
Shift-Cmd-Alt-F
"
:
"
replaceAll
"
,
"
Cmd-[
"
:
"
indentLess
"
,
"
Cmd-]
"
:
"
indentMore
"
,
"
Cmd-Backspace
"
:
"
delWrappedLineLeft
"
,
"
Cmd-Delete
"
:
"
delWrappedLineRight
"
,
"
Cmd-U
"
:
"
undoSelection
"
,
"
Shift-Cmd-U
"
:
"
redoSelection
"
,
"
Ctrl-Up
"
:
"
goDocStart
"
,
"
Ctrl-Down
"
:
"
goDocEnd
"
,
fallthrough
:
[
"
basic
"
,
"
emacsy
"
]
}
keyMap
[
"
default
"
]
=
mac
?
keyMap
.
macDefault
:
keyMap
.
pcDefault
// KEYMAP DISPATCH
function
normalizeKeyName
(
name
)
{
let
parts
=
name
.
split
(
/-
(?!
$
)
/
)
name
=
parts
[
parts
.
length
-
1
]
let
alt
,
ctrl
,
shift
,
cmd
for
(
let
i
=
0
;
i
<
parts
.
length
-
1
;
i
++
)
{
let
mod
=
parts
[
i
]
if
(
/^
(
cmd|meta|m
)
$/i
.
test
(
mod
))
cmd
=
true
else
if
(
/^a
(
lt
)?
$/i
.
test
(
mod
))
alt
=
true
else
if
(
/^
(
c|ctrl|control
)
$/i
.
test
(
mod
))
ctrl
=
true
else
if
(
/^s
(
hift
)?
$/i
.
test
(
mod
))
shift
=
true
else
throw
new
Error
(
"
Unrecognized modifier name:
"
+
mod
)
}
if
(
alt
)
name
=
"
Alt-
"
+
name
if
(
ctrl
)
name
=
"
Ctrl-
"
+
name
if
(
cmd
)
name
=
"
Cmd-
"
+
name
if
(
shift
)
name
=
"
Shift-
"
+
name
return
name
}
// This is a kludge to keep keymaps mostly working as raw objects
// (backwards compatibility) while at the same time support features
// like normalization and multi-stroke key bindings. It compiles a
// new normalized keymap, and then updates the old object to reflect
// this.
export
function
normalizeKeyMap
(
keymap
)
{
let
copy
=
{}
for
(
let
keyname
in
keymap
)
if
(
keymap
.
hasOwnProperty
(
keyname
))
{
let
value
=
keymap
[
keyname
]
if
(
/^
(
name|fallthrough|
(
de|at
)
tach
)
$/
.
test
(
keyname
))
continue
if
(
value
==
"
...
"
)
{
delete
keymap
[
keyname
];
continue
}
let
keys
=
map
(
keyname
.
split
(
"
"
),
normalizeKeyName
)
for
(
let
i
=
0
;
i
<
keys
.
length
;
i
++
)
{
let
val
,
name
if
(
i
==
keys
.
length
-
1
)
{
name
=
keys
.
join
(
"
"
)
val
=
value
}
else
{
name
=
keys
.
slice
(
0
,
i
+
1
).
join
(
"
"
)
val
=
"
...
"
}
let
prev
=
copy
[
name
]
if
(
!
prev
)
copy
[
name
]
=
val
else
if
(
prev
!=
val
)
throw
new
Error
(
"
Inconsistent bindings for
"
+
name
)
}
delete
keymap
[
keyname
]
}
for
(
let
prop
in
copy
)
keymap
[
prop
]
=
copy
[
prop
]
return
keymap
}
export
function
lookupKey
(
key
,
map
,
handle
,
context
)
{
map
=
getKeyMap
(
map
)
let
found
=
map
.
call
?
map
.
call
(
key
,
context
)
:
map
[
key
]
if
(
found
===
false
)
return
"
nothing
"
if
(
found
===
"
...
"
)
return
"
multi
"
if
(
found
!=
null
&&
handle
(
found
))
return
"
handled
"
if
(
map
.
fallthrough
)
{
if
(
Object
.
prototype
.
toString
.
call
(
map
.
fallthrough
)
!=
"
[object Array]
"
)
return
lookupKey
(
key
,
map
.
fallthrough
,
handle
,
context
)
for
(
let
i
=
0
;
i
<
map
.
fallthrough
.
length
;
i
++
)
{
let
result
=
lookupKey
(
key
,
map
.
fallthrough
[
i
],
handle
,
context
)
if
(
result
)
return
result
}
}
}
// Modifier key presses don't count as 'real' key presses for the
// purpose of keymap fallthrough.
export
function
isModifierKey
(
value
)
{
let
name
=
typeof
value
==
"
string
"
?
value
:
keyNames
[
value
.
keyCode
]
return
name
==
"
Ctrl
"
||
name
==
"
Alt
"
||
name
==
"
Shift
"
||
name
==
"
Mod
"
}
// Look up the name of a key as indicated by an event object.
export
function
keyName
(
event
,
noShift
)
{
if
(
presto
&&
event
.
keyCode
==
34
&&
event
[
"
char
"
])
return
false
let
base
=
keyNames
[
event
.
keyCode
],
name
=
base
if
(
name
==
null
||
event
.
altGraphKey
)
return
false
if
(
event
.
altKey
&&
base
!=
"
Alt
"
)
name
=
"
Alt-
"
+
name
if
((
flipCtrlCmd
?
event
.
metaKey
:
event
.
ctrlKey
)
&&
base
!=
"
Ctrl
"
)
name
=
"
Ctrl-
"
+
name
if
((
flipCtrlCmd
?
event
.
ctrlKey
:
event
.
metaKey
)
&&
base
!=
"
Cmd
"
)
name
=
"
Cmd-
"
+
name
if
(
!
noShift
&&
event
.
shiftKey
&&
base
!=
"
Shift
"
)
name
=
"
Shift-
"
+
name
return
name
}
export
function
getKeyMap
(
val
)
{
return
typeof
val
==
"
string
"
?
keyMap
[
val
]
:
val
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/input/keymap.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
keymap.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/input/keynames.js.js
deleted
100644 → 0
View file @
a3a26621
export
let
keyNames
=
{
3
:
"
Enter
"
,
8
:
"
Backspace
"
,
9
:
"
Tab
"
,
13
:
"
Enter
"
,
16
:
"
Shift
"
,
17
:
"
Ctrl
"
,
18
:
"
Alt
"
,
19
:
"
Pause
"
,
20
:
"
CapsLock
"
,
27
:
"
Esc
"
,
32
:
"
Space
"
,
33
:
"
PageUp
"
,
34
:
"
PageDown
"
,
35
:
"
End
"
,
36
:
"
Home
"
,
37
:
"
Left
"
,
38
:
"
Up
"
,
39
:
"
Right
"
,
40
:
"
Down
"
,
44
:
"
PrintScrn
"
,
45
:
"
Insert
"
,
46
:
"
Delete
"
,
59
:
"
;
"
,
61
:
"
=
"
,
91
:
"
Mod
"
,
92
:
"
Mod
"
,
93
:
"
Mod
"
,
106
:
"
*
"
,
107
:
"
=
"
,
109
:
"
-
"
,
110
:
"
.
"
,
111
:
"
/
"
,
127
:
"
Delete
"
,
173
:
"
-
"
,
186
:
"
;
"
,
187
:
"
=
"
,
188
:
"
,
"
,
189
:
"
-
"
,
190
:
"
.
"
,
191
:
"
/
"
,
192
:
"
`
"
,
219
:
"
[
"
,
220
:
"
\\
"
,
221
:
"
]
"
,
222
:
"
'
"
,
63232
:
"
Up
"
,
63233
:
"
Down
"
,
63234
:
"
Left
"
,
63235
:
"
Right
"
,
63272
:
"
Delete
"
,
63273
:
"
Home
"
,
63275
:
"
End
"
,
63276
:
"
PageUp
"
,
63277
:
"
PageDown
"
,
63302
:
"
Insert
"
}
// Number keys
for
(
let
i
=
0
;
i
<
10
;
i
++
)
keyNames
[
i
+
48
]
=
keyNames
[
i
+
96
]
=
String
(
i
)
// Alphabetic keys
for
(
let
i
=
65
;
i
<=
90
;
i
++
)
keyNames
[
i
]
=
String
.
fromCharCode
(
i
)
// Function keys
for
(
let
i
=
1
;
i
<=
12
;
i
++
)
keyNames
[
i
+
111
]
=
keyNames
[
i
+
63235
]
=
"
F
"
+
i
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/input/keynames.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
keynames.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/input/movement.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
Pos
}
from
"
../line/pos
"
import
{
prepareMeasureForLine
,
measureCharPrepared
,
wrappedLineExtentChar
}
from
"
../measurement/position_measurement
"
import
{
getBidiPartAt
,
getOrder
}
from
"
../util/bidi
"
import
{
findFirst
,
lst
,
skipExtendingChars
}
from
"
../util/misc
"
function
moveCharLogically
(
line
,
ch
,
dir
)
{
let
target
=
skipExtendingChars
(
line
.
text
,
ch
+
dir
,
dir
)
return
target
<
0
||
target
>
line
.
text
.
length
?
null
:
target
}
export
function
moveLogically
(
line
,
start
,
dir
)
{
let
ch
=
moveCharLogically
(
line
,
start
.
ch
,
dir
)
return
ch
==
null
?
null
:
new
Pos
(
start
.
line
,
ch
,
dir
<
0
?
"
after
"
:
"
before
"
)
}
export
function
endOfLine
(
visually
,
cm
,
lineObj
,
lineNo
,
dir
)
{
if
(
visually
)
{
let
order
=
getOrder
(
lineObj
)
if
(
order
)
{
let
part
=
dir
<
0
?
lst
(
order
)
:
order
[
0
]
let
moveInStorageOrder
=
(
dir
<
0
)
==
(
part
.
level
==
1
)
let
sticky
=
moveInStorageOrder
?
"
after
"
:
"
before
"
let
ch
// With a wrapped rtl chunk (possibly spanning multiple bidi parts),
// it could be that the last bidi part is not on the last visual line,
// since visual lines contain content order-consecutive chunks.
// Thus, in rtl, we are looking for the first (content-order) character
// in the rtl chunk that is on the last line (that is, the same line
// as the last (content-order) character).
if
(
part
.
level
>
0
)
{
let
prep
=
prepareMeasureForLine
(
cm
,
lineObj
)
ch
=
dir
<
0
?
lineObj
.
text
.
length
-
1
:
0
let
targetTop
=
measureCharPrepared
(
cm
,
prep
,
ch
).
top
ch
=
findFirst
(
ch
=>
measureCharPrepared
(
cm
,
prep
,
ch
).
top
==
targetTop
,
(
dir
<
0
)
==
(
part
.
level
==
1
)
?
part
.
from
:
part
.
to
-
1
,
ch
)
if
(
sticky
==
"
before
"
)
ch
=
moveCharLogically
(
lineObj
,
ch
,
1
,
true
)
}
else
ch
=
dir
<
0
?
part
.
to
:
part
.
from
return
new
Pos
(
lineNo
,
ch
,
sticky
)
}
}
return
new
Pos
(
lineNo
,
dir
<
0
?
lineObj
.
text
.
length
:
0
,
dir
<
0
?
"
before
"
:
"
after
"
)
}
export
function
moveVisually
(
cm
,
line
,
start
,
dir
)
{
let
bidi
=
getOrder
(
line
)
if
(
!
bidi
)
return
moveLogically
(
line
,
start
,
dir
)
if
(
start
.
ch
>=
line
.
text
.
length
)
{
start
.
ch
=
line
.
text
.
length
start
.
sticky
=
"
before
"
}
else
if
(
start
.
ch
<=
0
)
{
start
.
ch
=
0
start
.
sticky
=
"
after
"
}
let
partPos
=
getBidiPartAt
(
bidi
,
start
.
ch
,
start
.
sticky
),
part
=
bidi
[
partPos
]
if
(
part
.
level
%
2
==
0
&&
(
dir
>
0
?
part
.
to
>
start
.
ch
:
part
.
from
<
start
.
ch
))
{
// Case 1: We move within an ltr part. Even with wrapped lines,
// nothing interesting happens.
return
moveLogically
(
line
,
start
,
dir
)
}
let
mv
=
(
pos
,
dir
)
=>
moveCharLogically
(
line
,
pos
instanceof
Pos
?
pos
.
ch
:
pos
,
dir
)
let
prep
let
getWrappedLineExtent
=
ch
=>
{
if
(
!
cm
.
options
.
lineWrapping
)
return
{
begin
:
0
,
end
:
line
.
text
.
length
}
prep
=
prep
||
prepareMeasureForLine
(
cm
,
line
)
return
wrappedLineExtentChar
(
cm
,
line
,
prep
,
ch
)
}
let
wrappedLineExtent
=
getWrappedLineExtent
(
start
.
sticky
==
"
before
"
?
mv
(
start
,
-
1
)
:
start
.
ch
)
if
(
part
.
level
%
2
==
1
)
{
let
ch
=
mv
(
start
,
-
dir
)
if
(
ch
!=
null
&&
(
dir
>
0
?
ch
>=
part
.
from
&&
ch
>=
wrappedLineExtent
.
begin
:
ch
<=
part
.
to
&&
ch
<=
wrappedLineExtent
.
end
))
{
// Case 2: We move within an rtl part on the same visual line
let
sticky
=
dir
<
0
?
"
before
"
:
"
after
"
return
new
Pos
(
start
.
line
,
ch
,
sticky
)
}
}
// Case 3: Could not move within this bidi part in this visual line, so leave
// the current bidi part
let
searchInVisualLine
=
(
partPos
,
dir
,
wrappedLineExtent
)
=>
{
let
getRes
=
(
ch
,
moveInStorageOrder
)
=>
moveInStorageOrder
?
new
Pos
(
start
.
line
,
mv
(
ch
,
1
),
"
before
"
)
:
new
Pos
(
start
.
line
,
ch
,
"
after
"
)
for
(;
partPos
>=
0
&&
partPos
<
bidi
.
length
;
partPos
+=
dir
)
{
let
part
=
bidi
[
partPos
]
let
moveInStorageOrder
=
(
dir
>
0
)
==
(
part
.
level
!=
1
)
let
ch
=
moveInStorageOrder
?
wrappedLineExtent
.
begin
:
mv
(
wrappedLineExtent
.
end
,
-
1
)
if
(
part
.
from
<=
ch
&&
ch
<
part
.
to
)
return
getRes
(
ch
,
moveInStorageOrder
)
ch
=
moveInStorageOrder
?
part
.
from
:
mv
(
part
.
to
,
-
1
)
if
(
wrappedLineExtent
.
begin
<=
ch
&&
ch
<
wrappedLineExtent
.
end
)
return
getRes
(
ch
,
moveInStorageOrder
)
}
}
// Case 3a: Look for other bidi parts on the same visual line
let
res
=
searchInVisualLine
(
partPos
+
dir
,
dir
,
wrappedLineExtent
)
if
(
res
)
return
res
// Case 3b: Look for other bidi parts on the next visual line
let
nextCh
=
dir
>
0
?
wrappedLineExtent
.
end
:
mv
(
wrappedLineExtent
.
begin
,
-
1
)
if
(
nextCh
!=
null
&&
!
(
dir
>
0
&&
nextCh
==
line
.
text
.
length
))
{
res
=
searchInVisualLine
(
dir
>
0
?
0
:
bidi
.
length
-
1
,
dir
,
getWrappedLineExtent
(
nextCh
))
if
(
res
)
return
res
}
// Case 4: Nowhere to move
return
null
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/input/movement.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
movement.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/line.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"Folder"
module=
"OFS.Folder"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_objects
</string>
</key>
<value>
<tuple/>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
line
</string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/line/highlight.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
countColumn
}
from
"
../util/misc
"
import
{
copyState
,
innerMode
,
startState
}
from
"
../modes
"
import
StringStream
from
"
../util/StringStream
"
import
{
getLine
,
lineNo
}
from
"
./utils_line
"
import
{
clipPos
}
from
"
./pos
"
// Compute a style array (an array starting with a mode generation
// -- for invalidation -- followed by pairs of end positions and
// style strings), which is used to highlight the tokens on the
// line.
export
function
highlightLine
(
cm
,
line
,
state
,
forceToEnd
)
{
// A styles array always starts with a number identifying the
// mode/overlays that it is based on (for easy invalidation).
let
st
=
[
cm
.
state
.
modeGen
],
lineClasses
=
{}
// Compute the base array of styles
runMode
(
cm
,
line
.
text
,
cm
.
doc
.
mode
,
state
,
(
end
,
style
)
=>
st
.
push
(
end
,
style
),
lineClasses
,
forceToEnd
)
// Run overlays, adjust style array.
for
(
let
o
=
0
;
o
<
cm
.
state
.
overlays
.
length
;
++
o
)
{
let
overlay
=
cm
.
state
.
overlays
[
o
],
i
=
1
,
at
=
0
runMode
(
cm
,
line
.
text
,
overlay
.
mode
,
true
,
(
end
,
style
)
=>
{
let
start
=
i
// Ensure there's a token end at the current position, and that i points at it
while
(
at
<
end
)
{
let
i_end
=
st
[
i
]
if
(
i_end
>
end
)
st
.
splice
(
i
,
1
,
end
,
st
[
i
+
1
],
i_end
)
i
+=
2
at
=
Math
.
min
(
end
,
i_end
)
}
if
(
!
style
)
return
if
(
overlay
.
opaque
)
{
st
.
splice
(
start
,
i
-
start
,
end
,
"
overlay
"
+
style
)
i
=
start
+
2
}
else
{
for
(;
start
<
i
;
start
+=
2
)
{
let
cur
=
st
[
start
+
1
]
st
[
start
+
1
]
=
(
cur
?
cur
+
"
"
:
""
)
+
"
overlay
"
+
style
}
}
},
lineClasses
)
}
return
{
styles
:
st
,
classes
:
lineClasses
.
bgClass
||
lineClasses
.
textClass
?
lineClasses
:
null
}
}
export
function
getLineStyles
(
cm
,
line
,
updateFrontier
)
{
if
(
!
line
.
styles
||
line
.
styles
[
0
]
!=
cm
.
state
.
modeGen
)
{
let
state
=
getStateBefore
(
cm
,
lineNo
(
line
))
let
result
=
highlightLine
(
cm
,
line
,
line
.
text
.
length
>
cm
.
options
.
maxHighlightLength
?
copyState
(
cm
.
doc
.
mode
,
state
)
:
state
)
line
.
stateAfter
=
state
line
.
styles
=
result
.
styles
if
(
result
.
classes
)
line
.
styleClasses
=
result
.
classes
else
if
(
line
.
styleClasses
)
line
.
styleClasses
=
null
if
(
updateFrontier
===
cm
.
doc
.
frontier
)
cm
.
doc
.
frontier
++
}
return
line
.
styles
}
export
function
getStateBefore
(
cm
,
n
,
precise
)
{
let
doc
=
cm
.
doc
,
display
=
cm
.
display
if
(
!
doc
.
mode
.
startState
)
return
true
let
pos
=
findStartLine
(
cm
,
n
,
precise
),
state
=
pos
>
doc
.
first
&&
getLine
(
doc
,
pos
-
1
).
stateAfter
if
(
!
state
)
state
=
startState
(
doc
.
mode
)
else
state
=
copyState
(
doc
.
mode
,
state
)
doc
.
iter
(
pos
,
n
,
line
=>
{
processLine
(
cm
,
line
.
text
,
state
)
let
save
=
pos
==
n
-
1
||
pos
%
5
==
0
||
pos
>=
display
.
viewFrom
&&
pos
<
display
.
viewTo
line
.
stateAfter
=
save
?
copyState
(
doc
.
mode
,
state
)
:
null
++
pos
})
if
(
precise
)
doc
.
frontier
=
pos
return
state
}
// Lightweight form of highlight -- proceed over this line and
// update state, but don't save a style array. Used for lines that
// aren't currently visible.
export
function
processLine
(
cm
,
text
,
state
,
startAt
)
{
let
mode
=
cm
.
doc
.
mode
let
stream
=
new
StringStream
(
text
,
cm
.
options
.
tabSize
)
stream
.
start
=
stream
.
pos
=
startAt
||
0
if
(
text
==
""
)
callBlankLine
(
mode
,
state
)
while
(
!
stream
.
eol
())
{
readToken
(
mode
,
stream
,
state
)
stream
.
start
=
stream
.
pos
}
}
function
callBlankLine
(
mode
,
state
)
{
if
(
mode
.
blankLine
)
return
mode
.
blankLine
(
state
)
if
(
!
mode
.
innerMode
)
return
let
inner
=
innerMode
(
mode
,
state
)
if
(
inner
.
mode
.
blankLine
)
return
inner
.
mode
.
blankLine
(
inner
.
state
)
}
export
function
readToken
(
mode
,
stream
,
state
,
inner
)
{
for
(
let
i
=
0
;
i
<
10
;
i
++
)
{
if
(
inner
)
inner
[
0
]
=
innerMode
(
mode
,
state
).
mode
let
style
=
mode
.
token
(
stream
,
state
)
if
(
stream
.
pos
>
stream
.
start
)
return
style
}
throw
new
Error
(
"
Mode
"
+
mode
.
name
+
"
failed to advance stream.
"
)
}
// Utility for getTokenAt and getLineTokens
export
function
takeToken
(
cm
,
pos
,
precise
,
asArray
)
{
let
getObj
=
copy
=>
({
start
:
stream
.
start
,
end
:
stream
.
pos
,
string
:
stream
.
current
(),
type
:
style
||
null
,
state
:
copy
?
copyState
(
doc
.
mode
,
state
)
:
state
})
let
doc
=
cm
.
doc
,
mode
=
doc
.
mode
,
style
pos
=
clipPos
(
doc
,
pos
)
let
line
=
getLine
(
doc
,
pos
.
line
),
state
=
getStateBefore
(
cm
,
pos
.
line
,
precise
)
let
stream
=
new
StringStream
(
line
.
text
,
cm
.
options
.
tabSize
),
tokens
if
(
asArray
)
tokens
=
[]
while
((
asArray
||
stream
.
pos
<
pos
.
ch
)
&&
!
stream
.
eol
())
{
stream
.
start
=
stream
.
pos
style
=
readToken
(
mode
,
stream
,
state
)
if
(
asArray
)
tokens
.
push
(
getObj
(
true
))
}
return
asArray
?
tokens
:
getObj
()
}
function
extractLineClasses
(
type
,
output
)
{
if
(
type
)
for
(;;)
{
let
lineClass
=
type
.
match
(
/
(?:
^|
\s
+
)
line-
(
background-
)?(\S
+
)
/
)
if
(
!
lineClass
)
break
type
=
type
.
slice
(
0
,
lineClass
.
index
)
+
type
.
slice
(
lineClass
.
index
+
lineClass
[
0
].
length
)
let
prop
=
lineClass
[
1
]
?
"
bgClass
"
:
"
textClass
"
if
(
output
[
prop
]
==
null
)
output
[
prop
]
=
lineClass
[
2
]
else
if
(
!
(
new
RegExp
(
"
(?:^|
\
s)
"
+
lineClass
[
2
]
+
"
(?:$|
\
s)
"
)).
test
(
output
[
prop
]))
output
[
prop
]
+=
"
"
+
lineClass
[
2
]
}
return
type
}
// Run the given mode's parser over a line, calling f for each token.
function
runMode
(
cm
,
text
,
mode
,
state
,
f
,
lineClasses
,
forceToEnd
)
{
let
flattenSpans
=
mode
.
flattenSpans
if
(
flattenSpans
==
null
)
flattenSpans
=
cm
.
options
.
flattenSpans
let
curStart
=
0
,
curStyle
=
null
let
stream
=
new
StringStream
(
text
,
cm
.
options
.
tabSize
),
style
let
inner
=
cm
.
options
.
addModeClass
&&
[
null
]
if
(
text
==
""
)
extractLineClasses
(
callBlankLine
(
mode
,
state
),
lineClasses
)
while
(
!
stream
.
eol
())
{
if
(
stream
.
pos
>
cm
.
options
.
maxHighlightLength
)
{
flattenSpans
=
false
if
(
forceToEnd
)
processLine
(
cm
,
text
,
state
,
stream
.
pos
)
stream
.
pos
=
text
.
length
style
=
null
}
else
{
style
=
extractLineClasses
(
readToken
(
mode
,
stream
,
state
,
inner
),
lineClasses
)
}
if
(
inner
)
{
let
mName
=
inner
[
0
].
name
if
(
mName
)
style
=
"
m-
"
+
(
style
?
mName
+
"
"
+
style
:
mName
)
}
if
(
!
flattenSpans
||
curStyle
!=
style
)
{
while
(
curStart
<
stream
.
start
)
{
curStart
=
Math
.
min
(
stream
.
start
,
curStart
+
5000
)
f
(
curStart
,
curStyle
)
}
curStyle
=
style
}
stream
.
start
=
stream
.
pos
}
while
(
curStart
<
stream
.
pos
)
{
// Webkit seems to refuse to render text nodes longer than 57444
// characters, and returns inaccurate measurements in nodes
// starting around 5000 chars.
let
pos
=
Math
.
min
(
stream
.
pos
,
curStart
+
5000
)
f
(
pos
,
curStyle
)
curStart
=
pos
}
}
// Finds the line to start with when starting a parse. Tries to
// find a line with a stateAfter, so that it can start with a
// valid state. If that fails, it returns the line with the
// smallest indentation, which tends to need the least context to
// parse correctly.
function
findStartLine
(
cm
,
n
,
precise
)
{
let
minindent
,
minline
,
doc
=
cm
.
doc
let
lim
=
precise
?
-
1
:
n
-
(
cm
.
doc
.
mode
.
innerMode
?
1000
:
100
)
for
(
let
search
=
n
;
search
>
lim
;
--
search
)
{
if
(
search
<=
doc
.
first
)
return
doc
.
first
let
line
=
getLine
(
doc
,
search
-
1
)
if
(
line
.
stateAfter
&&
(
!
precise
||
search
<=
doc
.
frontier
))
return
search
let
indented
=
countColumn
(
line
.
text
,
null
,
cm
.
options
.
tabSize
)
if
(
minline
==
null
||
minindent
>
indented
)
{
minline
=
search
-
1
minindent
=
indented
}
}
return
minline
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/line/highlight.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
highlight.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/line/line_data.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
getOrder
}
from
"
../util/bidi
"
import
{
ie
,
ie_version
,
webkit
}
from
"
../util/browser
"
import
{
elt
,
joinClasses
}
from
"
../util/dom
"
import
{
eventMixin
,
signal
}
from
"
../util/event
"
import
{
hasBadBidiRects
,
zeroWidthElement
}
from
"
../util/feature_detection
"
import
{
lst
,
spaceStr
}
from
"
../util/misc
"
import
{
getLineStyles
}
from
"
./highlight
"
import
{
attachMarkedSpans
,
compareCollapsedMarkers
,
detachMarkedSpans
,
lineIsHidden
,
visualLineContinued
}
from
"
./spans
"
import
{
getLine
,
lineNo
,
updateLineHeight
}
from
"
./utils_line
"
// LINE DATA STRUCTURE
// Line objects. These hold state related to a line, including
// highlighting info (the styles array).
export
class
Line
{
constructor
(
text
,
markedSpans
,
estimateHeight
)
{
this
.
text
=
text
attachMarkedSpans
(
this
,
markedSpans
)
this
.
height
=
estimateHeight
?
estimateHeight
(
this
)
:
1
}
lineNo
()
{
return
lineNo
(
this
)
}
}
eventMixin
(
Line
)
// Change the content (text, markers) of a line. Automatically
// invalidates cached information and tries to re-estimate the
// line's height.
export
function
updateLine
(
line
,
text
,
markedSpans
,
estimateHeight
)
{
line
.
text
=
text
if
(
line
.
stateAfter
)
line
.
stateAfter
=
null
if
(
line
.
styles
)
line
.
styles
=
null
if
(
line
.
order
!=
null
)
line
.
order
=
null
detachMarkedSpans
(
line
)
attachMarkedSpans
(
line
,
markedSpans
)
let
estHeight
=
estimateHeight
?
estimateHeight
(
line
)
:
1
if
(
estHeight
!=
line
.
height
)
updateLineHeight
(
line
,
estHeight
)
}
// Detach a line from the document tree and its markers.
export
function
cleanUpLine
(
line
)
{
line
.
parent
=
null
detachMarkedSpans
(
line
)
}
// Convert a style as returned by a mode (either null, or a string
// containing one or more styles) to a CSS style. This is cached,
// and also looks for line-wide styles.
let
styleToClassCache
=
{},
styleToClassCacheWithMode
=
{}
function
interpretTokenStyle
(
style
,
options
)
{
if
(
!
style
||
/^
\s
*$/
.
test
(
style
))
return
null
let
cache
=
options
.
addModeClass
?
styleToClassCacheWithMode
:
styleToClassCache
return
cache
[
style
]
||
(
cache
[
style
]
=
style
.
replace
(
/
\S
+/g
,
"
cm-$&
"
))
}
// Render the DOM representation of the text of a line. Also builds
// up a 'line map', which points at the DOM nodes that represent
// specific stretches of text, and is used by the measuring code.
// The returned object contains the DOM node, this map, and
// information about line-wide styles that were set by the mode.
export
function
buildLineContent
(
cm
,
lineView
)
{
// The padding-right forces the element to have a 'border', which
// is needed on Webkit to be able to get line-level bounding
// rectangles for it (in measureChar).
let
content
=
elt
(
"
span
"
,
null
,
null
,
webkit
?
"
padding-right: .1px
"
:
null
)
let
builder
=
{
pre
:
elt
(
"
pre
"
,
[
content
],
"
CodeMirror-line
"
),
content
:
content
,
col
:
0
,
pos
:
0
,
cm
:
cm
,
trailingSpace
:
false
,
splitSpaces
:
(
ie
||
webkit
)
&&
cm
.
getOption
(
"
lineWrapping
"
)}
// hide from accessibility tree
content
.
setAttribute
(
"
role
"
,
"
presentation
"
)
builder
.
pre
.
setAttribute
(
"
role
"
,
"
presentation
"
)
lineView
.
measure
=
{}
// Iterate over the logical lines that make up this visual line.
for
(
let
i
=
0
;
i
<=
(
lineView
.
rest
?
lineView
.
rest
.
length
:
0
);
i
++
)
{
let
line
=
i
?
lineView
.
rest
[
i
-
1
]
:
lineView
.
line
,
order
builder
.
pos
=
0
builder
.
addToken
=
buildToken
// Optionally wire in some hacks into the token-rendering
// algorithm, to deal with browser quirks.
if
(
hasBadBidiRects
(
cm
.
display
.
measure
)
&&
(
order
=
getOrder
(
line
)))
builder
.
addToken
=
buildTokenBadBidi
(
builder
.
addToken
,
order
)
builder
.
map
=
[]
let
allowFrontierUpdate
=
lineView
!=
cm
.
display
.
externalMeasured
&&
lineNo
(
line
)
insertLineContent
(
line
,
builder
,
getLineStyles
(
cm
,
line
,
allowFrontierUpdate
))
if
(
line
.
styleClasses
)
{
if
(
line
.
styleClasses
.
bgClass
)
builder
.
bgClass
=
joinClasses
(
line
.
styleClasses
.
bgClass
,
builder
.
bgClass
||
""
)
if
(
line
.
styleClasses
.
textClass
)
builder
.
textClass
=
joinClasses
(
line
.
styleClasses
.
textClass
,
builder
.
textClass
||
""
)
}
// Ensure at least a single node is present, for measuring.
if
(
builder
.
map
.
length
==
0
)
builder
.
map
.
push
(
0
,
0
,
builder
.
content
.
appendChild
(
zeroWidthElement
(
cm
.
display
.
measure
)))
// Store the map and a cache object for the current logical line
if
(
i
==
0
)
{
lineView
.
measure
.
map
=
builder
.
map
lineView
.
measure
.
cache
=
{}
}
else
{
;(
lineView
.
measure
.
maps
||
(
lineView
.
measure
.
maps
=
[])).
push
(
builder
.
map
)
;(
lineView
.
measure
.
caches
||
(
lineView
.
measure
.
caches
=
[])).
push
({})
}
}
// See issue #2901
if
(
webkit
)
{
let
last
=
builder
.
content
.
lastChild
if
(
/
\b
cm-tab
\b
/
.
test
(
last
.
className
)
||
(
last
.
querySelector
&&
last
.
querySelector
(
"
.cm-tab
"
)))
builder
.
content
.
className
=
"
cm-tab-wrap-hack
"
}
signal
(
cm
,
"
renderLine
"
,
cm
,
lineView
.
line
,
builder
.
pre
)
if
(
builder
.
pre
.
className
)
builder
.
textClass
=
joinClasses
(
builder
.
pre
.
className
,
builder
.
textClass
||
""
)
return
builder
}
export
function
defaultSpecialCharPlaceholder
(
ch
)
{
let
token
=
elt
(
"
span
"
,
"
\
u2022
"
,
"
cm-invalidchar
"
)
token
.
title
=
"
\\
u
"
+
ch
.
charCodeAt
(
0
).
toString
(
16
)
token
.
setAttribute
(
"
aria-label
"
,
token
.
title
)
return
token
}
// Build up the DOM representation for a single token, and add it to
// the line map. Takes care to render special characters separately.
function
buildToken
(
builder
,
text
,
style
,
startStyle
,
endStyle
,
title
,
css
)
{
if
(
!
text
)
return
let
displayText
=
builder
.
splitSpaces
?
splitSpaces
(
text
,
builder
.
trailingSpace
)
:
text
let
special
=
builder
.
cm
.
state
.
specialChars
,
mustWrap
=
false
let
content
if
(
!
special
.
test
(
text
))
{
builder
.
col
+=
text
.
length
content
=
document
.
createTextNode
(
displayText
)
builder
.
map
.
push
(
builder
.
pos
,
builder
.
pos
+
text
.
length
,
content
)
if
(
ie
&&
ie_version
<
9
)
mustWrap
=
true
builder
.
pos
+=
text
.
length
}
else
{
content
=
document
.
createDocumentFragment
()
let
pos
=
0
while
(
true
)
{
special
.
lastIndex
=
pos
let
m
=
special
.
exec
(
text
)
let
skipped
=
m
?
m
.
index
-
pos
:
text
.
length
-
pos
if
(
skipped
)
{
let
txt
=
document
.
createTextNode
(
displayText
.
slice
(
pos
,
pos
+
skipped
))
if
(
ie
&&
ie_version
<
9
)
content
.
appendChild
(
elt
(
"
span
"
,
[
txt
]))
else
content
.
appendChild
(
txt
)
builder
.
map
.
push
(
builder
.
pos
,
builder
.
pos
+
skipped
,
txt
)
builder
.
col
+=
skipped
builder
.
pos
+=
skipped
}
if
(
!
m
)
break
pos
+=
skipped
+
1
let
txt
if
(
m
[
0
]
==
"
\t
"
)
{
let
tabSize
=
builder
.
cm
.
options
.
tabSize
,
tabWidth
=
tabSize
-
builder
.
col
%
tabSize
txt
=
content
.
appendChild
(
elt
(
"
span
"
,
spaceStr
(
tabWidth
),
"
cm-tab
"
))
txt
.
setAttribute
(
"
role
"
,
"
presentation
"
)
txt
.
setAttribute
(
"
cm-text
"
,
"
\t
"
)
builder
.
col
+=
tabWidth
}
else
if
(
m
[
0
]
==
"
\r
"
||
m
[
0
]
==
"
\n
"
)
{
txt
=
content
.
appendChild
(
elt
(
"
span
"
,
m
[
0
]
==
"
\r
"
?
"
\
u240d
"
:
"
\
u2424
"
,
"
cm-invalidchar
"
))
txt
.
setAttribute
(
"
cm-text
"
,
m
[
0
])
builder
.
col
+=
1
}
else
{
txt
=
builder
.
cm
.
options
.
specialCharPlaceholder
(
m
[
0
])
txt
.
setAttribute
(
"
cm-text
"
,
m
[
0
])
if
(
ie
&&
ie_version
<
9
)
content
.
appendChild
(
elt
(
"
span
"
,
[
txt
]))
else
content
.
appendChild
(
txt
)
builder
.
col
+=
1
}
builder
.
map
.
push
(
builder
.
pos
,
builder
.
pos
+
1
,
txt
)
builder
.
pos
++
}
}
builder
.
trailingSpace
=
displayText
.
charCodeAt
(
text
.
length
-
1
)
==
32
if
(
style
||
startStyle
||
endStyle
||
mustWrap
||
css
)
{
let
fullStyle
=
style
||
""
if
(
startStyle
)
fullStyle
+=
startStyle
if
(
endStyle
)
fullStyle
+=
endStyle
let
token
=
elt
(
"
span
"
,
[
content
],
fullStyle
,
css
)
if
(
title
)
token
.
title
=
title
return
builder
.
content
.
appendChild
(
token
)
}
builder
.
content
.
appendChild
(
content
)
}
function
splitSpaces
(
text
,
trailingBefore
)
{
if
(
text
.
length
>
1
&&
!
/ /
.
test
(
text
))
return
text
let
spaceBefore
=
trailingBefore
,
result
=
""
for
(
let
i
=
0
;
i
<
text
.
length
;
i
++
)
{
let
ch
=
text
.
charAt
(
i
)
if
(
ch
==
"
"
&&
spaceBefore
&&
(
i
==
text
.
length
-
1
||
text
.
charCodeAt
(
i
+
1
)
==
32
))
ch
=
"
\
u00a0
"
result
+=
ch
spaceBefore
=
ch
==
"
"
}
return
result
}
// Work around nonsense dimensions being reported for stretches of
// right-to-left text.
function
buildTokenBadBidi
(
inner
,
order
)
{
return
(
builder
,
text
,
style
,
startStyle
,
endStyle
,
title
,
css
)
=>
{
style
=
style
?
style
+
"
cm-force-border
"
:
"
cm-force-border
"
let
start
=
builder
.
pos
,
end
=
start
+
text
.
length
for
(;;)
{
// Find the part that overlaps with the start of this text
let
part
for
(
let
i
=
0
;
i
<
order
.
length
;
i
++
)
{
part
=
order
[
i
]
if
(
part
.
to
>
start
&&
part
.
from
<=
start
)
break
}
if
(
part
.
to
>=
end
)
return
inner
(
builder
,
text
,
style
,
startStyle
,
endStyle
,
title
,
css
)
inner
(
builder
,
text
.
slice
(
0
,
part
.
to
-
start
),
style
,
startStyle
,
null
,
title
,
css
)
startStyle
=
null
text
=
text
.
slice
(
part
.
to
-
start
)
start
=
part
.
to
}
}
}
function
buildCollapsedSpan
(
builder
,
size
,
marker
,
ignoreWidget
)
{
let
widget
=
!
ignoreWidget
&&
marker
.
widgetNode
if
(
widget
)
builder
.
map
.
push
(
builder
.
pos
,
builder
.
pos
+
size
,
widget
)
if
(
!
ignoreWidget
&&
builder
.
cm
.
display
.
input
.
needsContentAttribute
)
{
if
(
!
widget
)
widget
=
builder
.
content
.
appendChild
(
document
.
createElement
(
"
span
"
))
widget
.
setAttribute
(
"
cm-marker
"
,
marker
.
id
)
}
if
(
widget
)
{
builder
.
cm
.
display
.
input
.
setUneditable
(
widget
)
builder
.
content
.
appendChild
(
widget
)
}
builder
.
pos
+=
size
builder
.
trailingSpace
=
false
}
// Outputs a number of spans to make up a line, taking highlighting
// and marked text into account.
function
insertLineContent
(
line
,
builder
,
styles
)
{
let
spans
=
line
.
markedSpans
,
allText
=
line
.
text
,
at
=
0
if
(
!
spans
)
{
for
(
let
i
=
1
;
i
<
styles
.
length
;
i
+=
2
)
builder
.
addToken
(
builder
,
allText
.
slice
(
at
,
at
=
styles
[
i
]),
interpretTokenStyle
(
styles
[
i
+
1
],
builder
.
cm
.
options
))
return
}
let
len
=
allText
.
length
,
pos
=
0
,
i
=
1
,
text
=
""
,
style
,
css
let
nextChange
=
0
,
spanStyle
,
spanEndStyle
,
spanStartStyle
,
title
,
collapsed
for
(;;)
{
if
(
nextChange
==
pos
)
{
// Update current marker set
spanStyle
=
spanEndStyle
=
spanStartStyle
=
title
=
css
=
""
collapsed
=
null
;
nextChange
=
Infinity
let
foundBookmarks
=
[],
endStyles
for
(
let
j
=
0
;
j
<
spans
.
length
;
++
j
)
{
let
sp
=
spans
[
j
],
m
=
sp
.
marker
if
(
m
.
type
==
"
bookmark
"
&&
sp
.
from
==
pos
&&
m
.
widgetNode
)
{
foundBookmarks
.
push
(
m
)
}
else
if
(
sp
.
from
<=
pos
&&
(
sp
.
to
==
null
||
sp
.
to
>
pos
||
m
.
collapsed
&&
sp
.
to
==
pos
&&
sp
.
from
==
pos
))
{
if
(
sp
.
to
!=
null
&&
sp
.
to
!=
pos
&&
nextChange
>
sp
.
to
)
{
nextChange
=
sp
.
to
spanEndStyle
=
""
}
if
(
m
.
className
)
spanStyle
+=
"
"
+
m
.
className
if
(
m
.
css
)
css
=
(
css
?
css
+
"
;
"
:
""
)
+
m
.
css
if
(
m
.
startStyle
&&
sp
.
from
==
pos
)
spanStartStyle
+=
"
"
+
m
.
startStyle
if
(
m
.
endStyle
&&
sp
.
to
==
nextChange
)
(
endStyles
||
(
endStyles
=
[])).
push
(
m
.
endStyle
,
sp
.
to
)
if
(
m
.
title
&&
!
title
)
title
=
m
.
title
if
(
m
.
collapsed
&&
(
!
collapsed
||
compareCollapsedMarkers
(
collapsed
.
marker
,
m
)
<
0
))
collapsed
=
sp
}
else
if
(
sp
.
from
>
pos
&&
nextChange
>
sp
.
from
)
{
nextChange
=
sp
.
from
}
}
if
(
endStyles
)
for
(
let
j
=
0
;
j
<
endStyles
.
length
;
j
+=
2
)
if
(
endStyles
[
j
+
1
]
==
nextChange
)
spanEndStyle
+=
"
"
+
endStyles
[
j
]
if
(
!
collapsed
||
collapsed
.
from
==
pos
)
for
(
let
j
=
0
;
j
<
foundBookmarks
.
length
;
++
j
)
buildCollapsedSpan
(
builder
,
0
,
foundBookmarks
[
j
])
if
(
collapsed
&&
(
collapsed
.
from
||
0
)
==
pos
)
{
buildCollapsedSpan
(
builder
,
(
collapsed
.
to
==
null
?
len
+
1
:
collapsed
.
to
)
-
pos
,
collapsed
.
marker
,
collapsed
.
from
==
null
)
if
(
collapsed
.
to
==
null
)
return
if
(
collapsed
.
to
==
pos
)
collapsed
=
false
}
}
if
(
pos
>=
len
)
break
let
upto
=
Math
.
min
(
len
,
nextChange
)
while
(
true
)
{
if
(
text
)
{
let
end
=
pos
+
text
.
length
if
(
!
collapsed
)
{
let
tokenText
=
end
>
upto
?
text
.
slice
(
0
,
upto
-
pos
)
:
text
builder
.
addToken
(
builder
,
tokenText
,
style
?
style
+
spanStyle
:
spanStyle
,
spanStartStyle
,
pos
+
tokenText
.
length
==
nextChange
?
spanEndStyle
:
""
,
title
,
css
)
}
if
(
end
>=
upto
)
{
text
=
text
.
slice
(
upto
-
pos
);
pos
=
upto
;
break
}
pos
=
end
spanStartStyle
=
""
}
text
=
allText
.
slice
(
at
,
at
=
styles
[
i
++
])
style
=
interpretTokenStyle
(
styles
[
i
++
],
builder
.
cm
.
options
)
}
}
}
// These objects are used to represent the visible (currently drawn)
// part of the document. A LineView may correspond to multiple
// logical lines, if those are connected by collapsed ranges.
export
function
LineView
(
doc
,
line
,
lineN
)
{
// The starting line
this
.
line
=
line
// Continuing lines, if any
this
.
rest
=
visualLineContinued
(
line
)
// Number of logical lines in this visual line
this
.
size
=
this
.
rest
?
lineNo
(
lst
(
this
.
rest
))
-
lineN
+
1
:
1
this
.
node
=
this
.
text
=
null
this
.
hidden
=
lineIsHidden
(
doc
,
line
)
}
// Create a range of LineView objects for the given lines.
export
function
buildViewArray
(
cm
,
from
,
to
)
{
let
array
=
[],
nextPos
for
(
let
pos
=
from
;
pos
<
to
;
pos
=
nextPos
)
{
let
view
=
new
LineView
(
cm
.
doc
,
getLine
(
cm
.
doc
,
pos
),
pos
)
nextPos
=
pos
+
view
.
size
array
.
push
(
view
)
}
return
array
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/line/line_data.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
line_data.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/line/pos.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
getLine
}
from
"
./utils_line
"
// A Pos instance represents a position within the text.
export
function
Pos
(
line
,
ch
,
sticky
=
null
)
{
if
(
!
(
this
instanceof
Pos
))
return
new
Pos
(
line
,
ch
,
sticky
)
this
.
line
=
line
this
.
ch
=
ch
this
.
sticky
=
sticky
}
// Compare two positions, return 0 if they are the same, a negative
// number when a is less, and a positive number otherwise.
export
function
cmp
(
a
,
b
)
{
return
a
.
line
-
b
.
line
||
a
.
ch
-
b
.
ch
}
export
function
equalCursorPos
(
a
,
b
)
{
return
a
.
sticky
==
b
.
sticky
&&
cmp
(
a
,
b
)
==
0
}
export
function
copyPos
(
x
)
{
return
Pos
(
x
.
line
,
x
.
ch
)}
export
function
maxPos
(
a
,
b
)
{
return
cmp
(
a
,
b
)
<
0
?
b
:
a
}
export
function
minPos
(
a
,
b
)
{
return
cmp
(
a
,
b
)
<
0
?
a
:
b
}
// Most of the external API clips given positions to make sure they
// actually exist within the document.
export
function
clipLine
(
doc
,
n
)
{
return
Math
.
max
(
doc
.
first
,
Math
.
min
(
n
,
doc
.
first
+
doc
.
size
-
1
))}
export
function
clipPos
(
doc
,
pos
)
{
if
(
pos
.
line
<
doc
.
first
)
return
Pos
(
doc
.
first
,
0
)
let
last
=
doc
.
first
+
doc
.
size
-
1
if
(
pos
.
line
>
last
)
return
Pos
(
last
,
getLine
(
doc
,
last
).
text
.
length
)
return
clipToLen
(
pos
,
getLine
(
doc
,
pos
.
line
).
text
.
length
)
}
function
clipToLen
(
pos
,
linelen
)
{
let
ch
=
pos
.
ch
if
(
ch
==
null
||
ch
>
linelen
)
return
Pos
(
pos
.
line
,
linelen
)
else
if
(
ch
<
0
)
return
Pos
(
pos
.
line
,
0
)
else
return
pos
}
export
function
clipPosArray
(
doc
,
array
)
{
let
out
=
[]
for
(
let
i
=
0
;
i
<
array
.
length
;
i
++
)
out
[
i
]
=
clipPos
(
doc
,
array
[
i
])
return
out
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/line/pos.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
pos.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/line/saw_special_spans.js.js
deleted
100644 → 0
View file @
a3a26621
// Optimize some code when these features are not used.
export
let
sawReadOnlySpans
=
false
,
sawCollapsedSpans
=
false
export
function
seeReadOnlySpans
()
{
sawReadOnlySpans
=
true
}
export
function
seeCollapsedSpans
()
{
sawCollapsedSpans
=
true
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/line/saw_special_spans.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
saw_special_spans.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/line/spans.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
indexOf
,
lst
}
from
"
../util/misc
"
import
{
cmp
}
from
"
./pos
"
import
{
sawCollapsedSpans
}
from
"
./saw_special_spans
"
import
{
getLine
,
isLine
,
lineNo
}
from
"
./utils_line
"
// TEXTMARKER SPANS
export
function
MarkedSpan
(
marker
,
from
,
to
)
{
this
.
marker
=
marker
this
.
from
=
from
;
this
.
to
=
to
}
// Search an array of spans for a span matching the given marker.
export
function
getMarkedSpanFor
(
spans
,
marker
)
{
if
(
spans
)
for
(
let
i
=
0
;
i
<
spans
.
length
;
++
i
)
{
let
span
=
spans
[
i
]
if
(
span
.
marker
==
marker
)
return
span
}
}
// Remove a span from an array, returning undefined if no spans are
// left (we don't store arrays for lines without spans).
export
function
removeMarkedSpan
(
spans
,
span
)
{
let
r
for
(
let
i
=
0
;
i
<
spans
.
length
;
++
i
)
if
(
spans
[
i
]
!=
span
)
(
r
||
(
r
=
[])).
push
(
spans
[
i
])
return
r
}
// Add a span to a line.
export
function
addMarkedSpan
(
line
,
span
)
{
line
.
markedSpans
=
line
.
markedSpans
?
line
.
markedSpans
.
concat
([
span
])
:
[
span
]
span
.
marker
.
attachLine
(
line
)
}
// Used for the algorithm that adjusts markers for a change in the
// document. These functions cut an array of spans at a given
// character position, returning an array of remaining chunks (or
// undefined if nothing remains).
function
markedSpansBefore
(
old
,
startCh
,
isInsert
)
{
let
nw
if
(
old
)
for
(
let
i
=
0
;
i
<
old
.
length
;
++
i
)
{
let
span
=
old
[
i
],
marker
=
span
.
marker
let
startsBefore
=
span
.
from
==
null
||
(
marker
.
inclusiveLeft
?
span
.
from
<=
startCh
:
span
.
from
<
startCh
)
if
(
startsBefore
||
span
.
from
==
startCh
&&
marker
.
type
==
"
bookmark
"
&&
(
!
isInsert
||
!
span
.
marker
.
insertLeft
))
{
let
endsAfter
=
span
.
to
==
null
||
(
marker
.
inclusiveRight
?
span
.
to
>=
startCh
:
span
.
to
>
startCh
)
;(
nw
||
(
nw
=
[])).
push
(
new
MarkedSpan
(
marker
,
span
.
from
,
endsAfter
?
null
:
span
.
to
))
}
}
return
nw
}
function
markedSpansAfter
(
old
,
endCh
,
isInsert
)
{
let
nw
if
(
old
)
for
(
let
i
=
0
;
i
<
old
.
length
;
++
i
)
{
let
span
=
old
[
i
],
marker
=
span
.
marker
let
endsAfter
=
span
.
to
==
null
||
(
marker
.
inclusiveRight
?
span
.
to
>=
endCh
:
span
.
to
>
endCh
)
if
(
endsAfter
||
span
.
from
==
endCh
&&
marker
.
type
==
"
bookmark
"
&&
(
!
isInsert
||
span
.
marker
.
insertLeft
))
{
let
startsBefore
=
span
.
from
==
null
||
(
marker
.
inclusiveLeft
?
span
.
from
<=
endCh
:
span
.
from
<
endCh
)
;(
nw
||
(
nw
=
[])).
push
(
new
MarkedSpan
(
marker
,
startsBefore
?
null
:
span
.
from
-
endCh
,
span
.
to
==
null
?
null
:
span
.
to
-
endCh
))
}
}
return
nw
}
// Given a change object, compute the new set of marker spans that
// cover the line in which the change took place. Removes spans
// entirely within the change, reconnects spans belonging to the
// same marker that appear on both sides of the change, and cuts off
// spans partially within the change. Returns an array of span
// arrays with one element for each line in (after) the change.
export
function
stretchSpansOverChange
(
doc
,
change
)
{
if
(
change
.
full
)
return
null
let
oldFirst
=
isLine
(
doc
,
change
.
from
.
line
)
&&
getLine
(
doc
,
change
.
from
.
line
).
markedSpans
let
oldLast
=
isLine
(
doc
,
change
.
to
.
line
)
&&
getLine
(
doc
,
change
.
to
.
line
).
markedSpans
if
(
!
oldFirst
&&
!
oldLast
)
return
null
let
startCh
=
change
.
from
.
ch
,
endCh
=
change
.
to
.
ch
,
isInsert
=
cmp
(
change
.
from
,
change
.
to
)
==
0
// Get the spans that 'stick out' on both sides
let
first
=
markedSpansBefore
(
oldFirst
,
startCh
,
isInsert
)
let
last
=
markedSpansAfter
(
oldLast
,
endCh
,
isInsert
)
// Next, merge those two ends
let
sameLine
=
change
.
text
.
length
==
1
,
offset
=
lst
(
change
.
text
).
length
+
(
sameLine
?
startCh
:
0
)
if
(
first
)
{
// Fix up .to properties of first
for
(
let
i
=
0
;
i
<
first
.
length
;
++
i
)
{
let
span
=
first
[
i
]
if
(
span
.
to
==
null
)
{
let
found
=
getMarkedSpanFor
(
last
,
span
.
marker
)
if
(
!
found
)
span
.
to
=
startCh
else
if
(
sameLine
)
span
.
to
=
found
.
to
==
null
?
null
:
found
.
to
+
offset
}
}
}
if
(
last
)
{
// Fix up .from in last (or move them into first in case of sameLine)
for
(
let
i
=
0
;
i
<
last
.
length
;
++
i
)
{
let
span
=
last
[
i
]
if
(
span
.
to
!=
null
)
span
.
to
+=
offset
if
(
span
.
from
==
null
)
{
let
found
=
getMarkedSpanFor
(
first
,
span
.
marker
)
if
(
!
found
)
{
span
.
from
=
offset
if
(
sameLine
)
(
first
||
(
first
=
[])).
push
(
span
)
}
}
else
{
span
.
from
+=
offset
if
(
sameLine
)
(
first
||
(
first
=
[])).
push
(
span
)
}
}
}
// Make sure we didn't create any zero-length spans
if
(
first
)
first
=
clearEmptySpans
(
first
)
if
(
last
&&
last
!=
first
)
last
=
clearEmptySpans
(
last
)
let
newMarkers
=
[
first
]
if
(
!
sameLine
)
{
// Fill gap with whole-line-spans
let
gap
=
change
.
text
.
length
-
2
,
gapMarkers
if
(
gap
>
0
&&
first
)
for
(
let
i
=
0
;
i
<
first
.
length
;
++
i
)
if
(
first
[
i
].
to
==
null
)
(
gapMarkers
||
(
gapMarkers
=
[])).
push
(
new
MarkedSpan
(
first
[
i
].
marker
,
null
,
null
))
for
(
let
i
=
0
;
i
<
gap
;
++
i
)
newMarkers
.
push
(
gapMarkers
)
newMarkers
.
push
(
last
)
}
return
newMarkers
}
// Remove spans that are empty and don't have a clearWhenEmpty
// option of false.
function
clearEmptySpans
(
spans
)
{
for
(
let
i
=
0
;
i
<
spans
.
length
;
++
i
)
{
let
span
=
spans
[
i
]
if
(
span
.
from
!=
null
&&
span
.
from
==
span
.
to
&&
span
.
marker
.
clearWhenEmpty
!==
false
)
spans
.
splice
(
i
--
,
1
)
}
if
(
!
spans
.
length
)
return
null
return
spans
}
// Used to 'clip' out readOnly ranges when making a change.
export
function
removeReadOnlyRanges
(
doc
,
from
,
to
)
{
let
markers
=
null
doc
.
iter
(
from
.
line
,
to
.
line
+
1
,
line
=>
{
if
(
line
.
markedSpans
)
for
(
let
i
=
0
;
i
<
line
.
markedSpans
.
length
;
++
i
)
{
let
mark
=
line
.
markedSpans
[
i
].
marker
if
(
mark
.
readOnly
&&
(
!
markers
||
indexOf
(
markers
,
mark
)
==
-
1
))
(
markers
||
(
markers
=
[])).
push
(
mark
)
}
})
if
(
!
markers
)
return
null
let
parts
=
[{
from
:
from
,
to
:
to
}]
for
(
let
i
=
0
;
i
<
markers
.
length
;
++
i
)
{
let
mk
=
markers
[
i
],
m
=
mk
.
find
(
0
)
for
(
let
j
=
0
;
j
<
parts
.
length
;
++
j
)
{
let
p
=
parts
[
j
]
if
(
cmp
(
p
.
to
,
m
.
from
)
<
0
||
cmp
(
p
.
from
,
m
.
to
)
>
0
)
continue
let
newParts
=
[
j
,
1
],
dfrom
=
cmp
(
p
.
from
,
m
.
from
),
dto
=
cmp
(
p
.
to
,
m
.
to
)
if
(
dfrom
<
0
||
!
mk
.
inclusiveLeft
&&
!
dfrom
)
newParts
.
push
({
from
:
p
.
from
,
to
:
m
.
from
})
if
(
dto
>
0
||
!
mk
.
inclusiveRight
&&
!
dto
)
newParts
.
push
({
from
:
m
.
to
,
to
:
p
.
to
})
parts
.
splice
.
apply
(
parts
,
newParts
)
j
+=
newParts
.
length
-
3
}
}
return
parts
}
// Connect or disconnect spans from a line.
export
function
detachMarkedSpans
(
line
)
{
let
spans
=
line
.
markedSpans
if
(
!
spans
)
return
for
(
let
i
=
0
;
i
<
spans
.
length
;
++
i
)
spans
[
i
].
marker
.
detachLine
(
line
)
line
.
markedSpans
=
null
}
export
function
attachMarkedSpans
(
line
,
spans
)
{
if
(
!
spans
)
return
for
(
let
i
=
0
;
i
<
spans
.
length
;
++
i
)
spans
[
i
].
marker
.
attachLine
(
line
)
line
.
markedSpans
=
spans
}
// Helpers used when computing which overlapping collapsed span
// counts as the larger one.
function
extraLeft
(
marker
)
{
return
marker
.
inclusiveLeft
?
-
1
:
0
}
function
extraRight
(
marker
)
{
return
marker
.
inclusiveRight
?
1
:
0
}
// Returns a number indicating which of two overlapping collapsed
// spans is larger (and thus includes the other). Falls back to
// comparing ids when the spans cover exactly the same range.
export
function
compareCollapsedMarkers
(
a
,
b
)
{
let
lenDiff
=
a
.
lines
.
length
-
b
.
lines
.
length
if
(
lenDiff
!=
0
)
return
lenDiff
let
aPos
=
a
.
find
(),
bPos
=
b
.
find
()
let
fromCmp
=
cmp
(
aPos
.
from
,
bPos
.
from
)
||
extraLeft
(
a
)
-
extraLeft
(
b
)
if
(
fromCmp
)
return
-
fromCmp
let
toCmp
=
cmp
(
aPos
.
to
,
bPos
.
to
)
||
extraRight
(
a
)
-
extraRight
(
b
)
if
(
toCmp
)
return
toCmp
return
b
.
id
-
a
.
id
}
// Find out whether a line ends or starts in a collapsed span. If
// so, return the marker for that span.
function
collapsedSpanAtSide
(
line
,
start
)
{
let
sps
=
sawCollapsedSpans
&&
line
.
markedSpans
,
found
if
(
sps
)
for
(
let
sp
,
i
=
0
;
i
<
sps
.
length
;
++
i
)
{
sp
=
sps
[
i
]
if
(
sp
.
marker
.
collapsed
&&
(
start
?
sp
.
from
:
sp
.
to
)
==
null
&&
(
!
found
||
compareCollapsedMarkers
(
found
,
sp
.
marker
)
<
0
))
found
=
sp
.
marker
}
return
found
}
export
function
collapsedSpanAtStart
(
line
)
{
return
collapsedSpanAtSide
(
line
,
true
)
}
export
function
collapsedSpanAtEnd
(
line
)
{
return
collapsedSpanAtSide
(
line
,
false
)
}
// Test whether there exists a collapsed span that partially
// overlaps (covers the start or end, but not both) of a new span.
// Such overlap is not allowed.
export
function
conflictingCollapsedRange
(
doc
,
lineNo
,
from
,
to
,
marker
)
{
let
line
=
getLine
(
doc
,
lineNo
)
let
sps
=
sawCollapsedSpans
&&
line
.
markedSpans
if
(
sps
)
for
(
let
i
=
0
;
i
<
sps
.
length
;
++
i
)
{
let
sp
=
sps
[
i
]
if
(
!
sp
.
marker
.
collapsed
)
continue
let
found
=
sp
.
marker
.
find
(
0
)
let
fromCmp
=
cmp
(
found
.
from
,
from
)
||
extraLeft
(
sp
.
marker
)
-
extraLeft
(
marker
)
let
toCmp
=
cmp
(
found
.
to
,
to
)
||
extraRight
(
sp
.
marker
)
-
extraRight
(
marker
)
if
(
fromCmp
>=
0
&&
toCmp
<=
0
||
fromCmp
<=
0
&&
toCmp
>=
0
)
continue
if
(
fromCmp
<=
0
&&
(
sp
.
marker
.
inclusiveRight
&&
marker
.
inclusiveLeft
?
cmp
(
found
.
to
,
from
)
>=
0
:
cmp
(
found
.
to
,
from
)
>
0
)
||
fromCmp
>=
0
&&
(
sp
.
marker
.
inclusiveRight
&&
marker
.
inclusiveLeft
?
cmp
(
found
.
from
,
to
)
<=
0
:
cmp
(
found
.
from
,
to
)
<
0
))
return
true
}
}
// A visual line is a line as drawn on the screen. Folding, for
// example, can cause multiple logical lines to appear on the same
// visual line. This finds the start of the visual line that the
// given line is part of (usually that is the line itself).
export
function
visualLine
(
line
)
{
let
merged
while
(
merged
=
collapsedSpanAtStart
(
line
))
line
=
merged
.
find
(
-
1
,
true
).
line
return
line
}
export
function
visualLineEnd
(
line
)
{
let
merged
while
(
merged
=
collapsedSpanAtEnd
(
line
))
line
=
merged
.
find
(
1
,
true
).
line
return
line
}
// Returns an array of logical lines that continue the visual line
// started by the argument, or undefined if there are no such lines.
export
function
visualLineContinued
(
line
)
{
let
merged
,
lines
while
(
merged
=
collapsedSpanAtEnd
(
line
))
{
line
=
merged
.
find
(
1
,
true
).
line
;(
lines
||
(
lines
=
[])).
push
(
line
)
}
return
lines
}
// Get the line number of the start of the visual line that the
// given line number is part of.
export
function
visualLineNo
(
doc
,
lineN
)
{
let
line
=
getLine
(
doc
,
lineN
),
vis
=
visualLine
(
line
)
if
(
line
==
vis
)
return
lineN
return
lineNo
(
vis
)
}
// Get the line number of the start of the next visual line after
// the given line.
export
function
visualLineEndNo
(
doc
,
lineN
)
{
if
(
lineN
>
doc
.
lastLine
())
return
lineN
let
line
=
getLine
(
doc
,
lineN
),
merged
if
(
!
lineIsHidden
(
doc
,
line
))
return
lineN
while
(
merged
=
collapsedSpanAtEnd
(
line
))
line
=
merged
.
find
(
1
,
true
).
line
return
lineNo
(
line
)
+
1
}
// Compute whether a line is hidden. Lines count as hidden when they
// are part of a visual line that starts with another line, or when
// they are entirely covered by collapsed, non-widget span.
export
function
lineIsHidden
(
doc
,
line
)
{
let
sps
=
sawCollapsedSpans
&&
line
.
markedSpans
if
(
sps
)
for
(
let
sp
,
i
=
0
;
i
<
sps
.
length
;
++
i
)
{
sp
=
sps
[
i
]
if
(
!
sp
.
marker
.
collapsed
)
continue
if
(
sp
.
from
==
null
)
return
true
if
(
sp
.
marker
.
widgetNode
)
continue
if
(
sp
.
from
==
0
&&
sp
.
marker
.
inclusiveLeft
&&
lineIsHiddenInner
(
doc
,
line
,
sp
))
return
true
}
}
function
lineIsHiddenInner
(
doc
,
line
,
span
)
{
if
(
span
.
to
==
null
)
{
let
end
=
span
.
marker
.
find
(
1
,
true
)
return
lineIsHiddenInner
(
doc
,
end
.
line
,
getMarkedSpanFor
(
end
.
line
.
markedSpans
,
span
.
marker
))
}
if
(
span
.
marker
.
inclusiveRight
&&
span
.
to
==
line
.
text
.
length
)
return
true
for
(
let
sp
,
i
=
0
;
i
<
line
.
markedSpans
.
length
;
++
i
)
{
sp
=
line
.
markedSpans
[
i
]
if
(
sp
.
marker
.
collapsed
&&
!
sp
.
marker
.
widgetNode
&&
sp
.
from
==
span
.
to
&&
(
sp
.
to
==
null
||
sp
.
to
!=
span
.
from
)
&&
(
sp
.
marker
.
inclusiveLeft
||
span
.
marker
.
inclusiveRight
)
&&
lineIsHiddenInner
(
doc
,
line
,
sp
))
return
true
}
}
// Find the height above the given line.
export
function
heightAtLine
(
lineObj
)
{
lineObj
=
visualLine
(
lineObj
)
let
h
=
0
,
chunk
=
lineObj
.
parent
for
(
let
i
=
0
;
i
<
chunk
.
lines
.
length
;
++
i
)
{
let
line
=
chunk
.
lines
[
i
]
if
(
line
==
lineObj
)
break
else
h
+=
line
.
height
}
for
(
let
p
=
chunk
.
parent
;
p
;
chunk
=
p
,
p
=
chunk
.
parent
)
{
for
(
let
i
=
0
;
i
<
p
.
children
.
length
;
++
i
)
{
let
cur
=
p
.
children
[
i
]
if
(
cur
==
chunk
)
break
else
h
+=
cur
.
height
}
}
return
h
}
// Compute the character length of a line, taking into account
// collapsed ranges (see markText) that might hide parts, and join
// other lines onto it.
export
function
lineLength
(
line
)
{
if
(
line
.
height
==
0
)
return
0
let
len
=
line
.
text
.
length
,
merged
,
cur
=
line
while
(
merged
=
collapsedSpanAtStart
(
cur
))
{
let
found
=
merged
.
find
(
0
,
true
)
cur
=
found
.
from
.
line
len
+=
found
.
from
.
ch
-
found
.
to
.
ch
}
cur
=
line
while
(
merged
=
collapsedSpanAtEnd
(
cur
))
{
let
found
=
merged
.
find
(
0
,
true
)
len
-=
cur
.
text
.
length
-
found
.
from
.
ch
cur
=
found
.
to
.
line
len
+=
cur
.
text
.
length
-
found
.
to
.
ch
}
return
len
}
// Find the longest line in the document.
export
function
findMaxLine
(
cm
)
{
let
d
=
cm
.
display
,
doc
=
cm
.
doc
d
.
maxLine
=
getLine
(
doc
,
doc
.
first
)
d
.
maxLineLength
=
lineLength
(
d
.
maxLine
)
d
.
maxLineChanged
=
true
doc
.
iter
(
line
=>
{
let
len
=
lineLength
(
line
)
if
(
len
>
d
.
maxLineLength
)
{
d
.
maxLineLength
=
len
d
.
maxLine
=
line
}
})
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/line/spans.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
spans.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/line/utils_line.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
indexOf
}
from
"
../util/misc
"
// Find the line object corresponding to the given line number.
export
function
getLine
(
doc
,
n
)
{
n
-=
doc
.
first
if
(
n
<
0
||
n
>=
doc
.
size
)
throw
new
Error
(
"
There is no line
"
+
(
n
+
doc
.
first
)
+
"
in the document.
"
)
let
chunk
=
doc
while
(
!
chunk
.
lines
)
{
for
(
let
i
=
0
;;
++
i
)
{
let
child
=
chunk
.
children
[
i
],
sz
=
child
.
chunkSize
()
if
(
n
<
sz
)
{
chunk
=
child
;
break
}
n
-=
sz
}
}
return
chunk
.
lines
[
n
]
}
// Get the part of a document between two positions, as an array of
// strings.
export
function
getBetween
(
doc
,
start
,
end
)
{
let
out
=
[],
n
=
start
.
line
doc
.
iter
(
start
.
line
,
end
.
line
+
1
,
line
=>
{
let
text
=
line
.
text
if
(
n
==
end
.
line
)
text
=
text
.
slice
(
0
,
end
.
ch
)
if
(
n
==
start
.
line
)
text
=
text
.
slice
(
start
.
ch
)
out
.
push
(
text
)
++
n
})
return
out
}
// Get the lines between from and to, as array of strings.
export
function
getLines
(
doc
,
from
,
to
)
{
let
out
=
[]
doc
.
iter
(
from
,
to
,
line
=>
{
out
.
push
(
line
.
text
)
})
// iter aborts when callback returns truthy value
return
out
}
// Update the height of a line, propagating the height change
// upwards to parent nodes.
export
function
updateLineHeight
(
line
,
height
)
{
let
diff
=
height
-
line
.
height
if
(
diff
)
for
(
let
n
=
line
;
n
;
n
=
n
.
parent
)
n
.
height
+=
diff
}
// Given a line object, find its line number by walking up through
// its parent links.
export
function
lineNo
(
line
)
{
if
(
line
.
parent
==
null
)
return
null
let
cur
=
line
.
parent
,
no
=
indexOf
(
cur
.
lines
,
line
)
for
(
let
chunk
=
cur
.
parent
;
chunk
;
cur
=
chunk
,
chunk
=
chunk
.
parent
)
{
for
(
let
i
=
0
;;
++
i
)
{
if
(
chunk
.
children
[
i
]
==
cur
)
break
no
+=
chunk
.
children
[
i
].
chunkSize
()
}
}
return
no
+
cur
.
first
}
// Find the line at the given vertical position, using the height
// information in the document tree.
export
function
lineAtHeight
(
chunk
,
h
)
{
let
n
=
chunk
.
first
outer
:
do
{
for
(
let
i
=
0
;
i
<
chunk
.
children
.
length
;
++
i
)
{
let
child
=
chunk
.
children
[
i
],
ch
=
child
.
height
if
(
h
<
ch
)
{
chunk
=
child
;
continue
outer
}
h
-=
ch
n
+=
child
.
chunkSize
()
}
return
n
}
while
(
!
chunk
.
lines
)
let
i
=
0
for
(;
i
<
chunk
.
lines
.
length
;
++
i
)
{
let
line
=
chunk
.
lines
[
i
],
lh
=
line
.
height
if
(
h
<
lh
)
break
h
-=
lh
}
return
n
+
i
}
export
function
isLine
(
doc
,
l
)
{
return
l
>=
doc
.
first
&&
l
<
doc
.
first
+
doc
.
size
}
export
function
lineNumberFor
(
options
,
i
)
{
return
String
(
options
.
lineNumberFormatter
(
i
+
options
.
firstLineNumber
))
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/line/utils_line.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
utils_line.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/measurement.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"Folder"
module=
"OFS.Folder"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_objects
</string>
</key>
<value>
<tuple/>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
measurement
</string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/measurement/position_measurement.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
moveVisually
}
from
"
../input/movement
"
import
{
buildLineContent
,
LineView
}
from
"
../line/line_data
"
import
{
clipPos
,
Pos
}
from
"
../line/pos
"
import
{
collapsedSpanAtEnd
,
heightAtLine
,
lineIsHidden
,
visualLine
}
from
"
../line/spans
"
import
{
getLine
,
lineAtHeight
,
lineNo
,
updateLineHeight
}
from
"
../line/utils_line
"
import
{
bidiOther
,
getBidiPartAt
,
getOrder
}
from
"
../util/bidi
"
import
{
ie
,
ie_version
}
from
"
../util/browser
"
import
{
elt
,
removeChildren
,
range
,
removeChildrenAndAdd
}
from
"
../util/dom
"
import
{
e_target
}
from
"
../util/event
"
import
{
hasBadZoomedRects
}
from
"
../util/feature_detection
"
import
{
countColumn
,
findFirst
,
isExtendingChar
,
scrollerGap
,
skipExtendingChars
}
from
"
../util/misc
"
import
{
updateLineForChanges
}
from
"
../display/update_line
"
import
{
widgetHeight
}
from
"
./widgets
"
// POSITION MEASUREMENT
export
function
paddingTop
(
display
)
{
return
display
.
lineSpace
.
offsetTop
}
export
function
paddingVert
(
display
)
{
return
display
.
mover
.
offsetHeight
-
display
.
lineSpace
.
offsetHeight
}
export
function
paddingH
(
display
)
{
if
(
display
.
cachedPaddingH
)
return
display
.
cachedPaddingH
let
e
=
removeChildrenAndAdd
(
display
.
measure
,
elt
(
"
pre
"
,
"
x
"
))
let
style
=
window
.
getComputedStyle
?
window
.
getComputedStyle
(
e
)
:
e
.
currentStyle
let
data
=
{
left
:
parseInt
(
style
.
paddingLeft
),
right
:
parseInt
(
style
.
paddingRight
)}
if
(
!
isNaN
(
data
.
left
)
&&
!
isNaN
(
data
.
right
))
display
.
cachedPaddingH
=
data
return
data
}
export
function
scrollGap
(
cm
)
{
return
scrollerGap
-
cm
.
display
.
nativeBarWidth
}
export
function
displayWidth
(
cm
)
{
return
cm
.
display
.
scroller
.
clientWidth
-
scrollGap
(
cm
)
-
cm
.
display
.
barWidth
}
export
function
displayHeight
(
cm
)
{
return
cm
.
display
.
scroller
.
clientHeight
-
scrollGap
(
cm
)
-
cm
.
display
.
barHeight
}
// Ensure the lineView.wrapping.heights array is populated. This is
// an array of bottom offsets for the lines that make up a drawn
// line. When lineWrapping is on, there might be more than one
// height.
function
ensureLineHeights
(
cm
,
lineView
,
rect
)
{
let
wrapping
=
cm
.
options
.
lineWrapping
let
curWidth
=
wrapping
&&
displayWidth
(
cm
)
if
(
!
lineView
.
measure
.
heights
||
wrapping
&&
lineView
.
measure
.
width
!=
curWidth
)
{
let
heights
=
lineView
.
measure
.
heights
=
[]
if
(
wrapping
)
{
lineView
.
measure
.
width
=
curWidth
let
rects
=
lineView
.
text
.
firstChild
.
getClientRects
()
for
(
let
i
=
0
;
i
<
rects
.
length
-
1
;
i
++
)
{
let
cur
=
rects
[
i
],
next
=
rects
[
i
+
1
]
if
(
Math
.
abs
(
cur
.
bottom
-
next
.
bottom
)
>
2
)
heights
.
push
((
cur
.
bottom
+
next
.
top
)
/
2
-
rect
.
top
)
}
}
heights
.
push
(
rect
.
bottom
-
rect
.
top
)
}
}
// Find a line map (mapping character offsets to text nodes) and a
// measurement cache for the given line number. (A line view might
// contain multiple lines when collapsed ranges are present.)
export
function
mapFromLineView
(
lineView
,
line
,
lineN
)
{
if
(
lineView
.
line
==
line
)
return
{
map
:
lineView
.
measure
.
map
,
cache
:
lineView
.
measure
.
cache
}
for
(
let
i
=
0
;
i
<
lineView
.
rest
.
length
;
i
++
)
if
(
lineView
.
rest
[
i
]
==
line
)
return
{
map
:
lineView
.
measure
.
maps
[
i
],
cache
:
lineView
.
measure
.
caches
[
i
]}
for
(
let
i
=
0
;
i
<
lineView
.
rest
.
length
;
i
++
)
if
(
lineNo
(
lineView
.
rest
[
i
])
>
lineN
)
return
{
map
:
lineView
.
measure
.
maps
[
i
],
cache
:
lineView
.
measure
.
caches
[
i
],
before
:
true
}
}
// Render a line into the hidden node display.externalMeasured. Used
// when measurement is needed for a line that's not in the viewport.
function
updateExternalMeasurement
(
cm
,
line
)
{
line
=
visualLine
(
line
)
let
lineN
=
lineNo
(
line
)
let
view
=
cm
.
display
.
externalMeasured
=
new
LineView
(
cm
.
doc
,
line
,
lineN
)
view
.
lineN
=
lineN
let
built
=
view
.
built
=
buildLineContent
(
cm
,
view
)
view
.
text
=
built
.
pre
removeChildrenAndAdd
(
cm
.
display
.
lineMeasure
,
built
.
pre
)
return
view
}
// Get a {top, bottom, left, right} box (in line-local coordinates)
// for a given character.
export
function
measureChar
(
cm
,
line
,
ch
,
bias
)
{
return
measureCharPrepared
(
cm
,
prepareMeasureForLine
(
cm
,
line
),
ch
,
bias
)
}
// Find a line view that corresponds to the given line number.
export
function
findViewForLine
(
cm
,
lineN
)
{
if
(
lineN
>=
cm
.
display
.
viewFrom
&&
lineN
<
cm
.
display
.
viewTo
)
return
cm
.
display
.
view
[
findViewIndex
(
cm
,
lineN
)]
let
ext
=
cm
.
display
.
externalMeasured
if
(
ext
&&
lineN
>=
ext
.
lineN
&&
lineN
<
ext
.
lineN
+
ext
.
size
)
return
ext
}
// Measurement can be split in two steps, the set-up work that
// applies to the whole line, and the measurement of the actual
// character. Functions like coordsChar, that need to do a lot of
// measurements in a row, can thus ensure that the set-up work is
// only done once.
export
function
prepareMeasureForLine
(
cm
,
line
)
{
let
lineN
=
lineNo
(
line
)
let
view
=
findViewForLine
(
cm
,
lineN
)
if
(
view
&&
!
view
.
text
)
{
view
=
null
}
else
if
(
view
&&
view
.
changes
)
{
updateLineForChanges
(
cm
,
view
,
lineN
,
getDimensions
(
cm
))
cm
.
curOp
.
forceUpdate
=
true
}
if
(
!
view
)
view
=
updateExternalMeasurement
(
cm
,
line
)
let
info
=
mapFromLineView
(
view
,
line
,
lineN
)
return
{
line
:
line
,
view
:
view
,
rect
:
null
,
map
:
info
.
map
,
cache
:
info
.
cache
,
before
:
info
.
before
,
hasHeights
:
false
}
}
// Given a prepared measurement object, measures the position of an
// actual character (or fetches it from the cache).
export
function
measureCharPrepared
(
cm
,
prepared
,
ch
,
bias
,
varHeight
)
{
if
(
prepared
.
before
)
ch
=
-
1
let
key
=
ch
+
(
bias
||
""
),
found
if
(
prepared
.
cache
.
hasOwnProperty
(
key
))
{
found
=
prepared
.
cache
[
key
]
}
else
{
if
(
!
prepared
.
rect
)
prepared
.
rect
=
prepared
.
view
.
text
.
getBoundingClientRect
()
if
(
!
prepared
.
hasHeights
)
{
ensureLineHeights
(
cm
,
prepared
.
view
,
prepared
.
rect
)
prepared
.
hasHeights
=
true
}
found
=
measureCharInner
(
cm
,
prepared
,
ch
,
bias
)
if
(
!
found
.
bogus
)
prepared
.
cache
[
key
]
=
found
}
return
{
left
:
found
.
left
,
right
:
found
.
right
,
top
:
varHeight
?
found
.
rtop
:
found
.
top
,
bottom
:
varHeight
?
found
.
rbottom
:
found
.
bottom
}
}
let
nullRect
=
{
left
:
0
,
right
:
0
,
top
:
0
,
bottom
:
0
}
export
function
nodeAndOffsetInLineMap
(
map
,
ch
,
bias
)
{
let
node
,
start
,
end
,
collapse
,
mStart
,
mEnd
// First, search the line map for the text node corresponding to,
// or closest to, the target character.
for
(
let
i
=
0
;
i
<
map
.
length
;
i
+=
3
)
{
mStart
=
map
[
i
]
mEnd
=
map
[
i
+
1
]
if
(
ch
<
mStart
)
{
start
=
0
;
end
=
1
collapse
=
"
left
"
}
else
if
(
ch
<
mEnd
)
{
start
=
ch
-
mStart
end
=
start
+
1
}
else
if
(
i
==
map
.
length
-
3
||
ch
==
mEnd
&&
map
[
i
+
3
]
>
ch
)
{
end
=
mEnd
-
mStart
start
=
end
-
1
if
(
ch
>=
mEnd
)
collapse
=
"
right
"
}
if
(
start
!=
null
)
{
node
=
map
[
i
+
2
]
if
(
mStart
==
mEnd
&&
bias
==
(
node
.
insertLeft
?
"
left
"
:
"
right
"
))
collapse
=
bias
if
(
bias
==
"
left
"
&&
start
==
0
)
while
(
i
&&
map
[
i
-
2
]
==
map
[
i
-
3
]
&&
map
[
i
-
1
].
insertLeft
)
{
node
=
map
[(
i
-=
3
)
+
2
]
collapse
=
"
left
"
}
if
(
bias
==
"
right
"
&&
start
==
mEnd
-
mStart
)
while
(
i
<
map
.
length
-
3
&&
map
[
i
+
3
]
==
map
[
i
+
4
]
&&
!
map
[
i
+
5
].
insertLeft
)
{
node
=
map
[(
i
+=
3
)
+
2
]
collapse
=
"
right
"
}
break
}
}
return
{
node
:
node
,
start
:
start
,
end
:
end
,
collapse
:
collapse
,
coverStart
:
mStart
,
coverEnd
:
mEnd
}
}
function
getUsefulRect
(
rects
,
bias
)
{
let
rect
=
nullRect
if
(
bias
==
"
left
"
)
for
(
let
i
=
0
;
i
<
rects
.
length
;
i
++
)
{
if
((
rect
=
rects
[
i
]).
left
!=
rect
.
right
)
break
}
else
for
(
let
i
=
rects
.
length
-
1
;
i
>=
0
;
i
--
)
{
if
((
rect
=
rects
[
i
]).
left
!=
rect
.
right
)
break
}
return
rect
}
function
measureCharInner
(
cm
,
prepared
,
ch
,
bias
)
{
let
place
=
nodeAndOffsetInLineMap
(
prepared
.
map
,
ch
,
bias
)
let
node
=
place
.
node
,
start
=
place
.
start
,
end
=
place
.
end
,
collapse
=
place
.
collapse
let
rect
if
(
node
.
nodeType
==
3
)
{
// If it is a text node, use a range to retrieve the coordinates.
for
(
let
i
=
0
;
i
<
4
;
i
++
)
{
// Retry a maximum of 4 times when nonsense rectangles are returned
while
(
start
&&
isExtendingChar
(
prepared
.
line
.
text
.
charAt
(
place
.
coverStart
+
start
)))
--
start
while
(
place
.
coverStart
+
end
<
place
.
coverEnd
&&
isExtendingChar
(
prepared
.
line
.
text
.
charAt
(
place
.
coverStart
+
end
)))
++
end
if
(
ie
&&
ie_version
<
9
&&
start
==
0
&&
end
==
place
.
coverEnd
-
place
.
coverStart
)
rect
=
node
.
parentNode
.
getBoundingClientRect
()
else
rect
=
getUsefulRect
(
range
(
node
,
start
,
end
).
getClientRects
(),
bias
)
if
(
rect
.
left
||
rect
.
right
||
start
==
0
)
break
end
=
start
start
=
start
-
1
collapse
=
"
right
"
}
if
(
ie
&&
ie_version
<
11
)
rect
=
maybeUpdateRectForZooming
(
cm
.
display
.
measure
,
rect
)
}
else
{
// If it is a widget, simply get the box for the whole widget.
if
(
start
>
0
)
collapse
=
bias
=
"
right
"
let
rects
if
(
cm
.
options
.
lineWrapping
&&
(
rects
=
node
.
getClientRects
()).
length
>
1
)
rect
=
rects
[
bias
==
"
right
"
?
rects
.
length
-
1
:
0
]
else
rect
=
node
.
getBoundingClientRect
()
}
if
(
ie
&&
ie_version
<
9
&&
!
start
&&
(
!
rect
||
!
rect
.
left
&&
!
rect
.
right
))
{
let
rSpan
=
node
.
parentNode
.
getClientRects
()[
0
]
if
(
rSpan
)
rect
=
{
left
:
rSpan
.
left
,
right
:
rSpan
.
left
+
charWidth
(
cm
.
display
),
top
:
rSpan
.
top
,
bottom
:
rSpan
.
bottom
}
else
rect
=
nullRect
}
let
rtop
=
rect
.
top
-
prepared
.
rect
.
top
,
rbot
=
rect
.
bottom
-
prepared
.
rect
.
top
let
mid
=
(
rtop
+
rbot
)
/
2
let
heights
=
prepared
.
view
.
measure
.
heights
let
i
=
0
for
(;
i
<
heights
.
length
-
1
;
i
++
)
if
(
mid
<
heights
[
i
])
break
let
top
=
i
?
heights
[
i
-
1
]
:
0
,
bot
=
heights
[
i
]
let
result
=
{
left
:
(
collapse
==
"
right
"
?
rect
.
right
:
rect
.
left
)
-
prepared
.
rect
.
left
,
right
:
(
collapse
==
"
left
"
?
rect
.
left
:
rect
.
right
)
-
prepared
.
rect
.
left
,
top
:
top
,
bottom
:
bot
}
if
(
!
rect
.
left
&&
!
rect
.
right
)
result
.
bogus
=
true
if
(
!
cm
.
options
.
singleCursorHeightPerLine
)
{
result
.
rtop
=
rtop
;
result
.
rbottom
=
rbot
}
return
result
}
// Work around problem with bounding client rects on ranges being
// returned incorrectly when zoomed on IE10 and below.
function
maybeUpdateRectForZooming
(
measure
,
rect
)
{
if
(
!
window
.
screen
||
screen
.
logicalXDPI
==
null
||
screen
.
logicalXDPI
==
screen
.
deviceXDPI
||
!
hasBadZoomedRects
(
measure
))
return
rect
let
scaleX
=
screen
.
logicalXDPI
/
screen
.
deviceXDPI
let
scaleY
=
screen
.
logicalYDPI
/
screen
.
deviceYDPI
return
{
left
:
rect
.
left
*
scaleX
,
right
:
rect
.
right
*
scaleX
,
top
:
rect
.
top
*
scaleY
,
bottom
:
rect
.
bottom
*
scaleY
}
}
export
function
clearLineMeasurementCacheFor
(
lineView
)
{
if
(
lineView
.
measure
)
{
lineView
.
measure
.
cache
=
{}
lineView
.
measure
.
heights
=
null
if
(
lineView
.
rest
)
for
(
let
i
=
0
;
i
<
lineView
.
rest
.
length
;
i
++
)
lineView
.
measure
.
caches
[
i
]
=
{}
}
}
export
function
clearLineMeasurementCache
(
cm
)
{
cm
.
display
.
externalMeasure
=
null
removeChildren
(
cm
.
display
.
lineMeasure
)
for
(
let
i
=
0
;
i
<
cm
.
display
.
view
.
length
;
i
++
)
clearLineMeasurementCacheFor
(
cm
.
display
.
view
[
i
])
}
export
function
clearCaches
(
cm
)
{
clearLineMeasurementCache
(
cm
)
cm
.
display
.
cachedCharWidth
=
cm
.
display
.
cachedTextHeight
=
cm
.
display
.
cachedPaddingH
=
null
if
(
!
cm
.
options
.
lineWrapping
)
cm
.
display
.
maxLineChanged
=
true
cm
.
display
.
lineNumChars
=
null
}
function
pageScrollX
()
{
return
window
.
pageXOffset
||
(
document
.
documentElement
||
document
.
body
).
scrollLeft
}
function
pageScrollY
()
{
return
window
.
pageYOffset
||
(
document
.
documentElement
||
document
.
body
).
scrollTop
}
// Converts a {top, bottom, left, right} box from line-local
// coordinates into another coordinate system. Context may be one of
// "line", "div" (display.lineDiv), "local"./null (editor), "window",
// or "page".
export
function
intoCoordSystem
(
cm
,
lineObj
,
rect
,
context
,
includeWidgets
)
{
if
(
!
includeWidgets
&&
lineObj
.
widgets
)
for
(
let
i
=
0
;
i
<
lineObj
.
widgets
.
length
;
++
i
)
if
(
lineObj
.
widgets
[
i
].
above
)
{
let
size
=
widgetHeight
(
lineObj
.
widgets
[
i
])
rect
.
top
+=
size
;
rect
.
bottom
+=
size
}
if
(
context
==
"
line
"
)
return
rect
if
(
!
context
)
context
=
"
local
"
let
yOff
=
heightAtLine
(
lineObj
)
if
(
context
==
"
local
"
)
yOff
+=
paddingTop
(
cm
.
display
)
else
yOff
-=
cm
.
display
.
viewOffset
if
(
context
==
"
page
"
||
context
==
"
window
"
)
{
let
lOff
=
cm
.
display
.
lineSpace
.
getBoundingClientRect
()
yOff
+=
lOff
.
top
+
(
context
==
"
window
"
?
0
:
pageScrollY
())
let
xOff
=
lOff
.
left
+
(
context
==
"
window
"
?
0
:
pageScrollX
())
rect
.
left
+=
xOff
;
rect
.
right
+=
xOff
}
rect
.
top
+=
yOff
;
rect
.
bottom
+=
yOff
return
rect
}
// Coverts a box from "div" coords to another coordinate system.
// Context may be "window", "page", "div", or "local"./null.
export
function
fromCoordSystem
(
cm
,
coords
,
context
)
{
if
(
context
==
"
div
"
)
return
coords
let
left
=
coords
.
left
,
top
=
coords
.
top
// First move into "page" coordinate system
if
(
context
==
"
page
"
)
{
left
-=
pageScrollX
()
top
-=
pageScrollY
()
}
else
if
(
context
==
"
local
"
||
!
context
)
{
let
localBox
=
cm
.
display
.
sizer
.
getBoundingClientRect
()
left
+=
localBox
.
left
top
+=
localBox
.
top
}
let
lineSpaceBox
=
cm
.
display
.
lineSpace
.
getBoundingClientRect
()
return
{
left
:
left
-
lineSpaceBox
.
left
,
top
:
top
-
lineSpaceBox
.
top
}
}
export
function
charCoords
(
cm
,
pos
,
context
,
lineObj
,
bias
)
{
if
(
!
lineObj
)
lineObj
=
getLine
(
cm
.
doc
,
pos
.
line
)
return
intoCoordSystem
(
cm
,
lineObj
,
measureChar
(
cm
,
lineObj
,
pos
.
ch
,
bias
),
context
)
}
// Returns a box for a given cursor position, which may have an
// 'other' property containing the position of the secondary cursor
// on a bidi boundary.
// A cursor Pos(line, char, "before") is on the same visual line as `char - 1`
// and after `char - 1` in writing order of `char - 1`
// A cursor Pos(line, char, "after") is on the same visual line as `char`
// and before `char` in writing order of `char`
// Examples (upper-case letters are RTL, lower-case are LTR):
// Pos(0, 1, ...)
// before after
// ab a|b a|b
// aB a|B aB|
// Ab |Ab A|b
// AB B|A B|A
// Every position after the last character on a line is considered to stick
// to the last character on the line.
export
function
cursorCoords
(
cm
,
pos
,
context
,
lineObj
,
preparedMeasure
,
varHeight
)
{
lineObj
=
lineObj
||
getLine
(
cm
.
doc
,
pos
.
line
)
if
(
!
preparedMeasure
)
preparedMeasure
=
prepareMeasureForLine
(
cm
,
lineObj
)
function
get
(
ch
,
right
)
{
let
m
=
measureCharPrepared
(
cm
,
preparedMeasure
,
ch
,
right
?
"
right
"
:
"
left
"
,
varHeight
)
if
(
right
)
m
.
left
=
m
.
right
;
else
m
.
right
=
m
.
left
return
intoCoordSystem
(
cm
,
lineObj
,
m
,
context
)
}
let
order
=
getOrder
(
lineObj
),
ch
=
pos
.
ch
,
sticky
=
pos
.
sticky
if
(
ch
>=
lineObj
.
text
.
length
)
{
ch
=
lineObj
.
text
.
length
sticky
=
"
before
"
}
else
if
(
ch
<=
0
)
{
ch
=
0
sticky
=
"
after
"
}
if
(
!
order
)
return
get
(
sticky
==
"
before
"
?
ch
-
1
:
ch
,
sticky
==
"
before
"
)
function
getBidi
(
ch
,
partPos
,
invert
)
{
let
part
=
order
[
partPos
],
right
=
(
part
.
level
%
2
)
!=
0
return
get
(
invert
?
ch
-
1
:
ch
,
right
!=
invert
)
}
let
partPos
=
getBidiPartAt
(
order
,
ch
,
sticky
)
let
other
=
bidiOther
let
val
=
getBidi
(
ch
,
partPos
,
sticky
==
"
before
"
)
if
(
other
!=
null
)
val
.
other
=
getBidi
(
ch
,
other
,
sticky
!=
"
before
"
)
return
val
}
// Used to cheaply estimate the coordinates for a position. Used for
// intermediate scroll updates.
export
function
estimateCoords
(
cm
,
pos
)
{
let
left
=
0
pos
=
clipPos
(
cm
.
doc
,
pos
)
if
(
!
cm
.
options
.
lineWrapping
)
left
=
charWidth
(
cm
.
display
)
*
pos
.
ch
let
lineObj
=
getLine
(
cm
.
doc
,
pos
.
line
)
let
top
=
heightAtLine
(
lineObj
)
+
paddingTop
(
cm
.
display
)
return
{
left
:
left
,
right
:
left
,
top
:
top
,
bottom
:
top
+
lineObj
.
height
}
}
// Positions returned by coordsChar contain some extra information.
// xRel is the relative x position of the input coordinates compared
// to the found position (so xRel > 0 means the coordinates are to
// the right of the character position, for example). When outside
// is true, that means the coordinates lie outside the line's
// vertical range.
function
PosWithInfo
(
line
,
ch
,
sticky
,
outside
,
xRel
)
{
let
pos
=
Pos
(
line
,
ch
,
sticky
)
pos
.
xRel
=
xRel
if
(
outside
)
pos
.
outside
=
true
return
pos
}
// Compute the character position closest to the given coordinates.
// Input must be lineSpace-local ("div" coordinate system).
export
function
coordsChar
(
cm
,
x
,
y
)
{
let
doc
=
cm
.
doc
y
+=
cm
.
display
.
viewOffset
if
(
y
<
0
)
return
PosWithInfo
(
doc
.
first
,
0
,
null
,
true
,
-
1
)
let
lineN
=
lineAtHeight
(
doc
,
y
),
last
=
doc
.
first
+
doc
.
size
-
1
if
(
lineN
>
last
)
return
PosWithInfo
(
doc
.
first
+
doc
.
size
-
1
,
getLine
(
doc
,
last
).
text
.
length
,
null
,
true
,
1
)
if
(
x
<
0
)
x
=
0
let
lineObj
=
getLine
(
doc
,
lineN
)
for
(;;)
{
let
found
=
coordsCharInner
(
cm
,
lineObj
,
lineN
,
x
,
y
)
let
merged
=
collapsedSpanAtEnd
(
lineObj
)
let
mergedPos
=
merged
&&
merged
.
find
(
0
,
true
)
if
(
merged
&&
(
found
.
ch
>
mergedPos
.
from
.
ch
||
found
.
ch
==
mergedPos
.
from
.
ch
&&
found
.
xRel
>
0
))
lineN
=
lineNo
(
lineObj
=
mergedPos
.
to
.
line
)
else
return
found
}
}
function
wrappedLineExtent
(
cm
,
lineObj
,
preparedMeasure
,
y
)
{
let
measure
=
ch
=>
intoCoordSystem
(
cm
,
lineObj
,
measureCharPrepared
(
cm
,
preparedMeasure
,
ch
),
"
line
"
)
let
end
=
lineObj
.
text
.
length
let
begin
=
findFirst
(
ch
=>
measure
(
ch
-
1
).
bottom
<=
y
,
end
,
0
)
end
=
findFirst
(
ch
=>
measure
(
ch
).
top
>
y
,
begin
,
end
)
return
{
begin
,
end
}
}
export
function
wrappedLineExtentChar
(
cm
,
lineObj
,
preparedMeasure
,
target
)
{
let
targetTop
=
intoCoordSystem
(
cm
,
lineObj
,
measureCharPrepared
(
cm
,
preparedMeasure
,
target
),
"
line
"
).
top
return
wrappedLineExtent
(
cm
,
lineObj
,
preparedMeasure
,
targetTop
)
}
function
coordsCharInner
(
cm
,
lineObj
,
lineNo
,
x
,
y
)
{
y
-=
heightAtLine
(
lineObj
)
let
begin
=
0
,
end
=
lineObj
.
text
.
length
let
preparedMeasure
=
prepareMeasureForLine
(
cm
,
lineObj
)
let
pos
let
order
=
getOrder
(
lineObj
)
if
(
order
)
{
if
(
cm
.
options
.
lineWrapping
)
{
;({
begin
,
end
}
=
wrappedLineExtent
(
cm
,
lineObj
,
preparedMeasure
,
y
))
}
pos
=
new
Pos
(
lineNo
,
begin
)
let
beginLeft
=
cursorCoords
(
cm
,
pos
,
"
line
"
,
lineObj
,
preparedMeasure
).
left
let
dir
=
beginLeft
<
x
?
1
:
-
1
let
prevDiff
,
diff
=
beginLeft
-
x
,
prevPos
do
{
prevDiff
=
diff
prevPos
=
pos
pos
=
moveVisually
(
cm
,
lineObj
,
pos
,
dir
)
if
(
pos
==
null
||
pos
.
ch
<
begin
||
end
<=
(
pos
.
sticky
==
"
before
"
?
pos
.
ch
-
1
:
pos
.
ch
))
{
pos
=
prevPos
break
}
diff
=
cursorCoords
(
cm
,
pos
,
"
line
"
,
lineObj
,
preparedMeasure
).
left
-
x
}
while
((
dir
<
0
)
!=
(
diff
<
0
)
&&
(
Math
.
abs
(
diff
)
<=
Math
.
abs
(
prevDiff
)))
if
(
Math
.
abs
(
diff
)
>
Math
.
abs
(
prevDiff
))
{
if
((
diff
<
0
)
==
(
prevDiff
<
0
))
throw
new
Error
(
"
Broke out of infinite loop in coordsCharInner
"
)
pos
=
prevPos
}
}
else
{
let
ch
=
findFirst
(
ch
=>
{
let
box
=
intoCoordSystem
(
cm
,
lineObj
,
measureCharPrepared
(
cm
,
preparedMeasure
,
ch
),
"
line
"
)
if
(
box
.
top
>
y
)
{
// For the cursor stickiness
end
=
Math
.
min
(
ch
,
end
)
return
true
}
else
if
(
box
.
bottom
<=
y
)
return
false
else
if
(
box
.
left
>
x
)
return
true
else
if
(
box
.
right
<
x
)
return
false
else
return
(
x
-
box
.
left
<
box
.
right
-
x
)
},
begin
,
end
)
ch
=
skipExtendingChars
(
lineObj
.
text
,
ch
,
1
)
pos
=
new
Pos
(
lineNo
,
ch
,
ch
==
end
?
"
before
"
:
"
after
"
)
}
let
coords
=
cursorCoords
(
cm
,
pos
,
"
line
"
,
lineObj
,
preparedMeasure
)
if
(
y
<
coords
.
top
||
coords
.
bottom
<
y
)
pos
.
outside
=
true
pos
.
xRel
=
x
<
coords
.
left
?
-
1
:
(
x
>
coords
.
right
?
1
:
0
)
return
pos
}
let
measureText
// Compute the default text height.
export
function
textHeight
(
display
)
{
if
(
display
.
cachedTextHeight
!=
null
)
return
display
.
cachedTextHeight
if
(
measureText
==
null
)
{
measureText
=
elt
(
"
pre
"
)
// Measure a bunch of lines, for browsers that compute
// fractional heights.
for
(
let
i
=
0
;
i
<
49
;
++
i
)
{
measureText
.
appendChild
(
document
.
createTextNode
(
"
x
"
))
measureText
.
appendChild
(
elt
(
"
br
"
))
}
measureText
.
appendChild
(
document
.
createTextNode
(
"
x
"
))
}
removeChildrenAndAdd
(
display
.
measure
,
measureText
)
let
height
=
measureText
.
offsetHeight
/
50
if
(
height
>
3
)
display
.
cachedTextHeight
=
height
removeChildren
(
display
.
measure
)
return
height
||
1
}
// Compute the default character width.
export
function
charWidth
(
display
)
{
if
(
display
.
cachedCharWidth
!=
null
)
return
display
.
cachedCharWidth
let
anchor
=
elt
(
"
span
"
,
"
xxxxxxxxxx
"
)
let
pre
=
elt
(
"
pre
"
,
[
anchor
])
removeChildrenAndAdd
(
display
.
measure
,
pre
)
let
rect
=
anchor
.
getBoundingClientRect
(),
width
=
(
rect
.
right
-
rect
.
left
)
/
10
if
(
width
>
2
)
display
.
cachedCharWidth
=
width
return
width
||
10
}
// Do a bulk-read of the DOM positions and sizes needed to draw the
// view, so that we don't interleave reading and writing to the DOM.
export
function
getDimensions
(
cm
)
{
let
d
=
cm
.
display
,
left
=
{},
width
=
{}
let
gutterLeft
=
d
.
gutters
.
clientLeft
for
(
let
n
=
d
.
gutters
.
firstChild
,
i
=
0
;
n
;
n
=
n
.
nextSibling
,
++
i
)
{
left
[
cm
.
options
.
gutters
[
i
]]
=
n
.
offsetLeft
+
n
.
clientLeft
+
gutterLeft
width
[
cm
.
options
.
gutters
[
i
]]
=
n
.
clientWidth
}
return
{
fixedPos
:
compensateForHScroll
(
d
),
gutterTotalWidth
:
d
.
gutters
.
offsetWidth
,
gutterLeft
:
left
,
gutterWidth
:
width
,
wrapperWidth
:
d
.
wrapper
.
clientWidth
}
}
// Computes display.scroller.scrollLeft + display.gutters.offsetWidth,
// but using getBoundingClientRect to get a sub-pixel-accurate
// result.
export
function
compensateForHScroll
(
display
)
{
return
display
.
scroller
.
getBoundingClientRect
().
left
-
display
.
sizer
.
getBoundingClientRect
().
left
}
// Returns a function that estimates the height of a line, to use as
// first approximation until the line becomes visible (and is thus
// properly measurable).
export
function
estimateHeight
(
cm
)
{
let
th
=
textHeight
(
cm
.
display
),
wrapping
=
cm
.
options
.
lineWrapping
let
perLine
=
wrapping
&&
Math
.
max
(
5
,
cm
.
display
.
scroller
.
clientWidth
/
charWidth
(
cm
.
display
)
-
3
)
return
line
=>
{
if
(
lineIsHidden
(
cm
.
doc
,
line
))
return
0
let
widgetsHeight
=
0
if
(
line
.
widgets
)
for
(
let
i
=
0
;
i
<
line
.
widgets
.
length
;
i
++
)
{
if
(
line
.
widgets
[
i
].
height
)
widgetsHeight
+=
line
.
widgets
[
i
].
height
}
if
(
wrapping
)
return
widgetsHeight
+
(
Math
.
ceil
(
line
.
text
.
length
/
perLine
)
||
1
)
*
th
else
return
widgetsHeight
+
th
}
}
export
function
estimateLineHeights
(
cm
)
{
let
doc
=
cm
.
doc
,
est
=
estimateHeight
(
cm
)
doc
.
iter
(
line
=>
{
let
estHeight
=
est
(
line
)
if
(
estHeight
!=
line
.
height
)
updateLineHeight
(
line
,
estHeight
)
})
}
// Given a mouse event, find the corresponding position. If liberal
// is false, it checks whether a gutter or scrollbar was clicked,
// and returns null if it was. forRect is used by rectangular
// selections, and tries to estimate a character position even for
// coordinates beyond the right of the text.
export
function
posFromMouse
(
cm
,
e
,
liberal
,
forRect
)
{
let
display
=
cm
.
display
if
(
!
liberal
&&
e_target
(
e
).
getAttribute
(
"
cm-not-content
"
)
==
"
true
"
)
return
null
let
x
,
y
,
space
=
display
.
lineSpace
.
getBoundingClientRect
()
// Fails unpredictably on IE[67] when mouse is dragged around quickly.
try
{
x
=
e
.
clientX
-
space
.
left
;
y
=
e
.
clientY
-
space
.
top
}
catch
(
e
)
{
return
null
}
let
coords
=
coordsChar
(
cm
,
x
,
y
),
line
if
(
forRect
&&
coords
.
xRel
==
1
&&
(
line
=
getLine
(
cm
.
doc
,
coords
.
line
).
text
).
length
==
coords
.
ch
)
{
let
colDiff
=
countColumn
(
line
,
line
.
length
,
cm
.
options
.
tabSize
)
-
line
.
length
coords
=
Pos
(
coords
.
line
,
Math
.
max
(
0
,
Math
.
round
((
x
-
paddingH
(
cm
.
display
).
left
)
/
charWidth
(
cm
.
display
))
-
colDiff
))
}
return
coords
}
// Find the view element corresponding to a given line. Return null
// when the line isn't visible.
export
function
findViewIndex
(
cm
,
n
)
{
if
(
n
>=
cm
.
display
.
viewTo
)
return
null
n
-=
cm
.
display
.
viewFrom
if
(
n
<
0
)
return
null
let
view
=
cm
.
display
.
view
for
(
let
i
=
0
;
i
<
view
.
length
;
i
++
)
{
n
-=
view
[
i
].
size
if
(
n
<
0
)
return
i
}
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/measurement/position_measurement.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
position_measurement.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/measurement/widgets.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
contains
,
elt
,
removeChildrenAndAdd
}
from
"
../util/dom
"
import
{
e_target
}
from
"
../util/event
"
export
function
widgetHeight
(
widget
)
{
if
(
widget
.
height
!=
null
)
return
widget
.
height
let
cm
=
widget
.
doc
.
cm
if
(
!
cm
)
return
0
if
(
!
contains
(
document
.
body
,
widget
.
node
))
{
let
parentStyle
=
"
position: relative;
"
if
(
widget
.
coverGutter
)
parentStyle
+=
"
margin-left: -
"
+
cm
.
display
.
gutters
.
offsetWidth
+
"
px;
"
if
(
widget
.
noHScroll
)
parentStyle
+=
"
width:
"
+
cm
.
display
.
wrapper
.
clientWidth
+
"
px;
"
removeChildrenAndAdd
(
cm
.
display
.
measure
,
elt
(
"
div
"
,
[
widget
.
node
],
null
,
parentStyle
))
}
return
widget
.
height
=
widget
.
node
.
parentNode
.
offsetHeight
}
// Return true when the given mouse event happened in a widget
export
function
eventInWidget
(
display
,
e
)
{
for
(
let
n
=
e_target
(
e
);
n
!=
display
.
wrapper
;
n
=
n
.
parentNode
)
{
if
(
!
n
||
(
n
.
nodeType
==
1
&&
n
.
getAttribute
(
"
cm-ignore-events
"
)
==
"
true
"
)
||
(
n
.
parentNode
==
display
.
sizer
&&
n
!=
display
.
mover
))
return
true
}
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/measurement/widgets.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
widgets.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"Folder"
module=
"OFS.Folder"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_objects
</string>
</key>
<value>
<tuple/>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
model
</string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model/Doc.js.js
deleted
100644 → 0
View file @
a3a26621
import
CodeMirror
from
"
../edit/CodeMirror
"
import
{
docMethodOp
}
from
"
../display/operations
"
import
{
Line
}
from
"
../line/line_data
"
import
{
clipPos
,
clipPosArray
,
Pos
}
from
"
../line/pos
"
import
{
visualLine
}
from
"
../line/spans
"
import
{
getBetween
,
getLine
,
getLines
,
isLine
,
lineNo
}
from
"
../line/utils_line
"
import
{
classTest
}
from
"
../util/dom
"
import
{
splitLinesAuto
}
from
"
../util/feature_detection
"
import
{
createObj
,
map
,
isEmpty
,
sel_dontScroll
}
from
"
../util/misc
"
import
{
ensureCursorVisible
}
from
"
../display/scrolling
"
import
{
changeLine
,
makeChange
,
makeChangeFromHistory
,
replaceRange
}
from
"
./changes
"
import
{
computeReplacedSel
}
from
"
./change_measurement
"
import
{
BranchChunk
,
LeafChunk
}
from
"
./chunk
"
import
{
linkedDocs
,
updateDoc
}
from
"
./document_data
"
import
{
copyHistoryArray
,
History
}
from
"
./history
"
import
{
addLineWidget
}
from
"
./line_widget
"
import
{
copySharedMarkers
,
detachSharedMarkers
,
findSharedMarkers
,
markText
}
from
"
./mark_text
"
import
{
normalizeSelection
,
Range
,
simpleSelection
}
from
"
./selection
"
import
{
extendSelection
,
extendSelections
,
setSelection
,
setSelectionReplaceHistory
,
setSimpleSelection
}
from
"
./selection_updates
"
let
nextDocId
=
0
let
Doc
=
function
(
text
,
mode
,
firstLine
,
lineSep
)
{
if
(
!
(
this
instanceof
Doc
))
return
new
Doc
(
text
,
mode
,
firstLine
,
lineSep
)
if
(
firstLine
==
null
)
firstLine
=
0
BranchChunk
.
call
(
this
,
[
new
LeafChunk
([
new
Line
(
""
,
null
)])])
this
.
first
=
firstLine
this
.
scrollTop
=
this
.
scrollLeft
=
0
this
.
cantEdit
=
false
this
.
cleanGeneration
=
1
this
.
frontier
=
firstLine
let
start
=
Pos
(
firstLine
,
0
)
this
.
sel
=
simpleSelection
(
start
)
this
.
history
=
new
History
(
null
)
this
.
id
=
++
nextDocId
this
.
modeOption
=
mode
this
.
lineSep
=
lineSep
this
.
extend
=
false
if
(
typeof
text
==
"
string
"
)
text
=
this
.
splitLines
(
text
)
updateDoc
(
this
,
{
from
:
start
,
to
:
start
,
text
:
text
})
setSelection
(
this
,
simpleSelection
(
start
),
sel_dontScroll
)
}
Doc
.
prototype
=
createObj
(
BranchChunk
.
prototype
,
{
constructor
:
Doc
,
// Iterate over the document. Supports two forms -- with only one
// argument, it calls that for each line in the document. With
// three, it iterates over the range given by the first two (with
// the second being non-inclusive).
iter
:
function
(
from
,
to
,
op
)
{
if
(
op
)
this
.
iterN
(
from
-
this
.
first
,
to
-
from
,
op
)
else
this
.
iterN
(
this
.
first
,
this
.
first
+
this
.
size
,
from
)
},
// Non-public interface for adding and removing lines.
insert
:
function
(
at
,
lines
)
{
let
height
=
0
for
(
let
i
=
0
;
i
<
lines
.
length
;
++
i
)
height
+=
lines
[
i
].
height
this
.
insertInner
(
at
-
this
.
first
,
lines
,
height
)
},
remove
:
function
(
at
,
n
)
{
this
.
removeInner
(
at
-
this
.
first
,
n
)
},
// From here, the methods are part of the public interface. Most
// are also available from CodeMirror (editor) instances.
getValue
:
function
(
lineSep
)
{
let
lines
=
getLines
(
this
,
this
.
first
,
this
.
first
+
this
.
size
)
if
(
lineSep
===
false
)
return
lines
return
lines
.
join
(
lineSep
||
this
.
lineSeparator
())
},
setValue
:
docMethodOp
(
function
(
code
)
{
let
top
=
Pos
(
this
.
first
,
0
),
last
=
this
.
first
+
this
.
size
-
1
makeChange
(
this
,
{
from
:
top
,
to
:
Pos
(
last
,
getLine
(
this
,
last
).
text
.
length
),
text
:
this
.
splitLines
(
code
),
origin
:
"
setValue
"
,
full
:
true
},
true
)
setSelection
(
this
,
simpleSelection
(
top
))
}),
replaceRange
:
function
(
code
,
from
,
to
,
origin
)
{
from
=
clipPos
(
this
,
from
)
to
=
to
?
clipPos
(
this
,
to
)
:
from
replaceRange
(
this
,
code
,
from
,
to
,
origin
)
},
getRange
:
function
(
from
,
to
,
lineSep
)
{
let
lines
=
getBetween
(
this
,
clipPos
(
this
,
from
),
clipPos
(
this
,
to
))
if
(
lineSep
===
false
)
return
lines
return
lines
.
join
(
lineSep
||
this
.
lineSeparator
())
},
getLine
:
function
(
line
)
{
let
l
=
this
.
getLineHandle
(
line
);
return
l
&&
l
.
text
},
getLineHandle
:
function
(
line
)
{
if
(
isLine
(
this
,
line
))
return
getLine
(
this
,
line
)},
getLineNumber
:
function
(
line
)
{
return
lineNo
(
line
)},
getLineHandleVisualStart
:
function
(
line
)
{
if
(
typeof
line
==
"
number
"
)
line
=
getLine
(
this
,
line
)
return
visualLine
(
line
)
},
lineCount
:
function
()
{
return
this
.
size
},
firstLine
:
function
()
{
return
this
.
first
},
lastLine
:
function
()
{
return
this
.
first
+
this
.
size
-
1
},
clipPos
:
function
(
pos
)
{
return
clipPos
(
this
,
pos
)},
getCursor
:
function
(
start
)
{
let
range
=
this
.
sel
.
primary
(),
pos
if
(
start
==
null
||
start
==
"
head
"
)
pos
=
range
.
head
else
if
(
start
==
"
anchor
"
)
pos
=
range
.
anchor
else
if
(
start
==
"
end
"
||
start
==
"
to
"
||
start
===
false
)
pos
=
range
.
to
()
else
pos
=
range
.
from
()
return
pos
},
listSelections
:
function
()
{
return
this
.
sel
.
ranges
},
somethingSelected
:
function
()
{
return
this
.
sel
.
somethingSelected
()},
setCursor
:
docMethodOp
(
function
(
line
,
ch
,
options
)
{
setSimpleSelection
(
this
,
clipPos
(
this
,
typeof
line
==
"
number
"
?
Pos
(
line
,
ch
||
0
)
:
line
),
null
,
options
)
}),
setSelection
:
docMethodOp
(
function
(
anchor
,
head
,
options
)
{
setSimpleSelection
(
this
,
clipPos
(
this
,
anchor
),
clipPos
(
this
,
head
||
anchor
),
options
)
}),
extendSelection
:
docMethodOp
(
function
(
head
,
other
,
options
)
{
extendSelection
(
this
,
clipPos
(
this
,
head
),
other
&&
clipPos
(
this
,
other
),
options
)
}),
extendSelections
:
docMethodOp
(
function
(
heads
,
options
)
{
extendSelections
(
this
,
clipPosArray
(
this
,
heads
),
options
)
}),
extendSelectionsBy
:
docMethodOp
(
function
(
f
,
options
)
{
let
heads
=
map
(
this
.
sel
.
ranges
,
f
)
extendSelections
(
this
,
clipPosArray
(
this
,
heads
),
options
)
}),
setSelections
:
docMethodOp
(
function
(
ranges
,
primary
,
options
)
{
if
(
!
ranges
.
length
)
return
let
out
=
[]
for
(
let
i
=
0
;
i
<
ranges
.
length
;
i
++
)
out
[
i
]
=
new
Range
(
clipPos
(
this
,
ranges
[
i
].
anchor
),
clipPos
(
this
,
ranges
[
i
].
head
))
if
(
primary
==
null
)
primary
=
Math
.
min
(
ranges
.
length
-
1
,
this
.
sel
.
primIndex
)
setSelection
(
this
,
normalizeSelection
(
out
,
primary
),
options
)
}),
addSelection
:
docMethodOp
(
function
(
anchor
,
head
,
options
)
{
let
ranges
=
this
.
sel
.
ranges
.
slice
(
0
)
ranges
.
push
(
new
Range
(
clipPos
(
this
,
anchor
),
clipPos
(
this
,
head
||
anchor
)))
setSelection
(
this
,
normalizeSelection
(
ranges
,
ranges
.
length
-
1
),
options
)
}),
getSelection
:
function
(
lineSep
)
{
let
ranges
=
this
.
sel
.
ranges
,
lines
for
(
let
i
=
0
;
i
<
ranges
.
length
;
i
++
)
{
let
sel
=
getBetween
(
this
,
ranges
[
i
].
from
(),
ranges
[
i
].
to
())
lines
=
lines
?
lines
.
concat
(
sel
)
:
sel
}
if
(
lineSep
===
false
)
return
lines
else
return
lines
.
join
(
lineSep
||
this
.
lineSeparator
())
},
getSelections
:
function
(
lineSep
)
{
let
parts
=
[],
ranges
=
this
.
sel
.
ranges
for
(
let
i
=
0
;
i
<
ranges
.
length
;
i
++
)
{
let
sel
=
getBetween
(
this
,
ranges
[
i
].
from
(),
ranges
[
i
].
to
())
if
(
lineSep
!==
false
)
sel
=
sel
.
join
(
lineSep
||
this
.
lineSeparator
())
parts
[
i
]
=
sel
}
return
parts
},
replaceSelection
:
function
(
code
,
collapse
,
origin
)
{
let
dup
=
[]
for
(
let
i
=
0
;
i
<
this
.
sel
.
ranges
.
length
;
i
++
)
dup
[
i
]
=
code
this
.
replaceSelections
(
dup
,
collapse
,
origin
||
"
+input
"
)
},
replaceSelections
:
docMethodOp
(
function
(
code
,
collapse
,
origin
)
{
let
changes
=
[],
sel
=
this
.
sel
for
(
let
i
=
0
;
i
<
sel
.
ranges
.
length
;
i
++
)
{
let
range
=
sel
.
ranges
[
i
]
changes
[
i
]
=
{
from
:
range
.
from
(),
to
:
range
.
to
(),
text
:
this
.
splitLines
(
code
[
i
]),
origin
:
origin
}
}
let
newSel
=
collapse
&&
collapse
!=
"
end
"
&&
computeReplacedSel
(
this
,
changes
,
collapse
)
for
(
let
i
=
changes
.
length
-
1
;
i
>=
0
;
i
--
)
makeChange
(
this
,
changes
[
i
])
if
(
newSel
)
setSelectionReplaceHistory
(
this
,
newSel
)
else
if
(
this
.
cm
)
ensureCursorVisible
(
this
.
cm
)
}),
undo
:
docMethodOp
(
function
()
{
makeChangeFromHistory
(
this
,
"
undo
"
)}),
redo
:
docMethodOp
(
function
()
{
makeChangeFromHistory
(
this
,
"
redo
"
)}),
undoSelection
:
docMethodOp
(
function
()
{
makeChangeFromHistory
(
this
,
"
undo
"
,
true
)}),
redoSelection
:
docMethodOp
(
function
()
{
makeChangeFromHistory
(
this
,
"
redo
"
,
true
)}),
setExtending
:
function
(
val
)
{
this
.
extend
=
val
},
getExtending
:
function
()
{
return
this
.
extend
},
historySize
:
function
()
{
let
hist
=
this
.
history
,
done
=
0
,
undone
=
0
for
(
let
i
=
0
;
i
<
hist
.
done
.
length
;
i
++
)
if
(
!
hist
.
done
[
i
].
ranges
)
++
done
for
(
let
i
=
0
;
i
<
hist
.
undone
.
length
;
i
++
)
if
(
!
hist
.
undone
[
i
].
ranges
)
++
undone
return
{
undo
:
done
,
redo
:
undone
}
},
clearHistory
:
function
()
{
this
.
history
=
new
History
(
this
.
history
.
maxGeneration
)},
markClean
:
function
()
{
this
.
cleanGeneration
=
this
.
changeGeneration
(
true
)
},
changeGeneration
:
function
(
forceSplit
)
{
if
(
forceSplit
)
this
.
history
.
lastOp
=
this
.
history
.
lastSelOp
=
this
.
history
.
lastOrigin
=
null
return
this
.
history
.
generation
},
isClean
:
function
(
gen
)
{
return
this
.
history
.
generation
==
(
gen
||
this
.
cleanGeneration
)
},
getHistory
:
function
()
{
return
{
done
:
copyHistoryArray
(
this
.
history
.
done
),
undone
:
copyHistoryArray
(
this
.
history
.
undone
)}
},
setHistory
:
function
(
histData
)
{
let
hist
=
this
.
history
=
new
History
(
this
.
history
.
maxGeneration
)
hist
.
done
=
copyHistoryArray
(
histData
.
done
.
slice
(
0
),
null
,
true
)
hist
.
undone
=
copyHistoryArray
(
histData
.
undone
.
slice
(
0
),
null
,
true
)
},
setGutterMarker
:
docMethodOp
(
function
(
line
,
gutterID
,
value
)
{
return
changeLine
(
this
,
line
,
"
gutter
"
,
line
=>
{
let
markers
=
line
.
gutterMarkers
||
(
line
.
gutterMarkers
=
{})
markers
[
gutterID
]
=
value
if
(
!
value
&&
isEmpty
(
markers
))
line
.
gutterMarkers
=
null
return
true
})
}),
clearGutter
:
docMethodOp
(
function
(
gutterID
)
{
this
.
iter
(
line
=>
{
if
(
line
.
gutterMarkers
&&
line
.
gutterMarkers
[
gutterID
])
{
changeLine
(
this
,
line
,
"
gutter
"
,
()
=>
{
line
.
gutterMarkers
[
gutterID
]
=
null
if
(
isEmpty
(
line
.
gutterMarkers
))
line
.
gutterMarkers
=
null
return
true
})
}
})
}),
lineInfo
:
function
(
line
)
{
let
n
if
(
typeof
line
==
"
number
"
)
{
if
(
!
isLine
(
this
,
line
))
return
null
n
=
line
line
=
getLine
(
this
,
line
)
if
(
!
line
)
return
null
}
else
{
n
=
lineNo
(
line
)
if
(
n
==
null
)
return
null
}
return
{
line
:
n
,
handle
:
line
,
text
:
line
.
text
,
gutterMarkers
:
line
.
gutterMarkers
,
textClass
:
line
.
textClass
,
bgClass
:
line
.
bgClass
,
wrapClass
:
line
.
wrapClass
,
widgets
:
line
.
widgets
}
},
addLineClass
:
docMethodOp
(
function
(
handle
,
where
,
cls
)
{
return
changeLine
(
this
,
handle
,
where
==
"
gutter
"
?
"
gutter
"
:
"
class
"
,
line
=>
{
let
prop
=
where
==
"
text
"
?
"
textClass
"
:
where
==
"
background
"
?
"
bgClass
"
:
where
==
"
gutter
"
?
"
gutterClass
"
:
"
wrapClass
"
if
(
!
line
[
prop
])
line
[
prop
]
=
cls
else
if
(
classTest
(
cls
).
test
(
line
[
prop
]))
return
false
else
line
[
prop
]
+=
"
"
+
cls
return
true
})
}),
removeLineClass
:
docMethodOp
(
function
(
handle
,
where
,
cls
)
{
return
changeLine
(
this
,
handle
,
where
==
"
gutter
"
?
"
gutter
"
:
"
class
"
,
line
=>
{
let
prop
=
where
==
"
text
"
?
"
textClass
"
:
where
==
"
background
"
?
"
bgClass
"
:
where
==
"
gutter
"
?
"
gutterClass
"
:
"
wrapClass
"
let
cur
=
line
[
prop
]
if
(
!
cur
)
return
false
else
if
(
cls
==
null
)
line
[
prop
]
=
null
else
{
let
found
=
cur
.
match
(
classTest
(
cls
))
if
(
!
found
)
return
false
let
end
=
found
.
index
+
found
[
0
].
length
line
[
prop
]
=
cur
.
slice
(
0
,
found
.
index
)
+
(
!
found
.
index
||
end
==
cur
.
length
?
""
:
"
"
)
+
cur
.
slice
(
end
)
||
null
}
return
true
})
}),
addLineWidget
:
docMethodOp
(
function
(
handle
,
node
,
options
)
{
return
addLineWidget
(
this
,
handle
,
node
,
options
)
}),
removeLineWidget
:
function
(
widget
)
{
widget
.
clear
()
},
markText
:
function
(
from
,
to
,
options
)
{
return
markText
(
this
,
clipPos
(
this
,
from
),
clipPos
(
this
,
to
),
options
,
options
&&
options
.
type
||
"
range
"
)
},
setBookmark
:
function
(
pos
,
options
)
{
let
realOpts
=
{
replacedWith
:
options
&&
(
options
.
nodeType
==
null
?
options
.
widget
:
options
),
insertLeft
:
options
&&
options
.
insertLeft
,
clearWhenEmpty
:
false
,
shared
:
options
&&
options
.
shared
,
handleMouseEvents
:
options
&&
options
.
handleMouseEvents
}
pos
=
clipPos
(
this
,
pos
)
return
markText
(
this
,
pos
,
pos
,
realOpts
,
"
bookmark
"
)
},
findMarksAt
:
function
(
pos
)
{
pos
=
clipPos
(
this
,
pos
)
let
markers
=
[],
spans
=
getLine
(
this
,
pos
.
line
).
markedSpans
if
(
spans
)
for
(
let
i
=
0
;
i
<
spans
.
length
;
++
i
)
{
let
span
=
spans
[
i
]
if
((
span
.
from
==
null
||
span
.
from
<=
pos
.
ch
)
&&
(
span
.
to
==
null
||
span
.
to
>=
pos
.
ch
))
markers
.
push
(
span
.
marker
.
parent
||
span
.
marker
)
}
return
markers
},
findMarks
:
function
(
from
,
to
,
filter
)
{
from
=
clipPos
(
this
,
from
);
to
=
clipPos
(
this
,
to
)
let
found
=
[],
lineNo
=
from
.
line
this
.
iter
(
from
.
line
,
to
.
line
+
1
,
line
=>
{
let
spans
=
line
.
markedSpans
if
(
spans
)
for
(
let
i
=
0
;
i
<
spans
.
length
;
i
++
)
{
let
span
=
spans
[
i
]
if
(
!
(
span
.
to
!=
null
&&
lineNo
==
from
.
line
&&
from
.
ch
>=
span
.
to
||
span
.
from
==
null
&&
lineNo
!=
from
.
line
||
span
.
from
!=
null
&&
lineNo
==
to
.
line
&&
span
.
from
>=
to
.
ch
)
&&
(
!
filter
||
filter
(
span
.
marker
)))
found
.
push
(
span
.
marker
.
parent
||
span
.
marker
)
}
++
lineNo
})
return
found
},
getAllMarks
:
function
()
{
let
markers
=
[]
this
.
iter
(
line
=>
{
let
sps
=
line
.
markedSpans
if
(
sps
)
for
(
let
i
=
0
;
i
<
sps
.
length
;
++
i
)
if
(
sps
[
i
].
from
!=
null
)
markers
.
push
(
sps
[
i
].
marker
)
})
return
markers
},
posFromIndex
:
function
(
off
)
{
let
ch
,
lineNo
=
this
.
first
,
sepSize
=
this
.
lineSeparator
().
length
this
.
iter
(
line
=>
{
let
sz
=
line
.
text
.
length
+
sepSize
if
(
sz
>
off
)
{
ch
=
off
;
return
true
}
off
-=
sz
++
lineNo
})
return
clipPos
(
this
,
Pos
(
lineNo
,
ch
))
},
indexFromPos
:
function
(
coords
)
{
coords
=
clipPos
(
this
,
coords
)
let
index
=
coords
.
ch
if
(
coords
.
line
<
this
.
first
||
coords
.
ch
<
0
)
return
0
let
sepSize
=
this
.
lineSeparator
().
length
this
.
iter
(
this
.
first
,
coords
.
line
,
line
=>
{
// iter aborts when callback returns a truthy value
index
+=
line
.
text
.
length
+
sepSize
})
return
index
},
copy
:
function
(
copyHistory
)
{
let
doc
=
new
Doc
(
getLines
(
this
,
this
.
first
,
this
.
first
+
this
.
size
),
this
.
modeOption
,
this
.
first
,
this
.
lineSep
)
doc
.
scrollTop
=
this
.
scrollTop
;
doc
.
scrollLeft
=
this
.
scrollLeft
doc
.
sel
=
this
.
sel
doc
.
extend
=
false
if
(
copyHistory
)
{
doc
.
history
.
undoDepth
=
this
.
history
.
undoDepth
doc
.
setHistory
(
this
.
getHistory
())
}
return
doc
},
linkedDoc
:
function
(
options
)
{
if
(
!
options
)
options
=
{}
let
from
=
this
.
first
,
to
=
this
.
first
+
this
.
size
if
(
options
.
from
!=
null
&&
options
.
from
>
from
)
from
=
options
.
from
if
(
options
.
to
!=
null
&&
options
.
to
<
to
)
to
=
options
.
to
let
copy
=
new
Doc
(
getLines
(
this
,
from
,
to
),
options
.
mode
||
this
.
modeOption
,
from
,
this
.
lineSep
)
if
(
options
.
sharedHist
)
copy
.
history
=
this
.
history
;(
this
.
linked
||
(
this
.
linked
=
[])).
push
({
doc
:
copy
,
sharedHist
:
options
.
sharedHist
})
copy
.
linked
=
[{
doc
:
this
,
isParent
:
true
,
sharedHist
:
options
.
sharedHist
}]
copySharedMarkers
(
copy
,
findSharedMarkers
(
this
))
return
copy
},
unlinkDoc
:
function
(
other
)
{
if
(
other
instanceof
CodeMirror
)
other
=
other
.
doc
if
(
this
.
linked
)
for
(
let
i
=
0
;
i
<
this
.
linked
.
length
;
++
i
)
{
let
link
=
this
.
linked
[
i
]
if
(
link
.
doc
!=
other
)
continue
this
.
linked
.
splice
(
i
,
1
)
other
.
unlinkDoc
(
this
)
detachSharedMarkers
(
findSharedMarkers
(
this
))
break
}
// If the histories were shared, split them again
if
(
other
.
history
==
this
.
history
)
{
let
splitIds
=
[
other
.
id
]
linkedDocs
(
other
,
doc
=>
splitIds
.
push
(
doc
.
id
),
true
)
other
.
history
=
new
History
(
null
)
other
.
history
.
done
=
copyHistoryArray
(
this
.
history
.
done
,
splitIds
)
other
.
history
.
undone
=
copyHistoryArray
(
this
.
history
.
undone
,
splitIds
)
}
},
iterLinkedDocs
:
function
(
f
)
{
linkedDocs
(
this
,
f
)},
getMode
:
function
()
{
return
this
.
mode
},
getEditor
:
function
()
{
return
this
.
cm
},
splitLines
:
function
(
str
)
{
if
(
this
.
lineSep
)
return
str
.
split
(
this
.
lineSep
)
return
splitLinesAuto
(
str
)
},
lineSeparator
:
function
()
{
return
this
.
lineSep
||
"
\n
"
}
})
// Public alias.
Doc
.
prototype
.
eachLine
=
Doc
.
prototype
.
iter
export
default
Doc
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model/Doc.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
Doc.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model/change_measurement.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
cmp
,
Pos
}
from
"
../line/pos
"
import
{
lst
}
from
"
../util/misc
"
import
{
normalizeSelection
,
Range
,
Selection
}
from
"
./selection
"
// Compute the position of the end of a change (its 'to' property
// refers to the pre-change end).
export
function
changeEnd
(
change
)
{
if
(
!
change
.
text
)
return
change
.
to
return
Pos
(
change
.
from
.
line
+
change
.
text
.
length
-
1
,
lst
(
change
.
text
).
length
+
(
change
.
text
.
length
==
1
?
change
.
from
.
ch
:
0
))
}
// Adjust a position to refer to the post-change position of the
// same text, or the end of the change if the change covers it.
function
adjustForChange
(
pos
,
change
)
{
if
(
cmp
(
pos
,
change
.
from
)
<
0
)
return
pos
if
(
cmp
(
pos
,
change
.
to
)
<=
0
)
return
changeEnd
(
change
)
let
line
=
pos
.
line
+
change
.
text
.
length
-
(
change
.
to
.
line
-
change
.
from
.
line
)
-
1
,
ch
=
pos
.
ch
if
(
pos
.
line
==
change
.
to
.
line
)
ch
+=
changeEnd
(
change
).
ch
-
change
.
to
.
ch
return
Pos
(
line
,
ch
)
}
export
function
computeSelAfterChange
(
doc
,
change
)
{
let
out
=
[]
for
(
let
i
=
0
;
i
<
doc
.
sel
.
ranges
.
length
;
i
++
)
{
let
range
=
doc
.
sel
.
ranges
[
i
]
out
.
push
(
new
Range
(
adjustForChange
(
range
.
anchor
,
change
),
adjustForChange
(
range
.
head
,
change
)))
}
return
normalizeSelection
(
out
,
doc
.
sel
.
primIndex
)
}
function
offsetPos
(
pos
,
old
,
nw
)
{
if
(
pos
.
line
==
old
.
line
)
return
Pos
(
nw
.
line
,
pos
.
ch
-
old
.
ch
+
nw
.
ch
)
else
return
Pos
(
nw
.
line
+
(
pos
.
line
-
old
.
line
),
pos
.
ch
)
}
// Used by replaceSelections to allow moving the selection to the
// start or around the replaced test. Hint may be "start" or "around".
export
function
computeReplacedSel
(
doc
,
changes
,
hint
)
{
let
out
=
[]
let
oldPrev
=
Pos
(
doc
.
first
,
0
),
newPrev
=
oldPrev
for
(
let
i
=
0
;
i
<
changes
.
length
;
i
++
)
{
let
change
=
changes
[
i
]
let
from
=
offsetPos
(
change
.
from
,
oldPrev
,
newPrev
)
let
to
=
offsetPos
(
changeEnd
(
change
),
oldPrev
,
newPrev
)
oldPrev
=
change
.
to
newPrev
=
to
if
(
hint
==
"
around
"
)
{
let
range
=
doc
.
sel
.
ranges
[
i
],
inv
=
cmp
(
range
.
head
,
range
.
anchor
)
<
0
out
[
i
]
=
new
Range
(
inv
?
to
:
from
,
inv
?
from
:
to
)
}
else
{
out
[
i
]
=
new
Range
(
from
,
from
)
}
}
return
new
Selection
(
out
,
doc
.
sel
.
primIndex
)
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model/change_measurement.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
change_measurement.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model/changes.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
startWorker
}
from
"
../display/highlight_worker
"
import
{
operation
}
from
"
../display/operations
"
import
{
regChange
,
regLineChange
}
from
"
../display/view_tracking
"
import
{
clipLine
,
clipPos
,
cmp
,
Pos
}
from
"
../line/pos
"
import
{
sawReadOnlySpans
}
from
"
../line/saw_special_spans
"
import
{
lineLength
,
removeReadOnlyRanges
,
stretchSpansOverChange
,
visualLine
}
from
"
../line/spans
"
import
{
getBetween
,
getLine
,
lineNo
}
from
"
../line/utils_line
"
import
{
estimateHeight
}
from
"
../measurement/position_measurement
"
import
{
hasHandler
,
signal
,
signalCursorActivity
}
from
"
../util/event
"
import
{
indexOf
,
lst
,
map
,
sel_dontScroll
}
from
"
../util/misc
"
import
{
signalLater
}
from
"
../util/operation_group
"
import
{
changeEnd
,
computeSelAfterChange
}
from
"
./change_measurement
"
import
{
isWholeLineUpdate
,
linkedDocs
,
updateDoc
}
from
"
./document_data
"
import
{
addChangeToHistory
,
historyChangeFromChange
,
mergeOldSpans
,
pushSelectionToHistory
}
from
"
./history
"
import
{
Range
,
Selection
}
from
"
./selection
"
import
{
setSelection
,
setSelectionNoUndo
}
from
"
./selection_updates
"
// UPDATING
// Allow "beforeChange" event handlers to influence a change
function
filterChange
(
doc
,
change
,
update
)
{
let
obj
=
{
canceled
:
false
,
from
:
change
.
from
,
to
:
change
.
to
,
text
:
change
.
text
,
origin
:
change
.
origin
,
cancel
:
()
=>
obj
.
canceled
=
true
}
if
(
update
)
obj
.
update
=
(
from
,
to
,
text
,
origin
)
=>
{
if
(
from
)
obj
.
from
=
clipPos
(
doc
,
from
)
if
(
to
)
obj
.
to
=
clipPos
(
doc
,
to
)
if
(
text
)
obj
.
text
=
text
if
(
origin
!==
undefined
)
obj
.
origin
=
origin
}
signal
(
doc
,
"
beforeChange
"
,
doc
,
obj
)
if
(
doc
.
cm
)
signal
(
doc
.
cm
,
"
beforeChange
"
,
doc
.
cm
,
obj
)
if
(
obj
.
canceled
)
return
null
return
{
from
:
obj
.
from
,
to
:
obj
.
to
,
text
:
obj
.
text
,
origin
:
obj
.
origin
}
}
// Apply a change to a document, and add it to the document's
// history, and propagating it to all linked documents.
export
function
makeChange
(
doc
,
change
,
ignoreReadOnly
)
{
if
(
doc
.
cm
)
{
if
(
!
doc
.
cm
.
curOp
)
return
operation
(
doc
.
cm
,
makeChange
)(
doc
,
change
,
ignoreReadOnly
)
if
(
doc
.
cm
.
state
.
suppressEdits
)
return
}
if
(
hasHandler
(
doc
,
"
beforeChange
"
)
||
doc
.
cm
&&
hasHandler
(
doc
.
cm
,
"
beforeChange
"
))
{
change
=
filterChange
(
doc
,
change
,
true
)
if
(
!
change
)
return
}
// Possibly split or suppress the update based on the presence
// of read-only spans in its range.
let
split
=
sawReadOnlySpans
&&
!
ignoreReadOnly
&&
removeReadOnlyRanges
(
doc
,
change
.
from
,
change
.
to
)
if
(
split
)
{
for
(
let
i
=
split
.
length
-
1
;
i
>=
0
;
--
i
)
makeChangeInner
(
doc
,
{
from
:
split
[
i
].
from
,
to
:
split
[
i
].
to
,
text
:
i
?
[
""
]
:
change
.
text
})
}
else
{
makeChangeInner
(
doc
,
change
)
}
}
function
makeChangeInner
(
doc
,
change
)
{
if
(
change
.
text
.
length
==
1
&&
change
.
text
[
0
]
==
""
&&
cmp
(
change
.
from
,
change
.
to
)
==
0
)
return
let
selAfter
=
computeSelAfterChange
(
doc
,
change
)
addChangeToHistory
(
doc
,
change
,
selAfter
,
doc
.
cm
?
doc
.
cm
.
curOp
.
id
:
NaN
)
makeChangeSingleDoc
(
doc
,
change
,
selAfter
,
stretchSpansOverChange
(
doc
,
change
))
let
rebased
=
[]
linkedDocs
(
doc
,
(
doc
,
sharedHist
)
=>
{
if
(
!
sharedHist
&&
indexOf
(
rebased
,
doc
.
history
)
==
-
1
)
{
rebaseHist
(
doc
.
history
,
change
)
rebased
.
push
(
doc
.
history
)
}
makeChangeSingleDoc
(
doc
,
change
,
null
,
stretchSpansOverChange
(
doc
,
change
))
})
}
// Revert a change stored in a document's history.
export
function
makeChangeFromHistory
(
doc
,
type
,
allowSelectionOnly
)
{
if
(
doc
.
cm
&&
doc
.
cm
.
state
.
suppressEdits
&&
!
allowSelectionOnly
)
return
let
hist
=
doc
.
history
,
event
,
selAfter
=
doc
.
sel
let
source
=
type
==
"
undo
"
?
hist
.
done
:
hist
.
undone
,
dest
=
type
==
"
undo
"
?
hist
.
undone
:
hist
.
done
// Verify that there is a useable event (so that ctrl-z won't
// needlessly clear selection events)
let
i
=
0
for
(;
i
<
source
.
length
;
i
++
)
{
event
=
source
[
i
]
if
(
allowSelectionOnly
?
event
.
ranges
&&
!
event
.
equals
(
doc
.
sel
)
:
!
event
.
ranges
)
break
}
if
(
i
==
source
.
length
)
return
hist
.
lastOrigin
=
hist
.
lastSelOrigin
=
null
for
(;;)
{
event
=
source
.
pop
()
if
(
event
.
ranges
)
{
pushSelectionToHistory
(
event
,
dest
)
if
(
allowSelectionOnly
&&
!
event
.
equals
(
doc
.
sel
))
{
setSelection
(
doc
,
event
,
{
clearRedo
:
false
})
return
}
selAfter
=
event
}
else
break
}
// Build up a reverse change object to add to the opposite history
// stack (redo when undoing, and vice versa).
let
antiChanges
=
[]
pushSelectionToHistory
(
selAfter
,
dest
)
dest
.
push
({
changes
:
antiChanges
,
generation
:
hist
.
generation
})
hist
.
generation
=
event
.
generation
||
++
hist
.
maxGeneration
let
filter
=
hasHandler
(
doc
,
"
beforeChange
"
)
||
doc
.
cm
&&
hasHandler
(
doc
.
cm
,
"
beforeChange
"
)
for
(
let
i
=
event
.
changes
.
length
-
1
;
i
>=
0
;
--
i
)
{
let
change
=
event
.
changes
[
i
]
change
.
origin
=
type
if
(
filter
&&
!
filterChange
(
doc
,
change
,
false
))
{
source
.
length
=
0
return
}
antiChanges
.
push
(
historyChangeFromChange
(
doc
,
change
))
let
after
=
i
?
computeSelAfterChange
(
doc
,
change
)
:
lst
(
source
)
makeChangeSingleDoc
(
doc
,
change
,
after
,
mergeOldSpans
(
doc
,
change
))
if
(
!
i
&&
doc
.
cm
)
doc
.
cm
.
scrollIntoView
({
from
:
change
.
from
,
to
:
changeEnd
(
change
)})
let
rebased
=
[]
// Propagate to the linked documents
linkedDocs
(
doc
,
(
doc
,
sharedHist
)
=>
{
if
(
!
sharedHist
&&
indexOf
(
rebased
,
doc
.
history
)
==
-
1
)
{
rebaseHist
(
doc
.
history
,
change
)
rebased
.
push
(
doc
.
history
)
}
makeChangeSingleDoc
(
doc
,
change
,
null
,
mergeOldSpans
(
doc
,
change
))
})
}
}
// Sub-views need their line numbers shifted when text is added
// above or below them in the parent document.
function
shiftDoc
(
doc
,
distance
)
{
if
(
distance
==
0
)
return
doc
.
first
+=
distance
doc
.
sel
=
new
Selection
(
map
(
doc
.
sel
.
ranges
,
range
=>
new
Range
(
Pos
(
range
.
anchor
.
line
+
distance
,
range
.
anchor
.
ch
),
Pos
(
range
.
head
.
line
+
distance
,
range
.
head
.
ch
)
)),
doc
.
sel
.
primIndex
)
if
(
doc
.
cm
)
{
regChange
(
doc
.
cm
,
doc
.
first
,
doc
.
first
-
distance
,
distance
)
for
(
let
d
=
doc
.
cm
.
display
,
l
=
d
.
viewFrom
;
l
<
d
.
viewTo
;
l
++
)
regLineChange
(
doc
.
cm
,
l
,
"
gutter
"
)
}
}
// More lower-level change function, handling only a single document
// (not linked ones).
function
makeChangeSingleDoc
(
doc
,
change
,
selAfter
,
spans
)
{
if
(
doc
.
cm
&&
!
doc
.
cm
.
curOp
)
return
operation
(
doc
.
cm
,
makeChangeSingleDoc
)(
doc
,
change
,
selAfter
,
spans
)
if
(
change
.
to
.
line
<
doc
.
first
)
{
shiftDoc
(
doc
,
change
.
text
.
length
-
1
-
(
change
.
to
.
line
-
change
.
from
.
line
))
return
}
if
(
change
.
from
.
line
>
doc
.
lastLine
())
return
// Clip the change to the size of this doc
if
(
change
.
from
.
line
<
doc
.
first
)
{
let
shift
=
change
.
text
.
length
-
1
-
(
doc
.
first
-
change
.
from
.
line
)
shiftDoc
(
doc
,
shift
)
change
=
{
from
:
Pos
(
doc
.
first
,
0
),
to
:
Pos
(
change
.
to
.
line
+
shift
,
change
.
to
.
ch
),
text
:
[
lst
(
change
.
text
)],
origin
:
change
.
origin
}
}
let
last
=
doc
.
lastLine
()
if
(
change
.
to
.
line
>
last
)
{
change
=
{
from
:
change
.
from
,
to
:
Pos
(
last
,
getLine
(
doc
,
last
).
text
.
length
),
text
:
[
change
.
text
[
0
]],
origin
:
change
.
origin
}
}
change
.
removed
=
getBetween
(
doc
,
change
.
from
,
change
.
to
)
if
(
!
selAfter
)
selAfter
=
computeSelAfterChange
(
doc
,
change
)
if
(
doc
.
cm
)
makeChangeSingleDocInEditor
(
doc
.
cm
,
change
,
spans
)
else
updateDoc
(
doc
,
change
,
spans
)
setSelectionNoUndo
(
doc
,
selAfter
,
sel_dontScroll
)
}
// Handle the interaction of a change to a document with the editor
// that this document is part of.
function
makeChangeSingleDocInEditor
(
cm
,
change
,
spans
)
{
let
doc
=
cm
.
doc
,
display
=
cm
.
display
,
from
=
change
.
from
,
to
=
change
.
to
let
recomputeMaxLength
=
false
,
checkWidthStart
=
from
.
line
if
(
!
cm
.
options
.
lineWrapping
)
{
checkWidthStart
=
lineNo
(
visualLine
(
getLine
(
doc
,
from
.
line
)))
doc
.
iter
(
checkWidthStart
,
to
.
line
+
1
,
line
=>
{
if
(
line
==
display
.
maxLine
)
{
recomputeMaxLength
=
true
return
true
}
})
}
if
(
doc
.
sel
.
contains
(
change
.
from
,
change
.
to
)
>
-
1
)
signalCursorActivity
(
cm
)
updateDoc
(
doc
,
change
,
spans
,
estimateHeight
(
cm
))
if
(
!
cm
.
options
.
lineWrapping
)
{
doc
.
iter
(
checkWidthStart
,
from
.
line
+
change
.
text
.
length
,
line
=>
{
let
len
=
lineLength
(
line
)
if
(
len
>
display
.
maxLineLength
)
{
display
.
maxLine
=
line
display
.
maxLineLength
=
len
display
.
maxLineChanged
=
true
recomputeMaxLength
=
false
}
})
if
(
recomputeMaxLength
)
cm
.
curOp
.
updateMaxLine
=
true
}
// Adjust frontier, schedule worker
doc
.
frontier
=
Math
.
min
(
doc
.
frontier
,
from
.
line
)
startWorker
(
cm
,
400
)
let
lendiff
=
change
.
text
.
length
-
(
to
.
line
-
from
.
line
)
-
1
// Remember that these lines changed, for updating the display
if
(
change
.
full
)
regChange
(
cm
)
else
if
(
from
.
line
==
to
.
line
&&
change
.
text
.
length
==
1
&&
!
isWholeLineUpdate
(
cm
.
doc
,
change
))
regLineChange
(
cm
,
from
.
line
,
"
text
"
)
else
regChange
(
cm
,
from
.
line
,
to
.
line
+
1
,
lendiff
)
let
changesHandler
=
hasHandler
(
cm
,
"
changes
"
),
changeHandler
=
hasHandler
(
cm
,
"
change
"
)
if
(
changeHandler
||
changesHandler
)
{
let
obj
=
{
from
:
from
,
to
:
to
,
text
:
change
.
text
,
removed
:
change
.
removed
,
origin
:
change
.
origin
}
if
(
changeHandler
)
signalLater
(
cm
,
"
change
"
,
cm
,
obj
)
if
(
changesHandler
)
(
cm
.
curOp
.
changeObjs
||
(
cm
.
curOp
.
changeObjs
=
[])).
push
(
obj
)
}
cm
.
display
.
selForContextMenu
=
null
}
export
function
replaceRange
(
doc
,
code
,
from
,
to
,
origin
)
{
if
(
!
to
)
to
=
from
if
(
cmp
(
to
,
from
)
<
0
)
{
let
tmp
=
to
;
to
=
from
;
from
=
tmp
}
if
(
typeof
code
==
"
string
"
)
code
=
doc
.
splitLines
(
code
)
makeChange
(
doc
,
{
from
:
from
,
to
:
to
,
text
:
code
,
origin
:
origin
})
}
// Rebasing/resetting history to deal with externally-sourced changes
function
rebaseHistSelSingle
(
pos
,
from
,
to
,
diff
)
{
if
(
to
<
pos
.
line
)
{
pos
.
line
+=
diff
}
else
if
(
from
<
pos
.
line
)
{
pos
.
line
=
from
pos
.
ch
=
0
}
}
// Tries to rebase an array of history events given a change in the
// document. If the change touches the same lines as the event, the
// event, and everything 'behind' it, is discarded. If the change is
// before the event, the event's positions are updated. Uses a
// copy-on-write scheme for the positions, to avoid having to
// reallocate them all on every rebase, but also avoid problems with
// shared position objects being unsafely updated.
function
rebaseHistArray
(
array
,
from
,
to
,
diff
)
{
for
(
let
i
=
0
;
i
<
array
.
length
;
++
i
)
{
let
sub
=
array
[
i
],
ok
=
true
if
(
sub
.
ranges
)
{
if
(
!
sub
.
copied
)
{
sub
=
array
[
i
]
=
sub
.
deepCopy
();
sub
.
copied
=
true
}
for
(
let
j
=
0
;
j
<
sub
.
ranges
.
length
;
j
++
)
{
rebaseHistSelSingle
(
sub
.
ranges
[
j
].
anchor
,
from
,
to
,
diff
)
rebaseHistSelSingle
(
sub
.
ranges
[
j
].
head
,
from
,
to
,
diff
)
}
continue
}
for
(
let
j
=
0
;
j
<
sub
.
changes
.
length
;
++
j
)
{
let
cur
=
sub
.
changes
[
j
]
if
(
to
<
cur
.
from
.
line
)
{
cur
.
from
=
Pos
(
cur
.
from
.
line
+
diff
,
cur
.
from
.
ch
)
cur
.
to
=
Pos
(
cur
.
to
.
line
+
diff
,
cur
.
to
.
ch
)
}
else
if
(
from
<=
cur
.
to
.
line
)
{
ok
=
false
break
}
}
if
(
!
ok
)
{
array
.
splice
(
0
,
i
+
1
)
i
=
0
}
}
}
function
rebaseHist
(
hist
,
change
)
{
let
from
=
change
.
from
.
line
,
to
=
change
.
to
.
line
,
diff
=
change
.
text
.
length
-
(
to
-
from
)
-
1
rebaseHistArray
(
hist
.
done
,
from
,
to
,
diff
)
rebaseHistArray
(
hist
.
undone
,
from
,
to
,
diff
)
}
// Utility for applying a change to a line by handle or number,
// returning the number and optionally registering the line as
// changed.
export
function
changeLine
(
doc
,
handle
,
changeType
,
op
)
{
let
no
=
handle
,
line
=
handle
if
(
typeof
handle
==
"
number
"
)
line
=
getLine
(
doc
,
clipLine
(
doc
,
handle
))
else
no
=
lineNo
(
handle
)
if
(
no
==
null
)
return
null
if
(
op
(
line
,
no
)
&&
doc
.
cm
)
regLineChange
(
doc
.
cm
,
no
,
changeType
)
return
line
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model/changes.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
changes.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model/chunk.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
cleanUpLine
}
from
"
../line/line_data
"
import
{
indexOf
}
from
"
../util/misc
"
import
{
signalLater
}
from
"
../util/operation_group
"
// The document is represented as a BTree consisting of leaves, with
// chunk of lines in them, and branches, with up to ten leaves or
// other branch nodes below them. The top node is always a branch
// node, and is the document object itself (meaning it has
// additional methods and properties).
//
// All nodes have parent links. The tree is used both to go from
// line numbers to line objects, and to go from objects to numbers.
// It also indexes by height, and is used to convert between height
// and line object, and to find the total height of the document.
//
// See also http://marijnhaverbeke.nl/blog/codemirror-line-tree.html
export
class
LeafChunk
{
constructor
(
lines
)
{
this
.
lines
=
lines
this
.
parent
=
null
let
height
=
0
for
(
let
i
=
0
;
i
<
lines
.
length
;
++
i
)
{
lines
[
i
].
parent
=
this
height
+=
lines
[
i
].
height
}
this
.
height
=
height
}
chunkSize
()
{
return
this
.
lines
.
length
}
// Remove the n lines at offset 'at'.
removeInner
(
at
,
n
)
{
for
(
let
i
=
at
,
e
=
at
+
n
;
i
<
e
;
++
i
)
{
let
line
=
this
.
lines
[
i
]
this
.
height
-=
line
.
height
cleanUpLine
(
line
)
signalLater
(
line
,
"
delete
"
)
}
this
.
lines
.
splice
(
at
,
n
)
}
// Helper used to collapse a small branch into a single leaf.
collapse
(
lines
)
{
lines
.
push
.
apply
(
lines
,
this
.
lines
)
}
// Insert the given array of lines at offset 'at', count them as
// having the given height.
insertInner
(
at
,
lines
,
height
)
{
this
.
height
+=
height
this
.
lines
=
this
.
lines
.
slice
(
0
,
at
).
concat
(
lines
).
concat
(
this
.
lines
.
slice
(
at
))
for
(
let
i
=
0
;
i
<
lines
.
length
;
++
i
)
lines
[
i
].
parent
=
this
}
// Used to iterate over a part of the tree.
iterN
(
at
,
n
,
op
)
{
for
(
let
e
=
at
+
n
;
at
<
e
;
++
at
)
if
(
op
(
this
.
lines
[
at
]))
return
true
}
}
export
class
BranchChunk
{
constructor
(
children
)
{
this
.
children
=
children
let
size
=
0
,
height
=
0
for
(
let
i
=
0
;
i
<
children
.
length
;
++
i
)
{
let
ch
=
children
[
i
]
size
+=
ch
.
chunkSize
();
height
+=
ch
.
height
ch
.
parent
=
this
}
this
.
size
=
size
this
.
height
=
height
this
.
parent
=
null
}
chunkSize
()
{
return
this
.
size
}
removeInner
(
at
,
n
)
{
this
.
size
-=
n
for
(
let
i
=
0
;
i
<
this
.
children
.
length
;
++
i
)
{
let
child
=
this
.
children
[
i
],
sz
=
child
.
chunkSize
()
if
(
at
<
sz
)
{
let
rm
=
Math
.
min
(
n
,
sz
-
at
),
oldHeight
=
child
.
height
child
.
removeInner
(
at
,
rm
)
this
.
height
-=
oldHeight
-
child
.
height
if
(
sz
==
rm
)
{
this
.
children
.
splice
(
i
--
,
1
);
child
.
parent
=
null
}
if
((
n
-=
rm
)
==
0
)
break
at
=
0
}
else
at
-=
sz
}
// If the result is smaller than 25 lines, ensure that it is a
// single leaf node.
if
(
this
.
size
-
n
<
25
&&
(
this
.
children
.
length
>
1
||
!
(
this
.
children
[
0
]
instanceof
LeafChunk
)))
{
let
lines
=
[]
this
.
collapse
(
lines
)
this
.
children
=
[
new
LeafChunk
(
lines
)]
this
.
children
[
0
].
parent
=
this
}
}
collapse
(
lines
)
{
for
(
let
i
=
0
;
i
<
this
.
children
.
length
;
++
i
)
this
.
children
[
i
].
collapse
(
lines
)
}
insertInner
(
at
,
lines
,
height
)
{
this
.
size
+=
lines
.
length
this
.
height
+=
height
for
(
let
i
=
0
;
i
<
this
.
children
.
length
;
++
i
)
{
let
child
=
this
.
children
[
i
],
sz
=
child
.
chunkSize
()
if
(
at
<=
sz
)
{
child
.
insertInner
(
at
,
lines
,
height
)
if
(
child
.
lines
&&
child
.
lines
.
length
>
50
)
{
// To avoid memory thrashing when child.lines is huge (e.g. first view of a large file), it's never spliced.
// Instead, small slices are taken. They're taken in order because sequential memory accesses are fastest.
let
remaining
=
child
.
lines
.
length
%
25
+
25
for
(
let
pos
=
remaining
;
pos
<
child
.
lines
.
length
;)
{
let
leaf
=
new
LeafChunk
(
child
.
lines
.
slice
(
pos
,
pos
+=
25
))
child
.
height
-=
leaf
.
height
this
.
children
.
splice
(
++
i
,
0
,
leaf
)
leaf
.
parent
=
this
}
child
.
lines
=
child
.
lines
.
slice
(
0
,
remaining
)
this
.
maybeSpill
()
}
break
}
at
-=
sz
}
}
// When a node has grown, check whether it should be split.
maybeSpill
()
{
if
(
this
.
children
.
length
<=
10
)
return
let
me
=
this
do
{
let
spilled
=
me
.
children
.
splice
(
me
.
children
.
length
-
5
,
5
)
let
sibling
=
new
BranchChunk
(
spilled
)
if
(
!
me
.
parent
)
{
// Become the parent node
let
copy
=
new
BranchChunk
(
me
.
children
)
copy
.
parent
=
me
me
.
children
=
[
copy
,
sibling
]
me
=
copy
}
else
{
me
.
size
-=
sibling
.
size
me
.
height
-=
sibling
.
height
let
myIndex
=
indexOf
(
me
.
parent
.
children
,
me
)
me
.
parent
.
children
.
splice
(
myIndex
+
1
,
0
,
sibling
)
}
sibling
.
parent
=
me
.
parent
}
while
(
me
.
children
.
length
>
10
)
me
.
parent
.
maybeSpill
()
}
iterN
(
at
,
n
,
op
)
{
for
(
let
i
=
0
;
i
<
this
.
children
.
length
;
++
i
)
{
let
child
=
this
.
children
[
i
],
sz
=
child
.
chunkSize
()
if
(
at
<
sz
)
{
let
used
=
Math
.
min
(
n
,
sz
-
at
)
if
(
child
.
iterN
(
at
,
used
,
op
))
return
true
if
((
n
-=
used
)
==
0
)
break
at
=
0
}
else
at
-=
sz
}
}
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model/chunk.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
chunk.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model/document_data.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
loadMode
}
from
"
../display/mode_state
"
import
{
regChange
}
from
"
../display/view_tracking
"
import
{
Line
,
updateLine
}
from
"
../line/line_data
"
import
{
findMaxLine
}
from
"
../line/spans
"
import
{
getLine
}
from
"
../line/utils_line
"
import
{
estimateLineHeights
}
from
"
../measurement/position_measurement
"
import
{
lst
}
from
"
../util/misc
"
import
{
signalLater
}
from
"
../util/operation_group
"
// DOCUMENT DATA STRUCTURE
// By default, updates that start and end at the beginning of a line
// are treated specially, in order to make the association of line
// widgets and marker elements with the text behave more intuitive.
export
function
isWholeLineUpdate
(
doc
,
change
)
{
return
change
.
from
.
ch
==
0
&&
change
.
to
.
ch
==
0
&&
lst
(
change
.
text
)
==
""
&&
(
!
doc
.
cm
||
doc
.
cm
.
options
.
wholeLineUpdateBefore
)
}
// Perform a change on the document data structure.
export
function
updateDoc
(
doc
,
change
,
markedSpans
,
estimateHeight
)
{
function
spansFor
(
n
)
{
return
markedSpans
?
markedSpans
[
n
]
:
null
}
function
update
(
line
,
text
,
spans
)
{
updateLine
(
line
,
text
,
spans
,
estimateHeight
)
signalLater
(
line
,
"
change
"
,
line
,
change
)
}
function
linesFor
(
start
,
end
)
{
let
result
=
[]
for
(
let
i
=
start
;
i
<
end
;
++
i
)
result
.
push
(
new
Line
(
text
[
i
],
spansFor
(
i
),
estimateHeight
))
return
result
}
let
from
=
change
.
from
,
to
=
change
.
to
,
text
=
change
.
text
let
firstLine
=
getLine
(
doc
,
from
.
line
),
lastLine
=
getLine
(
doc
,
to
.
line
)
let
lastText
=
lst
(
text
),
lastSpans
=
spansFor
(
text
.
length
-
1
),
nlines
=
to
.
line
-
from
.
line
// Adjust the line structure
if
(
change
.
full
)
{
doc
.
insert
(
0
,
linesFor
(
0
,
text
.
length
))
doc
.
remove
(
text
.
length
,
doc
.
size
-
text
.
length
)
}
else
if
(
isWholeLineUpdate
(
doc
,
change
))
{
// This is a whole-line replace. Treated specially to make
// sure line objects move the way they are supposed to.
let
added
=
linesFor
(
0
,
text
.
length
-
1
)
update
(
lastLine
,
lastLine
.
text
,
lastSpans
)
if
(
nlines
)
doc
.
remove
(
from
.
line
,
nlines
)
if
(
added
.
length
)
doc
.
insert
(
from
.
line
,
added
)
}
else
if
(
firstLine
==
lastLine
)
{
if
(
text
.
length
==
1
)
{
update
(
firstLine
,
firstLine
.
text
.
slice
(
0
,
from
.
ch
)
+
lastText
+
firstLine
.
text
.
slice
(
to
.
ch
),
lastSpans
)
}
else
{
let
added
=
linesFor
(
1
,
text
.
length
-
1
)
added
.
push
(
new
Line
(
lastText
+
firstLine
.
text
.
slice
(
to
.
ch
),
lastSpans
,
estimateHeight
))
update
(
firstLine
,
firstLine
.
text
.
slice
(
0
,
from
.
ch
)
+
text
[
0
],
spansFor
(
0
))
doc
.
insert
(
from
.
line
+
1
,
added
)
}
}
else
if
(
text
.
length
==
1
)
{
update
(
firstLine
,
firstLine
.
text
.
slice
(
0
,
from
.
ch
)
+
text
[
0
]
+
lastLine
.
text
.
slice
(
to
.
ch
),
spansFor
(
0
))
doc
.
remove
(
from
.
line
+
1
,
nlines
)
}
else
{
update
(
firstLine
,
firstLine
.
text
.
slice
(
0
,
from
.
ch
)
+
text
[
0
],
spansFor
(
0
))
update
(
lastLine
,
lastText
+
lastLine
.
text
.
slice
(
to
.
ch
),
lastSpans
)
let
added
=
linesFor
(
1
,
text
.
length
-
1
)
if
(
nlines
>
1
)
doc
.
remove
(
from
.
line
+
1
,
nlines
-
1
)
doc
.
insert
(
from
.
line
+
1
,
added
)
}
signalLater
(
doc
,
"
change
"
,
doc
,
change
)
}
// Call f for all linked documents.
export
function
linkedDocs
(
doc
,
f
,
sharedHistOnly
)
{
function
propagate
(
doc
,
skip
,
sharedHist
)
{
if
(
doc
.
linked
)
for
(
let
i
=
0
;
i
<
doc
.
linked
.
length
;
++
i
)
{
let
rel
=
doc
.
linked
[
i
]
if
(
rel
.
doc
==
skip
)
continue
let
shared
=
sharedHist
&&
rel
.
sharedHist
if
(
sharedHistOnly
&&
!
shared
)
continue
f
(
rel
.
doc
,
shared
)
propagate
(
rel
.
doc
,
doc
,
shared
)
}
}
propagate
(
doc
,
null
,
true
)
}
// Attach a document to an editor.
export
function
attachDoc
(
cm
,
doc
)
{
if
(
doc
.
cm
)
throw
new
Error
(
"
This document is already in use.
"
)
cm
.
doc
=
doc
doc
.
cm
=
cm
estimateLineHeights
(
cm
)
loadMode
(
cm
)
if
(
!
cm
.
options
.
lineWrapping
)
findMaxLine
(
cm
)
cm
.
options
.
mode
=
doc
.
modeOption
regChange
(
cm
)
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model/document_data.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
document_data.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model/history.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
cmp
,
copyPos
}
from
"
../line/pos
"
import
{
stretchSpansOverChange
}
from
"
../line/spans
"
import
{
getBetween
}
from
"
../line/utils_line
"
import
{
signal
}
from
"
../util/event
"
import
{
indexOf
,
lst
}
from
"
../util/misc
"
import
{
changeEnd
}
from
"
./change_measurement
"
import
{
linkedDocs
}
from
"
./document_data
"
import
{
Selection
}
from
"
./selection
"
export
function
History
(
startGen
)
{
// Arrays of change events and selections. Doing something adds an
// event to done and clears undo. Undoing moves events from done
// to undone, redoing moves them in the other direction.
this
.
done
=
[];
this
.
undone
=
[]
this
.
undoDepth
=
Infinity
// Used to track when changes can be merged into a single undo
// event
this
.
lastModTime
=
this
.
lastSelTime
=
0
this
.
lastOp
=
this
.
lastSelOp
=
null
this
.
lastOrigin
=
this
.
lastSelOrigin
=
null
// Used by the isClean() method
this
.
generation
=
this
.
maxGeneration
=
startGen
||
1
}
// Create a history change event from an updateDoc-style change
// object.
export
function
historyChangeFromChange
(
doc
,
change
)
{
let
histChange
=
{
from
:
copyPos
(
change
.
from
),
to
:
changeEnd
(
change
),
text
:
getBetween
(
doc
,
change
.
from
,
change
.
to
)}
attachLocalSpans
(
doc
,
histChange
,
change
.
from
.
line
,
change
.
to
.
line
+
1
)
linkedDocs
(
doc
,
doc
=>
attachLocalSpans
(
doc
,
histChange
,
change
.
from
.
line
,
change
.
to
.
line
+
1
),
true
)
return
histChange
}
// Pop all selection events off the end of a history array. Stop at
// a change event.
function
clearSelectionEvents
(
array
)
{
while
(
array
.
length
)
{
let
last
=
lst
(
array
)
if
(
last
.
ranges
)
array
.
pop
()
else
break
}
}
// Find the top change event in the history. Pop off selection
// events that are in the way.
function
lastChangeEvent
(
hist
,
force
)
{
if
(
force
)
{
clearSelectionEvents
(
hist
.
done
)
return
lst
(
hist
.
done
)
}
else
if
(
hist
.
done
.
length
&&
!
lst
(
hist
.
done
).
ranges
)
{
return
lst
(
hist
.
done
)
}
else
if
(
hist
.
done
.
length
>
1
&&
!
hist
.
done
[
hist
.
done
.
length
-
2
].
ranges
)
{
hist
.
done
.
pop
()
return
lst
(
hist
.
done
)
}
}
// Register a change in the history. Merges changes that are within
// a single operation, or are close together with an origin that
// allows merging (starting with "+") into a single event.
export
function
addChangeToHistory
(
doc
,
change
,
selAfter
,
opId
)
{
let
hist
=
doc
.
history
hist
.
undone
.
length
=
0
let
time
=
+
new
Date
,
cur
let
last
if
((
hist
.
lastOp
==
opId
||
hist
.
lastOrigin
==
change
.
origin
&&
change
.
origin
&&
((
change
.
origin
.
charAt
(
0
)
==
"
+
"
&&
doc
.
cm
&&
hist
.
lastModTime
>
time
-
doc
.
cm
.
options
.
historyEventDelay
)
||
change
.
origin
.
charAt
(
0
)
==
"
*
"
))
&&
(
cur
=
lastChangeEvent
(
hist
,
hist
.
lastOp
==
opId
)))
{
// Merge this change into the last event
last
=
lst
(
cur
.
changes
)
if
(
cmp
(
change
.
from
,
change
.
to
)
==
0
&&
cmp
(
change
.
from
,
last
.
to
)
==
0
)
{
// Optimized case for simple insertion -- don't want to add
// new changesets for every character typed
last
.
to
=
changeEnd
(
change
)
}
else
{
// Add new sub-event
cur
.
changes
.
push
(
historyChangeFromChange
(
doc
,
change
))
}
}
else
{
// Can not be merged, start a new event.
let
before
=
lst
(
hist
.
done
)
if
(
!
before
||
!
before
.
ranges
)
pushSelectionToHistory
(
doc
.
sel
,
hist
.
done
)
cur
=
{
changes
:
[
historyChangeFromChange
(
doc
,
change
)],
generation
:
hist
.
generation
}
hist
.
done
.
push
(
cur
)
while
(
hist
.
done
.
length
>
hist
.
undoDepth
)
{
hist
.
done
.
shift
()
if
(
!
hist
.
done
[
0
].
ranges
)
hist
.
done
.
shift
()
}
}
hist
.
done
.
push
(
selAfter
)
hist
.
generation
=
++
hist
.
maxGeneration
hist
.
lastModTime
=
hist
.
lastSelTime
=
time
hist
.
lastOp
=
hist
.
lastSelOp
=
opId
hist
.
lastOrigin
=
hist
.
lastSelOrigin
=
change
.
origin
if
(
!
last
)
signal
(
doc
,
"
historyAdded
"
)
}
function
selectionEventCanBeMerged
(
doc
,
origin
,
prev
,
sel
)
{
let
ch
=
origin
.
charAt
(
0
)
return
ch
==
"
*
"
||
ch
==
"
+
"
&&
prev
.
ranges
.
length
==
sel
.
ranges
.
length
&&
prev
.
somethingSelected
()
==
sel
.
somethingSelected
()
&&
new
Date
-
doc
.
history
.
lastSelTime
<=
(
doc
.
cm
?
doc
.
cm
.
options
.
historyEventDelay
:
500
)
}
// Called whenever the selection changes, sets the new selection as
// the pending selection in the history, and pushes the old pending
// selection into the 'done' array when it was significantly
// different (in number of selected ranges, emptiness, or time).
export
function
addSelectionToHistory
(
doc
,
sel
,
opId
,
options
)
{
let
hist
=
doc
.
history
,
origin
=
options
&&
options
.
origin
// A new event is started when the previous origin does not match
// the current, or the origins don't allow matching. Origins
// starting with * are always merged, those starting with + are
// merged when similar and close together in time.
if
(
opId
==
hist
.
lastSelOp
||
(
origin
&&
hist
.
lastSelOrigin
==
origin
&&
(
hist
.
lastModTime
==
hist
.
lastSelTime
&&
hist
.
lastOrigin
==
origin
||
selectionEventCanBeMerged
(
doc
,
origin
,
lst
(
hist
.
done
),
sel
))))
hist
.
done
[
hist
.
done
.
length
-
1
]
=
sel
else
pushSelectionToHistory
(
sel
,
hist
.
done
)
hist
.
lastSelTime
=
+
new
Date
hist
.
lastSelOrigin
=
origin
hist
.
lastSelOp
=
opId
if
(
options
&&
options
.
clearRedo
!==
false
)
clearSelectionEvents
(
hist
.
undone
)
}
export
function
pushSelectionToHistory
(
sel
,
dest
)
{
let
top
=
lst
(
dest
)
if
(
!
(
top
&&
top
.
ranges
&&
top
.
equals
(
sel
)))
dest
.
push
(
sel
)
}
// Used to store marked span information in the history.
function
attachLocalSpans
(
doc
,
change
,
from
,
to
)
{
let
existing
=
change
[
"
spans_
"
+
doc
.
id
],
n
=
0
doc
.
iter
(
Math
.
max
(
doc
.
first
,
from
),
Math
.
min
(
doc
.
first
+
doc
.
size
,
to
),
line
=>
{
if
(
line
.
markedSpans
)
(
existing
||
(
existing
=
change
[
"
spans_
"
+
doc
.
id
]
=
{}))[
n
]
=
line
.
markedSpans
++
n
})
}
// When un/re-doing restores text containing marked spans, those
// that have been explicitly cleared should not be restored.
function
removeClearedSpans
(
spans
)
{
if
(
!
spans
)
return
null
let
out
for
(
let
i
=
0
;
i
<
spans
.
length
;
++
i
)
{
if
(
spans
[
i
].
marker
.
explicitlyCleared
)
{
if
(
!
out
)
out
=
spans
.
slice
(
0
,
i
)
}
else
if
(
out
)
out
.
push
(
spans
[
i
])
}
return
!
out
?
spans
:
out
.
length
?
out
:
null
}
// Retrieve and filter the old marked spans stored in a change event.
function
getOldSpans
(
doc
,
change
)
{
let
found
=
change
[
"
spans_
"
+
doc
.
id
]
if
(
!
found
)
return
null
let
nw
=
[]
for
(
let
i
=
0
;
i
<
change
.
text
.
length
;
++
i
)
nw
.
push
(
removeClearedSpans
(
found
[
i
]))
return
nw
}
// Used for un/re-doing changes from the history. Combines the
// result of computing the existing spans with the set of spans that
// existed in the history (so that deleting around a span and then
// undoing brings back the span).
export
function
mergeOldSpans
(
doc
,
change
)
{
let
old
=
getOldSpans
(
doc
,
change
)
let
stretched
=
stretchSpansOverChange
(
doc
,
change
)
if
(
!
old
)
return
stretched
if
(
!
stretched
)
return
old
for
(
let
i
=
0
;
i
<
old
.
length
;
++
i
)
{
let
oldCur
=
old
[
i
],
stretchCur
=
stretched
[
i
]
if
(
oldCur
&&
stretchCur
)
{
spans
:
for
(
let
j
=
0
;
j
<
stretchCur
.
length
;
++
j
)
{
let
span
=
stretchCur
[
j
]
for
(
let
k
=
0
;
k
<
oldCur
.
length
;
++
k
)
if
(
oldCur
[
k
].
marker
==
span
.
marker
)
continue
spans
oldCur
.
push
(
span
)
}
}
else
if
(
stretchCur
)
{
old
[
i
]
=
stretchCur
}
}
return
old
}
// Used both to provide a JSON-safe object in .getHistory, and, when
// detaching a document, to split the history in two
export
function
copyHistoryArray
(
events
,
newGroup
,
instantiateSel
)
{
let
copy
=
[]
for
(
let
i
=
0
;
i
<
events
.
length
;
++
i
)
{
let
event
=
events
[
i
]
if
(
event
.
ranges
)
{
copy
.
push
(
instantiateSel
?
Selection
.
prototype
.
deepCopy
.
call
(
event
)
:
event
)
continue
}
let
changes
=
event
.
changes
,
newChanges
=
[]
copy
.
push
({
changes
:
newChanges
})
for
(
let
j
=
0
;
j
<
changes
.
length
;
++
j
)
{
let
change
=
changes
[
j
],
m
newChanges
.
push
({
from
:
change
.
from
,
to
:
change
.
to
,
text
:
change
.
text
})
if
(
newGroup
)
for
(
var
prop
in
change
)
if
(
m
=
prop
.
match
(
/^spans_
(\d
+
)
$/
))
{
if
(
indexOf
(
newGroup
,
Number
(
m
[
1
]))
>
-
1
)
{
lst
(
newChanges
)[
prop
]
=
change
[
prop
]
delete
change
[
prop
]
}
}
}
}
return
copy
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model/history.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
history.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model/line_widget.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
runInOp
}
from
"
../display/operations
"
import
{
addToScrollPos
}
from
"
../display/scrolling
"
import
{
regLineChange
}
from
"
../display/view_tracking
"
import
{
heightAtLine
,
lineIsHidden
}
from
"
../line/spans
"
import
{
lineNo
,
updateLineHeight
}
from
"
../line/utils_line
"
import
{
widgetHeight
}
from
"
../measurement/widgets
"
import
{
changeLine
}
from
"
./changes
"
import
{
eventMixin
}
from
"
../util/event
"
import
{
signalLater
}
from
"
../util/operation_group
"
// Line widgets are block elements displayed above or below a line.
export
class
LineWidget
{
constructor
(
doc
,
node
,
options
)
{
if
(
options
)
for
(
let
opt
in
options
)
if
(
options
.
hasOwnProperty
(
opt
))
this
[
opt
]
=
options
[
opt
]
this
.
doc
=
doc
this
.
node
=
node
}
clear
()
{
let
cm
=
this
.
doc
.
cm
,
ws
=
this
.
line
.
widgets
,
line
=
this
.
line
,
no
=
lineNo
(
line
)
if
(
no
==
null
||
!
ws
)
return
for
(
let
i
=
0
;
i
<
ws
.
length
;
++
i
)
if
(
ws
[
i
]
==
this
)
ws
.
splice
(
i
--
,
1
)
if
(
!
ws
.
length
)
line
.
widgets
=
null
let
height
=
widgetHeight
(
this
)
updateLineHeight
(
line
,
Math
.
max
(
0
,
line
.
height
-
height
))
if
(
cm
)
{
runInOp
(
cm
,
()
=>
{
adjustScrollWhenAboveVisible
(
cm
,
line
,
-
height
)
regLineChange
(
cm
,
no
,
"
widget
"
)
})
signalLater
(
cm
,
"
lineWidgetCleared
"
,
cm
,
this
,
no
)
}
}
changed
()
{
let
oldH
=
this
.
height
,
cm
=
this
.
doc
.
cm
,
line
=
this
.
line
this
.
height
=
null
let
diff
=
widgetHeight
(
this
)
-
oldH
if
(
!
diff
)
return
updateLineHeight
(
line
,
line
.
height
+
diff
)
if
(
cm
)
{
runInOp
(
cm
,
()
=>
{
cm
.
curOp
.
forceUpdate
=
true
adjustScrollWhenAboveVisible
(
cm
,
line
,
diff
)
signalLater
(
cm
,
"
lineWidgetChanged
"
,
cm
,
this
,
lineNo
(
line
))
})
}
}
}
eventMixin
(
LineWidget
)
function
adjustScrollWhenAboveVisible
(
cm
,
line
,
diff
)
{
if
(
heightAtLine
(
line
)
<
((
cm
.
curOp
&&
cm
.
curOp
.
scrollTop
)
||
cm
.
doc
.
scrollTop
))
addToScrollPos
(
cm
,
null
,
diff
)
}
export
function
addLineWidget
(
doc
,
handle
,
node
,
options
)
{
let
widget
=
new
LineWidget
(
doc
,
node
,
options
)
let
cm
=
doc
.
cm
if
(
cm
&&
widget
.
noHScroll
)
cm
.
display
.
alignWidgets
=
true
changeLine
(
doc
,
handle
,
"
widget
"
,
line
=>
{
let
widgets
=
line
.
widgets
||
(
line
.
widgets
=
[])
if
(
widget
.
insertAt
==
null
)
widgets
.
push
(
widget
)
else
widgets
.
splice
(
Math
.
min
(
widgets
.
length
-
1
,
Math
.
max
(
0
,
widget
.
insertAt
)),
0
,
widget
)
widget
.
line
=
line
if
(
cm
&&
!
lineIsHidden
(
doc
,
line
))
{
let
aboveVisible
=
heightAtLine
(
line
)
<
doc
.
scrollTop
updateLineHeight
(
line
,
line
.
height
+
widgetHeight
(
widget
))
if
(
aboveVisible
)
addToScrollPos
(
cm
,
null
,
widget
.
height
)
cm
.
curOp
.
forceUpdate
=
true
}
return
true
})
signalLater
(
cm
,
"
lineWidgetAdded
"
,
cm
,
widget
,
typeof
handle
==
"
number
"
?
handle
:
lineNo
(
handle
))
return
widget
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model/line_widget.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
line_widget.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model/mark_text.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
elt
}
from
"
../util/dom
"
import
{
eventMixin
,
hasHandler
,
on
}
from
"
../util/event
"
import
{
endOperation
,
operation
,
runInOp
,
startOperation
}
from
"
../display/operations
"
import
{
clipPos
,
cmp
,
Pos
}
from
"
../line/pos
"
import
{
lineNo
,
updateLineHeight
}
from
"
../line/utils_line
"
import
{
clearLineMeasurementCacheFor
,
findViewForLine
,
textHeight
}
from
"
../measurement/position_measurement
"
import
{
seeReadOnlySpans
,
seeCollapsedSpans
}
from
"
../line/saw_special_spans
"
import
{
addMarkedSpan
,
conflictingCollapsedRange
,
getMarkedSpanFor
,
lineIsHidden
,
lineLength
,
MarkedSpan
,
removeMarkedSpan
,
visualLine
}
from
"
../line/spans
"
import
{
copyObj
,
indexOf
,
lst
}
from
"
../util/misc
"
import
{
signalLater
}
from
"
../util/operation_group
"
import
{
widgetHeight
}
from
"
../measurement/widgets
"
import
{
regChange
,
regLineChange
}
from
"
../display/view_tracking
"
import
{
linkedDocs
}
from
"
./document_data
"
import
{
addChangeToHistory
}
from
"
./history
"
import
{
reCheckSelection
}
from
"
./selection_updates
"
// TEXTMARKERS
// Created with markText and setBookmark methods. A TextMarker is a
// handle that can be used to clear or find a marked position in the
// document. Line objects hold arrays (markedSpans) containing
// {from, to, marker} object pointing to such marker objects, and
// indicating that such a marker is present on that line. Multiple
// lines may point to the same marker when it spans across lines.
// The spans will have null for their from/to properties when the
// marker continues beyond the start/end of the line. Markers have
// links back to the lines they currently touch.
// Collapsed markers have unique ids, in order to be able to order
// them, which is needed for uniquely determining an outer marker
// when they overlap (they may nest, but not partially overlap).
let
nextMarkerId
=
0
export
class
TextMarker
{
constructor
(
doc
,
type
)
{
this
.
lines
=
[]
this
.
type
=
type
this
.
doc
=
doc
this
.
id
=
++
nextMarkerId
}
// Clear the marker.
clear
()
{
if
(
this
.
explicitlyCleared
)
return
let
cm
=
this
.
doc
.
cm
,
withOp
=
cm
&&
!
cm
.
curOp
if
(
withOp
)
startOperation
(
cm
)
if
(
hasHandler
(
this
,
"
clear
"
))
{
let
found
=
this
.
find
()
if
(
found
)
signalLater
(
this
,
"
clear
"
,
found
.
from
,
found
.
to
)
}
let
min
=
null
,
max
=
null
for
(
let
i
=
0
;
i
<
this
.
lines
.
length
;
++
i
)
{
let
line
=
this
.
lines
[
i
]
let
span
=
getMarkedSpanFor
(
line
.
markedSpans
,
this
)
if
(
cm
&&
!
this
.
collapsed
)
regLineChange
(
cm
,
lineNo
(
line
),
"
text
"
)
else
if
(
cm
)
{
if
(
span
.
to
!=
null
)
max
=
lineNo
(
line
)
if
(
span
.
from
!=
null
)
min
=
lineNo
(
line
)
}
line
.
markedSpans
=
removeMarkedSpan
(
line
.
markedSpans
,
span
)
if
(
span
.
from
==
null
&&
this
.
collapsed
&&
!
lineIsHidden
(
this
.
doc
,
line
)
&&
cm
)
updateLineHeight
(
line
,
textHeight
(
cm
.
display
))
}
if
(
cm
&&
this
.
collapsed
&&
!
cm
.
options
.
lineWrapping
)
for
(
let
i
=
0
;
i
<
this
.
lines
.
length
;
++
i
)
{
let
visual
=
visualLine
(
this
.
lines
[
i
]),
len
=
lineLength
(
visual
)
if
(
len
>
cm
.
display
.
maxLineLength
)
{
cm
.
display
.
maxLine
=
visual
cm
.
display
.
maxLineLength
=
len
cm
.
display
.
maxLineChanged
=
true
}
}
if
(
min
!=
null
&&
cm
&&
this
.
collapsed
)
regChange
(
cm
,
min
,
max
+
1
)
this
.
lines
.
length
=
0
this
.
explicitlyCleared
=
true
if
(
this
.
atomic
&&
this
.
doc
.
cantEdit
)
{
this
.
doc
.
cantEdit
=
false
if
(
cm
)
reCheckSelection
(
cm
.
doc
)
}
if
(
cm
)
signalLater
(
cm
,
"
markerCleared
"
,
cm
,
this
,
min
,
max
)
if
(
withOp
)
endOperation
(
cm
)
if
(
this
.
parent
)
this
.
parent
.
clear
()
}
// Find the position of the marker in the document. Returns a {from,
// to} object by default. Side can be passed to get a specific side
// -- 0 (both), -1 (left), or 1 (right). When lineObj is true, the
// Pos objects returned contain a line object, rather than a line
// number (used to prevent looking up the same line twice).
find
(
side
,
lineObj
)
{
if
(
side
==
null
&&
this
.
type
==
"
bookmark
"
)
side
=
1
let
from
,
to
for
(
let
i
=
0
;
i
<
this
.
lines
.
length
;
++
i
)
{
let
line
=
this
.
lines
[
i
]
let
span
=
getMarkedSpanFor
(
line
.
markedSpans
,
this
)
if
(
span
.
from
!=
null
)
{
from
=
Pos
(
lineObj
?
line
:
lineNo
(
line
),
span
.
from
)
if
(
side
==
-
1
)
return
from
}
if
(
span
.
to
!=
null
)
{
to
=
Pos
(
lineObj
?
line
:
lineNo
(
line
),
span
.
to
)
if
(
side
==
1
)
return
to
}
}
return
from
&&
{
from
:
from
,
to
:
to
}
}
// Signals that the marker's widget changed, and surrounding layout
// should be recomputed.
changed
()
{
let
pos
=
this
.
find
(
-
1
,
true
),
widget
=
this
,
cm
=
this
.
doc
.
cm
if
(
!
pos
||
!
cm
)
return
runInOp
(
cm
,
()
=>
{
let
line
=
pos
.
line
,
lineN
=
lineNo
(
pos
.
line
)
let
view
=
findViewForLine
(
cm
,
lineN
)
if
(
view
)
{
clearLineMeasurementCacheFor
(
view
)
cm
.
curOp
.
selectionChanged
=
cm
.
curOp
.
forceUpdate
=
true
}
cm
.
curOp
.
updateMaxLine
=
true
if
(
!
lineIsHidden
(
widget
.
doc
,
line
)
&&
widget
.
height
!=
null
)
{
let
oldHeight
=
widget
.
height
widget
.
height
=
null
let
dHeight
=
widgetHeight
(
widget
)
-
oldHeight
if
(
dHeight
)
updateLineHeight
(
line
,
line
.
height
+
dHeight
)
}
signalLater
(
cm
,
"
markerChanged
"
,
cm
,
this
)
})
}
attachLine
(
line
)
{
if
(
!
this
.
lines
.
length
&&
this
.
doc
.
cm
)
{
let
op
=
this
.
doc
.
cm
.
curOp
if
(
!
op
.
maybeHiddenMarkers
||
indexOf
(
op
.
maybeHiddenMarkers
,
this
)
==
-
1
)
(
op
.
maybeUnhiddenMarkers
||
(
op
.
maybeUnhiddenMarkers
=
[])).
push
(
this
)
}
this
.
lines
.
push
(
line
)
}
detachLine
(
line
)
{
this
.
lines
.
splice
(
indexOf
(
this
.
lines
,
line
),
1
)
if
(
!
this
.
lines
.
length
&&
this
.
doc
.
cm
)
{
let
op
=
this
.
doc
.
cm
.
curOp
;(
op
.
maybeHiddenMarkers
||
(
op
.
maybeHiddenMarkers
=
[])).
push
(
this
)
}
}
}
eventMixin
(
TextMarker
)
// Create a marker, wire it up to the right lines, and
export
function
markText
(
doc
,
from
,
to
,
options
,
type
)
{
// Shared markers (across linked documents) are handled separately
// (markTextShared will call out to this again, once per
// document).
if
(
options
&&
options
.
shared
)
return
markTextShared
(
doc
,
from
,
to
,
options
,
type
)
// Ensure we are in an operation.
if
(
doc
.
cm
&&
!
doc
.
cm
.
curOp
)
return
operation
(
doc
.
cm
,
markText
)(
doc
,
from
,
to
,
options
,
type
)
let
marker
=
new
TextMarker
(
doc
,
type
),
diff
=
cmp
(
from
,
to
)
if
(
options
)
copyObj
(
options
,
marker
,
false
)
// Don't connect empty markers unless clearWhenEmpty is false
if
(
diff
>
0
||
diff
==
0
&&
marker
.
clearWhenEmpty
!==
false
)
return
marker
if
(
marker
.
replacedWith
)
{
// Showing up as a widget implies collapsed (widget replaces text)
marker
.
collapsed
=
true
marker
.
widgetNode
=
elt
(
"
span
"
,
[
marker
.
replacedWith
],
"
CodeMirror-widget
"
)
marker
.
widgetNode
.
setAttribute
(
"
role
"
,
"
presentation
"
)
// hide from accessibility tree
if
(
!
options
.
handleMouseEvents
)
marker
.
widgetNode
.
setAttribute
(
"
cm-ignore-events
"
,
"
true
"
)
if
(
options
.
insertLeft
)
marker
.
widgetNode
.
insertLeft
=
true
}
if
(
marker
.
collapsed
)
{
if
(
conflictingCollapsedRange
(
doc
,
from
.
line
,
from
,
to
,
marker
)
||
from
.
line
!=
to
.
line
&&
conflictingCollapsedRange
(
doc
,
to
.
line
,
from
,
to
,
marker
))
throw
new
Error
(
"
Inserting collapsed marker partially overlapping an existing one
"
)
seeCollapsedSpans
()
}
if
(
marker
.
addToHistory
)
addChangeToHistory
(
doc
,
{
from
:
from
,
to
:
to
,
origin
:
"
markText
"
},
doc
.
sel
,
NaN
)
let
curLine
=
from
.
line
,
cm
=
doc
.
cm
,
updateMaxLine
doc
.
iter
(
curLine
,
to
.
line
+
1
,
line
=>
{
if
(
cm
&&
marker
.
collapsed
&&
!
cm
.
options
.
lineWrapping
&&
visualLine
(
line
)
==
cm
.
display
.
maxLine
)
updateMaxLine
=
true
if
(
marker
.
collapsed
&&
curLine
!=
from
.
line
)
updateLineHeight
(
line
,
0
)
addMarkedSpan
(
line
,
new
MarkedSpan
(
marker
,
curLine
==
from
.
line
?
from
.
ch
:
null
,
curLine
==
to
.
line
?
to
.
ch
:
null
))
++
curLine
})
// lineIsHidden depends on the presence of the spans, so needs a second pass
if
(
marker
.
collapsed
)
doc
.
iter
(
from
.
line
,
to
.
line
+
1
,
line
=>
{
if
(
lineIsHidden
(
doc
,
line
))
updateLineHeight
(
line
,
0
)
})
if
(
marker
.
clearOnEnter
)
on
(
marker
,
"
beforeCursorEnter
"
,
()
=>
marker
.
clear
())
if
(
marker
.
readOnly
)
{
seeReadOnlySpans
()
if
(
doc
.
history
.
done
.
length
||
doc
.
history
.
undone
.
length
)
doc
.
clearHistory
()
}
if
(
marker
.
collapsed
)
{
marker
.
id
=
++
nextMarkerId
marker
.
atomic
=
true
}
if
(
cm
)
{
// Sync editor state
if
(
updateMaxLine
)
cm
.
curOp
.
updateMaxLine
=
true
if
(
marker
.
collapsed
)
regChange
(
cm
,
from
.
line
,
to
.
line
+
1
)
else
if
(
marker
.
className
||
marker
.
title
||
marker
.
startStyle
||
marker
.
endStyle
||
marker
.
css
)
for
(
let
i
=
from
.
line
;
i
<=
to
.
line
;
i
++
)
regLineChange
(
cm
,
i
,
"
text
"
)
if
(
marker
.
atomic
)
reCheckSelection
(
cm
.
doc
)
signalLater
(
cm
,
"
markerAdded
"
,
cm
,
marker
)
}
return
marker
}
// SHARED TEXTMARKERS
// A shared marker spans multiple linked documents. It is
// implemented as a meta-marker-object controlling multiple normal
// markers.
export
class
SharedTextMarker
{
constructor
(
markers
,
primary
)
{
this
.
markers
=
markers
this
.
primary
=
primary
for
(
let
i
=
0
;
i
<
markers
.
length
;
++
i
)
markers
[
i
].
parent
=
this
}
clear
()
{
if
(
this
.
explicitlyCleared
)
return
this
.
explicitlyCleared
=
true
for
(
let
i
=
0
;
i
<
this
.
markers
.
length
;
++
i
)
this
.
markers
[
i
].
clear
()
signalLater
(
this
,
"
clear
"
)
}
find
(
side
,
lineObj
)
{
return
this
.
primary
.
find
(
side
,
lineObj
)
}
}
eventMixin
(
SharedTextMarker
)
function
markTextShared
(
doc
,
from
,
to
,
options
,
type
)
{
options
=
copyObj
(
options
)
options
.
shared
=
false
let
markers
=
[
markText
(
doc
,
from
,
to
,
options
,
type
)],
primary
=
markers
[
0
]
let
widget
=
options
.
widgetNode
linkedDocs
(
doc
,
doc
=>
{
if
(
widget
)
options
.
widgetNode
=
widget
.
cloneNode
(
true
)
markers
.
push
(
markText
(
doc
,
clipPos
(
doc
,
from
),
clipPos
(
doc
,
to
),
options
,
type
))
for
(
let
i
=
0
;
i
<
doc
.
linked
.
length
;
++
i
)
if
(
doc
.
linked
[
i
].
isParent
)
return
primary
=
lst
(
markers
)
})
return
new
SharedTextMarker
(
markers
,
primary
)
}
export
function
findSharedMarkers
(
doc
)
{
return
doc
.
findMarks
(
Pos
(
doc
.
first
,
0
),
doc
.
clipPos
(
Pos
(
doc
.
lastLine
())),
m
=>
m
.
parent
)
}
export
function
copySharedMarkers
(
doc
,
markers
)
{
for
(
let
i
=
0
;
i
<
markers
.
length
;
i
++
)
{
let
marker
=
markers
[
i
],
pos
=
marker
.
find
()
let
mFrom
=
doc
.
clipPos
(
pos
.
from
),
mTo
=
doc
.
clipPos
(
pos
.
to
)
if
(
cmp
(
mFrom
,
mTo
))
{
let
subMark
=
markText
(
doc
,
mFrom
,
mTo
,
marker
.
primary
,
marker
.
primary
.
type
)
marker
.
markers
.
push
(
subMark
)
subMark
.
parent
=
marker
}
}
}
export
function
detachSharedMarkers
(
markers
)
{
for
(
let
i
=
0
;
i
<
markers
.
length
;
i
++
)
{
let
marker
=
markers
[
i
],
linked
=
[
marker
.
primary
.
doc
]
linkedDocs
(
marker
.
primary
.
doc
,
d
=>
linked
.
push
(
d
))
for
(
let
j
=
0
;
j
<
marker
.
markers
.
length
;
j
++
)
{
let
subMarker
=
marker
.
markers
[
j
]
if
(
indexOf
(
linked
,
subMarker
.
doc
)
==
-
1
)
{
subMarker
.
parent
=
null
marker
.
markers
.
splice
(
j
--
,
1
)
}
}
}
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model/mark_text.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
mark_text.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model/selection.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
cmp
,
copyPos
,
equalCursorPos
,
maxPos
,
minPos
}
from
"
../line/pos
"
import
{
indexOf
}
from
"
../util/misc
"
// Selection objects are immutable. A new one is created every time
// the selection changes. A selection is one or more non-overlapping
// (and non-touching) ranges, sorted, and an integer that indicates
// which one is the primary selection (the one that's scrolled into
// view, that getCursor returns, etc).
export
class
Selection
{
constructor
(
ranges
,
primIndex
)
{
this
.
ranges
=
ranges
this
.
primIndex
=
primIndex
}
primary
()
{
return
this
.
ranges
[
this
.
primIndex
]
}
equals
(
other
)
{
if
(
other
==
this
)
return
true
if
(
other
.
primIndex
!=
this
.
primIndex
||
other
.
ranges
.
length
!=
this
.
ranges
.
length
)
return
false
for
(
let
i
=
0
;
i
<
this
.
ranges
.
length
;
i
++
)
{
let
here
=
this
.
ranges
[
i
],
there
=
other
.
ranges
[
i
]
if
(
!
equalCursorPos
(
here
.
anchor
,
there
.
anchor
)
||
!
equalCursorPos
(
here
.
head
,
there
.
head
))
return
false
}
return
true
}
deepCopy
()
{
let
out
=
[]
for
(
let
i
=
0
;
i
<
this
.
ranges
.
length
;
i
++
)
out
[
i
]
=
new
Range
(
copyPos
(
this
.
ranges
[
i
].
anchor
),
copyPos
(
this
.
ranges
[
i
].
head
))
return
new
Selection
(
out
,
this
.
primIndex
)
}
somethingSelected
()
{
for
(
let
i
=
0
;
i
<
this
.
ranges
.
length
;
i
++
)
if
(
!
this
.
ranges
[
i
].
empty
())
return
true
return
false
}
contains
(
pos
,
end
)
{
if
(
!
end
)
end
=
pos
for
(
let
i
=
0
;
i
<
this
.
ranges
.
length
;
i
++
)
{
let
range
=
this
.
ranges
[
i
]
if
(
cmp
(
end
,
range
.
from
())
>=
0
&&
cmp
(
pos
,
range
.
to
())
<=
0
)
return
i
}
return
-
1
}
}
export
class
Range
{
constructor
(
anchor
,
head
)
{
this
.
anchor
=
anchor
;
this
.
head
=
head
}
from
()
{
return
minPos
(
this
.
anchor
,
this
.
head
)
}
to
()
{
return
maxPos
(
this
.
anchor
,
this
.
head
)
}
empty
()
{
return
this
.
head
.
line
==
this
.
anchor
.
line
&&
this
.
head
.
ch
==
this
.
anchor
.
ch
}
}
// Take an unsorted, potentially overlapping set of ranges, and
// build a selection out of it. 'Consumes' ranges array (modifying
// it).
export
function
normalizeSelection
(
ranges
,
primIndex
)
{
let
prim
=
ranges
[
primIndex
]
ranges
.
sort
((
a
,
b
)
=>
cmp
(
a
.
from
(),
b
.
from
()))
primIndex
=
indexOf
(
ranges
,
prim
)
for
(
let
i
=
1
;
i
<
ranges
.
length
;
i
++
)
{
let
cur
=
ranges
[
i
],
prev
=
ranges
[
i
-
1
]
if
(
cmp
(
prev
.
to
(),
cur
.
from
())
>=
0
)
{
let
from
=
minPos
(
prev
.
from
(),
cur
.
from
()),
to
=
maxPos
(
prev
.
to
(),
cur
.
to
())
let
inv
=
prev
.
empty
()
?
cur
.
from
()
==
cur
.
head
:
prev
.
from
()
==
prev
.
head
if
(
i
<=
primIndex
)
--
primIndex
ranges
.
splice
(
--
i
,
2
,
new
Range
(
inv
?
to
:
from
,
inv
?
from
:
to
))
}
}
return
new
Selection
(
ranges
,
primIndex
)
}
export
function
simpleSelection
(
anchor
,
head
)
{
return
new
Selection
([
new
Range
(
anchor
,
head
||
anchor
)],
0
)
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model/selection.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
selection.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model/selection_updates.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
signalLater
}
from
"
../util/operation_group
"
import
{
ensureCursorVisible
}
from
"
../display/scrolling
"
import
{
clipPos
,
cmp
,
Pos
}
from
"
../line/pos
"
import
{
getLine
}
from
"
../line/utils_line
"
import
{
hasHandler
,
signal
,
signalCursorActivity
}
from
"
../util/event
"
import
{
lst
,
sel_dontScroll
}
from
"
../util/misc
"
import
{
addSelectionToHistory
}
from
"
./history
"
import
{
normalizeSelection
,
Range
,
Selection
,
simpleSelection
}
from
"
./selection
"
// The 'scroll' parameter given to many of these indicated whether
// the new cursor position should be scrolled into view after
// modifying the selection.
// If shift is held or the extend flag is set, extends a range to
// include a given position (and optionally a second position).
// Otherwise, simply returns the range between the given positions.
// Used for cursor motion and such.
export
function
extendRange
(
doc
,
range
,
head
,
other
)
{
if
(
doc
.
cm
&&
doc
.
cm
.
display
.
shift
||
doc
.
extend
)
{
let
anchor
=
range
.
anchor
if
(
other
)
{
let
posBefore
=
cmp
(
head
,
anchor
)
<
0
if
(
posBefore
!=
(
cmp
(
other
,
anchor
)
<
0
))
{
anchor
=
head
head
=
other
}
else
if
(
posBefore
!=
(
cmp
(
head
,
other
)
<
0
))
{
head
=
other
}
}
return
new
Range
(
anchor
,
head
)
}
else
{
return
new
Range
(
other
||
head
,
head
)
}
}
// Extend the primary selection range, discard the rest.
export
function
extendSelection
(
doc
,
head
,
other
,
options
)
{
setSelection
(
doc
,
new
Selection
([
extendRange
(
doc
,
doc
.
sel
.
primary
(),
head
,
other
)],
0
),
options
)
}
// Extend all selections (pos is an array of selections with length
// equal the number of selections)
export
function
extendSelections
(
doc
,
heads
,
options
)
{
let
out
=
[]
for
(
let
i
=
0
;
i
<
doc
.
sel
.
ranges
.
length
;
i
++
)
out
[
i
]
=
extendRange
(
doc
,
doc
.
sel
.
ranges
[
i
],
heads
[
i
],
null
)
let
newSel
=
normalizeSelection
(
out
,
doc
.
sel
.
primIndex
)
setSelection
(
doc
,
newSel
,
options
)
}
// Updates a single range in the selection.
export
function
replaceOneSelection
(
doc
,
i
,
range
,
options
)
{
let
ranges
=
doc
.
sel
.
ranges
.
slice
(
0
)
ranges
[
i
]
=
range
setSelection
(
doc
,
normalizeSelection
(
ranges
,
doc
.
sel
.
primIndex
),
options
)
}
// Reset the selection to a single range.
export
function
setSimpleSelection
(
doc
,
anchor
,
head
,
options
)
{
setSelection
(
doc
,
simpleSelection
(
anchor
,
head
),
options
)
}
// Give beforeSelectionChange handlers a change to influence a
// selection update.
function
filterSelectionChange
(
doc
,
sel
,
options
)
{
let
obj
=
{
ranges
:
sel
.
ranges
,
update
:
function
(
ranges
)
{
this
.
ranges
=
[]
for
(
let
i
=
0
;
i
<
ranges
.
length
;
i
++
)
this
.
ranges
[
i
]
=
new
Range
(
clipPos
(
doc
,
ranges
[
i
].
anchor
),
clipPos
(
doc
,
ranges
[
i
].
head
))
},
origin
:
options
&&
options
.
origin
}
signal
(
doc
,
"
beforeSelectionChange
"
,
doc
,
obj
)
if
(
doc
.
cm
)
signal
(
doc
.
cm
,
"
beforeSelectionChange
"
,
doc
.
cm
,
obj
)
if
(
obj
.
ranges
!=
sel
.
ranges
)
return
normalizeSelection
(
obj
.
ranges
,
obj
.
ranges
.
length
-
1
)
else
return
sel
}
export
function
setSelectionReplaceHistory
(
doc
,
sel
,
options
)
{
let
done
=
doc
.
history
.
done
,
last
=
lst
(
done
)
if
(
last
&&
last
.
ranges
)
{
done
[
done
.
length
-
1
]
=
sel
setSelectionNoUndo
(
doc
,
sel
,
options
)
}
else
{
setSelection
(
doc
,
sel
,
options
)
}
}
// Set a new selection.
export
function
setSelection
(
doc
,
sel
,
options
)
{
setSelectionNoUndo
(
doc
,
sel
,
options
)
addSelectionToHistory
(
doc
,
doc
.
sel
,
doc
.
cm
?
doc
.
cm
.
curOp
.
id
:
NaN
,
options
)
}
export
function
setSelectionNoUndo
(
doc
,
sel
,
options
)
{
if
(
hasHandler
(
doc
,
"
beforeSelectionChange
"
)
||
doc
.
cm
&&
hasHandler
(
doc
.
cm
,
"
beforeSelectionChange
"
))
sel
=
filterSelectionChange
(
doc
,
sel
,
options
)
let
bias
=
options
&&
options
.
bias
||
(
cmp
(
sel
.
primary
().
head
,
doc
.
sel
.
primary
().
head
)
<
0
?
-
1
:
1
)
setSelectionInner
(
doc
,
skipAtomicInSelection
(
doc
,
sel
,
bias
,
true
))
if
(
!
(
options
&&
options
.
scroll
===
false
)
&&
doc
.
cm
)
ensureCursorVisible
(
doc
.
cm
)
}
function
setSelectionInner
(
doc
,
sel
)
{
if
(
sel
.
equals
(
doc
.
sel
))
return
doc
.
sel
=
sel
if
(
doc
.
cm
)
{
doc
.
cm
.
curOp
.
updateInput
=
doc
.
cm
.
curOp
.
selectionChanged
=
true
signalCursorActivity
(
doc
.
cm
)
}
signalLater
(
doc
,
"
cursorActivity
"
,
doc
)
}
// Verify that the selection does not partially select any atomic
// marked ranges.
export
function
reCheckSelection
(
doc
)
{
setSelectionInner
(
doc
,
skipAtomicInSelection
(
doc
,
doc
.
sel
,
null
,
false
),
sel_dontScroll
)
}
// Return a selection that does not partially select any atomic
// ranges.
function
skipAtomicInSelection
(
doc
,
sel
,
bias
,
mayClear
)
{
let
out
for
(
let
i
=
0
;
i
<
sel
.
ranges
.
length
;
i
++
)
{
let
range
=
sel
.
ranges
[
i
]
let
old
=
sel
.
ranges
.
length
==
doc
.
sel
.
ranges
.
length
&&
doc
.
sel
.
ranges
[
i
]
let
newAnchor
=
skipAtomic
(
doc
,
range
.
anchor
,
old
&&
old
.
anchor
,
bias
,
mayClear
)
let
newHead
=
skipAtomic
(
doc
,
range
.
head
,
old
&&
old
.
head
,
bias
,
mayClear
)
if
(
out
||
newAnchor
!=
range
.
anchor
||
newHead
!=
range
.
head
)
{
if
(
!
out
)
out
=
sel
.
ranges
.
slice
(
0
,
i
)
out
[
i
]
=
new
Range
(
newAnchor
,
newHead
)
}
}
return
out
?
normalizeSelection
(
out
,
sel
.
primIndex
)
:
sel
}
function
skipAtomicInner
(
doc
,
pos
,
oldPos
,
dir
,
mayClear
)
{
let
line
=
getLine
(
doc
,
pos
.
line
)
if
(
line
.
markedSpans
)
for
(
let
i
=
0
;
i
<
line
.
markedSpans
.
length
;
++
i
)
{
let
sp
=
line
.
markedSpans
[
i
],
m
=
sp
.
marker
if
((
sp
.
from
==
null
||
(
m
.
inclusiveLeft
?
sp
.
from
<=
pos
.
ch
:
sp
.
from
<
pos
.
ch
))
&&
(
sp
.
to
==
null
||
(
m
.
inclusiveRight
?
sp
.
to
>=
pos
.
ch
:
sp
.
to
>
pos
.
ch
)))
{
if
(
mayClear
)
{
signal
(
m
,
"
beforeCursorEnter
"
)
if
(
m
.
explicitlyCleared
)
{
if
(
!
line
.
markedSpans
)
break
else
{
--
i
;
continue
}
}
}
if
(
!
m
.
atomic
)
continue
if
(
oldPos
)
{
let
near
=
m
.
find
(
dir
<
0
?
1
:
-
1
),
diff
if
(
dir
<
0
?
m
.
inclusiveRight
:
m
.
inclusiveLeft
)
near
=
movePos
(
doc
,
near
,
-
dir
,
near
&&
near
.
line
==
pos
.
line
?
line
:
null
)
if
(
near
&&
near
.
line
==
pos
.
line
&&
(
diff
=
cmp
(
near
,
oldPos
))
&&
(
dir
<
0
?
diff
<
0
:
diff
>
0
))
return
skipAtomicInner
(
doc
,
near
,
pos
,
dir
,
mayClear
)
}
let
far
=
m
.
find
(
dir
<
0
?
-
1
:
1
)
if
(
dir
<
0
?
m
.
inclusiveLeft
:
m
.
inclusiveRight
)
far
=
movePos
(
doc
,
far
,
dir
,
far
.
line
==
pos
.
line
?
line
:
null
)
return
far
?
skipAtomicInner
(
doc
,
far
,
pos
,
dir
,
mayClear
)
:
null
}
}
return
pos
}
// Ensure a given position is not inside an atomic range.
export
function
skipAtomic
(
doc
,
pos
,
oldPos
,
bias
,
mayClear
)
{
let
dir
=
bias
||
1
let
found
=
skipAtomicInner
(
doc
,
pos
,
oldPos
,
dir
,
mayClear
)
||
(
!
mayClear
&&
skipAtomicInner
(
doc
,
pos
,
oldPos
,
dir
,
true
))
||
skipAtomicInner
(
doc
,
pos
,
oldPos
,
-
dir
,
mayClear
)
||
(
!
mayClear
&&
skipAtomicInner
(
doc
,
pos
,
oldPos
,
-
dir
,
true
))
if
(
!
found
)
{
doc
.
cantEdit
=
true
return
Pos
(
doc
.
first
,
0
)
}
return
found
}
function
movePos
(
doc
,
pos
,
dir
,
line
)
{
if
(
dir
<
0
&&
pos
.
ch
==
0
)
{
if
(
pos
.
line
>
doc
.
first
)
return
clipPos
(
doc
,
Pos
(
pos
.
line
-
1
))
else
return
null
}
else
if
(
dir
>
0
&&
pos
.
ch
==
(
line
||
getLine
(
doc
,
pos
.
line
)).
text
.
length
)
{
if
(
pos
.
line
<
doc
.
first
+
doc
.
size
-
1
)
return
Pos
(
pos
.
line
+
1
,
0
)
else
return
null
}
else
{
return
new
Pos
(
pos
.
line
,
pos
.
ch
+
dir
)
}
}
export
function
selectAll
(
cm
)
{
cm
.
setSelection
(
Pos
(
cm
.
firstLine
(),
0
),
Pos
(
cm
.
lastLine
()),
sel_dontScroll
)
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/model/selection_updates.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
selection_updates.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/modes.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
copyObj
,
createObj
}
from
"
./util/misc
"
// Known modes, by name and by MIME
export
let
modes
=
{},
mimeModes
=
{}
// Extra arguments are stored as the mode's dependencies, which is
// used by (legacy) mechanisms like loadmode.js to automatically
// load a mode. (Preferred mechanism is the require/define calls.)
export
function
defineMode
(
name
,
mode
)
{
if
(
arguments
.
length
>
2
)
mode
.
dependencies
=
Array
.
prototype
.
slice
.
call
(
arguments
,
2
)
modes
[
name
]
=
mode
}
export
function
defineMIME
(
mime
,
spec
)
{
mimeModes
[
mime
]
=
spec
}
// Given a MIME type, a {name, ...options} config object, or a name
// string, return a mode config object.
export
function
resolveMode
(
spec
)
{
if
(
typeof
spec
==
"
string
"
&&
mimeModes
.
hasOwnProperty
(
spec
))
{
spec
=
mimeModes
[
spec
]
}
else
if
(
spec
&&
typeof
spec
.
name
==
"
string
"
&&
mimeModes
.
hasOwnProperty
(
spec
.
name
))
{
let
found
=
mimeModes
[
spec
.
name
]
if
(
typeof
found
==
"
string
"
)
found
=
{
name
:
found
}
spec
=
createObj
(
found
,
spec
)
spec
.
name
=
found
.
name
}
else
if
(
typeof
spec
==
"
string
"
&&
/^
[\w\-]
+
\/[\w\-]
+
\+
xml$/
.
test
(
spec
))
{
return
resolveMode
(
"
application/xml
"
)
}
else
if
(
typeof
spec
==
"
string
"
&&
/^
[\w\-]
+
\/[\w\-]
+
\+
json$/
.
test
(
spec
))
{
return
resolveMode
(
"
application/json
"
)
}
if
(
typeof
spec
==
"
string
"
)
return
{
name
:
spec
}
else
return
spec
||
{
name
:
"
null
"
}
}
// Given a mode spec (anything that resolveMode accepts), find and
// initialize an actual mode object.
export
function
getMode
(
options
,
spec
)
{
spec
=
resolveMode
(
spec
)
let
mfactory
=
modes
[
spec
.
name
]
if
(
!
mfactory
)
return
getMode
(
options
,
"
text/plain
"
)
let
modeObj
=
mfactory
(
options
,
spec
)
if
(
modeExtensions
.
hasOwnProperty
(
spec
.
name
))
{
let
exts
=
modeExtensions
[
spec
.
name
]
for
(
let
prop
in
exts
)
{
if
(
!
exts
.
hasOwnProperty
(
prop
))
continue
if
(
modeObj
.
hasOwnProperty
(
prop
))
modeObj
[
"
_
"
+
prop
]
=
modeObj
[
prop
]
modeObj
[
prop
]
=
exts
[
prop
]
}
}
modeObj
.
name
=
spec
.
name
if
(
spec
.
helperType
)
modeObj
.
helperType
=
spec
.
helperType
if
(
spec
.
modeProps
)
for
(
let
prop
in
spec
.
modeProps
)
modeObj
[
prop
]
=
spec
.
modeProps
[
prop
]
return
modeObj
}
// This can be used to attach properties to mode objects from
// outside the actual mode definition.
export
let
modeExtensions
=
{}
export
function
extendMode
(
mode
,
properties
)
{
let
exts
=
modeExtensions
.
hasOwnProperty
(
mode
)
?
modeExtensions
[
mode
]
:
(
modeExtensions
[
mode
]
=
{})
copyObj
(
properties
,
exts
)
}
export
function
copyState
(
mode
,
state
)
{
if
(
state
===
true
)
return
state
if
(
mode
.
copyState
)
return
mode
.
copyState
(
state
)
let
nstate
=
{}
for
(
let
n
in
state
)
{
let
val
=
state
[
n
]
if
(
val
instanceof
Array
)
val
=
val
.
concat
([])
nstate
[
n
]
=
val
}
return
nstate
}
// Given a mode and a state (for that mode), find the inner mode and
// state at the position that the state refers to.
export
function
innerMode
(
mode
,
state
)
{
let
info
while
(
mode
.
innerMode
)
{
info
=
mode
.
innerMode
(
state
)
if
(
!
info
||
info
.
mode
==
mode
)
break
state
=
info
.
state
mode
=
info
.
mode
}
return
info
||
{
mode
:
mode
,
state
:
state
}
}
export
function
startState
(
mode
,
a1
,
a2
)
{
return
mode
.
startState
?
mode
.
startState
(
a1
,
a2
)
:
true
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/modes.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
modes.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/util.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"Folder"
module=
"OFS.Folder"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_objects
</string>
</key>
<value>
<tuple/>
</value>
</item>
<item>
<key>
<string>
id
</string>
</key>
<value>
<string>
util
</string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/util/StringStream.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
countColumn
}
from
"
./misc
"
// STRING STREAM
// Fed to the mode parsers, provides helper functions to make
// parsers more succinct.
class
StringStream
{
constructor
(
string
,
tabSize
)
{
this
.
pos
=
this
.
start
=
0
this
.
string
=
string
this
.
tabSize
=
tabSize
||
8
this
.
lastColumnPos
=
this
.
lastColumnValue
=
0
this
.
lineStart
=
0
}
eol
()
{
return
this
.
pos
>=
this
.
string
.
length
}
sol
()
{
return
this
.
pos
==
this
.
lineStart
}
peek
()
{
return
this
.
string
.
charAt
(
this
.
pos
)
||
undefined
}
next
()
{
if
(
this
.
pos
<
this
.
string
.
length
)
return
this
.
string
.
charAt
(
this
.
pos
++
)
}
eat
(
match
)
{
let
ch
=
this
.
string
.
charAt
(
this
.
pos
)
let
ok
if
(
typeof
match
==
"
string
"
)
ok
=
ch
==
match
else
ok
=
ch
&&
(
match
.
test
?
match
.
test
(
ch
)
:
match
(
ch
))
if
(
ok
)
{
++
this
.
pos
;
return
ch
}
}
eatWhile
(
match
)
{
let
start
=
this
.
pos
while
(
this
.
eat
(
match
)){}
return
this
.
pos
>
start
}
eatSpace
()
{
let
start
=
this
.
pos
while
(
/
[\s\u
00a0
]
/
.
test
(
this
.
string
.
charAt
(
this
.
pos
)))
++
this
.
pos
return
this
.
pos
>
start
}
skipToEnd
()
{
this
.
pos
=
this
.
string
.
length
}
skipTo
(
ch
)
{
let
found
=
this
.
string
.
indexOf
(
ch
,
this
.
pos
)
if
(
found
>
-
1
)
{
this
.
pos
=
found
;
return
true
}
}
backUp
(
n
)
{
this
.
pos
-=
n
}
column
()
{
if
(
this
.
lastColumnPos
<
this
.
start
)
{
this
.
lastColumnValue
=
countColumn
(
this
.
string
,
this
.
start
,
this
.
tabSize
,
this
.
lastColumnPos
,
this
.
lastColumnValue
)
this
.
lastColumnPos
=
this
.
start
}
return
this
.
lastColumnValue
-
(
this
.
lineStart
?
countColumn
(
this
.
string
,
this
.
lineStart
,
this
.
tabSize
)
:
0
)
}
indentation
()
{
return
countColumn
(
this
.
string
,
null
,
this
.
tabSize
)
-
(
this
.
lineStart
?
countColumn
(
this
.
string
,
this
.
lineStart
,
this
.
tabSize
)
:
0
)
}
match
(
pattern
,
consume
,
caseInsensitive
)
{
if
(
typeof
pattern
==
"
string
"
)
{
let
cased
=
str
=>
caseInsensitive
?
str
.
toLowerCase
()
:
str
let
substr
=
this
.
string
.
substr
(
this
.
pos
,
pattern
.
length
)
if
(
cased
(
substr
)
==
cased
(
pattern
))
{
if
(
consume
!==
false
)
this
.
pos
+=
pattern
.
length
return
true
}
}
else
{
let
match
=
this
.
string
.
slice
(
this
.
pos
).
match
(
pattern
)
if
(
match
&&
match
.
index
>
0
)
return
null
if
(
match
&&
consume
!==
false
)
this
.
pos
+=
match
[
0
].
length
return
match
}
}
current
(){
return
this
.
string
.
slice
(
this
.
start
,
this
.
pos
)}
hideFirstChars
(
n
,
inner
)
{
this
.
lineStart
+=
n
try
{
return
inner
()
}
finally
{
this
.
lineStart
-=
n
}
}
}
export
default
StringStream
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/util/StringStream.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
StringStream.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/util/bidi.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
lst
}
from
"
./misc
"
// BIDI HELPERS
export
function
iterateBidiSections
(
order
,
from
,
to
,
f
)
{
if
(
!
order
)
return
f
(
from
,
to
,
"
ltr
"
)
let
found
=
false
for
(
let
i
=
0
;
i
<
order
.
length
;
++
i
)
{
let
part
=
order
[
i
]
if
(
part
.
from
<
to
&&
part
.
to
>
from
||
from
==
to
&&
part
.
to
==
from
)
{
f
(
Math
.
max
(
part
.
from
,
from
),
Math
.
min
(
part
.
to
,
to
),
part
.
level
==
1
?
"
rtl
"
:
"
ltr
"
)
found
=
true
}
}
if
(
!
found
)
f
(
from
,
to
,
"
ltr
"
)
}
export
let
bidiOther
=
null
export
function
getBidiPartAt
(
order
,
ch
,
sticky
)
{
let
found
bidiOther
=
null
for
(
let
i
=
0
;
i
<
order
.
length
;
++
i
)
{
let
cur
=
order
[
i
]
if
(
cur
.
from
<
ch
&&
cur
.
to
>
ch
)
return
i
if
(
cur
.
to
==
ch
)
{
if
(
cur
.
from
!=
cur
.
to
&&
sticky
==
"
before
"
)
found
=
i
else
bidiOther
=
i
}
if
(
cur
.
from
==
ch
)
{
if
(
cur
.
from
!=
cur
.
to
&&
sticky
!=
"
before
"
)
found
=
i
else
bidiOther
=
i
}
}
return
found
!=
null
?
found
:
bidiOther
}
// Bidirectional ordering algorithm
// See http://unicode.org/reports/tr9/tr9-13.html for the algorithm
// that this (partially) implements.
// One-char codes used for character types:
// L (L): Left-to-Right
// R (R): Right-to-Left
// r (AL): Right-to-Left Arabic
// 1 (EN): European Number
// + (ES): European Number Separator
// % (ET): European Number Terminator
// n (AN): Arabic Number
// , (CS): Common Number Separator
// m (NSM): Non-Spacing Mark
// b (BN): Boundary Neutral
// s (B): Paragraph Separator
// t (S): Segment Separator
// w (WS): Whitespace
// N (ON): Other Neutrals
// Returns null if characters are ordered as they appear
// (left-to-right), or an array of sections ({from, to, level}
// objects) in the order in which they occur visually.
let
bidiOrdering
=
(
function
()
{
// Character types for codepoints 0 to 0xff
let
lowTypes
=
"
bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN
"
// Character types for codepoints 0x600 to 0x6f9
let
arabicTypes
=
"
nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111
"
function
charType
(
code
)
{
if
(
code
<=
0xf7
)
return
lowTypes
.
charAt
(
code
)
else
if
(
0x590
<=
code
&&
code
<=
0x5f4
)
return
"
R
"
else
if
(
0x600
<=
code
&&
code
<=
0x6f9
)
return
arabicTypes
.
charAt
(
code
-
0x600
)
else
if
(
0x6ee
<=
code
&&
code
<=
0x8ac
)
return
"
r
"
else
if
(
0x2000
<=
code
&&
code
<=
0x200b
)
return
"
w
"
else
if
(
code
==
0x200c
)
return
"
b
"
else
return
"
L
"
}
let
bidiRE
=
/
[\u
0590-
\u
05f4
\u
0600-
\u
06ff
\u
0700-
\u
08ac
]
/
let
isNeutral
=
/
[
stwN
]
/
,
isStrong
=
/
[
LRr
]
/
,
countsAsLeft
=
/
[
Lb1n
]
/
,
countsAsNum
=
/
[
1n
]
/
// Browsers seem to always treat the boundaries of block elements as being L.
let
outerType
=
"
L
"
function
BidiSpan
(
level
,
from
,
to
)
{
this
.
level
=
level
this
.
from
=
from
;
this
.
to
=
to
}
return
function
(
str
)
{
if
(
!
bidiRE
.
test
(
str
))
return
false
let
len
=
str
.
length
,
types
=
[]
for
(
let
i
=
0
;
i
<
len
;
++
i
)
types
.
push
(
charType
(
str
.
charCodeAt
(
i
)))
// W1. Examine each non-spacing mark (NSM) in the level run, and
// change the type of the NSM to the type of the previous
// character. If the NSM is at the start of the level run, it will
// get the type of sor.
for
(
let
i
=
0
,
prev
=
outerType
;
i
<
len
;
++
i
)
{
let
type
=
types
[
i
]
if
(
type
==
"
m
"
)
types
[
i
]
=
prev
else
prev
=
type
}
// W2. Search backwards from each instance of a European number
// until the first strong type (R, L, AL, or sor) is found. If an
// AL is found, change the type of the European number to Arabic
// number.
// W3. Change all ALs to R.
for
(
let
i
=
0
,
cur
=
outerType
;
i
<
len
;
++
i
)
{
let
type
=
types
[
i
]
if
(
type
==
"
1
"
&&
cur
==
"
r
"
)
types
[
i
]
=
"
n
"
else
if
(
isStrong
.
test
(
type
))
{
cur
=
type
;
if
(
type
==
"
r
"
)
types
[
i
]
=
"
R
"
}
}
// W4. A single European separator between two European numbers
// changes to a European number. A single common separator between
// two numbers of the same type changes to that type.
for
(
let
i
=
1
,
prev
=
types
[
0
];
i
<
len
-
1
;
++
i
)
{
let
type
=
types
[
i
]
if
(
type
==
"
+
"
&&
prev
==
"
1
"
&&
types
[
i
+
1
]
==
"
1
"
)
types
[
i
]
=
"
1
"
else
if
(
type
==
"
,
"
&&
prev
==
types
[
i
+
1
]
&&
(
prev
==
"
1
"
||
prev
==
"
n
"
))
types
[
i
]
=
prev
prev
=
type
}
// W5. A sequence of European terminators adjacent to European
// numbers changes to all European numbers.
// W6. Otherwise, separators and terminators change to Other
// Neutral.
for
(
let
i
=
0
;
i
<
len
;
++
i
)
{
let
type
=
types
[
i
]
if
(
type
==
"
,
"
)
types
[
i
]
=
"
N
"
else
if
(
type
==
"
%
"
)
{
let
end
for
(
end
=
i
+
1
;
end
<
len
&&
types
[
end
]
==
"
%
"
;
++
end
)
{}
let
replace
=
(
i
&&
types
[
i
-
1
]
==
"
!
"
)
||
(
end
<
len
&&
types
[
end
]
==
"
1
"
)
?
"
1
"
:
"
N
"
for
(
let
j
=
i
;
j
<
end
;
++
j
)
types
[
j
]
=
replace
i
=
end
-
1
}
}
// W7. Search backwards from each instance of a European number
// until the first strong type (R, L, or sor) is found. If an L is
// found, then change the type of the European number to L.
for
(
let
i
=
0
,
cur
=
outerType
;
i
<
len
;
++
i
)
{
let
type
=
types
[
i
]
if
(
cur
==
"
L
"
&&
type
==
"
1
"
)
types
[
i
]
=
"
L
"
else
if
(
isStrong
.
test
(
type
))
cur
=
type
}
// N1. A sequence of neutrals takes the direction of the
// surrounding strong text if the text on both sides has the same
// direction. European and Arabic numbers act as if they were R in
// terms of their influence on neutrals. Start-of-level-run (sor)
// and end-of-level-run (eor) are used at level run boundaries.
// N2. Any remaining neutrals take the embedding direction.
for
(
let
i
=
0
;
i
<
len
;
++
i
)
{
if
(
isNeutral
.
test
(
types
[
i
]))
{
let
end
for
(
end
=
i
+
1
;
end
<
len
&&
isNeutral
.
test
(
types
[
end
]);
++
end
)
{}
let
before
=
(
i
?
types
[
i
-
1
]
:
outerType
)
==
"
L
"
let
after
=
(
end
<
len
?
types
[
end
]
:
outerType
)
==
"
L
"
let
replace
=
before
||
after
?
"
L
"
:
"
R
"
for
(
let
j
=
i
;
j
<
end
;
++
j
)
types
[
j
]
=
replace
i
=
end
-
1
}
}
// Here we depart from the documented algorithm, in order to avoid
// building up an actual levels array. Since there are only three
// levels (0, 1, 2) in an implementation that doesn't take
// explicit embedding into account, we can build up the order on
// the fly, without following the level-based algorithm.
let
order
=
[],
m
for
(
let
i
=
0
;
i
<
len
;)
{
if
(
countsAsLeft
.
test
(
types
[
i
]))
{
let
start
=
i
for
(
++
i
;
i
<
len
&&
countsAsLeft
.
test
(
types
[
i
]);
++
i
)
{}
order
.
push
(
new
BidiSpan
(
0
,
start
,
i
))
}
else
{
let
pos
=
i
,
at
=
order
.
length
for
(
++
i
;
i
<
len
&&
types
[
i
]
!=
"
L
"
;
++
i
)
{}
for
(
let
j
=
pos
;
j
<
i
;)
{
if
(
countsAsNum
.
test
(
types
[
j
]))
{
if
(
pos
<
j
)
order
.
splice
(
at
,
0
,
new
BidiSpan
(
1
,
pos
,
j
))
let
nstart
=
j
for
(
++
j
;
j
<
i
&&
countsAsNum
.
test
(
types
[
j
]);
++
j
)
{}
order
.
splice
(
at
,
0
,
new
BidiSpan
(
2
,
nstart
,
j
))
pos
=
j
}
else
++
j
}
if
(
pos
<
i
)
order
.
splice
(
at
,
0
,
new
BidiSpan
(
1
,
pos
,
i
))
}
}
if
(
order
[
0
].
level
==
1
&&
(
m
=
str
.
match
(
/^
\s
+/
)))
{
order
[
0
].
from
=
m
[
0
].
length
order
.
unshift
(
new
BidiSpan
(
0
,
0
,
m
[
0
].
length
))
}
if
(
lst
(
order
).
level
==
1
&&
(
m
=
str
.
match
(
/
\s
+$/
)))
{
lst
(
order
).
to
-=
m
[
0
].
length
order
.
push
(
new
BidiSpan
(
0
,
len
-
m
[
0
].
length
,
len
))
}
return
order
}
})()
// Get the bidi ordering for the given line (and cache it). Returns
// false for lines that are fully left-to-right, and an array of
// BidiSpan objects otherwise.
export
function
getOrder
(
line
)
{
let
order
=
line
.
order
if
(
order
==
null
)
order
=
line
.
order
=
bidiOrdering
(
line
.
text
)
return
order
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/util/bidi.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
bidi.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/util/browser.js.js
deleted
100644 → 0
View file @
a3a26621
// Kludges for bugs and behavior differences that can't be feature
// detected are enabled based on userAgent etc sniffing.
let
userAgent
=
navigator
.
userAgent
let
platform
=
navigator
.
platform
export
let
gecko
=
/gecko
\/\d
/i
.
test
(
userAgent
)
let
ie_upto10
=
/MSIE
\d
/
.
test
(
userAgent
)
let
ie_11up
=
/Trident
\/(?:[
7-9
]
|
\d{2,})\.
.*rv:
(\d
+
)
/
.
exec
(
userAgent
)
let
edge
=
/Edge
\/(\d
+
)
/
.
exec
(
userAgent
)
export
let
ie
=
ie_upto10
||
ie_11up
||
edge
export
let
ie_version
=
ie
&&
(
ie_upto10
?
document
.
documentMode
||
6
:
+
(
edge
||
ie_11up
)[
1
])
export
let
webkit
=
!
edge
&&
/WebKit
\/
/
.
test
(
userAgent
)
let
qtwebkit
=
webkit
&&
/Qt
\/\d
+
\.\d
+/
.
test
(
userAgent
)
export
let
chrome
=
!
edge
&&
/Chrome
\/
/
.
test
(
userAgent
)
export
let
presto
=
/Opera
\/
/
.
test
(
userAgent
)
export
let
safari
=
/Apple Computer/
.
test
(
navigator
.
vendor
)
export
let
mac_geMountainLion
=
/Mac OS X 1
\d\D([
8-9
]
|
\d\d)\D
/
.
test
(
userAgent
)
export
let
phantom
=
/PhantomJS/
.
test
(
userAgent
)
export
let
ios
=
!
edge
&&
/AppleWebKit/
.
test
(
userAgent
)
&&
/Mobile
\/\w
+/
.
test
(
userAgent
)
// This is woefully incomplete. Suggestions for alternative methods welcome.
export
let
mobile
=
ios
||
/Android|webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i
.
test
(
userAgent
)
export
let
mac
=
ios
||
/Mac/
.
test
(
platform
)
export
let
chromeOS
=
/
\b
CrOS
\b
/
.
test
(
userAgent
)
export
let
windows
=
/win/i
.
test
(
platform
)
let
presto_version
=
presto
&&
userAgent
.
match
(
/Version
\/(\d
*
\.\d
*
)
/
)
if
(
presto_version
)
presto_version
=
Number
(
presto_version
[
1
])
if
(
presto_version
&&
presto_version
>=
15
)
{
presto
=
false
;
webkit
=
true
}
// Some browsers use the wrong event properties to signal cmd/ctrl on OS X
export
let
flipCtrlCmd
=
mac
&&
(
qtwebkit
||
presto
&&
(
presto_version
==
null
||
presto_version
<
12.11
))
export
let
captureRightClick
=
gecko
||
(
ie
&&
ie_version
>=
9
)
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/util/browser.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
browser.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/util/dom.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
ie
,
ios
}
from
"
./browser
"
export
function
classTest
(
cls
)
{
return
new
RegExp
(
"
(^|
\\
s)
"
+
cls
+
"
(?:$|
\\
s)
\\
s*
"
)
}
export
let
rmClass
=
function
(
node
,
cls
)
{
let
current
=
node
.
className
let
match
=
classTest
(
cls
).
exec
(
current
)
if
(
match
)
{
let
after
=
current
.
slice
(
match
.
index
+
match
[
0
].
length
)
node
.
className
=
current
.
slice
(
0
,
match
.
index
)
+
(
after
?
match
[
1
]
+
after
:
""
)
}
}
export
function
removeChildren
(
e
)
{
for
(
let
count
=
e
.
childNodes
.
length
;
count
>
0
;
--
count
)
e
.
removeChild
(
e
.
firstChild
)
return
e
}
export
function
removeChildrenAndAdd
(
parent
,
e
)
{
return
removeChildren
(
parent
).
appendChild
(
e
)
}
export
function
elt
(
tag
,
content
,
className
,
style
)
{
let
e
=
document
.
createElement
(
tag
)
if
(
className
)
e
.
className
=
className
if
(
style
)
e
.
style
.
cssText
=
style
if
(
typeof
content
==
"
string
"
)
e
.
appendChild
(
document
.
createTextNode
(
content
))
else
if
(
content
)
for
(
let
i
=
0
;
i
<
content
.
length
;
++
i
)
e
.
appendChild
(
content
[
i
])
return
e
}
export
let
range
if
(
document
.
createRange
)
range
=
function
(
node
,
start
,
end
,
endNode
)
{
let
r
=
document
.
createRange
()
r
.
setEnd
(
endNode
||
node
,
end
)
r
.
setStart
(
node
,
start
)
return
r
}
else
range
=
function
(
node
,
start
,
end
)
{
let
r
=
document
.
body
.
createTextRange
()
try
{
r
.
moveToElementText
(
node
.
parentNode
)
}
catch
(
e
)
{
return
r
}
r
.
collapse
(
true
)
r
.
moveEnd
(
"
character
"
,
end
)
r
.
moveStart
(
"
character
"
,
start
)
return
r
}
export
function
contains
(
parent
,
child
)
{
if
(
child
.
nodeType
==
3
)
// Android browser always returns false when child is a textnode
child
=
child
.
parentNode
if
(
parent
.
contains
)
return
parent
.
contains
(
child
)
do
{
if
(
child
.
nodeType
==
11
)
child
=
child
.
host
if
(
child
==
parent
)
return
true
}
while
(
child
=
child
.
parentNode
)
}
export
function
activeElt
()
{
// IE and Edge may throw an "Unspecified Error" when accessing document.activeElement.
// IE < 10 will throw when accessed while the page is loading or in an iframe.
// IE > 9 and Edge will throw when accessed in an iframe if document.body is unavailable.
let
activeElement
try
{
activeElement
=
document
.
activeElement
}
catch
(
e
)
{
activeElement
=
document
.
body
||
null
}
while
(
activeElement
&&
activeElement
.
root
&&
activeElement
.
root
.
activeElement
)
activeElement
=
activeElement
.
root
.
activeElement
return
activeElement
}
export
function
addClass
(
node
,
cls
)
{
let
current
=
node
.
className
if
(
!
classTest
(
cls
).
test
(
current
))
node
.
className
+=
(
current
?
"
"
:
""
)
+
cls
}
export
function
joinClasses
(
a
,
b
)
{
let
as
=
a
.
split
(
"
"
)
for
(
let
i
=
0
;
i
<
as
.
length
;
i
++
)
if
(
as
[
i
]
&&
!
classTest
(
as
[
i
]).
test
(
b
))
b
+=
"
"
+
as
[
i
]
return
b
}
export
let
selectInput
=
function
(
node
)
{
node
.
select
()
}
if
(
ios
)
// Mobile Safari apparently has a bug where select() is broken.
selectInput
=
function
(
node
)
{
node
.
selectionStart
=
0
;
node
.
selectionEnd
=
node
.
value
.
length
}
else
if
(
ie
)
// Suppress mysterious IE10 errors
selectInput
=
function
(
node
)
{
try
{
node
.
select
()
}
catch
(
_e
)
{}
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/util/dom.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
dom.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/util/event.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
mac
}
from
"
./browser
"
import
{
indexOf
}
from
"
./misc
"
// EVENT HANDLING
// Lightweight event framework. on/off also work on DOM nodes,
// registering native DOM handlers.
const
noHandlers
=
[]
export
let
on
=
function
(
emitter
,
type
,
f
)
{
if
(
emitter
.
addEventListener
)
{
emitter
.
addEventListener
(
type
,
f
,
false
)
}
else
if
(
emitter
.
attachEvent
)
{
emitter
.
attachEvent
(
"
on
"
+
type
,
f
)
}
else
{
let
map
=
emitter
.
_handlers
||
(
emitter
.
_handlers
=
{})
map
[
type
]
=
(
map
[
type
]
||
noHandlers
).
concat
(
f
)
}
}
export
function
getHandlers
(
emitter
,
type
)
{
return
emitter
.
_handlers
&&
emitter
.
_handlers
[
type
]
||
noHandlers
}
export
function
off
(
emitter
,
type
,
f
)
{
if
(
emitter
.
removeEventListener
)
{
emitter
.
removeEventListener
(
type
,
f
,
false
)
}
else
if
(
emitter
.
detachEvent
)
{
emitter
.
detachEvent
(
"
on
"
+
type
,
f
)
}
else
{
let
map
=
emitter
.
_handlers
,
arr
=
map
&&
map
[
type
]
if
(
arr
)
{
let
index
=
indexOf
(
arr
,
f
)
if
(
index
>
-
1
)
map
[
type
]
=
arr
.
slice
(
0
,
index
).
concat
(
arr
.
slice
(
index
+
1
))
}
}
}
export
function
signal
(
emitter
,
type
/*, values...*/
)
{
let
handlers
=
getHandlers
(
emitter
,
type
)
if
(
!
handlers
.
length
)
return
let
args
=
Array
.
prototype
.
slice
.
call
(
arguments
,
2
)
for
(
let
i
=
0
;
i
<
handlers
.
length
;
++
i
)
handlers
[
i
].
apply
(
null
,
args
)
}
// The DOM events that CodeMirror handles can be overridden by
// registering a (non-DOM) handler on the editor for the event name,
// and preventDefault-ing the event in that handler.
export
function
signalDOMEvent
(
cm
,
e
,
override
)
{
if
(
typeof
e
==
"
string
"
)
e
=
{
type
:
e
,
preventDefault
:
function
()
{
this
.
defaultPrevented
=
true
}}
signal
(
cm
,
override
||
e
.
type
,
cm
,
e
)
return
e_defaultPrevented
(
e
)
||
e
.
codemirrorIgnore
}
export
function
signalCursorActivity
(
cm
)
{
let
arr
=
cm
.
_handlers
&&
cm
.
_handlers
.
cursorActivity
if
(
!
arr
)
return
let
set
=
cm
.
curOp
.
cursorActivityHandlers
||
(
cm
.
curOp
.
cursorActivityHandlers
=
[])
for
(
let
i
=
0
;
i
<
arr
.
length
;
++
i
)
if
(
indexOf
(
set
,
arr
[
i
])
==
-
1
)
set
.
push
(
arr
[
i
])
}
export
function
hasHandler
(
emitter
,
type
)
{
return
getHandlers
(
emitter
,
type
).
length
>
0
}
// Add on and off methods to a constructor's prototype, to make
// registering events on such objects more convenient.
export
function
eventMixin
(
ctor
)
{
ctor
.
prototype
.
on
=
function
(
type
,
f
)
{
on
(
this
,
type
,
f
)}
ctor
.
prototype
.
off
=
function
(
type
,
f
)
{
off
(
this
,
type
,
f
)}
}
// Due to the fact that we still support jurassic IE versions, some
// compatibility wrappers are needed.
export
function
e_preventDefault
(
e
)
{
if
(
e
.
preventDefault
)
e
.
preventDefault
()
else
e
.
returnValue
=
false
}
export
function
e_stopPropagation
(
e
)
{
if
(
e
.
stopPropagation
)
e
.
stopPropagation
()
else
e
.
cancelBubble
=
true
}
export
function
e_defaultPrevented
(
e
)
{
return
e
.
defaultPrevented
!=
null
?
e
.
defaultPrevented
:
e
.
returnValue
==
false
}
export
function
e_stop
(
e
)
{
e_preventDefault
(
e
);
e_stopPropagation
(
e
)}
export
function
e_target
(
e
)
{
return
e
.
target
||
e
.
srcElement
}
export
function
e_button
(
e
)
{
let
b
=
e
.
which
if
(
b
==
null
)
{
if
(
e
.
button
&
1
)
b
=
1
else
if
(
e
.
button
&
2
)
b
=
3
else
if
(
e
.
button
&
4
)
b
=
2
}
if
(
mac
&&
e
.
ctrlKey
&&
b
==
1
)
b
=
3
return
b
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/util/event.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
event.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/util/feature_detection.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
elt
,
range
,
removeChildren
,
removeChildrenAndAdd
}
from
"
./dom
"
import
{
ie
,
ie_version
}
from
"
./browser
"
// Detect drag-and-drop
export
let
dragAndDrop
=
function
()
{
// There is *some* kind of drag-and-drop support in IE6-8, but I
// couldn't get it to work yet.
if
(
ie
&&
ie_version
<
9
)
return
false
let
div
=
elt
(
'
div
'
)
return
"
draggable
"
in
div
||
"
dragDrop
"
in
div
}()
let
zwspSupported
export
function
zeroWidthElement
(
measure
)
{
if
(
zwspSupported
==
null
)
{
let
test
=
elt
(
"
span
"
,
"
\
u200b
"
)
removeChildrenAndAdd
(
measure
,
elt
(
"
span
"
,
[
test
,
document
.
createTextNode
(
"
x
"
)]))
if
(
measure
.
firstChild
.
offsetHeight
!=
0
)
zwspSupported
=
test
.
offsetWidth
<=
1
&&
test
.
offsetHeight
>
2
&&
!
(
ie
&&
ie_version
<
8
)
}
let
node
=
zwspSupported
?
elt
(
"
span
"
,
"
\
u200b
"
)
:
elt
(
"
span
"
,
"
\
u00a0
"
,
null
,
"
display: inline-block; width: 1px; margin-right: -1px
"
)
node
.
setAttribute
(
"
cm-text
"
,
""
)
return
node
}
// Feature-detect IE's crummy client rect reporting for bidi text
let
badBidiRects
export
function
hasBadBidiRects
(
measure
)
{
if
(
badBidiRects
!=
null
)
return
badBidiRects
let
txt
=
removeChildrenAndAdd
(
measure
,
document
.
createTextNode
(
"
A
\
u062eA
"
))
let
r0
=
range
(
txt
,
0
,
1
).
getBoundingClientRect
()
let
r1
=
range
(
txt
,
1
,
2
).
getBoundingClientRect
()
removeChildren
(
measure
)
if
(
!
r0
||
r0
.
left
==
r0
.
right
)
return
false
// Safari returns null in some cases (#2780)
return
badBidiRects
=
(
r1
.
right
-
r0
.
right
<
3
)
}
// See if "".split is the broken IE version, if so, provide an
// alternative way to split lines.
export
let
splitLinesAuto
=
"
\n\n
b
"
.
split
(
/
\n
/
).
length
!=
3
?
string
=>
{
let
pos
=
0
,
result
=
[],
l
=
string
.
length
while
(
pos
<=
l
)
{
let
nl
=
string
.
indexOf
(
"
\n
"
,
pos
)
if
(
nl
==
-
1
)
nl
=
string
.
length
let
line
=
string
.
slice
(
pos
,
string
.
charAt
(
nl
-
1
)
==
"
\r
"
?
nl
-
1
:
nl
)
let
rt
=
line
.
indexOf
(
"
\r
"
)
if
(
rt
!=
-
1
)
{
result
.
push
(
line
.
slice
(
0
,
rt
))
pos
+=
rt
+
1
}
else
{
result
.
push
(
line
)
pos
=
nl
+
1
}
}
return
result
}
:
string
=>
string
.
split
(
/
\r\n?
|
\n
/
)
export
let
hasSelection
=
window
.
getSelection
?
te
=>
{
try
{
return
te
.
selectionStart
!=
te
.
selectionEnd
}
catch
(
e
)
{
return
false
}
}
:
te
=>
{
let
range
try
{
range
=
te
.
ownerDocument
.
selection
.
createRange
()}
catch
(
e
)
{}
if
(
!
range
||
range
.
parentElement
()
!=
te
)
return
false
return
range
.
compareEndPoints
(
"
StartToEnd
"
,
range
)
!=
0
}
export
let
hasCopyEvent
=
(()
=>
{
let
e
=
elt
(
"
div
"
)
if
(
"
oncopy
"
in
e
)
return
true
e
.
setAttribute
(
"
oncopy
"
,
"
return;
"
)
return
typeof
e
.
oncopy
==
"
function
"
})()
let
badZoomedRects
=
null
export
function
hasBadZoomedRects
(
measure
)
{
if
(
badZoomedRects
!=
null
)
return
badZoomedRects
let
node
=
removeChildrenAndAdd
(
measure
,
elt
(
"
span
"
,
"
x
"
))
let
normal
=
node
.
getBoundingClientRect
()
let
fromRange
=
range
(
node
,
0
,
1
).
getBoundingClientRect
()
return
badZoomedRects
=
Math
.
abs
(
normal
.
left
-
fromRange
.
left
)
>
1
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/util/feature_detection.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
feature_detection.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/util/misc.js.js
deleted
100644 → 0
View file @
a3a26621
export
function
bind
(
f
)
{
let
args
=
Array
.
prototype
.
slice
.
call
(
arguments
,
1
)
return
function
(){
return
f
.
apply
(
null
,
args
)}
}
export
function
copyObj
(
obj
,
target
,
overwrite
)
{
if
(
!
target
)
target
=
{}
for
(
let
prop
in
obj
)
if
(
obj
.
hasOwnProperty
(
prop
)
&&
(
overwrite
!==
false
||
!
target
.
hasOwnProperty
(
prop
)))
target
[
prop
]
=
obj
[
prop
]
return
target
}
// Counts the column offset in a string, taking tabs into account.
// Used mostly to find indentation.
export
function
countColumn
(
string
,
end
,
tabSize
,
startIndex
,
startValue
)
{
if
(
end
==
null
)
{
end
=
string
.
search
(
/
[^\s\u
00a0
]
/
)
if
(
end
==
-
1
)
end
=
string
.
length
}
for
(
let
i
=
startIndex
||
0
,
n
=
startValue
||
0
;;)
{
let
nextTab
=
string
.
indexOf
(
"
\t
"
,
i
)
if
(
nextTab
<
0
||
nextTab
>=
end
)
return
n
+
(
end
-
i
)
n
+=
nextTab
-
i
n
+=
tabSize
-
(
n
%
tabSize
)
i
=
nextTab
+
1
}
}
export
class
Delayed
{
constructor
()
{
this
.
id
=
null
}
set
(
ms
,
f
)
{
clearTimeout
(
this
.
id
)
this
.
id
=
setTimeout
(
f
,
ms
)
}
}
export
function
indexOf
(
array
,
elt
)
{
for
(
let
i
=
0
;
i
<
array
.
length
;
++
i
)
if
(
array
[
i
]
==
elt
)
return
i
return
-
1
}
// Number of pixels added to scroller and sizer to hide scrollbar
export
let
scrollerGap
=
30
// Returned or thrown by various protocols to signal 'I'm not
// handling this'.
export
let
Pass
=
{
toString
:
function
(){
return
"
CodeMirror.Pass
"
}}
// Reused option objects for setSelection & friends
export
let
sel_dontScroll
=
{
scroll
:
false
},
sel_mouse
=
{
origin
:
"
*mouse
"
},
sel_move
=
{
origin
:
"
+move
"
}
// The inverse of countColumn -- find the offset that corresponds to
// a particular column.
export
function
findColumn
(
string
,
goal
,
tabSize
)
{
for
(
let
pos
=
0
,
col
=
0
;;)
{
let
nextTab
=
string
.
indexOf
(
"
\t
"
,
pos
)
if
(
nextTab
==
-
1
)
nextTab
=
string
.
length
let
skipped
=
nextTab
-
pos
if
(
nextTab
==
string
.
length
||
col
+
skipped
>=
goal
)
return
pos
+
Math
.
min
(
skipped
,
goal
-
col
)
col
+=
nextTab
-
pos
col
+=
tabSize
-
(
col
%
tabSize
)
pos
=
nextTab
+
1
if
(
col
>=
goal
)
return
pos
}
}
let
spaceStrs
=
[
""
]
export
function
spaceStr
(
n
)
{
while
(
spaceStrs
.
length
<=
n
)
spaceStrs
.
push
(
lst
(
spaceStrs
)
+
"
"
)
return
spaceStrs
[
n
]
}
export
function
lst
(
arr
)
{
return
arr
[
arr
.
length
-
1
]
}
export
function
map
(
array
,
f
)
{
let
out
=
[]
for
(
let
i
=
0
;
i
<
array
.
length
;
i
++
)
out
[
i
]
=
f
(
array
[
i
],
i
)
return
out
}
export
function
insertSorted
(
array
,
value
,
score
)
{
let
pos
=
0
,
priority
=
score
(
value
)
while
(
pos
<
array
.
length
&&
score
(
array
[
pos
])
<=
priority
)
pos
++
array
.
splice
(
pos
,
0
,
value
)
}
function
nothing
()
{}
export
function
createObj
(
base
,
props
)
{
let
inst
if
(
Object
.
create
)
{
inst
=
Object
.
create
(
base
)
}
else
{
nothing
.
prototype
=
base
inst
=
new
nothing
()
}
if
(
props
)
copyObj
(
props
,
inst
)
return
inst
}
let
nonASCIISingleCaseWordChar
=
/
[\u
00df
\u
0587
\u
0590-
\u
05f4
\u
0600-
\u
06ff
\u
3040-
\u
309f
\u
30a0-
\u
30ff
\u
3400-
\u
4db5
\u
4e00-
\u
9fcc
\u
ac00-
\u
d7af
]
/
export
function
isWordCharBasic
(
ch
)
{
return
/
\w
/
.
test
(
ch
)
||
ch
>
"
\
x80
"
&&
(
ch
.
toUpperCase
()
!=
ch
.
toLowerCase
()
||
nonASCIISingleCaseWordChar
.
test
(
ch
))
}
export
function
isWordChar
(
ch
,
helper
)
{
if
(
!
helper
)
return
isWordCharBasic
(
ch
)
if
(
helper
.
source
.
indexOf
(
"
\\
w
"
)
>
-
1
&&
isWordCharBasic
(
ch
))
return
true
return
helper
.
test
(
ch
)
}
export
function
isEmpty
(
obj
)
{
for
(
let
n
in
obj
)
if
(
obj
.
hasOwnProperty
(
n
)
&&
obj
[
n
])
return
false
return
true
}
// Extending unicode characters. A series of a non-extending char +
// any number of extending chars is treated as a single unit as far
// as editing and measuring is concerned. This is not fully correct,
// since some scripts/fonts/browsers also treat other configurations
// of code points as a group.
let
extendingChars
=
/
[\u
0300-
\u
036f
\u
0483-
\u
0489
\u
0591-
\u
05bd
\u
05bf
\u
05c1
\u
05c2
\u
05c4
\u
05c5
\u
05c7
\u
0610-
\u
061a
\u
064b-
\u
065e
\u
0670
\u
06d6-
\u
06dc
\u
06de-
\u
06e4
\u
06e7
\u
06e8
\u
06ea-
\u
06ed
\u
0711
\u
0730-
\u
074a
\u
07a6-
\u
07b0
\u
07eb-
\u
07f3
\u
0816-
\u
0819
\u
081b-
\u
0823
\u
0825-
\u
0827
\u
0829-
\u
082d
\u
0900-
\u
0902
\u
093c
\u
0941-
\u
0948
\u
094d
\u
0951-
\u
0955
\u
0962
\u
0963
\u
0981
\u
09bc
\u
09be
\u
09c1-
\u
09c4
\u
09cd
\u
09d7
\u
09e2
\u
09e3
\u
0a01
\u
0a02
\u
0a3c
\u
0a41
\u
0a42
\u
0a47
\u
0a48
\u
0a4b-
\u
0a4d
\u
0a51
\u
0a70
\u
0a71
\u
0a75
\u
0a81
\u
0a82
\u
0abc
\u
0ac1-
\u
0ac5
\u
0ac7
\u
0ac8
\u
0acd
\u
0ae2
\u
0ae3
\u
0b01
\u
0b3c
\u
0b3e
\u
0b3f
\u
0b41-
\u
0b44
\u
0b4d
\u
0b56
\u
0b57
\u
0b62
\u
0b63
\u
0b82
\u
0bbe
\u
0bc0
\u
0bcd
\u
0bd7
\u
0c3e-
\u
0c40
\u
0c46-
\u
0c48
\u
0c4a-
\u
0c4d
\u
0c55
\u
0c56
\u
0c62
\u
0c63
\u
0cbc
\u
0cbf
\u
0cc2
\u
0cc6
\u
0ccc
\u
0ccd
\u
0cd5
\u
0cd6
\u
0ce2
\u
0ce3
\u
0d3e
\u
0d41-
\u
0d44
\u
0d4d
\u
0d57
\u
0d62
\u
0d63
\u
0dca
\u
0dcf
\u
0dd2-
\u
0dd4
\u
0dd6
\u
0ddf
\u
0e31
\u
0e34-
\u
0e3a
\u
0e47-
\u
0e4e
\u
0eb1
\u
0eb4-
\u
0eb9
\u
0ebb
\u
0ebc
\u
0ec8-
\u
0ecd
\u
0f18
\u
0f19
\u
0f35
\u
0f37
\u
0f39
\u
0f71-
\u
0f7e
\u
0f80-
\u
0f84
\u
0f86
\u
0f87
\u
0f90-
\u
0f97
\u
0f99-
\u
0fbc
\u
0fc6
\u
102d-
\u
1030
\u
1032-
\u
1037
\u
1039
\u
103a
\u
103d
\u
103e
\u
1058
\u
1059
\u
105e-
\u
1060
\u
1071-
\u
1074
\u
1082
\u
1085
\u
1086
\u
108d
\u
109d
\u
135f
\u
1712-
\u
1714
\u
1732-
\u
1734
\u
1752
\u
1753
\u
1772
\u
1773
\u
17b7-
\u
17bd
\u
17c6
\u
17c9-
\u
17d3
\u
17dd
\u
180b-
\u
180d
\u
18a9
\u
1920-
\u
1922
\u
1927
\u
1928
\u
1932
\u
1939-
\u
193b
\u
1a17
\u
1a18
\u
1a56
\u
1a58-
\u
1a5e
\u
1a60
\u
1a62
\u
1a65-
\u
1a6c
\u
1a73-
\u
1a7c
\u
1a7f
\u
1b00-
\u
1b03
\u
1b34
\u
1b36-
\u
1b3a
\u
1b3c
\u
1b42
\u
1b6b-
\u
1b73
\u
1b80
\u
1b81
\u
1ba2-
\u
1ba5
\u
1ba8
\u
1ba9
\u
1c2c-
\u
1c33
\u
1c36
\u
1c37
\u
1cd0-
\u
1cd2
\u
1cd4-
\u
1ce0
\u
1ce2-
\u
1ce8
\u
1ced
\u
1dc0-
\u
1de6
\u
1dfd-
\u
1dff
\u
200c
\u
200d
\u
20d0-
\u
20f0
\u
2cef-
\u
2cf1
\u
2de0-
\u
2dff
\u
302a-
\u
302f
\u
3099
\u
309a
\u
a66f-
\u
a672
\u
a67c
\u
a67d
\u
a6f0
\u
a6f1
\u
a802
\u
a806
\u
a80b
\u
a825
\u
a826
\u
a8c4
\u
a8e0-
\u
a8f1
\u
a926-
\u
a92d
\u
a947-
\u
a951
\u
a980-
\u
a982
\u
a9b3
\u
a9b6-
\u
a9b9
\u
a9bc
\u
aa29-
\u
aa2e
\u
aa31
\u
aa32
\u
aa35
\u
aa36
\u
aa43
\u
aa4c
\u
aab0
\u
aab2-
\u
aab4
\u
aab7
\u
aab8
\u
aabe
\u
aabf
\u
aac1
\u
abe5
\u
abe8
\u
abed
\u
dc00-
\u
dfff
\u
fb1e
\u
fe00-
\u
fe0f
\u
fe20-
\u
fe26
\u
ff9e
\u
ff9f
]
/
export
function
isExtendingChar
(
ch
)
{
return
ch
.
charCodeAt
(
0
)
>=
768
&&
extendingChars
.
test
(
ch
)
}
// Returns a number from the range [`0`; `str.length`] unless `pos` is outside that range.
export
function
skipExtendingChars
(
str
,
pos
,
dir
)
{
while
((
dir
<
0
?
pos
>
0
:
pos
<
str
.
length
)
&&
isExtendingChar
(
str
.
charAt
(
pos
)))
pos
+=
dir
return
pos
}
// Returns the value from the range [`from`; `to`] that satisfies
// `pred` and is closest to `from`. Assumes that at least `to` satisfies `pred`.
export
function
findFirst
(
pred
,
from
,
to
)
{
for
(;;)
{
if
(
Math
.
abs
(
from
-
to
)
<=
1
)
return
pred
(
from
)
?
from
:
to
let
mid
=
Math
.
floor
((
from
+
to
)
/
2
)
if
(
pred
(
mid
))
to
=
mid
else
from
=
mid
}
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/util/misc.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
misc.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/util/operation_group.js.js
deleted
100644 → 0
View file @
a3a26621
import
{
getHandlers
}
from
"
./event
"
let
operationGroup
=
null
export
function
pushOperation
(
op
)
{
if
(
operationGroup
)
{
operationGroup
.
ops
.
push
(
op
)
}
else
{
op
.
ownsGroup
=
operationGroup
=
{
ops
:
[
op
],
delayedCallbacks
:
[]
}
}
}
function
fireCallbacksForOps
(
group
)
{
// Calls delayed callbacks and cursorActivity handlers until no
// new ones appear
let
callbacks
=
group
.
delayedCallbacks
,
i
=
0
do
{
for
(;
i
<
callbacks
.
length
;
i
++
)
callbacks
[
i
].
call
(
null
)
for
(
let
j
=
0
;
j
<
group
.
ops
.
length
;
j
++
)
{
let
op
=
group
.
ops
[
j
]
if
(
op
.
cursorActivityHandlers
)
while
(
op
.
cursorActivityCalled
<
op
.
cursorActivityHandlers
.
length
)
op
.
cursorActivityHandlers
[
op
.
cursorActivityCalled
++
].
call
(
null
,
op
.
cm
)
}
}
while
(
i
<
callbacks
.
length
)
}
export
function
finishOperation
(
op
,
endCb
)
{
let
group
=
op
.
ownsGroup
if
(
!
group
)
return
try
{
fireCallbacksForOps
(
group
)
}
finally
{
operationGroup
=
null
endCb
(
group
)
}
}
let
orphanDelayedCallbacks
=
null
// Often, we want to signal events at a point where we are in the
// middle of some work, but don't want the handler to start calling
// other methods on the editor, which might be in an inconsistent
// state or simply not expect any other events to happen.
// signalLater looks whether there are any handlers, and schedules
// them to be executed when the last operation ends, or, if no
// operation is active, when a timeout fires.
export
function
signalLater
(
emitter
,
type
/*, values...*/
)
{
let
arr
=
getHandlers
(
emitter
,
type
)
if
(
!
arr
.
length
)
return
let
args
=
Array
.
prototype
.
slice
.
call
(
arguments
,
2
),
list
if
(
operationGroup
)
{
list
=
operationGroup
.
delayedCallbacks
}
else
if
(
orphanDelayedCallbacks
)
{
list
=
orphanDelayedCallbacks
}
else
{
list
=
orphanDelayedCallbacks
=
[]
setTimeout
(
fireOrphanDelayed
,
0
)
}
for
(
let
i
=
0
;
i
<
arr
.
length
;
++
i
)
list
.
push
(()
=>
arr
[
i
].
apply
(
null
,
args
))
}
function
fireOrphanDelayed
()
{
let
delayed
=
orphanDelayedCallbacks
orphanDelayedCallbacks
=
null
for
(
let
i
=
0
;
i
<
delayed
.
length
;
++
i
)
delayed
[
i
]()
}
bt5/erp5_code_mirror/SkinTemplateItem/portal_skins/erp5_code_mirror/codemirror/src/util/operation_group.js.xml
deleted
100644 → 0
View file @
a3a26621
<?xml version="1.0"?>
<ZopeData>
<record
id=
"1"
aka=
"AAAAAAAAAAE="
>
<pickle>
<global
name=
"File"
module=
"OFS.Image"
/>
</pickle>
<pickle>
<dictionary>
<item>
<key>
<string>
_Cacheable__manager_id
</string>
</key>
<value>
<string>
http_cache
</string>
</value>
</item>
<item>
<key>
<string>
__name__
</string>
</key>
<value>
<string>
operation_group.js
</string>
</value>
</item>
<item>
<key>
<string>
content_type
</string>
</key>
<value>
<string>
application/javascript
</string>
</value>
</item>
<item>
<key>
<string>
precondition
</string>
</key>
<value>
<string></string>
</value>
</item>
<item>
<key>
<string>
title
</string>
</key>
<value>
<string></string>
</value>
</item>
</dictionary>
</pickle>
</record>
</ZopeData>
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment