ophix-codemirror 2026.10.6.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (32) hide show
  1. ophix_codemirror-2026.10.6.1/LICENSE +21 -0
  2. ophix_codemirror-2026.10.6.1/PKG-INFO +76 -0
  3. ophix_codemirror-2026.10.6.1/README.md +46 -0
  4. ophix_codemirror-2026.10.6.1/pyproject.toml +56 -0
  5. ophix_codemirror-2026.10.6.1/setup.cfg +4 -0
  6. ophix_codemirror-2026.10.6.1/src/ophix_codemirror/OPHIX_RELEASE_NOTES.md +17 -0
  7. ophix_codemirror-2026.10.6.1/src/ophix_codemirror/__init__.py +4 -0
  8. ophix_codemirror-2026.10.6.1/src/ophix_codemirror/_version.py +2 -0
  9. ophix_codemirror-2026.10.6.1/src/ophix_codemirror/apps.py +8 -0
  10. ophix_codemirror-2026.10.6.1/src/ophix_codemirror/deploy_templates/env.fragment.j2 +6 -0
  11. ophix_codemirror-2026.10.6.1/src/ophix_codemirror/settings.py +6 -0
  12. ophix_codemirror-2026.10.6.1/src/ophix_codemirror/static/ophix_codemirror/codemirror/LICENSE +27 -0
  13. ophix_codemirror-2026.10.6.1/src/ophix_codemirror/static/ophix_codemirror/codemirror/README.md +40 -0
  14. ophix_codemirror-2026.10.6.1/src/ophix_codemirror/static/ophix_codemirror/codemirror/addon/fold/brace-fold.min.js +1 -0
  15. ophix_codemirror-2026.10.6.1/src/ophix_codemirror/static/ophix_codemirror/codemirror/addon/fold/foldcode.min.js +1 -0
  16. ophix_codemirror-2026.10.6.1/src/ophix_codemirror/static/ophix_codemirror/codemirror/addon/fold/foldgutter.min.css +1 -0
  17. ophix_codemirror-2026.10.6.1/src/ophix_codemirror/static/ophix_codemirror/codemirror/addon/fold/foldgutter.min.js +1 -0
  18. ophix_codemirror-2026.10.6.1/src/ophix_codemirror/static/ophix_codemirror/codemirror/codemirror.min.css +1 -0
  19. ophix_codemirror-2026.10.6.1/src/ophix_codemirror/static/ophix_codemirror/codemirror/codemirror.min.js +1 -0
  20. ophix_codemirror-2026.10.6.1/src/ophix_codemirror/static/ophix_codemirror/codemirror/mode/javascript.min.js +1 -0
  21. ophix_codemirror-2026.10.6.1/src/ophix_codemirror/static/ophix_codemirror/codemirror/mode/properties.min.js +1 -0
  22. ophix_codemirror-2026.10.6.1/src/ophix_codemirror/static/ophix_codemirror/codemirror/mode/toml.min.js +1 -0
  23. ophix_codemirror-2026.10.6.1/src/ophix_codemirror/static/ophix_codemirror/codemirror/mode/xml.min.js +1 -0
  24. ophix_codemirror-2026.10.6.1/src/ophix_codemirror/static/ophix_codemirror/codemirror/mode/yaml.min.js +1 -0
  25. ophix_codemirror-2026.10.6.1/src/ophix_codemirror/static/ophix_codemirror/css/codemirror-dark.css +76 -0
  26. ophix_codemirror-2026.10.6.1/src/ophix_codemirror/widgets.py +337 -0
  27. ophix_codemirror-2026.10.6.1/src/ophix_codemirror.egg-info/PKG-INFO +76 -0
  28. ophix_codemirror-2026.10.6.1/src/ophix_codemirror.egg-info/SOURCES.txt +30 -0
  29. ophix_codemirror-2026.10.6.1/src/ophix_codemirror.egg-info/dependency_links.txt +1 -0
  30. ophix_codemirror-2026.10.6.1/src/ophix_codemirror.egg-info/entry_points.txt +2 -0
  31. ophix_codemirror-2026.10.6.1/src/ophix_codemirror.egg-info/requires.txt +6 -0
  32. ophix_codemirror-2026.10.6.1/src/ophix_codemirror.egg-info/top_level.txt +1 -0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Paul McGowan
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,76 @@
1
+ Metadata-Version: 2.4
2
+ Name: ophix-codemirror
3
+ Version: 2026.10.6.1
4
+ Summary: Vendored CodeMirror editor widgets for Ophix Project Servers
5
+ Author: Ophix Project
6
+ License-Expression: MIT
7
+ Project-URL: Homepage, https://ophix.io
8
+ Project-URL: Documentation, https://github.com/ophixproject/ophix-codemirror#readme
9
+ Project-URL: Source, https://github.com/ophixproject/ophix-codemirror
10
+ Keywords: django,codemirror,editor,widget,ophix
11
+ Classifier: Development Status :: 4 - Beta
12
+ Classifier: Environment :: Web Environment
13
+ Classifier: Framework :: Django
14
+ Classifier: Intended Audience :: System Administrators
15
+ Classifier: Operating System :: OS Independent
16
+ Classifier: Programming Language :: Python :: 3
17
+ Classifier: Programming Language :: Python :: 3.10
18
+ Classifier: Programming Language :: Python :: 3.11
19
+ Classifier: Programming Language :: Python :: 3.12
20
+ Classifier: Programming Language :: Python :: 3.13
21
+ Classifier: Programming Language :: Python :: 3.14
22
+ Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
23
+ Classifier: Topic :: System :: Systems Administration
24
+ Requires-Python: >=3.10
25
+ Description-Content-Type: text/markdown
26
+ License-File: LICENSE
27
+ Requires-Dist: Django<6.0,>=4.2; python_version < "3.12"
28
+ Requires-Dist: Django>=4.2; python_version >= "3.12"
29
+ Dynamic: license-file
30
+
31
+ # ophix-codemirror
32
+
33
+ Vendored CodeMirror editor plugin for [ophix-server-base](https://github.com/ophixproject/ophix-server-base).
34
+
35
+ Bundles CodeMirror 5 as static assets and provides Django form widgets for use in the
36
+ admin interface. Air-gap safe — no CDN dependencies at runtime.
37
+
38
+ ---
39
+
40
+ ## Installation
41
+
42
+ ```bash
43
+ pip install ophix-codemirror
44
+ ```
45
+
46
+ ---
47
+
48
+ ## What this plugin provides
49
+
50
+ - Vendored CodeMirror 5.65.16 JavaScript and CSS assets (MIT licensed, from
51
+ [codemirror/codemirror5](https://github.com/codemirror/codemirror5); its license is
52
+ bundled alongside the vendored files at
53
+ `static/ophix_codemirror/codemirror/LICENSE`)
54
+ - `JSONCodeMirrorWidget` — JSON editor with fold gutter and auto pretty-print
55
+ - `DynamicCodeMirrorWidget` — format-switching editor; switches CodeMirror mode
56
+ based on a format dropdown with `data-codemirror-mode` attributes on each option.
57
+ Used by `ophix-confs` for configuration snippet editing.
58
+
59
+ ---
60
+
61
+ ## Usage
62
+
63
+ Used automatically by domain plugins that include a content editor in the admin.
64
+ `ophix-confs` wires `DynamicCodeMirrorWidget` into its `Configuration` admin form.
65
+ Other domains with content fields should use `DynamicCodeMirrorWidget` for any
66
+ format-aware text field.
67
+
68
+ ```python
69
+ from ophix_codemirror.widgets import DynamicCodeMirrorWidget, JSONCodeMirrorWidget
70
+ ```
71
+
72
+ ---
73
+
74
+ ## Server
75
+
76
+ This plugin is part of the [Ophix Project](https://ophix.io) server stack.
@@ -0,0 +1,46 @@
1
+ # ophix-codemirror
2
+
3
+ Vendored CodeMirror editor plugin for [ophix-server-base](https://github.com/ophixproject/ophix-server-base).
4
+
5
+ Bundles CodeMirror 5 as static assets and provides Django form widgets for use in the
6
+ admin interface. Air-gap safe — no CDN dependencies at runtime.
7
+
8
+ ---
9
+
10
+ ## Installation
11
+
12
+ ```bash
13
+ pip install ophix-codemirror
14
+ ```
15
+
16
+ ---
17
+
18
+ ## What this plugin provides
19
+
20
+ - Vendored CodeMirror 5.65.16 JavaScript and CSS assets (MIT licensed, from
21
+ [codemirror/codemirror5](https://github.com/codemirror/codemirror5); its license is
22
+ bundled alongside the vendored files at
23
+ `static/ophix_codemirror/codemirror/LICENSE`)
24
+ - `JSONCodeMirrorWidget` — JSON editor with fold gutter and auto pretty-print
25
+ - `DynamicCodeMirrorWidget` — format-switching editor; switches CodeMirror mode
26
+ based on a format dropdown with `data-codemirror-mode` attributes on each option.
27
+ Used by `ophix-confs` for configuration snippet editing.
28
+
29
+ ---
30
+
31
+ ## Usage
32
+
33
+ Used automatically by domain plugins that include a content editor in the admin.
34
+ `ophix-confs` wires `DynamicCodeMirrorWidget` into its `Configuration` admin form.
35
+ Other domains with content fields should use `DynamicCodeMirrorWidget` for any
36
+ format-aware text field.
37
+
38
+ ```python
39
+ from ophix_codemirror.widgets import DynamicCodeMirrorWidget, JSONCodeMirrorWidget
40
+ ```
41
+
42
+ ---
43
+
44
+ ## Server
45
+
46
+ This plugin is part of the [Ophix Project](https://ophix.io) server stack.
@@ -0,0 +1,56 @@
1
+ [build-system]
2
+ requires = ["setuptools>=68"]
3
+ build-backend = "setuptools.build_meta"
4
+
5
+ [project]
6
+ name = "ophix-codemirror"
7
+ version = "2026.10.06.01"
8
+ description = "Vendored CodeMirror editor widgets for Ophix Project Servers"
9
+ readme = "README.md"
10
+ requires-python = ">=3.10"
11
+ license = "MIT"
12
+ authors = [
13
+ { name = "Ophix Project" }
14
+ ]
15
+ keywords = ["django", "codemirror", "editor", "widget", "ophix"]
16
+ classifiers = [
17
+ "Development Status :: 4 - Beta",
18
+ "Environment :: Web Environment",
19
+ "Framework :: Django",
20
+ "Intended Audience :: System Administrators",
21
+ "Operating System :: OS Independent",
22
+ "Programming Language :: Python :: 3",
23
+ "Programming Language :: Python :: 3.10",
24
+ "Programming Language :: Python :: 3.11",
25
+ "Programming Language :: Python :: 3.12",
26
+ "Programming Language :: Python :: 3.13",
27
+ "Programming Language :: Python :: 3.14",
28
+ "Topic :: Internet :: WWW/HTTP :: Dynamic Content",
29
+ "Topic :: System :: Systems Administration",
30
+ ]
31
+ dependencies = [
32
+ "Django>=4.2,<6.0; python_version < '3.12'",
33
+ "Django>=4.2; python_version >= '3.12'",
34
+ ]
35
+
36
+ [project.urls]
37
+ Homepage = "https://ophix.io"
38
+ Documentation = "https://github.com/ophixproject/ophix-codemirror#readme"
39
+ Source = "https://github.com/ophixproject/ophix-codemirror"
40
+
41
+ [project.entry-points."ophix.plugins"]
42
+ ophix_codemirror = "ophix_codemirror"
43
+
44
+ [tool.setuptools]
45
+ package-dir = { "" = "src" }
46
+
47
+ [tool.setuptools.packages.find]
48
+ where = ["src"]
49
+
50
+ [tool.setuptools.package-data]
51
+ ophix_codemirror = [
52
+ "OPHIX_RELEASE_NOTES.md",
53
+ "static/**/*",
54
+ "locale/**/*",
55
+ "deploy_templates/**/*",
56
+ ]
@@ -0,0 +1,4 @@
1
+ [egg_info]
2
+ tag_build =
3
+ tag_date = 0
4
+
@@ -0,0 +1,17 @@
1
+ # Ophix Codemirror Release Notes
2
+
3
+ ## 2026.08.12.01
4
+
5
+ - Django dependency split by `python_version` marker: `Django>=4.2,<6.0` on Python < 3.12,
6
+ `Django>=4.2` (no upper bound) on Python >= 3.12. Django 6.0 itself requires Python 3.12+;
7
+ this makes the "Python 3.10/3.11 + Django 6" combination structurally unreachable via pip's
8
+ resolver instead of failing at runtime, while still allowing 3.10/3.11 hosts to run on
9
+ Django 5.2. `requires-python` is unchanged (`>=3.10` remains the true floor).
10
+
11
+ ## 2026.06.05.01
12
+
13
+ - Dark mode support: CodeMirror editor now reskins to a dark colour scheme when the admin dark mode toggle is active (`[data-theme="dark"]`).
14
+
15
+ ## 2026.05.26.01
16
+
17
+ - Added `OPHIX_RELEASE_NOTES.md` for release notes delivery.
@@ -0,0 +1,4 @@
1
+ plugin_category = "addon"
2
+ plugin_sort = 220
3
+
4
+
@@ -0,0 +1,2 @@
1
+ __version__ = "2026.10.06.01"
2
+ __package_name__ = "ophix-codemirror"
@@ -0,0 +1,8 @@
1
+ from django.apps import AppConfig
2
+ from django.utils.translation import gettext_lazy as _
3
+
4
+
5
+ class OphixCodeMirrorConfig(AppConfig):
6
+ default_auto_field = "django.db.models.BigAutoField"
7
+ name = "ophix_codemirror"
8
+ verbose_name = _("Ophix CodeMirror")
@@ -0,0 +1,6 @@
1
+ # ---------------------------------------------------------------------------
2
+ # ophix-codemirror — CodeMirror editor widgets plugin
3
+ # ---------------------------------------------------------------------------
4
+ # No plugin-specific environment variables at this time.
5
+ # This file exists so ophix-manage generate_deploy_config --append
6
+ # will include this plugin in its discovery scan when variables are added.
@@ -0,0 +1,6 @@
1
+ """
2
+ ophix_codemirror.settings
3
+ ~~~~~~~~~~~~~~~~~~~~~~~~~
4
+ No codemirror-specific settings required.
5
+ This module exists for plugin discovery consistency.
6
+ """
@@ -0,0 +1,27 @@
1
+ This directory vendors CodeMirror 5 (version 5.65.16), including its
2
+ addon/fold/* files, from https://github.com/codemirror/codemirror5 — the
3
+ author's own repository for the CodeMirror 5 editor and its official
4
+ addons, used here unmodified. It is bundled directly to keep ophix-codemirror
5
+ air-gap compatible (no runtime CDN dependency).
6
+
7
+ MIT License
8
+
9
+ Copyright (C) 2017 by Marijn Haverbeke <marijn@haverbeke.berlin> and others
10
+
11
+ Permission is hereby granted, free of charge, to any person obtaining a copy
12
+ of this software and associated documentation files (the "Software"), to deal
13
+ in the Software without restriction, including without limitation the rights
14
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
15
+ copies of the Software, and to permit persons to whom the Software is
16
+ furnished to do so, subject to the following conditions:
17
+
18
+ The above copyright notice and this permission notice shall be included in
19
+ all copies or substantial portions of the Software.
20
+
21
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
22
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
24
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
25
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
26
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
27
+ THE SOFTWARE.
@@ -0,0 +1,40 @@
1
+ # CodeMirror vendored static files
2
+
3
+ This directory must be populated with CodeMirror assets before the
4
+ editor widgets will function. The server will start without them —
5
+ affected fields fall back to plain textareas.
6
+
7
+ ## Required files
8
+
9
+ ```
10
+ codemirror.min.js
11
+ codemirror.min.css
12
+ theme/
13
+ default.min.css
14
+ mode/
15
+ javascript.min.js (JSON and JavaScript)
16
+ yaml.min.js
17
+ xml.min.js
18
+ properties.min.js (INI and .env files)
19
+ toml.min.js
20
+ ```
21
+
22
+ ## Download URLs (CodeMirror 5.65.x)
23
+
24
+ ```
25
+ https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.js
26
+ https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/codemirror.min.css
27
+ https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/theme/default.min.css
28
+ https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/javascript/javascript.min.js
29
+ https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/yaml/yaml.min.js
30
+ https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/xml/xml.min.js
31
+ https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/properties/properties.min.js
32
+ https://cdnjs.cloudflare.com/ajax/libs/codemirror/5.65.16/mode/toml/toml.min.js
33
+ ```
34
+
35
+ ## Adding a new mode
36
+
37
+ 1. Download the mode JS file from the CDN above
38
+ 2. Place it in mode/
39
+ 3. Add it to CODEMIRROR_MODE_FILES in ophix_codemirror/widgets.py
40
+ 4. Release a new version of ophix-codemirror
@@ -0,0 +1 @@
1
+ !function(e){"object"==typeof exports&&"object"==typeof module?e(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],e):e(CodeMirror)}(function(g){"use strict";function e(i){return function(c,o){var d=o.line,l=c.getLine(d);for(var e=[],r=0;r<i.length;r++){var n=function(e){for(var r,n=o.ch,t=0;;){var i=n<=0?-1:l.lastIndexOf(e[0],n-1);if(-1==i){if(1==t)break;t=1,n=l.length}else{if(1==t&&i<o.ch)break;if(r=c.getTokenTypeAt(g.Pos(d,i+1)),!/^(comment|string)/.test(r))return{ch:i+1,tokenType:r,pair:e};n=i-1}}}(i[r]);n&&e.push(n)}e.sort(function(e,r){return e.ch-r.ch});for(r=0;r<e.length;r++){var t=function(e){var r,n,t=1,i=c.lastLine(),o=e.ch;e:for(var l=d;l<=i;++l)for(var f=c.getLine(l),u=l==d?o:0;;){var s=f.indexOf(e.pair[0],u),a=f.indexOf(e.pair[1],u);if(s<0&&(s=f.length),a<0&&(a=f.length),(u=Math.min(s,a))==f.length)break;if(c.getTokenTypeAt(g.Pos(l,u+1))==e.tokenType)if(u==s)++t;else if(!--t){r=l,n=u;break e}++u}return null==r||d==r?null:{from:g.Pos(d,o),to:g.Pos(r,n)}}(e[r]);if(t)return t}return null}}g.registerHelper("fold","brace",e([["{","}"],["[","]"]])),g.registerHelper("fold","brace-paren",e([["{","}"],["[","]"],["(",")"]])),g.registerHelper("fold","import",function(o,e){function r(e){if(e<o.firstLine()||e>o.lastLine())return null;var r=o.getTokenAt(g.Pos(e,1));if("keyword"!=(r=/\S/.test(r.string)?r:o.getTokenAt(g.Pos(e,r.end+1))).type||"import"!=r.string)return null;for(var n=e,t=Math.min(o.lastLine(),e+10);n<=t;++n){var i=o.getLine(n).indexOf(";");if(-1!=i)return{startCh:r.end,end:g.Pos(n,i)}}}var n,e=e.line,t=r(e);if(!t||r(e-1)||(n=r(e-2))&&n.end.line==e-1)return null;for(var i=t.end;;){var l=r(i.line+1);if(null==l)break;i=l.end}return{from:o.clipPos(g.Pos(e,t.startCh+1)),to:i}}),g.registerHelper("fold","include",function(n,e){function r(e){if(e<n.firstLine()||e>n.lastLine())return null;var r=n.getTokenAt(g.Pos(e,1));return"meta"==(r=/\S/.test(r.string)?r:n.getTokenAt(g.Pos(e,r.end+1))).type&&"#include"==r.string.slice(0,8)?r.start+8:void 0}var e=e.line,t=r(e);if(null==t||null!=r(e-1))return null;for(var i=e;;){if(null==r(i+1))break;++i}return{from:g.Pos(e,t+1),to:n.clipPos(g.Pos(i))}})});
@@ -0,0 +1 @@
1
+ !function(n){"object"==typeof exports&&"object"==typeof module?n(require("../../lib/codemirror")):"function"==typeof define&&define.amd?define(["../../lib/codemirror"],n):n(CodeMirror)}(function(c){"use strict";function t(t,i,n,f){n&&n.call?(l=n,n=null):l=a(t,n,"rangeFinder"),"number"==typeof i&&(i=c.Pos(i,0));var l,d=a(t,n,"minFoldSize");function o(n){var o=l(t,i);if(!o||o.to.line-o.from.line<d)return null;if("fold"===f)return o;for(var e=t.findMarksAt(o.from),r=0;r<e.length;++r)if(e[r].__isFold){if(!n)return null;o.cleared=!0,e[r].clear()}return o}var e,r,u=o(!0);if(a(t,n,"scanUp"))for(;!u&&i.line>t.firstLine();)i=c.Pos(i.line-1,0),u=o(!1);u&&!u.cleared&&"unfold"!==f&&(e=function(n,o,e){n=a(n,o,"widget");"function"==typeof n&&(n=n(e.from,e.to));"string"==typeof n?(o=document.createTextNode(n),(n=document.createElement("span")).appendChild(o),n.className="CodeMirror-foldmarker"):n=n&&n.cloneNode(!0);return n}(t,n,u),c.on(e,"mousedown",function(n){r.clear(),c.e_preventDefault(n)}),(r=t.markText(u.from,u.to,{replacedWith:e,clearOnEnter:a(t,n,"clearOnEnter"),__isFold:!0})).on("clear",function(n,o){c.signal(t,"unfold",t,n,o)}),c.signal(t,"fold",t,u.from,u.to))}c.newFoldFunction=function(e,r){return function(n,o){t(n,o,{rangeFinder:e,widget:r})}},c.defineExtension("foldCode",function(n,o,e){t(this,n,o,e)}),c.defineExtension("isFolded",function(n){for(var o=this.findMarksAt(n),e=0;e<o.length;++e)if(o[e].__isFold)return!0}),c.commands.toggleFold=function(n){n.foldCode(n.getCursor())},c.commands.fold=function(n){n.foldCode(n.getCursor(),null,"fold")},c.commands.unfold=function(n){n.foldCode(n.getCursor(),{scanUp:!1},"unfold")},c.commands.foldAll=function(e){e.operation(function(){for(var n=e.firstLine(),o=e.lastLine();n<=o;n++)e.foldCode(c.Pos(n,0),{scanUp:!1},"fold")})},c.commands.unfoldAll=function(e){e.operation(function(){for(var n=e.firstLine(),o=e.lastLine();n<=o;n++)e.foldCode(c.Pos(n,0),{scanUp:!1},"unfold")})},c.registerHelper("fold","combine",function(){var t=Array.prototype.slice.call(arguments,0);return function(n,o){for(var e=0;e<t.length;++e){var r=t[e](n,o);if(r)return r}}}),c.registerHelper("fold","auto",function(n,o){for(var e=n.getHelpers(o,"fold"),r=0;r<e.length;r++){var t=e[r](n,o);if(t)return t}});var r={rangeFinder:c.fold.auto,widget:"↔",minFoldSize:0,scanUp:!1,clearOnEnter:!0};function a(n,o,e){if(o&&void 0!==o[e])return o[e];o=n.options.foldOptions;return(o&&void 0!==o[e]?o:r)[e]}c.defineOption("foldOptions",null),c.defineExtension("foldOption",function(n,o){return a(this,n,o)})});
@@ -0,0 +1 @@
1
+ .CodeMirror-foldmarker{color:#00f;text-shadow:#b9f 1px 1px 2px,#b9f -1px -1px 2px,#b9f 1px -1px 2px,#b9f -1px 1px 2px;font-family:arial;line-height:.3;cursor:pointer}.CodeMirror-foldgutter{width:.7em}.CodeMirror-foldgutter-folded,.CodeMirror-foldgutter-open{cursor:pointer}.CodeMirror-foldgutter-open:after{content:"\25BE"}.CodeMirror-foldgutter-folded:after{content:"\25B8"}
@@ -0,0 +1 @@
1
+ !function(t){"object"==typeof exports&&"object"==typeof module?t(require("../../lib/codemirror"),require("./foldcode")):"function"==typeof define&&define.amd?define(["../../lib/codemirror","./foldcode"],t):t(CodeMirror)}(function(n){"use strict";n.defineOption("foldGutter",!1,function(t,o,e){e&&e!=n.Init&&(t.clearGutter(t.state.foldGutter.options.gutter),t.state.foldGutter=null,t.off("gutterClick",d),t.off("changes",u),t.off("viewportChange",l),t.off("fold",m),t.off("unfold",m),t.off("swapDoc",u),t.off("optionChange",a)),o&&(t.state.foldGutter=new r(function(t){!0===t&&(t={});null==t.gutter&&(t.gutter="CodeMirror-foldgutter");null==t.indicatorOpen&&(t.indicatorOpen="CodeMirror-foldgutter-open");null==t.indicatorFolded&&(t.indicatorFolded="CodeMirror-foldgutter-folded");return t}(o)),f(t),t.on("gutterClick",d),t.on("changes",u),t.on("viewportChange",l),t.on("fold",m),t.on("unfold",m),t.on("swapDoc",u),t.on("optionChange",a))});var c=n.Pos;function r(t){this.options=t,this.from=this.to=0}function s(t,o){for(var e=t.findMarks(c(o,0),c(o+1,0)),n=0;n<e.length;++n)if(e[n].__isFold){var r=e[n].find(-1);if(r&&r.line===o)return e[n]}}function p(t){var o;return"string"==typeof t?((o=document.createElement("div")).className=t+" CodeMirror-guttermarker-subtle",o):t.cloneNode(!0)}function i(r,t,o){var i=r.state.foldGutter.options,f=t-1,d=r.foldOption(i,"minFoldSize"),a=r.foldOption(i,"rangeFinder"),u="string"==typeof i.indicatorFolded&&e(i.indicatorFolded),l="string"==typeof i.indicatorOpen&&e(i.indicatorOpen);r.eachLine(t,o,function(t){++f;var o=null,e=(e=t.gutterMarkers)&&e[i.gutter];if(s(r,f)){if(u&&e&&u.test(e.className))return;o=p(i.indicatorFolded)}else{var n=c(f,0),n=a&&a(r,n);if(n&&n.to.line-n.from.line>=d){if(l&&e&&l.test(e.className))return;o=p(i.indicatorOpen)}}(o||e)&&r.setGutterMarker(t,i.gutter,o)})}function e(t){return new RegExp("(^|\\s)"+t+"(?:$|\\s)\\s*")}function f(t){var o=t.getViewport(),e=t.state.foldGutter;e&&(t.operation(function(){i(t,o.from,o.to)}),e.from=o.from,e.to=o.to)}function d(t,o,e){var n=t.state.foldGutter;!n||e==(e=n.options).gutter&&((n=s(t,o))?n.clear():t.foldCode(c(o,0),e))}function a(t,o){"mode"==o&&u(t)}function u(t){var o,e=t.state.foldGutter;e&&(o=e.options,e.from=e.to=0,clearTimeout(e.changeUpdate),e.changeUpdate=setTimeout(function(){f(t)},o.foldOnChangeTimeSpan||600))}function l(o){var t,e=o.state.foldGutter;e&&(t=e.options,clearTimeout(e.changeUpdate),e.changeUpdate=setTimeout(function(){var t=o.getViewport();e.from==e.to||20<t.from-e.to||20<e.from-t.to?f(o):o.operation(function(){t.from<e.from&&(i(o,t.from,e.from),e.from=t.from),t.to>e.to&&(i(o,e.to,t.to),e.to=t.to)})},t.updateViewportTimeSpan||400))}function m(t,o){var e=t.state.foldGutter;!e||(o=o.line)>=e.from&&o<e.to&&i(t,o,o+1)}});
@@ -0,0 +1 @@
1
+ .CodeMirror{font-family:monospace;height:300px;color:#000;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{padding:0 4px}.CodeMirror-gutter-filler,.CodeMirror-scrollbar-filler{background-color:#fff}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:#000}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid #000;border-right:none;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0!important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor .CodeMirror-line::selection,.cm-fat-cursor .CodeMirror-line>span::selection,.cm-fat-cursor .CodeMirror-line>span>span::selection{background:0 0}.cm-fat-cursor .CodeMirror-line::-moz-selection,.cm-fat-cursor .CodeMirror-line>span::-moz-selection,.cm-fat-cursor .CodeMirror-line>span>span::-moz-selection{background:0 0}.cm-fat-cursor{caret-color:transparent}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:0;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:#00f}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:700}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-type,.cm-s-default .cm-variable-3{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:#fff}.CodeMirror-scroll{overflow:scroll!important;margin-bottom:-50px;margin-right:-50px;padding-bottom:50px;height:100%;outline:0;position:relative;z-index:0}.CodeMirror-sizer{position:relative;border-right:50px solid transparent}.CodeMirror-gutter-filler,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-vscrollbar{position:absolute;z-index:6;display:none;outline:0}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-50px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:0 0!important;border:none!important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:0 0;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre.CodeMirror-line,.CodeMirror-wrap pre.CodeMirror-line-like{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber,.CodeMirror-scroll,.CodeMirror-sizer{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0 0}