From 0cb17b6292eb8d9a6622f273dae5cf7ba9f09b2f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E5=AE=87=E5=A4=A9?=
Date: Mon, 14 Dec 2020 14:44:05 +0800
Subject: [PATCH] new version
---
build.dev.js | 103 +-
build.prod.js | 124 +-
package.json | 8 +-
src/badge/index.wc | 14 +-
src/chart/line.wc | 227 ++
src/chart/rank.wc | 112 +
src/code/index.wc | 38 +-
src/codemirror/codemirror.js | 4621 ---------------------------
src/codemirror/index.js | 2143 -------------
src/color/helper.js | 117 +
src/color/index.wc | 475 +++
src/crypto/Readme.md | 47 -
src/crypto/index.js | 77 -
src/crypto/md5.js | 764 -----
src/css/codemirror-dark.scss | 219 --
src/css/codemirror-light.scss | 226 --
src/css/meditor.scss | 176 -
src/css/meditor__attach.css | 1 -
src/css/meditor__attach.scss | 84 -
src/css/slider.scss | 109 -
src/css/tree.css | 1 -
src/css/tree.scss | 31 -
src/css/var.scss | 13 -
src/drag/core.js | 2 -
src/drag/index.js | 2 -
src/form/button.wc | 126 +-
src/form/checkbox-item.wc | 283 ++
src/form/checkbox.wc | 264 +-
src/form/input.wc | 86 +-
src/form/number.wc | 20 +-
src/form/progress.wc | 16 +-
src/form/radio-item.wc | 290 ++
src/form/radio.wc | 268 +-
src/form/select.wc | 22 +-
src/form/star.wc | 16 +-
src/form/switch.wc | 18 +-
src/icon/index.wc | 16 +-
src/keyboard/index.wc | 305 ++
src/layer/index.wc | 32 +-
src/markd/core.js | 267 +-
src/markd/index.wc | 158 +-
src/meditor/addon.js | 131 +
src/meditor/helper.js | 225 ++
src/meditor/index.wc | 811 ++++-
src/meditor/svg.js | 55 +
src/meditor2/addon/attach-native.js | 372 ---
src/meditor2/addon/attach.js | 497 ---
src/meditor2/addon/base.js | 531 ---
src/meditor2/index.js | 616 ----
src/neditor/index.wc | 4 +-
src/pager/index.wc | 22 +-
src/picker/color.wc | 0
src/picker/date.wc | 22 +-
src/request/index.js | 446 ---
src/request/lib/format.js | 225 --
src/request/light.js | 0
src/router/index.js | 241 --
src/scroll/index.wc | 61 +-
src/slider/index.wc | 264 ++
src/sliders/index.wc | 22 -
src/store/index.js | 278 --
src/table/index.wc | 8 +-
src/table/td.wc | 2 +-
src/table/tr.wc | 2 +-
src/utils.js | 23 +
65 files changed, 4039 insertions(+), 12740 deletions(-)
create mode 100644 src/chart/line.wc
create mode 100644 src/chart/rank.wc
delete mode 100644 src/codemirror/codemirror.js
delete mode 100644 src/codemirror/index.js
create mode 100644 src/color/helper.js
create mode 100644 src/color/index.wc
delete mode 100644 src/crypto/Readme.md
delete mode 100644 src/crypto/index.js
delete mode 100644 src/crypto/md5.js
delete mode 100644 src/css/codemirror-dark.scss
delete mode 100644 src/css/codemirror-light.scss
delete mode 100644 src/css/meditor.scss
delete mode 100644 src/css/meditor__attach.css
delete mode 100644 src/css/meditor__attach.scss
delete mode 100644 src/css/slider.scss
delete mode 100644 src/css/tree.css
delete mode 100644 src/css/tree.scss
delete mode 100644 src/css/var.scss
create mode 100644 src/form/checkbox-item.wc
create mode 100644 src/form/radio-item.wc
create mode 100644 src/keyboard/index.wc
create mode 100644 src/meditor/addon.js
create mode 100644 src/meditor/helper.js
create mode 100644 src/meditor/svg.js
delete mode 100644 src/meditor2/addon/attach-native.js
delete mode 100644 src/meditor2/addon/attach.js
delete mode 100644 src/meditor2/addon/base.js
delete mode 100644 src/meditor2/index.js
delete mode 100644 src/picker/color.wc
delete mode 100644 src/request/index.js
delete mode 100644 src/request/lib/format.js
delete mode 100644 src/request/light.js
delete mode 100644 src/router/index.js
create mode 100644 src/slider/index.wc
delete mode 100644 src/sliders/index.wc
delete mode 100644 src/store/index.js
diff --git a/build.dev.js b/build.dev.js
index b6c4694..e80f906 100644
--- a/build.dev.js
+++ b/build.dev.js
@@ -15,20 +15,6 @@ const VERSION = require('./package.json').version
const BUILD_DATE = new Date().format()
const BASE_SCSS = `
-$ct: #4db6ac #26a69a #009688;
-$cg: #81c784 #66bb6a #4caf50;
-$cpp: #9575cd #9575cd #673ab7;
-$cb: #64b5f6 #42a5f5 #2196f3;
-$cr: #ff5061 #eb3b48 #ce3742;
-$co: #ffb618 #f39c12 #e67e22;
-$cp: #f2f5fc #e8ebf4 #dae1e9;
-$cgr: #bdbdbd #9e9e9e #757575;
-$cd: #62778d #526273 #425064;
-
-@mixin ts($c: all, $t: .1s, $m: ease-in-out){
- transition:$c $t $m;
-}
-
@mixin focus1(){
box-shadow: 0 0 2px #88f7df;
}
@@ -43,6 +29,36 @@ $cd: #62778d #526273 #425064;
}
::before,
::after{box-sizing:border-box;}
+
+:host {
+ --color-teal-1: #4db6ac;
+ --color-teal-2: #26a69a;
+ --color-teal-3: #009688;
+ --color-green-1: #81c784;
+ --color-green-2: #66bb6a;
+ --color-green-3: #4caf50;
+ --color-purple-1: #9575cd;
+ --color-purple-2: #9575cd;
+ --color-purple-3: #673ab7;
+ --color-blue-1: #64b5f6;
+ --color-blue-2: #42a5f5;
+ --color-blue-3: #2196f3;
+ --color-red-1: #ff5061;
+ --color-red-2: #eb3b48;
+ --color-red-3: #ce3742;
+ --color-orange-1: #ffb618;
+ --color-orange-2: #f39c12;
+ --color-orange-3: #e67e22;
+ --color-plain-1: #f2f5fc;
+ --color-plain-2: #e8ebf4;
+ --color-plain-3: #dae1e9;
+ --color-grey-1: #bdbdbd;
+ --color-grey-2: #9e9e9e;
+ --color-grey-3: #757575;
+ --color-dark-1: #62778d;
+ --color-dark-2: #526273;
+ --color-dark-3: #425064;
+}
`
function parseName(str) {
@@ -79,47 +95,42 @@ function mkWCFile({ style, html, js }) {
style = compileScss(style)
let name = ''
- let props = ''
- js = js.replace(/props = (\{\}|\{[\w\W]*?\n\s{2}?\})/, function(s, m) {
- props = m
- var attr = new Function(
- `try {
- var props = ${m}, attr = []
- for(var i in props){attr.push(i)}
- return attr
- } catch(err) {console.error(err);return []}
- `
- )()
- return `static get observedAttributes() {
- return ${JSON.stringify(attr)}
- }
- `
+ js = js.replace(/props = (\{\}|\{[\w\W]*?\n\s{2}?\})/, function(str) {
+ var attr = str
+ .split(/\n+/)
+ .slice(1, -1)
+ .map(it => {
+ var tmp = it.split(':')
+ return tmp[0].trim()
+ })
+ return `
+
+ static get observedAttributes() {
+ return ${JSON.stringify(attr)}
+ }
+
+ ${str}
+ `
})
js = fixImport(js)
- .replace(/class ([a-zA-Z0-9]+)/, function(s, m) {
+ .replace(/export default class ([a-zA-Z0-9]+)/, function(s, m) {
name = m
return `${s} extends HTMLElement `
})
- .replace(/__init__\(\)\s+\{/, 'constructor() {\n super();')
+ .replace(/__init__\(\)\s+\{/, 'constructor() {\n super();')
.replace(
'/* render */',
`
- Object.defineProperty(this, 'root', {
- value: this.attachShadow({ mode: 'open' }),
- writable: true,
- enumerable: false,
- configurable: true
- })
- Object.defineProperty(this, 'props', {
- value: ${props},
- writable: true,
- enumerable: false,
- configurable: true
- })
+ Object.defineProperty(this, 'root', {
+ value: this.attachShadow({ mode: 'open' }),
+ writable: true,
+ enumerable: false,
+ configurable: true
+ })
- this.root.innerHTML = \`${html}\`
+ this.root.innerHTML = \`${html}\`
`
)
.replace('mounted()', 'connectedCallback()')
@@ -138,10 +149,6 @@ function mkWCFile({ style, html, js }) {
*
*/
-'use strict'
-
-const log = console.log
-
${js}
if(!customElements.get('wc-${parseName(name)}')){
diff --git a/build.prod.js b/build.prod.js
index 3d46b71..244b4ca 100644
--- a/build.prod.js
+++ b/build.prod.js
@@ -6,7 +6,7 @@ const fs = require('iofs')
const path = require('path')
const scss = require('node-sass')
const chalk = require('chalk')
-const uglify = require('uglify-es')
+const { minify } = require('terser')
const sourceDir = path.resolve(__dirname, 'src')
const buildDir = path.resolve(__dirname, 'dist')
@@ -15,20 +15,6 @@ const VERSION = require('./package.json').version
const BUILD_DATE = new Date().format()
const BASE_SCSS = `
-$ct: #4db6ac #26a69a #009688;
-$cg: #81c784 #66bb6a #4caf50;
-$cpp: #9575cd #9575cd #673ab7;
-$cb: #64b5f6 #42a5f5 #2196f3;
-$cr: #ff5061 #eb3b48 #ce3742;
-$co: #ffb618 #f39c12 #e67e22;
-$cp: #f2f5fc #e8ebf4 #dae1e9;
-$cgr: #bdbdbd #9e9e9e #757575;
-$cd: #62778d #526273 #425064;
-
-@mixin ts($c: all, $t: .1s, $m: ease-in-out){
- transition:$c $t $m;
-}
-
@mixin focus1(){
box-shadow: 0 0 2px #88f7df;
}
@@ -43,6 +29,36 @@ $cd: #62778d #526273 #425064;
}
::before,
::after{box-sizing:border-box;}
+
+:host {
+ --color-teal-1: #4db6ac;
+ --color-teal-2: #26a69a;
+ --color-teal-3: #009688;
+ --color-green-1: #81c784;
+ --color-green-2: #66bb6a;
+ --color-green-3: #4caf50;
+ --color-purple-1: #9575cd;
+ --color-purple-2: #9575cd;
+ --color-purple-3: #673ab7;
+ --color-blue-1: #64b5f6;
+ --color-blue-2: #42a5f5;
+ --color-blue-3: #2196f3;
+ --color-red-1: #ff5061;
+ --color-red-2: #eb3b48;
+ --color-red-3: #ce3742;
+ --color-orange-1: #ffb618;
+ --color-orange-2: #f39c12;
+ --color-orange-3: #e67e22;
+ --color-plain-1: #f2f5fc;
+ --color-plain-2: #e8ebf4;
+ --color-plain-3: #dae1e9;
+ --color-grey-1: #bdbdbd;
+ --color-grey-2: #9e9e9e;
+ --color-grey-3: #757575;
+ --color-dark-1: #62778d;
+ --color-dark-2: #526273;
+ --color-dark-3: #425064;
+}
`
function parseName(str) {
@@ -62,14 +78,14 @@ const compileJs = (entry, output) => {
let t1 = Date.now()
let buf = fs.cat(entry).toString()
buf = fixImport(buf)
- let { code } = uglify.minify(buf)
-
- log(
- '编译JS: %s, 耗时 %s ms',
- chalk.green(entry),
- chalk.yellow(Date.now() - t1)
- )
- fs.echo(code, output)
+ minify(buf, { sourceMap: false }).then(res => {
+ log(
+ '编译JS: %s, 耗时 %s ms',
+ chalk.green(entry),
+ chalk.yellow(Date.now() - t1)
+ )
+ fs.echo(res.code, output)
+ })
}
// 编译样式
@@ -93,25 +109,31 @@ function mkWCFile({ style, html, js }) {
html = html.replace(/\s+/g, ' ')
let name = ''
- let props = ''
- js = js.replace(/props = (\{\}|\{[\w\W]*?\n\s{2}?\})/, function(s, m) {
- props = m
- var attr = new Function(
- `var props = ${m}, attr = []; for(var i in props){attr.push(i)}; return attr`
- )()
- return `static get observedAttributes() {
- return ${JSON.stringify(attr)}
- }
- `
+ js = js.replace(/props = (\{\}|\{[\w\W]*?\n\s{2}?\})/, function(str) {
+ var attr = str
+ .split(/\n+/)
+ .slice(1, -1)
+ .map(it => {
+ var tmp = it.split(':')
+ return tmp[0].trim()
+ })
+ return `
+
+ static get observedAttributes() {
+ return ${JSON.stringify(attr)}
+ }
+
+ ${str}
+ `
})
js = fixImport(js)
- .replace(/class ([a-zA-Z0-9]+)/, function(s, m) {
+ .replace(/export default class ([a-zA-Z0-9]+)/, function(s, m) {
name = m
return `${s} extends HTMLElement `
})
- .replace(/__init__\(\)\s+\{/, 'constructor() {\n super();')
+ .replace(/__init__\(\)\s+\{/, 'constructor() {\n super();')
.replace(
'/* render */',
`
@@ -121,12 +143,7 @@ function mkWCFile({ style, html, js }) {
enumerable: false,
configurable: true
})
- Object.defineProperty(this, 'props', {
- value: ${props},
- writable: true,
- enumerable: false,
- configurable: true
- })
+
this.root.innerHTML = \`${html}\`
`
@@ -139,17 +156,14 @@ function mkWCFile({ style, html, js }) {
)
.replace('adopted()', 'adoptedCallback()')
- let res = uglify.minify(js)
-
- return `/**
- *
- * @authors yutent (yutent.io@gmail.com)
- * @date ${BUILD_DATE}
- * @version v${VERSION}
- *
- */
-
-'use strict'
+ return minify(js, { sourceMap: false }).then(res => {
+ return `/**
+ *
+ * @authors yutent (yutent.io@gmail.com)
+ * @date ${BUILD_DATE}
+ * @version v${VERSION}
+ *
+ */
${res.code}
@@ -157,6 +171,7 @@ if(!customElements.get('wc-${parseName(name)}')){
customElements.define('wc-${parseName(name)}', ${name})
}
`
+ })
}
const compileWC = (entry, output) => {
@@ -170,8 +185,9 @@ const compileWC = (entry, output) => {
html = html ? html[1] : ''
js = js ? js[1] : ''
- let result = mkWCFile({ style, html, js })
- fs.echo(result, output)
+ mkWCFile({ style, html, js }).then(txt => {
+ fs.echo(txt, output)
+ })
}
/*=======================================================*/
diff --git a/package.json b/package.json
index 345101d..3b192bb 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
- "name": "@bd/wcui",
- "version": "2.0.0",
+ "name": "@bytedo/wcui",
+ "version": "1.0.0",
"description": "基于wc开发的一套UI库, 面向未来, 面向electron",
"main": "index.js",
"scripts": {
@@ -9,7 +9,7 @@
},
"repository": {
"type": "git",
- "url": "git+https://github.com/yutent/doui.git"
+ "url": "git+https://github.com/bytedo/wcui.git"
},
"keywords": ["web-components", "wc", "components", "yutent"],
"author": "yutent",
@@ -21,6 +21,6 @@
"es.shim": "^1.1.2",
"iofs": "^1.3.2",
"node-sass": "^4.12.0",
- "uglify-es": "^3.3.9"
+ "terser": "^5.0.0"
}
}
diff --git a/src/badge/index.wc b/src/badge/index.wc
index 87727ca..f48793c 100644
--- a/src/badge/index.wc
+++ b/src/badge/index.wc
@@ -20,7 +20,7 @@
font-size: 12px;
border: 1px solid #fff;
border-radius: 16px;
- background: nth($cr, 1);
+ background: var(--color-red-1);
color: #fff;
text-align: center;
transform: translateX(100%) translateY(-50%);
@@ -34,22 +34,22 @@
}
}
:host([color='dark']) .dot {
- background: nth($cd, 1);
+ background: var(--color-dark-1);
}
:host([color='green']) .dot {
- background: nth($cg, 1);
+ background: var(--color-green-1);
}
:host([color='blue']) .dot {
- background: nth($cb, 1);
+ background: var(--color-blue-1);
}
:host([color='orange']) .dot {
- background: nth($co, 1);
+ background: var(--color-orange-1);
}
:host([color='purple']) .dot {
- background: nth($cpp, 1);
+ background: var(--color-purple-1);
}
:host([color='teal']) .dot {
- background: nth($ct, 1);
+ background: var(--color-teal-1);
}
diff --git a/src/chart/line.wc b/src/chart/line.wc
new file mode 100644
index 0000000..d20a767
--- /dev/null
+++ b/src/chart/line.wc
@@ -0,0 +1,227 @@
+
+
+
+
+ 1月
+ 3月
+ 半年
+ 1年
+ 3年
+ 所有
+
+
+
+
+
+
+
diff --git a/src/chart/rank.wc b/src/chart/rank.wc
new file mode 100644
index 0000000..767a602
--- /dev/null
+++ b/src/chart/rank.wc
@@ -0,0 +1,112 @@
+
+
+
+
+
+
+
diff --git a/src/code/index.wc b/src/code/index.wc
index 184349a..f35b7ae 100644
--- a/src/code/index.wc
+++ b/src/code/index.wc
@@ -24,7 +24,7 @@
width: 100%;
max-height: 610px;
margin: 10px 0;
- border: 1px solid nth($cp, 2);
+ border: 1px solid var(--color-plain-2);
border-radius: 2px;
.title {
@@ -36,7 +36,7 @@
padding: 0 12px;
line-height: 1;
font-size: 12px;
- background: nth($cp, 2);
+ background: var(--color-plain-2);
user-select: none;
i {
@@ -45,23 +45,23 @@
height: 10px;
margin-right: 6px;
border-radius: 50%;
- background: nth($cr, 1);
+ background: var(--color-red-1);
}
i:nth-child(2) {
- background: nth($co, 1);
+ background: var(--color-orange-1);
}
i:nth-child(3) {
- background: nth($cg, 1);
+ background: var(--color-green-1);
}
.act {
--size: 16px;
margin: 0 2px;
- color: nth($cgr, 2);
+ color: var(--color-grey-2);
cursor: pointer;
&:hover {
- color: nth($cgr, 3);
+ color: var(--color-grey-3);
}
&.run {
display: none;
@@ -75,8 +75,8 @@
line-height: 18px;
font-family: Menlo, Monaco, Consolas, 'Courier New', monospace;
font-size: 13px;
- background: linear-gradient(to right, nth($cp, 1) 40px, #fff 40px);
- color: nth($cd, 1);
+ background: linear-gradient(to right, var(--color-plain-1) 40px, #fff 40px);
+ color: var(--color-dark-1);
cursor: text;
counter-reset: code;
@@ -95,7 +95,7 @@
height: 100%;
padding-right: 5px;
text-align: right;
- color: nth($cgr, 1);
+ color: var(--color-grey-1);
content: counter(code);
counter-increment: code;
}
@@ -113,18 +113,22 @@
:host([dark]) {
.code-box {
- border-color: nth($cd, 2);
+ border-color: var(--color-dark-2);
.title {
- background: nth($cd, 2);
+ background: var(--color-dark-2);
}
.code {
- background: linear-gradient(to right, #596b7f 40px, nth($cd, 1) 40px);
- color: nth($cp, 3);
+ background: linear-gradient(
+ to right,
+ #596b7f 40px,
+ var(--color-dark-1) 40px
+ );
+ color: var(--color-plain-3);
p::before {
- color: nth($cgr, 3);
+ color: var(--color-grey-3);
}
}
}
@@ -162,6 +166,10 @@ export default class Code {
set value(txt) {
this.props.content = txt
+ .replace(/&/g, '&')
+ .replace(/</g, '<')
+ .replace(/>/g, '>')
+
txt = txt
.replace(//g, '>')
diff --git a/src/codemirror/codemirror.js b/src/codemirror/codemirror.js
deleted file mode 100644
index 0999798..0000000
--- a/src/codemirror/codemirror.js
+++ /dev/null
@@ -1,4621 +0,0 @@
-/**
- *
- * @authors yutent (yutent.io@gmail.com)
- * @date 2018-08-04 18:47:35
- */
-
-'use strict'
-
-function CodeMirror(place, givenOptions) {
- var options = {},
- defaults = CodeMirror.defaults
- for (var opt in defaults)
- if (defaults.hasOwnProperty(opt))
- options[opt] = (givenOptions && givenOptions.hasOwnProperty(opt)
- ? givenOptions
- : defaults)[opt]
- var input = elt(
- 'textarea',
- null,
- null,
- 'position: absolute; padding: 0; width: 1px; height: 1em'
- )
- input.setAttribute('wrap', 'off')
- input.setAttribute('autocorrect', 'off')
- input.setAttribute('autocapitalize', 'off')
- var inputDiv = elt(
- 'div',
- [input],
- null,
- 'overflow: hidden; position: relative; width: 3px; height: 0px;'
- )
- var scrollbarInner = elt('div', null, 'CodeMirror-scrollbar-inner')
- var scrollbar = elt('div', [scrollbarInner], 'CodeMirror-scrollbar')
- var lineDiv = elt('div'),
- selectionDiv = elt('div', null, null, 'position: relative; z-index: -1')
- var cursor = elt('pre', '\u00a0', 'CodeMirror-cursor'),
- widthForcer = elt(
- 'pre',
- '\u00a0',
- 'CodeMirror-cursor',
- 'visibility: hidden'
- )
- var measure = elt(
- 'div',
- null,
- null,
- 'position: absolute; width: 100%; height: 0px; overflow: hidden; visibility: hidden;'
- )
- var lineSpace = elt(
- 'div',
- [measure, cursor, widthForcer, selectionDiv, lineDiv],
- null,
- 'position: relative; z-index: 0'
- )
- var gutterText = elt('div', null, 'CodeMirror-gutter-text'),
- gutter = elt('div', [gutterText], 'CodeMirror-gutter')
- var mover = elt(
- 'div',
- [gutter, elt('div', [lineSpace], 'CodeMirror-lines')],
- null,
- 'position: relative'
- )
- var sizer = elt('div', [mover], null, 'position: relative')
- var scroller = elt('div', [sizer], 'CodeMirror-scroll')
- scroller.setAttribute('tabIndex', '-1')
- var wrapper = elt(
- 'div',
- [inputDiv, scrollbar, scroller],
- 'CodeMirror' + (options.lineWrapping ? ' CodeMirror-wrap' : '')
- )
- if (place.appendChild) place.appendChild(wrapper)
- else place(wrapper)
- themeChanged()
- keyMapChanged()
- if (ios) input.style.width = '0px'
- if (!webkit) scroller.draggable = true
- lineSpace.style.outline = 'none'
- if (options.tabindex != null) input.tabIndex = options.tabindex
- if (options.autofocus) focusInput()
- if (!options.gutter && !options.lineNumbers) gutter.style.display = 'none'
- if (khtml)
- (inputDiv.style.height = '1px'), (inputDiv.style.position = 'absolute')
- if (mac_geLion) {
- scrollbar.style.zIndex = -2
- scrollbar.style.visibility = 'hidden'
- } else if (ie_lt8) scrollbar.style.minWidth = '18px'
- var poll = new Delayed(),
- highlight = new Delayed(),
- blinker
- var mode,
- doc = new BranchChunk([new LeafChunk([new Line('')])]),
- frontier = 0,
- focused
- loadMode()
- var sel = {
- from: {
- line: 0,
- ch: 0
- },
- to: {
- line: 0,
- ch: 0
- },
- inverted: false
- }
- var shiftSelecting,
- lastClick,
- lastDoubleClick,
- lastScrollTop = 0,
- draggingText,
- overwrite = false,
- suppressEdits = false,
- pasteIncoming = false
- var updateInput,
- userSelChange,
- changes,
- textChanged,
- selectionChanged,
- gutterDirty,
- callbacks
- var displayOffset = 0,
- showingFrom = 0,
- showingTo = 0,
- lastSizeC = 0
- var bracketHighlighted
- var maxLine = getLine(0),
- updateMaxLine = false,
- maxLineChanged = true
- var pollingFast = false
- var goalColumn = null
- operation(function() {
- setValue(options.value || '')
- updateInput = false
- })()
- var history = new History()
- connect(
- scroller,
- 'mousedown',
- operation(onMouseDown)
- )
- connect(
- scroller,
- 'dblclick',
- operation(onDoubleClick)
- )
- connect(
- lineSpace,
- 'selectstart',
- e_preventDefault
- )
- if (!gecko)
- connect(
- scroller,
- 'contextmenu',
- onContextMenu
- )
- connect(
- scroller,
- 'scroll',
- onScrollMain
- )
- connect(
- scrollbar,
- 'scroll',
- onScrollBar
- )
- connect(
- scrollbar,
- 'mousedown',
- function() {
- if (focused) setTimeout(focusInput, 0)
- }
- )
- var resizeHandler = connect(
- window,
- 'resize',
- function() {
- if (wrapper.parentNode) updateDisplay(true)
- else resizeHandler()
- },
- true
- )
- connect(
- input,
- 'keyup',
- operation(onKeyUp)
- )
- connect(
- input,
- 'input',
- fastPoll
- )
- connect(
- input,
- 'keydown',
- operation(onKeyDown)
- )
- connect(
- input,
- 'keypress',
- operation(onKeyPress)
- )
- connect(
- input,
- 'focus',
- onFocus
- )
- connect(
- input,
- 'blur',
- onBlur
- )
-
- function drag_(e) {
- if (options.onDragEvent && options.onDragEvent(instance, addStop(e))) return
- e_stop(e)
- }
- if (options.dragDrop) {
- connect(
- scroller,
- 'dragstart',
- onDragStart
- )
- connect(
- scroller,
- 'dragenter',
- drag_
- )
- connect(
- scroller,
- 'dragover',
- drag_
- )
- connect(
- scroller,
- 'drop',
- operation(onDrop)
- )
- }
- connect(
- scroller,
- 'paste',
- function() {
- focusInput()
- fastPoll()
- }
- )
- connect(
- input,
- 'paste',
- function() {
- pasteIncoming = true
- fastPoll()
- }
- )
- connect(
- input,
- 'cut',
- operation(function() {
- if (!options.readOnly) replaceSelection('')
- })
- )
- if (khtml)
- connect(
- sizer,
- 'mouseup',
- function() {
- if (document.activeElement == input) input.blur()
- focusInput()
- }
- )
- var hasFocus
- try {
- hasFocus = document.activeElement == input
- } catch (e) {}
- if (hasFocus || options.autofocus) setTimeout(onFocus, 20)
- else onBlur()
-
- function isLine(l) {
- return l >= 0 && l < doc.size
- }
- var __events = {},
- noop = function() {}
- var instance = (wrapper.CodeMirror = {
- getValue: getValue,
- setValue: operation(setValue),
- getSelection: getSelection,
- replaceSelection: operation(replaceSelection),
- focus: function() {
- window.focus()
- focusInput()
- onFocus()
- fastPoll()
- },
- setOption: function(option, value) {
- var oldVal = options[option]
- options[option] = value
- if (option == 'mode' || option == 'indentUnit') loadMode()
- else if (option == 'readOnly' && value == 'nocursor') {
- onBlur()
- input.blur()
- } else if (option == 'readOnly' && !value) {
- resetInput(true)
- } else if (option == 'theme') themeChanged()
- else if (option == 'lineWrapping' && oldVal != value)
- operation(wrappingChanged)()
- else if (option == 'tabSize') updateDisplay(true)
- else if (option == 'keyMap') keyMapChanged()
- else if (option == 'tabindex') input.tabIndex = value
- if (
- option == 'lineNumbers' ||
- option == 'gutter' ||
- option == 'firstLineNumber' ||
- option == 'theme' ||
- option == 'lineNumberFormatter'
- ) {
- gutterChanged()
- updateDisplay(true)
- }
- },
- getOption: function(option) {
- return options[option]
- },
- getMode: function() {
- return mode
- },
- undo: operation(undo),
- redo: operation(redo),
- indentLine: operation(function(n, dir) {
- if (typeof dir != 'string') {
- if (dir == null) dir = options.smartIndent ? 'smart' : 'prev'
- else dir = dir ? 'add' : 'subtract'
- }
- if (isLine(n)) indentLine(n, dir)
- }),
- indentSelection: operation(indentSelected),
- historySize: function() {
- return {
- undo: history.done.length,
- redo: history.undone.length
- }
- },
- clearHistory: function() {
- history = new History()
- },
- setHistory: function(histData) {
- history = new History()
- history.done = histData.done
- history.undone = histData.undone
- },
- getHistory: function() {
- function cp(arr) {
- for (var i = 0, nw = [], nwelt; i < arr.length; ++i) {
- nw.push((nwelt = []))
- for (var j = 0, elt = arr[i]; j < elt.length; ++j) {
- var old = [],
- cur = elt[j]
- nwelt.push({
- start: cur.start,
- added: cur.added,
- old: old
- })
- for (var k = 0; k < cur.old.length; ++k)
- old.push(hlText(cur.old[k]))
- }
- }
- return nw
- }
- return {
- done: cp(history.done),
- undone: cp(history.undone)
- }
- },
- matchBrackets: operation(function() {
- matchBrackets(true)
- }),
- getTokenAt: operation(function(pos) {
- pos = clipPos(pos)
- return getLine(pos.line).getTokenAt(
- mode,
- getStateBefore(pos.line),
- options.tabSize,
- pos.ch
- )
- }),
- getStateAfter: function(line) {
- line = clipLine(line == null ? doc.size - 1 : line)
- return getStateBefore(line + 1)
- },
- cursorCoords: function(start, mode) {
- if (start == null) start = sel.inverted
- return this.charCoords(start ? sel.from : sel.to, mode)
- },
- charCoords: function(pos, mode) {
- pos = clipPos(pos)
- if (mode == 'local') return localCoords(pos, false)
- if (mode == 'div') return localCoords(pos, true)
- return pageCoords(pos)
- },
- coordsChar: function(coords) {
- var off = eltOffset(lineSpace)
- return coordsChar(coords.x - off.left, coords.y - off.top)
- },
- defaultTextHeight: function() {
- return textHeight()
- },
- markText: operation(markText),
- setBookmark: setBookmark,
- findMarksAt: findMarksAt,
- setMarker: operation(addGutterMarker),
- clearMarker: operation(removeGutterMarker),
- setLineClass: operation(setLineClass),
- hideLine: operation(function(h) {
- return setLineHidden(h, true)
- }),
- showLine: operation(function(h) {
- return setLineHidden(h, false)
- }),
- onDeleteLine: function(line, f) {
- if (typeof line == 'number') {
- if (!isLine(line)) return null
- line = getLine(line)
- }
- ;(line.handlers || (line.handlers = [])).push(f)
- return line
- },
- lineInfo: lineInfo,
- getViewport: function() {
- return {
- from: showingFrom,
- to: showingTo
- }
- },
- addWidget: function(pos, node, scroll, vert, horiz) {
- pos = localCoords(clipPos(pos))
- var top = pos.yBot,
- left = pos.x
- node.style.position = 'absolute'
- sizer.appendChild(node)
- if (vert == 'over') top = pos.y
- else if (vert == 'near') {
- var vspace = Math.max(scroller.offsetHeight, doc.height * textHeight()),
- hspace =
- Math.max(sizer.clientWidth, lineSpace.clientWidth) - paddingLeft()
- if (pos.yBot + node.offsetHeight > vspace && pos.y > node.offsetHeight)
- top = pos.y - node.offsetHeight
- if (left + node.offsetWidth > hspace) left = hspace - node.offsetWidth
- }
- node.style.top = top + paddingTop() + 'px'
- node.style.left = node.style.right = ''
- if (horiz == 'right') {
- left = sizer.clientWidth - node.offsetWidth
- node.style.right = '0px'
- } else {
- if (horiz == 'left') left = 0
- else if (horiz == 'middle')
- left = (sizer.clientWidth - node.offsetWidth) / 2
- node.style.left = left + paddingLeft() + 'px'
- }
- if (scroll)
- scrollIntoView(
- left,
- top,
- left + node.offsetWidth,
- top + node.offsetHeight
- )
- },
- lineCount: function() {
- return doc.size
- },
- clipPos: clipPos,
- getCursor: function(start) {
- if (start == null) start = sel.inverted
- return copyPos(start ? sel.from : sel.to)
- },
- somethingSelected: function() {
- return !posEq(sel.from, sel.to)
- },
- setCursor: operation(function(line, ch, user) {
- if (ch == null && typeof line.line == 'number')
- setCursor(line.line, line.ch, user)
- else setCursor(line, ch, user)
- }),
- setSelection: operation(function(from, to, user) {
- ;(user
- ? setSelectionUser
- : setSelection)(clipPos(from), clipPos(to || from))
- }),
- getLine: function(line) {
- if (isLine(line)) return getLine(line).text
- },
- getLineHandle: function(line) {
- if (isLine(line)) return getLine(line)
- },
- setLine: operation(function(line, text) {
- if (isLine(line))
- replaceRange(
- text,
- {
- line: line,
- ch: 0
- },
- {
- line: line,
- ch: getLine(line).text.length
- }
- )
- }),
- removeLine: operation(function(line) {
- if (isLine(line))
- replaceRange(
- '',
- {
- line: line,
- ch: 0
- },
- clipPos({
- line: line + 1,
- ch: 0
- })
- )
- }),
- replaceRange: operation(replaceRange),
- getRange: function(from, to, lineSep) {
- return getRange(clipPos(from), clipPos(to), lineSep)
- },
- triggerOnKeyDown: operation(onKeyDown),
- execCommand: function(cmd) {
- return commands[cmd](instance)
- },
- moveH: operation(moveH),
- deleteH: operation(deleteH),
- moveV: operation(moveV),
- toggleOverwrite: function() {
- if (overwrite) {
- overwrite = false
- cursor.className = cursor.className.replace(' CodeMirror-overwrite', '')
- } else {
- overwrite = true
- cursor.className += ' CodeMirror-overwrite'
- }
- },
- posFromIndex: function(off) {
- var lineNo = 0,
- ch
- doc.iter(0, doc.size, function(line) {
- var sz = line.text.length + 1
- if (sz > off) {
- ch = off
- return true
- }
- off -= sz
- ++lineNo
- })
- return clipPos({
- line: lineNo,
- ch: ch
- })
- },
- indexFromPos: function(coords) {
- if (coords.line < 0 || coords.ch < 0) return 0
- var index = coords.ch
- doc.iter(0, coords.line, function(line) {
- index += line.text.length + 1
- })
- return index
- },
- scrollTo: function(x, y) {
- if (x != null) scroller.scrollLeft = x
- if (y != null) scrollbar.scrollTop = scroller.scrollTop = y
- updateDisplay([])
- },
- getScrollInfo: function() {
- return {
- x: scroller.scrollLeft,
- y: scrollbar.scrollTop,
- height: scrollbar.scrollHeight,
- width: scroller.scrollWidth
- }
- },
- scrollIntoView: function(pos) {
- var coords = localCoords(
- pos ? clipPos(pos) : sel.inverted ? sel.from : sel.to
- )
- scrollIntoView(coords.x, coords.y, coords.x, coords.yBot)
- },
- setSize: function(width, height) {
- function interpret(val) {
- val = String(val)
- return /^\d+$/.test(val) ? val + 'px' : val
- }
- if (width != null) wrapper.style.width = interpret(width)
- if (height != null) scroller.style.height = interpret(height)
- instance.refresh()
- },
- operation: function(f) {
- return operation(f)()
- },
- compoundChange: function(f) {
- return compoundChange(f)
- },
- refresh: function() {
- updateDisplay(true, null, lastScrollTop)
- if (scrollbar.scrollHeight > lastScrollTop)
- scrollbar.scrollTop = lastScrollTop
- },
- getInputField: function() {
- return input
- },
- getWrapperElement: function() {
- return wrapper
- },
- getScrollerElement: function() {
- return scroller
- },
- getGutterElement: function() {
- return gutter
- },
- on: function(name, cb) {
- if (!cb || typeof cb !== 'function') return this
- if (!__events[name]) {
- __events[name] = [cb]
- } else {
- __events[name].push(cb)
- }
- return this
- }
- })
-
- function getLine(n) {
- return getLineAt(doc, n)
- }
-
- function updateLineHeight(line, height) {
- gutterDirty = true
- var diff = height - line.height
- for (var n = line; n; n = n.parent) n.height += diff
- }
-
- function lineContent(line, wrapAt) {
- if (!line.styles)
- line.highlight(
- mode,
- (line.stateAfter = getStateBefore(lineNo(line))),
- options.tabSize
- )
- return line.getContent(options.tabSize, wrapAt, options.lineWrapping)
- }
-
- function setValue(code) {
- var top = {
- line: 0,
- ch: 0
- }
- updateLines(
- top,
- {
- line: doc.size - 1,
- ch: getLine(doc.size - 1).text.length
- },
- splitLines(code),
- top,
- top
- )
- updateInput = true
- }
-
- function getValue(lineSep) {
- var text = []
- doc.iter(0, doc.size, function(line) {
- text.push(line.text)
- })
- return text.join(lineSep || '\n')
- }
-
- function onScrollBar(e) {
- if (Math.abs(scrollbar.scrollTop - lastScrollTop) > 1) {
- lastScrollTop = scroller.scrollTop = scrollbar.scrollTop
- updateDisplay([])
- }
- }
-
- function onScrollMain(e) {
- if (options.fixedGutter && gutter.style.left != scroller.scrollLeft + 'px')
- gutter.style.left = scroller.scrollLeft + 'px'
- if (Math.abs(scroller.scrollTop - lastScrollTop) > 1) {
- lastScrollTop = scroller.scrollTop
- if (scrollbar.scrollTop != lastScrollTop)
- scrollbar.scrollTop = lastScrollTop
- updateDisplay([])
- }
- if (options.onScroll) options.onScroll(instance)
- }
-
- function onMouseDown(e) {
- setShift(e_prop(e, 'shiftKey'))
- for (var n = e_target(e); n != wrapper; n = n.parentNode)
- if (n.parentNode == sizer && n != mover) return
- for (var n = e_target(e); n != wrapper; n = n.parentNode)
- if (n.parentNode == gutterText) {
- if (options.onGutterClick)
- options.onGutterClick(
- instance,
- indexOf(gutterText.childNodes, n) + showingFrom,
- e
- )
- return e_preventDefault(e)
- }
- var start = posFromMouse(e)
- switch (e_button(e)) {
- case 3:
- if (gecko) onContextMenu(e)
- return
- case 2:
- if (start) setCursor(start.line, start.ch, true)
- setTimeout(focusInput, 20)
- e_preventDefault(e)
- return
- }
- if (!start) {
- if (e_target(e) == scroller) e_preventDefault(e)
- return
- }
- if (!focused) onFocus()
- var now = +new Date(),
- type = 'single'
- if (
- lastDoubleClick &&
- lastDoubleClick.time > now - 400 &&
- posEq(lastDoubleClick.pos, start)
- ) {
- type = 'triple'
- e_preventDefault(e)
- setTimeout(focusInput, 20)
- selectLine(start.line)
- } else if (
- lastClick &&
- lastClick.time > now - 400 &&
- posEq(lastClick.pos, start)
- ) {
- type = 'double'
- lastDoubleClick = {
- time: now,
- pos: start
- }
- e_preventDefault(e)
- var word = findWordAt(start)
- setSelectionUser(word.from, word.to)
- } else {
- lastClick = {
- time: now,
- pos: start
- }
- }
-
- function dragEnd(e2) {
- if (webkit) scroller.draggable = false
- draggingText = false
- up()
- drop()
- if (
- Math.abs(e.clientX - e2.clientX) + Math.abs(e.clientY - e2.clientY) <
- 10
- ) {
- e_preventDefault(e2)
- setCursor(start.line, start.ch, true)
- focusInput()
- }
- }
- var last = start,
- going
- if (
- options.dragDrop &&
- dragAndDrop &&
- !options.readOnly &&
- !posEq(sel.from, sel.to) &&
- !posLess(start, sel.from) &&
- !posLess(sel.to, start) &&
- type == 'single'
- ) {
- if (webkit) scroller.draggable = true
- var up = connect(
- document,
- 'mouseup',
- operation(dragEnd),
- true
- )
- var drop = connect(
- scroller,
- 'drop',
- operation(dragEnd),
- true
- )
- draggingText = true
- if (scroller.dragDrop) scroller.dragDrop()
- return
- }
- e_preventDefault(e)
- if (type == 'single') setCursor(start.line, start.ch, true)
- var startstart = sel.from,
- startend = sel.to
-
- function doSelect(cur) {
- if (type == 'single') {
- setSelectionUser(start, cur)
- } else if (type == 'double') {
- var word = findWordAt(cur)
- if (posLess(cur, startstart)) setSelectionUser(word.from, startend)
- else setSelectionUser(startstart, word.to)
- } else if (type == 'triple') {
- if (posLess(cur, startstart))
- setSelectionUser(
- startend,
- clipPos({
- line: cur.line,
- ch: 0
- })
- )
- else
- setSelectionUser(
- startstart,
- clipPos({
- line: cur.line + 1,
- ch: 0
- })
- )
- }
- }
-
- function extend(e) {
- var cur = posFromMouse(e, true)
- if (cur && !posEq(cur, last)) {
- if (!focused) onFocus()
- last = cur
- doSelect(cur)
- updateInput = false
- var visible = visibleLines()
- if (cur.line >= visible.to || cur.line < visible.from)
- going = setTimeout(
- operation(function() {
- extend(e)
- }),
- 150
- )
- }
- }
-
- function done(e) {
- clearTimeout(going)
- var cur = posFromMouse(e)
- if (cur) doSelect(cur)
- e_preventDefault(e)
- focusInput()
- updateInput = true
- move()
- up()
- }
- var move = connect(
- document,
- 'mousemove',
- operation(function(e) {
- clearTimeout(going)
- e_preventDefault(e)
- if (!ie && !e_button(e)) done(e)
- else extend(e)
- }),
- true
- )
- var up = connect(
- document,
- 'mouseup',
- operation(done),
- true
- )
- }
-
- function onDoubleClick(e) {
- for (var n = e_target(e); n != wrapper; n = n.parentNode)
- if (n.parentNode == gutterText) return e_preventDefault(e)
- e_preventDefault(e)
- }
-
- function onDrop(e) {
- if (options.onDragEvent && options.onDragEvent(instance, addStop(e))) return
- e_preventDefault(e)
- var pos = posFromMouse(e, true),
- files = e.dataTransfer.files
- if (!pos || options.readOnly) return
- if (files && files.length && window.FileReader && window.File) {
- var n = files.length,
- text = Array(n),
- read = 0
- var loadFile = function(file, i) {
- var reader = new FileReader()
- reader.onload = function() {
- text[i] = reader.result
- if (++read == n) {
- pos = clipPos(pos)
- operation(function() {
- var end = replaceRange(text.join(''), pos, pos)
- setSelectionUser(pos, end)
- })()
- }
- }
- reader.readAsText(file)
- }
- for (var i = 0; i < n; ++i) loadFile(files[i], i)
- } else {
- if (draggingText && !(posLess(pos, sel.from) || posLess(sel.to, pos)))
- return
- try {
- var text = e.dataTransfer.getData('Text')
- if (text) {
- compoundChange(function() {
- var curFrom = sel.from,
- curTo = sel.to
- setSelectionUser(pos, pos)
- if (draggingText) replaceRange('', curFrom, curTo)
- replaceSelection(text)
- focusInput()
- })
- }
- } catch (e) {}
- }
- }
-
- function onDragStart(e) {
- var txt = getSelection()
- e.dataTransfer.setData('Text', txt)
- if (e.dataTransfer.setDragImage)
- e.dataTransfer.setDragImage(elt('img'), 0, 0)
- }
-
- function doHandleBinding(bound, dropShift) {
- if (typeof bound == 'string') {
- bound = commands[bound]
- if (!bound) return false
- }
- var prevShift = shiftSelecting
- try {
- if (options.readOnly) suppressEdits = true
- if (dropShift) shiftSelecting = null
- bound(instance)
- } catch (e) {
- if (e != Pass) throw e
- return false
- } finally {
- shiftSelecting = prevShift
- suppressEdits = false
- }
- return true
- }
- var maybeTransition
-
- function handleKeyBinding(e) {
- var startMap = getKeyMap(options.keyMap),
- next = startMap.auto
- clearTimeout(maybeTransition)
- if (next && !isModifierKey(e))
- maybeTransition = setTimeout(function() {
- if (getKeyMap(options.keyMap) == startMap) {
- options.keyMap = next.call ? next.call(null, instance) : next
- }
- }, 50)
- var name = keyNames[e_prop(e, 'keyCode')],
- handled = false
- var flipCtrlCmd = opera && mac
- if (name == null || e.altGraphKey) return false
- if (e_prop(e, 'altKey')) name = 'Alt-' + name
- if (e_prop(e, flipCtrlCmd ? 'metaKey' : 'ctrlKey')) name = 'Ctrl-' + name
- if (e_prop(e, flipCtrlCmd ? 'ctrlKey' : 'metaKey')) name = 'Cmd-' + name
- var stopped = false
-
- function stop() {
- stopped = true
- }
- if (e_prop(e, 'shiftKey')) {
- handled =
- lookupKey(
- 'Shift-' + name,
- options.extraKeys,
- options.keyMap,
- function(b) {
- return doHandleBinding(b, true)
- },
- stop
- ) ||
- lookupKey(
- name,
- options.extraKeys,
- options.keyMap,
- function(b) {
- if (typeof b == 'string' && /^go[A-Z]/.test(b))
- return doHandleBinding(b)
- },
- stop
- )
- } else {
- handled = lookupKey(
- name,
- options.extraKeys,
- options.keyMap,
- doHandleBinding,
- stop
- )
- }
- if (stopped) handled = false
- if (handled) {
- e_preventDefault(e)
- restartBlink()
- if (ie_lt9) {
- e.oldKeyCode = e.keyCode
- e.keyCode = 0
- }
- }
- return handled
- }
-
- function handleCharBinding(e, ch) {
- var handled = lookupKey(
- "'" + ch + "'",
- options.extraKeys,
- options.keyMap,
- function(b) {
- return doHandleBinding(b, true)
- }
- )
- if (handled) {
- e_preventDefault(e)
- restartBlink()
- }
- return handled
- }
- var lastStoppedKey = null
-
- function onKeyDown(e) {
- if (!focused) onFocus()
- if (ie && e.keyCode == 27) {
- e.returnValue = false
- }
- if (pollingFast) {
- if (readInput()) pollingFast = false
- }
- if (options.onKeyEvent && options.onKeyEvent(instance, addStop(e))) return
- var code = e_prop(e, 'keyCode')
- setShift(code == 16 || e_prop(e, 'shiftKey'))
- var handled = handleKeyBinding(e)
- if (opera) {
- lastStoppedKey = handled ? code : null
- if (!handled && code == 88 && e_prop(e, mac ? 'metaKey' : 'ctrlKey'))
- replaceSelection('')
- }
- }
-
- function onKeyPress(e) {
- if (pollingFast) readInput()
- if (options.onKeyEvent && options.onKeyEvent(instance, addStop(e))) return
- var keyCode = e_prop(e, 'keyCode'),
- charCode = e_prop(e, 'charCode')
- if (opera && keyCode == lastStoppedKey) {
- lastStoppedKey = null
- e_preventDefault(e)
- return
- }
- if (((opera && (!e.which || e.which < 10)) || khtml) && handleKeyBinding(e))
- return
- var ch = String.fromCharCode(charCode == null ? keyCode : charCode)
- if (
- options.electricChars &&
- mode.electricChars &&
- options.smartIndent &&
- !options.readOnly
- ) {
- if (mode.electricChars.indexOf(ch) > -1)
- setTimeout(
- operation(function() {
- indentLine(sel.to.line, 'smart')
- }),
- 75
- )
- }
- if (handleCharBinding(e, ch)) return
- fastPoll()
- }
-
- function onKeyUp(e) {
- if (options.onKeyEvent && options.onKeyEvent(instance, addStop(e))) return
- if (e_prop(e, 'keyCode') == 16) shiftSelecting = null
-
- if (__events['change']) {
- __events['change'].forEach(function(fn) {
- fn(instance, getValue())
- })
- }
- }
-
- function onFocus() {
- if (options.readOnly == 'nocursor') return
- if (!focused) {
- if (options.onFocus) options.onFocus(instance)
- focused = true
- if (scroller.className.search(/\bCodeMirror-focused\b/) == -1)
- scroller.className += ' CodeMirror-focused'
- }
- slowPoll()
- restartBlink()
- if (__events['focus']) {
- __events['focus'].forEach(function(fn) {
- fn(instance, getValue())
- })
- }
- }
-
- function onBlur() {
- if (focused) {
- if (options.onBlur) options.onBlur(instance)
- focused = false
- if (bracketHighlighted)
- operation(function() {
- if (bracketHighlighted) {
- bracketHighlighted()
- bracketHighlighted = null
- }
- })()
- scroller.className = scroller.className.replace(' CodeMirror-focused', '')
- }
- clearInterval(blinker)
- setTimeout(function() {
- if (!focused) shiftSelecting = null
- }, 150)
- }
-
- function updateLines(from, to, newText, selFrom, selTo) {
- if (suppressEdits) return
- var old = []
- doc.iter(from.line, to.line + 1, function(line) {
- old.push(newHL(line.text, line.markedSpans))
- })
- if (history) {
- history.addChange(from.line, newText.length, old)
- while (history.done.length > options.undoDepth) history.done.shift()
- }
- var lines = updateMarkedSpans(
- hlSpans(old[0]),
- hlSpans(lst(old)),
- from.ch,
- to.ch,
- newText
- )
- updateLinesNoUndo(from, to, lines, selFrom, selTo)
- }
-
- function unredoHelper(from, to) {
- if (!from.length) return
- var set = from.pop(),
- out = []
- for (var i = set.length - 1; i >= 0; i -= 1) {
- var change = set[i]
- var replaced = [],
- end = change.start + change.added
- doc.iter(change.start, end, function(line) {
- replaced.push(newHL(line.text, line.markedSpans))
- })
- out.push({
- start: change.start,
- added: change.old.length,
- old: replaced
- })
- var pos = {
- line: change.start + change.old.length - 1,
- ch: editEnd(hlText(lst(replaced)), hlText(lst(change.old)))
- }
- updateLinesNoUndo(
- {
- line: change.start,
- ch: 0
- },
- {
- line: end - 1,
- ch: getLine(end - 1).text.length
- },
- change.old,
- pos,
- pos
- )
- }
- updateInput = true
- to.push(out)
- }
-
- function undo() {
- unredoHelper(history.done, history.undone)
- }
-
- function redo() {
- unredoHelper(history.undone, history.done)
- }
-
- function updateLinesNoUndo(from, to, lines, selFrom, selTo) {
- if (suppressEdits) return
- var recomputeMaxLength = false,
- maxLineLength = maxLine.text.length
- if (!options.lineWrapping)
- doc.iter(from.line, to.line + 1, function(line) {
- if (!line.hidden && line.text.length == maxLineLength) {
- recomputeMaxLength = true
- return true
- }
- })
- if (from.line != to.line || lines.length > 1) gutterDirty = true
- var nlines = to.line - from.line,
- firstLine = getLine(from.line),
- lastLine = getLine(to.line)
- var lastHL = lst(lines)
- if (from.ch == 0 && to.ch == 0 && hlText(lastHL) == '') {
- var added = [],
- prevLine = null
- for (var i = 0, e = lines.length - 1; i < e; ++i)
- added.push(new Line(hlText(lines[i]), hlSpans(lines[i])))
- lastLine.update(lastLine.text, hlSpans(lastHL))
- if (nlines) doc.remove(from.line, nlines, callbacks)
- if (added.length) doc.insert(from.line, added)
- } else if (firstLine == lastLine) {
- if (lines.length == 1) {
- firstLine.update(
- firstLine.text.slice(0, from.ch) +
- hlText(lines[0]) +
- firstLine.text.slice(to.ch),
- hlSpans(lines[0])
- )
- } else {
- for (var added = [], i = 1, e = lines.length - 1; i < e; ++i)
- added.push(new Line(hlText(lines[i]), hlSpans(lines[i])))
- added.push(
- new Line(
- hlText(lastHL) + firstLine.text.slice(to.ch),
- hlSpans(lastHL)
- )
- )
- firstLine.update(
- firstLine.text.slice(0, from.ch) + hlText(lines[0]),
- hlSpans(lines[0])
- )
- doc.insert(from.line + 1, added)
- }
- } else if (lines.length == 1) {
- firstLine.update(
- firstLine.text.slice(0, from.ch) +
- hlText(lines[0]) +
- lastLine.text.slice(to.ch),
- hlSpans(lines[0])
- )
- doc.remove(from.line + 1, nlines, callbacks)
- } else {
- var added = []
- firstLine.update(
- firstLine.text.slice(0, from.ch) + hlText(lines[0]),
- hlSpans(lines[0])
- )
- lastLine.update(
- hlText(lastHL) + lastLine.text.slice(to.ch),
- hlSpans(lastHL)
- )
- for (var i = 1, e = lines.length - 1; i < e; ++i)
- added.push(new Line(hlText(lines[i]), hlSpans(lines[i])))
- if (nlines > 1) doc.remove(from.line + 1, nlines - 1, callbacks)
- doc.insert(from.line + 1, added)
- }
- if (options.lineWrapping) {
- var perLine = Math.max(5, scroller.clientWidth / charWidth() - 3)
- doc.iter(from.line, from.line + lines.length, function(line) {
- if (line.hidden) return
- var guess = Math.ceil(line.text.length / perLine) || 1
- if (guess != line.height) updateLineHeight(line, guess)
- })
- } else {
- doc.iter(from.line, from.line + lines.length, function(line) {
- var l = line.text
- if (!line.hidden && l.length > maxLineLength) {
- maxLine = line
- maxLineLength = l.length
- maxLineChanged = true
- recomputeMaxLength = false
- }
- })
- if (recomputeMaxLength) updateMaxLine = true
- }
- frontier = Math.min(frontier, from.line)
- startWorker(400)
- var lendiff = lines.length - nlines - 1
- changes.push({
- from: from.line,
- to: to.line + 1,
- diff: lendiff
- })
- if (options.onChange) {
- for (var i = 0; i < lines.length; ++i)
- if (typeof lines[i] != 'string') lines[i] = lines[i].text
- var changeObj = {
- from: from,
- to: to,
- text: lines
- }
- if (textChanged) {
- for (var cur = textChanged; cur.next; cur = cur.next) {}
- cur.next = changeObj
- } else textChanged = changeObj
- }
-
- function updateLine(n) {
- return n <= Math.min(to.line, to.line + lendiff) ? n : n + lendiff
- }
- setSelection(
- clipPos(selFrom),
- clipPos(selTo),
- updateLine(sel.from.line),
- updateLine(sel.to.line)
- )
- }
-
- function needsScrollbar() {
- var realHeight = doc.height * textHeight() + 2 * paddingTop()
- return realHeight * 0.99 > scroller.offsetHeight ? realHeight : false
- }
-
- function updateVerticalScroll(scrollTop) {
- var scrollHeight = needsScrollbar()
- scrollbar.style.display = scrollHeight ? 'block' : 'none'
- if (scrollHeight) {
- scrollbarInner.style.height = sizer.style.minHeight = scrollHeight + 'px'
- scrollbar.style.height = scroller.clientHeight + 'px'
- if (scrollTop != null) {
- scrollbar.scrollTop = scroller.scrollTop = scrollTop
- if (webkit)
- setTimeout(function() {
- if (scrollbar.scrollTop != scrollTop) return
- scrollbar.scrollTop = scrollTop + (scrollTop ? -1 : 1)
- scrollbar.scrollTop = scrollTop
- }, 0)
- }
- } else {
- sizer.style.minHeight = ''
- }
- mover.style.top = displayOffset * textHeight() + 'px'
- }
-
- function computeMaxLength() {
- maxLine = getLine(0)
- maxLineChanged = true
- var maxLineLength = maxLine.text.length
- doc.iter(1, doc.size, function(line) {
- var l = line.text
- if (!line.hidden && l.length > maxLineLength) {
- maxLineLength = l.length
- maxLine = line
- }
- })
- updateMaxLine = false
- }
-
- function replaceRange(code, from, to) {
- from = clipPos(from)
- if (!to) to = from
- else to = clipPos(to)
- code = splitLines(code)
-
- function adjustPos(pos) {
- if (posLess(pos, from)) return pos
- if (!posLess(to, pos)) return end
- var line = pos.line + code.length - (to.line - from.line) - 1
- var ch = pos.ch
- if (pos.line == to.line)
- ch += lst(code).length - (to.ch - (to.line == from.line ? from.ch : 0))
- return {
- line: line,
- ch: ch
- }
- }
- var end
- replaceRange1(code, from, to, function(end1) {
- end = end1
- return {
- from: adjustPos(sel.from),
- to: adjustPos(sel.to)
- }
- })
- return end
- }
-
- function replaceSelection(code, collapse) {
- replaceRange1(splitLines(code), sel.from, sel.to, function(end) {
- if (collapse == 'end')
- return {
- from: end,
- to: end
- }
- else if (collapse == 'start')
- return {
- from: sel.from,
- to: sel.from
- }
- else
- return {
- from: sel.from,
- to: end
- }
- })
- }
-
- function replaceRange1(code, from, to, computeSel) {
- var endch = code.length == 1 ? code[0].length + from.ch : lst(code).length
- var newSel = computeSel({
- line: from.line + code.length - 1,
- ch: endch
- })
- updateLines(from, to, code, newSel.from, newSel.to)
- }
-
- function getRange(from, to, lineSep) {
- var l1 = from.line,
- l2 = to.line
- if (l1 == l2) return getLine(l1).text.slice(from.ch, to.ch)
- var code = [getLine(l1).text.slice(from.ch)]
- doc.iter(l1 + 1, l2, function(line) {
- code.push(line.text)
- })
- code.push(getLine(l2).text.slice(0, to.ch))
- return code.join(lineSep || '\n')
- }
-
- function getSelection(lineSep) {
- return getRange(sel.from, sel.to, lineSep)
- }
-
- function slowPoll() {
- if (pollingFast) return
- poll.set(options.pollInterval, function() {
- readInput()
- if (focused) slowPoll()
- })
- }
-
- function fastPoll() {
- var missed = false
- pollingFast = true
-
- function p() {
- var changed = readInput()
- if (!changed && !missed) {
- missed = true
- poll.set(60, p)
- } else {
- pollingFast = false
- slowPoll()
- }
- }
- poll.set(20, p)
- }
- var prevInput = ''
-
- function readInput() {
- if (!focused || hasSelection(input) || options.readOnly) return false
- var text = input.value
- if (text == prevInput) return false
- if (!nestedOperation) startOperation()
- shiftSelecting = null
- var same = 0,
- l = Math.min(prevInput.length, text.length)
- while (same < l && prevInput[same] == text[same]) ++same
- if (same < prevInput.length)
- sel.from = {
- line: sel.from.line,
- ch: sel.from.ch - (prevInput.length - same)
- }
- else if (overwrite && posEq(sel.from, sel.to) && !pasteIncoming)
- sel.to = {
- line: sel.to.line,
- ch: Math.min(
- getLine(sel.to.line).text.length,
- sel.to.ch + (text.length - same)
- )
- }
- replaceSelection(text.slice(same), 'end')
- if (text.length > 1000) {
- input.value = prevInput = ''
- } else prevInput = text
- if (!nestedOperation) endOperation()
- pasteIncoming = false
- return true
- }
-
- function resetInput(user) {
- if (!posEq(sel.from, sel.to)) {
- prevInput = ''
- input.value = getSelection()
- if (focused) selectInput(input)
- } else if (user) prevInput = input.value = ''
- }
-
- function focusInput() {
- if (options.readOnly != 'nocursor') input.focus()
- }
-
- function scrollCursorIntoView() {
- var coords = calculateCursorCoords()
- scrollIntoView(coords.x, coords.y, coords.x, coords.yBot)
- if (!focused) return
- var box = sizer.getBoundingClientRect(),
- doScroll = null
- if (coords.y + box.top < 0) doScroll = true
- else if (
- coords.y + box.top + textHeight() >
- (window.innerHeight || document.documentElement.clientHeight)
- )
- doScroll = false
- if (doScroll != null) {
- var hidden = cursor.style.display == 'none'
- if (hidden) {
- cursor.style.display = ''
- cursor.style.left = coords.x + 'px'
- cursor.style.top = coords.y - displayOffset + 'px'
- }
- cursor.scrollIntoView(doScroll)
- if (hidden) cursor.style.display = 'none'
- }
- }
-
- function calculateCursorCoords() {
- var cursor = localCoords(sel.inverted ? sel.from : sel.to)
- var x = options.lineWrapping
- ? Math.min(cursor.x, lineSpace.offsetWidth)
- : cursor.x
- return {
- x: x,
- y: cursor.y,
- yBot: cursor.yBot
- }
- }
-
- function scrollIntoView(x1, y1, x2, y2) {
- var scrollPos = calculateScrollPos(x1, y1, x2, y2)
- if (scrollPos.scrollLeft != null) {
- scroller.scrollLeft = scrollPos.scrollLeft
- }
- if (scrollPos.scrollTop != null) {
- scrollbar.scrollTop = scroller.scrollTop = scrollPos.scrollTop
- }
- }
-
- function calculateScrollPos(x1, y1, x2, y2) {
- var pl = paddingLeft(),
- pt = paddingTop()
- y1 += pt
- y2 += pt
- x1 += pl
- x2 += pl
- var screen = scroller.clientHeight,
- screentop = scrollbar.scrollTop,
- result = {}
- var docBottom = needsScrollbar() || Infinity
- var atTop = y1 < pt + 10,
- atBottom = y2 + pt > docBottom - 10
- if (y1 < screentop) result.scrollTop = atTop ? 0 : Math.max(0, y1)
- else if (y2 > screentop + screen)
- result.scrollTop = (atBottom ? docBottom : y2) - screen
- var screenw = scroller.clientWidth,
- screenleft = scroller.scrollLeft
- var gutterw = options.fixedGutter ? gutter.clientWidth : 0
- var atLeft = x1 < gutterw + pl + 10
- if (x1 < screenleft + gutterw || atLeft) {
- if (atLeft) x1 = 0
- result.scrollLeft = Math.max(0, x1 - 10 - gutterw)
- } else if (x2 > screenw + screenleft - 3) {
- result.scrollLeft = x2 + 10 - screenw
- }
- return result
- }
-
- function visibleLines(scrollTop) {
- var lh = textHeight(),
- top = (scrollTop != null ? scrollTop : scrollbar.scrollTop) - paddingTop()
- var fromHeight = Math.max(0, Math.floor(top / lh))
- var toHeight = Math.ceil((top + scroller.clientHeight) / lh)
- return {
- from: lineAtHeight(doc, fromHeight),
- to: lineAtHeight(doc, toHeight)
- }
- }
-
- function updateDisplay(changes, suppressCallback, scrollTop) {
- if (!scroller.clientWidth) {
- showingFrom = showingTo = displayOffset = 0
- return
- }
- var visible = visibleLines(scrollTop)
- if (
- changes !== true &&
- changes.length == 0 &&
- visible.from > showingFrom &&
- visible.to < showingTo
- ) {
- updateVerticalScroll(scrollTop)
- return
- }
- var from = Math.max(visible.from - 100, 0),
- to = Math.min(doc.size, visible.to + 100)
- if (showingFrom < from && from - showingFrom < 20) from = showingFrom
- if (showingTo > to && showingTo - to < 20)
- to = Math.min(doc.size, showingTo)
- var intact =
- changes === true
- ? []
- : computeIntact(
- [
- {
- from: showingFrom,
- to: showingTo,
- domStart: 0
- }
- ],
- changes
- )
- var intactLines = 0
- for (var i = 0; i < intact.length; ++i) {
- var range = intact[i]
- if (range.from < from) {
- range.domStart += from - range.from
- range.from = from
- }
- if (range.to > to) range.to = to
- if (range.from >= range.to) intact.splice(i--, 1)
- else intactLines += range.to - range.from
- }
- if (intactLines == to - from && from == showingFrom && to == showingTo) {
- updateVerticalScroll(scrollTop)
- return
- }
- intact.sort(function(a, b) {
- return a.domStart - b.domStart
- })
- var th = textHeight(),
- gutterDisplay = gutter.style.display
- lineDiv.style.display = 'none'
- patchDisplay(from, to, intact)
- lineDiv.style.display = gutter.style.display = ''
- var different =
- from != showingFrom ||
- to != showingTo ||
- lastSizeC != scroller.clientHeight + th
- if (different) lastSizeC = scroller.clientHeight + th
- if (from != showingFrom || (to != showingTo && options.onViewportChange))
- setTimeout(function() {
- if (options.onViewportChange)
- options.onViewportChange(instance, from, to)
- })
- showingFrom = from
- showingTo = to
- displayOffset = heightAtLine(doc, from)
- startWorker(100)
- if (lineDiv.childNodes.length != showingTo - showingFrom)
- throw new Error(
- 'BAD PATCH! ' +
- JSON.stringify(intact) +
- ' size=' +
- (showingTo - showingFrom) +
- ' nodes=' +
- lineDiv.childNodes.length
- )
-
- function checkHeights() {
- var curNode = lineDiv.firstChild,
- heightChanged = false
- doc.iter(showingFrom, showingTo, function(line) {
- if (!curNode) return
- if (!line.hidden) {
- var height = Math.round(curNode.offsetHeight / th) || 1
- if (line.height != height) {
- updateLineHeight(line, height)
- gutterDirty = heightChanged = true
- }
- }
- curNode = curNode.nextSibling
- })
- return heightChanged
- }
- if (options.lineWrapping) checkHeights()
- gutter.style.display = gutterDisplay
- if (different || gutterDirty) {
- updateGutter() && options.lineWrapping && checkHeights() && updateGutter()
- }
- updateVerticalScroll(scrollTop)
- updateSelection()
- if (!suppressCallback && options.onUpdate) options.onUpdate(instance)
- return true
- }
-
- function computeIntact(intact, changes) {
- for (var i = 0, l = changes.length || 0; i < l; ++i) {
- var change = changes[i],
- intact2 = [],
- diff = change.diff || 0
- for (var j = 0, l2 = intact.length; j < l2; ++j) {
- var range = intact[j]
- if (change.to <= range.from && change.diff)
- intact2.push({
- from: range.from + diff,
- to: range.to + diff,
- domStart: range.domStart
- })
- else if (change.to <= range.from || change.from >= range.to)
- intact2.push(range)
- else {
- if (change.from > range.from)
- intact2.push({
- from: range.from,
- to: change.from,
- domStart: range.domStart
- })
- if (change.to < range.to)
- intact2.push({
- from: change.to + diff,
- to: range.to + diff,
- domStart: range.domStart + (change.to - range.from)
- })
- }
- }
- intact = intact2
- }
- return intact
- }
-
- function patchDisplay(from, to, intact) {
- function killNode(node) {
- var tmp = node.nextSibling
- node.parentNode.removeChild(node)
- return tmp
- }
- if (!intact.length) removeChildren(lineDiv)
- else {
- var domPos = 0,
- curNode = lineDiv.firstChild,
- n
- for (var i = 0; i < intact.length; ++i) {
- var cur = intact[i]
- while (cur.domStart > domPos) {
- curNode = killNode(curNode)
- domPos++
- }
- for (var j = 0, e = cur.to - cur.from; j < e; ++j) {
- curNode = curNode.nextSibling
- domPos++
- }
- }
- while (curNode) curNode = killNode(curNode)
- }
- var nextIntact = intact.shift(),
- curNode = lineDiv.firstChild,
- j = from
- doc.iter(from, to, function(line) {
- if (nextIntact && nextIntact.to == j) nextIntact = intact.shift()
- if (!nextIntact || nextIntact.from > j) {
- if (line.hidden) var lineElement = elt('pre')
- else {
- var lineElement = lineContent(line)
- if (line.className) lineElement.className = line.className
- if (line.bgClassName) {
- var pre = elt(
- 'pre',
- '\u00a0',
- line.bgClassName,
- 'position: absolute; left: 0; right: 0; top: 0; bottom: 0; z-index: -2'
- )
- lineElement = elt(
- 'div',
- [pre, lineElement],
- null,
- 'position: relative'
- )
- }
- }
- lineDiv.insertBefore(lineElement, curNode)
- } else {
- curNode = curNode.nextSibling
- }
- ++j
- })
- }
-
- function updateGutter() {
- if (!options.gutter && !options.lineNumbers) return
- var hText = mover.offsetHeight,
- hEditor = scroller.clientHeight
- gutter.style.height = (hText - hEditor < 2 ? hEditor : hText) + 'px'
- var fragment = document.createDocumentFragment(),
- i = showingFrom,
- normalNode
- doc.iter(showingFrom, Math.max(showingTo, showingFrom + 1), function(line) {
- if (line.hidden) {
- fragment.appendChild(elt('pre'))
- } else {
- var marker = line.gutterMarker
- var text = options.lineNumbers
- ? options.lineNumberFormatter(i + options.firstLineNumber)
- : null
- if (marker && marker.text)
- text = marker.text.replace('%N%', text != null ? text : '')
- else if (text == null) text = '\u00a0'
- var markerElement = fragment.appendChild(
- elt('pre', null, marker && marker.style)
- )
- markerElement.innerHTML = text
- for (var j = 1; j < line.height; ++j) {
- markerElement.appendChild(elt('br'))
- markerElement.appendChild(document.createTextNode('\u00a0'))
- }
- if (!marker) normalNode = i
- }
- ++i
- })
- gutter.style.display = 'none'
- removeChildrenAndAdd(gutterText, fragment)
- if (normalNode != null && options.lineNumbers) {
- var node = gutterText.childNodes[normalNode - showingFrom]
- var minwidth = String(doc.size).length,
- val = eltText(node.firstChild),
- pad = ''
- while (val.length + pad.length < minwidth) pad += '\u00a0'
- if (pad) node.insertBefore(document.createTextNode(pad), node.firstChild)
- }
- gutter.style.display = ''
- var resized =
- Math.abs(
- (parseInt(lineSpace.style.marginLeft) || 0) - gutter.offsetWidth
- ) > 2
- lineSpace.style.marginLeft = gutter.offsetWidth + 'px'
- gutterDirty = false
- return resized
- }
-
- function updateSelection() {
- var collapsed = posEq(sel.from, sel.to)
- var fromPos = localCoords(sel.from, true)
- var toPos = collapsed ? fromPos : localCoords(sel.to, true)
- var headPos = sel.inverted ? fromPos : toPos,
- th = textHeight()
- var wrapOff = eltOffset(wrapper),
- lineOff = eltOffset(lineDiv)
- inputDiv.style.top =
- Math.max(
- 0,
- Math.min(scroller.offsetHeight, headPos.y + lineOff.top - wrapOff.top)
- ) + 'px'
- inputDiv.style.left =
- Math.max(
- 0,
- Math.min(scroller.offsetWidth, headPos.x + lineOff.left - wrapOff.left)
- ) + 'px'
- if (collapsed) {
- cursor.style.top = headPos.y + 'px'
- cursor.style.left =
- (options.lineWrapping
- ? Math.min(headPos.x, lineSpace.offsetWidth)
- : headPos.x) + 'px'
- cursor.style.display = ''
- selectionDiv.style.display = 'none'
- } else {
- var sameLine = fromPos.y == toPos.y,
- fragment = document.createDocumentFragment()
- var clientWidth = lineSpace.clientWidth || lineSpace.offsetWidth
- var clientHeight = lineSpace.clientHeight || lineSpace.offsetHeight
- var add = function(left, top, right, height) {
- var rstyle = quirksMode
- ? 'width: ' +
- (!right ? clientWidth : clientWidth - right - left) +
- 'px'
- : 'right: ' + right + 'px'
- fragment.appendChild(
- elt(
- 'div',
- null,
- 'CodeMirror-selected',
- 'position: absolute; left: ' +
- left +
- 'px; top: ' +
- top +
- 'px; ' +
- rstyle +
- '; height: ' +
- height +
- 'px'
- )
- )
- }
- if (sel.from.ch && fromPos.y >= 0) {
- var right = sameLine ? clientWidth - toPos.x : 0
- add(fromPos.x, fromPos.y, right, th)
- }
- var middleStart = Math.max(0, fromPos.y + (sel.from.ch ? th : 0))
- var middleHeight = Math.min(toPos.y, clientHeight) - middleStart
- if (middleHeight > 0.2 * th) add(0, middleStart, 0, middleHeight)
- if ((!sameLine || !sel.from.ch) && toPos.y < clientHeight - 0.5 * th)
- add(0, toPos.y, clientWidth - toPos.x, th)
- removeChildrenAndAdd(selectionDiv, fragment)
- cursor.style.display = 'none'
- selectionDiv.style.display = ''
- }
- }
-
- function setShift(val) {
- if (val)
- shiftSelecting = shiftSelecting || (sel.inverted ? sel.to : sel.from)
- else shiftSelecting = null
- }
-
- function setSelectionUser(from, to) {
- var sh = shiftSelecting && clipPos(shiftSelecting)
- if (sh) {
- if (posLess(sh, from)) from = sh
- else if (posLess(to, sh)) to = sh
- }
- setSelection(from, to)
- userSelChange = true
- }
-
- function setSelection(from, to, oldFrom, oldTo) {
- goalColumn = null
- if (oldFrom == null) {
- oldFrom = sel.from.line
- oldTo = sel.to.line
- }
- if (posEq(sel.from, from) && posEq(sel.to, to)) return
- if (posLess(to, from)) {
- var tmp = to
- to = from
- from = tmp
- }
- if (from.line != oldFrom) {
- var from1 = skipHidden(from, oldFrom, sel.from.ch)
- if (!from1) setLineHidden(from.line, false)
- else from = from1
- }
- if (to.line != oldTo) to = skipHidden(to, oldTo, sel.to.ch)
- if (posEq(from, to)) sel.inverted = false
- else if (posEq(from, sel.to)) sel.inverted = false
- else if (posEq(to, sel.from)) sel.inverted = true
- if (options.autoClearEmptyLines && posEq(sel.from, sel.to)) {
- var head = sel.inverted ? from : to
- if (head.line != sel.from.line && sel.from.line < doc.size) {
- var oldLine = getLine(sel.from.line)
- if (/^\s+$/.test(oldLine.text))
- setTimeout(
- operation(function() {
- if (oldLine.parent && /^\s+$/.test(oldLine.text)) {
- var no = lineNo(oldLine)
- replaceRange(
- '',
- {
- line: no,
- ch: 0
- },
- {
- line: no,
- ch: oldLine.text.length
- }
- )
- }
- }, 10)
- )
- }
- }
- sel.from = from
- sel.to = to
- selectionChanged = true
- }
-
- function skipHidden(pos, oldLine, oldCh) {
- function getNonHidden(dir) {
- var lNo = pos.line + dir,
- end = dir == 1 ? doc.size : -1
- while (lNo != end) {
- var line = getLine(lNo)
- if (!line.hidden) {
- var ch = pos.ch
- if (toEnd || ch > oldCh || ch > line.text.length)
- ch = line.text.length
- return {
- line: lNo,
- ch: ch
- }
- }
- lNo += dir
- }
- }
- var line = getLine(pos.line)
- var toEnd = pos.ch == line.text.length && pos.ch != oldCh
- if (!line.hidden) return pos
- if (pos.line >= oldLine) return getNonHidden(1) || getNonHidden(-1)
- else return getNonHidden(-1) || getNonHidden(1)
- }
-
- function setCursor(line, ch, user) {
- var pos = clipPos({
- line: line,
- ch: ch || 0
- })
- ;(user ? setSelectionUser : setSelection)(pos, pos)
- }
-
- function clipLine(n) {
- return Math.max(0, Math.min(n, doc.size - 1))
- }
-
- function clipPos(pos) {
- if (pos.line < 0)
- return {
- line: 0,
- ch: 0
- }
- if (pos.line >= doc.size)
- return {
- line: doc.size - 1,
- ch: getLine(doc.size - 1).text.length
- }
- var ch = pos.ch,
- linelen = getLine(pos.line).text.length
- if (ch == null || ch > linelen)
- return {
- line: pos.line,
- ch: linelen
- }
- else if (ch < 0)
- return {
- line: pos.line,
- ch: 0
- }
- else return pos
- }
-
- function findPosH(dir, unit) {
- var end = sel.inverted ? sel.from : sel.to,
- line = end.line,
- ch = end.ch
- var lineObj = getLine(line)
-
- function findNextLine() {
- for (var l = line + dir, e = dir < 0 ? -1 : doc.size; l != e; l += dir) {
- var lo = getLine(l)
- if (!lo.hidden) {
- line = l
- lineObj = lo
- return true
- }
- }
- }
-
- function moveOnce(boundToLine) {
- if (ch == (dir < 0 ? 0 : lineObj.text.length)) {
- if (!boundToLine && findNextLine())
- ch = dir < 0 ? lineObj.text.length : 0
- else return false
- } else ch += dir
- return true
- }
- if (unit == 'char') moveOnce()
- else if (unit == 'column') moveOnce(true)
- else if (unit == 'word') {
- var sawWord = false
- for (;;) {
- if (dir < 0) if (!moveOnce()) break
- if (isWordChar(lineObj.text.charAt(ch))) sawWord = true
- else if (sawWord) {
- if (dir < 0) {
- dir = 1
- moveOnce()
- }
- break
- }
- if (dir > 0) if (!moveOnce()) break
- }
- }
- return {
- line: line,
- ch: ch
- }
- }
-
- function moveH(dir, unit) {
- var pos = dir < 0 ? sel.from : sel.to
- if (shiftSelecting || posEq(sel.from, sel.to)) pos = findPosH(dir, unit)
- setCursor(pos.line, pos.ch, true)
- }
-
- function deleteH(dir, unit) {
- if (!posEq(sel.from, sel.to)) replaceRange('', sel.from, sel.to)
- else if (dir < 0) replaceRange('', findPosH(dir, unit), sel.to)
- else replaceRange('', sel.from, findPosH(dir, unit))
- userSelChange = true
- }
-
- function moveV(dir, unit) {
- var dist = 0,
- pos = localCoords(sel.inverted ? sel.from : sel.to, true)
- if (goalColumn != null) pos.x = goalColumn
- if (unit == 'page') {
- var screen = Math.min(
- scroller.clientHeight,
- window.innerHeight || document.documentElement.clientHeight
- )
- var target = coordsChar(pos.x, pos.y + screen * dir)
- } else if (unit == 'line') {
- var th = textHeight()
- var target = coordsChar(pos.x, pos.y + 0.5 * th + dir * th)
- }
- if (unit == 'page')
- scrollbar.scrollTop += localCoords(target, true).y - pos.y
- setCursor(target.line, target.ch, true)
- goalColumn = pos.x
- }
-
- function findWordAt(pos) {
- var line = getLine(pos.line).text
- var start = pos.ch,
- end = pos.ch
- if (line) {
- if (pos.after === false || end == line.length) --start
- else ++end
- var startChar = line.charAt(start)
- var check = isWordChar(startChar)
- ? isWordChar
- : /\s/.test(startChar)
- ? function(ch) {
- return /\s/.test(ch)
- }
- : function(ch) {
- return !/\s/.test(ch) && isWordChar(ch)
- }
- while (start > 0 && check(line.charAt(start - 1))) --start
- while (end < line.length && check(line.charAt(end))) ++end
- }
- return {
- from: {
- line: pos.line,
- ch: start
- },
- to: {
- line: pos.line,
- ch: end
- }
- }
- }
-
- function selectLine(line) {
- setSelectionUser(
- {
- line: line,
- ch: 0
- },
- clipPos({
- line: line + 1,
- ch: 0
- })
- )
- }
-
- function indentSelected(mode) {
- if (posEq(sel.from, sel.to)) return indentLine(sel.from.line, mode)
- var e = sel.to.line - (sel.to.ch ? 0 : 1)
- for (var i = sel.from.line; i <= e; ++i) indentLine(i, mode)
- }
-
- function indentLine(n, how) {
- if (!how) how = 'add'
- if (how == 'smart') {
- if (!mode.indent) how = 'prev'
- else var state = getStateBefore(n)
- }
- var line = getLine(n),
- curSpace = line.indentation(options.tabSize),
- curSpaceString = line.text.match(/^\s*/)[0],
- indentation
- if (how == 'smart') {
- indentation = mode.indent(
- state,
- line.text.slice(curSpaceString.length),
- line.text
- )
- if (indentation == Pass) how = 'prev'
- }
- if (how == 'prev') {
- if (n) indentation = getLine(n - 1).indentation(options.tabSize)
- else indentation = 0
- } else if (how == 'add') indentation = curSpace + options.indentUnit
- else if (how == 'subtract') indentation = curSpace - options.indentUnit
- indentation = Math.max(0, indentation)
- var diff = indentation - curSpace
- var indentString = '',
- pos = 0
- if (options.indentWithTabs)
- for (var i = Math.floor(indentation / options.tabSize); i; --i) {
- pos += options.tabSize
- indentString += '\t'
- }
- if (pos < indentation) indentString += spaceStr(indentation - pos)
- if (indentString != curSpaceString)
- replaceRange(
- indentString,
- {
- line: n,
- ch: 0
- },
- {
- line: n,
- ch: curSpaceString.length
- }
- )
- line.stateAfter = null
- }
-
- function loadMode() {
- mode = CodeMirror.getMode(options, options.mode)
- doc.iter(0, doc.size, function(line) {
- line.stateAfter = null
- })
- frontier = 0
- startWorker(100)
- }
-
- function gutterChanged() {
- var visible = options.gutter || options.lineNumbers
- gutter.style.display = visible ? '' : 'none'
- if (visible) gutterDirty = true
- else lineDiv.parentNode.style.marginLeft = 0
- }
-
- function wrappingChanged(from, to) {
- if (options.lineWrapping) {
- wrapper.className += ' CodeMirror-wrap'
- var perLine = scroller.clientWidth / charWidth() - 3
- doc.iter(0, doc.size, function(line) {
- if (line.hidden) return
- var guess = Math.ceil(line.text.length / perLine) || 1
- if (guess != 1) updateLineHeight(line, guess)
- })
- lineSpace.style.minWidth = widthForcer.style.left = ''
- } else {
- wrapper.className = wrapper.className.replace(' CodeMirror-wrap', '')
- computeMaxLength()
- doc.iter(0, doc.size, function(line) {
- if (line.height != 1 && !line.hidden) updateLineHeight(line, 1)
- })
- }
- changes.push({
- from: 0,
- to: doc.size
- })
- }
-
- function themeChanged() {
- scroller.className =
- scroller.className.replace(/\s*cm-s-\S+/g, '') +
- options.theme.replace(/(^|\s)\s*/g, ' cm-s-')
- }
-
- function keyMapChanged() {
- var style = keyMap[options.keyMap].style
- wrapper.className =
- wrapper.className.replace(/\s*cm-keymap-\S+/g, '') +
- (style ? ' cm-keymap-' + style : '')
- }
-
- function TextMarker(type, style) {
- this.lines = []
- this.type = type
- if (style) this.style = style
- }
- TextMarker.prototype.clear = operation(function() {
- var min, max
- for (var i = 0; i < this.lines.length; ++i) {
- var line = this.lines[i]
- var span = getMarkedSpanFor(line.markedSpans, this)
- if (span.from != null) min = lineNo(line)
- if (span.to != null) max = lineNo(line)
- line.markedSpans = removeMarkedSpan(line.markedSpans, span)
- }
- if (min != null)
- changes.push({
- from: min,
- to: max + 1
- })
- this.lines.length = 0
- this.explicitlyCleared = true
- })
- TextMarker.prototype.find = function() {
- var from, to
- for (var i = 0; i < this.lines.length; ++i) {
- var line = this.lines[i]
- var span = getMarkedSpanFor(line.markedSpans, this)
- if (span.from != null || span.to != null) {
- var found = lineNo(line)
- if (span.from != null)
- from = {
- line: found,
- ch: span.from
- }
- if (span.to != null)
- to = {
- line: found,
- ch: span.to
- }
- }
- }
- if (this.type == 'bookmark') return from
- return (
- from && {
- from: from,
- to: to
- }
- )
- }
-
- function markText(from, to, className, options) {
- from = clipPos(from)
- to = clipPos(to)
- var marker = new TextMarker('range', className)
- if (options)
- for (var opt in options)
- if (options.hasOwnProperty(opt)) marker[opt] = options[opt]
- var curLine = from.line
- doc.iter(curLine, to.line + 1, function(line) {
- var span = {
- from: curLine == from.line ? from.ch : null,
- to: curLine == to.line ? to.ch : null,
- marker: marker
- }
- line.markedSpans = (line.markedSpans || []).concat([span])
- marker.lines.push(line)
- ++curLine
- })
- changes.push({
- from: from.line,
- to: to.line + 1
- })
- return marker
- }
-
- function setBookmark(pos) {
- pos = clipPos(pos)
- var marker = new TextMarker('bookmark'),
- line = getLine(pos.line)
- history.addChange(pos.line, 1, [newHL(line.text, line.markedSpans)], true)
- var span = {
- from: pos.ch,
- to: pos.ch,
- marker: marker
- }
- line.markedSpans = (line.markedSpans || []).concat([span])
- marker.lines.push(line)
- return marker
- }
-
- function findMarksAt(pos) {
- pos = clipPos(pos)
- var markers = [],
- spans = getLine(pos.line).markedSpans
- if (spans)
- for (var i = 0; i < spans.length; ++i) {
- var span = spans[i]
- if (
- (span.from == null || span.from <= pos.ch) &&
- (span.to == null || span.to >= pos.ch)
- )
- markers.push(span.marker)
- }
- return markers
- }
-
- function addGutterMarker(line, text, className) {
- if (typeof line == 'number') line = getLine(clipLine(line))
- line.gutterMarker = {
- text: text,
- style: className
- }
- gutterDirty = true
- return line
- }
-
- function removeGutterMarker(line) {
- if (typeof line == 'number') line = getLine(clipLine(line))
- line.gutterMarker = null
- gutterDirty = true
- }
-
- function changeLine(handle, op) {
- var no = handle,
- line = handle
- if (typeof handle == 'number') line = getLine(clipLine(handle))
- else no = lineNo(handle)
- if (no == null) return null
- if (op(line, no))
- changes.push({
- from: no,
- to: no + 1
- })
- else return null
- return line
- }
-
- function setLineClass(handle, className, bgClassName) {
- return changeLine(handle, function(line) {
- if (line.className != className || line.bgClassName != bgClassName) {
- line.className = className
- line.bgClassName = bgClassName
- return true
- }
- })
- }
-
- function setLineHidden(handle, hidden) {
- return changeLine(handle, function(line, no) {
- if (line.hidden != hidden) {
- line.hidden = hidden
- if (!options.lineWrapping) {
- if (hidden && line.text.length == maxLine.text.length) {
- updateMaxLine = true
- } else if (!hidden && line.text.length > maxLine.text.length) {
- maxLine = line
- updateMaxLine = false
- }
- }
- updateLineHeight(line, hidden ? 0 : 1)
- var fline = sel.from.line,
- tline = sel.to.line
- if (hidden && (fline == no || tline == no)) {
- var from =
- fline == no
- ? skipHidden(
- {
- line: fline,
- ch: 0
- },
- fline,
- 0
- )
- : sel.from
- var to =
- tline == no
- ? skipHidden(
- {
- line: tline,
- ch: 0
- },
- tline,
- 0
- )
- : sel.to
- if (!to) return
- setSelection(from, to)
- }
- return (gutterDirty = true)
- }
- })
- }
-
- function lineInfo(line) {
- if (typeof line == 'number') {
- if (!isLine(line)) return null
- var n = line
- line = getLine(line)
- if (!line) return null
- } else {
- var n = lineNo(line)
- if (n == null) return null
- }
- var marker = line.gutterMarker
- return {
- line: n,
- handle: line,
- text: line.text,
- markerText: marker && marker.text,
- markerClass: marker && marker.style,
- lineClass: line.className,
- bgClass: line.bgClassName
- }
- }
-
- function measureLine(line, ch) {
- if (ch == 0)
- return {
- top: 0,
- left: 0
- }
- var pre = lineContent(line, ch)
- removeChildrenAndAdd(measure, pre)
- var anchor = pre.anchor
- var top = anchor.offsetTop,
- left = anchor.offsetLeft
- if (ie && top == 0 && left == 0) {
- var backup = elt('span', 'x')
- anchor.parentNode.insertBefore(backup, anchor.nextSibling)
- top = backup.offsetTop
- }
- return {
- top: top,
- left: left
- }
- }
-
- function localCoords(pos, inLineWrap) {
- var x,
- lh = textHeight(),
- y = lh * (heightAtLine(doc, pos.line) - (inLineWrap ? displayOffset : 0))
- if (pos.ch == 0) x = 0
- else {
- var sp = measureLine(getLine(pos.line), pos.ch)
- x = sp.left
- if (options.lineWrapping) y += Math.max(0, sp.top)
- }
- return {
- x: x,
- y: y,
- yBot: y + lh
- }
- }
-
- function coordsChar(x, y) {
- var th = textHeight(),
- cw = charWidth(),
- heightPos = displayOffset + Math.floor(y / th)
- if (heightPos < 0)
- return {
- line: 0,
- ch: 0
- }
- var lineNo = lineAtHeight(doc, heightPos)
- if (lineNo >= doc.size)
- return {
- line: doc.size - 1,
- ch: getLine(doc.size - 1).text.length
- }
- var lineObj = getLine(lineNo),
- text = lineObj.text
- var tw = options.lineWrapping,
- innerOff = tw ? heightPos - heightAtLine(doc, lineNo) : 0
- if (x <= 0 && innerOff == 0)
- return {
- line: lineNo,
- ch: 0
- }
- var wrongLine = false
-
- function getX(len) {
- var sp = measureLine(lineObj, len)
- if (tw) {
- var off = Math.round(sp.top / th)
- wrongLine = off != innerOff
- return Math.max(0, sp.left + (off - innerOff) * scroller.clientWidth)
- }
- return sp.left
- }
- var from = 0,
- fromX = 0,
- to = text.length,
- toX
- var estimated = Math.min(
- to,
- Math.ceil((x + innerOff * scroller.clientWidth * 0.9) / cw)
- )
- for (;;) {
- var estX = getX(estimated)
- if (estX <= x && estimated < to)
- estimated = Math.min(to, Math.ceil(estimated * 1.2))
- else {
- toX = estX
- to = estimated
- break
- }
- }
- if (x > toX)
- return {
- line: lineNo,
- ch: to
- }
- estimated = Math.floor(to * 0.8)
- estX = getX(estimated)
- if (estX < x) {
- from = estimated
- fromX = estX
- }
- for (;;) {
- if (to - from <= 1) {
- var after = x - fromX < toX - x
- return {
- line: lineNo,
- ch: after ? from : to,
- after: after
- }
- }
- var middle = Math.ceil((from + to) / 2),
- middleX = getX(middle)
- if (middleX > x) {
- to = middle
- toX = middleX
- if (wrongLine) toX += 1000
- } else {
- from = middle
- fromX = middleX
- }
- }
- }
-
- function pageCoords(pos) {
- var local = localCoords(pos, true),
- off = eltOffset(lineSpace)
- return {
- x: off.left + local.x,
- y: off.top + local.y,
- yBot: off.top + local.yBot
- }
- }
- var cachedHeight, cachedHeightFor, measurePre
-
- function textHeight() {
- if (measurePre == null) {
- measurePre = elt('pre')
- for (var i = 0; i < 49; ++i) {
- measurePre.appendChild(document.createTextNode('x'))
- measurePre.appendChild(elt('br'))
- }
- measurePre.appendChild(document.createTextNode('x'))
- }
- var offsetHeight = lineDiv.clientHeight
- if (offsetHeight == cachedHeightFor) return cachedHeight
- cachedHeightFor = offsetHeight
- removeChildrenAndAdd(measure, measurePre.cloneNode(true))
- cachedHeight = measure.firstChild.offsetHeight / 50 || 1
- removeChildren(measure)
- return cachedHeight
- }
- var cachedWidth,
- cachedWidthFor = 0
-
- function charWidth() {
- if (scroller.clientWidth == cachedWidthFor) return cachedWidth
- cachedWidthFor = scroller.clientWidth
- var anchor = elt('span', 'x')
- var pre = elt('pre', [anchor])
- removeChildrenAndAdd(measure, pre)
- return (cachedWidth = anchor.offsetWidth || 10)
- }
-
- function paddingTop() {
- return lineSpace.offsetTop
- }
-
- function paddingLeft() {
- return lineSpace.offsetLeft
- }
-
- function posFromMouse(e, liberal) {
- var offW = eltOffset(scroller, true),
- x,
- y
- try {
- x = e.clientX
- y = e.clientY
- } catch (e) {
- return null
- }
- if (
- !liberal &&
- (x - offW.left > scroller.clientWidth ||
- y - offW.top > scroller.clientHeight)
- )
- return null
- var offL = eltOffset(lineSpace, true)
- return coordsChar(x - offL.left, y - offL.top)
- }
- var detectingSelectAll
-
- function onContextMenu(e) {
- var pos = posFromMouse(e),
- scrollPos = scrollbar.scrollTop
- if (!pos || opera) return
- if (
- posEq(sel.from, sel.to) ||
- posLess(pos, sel.from) ||
- !posLess(pos, sel.to)
- )
- operation(setCursor)(pos.line, pos.ch)
- var oldCSS = input.style.cssText
- inputDiv.style.position = 'absolute'
- input.style.cssText =
- 'position: fixed; width: 30px; height: 30px; top: ' +
- (e.clientY - 5) +
- 'px; left: ' +
- (e.clientX - 5) +
- 'px; z-index: 1000; background: white; ' +
- 'border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);'
- focusInput()
- resetInput(true)
- if (posEq(sel.from, sel.to)) input.value = prevInput = ' '
-
- function rehide() {
- inputDiv.style.position = 'relative'
- input.style.cssText = oldCSS
- if (ie_lt9) scrollbar.scrollTop = scrollPos
- slowPoll()
- if (input.selectionStart != null) {
- clearTimeout(detectingSelectAll)
- var extval = (input.value =
- ' ' + (posEq(sel.from, sel.to) ? '' : input.value)),
- i = 0
- prevInput = ' '
- input.selectionStart = 1
- input.selectionEnd = extval.length
- detectingSelectAll = setTimeout(function poll() {
- if (prevInput == ' ' && input.selectionStart == 0)
- operation(commands.selectAll)(instance)
- else if (i++ < 10) detectingSelectAll = setTimeout(poll, 500)
- else resetInput()
- }, 200)
- }
- }
- if (gecko) {
- e_stop(e)
- var mouseup = connect(
- window,
- 'mouseup',
- function() {
- mouseup()
- setTimeout(rehide, 20)
- },
- true
- )
- } else {
- setTimeout(rehide, 50)
- }
- }
-
- function restartBlink() {
- clearInterval(blinker)
- var on = true
- cursor.style.visibility = ''
- blinker = setInterval(function() {
- cursor.style.visibility = (on = !on) ? '' : 'hidden'
- }, options.cursorBlinkRate)
- }
- var matching = {
- '(': ')>',
- ')': '(<',
- '[': ']>',
- ']': '[<',
- '{': '}>',
- '}': '{<'
- }
-
- function matchBrackets(autoclear) {
- var head = sel.inverted ? sel.from : sel.to,
- line = getLine(head.line),
- pos = head.ch - 1
- var match =
- (pos >= 0 && matching[line.text.charAt(pos)]) ||
- matching[line.text.charAt(++pos)]
- if (!match) return
- var ch = match.charAt(0),
- forward = match.charAt(1) == '>',
- d = forward ? 1 : -1,
- st = line.styles
- for (var off = pos + 1, i = 0, e = st.length; i < e; i += 2)
- if ((off -= st[i].length) <= 0) {
- var style = st[i + 1]
- break
- }
- var stack = [line.text.charAt(pos)],
- re = /[(){}[\]]/
-
- function scan(line, from, to) {
- if (!line.text) return
- var st = line.styles,
- pos = forward ? 0 : line.text.length - 1,
- cur
- for (
- var i = forward ? 0 : st.length - 2, e = forward ? st.length : -2;
- i != e;
- i += 2 * d
- ) {
- var text = st[i]
- if (st[i + 1] != style) {
- pos += d * text.length
- continue
- }
- for (
- var j = forward ? 0 : text.length - 1,
- te = forward ? text.length : -1;
- j != te;
- j += d, pos += d
- ) {
- if (pos >= from && pos < to && re.test((cur = text.charAt(j)))) {
- var match = matching[cur]
- if ((match.charAt(1) == '>') == forward) stack.push(cur)
- else if (stack.pop() != match.charAt(0))
- return {
- pos: pos,
- match: false
- }
- else if (!stack.length)
- return {
- pos: pos,
- match: true
- }
- }
- }
- }
- }
- for (
- var i = head.line,
- e = forward ? Math.min(i + 100, doc.size) : Math.max(-1, i - 100);
- i != e;
- i += d
- ) {
- var line = getLine(i),
- first = i == head.line
- var found = scan(
- line,
- first && forward ? pos + 1 : 0,
- first && !forward ? pos : line.text.length
- )
- if (found) break
- }
- if (!found)
- found = {
- pos: null,
- match: false
- }
- var style = found.match
- ? 'CodeMirror-matchingbracket'
- : 'CodeMirror-nonmatchingbracket'
- var one = markText(
- {
- line: head.line,
- ch: pos
- },
- {
- line: head.line,
- ch: pos + 1
- },
- style
- ),
- two =
- found.pos != null &&
- markText(
- {
- line: i,
- ch: found.pos
- },
- {
- line: i,
- ch: found.pos + 1
- },
- style
- )
- var clear = operation(function() {
- one.clear()
- two && two.clear()
- })
- if (autoclear) setTimeout(clear, 800)
- else bracketHighlighted = clear
- }
-
- function findStartLine(n) {
- var minindent, minline
- for (var search = n, lim = n - 40; search > lim; --search) {
- if (search == 0) return 0
- var line = getLine(search - 1)
- if (line.stateAfter) return search
- var indented = line.indentation(options.tabSize)
- if (minline == null || minindent > indented) {
- minline = search - 1
- minindent = indented
- }
- }
- return minline
- }
-
- function getStateBefore(n) {
- var pos = findStartLine(n),
- state = pos && getLine(pos - 1).stateAfter
- if (!state) state = startState(mode)
- else state = copyState(mode, state)
- doc.iter(pos, n, function(line) {
- line.process(mode, state, options.tabSize)
- line.stateAfter =
- pos == n - 1 || pos % 5 == 0 ? copyState(mode, state) : null
- })
- return state
- }
-
- function highlightWorker() {
- if (frontier >= showingTo) return
- var end = +new Date() + options.workTime,
- state = copyState(mode, getStateBefore(frontier))
- var startFrontier = frontier
- doc.iter(frontier, showingTo, function(line) {
- if (frontier >= showingFrom) {
- line.highlight(mode, state, options.tabSize)
- line.stateAfter = copyState(mode, state)
- } else {
- line.process(mode, state, options.tabSize)
- line.stateAfter = frontier % 5 == 0 ? copyState(mode, state) : null
- }
- ++frontier
- if (+new Date() > end) {
- startWorker(options.workDelay)
- return true
- }
- })
- if (showingTo > startFrontier && frontier >= showingFrom)
- operation(function() {
- changes.push({
- from: startFrontier,
- to: frontier
- })
- })()
- }
-
- function startWorker(time) {
- if (frontier < showingTo) highlight.set(time, highlightWorker)
- }
-
- function startOperation() {
- updateInput = userSelChange = textChanged = null
- changes = []
- selectionChanged = false
- callbacks = []
- }
-
- function endOperation() {
- if (updateMaxLine) computeMaxLength()
- if (maxLineChanged && !options.lineWrapping) {
- var cursorWidth = widthForcer.offsetWidth,
- left = measureLine(maxLine, maxLine.text.length).left
- if (!ie_lt8) {
- widthForcer.style.left = left + 'px'
- lineSpace.style.minWidth = left + cursorWidth + 'px'
- }
- maxLineChanged = false
- }
- var newScrollPos, updated
- if (selectionChanged) {
- var coords = calculateCursorCoords()
- newScrollPos = calculateScrollPos(
- coords.x,
- coords.y,
- coords.x,
- coords.yBot
- )
- }
- if (changes.length || (newScrollPos && newScrollPos.scrollTop != null))
- updated = updateDisplay(
- changes,
- true,
- newScrollPos && newScrollPos.scrollTop
- )
- if (!updated) {
- if (selectionChanged) updateSelection()
- if (gutterDirty) updateGutter()
- }
- if (newScrollPos) scrollCursorIntoView()
- if (selectionChanged) restartBlink()
- if (
- focused &&
- (updateInput === true || (updateInput !== false && selectionChanged))
- )
- resetInput(userSelChange)
- if (selectionChanged && options.matchBrackets)
- setTimeout(
- operation(function() {
- if (bracketHighlighted) {
- bracketHighlighted()
- bracketHighlighted = null
- }
- if (posEq(sel.from, sel.to)) matchBrackets(false)
- }),
- 20
- )
- var sc = selectionChanged,
- cbs = callbacks
- if (textChanged && options.onChange && instance)
- options.onChange(instance, textChanged)
- if (sc && options.onCursorActivity) options.onCursorActivity(instance)
- for (var i = 0; i < cbs.length; ++i) cbs[i](instance)
- if (updated && options.onUpdate) options.onUpdate(instance)
- }
- var nestedOperation = 0
-
- function operation(f) {
- return function() {
- if (!nestedOperation++) startOperation()
- try {
- var result = f.apply(this, arguments)
- } finally {
- if (!--nestedOperation) endOperation()
- }
- return result
- }
- }
-
- function compoundChange(f) {
- history.startCompound()
- try {
- return f()
- } finally {
- history.endCompound()
- }
- }
- for (var ext in extensions)
- if (
- extensions.propertyIsEnumerable(ext) &&
- !instance.propertyIsEnumerable(ext)
- )
- instance[ext] = extensions[ext]
- for (var i = 0; i < initHooks.length; ++i) initHooks[i](instance)
- return instance
-}
-CodeMirror.defaults = {
- value: '',
- mode: null,
- theme: 'default',
- indentUnit: 2,
- indentWithTabs: false,
- smartIndent: true,
- tabSize: 4,
- keyMap: 'default',
- extraKeys: null,
- electricChars: true,
- autoClearEmptyLines: false,
- onKeyEvent: null,
- onDragEvent: null,
- lineWrapping: false,
- lineNumbers: false,
- gutter: false,
- fixedGutter: false,
- firstLineNumber: 1,
- readOnly: false,
- dragDrop: true,
- onChange: null,
- onCursorActivity: null,
- onViewportChange: null,
- onGutterClick: null,
- onUpdate: null,
- onFocus: null,
- onBlur: null,
- onScroll: null,
- matchBrackets: false,
- cursorBlinkRate: 530,
- workTime: 100,
- workDelay: 200,
- pollInterval: 100,
- undoDepth: 40,
- tabindex: null,
- autofocus: null,
- lineNumberFormatter: function(integer) {
- return integer
- }
-}
-var ios =
- /AppleWebKit/.test(navigator.userAgent) &&
- /Mobile\/\w+/.test(navigator.userAgent)
-var mac = ios || /Mac/.test(navigator.platform)
-var win = /Win/.test(navigator.platform)
-var modes = (CodeMirror.modes = {}),
- mimeModes = (CodeMirror.mimeModes = {})
-CodeMirror.defineMode = function(name, mode) {
- if (!CodeMirror.defaults.mode && name != 'null')
- CodeMirror.defaults.mode = name
- if (arguments.length > 2) {
- mode.dependencies = []
- for (var i = 2; i < arguments.length; ++i)
- mode.dependencies.push(arguments[i])
- }
- modes[name] = mode
-}
-CodeMirror.defineMIME = function(mime, spec) {
- mimeModes[mime] = spec
-}
-CodeMirror.resolveMode = function(spec) {
- if (typeof spec == 'string' && mimeModes.hasOwnProperty(spec))
- spec = mimeModes[spec]
- else if (typeof spec == 'string' && /^[\w\-]+\/[\w\-]+\+xml$/.test(spec))
- return CodeMirror.resolveMode('application/xml')
- if (typeof spec == 'string')
- return {
- name: spec
- }
- else
- return (
- spec || {
- name: 'null'
- }
- )
-}
-CodeMirror.getMode = function(options, spec) {
- var spec = CodeMirror.resolveMode(spec)
- var mfactory = modes[spec.name]
- if (!mfactory) return CodeMirror.getMode(options, 'text/plain')
- var modeObj = mfactory(options, spec)
- if (modeExtensions.hasOwnProperty(spec.name)) {
- var exts = modeExtensions[spec.name]
- for (var prop in exts)
- if (exts.hasOwnProperty(prop)) modeObj[prop] = exts[prop]
- }
- modeObj.name = spec.name
- return modeObj
-}
-CodeMirror.listModes = function() {
- var list = []
- for (var m in modes) if (modes.propertyIsEnumerable(m)) list.push(m)
- return list
-}
-CodeMirror.listMIMEs = function() {
- var list = []
- for (var m in mimeModes)
- if (mimeModes.propertyIsEnumerable(m))
- list.push({
- mime: m,
- mode: mimeModes[m]
- })
- return list
-}
-var extensions = (CodeMirror.extensions = {})
-CodeMirror.defineExtension = function(name, func) {
- extensions[name] = func
-}
-var initHooks = []
-CodeMirror.defineInitHook = function(f) {
- initHooks.push(f)
-}
-var modeExtensions = (CodeMirror.modeExtensions = {})
-CodeMirror.extendMode = function(mode, properties) {
- var exts = modeExtensions.hasOwnProperty(mode)
- ? modeExtensions[mode]
- : (modeExtensions[mode] = {})
- for (var prop in properties)
- if (properties.hasOwnProperty(prop)) exts[prop] = properties[prop]
-}
-var commands = (CodeMirror.commands = {
- selectAll: function(cm) {
- cm.setSelection(
- {
- line: 0,
- ch: 0
- },
- {
- line: cm.lineCount() - 1
- }
- )
- },
- killLine: function(cm) {
- var from = cm.getCursor(true),
- to = cm.getCursor(false),
- sel = !posEq(from, to)
- if (!sel && cm.getLine(from.line).length == from.ch)
- cm.replaceRange('', from, {
- line: from.line + 1,
- ch: 0
- })
- else
- cm.replaceRange(
- '',
- from,
- sel
- ? to
- : {
- line: from.line
- }
- )
- },
- deleteLine: function(cm) {
- var l = cm.getCursor().line
- cm.replaceRange(
- '',
- {
- line: l,
- ch: 0
- },
- {
- line: l
- }
- )
- },
- undo: function(cm) {
- cm.undo()
- },
- redo: function(cm) {
- cm.redo()
- },
- goDocStart: function(cm) {
- cm.setCursor(0, 0, true)
- },
- goDocEnd: function(cm) {
- cm.setSelection(
- {
- line: cm.lineCount() - 1
- },
- null,
- true
- )
- },
- goLineStart: function(cm) {
- cm.setCursor(cm.getCursor().line, 0, true)
- },
- goLineStartSmart: function(cm) {
- var cur = cm.getCursor()
- var text = cm.getLine(cur.line),
- firstNonWS = Math.max(0, text.search(/\S/))
- cm.setCursor(
- cur.line,
- cur.ch <= firstNonWS && cur.ch ? 0 : firstNonWS,
- true
- )
- },
- goLineEnd: function(cm) {
- cm.setSelection(
- {
- line: cm.getCursor().line
- },
- null,
- true
- )
- },
- goLineUp: function(cm) {
- cm.moveV(-1, 'line')
- },
- goLineDown: function(cm) {
- cm.moveV(1, 'line')
- },
- goPageUp: function(cm) {
- cm.moveV(-1, 'page')
- },
- goPageDown: function(cm) {
- cm.moveV(1, 'page')
- },
- goCharLeft: function(cm) {
- cm.moveH(-1, 'char')
- },
- goCharRight: function(cm) {
- cm.moveH(1, 'char')
- },
- goColumnLeft: function(cm) {
- cm.moveH(-1, 'column')
- },
- goColumnRight: function(cm) {
- cm.moveH(1, 'column')
- },
- goWordLeft: function(cm) {
- cm.moveH(-1, 'word')
- },
- goWordRight: function(cm) {
- cm.moveH(1, 'word')
- },
- delCharLeft: function(cm) {
- cm.deleteH(-1, 'char')
- },
- delCharRight: function(cm) {
- cm.deleteH(1, 'char')
- },
- delWordLeft: function(cm) {
- cm.deleteH(-1, 'word')
- },
- delWordRight: function(cm) {
- cm.deleteH(1, 'word')
- },
- indentAuto: function(cm) {
- cm.indentSelection('smart')
- },
- indentMore: function(cm) {
- cm.indentSelection('add')
- },
- indentLess: function(cm) {
- cm.indentSelection('subtract')
- },
- insertTab: function(cm) {
- cm.replaceSelection('\t', 'end')
- },
- defaultTab: function(cm) {
- if (cm.somethingSelected()) cm.indentSelection('add')
- else cm.replaceSelection('\t', 'end')
- },
- transposeChars: function(cm) {
- var cur = cm.getCursor(),
- line = cm.getLine(cur.line)
- if (cur.ch > 0 && cur.ch < line.length - 1)
- cm.replaceRange(
- line.charAt(cur.ch) + line.charAt(cur.ch - 1),
- {
- line: cur.line,
- ch: cur.ch - 1
- },
- {
- line: cur.line,
- ch: cur.ch + 1
- }
- )
- },
- newlineAndIndent: function(cm) {
- cm.replaceSelection('\n', 'end')
- cm.indentLine(cm.getCursor().line)
- },
- toggleOverwrite: function(cm) {
- cm.toggleOverwrite()
- }
-})
-var keyMap = (CodeMirror.keyMap = {})
-keyMap.basic = {
- Left: 'goCharLeft',
- Right: 'goCharRight',
- Up: 'goLineUp',
- Down: 'goLineDown',
- End: 'goLineEnd',
- Home: 'goLineStartSmart',
- PageUp: 'goPageUp',
- PageDown: 'goPageDown',
- Delete: 'delCharRight',
- Backspace: 'delCharLeft',
- Tab: 'defaultTab',
- 'Shift-Tab': 'indentAuto',
- Enter: 'newlineAndIndent',
- Insert: 'toggleOverwrite'
-}
-keyMap.pcDefault = {
- 'Ctrl-A': 'selectAll',
- 'Ctrl-D': 'deleteLine',
- 'Ctrl-Z': 'undo',
- 'Shift-Ctrl-Z': 'redo',
- 'Ctrl-Y': 'redo',
- 'Ctrl-Home': 'goDocStart',
- 'Alt-Up': 'goDocStart',
- 'Ctrl-End': 'goDocEnd',
- 'Ctrl-Down': 'goDocEnd',
- 'Ctrl-Left': 'goWordLeft',
- 'Ctrl-Right': 'goWordRight',
- 'Alt-Left': 'goLineStart',
- 'Alt-Right': 'goLineEnd',
- 'Ctrl-Backspace': 'delWordLeft',
- 'Ctrl-Delete': 'delWordRight',
- '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',
- fallthrough: 'basic'
-}
-keyMap.macDefault = {
- 'Cmd-A': 'selectAll',
- 'Cmd-D': 'deleteLine',
- 'Cmd-Z': 'undo',
- 'Shift-Cmd-Z': 'redo',
- 'Cmd-Y': 'redo',
- 'Cmd-Up': 'goDocStart',
- 'Cmd-End': 'goDocEnd',
- 'Cmd-Down': 'goDocEnd',
- 'Alt-Left': 'goWordLeft',
- 'Alt-Right': 'goWordRight',
- 'Cmd-Left': 'goLineStart',
- 'Cmd-Right': 'goLineEnd',
- 'Alt-Backspace': 'delWordLeft',
- 'Ctrl-Alt-Backspace': 'delWordRight',
- 'Alt-Delete': 'delWordRight',
- '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',
- fallthrough: ['basic', 'emacsy']
-}
-keyMap['default'] = mac ? keyMap.macDefault : keyMap.pcDefault
-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': 'delCharRight',
- 'Ctrl-H': 'delCharLeft',
- 'Alt-D': 'delWordRight',
- 'Alt-Backspace': 'delWordLeft',
- 'Ctrl-K': 'killLine',
- 'Ctrl-T': 'transposeChars'
-}
-
-function getKeyMap(val) {
- if (typeof val == 'string') return keyMap[val]
- else return val
-}
-
-function lookupKey(name, extraMap, map, handle, stop) {
- function lookup(map) {
- map = getKeyMap(map)
- var found = map[name]
- if (found === false) {
- if (stop) stop()
- return true
- }
- if (found != null && handle(found)) return true
- if (map.nofallthrough) {
- if (stop) stop()
- return true
- }
- var fallthrough = map.fallthrough
- if (fallthrough == null) return false
- if (Object.prototype.toString.call(fallthrough) != '[object Array]')
- return lookup(fallthrough)
- for (var i = 0, e = fallthrough.length; i < e; ++i) {
- if (lookup(fallthrough[i])) return true
- }
- return false
- }
- if (extraMap && lookup(extraMap)) return true
- return lookup(map)
-}
-
-function isModifierKey(event) {
- var name = keyNames[e_prop(event, 'keyCode')]
- return name == 'Ctrl' || name == 'Alt' || name == 'Shift' || name == 'Mod'
-}
-CodeMirror.isModifierKey = isModifierKey
-CodeMirror.fromTextArea = function(textarea, options) {
- if (!options) options = {}
- options.value = textarea.value
- if (!options.tabindex && textarea.tabindex)
- options.tabindex = textarea.tabindex
- if (options.autofocus == null) {
- var hasFocus = document.body
- try {
- hasFocus = document.activeElement
- } catch (e) {}
- options.autofocus =
- hasFocus == textarea ||
- (textarea.getAttribute('autofocus') != null && hasFocus == document.body)
- }
-
- function save() {
- textarea.value = instance.getValue()
- }
- if (textarea.form) {
- var rmSubmit = connect(
- textarea.form,
- 'submit',
- save,
- true
- )
- var realSubmit = textarea.form.submit
- textarea.form.submit = function wrappedSubmit() {
- save()
- textarea.form.submit = realSubmit
- textarea.form.submit()
- textarea.form.submit = wrappedSubmit
- }
- }
- textarea.style.display = 'none'
- var instance = CodeMirror(function(node) {
- textarea.parentNode.insertBefore(node, textarea.nextSibling)
- }, options)
- instance.save = save
- instance.getTextArea = function() {
- return textarea
- }
- instance.toTextArea = function() {
- save()
- textarea.parentNode.removeChild(instance.getWrapperElement())
- textarea.style.display = ''
- if (textarea.form) {
- rmSubmit()
- if (typeof textarea.form.submit == 'function')
- textarea.form.submit = realSubmit
- }
- }
- return instance
-}
-var gecko = /gecko\/\d{7}/i.test(navigator.userAgent)
-var ie = /MSIE \d/.test(navigator.userAgent)
-var ie_lt8 = /MSIE [1-7]\b/.test(navigator.userAgent)
-var ie_lt9 = /MSIE [1-8]\b/.test(navigator.userAgent)
-var quirksMode = ie && document.documentMode == 5
-var webkit = /WebKit\//.test(navigator.userAgent)
-var chrome = /Chrome\//.test(navigator.userAgent)
-var opera = /Opera\//.test(navigator.userAgent)
-var safari = /Apple Computer/.test(navigator.vendor)
-var khtml = /KHTML\//.test(navigator.userAgent)
-var mac_geLion = /Mac OS X 10\D([7-9]|\d\d)\D/.test(navigator.userAgent)
-
-function copyState(mode, state) {
- if (state === true) return state
- if (mode.copyState) return mode.copyState(state)
- var nstate = {}
- for (var n in state) {
- var val = state[n]
- if (val instanceof Array) val = val.concat([])
- nstate[n] = val
- }
- return nstate
-}
-CodeMirror.copyState = copyState
-
-function startState(mode, a1, a2) {
- return mode.startState ? mode.startState(a1, a2) : true
-}
-CodeMirror.startState = startState
-CodeMirror.innerMode = function(mode, state) {
- while (mode.innerMode) {
- var info = mode.innerMode(state)
- state = info.state
- mode = info.mode
- }
- return (
- info || {
- mode: mode,
- state: state
- }
- )
-}
-
-function StringStream(string, tabSize) {
- this.pos = this.start = 0
- this.string = string
- this.tabSize = tabSize || 8
-}
-StringStream.prototype = {
- eol: function() {
- return this.pos >= this.string.length
- },
- sol: function() {
- return this.pos == 0
- },
- peek: function() {
- return this.string.charAt(this.pos) || undefined
- },
- next: function() {
- if (this.pos < this.string.length) return this.string.charAt(this.pos++)
- },
- eat: function(match) {
- var ch = this.string.charAt(this.pos)
- if (typeof match == 'string') var ok = ch == match
- else var ok = ch && (match.test ? match.test(ch) : match(ch))
- if (ok) {
- ++this.pos
- return ch
- }
- },
- eatWhile: function(match) {
- var start = this.pos
- while (this.eat(match)) {}
- return this.pos > start
- },
- eatSpace: function() {
- var start = this.pos
- while (/[\s\u00a0]/.test(this.string.charAt(this.pos))) ++this.pos
- return this.pos > start
- },
- skipToEnd: function() {
- this.pos = this.string.length
- },
- skipTo: function(ch) {
- var found = this.string.indexOf(ch, this.pos)
- if (found > -1) {
- this.pos = found
- return true
- }
- },
- backUp: function(n) {
- this.pos -= n
- },
- column: function() {
- return countColumn(this.string, this.start, this.tabSize)
- },
- indentation: function() {
- return countColumn(this.string, null, this.tabSize)
- },
- match: function(pattern, consume, caseInsensitive) {
- if (typeof pattern == 'string') {
- var cased = function(str) {
- return caseInsensitive ? str.toLowerCase() : str
- }
- if (cased(this.string).indexOf(cased(pattern), this.pos) == this.pos) {
- if (consume !== false) this.pos += pattern.length
- return true
- }
- } else {
- var 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: function() {
- return this.string.slice(this.start, this.pos)
- }
-}
-CodeMirror.StringStream = StringStream
-
-function MarkedSpan(from, to, marker) {
- this.from = from
- this.to = to
- this.marker = marker
-}
-
-function getMarkedSpanFor(spans, marker) {
- if (spans)
- for (var i = 0; i < spans.length; ++i) {
- var span = spans[i]
- if (span.marker == marker) return span
- }
-}
-
-function removeMarkedSpan(spans, span) {
- var r
- for (var i = 0; i < spans.length; ++i)
- if (spans[i] != span) (r || (r = [])).push(spans[i])
- return r
-}
-
-function markedSpansBefore(old, startCh, endCh) {
- if (old)
- for (var i = 0, nw; i < old.length; ++i) {
- var span = old[i],
- marker = span.marker
- var startsBefore =
- span.from == null ||
- (marker.inclusiveLeft ? span.from <= startCh : span.from < startCh)
- if (
- startsBefore ||
- (marker.type == 'bookmark' &&
- span.from == startCh &&
- span.from != endCh)
- ) {
- var endsAfter =
- span.to == null ||
- (marker.inclusiveRight ? span.to >= startCh : span.to > startCh)
- ;(nw || (nw = [])).push({
- from: span.from,
- to: endsAfter ? null : span.to,
- marker: marker
- })
- }
- }
- return nw
-}
-
-function markedSpansAfter(old, endCh) {
- if (old)
- for (var i = 0, nw; i < old.length; ++i) {
- var span = old[i],
- marker = span.marker
- var endsAfter =
- span.to == null ||
- (marker.inclusiveRight ? span.to >= endCh : span.to > endCh)
- if (endsAfter || (marker.type == 'bookmark' && span.from == endCh)) {
- var startsBefore =
- span.from == null ||
- (marker.inclusiveLeft ? span.from <= endCh : span.from < endCh)
- ;(nw || (nw = [])).push({
- from: startsBefore ? null : span.from - endCh,
- to: span.to == null ? null : span.to - endCh,
- marker: marker
- })
- }
- }
- return nw
-}
-
-function updateMarkedSpans(oldFirst, oldLast, startCh, endCh, newText) {
- if (!oldFirst && !oldLast) return newText
- var first = markedSpansBefore(oldFirst, startCh)
- var last = markedSpansAfter(oldLast, endCh)
- var sameLine = newText.length == 1,
- offset = lst(newText).length + (sameLine ? startCh : 0)
- if (first) {
- for (var i = 0; i < first.length; ++i) {
- var span = first[i]
- if (span.to == null) {
- var found = getMarkedSpanFor(last, span.marker)
- if (!found) span.to = startCh
- else if (sameLine) span.to = found.to == null ? null : found.to + offset
- }
- }
- }
- if (last) {
- for (var i = 0; i < last.length; ++i) {
- var span = last[i]
- if (span.to != null) span.to += offset
- if (span.from == null) {
- var 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)
- }
- }
- }
- var newMarkers = [newHL(newText[0], first)]
- if (!sameLine) {
- var gap = newText.length - 2,
- gapMarkers
- if (gap > 0 && first)
- for (var i = 0; i < first.length; ++i)
- if (first[i].to == null)
- (gapMarkers || (gapMarkers = [])).push({
- from: null,
- to: null,
- marker: first[i].marker
- })
- for (var i = 0; i < gap; ++i)
- newMarkers.push(newHL(newText[i + 1], gapMarkers))
- newMarkers.push(newHL(lst(newText), last))
- }
- return newMarkers
-}
-
-function hlText(val) {
- return typeof val == 'string' ? val : val.text
-}
-
-function hlSpans(val) {
- if (typeof val == 'string') return null
- var spans = val.markedSpans,
- out = null
- for (var 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
-}
-
-function newHL(text, spans) {
- return spans
- ? {
- text: text,
- markedSpans: spans
- }
- : text
-}
-
-function detachMarkedSpans(line) {
- var spans = line.markedSpans
- if (!spans) return
- for (var i = 0; i < spans.length; ++i) {
- var lines = spans[i].marker.lines
- var ix = indexOf(lines, line)
- lines.splice(ix, 1)
- }
- line.markedSpans = null
-}
-
-function attachMarkedSpans(line, spans) {
- if (!spans) return
- for (var i = 0; i < spans.length; ++i)
- var marker = spans[i].marker.lines.push(line)
- line.markedSpans = spans
-}
-var eolSpanContent = ' '
-if (gecko || (ie && !ie_lt8)) eolSpanContent = '\u200b'
-else if (opera) eolSpanContent = ''
-
-function Line(text, markedSpans) {
- this.text = text
- this.height = 1
- attachMarkedSpans(this, markedSpans)
-}
-Line.prototype = {
- update: function(text, markedSpans) {
- this.text = text
- this.stateAfter = this.styles = null
- detachMarkedSpans(this)
- attachMarkedSpans(this, markedSpans)
- },
- highlight: function(mode, state, tabSize) {
- var stream = new StringStream(this.text, tabSize),
- st = this.styles || (this.styles = [])
- var pos = (st.length = 0)
- if (this.text == '' && mode.blankLine) mode.blankLine(state)
- while (!stream.eol()) {
- var style = mode.token(stream, state),
- substr = stream.current()
- stream.start = stream.pos
- if (pos && st[pos - 1] == style) {
- st[pos - 2] += substr
- } else if (substr) {
- st[pos++] = substr
- st[pos++] = style
- }
- if (stream.pos > 5000) {
- st[pos++] = this.text.slice(stream.pos)
- st[pos++] = null
- break
- }
- }
- },
- process: function(mode, state, tabSize) {
- var stream = new StringStream(this.text, tabSize)
- if (this.text == '' && mode.blankLine) mode.blankLine(state)
- while (!stream.eol() && stream.pos <= 5000) {
- mode.token(stream, state)
- stream.start = stream.pos
- }
- },
- getTokenAt: function(mode, state, tabSize, ch) {
- var txt = this.text,
- stream = new StringStream(txt, tabSize)
- while (stream.pos < ch && !stream.eol()) {
- stream.start = stream.pos
- var style = mode.token(stream, state)
- }
- return {
- start: stream.start,
- end: stream.pos,
- string: stream.current(),
- className: style || null,
- state: state
- }
- },
- indentation: function(tabSize) {
- return countColumn(this.text, null, tabSize)
- },
- getContent: function(tabSize, wrapAt, compensateForWrapping) {
- var first = true,
- col = 0,
- specials = /[\t\u0000-\u0019\u200b\u2028\u2029\uFEFF]/g
- var pre = elt('pre')
-
- function span_(html, text, style) {
- if (!text) return
- if (first && ie && text.charAt(0) == ' ') text = '\u00a0' + text.slice(1)
- first = false
- if (!specials.test(text)) {
- col += text.length
- var content = document.createTextNode(text)
- } else {
- var content = document.createDocumentFragment(),
- pos = 0
- while (true) {
- specials.lastIndex = pos
- var m = specials.exec(text)
- var skipped = m ? m.index - pos : text.length - pos
- if (skipped) {
- content.appendChild(
- document.createTextNode(text.slice(pos, pos + skipped))
- )
- col += skipped
- }
- if (!m) break
- pos += skipped + 1
- if (m[0] == '\t') {
- var tabWidth = tabSize - (col % tabSize)
- content.appendChild(elt('span', spaceStr(tabWidth), 'cm-tab'))
- col += tabWidth
- } else {
- var token = elt('span', '\u2022', 'cm-invalidchar')
- token.title = '\\u' + m[0].charCodeAt(0).toString(16)
- content.appendChild(token)
- col += 1
- }
- }
- }
- if (style) html.appendChild(elt('span', [content], style))
- else html.appendChild(content)
- }
- var span = span_
- if (wrapAt != null) {
- var outPos = 0,
- anchor = (pre.anchor = elt('span'))
- span = function(html, text, style) {
- var l = text.length
- if (wrapAt >= outPos && wrapAt < outPos + l) {
- var cut = wrapAt - outPos
- if (cut) {
- span_(html, text.slice(0, cut), style)
- if (compensateForWrapping) {
- var view = text.slice(cut - 1, cut + 1)
- if (spanAffectsWrapping.test(view)) html.appendChild(elt('wbr'))
- else if (!ie_lt8 && /\w\w/.test(view))
- html.appendChild(document.createTextNode('\u200d'))
- }
- }
- html.appendChild(anchor)
- span_(
- anchor,
- opera ? text.slice(cut, cut + 1) : text.slice(cut),
- style
- )
- if (opera) span_(html, text.slice(cut + 1), style)
- wrapAt--
- outPos += l
- } else {
- outPos += l
- span_(html, text, style)
- if (outPos == wrapAt && outPos == len) {
- setTextContent(anchor, eolSpanContent)
- html.appendChild(anchor)
- } else if (outPos > wrapAt + 10 && /\s/.test(text))
- span = function() {}
- }
- }
- }
- var st = this.styles,
- allText = this.text,
- marked = this.markedSpans
- var len = allText.length
-
- function styleToClass(style) {
- if (!style) return null
- return 'cm-' + style.replace(/ +/g, ' cm-')
- }
- if (!allText && wrapAt == null) {
- span(pre, ' ')
- } else if (!marked || !marked.length) {
- for (var i = 0, ch = 0; ch < len; i += 2) {
- var str = st[i],
- style = st[i + 1],
- l = str.length
- if (ch + l > len) str = str.slice(0, len - ch)
- ch += l
- span(pre, str, styleToClass(style))
- }
- } else {
- marked.sort(function(a, b) {
- return a.from - b.from
- })
- var pos = 0,
- i = 0,
- text = '',
- style,
- sg = 0
- var nextChange = marked[0].from || 0,
- marks = [],
- markpos = 0
- var advanceMarks = function() {
- var m
- while (
- markpos < marked.length &&
- ((m = marked[markpos]).from == pos || m.from == null)
- ) {
- if (m.marker.type == 'range') marks.push(m)
- ++markpos
- }
- nextChange = markpos < marked.length ? marked[markpos].from : Infinity
- for (var i = 0; i < marks.length; ++i) {
- var to = marks[i].to
- if (to == null) to = Infinity
- if (to == pos) marks.splice(i--, 1)
- else nextChange = Math.min(to, nextChange)
- }
- }
- var m = 0
- while (pos < len) {
- if (nextChange == pos) advanceMarks()
- var upto = Math.min(len, nextChange)
- while (true) {
- if (text) {
- var end = pos + text.length
- var appliedStyle = style
- for (var j = 0; j < marks.length; ++j) {
- var mark = marks[j]
- appliedStyle =
- (appliedStyle ? appliedStyle + ' ' : '') + mark.marker.style
- if (mark.marker.endStyle && mark.to === Math.min(end, upto))
- appliedStyle += ' ' + mark.marker.endStyle
- if (mark.marker.startStyle && mark.from === pos)
- appliedStyle += ' ' + mark.marker.startStyle
- }
- span(
- pre,
- end > upto ? text.slice(0, upto - pos) : text,
- appliedStyle
- )
- if (end >= upto) {
- text = text.slice(upto - pos)
- pos = upto
- break
- }
- pos = end
- }
- text = st[i++]
- style = styleToClass(st[i++])
- }
- }
- }
- return pre
- },
- cleanUp: function() {
- this.parent = null
- detachMarkedSpans(this)
- }
-}
-
-function LeafChunk(lines) {
- this.lines = lines
- this.parent = null
- for (var i = 0, e = lines.length, height = 0; i < e; ++i) {
- lines[i].parent = this
- height += lines[i].height
- }
- this.height = height
-}
-LeafChunk.prototype = {
- chunkSize: function() {
- return this.lines.length
- },
- remove: function(at, n, callbacks) {
- for (var i = at, e = at + n; i < e; ++i) {
- var line = this.lines[i]
- this.height -= line.height
- line.cleanUp()
- if (line.handlers)
- for (var j = 0; j < line.handlers.length; ++j)
- callbacks.push(line.handlers[j])
- }
- this.lines.splice(at, n)
- },
- collapse: function(lines) {
- lines.splice.apply(lines, [lines.length, 0].concat(this.lines))
- },
- insertHeight: function(at, lines, height) {
- this.height += height
- this.lines = this.lines
- .slice(0, at)
- .concat(lines)
- .concat(this.lines.slice(at))
- for (var i = 0, e = lines.length; i < e; ++i) lines[i].parent = this
- },
- iterN: function(at, n, op) {
- for (var e = at + n; at < e; ++at) if (op(this.lines[at])) return true
- }
-}
-
-function BranchChunk(children) {
- this.children = children
- var size = 0,
- height = 0
- for (var i = 0, e = children.length; i < e; ++i) {
- var ch = children[i]
- size += ch.chunkSize()
- height += ch.height
- ch.parent = this
- }
- this.size = size
- this.height = height
- this.parent = null
-}
-BranchChunk.prototype = {
- chunkSize: function() {
- return this.size
- },
- remove: function(at, n, callbacks) {
- this.size -= n
- for (var i = 0; i < this.children.length; ++i) {
- var child = this.children[i],
- sz = child.chunkSize()
- if (at < sz) {
- var rm = Math.min(n, sz - at),
- oldHeight = child.height
- child.remove(at, rm, callbacks)
- 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 (this.size - n < 25) {
- var lines = []
- this.collapse(lines)
- this.children = [new LeafChunk(lines)]
- this.children[0].parent = this
- }
- },
- collapse: function(lines) {
- for (var i = 0, e = this.children.length; i < e; ++i)
- this.children[i].collapse(lines)
- },
- insert: function(at, lines) {
- var height = 0
- for (var i = 0, e = lines.length; i < e; ++i) height += lines[i].height
- this.insertHeight(at, lines, height)
- },
- insertHeight: function(at, lines, height) {
- this.size += lines.length
- this.height += height
- for (var i = 0, e = this.children.length; i < e; ++i) {
- var child = this.children[i],
- sz = child.chunkSize()
- if (at <= sz) {
- child.insertHeight(at, lines, height)
- if (child.lines && child.lines.length > 50) {
- while (child.lines.length > 50) {
- var spilled = child.lines.splice(child.lines.length - 25, 25)
- var newleaf = new LeafChunk(spilled)
- child.height -= newleaf.height
- this.children.splice(i + 1, 0, newleaf)
- newleaf.parent = this
- }
- this.maybeSpill()
- }
- break
- }
- at -= sz
- }
- },
- maybeSpill: function() {
- if (this.children.length <= 10) return
- var me = this
- do {
- var spilled = me.children.splice(me.children.length - 5, 5)
- var sibling = new BranchChunk(spilled)
- if (!me.parent) {
- var copy = new BranchChunk(me.children)
- copy.parent = me
- me.children = [copy, sibling]
- me = copy
- } else {
- me.size -= sibling.size
- me.height -= sibling.height
- var 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()
- },
- iter: function(from, to, op) {
- this.iterN(from, to - from, op)
- },
- iterN: function(at, n, op) {
- for (var i = 0, e = this.children.length; i < e; ++i) {
- var child = this.children[i],
- sz = child.chunkSize()
- if (at < sz) {
- var used = Math.min(n, sz - at)
- if (child.iterN(at, used, op)) return true
- if ((n -= used) == 0) break
- at = 0
- } else at -= sz
- }
- }
-}
-
-function getLineAt(chunk, n) {
- while (!chunk.lines) {
- for (var i = 0; ; ++i) {
- var child = chunk.children[i],
- sz = child.chunkSize()
- if (n < sz) {
- chunk = child
- break
- }
- n -= sz
- }
- }
- return chunk.lines[n]
-}
-
-function lineNo(line) {
- if (line.parent == null) return null
- var cur = line.parent,
- no = indexOf(cur.lines, line)
- for (var chunk = cur.parent; chunk; cur = chunk, chunk = chunk.parent) {
- for (var i = 0, e = chunk.children.length; ; ++i) {
- if (chunk.children[i] == cur) break
- no += chunk.children[i].chunkSize()
- }
- }
- return no
-}
-
-function lineAtHeight(chunk, h) {
- var n = 0
- outer: do {
- for (var i = 0, e = chunk.children.length; i < e; ++i) {
- var child = chunk.children[i],
- ch = child.height
- if (h < ch) {
- chunk = child
- continue outer
- }
- h -= ch
- n += child.chunkSize()
- }
- return n
- } while (!chunk.lines)
- for (var i = 0, e = chunk.lines.length; i < e; ++i) {
- var line = chunk.lines[i],
- lh = line.height
- if (h < lh) break
- h -= lh
- }
- return n + i
-}
-
-function heightAtLine(chunk, n) {
- var h = 0
- outer: do {
- for (var i = 0, e = chunk.children.length; i < e; ++i) {
- var child = chunk.children[i],
- sz = child.chunkSize()
- if (n < sz) {
- chunk = child
- continue outer
- }
- n -= sz
- h += child.height
- }
- return h
- } while (!chunk.lines)
- for (var i = 0; i < n; ++i) h += chunk.lines[i].height
- return h
-}
-
-function History() {
- this.time = 0
- this.done = []
- this.undone = []
- this.compound = 0
- this.closed = false
-}
-History.prototype = {
- addChange: function(start, added, old) {
- this.undone.length = 0
- var time = +new Date(),
- cur = lst(this.done),
- last = cur && lst(cur)
- var dtime = time - this.time
- if (cur && !this.closed && this.compound) {
- cur.push({
- start: start,
- added: added,
- old: old
- })
- } else if (
- dtime > 400 ||
- !last ||
- this.closed ||
- last.start > start + old.length ||
- last.start + last.added < start
- ) {
- this.done.push([
- {
- start: start,
- added: added,
- old: old
- }
- ])
- this.closed = false
- } else {
- var startBefore = Math.max(0, last.start - start),
- endAfter = Math.max(0, start + old.length - (last.start + last.added))
- for (var i = startBefore; i > 0; --i) last.old.unshift(old[i - 1])
- for (var i = endAfter; i > 0; --i) last.old.push(old[old.length - i])
- if (startBefore) last.start = start
- last.added += added - (old.length - startBefore - endAfter)
- }
- this.time = time
- },
- startCompound: function() {
- if (!this.compound++) this.closed = true
- },
- endCompound: function() {
- if (!--this.compound) this.closed = true
- }
-}
-
-function stopMethod() {
- e_stop(this)
-}
-
-function addStop(event) {
- if (!event.stop) event.stop = stopMethod
- return event
-}
-
-function e_preventDefault(e) {
- if (e.preventDefault) e.preventDefault()
- else e.returnValue = false
-}
-
-function e_stopPropagation(e) {
- if (e.stopPropagation) e.stopPropagation()
- else e.cancelBubble = true
-}
-
-function e_stop(e) {
- e_preventDefault(e)
- e_stopPropagation(e)
-}
-CodeMirror.e_stop = e_stop
-CodeMirror.e_preventDefault = e_preventDefault
-CodeMirror.e_stopPropagation = e_stopPropagation
-
-function e_target(e) {
- return e.target || e.srcElement
-}
-
-function e_button(e) {
- var 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
-}
-
-function e_prop(e, prop) {
- var overridden = e.override && e.override.hasOwnProperty(prop)
- return overridden ? e.override[prop] : e[prop]
-}
-
-function connect(node, type, handler, disconnect) {
- if (typeof node.addEventListener == 'function') {
- node.addEventListener(type, handler, false)
- if (disconnect)
- return function() {
- node.removeEventListener(type, handler, false)
- }
- } else {
- var wrapHandler = function(event) {
- handler(event || window.event)
- }
- node.attachEvent('on' + type, wrapHandler)
- if (disconnect)
- return function() {
- node.detachEvent('on' + type, wrapHandler)
- }
- }
-}
-CodeMirror.connect = connect
-
-function Delayed() {
- this.id = null
-}
-Delayed.prototype = {
- set: function(ms, f) {
- clearTimeout(this.id)
- this.id = setTimeout(f, ms)
- }
-}
-var Pass = (CodeMirror.Pass = {
- toString: function() {
- return 'CodeMirror.Pass'
- }
-})
-var dragAndDrop = (function() {
- if (ie_lt9) return false
- var div = elt('div')
- return 'draggable' in div || 'dragDrop' in div
-})()
-var lineSep = (function() {
- var te = elt('textarea')
- te.value = 'foo\nbar'
- if (te.value.indexOf('\r') > -1) return '\r\n'
- return '\n'
-})()
-var spanAffectsWrapping = /^$/
-if (gecko) spanAffectsWrapping = /$'/
-else if (safari) spanAffectsWrapping = /\-[^ \-?]|\?[^ !'\"\),.\-\/:;\?\]\}]/
-else if (chrome)
- spanAffectsWrapping = /\-[^ \-\.?]|\?[^ \-\.?\]\}:;!'\"\),\/]|[\.!\"#&%\)*+,:;=>\]|\}~][\(\{\[<]|\$'/
-
-function countColumn(string, end, tabSize) {
- if (end == null) {
- end = string.search(/[^\s\u00a0]/)
- if (end == -1) end = string.length
- }
- for (var i = 0, n = 0; i < end; ++i) {
- if (string.charAt(i) == '\t') n += tabSize - (n % tabSize)
- else ++n
- }
- return n
-}
-
-function eltOffset(node, screen) {
- try {
- var box = node.getBoundingClientRect()
- box = {
- top: box.top,
- left: box.left
- }
- } catch (e) {
- box = {
- top: 0,
- left: 0
- }
- }
- if (!screen) {
- if (window.pageYOffset == null) {
- var t = document.documentElement || document.body.parentNode
- if (t.scrollTop == null) t = document.body
- box.top += t.scrollTop
- box.left += t.scrollLeft
- } else {
- box.top += window.pageYOffset
- box.left += window.pageXOffset
- }
- }
- return box
-}
-
-function eltText(node) {
- return node.textContent || node.innerText || node.nodeValue || ''
-}
-var spaceStrs = ['']
-
-function spaceStr(n) {
- while (spaceStrs.length <= n) spaceStrs.push(lst(spaceStrs) + ' ')
- return spaceStrs[n]
-}
-
-function lst(arr) {
- return arr[arr.length - 1]
-}
-
-function selectInput(node) {
- if (ios) {
- node.selectionStart = 0
- node.selectionEnd = node.value.length
- } else node.select()
-}
-
-function posEq(a, b) {
- return a.line == b.line && a.ch == b.ch
-}
-
-function posLess(a, b) {
- return a.line < b.line || (a.line == b.line && a.ch < b.ch)
-}
-
-function copyPos(x) {
- return {
- line: x.line,
- ch: x.ch
- }
-}
-
-function elt(tag, content, className, style) {
- var e = document.createElement(tag)
- if (className) e.className = className
- if (style) e.style.cssText = style
- if (typeof content == 'string') setTextContent(e, content)
- else if (content)
- for (var i = 0; i < content.length; ++i) e.appendChild(content[i])
- return e
-}
-
-function removeChildren(e) {
- e.innerHTML = ''
- return e
-}
-
-function removeChildrenAndAdd(parent, e) {
- removeChildren(parent).appendChild(e)
-}
-
-function setTextContent(e, str) {
- if (ie_lt9) {
- e.innerHTML = ''
- e.appendChild(document.createTextNode(str))
- } else e.textContent = str
-}
-
-function editEnd(from, to) {
- if (!to) return 0
- if (!from) return to.length
- for (var i = from.length, j = to.length; i >= 0 && j >= 0; --i, --j)
- if (from.charAt(i) != to.charAt(j)) break
- return j + 1
-}
-
-function indexOf(collection, elt) {
- if (collection.indexOf) return collection.indexOf(elt)
- for (var i = 0, e = collection.length; i < e; ++i)
- if (collection[i] == elt) return i
- return -1
-}
-var nonASCIISingleCaseWordChar = /[\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc]/
-
-function isWordChar(ch) {
- return (
- /\w/.test(ch) ||
- (ch > '\x80' &&
- (ch.toUpperCase() != ch.toLowerCase() ||
- nonASCIISingleCaseWordChar.test(ch)))
- )
-}
-var splitLines =
- '\n\nb'.split(/\n/).length != 3
- ? function(string) {
- var pos = 0,
- result = [],
- l = string.length
- while (pos <= l) {
- var nl = string.indexOf('\n', pos)
- if (nl == -1) nl = string.length
- var line = string.slice(
- pos,
- string.charAt(nl - 1) == '\r' ? nl - 1 : nl
- )
- var 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
- }
- : function(string) {
- return string.split(/\r\n?|\n/)
- }
-CodeMirror.splitLines = splitLines
-var hasSelection = window.getSelection
- ? function(te) {
- try {
- return te.selectionStart != te.selectionEnd
- } catch (e) {
- return false
- }
- }
- : function(te) {
- try {
- var range = te.ownerDocument.selection.createRange()
- } catch (e) {}
- if (!range || range.parentElement() != te) return false
- return range.compareEndPoints('StartToEnd', range) != 0
- }
-CodeMirror.defineMode('null', function() {
- return {
- token: function(stream) {
- stream.skipToEnd()
- }
- }
-})
-CodeMirror.defineMIME('text/plain', 'null')
-var 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: ';',
- 91: 'Mod',
- 92: 'Mod',
- 93: 'Mod',
- 109: '-',
- 107: '=',
- 127: 'Delete',
- 186: ';',
- 187: '=',
- 188: ',',
- 189: '-',
- 190: '.',
- 191: '/',
- 192: '`',
- 219: '[',
- 220: '\\',
- 221: ']',
- 222: "'",
- 63276: 'PageUp',
- 63277: 'PageDown',
- 63275: 'End',
- 63273: 'Home',
- 63234: 'Left',
- 63232: 'Up',
- 63235: 'Right',
- 63233: 'Down',
- 63302: 'Insert',
- 63272: 'Delete'
-}
-CodeMirror.keyNames = keyNames
-;(function() {
- for (var i = 0; i < 10; i++) keyNames[i + 48] = String(i)
- for (var i = 65; i <= 90; i++) keyNames[i] = String.fromCharCode(i)
- for (var i = 1; i <= 12; i++)
- keyNames[i + 111] = keyNames[i + 63235] = 'F' + i
-})()
-CodeMirror.version = '2.36'
-export default CodeMirror
diff --git a/src/codemirror/index.js b/src/codemirror/index.js
deleted file mode 100644
index 993e8f8..0000000
--- a/src/codemirror/index.js
+++ /dev/null
@@ -1,2143 +0,0 @@
-/**
- *
- * @authors yutent (yutent.io@gmail.com)
- * @date 2018-08-04 18:47:35
- */
-
-'use strict'
-
-import CodeMirror from './codemirror'
-import 'css/codemirror-dark.scss'
-
-CodeMirror.defineMode(
- 'htmlmixed',
- function(config) {
- var htmlMode = CodeMirror.getMode(config, {
- name: 'xml',
- htmlMode: true
- })
- var jsMode = CodeMirror.getMode(config, 'javascript')
- var cssMode = CodeMirror.getMode(config, 'css')
-
- function html(stream, state) {
- var style = htmlMode.token(stream, state.htmlState)
- if (
- style == 'tag' &&
- stream.current() == '>' &&
- state.htmlState.context
- ) {
- if (/^script$/i.test(state.htmlState.context.tagName)) {
- state.token = javascript
- state.localState = jsMode.startState(
- htmlMode.indent(state.htmlState, '')
- )
- } else if (/^style$/i.test(state.htmlState.context.tagName)) {
- state.token = css
- state.localState = cssMode.startState(
- htmlMode.indent(state.htmlState, '')
- )
- }
- }
- return style
- }
-
- function maybeBackup(stream, pat, style) {
- var cur = stream.current()
- var close = cur.search(pat),
- m
- if (close > -1) stream.backUp(cur.length - close)
- else if ((m = cur.match(/<\/?$/))) {
- stream.backUp(cur.length)
- if (!stream.match(pat, false)) stream.match(cur[0])
- }
- return style
- }
-
- function javascript(stream, state) {
- if (stream.match(/^<\/\s*script\s*>/i, false)) {
- state.token = html
- state.localState = null
- return html(stream, state)
- }
- return maybeBackup(
- stream,
- /<\/\s*script\s*>/,
- jsMode.token(stream, state.localState)
- )
- }
-
- function css(stream, state) {
- if (stream.match(/^<\/\s*style\s*>/i, false)) {
- state.token = html
- state.localState = null
- return html(stream, state)
- }
- return maybeBackup(
- stream,
- /<\/\s*style\s*>/,
- cssMode.token(stream, state.localState)
- )
- }
- return {
- startState: function() {
- var state = htmlMode.startState()
- return {
- token: html,
- localState: null,
- mode: 'html',
- htmlState: state
- }
- },
- copyState: function(state) {
- if (state.localState)
- var local = CodeMirror.copyState(
- state.token == css ? cssMode : jsMode,
- state.localState
- )
- return {
- token: state.token,
- localState: local,
- mode: state.mode,
- htmlState: CodeMirror.copyState(htmlMode, state.htmlState)
- }
- },
- token: function(stream, state) {
- return state.token(stream, state)
- },
- indent: function(state, textAfter) {
- if (state.token == html || /^\s*<\//.test(textAfter))
- return htmlMode.indent(state.htmlState, textAfter)
- else if (state.token == javascript)
- return jsMode.indent(state.localState, textAfter)
- else return cssMode.indent(state.localState, textAfter)
- },
- electricChars: '/{}:',
- innerMode: function(state) {
- var mode =
- state.token == html
- ? htmlMode
- : state.token == javascript
- ? jsMode
- : cssMode
- return {
- state: state.localState || state.htmlState,
- mode: mode
- }
- }
- }
- },
- 'xml',
- 'javascript',
- 'css'
-)
-
-CodeMirror.defineMIME('text/html', 'htmlmixed')
-
-CodeMirror.defineMode('css', function(config) {
- var indentUnit = config.indentUnit
- var type
- var atMediaTypes = keySet([
- 'all',
- 'aural',
- 'braille',
- 'handheld',
- 'print',
- 'projection',
- 'screen',
- 'tty',
- 'tv',
- 'embossed'
- ])
- var atMediaFeatures = keySet([
- 'width',
- 'min-width',
- 'max-width',
- 'height',
- 'min-height',
- 'max-height',
- 'device-width',
- 'min-device-width',
- 'max-device-width',
- 'device-height',
- 'min-device-height',
- 'max-device-height',
- 'aspect-ratio',
- 'min-aspect-ratio',
- 'max-aspect-ratio',
- 'device-aspect-ratio',
- 'min-device-aspect-ratio',
- 'max-device-aspect-ratio',
- 'color',
- 'min-color',
- 'max-color',
- 'color-index',
- 'min-color-index',
- 'max-color-index',
- 'monochrome',
- 'min-monochrome',
- 'max-monochrome',
- 'resolution',
- 'min-resolution',
- 'max-resolution',
- 'scan',
- 'grid'
- ])
- var propertyKeywords = keySet([
- 'align-content',
- 'align-items',
- 'align-self',
- 'alignment-adjust',
- 'alignment-baseline',
- 'anchor-point',
- 'animation',
- 'animation-delay',
- 'animation-direction',
- 'animation-duration',
- 'animation-iteration-count',
- 'animation-name',
- 'animation-play-state',
- 'animation-timing-function',
- 'appearance',
- 'azimuth',
- 'backface-visibility',
- 'background',
- 'background-attachment',
- 'background-clip',
- 'background-color',
- 'background-image',
- 'background-origin',
- 'background-position',
- 'background-repeat',
- 'background-size',
- 'baseline-shift',
- 'binding',
- 'bleed',
- 'bookmark-label',
- 'bookmark-level',
- 'bookmark-state',
- 'bookmark-target',
- 'border',
- 'border-bottom',
- 'border-bottom-color',
- 'border-bottom-left-radius',
- 'border-bottom-right-radius',
- 'border-bottom-style',
- 'border-bottom-width',
- 'border-collapse',
- 'border-color',
- 'border-image',
- 'border-image-outset',
- 'border-image-repeat',
- 'border-image-slice',
- 'border-image-source',
- 'border-image-width',
- 'border-left',
- 'border-left-color',
- 'border-left-style',
- 'border-left-width',
- 'border-radius',
- 'border-right',
- 'border-right-color',
- 'border-right-style',
- 'border-right-width',
- 'border-spacing',
- 'border-style',
- 'border-top',
- 'border-top-color',
- 'border-top-left-radius',
- 'border-top-right-radius',
- 'border-top-style',
- 'border-top-width',
- 'border-width',
- 'bottom',
- 'box-decoration-break',
- 'box-shadow',
- 'box-sizing',
- 'break-after',
- 'break-before',
- 'break-inside',
- 'caption-side',
- 'clear',
- 'clip',
- 'color',
- 'color-profile',
- 'column-count',
- 'column-fill',
- 'column-gap',
- 'column-rule',
- 'column-rule-color',
- 'column-rule-style',
- 'column-rule-width',
- 'column-span',
- 'column-width',
- 'columns',
- 'content',
- 'counter-increment',
- 'counter-reset',
- 'crop',
- 'cue',
- 'cue-after',
- 'cue-before',
- 'cursor',
- 'direction',
- 'display',
- 'dominant-baseline',
- 'drop-initial-after-adjust',
- 'drop-initial-after-align',
- 'drop-initial-before-adjust',
- 'drop-initial-before-align',
- 'drop-initial-size',
- 'drop-initial-value',
- 'elevation',
- 'empty-cells',
- 'fit',
- 'fit-position',
- 'flex',
- 'flex-basis',
- 'flex-direction',
- 'flex-flow',
- 'flex-grow',
- 'flex-shrink',
- 'flex-wrap',
- 'float',
- 'float-offset',
- 'font',
- 'font-feature-settings',
- 'font-family',
- 'font-kerning',
- 'font-language-override',
- 'font-size',
- 'font-size-adjust',
- 'font-stretch',
- 'font-style',
- 'font-synthesis',
- 'font-variant',
- 'font-variant-alternates',
- 'font-variant-caps',
- 'font-variant-east-asian',
- 'font-variant-ligatures',
- 'font-variant-numeric',
- 'font-variant-position',
- 'font-weight',
- 'grid-cell',
- 'grid-column',
- 'grid-column-align',
- 'grid-column-sizing',
- 'grid-column-span',
- 'grid-columns',
- 'grid-flow',
- 'grid-row',
- 'grid-row-align',
- 'grid-row-sizing',
- 'grid-row-span',
- 'grid-rows',
- 'grid-template',
- 'hanging-punctuation',
- 'height',
- 'hyphens',
- 'icon',
- 'image-orientation',
- 'image-rendering',
- 'image-resolution',
- 'inline-box-align',
- 'justify-content',
- 'left',
- 'letter-spacing',
- 'line-break',
- 'line-height',
- 'line-stacking',
- 'line-stacking-ruby',
- 'line-stacking-shift',
- 'line-stacking-strategy',
- 'list-style',
- 'list-style-image',
- 'list-style-position',
- 'list-style-type',
- 'margin',
- 'margin-bottom',
- 'margin-left',
- 'margin-right',
- 'margin-top',
- 'marker-offset',
- 'marks',
- 'marquee-direction',
- 'marquee-loop',
- 'marquee-play-count',
- 'marquee-speed',
- 'marquee-style',
- 'max-height',
- 'max-width',
- 'min-height',
- 'min-width',
- 'move-to',
- 'nav-down',
- 'nav-index',
- 'nav-left',
- 'nav-right',
- 'nav-up',
- 'opacity',
- 'order',
- 'orphans',
- 'outline',
- 'outline-color',
- 'outline-offset',
- 'outline-style',
- 'outline-width',
- 'overflow',
- 'overflow-style',
- 'overflow-wrap',
- 'overflow-x',
- 'overflow-y',
- 'padding',
- 'padding-bottom',
- 'padding-left',
- 'padding-right',
- 'padding-top',
- 'page',
- 'page-break-after',
- 'page-break-before',
- 'page-break-inside',
- 'page-policy',
- 'pause',
- 'pause-after',
- 'pause-before',
- 'perspective',
- 'perspective-origin',
- 'pitch',
- 'pitch-range',
- 'play-during',
- 'position',
- 'presentation-level',
- 'punctuation-trim',
- 'quotes',
- 'rendering-intent',
- 'resize',
- 'rest',
- 'rest-after',
- 'rest-before',
- 'richness',
- 'right',
- 'rotation',
- 'rotation-point',
- 'ruby-align',
- 'ruby-overhang',
- 'ruby-position',
- 'ruby-span',
- 'size',
- 'speak',
- 'speak-as',
- 'speak-header',
- 'speak-numeral',
- 'speak-punctuation',
- 'speech-rate',
- 'stress',
- 'string-set',
- 'tab-size',
- 'table-layout',
- 'target',
- 'target-name',
- 'target-new',
- 'target-position',
- 'text-align',
- 'text-align-last',
- 'text-decoration',
- 'text-decoration-color',
- 'text-decoration-line',
- 'text-decoration-skip',
- 'text-decoration-style',
- 'text-emphasis',
- 'text-emphasis-color',
- 'text-emphasis-position',
- 'text-emphasis-style',
- 'text-height',
- 'text-indent',
- 'text-justify',
- 'text-outline',
- 'text-shadow',
- 'text-space-collapse',
- 'text-transform',
- 'text-underline-position',
- 'text-wrap',
- 'top',
- 'transform',
- 'transform-origin',
- 'transform-style',
- 'transition',
- 'transition-delay',
- 'transition-duration',
- 'transition-property',
- 'transition-timing-function',
- 'unicode-bidi',
- 'vertical-align',
- 'visibility',
- 'voice-balance',
- 'voice-duration',
- 'voice-family',
- 'voice-pitch',
- 'voice-range',
- 'voice-rate',
- 'voice-stress',
- 'voice-volume',
- 'volume',
- 'white-space',
- 'widows',
- 'width',
- 'word-break',
- 'word-spacing',
- 'word-wrap',
- 'z-index'
- ])
- var colorKeywords = keySet([
- 'black',
- 'silver',
- 'gray',
- 'white',
- 'maroon',
- 'red',
- 'purple',
- 'fuchsia',
- 'green',
- 'lime',
- 'olive',
- 'yellow',
- 'navy',
- 'blue',
- 'teal',
- 'aqua'
- ])
- var valueKeywords = keySet([
- 'above',
- 'absolute',
- 'activeborder',
- 'activecaption',
- 'afar',
- 'after-white-space',
- 'ahead',
- 'alias',
- 'all',
- 'all-scroll',
- 'alternate',
- 'always',
- 'amharic',
- 'amharic-abegede',
- 'antialiased',
- 'appworkspace',
- 'arabic-indic',
- 'armenian',
- 'asterisks',
- 'auto',
- 'avoid',
- 'background',
- 'backwards',
- 'baseline',
- 'below',
- 'bidi-override',
- 'binary',
- 'bengali',
- 'blink',
- 'block',
- 'block-axis',
- 'bold',
- 'bolder',
- 'border',
- 'border-box',
- 'both',
- 'bottom',
- 'break-all',
- 'break-word',
- 'button',
- 'button-bevel',
- 'buttonface',
- 'buttonhighlight',
- 'buttonshadow',
- 'buttontext',
- 'cambodian',
- 'capitalize',
- 'caps-lock-indicator',
- 'caption',
- 'captiontext',
- 'caret',
- 'cell',
- 'center',
- 'checkbox',
- 'circle',
- 'cjk-earthly-branch',
- 'cjk-heavenly-stem',
- 'cjk-ideographic',
- 'clear',
- 'clip',
- 'close-quote',
- 'col-resize',
- 'collapse',
- 'compact',
- 'condensed',
- 'contain',
- 'content',
- 'content-box',
- 'context-menu',
- 'continuous',
- 'copy',
- 'cover',
- 'crop',
- 'cross',
- 'crosshair',
- 'currentcolor',
- 'cursive',
- 'dashed',
- 'decimal',
- 'decimal-leading-zero',
- 'default',
- 'default-button',
- 'destination-atop',
- 'destination-in',
- 'destination-out',
- 'destination-over',
- 'devanagari',
- 'disc',
- 'discard',
- 'document',
- 'dot-dash',
- 'dot-dot-dash',
- 'dotted',
- 'double',
- 'down',
- 'e-resize',
- 'ease',
- 'ease-in',
- 'ease-in-out',
- 'ease-out',
- 'element',
- 'ellipsis',
- 'embed',
- 'end',
- 'ethiopic',
- 'ethiopic-abegede',
- 'ethiopic-abegede-am-et',
- 'ethiopic-abegede-gez',
- 'ethiopic-abegede-ti-er',
- 'ethiopic-abegede-ti-et',
- 'ethiopic-halehame-aa-er',
- 'ethiopic-halehame-aa-et',
- 'ethiopic-halehame-am-et',
- 'ethiopic-halehame-gez',
- 'ethiopic-halehame-om-et',
- 'ethiopic-halehame-sid-et',
- 'ethiopic-halehame-so-et',
- 'ethiopic-halehame-ti-er',
- 'ethiopic-halehame-ti-et',
- 'ethiopic-halehame-tig',
- 'ew-resize',
- 'expanded',
- 'extra-condensed',
- 'extra-expanded',
- 'fantasy',
- 'fast',
- 'fill',
- 'fixed',
- 'flat',
- 'footnotes',
- 'forwards',
- 'from',
- 'geometricPrecision',
- 'georgian',
- 'graytext',
- 'groove',
- 'gujarati',
- 'gurmukhi',
- 'hand',
- 'hangul',
- 'hangul-consonant',
- 'hebrew',
- 'help',
- 'hidden',
- 'hide',
- 'higher',
- 'highlight',
- 'highlighttext',
- 'hiragana',
- 'hiragana-iroha',
- 'horizontal',
- 'hsl',
- 'hsla',
- 'icon',
- 'ignore',
- 'inactiveborder',
- 'inactivecaption',
- 'inactivecaptiontext',
- 'infinite',
- 'infobackground',
- 'infotext',
- 'inherit',
- 'initial',
- 'inline',
- 'inline-axis',
- 'inline-block',
- 'inline-table',
- 'inset',
- 'inside',
- 'intrinsic',
- 'invert',
- 'italic',
- 'justify',
- 'kannada',
- 'katakana',
- 'katakana-iroha',
- 'khmer',
- 'landscape',
- 'lao',
- 'large',
- 'larger',
- 'left',
- 'level',
- 'lighter',
- 'line-through',
- 'linear',
- 'lines',
- 'list-item',
- 'listbox',
- 'listitem',
- 'local',
- 'logical',
- 'loud',
- 'lower',
- 'lower-alpha',
- 'lower-armenian',
- 'lower-greek',
- 'lower-hexadecimal',
- 'lower-latin',
- 'lower-norwegian',
- 'lower-roman',
- 'lowercase',
- 'ltr',
- 'malayalam',
- 'match',
- 'media-controls-background',
- 'media-current-time-display',
- 'media-fullscreen-button',
- 'media-mute-button',
- 'media-play-button',
- 'media-return-to-realtime-button',
- 'media-rewind-button',
- 'media-seek-back-button',
- 'media-seek-forward-button',
- 'media-slider',
- 'media-sliderthumb',
- 'media-time-remaining-display',
- 'media-volume-slider',
- 'media-volume-slider-container',
- 'media-volume-sliderthumb',
- 'medium',
- 'menu',
- 'menulist',
- 'menulist-button',
- 'menulist-text',
- 'menulist-textfield',
- 'menutext',
- 'message-box',
- 'middle',
- 'min-intrinsic',
- 'mix',
- 'mongolian',
- 'monospace',
- 'move',
- 'multiple',
- 'myanmar',
- 'n-resize',
- 'narrower',
- 'navy',
- 'ne-resize',
- 'nesw-resize',
- 'no-close-quote',
- 'no-drop',
- 'no-open-quote',
- 'no-repeat',
- 'none',
- 'normal',
- 'not-allowed',
- 'nowrap',
- 'ns-resize',
- 'nw-resize',
- 'nwse-resize',
- 'oblique',
- 'octal',
- 'open-quote',
- 'optimizeLegibility',
- 'optimizeSpeed',
- 'oriya',
- 'oromo',
- 'outset',
- 'outside',
- 'overlay',
- 'overline',
- 'padding',
- 'padding-box',
- 'painted',
- 'paused',
- 'persian',
- 'plus-darker',
- 'plus-lighter',
- 'pointer',
- 'portrait',
- 'pre',
- 'pre-line',
- 'pre-wrap',
- 'preserve-3d',
- 'progress',
- 'push-button',
- 'radio',
- 'read-only',
- 'read-write',
- 'read-write-plaintext-only',
- 'relative',
- 'repeat',
- 'repeat-x',
- 'repeat-y',
- 'reset',
- 'reverse',
- 'rgb',
- 'rgba',
- 'ridge',
- 'right',
- 'round',
- 'row-resize',
- 'rtl',
- 'run-in',
- 'running',
- 's-resize',
- 'sans-serif',
- 'scroll',
- 'scrollbar',
- 'se-resize',
- 'searchfield',
- 'searchfield-cancel-button',
- 'searchfield-decoration',
- 'searchfield-results-button',
- 'searchfield-results-decoration',
- 'semi-condensed',
- 'semi-expanded',
- 'separate',
- 'serif',
- 'show',
- 'sidama',
- 'single',
- 'skip-white-space',
- 'slide',
- 'slider-horizontal',
- 'slider-vertical',
- 'sliderthumb-horizontal',
- 'sliderthumb-vertical',
- 'slow',
- 'small',
- 'small-caps',
- 'small-caption',
- 'smaller',
- 'solid',
- 'somali',
- 'source-atop',
- 'source-in',
- 'source-out',
- 'source-over',
- 'space',
- 'square',
- 'square-button',
- 'start',
- 'static',
- 'status-bar',
- 'stretch',
- 'stroke',
- 'sub',
- 'subpixel-antialiased',
- 'super',
- 'sw-resize',
- 'table',
- 'table-caption',
- 'table-cell',
- 'table-column',
- 'table-column-group',
- 'table-footer-group',
- 'table-header-group',
- 'table-row',
- 'table-row-group',
- 'telugu',
- 'text',
- 'text-bottom',
- 'text-top',
- 'textarea',
- 'textfield',
- 'thai',
- 'thick',
- 'thin',
- 'threeddarkshadow',
- 'threedface',
- 'threedhighlight',
- 'threedlightshadow',
- 'threedshadow',
- 'tibetan',
- 'tigre',
- 'tigrinya-er',
- 'tigrinya-er-abegede',
- 'tigrinya-et',
- 'tigrinya-et-abegede',
- 'to',
- 'top',
- 'transparent',
- 'ultra-condensed',
- 'ultra-expanded',
- 'underline',
- 'up',
- 'upper-alpha',
- 'upper-armenian',
- 'upper-greek',
- 'upper-hexadecimal',
- 'upper-latin',
- 'upper-norwegian',
- 'upper-roman',
- 'uppercase',
- 'urdu',
- 'url',
- 'vertical',
- 'vertical-text',
- 'visible',
- 'visibleFill',
- 'visiblePainted',
- 'visibleStroke',
- 'visual',
- 'w-resize',
- 'wait',
- 'wave',
- 'white',
- 'wider',
- 'window',
- 'windowframe',
- 'windowtext',
- 'x-large',
- 'x-small',
- 'xor',
- 'xx-large',
- 'xx-small',
- 'yellow'
- ])
-
- function keySet(array) {
- var keys = {}
- for (var i = 0; i < array.length; ++i) {
- keys[array[i]] = true
- }
- return keys
- }
-
- function ret(style, tp) {
- type = tp
- return style
- }
-
- function tokenBase(stream, state) {
- var ch = stream.next()
- if (ch == '@') {
- stream.eatWhile(/[\w\\\-]/)
- return ret('def', stream.current())
- } else if (ch == '/' && stream.eat('*')) {
- state.tokenize = tokenCComment
- return tokenCComment(stream, state)
- } else if (ch == '<' && stream.eat('!')) {
- state.tokenize = tokenSGMLComment
- return tokenSGMLComment(stream, state)
- } else if (ch == '=') ret(null, 'compare')
- else if ((ch == '~' || ch == '|') && stream.eat('='))
- return ret(null, 'compare')
- else if (ch == '"' || ch == "'") {
- state.tokenize = tokenString(ch)
- return state.tokenize(stream, state)
- } else if (ch == '#') {
- stream.eatWhile(/[\w\\\-]/)
- return ret('atom', 'hash')
- } else if (ch == '!') {
- stream.match(/^\s*\w*/)
- return ret('keyword', 'important')
- } else if (/\d/.test(ch)) {
- stream.eatWhile(/[\w.%]/)
- return ret('number', 'unit')
- } else if (ch === '-') {
- if (/\d/.test(stream.peek())) {
- stream.eatWhile(/[\w.%]/)
- return ret('number', 'unit')
- } else if (stream.match(/^[^-]+-/)) {
- return ret('meta', type)
- }
- } else if (/[,+>*\/]/.test(ch)) {
- return ret(null, 'select-op')
- } else if (ch == '.' && stream.match(/^-?[_a-z][_a-z0-9-]*/i)) {
- return ret('qualifier', type)
- } else if (ch == ':') {
- return ret('operator', ch)
- } else if (/[;{}\[\]\(\)]/.test(ch)) {
- return ret(null, ch)
- } else {
- stream.eatWhile(/[\w\\\-]/)
- return ret('property', 'variable')
- }
- }
-
- function tokenCComment(stream, state) {
- var maybeEnd = false
- var ch
- while ((ch = stream.next()) != null) {
- if (maybeEnd && ch == '/') {
- state.tokenize = tokenBase
- break
- }
- maybeEnd = ch == '*'
- }
- return ret('comment', 'comment')
- }
-
- function tokenSGMLComment(stream, state) {
- var dashes = 0,
- ch
- while ((ch = stream.next()) != null) {
- if (dashes >= 2 && ch == '>') {
- state.tokenize = tokenBase
- break
- }
- dashes = ch == '-' ? dashes + 1 : 0
- }
- return ret('comment', 'comment')
- }
-
- function tokenString(quote) {
- return function(stream, state) {
- var escaped = false
- var ch
- while ((ch = stream.next()) != null) {
- if (ch == quote && !escaped) {
- break
- }
- escaped = !escaped && ch == '\\'
- }
- if (!escaped) {
- state.tokenize = tokenBase
- }
- return ret('string', 'string')
- }
- }
- return {
- startState: function(base) {
- return {
- tokenize: tokenBase,
- baseIndent: base || 0,
- stack: []
- }
- },
- token: function(stream, state) {
- if (stream.eatSpace()) return null
- var style = state.tokenize(stream, state)
- var context = state.stack[state.stack.length - 1]
- if (style == 'property') {
- if (context == 'propertyValue') {
- if (valueKeywords[stream.current()]) {
- style = 'string-2'
- } else if (colorKeywords[stream.current()]) {
- style = 'keyword'
- } else {
- style = 'variable-2'
- }
- } else if (context == 'rule') {
- if (!propertyKeywords[stream.current()]) {
- style += ' error'
- }
- } else if (!context || context == '@media{') {
- style = 'tag'
- } else if (context == '@media') {
- if (atMediaTypes[stream.current()]) {
- style = 'attribute'
- } else if (/^(only|not)$/i.test(stream.current())) {
- style = 'keyword'
- } else if (stream.current().toLowerCase() == 'and') {
- style = 'error'
- } else if (atMediaFeatures[stream.current()]) {
- style = 'error'
- } else {
- style = 'attribute error'
- }
- } else if (context == '@mediaType') {
- if (atMediaTypes[stream.current()]) {
- style = 'attribute'
- } else if (stream.current().toLowerCase() == 'and') {
- style = 'operator'
- } else if (/^(only|not)$/i.test(stream.current())) {
- style = 'error'
- } else if (atMediaFeatures[stream.current()]) {
- style = 'error'
- } else {
- style = 'error'
- }
- } else if (context == '@mediaType(') {
- if (propertyKeywords[stream.current()]) {
- } else if (atMediaTypes[stream.current()]) {
- style = 'error'
- } else if (stream.current().toLowerCase() == 'and') {
- style = 'operator'
- } else if (/^(only|not)$/i.test(stream.current())) {
- style = 'error'
- } else {
- style += ' error'
- }
- } else {
- style = 'error'
- }
- } else if (style == 'atom') {
- if (!context || context == '@media{') {
- style = 'builtin'
- } else if (context == 'propertyValue') {
- if (!/^#([0-9a-fA-f]{3}|[0-9a-fA-f]{6})$/.test(stream.current())) {
- style += ' error'
- }
- } else {
- style = 'error'
- }
- } else if (context == '@media' && type == '{') {
- style = 'error'
- }
- if (type == '{') {
- if (context == '@media' || context == '@mediaType') {
- state.stack.pop()
- state.stack[state.stack.length - 1] = '@media{'
- } else state.stack.push('rule')
- } else if (type == '}') {
- state.stack.pop()
- if (context == 'propertyValue') state.stack.pop()
- } else if (type == '@media') state.stack.push('@media')
- else if (context == '@media' && /\b(keyword|attribute)\b/.test(style))
- state.stack.push('@mediaType')
- else if (context == '@mediaType' && stream.current() == ',')
- state.stack.pop()
- else if (context == '@mediaType' && type == '(')
- state.stack.push('@mediaType(')
- else if (context == '@mediaType(' && type == ')') state.stack.pop()
- else if (context == 'rule' && type == ':')
- state.stack.push('propertyValue')
- else if (context == 'propertyValue' && type == ';') state.stack.pop()
- return style
- },
- indent: function(state, textAfter) {
- var len = state.stack.length
- if (/^\}/.test(textAfter)) {
- len -= state.stack[state.stack.length - 1] == 'propertyValue' ? 2 : 1
- }
- return state.baseIndent + len * indentUnit
- },
- electricChars: '}'
- }
-})
-CodeMirror.defineMIME('text/css', 'css')
-
-CodeMirror.defineMode('javascript', function(config, parserConfig) {
- var indentUnit = config.indentUnit
- var jsonMode = parserConfig.json
- var isTS = parserConfig.typescript
- var keywords = (function() {
- function kw(type) {
- return {
- type: type,
- style: 'keyword'
- }
- }
- var A = kw('keyword a'),
- B = kw('keyword b'),
- C = kw('keyword c')
- var operator = kw('operator'),
- atom = {
- type: 'atom',
- style: 'atom'
- }
- var jsKeywords = {
- if: A,
- while: A,
- with: A,
- else: B,
- async: B,
- await: B,
- '*': B,
- yield: B,
- do: B,
- try: B,
- finally: B,
- return: C,
- break: C,
- continue: C,
- new: C,
- delete: C,
- throw: C,
- var: kw('var'),
- const: kw('var'),
- let: kw('var'),
- function: kw('function'),
- require: kw('function'),
- interface: kw('interface'),
- class: kw('class'),
- extends: kw('extends'),
- constructor: kw('constructor'),
- public: kw('public'),
- private: kw('private'),
- protected: kw('protected'),
- static: kw('static'),
- super: kw('super'),
- catch: kw('catch'),
- for: kw('for'),
- switch: kw('switch'),
- case: kw('case'),
- default: kw('default'),
- in: operator,
- typeof: operator,
- instanceof: operator,
- true: atom,
- false: atom,
- null: atom,
- undefined: atom,
- NaN: atom,
- Infinity: atom
- }
- if (isTS) {
- var type = {
- type: 'variable',
- style: 'variable-3'
- }
- var tsKeywords = {
- interface: kw('interface'),
- class: kw('class'),
- extends: kw('extends'),
- constructor: kw('constructor'),
- public: kw('public'),
- private: kw('private'),
- protected: kw('protected'),
- static: kw('static'),
- super: kw('super'),
- string: type,
- number: type,
- bool: type,
- any: type
- }
- for (var attr in tsKeywords) {
- jsKeywords[attr] = tsKeywords[attr]
- }
- }
- return jsKeywords
- })()
- var isOperatorChar = /[+\-*&%=<>!?|]/
-
- function chain(stream, state, f) {
- state.tokenize = f
- return f(stream, state)
- }
-
- function nextUntilUnescaped(stream, end) {
- var escaped = false,
- next
- while ((next = stream.next()) != null) {
- if (next == end && !escaped) return false
- escaped = !escaped && next == '\\'
- }
- return escaped
- }
- var type, content
-
- function ret(tp, style, cont) {
- type = tp
- content = cont
- return style
- }
-
- function jsTokenBase(stream, state) {
- var ch = stream.next()
- if (ch == '"' || ch == "'") return chain(stream, state, jsTokenString(ch))
- else if (/[\[\]{}\(\),;\:\.]/.test(ch)) return ret(ch)
- else if (ch == '0' && stream.eat(/x/i)) {
- stream.eatWhile(/[\da-f]/i)
- return ret('number', 'number')
- } else if (/\d/.test(ch) || (ch == '-' && stream.eat(/\d/))) {
- stream.match(/^\d*(?:\.\d*)?(?:[eE][+\-]?\d+)?/)
- return ret('number', 'number')
- } else if (ch == '/') {
- if (stream.eat('*')) {
- return chain(stream, state, jsTokenComment)
- } else if (stream.eat('/')) {
- stream.skipToEnd()
- return ret('comment', 'comment')
- } else if (
- state.lastType == 'operator' ||
- state.lastType == 'keyword c' ||
- /^[\[{}\(,;:]$/.test(state.lastType)
- ) {
- nextUntilUnescaped(stream, '/')
- stream.eatWhile(/[gimy]/)
- return ret('regexp', 'string-2')
- } else {
- stream.eatWhile(isOperatorChar)
- return ret('operator', null, stream.current())
- }
- } else if (ch == '#') {
- stream.skipToEnd()
- return ret('error', 'error')
- } else if (isOperatorChar.test(ch)) {
- stream.eatWhile(isOperatorChar)
- return ret('operator', null, stream.current())
- } else {
- stream.eatWhile(/[\w\$_]/)
- var word = stream.current(),
- known = keywords.propertyIsEnumerable(word) && keywords[word]
- return known && state.lastType != '.'
- ? ret(known.type, known.style, word)
- : ret('variable', 'variable', word)
- }
- }
-
- function jsTokenString(quote) {
- return function(stream, state) {
- if (!nextUntilUnescaped(stream, quote)) state.tokenize = jsTokenBase
- return ret('string', 'string')
- }
- }
-
- function jsTokenComment(stream, state) {
- var maybeEnd = false,
- ch
- while ((ch = stream.next())) {
- if (ch == '/' && maybeEnd) {
- state.tokenize = jsTokenBase
- break
- }
- maybeEnd = ch == '*'
- }
- return ret('comment', 'comment')
- }
- var atomicTypes = {
- atom: true,
- number: true,
- variable: true,
- string: true,
- regexp: true
- }
-
- function JSLexical(indented, column, type, align, prev, info) {
- this.indented = indented
- this.column = column
- this.type = type
- this.prev = prev
- this.info = info
- if (align != null) this.align = align
- }
-
- function inScope(state, varname) {
- for (var v = state.localVars; v; v = v.next)
- if (v.name == varname) return true
- }
-
- function parseJS(state, style, type, content, stream) {
- var cc = state.cc
- cx.state = state
- cx.stream = stream
- ;(cx.marked = null), (cx.cc = cc)
- if (!state.lexical.hasOwnProperty('align')) state.lexical.align = true
- while (true) {
- var combinator = cc.length ? cc.pop() : jsonMode ? expression : statement
- if (combinator(type, content)) {
- while (cc.length && cc[cc.length - 1].lex) cc.pop()()
- if (cx.marked) return cx.marked
- if (type == 'variable' && inScope(state, content)) return 'variable-2'
- return style
- }
- }
- }
- var cx = {
- state: null,
- column: null,
- marked: null,
- cc: null
- }
-
- function pass() {
- for (var i = arguments.length - 1; i >= 0; i--) cx.cc.push(arguments[i])
- }
-
- function cont() {
- pass.apply(null, arguments)
- return true
- }
-
- function register(varname) {
- var state = cx.state
- if (state.context) {
- cx.marked = 'def'
- for (var v = state.localVars; v; v = v.next) if (v.name == varname) return
- state.localVars = {
- name: varname,
- next: state.localVars
- }
- }
- }
- var defaultVars = {
- name: 'this',
- next: {
- name: 'arguments'
- }
- }
-
- function pushcontext() {
- cx.state.context = {
- prev: cx.state.context,
- vars: cx.state.localVars
- }
- cx.state.localVars = defaultVars
- }
-
- function popcontext() {
- cx.state.localVars = cx.state.context.vars
- cx.state.context = cx.state.context.prev
- }
-
- function pushlex(type, info) {
- var result = function() {
- var state = cx.state
- state.lexical = new JSLexical(
- state.indented,
- cx.stream.column(),
- type,
- null,
- state.lexical,
- info
- )
- }
- result.lex = true
- return result
- }
-
- function poplex() {
- var state = cx.state
- if (state.lexical.prev) {
- if (state.lexical.type == ')') state.indented = state.lexical.indented
- state.lexical = state.lexical.prev
- }
- }
- poplex.lex = true
-
- function expect(wanted) {
- return function expecting(type) {
- if (type == wanted) return cont()
- else if (wanted == ';') return pass()
- else return cont(arguments.callee)
- }
- }
-
- function statement(type) {
- if (type == 'var')
- return cont(pushlex('vardef'), vardef1, expect(';'), poplex)
- if (type == 'keyword a')
- return cont(pushlex('form'), expression, statement, poplex)
- if (type == 'keyword b') return cont(pushlex('form'), statement, poplex)
- if (type == '{') return cont(pushlex('}'), block, poplex)
- if (type == ';') return cont()
- if (type == 'function') return cont(functiondef)
- if (type == 'for')
- return cont(
- pushlex('form'),
- expect('('),
- pushlex(')'),
- forspec1,
- expect(')'),
- poplex,
- statement,
- poplex
- )
- if (type == 'variable') return cont(pushlex('stat'), maybelabel)
- if (type == 'switch')
- return cont(
- pushlex('form'),
- expression,
- pushlex('}', 'switch'),
- expect('{'),
- block,
- poplex,
- poplex
- )
- if (type == 'case') return cont(expression, expect(':'))
- if (type == 'default') return cont(expect(':'))
- if (type == 'catch')
- return cont(
- pushlex('form'),
- pushcontext,
- expect('('),
- funarg,
- expect(')'),
- statement,
- poplex,
- popcontext
- )
- return pass(pushlex('stat'), expression, expect(';'), poplex)
- }
-
- function expression(type) {
- if (atomicTypes.hasOwnProperty(type)) return cont(maybeoperator)
- if (type == 'function') return cont(functiondef)
- if (type == 'keyword c') return cont(maybeexpression)
- if (type == '(')
- return cont(
- pushlex(')'),
- maybeexpression,
- expect(')'),
- poplex,
- maybeoperator
- )
- if (type == 'operator') return cont(expression)
- if (type == '[')
- return cont(
- pushlex(']'),
- commasep(expression, ']'),
- poplex,
- maybeoperator
- )
- if (type == '{')
- return cont(pushlex('}'), commasep(objprop, '}'), poplex, maybeoperator)
- return cont()
- }
-
- function maybeexpression(type) {
- if (type.match(/[;\}\)\],]/)) return pass()
- return pass(expression)
- }
-
- function maybeoperator(type, value) {
- if (type == 'operator' && /\+\+|--/.test(value)) return cont(maybeoperator)
- if (type == 'operator' && value == '?')
- return cont(expression, expect(':'), expression)
- if (type == ';') return
- if (type == '(')
- return cont(
- pushlex(')'),
- commasep(expression, ')'),
- poplex,
- maybeoperator
- )
- if (type == '.') return cont(property, maybeoperator)
- if (type == '[')
- return cont(pushlex(']'), expression, expect(']'), poplex, maybeoperator)
- }
-
- function maybelabel(type) {
- if (type == ':') return cont(poplex, statement)
- return pass(maybeoperator, expect(';'), poplex)
- }
-
- function property(type) {
- if (type == 'variable') {
- cx.marked = 'property'
- return cont()
- }
- }
-
- function objprop(type) {
- if (type == 'variable') cx.marked = 'property'
- if (atomicTypes.hasOwnProperty(type)) return cont(expect(':'), expression)
- }
-
- function commasep(what, end) {
- function proceed(type) {
- if (type == ',') return cont(what, proceed)
- if (type == end) return cont()
- return cont(expect(end))
- }
- return function commaSeparated(type) {
- if (type == end) return cont()
- else return pass(what, proceed)
- }
- }
-
- function block(type) {
- if (type == '}') return cont()
- return pass(statement, block)
- }
-
- function maybetype(type) {
- if (type == ':') return cont(typedef)
- return pass()
- }
-
- function typedef(type) {
- if (type == 'variable') {
- cx.marked = 'variable-3'
- return cont()
- }
- return pass()
- }
-
- function vardef1(type, value) {
- if (type == 'variable') {
- register(value)
- return isTS ? cont(maybetype, vardef2) : cont(vardef2)
- }
- return pass()
- }
-
- function vardef2(type, value) {
- if (value == '=') return cont(expression, vardef2)
- if (type == ',') return cont(vardef1)
- }
-
- function forspec1(type) {
- if (type == 'var') return cont(vardef1, expect(';'), forspec2)
- if (type == ';') return cont(forspec2)
- if (type == 'variable') return cont(formaybein)
- return cont(forspec2)
- }
-
- function formaybein(type, value) {
- if (value == 'in') return cont(expression)
- return cont(maybeoperator, forspec2)
- }
-
- function forspec2(type, value) {
- if (type == ';') return cont(forspec3)
- if (value == 'in') return cont(expression)
- return cont(expression, expect(';'), forspec3)
- }
-
- function forspec3(type) {
- if (type != ')') cont(expression)
- }
-
- function functiondef(type, value) {
- if (type == 'variable') {
- register(value)
- return cont(functiondef)
- }
- if (type == '(')
- return cont(
- pushlex(')'),
- pushcontext,
- commasep(funarg, ')'),
- poplex,
- statement,
- popcontext
- )
- }
-
- function funarg(type, value) {
- if (type == 'variable') {
- register(value)
- return isTS ? cont(maybetype) : cont()
- }
- }
- return {
- startState: function(basecolumn) {
- return {
- tokenize: jsTokenBase,
- lastType: null,
- cc: [],
- lexical: new JSLexical(
- (basecolumn || 0) - indentUnit,
- 0,
- 'block',
- false
- ),
- localVars: parserConfig.localVars,
- context: parserConfig.localVars && {
- vars: parserConfig.localVars
- },
- indented: 0
- }
- },
- token: function(stream, state) {
- if (stream.sol()) {
- if (!state.lexical.hasOwnProperty('align')) state.lexical.align = false
- state.indented = stream.indentation()
- }
- if (stream.eatSpace()) return null
- var style = state.tokenize(stream, state)
- if (type == 'comment') return style
- state.lastType = type
- return parseJS(state, style, type, content, stream)
- },
- indent: function(state, textAfter) {
- if (state.tokenize == jsTokenComment) return CodeMirror.Pass
- if (state.tokenize != jsTokenBase) return 0
- var firstChar = textAfter && textAfter.charAt(0),
- lexical = state.lexical
- if (lexical.type == 'stat' && firstChar == '}') lexical = lexical.prev
- var type = lexical.type,
- closing = firstChar == type
- if (type == 'vardef')
- return (
- lexical.indented +
- (state.lastType == 'operator' || state.lastType == ',' ? 4 : 0)
- )
- else if (type == 'form' && firstChar == '{') return lexical.indented
- else if (type == 'form') return lexical.indented + indentUnit
- else if (type == 'stat')
- return (
- lexical.indented +
- (state.lastType == 'operator' || state.lastType == ','
- ? indentUnit
- : 0)
- )
- else if (lexical.info == 'switch' && !closing)
- return (
- lexical.indented +
- (/^(?:case|default)\b/.test(textAfter) ? indentUnit : 2 * indentUnit)
- )
- else if (lexical.align) return lexical.column + (closing ? 0 : 1)
- else return lexical.indented + (closing ? 0 : indentUnit)
- },
- electricChars: ':{}',
- jsonMode: jsonMode
- }
-})
-CodeMirror.defineMIME('text/javascript', 'javascript')
-CodeMirror.defineMIME('application/json', {
- name: 'javascript',
- json: true
-})
-CodeMirror.defineMIME('text/typescript', {
- name: 'javascript',
- typescript: true
-})
-CodeMirror.defineMIME('application/typescript', {
- name: 'javascript',
- typescript: true
-})
-
-CodeMirror.defineMode('xml', function(config, parserConfig) {
- var indentUnit = config.indentUnit
- var Kludges = parserConfig.htmlMode
- ? {
- autoSelfClosers: {
- area: true,
- base: true,
- br: true,
- col: true,
- command: true,
- embed: true,
- frame: true,
- hr: true,
- img: true,
- input: true,
- keygen: true,
- link: true,
- meta: true,
- param: true,
- source: true,
- track: true,
- wbr: true
- },
- implicitlyClosed: {
- dd: true,
- li: true,
- optgroup: true,
- option: true,
- p: true,
- rp: true,
- rt: true,
- tbody: true,
- td: true,
- tfoot: true,
- th: true,
- tr: true
- },
- contextGrabbers: {
- dd: {
- dd: true,
- dt: true
- },
- dt: {
- dd: true,
- dt: true
- },
- li: {
- li: true
- },
- option: {
- option: true,
- optgroup: true
- },
- optgroup: {
- optgroup: true
- },
- p: {
- address: true,
- article: true,
- aside: true,
- blockquote: true,
- dir: true,
- div: true,
- dl: true,
- fieldset: true,
- footer: true,
- form: true,
- h1: true,
- h2: true,
- h3: true,
- h4: true,
- h5: true,
- h6: true,
- header: true,
- hgroup: true,
- hr: true,
- menu: true,
- nav: true,
- ol: true,
- p: true,
- pre: true,
- section: true,
- table: true,
- ul: true
- },
- rp: {
- rp: true,
- rt: true
- },
- rt: {
- rp: true,
- rt: true
- },
- tbody: {
- tbody: true,
- tfoot: true
- },
- td: {
- td: true,
- th: true
- },
- tfoot: {
- tbody: true
- },
- th: {
- td: true,
- th: true
- },
- thead: {
- tbody: true,
- tfoot: true
- },
- tr: {
- tr: true
- }
- },
- doNotIndent: {
- pre: true
- },
- allowUnquoted: true,
- allowMissing: true
- }
- : {
- autoSelfClosers: {},
- implicitlyClosed: {},
- contextGrabbers: {},
- doNotIndent: {},
- allowUnquoted: false,
- allowMissing: false
- }
- var alignCDATA = parserConfig.alignCDATA
- var tagName, type
-
- function inText(stream, state) {
- function chain(parser) {
- state.tokenize = parser
- return parser(stream, state)
- }
- var ch = stream.next()
- if (ch == '<') {
- if (stream.eat('!')) {
- if (stream.eat('[')) {
- if (stream.match('CDATA[')) return chain(inBlock('atom', ']]>'))
- else return null
- } else if (stream.match('--')) return chain(inBlock('comment', '-->'))
- else if (stream.match('DOCTYPE', true, true)) {
- stream.eatWhile(/[\w\._\-]/)
- return chain(doctype(1))
- } else return null
- } else if (stream.eat('?')) {
- stream.eatWhile(/[\w\._\-]/)
- state.tokenize = inBlock('meta', '?>')
- return 'meta'
- } else {
- var isClose = stream.eat('/')
- tagName = ''
- var c
- while ((c = stream.eat(/[^\s\u00a0=<>\"\'\/?]/))) tagName += c
- if (!tagName) return 'error'
- type = isClose ? 'closeTag' : 'openTag'
- state.tokenize = inTag
- return 'tag'
- }
- } else if (ch == '&') {
- var ok
- if (stream.eat('#')) {
- if (stream.eat('x')) {
- ok = stream.eatWhile(/[a-fA-F\d]/) && stream.eat(';')
- } else {
- ok = stream.eatWhile(/[\d]/) && stream.eat(';')
- }
- } else {
- ok = stream.eatWhile(/[\w\.\-:]/) && stream.eat(';')
- }
- return ok ? 'atom' : 'error'
- } else {
- stream.eatWhile(/[^&<]/)
- return null
- }
- }
-
- function inTag(stream, state) {
- var ch = stream.next()
- if (ch == '>' || (ch == '/' && stream.eat('>'))) {
- state.tokenize = inText
- type = ch == '>' ? 'endTag' : 'selfcloseTag'
- return 'tag'
- } else if (ch == '=') {
- type = 'equals'
- return null
- } else if (/[\'\"]/.test(ch)) {
- state.tokenize = inAttribute(ch)
- return state.tokenize(stream, state)
- } else {
- stream.eatWhile(/[^\s\u00a0=<>\"\']/)
- return 'word'
- }
- }
-
- function inAttribute(quote) {
- return function(stream, state) {
- while (!stream.eol()) {
- if (stream.next() == quote) {
- state.tokenize = inTag
- break
- }
- }
- return 'string'
- }
- }
-
- function inBlock(style, terminator) {
- return function(stream, state) {
- while (!stream.eol()) {
- if (stream.match(terminator)) {
- state.tokenize = inText
- break
- }
- stream.next()
- }
- return style
- }
- }
-
- function doctype(depth) {
- return function(stream, state) {
- var ch
- while ((ch = stream.next()) != null) {
- if (ch == '<') {
- state.tokenize = doctype(depth + 1)
- return state.tokenize(stream, state)
- } else if (ch == '>') {
- if (depth == 1) {
- state.tokenize = inText
- break
- } else {
- state.tokenize = doctype(depth - 1)
- return state.tokenize(stream, state)
- }
- }
- }
- return 'meta'
- }
- }
- var curState, setStyle
-
- function pass() {
- for (var i = arguments.length - 1; i >= 0; i--)
- curState.cc.push(arguments[i])
- }
-
- function cont() {
- pass.apply(null, arguments)
- return true
- }
-
- function pushContext(tagName, startOfLine) {
- var noIndent =
- Kludges.doNotIndent.hasOwnProperty(tagName) ||
- (curState.context && curState.context.noIndent)
- curState.context = {
- prev: curState.context,
- tagName: tagName,
- indent: curState.indented,
- startOfLine: startOfLine,
- noIndent: noIndent
- }
- }
-
- function popContext() {
- if (curState.context) {
- curState.context = curState.context.prev
- }
- }
-
- function element(type) {
- if (type == 'openTag') {
- curState.tagName = tagName
- return cont(attributes, endtag(curState.startOfLine))
- } else if (type == 'closeTag') {
- var err = false
- if (curState.context) {
- if (curState.context.tagName != tagName) {
- if (
- Kludges.implicitlyClosed.hasOwnProperty(
- curState.context.tagName.toLowerCase()
- )
- ) {
- popContext()
- }
- err = !curState.context || curState.context.tagName != tagName
- }
- } else {
- err = true
- }
- if (err) setStyle = 'error'
- return cont(endclosetag(err))
- }
- return cont()
- }
-
- function endtag(startOfLine) {
- return function(type) {
- if (
- type == 'selfcloseTag' ||
- (type == 'endTag' &&
- Kludges.autoSelfClosers.hasOwnProperty(
- curState.tagName.toLowerCase()
- ))
- ) {
- maybePopContext(curState.tagName.toLowerCase())
- return cont()
- }
- if (type == 'endTag') {
- maybePopContext(curState.tagName.toLowerCase())
- pushContext(curState.tagName, startOfLine)
- return cont()
- }
- return cont()
- }
- }
-
- function endclosetag(err) {
- return function(type) {
- if (err) setStyle = 'error'
- if (type == 'endTag') {
- popContext()
- return cont()
- }
- setStyle = 'error'
- return cont(arguments.callee)
- }
- }
-
- function maybePopContext(nextTagName) {
- var parentTagName
- while (true) {
- if (!curState.context) {
- return
- }
- parentTagName = curState.context.tagName.toLowerCase()
- if (
- !Kludges.contextGrabbers.hasOwnProperty(parentTagName) ||
- !Kludges.contextGrabbers[parentTagName].hasOwnProperty(nextTagName)
- ) {
- return
- }
- popContext()
- }
- }
-
- function attributes(type) {
- if (type == 'word') {
- setStyle = 'attribute'
- return cont(attribute, attributes)
- }
- if (type == 'endTag' || type == 'selfcloseTag') return pass()
- setStyle = 'error'
- return cont(attributes)
- }
-
- function attribute(type) {
- if (type == 'equals') return cont(attvalue, attributes)
- if (!Kludges.allowMissing) setStyle = 'error'
- else if (type == 'word') setStyle = 'attribute'
- return type == 'endTag' || type == 'selfcloseTag' ? pass() : cont()
- }
-
- function attvalue(type) {
- if (type == 'string') return cont(attvaluemaybe)
- if (type == 'word' && Kludges.allowUnquoted) {
- setStyle = 'string'
- return cont()
- }
- setStyle = 'error'
- return type == 'endTag' || type == 'selfCloseTag' ? pass() : cont()
- }
-
- function attvaluemaybe(type) {
- if (type == 'string') return cont(attvaluemaybe)
- else return pass()
- }
- return {
- startState: function() {
- return {
- tokenize: inText,
- cc: [],
- indented: 0,
- startOfLine: true,
- tagName: null,
- context: null
- }
- },
- token: function(stream, state) {
- if (stream.sol()) {
- state.startOfLine = true
- state.indented = stream.indentation()
- }
- if (stream.eatSpace()) return null
- setStyle = type = tagName = null
- var style = state.tokenize(stream, state)
- state.type = type
- if ((style || type) && style != 'comment') {
- curState = state
- while (true) {
- var comb = state.cc.pop() || element
- if (comb(type || style)) break
- }
- }
- state.startOfLine = false
- return setStyle || style
- },
- indent: function(state, textAfter, fullLine) {
- var context = state.context
- if (
- (state.tokenize != inTag && state.tokenize != inText) ||
- (context && context.noIndent)
- )
- return fullLine ? fullLine.match(/^(\s*)/)[0].length : 0
- if (alignCDATA && /
+ * @date 2020/12/03 18:24:47
+ */
+
+// H: 色相, S: 饱和度, B/V: 亮度
+export function hsb2rgb(hsb) {
+ var h = hsb.h
+ var s = Math.round((hsb.s * 255) / 100)
+ var v = Math.round((hsb.b * 255) / 100)
+ var r = 0
+ var g = 0
+ var b = 0
+
+ if (s === 0) {
+ r = g = b = v
+ } else {
+ var t1 = v
+ var t2 = ((255 - s) * v) / 255
+ var t3 = ((t1 - t2) * (h % 60)) / 60
+
+ //
+ if (h === 360) {
+ h = 0
+ }
+
+ if (h < 60) {
+ r = t1
+ g = t2 + t3
+ b = t2
+ } else if (h < 120) {
+ r = t1 - t3
+ g = t1
+ b = t2
+ } else if (h < 180) {
+ r = t2
+ g = t1
+ b = t2 + t3
+ } else if (h < 240) {
+ r = t2
+ g = t1 - t3
+ b = t1
+ } else if (h < 300) {
+ r = t2 + t3
+ g = t2
+ b = t1
+ } else if (h < 360) {
+ r = t1
+ g = t2
+ b = t1 - t3
+ }
+ }
+ r = Math.round(r)
+ g = Math.round(g)
+ b = Math.round(b)
+
+ return { r, g, b }
+}
+
+export function rgb2hex({ r, g, b }) {
+ return [r, g, b].map(it => it.toString(16).padStart(2, '0')).join('')
+}
+
+export function hex2rgb(hex) {
+ var r, g, b
+
+ hex = hex.replace(/^#/, '').split('')
+
+ if (hex.length === 3) {
+ r = parseInt(hex[0] + hex[0], 16)
+ g = parseInt(hex[1] + hex[1], 16)
+ b = parseInt(hex[2] + hex[2], 16)
+ } else {
+ r = parseInt(hex[0] + hex[1], 16)
+ g = parseInt(hex[2] + hex[3], 16)
+ b = parseInt(hex[4] + hex[5], 16)
+ }
+
+ return { r, g, b }
+}
+
+export function rgb2hsb({ r, g, b }) {
+ var hsb = { h: 0, s: 0, b: 0 }
+ var max = Math.max(r, g, b)
+ var min = Math.min(r, g, b)
+ var delta = max - min
+
+ hsb.b = max
+ hsb.s = max === 0 ? 0 : (delta * 255) / max
+
+ if (hsb.s === 0) {
+ hsb.h = -1
+ } else {
+ if (r === max) {
+ hsb.h = (g - b) / delta
+ } else if (g === max) {
+ hsb.h = 2 + (b - r) / delta
+ } else {
+ hsb.h = 4 + (r - g) / delta
+ }
+ }
+ hsb.h *= 60
+
+ if (hsb.h < 0) {
+ hsb.h += 360
+ }
+
+ hsb.s *= 100 / 255
+ hsb.b *= 100 / 255
+
+ return hsb
+}
+
+export function hex2hsb(hex) {
+ return rgb2hsb(hex2rgb(hex))
+}
diff --git a/src/color/index.wc b/src/color/index.wc
new file mode 100644
index 0000000..aa02d59
--- /dev/null
+++ b/src/color/index.wc
@@ -0,0 +1,475 @@
+
+
+
+
+
+
+
diff --git a/src/crypto/Readme.md b/src/crypto/Readme.md
deleted file mode 100644
index 1875e2e..0000000
--- a/src/crypto/Readme.md
+++ /dev/null
@@ -1,47 +0,0 @@
-# crypto & md5 加密组件
-
-
-
-
-## md5
-> 这里使用的是第三方的 SparkMD5 实现
-
-```javascript
-
-import { md5, md5Sum } from 'crypto/md5'
-
-// 直接计算字段串的md5值
-console.log(md5('123456'))
-
-
-// 计算该文件的md5签名
-var file = /*...*/ //文件表单获取
-var fs = new FileReader()
-fs.onload = function(){
- console.log(md5Sum(this.result))
-}
-fs.readAsBinaryString(file)
-
-```
-
-
-## crypto
-> 这里使用的是浏览器内置的实现, 需要在https下或本地才能用。
->> 返回值都是Promise对象
-
-```javascript
-
-import hash, { sha1, sha256, sha512, hmac, base64encode, base64decode } from 'crypto/index'
-
-
-
-hash('sha-1', '123456')
-// 等价于
-sha1('123456')
-
-
-// hmac签名
-hmac('sha-1', '123456', 'a key', 'hex')
-
-
-```
\ No newline at end of file
diff --git a/src/crypto/index.js b/src/crypto/index.js
deleted file mode 100644
index e12c72e..0000000
--- a/src/crypto/index.js
+++ /dev/null
@@ -1,77 +0,0 @@
-const encoder = new TextEncoder()
-const subtle = window.crypto.subtle
-
-/**
- * String 转 Uint8Array
- */
-function str2uint(txt) {
- return encoder.encode(txt)
-}
-
-/**
- * ArrayBuffer 转 hex
- */
-function ab2hex(buf) {
- var uint8 = new Uint8Array(buf)
- return [...uint8].map(n => n.toString(16).padStart(2, '0')).join('')
-}
-
-/**
- * ArrayBuffer 转 Binary
- */
-function ab2bin(buf) {
- var bin = ''
- var uint8 = new Uint8Array(buf)
- for (var i = 0; i < uint8.length; i++) {
- bin += String.fromCharCode(uint8[i])
- }
- return bin
-}
-
-/* ------------------------------------- */
-
-export default function hash(type, str) {
- return subtle.digest(type, str2uint(str)).then(buf => ab2hex(buf))
-}
-
-export function sha1(str) {
- return hash('sha-1', str)
-}
-
-export function sha256(str) {
- return hash('sha-256', str)
-}
-
-export function sha512(str) {
- return hash('sha-512', str)
-}
-
-export function hmac(mode, str, key, output) {
- key = key === '' ? new Uint8Array(16) : str2uint(key)
- return subtle
- .importKey('raw', key, { name: 'HMAC', hash: { name: mode } }, true, [
- 'sign',
- 'verify'
- ])
- .then(cKey => {
- return subtle.sign('HMAC', cKey, str2uint(str)).then(buf => {
- if (output === 'binary') {
- return ab2bin(buf)
- } else if (output === 'hex') {
- return ab2hex(buf)
- } else if (output === 'base64') {
- return window.btoa(ab2bin(buf))
- }
- return new Uint8Array(buf)
- })
- })
-}
-
-// 支持对中文的base64编码
-export function base64encode(str) {
- return window.btoa(unescape(encodeURIComponent(str)))
-}
-
-export function base64decode(str) {
- return decodeURIComponent(escape(window.atob(str)))
-}
diff --git a/src/crypto/md5.js b/src/crypto/md5.js
deleted file mode 100644
index 04bd4ef..0000000
--- a/src/crypto/md5.js
+++ /dev/null
@@ -1,764 +0,0 @@
-/*
- * Fastest md5 implementation around (JKM md5).
- * Credits: Joseph Myers
- *
- * @see http://www.myersdaily.org/joseph/javascript/md5-text.html
- * @see http://jsperf.com/md5-shootout/7
- */
-
-/* this function is much faster,
- so if possible we use it. Some IEs
- are the only ones I know of that
- need the idiotic second function,
- generated by an if clause. */
-var add32 = function(a, b) {
- return (a + b) & 0xffffffff
- },
- hex_chr = [
- '0',
- '1',
- '2',
- '3',
- '4',
- '5',
- '6',
- '7',
- '8',
- '9',
- 'a',
- 'b',
- 'c',
- 'd',
- 'e',
- 'f'
- ]
-
-function cmn(q, a, b, x, s, t) {
- a = add32(add32(a, q), add32(x, t))
- return add32((a << s) | (a >>> (32 - s)), b)
-}
-
-function md5cycle(x, k) {
- var a = x[0],
- b = x[1],
- c = x[2],
- d = x[3]
-
- a += (((b & c) | (~b & d)) + k[0] - 680876936) | 0
- a = (((a << 7) | (a >>> 25)) + b) | 0
- d += (((a & b) | (~a & c)) + k[1] - 389564586) | 0
- d = (((d << 12) | (d >>> 20)) + a) | 0
- c += (((d & a) | (~d & b)) + k[2] + 606105819) | 0
- c = (((c << 17) | (c >>> 15)) + d) | 0
- b += (((c & d) | (~c & a)) + k[3] - 1044525330) | 0
- b = (((b << 22) | (b >>> 10)) + c) | 0
- a += (((b & c) | (~b & d)) + k[4] - 176418897) | 0
- a = (((a << 7) | (a >>> 25)) + b) | 0
- d += (((a & b) | (~a & c)) + k[5] + 1200080426) | 0
- d = (((d << 12) | (d >>> 20)) + a) | 0
- c += (((d & a) | (~d & b)) + k[6] - 1473231341) | 0
- c = (((c << 17) | (c >>> 15)) + d) | 0
- b += (((c & d) | (~c & a)) + k[7] - 45705983) | 0
- b = (((b << 22) | (b >>> 10)) + c) | 0
- a += (((b & c) | (~b & d)) + k[8] + 1770035416) | 0
- a = (((a << 7) | (a >>> 25)) + b) | 0
- d += (((a & b) | (~a & c)) + k[9] - 1958414417) | 0
- d = (((d << 12) | (d >>> 20)) + a) | 0
- c += (((d & a) | (~d & b)) + k[10] - 42063) | 0
- c = (((c << 17) | (c >>> 15)) + d) | 0
- b += (((c & d) | (~c & a)) + k[11] - 1990404162) | 0
- b = (((b << 22) | (b >>> 10)) + c) | 0
- a += (((b & c) | (~b & d)) + k[12] + 1804603682) | 0
- a = (((a << 7) | (a >>> 25)) + b) | 0
- d += (((a & b) | (~a & c)) + k[13] - 40341101) | 0
- d = (((d << 12) | (d >>> 20)) + a) | 0
- c += (((d & a) | (~d & b)) + k[14] - 1502002290) | 0
- c = (((c << 17) | (c >>> 15)) + d) | 0
- b += (((c & d) | (~c & a)) + k[15] + 1236535329) | 0
- b = (((b << 22) | (b >>> 10)) + c) | 0
-
- a += (((b & d) | (c & ~d)) + k[1] - 165796510) | 0
- a = (((a << 5) | (a >>> 27)) + b) | 0
- d += (((a & c) | (b & ~c)) + k[6] - 1069501632) | 0
- d = (((d << 9) | (d >>> 23)) + a) | 0
- c += (((d & b) | (a & ~b)) + k[11] + 643717713) | 0
- c = (((c << 14) | (c >>> 18)) + d) | 0
- b += (((c & a) | (d & ~a)) + k[0] - 373897302) | 0
- b = (((b << 20) | (b >>> 12)) + c) | 0
- a += (((b & d) | (c & ~d)) + k[5] - 701558691) | 0
- a = (((a << 5) | (a >>> 27)) + b) | 0
- d += (((a & c) | (b & ~c)) + k[10] + 38016083) | 0
- d = (((d << 9) | (d >>> 23)) + a) | 0
- c += (((d & b) | (a & ~b)) + k[15] - 660478335) | 0
- c = (((c << 14) | (c >>> 18)) + d) | 0
- b += (((c & a) | (d & ~a)) + k[4] - 405537848) | 0
- b = (((b << 20) | (b >>> 12)) + c) | 0
- a += (((b & d) | (c & ~d)) + k[9] + 568446438) | 0
- a = (((a << 5) | (a >>> 27)) + b) | 0
- d += (((a & c) | (b & ~c)) + k[14] - 1019803690) | 0
- d = (((d << 9) | (d >>> 23)) + a) | 0
- c += (((d & b) | (a & ~b)) + k[3] - 187363961) | 0
- c = (((c << 14) | (c >>> 18)) + d) | 0
- b += (((c & a) | (d & ~a)) + k[8] + 1163531501) | 0
- b = (((b << 20) | (b >>> 12)) + c) | 0
- a += (((b & d) | (c & ~d)) + k[13] - 1444681467) | 0
- a = (((a << 5) | (a >>> 27)) + b) | 0
- d += (((a & c) | (b & ~c)) + k[2] - 51403784) | 0
- d = (((d << 9) | (d >>> 23)) + a) | 0
- c += (((d & b) | (a & ~b)) + k[7] + 1735328473) | 0
- c = (((c << 14) | (c >>> 18)) + d) | 0
- b += (((c & a) | (d & ~a)) + k[12] - 1926607734) | 0
- b = (((b << 20) | (b >>> 12)) + c) | 0
-
- a += ((b ^ c ^ d) + k[5] - 378558) | 0
- a = (((a << 4) | (a >>> 28)) + b) | 0
- d += ((a ^ b ^ c) + k[8] - 2022574463) | 0
- d = (((d << 11) | (d >>> 21)) + a) | 0
- c += ((d ^ a ^ b) + k[11] + 1839030562) | 0
- c = (((c << 16) | (c >>> 16)) + d) | 0
- b += ((c ^ d ^ a) + k[14] - 35309556) | 0
- b = (((b << 23) | (b >>> 9)) + c) | 0
- a += ((b ^ c ^ d) + k[1] - 1530992060) | 0
- a = (((a << 4) | (a >>> 28)) + b) | 0
- d += ((a ^ b ^ c) + k[4] + 1272893353) | 0
- d = (((d << 11) | (d >>> 21)) + a) | 0
- c += ((d ^ a ^ b) + k[7] - 155497632) | 0
- c = (((c << 16) | (c >>> 16)) + d) | 0
- b += ((c ^ d ^ a) + k[10] - 1094730640) | 0
- b = (((b << 23) | (b >>> 9)) + c) | 0
- a += ((b ^ c ^ d) + k[13] + 681279174) | 0
- a = (((a << 4) | (a >>> 28)) + b) | 0
- d += ((a ^ b ^ c) + k[0] - 358537222) | 0
- d = (((d << 11) | (d >>> 21)) + a) | 0
- c += ((d ^ a ^ b) + k[3] - 722521979) | 0
- c = (((c << 16) | (c >>> 16)) + d) | 0
- b += ((c ^ d ^ a) + k[6] + 76029189) | 0
- b = (((b << 23) | (b >>> 9)) + c) | 0
- a += ((b ^ c ^ d) + k[9] - 640364487) | 0
- a = (((a << 4) | (a >>> 28)) + b) | 0
- d += ((a ^ b ^ c) + k[12] - 421815835) | 0
- d = (((d << 11) | (d >>> 21)) + a) | 0
- c += ((d ^ a ^ b) + k[15] + 530742520) | 0
- c = (((c << 16) | (c >>> 16)) + d) | 0
- b += ((c ^ d ^ a) + k[2] - 995338651) | 0
- b = (((b << 23) | (b >>> 9)) + c) | 0
-
- a += ((c ^ (b | ~d)) + k[0] - 198630844) | 0
- a = (((a << 6) | (a >>> 26)) + b) | 0
- d += ((b ^ (a | ~c)) + k[7] + 1126891415) | 0
- d = (((d << 10) | (d >>> 22)) + a) | 0
- c += ((a ^ (d | ~b)) + k[14] - 1416354905) | 0
- c = (((c << 15) | (c >>> 17)) + d) | 0
- b += ((d ^ (c | ~a)) + k[5] - 57434055) | 0
- b = (((b << 21) | (b >>> 11)) + c) | 0
- a += ((c ^ (b | ~d)) + k[12] + 1700485571) | 0
- a = (((a << 6) | (a >>> 26)) + b) | 0
- d += ((b ^ (a | ~c)) + k[3] - 1894986606) | 0
- d = (((d << 10) | (d >>> 22)) + a) | 0
- c += ((a ^ (d | ~b)) + k[10] - 1051523) | 0
- c = (((c << 15) | (c >>> 17)) + d) | 0
- b += ((d ^ (c | ~a)) + k[1] - 2054922799) | 0
- b = (((b << 21) | (b >>> 11)) + c) | 0
- a += ((c ^ (b | ~d)) + k[8] + 1873313359) | 0
- a = (((a << 6) | (a >>> 26)) + b) | 0
- d += ((b ^ (a | ~c)) + k[15] - 30611744) | 0
- d = (((d << 10) | (d >>> 22)) + a) | 0
- c += ((a ^ (d | ~b)) + k[6] - 1560198380) | 0
- c = (((c << 15) | (c >>> 17)) + d) | 0
- b += ((d ^ (c | ~a)) + k[13] + 1309151649) | 0
- b = (((b << 21) | (b >>> 11)) + c) | 0
- a += ((c ^ (b | ~d)) + k[4] - 145523070) | 0
- a = (((a << 6) | (a >>> 26)) + b) | 0
- d += ((b ^ (a | ~c)) + k[11] - 1120210379) | 0
- d = (((d << 10) | (d >>> 22)) + a) | 0
- c += ((a ^ (d | ~b)) + k[2] + 718787259) | 0
- c = (((c << 15) | (c >>> 17)) + d) | 0
- b += ((d ^ (c | ~a)) + k[9] - 343485551) | 0
- b = (((b << 21) | (b >>> 11)) + c) | 0
-
- x[0] = (a + x[0]) | 0
- x[1] = (b + x[1]) | 0
- x[2] = (c + x[2]) | 0
- x[3] = (d + x[3]) | 0
-}
-
-function md5blk(s) {
- var md5blks = [],
- i /* Andy King said do it this way. */
-
- for (i = 0; i < 64; i += 4) {
- md5blks[i >> 2] =
- s.charCodeAt(i) +
- (s.charCodeAt(i + 1) << 8) +
- (s.charCodeAt(i + 2) << 16) +
- (s.charCodeAt(i + 3) << 24)
- }
- return md5blks
-}
-
-function md5blk_array(a) {
- var md5blks = [],
- i /* Andy King said do it this way. */
-
- for (i = 0; i < 64; i += 4) {
- md5blks[i >> 2] =
- a[i] + (a[i + 1] << 8) + (a[i + 2] << 16) + (a[i + 3] << 24)
- }
- return md5blks
-}
-
-function md51(s) {
- var n = s.length,
- state = [1732584193, -271733879, -1732584194, 271733878],
- i,
- length,
- tail,
- tmp,
- lo,
- hi
-
- for (i = 64; i <= n; i += 64) {
- md5cycle(state, md5blk(s.substring(i - 64, i)))
- }
- s = s.substring(i - 64)
- length = s.length
- tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
- for (i = 0; i < length; i += 1) {
- tail[i >> 2] |= s.charCodeAt(i) << (i % 4 << 3)
- }
- tail[i >> 2] |= 0x80 << (i % 4 << 3)
- if (i > 55) {
- md5cycle(state, tail)
- for (i = 0; i < 16; i += 1) {
- tail[i] = 0
- }
- }
-
- // Beware that the final length might not fit in 32 bits so we take care of that
- tmp = n * 8
- tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/)
- lo = parseInt(tmp[2], 16)
- hi = parseInt(tmp[1], 16) || 0
-
- tail[14] = lo
- tail[15] = hi
-
- md5cycle(state, tail)
- return state
-}
-
-function md51_array(a) {
- var n = a.length,
- state = [1732584193, -271733879, -1732584194, 271733878],
- i,
- length,
- tail,
- tmp,
- lo,
- hi
-
- for (i = 64; i <= n; i += 64) {
- md5cycle(state, md5blk_array(a.subarray(i - 64, i)))
- }
-
- // Not sure if it is a bug, however IE10 will always produce a sub array of length 1
- // containing the last element of the parent array if the sub array specified starts
- // beyond the length of the parent array - weird.
- // https://connect.microsoft.com/IE/feedback/details/771452/typed-array-subarray-issue
- a = i - 64 < n ? a.subarray(i - 64) : new Uint8Array(0)
-
- length = a.length
- tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
- for (i = 0; i < length; i += 1) {
- tail[i >> 2] |= a[i] << (i % 4 << 3)
- }
-
- tail[i >> 2] |= 0x80 << (i % 4 << 3)
- if (i > 55) {
- md5cycle(state, tail)
- for (i = 0; i < 16; i += 1) {
- tail[i] = 0
- }
- }
-
- // Beware that the final length might not fit in 32 bits so we take care of that
- tmp = n * 8
- tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/)
- lo = parseInt(tmp[2], 16)
- hi = parseInt(tmp[1], 16) || 0
-
- tail[14] = lo
- tail[15] = hi
-
- md5cycle(state, tail)
-
- return state
-}
-
-function rhex(n) {
- var s = '',
- j
- for (j = 0; j < 4; j += 1) {
- s += hex_chr[(n >> (j * 8 + 4)) & 0x0f] + hex_chr[(n >> (j * 8)) & 0x0f]
- }
- return s
-}
-
-function hex(x) {
- var i
- for (i = 0; i < x.length; i += 1) {
- x[i] = rhex(x[i])
- }
- return x.join('')
-}
-
-// In some cases the fast add32 function cannot be used..
-if (hex(md51('hello')) !== '5d41402abc4b2a76b9719d911017c592') {
- add32 = function(x, y) {
- var lsw = (x & 0xffff) + (y & 0xffff),
- msw = (x >> 16) + (y >> 16) + (lsw >> 16)
- return (msw << 16) | (lsw & 0xffff)
- }
-}
-
-// ---------------------------------------------------
-
-/**
- * ArrayBuffer slice polyfill.
- *
- * @see https://github.com/ttaubert/node-arraybuffer-slice
- */
-
-if (typeof ArrayBuffer !== 'undefined' && !ArrayBuffer.prototype.slice) {
- ;(function() {
- function clamp(val, length) {
- val = val | 0 || 0
-
- if (val < 0) {
- return Math.max(val + length, 0)
- }
-
- return Math.min(val, length)
- }
-
- ArrayBuffer.prototype.slice = function(from, to) {
- var length = this.byteLength,
- begin = clamp(from, length),
- end = length,
- num,
- target,
- targetArray,
- sourceArray
-
- if (to !== undefined) {
- end = clamp(to, length)
- }
-
- if (begin > end) {
- return new ArrayBuffer(0)
- }
-
- num = end - begin
- target = new ArrayBuffer(num)
- targetArray = new Uint8Array(target)
-
- sourceArray = new Uint8Array(this, begin, num)
- targetArray.set(sourceArray)
-
- return target
- }
- })()
-}
-
-// ---------------------------------------------------
-
-/**
- * Helpers.
- */
-
-function toUtf8(str) {
- str += ''
- if (/[\u0080-\uFFFF]/.test(str)) {
- str = unescape(encodeURIComponent(str))
- }
-
- return str
-}
-
-function utf8Str2ArrayBuffer(str, returnUInt8Array) {
- var length = str.length,
- buff = new ArrayBuffer(length),
- arr = new Uint8Array(buff),
- i
-
- for (i = 0; i < length; i += 1) {
- arr[i] = str.charCodeAt(i)
- }
-
- return returnUInt8Array ? arr : buff
-}
-
-function arrayBuffer2Utf8Str(buff) {
- return String.fromCharCode.apply(null, new Uint8Array(buff))
-}
-
-function concatenateArrayBuffers(first, second, returnUInt8Array) {
- var result = new Uint8Array(first.byteLength + second.byteLength)
-
- result.set(new Uint8Array(first))
- result.set(new Uint8Array(second), first.byteLength)
-
- return returnUInt8Array ? result : result.buffer
-}
-
-function hexToBinaryString(hex) {
- var bytes = [],
- length = hex.length,
- x
-
- for (x = 0; x < length - 1; x += 2) {
- bytes.push(parseInt(hex.substr(x, 2), 16))
- }
-
- return String.fromCharCode.apply(String, bytes)
-}
-
-// ---------------------------------------------------
-
-/**
- * SparkMD5 OOP implementation.
- *
- * Use this class to perform an incremental md5, otherwise use the
- * static methods instead.
- */
-
-function SparkMD5() {
- // call reset to init the instance
- this.reset()
-}
-
-/**
- * Appends a string.
- * A conversion will be applied if an utf8 string is detected.
- *
- * @param {String} str The string to be appended
- *
- * @return {SparkMD5} The instance itself
- */
-SparkMD5.prototype.append = function(str) {
- // Converts the string to utf8 bytes if necessary
- // Then append as binary
- this.appendBinary(toUtf8(str))
-
- return this
-}
-
-/**
- * Appends a binary string.
- *
- * @param {String} contents The binary string to be appended
- *
- * @return {SparkMD5} The instance itself
- */
-SparkMD5.prototype.appendBinary = function(contents) {
- this._buff += contents
- this._length += contents.length
-
- var length = this._buff.length,
- i
-
- for (i = 64; i <= length; i += 64) {
- md5cycle(this._hash, md5blk(this._buff.substring(i - 64, i)))
- }
-
- this._buff = this._buff.substring(i - 64)
-
- return this
-}
-
-/**
- * Finishes the incremental computation, reseting the internal state and
- * returning the result.
- *
- * @param {Boolean} raw True to get the raw string, false to get the hex string
- *
- * @return {String} The result
- */
-SparkMD5.prototype.end = function(raw) {
- var buff = this._buff,
- length = buff.length,
- i,
- tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- ret
-
- for (i = 0; i < length; i += 1) {
- tail[i >> 2] |= buff.charCodeAt(i) << (i % 4 << 3)
- }
-
- this._finish(tail, length)
- ret = hex(this._hash)
-
- if (raw) {
- ret = hexToBinaryString(ret)
- }
-
- this.reset()
-
- return ret
-}
-
-/**
- * Resets the internal state of the computation.
- *
- * @return {SparkMD5} The instance itself
- */
-SparkMD5.prototype.reset = function() {
- this._buff = ''
- this._length = 0
- this._hash = [1732584193, -271733879, -1732584194, 271733878]
-
- return this
-}
-
-/**
- * Gets the internal state of the computation.
- *
- * @return {Object} The state
- */
-SparkMD5.prototype.getState = function() {
- return {
- buff: this._buff,
- length: this._length,
- hash: this._hash
- }
-}
-
-/**
- * Gets the internal state of the computation.
- *
- * @param {Object} state The state
- *
- * @return {SparkMD5} The instance itself
- */
-SparkMD5.prototype.setState = function(state) {
- this._buff = state.buff
- this._length = state.length
- this._hash = state.hash
-
- return this
-}
-
-/**
- * Releases memory used by the incremental buffer and other additional
- * resources. If you plan to use the instance again, use reset instead.
- */
-SparkMD5.prototype.destroy = function() {
- delete this._hash
- delete this._buff
- delete this._length
-}
-
-/**
- * Finish the final calculation based on the tail.
- *
- * @param {Array} tail The tail (will be modified)
- * @param {Number} length The length of the remaining buffer
- */
-SparkMD5.prototype._finish = function(tail, length) {
- var i = length,
- tmp,
- lo,
- hi
-
- tail[i >> 2] |= 0x80 << (i % 4 << 3)
- if (i > 55) {
- md5cycle(this._hash, tail)
- for (i = 0; i < 16; i += 1) {
- tail[i] = 0
- }
- }
-
- // Do the final computation based on the tail and length
- // Beware that the final length may not fit in 32 bits so we take care of that
- tmp = this._length * 8
- tmp = tmp.toString(16).match(/(.*?)(.{0,8})$/)
- lo = parseInt(tmp[2], 16)
- hi = parseInt(tmp[1], 16) || 0
-
- tail[14] = lo
- tail[15] = hi
- md5cycle(this._hash, tail)
-}
-
-/**
- * Performs the md5 hash on a string.
- * A conversion will be applied if utf8 string is detected.
- *
- * @param {String} str The string
- * @param {Boolean} [raw] True to get the raw string, false to get the hex string
- *
- * @return {String} The result
- */
-SparkMD5.hash = function(str, raw) {
- // Converts the string to utf8 bytes if necessary
- // Then compute it using the binary function
- return SparkMD5.hashBinary(toUtf8(str), raw)
-}
-
-/**
- * Performs the md5 hash on a binary string.
- *
- * @param {String} content The binary string
- * @param {Boolean} [raw] True to get the raw string, false to get the hex string
- *
- * @return {String} The result
- */
-SparkMD5.hashBinary = function(content, raw) {
- var hash = md51(content),
- ret = hex(hash)
-
- return raw ? hexToBinaryString(ret) : ret
-}
-
-// ---------------------------------------------------
-
-/**
- * SparkMD5 OOP implementation for array buffers.
- *
- * Use this class to perform an incremental md5 ONLY for array buffers.
- */
-SparkMD5.ArrayBuffer = function() {
- // call reset to init the instance
- this.reset()
-}
-
-/**
- * Appends an array buffer.
- *
- * @param {ArrayBuffer} arr The array to be appended
- *
- * @return {SparkMD5.ArrayBuffer} The instance itself
- */
-SparkMD5.ArrayBuffer.prototype.append = function(arr) {
- var buff = concatenateArrayBuffers(this._buff.buffer, arr, true),
- length = buff.length,
- i
-
- this._length += arr.byteLength
-
- for (i = 64; i <= length; i += 64) {
- md5cycle(this._hash, md5blk_array(buff.subarray(i - 64, i)))
- }
-
- this._buff =
- i - 64 < length
- ? new Uint8Array(buff.buffer.slice(i - 64))
- : new Uint8Array(0)
-
- return this
-}
-
-/**
- * Finishes the incremental computation, reseting the internal state and
- * returning the result.
- *
- * @param {Boolean} raw True to get the raw string, false to get the hex string
- *
- * @return {String} The result
- */
-SparkMD5.ArrayBuffer.prototype.end = function(raw) {
- var buff = this._buff,
- length = buff.length,
- tail = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
- i,
- ret
-
- for (i = 0; i < length; i += 1) {
- tail[i >> 2] |= buff[i] << (i % 4 << 3)
- }
-
- this._finish(tail, length)
- ret = hex(this._hash)
-
- if (raw) {
- ret = hexToBinaryString(ret)
- }
-
- this.reset()
-
- return ret
-}
-
-/**
- * Resets the internal state of the computation.
- *
- * @return {SparkMD5.ArrayBuffer} The instance itself
- */
-SparkMD5.ArrayBuffer.prototype.reset = function() {
- this._buff = new Uint8Array(0)
- this._length = 0
- this._hash = [1732584193, -271733879, -1732584194, 271733878]
-
- return this
-}
-
-/**
- * Gets the internal state of the computation.
- *
- * @return {Object} The state
- */
-SparkMD5.ArrayBuffer.prototype.getState = function() {
- var state = SparkMD5.prototype.getState.call(this)
-
- // Convert buffer to a string
- state.buff = arrayBuffer2Utf8Str(state.buff)
-
- return state
-}
-
-/**
- * Gets the internal state of the computation.
- *
- * @param {Object} state The state
- *
- * @return {SparkMD5.ArrayBuffer} The instance itself
- */
-SparkMD5.ArrayBuffer.prototype.setState = function(state) {
- // Convert string to buffer
- state.buff = utf8Str2ArrayBuffer(state.buff, true)
-
- return SparkMD5.prototype.setState.call(this, state)
-}
-
-SparkMD5.ArrayBuffer.prototype.destroy = SparkMD5.prototype.destroy
-
-SparkMD5.ArrayBuffer.prototype._finish = SparkMD5.prototype._finish
-
-/**
- * Performs the md5 hash on an array buffer.
- *
- * @param {ArrayBuffer} arr The array buffer
- * @param {Boolean} [raw] True to get the raw string, false to get the hex one
- *
- * @return {String} The result
- */
-SparkMD5.ArrayBuffer.hash = function(arr, raw) {
- var hash = md51_array(new Uint8Array(arr)),
- ret = hex(hash)
-
- return raw ? hexToBinaryString(ret) : ret
-}
-
-var _sparkIns = new SparkMD5()
-
-export function md5(str) {
- _sparkIns.append(str)
- return _sparkIns.end()
-}
-
-export function md5Sum(binStr) {
- _sparkIns.appendBinary(binStr)
- return _sparkIns.end()
-}
-
-export default _sparkIns
diff --git a/src/css/codemirror-dark.scss b/src/css/codemirror-dark.scss
deleted file mode 100644
index 310915c..0000000
--- a/src/css/codemirror-dark.scss
+++ /dev/null
@@ -1,219 +0,0 @@
-.CodeMirror {
- height: 100%;
- line-height: 1.5;
- font-family: monospace;
- position: relative;
- overflow: hidden;
- background: #272822;
- color: #f8f8f2;
-}
-.CodeMirror-scroll {
- overflow: auto;
- height: 100%;
- width: 100%;
- position: relative;
- outline: 0;
-}
-.CodeMirror-scrollbar {
- position: absolute;
- right: 0;
- top: 0;
- overflow-x: hidden;
- overflow-y: scroll;
- z-index: 5;
-}
-.CodeMirror-scrollbar-inner {
- width: 1px;
-}
-.CodeMirror-scrollbar.cm-sb-overlap {
- position: absolute;
- z-index: 1;
- float: none;
- right: 0;
- min-width: 12px;
-}
-.CodeMirror-scrollbar.cm-sb-nonoverlap {
- min-width: 12px;
-}
-.CodeMirror-scrollbar.cm-sb-ie7 {
- min-width: 18px;
-}
-.CodeMirror-gutter {
- position: absolute;
- left: 0;
- top: 0;
- z-index: 10;
- background-color: transparent;
- border-right: 1px solid #454545;
- min-width: 2em;
- height: 100%;
-}
-.CodeMirror-gutter-text {
- color: #aaa;
- text-align: right;
- padding: 0.4em 0.2em 0.4em 0.4em;
- white-space: pre !important;
- cursor: default;
-}
-.CodeMirror-lines {
- padding: 0.4em;
- white-space: pre;
- cursor: text;
-}
-.CodeMirror pre {
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- -o-border-radius: 0;
- border-radius: 0;
- border-width: 0;
- background: 0 0;
- font-family: inherit;
- font-size: inherit;
- padding: 0;
- margin: 0;
- white-space: pre;
- word-wrap: normal;
- line-height: inherit;
- color: inherit;
- overflow: visible;
-}
-.CodeMirror-wrap pre {
- word-wrap: break-word;
- white-space: pre-wrap;
- word-break: normal;
-}
-.CodeMirror-wrap .CodeMirror-scroll {
- overflow-x: hidden;
-}
-.CodeMirror textarea {
- outline: 0 !important;
-}
-.CodeMirror pre.CodeMirror-cursor {
- z-index: 10;
- position: absolute;
- visibility: hidden;
- border-left: 1px solid #9effff;
- border-right: none;
- width: 0;
-}
-.cm-keymap-fat-cursor pre.CodeMirror-cursor {
- width: auto;
- border: 0;
- background: 0 0;
- background: rgba(0, 200, 0, 0.4);
- filter: progid:DXImageTransform.Microsoft.gradient(
- startColorstr=#6600c800,
- endColorstr=#4c00c800
- );
-}
-.cm-keymap-fat-cursor pre.CodeMirror-cursor:not(#nonsense_id) {
- filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-.CodeMirror-focused pre.CodeMirror-cursor {
- visibility: visible;
-}
-.CodeMirror-focused div.CodeMirror-selected,
-div.CodeMirror-selected {
- background: #49483e;
-}
-.CodeMirror-searching {
- background: #ffa;
- background: rgba(255, 255, 0, 0.4);
-}
-.cm-s-default span.cm-keyword {
- color: #f92672;
-}
-.cm-s-default span.cm-atom {
- color: #ae81ff;
-}
-.cm-s-default span.cm-number {
- color: #f30;
-}
-.cm-s-default span.cm-def {
- color: #fd971f;
-}
-.cm-s-default span.cm-variable {
- color: #f8f8f2;
-}
-.cm-s-default span.cm-variable-2 {
- color: #9effff;
-}
-.cm-s-default span.cm-property,
-.cm-s-default span.cm-variable-3 {
- color: #66d9ef;
-}
-.cm-s-default span.cm-operator {
- color: #9effff;
-}
-.cm-s-default span.cm-comment {
- color: #75715e;
-}
-.cm-s-default span.cm-string {
- color: #e6db74;
-}
-.cm-s-default span.cm-string-2 {
- color: #f50;
-}
-.cm-s-default span.cm-meta {
- color: #555;
-}
-.cm-s-default span.cm-error {
- background: #f92672;
- color: #f8f8f0;
-}
-.cm-s-default span.cm-qualifier {
- color: #75d908;
-}
-.cm-s-default span.cm-builtin {
- color: #66d9ef;
-}
-.cm-s-default span.cm-bracket {
- color: #f8f8f2;
-}
-.cm-s-default span.cm-tag {
- color: #f92672;
-}
-.cm-s-default span.cm-attribute {
- color: #a6e22e;
-}
-.cm-s-default span.cm-header {
- color: #ae81ff;
-}
-.cm-s-default span.cm-quote {
- color: #090;
-}
-.cm-s-default span.cm-hr {
- color: #999;
-}
-.cm-s-default span.cm-link {
- color: #ae81ff;
-}
-span.cm-header,
-span.cm-strong {
- font-weight: 700;
-}
-span.cm-em {
- font-style: italic;
-}
-span.cm-emstrong {
- font-style: italic;
- font-weight: 700;
-}
-span.cm-link {
- text-decoration: underline;
-}
-span.cm-invalidchar {
- color: red;
-}
-div.CodeMirror span.CodeMirror-matchingbracket {
- text-decoration: underline;
- color: #fff !important;
-}
-div.CodeMirror span.CodeMirror-nonmatchingbracket {
- color: #f22;
-}
-@media print {
- .CodeMirror pre.CodeMirror-cursor {
- visibility: hidden;
- }
-}
diff --git a/src/css/codemirror-light.scss b/src/css/codemirror-light.scss
deleted file mode 100644
index 40d439a..0000000
--- a/src/css/codemirror-light.scss
+++ /dev/null
@@ -1,226 +0,0 @@
-.CodeMirror {
- height: 100%;
- line-height: 1.5;
- font-family: monospace;
- position: relative;
- overflow: hidden;
- background: #fff;
- color: #666;
-}
-.CodeMirror-scroll {
- overflow: auto;
- height: 100%;
- width: 100%;
- position: relative;
- outline: 0;
-}
-.CodeMirror-scrollbar {
- position: absolute;
- right: 0;
- top: 0;
- overflow-x: hidden;
- overflow-y: scroll;
- z-index: 5;
-}
-.CodeMirror-scrollbar-inner {
- width: 1px;
-}
-.CodeMirror-scrollbar.cm-sb-overlap {
- position: absolute;
- z-index: 1;
- float: none;
- right: 0;
- min-width: 12px;
-}
-.CodeMirror-scrollbar.cm-sb-nonoverlap {
- min-width: 12px;
-}
-.CodeMirror-scrollbar.cm-sb-ie7 {
- min-width: 18px;
-}
-.CodeMirror-gutter {
- position: absolute;
- left: 0;
- top: 0;
- z-index: 10;
- background-color: transparent;
- border-right: 1px solid #454545;
- min-width: 2em;
- height: 100%;
-}
-.CodeMirror-gutter-text {
- color: #aaa;
- text-align: right;
- padding: 0.4em 0.2em 0.4em 0.4em;
- white-space: pre !important;
- cursor: default;
-}
-.CodeMirror-lines {
- padding: 0.4em;
- white-space: pre;
- cursor: text;
-}
-.CodeMirror pre {
- -moz-border-radius: 0;
- -webkit-border-radius: 0;
- -o-border-radius: 0;
- border-radius: 0;
- border-width: 0;
- background: 0 0;
- font-family: inherit;
- font-size: inherit;
- padding: 0;
- margin: 0;
- white-space: pre;
- word-wrap: normal;
- line-height: inherit;
- color: inherit;
- overflow: visible;
-}
-.CodeMirror-wrap pre {
- word-wrap: break-word;
- white-space: pre-wrap;
- word-break: normal;
-}
-.CodeMirror-wrap .CodeMirror-scroll {
- overflow-x: hidden;
-}
-.CodeMirror textarea {
- outline: 0 !important;
-}
-.CodeMirror pre.CodeMirror-cursor {
- z-index: 10;
- position: absolute;
- visibility: hidden;
- border-left: 1px solid #f00;
- border-right: none;
- width: 0;
-}
-.cm-keymap-fat-cursor pre.CodeMirror-cursor {
- width: auto;
- border: 0;
- background: 0 0;
- background: rgba(0, 200, 0, 0.4);
- filter: progid:DXImageTransform.Microsoft.gradient(
- startColorstr=#6600c800,
- endColorstr=#4c00c800
- );
-}
-.cm-keymap-fat-cursor pre.CodeMirror-cursor:not(#nonsense_id) {
- filter: progid:DXImageTransform.Microsoft.gradient(enabled=false);
-}
-.CodeMirror-focused pre.CodeMirror-cursor {
- visibility: visible;
-}
-.CodeMirror-focused div.CodeMirror-selected,
-div.CodeMirror-selected {
- background: #49483e;
-}
-.CodeMirror-searching {
- background: #ffa;
- background: rgba(255, 255, 0, 0.4);
-}
-.cm-s-default span.cm-keyword {
- color: #f92672;
-}
-.cm-s-default span.cm-atom {
- color: #ae81ff;
-}
-.cm-s-default span.cm-number {
- color: #f30;
-}
-.cm-s-default span.cm-def {
- color: #fd971f;
-}
-.cm-s-default span.cm-variable {
- color: #f8f8f2;
-}
-.cm-s-default span.cm-variable-2 {
- color: #05a;
-}
-.cm-s-default span.cm-property,
-.cm-s-default span.cm-variable-3 {
- color: #3298dc;
-}
-.cm-s-default span.cm-operator {
- color: #9effff;
-}
-.cm-s-default span.cm-comment {
- border: 1px solid #eee;
- color: #75715e;
-}
-.cm-s-default span.cm-string {
- color: #a11;
-}
-.cm-s-default span.cm-string-2 {
- color: #f50;
-}
-.cm-s-default span.cm-meta {
- color: #555;
-}
-.cm-s-default span.cm-error {
- background: #f92672;
- color: #f8f8f0;
-}
-.cm-s-default span.cm-qualifier {
- color: #75d908;
-}
-.cm-s-default span.cm-builtin {
- color: #66d9ef;
-}
-.cm-s-default span.cm-bracket {
- color: #f8f8f2;
-}
-.cm-s-default span.cm-tag {
- color: #13b65a;
-}
-.cm-s-default span.cm-attribute {
- color: #a6e22e;
-}
-.cm-s-default span.cm-header {
- color: #f92672;
-}
-.cm-s-default span.cm-quote {
- color: #666;
- background: #f2f2f2;
-}
-.cm-s-default span.cm-hr {
- color: #999;
-}
-.cm-s-default span.cm-link {
- color: #ae81ff;
-}
-.cm-s-default span.cm-strikethrough {
- text-decoration: line-through;
-}
-span.cm-header,
-span.cm-strong {
- font-weight: bold;
- color: #333;
-}
-span.cm-em {
- font-style: italic;
- color: #f90;
-}
-span.cm-emstrong {
- font-style: italic;
- font-weight: bold;
-}
-span.cm-link {
- text-decoration: underline;
-}
-span.cm-invalidchar {
- color: red;
-}
-div.CodeMirror span.CodeMirror-matchingbracket {
- text-decoration: underline;
- color: #fff !important;
-}
-div.CodeMirror span.CodeMirror-nonmatchingbracket {
- color: #f22;
-}
-@media print {
- .CodeMirror pre.CodeMirror-cursor {
- visibility: hidden;
- }
-}
diff --git a/src/css/meditor.scss b/src/css/meditor.scss
deleted file mode 100644
index d283122..0000000
--- a/src/css/meditor.scss
+++ /dev/null
@@ -1,176 +0,0 @@
-@charset "UTF-8";
-/**
- *
- * @authors yutent (yutent.io@gmail.com)
- * @date 2017-04-17 16:43:22
- *
- */
-
-@import "var.scss";
-
-@font-face {font-family: "mefont";
- src: url('data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAABDgAAsAAAAAGjQAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADMAAABCsP6z7U9TLzIAAAE8AAAARAAAAFZW7kj5Y21hcAAAAYAAAAEiAAADJvKfD8xnbHlmAAACpAAAC34AABEks46ovmhlYWQAAA4kAAAALwAAADYSRyUqaGhlYQAADlQAAAAcAAAAJAfeA5xobXR4AAAOcAAAABQAAABsa+kAAGxvY2EAAA6EAAAAOAAAADg5KD12bWF4cAAADrwAAAAfAAAAIAEzAG5uYW1lAAAO3AAAAUUAAAJtPlT+fXBvc3QAABAkAAAAvAAAAP9/ieb9eJxjYGRgYOBikGPQYWB0cfMJYeBgYGGAAJAMY05meiJQDMoDyrGAaQ4gZoOIAgCKIwNPAHicY2Bk/s84gYGVgYOpk+kMAwNDP4RmfM1gxMjBwMDEwMrMgBUEpLmmMDgwVDznYG7438AQw9zA0AAUZgTJAQAmTQx8eJzFkstKA0EQRc+YOEaN7/fgyrW4EPEb/KR8lL+SrLOKBuIdQ0LMMiSQ8XYqCIIuxSrOQFcNXUXfC2wCNXNr6pD1yEjRdTVb1WvsrOp1nn0uOFxVWuqoq76GGmuqmRaqyrxsVJX/aantXk8DjTRxb67lV+/nyHxvwbXzxhPvuHc+8OhMvQ1PrHvTnC0abHv6Lk322OfA2xxxzAmnnHHOBZdc+Say/NdZfx7Z/43+Hs30yZ7WJ78KrTVeUe3Ar4s6QXKCukFyg3pBcoleAquAXgPrgfqBlUGDwBqhtyC5RwqsGyqDtJ3eA2uJhoFVRaPA+qJxYKXRJLDm6COw+mga2AdoFtgRaB7YG2gR2CVoGdgvqArsHMo8sIcoGwHFJzJ5ihwAAHiclVd5bBxnFZ/3zbXXzB5zrXe9x8x4Z2yvvV7v7JHDseM0l5O0uRsCTWVHobkamjSUJLQhrpo0pIDa1JZIW0SjpAipVKilBCqIRIuSCvjHCFTRhIq2UGhRpQoofyDBTnkz6ysJf5TR6Dved8y7f28olqI+eZe+TCcpieqk+qnl1AaKAq4IhkgyoNvVEimCorOKJou0bdo6bxolegloBierlXrV0jiei4IIWXD0St0uERtq1UGyGCpqBqAtndqcKLQn6CcglLSzp9w15AIoObM9OtjrjvQMyZW8FDgSSSTaEomvBziWDRDCREU4oKlBNhji3OfYaEq5nOsiOYi02al124V8OjH21eoXMgUtCDA+DlI6L353KJ6K4/tQSpUSbXxMCCRTgtkhw5H3wkkpkrH+ROFDvIYepylqkBrypOSBs+wSNKBe0bIge/MSwVnVMnDIcypSGzAIVcv2Kd68Up/eQN9JwH1l6XNDA7AYHuj9Yq+iqop7JjnYByqMcEKCdy8RyDJGYdSGI+lMJr3o3CL3sdVktXXX6PYCrOOFOA+ngLhv1aC+YGIR3G5ZUl+1nHBfkqC7oYLFxSKc+yYhxuZcnmRhQ3Jw+WCyUnF/sOLl5bqey0En7mApriUXeYeKUjmql1pIjVBrKKqgl8COD0JDz4IWFwGNpMRlVdMHoRZHkWjb4nLAc1kYQolsi6dRQLUh1S3abtRLEAVOzoHqDIJNO82n9SJAUSf3+H3zy3IqJZNdXls/HhQDhw5xtMAeZ54Mcb8hDBNmf0uYdw8fZonAfYVh8A1wXB56DZI3egH75jtGL3kW0nLzHTkN2JM89u7VfXwiMDbGiCyznwm7TMhtY0OECcH7bMj91s6dTJTBhQizn4aoLzbry34CbdpNOdQAdSe1DS2LgovAo9hoLd9YJk6RiMpAoswrnCKrTqXRXy/gqu/JjRmHpjm+nzPsfsO7QtXK/ejZeEsDj9MnmGsXLl5jmGsXhx8os6EoA8U9iyav0PSVyYkrjA0hPsx2uxlVV/H9e9xrVY6hlz1zG6EDIYBQx4bi1hH021AAHr7gXeRd11VgxSCbN4Hxr2GuTGwfAUICwfD6X8T8OxqtG10XIJvzTkfYeAIMNhwIw4xfD9FA2agDqoAyotGQ4T6YlRmlNw0OVZLDSNV8bYBu2bV6Q1c1hQMq3XNs9eh9QDYPHmvsZsjxnSMHzDZzdMmWnUB/tnRsxRiBU/d/5hHCNZ8KA4TJbmwPpcsN2Lpq9XLNkTdu3DgKUCm0md1rh1YMx5z01i3b9hNYAsMQ1rwjWhjZZDDffEID2itKJSmdMihKdyq+dmvolyXgTSnu1FVF5Xg67lRU5NW0Ad4/cY7AlhW1hXDm8O8GT+/eC5+//8TkoWMAD953/ODB9XeJjLR90a7t4L4KAItXLFkO7sOwdM0d2zayc7HvfTdNtaOH6CJgKDRo0xDRxTFzlaAIkuP1JvnQ/XkgEg6ePnoxJEAkBPdhJ4Sevv+JYAgiBfIJhBMoUHMsqsViWpQ8G0l4olGh2TjkKJ4SUUKV0qgsxmSfn2+0hlYztSjYvK017CHgNd6p8XahYTd4XIOb49XgvHj1mPPi1SSjvfu6xrv3vYodjHfv/ai0r/MrXXvd97weOvfCH5qj07F03u+b6/hgkCfnvRamd79V2mcfx82l1l3j/l3Ffe6od2z6eBOPk2eDfNM/SUb54Iz+RlF/YbQbJTlxPe7ETWzNAvZou4YTdxTzfBn6+/rcqTL8efuqVFfM2vB7mnJfhtubFDzknizBMoOLhtzjPS2boC+M+XcWbroTfQFTFPop+q+TBQWTM8bgDR/4cP26XE7pEJNyOV+qrh5IR4W735j/sdy2U3UL/TytZjMG3LZo6OQqGqB0gyyVm77rxU5lECzPG+1ZDhroh8iB4oeOaVhzTLyvRLvacwXSv9ApQjatmKImlbLFOujpXCfAkj67Np+lhYbU3rWmB2zoMbMmIWpCV9MIP1YlQgfqxQWDusfaPP5U9J4bOTQVs2bWkOSYteoQmIi+s+yQV7utr53q6d6AMRARR+Z/+eiRIyYo7scn46qdz03MxURL//atevCSoZczbE/tfL3hxyLmjXnCy2Ln4q5CPt4mauHnTgSVTM9CIEt77Or8Ly8wpXR1hyNEEq/3PhiD4ZUr12LuacmJ9m/J2UGVb+QAU5dpcTxav/Vdw0I7aDjm0Sp+JtMG5wl+IZyJFRwS61Z6HYCF3c4wkLXVdJdo5vLxQpyx9FR+PlOwKxqHO0aTqeHhJSOwe/exvZBMuMUytLUPLwdwqFaumsWWIlXFquH/QRaertYrqswZliQbGMA4UT4dgHzwo0R7At+FZVERPh1OyLBFkKSUJLlr2tthZUwU4jP8P0z+iJmonerByoAC28J8N4f6tOUVPVnwihoLboH9Yz/hokFgn38+wMiBn3LXAwLjXqU5UaRhMc2633/hhQAjBS/z/GWOEwJBOP0kS8ICe+pRTuK5CTYGOwjLNXfyEY7lyLf5iJt89DQnc9wkG2MnGVADFLRyJpxDH8CsbFjVupf/ZI7e0yyHRDFEfo0t7BFQE4DNjXYx0W/WUGt9uYxpxtFt+8DCyKhXcCZ7VLXiVzisB/XTNGN6T3XmnOfv3rwP6LEDmU2Z65nMQFCLBwYikesRI3IgEjkTiGvBM5mM+0Yw6dOvCbrg0YMJn34g2mF3RK+3tw+QL92byVzLbsIbcGkAj1+P4A0GbtUSuHVT9oeBeDK4WGgt4DVnAnjlmdz63AExGhWvZzZnBijEEF9O8hqOoogkOtWF+F719ITS6JxMm5ysOWjF6b6ANE2vN6oWTFNglmJCLxlKJJqvSaN2IjHzkvNIkHABws2VN1MCZAL8Yu8t6AF8u1qd96rhCHRCkZBi8yV/HhJm+B0nLo7iPs461FZqbI5fdpYbeo4vTPUNP6JtP9YxzdYXg2LSDVWr4LpdQ/izbFz2MpAie0lY8ZOw5GAe9DAB0xOUpoUjm+bYnzdSsgYyGRC5WEiLKqmMIkTyuwRRkJMkockxkGKRaCKlptqEOGTURJLuyCajbfl7yJO+Bv4zLaP75vRgKleWUhitiYjQXurTSLv7N/QqVRAQIMIyltqyBKqaCgMjx7Q2gdx9r8KEHk/P5HavRghRGfzj8v5CWoWnbTX0FuJr/bOgz2J1Frd5mo/XyXdiEUEzNSF8sbkhjgUCw5IX45rWHCIv8nD+4L8vAdkIoUhB0wqR0BNtUvNcTGOgTSJ7pDYTAi77yjhkfgUHAx4L4OVeEqF9q0EcC954vUIi+OsCKvlnMxkOkw+8eoaf5TeMHpjHLLJg+h+xlQb9OpOeTYAi2K0q2uBoLzMqjrfg+PUo1j5IMVnTq/Uc77DjQbummF71ZxLqkWcIeeaRk157sjwMMFzu99r9Rp+u9xmvO/keyAOkJIdQc2OX+t900hWeDIcmw+HJUHjS/QcMlctD4LcHNV0v5fOwGkpmqU9uh+bozCg/MyDnZ0azeOz9N4YoBRGZAg+nYgWFy0BhbmjDyFGsPpcehZ+1eg4OuY+DBr/MP2b/uBPmj7E6bOn1bYxsCTWbRpw3EYXL+Pe2jFqFOW29r2X9xiKQR/Cna06GmDXbrDkNnGro/nQLaKp185aBt1zzKjO95m38XHNtVFGi5JLXTn08NdUxhS32H0ZlOasoO2KynJPlu6J+F/ve1NQU/GVqirytxprfwJ+RGDkcU785MeFempiwzp61Jl6ZwBcuK3lVzSvz20O46fGzZ8/O5OvxaRyt+bXwLTjajzE9D0f753DUNqpOwxPHpKsVRfLEqtHjCKEtIF32QJkJRtni3kUTV2n66sSkh6PBAOLoX5+SpGvhYCDyUYkIsgDjrQPzkBRhd9ID0sntI7SHoxuUHa2tOU1z/yWGQ56Z/guRTPqGAAB4nGNgZGBgAGLW2qma8fw2Xxm4WRhA4PrkD7MQ9P+HLAzMEkAuBwMTSBQAKrMK4gB4nGNgZGBgbvjfwBDDwgACQJKRARVIAwBHIQKEeJxjYWBgYH7JwMDCQHsMAHVjAVUAAAAAAHYA4gFgAeICOAJ0AqYDFAM+A3oDygP+BD4EjgTuBUAFWgXOBiYGuAb8BxAHkge8CDIIknicY2BkYGCQZkhi4GMAASYg5gJCBob/YD4DABX3AaIAeJxlj01OwzAQhV/6B6QSqqhgh+QFYgEo/RGrblhUavdddN+mTpsqiSPHrdQDcB6OwAk4AtyAO/BIJ5s2lsffvHljTwDc4Acejt8t95E9XDI7cg0XuBeuU38QbpBfhJto41W4Rf1N2MczpsJtdGF5g9e4YvaEd2EPHXwI13CNT+E69S/hBvlbuIk7/Aq30PHqwj7mXle4jUcv9sdWL5xeqeVBxaHJIpM5v4KZXu+Sha3S6pxrW8QmU4OgX0lTnWlb3VPs10PnIhVZk6oJqzpJjMqt2erQBRvn8lGvF4kehCblWGP+tsYCjnEFhSUOjDFCGGSIyujoO1Vm9K+xQ8Jee1Y9zed0WxTU/3OFAQL0z1xTurLSeTpPgT1fG1J1dCtuy56UNJFezUkSskJe1rZUQuoBNmVXjhF6XNGJPyhnSP8ACVpuyAAAAHicbcxJVsMwEIRhlZDjWAnzTLhCFoz3keX2U78IySjtwPHBZsu/qPetSmn1l1X/t4HGEQwqLFBjiQYWK6xxjBOc4gznuMAlrnCNG9ziDvd4wAaPCt8LJ+J8aNqY/c7njkzvPC37nGTbUWxmtDl2q1ksLrK3/Rjj3heipMOTDs86vOjwqsObDu+GU58tp8iJ5sMJ0+x+Zy82l47KdmI9sJexkBl4oHoodGD6qj7HLFSJayMZ4Q9S6geOyDnC') format('woff');
-}
-
-.do-meditor {position:relative;display:block;width:100%;height:100%;padding-top:36px;border:1px solid nth($cp, 3);background:#fff;color:nth($cgr, 3);
-
- ::-webkit-scrollbar {width:5px;height:5px;background:nth($cp, 1);}
- ::-webkit-scrollbar:hover {background:nth($cp, 2);}
- ::-webkit-scrollbar-button {display:none;}
- ::-webkit-scrollbar-thumb {background:nth($cgr, 1);}
- ::-webkit-scrollbar-thumb:hover {background:nth($cgr, 2);}
-
- &.disabled{border-color:nth($co, 1);
-
- &::after {position:absolute;left:0;top:0;z-index:100;width:100%;height:100%;content:"";background:rgba(255, 182, 24, 0.07);}
- }
-
- .tool-bar {overflow:hidden;position:absolute;top:0;left:0;z-index:99;width:100%;height:36px;line-height:35px;border-bottom:1px solid nth($cp, 2);background:#fff;color:nth($cd, 2);text-align:center;font-size:24px;
-
- span {float:left;width:35px;height:35px;
-
- &:hover,&.active {background:#f7f8fb;}
- &.icon-pipe {width:14px;background:#fff;color:nth($cp, 3);text-indent:-6px;}
- }
- }
-
- .editor-body{overflow:hidden;overflow-y:auto;float:left;width:100%;height:100%;padding:5px 5px 90px;line-height:1.5;border:0;outline:none;resize:none;color:nth($cgr, 1);background:#fff;font-size:13px;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;}
-
- .md-preview {float:right;overflow:hidden;overflow-y:auto;display:block;width:50%;height:100%;padding:10px 10px 90px;line-height:1.5;border-left:1px solid nth($cp, 2);color:nth($cd, 1);font-size:14px;background:#fff;}
-
-
-
- /*全屏模式*/
- &.fullscreen {position:fixed;left:0;top:0;z-index:999;}
-
- &.preview .editor-body {width:50%}
-
-}
-
-.do-meditor__icon {display:inline-block;font-family:"mefont" !important;font-style:normal;-webkit-font-smoothing: antialiased;-moz-osx-font-smoothing: grayscale;
-
- &.icon-attach:before { content: "\e6cd"; }
- &.icon-blockcode:before { content: "\e6ce"; }
- &.icon-face:before { content: "\e6d8"; }
- &.icon-through:before { content: "\e6de"; }
- &.icon-bold:before { content: "\e6df"; }
- &.icon-italic:before { content: "\e6e0"; }
- &.icon-fullscreen:before { content: "\e6e1"; }
- &.icon-h1:before { content: "\e6e4"; }
- &.icon-h2:before { content: "\e6e5"; }
- &.icon-h3:before { content: "\e6e6"; }
- &.icon-h4:before { content: "\e6e7"; }
- &.icon-h5:before { content: "\e6e8"; }
- &.icon-h6:before { content: "\e6e9"; }
- &.icon-about:before { content: "\e6eb"; }
- &.icon-inlinecode:before { content: "\e6ec"; }
- &.icon-hr:before { content: "\e6ee"; }
- &.icon-link:before { content: "\e6ef"; }
- &.icon-unordered:before { content: "\e6f0"; }
- &.icon-ordered:before { content: "\e6f8"; }
- &.icon-image:before { content: "\e6fa"; }
- &.icon-pipe:before { content: "\e6fb"; }
- &.icon-preview:before { content: "\e6fe"; }
- &.icon-quote:before { content: "\e6ff"; }
- &.icon-table:before { content: "\e706"; }
- &.icon-time:before { content: "\e708"; }
-}
-
-
-
-.do-meditor__button {overflow:hidden;position:relative;display:inline-block;width:auto;min-width:60px;height:40px;margin-left:5px;padding:0 10px;line-height:40px;color:nth($ct, 2);text-align:center;
-
- &::before {position:absolute;left:-50%;top:-50%;z-index:-1;display:block;width:200%;height:200%;border-radius:50%;background:nth($cp, 1); content:"";opacity:0;transform: scale(0, .0); transition:opacity 1.3s cubic-bezier(0.23, 1, 0.32, 1),transform 1.3s cubic-bezier(0.23, 1, 0.32, 1);}
- &:hover {
- &::before {opacity:1;transform:scale(1, .8);}
- }
- &:active {background:nth($cp, 2)}
-}
-.do-meditor__input {width:100%;height:40px;padding:0 10px;background:nth($cp, 1);border:2px solid transparent;border-radius:5px;font-size:13px;@include ts();color: nth($cd, 2);
-
- &.area {height:120px;padding:5px 10px;resize:none;outline:none;}
- &:focus {background:#fff;border-color:nth($cd, 2);}
-
- &::-webkit-input-placeholder {color:nth($cp, 3);}
-
-}
-
-
-/* 关于编辑器模块*/
-.do-meditor-about {width:400px;padding:10px 20px;
- pre {width:100%;padding-bottom:15px;line-height:1;font-size:14px;}
- a {color:nth($ct, 1)}
- p {margin:0 auto 5px;}
-}
-
-/*表格模块*/
-
-.do-meditor-table {width:270px;height:270px;padding:0;
- li {width:100%;height:27px;
- span {float:left;width:27px;height:27px;border:2px solid #fff;background:#f2f2f2;}
- span.active {background:rgba(4,151,137,.2);}
- }
-}
-
-/*表情模块*/
-.do-meditor-face {float:left;;width:241px;height:241px;border-top:1px solid #e2e2e2;border-left:1px solid #e2e2e2;
-
- li {float:left;width:40px;height:40px;padding:5px;line-height:30px;border:1px solid #e2e2e2;border-top:0;border-left:0;text-align:center;}
- li span {display:block;width:100%;height:100%;background:#fff;@include ts();}
- li:hover span {box-shadow:0 1px 5px rgba(0,0,0,.2);transform:scale(3);}
-}
-
-
-/*段落模块*/
-.do-meditor-h1 {width:150px;height:auto;
-
- li {width:100%;height:auto;padding:0 10px;line-height:1.5;font-size:18px;cursor:default;}
- li:hover {background:#f2f2f2;}
- li.h1 {font-size:25px;}
- li.h2 {font-size:23px;}
- li.h3 {font-size:21px;}
-}
-
-/*通用输入模块, 链接/图片插入/文件插入/代码块插入*/
-.do-meditor-common {width:360px;height:auto;padding:0 20px;font-size:14px;color:nth($cd, 1);
-
- section {width:100%;height: 40px;margin:10px 0;line-height:40px;
-
- .label {float: left;width:50%;}
- .submit {float:right;width:30%;}
- }
-}
-
-.do-meditor-codeblock {width:480px;height:auto;
- section {display:block;width:100%;height:auto;margin:10px 0;line-height:35px;
-
- .select {position:relative;width:200px;height:35px;color:nth($cgr, 1);
-
- select {width:100%;height:100%;padding:5px 13px;line-height:1;background:nth($cp, 1);border-radius:5px;appearance:none;border:2px solid transparent;outline:none;color: nth($cd, 2);font-size:13px;
-
- &:focus {background:#fff;border-color:nth($cd, 2);}
- &::-ms-expand {display:none;}
- &:disabled {border-color:transparent;background:#fff8ed;color:nth($cp, 3)}
- }
- .trigon {position:absolute;right:7px;top:0;width:15px;height:35px;padding:7px 0;font-size:12px;text-align:center;
- i {float:left;width:15px;height:12px;line-height:12px;}
- i:nth-child(2) {margin-top:-6px;}
- }
- }
- .submit {float:right;width:80px;}
- }
-}
-
-
-@media screen and (max-width:768px) {
- .do-meditor {
- .tool-bar {
- span {display:none;
-
- &.icon-quote,&.icon-bold,&.icon-italic,&.icon-through,&.icon-preview {display:inline-block;}
- }
- }
- .md-preview {width:100%;border:0;background:#fafafa;}
- &.preview .editor-body {display:none;}
- }
-}
\ No newline at end of file
diff --git a/src/css/meditor__attach.css b/src/css/meditor__attach.css
deleted file mode 100644
index 53e57dd..0000000
--- a/src/css/meditor__attach.css
+++ /dev/null
@@ -1 +0,0 @@
-.do-meditor-attach{width:630px;height:300px;cursor:default;color:#526273}.do-meditor-attach ::-webkit-scrollbar{width:5px;height:5px;background:#f2f5fc}.do-meditor-attach ::-webkit-scrollbar:hover{background:#e8ebf4}.do-meditor-attach ::-webkit-scrollbar-button{display:none}.do-meditor-attach ::-webkit-scrollbar-thumb{background:#bdbdbd}.do-meditor-attach ::-webkit-scrollbar-thumb:hover{background:#9e9e9e}.do-meditor-attach .tab-box{float:left;width:130px;height:300px;padding:10px 5px;text-align:center;background:#f2f5fc;border-radius:5px}.do-meditor-attach .tab-box .item{display:block;width:100%;height:40px;line-height:40px;border-radius:3px;cursor:pointer}.do-meditor-attach .tab-box .item.active{background:#fff}.do-meditor-attach .cont-box{position:relative;float:right;width:480px;height:auto;min-height:200px}.do-meditor-attach .cont-box .remote,.do-meditor-attach .cont-box .local{position:relative;width:92%;height:auto;margin:0 auto}.do-meditor-attach .cont-box .remote{padding:30px 0}.do-meditor-attach .cont-box .hide{display:none}.do-meditor-attach .cont-box .section{display:block;width:100%;height:auto;margin:15px 0;line-height:35px}.do-meditor-attach .cont-box .section .submit{float:right;width:30%;height:45px;line-height:45px}.do-meditor-attach .cont-box .select-file{width:100%;height:35px;line-height:35px}.do-meditor-attach .cont-box .select-file .file{float:left;width:100px;height:35px;border-radius:3px;background:#e8ebf4;text-align:center;cursor:pointer}.do-meditor-attach .cont-box .select-file .file:hover{background:#f2f5fc}.do-meditor-attach .cont-box .select-file .file:active{background:#dae1e9}.do-meditor-attach .cont-box .select-file .tips{display:inline-block;padding:0 10px}.do-meditor-attach .cont-box .upload-box{width:100%;height:auto;min-height:255px;padding-top:10px}.do-meditor-attach .cont-box .upload-box .thead{width:100%;height:35px;line-height:35px;background:#f2f5fc}.do-meditor-attach .cont-box .upload-box .col{overflow:hidden;float:left;height:30px;padding:0 5px;text-align:center}.do-meditor-attach .cont-box .upload-box .col:nth-child(1){width:50%}.do-meditor-attach .cont-box .upload-box .col:nth-child(2){width:35%}.do-meditor-attach .cont-box .upload-box .col:nth-child(3){width:15%}.do-meditor-attach .cont-box .upload-box .tbody{overflow:hidden;overflow-y:auto;width:100%;height:220px}.do-meditor-attach .cont-box .upload-box .tbody p{display:block;width:100%;height:30px;line-height:30px}.do-meditor-attach .cont-box .upload-box .insert{display:inline-block;padding:3px 5px;line-height:13px;background:#f2f5fc;color:#526273;cursor:pointer}.do-meditor-attach .cont-box .upload-box .red{color:#f30}.do-meditor-attach .cont-box .manager{overflow:hidden;overflow-y:auto;width:100%;height:300px}.do-meditor-attach .cont-box .manager .list-box{width:100%;-webkit-column-count:4;column-count:4;-webkit-column-gap:5;column-gap:5}.do-meditor-attach .cont-box .manager .item{margin:0 0 10px;padding:5px;text-align:center;background:#f2f5fc;-webkit-column-break-inside:avoid;break-inside:avoid;transition:background .2s ease-in-out}.do-meditor-attach .cont-box .manager .item:hover{background:#dae1e9}.do-meditor-attach .cont-box .manager .item .thumb{display:block;width:100%}.do-meditor-attach .cont-box .manager .item .name{overflow:hidden;height:30px;line-height:30px;text-align:center}.do-meditor-attach .cont-box .manager .item img{width:100%;height:auto}.do-meditor-attach .cont-box .manager .item em{line-height:1;font-size:50px}
diff --git a/src/css/meditor__attach.scss b/src/css/meditor__attach.scss
deleted file mode 100644
index a3d7d98..0000000
--- a/src/css/meditor__attach.scss
+++ /dev/null
@@ -1,84 +0,0 @@
-@charset "UTF-8";
-/**
- *
- * @authors yutent (yutent.io@gmail.com)
- * @date 2017-04-20 19:13:24
- *
- */
-@import 'var.scss';
-
-.do-meditor-attach {width:630px;height:300px;cursor:default;color:nth($cd, 2);
-
- ::-webkit-scrollbar {width:5px;height:5px;background:nth($cp, 1);}
- ::-webkit-scrollbar:hover {background:nth($cp, 2);}
- ::-webkit-scrollbar-button {display:none;}
- ::-webkit-scrollbar-thumb {background:nth($cgr, 1);}
- ::-webkit-scrollbar-thumb:hover {background:nth($cgr, 2);}
-
- .tab-box {float:left;width:130px;height:300px;padding:10px 5px;text-align:center;background:nth($cp, 1);border-radius:5px;
-
- .item {display:block;width:100%;height:40px;line-height:40px;border-radius:3px;cursor:pointer;
-
- &.active {background:#fff;}
- }
- }
-
-
- .cont-box {position:relative;float:right;width:480px;height:auto;min-height:200px;
-
- .remote,
- .local {position:relative;width:92%;height:auto;margin:0 auto;}
-
- .remote {padding:30px 0;}
- .hide {display:none;}
-
- .section {display:block;width:100%;height:auto;margin:15px 0;line-height:35px;
-
- .submit {float:right;width:30%;height:45px;line-height:45px;}
- }
-
-
- .select-file {width:100%;height:35px;line-height:35px;
-
- .file {float:left;width:100px;height:35px;border-radius:3px;background:nth($cp, 2);text-align:center;cursor:pointer;
-
- &:hover {background:nth($cp, 1);}
- &:active {background:nth($cp, 3);}
- }
- .tips {display:inline-block;padding:0 10px;}
- }
-
- .upload-box {width:100%;height:auto;min-height:255px;padding-top:10px;
-
- .thead {width:100%;height:35px;line-height:35px;background:nth($cp, 1);}
-
- .col {overflow:hidden;float:left;height:30px;padding:0 5px;text-align:center;}
- .col:nth-child(1) {width:50%}
- .col:nth-child(2) {width:35%}
- .col:nth-child(3) {width:15%}
-
- .tbody {overflow:hidden;overflow-y:auto;width:100%;height:220px;
- p {display:block;width:100%;height:30px;line-height:30px;}
- }
-
- .insert {display:inline-block;padding:3px 5px;line-height:13px;background:nth($cp, 1);color:nth($cd, 2);cursor:pointer;}
- .red {color:#f30;}
- }
-
- .manager {overflow:hidden;overflow-y:auto;width:100%;height:300px;
-
- .list-box {width:100%;column-count:4;column-gap: 5;}
- .item {margin:0 0 10px;padding:5px;text-align:center;background:nth($cp, 1); break-inside: avoid;@include ts(background);
-
- &:hover {background:nth($cp, 3)}
-
- .thumb {display:block;width:100%;}
- .name {overflow:hidden;height:30px;line-height:30px; text-align:center;}
- img {width:100%;height:auto;}
- em {line-height:1;font-size:50px;}
- }
-
- }
- }
-
-}
\ No newline at end of file
diff --git a/src/css/slider.scss b/src/css/slider.scss
deleted file mode 100644
index 2c4dab0..0000000
--- a/src/css/slider.scss
+++ /dev/null
@@ -1,109 +0,0 @@
-@charset "UTF-8";
-/**
- *
- * @authors Lincoln (875482941@qq.com)
- * @date 2017-09-07 20:32:11
- * @version $Id$
- */
-
- @import "var.scss";
-
-.do-sliders {position: relative;height: 100%;width: 100%;
- .skin{height: 100%}
- &.fullscreen{position: absolute;width: 100%;height: 100%;left: 0;top: 0;}
- .slider-content{position: relative;
-
- .container {position: relative;height: 100%;overflow: hidden;
- .box {position: relative;height: 100%;width: 100%;transition: .4s;
- .page {position:relative;display: inline-block;height: 100%;vertical-align: middle;
- img {width: 100%;height: 100%;object-fit: cover;}
- .title-class {position: absolute;width: 30%;min-height: 30px;line-height: 30px;left: 0;bottom: 15%;right: 0;margin: auto;text-align: center;font-size: 25px;}
- .elm{height: 100%;width: 100%;background: #333;}
- .default-elm{width: 100%;height: 100%;}
- .default-btn{width: 100%;height: 100%;}
- }
- .fadeType{position: absolute;left: 0;top: 0;width: 100%;transition: .4s;}
- }
- }
-
- .slider-btn {position: absolute;top: 50%;min-width: 50px;min-height: 50px;margin-top: -25px;text-decoration: none;font-size: 30px;line-height: 50px;text-align: center;border-radius: 100%;color: rgba(255,255,255,.6);font-weight: bold;z-index: 1;transition: .4s;}
- // .slider-btn:hover {color: #fff;}
- .slider-btn:nth-of-type(1){margin-left: 20px;}
- // .slider-btn:nth-of-type(1):hover{animation: left-to-right .3s;}
- .slider-btn:nth-of-type(2){right: 0;margin-right: 20px;}
- // .slider-btn:nth-of-type(2):hover{animation: right-to-left .3s;}
- }
-
- .slider-preview-btn {position: absolute;bottom: 2%;height: 12%;width: 100%;margin: 0 auto;text-align: center;overflow: hidden;
-
- span {display: inline-block;width: 10px;height: 10px;margin: 0 5px;border-radius: 100%;background: rgba(255,255,255,0.8);cursor: pointer;transition: .5s;}
- span:hover{background:nth($cg, 1);}
- .no-preview-act{background:nth($cg, 3);}
-
- .btn-group{height: 100%;}
-
- .btn-img{display: inline-block;position: relative;width: 80px;height: 100%;margin: 0 5px;transition: .4s;cursor: pointer;
- img {position: relative;width: 100%;height: 100%;object-fit: cover;transition: .4s;z-index: 2;}
- .preview-act{transform: scale(.95)}
- }
- .btn-img:after {content: '';position: absolute;left: 0;top: 0;width: 100%;height: 100%;opacity: 0;transition: .8s;z-index: 1;}
- .btn-img.act:after {opacity: 1;}
- }
- .slider-preview-btn-vertical{right: 10px;bottom: 50%;width: 20px;height: auto;text-align: center;transform: translate(0, 50%);}
-
- .skin-0 .title-class{color: #e0e0e0}
- .skin-1 .title-class{color: nth($cr, 3)}
- .skin-2 .title-class{color: nth($cg, 3)}
- .skin-3 .title-class{color: nth($cb, 3)}
-
- .skin-0 .slider-btn{color: rgba(255,255,255,.6)}
- .skin-1 .slider-btn{color: nth($cr, 3)}
- .skin-2 .slider-btn{color: nth($cg, 3)}
- .skin-3 .slider-btn{color: nth($cb, 3)}
-
- .skin-0 .slider-btn:hover{color: #e0e0e0}
- .skin-1 .slider-btn:hover{color: nth($cr, 1)}
- .skin-2 .slider-btn:hover{color: nth($cg, 1)}
- .skin-3 .slider-btn:hover{color: nth($cb, 1)}
-
- .skin-0 .btn-img:after{background: rgba(0,0,0,0.5)}
- .skin-1 .btn-img:after{background: nth($cr, 1)}
- .skin-2 .btn-img:after{background: nth($cg, 1)}
- .skin-3 .btn-img:after{background: nth($cb, 1)}
-
- .skin-0 .default-elm{background: #e0e0e0}
- .skin-1 .default-elm{background: nth($cr, 1)}
- .skin-2 .default-elm{background: nth($cg, 1)}
- .skin-3 .default-elm{background: nth($cb, 1)}
-
- .skin-0 .default-btn{background: #e0e0e0}
- .skin-1 .default-btn{background: nth($cr, 1)}
- .skin-2 .default-btn{background: nth($cg, 1)}
- .skin-3 .default-btn{background: nth($cb, 1)}
-
- .skin-0 .no-preview-act{background: rgba(0,0,0,.6)}
- .skin-1 .no-preview-act{background: nth($cr, 3)}
- .skin-2 .no-preview-act{background: nth($cg, 3)}
- .skin-3 .no-preview-act{background: nth($cb, 3)}
-
- .skin-0 .slider-preview-btn span:hover{background: rgba(0,0,0,.6)}
- .skin-1 .slider-preview-btn span:hover{background: nth($cr, 3)}
- .skin-2 .slider-preview-btn span:hover{background: nth($cg, 3)}
- .skin-3 .slider-preview-btn span:hover{background: nth($cb, 3)}
-
- .h-83{height: 83%;}
- .h-100{height: 100%;}
-}
-
-
-@keyframes right-to-left{
- 49% {-webkit-transform: translate(100%)}
- 50% {-webkit-transform: translate(-100%);opacity: 0;}
- 100% {opacity: 1;}
-}
-
-@keyframes left-to-right{
- 49% {-webkit-transform: translate(-100%)}
- 50% {-webkit-transform: translate(100%);opacity: 0;}
- 100% {opacity: 1;}
-}
\ No newline at end of file
diff --git a/src/css/tree.css b/src/css/tree.css
deleted file mode 100644
index 9b2d2fc..0000000
--- a/src/css/tree.css
+++ /dev/null
@@ -1 +0,0 @@
-.do-tree{overflow:hidden;overflow-y:auto;position:relative;display:block;width:100%;height:100%;line-height:30px;font-size:15px;color:#526273}.do-tree__item{overflow:hidden;min-height:30px}.do-tree__item .sub-tree{display:none;width:100%;padding-left:20px}.do-tree__item em,.do-tree__item span{display:block;cursor:pointer}.do-tree__item em{float:left;padding:0 5px;font-size:20px;color:#62778d}.do-tree__item span:hover{color:#62778d}.do-tree__item span.active{color:#425064;font-weight:bold}.do-tree__item span.checkbox{float:left;position:relative;width:18px;height:18px;margin:6px 5px 6px 0;line-height:16px;border:1px solid #526273;border-radius:3px;font-size:16px;text-align:center}.do-tree__item span.label{white-space:nowrap;text-overflow:ellipsis}.do-tree__item.open>.sub-tree{display:block}
diff --git a/src/css/tree.scss b/src/css/tree.scss
deleted file mode 100644
index 737a6c8..0000000
--- a/src/css/tree.scss
+++ /dev/null
@@ -1,31 +0,0 @@
-@charset "UTF-8";
-/**
- *
- * @authors yutent (yutent.io@gmail.com)
- * @date 2017-04-14 21:18:53
- *
- */
-
-@import 'var.scss';
-
-
-.do-tree {overflow:hidden;overflow-y:auto;position:relative;display:block;width:100%;height:100%;line-height:30px;font-size:15px;color:nth($cd, 2);
-
- &__item {overflow:hidden; min-height:30px;
-
- .sub-tree {display:none;width:100%;padding-left:20px;}
-
- em,span {display:block;cursor:pointer;}
- em {float:left;padding:0 5px;font-size:20px;color:nth($cd, 1);}
-
- span {
-
- &:hover {color:nth($cd, 1);}
- &.active {color:nth($cd, 3);font-weight:bold;}
- &.checkbox {float:left;position:relative;width:18px;height:18px;margin:6px 5px 6px 0;line-height:16px;border:1px solid nth($cd, 2);border-radius:3px; font-size:16px;text-align:center;}
- &.label { white-space:nowrap; text-overflow:ellipsis;}
- }
- }
- &__item.open>.sub-tree {display:block;}
-
-}
\ No newline at end of file
diff --git a/src/css/var.scss b/src/css/var.scss
deleted file mode 100644
index 0e884aa..0000000
--- a/src/css/var.scss
+++ /dev/null
@@ -1,13 +0,0 @@
-$ct: #4db6ac #26a69a #009688;
-$cg: #81c784 #66bb6a #4caf50;
-$cpp: #ba68c8 #ba68c8 #9c27b0;
-$cb: #64b5f6 #42a5f5 #2196f3;
-$cr: #ff5061 #eb3b48 #ce3742;
-$co: #ffb618 #f39c12 #e67e22;
-$cp: #f2f5fc #e8ebf4 #dae1e9;
-$cgr: #bdbdbd #9e9e9e #757575;
-$cd: #62778d #526273 #425064;
-
-@mixin ts($c: all, $t: .2s, $m: ease-in-out){
- transition:$c $t $m;
-}
\ No newline at end of file
diff --git a/src/drag/core.js b/src/drag/core.js
index 7790487..b148980 100644
--- a/src/drag/core.js
+++ b/src/drag/core.js
@@ -4,8 +4,6 @@
* @date 2019/08/23 19:41:21
*/
-'use strict'
-
import $ from '../utils'
const DEF_OPT = {
diff --git a/src/drag/index.js b/src/drag/index.js
index 27e462e..4d21f78 100644
--- a/src/drag/index.js
+++ b/src/drag/index.js
@@ -5,8 +5,6 @@
*
*/
-'use strict'
-
import Drag from './core'
Anot.directive('drag', {
diff --git a/src/form/button.wc b/src/form/button.wc
index 642c986..a8d89ca 100644
--- a/src/form/button.wc
+++ b/src/form/button.wc
@@ -14,7 +14,7 @@
border-radius: 2px;
user-select: none;
-moz-user-select: none;
- color: nth($cd, 2);
+ color: var(--color-dark-2);
font-size: 14px;
cursor: pointer;
@@ -27,7 +27,7 @@
padding: 0 10px;
margin: auto;
line-height: 0;
- border: 1px solid nth($cp, 3);
+ border: 1px solid var(--color-plain-3);
border-radius: inherit;
white-space: nowrap;
background: #fff;
@@ -38,11 +38,11 @@
cursor: inherit;
&:hover {
- background: nth($cp, 1);
+ background: var(--color-plain-1);
}
&:active {
- border-color: nth($cgr, 1);
+ border-color: var(--color-grey-1);
}
&::-moz-focus-inner {
@@ -133,15 +133,15 @@
:host([loading]),
:host([disabled]) {
cursor: not-allowed;
- color: nth($cgr, 1);
+ color: var(--color-grey-1);
opacity: 0.6;
.icon {
- color: nth($cgr, 1);
+ color: var(--color-grey-1);
}
button {
background: #fff;
- border-color: nth($cp, 3);
+ border-color: var(--color-plain-3);
}
}
@@ -156,198 +156,198 @@
}
:host([color='red']) button {
- background: nth($cr, 2);
+ background: var(--color-red-2);
&:hover {
- background: nth($cr, 1);
+ background: var(--color-red-1);
}
&:active {
- background: nth($cr, 3);
+ background: var(--color-red-3);
}
}
:host([color='red'][text]) button {
background: transparent;
- color: nth($cr, 2);
+ color: var(--color-red-2);
&:hover {
- color: nth($cr, 1);
+ color: var(--color-red-1);
}
&:active {
- color: nth($cr, 3);
+ color: var(--color-red-3);
}
}
:host([color='red'][loading]) button,
:host([color='red'][disabled]) button {
- background: nth($cr, 1);
+ background: var(--color-red-1);
}
:host([color='blue']) button {
- background: nth($cb, 2);
+ background: var(--color-blue-2);
&:hover {
- background: nth($cb, 1);
+ background: var(--color-blue-1);
}
&:active {
- background: nth($cb, 3);
+ background: var(--color-blue-3);
}
}
:host([color='blue'][text]) button {
background: transparent;
- color: nth($cb, 2);
+ color: var(--color-blue-2);
&:hover {
- color: nth($cb, 1);
+ color: var(--color-blue-1);
}
&:active {
- color: nth($cb, 3);
+ color: var(--color-blue-3);
}
}
:host([color='blue'][loading]) button,
:host([color='blue'][disabled]) button {
- background: nth($cb, 1);
+ background: var(--color-blue-1);
}
:host([color='green']) button {
- background: nth($cg, 2);
+ background: var(--color-green-2);
&:hover {
- background: nth($cg, 1);
+ background: var(--color-green-1);
}
&:active {
- background: nth($cg, 3);
+ background: var(--color-green-3);
}
}
:host([color='green'][text]) button {
background: transparent;
- color: nth($cg, 2);
+ color: var(--color-green-2);
&:hover {
- color: nth($cg, 1);
+ color: var(--color-green-1);
}
&:active {
- color: nth($cg, 3);
+ color: var(--color-green-3);
}
}
:host([color='green'][loading]) button,
:host([color='green'][disabled]) button {
- background: nth($cg, 1);
+ background: var(--color-green-1);
}
:host([color='teal']) button {
- background: nth($ct, 2);
+ background: var(--color-teal-2);
&:hover {
- background: nth($ct, 1);
+ background: var(--color-teal-1);
}
&:active {
- background: nth($ct, 3);
+ background: var(--color-teal-3);
}
}
:host([color='teal'][text]) button {
background: transparent;
- color: nth($ct, 2);
+ color: var(--color-teal-2);
&:hover {
- color: nth($ct, 1);
+ color: var(--color-teal-1);
}
&:active {
- color: nth($ct, 3);
+ color: var(--color-teal-3);
}
}
:host([color='teal'][loading]) button,
:host([color='teal'][disabled]) button {
- background: nth($ct, 1);
+ background: var(--color-teal-1);
}
:host([color='orange']) button {
- background: nth($co, 2);
+ background: var(--color-orange-2);
&:hover {
- background: nth($co, 1);
+ background: var(--color-orange-1);
}
&:active {
- background: nth($co, 3);
+ background: var(--color-orange-3);
}
}
:host([color='orange'][text]) button {
background: transparent;
- color: nth($co, 2);
+ color: var(--color-orange-2);
&:hover {
- color: nth($co, 1);
+ color: var(--color-orange-1);
}
&:active {
- color: nth($co, 3);
+ color: var(--color-orange-3);
}
}
:host([color='orange'][loading]) button,
:host([color='orange'][disabled]) button {
- background: nth($co, 1);
+ background: var(--color-orange-1);
}
:host([color='dark']) button {
- background: nth($cd, 2);
+ background: var(--color-dark-2);
&:hover {
- background: nth($cd, 1);
+ background: var(--color-dark-1);
}
&:active {
- background: nth($cd, 3);
+ background: var(--color-dark-3);
}
}
:host([color='dark'][text]) button {
background: transparent;
- color: nth($cd, 2);
+ color: var(--color-dark-2);
&:hover {
- color: nth($cd, 1);
+ color: var(--color-dark-1);
}
&:active {
- color: nth($cd, 3);
+ color: var(--color-dark-3);
}
}
:host([color='dark'][loading]) button,
:host([color='dark'][disabled]) button {
- background: nth($cd, 1);
+ background: var(--color-dark-1);
}
:host([color='purple']) button {
- background: nth($cpp, 2);
+ background: var(--color-purple-2);
&:hover {
- background: nth($cpp, 1);
+ background: var(--color-purple-1);
}
&:active {
- background: nth($cpp, 3);
+ background: var(--color-purple-3);
}
}
:host([color='purple'][text]) button {
background: transparent;
- color: nth($cpp, 2);
+ color: var(--color-purple-2);
&:hover {
- color: nth($cpp, 1);
+ color: var(--color-purple-1);
}
&:active {
- color: nth($cpp, 3);
+ color: var(--color-purple-3);
}
}
:host([color='purple'][loading]) button,
:host([color='purple'][disabled]) button {
- background: nth($cpp, 1);
+ background: var(--color-purple-1);
}
:host([color='grey']) button {
- background: nth($cgr, 2);
+ background: var(--color-grey-2);
&:hover {
- background: nth($cgr, 1);
+ background: var(--color-grey-1);
}
&:active {
- background: nth($cgr, 3);
+ background: var(--color-grey-3);
}
}
:host([color='grey'][text]) button {
background: transparent;
- color: nth($cgr, 2);
+ color: var(--color-grey-2);
&:hover {
- color: nth($cgr, 1);
+ color: var(--color-grey-1);
}
&:active {
- color: nth($cgr, 3);
+ color: var(--color-grey-3);
}
}
:host([color='grey'][loading]) button,
:host([color='grey'][disabled]) button {
- background: nth($cgr, 1);
+ background: var(--color-grey-1);
}
:host([no-border]) {
diff --git a/src/form/checkbox-item.wc b/src/form/checkbox-item.wc
new file mode 100644
index 0000000..6b1c425
--- /dev/null
+++ b/src/form/checkbox-item.wc
@@ -0,0 +1,283 @@
+
+
+
+
+
+
+
diff --git a/src/form/checkbox.wc b/src/form/checkbox.wc
index 6ed849d..5dd8acf 100644
--- a/src/form/checkbox.wc
+++ b/src/form/checkbox.wc
@@ -1,163 +1,36 @@
-
+
diff --git a/src/form/radio.wc b/src/form/radio.wc
index a987b99..e77cdfd 100644
--- a/src/form/radio.wc
+++ b/src/form/radio.wc
@@ -1,282 +1,66 @@
-
+
diff --git a/src/layer/index.wc b/src/layer/index.wc
index 6106923..20eadf3 100644
--- a/src/layer/index.wc
+++ b/src/layer/index.wc
@@ -73,13 +73,13 @@
height: 60px;
padding: 15px;
font-size: 16px;
- color: nth($cd, 2);
+ color: var(--color-dark-2);
wc-icon {
--size: 14px;
&:hover {
- color: nth($cr, 1);
+ color: var(--color-red-1);
}
}
}
@@ -122,24 +122,24 @@
}
::slotted(&__toast.style-info) {
- border: 1px solid nth($cp, 3);
- background: nth($cp, 1);
- color: nth($cgr, 3);
+ border: 1px solid var(--color-plain-3);
+ background: var(--color-plain-1);
+ color: var(--color-grey-3);
}
::slotted(&__toast.style-success) {
border: 1px solid #b3e19d;
background: #f0f9eb;
- color: nth($cg, 2);
+ color: var(--color-green-2);
}
::slotted(&__toast.style-warn) {
border: 1px solid #faebb4;
background: #fffbed;
- color: nth($co, 3);
+ color: var(--color-orange-3);
}
::slotted(&__toast.style-error) {
border: 1px solid #f5c4c4;
background: #fef0f0;
- color: nth($cr, 1);
+ color: var(--color-red-1);
}
}
@@ -159,7 +159,7 @@
height: 30px;
padding: 0 10px;
margin: 0 5px;
- border: 1px solid nth($cp, 3);
+ border: 1px solid var(--color-plain-3);
border-radius: 2px;
white-space: nowrap;
background: #fff;
@@ -169,11 +169,11 @@
color: inherit;
&:hover {
- background: nth($cp, 1);
+ background: var(--color-plain-1);
}
&:active {
- border-color: nth($cgr, 1);
+ border-color: var(--color-grey-1);
}
&:focus {
@@ -182,14 +182,14 @@
&:last-child {
color: #fff;
- background: nth($ct, 2);
+ background: var(--color-teal-2);
border-color: transparent;
&:hover {
- background: nth($ct, 1);
+ background: var(--color-teal-1);
}
&:active {
- background: nth($ct, 3);
+ background: var(--color-teal-3);
}
}
@@ -275,7 +275,7 @@ function renderBtns(list) {
return html
}
-class Layer {
+export default class Layer {
props = {
left: 'auto',
right: 'auto',
@@ -789,6 +789,4 @@ Object.assign(_layer, {
})
window.layer = _layer
-
-export default _layer
diff --git a/src/markd/core.js b/src/markd/core.js
index ab47d9e..43ffe01 100644
--- a/src/markd/core.js
+++ b/src/markd/core.js
@@ -4,37 +4,32 @@
* @date 2020/02/07 17:14:19
*/
-'use strict'
const HR_LIST = ['=', '-', '_', '*']
const LIST_REG = /^(([\+\-\*])|(\d+\.))\s/
const TODO_REG = /^\-\s\[(x|\s)\]\s/
const ESCAPE_REG = /\\([-+*_`])/g
-const QLINK_REG = /^\[(\d+)\]: ([^\s]+)\s*?/
+const QLINK_REG = /^\[(\d+)\]: ([\S]+)\s*?((['"])[\s\S]*?\4)?\s*?$/
+const TAG_REG = /<([\w\-]+)([\w\W]*?)>/g
+const ATTR_REG = /^[\s\S]*?(style="[^"]*?")[\s\S]*?$/
const INLINE = {
- strong: [
- /__([^\s_])__(?!_)/g,
- /\*\*([^\s*])\*\*(?!\*)/g,
- /__([^\s][\s\S]*?[^\s])__(?!_)/g,
- /\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)/g
- ],
- em: [
- /_([^\s_])_(?!_)/g,
- /\*([^\s*])\*(?!\*)/g,
- /_([^\s][\s\S]*?[^\s])_(?!_)/g,
- /\*([^\s][\s\S]*?[^\s])\*(?!\*)/g
- ],
- del: [/~~([^\~])~~(?!~)/g, /~~([^\s][\s\S]*?[^\s])~~(?!~)/g],
- qlink: /\[(.*?)\]\[(\d*?)\]/g
+ code: /`([^`]*?[^`\\\s])`/g,
+ strong: [/__([\s\S]*?[^\s\\])__(?!_)/g, /\*\*([\s\S]*?[^\s\\])\*\*(?!\*)/g],
+ em: [/_([\s\S]*?[^\s\\])_(?!_)/g, /\*([\s\S]*?[^\s\\*])\*(?!\*)/g],
+ del: /~~([\s\S]*?[^\s\\~])~~/g,
+ qlink: /\[([^\]]*?)\]\[(\d*?)\]/g, // 引用链接
+ img: /\!\[([^\]]*?)\]\(([^)]*?)\)/g,
+ a: /\[([^\]]*?)\]\(([^)]*?)(\s+"([\s\S]*?)")*?\)/g,
+ qlist: /(()*?)([\+\-\*]|\d+\.) (.*)/ // 引用中的列表
}
-const log = console.log
const Helper = {
// 是否分割线
isHr(str) {
var s = str[0]
if (HR_LIST.includes(s)) {
- return str.startsWith(s.repeat(3))
+ var reg = new RegExp('^\\' + escape(s) + '{3,}$')
+ return reg.test(str)
}
return false
},
@@ -67,7 +62,7 @@ const Helper = {
},
isQLink(str) {
if (QLINK_REG.test(str)) {
- return RegExp.$2
+ return { [RegExp.$1]: { l: RegExp.$2, t: RegExp.$3 } }
}
return false
},
@@ -80,21 +75,37 @@ const Decoder = {
// 内联样式
inline(str) {
return str
- .replace(/`([^`]*?[^`\\\s])`/g, '$1
')
+ .replace(INLINE.code, '$1
')
.replace(INLINE.strong[0], '$1')
.replace(INLINE.strong[1], '$1')
- .replace(INLINE.strong[2], '$1')
- .replace(INLINE.strong[3], '$1')
.replace(INLINE.em[0], '$1')
.replace(INLINE.em[1], '$1')
- .replace(INLINE.em[2], '$1')
- .replace(INLINE.em[3], '$1')
- .replace(INLINE.del[0], '$1')
- .replace(INLINE.del[1], '$1')
- .replace(/\!\[([^]*?)\]\(([^)]*?)\)/g, '')
- .replace(/\[([^]*?)\]\(([^)]*?)\)/g, '$1')
- .replace(INLINE.qlink, (m, s, n) => {
- return `${s}`
+ .replace(INLINE.del, '$1')
+ .replace(INLINE.img, '')
+ .replace(INLINE.a, (m1, txt, link, m2, attr = '') => {
+ var tmp = attr
+ .split(';')
+ .filter(_ => _)
+ .map(_ => {
+ var a = _.split('=')
+ if (a.length > 1) {
+ return `${a[0]}="${a[1]}"`
+ } else {
+ return `title="${_}"`
+ }
+ })
+ .join(' ')
+
+ return `${txt}`
+ })
+ .replace(INLINE.qlink, (m, txt, n) => {
+ var _ = this.__LINKS__[n]
+ if (_) {
+ var a = _.t ? `title=${_.t}` : ''
+ return `${txt}`
+ } else {
+ return m
+ }
})
.replace(ESCAPE_REG, '$1') // 处理转义字符
},
@@ -131,7 +142,7 @@ const Decoder = {
var stat = todoChecked === 1 ? 'checked' : ''
var txt = todoChecked === 1 ? `${word}` : word
- return ``
+ return ``
}
return false
}
@@ -151,8 +162,15 @@ class Tool {
.replace(/\t/g, ' ')
.replace(/\u00a0/g, ' ')
.replace(/\u2424/g, '\n')
+ .replace(TAG_REG, (m, name, attr) => {
+ attr = attr.replace(/\n/g, '⨨☇') // 标签内的换行, 转为一组特殊字符, 方便后面还原
+ if (attr) {
+ attr = ' ' + attr
+ }
+ return `<${name + attr}>`
+ })
- var links = []
+ var links = {}
var list = []
var lines = str.split('\n')
var isCodeBlock = false // 是否代码块
@@ -184,10 +202,28 @@ class Tool {
)
isTable = true
} else {
- var isQlink = Helper.isQLink(it)
+ var qlink
+ if (isCodeBlock) {
+ it = it
+ .replace(//g, '>')
+ .replace(/⨨☇/g, '\n') // 代码块要还原回换行
+ } else {
+ it = it
+ .replace(/(⨨☇)+/g, ' ') // 非代码块直接转为空格, 并进行xss过滤
+ .replace(INLINE.code, (m, txt) => {
+ return `\`${txt.replace(//g, '>')}\``
+ })
+ .replace(/<(\/?)script[^>]*?>/g, '<$1script>')
+ .replace(TAG_REG, (m, name, attr) => {
+ attr = attr.replace(ATTR_REG, '$1').trim()
+ return `<${name} ${attr}>`
+ })
+ }
+ qlink = Helper.isQLink(it)
- if (isQlink) {
- links.push(isQlink)
+ if (qlink) {
+ Object.assign(links, qlink)
} else {
list.push(it)
}
@@ -205,7 +241,6 @@ class Tool {
list.push(tmp)
}
}
-
return new this(list, links)
}
@@ -223,50 +258,13 @@ class Tool {
var orderListLevel = -1
var unorderListLevel = -1
+ var isQuoteList = false // 引用中的列表, 只支持一层级
+ var quoteListStyle = 0 // 1有序, 2 无序
+
//
for (let it of this.list) {
- // 空行
- if (!it) {
- // 如果是在代码中, 直接拼接, 并加上换行
- if (isCodeBlock) {
- html += it + '\n'
- } else {
- emptyLineLength++
-
- // 引用结束
- if (isBlockquote) {
- isBlockquote = false
- if (emptyLineLength > 0) {
- emptyLineLength = 0
- while (blockquoteLevel > 0) {
- blockquoteLevel--
- html += '
'
- }
- }
- continue
- }
-
- if (isList) {
- while (orderListLevel > -1 || unorderListLevel > -1) {
- if (orderListLevel > unorderListLevel) {
- html += ''
- orderListLevel--
- } else {
- html += ''
- unorderListLevel--
- }
- }
- isList = false
- continue
- }
-
- //
- if (isParagraph) {
- isParagraph = false
- html += '
'
- }
- }
- } else {
+ // 非空行
+ if (it) {
if (~it.indexOf('')) {
html += it
isTable = !isTable
@@ -308,7 +306,7 @@ class Tool {
// 同上代码块的处理
if (isCodeBlock) {
- html += it + '\n'
+ html += '\n' + it
continue
}
@@ -331,10 +329,8 @@ class Tool {
// 引用
if (it.startsWith('>')) {
- if (isBlockquote) {
- html += '
'
- }
- html += it.replace(/^(>+) /, (p, m) => {
+ let innerQuote // 是否有缩进引用
+ it = it.replace(/^(>+) /, (p, m) => {
let len = m.length
let tmp = ''
let loop = len
@@ -350,9 +346,49 @@ class Tool {
}
blockquoteLevel = len
+ innerQuote = !!tmp
return tmp
})
+ if (isBlockquote) {
+ // 没有新的缩进引用时, 才添加换行
+ if (innerQuote) {
+ // 之前有引用的列表时, 直接结束列表
+ if (isQuoteList) {
+ html += `${quoteListStyle === 1 ? 'ul' : 'ul'}>`
+ isQuoteList = false
+ }
+ }
+ }
+
+ let qListChecked = it.match(INLINE.qlist)
+ if (qListChecked) {
+ let tmp1 = qListChecked[1] // 缩进的标签
+ let tmp2 = +qListChecked[3] // 有序还是无序
+ let tmp3 = qListChecked.pop() // 文本
+ let currListStyle = tmp2 === tmp2 ? 1 : 2
+ var qlist = ''
+
+ // 已有列表
+ if (isQuoteList) {
+ // 因为只支持一层级的列表, 所以同一级别不区分有序无序, 强制统一
+ } else {
+ isQuoteList = true
+ if (currListStyle === 1) {
+ qlist += ''
+ } else {
+ qlist += ''
+ }
+ }
+
+ quoteListStyle = currListStyle
+
+ qlist += `- ${tmp3}
`
+ html += tmp1 + qlist
+ } else {
+ html += '
' + it
+ }
+
isParagraph = false
isBlockquote = true
continue
@@ -375,15 +411,7 @@ class Tool {
let level = Math.floor(ltrim / 2)
let tag = listChecked > 0 ? 'ol' : 'ul'
- if (!isList) {
- html += `<${tag}>`
- if (listChecked === 1) {
- orderListLevel = level
- } else {
- unorderListLevel = level
- }
- html += `- ${word}
`
- } else {
+ if (isList) {
if (listChecked === 1) {
if (level > orderListLevel) {
html = html.replace(/<\/li>$/, '')
@@ -405,19 +433,72 @@ class Tool {
}
unorderListLevel = level
}
+ } else {
+ html += `<${tag}>`
+ if (listChecked === 1) {
+ orderListLevel = level
+ } else {
+ unorderListLevel = level
+ }
+ html += `- ${word}
`
}
isList = true
continue
}
- // log('it => ', isParagraph, it)
+ // 无"> "前缀的引用, 继续拼到之前的, 并且不换行
+ if (isBlockquote) {
+ html += it
+ continue
+ }
+
if (isParagraph) {
html += `${it}
`
} else {
html += `${it}
`
}
isParagraph = true
+ } else {
+ // 如果是在代码中, 直接拼接, 并加上换行
+ if (isCodeBlock) {
+ html += it + '\n'
+ } else {
+ emptyLineLength++
+
+ // 引用结束
+ if (isBlockquote) {
+ isBlockquote = false
+ if (emptyLineLength > 0) {
+ emptyLineLength = 0
+ while (blockquoteLevel > 0) {
+ blockquoteLevel--
+ html += ''
+ }
+ }
+ continue
+ }
+
+ if (isList) {
+ while (orderListLevel > -1 || unorderListLevel > -1) {
+ if (orderListLevel > unorderListLevel) {
+ html += '
'
+ orderListLevel--
+ } else {
+ html += ''
+ unorderListLevel--
+ }
+ }
+ isList = false
+ continue
+ }
+
+ //
+ if (isParagraph) {
+ isParagraph = false
+ html += ''
+ }
+ }
}
}
delete this.list
diff --git a/src/markd/index.wc b/src/markd/index.wc
index 6519c6e..a4fe1a9 100644
--- a/src/markd/index.wc
+++ b/src/markd/index.wc
@@ -6,28 +6,27 @@
:host {
display: block;
line-height: 1.5;
- color: nth($cd, 1);
+ color: var(--color-dark-1);
font-size: 14px;
}
a {
text-decoration: underline;
- color: nth($ct, 2);
+ color: var(--color-teal-2);
}
a:hover {
- color: nth($ct, 1);
+ color: var(--color-teal-1);
text-decoration: none;
}
em,
del {
- color: nth($cgr, 2);
+ color: var(--color-grey-2);
}
strong,
strong em,
-strong,
-del {
- color: nth($cd, 3);
+strong {
+ color: var(--color-dark-3);
}
a {
strong,
@@ -41,7 +40,7 @@ del {
padding: 0 2px;
}
p {
- margin: 15px 0;
+ margin: 12px 0;
}
img {
max-width: 100%;
@@ -51,93 +50,24 @@ blockquote.md-quote {
margin: 10px 0;
padding: 5px 10px;
line-height: 1.5;
- border-left: 5px solid nth($ct, 1);
+ border-left: 5px solid var(--color-teal-1);
background: #f2faf7;
- color: nth($cgr, 1);
+ color: var(--color-grey-2);
p {
margin: 0;
}
}
-/* 提醒文本 */
-.md-warn,
-.md-mark {
- display: inline-block;
- position: relative;
- min-height: 35px;
- margin: 3px 0;
- padding: 3px 8px 3px 35px;
- line-height: 27px;
- border: 1px solid nth($co, 2);
- border-radius: 5px;
- background: #fffbed;
- color: nth($co, 3);
- word-break: break-all;
-
- p {
- margin: 0 !important;
- }
- i {
- position: absolute;
- left: 8px;
- top: 6px;
- line-height: 1;
- font-size: 20px;
- color: nth($cr, 2);
- }
-}
-.md-mark {
- border-color: nth($ct, 1);
- color: nth($ct, 3);
- background: #edfbf8;
- i {
- color: nth($ct, 3);
- }
-}
-.md-task {
- position: relative;
- display: inline-block;
- width: auto;
- height: 30px;
- padding-right: 10px;
- line-height: 30px;
- text-align: center;
- cursor: default;
-
- &__box {
- float: left;
- width: 18px;
- height: 18px;
- margin: 6px;
- margin-left: 0;
- line-height: 1;
- border: 1px solid nth($cgr, 1);
- border-radius: 3px;
- font-size: 16px;
- text-align: center;
- }
- &.done {
- .md-task__box {
- color: nth($cgr, 1);
- border-color: nth($cp, 3);
- background: nth($cp, 3);
- }
- .md-task__text {
- color: nth($cgr, 1);
- text-decoration: line-through;
- }
- }
-}
-
fieldset.md-hr {
margin: 30px 0;
border: 0;
- border-top: 1px dashed nth($cp, 3);
+ border-top: 1px dashed var(--color-plain-3);
legend {
padding: 0 5px;
- color: nth($cgr, 1);
+ color: var(--color-grey-1);
text-align: center;
+ font-size: 12px;
&::before {
content: '华丽丽的分割线';
}
@@ -191,8 +121,8 @@ h5,
h6 {
a {
&::before {
- content: '# ';
- color: nth($ct, 1);
+ content: '∮ ';
+ color: var(--color-teal-1);
font-weight: normal;
}
}
@@ -205,7 +135,7 @@ h1 {
h2 {
margin: 20px 0;
font-size: 22px;
- border-bottom: 1px solid nth($cp, 2);
+ border-bottom: 1px solid var(--color-plain-2);
}
h3 {
margin: 20px 0 15px;
@@ -224,27 +154,27 @@ table {
background-color: #fff;
}
thead tr {
- background: nth($cp, 1);
+ background: var(--color-plain-1);
}
th,
td {
padding: 6px 13px;
- border: 1px solid #ddd;
+ border: 1px solid var(--color-plain-2);
}
th {
font-weight: bold;
}
tr:nth-child(2n) {
- background-color: #fbfbfb;
+ background-color: #fcfdff;
}
}
code.inline {
- display: inline-block;
+ display: inline;
margin: 0 2px;
padding: 0 2px;
- color: nth($co, 3);
- background: nth($cp, 1);
+ color: var(--color-orange-3);
+ background: var(--color-plain-1);
border-radius: 2px;
font-family: Menlo, Monaco, Consolas, 'Courier New', monospace;
}
@@ -252,10 +182,11 @@ code.inline {
diff --git a/src/meditor/addon.js b/src/meditor/addon.js
new file mode 100644
index 0000000..5ebace1
--- /dev/null
+++ b/src/meditor/addon.js
@@ -0,0 +1,131 @@
+/**
+ * 基础拓展
+ * @author yutent
+ * @date 2020/10/14 17:52:44
+ */
+
+import $ from '../utils'
+
+var placeholder = '在此输入文本'
+
+function trim(str, sign) {
+ return str.replace(new RegExp('^' + sign + '|' + sign + '$', 'g'), '')
+}
+
+function docScroll(k = 'X') {
+ return window[`page${k.toUpperCase()}Offset`]
+}
+
+// 通用的弹层触发
+function showDialog(dialog, elem) {
+ var { left, top } = $.offset(elem)
+ left -= docScroll('X')
+ top += 29 - docScroll('Y')
+ left += 'px'
+ top += 'px'
+ dialog.moveTo({ top, left })
+ dialog.show()
+ return Promise.resolve(dialog)
+}
+
+export default {
+ header(elem) {
+ showDialog(this.__HEADER_ADDON__, elem)
+ },
+
+ h(level) {
+ var wrap = this.selection(true) || placeholder
+ wrap = wrap.replace(/^(#+ )?/, '#'.repeat(level) + ' ')
+ this.insert(wrap, true)
+ },
+
+ quote(elem) {
+ var wrap = this.selection(true) || placeholder
+ wrap = wrap.replace(/^(>+ )?/, '> ')
+
+ this.insert(wrap, true)
+ },
+
+ bold(elem) {
+ var wrap = this.selection() || placeholder
+ var unwrap = trim(wrap, '\\*\\*')
+ wrap = wrap === unwrap ? `**${wrap}**` : unwrap
+ this.insert(wrap, true)
+ },
+
+ italic(elem) {
+ var wrap = this.selection() || placeholder
+ var unwrap = trim(wrap, '_')
+ wrap = wrap === unwrap ? `_${wrap}_` : unwrap
+ this.insert(wrap, true)
+ },
+
+ through(elem) {
+ var wrap = this.selection() || placeholder
+ var unwrap = trim(wrap, '~~')
+ wrap = wrap === unwrap ? `~~${wrap}~~` : unwrap
+ this.insert(wrap, true)
+ },
+
+ list(elem) {
+ var wrap = this.selection(true) || placeholder
+
+ wrap = wrap.replace(/^([+\-*] )?/, '+ ')
+ this.insert(wrap, true)
+ },
+
+ order(elem) {
+ var wrap = this.selection(true) || placeholder
+
+ wrap = wrap.replace(/^(\d+\. )?/, '1. ')
+ this.insert(wrap, true)
+ },
+
+ line(elem) {
+ this.insert('\n\n---\n\n', false)
+ },
+
+ code(elem) {
+ var wrap = this.selection() || placeholder
+ var unwrap = trim(wrap, '`')
+ wrap = wrap === unwrap ? `\`${wrap}\`` : unwrap
+ this.insert(wrap, true)
+ },
+
+ codeblock(elem) {
+ this.insert('\n```language\n\n```\n')
+ },
+
+ table(elem) {
+ showDialog(this.__TABLE_ADDON__, elem)
+ },
+
+ link(elem) {
+ showDialog(this.__LINK_ADDON__, elem).then(dialog => {
+ var wrap = this.selection() || placeholder
+ dialog.__txt__.value = wrap
+ })
+ },
+
+ image(elem) {
+ this._attach = 'image'
+ showDialog(this.__ATTACH_ADDON__, elem)
+ },
+
+ attach(elem) {
+ this._attach = 'file'
+ showDialog(this.__ATTACH_ADDON__, elem)
+ },
+
+ fullscreen(elem) {
+ //
+ this.props.fullscreen = !this.props.fullscreen
+ this.classList.toggle('fullscreen', this.props.fullscreen)
+ elem.classList.toggle('active', this.props.fullscreen)
+ },
+ preview(elem) {
+ this.props.preview = !this.props.preview
+ this.__VIEW__.classList.toggle('active', this.props.preview)
+ elem.classList.toggle('active', this.props.preview)
+ }
+}
diff --git a/src/meditor/helper.js b/src/meditor/helper.js
new file mode 100644
index 0000000..b7c387a
--- /dev/null
+++ b/src/meditor/helper.js
@@ -0,0 +1,225 @@
+/**
+ * 一些公共的东西
+ * @author yutent
+ * @date 2020/10/12 18:23:23
+ */
+
+import ICONS from './svg'
+
+const ELEMS = {
+ a: function(str, attr, inner) {
+ let href = attr.match(attrExp('href'))
+ let title = attr.match(attrExp('title'))
+ let tar = attr.match(attrExp('target'))
+ let attrs = ''
+
+ href = (href && href[1]) || null
+ title = (title && title[1]) || null
+ tar = (tar && tar[1]) || '_self'
+
+ if (!href) {
+ return inner || href
+ }
+
+ href = href.replace('viod(0)', '')
+ attrs = `target=${tar}`
+ attrs += title ? `;title=${title}` : ''
+
+ return `[${inner || href}](${href} "${attrs}")`
+ },
+ em: function(str, attr, inner) {
+ return (inner && '_' + inner + '_') || ''
+ },
+ strong: function(str, attr, inner) {
+ return (inner && '**' + inner + '**') || ''
+ },
+ pre: function(str, attr, inner) {
+ inner = inner.replace(/<[/]?code>/g, '')
+ return '\n\n```\n' + inner + '\n```\n'
+ },
+ code: function(str, attr, inner) {
+ return (inner && '`' + inner + '`') || ''
+ },
+ blockquote: function(str, attr, inner) {
+ return '> ' + inner.trim()
+ },
+ img: function(str, attr, inner) {
+ var src = attr.match(attrExp('src')),
+ alt = attr.match(attrExp('alt'))
+
+ src = (src && src[1]) || ''
+ alt = (alt && alt[1]) || ''
+
+ return '![' + alt + '](' + src + ')'
+ },
+ p: function(str, attr, inner) {
+ return inner ? '\n' + inner : ''
+ },
+ br: '\n',
+ 'h([1-6])': function(str, level, attr, inner) {
+ let h = '#'.repeat(level)
+ return '\n' + h + ' ' + inner + '\n'
+ },
+ hr: '\n\n---\n\n'
+}
+
+const DEFAULT_TOOLS = [
+ 'header',
+ 'quote',
+ 'bold',
+ 'italic',
+ 'through',
+ 'list',
+ 'order',
+ 'line',
+ 'code',
+ 'codeblock',
+ 'table',
+ 'link',
+ 'image',
+ 'attach',
+ 'fullscreen',
+ 'preview'
+]
+
+export const TOOL_TITLE = {
+ header: '插入标题',
+ h1: '一级标题',
+ h2: '二级标题',
+ h3: '三级标题',
+ h4: '四级标题',
+ h5: '五级标题',
+ h6: '六级标题',
+ quote: '引用文本',
+ bold: '粗体',
+ italic: '斜体',
+ through: '横线',
+ list: '无序列表',
+ order: '有序列表',
+ line: '分割线',
+ code: '行内代码',
+ codeblock: '插入代码块',
+ table: '插入表格',
+ link: '插入连接',
+ image: '上传图片',
+ attach: '上传附件',
+ fullscreen: '全屏编辑',
+ preview: '预览'
+}
+
+export const IMAGE_EXP = /image\/(jpeg|gif|png|webp|bmp|vnd\.microsoft\.icon|svg\+xml)/
+
+// html标签的属性正则
+function attrExp(field, flag = 'i') {
+ return new RegExp(field + '\\s?=\\s?["\']?([^"\']*)["\']?', flag)
+}
+
+// 生成html标签的正则
+function tagExp(tag, open) {
+ var exp = ''
+ if (['br', 'hr', 'img'].indexOf(tag) > -1) {
+ exp = '<' + tag + '([^>]*?)\\/?>'
+ } else {
+ exp = '<' + tag + '([^>]*?)>([\\s\\S]*?)<\\/' + tag + '>'
+ }
+ return new RegExp(exp, 'gi')
+}
+
+/**
+ * 渲染工具栏图标
+ */
+export function renderToolbar(list, tag = 'span', dict = {}, showText = false) {
+ return (list || DEFAULT_TOOLS)
+ .map(it => {
+ var title = showText ? '' : `title="${dict[it] || ''}"`
+ var text = showText ? dict[it] || '' : ''
+
+ return `<${tag} data-act="${it}" ${title}>${text}${tag}>`
+ })
+ .join('')
+}
+
+/**
+ * html转成md
+ */
+export function html2md(str) {
+ try {
+ str = decodeURIComponent(str)
+ } catch (err) {}
+
+ str = str
+ .replace(/\t/g, ' ')
+ .replace(/]*>/, '')
+ .replace(attrExp('class', 'g'), '')
+ .replace(attrExp('style', 'g'), '')
+ .replace(/<(?!a |img )(\w+) [^>]*>/g, '<$1>')
+ .replace(/