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 @@ + + + + + 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, '$1') - .replace(/\[([^]*?)\]\(([^)]*?)\)/g, '$1') - .replace(INLINE.qlink, (m, s, n) => { - return `${s}` + .replace(INLINE.del, '$1') + .replace(INLINE.img, '$1') + .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 `
${txt}
` + return `
${txt}
` } 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('') || ~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 += `` + 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 += '
' + 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}` + }) + .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(/]*>.*?<\/svg>/g, '{invalid image}') + + // log(str) + for (let i in ELEMS) { + let cb = ELEMS[i] + let exp = tagExp(i) + + if (i === 'blockquote') { + while (str.match(exp)) { + str = str.replace(exp, cb) + } + } else { + str = str.replace(exp, cb) + } + + // 对另外3种同类标签做一次处理 + if (i === 'p') { + exp = tagExp('div') + str = str.replace(exp, cb) + } + if (i === 'em') { + exp = tagExp('i') + str = str.replace(exp, cb) + } + if (i === 'strong') { + exp = tagExp('b') + str = str.replace(exp, cb) + } + } + let liExp = /<(ul|ol)>(?:(?!/gi + while (str.match(liExp)) { + str = str.replace(liExp, function(match) { + match = match.replace(/<(ul|ol)>([\s\S]*?)<\/\1>/gi, function( + m, + t, + inner + ) { + let li = inner.split('') + li.pop() + + for (let i = 0, len = li.length; i < len; i++) { + let pre = t === 'ol' ? i + 1 + '. ' : '* ' + li[i] = + pre + + li[i] + .replace(/\s*
  • ([\s\S]*)/i, function(m, n) { + n = n.trim().replace(/\n/g, '\n ') + return n + }) + .replace(/<[\/]?[\w]*[^>]*>/g, '') + } + return li.join('\n') + }) + return '\n' + match.trim() + }) + } + str = str + + .replace(/<[\/]?[\w]*[^>]*>/g, '') + .replace(/```([\w\W]*)```/g, function(str, inner) { + inner = inner + .replace(/&/g, '&') + .replace(/</g, '<') + .replace(/>/g, '>') + return '```' + inner + '```' + }) + return str +} diff --git a/src/meditor/index.wc b/src/meditor/index.wc index c54c2ba..0dba42b 100644 --- a/src/meditor/index.wc +++ b/src/meditor/index.wc @@ -1,29 +1,824 @@ - + diff --git a/src/meditor/svg.js b/src/meditor/svg.js new file mode 100644 index 0000000..9f23044 --- /dev/null +++ b/src/meditor/svg.js @@ -0,0 +1,55 @@ +/** + * icon字典 + * @author yutent + * @date 2019/07/08 17:39:11 + */ + +'use strict' + +export default { + header: + 'M128 457.15h329.14v109.71H347.43v329.13H237.71V566.86H128V457.15z m767.98-219.43H680.21v658.27h-117V237.72H347.44V128.01H896l-0.02 109.71z', + h1: + 'M567.23 896h-62.15V523.45H222.22V896h-62.93V128h62.93v326.11h282.86V128h62.15v768z m297.48-1.48h-230.2v-59.5h86.99V535.26h-69.38v-47.71l6.3-1.26c32.06-6.4 57.01-15.6 78.51-28.96l1.9-1.18h47.43v378.86h78.45v59.51z', + h2: + 'M864.54 896H639.87v-41.55l2.05-2.24C745.85 738.4 792.2 657.17 792.2 588.8c0-67.27-37.32-74.53-53.37-74.53-26.94 0-48.8 24.36-62.39 44.79l-5.89 8.85-34.57-42.49 3.6-4.88C663.09 488.62 693.86 456 743.82 456c63.42 0 104.4 51.46 104.4 131.1 0 40.81-12.01 83.37-36.73 130.12-19.26 36.44-45.83 75.01-83 120.37 12.26-1.15 24.97-2.13 36.18-2.13h99.87V896z m-297.34-0.37h-62.12V523.26H222.36v372.37h-62.91V128h62.91v325.95h282.72V128h62.12v767.63z', + h3: + 'M750.38 895.4c-25.28 0-48.37-6.06-68.62-18.01-16.41-9.68-30.85-22.96-44.14-40.59l-3.25-4.31 29.65-47.34 6.88 8.82c23.21 29.74 47.46 43.58 76.3 43.58 36.26 0 59.69-26.54 59.69-67.61 0-50.29-30.34-73.71-95.49-73.71h-7.84v-54.51h7.84c30.05 0 52.33-6.8 66.22-20.2 11.9-11.49 17.94-28.18 17.94-49.63 0-34.99-18.06-56.51-48.32-57.62-27.59 1.28-49.4 21.14-62.85 37.61l-6.6 8.08-31.61-45.8 4.05-4.59c30.51-34.64 62.83-51.48 98.79-51.48 30.23 0 56.07 9.96 74.74 28.81 19.38 19.58 29.63 47.62 29.63 81.1 0 43.53-17.82 77.85-50.55 98.17 15.76 7.15 29.34 18.23 39.81 32.57 14.44 19.79 22.07 44.99 22.07 72.85 0 36.77-11.54 68.12-33.36 90.68-20.67 21.37-49.43 33.13-80.98 33.13z m-183.15 0.6h-62.15V523.45H222.22V896h-62.94V128h62.94v326.11h282.86V128h62.15v768z', + h4: + 'M823.31 894.76h-52.82V778.48H634.31v-44.16l133.11-277.17h55.89v263.64h41.41v57.7h-41.41v116.27zM695.34 720.79h75.15V599.11c0-9.81 0.37-22.31 0.86-35.25-3.17 7.66-6.55 15.63-10.16 23.98l-0.17 0.37-65.68 132.58zM567.23 896h-62.15V523.45H222.22V896h-62.94V128h62.94v326.11h282.86V128h62.15v768z', + h5: + 'M567.23 896h-62.15V523.45H222.22V896h-62.94V128h62.94v326.11h282.86V128h62.15v768z m181.59-0.16c-58.28 0-91.28-33.08-111.04-57.97l-3.36-4.24 28.84-48.43 7.06 8.89c30.07 37.86 54.74 42.97 74.91 42.97 16.75 0 32.15-8.23 43.37-23.16 12.45-16.58 19.03-39.78 19.03-67.1 0-27.27-5.93-49.76-17.16-65.04-10.5-14.28-25.51-21.83-43.44-21.83-19.59 0-31.69 7.27-49.89 22.55l-4.83 4.06-30.32-23.38 10.97-206.03h176v59.91H723.73l-6.59 97.77c12.81-6.63 25.67-9.67 40.24-9.67 31.08 0 57.49 11.98 76.37 34.65 20.55 24.67 30.97 60.1 30.97 105.32-0.01 98.95-58.31 150.73-115.9 150.73z', + h6: + 'M567.22 895.92h-62.14V523.41H222.25v372.51h-62.93V128h62.93v326.08h282.83V128h62.14v767.92z m191.63 0.08c-36.45 0-67.06-18.74-88.53-54.2-22-36.32-33.62-90.02-33.62-155.31 0-75.99 13.35-134.66 39.68-174.4 23.41-35.32 56.12-54 94.61-54 33.88 0 62.8 15.03 85.97 44.68l3.66 4.69-33.35 45.27-6.25-8.98c-12.1-17.38-30.28-27.75-48.64-27.75-22.59 0-40.82 11.25-54.18 33.43-14.23 23.61-22.73 58.91-25.36 105.12 20.59-21.5 45.78-34.22 69.27-34.22 31.54 0 57.57 12.13 75.26 35.06 18.11 23.48 27.3 57.31 27.3 100.55 0 39.09-10.89 74.77-30.67 100.48-19.64 25.52-46.33 39.58-75.15 39.58z m-65.74-175.89c2.63 39.75 9.87 70.41 21.54 91.16 11.06 19.65 25.93 29.62 44.2 29.62 28.99 0 50.02-35.72 50.02-84.94 0-26.16-4.82-47.37-13.95-61.34-9.03-13.82-22.42-20.82-39.81-20.82-21.46-0.01-43.98 16.84-62 46.32z', + codeblock: + 'M819.2 864H204.8c-42.35 0-76.8-35.89-76.8-80V240c0-44.11 34.45-80 76.8-80h614.4c42.35 0 76.8 35.89 76.8 80v544c0 44.11-34.45 80-76.8 80zM233.74 221.09c-23.02 0-41.74 19.58-41.74 43.64v494.55c0 24.06 18.72 43.64 41.74 43.64h556.52c23.02 0 41.74-19.57 41.74-43.64V264.73c0-24.06-18.72-43.64-41.74-43.64H233.74z m410.77 417.59l124.33-106.53c4.56-3.9 7.17-9.61 7.16-15.66 0-6.04-2.62-11.75-7.18-15.64L644.44 394.58l-0.08-0.07c-4.15-3.45-9.38-5.07-14.74-4.55-5.37 0.52-10.21 3.12-13.65 7.33-6.96 8.51-5.91 21.33 2.34 28.56l106.15 90.68-106.04 90.86c-5.59 4.64-8.33 12-7.14 19.23 1.2 7.3 6.21 13.39 13.08 15.91 2.23 0.82 4.55 1.21 6.85 1.21a20.11 20.11 0 0 0 13.3-5.06zM414.63 774.64c5.1-1.98 9.11-5.86 11.29-10.93L635.93 276.7c4.44-10.29-0.19-22.37-10.3-26.93-4.92-2.22-10.41-2.37-15.44-0.41-5.1 1.98-9.11 5.86-11.29 10.93L388.88 747.3c-4.44 10.28 0.18 22.36 10.3 26.93 2.63 1.19 5.42 1.78 8.21 1.78 2.45 0 4.89-0.46 7.24-1.37z m-20.52-129.77c8.5 0 16.14-5.45 19.02-13.56 2.84-8.03 0.43-17.11-6.01-22.61L299.6 516.99l107.47-91.67c5.54-4.65 8.23-12.01 7.03-19.19-1.21-7.22-6.17-13.28-12.95-15.81a20.027 20.027 0 0 0-20.06 3.61L255.2 501.31c-4.57 3.9-7.2 9.61-7.2 15.68 0 6.06 2.62 11.77 7.2 15.67l125.88 107.38a20 20 0 0 0 12.99 4.82c0.02 0.01 0.02 0.01 0.04 0.01z', + code: + 'M686.87 681.71c-2.86 0-5.73-0.45-8.5-1.38-8.85-2.96-15.33-10.29-16.91-19.12-1.6-8.91 2-17.92 9.4-23.53L829.48 513.1 670.76 388.8c-5.33-4.28-8.57-10.3-9.12-16.94-0.55-6.57 1.61-12.96 6.08-17.97 9.08-10.2 24.78-11.64 35.74-3.29l0.08 0.06 183.01 143.31c6 4.7 9.44 11.66 9.44 19.08 0 7.43-3.43 14.39-9.43 19.09l-182.94 143.7c-4.72 3.84-10.7 5.87-16.75 5.87zM356.91 865.09c-3.4 0-6.86-0.65-10.16-2.01-6.53-2.7-11.49-7.7-13.96-14.08-2.37-6.12-2.13-12.77 0.67-18.72l308.99-656.84c5.75-12.23 20.9-17.85 33.78-12.53 6.53 2.7 11.49 7.7 13.96 14.09 2.37 6.12 2.13 12.77-0.67 18.72L380.54 850.56c-4.28 9.09-13.75 14.53-23.63 14.53zM339 682.25c-5.93 0-11.73-1.98-16.32-5.58L137.47 531.83c-6.02-4.71-9.47-11.67-9.47-19.11 0-7.44 3.45-14.41 9.47-19.11L322.7 348.77c6.94-5.51 16.59-7.13 25.13-4.21 8.73 2.99 15.15 10.27 16.74 19.01 1.61 8.84-1.93 17.84-9.24 23.47L194.59 512.72l160.78 125.72c8.53 6.67 11.7 17.8 7.87 27.69-3.73 9.64-13.46 16.12-24.21 16.12H339z', + quote: + 'M328.25 527.53h120.17V896H128V617.21C128 312.66 234.77 149.55 448.42 128v138.19c-80.08 25.76-120.17 99.55-120.17 221.61v39.73z m447.62 0H896V896H575.58V617.21c0-304.55 106.74-467.66 320.32-489.21v138.19c-80.05 25.76-120.13 99.55-120.13 221.61v39.72h0.1z', + bold: + 'M573.71 758.85h-192V594.28h192c45.53 0 82.29 36.76 82.29 82.29 0 45.53-36.76 82.28-82.29 82.28m-192-493.71h164.57c45.53 0 82.29 36.75 82.29 82.29s-36.75 82.29-82.29 82.29H381.71m307.21 70.76c53.21-37.3 90.51-98.19 90.51-153.05 0-123.98-96-219.43-219.43-219.43H217.14v768h386.19c115.2 0 203.52-93.26 203.52-207.91 0.01-83.38-47.17-154.7-117.93-187.61z', + image: + 'M550.34 397.58h210.87L550.34 186.71v210.87M281.96 129.2h306.72l230.04 230.04v460.08c0 42.17-34.51 76.68-76.68 76.68H281.96c-42.56 0-76.68-34.51-76.68-76.68V205.88a76.406 76.406 0 0 1 22.38-54.3 76.406 76.406 0 0 1 54.3-22.38m0 690.12h460.08V512.6L588.68 665.96 512 589.28 281.96 819.32m76.68-421.74c-42.17 0-76.68 34.51-76.68 76.68s34.51 76.68 76.68 76.68 76.68-34.51 76.68-76.68-34.51-76.68-76.68-76.68z', + attach: + 'M821.2 466.43L501.65 785.98c-63.92 63.92-168.48 63.92-232.4 0-63.91-63.91-63.91-168.48 0-232.4l334.07-334.07c40.67-40.67 104.58-40.67 145.25 0s40.67 104.58 0 145.25L414.5 698.83c-15.97 15.97-42.13 15.97-58.1 0-15.97-15.97-15.97-42.13 0-58.1l275.97-275.97-43.57-43.57-275.98 275.96c-40.66 40.67-40.67 104.58 0 145.25s104.58 40.67 145.25 0l334.07-334.07c63.91-63.91 63.92-168.48 0-232.4s-168.49-63.91-232.4 0L225.68 510c-88.6 88.6-88.6 230.95 0 319.55s230.95 88.6 319.55 0L864.78 510l-43.58-43.57z', + link: + 'M338.96 895.99c-27.5 0-53.33-10.68-72.73-30.08L158.08 757.76c-19.4-19.4-30.08-45.24-30.08-72.74 0-27.5 10.68-53.33 30.08-72.71l135.97-135.97c12.84-12.84 33.74-12.84 46.58 0 6.22 6.22 9.65 14.5 9.65 23.3s-3.43 17.07-9.65 23.29L204.66 658.88c-14.41 14.41-14.41 37.87 0 52.29l108.15 108.15c14.41 14.42 37.87 14.42 52.31 0l216.29-216.3c6.94-6.94 10.75-16.22 10.75-26.14 0-9.92-3.82-19.21-10.75-26.15l-59.47-59.49c-6.22-6.22-9.65-14.49-9.65-23.29 0-8.8 3.43-17.07 9.65-23.29 12.84-12.84 33.74-12.84 46.58 0L628 504.14c19.38 19.36 30.06 45.19 30.06 72.73 0 27.54-10.67 53.37-30.06 72.73L411.71 865.9c-19.39 19.41-45.23 30.09-72.75 30.09zM478.8 588.96c-8.8 0-17.07-3.43-23.29-9.65l-59.49-59.48c-19.38-19.37-30.06-45.2-30.06-72.73s10.67-53.37 30.06-72.75l216.31-216.3c19.36-19.37 45.19-30.04 72.73-30.04 27.51 0 53.34 10.66 72.73 30.03L865.94 266.2c19.38 19.38 30.06 45.21 30.06 72.74 0 27.53-10.68 53.37-30.06 72.74L729.98 547.64c-6.22 6.22-14.49 9.65-23.29 9.65s-17.07-3.43-23.29-9.65c-6.22-6.22-9.65-14.49-9.65-23.29 0-8.8 3.43-17.07 9.65-23.29l135.96-135.97c6.93-6.95 10.76-16.23 10.76-26.15 0-9.92-3.82-19.21-10.76-26.15L711.2 204.64c-6.59-6.58-16.12-10.36-26.15-10.36h-0.02c-10.03 0-19.55 3.78-26.12 10.36L442.6 420.94c-6.94 6.94-10.76 16.23-10.76 26.15 0 9.92 3.82 19.2 10.76 26.14l59.49 59.49c12.84 12.85 12.84 33.74 0 46.58-6.22 6.23-14.49 9.66-23.29 9.66z', + order: + 'M320 215v82h576v-82M320 553h576v-82H320m0 338h576v-82H320m-192 9h85.33v16h-42.67v32h42.67v16H128v32h128V704H128v32z m0-256h76.8L128 547.2V576h128v-32h-76.8l76.8-67.2V448H128m64-128h42V192h-84v32h42', + italic: + 'M391.7 128c0.67 38.67 1.33 77.33 2 116h146c-58 169.14-115.99 338.28-173.99 507.42-67.14 0.17-134.28 0.33-201.42 0.5 0.06 47.64 0.11 95.28 0.17 142.92 176.19 0.39 352.39 0.77 528.58 1.16V751.42H510.29C571.1 581.95 631.9 412.47 692.7 243h167V128h-468z', + through: + 'M896 514.38v69.72H742.75c34.91 74.61 33.16 278.89-217.48 278.89-290.79 1.74-279.62-226.6-279.62-226.6l138.59 1.74c1.05 117.48 110.31 117.48 131.96 116.09 22.34-1.74 105.77-1.39 112.41-82.97 2.79-38-35.61-66.93-77.5-87.15H128v-69.72h768M770.68 371.1l-138.94-1.04s5.93-96.57-114.5-96.92c-120.44-0.7-109.96 76.69-109.96 86.45 1.4 9.77 11.87 57.88 104.73 80.88H292.42S170.59 205.85 468.01 165.75c304.06-41.82 303.36 206.04 302.67 205.35z', + + list: + 'M320 215v82h576v-82M320 553h576v-82H320m0 338h576v-82H320m-64-215c0 35.35-28.65 64-64 64s-64-28.65-64-64 28.65-64 64-64 64 28.65 64 64z m0 256c0 35.35-28.65 64-64 64s-64-28.65-64-64 28.65-64 64-64 64 28.65 64 64z m0-512c0 35.35-28.65 64-64 64s-64-28.65-64-64 28.65-64 64-64 64 28.65 64 64z', + line: + 'M868.29 539.71H155.71c-15.28 0-27.71-12.43-27.71-27.71s12.43-27.71 27.71-27.71h712.58c15.28 0 27.71 12.43 27.71 27.71s-12.43 27.71-27.71 27.71z', + preview: + 'M512 253.14c-174.51 0-322.97 106.97-384 258.86 61.03 151.89 209.49 258.86 384 258.86S834.97 663.89 896 512c-61.03-151.89-209.49-258.86-384-258.86z m0 431.49c-96 0-174.51-77.66-174.51-172.63S416 339.37 512 339.37 686.51 417.03 686.51 512 608 684.63 512 684.63z m0-276.17c-57.6 0-104.74 46.63-104.74 103.54S454.4 615.54 512 615.54 616.74 568.91 616.74 512 569.6 408.46 512 408.46z', + table: + 'M860 159H164c-19.88 0-36 16.93-36 37.82v630.36c0 20.89 16.12 37.82 36 37.82h696c19.88 0 36-16.93 36-37.82V196.82c0-20.89-16.12-37.82-36-37.82z m-422 26.74c20.98 0 38 17.01 38 38 0 20.98-17.02 38-38 38-20.99 0-38-17.01-38-38s17.02-38 38-38z m-108 0c20.98 0 38 17.01 38 38 0 20.98-17.02 38-38 38-20.99 0-38-17.01-38-38s17.01-38 38-38z m-108 0c20.98 0 38 17.01 38 38 0 20.98-17.01 38-38 38s-38-17.01-38-38 17.01-38 38-38zM664 808V664h176v144H664z m-64-144v144H424V664h176z m-416 0h176v144H184V664z m480-190h176v144H664V474zM424 618V474h176v144H424z m-64 0H184V474h176v144z m480-338v144H664V280h176z m-240 0v144H424V280h176z m-385.54 0H360v144H184V280h30.46z', + fullscreen: + 'M597.33 449.42l40.02 41.25 94.25-93.75 36.4 35V320H654.14l37.44 36.3-94.25 93.12z m-170.66 124.6l-40.41-40.68-93.53 93.93L256 592.76l0.95 111.24 113.96-0.9-37.78-35.78 93.54-93.3z m211.91-40.69l-41.25 40.02 93.75 94.24-35 36.4H768V590.14l-36.3 37.44-93.12-94.25z m-252.86-42.66l40.95-40.23-93.84-93.87L367.56 320l-111.56 0.5 0.48 113.91 36.02-37.62 93.22 93.88zM848 832H176c-26.47 0-48-19.57-48-43.64V235.64c0-24.06 21.53-43.64 48-43.64h672c26.47 0 48 19.58 48 43.64v552.73c0 24.06-21.53 43.63-48 43.63zM206.55 256c-8.02 0-14.55 5.74-14.55 12.8v486.4c0 7.06 6.53 12.8 14.55 12.8h610.91c8.02 0 14.55-5.74 14.55-12.8V268.8c0-7.06-6.53-12.8-14.55-12.8H206.55z' +} diff --git a/src/meditor2/addon/attach-native.js b/src/meditor2/addon/attach-native.js deleted file mode 100644 index 064ef94..0000000 --- a/src/meditor2/addon/attach-native.js +++ /dev/null @@ -1,372 +0,0 @@ -/** - * - * @authors yutent (yutent.io@gmail.com) - * @date 2017-04-19 21:17:26 - * - */ - -'use strict' - -import '../../layer/index' -import 'css/meditor__attach.scss' - -const $doc = Anot(document) -const LANGUAGES = { - zh: { - IMAGE: { - REMOTE: '远程图片', - LOCAL: '本地上传', - MANAGE: '图片管理', - ALT: '图片描述', - ADDRESS: '图片地址' - }, - FILE: { - REMOTE: '远程附件', - LOCAL: '本地上传', - MANAGE: '附件管理', - ALT: '附件描述', - ADDRESS: '附件地址' - }, - BTN: '确定', - INSERT: '插入', - CHOOSE: '选择文件', - LIMIT: '上传大小限制:单文件最大 ', - SCREENSHOT: '截图', - COMPRESS: '截图处理中...', - TABLE: { - NAME: '文件名', - PROGRESS: '上传进度', - HANDLE: '操作' - }, - ERROR: { - TYPE: '文件类型错误', - SIZE: '文件体积过大', - EMPTY: '描述和地址不能为空', - UNDEFINED: '在node-webkit中saveAttach回调必须定义' - } - }, - en: { - IMAGE: { - REMOTE: 'Remote image', - LOCAL: 'Local image', - MANAGE: 'Manage', - ALT: 'Image alt text', - ADDRESS: 'Image address' - }, - FILE: { - REMOTE: 'Remote file', - LOCAL: 'Local file', - MANAGE: 'Manage', - ALT: 'File alt text', - ADDRESS: 'File address' - }, - BTN: 'OK', - INSERT: 'insert', - CHOOSE: 'Choose file', - LIMIT: 'Size of upload file limit to ', - SCREENSHOT: 'screenshot', - COMPRESS: 'Screenshot compressing...', - TABLE: { - NAME: 'name', - PROGRESS: 'progress', - HANDLE: 'handle' - }, - ERROR: { - TYPE: 'Forbidden type', - SIZE: 'Too large', - EMPTY: 'Alt text and address can not be null', - UNDEFINED: 'Function saveAttach is not defined' - } - } -} -LANGUAGES['zh-CN'] = LANGUAGES.zh -LANGUAGES['zh-TW'] = LANGUAGES.zh -const lang = - LANGUAGES[window.__ENV_LANG__ || navigator.language] || LANGUAGES.en - -const fixCont = function(vm, tool) { - let limit = false - if (vm.props.uploadSizeLimit) { - limit = (vm.props.uploadSizeLimit / (1024 * 1024)).toFixed(2) - } - return ` -
    -
    - - ${lang[tool].REMOTE} - - - ${lang[tool].LOCAL} - - - ${lang[tool].MANAGE} - -
    -
    -
    -
    - -
    -
    - -
    -
    - ${lang.BTN} -
    -
    -
    -
    - - ${lang.CHOOSE} - ${limit ? `(${lang.LIMIT + limit} MB)` : ''} -
    -
      -
    • - ${lang.TABLE.NAME} - ${lang.TABLE.PROGRESS} - ${lang.TABLE.HANDLE} -
    • -
    • -

      - - - ${ - lang.INSERT - } -

      -
    • -
    -
    -
    -
      -
    • - - -

      -
    • -
    - -
    -
    -
    ` -} - -/** - * [uploadFile 文件上传] - * @param {[type]} vm [vm对象] - * @param {[type]} tool [image/file] - */ -function uploadFile(vm, tool) { - for (let it of this.files) { - let ext = it.name.slice(it.name.lastIndexOf('.')) - if (tool === 'IMAGE' && !/^\.(jpg|jpeg|png|gif|bmp|webp|ico)$/.test(ext)) { - this.uploadQueue.push({ - name: it.name, - progress: '0%(' + lang.ERROR.TYPE + ')', - url: '' - }) - continue - } - if (vm.props.uploadSizeLimit && it.size > vm.props.uploadSizeLimit) { - this.uploadQueue.push({ - name: it.name, - progress: '0%(' + lang.ERROR.SIZE + ')', - url: '' - }) - continue - } - let fixName = new Date().format('YmdHis') + ext - let attach = { name: it.name, fixName, progress: '100%', url: '' } - - if (vm.props.saveAttach) { - vm.props - .saveAttach(attach, it) - .then(url => { - attach.url = url - this.uploadQueue.push(attach) - }) - .catch(err => { - Anot.error(err) - }) - } else { - layer.toast(lang.ERROR.UNDEFINED, 'error') - } - } -} - -function uploadScreenshot(vm, blob) { - let name = new Date().format('YmdHis') + '.jpg' - let attach = { name, url: '' } - - if (vm.props.saveAttach) { - vm.props - .saveAttach(attach, blob) - .then(url => { - vm.insert(`![${lang.SCREENSHOT}](${url})`) - }) - .catch(err => { - Anot.error(err) - }) - } else { - layer.toast(lang.ERROR.UNDEFINED, 'error') - } -} - -function showDialog(elem, vm, tool) { - let offset = Anot(elem).offset() - - layer.open({ - type: 7, - menubar: false, - fixed: true, - maskClose: true, - offset: [offset.top + 35 - $doc.scrollTop()], - shift: { - top: offset.top - $doc.scrollTop() - }, - tab: 2, - attach: '', - attachAlt: '', - uploadQueue: [], //当前上传的列表 - attachList: [], //附件管理列表 - switchTab(id) { - this.tab = id - if (id === 3) { - this.attachList.clear() - if (vm.props.getAttachList) { - vm.props - .getAttachList(tool) - .then(list => { - list.forEach(it => { - let ext = it.name.slice(it.name.lastIndexOf('.')) - it.isImage = /^\.(jpg|jpeg|png|gif|bmp|webp|ico)$/.test(ext) - it.thumb = it.isImage - ? `` - : `` - }) - return list - }) - .then(list => { - list = list.filter(it => { - if (tool === 'IMAGE') { - return it.isImage - } - return true - }) - this.attachList = list - }) - } - } - }, - select() { - let ev = document.createEvent('MouseEvent') - ev.initEvent('click', false, false) - this.$refs.attach.dispatchEvent(ev) - }, - change(ev) { - this.files = ev.target.files - uploadFile.call(this, vm, tool) - }, - insert: function(it) { - if (!it.url) { - return - } - let val = `\n${tool === 'IMAGE' ? '!' : ''}[${it.name}](${it.url})` - vm.insert(val) - }, - confirm: function() { - if (!this.attach || !this.attachAlt) { - return layer.toast(lang.ERROR.EMPTY, 'error') - } - let val = `\n${tool === 'IMAGE' ? '!' : ''}[${this.attachAlt}](${ - this.attach - })` - - vm.insert(val) - this.close() - }, - content: fixCont(vm, tool) - }) -} - -const plugin = { - __init__(ME) { - Object.assign(ME.vm.addon, { - attach(elem) { - showDialog(elem, this, 'FILE') - }, - image(elem) { - showDialog(elem, this, 'IMAGE') - } - }) - - ME.vm.$refs.editor.addEventListener('paste', function(ev) { - ev.preventDefault() - let txt = ev.clipboardData.getData('text/plain') - - //文本类型直接默认处理 - if (txt) { - return - } - - if (ev.clipboardData.items) { - let items = ev.clipboardData.items - let len = items.length - let blob = null - - for (let it of items) { - if (it.type.indexOf('image') > -1) { - blob = it.getAsFile() - } - } - - if (blob !== null) { - layer.toast(lang.COMPRESS) - // 压缩截图,避免文件过大 - let reader = new FileReader() - reader.onload = function() { - let img = document.createElement('img') - let canvas = document.createElement('canvas') - - img.onload = function() { - canvas.width = img.width - canvas.height = img.height - - let ctx = canvas.getContext('2d') - ctx.clearRect(0, 0, canvas.width, canvas.height) - ctx.drawImage(this, 0, 0, canvas.width, canvas.height) - - canvas.toBlob( - obj => { - uploadScreenshot(ME.vm, obj) - }, - 'image/jpeg', - 0.8 - ) - } - img.src = this.result - } - reader.readAsDataURL(blob) - } - } - }) - } -} - -export default plugin diff --git a/src/meditor2/addon/attach.js b/src/meditor2/addon/attach.js deleted file mode 100644 index 35c466a..0000000 --- a/src/meditor2/addon/attach.js +++ /dev/null @@ -1,497 +0,0 @@ -/** - * - * @authors yutent (yutent.io@gmail.com) - * @date 2017-04-19 21:17:26 - * - */ - -'use strict' - -import '../../layer/index' -import 'css/meditor__attach.scss' - -const $doc = Anot(document) -const LANGUAGES = { - zh: { - IMAGE: { - REMOTE: '远程图片', - LOCAL: '本地上传', - MANAGE: '图片管理', - ALT: '图片描述', - ADDRESS: '图片地址' - }, - FILE: { - REMOTE: '远程附件', - LOCAL: '本地上传', - MANAGE: '附件管理', - ALT: '附件描述', - ADDRESS: '附件地址' - }, - BTN: '确定', - INSERT: '插入', - CHOOSE: '选择文件', - LIMIT: '上传大小限制:单文件最大 ', - SCREENSHOT: '截图', - COMPRESS: '截图处理中...', - TABLE: { - NAME: '文件名', - PROGRESS: '上传进度', - HANDLE: '操作' - }, - ERROR: { - TYPE: '文件类型错误', - SIZE: '文件体积过大', - EMPTY: '描述和地址不能为空' - } - }, - en: { - IMAGE: { - REMOTE: 'Remote image', - LOCAL: 'Local image', - MANAGE: 'Manage', - ALT: 'Image alt text', - ADDRESS: 'Image address' - }, - FILE: { - REMOTE: 'Remote file', - LOCAL: 'Local file', - MANAGE: 'Manage', - ALT: 'File alt text', - ADDRESS: 'File address' - }, - BTN: 'OK', - INSERT: 'insert', - CHOOSE: 'Choose file', - LIMIT: 'Size of upload file limit to ', - SCREENSHOT: 'screenshot', - COMPRESS: 'Screenshot compressing...', - TABLE: { - NAME: 'name', - PROGRESS: 'progress', - HANDLE: 'handle' - }, - ERROR: { - TYPE: 'Forbidden type', - SIZE: 'Too large', - EMPTY: 'Alt text and address can not be null' - } - } -} -LANGUAGES['zh-CN'] = LANGUAGES.zh -LANGUAGES['zh-TW'] = LANGUAGES.zh -const lang = - LANGUAGES[window.__ENV_LANG__ || navigator.language] || LANGUAGES.en - -class Uploader { - constructor(url) { - this.url = url - this.xhr = new XMLHttpRequest() - this.form = new FormData() - } - - field(key, val) { - this.form.append(key, val) - return this - } - onProgress(fn) { - this.progress = fn - return this - } - then(cb) { - if (!this.url) { - Anot.error('invalid upload url') - } - let defer = Promise.defer() - - this.xhr.open('POST', this.url, true) - this.xhr.upload.addEventListener( - 'progress', - evt => { - if (evt.lengthComputable && this.progress) { - let res = Math.round((evt.loaded * 100) / evt.total) - this.progress(res) - } - }, - false - ) - - this.xhr.onreadystatechange = () => { - if (this.xhr.readyState === 4) { - if (this.xhr.status >= 200 && this.xhr.status < 205) { - let res = this.xhr.responseText - try { - res = JSON.parse(res) - } catch (err) {} - defer.resolve(cb(res)) - } else { - defer.reject(this.xhr) - } - } - } - - this.xhr.send(this.form) - return defer.promise - } -} - -const fixCont = function(vm, tool) { - let limit = false - if (vm.props.uploadSizeLimit) { - limit = (vm.props.uploadSizeLimit / (1024 * 1024)).toFixed(2) - } - return ` -
    -
    - - ${lang[tool].REMOTE} - - - ${lang[tool].LOCAL} - - - ${lang[tool].MANAGE} - -
    -
    -
    -
    - -
    -
    - -
    -
    - ${lang.BTN} -
    -
    -
    -
    - - ${lang.CHOOSE} - ${limit ? `(${lang.LIMIT + limit} MB)` : ''} -
    -
      -
    • - ${lang.TABLE.NAME} - ${lang.TABLE.PROGRESS} - ${lang.TABLE.HANDLE} -
    • -
    • -

      - - - ${ - lang.INSERT - } -

      -
    • -
    -
    -
    -
      -
    • - - -

      -
    • -
    - -
    -
    -
    ` -} - -/** - * [uploadFile 文件上传] - * @param {[type]} vm [vm对象] - * @param {[type]} tool [image/file] - */ -function uploadFile(vm, tool) { - for (let it of this.files) { - let ext = it.name.slice(it.name.lastIndexOf('.')) - if (tool === 'IMAGE' && !/^\.(jpg|jpeg|png|gif|bmp|webp|ico)$/.test(ext)) { - this.uploadQueue.push({ - name: it.name, - progress: '0%(' + lang.ERROR.TYPE + ')', - url: '' - }) - continue - } - if (vm.props.uploadSizeLimit && it.size > vm.props.uploadSizeLimit) { - this.uploadQueue.push({ - name: it.name, - progress: '0%(' + lang.ERROR.SIZE + ')', - url: '' - }) - continue - } - let idx = this.uploadQueue.length - let fixName = new Date().format('YmdHis') + ext - let attach = { name: it.name, fixName, progress: '0%', url: '' } - let upload = new Uploader(vm.props.uploadUrl).field('file', it) - - this.uploadQueue.push(attach) - - if (vm.props.beforeUpload) { - vm.props - .beforeUpload(attach, upload) - .then(next => { - if (!next) { - return Promise.reject('something wrong with beforeUpload') - } - return upload - .onProgress(val => { - this.uploadQueue[idx].progress = val + '%' - }) - .then(res => { - if (vm.props.afterUpload) { - return vm.props.afterUpload(res) - } else { - return res.data.url - } - }) - }) - .then(url => { - this.uploadQueue[idx].url = url - }) - .catch(err => { - Anot.error(err) - }) - } else { - upload - .onProgress(val => { - this.uploadQueue[idx].progress = val + '%' - }) - .then(res => { - if (vm.props.afterUpload) { - return vm.props.afterUpload(res) - } else { - return res.data.url - } - }) - .then(url => { - this.uploadQueue[idx].url = url - }) - .catch(err => { - Anot.error(err) - }) - } - } -} - -function uploadScreenshot(vm, blob) { - let name = new Date().format('YmdHis') + '.jpg' - let attach = { name, url: '' } - let upload = new Uploader(vm.props.uploadUrl).field('file', blob) - - if (vm.props.beforeUpload) { - vm.props - .beforeUpload(attach, upload) - .then(next => { - if (!next) { - return Promise.reject('something wrong with beforeUpload') - } - return upload.then(res => { - if (vm.props.afterUpload) { - return vm.props.afterUpload(res) - } else { - return res.data.url - } - }) - }) - .then(url => { - vm.insert(`![${lang.SCREENSHOT}](${url})`) - }) - .catch(err => { - Anot.error(err) - }) - } else { - upload - .then(res => { - if (vm.props.afterUpload) { - return vm.props.afterUpload(res) - } else { - return res.data.url - } - }) - .then(url => { - vm.insert(`![${lang.SCREENSHOT}](${url})`) - }) - } -} - -function showDialog(elem, vm, tool) { - let offset = Anot(elem).offset() - - layer.open({ - type: 7, - menubar: false, - fixed: true, - maskClose: true, - offset: [offset.top + 35 - $doc.scrollTop()], - shift: { - top: offset.top - $doc.scrollTop() - }, - tab: 2, - attach: '', - attachAlt: '', - uploadQueue: [], //当前上传的列表 - attachList: [], //附件管理列表 - switchTab(id) { - this.tab = id - if (id === 3) { - this.attachList.clear() - if (vm.props.getAttachList) { - vm.props - .getAttachList(tool) - .then(list => { - list.forEach(it => { - let ext = it.name.slice(it.name.lastIndexOf('.')) - it.isImage = /^\.(jpg|jpeg|png|gif|bmp|webp|ico)$/.test(ext) - it.thumb = it.isImage - ? `` - : `` - }) - return list - }) - .then(list => { - list = list.filter(it => { - if (tool === 'IMAGE') { - return it.isImage - } - return true - }) - this.attachList = list - }) - } - } - }, - select() { - let ev = document.createEvent('MouseEvent') - ev.initEvent('click', false, false) - this.$refs.attach.dispatchEvent(ev) - }, - change(ev) { - this.files = ev.target.files - uploadFile.call(this, vm, tool) - }, - insert: function(it) { - if (!it.url) { - return - } - let val = `\n${tool === 'IMAGE' ? '!' : ''}[${it.name}](${it.url})` - vm.insert(val) - }, - confirm: function() { - if (!this.attach || !this.attachAlt) { - return layer.toast(lang.ERROR.EMPTY, 'error') - } - let val = `\n${tool === 'IMAGE' ? '!' : ''}[${this.attachAlt}](${ - this.attach - })` - - vm.insert(val) - this.close() - }, - content: fixCont(vm, tool) - }) -} - -const plugin = { - __init__(ME) { - Object.assign(ME.vm.addon, { - attach(elem) { - showDialog(elem, this, 'FILE') - }, - image(elem) { - showDialog(elem, this, 'IMAGE') - } - }) - - ME.vm.$refs.editor.addEventListener('paste', function(ev) { - ev.preventDefault() - let txt = ev.clipboardData.getData('text/plain') - - //文本类型直接默认处理 - if (txt) { - return - } - - if (ev.clipboardData.items) { - let items = ev.clipboardData.items - let len = items.length - let blob = null - - for (let it of items) { - if (it.type.indexOf('image') > -1) { - blob = it.getAsFile() - } - } - - if (blob !== null) { - layer.toast(lang.COMPRESS) - // 压缩截图,避免文件过大 - let reader = new FileReader() - reader.onload = function() { - let img = document.createElement('img') - let canvas = document.createElement('canvas') - - img.onload = function() { - canvas.width = img.width - canvas.height = img.height - - let ctx = canvas.getContext('2d') - ctx.clearRect(0, 0, canvas.width, canvas.height) - ctx.drawImage(this, 0, 0, canvas.width, canvas.height) - - // chrome, Firefox, 以及支持toBlob 设置图片质量 - if (canvas.toBlob && (window.chrome || window.sidebar)) { - canvas.toBlob( - function(obj) { - uploadScreenshot(ME.vm, obj) - }, - 'image/jpeg', - 0.8 - ) - } else { - // IE和Safari的toBlob方法还不支持图片质量的设定 - // 需要先转base64再转回Blob - let base64 = canvas.toDataURL('image/jpeg', 0.8) - let buf = atob(base64.split(',')[1]) - let intArr = new Uint8Array(buf.length) - let obj = null - - for (let i = 0; i < buf.length; i++) { - intArr[i] = buf.charCodeAt(i) - } - obj = new Blob([intArr], { type: 'image/jpeg' }) - - uploadScreenshot(ME.vm, obj) - } - } - img.src = this.result - } - reader.readAsDataURL(blob) - } - } - }) - } -} - -export default plugin diff --git a/src/meditor2/addon/base.js b/src/meditor2/addon/base.js deleted file mode 100644 index 1ec9015..0000000 --- a/src/meditor2/addon/base.js +++ /dev/null @@ -1,531 +0,0 @@ -/** - * - * @authors yutent (yutent.io@gmail.com) - * @date 2017-04-17 21:41:48 - * - */ - -'use strict' -import '../../layer/index' - -function objArr(num) { - let arr = [] - while (num > 0) { - arr.push({ v: 0 }) - num-- - } - return arr -} -function trim(str, sign) { - return str.replace(new RegExp('^' + sign + '|' + sign + '$', 'g'), '') -} - -const $doc = Anot(document) -const addon = { - h1: function(elem) { - let that = this - let offset = Anot(elem).offset() - let wrap = this.selection(true) || Anot.ui.meditor.lang.PLACEHOLDER - layer.open({ - type: 7, - menubar: false, - maskClose: true, - fixed: true, - insert: function(level) { - wrap = wrap.replace(/^(#{1,6} )?/, '#'.repeat(level) + ' ') - that.insert(wrap, true) - this.close() - }, - offset: [ - offset.top + 35 - $doc.scrollTop(), - 'auto', - 'auto', - offset.left - $doc.scrollLeft() - ], - shift: { - top: offset.top - $doc.scrollTop(), - left: offset.left - $doc.scrollLeft() - }, - content: ` -
      -
    • ${ - Anot.ui.meditor.lang.HEADERS.H1 - }
    • -
    • ${ - Anot.ui.meditor.lang.HEADERS.H2 - }
    • -
    • ${ - Anot.ui.meditor.lang.HEADERS.H3 - }
    • -
    • ${ - Anot.ui.meditor.lang.HEADERS.H4 - }
    • -
    • ${ - Anot.ui.meditor.lang.HEADERS.H5 - }
    • -
    • ${ - Anot.ui.meditor.lang.HEADERS.H6 - }
    • -
    ` - }) - }, - quote: function(elem) { - let wrap = this.selection() || Anot.ui.meditor.lang.PLACEHOLDER - wrap = '> ' + wrap - - this.insert(wrap, true) - }, - bold: function(elem) { - let wrap = this.selection() || Anot.ui.meditor.lang.PLACEHOLDER - let wraped = trim(wrap, '\\*\\*') - - wrap = wrap === wraped ? '**' + wrap + '**' : wraped - - this.insert(wrap, true) - }, - italic: function(elem) { - let wrap = this.selection() || Anot.ui.meditor.lang.PLACEHOLDER - let wraped = trim(wrap, '_') - - wrap = wrap === wraped ? '_' + wrap + '_' : wraped - - this.insert(wrap, true) - }, - through: function(elem) { - let wrap = this.selection() || Anot.ui.meditor.lang.PLACEHOLDER - let wraped = trim(wrap, '~~') - - wrap = wrap === wraped ? '~~' + wrap + '~~' : wraped - - this.insert(wrap, true) - }, - unordered: function(elem) { - let wrap = this.selection() || Anot.ui.meditor.lang.PLACEHOLDER - wrap = '* ' + wrap - - this.insert(wrap, false) - }, - ordered: function(elem) { - let wrap = this.selection() || Anot.ui.meditor.lang.PLACEHOLDER - wrap = '1. ' + wrap - - this.insert(wrap, false) - }, - hr: function(elem) { - this.insert('\n\n---\n\n', false) - }, - link: function(elem) { - let that = this - let offset = Anot(elem).offset() - let wrap = this.selection() || '' - - layer.open({ - type: 7, - menubar: false, - maskClose: true, - fixed: true, - link: '', - linkName: wrap, - linkTarget: 1, - insert: function() { - if (!this.link || !this.linkName) { - return layer.toast(Anot.ui.meditor.lang.LINK.ERROR, 'error') - } - let val = `[${this.linkName}](${this.link} ${ - this.linkTarget === 1 ? ' "target=_blank"' : '' - })` - - that.insert(val, false) - this.close() - }, - offset: [ - offset.top + 35 - $doc.scrollTop(), - 'auto', - 'auto', - offset.left - $doc.scrollLeft() - ], - shift: { - top: offset.top - $doc.scrollTop(), - left: offset.left - $doc.scrollLeft() - }, - content: ` -
    -
    - -
    -
    - -
    -
    - - -
    -
    - ${Anot.ui.meditor.lang.BTN.YES} -
    -
    ` - }) - }, - time: function(elem) { - this.insert(new Date().format(), false) - }, - face: function(elem) { - let that = this - let offset = Anot(elem).offset() - - layer.open({ - type: 7, - title: Anot.ui.meditor.lang.LAYER.FACE_TITLE, - fixed: true, - maskClose: true, - arr: [ - '😀', - '😅', - '😂', - '🤣', - '😇', - '😉', - '😍', - '😗', - '😋', - '😛', - '😜', - '🤨', - '🧐', - '🤓', - '😎', - '😞', - '😔', - '😭', - '😤', - '😡', - '😱', - '😰', - '😓', - '😬', - '🙄', - '😴', - '😪', - '🤮', - '😷', - '💩', - '👻', - '💀', - '🤝', - '👎', - '👍', - '🙏' - ], - offset: [ - offset.top + 35 - $doc.scrollTop(), - 'auto', - 'auto', - offset.left - $doc.scrollLeft() - ], - shift: { - top: offset.top - $doc.scrollTop(), - left: offset.left - $doc.scrollLeft() - }, - content: ` -
      -
    • - -
    • -
    `, - insert: function(val) { - that.insert(val, false) - } - }) - }, - table: function(elem) { - let that = this - let offset = Anot(elem).offset() - - layer.open({ - type: 7, - title: `0 ${Anot.ui.meditor.lang.TABLE.ROW} x 0 ${ - Anot.ui.meditor.lang.TABLE.COLUMN - }`, - fixed: true, - maskClose: true, - offset: [ - offset.top + 35 - $doc.scrollTop(), - 'auto', - 'auto', - offset.left - $doc.scrollLeft() - ], - shift: { - top: offset.top - $doc.scrollTop(), - left: offset.left - $doc.scrollLeft() - }, - matrix: objArr(10).map(function() { - return objArr(10) - }), - content: ` -
      -
    • - -
    • -
    `, - success: function() { - let tb = this.$refs.table - let lastx, lasty - let { lang } = Anot.ui.meditor - - Anot(tb).bind('mousemove', ev => { - if (ev.target.nodeName === 'SPAN') { - let x = ev.target.dataset.x - 0 - let y = ev.target.dataset.y - 0 - if (x === lastx && y === lasty) { - return - } - lastx = x - lasty = y - this.title = `${y + 1} ${lang.TABLE.ROW} x ${x + 1} ${ - lang.TABLE.COLUMN - }` - for (let i = 0; i <= 9; i++) { - for (let j = 0; j <= 9; j++) { - this.matrix[i][j].v = i <= y && j <= x ? 1 : 0 - } - } - } - }) - Anot(tb).bind('mouseleave', ev => { - lastx = -1 - lasty = -1 - this.title = `0 ${lang.TABLE.ROW} x 0 ${lang.TABLE.COLUMN}` - for (let i = 0; i <= 9; i++) { - for (let j = 0; j <= 9; j++) { - this.matrix[i][j].v = 0 - } - } - }) - Anot(tb).bind('click', ev => { - if (ev.target.nodeName === 'SPAN') { - let x = ev.target.dataset.x - 0 + 1 - let y = ev.target.dataset.y - 0 + 1 - - let thead = `\n\n${('| ' + lang.TABLE.THEAD + ' ').repeat(x)}|\n` - let pipe = `${'| -- '.repeat(x)}|\n` - let tbody = ('| '.repeat(x) + '|\n').repeat(y) - - that.insert(thead + pipe + tbody, false) - this.close() - } - }) - } - }) - }, - image: function(elem) { - let that = this - let offset = Anot(elem).offset() - let wrap = this.selection() || '' - - layer.open({ - type: 7, - menubar: false, - maskClose: true, - fixed: true, - img: '', - imgAlt: wrap, - insert: function() { - if (!this.img || !this.imgAlt) { - return layer.toast(Anot.ui.meditor.lang.LINK.ERROR, 'error') - } - let val = `![${this.imgAlt}](${this.img})` - - that.insert(val, false) - this.close() - }, - offset: [ - offset.top + 35 - $doc.scrollTop(), - 'auto', - 'auto', - offset.left - $doc.scrollLeft() - ], - shift: { - top: offset.top - $doc.scrollTop(), - left: offset.left - $doc.scrollLeft() - }, - content: ` -
    -
    - -
    -
    - -
    -
    - ${Anot.ui.meditor.lang.BTN.YES} -
    -
    - ` - }) - }, - attach: function(elem) { - this.addon.link.call(this, elem) - }, - inlinecode: function(elem) { - let wrap = this.selection() || Anot.ui.meditor.lang.PLACEHOLDER - let wraped = trim(wrap, '`') - - wrap = wrap === wraped ? '`' + wrap + '`' : wraped - this.insert(wrap, true) - }, - blockcode: function(elem) { - let that = this - let offset = Anot(elem).offset() - layer.open({ - type: 7, - menubar: false, - fixed: true, - __lang__: [ - { id: 'asp' }, - { id: 'actionscript', name: 'ActionScript(3.0)/Flash/Flex' }, - { id: 'bash', name: 'Bash/Shell/Bat' }, - { id: 'css' }, - { id: 'c', name: 'C' }, - { id: 'cpp', name: 'C++' }, - { id: 'csharp', name: 'C#' }, - { id: 'coffeescript', name: 'CoffeeScript' }, - { id: 'd', name: 'D' }, - { id: 'dart' }, - { id: 'delphi', name: 'Delphi/Pascal' }, - { id: 'erlang' }, - { id: 'go', name: 'Golang' }, - { id: 'html' }, - { id: 'java' }, - { id: 'javascript' }, - { id: 'json' }, - { id: 'lua' }, - { id: 'less' }, - { id: 'markdown' }, - { id: 'nginx' }, - { id: 'objective-c' }, - { id: 'php' }, - { id: 'perl' }, - { id: 'python' }, - { id: 'r', name: 'R' }, - { id: 'ruby' }, - { id: 'sql' }, - { id: 'sass', name: 'SASS/SCSS' }, - { id: 'swift' }, - { id: 'typescript' }, - { id: 'xml' }, - { id: 'yaml' }, - { id: 'other', name: Anot.ui.meditor.lang.CODE.OTHER } - ], - lang: 'javascript', - code: '', - maskClose: true, - offset: [offset.top + 35 - $doc.scrollTop()], - shift: { top: offset.top - $doc.scrollTop() }, - insert: function() { - let val = `\n\`\`\`${this.lang}\n${this.code || - '// ' + Anot.ui.meditor.lang.PLACEHOLDER}\n\`\`\`\n` - that.insert(val, false) - this.close() - }, - content: ` -
    -
    -
    - - - - - -
    -
    -
    - -
    -
    - ${Anot.ui.meditor.lang.BTN.YES} -
    -
    - ` - }) - }, - preview: function() { - this.preview = !this.preview - if (this.preview) { - this.htmlTxt = this.__tmp__ - } - }, - fullscreen: function() { - this.fullscreen = !this.fullscreen - if (this.fullscreen) { - document.body.style.overflow = 'hidden' - } else { - document.body.style.overflow = '' - } - if (typeof this.props.onFullscreen === 'function') { - this.props.onFullscreen(this.fullscreen) - } - }, - about: function(elem) { - let offset = Anot(elem).offset() - layer.open({ - type: 7, - title: Anot.ui.meditor.lang.LAYER.ABOUT_TITLE, - maskClose: true, - offset: [offset.top + 35 - $doc.scrollTop()], - shift: { top: offset.top - $doc.scrollTop() }, - content: `
    -
    - __  __ _____    _ _ _
    -|  \\/  | ____|__| (_) |_ ___  _ __
    -| |\\/| |  _| / _\` | | __/ _ \\| '__|
    -| |  | | |__| (_| | | || (_) | |
    -|_|  |_|_____\\__,_|_|\\__\\___/|_|    v${Anot.ui.meditor.version}
    -

    ${Anot.ui.meditor.lang.NAME}

    -

    https://doui.cc/product/meditor

    -

    Copyright © 2017 Yutent, The MIT License.

    -
    ` - }) - } -} - -export default addon diff --git a/src/meditor2/index.js b/src/meditor2/index.js deleted file mode 100644 index 66164d6..0000000 --- a/src/meditor2/index.js +++ /dev/null @@ -1,616 +0,0 @@ -/** - * - * @authors yutent (yutent.io@gmail.com) - * @date 2017-04-17 16:37:12 - * - */ - -'use strict' - -import '../prism/base' -import '../marked/index' -import addon from './addon/base' -import 'css/meditor.scss' - -const LANGUAGES = { - en: { - NAME: 'Open Source Markdown Editor', - TOOLBAR: { - PIPE: '', - H1: 'Header', - QUOTE: 'Quote text', - BOLD: 'Font-bold', - ITALIC: 'Font-italic', - THROUGH: 'Font-through', - UNORDERED: 'Unordered list', - ORDERED: 'Ordered list', - LINK: 'Hyperlink', - HR: 'Line', - TIME: 'Insert current time', - FACE: 'Face', - TABLE: 'Insert table', - IMAGE: 'Upload Pictures', - FILE: 'Upload Files', - INLINECODE: 'Inline code', - BLOCKCODE: 'Block code', - PREVIEW: 'Preview', - FULLSCREEN: 'Fullscreen', - ABOUT: 'About MEditor' - }, - HEADERS: { - H1: '#{1}', - H2: '#{2}', - H3: '#{3}', - H4: '#{4}', - H5: '#{5}', - H6: '#{6}' - }, - PLACEHOLDER: 'Type here', - LINK: { - ALT: 'Link text', - URL: 'Link address', - ERROR: 'Link address and text can not be null' - }, - IMAGE: { - ALT: 'Image alt text', - URL: 'Image address' - }, - TARGET: { - BLANK: 'New window open', - SELF: 'Current window open' - }, - BTN: { - YES: 'OK' - }, - TABLE: { - ROW: 'row', - COLUMN: 'column', - THEAD: 'thead' - }, - LAYER: { - FACE_TITLE: 'Insert Face', - ABOUT_TITLE: 'About MEditor' - }, - CODE: { - OTHER: 'Other language' - } - }, - zh: { - NAME: '开源在线Markdown编辑器', - TOOLBAR: { - PIPE: '', - H1: '标题', - QUOTE: '引用文本', - BOLD: '粗体', - ITALIC: '斜体', - THROUGH: '删除线', - UNORDERED: '无序列表', - ORDERED: '有序列表', - LINK: '超链接', - HR: '横线', - TIME: '插入当前时间', - FACE: '表情', - TABLE: '插入表格', - IMAGE: '插入图片', - FILE: '插入附件', - INLINECODE: '行内代码', - BLOCKCODE: '代码块', - PREVIEW: '预览', - FULLSCREEN: '全屏', - ABOUT: '关于编辑器' - }, - HEADERS: { - H1: '一级标题', - H2: '二级标题', - H3: '三级标题', - H4: '四级标题', - H5: '五级标题', - H6: '六级标题' - }, - PLACEHOLDER: '在此输入文本', - LINK: { - ALT: '链接文字', - URL: '链接地址', - ERROR: '链接文字和地址不能为空' - }, - IMAGE: { - ALT: '图片描述', - URL: '图片地址' - }, - TARGET: { - BLANK: '新窗口打开', - SELF: '本窗口打开' - }, - BTN: { - YES: '确定' - }, - TABLE: { - ROW: '行', - COLUMN: '列', - THEAD: '表头' - }, - LAYER: { - FACE_TITLE: '插入表情', - ABOUT_TITLE: '关于编辑器' - }, - CODE: { - OTHER: '其他语言' - } - } -} -LANGUAGES['zh-CN'] = LANGUAGES.zh -LANGUAGES['zh-TW'] = LANGUAGES.zh -const lang = - LANGUAGES[window.__ENV_LANG__ || navigator.language] || LANGUAGES.en - -marked.setOptions({ - highlight: function(code, lang) { - return Prism.highlight(code, Prism.languages[lang]) - } -}) -if (!String.prototype.repeat) { - String.prototype.repeat = function(num) { - let result = '' - while (num > 0) { - result += this - num-- - } - return result - } -} - -Anot.ui.meditor = { version: '1.0.0', author: 'yutent', lang } -const log = console.log - -const DEFAULT_TOOLBAR = [ - 'h1', - 'quote', - '|', - 'bold', - 'italic', - 'through', - '|', - 'unordered', - 'ordered', - '|', - 'hr', - 'link', - 'time', - 'face', - '|', - 'table', - 'image', - 'attach', - 'inlinecode', - 'blockcode', - '|', - 'preview', - 'fullscreen', - '|', - 'about' -] - -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' -} - -function attrExp(field, flag = 'i') { - return new RegExp(field + '\\s?=\\s?["\']?([^"\']*)["\']?', flag) -} -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') -} -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(/]*>.*?<\/svg>/g, '{invalid image}') - - // log(str) - for (let i in ELEMS) { - let cb = ELEMS[i] - let exp = tagExp(i) - - if (i === 'blockquote') { - while (str.match(exp)) { - str = str.replace(exp, cb) - } - } else { - str = str.replace(exp, cb) - } - - // 对另外3种同类标签做一次处理 - if (i === 'p') { - exp = tagExp('div') - str = str.replace(exp, cb) - } - if (i === 'em') { - exp = tagExp('i') - str = str.replace(exp, cb) - } - if (i === 'strong') { - exp = tagExp('b') - str = str.replace(exp, cb) - } - } - let liExp = /<(ul|ol)>(?:(?!/gi - while (str.match(liExp)) { - str = str.replace(liExp, function(match) { - match = match.replace(/<(ul|ol)>([\s\S]*?)<\/\1>/gi, function( - m, - t, - inner - ) { - let li = inner.split('
  • ') - li.pop() - - for (let i = 0, len = li.length; i < len; i++) { - let pre = t === 'ol' ? i + 1 + '. ' : '* ' - li[i] = - pre + - li[i] - .replace(/\s*
  • ([\s\S]*)/i, function(m, n) { - n = n.trim().replace(/\n/g, '\n ') - return n - }) - .replace(/<[\/]?[\w]*[^>]*>/g, '') - } - return li.join('\n') - }) - return '\n' + match.trim() - }) - } - str = str - - .replace(/<[\/]?[\w]*[^>]*>/g, '') - .replace(/```([\w\W]*)```/g, function(str, inner) { - inner = inner - .replace(/&/g, '&') - .replace(/</g, '<') - .replace(/>/g, '>') - return '```' + inner + '```' - }) - return str -} - -function tool(name) { - name = (name + '').trim().toLowerCase() - name = '|' === name ? 'pipe' : name - - let title = lang.TOOLBAR[name.toUpperCase()] - let extra = '' - switch (name) { - case 'preview': - extra = ':class="{active: preview}"' - break - case 'fullscreen': - extra = ':class="{active: fullscreen}"' - break - default: - break - } - return ` - ` -} - -class MEObject { - constructor(vm) { - this.vm = vm - this.id = vm.$id - } - - getVal() { - return this.vm.value.trim() - } - getHtml() { - return this.vm.__tmp__ - } - setVal(txt) { - this.vm.value = txt || '' - } -} - -Anot.component('meditor', { - __init__: function(props, state, next) { - this.classList.add('do-meditor') - - this.setAttribute(':css', '{height: height}') - this.setAttribute( - ':class', - '{fullscreen: fullscreen, preview: preview, disabled: disabled}' - ) - - if (props.hasOwnProperty('disabled')) { - state.disabled = true - delete props.disabled - } - if (props.height) { - if ( - (isFinite(props.height) && props.height > 180) || - /%$/.test(props.height) - ) { - state.height = props.height - } - delete props.height - } - next() - }, - render: function() { - let toolbar = (this.props.toolbar || DEFAULT_TOOLBAR) - .map(it => tool(it)) - .join('') - - delete this.props.toolbar - - return ` -
    ${toolbar}
    - - - ` - }, - componentDidMount: function(vm, elem) { - let $editor = Anot(this.$refs.editor) - let preview = this.$refs.preview - $editor.bind('keydown', ev => { - let wrap = this.selection() || '' - let select = !!wrap - //tab键改为插入2个空格,阻止默认事件,防止焦点失去 - if (ev.keyCode === 9) { - ev.preventDefault() - wrap = wrap - .split('\n') - .map(function(it) { - return ev.shiftKey ? it.replace(/^\s\s/, '') : ' ' + it - }) - .join('\n') - this.insert(wrap, select) - } - //修复按退格键删除选中文本时,选中的状态不更新的bug - if (ev.keyCode === 8) { - if (select) { - ev.preventDefault() - this.insert('', select) - } - } - }) - - $editor.bind('paste', ev => { - ev.preventDefault() - let txt = ev.clipboardData.getData('text/plain').trim() - let html = ev.clipboardData.getData('text/html').trim() - - html = html2md(html) - - if (html) { - this.insert(html) - } else if (txt) { - this.insert(txt) - } - this.value = this.$refs.editor.value - }) - - $editor.bind('scroll', ev => { - let st = ev.target.scrollTop - let sh = ev.target.scrollHeight - let ch = ev.target.clientHeight - let psh = preview.scrollHeight - let syncTop = (st / (sh - ch)) * (psh - ch) - preview.scrollTop = syncTop - }) - //编辑器成功加载的回调 - if (typeof this.props.created === 'function') { - this.props.created(new MEObject(this)) - } - this.padding = (this.$elem.clientHeight / 2) >>> 0 - this.compile() - if (this.preview) { - this.htmlTxt = this.__tmp__ - } - }, - watch: { - value: function(val) { - this.compile() - //只有开启实时预览,才会赋值给htmlTxt - if (this.preview) { - this.htmlTxt = this.__tmp__ - } - if (typeof this.props.onUpdate === 'function') { - this.props.onUpdate(this.value, this.__tmp__) - } - } - }, - state: { - padding: 90, - height: 180, - disabled: false, //禁用编辑器 - fullscreen: false, //是否全屏 - preview: window.innerWidth > 768, //是否显示预览 - htmlTxt: '', //用于预览渲染 - value: '', //纯md文本 - addon // 已有插件 - }, - props: { - safeMode: true, - revise: Anot.PropsTypes.isFunction(), - created: Anot.PropsTypes.isFunction(), - onUpdate: Anot.PropsTypes.isFunction(), - onFullscreen: Anot.PropsTypes.isFunction() - }, - skip: ['addon', 'insert', 'selection'], - methods: { - // 往文本框中插入内容 - insert(val, isSelect) { - let dom = this.$refs.editor - if (document.selection) { - dom.focus() - let range = document.selection.createRange() - range.text = val - dom.focus() - range.moveStart('character', -1) - } else if (dom.selectionStart || dom.selectionStart === 0) { - let startPos = dom.selectionStart - let endPos = dom.selectionEnd - let scrollTop = dom.scrollTop - - dom.value = - dom.value.slice(0, startPos) + - val + - dom.value.slice(endPos, dom.value.length) - - dom.selectionStart = isSelect ? startPos : startPos + val.length - dom.selectionEnd = startPos + val.length - dom.scrollTop = scrollTop - dom.focus() - } else { - dom.value += val - dom.focus() - } - this.value = dom.value - }, - /** - * [selection 获取选中的文本] - * @param {[type]} dom [要操作的元素] - * @param {[type]} forceHoleLine [是否强制光标所在的整行文本] - */ - selection(forceHoleLine) { - let dom = this.$refs.editor - if (document.selection) { - return document.selection.createRange().text - } else { - let startPos = dom.selectionStart - let endPos = dom.selectionEnd - - if (endPos) { - //强制选择整行 - if (forceHoleLine) { - startPos = dom.value.slice(0, startPos).lastIndexOf('\n') - - let tmpEnd = dom.value.slice(endPos).indexOf('\n') - tmpEnd = tmpEnd < 0 ? dom.value.slice(endPos).length : tmpEnd - - startPos += 1 // 把\n加上 - endPos += tmpEnd - - dom.selectionStart = startPos - dom.selectionEnd = endPos - } - } else { - //强制选择整行 - if (forceHoleLine) { - endPos = dom.value.indexOf('\n') - endPos = endPos < 0 ? dom.value.length : endPos - dom.selectionEnd = endPos - } - } - dom.focus() - return dom.value.slice(startPos, endPos) - } - }, - onToolClick: function(ev) { - if (ev.target.tagName.toLowerCase() !== 'span') { - return - } - let name = ev.target.dataset.name - if (this.disabled || name === 'pipe') { - return - } - if (this.addon[name]) { - this.addon[name].call(this, ev.target) - } else { - console.log('%c没有对应的插件%c[%s]', 'color:#f00;', '', name) - } - }, - - compile: function() { - let txt = this.value.trim() - - if (this.props.safeMode) { - txt = txt - .replace(/]*?)>/g, '<script$1>') - .replace(/<\/script>/g, '</script>') - } - //只解析,不渲染 - this.__tmp__ = marked(txt) - if (typeof this.props.revise === 'function') { - this.__tmp__ = this.props.revise(this.__tmp__) - } - } - } -}) diff --git a/src/neditor/index.wc b/src/neditor/index.wc index bbb0b41..8097601 100644 --- a/src/neditor/index.wc +++ b/src/neditor/index.wc @@ -49,12 +49,12 @@ table { background: #fff; } thead tr { - background: nth($cp, 1); + background: var(--color-plain-1); } th, td { padding: 6px 12px; - border: 1px solid nth($cp, 3); + border: 1px solid var(--color-plain-3); } th { font-weight: bold; diff --git a/src/pager/index.wc b/src/pager/index.wc index 1017b3f..82bc519 100644 --- a/src/pager/index.wc +++ b/src/pager/index.wc @@ -12,7 +12,7 @@ :host { display: block; line-height: 1; - color: nth($cd, 1); + color: var(--color-dark-1); font-size: 14px; user-select: none; -moz-user-select: none; @@ -29,7 +29,7 @@ height: 32px; padding: 0 8px; margin: 0 3px; - background: nth($cp, 1); + background: var(--color-plain-1); border: 0; border-radius: 2px; outline: none; @@ -37,11 +37,11 @@ color: inherit; &:hover { - background: nth($cp, 2); + background: var(--color-plain-2); } &[curr] { - background: nth($ct, 1); + background: var(--color-teal-1); color: #fff; } } @@ -59,31 +59,31 @@ } :host([color='red']) button[curr] { - background: nth($cr, 1); + background: var(--color-red-1); } :host([color='blue']) button[curr] { - background: nth($cb, 1); + background: var(--color-blue-1); } :host([color='green']) button[curr] { - background: nth($cg, 1); + background: var(--color-green-1); } :host([color='teal']) button[curr] { - background: nth($ct, 1); + background: var(--color-teal-1); } :host([color='orange']) button[curr] { - background: nth($co, 1); + background: var(--color-orange-1); } :host([color='dark']) button[curr] { - background: nth($cd, 1); + background: var(--color-dark-1); } :host([color='purple']) button[curr] { - background: nth($cpp, 1); + background: var(--color-purple-1); } diff --git a/src/picker/color.wc b/src/picker/color.wc deleted file mode 100644 index e69de29..0000000 diff --git a/src/picker/date.wc b/src/picker/date.wc index 5584910..0ca8e64 100644 --- a/src/picker/date.wc +++ b/src/picker/date.wc @@ -33,7 +33,7 @@ min-width: 105px; user-select: none; -moz-user-select: none; - color: nth($cd, 2); + color: var(--color-dark-2); border-radius: 2px; } @@ -44,7 +44,7 @@ width: 100%; height: 32px; font-size: 13px; - border: 1px solid nth($cp, 3); + border: 1px solid var(--color-plain-3); border-radius: inherit; white-space: nowrap; background: #fff; @@ -60,9 +60,9 @@ height: 30px; padding: 0 10px; font-size: 14px; - border-right: 1px solid nth($cp, 3); + border-right: 1px solid var(--color-plain-3); border-radius: 2px 0 0 2px; - background: nth($cp, 1); + background: var(--color-plain-1); } span { @@ -70,7 +70,7 @@ padding: 0 5px; &::placeholder { - color: nth($cgr, 1); + color: var(--color-grey-1); } } @@ -123,7 +123,7 @@ wc-icon { --size: 14px; margin: 0 3px; - color: nth($cgr, 1); + color: var(--color-grey-1); cursor: pointer; } span { @@ -160,7 +160,7 @@ } &[weekend] { - color: nth($ct, 1); + color: var(--color-teal-1); } &[picked] { color: #fff; @@ -175,14 +175,14 @@ width: 20px; height: 20px; border-radius: 50%; - background: nth($ct, 1); + background: var(--color-teal-1); content: ''; } } &[disabled] { border-color: transparent; font-size: 12px; - color: nth($cp, 3); + color: var(--color-plain-3); } } } @@ -197,8 +197,8 @@ height: 30px; line-height: 28px; background: #fffbed; - color: nth($co, 2); - border: 1px solid nth($co, 1); + color: var(--color-orange-2); + border: 1px solid var(--color-orange-1); border-radius: 2px; } diff --git a/src/request/index.js b/src/request/index.js deleted file mode 100644 index abd502c..0000000 --- a/src/request/index.js +++ /dev/null @@ -1,446 +0,0 @@ -/** - * - * @authors yutent (yutent.io@gmail.com) - * @date 2018-03-25 23:59:13 - * @version $Id$ - */ - -'use strict' -import Format from './lib/format' - -// 本地协议/头 判断正则 -const rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/ -const log = console.log - -const noop = function(e, res) { - this.defer.resolve(res) -} - -let isLocal = false -try { - isLocal = rlocalProtocol.test(location.protocol) -} catch (e) {} - -let originAnchor = document.createElement('a') -originAnchor.href = location.href - -const NOBODY_METHODS = ['GET', 'HEAD'] -const ERRORS = { - 10001: 'Argument url is required', - 10012: 'Parse error', - 10100: 'Request canceled', - 10104: 'Request pending...', - 10200: 'Ok', - 10204: 'No content', - 10304: 'Not modified', - 10500: 'Internal Server Error', - 10504: 'Connected timeout' -} - -const FORM_TYPES = { - form: 'application/x-www-form-urlencoded; charset=UTF-8', - json: 'application/json; charset=UTF-8', - text: 'text/plain; charset=UTF-8' -} - -const convert = { - text(val) { - return val - }, - xml(val, xml) { - return xml !== undefined ? xml : Format.parseXML(val) - }, - html(val) { - return Format.parseHTML(val) - }, - json(val) { - return JSON.parse(val) - }, - script(val) { - return Format.parseJS(val) - } -} - -class _Request { - constructor(url = '', method = 'GET', param = {}) { - if (!url) { - throw new Error(ERRORS[10001]) - } - - // url规范化 - url = url.replace(/#.*$/, '') - - if (request.BASE_URL) { - if (!/^([a-z]+:|\/\/)/.test(url)) { - url = request.BASE_URL + url - } - } - - method = method.toUpperCase() - - this.xhr = new XMLHttpRequest() - this.defer = Promise.defer() - this.opt = { - url, - method, - headers: {}, - data: {}, - dataType: 'text', - withCredentials: false // 跨域选项,是否验证凭证 - } - - // 取消网络请求 - this.defer.promise.abort = () => { - this.cancel = true - this.xhr.abort() - } - this.__next__(Object.assign({}, request.__INIT__, param)) - return this.defer.promise - } - - __next__(param) { - /* -------------------------------------------------------------- */ - /* ------------------------ 1»» 配置头信息 ---------------------- */ - /* -------------------------------------------------------------- */ - if (param.headers) { - Object.assign(this.opt.headers, param.headers) - } - - /* -------------------------------------------------------------- */ - /* --------- 2»» 设置表单类型, 其中 form-data不能手动设置 ---------- */ - /* -------------------------------------------------------------- */ - let hasAttach = false - if (param.formType) { - switch (param.formType) { - case 'form': - this.__set__('form') - break - case 'json': - this.__set__('json') - break - case 'form-data': - this.opt.method = 'POST' - hasAttach = true - break - default: - if (NOBODY_METHODS.includes(this.opt.method)) { - this.__set__('form') - } else { - this.__set__('text') - } - } - } else { - this.__set__('form') - } - - /* -------------------------------------------------------------- */ - /* ------------------- 3»» 设置缓存 ---------------------------- */ - /* -------------------------------------------------------------- */ - if (param.cache) { - if (NOBODY_METHODS.includes(this.opt.method)) { - this.opt.cache = true - } - } - - /* -------------------------------------------------------------- */ - /* ------------------- 4»» 设置超时时间(毫秒) --------------------- */ - /* -------------------------------------------------------------- */ - param.timeout = param.timeout >>> 0 - if (param.timeout > 0) { - this.opt.timeout = param.timeout - } - - /* -------------------------------------------------------------- */ - /* -------------------------- 5»» 请求的内容 --------------------- */ - /* -------------------------------------------------------------- */ - if (param.data) { - let type = typeof param.data - - switch (type) { - case 'number': - case 'string': - this.__set__('text') - this.opt.data = param.data - break - case 'object': - // 解析表单DOM - if (param.data.nodeName === 'FORM') { - this.opt.method = param.data.method.toUpperCase() || 'POST' - - this.opt.data = Format.parseForm(param.data) - hasAttach = this.opt.data.constructor === FormData - - if (hasAttach) { - delete this.opt.headers['content-type'] - } - // 如果是一个 FormData对象 - // 则直接改为POST - } else if (param.data.constructor === FormData) { - hasAttach = true - this.opt.method = 'POST' - delete this.opt.headers['content-type'] - this.opt.data = param.data - } else { - // 有附件,则改为FormData - if (hasAttach) { - this.opt.data = Format.mkFormData(param.data) - } else { - this.opt.data = param.data - } - } - } - } - - /* -------------------------------------------------------------- */ - /* -------------------------- 6»» 处理跨域 --------------------- */ - /* -------------------------------------------------------------- */ - if (param.withCredentials) { - this.opt.withCredentials = true - } - try { - let anchor = document.createElement('a') - anchor.href = this.opt.url - - this.opt.crossDomain = - originAnchor.protocol !== anchor.protocol || - originAnchor.host !== anchor.host - } catch (err) {} - - // 6.1»» 进一步处理跨域 - // 非跨域或跨域但支持Cors时自动加上一条header信息,用以标识这是ajax请求 - // 如果是跨域,开启Cors会需要服务端额外返回一些headers - - if (this.opt.crossDomain) { - if (this.opt.withCredentials) { - this.xhr.withCredentials = true - this.opt.headers['X-Requested-With'] = 'XMLHttpRequest' - } - } else { - this.opt.headers['X-Requested-With'] = 'XMLHttpRequest' - } - - /* -------------------------------------------------------------- */ - /* ------------- 7»» 根据method类型, 处理g表单数据 ---------------- */ - /* -------------------------------------------------------------- */ - // 是否允许发送body - let allowBody = !NOBODY_METHODS.includes(this.opt.method) - if (allowBody) { - if (!hasAttach) { - if (param.formType === 'json') { - this.opt.data = JSON.stringify(this.opt.data) - } else { - this.opt.data = Format.param(this.opt.data) - } - } - } else { - // 否则拼接到url上 - this.opt.data = Format.param(this.opt.data) - - if (this.opt.data) { - this.opt.url += (/\?/.test(this.opt.url) ? '&' : '?') + this.opt.data - } - - if (this.opt.cache === false) { - this.opt.url += - (/\?/.test(this.opt.url) ? '&' : '?') + '_=' + Math.random() - } - } - - /* -------------------------------------------------------------- */ - /* ------------- 8»» 设置响应的数据类型 ---------------- */ - /* -------------------------------------------------------------- */ - // arraybuffer | blob | document | json | text - if (param.dataType) { - this.opt.dataType = param.dataType.toLowerCase() - } - this.xhr.responseType = this.opt.dataType - - /* -------------------------------------------------------------- */ - /* ------------- 9»» 构造请求 ---------------- */ - /* -------------------------------------------------------------- */ - - // response ready - this.xhr.onreadystatechange = ev => { - if (this.opt.timeout > 0) { - this.opt['time' + this.xhr.readyState] = ev.timeStamp - if (this.xhr.readyState === 4) { - this.opt.isTimeout = - this.opt.time4 - this.opt.time1 > this.opt.timeout - } - } - - if (this.xhr.readyState !== 4) { - return - } - - this.__dispatch__(this.opt.isTimeout) - } - - // 9.1»» 初始化xhr - this.xhr.open(this.opt.method, this.opt.url, true) - - // 9.2»» 设置头信息 - for (let i in this.opt.headers) { - this.xhr.setRequestHeader(i, this.opt.headers[i]) - } - - // 9.3»» 发起网络请求 - this.xhr.send(this.opt.data) - - // 9.4»» 超时处理 - if (this.opt.timeout && this.opt.timeout > 0) { - this.xhr.timeout = this.opt.timeout - } - } - - __set__(type) { - this.opt.headers['content-type'] = FORM_TYPES[type] - } - - __dispatch__(isTimeout) { - let result = { - status: 200, - statusText: 'ok', - text: '', - body: '', - error: null - } - - // 主动取消 - if (this.cancel) { - return this.__cancel__(result) - } - - // 超时 - if (isTimeout) { - return this.__timeout__(result) - } - - // 是否请求成功(resful规范) - let isSucc = this.xhr.status >= 200 && this.xhr.status < 400 - - let headers = this.xhr.getAllResponseHeaders().split('\n') || [] - let contentType = '' - - //处理返回的 Header, 拿到content-type - for (let it of headers) { - it = it.trim() - if (it) { - it = it.split(':') - let tmp = it.shift().toLowerCase() - if (tmp === 'content-type') { - contentType = it - .join(':') - .trim() - .toLowerCase() - break - } - } - } - - if (isSucc) { - result.status = this.xhr.status - if (result.status === 204) { - result.statusText = ERRORS[10204] - } else if (result.status === 304) { - result.statusText = ERRORS[10304] - } - } else { - result.status = this.xhr.status || 500 - result.statusText = this.xhr.statusText || ERRORS[10500] - result.error = new Error(result.statusText) - } - // log(this.opt.dataType, this.xhr) - switch (this.opt.dataType) { - case 'arraybuffer': - case 'blob': - case 'document': - case 'json': - result.text = result.body = this.xhr.response - break - // text - default: - try { - //处理返回的数据 - let dataType = contentType.match(/json|xml|script|html/) - - dataType = (dataType && dataType[0].toLowerCase()) || 'text' - - result.text = this.xhr.response - result.body = convert[dataType](result.text, this.xhr.response) - } catch (err) { - result.error = err - result.statusText = ERRORS[10012] - } - break - } - this.__success__(isSucc, result) - } - - __success__(isSucc, result) { - if (isSucc) { - this.defer.resolve(result) - } else { - this.defer.reject(result) - } - delete this.xhr - delete this.opt - delete this.defer - } - - __cancel__(result) { - result.status = 0 - result.statusText = ERRORS[10100] - result.error = new Error(ERRORS[10100]) - - this.defer.reject(result) - - delete this.xhr - delete this.opt - delete this.defer - } - - __timeout__(result) { - result.status = 504 - result.statusText = ERRORS[10504] - result.error = new Error(ERRORS[10504]) - - this.defer.reject(result) - - delete this.xhr - delete this.opt - delete this.defer - } -} - -if (!window.request) { - window.request = { - get(url, param = {}) { - return new _Request(url, 'GET', param) - }, - post(url, param = {}) { - return new _Request(url, 'POST', param) - }, - upload(url, param = {}) { - param.formType = 'form-data' - return this.post(url, param) - }, - download(url, param = {}) { - param.dataType = 'blob' - return this.get(url, param) - }, - open(url, method = 'GET', param = {}) { - if (typeof method === 'object') { - param = method - method = 'GET' - } - return new _Request(url, method, param) - }, - version: '2.0.0-normal', - init(param = {}) { - this.__INIT__ = param - } - } -} - -export default request diff --git a/src/request/lib/format.js b/src/request/lib/format.js deleted file mode 100644 index 8259cba..0000000 --- a/src/request/lib/format.js +++ /dev/null @@ -1,225 +0,0 @@ -/** - * - * @authors yutent (yutent.io@gmail.com) - * @date 2016-11-26 16:35:45 - * - */ - -'use strict' - -function serialize(p, obj, q) { - let k - if (Array.isArray(obj)) { - obj.forEach(function(it, i) { - k = p ? `${p}[${Array.isArray(it) ? i : ''}]` : i - // k = p ? p + '[' + (Array.isArray(it) ? i : '') + ']' : i - if (typeof it === 'object') { - serialize(k, it, q) - } else { - q(k, it) - } - }) - } else { - for (let i in obj) { - k = p ? `${p}[${i}]` : i - // k = p ? p + '[' + i + ']' : i - if (typeof obj[i] === 'object') { - serialize(k, obj[i], q) - } else { - q(k, obj[i]) - } - } - } -} - -const toS = Object.prototype.toString -const doc = window.document -const encode = encodeURIComponent -const decode = decodeURIComponent - -const TagHooks = function() { - this.option = doc.createElement('select') - this.thead = doc.createElement('table') - this.td = doc.createElement('tr') - this.area = doc.createElement('map') - this.tr = doc.createElement('tbody') - this.col = doc.createElement('colgroup') - this.legend = doc.createElement('fieldset') - this._default = doc.createElement('div') - this.g = doc.createElementNS('http://www.w3.org/2000/svg', 'svg') - - this.optgroup = this.option - this.tbody = this.tfoot = this.colgroup = this.caption = this.thead - this.th = this.td - - 'circle,defs,ellipse,image,line,path,polygon,polyline,rect,symbol,text,use'.replace( - /,/g, - m => { - this[m] = this.g //处理svg - } - ) -} - -const Helper = { - tagHooks: new TagHooks(), - rtagName: /<([\w:]+)/, - rxhtml: /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi, - scriptTypes: { - 'text/javascript': 1, - 'text/ecmascript': 1, - 'application/ecmascript': 1, - 'application/javascript': 1 - }, - rhtml: /<|&#?\w+;/ -} - -export default { - parseJS: function(code) { - code = (code + '').trim() - if (code) { - if (code.indexOf('use strict') === 1) { - let script = doc.createElement('script') - script.text = code - doc.head.appendChild(script).parentNode.removeChild(script) - } else { - eval(code) - } - } - }, - parseXML: function(data, xml, tmp) { - try { - tmp = new DOMParser() - xml = tmp.parseFromString(data, 'text/xml') - } catch (e) { - xml = void 0 - } - - if ( - !xml || - !xml.documentElement || - xml.getElementsByTagName('parsererror').length - ) { - console.error('Invalid XML: ' + data) - } - return xml - }, - parseHTML: function(html) { - let fragment = doc.createDocumentFragment().cloneNode(false) - - if (typeof html !== 'string') { - return fragment - } - - if (!Helper.rhtml.test(html)) { - fragment.appendChild(document.createTextNode(html)) - return fragment - } - - html = html.replace(Helper.rxhtml, '<$1>').trim() - let tag = (Helper.rtagName.exec(html) || ['', ''])[1].toLowerCase() - let wrap = Helper.tagHooks[tag] || Helper.tagHooks._default - let firstChild = null - - //使用innerHTML生成的script节点不会触发请求与执行text属性 - wrap.innerHTML = html - let script = wrap.getElementsByTagName('script') - if (script.length) { - for (let i = 0, el; (el = script[i++]); ) { - if (Helper.scriptTypes[el.type]) { - let tmp = doc.createElement('script').cloneNode(false) - el.attributes.forEach(function(attr) { - tmp.setAttribute(attr.name, attr.value) - }) - tmp.text = el.text - el.parentNode.replaceChild(tmp, el) - } - } - } - - while ((firstChild = wrap.firstChild)) { - fragment.appendChild(firstChild) - } - - return fragment - }, - parseForm: function(form) { - let data = {} - let hasAttach = false - for (let i = 0, field; (field = form.elements[i++]); ) { - switch (field.type) { - case 'select-one': - case 'select-multiple': - if (field.name.length && !field.disabled) { - for (let j = 0, opt; (opt = field.options[j++]); ) { - if (opt.selected) { - data[field.name] = opt.value || opt.text - } - } - } - break - case 'file': - if (field.name.length && !field.disabled) { - data[field.name] = field.files[0] - hasAttach = true - } - break - case undefined: - case 'submit': - case 'reset': - case 'button': - break //按钮啥的, 直接忽略 - case 'radio': - case 'checkbox': - // 只处理选中的 - if (!field.checked) break - default: - if (field.name.length && !field.disabled) { - data[field.name] = field.value - } - } - } - // 如果有附件, 改为FormData - if (hasAttach) { - return this.mkFormData(data) - } else { - return data - } - }, - mkFormData(data) { - let form = new FormData() - for (let i in data) { - let el = data[i] - if (Array.isArray(el)) { - el.forEach(function(it) { - form.append(i + '[]', it) - }) - } else { - form.append(i, data[i]) - } - } - return form - }, - param: function(obj) { - if (!obj || typeof obj === 'string' || typeof obj === 'number') { - return obj - } - - let arr = [] - let q = function(k, v) { - if (/native code/.test(v)) { - return - } - - v = typeof v === 'function' ? v() : v - v = toS.call(v) !== '[object File]' ? encode(v) : v - - arr.push(encode(k) + '=' + v) - } - - if (typeof obj === 'object') { - serialize('', obj, q) - } - - return arr.join('&') - } -} diff --git a/src/request/light.js b/src/request/light.js deleted file mode 100644 index e69de29..0000000 diff --git a/src/router/index.js b/src/router/index.js deleted file mode 100644 index a877956..0000000 --- a/src/router/index.js +++ /dev/null @@ -1,241 +0,0 @@ -/** - * - * @authors yutent (yutent.io@gmail.com) - * @date 2017-04-14 21:04:50 - * - */ - -'use strict' -//储存版本信息 - -//判定A标签的target属性是否指向自身 -//thanks https://github.com/quirkey/sammy/blob/master/lib/sammy.js#L219 -function targetIsThisWindow(targetWindow) { - if ( - !targetWindow || - targetWindow === window.name || - targetWindow === '_self' || - (targetWindow === 'top' && window == window.top) - ) { - return true - } - return false -} -//hash前缀正则 -const PREFIX_REGEXP = /^(#!|#)[\/]?/ -const TRIM_REGEXP = /(^[/]+)|([/]+$)/g -const DEFAULT_OPTIONS = { - mode: 'hash', // hash | history - allowReload: true //连续点击同一个链接是否重新加载 -} -const LINKS = [] -const RULE_REGEXP = /(:id)|(\{id\})|(\{id:([A-z\d\,\[\]\{\}\-\+\*\?\!:\^\$]*)\})/g - -class Router { - constructor(options) { - Anot.hideProperty(this, 'table', []) - Anot.hideProperty(this, 'last', '') - Anot.hideProperty(this, 'path', '') - Anot.hideProperty(this, 'pathArr', []) - Anot.hideProperty(this, 'ready', false) - Anot.hideProperty(this, 'noMatch', null) - Anot.hideProperty( - this, - 'options', - Object.assign({}, DEFAULT_OPTIONS, options) - ) - this.__listen__() - } - - // 创建无new式Router实例 - static init(options = {}) { - if (Anot.router) { - throw new Error('不允许重复创建Router实例...') - } - - Anot.router = new this(options) - return Anot.router - } - - // 事件监听 - __listen__() { - let { mode } = this.options - - Anot.bind(window, 'load, popstate', ev => { - if (ev.type === 'load') { - if (this.ready) { - return - } - this.ready = true - } - - let path = mode === 'hash' ? location.hash : location.pathname - - path = path.replace(PREFIX_REGEXP, '').trim() - path = path.replace(TRIM_REGEXP, '') - - if (ev.type === 'load') { - this.go(path) - // hash模式要手动触发一下路由检测 - if (mode === 'hash') { - this.__check__(path) - } - } else { - // 因为pushState不会触发popstate事件, - // 所以这里只在hash模式或有ev.state的情况下才会主动触发路由检测 - if (mode === 'hash' || ev.state) { - this.__check__(path) - } - } - }) - - //劫持页面上所有点击事件,如果事件源来自链接或其内部, - //并且它不会跳出本页,并且以"#/"或"#!/"开头,那么触发go方法 - Anot.bind(document, 'click', ev => { - let prevented = - 'defaultPrevented' in ev - ? ev.defaultPrevented - : ev.returnValue === false - - if (prevented || ev.ctrlKey || ev.metaKey || ev.which === 2) { - return - } - - let target = ev.target - while (target.nodeName !== 'A') { - target = target.parentNode - if (!target || target.tagName === 'BODY') { - return - } - } - if (mode === 'history') { - if (targetIsThisWindow(target.target)) { - let href = - target.getAttribute('href') || target.getAttribute('xlink:href') - - if ( - !href || - /^(http[s]?:|ftp:)?\/\//.test(href) || - /^javascript:/.test(href) - ) { - return - } - - // hash地址,只管修正前缀即可, 会触发popstate事件,所以这里只处理非hash的情况 - if (!PREFIX_REGEXP.test(href)) { - // 非hash地址,则需要阻止默认事件 - // 并主动触发跳转, 同时强制清除hash - ev.preventDefault() - this.go(href, true) - } - } - } - }) - } - - __parseRule__(rule, opts) { - let re = rule.replace(RULE_REGEXP, function(m, p1, p2, p3, p4) { - let w = '([\\w.-]' - if (p1 || p2) { - return w + '+)' - } else { - if (!/^\{[\d\,]+\}$/.test(p4)) { - w = '(' - } - return w + p4 + ')' - } - }) - re = re - .replace(/(([^\\])([\/]+))/g, '$2\\/') - .replace(/(([^\\])([\.]+))/g, '$2\\.') - .replace(/(([^\\])([\-]+))/g, '$2\\-') - .replace(/(\(.*)(\\[\-]+)(.*\))/g, '$1-$3') - re = '^' + re + '$' - opts.regexp = new RegExp(re) - return opts - } - - __add__(rule, callback) { - // 特殊值"!", 则自动作非匹配回调处理 - if (rule === '!') { - this.noMatch = callback - return - } - if (rule.charAt(0) !== '/') { - console.error('路由规则必须以"/"开头') - return - } - rule = rule.replace(/^[\/]+|[\/]+$|\s+/g, '') - let opts = { rule, callback } - - Anot.Array.ensure(this.table, this.__parseRule__(rule, opts)) - } - - // 路由检测 - __check__(path) { - let { allowReload } = this.options - if (!allowReload && path === this.last) { - return - } - - this.last = this.path - this.path = path - this.pathArr = path.split('/') - LINKS.forEach(vm => { - if (vm.rule.test(this.path)) { - vm.active = true - } else { - vm.active = false - } - }) - for (let i = 0, route; (route = this.table[i++]); ) { - let args = path.match(route.regexp) - if (args) { - args.shift() - return route.callback.apply(route, args) - } - } - this.noMatch && this.noMatch(this.path) - } - - // 跳转到路由 - go(path, forceCleanHash = false) { - path = path.trim().replace(TRIM_REGEXP, '') - let { mode } = this.options - - if (mode === 'hash') { - // 页面刷新时, 不主动添加空hash, 避免执行2次noMatch回调 - if (!path && path === location.hash) { - return - } - location.hash = '!/' + path - } else { - let hash = forceCleanHash ? '' : location.hash - let search = forceCleanHash ? '' : location.search - if (forceCleanHash) { - window.history.pushState({ path }, null, `/${path + search + hash}`) - } else { - window.history.replaceState({ path }, null, `/${path + search + hash}`) - } - // pushState不会触发popstate事件,所以要手动触发路由检测 - this.__check__(path) - } - } - - // 绑定路由事件 - on(rule, callback) { - if (Array.isArray(rule)) { - rule.forEach(it => { - this.__add__(it, callback) - }) - } else { - this.__add__(rule, callback) - } - // 因为先初始化,才开始监听路由规则 - // 所以会导致wondow load的时候, 规则还没生效, 而生效之后,load已经结束 - // 所以这里需要手动再触发一次load - Anot.fireDom(window, 'load') - } -} - -export default Router diff --git a/src/scroll/index.wc b/src/scroll/index.wc index 487d00b..0bdafa6 100644 --- a/src/scroll/index.wc +++ b/src/scroll/index.wc @@ -13,7 +13,6 @@ .container { overflow: hidden; - position: relative; width: 100%; height: 100%; } @@ -110,13 +109,16 @@ export default class Scroll { thumbX: 0, thumbY: 0, disabled: false, - axis: 'xy' // 滚动方向, 默认x轴和y轴都可以滚动 + axis: 'xy', // 滚动方向, 默认x轴和y轴都可以滚动 + delay: 1000, // 节流延迟 + distance: 1 // 触发距离阀值, 单位像素 } __init__() { /* render */ this.__BOX__ = this.root.children[1] this.__X__ = this.root.children[2].children[0] this.__Y__ = this.root.children[3].children[0] + this.__last__ = 0 } get scrollTop() { @@ -157,6 +159,10 @@ export default class Scroll { return this.__BOX__.scrollHeight } + get scrollWidth() { + return this.__BOX__.scrollWidth + } + get disabled() { return this.props.disabled } @@ -203,6 +209,30 @@ export default class Scroll { return moveY } + _fireReachEnd(action = 'reach-bottom') { + var { sh, oh, delay, disabled } = this.props + var top = this.__BOX__.scrollTop + var now = Date.now() + + if (disabled) { + return + } + if (now - this.__last__ > delay) { + if (action === 'reach-bottom') { + if (oh + top < sh) { + return + } + } else { + if (top > 0) { + return + } + } + + this.__last__ = now + this.dispatchEvent(new CustomEvent(action)) + } + } + mounted() { // 初始化滚动条的位置和长度 this._initFn = $.bind(this.__BOX__, 'mouseenter', ev => { @@ -215,8 +245,9 @@ export default class Scroll { var oh = this.__BOX__.offsetHeight var sh = this.__BOX__.scrollHeight - var yh = ((oh * oh) / sh) >> 0 - var xw = ((ow * ow) / sw) >> 0 + var yh = ((oh * oh) / sh) >> 0 // 滚动条的高度 + var xw = ((ow * ow) / sw) >> 0 // 滚动条的宽度 + if (yh < 50) { yh = 50 } @@ -319,6 +350,10 @@ export default class Scroll { this.props.thumbY = fixedY this.__Y__.style.transform = `translateY(${fixedY}px)` + + if (Math.abs(deltaY) > this.props.distance) { + this._fireReachEnd(deltaY > 0 ? 'reach-bottom' : 'reach-top') + } } } @@ -373,6 +408,9 @@ export default class Scroll { } }, mouseupFn = ev => { + if (Math.abs(ev.pageY - startY) > this.props.distance) { + this._fireReachEnd(ev.pageY > startY ? 'reach-bottom' : 'reach-top') + } startX = null startY = null this.props.thumbX = moveX @@ -410,21 +448,28 @@ export default class Scroll { $.catch(document, 'keydown', ev => { if (this._active) { var { oh, sh } = this.props + var exec = false switch (ev.keyCode) { case 33: // pageUp + exec = true this.scrollTop -= oh break case 34: // pageDown + exec = true this.scrollTop += oh break case 35: // End + exec = true this.scrollTop = sh break case 36: // Home + exec = true this.scrollTop = 0 break } - ev.preventDefault() + if (exec) { + ev.preventDefault() + } } }) @@ -452,6 +497,12 @@ export default class Scroll { case 'disabled': this[name] = true break + case 'delay': + this.props.delay = +val || 1000 + break + case 'distance': + this.props.distance = +val || 1 + break } } } diff --git a/src/slider/index.wc b/src/slider/index.wc new file mode 100644 index 0000000..c5c8b8a --- /dev/null +++ b/src/slider/index.wc @@ -0,0 +1,264 @@ + + + + + diff --git a/src/sliders/index.wc b/src/sliders/index.wc deleted file mode 100644 index 5091ee3..0000000 --- a/src/sliders/index.wc +++ /dev/null @@ -1,22 +0,0 @@ - - - - - diff --git a/src/store/index.js b/src/store/index.js deleted file mode 100644 index c9208d4..0000000 --- a/src/store/index.js +++ /dev/null @@ -1,278 +0,0 @@ -/** - * - * @authors yutent (yutent.io@gmail.com) - * @date 2018-06-25 21:39:42 - * @version $Id$ - */ - -const __STORE__ = {} -// 解析and条件 -function parse$And(it) { - let result = '' - for (let k in it) { - let tmp = it[k] - switch (Anot.type(tmp)) { - case 'object': - if (tmp.$has) { - result += `it.${k}.indexOf(${JSON.stringify(tmp.$has)}) > -1` - break - } - if (tmp.$in) { - result += `${JSON.stringify(tmp.$in)}.indexOf(it.${k}) > -1` - break - } - if (tmp.$regex) { - result += `${tmp.$regex}.test(it.${k})` - break - } - - // 区间解析 - if (tmp.$lt || tmp.$lte) { - result += `it.${k} <${tmp.$lte ? '=' : ''} ${tmp.$lt || tmp.$lte}` - if (tmp.$gt || tmp.$gte) { - result += ` && it.${k} >${tmp.$gte ? '=' : ''} ${tmp.$gt || - tmp.$gte}` - } - break - } - if (tmp.$gt || tmp.$gte) { - result += `it.${k} >${tmp.$gte ? '=' : ''} ${tmp.$gt || tmp.$gte}` - break - } - if (tmp.$eq) { - result += `it.${k} === ${tmp.$eq}` - break - } - default: - result += `it.${k} === ${JSON.stringify(it[k])}` - break - } - result += ' && ' - } - result = result.slice(0, -4) - - if (!result) { - result = 'true' - } - return result -} - -// 解析or条件 -function parse$Or(arr) { - let result = '' - - arr.forEach(it => { - result += '(' - - result += parse$And(it) - result += ') || ' - }) - return result.slice(0, -4) -} - -class AnotStore { - constructor(name) { - Anot.hideProperty(this, '__name__', name) - Anot.hideProperty(this, '__LAST_QUERY__', '') - Anot.hideProperty(this, '__QUERY_HISTORY__', []) - if (!__STORE__[name]) { - __STORE__[name] = [] - __STORE__[`${name}Dict`] = {} - } - } - - static collection(name) { - return new this(name) - } - - __MAKE_FN__(opt) { - let fnStr = ` - let result = []; - let num = 0; - for (let it of arr) { - if(` - - if (opt.$or) { - fnStr += parse$Or(opt.$or) - } else { - fnStr += parse$And(opt) - } - fnStr += `){ - result.push(it) - num++ - if(limit > 0 && num >= limit){ - break - } - } - } - return result;` - - return Function('arr', 'limit', fnStr) - } - - // 清除当前集合的数据及缓存, 默认只清除缓存 - clear(force) { - this.__QUERY_HISTORY__ = [] - this.__LAST_QUERY__ = '' - if (force) { - __STORE__[this.__name__] = [] - __STORE__[`${this.__name__}Dict`] = {} - } - } - - // 查询多条记录,返回数组 - getAll({ filter, limit = [] } = {}) { - const collection = __STORE__[this.__name__] - let result = [] - let forceLimited = false // 强制限制查询结果集 - if (!collection || !collection.length) { - return result - } - - if (limit.length < 1) { - limit = [0] - } - - if (limit.length < 2 && filter) { - forceLimited = true - if (limit[0] > 0) { - limit.unshift(0) - } - } - - if (filter) { - let query = JSON.stringify(filter) - if (this.__LAST_QUERY__ === query) { - result = this.__QUERY_HISTORY__.slice.apply( - this.__QUERY_HISTORY__, - limit - ) - } else { - let tmpFn = this.__MAKE_FN__(filter) - result = tmpFn(collection, forceLimited ? limit[1] || 0 : 0) - - // 非强制限制的查询, 缓存结果集 - if (!forceLimited) { - this.__LAST_QUERY__ = query - this.__QUERY_HISTORY__ = result - result = this.__QUERY_HISTORY__.slice.apply( - this.__QUERY_HISTORY__, - limit - ) - } - } - } else { - result = collection.slice.apply(collection, limit) - } - return Anot.deepCopy(result) - } - - // 查询单条记录, 返回Object对象 - get(_id) { - const collectionDict = __STORE__[`${this.__name__}Dict`] - return Anot.deepCopy(collectionDict[_id]) || null - } - - // 查询总数 - count({ filter } = {}) { - if (filter) { - if (this.__LAST_QUERY__ === JSON.stringify(filter)) { - return this.__QUERY_HISTORY__.length - } else { - return this.getAll({ filter, limit: [0] }).length - } - } - return __STORE__[this.__name__].length - } - - __INSERT__(item, primary) { - let collection = __STORE__[this.__name__] - let collectionDict = __STORE__[`${this.__name__}Dict`] - let _id = item[primary || 'id'] - let tmp = collectionDict[_id] - // 已存在, 则直接更新 - if (tmp) { - this.update(_id, item) - } else { - collection.push(item) - collectionDict[_id] = item - } - } - - // 插入数据, 可以同时插入多条 - insert(items, primary) { - if (!Array.isArray(items)) { - items = [items] - } - items.forEach(item => { - this.__INSERT__(item, primary) - }) - this.clear() - } - - // 按指定字段排序, 是否字符串排序, 是否逆序 - sort(key, locale, desc) { - let fnStr = '' - if (locale && window.Intl) { - fnStr += ` - let col = new Intl.Collator('zh') - ` - } - if (desc) { - fnStr += 'return arr.sort((b, a) => {' - } else { - fnStr += 'return arr.sort((a, b) => {' - } - - fnStr += ` - let filter = function(val) { - try { - return val.${key} || '' - } catch (err) { - return '' - } - } - ` - - if (locale) { - if (window.Intl) { - fnStr += `return col.compare(filter(a), filter(b))` - } else { - fnStr += `return (filter(a) + '').localeCompare(filter(b), 'zh')` - } - } else { - fnStr += `return filter(a) - filter(b)` - } - fnStr += '\n})' - Function('arr', fnStr).call(this, __STORE__[this.__name__]) - this.clear() - } - - // 更新集合中的数据 - update(_id, data) { - let collection = __STORE__[this.__name__] - let collectionDict = __STORE__[`${this.__name__}Dict`] - - let tmp = collectionDict[_id] - let idx = collection.indexOf(tmp) - - collection.splice(idx, 1, data) - collectionDict[_id] = data - } - - // 删除集合中单条数据 - remove(_id) { - let collection = __STORE__[this.__name__] - let collectionDict = __STORE__[`${this.__name__}Dict`] - - let tmp = collectionDict[_id] - let idx = collection.indexOf(tmp) - - collection.splice(idx, 1) - delete collectionDict[_id] - } -} - -Anot.store = window.store = AnotStore - -export default AnotStore diff --git a/src/table/index.wc b/src/table/index.wc index 7e38f96..740a931 100644 --- a/src/table/index.wc +++ b/src/table/index.wc @@ -11,7 +11,7 @@ :host { display: flex; width: 100%; - color: nth($cd, 1); + color: var(--color-dark-1); } .table { display: flex; @@ -23,9 +23,9 @@ .tfoot { overflow: hidden; width: 100%; - border: 1px solid nth($cp, 3); + border: 1px solid var(--color-plain-3); --border-bottom: 0; - background: nth($cp, 1); + background: var(--color-plain-1); user-select: none; -moz-user-select: none; } @@ -38,7 +38,7 @@ } .tbody { flex: 1; - border: 1px solid nth($cp, 3); + border: 1px solid var(--color-plain-3); ::slotted(wc-tr:last-child) { --border-bottom: 0; diff --git a/src/table/td.wc b/src/table/td.wc index ff928f2..9b254c7 100644 --- a/src/table/td.wc +++ b/src/table/td.wc @@ -10,7 +10,7 @@ min-width: 60px; // min-height: 36px; // height: auto; - border-left: 1px solid nth($cp, 3); + border-left: 1px solid var(--color-plain-3); .cell { padding: var(--padding, 5px 8px); diff --git a/src/table/tr.wc b/src/table/tr.wc index c86c96e..762732c 100644 --- a/src/table/tr.wc +++ b/src/table/tr.wc @@ -12,7 +12,7 @@ flex: 1; display: flex; flex-wrap: nowrap; - border-bottom: var(--border-bottom, 1px solid nth($cp, 3)); + border-bottom: var(--border-bottom, 1px solid var(--color-plain-3)); } } :host(:hover) { diff --git a/src/utils.js b/src/utils.js index 1a325f2..50b3267 100644 --- a/src/utils.js +++ b/src/utils.js @@ -31,6 +31,28 @@ export default { } })(), + //取得距离页面左上角的坐标 + offset(node) { + try { + var rect = node.getBoundingClientRect() + + if (rect.width || rect.height || node.getClientRects().length) { + var doc = node.ownerDocument + var root = doc.documentElement + var win = doc.defaultView + return { + top: rect.top + win.pageYOffset - root.clientTop, + left: rect.left + win.pageXOffset - root.clientLeft + } + } + } catch (e) { + return { + left: 0, + top: 0 + } + } + }, + /** * 对象/数组遍历 * 支持跳出 @@ -112,6 +134,7 @@ export default { fn(ev) }) }, + clearOutside(fn = noop) { this.unbind(document, 'mousedown', fn) }