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.
- ophix_codemirror-2026.10.6.1/LICENSE +21 -0
- ophix_codemirror-2026.10.6.1/PKG-INFO +76 -0
- ophix_codemirror-2026.10.6.1/README.md +46 -0
- ophix_codemirror-2026.10.6.1/pyproject.toml +56 -0
- ophix_codemirror-2026.10.6.1/setup.cfg +4 -0
- ophix_codemirror-2026.10.6.1/src/ophix_codemirror/OPHIX_RELEASE_NOTES.md +17 -0
- ophix_codemirror-2026.10.6.1/src/ophix_codemirror/__init__.py +4 -0
- ophix_codemirror-2026.10.6.1/src/ophix_codemirror/_version.py +2 -0
- ophix_codemirror-2026.10.6.1/src/ophix_codemirror/apps.py +8 -0
- ophix_codemirror-2026.10.6.1/src/ophix_codemirror/deploy_templates/env.fragment.j2 +6 -0
- ophix_codemirror-2026.10.6.1/src/ophix_codemirror/settings.py +6 -0
- ophix_codemirror-2026.10.6.1/src/ophix_codemirror/static/ophix_codemirror/codemirror/LICENSE +27 -0
- ophix_codemirror-2026.10.6.1/src/ophix_codemirror/static/ophix_codemirror/codemirror/README.md +40 -0
- ophix_codemirror-2026.10.6.1/src/ophix_codemirror/static/ophix_codemirror/codemirror/addon/fold/brace-fold.min.js +1 -0
- ophix_codemirror-2026.10.6.1/src/ophix_codemirror/static/ophix_codemirror/codemirror/addon/fold/foldcode.min.js +1 -0
- ophix_codemirror-2026.10.6.1/src/ophix_codemirror/static/ophix_codemirror/codemirror/addon/fold/foldgutter.min.css +1 -0
- ophix_codemirror-2026.10.6.1/src/ophix_codemirror/static/ophix_codemirror/codemirror/addon/fold/foldgutter.min.js +1 -0
- ophix_codemirror-2026.10.6.1/src/ophix_codemirror/static/ophix_codemirror/codemirror/codemirror.min.css +1 -0
- ophix_codemirror-2026.10.6.1/src/ophix_codemirror/static/ophix_codemirror/codemirror/codemirror.min.js +1 -0
- ophix_codemirror-2026.10.6.1/src/ophix_codemirror/static/ophix_codemirror/codemirror/mode/javascript.min.js +1 -0
- ophix_codemirror-2026.10.6.1/src/ophix_codemirror/static/ophix_codemirror/codemirror/mode/properties.min.js +1 -0
- ophix_codemirror-2026.10.6.1/src/ophix_codemirror/static/ophix_codemirror/codemirror/mode/toml.min.js +1 -0
- ophix_codemirror-2026.10.6.1/src/ophix_codemirror/static/ophix_codemirror/codemirror/mode/xml.min.js +1 -0
- ophix_codemirror-2026.10.6.1/src/ophix_codemirror/static/ophix_codemirror/codemirror/mode/yaml.min.js +1 -0
- ophix_codemirror-2026.10.6.1/src/ophix_codemirror/static/ophix_codemirror/css/codemirror-dark.css +76 -0
- ophix_codemirror-2026.10.6.1/src/ophix_codemirror/widgets.py +337 -0
- ophix_codemirror-2026.10.6.1/src/ophix_codemirror.egg-info/PKG-INFO +76 -0
- ophix_codemirror-2026.10.6.1/src/ophix_codemirror.egg-info/SOURCES.txt +30 -0
- ophix_codemirror-2026.10.6.1/src/ophix_codemirror.egg-info/dependency_links.txt +1 -0
- ophix_codemirror-2026.10.6.1/src/ophix_codemirror.egg-info/entry_points.txt +2 -0
- ophix_codemirror-2026.10.6.1/src/ophix_codemirror.egg-info/requires.txt +6 -0
- 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,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,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,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.
|
ophix_codemirror-2026.10.6.1/src/ophix_codemirror/static/ophix_codemirror/codemirror/README.md
ADDED
|
@@ -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}
|