388 changed files with 89375 additions and 89375 deletions
-
36web/index.html
-
454web/static/css/OxFooter.css
-
2web/static/css/app.41dc85feffab4c86186824838b3387de.css
-
160web/static/css/common.css
-
164web/static/css/qietu.css
-
666web/static/css/responsive.css
-
1586web/static/css/style.css
-
822web/static/diff/difflib.js
-
164web/static/diff/diffview.css
-
396web/static/diff/diffview.js
-
682web/static/editor.md/Gulpfile.js
-
44web/static/editor.md/LICENSE
-
238web/static/editor.md/README.md
-
8900web/static/editor.md/css/editormd.css
-
196web/static/editor.md/css/editormd.logo.css
-
2web/static/editor.md/css/editormd.logo.min.css
-
8web/static/editor.md/css/editormd.min.css
-
7108web/static/editor.md/css/editormd.preview.css
-
8web/static/editor.md/css/editormd.preview.min.css
-
9334web/static/editor.md/editormd.amd.js
-
6web/static/editor.md/editormd.amd.min.js
-
8686web/static/editor.md/editormd.js
-
2web/static/editor.md/editormd.min.js
-
20web/static/editor.md/fonts/editormd-logo.svg
-
1128web/static/editor.md/fonts/fontawesome-webfont.svg
-
252web/static/editor.md/languages/en.js
-
252web/static/editor.md/languages/zh-tw.js
-
872web/static/editor.md/lib/codemirror/AUTHORS
-
38web/static/editor.md/lib/codemirror/LICENSE
-
24web/static/editor.md/lib/codemirror/README.md
-
366web/static/editor.md/lib/codemirror/addon/comment/comment.js
-
170web/static/editor.md/lib/codemirror/addon/comment/continuecomment.js
-
64web/static/editor.md/lib/codemirror/addon/dialog/dialog.css
-
310web/static/editor.md/lib/codemirror/addon/dialog/dialog.js
-
12web/static/editor.md/lib/codemirror/addon/display/fullscreen.css
-
82web/static/editor.md/lib/codemirror/addon/display/fullscreen.js
-
188web/static/editor.md/lib/codemirror/addon/display/panel.js
-
116web/static/editor.md/lib/codemirror/addon/display/placeholder.js
-
128web/static/editor.md/lib/codemirror/addon/display/rulers.js
-
322web/static/editor.md/lib/codemirror/addon/edit/closebrackets.js
-
332web/static/editor.md/lib/codemirror/addon/edit/closetag.js
-
102web/static/editor.md/lib/codemirror/addon/edit/continuelist.js
-
240web/static/editor.md/lib/codemirror/addon/edit/matchbrackets.js
-
132web/static/editor.md/lib/codemirror/addon/edit/matchtags.js
-
54web/static/editor.md/lib/codemirror/addon/edit/trailingspace.js
-
210web/static/editor.md/lib/codemirror/addon/fold/brace-fold.js
-
114web/static/editor.md/lib/codemirror/addon/fold/comment-fold.js
-
298web/static/editor.md/lib/codemirror/addon/fold/foldcode.js
-
40web/static/editor.md/lib/codemirror/addon/fold/foldgutter.css
-
288web/static/editor.md/lib/codemirror/addon/fold/foldgutter.js
-
88web/static/editor.md/lib/codemirror/addon/fold/indent-fold.js
-
98web/static/editor.md/lib/codemirror/addon/fold/markdown-fold.js
-
364web/static/editor.md/lib/codemirror/addon/fold/xml-fold.js
-
82web/static/editor.md/lib/codemirror/addon/hint/anyword-hint.js
-
112web/static/editor.md/lib/codemirror/addon/hint/css-hint.js
-
696web/static/editor.md/lib/codemirror/addon/hint/html-hint.js
-
292web/static/editor.md/lib/codemirror/addon/hint/javascript-hint.js
-
76web/static/editor.md/lib/codemirror/addon/hint/show-hint.css
-
788web/static/editor.md/lib/codemirror/addon/hint/show-hint.js
-
480web/static/editor.md/lib/codemirror/addon/hint/sql-hint.js
-
220web/static/editor.md/lib/codemirror/addon/hint/xml-hint.js
-
82web/static/editor.md/lib/codemirror/addon/lint/coffeescript-lint.js
-
70web/static/editor.md/lib/codemirror/addon/lint/css-lint.js
-
272web/static/editor.md/lib/codemirror/addon/lint/javascript-lint.js
-
62web/static/editor.md/lib/codemirror/addon/lint/json-lint.js
-
146web/static/editor.md/lib/codemirror/addon/lint/lint.css
-
410web/static/editor.md/lib/codemirror/addon/lint/lint.js
-
56web/static/editor.md/lib/codemirror/addon/lint/yaml-lint.js
-
224web/static/editor.md/lib/codemirror/addon/merge/merge.css
-
1470web/static/editor.md/lib/codemirror/addon/merge/merge.js
-
128web/static/editor.md/lib/codemirror/addon/mode/loadmode.js
-
236web/static/editor.md/lib/codemirror/addon/mode/multiplex.js
-
66web/static/editor.md/lib/codemirror/addon/mode/multiplex_test.js
-
170web/static/editor.md/lib/codemirror/addon/mode/overlay.js
-
426web/static/editor.md/lib/codemirror/addon/mode/simple.js
-
80web/static/editor.md/lib/codemirror/addon/runmode/colorize.js
-
314web/static/editor.md/lib/codemirror/addon/runmode/runmode-standalone.js
-
144web/static/editor.md/lib/codemirror/addon/runmode/runmode.js
-
240web/static/editor.md/lib/codemirror/addon/runmode/runmode.node.js
-
200web/static/editor.md/lib/codemirror/addon/scroll/annotatescrollbar.js
-
92web/static/editor.md/lib/codemirror/addon/scroll/scrollpastend.js
-
132web/static/editor.md/lib/codemirror/addon/scroll/simplescrollbars.css
-
282web/static/editor.md/lib/codemirror/addon/scroll/simplescrollbars.js
-
256web/static/editor.md/lib/codemirror/addon/search/match-highlighter.js
-
16web/static/editor.md/lib/codemirror/addon/search/matchesonscrollbar.css
-
190web/static/editor.md/lib/codemirror/addon/search/matchesonscrollbar.js
-
328web/static/editor.md/lib/codemirror/addon/search/search.js
-
378web/static/editor.md/lib/codemirror/addon/search/searchcursor.js
-
142web/static/editor.md/lib/codemirror/addon/selection/active-line.js
-
236web/static/editor.md/lib/codemirror/addon/selection/mark-selection.js
-
196web/static/editor.md/lib/codemirror/addon/selection/selection-pointer.js
-
172web/static/editor.md/lib/codemirror/addon/tern/tern.css
-
1394web/static/editor.md/lib/codemirror/addon/tern/tern.js
-
88web/static/editor.md/lib/codemirror/addon/tern/worker.js
-
278web/static/editor.md/lib/codemirror/addon/wrap/hardwrap.js
-
6web/static/editor.md/lib/codemirror/addons.min.js
-
32web/static/editor.md/lib/codemirror/bower.json
-
4web/static/editor.md/lib/codemirror/codemirror.min.css
-
106web/static/editor.md/lib/codemirror/codemirror.min.js
-
662web/static/editor.md/lib/codemirror/lib/codemirror.css
@ -1,18 +1,18 @@ |
|||
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=renderer content=webkit><meta http-equiv=X-UA-Compatible content=edge><title>帮助中心-欧轩智能场馆</title><meta name=keywords content=""><meta name=description content=""><script type=text/javascript>// var Wwidth = window.innerWidth |
|||
// window.addEventListener('resize', function() { |
|||
// /// 宽度变化大于50像素的时候刷新整个窗口以适应新宽度 |
|||
// if (Math.abs(Wwidth - window.innerWidth) > 50) { |
|||
// // 如果不在编辑页面,则在窗口变化后刷新窗口以适应宽度 |
|||
// if (window.location.href.indexOf('/edit') === -1) { |
|||
// window.location.reload() |
|||
// } |
|||
// }; |
|||
// }) |
|||
|
|||
// 挂在window下的全局配置 |
|||
window.DocConfig = { |
|||
// "server":'http://127.0.0.1/showdoc/server/index.php?s=', |
|||
'server': window.location.protocol + '//' + window.location.host + window.location.pathname + '../server/index.php?s=', |
|||
// "lang" :'en' |
|||
'lang': 'zh-cn' |
|||
}</script><link href=./static/css/app.22a360ef048a13853e188bdf94d7cc64.css rel=stylesheet></head><body class=grey-bg><div id=app></div><div style=display:none>本网站基于开源版showdoc搭建,仅供私人使用。如需访问showdoc官网,请在搜索引擎里搜索showdoc字样或者直接访问showdoc.com.cn</div><script type=text/javascript src=./static/js/manifest.3ad1d5771e9b13dbdad2.js></script><script type=text/javascript src=./static/js/vendor.451f9dec262f7b7fd825.js></script><script type=text/javascript src=./static/js/app.f469a9d7b4f8ba5c97c2.js></script></body></html> |
|||
<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><meta name=renderer content=webkit><meta http-equiv=X-UA-Compatible content=edge><title>帮助中心-欧轩智能场馆</title><meta name=keywords content=""><meta name=description content=""><script type=text/javascript>// var Wwidth = window.innerWidth |
|||
// window.addEventListener('resize', function() { |
|||
// /// 宽度变化大于50像素的时候刷新整个窗口以适应新宽度 |
|||
// if (Math.abs(Wwidth - window.innerWidth) > 50) { |
|||
// // 如果不在编辑页面,则在窗口变化后刷新窗口以适应宽度 |
|||
// if (window.location.href.indexOf('/edit') === -1) { |
|||
// window.location.reload() |
|||
// } |
|||
// }; |
|||
// }) |
|||
|
|||
// 挂在window下的全局配置 |
|||
window.DocConfig = { |
|||
// "server":'http://127.0.0.1/showdoc/server/index.php?s=', |
|||
'server': window.location.protocol + '//' + window.location.host + window.location.pathname + '../server/index.php?s=', |
|||
// "lang" :'en' |
|||
'lang': 'zh-cn' |
|||
}</script><link href=./static/css/app.41dc85feffab4c86186824838b3387de.css rel=stylesheet></head><body class=grey-bg><div id=app></div><div style=display:none>本网站基于开源版showdoc搭建,仅供私人使用。如需访问showdoc官网,请在搜索引擎里搜索showdoc字样或者直接访问showdoc.com.cn</div><script type=text/javascript src=./static/js/manifest.3ad1d5771e9b13dbdad2.js></script><script type=text/javascript src=./static/js/vendor.451f9dec262f7b7fd825.js></script><script type=text/javascript src=./static/js/app.88b8a49f7306f4d120a9.js></script></body></html> |
@ -1,228 +1,228 @@ |
|||
/*reset*/ |
|||
html{-webkit-text-size-adjust:none; /*解决chrome浏览器下字体不能小于12px*/} |
|||
body{ color:#000000; font-family:Verdana, Arial, Helvetica, sans-serif;} |
|||
a{outline:none; text-decoration:none;} a:hover{ text-decoration:underline;} |
|||
html{zoom:1;}html *{outline:0;zoom:1;} html button::-moz-focus-inner{border-color:transparent!important;} |
|||
body{overflow-x: hidden; font-size:12px;} body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0;} |
|||
* { |
|||
margin: 0; |
|||
padding: 0; |
|||
-webkit-appearance: none; |
|||
/*去掉浏览器默认样式*/ |
|||
-webkit-tap-highlight-color: rgba(0, 0, 0, 0); |
|||
-webkit-touch-callout: none; |
|||
box-sizing: border-box; |
|||
} |
|||
|
|||
body, |
|||
.body { |
|||
|
|||
-webkit-text-size-adjust: 100%; |
|||
/*关闭自动调整字体*/ |
|||
-webkit-overflow-scrolling: touch; |
|||
overflow-scrolling: touch; |
|||
} |
|||
|
|||
|
|||
/*pad*/ |
|||
img { |
|||
max-width: 100%; |
|||
} |
|||
a { |
|||
color: inherit; |
|||
} |
|||
|
|||
a:hover { |
|||
color: inherit; |
|||
} |
|||
|
|||
|
|||
.contactBox { |
|||
background: #5CCCB2; |
|||
} |
|||
|
|||
.contactBox .wrapperBox { |
|||
width: 1200px; |
|||
overflow: hidden; |
|||
margin: 0 auto; |
|||
padding-top: 30px; |
|||
padding-bottom: 70px; |
|||
color: #000; |
|||
font-size: 16px; |
|||
line-height: 2; |
|||
} |
|||
|
|||
.contactBox .wrapperBox>div { |
|||
float: left; |
|||
width: 50%; |
|||
} |
|||
|
|||
.contactBox .desc { |
|||
margin-top: 20px; |
|||
} |
|||
|
|||
.contactBox .rightBox { |
|||
|
|||
overflow: hidden; |
|||
} |
|||
|
|||
.contactBox .item { |
|||
width: 100px; |
|||
float: left; |
|||
text-align: center; |
|||
margin-right: 46px; |
|||
} |
|||
|
|||
.contactBox .item img { |
|||
width: 100%; |
|||
display: block; |
|||
margin-bottom: 12px; |
|||
} |
|||
|
|||
@font-face { |
|||
font-family: "unisans"; |
|||
src: url("unisans.otf"); |
|||
/* iOS 4.1- */ |
|||
font-style: normal; |
|||
font-weight: normal; |
|||
} |
|||
|
|||
.enText { |
|||
font-size: 60px; |
|||
font-weight: bold; |
|||
font-family: "unisans"; |
|||
color: #000; |
|||
} |
|||
|
|||
.linksBox{ |
|||
background: #009874; |
|||
color: #000; |
|||
} |
|||
.linksBox .wrapperBox{ |
|||
width: 1200px; |
|||
margin:0 auto; |
|||
position: relative; |
|||
padding-top: 60px; |
|||
padding-bottom: 60px; |
|||
} |
|||
.links{ |
|||
overflow: hidden; |
|||
|
|||
font-size: 16px; |
|||
margin-bottom: 55px; |
|||
} |
|||
.links > div{ |
|||
width: 546px; |
|||
float: left; |
|||
} |
|||
.links h3{ |
|||
font-size: 30px; |
|||
font-weight: bold; |
|||
margin-bottom: 30px; |
|||
} |
|||
.links li{ |
|||
margin-bottom: 14px; |
|||
} |
|||
.linksBtm{ |
|||
font-size: 20px; |
|||
} |
|||
.linksBtm a{ |
|||
margin-right: 100px; |
|||
font-weight: bold; |
|||
} |
|||
.rlogo{ |
|||
width:200px; |
|||
position: absolute; |
|||
right:0; |
|||
top:70px; |
|||
} |
|||
.footer { |
|||
font-size: 16px; |
|||
background: #000000; |
|||
} |
|||
|
|||
.footer .copyright span { |
|||
margin: 0 180px; |
|||
} |
|||
|
|||
.footer .copyright { |
|||
width: 1200px; |
|||
margin: 0 auto; |
|||
padding: 30px 0; |
|||
} |
|||
/* 平板--sm */ |
|||
@media screen and (max-width:992px) { |
|||
|
|||
.contactBox .wrapperBox{ |
|||
width:100%; |
|||
padding: 20px 0; |
|||
font-size: 12px; |
|||
} |
|||
.enText{ |
|||
font-size: 22px; |
|||
text-align: center; |
|||
} |
|||
.contactBox .wrapperBox>div{ |
|||
float: none; |
|||
width:100%; |
|||
padding: 0 15px; |
|||
} |
|||
.rightBox .enText{ |
|||
margin-top: 20px; |
|||
margin-bottom: 20px; |
|||
} |
|||
.contactBox .item{ |
|||
width:50%; |
|||
margin-right: 0; |
|||
} |
|||
.contactBox .item img{ |
|||
width: 100px; |
|||
margin:0 auto 15px; |
|||
} |
|||
.linksBox .wrapperBox{ |
|||
width:100%; |
|||
padding: 20px 15px; |
|||
} |
|||
.rlogo{ |
|||
display: none; |
|||
} |
|||
.links{ |
|||
margin-bottom: 15px; |
|||
} |
|||
.links > div{ |
|||
width: 100%; |
|||
float: none; |
|||
padding: 0; |
|||
text-align: center; |
|||
} |
|||
.links li{ |
|||
margin:4px 5px ; |
|||
display: inline-block; |
|||
font-size: 14px; |
|||
} |
|||
.links h3{ |
|||
font-size: 18px; |
|||
margin:10px 0; |
|||
} |
|||
.linksBtm{ |
|||
font-size: 16px; |
|||
text-align: center; |
|||
} |
|||
.linksBtm a{ |
|||
margin: 5px; |
|||
} |
|||
.footer .copyright{ |
|||
width: 100%; |
|||
padding: 10px; |
|||
font-size: 12px; |
|||
text-align: center; |
|||
} |
|||
.footer .copyright span{ |
|||
margin: 0; |
|||
} |
|||
.footer .copyright a:first-child{ |
|||
display: block; |
|||
margin:0 auto 3px; |
|||
font-size: 14px; |
|||
} |
|||
/*reset*/ |
|||
html{-webkit-text-size-adjust:none; /*解决chrome浏览器下字体不能小于12px*/} |
|||
body{ color:#000000; font-family:Verdana, Arial, Helvetica, sans-serif;} |
|||
a{outline:none; text-decoration:none;} a:hover{ text-decoration:underline;} |
|||
html{zoom:1;}html *{outline:0;zoom:1;} html button::-moz-focus-inner{border-color:transparent!important;} |
|||
body{overflow-x: hidden; font-size:12px;} body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0;} |
|||
* { |
|||
margin: 0; |
|||
padding: 0; |
|||
-webkit-appearance: none; |
|||
/*去掉浏览器默认样式*/ |
|||
-webkit-tap-highlight-color: rgba(0, 0, 0, 0); |
|||
-webkit-touch-callout: none; |
|||
box-sizing: border-box; |
|||
} |
|||
|
|||
body, |
|||
.body { |
|||
|
|||
-webkit-text-size-adjust: 100%; |
|||
/*关闭自动调整字体*/ |
|||
-webkit-overflow-scrolling: touch; |
|||
overflow-scrolling: touch; |
|||
} |
|||
|
|||
|
|||
/*pad*/ |
|||
img { |
|||
max-width: 100%; |
|||
} |
|||
a { |
|||
color: inherit; |
|||
} |
|||
|
|||
a:hover { |
|||
color: inherit; |
|||
} |
|||
|
|||
|
|||
.contactBox { |
|||
background: #5CCCB2; |
|||
} |
|||
|
|||
.contactBox .wrapperBox { |
|||
width: 1200px; |
|||
overflow: hidden; |
|||
margin: 0 auto; |
|||
padding-top: 30px; |
|||
padding-bottom: 70px; |
|||
color: #000; |
|||
font-size: 16px; |
|||
line-height: 2; |
|||
} |
|||
|
|||
.contactBox .wrapperBox>div { |
|||
float: left; |
|||
width: 50%; |
|||
} |
|||
|
|||
.contactBox .desc { |
|||
margin-top: 20px; |
|||
} |
|||
|
|||
.contactBox .rightBox { |
|||
|
|||
overflow: hidden; |
|||
} |
|||
|
|||
.contactBox .item { |
|||
width: 100px; |
|||
float: left; |
|||
text-align: center; |
|||
margin-right: 46px; |
|||
} |
|||
|
|||
.contactBox .item img { |
|||
width: 100%; |
|||
display: block; |
|||
margin-bottom: 12px; |
|||
} |
|||
|
|||
@font-face { |
|||
font-family: "unisans"; |
|||
src: url("unisans.otf"); |
|||
/* iOS 4.1- */ |
|||
font-style: normal; |
|||
font-weight: normal; |
|||
} |
|||
|
|||
.enText { |
|||
font-size: 60px; |
|||
font-weight: bold; |
|||
font-family: "unisans"; |
|||
color: #000; |
|||
} |
|||
|
|||
.linksBox{ |
|||
background: #009874; |
|||
color: #000; |
|||
} |
|||
.linksBox .wrapperBox{ |
|||
width: 1200px; |
|||
margin:0 auto; |
|||
position: relative; |
|||
padding-top: 60px; |
|||
padding-bottom: 60px; |
|||
} |
|||
.links{ |
|||
overflow: hidden; |
|||
|
|||
font-size: 16px; |
|||
margin-bottom: 55px; |
|||
} |
|||
.links > div{ |
|||
width: 546px; |
|||
float: left; |
|||
} |
|||
.links h3{ |
|||
font-size: 30px; |
|||
font-weight: bold; |
|||
margin-bottom: 30px; |
|||
} |
|||
.links li{ |
|||
margin-bottom: 14px; |
|||
} |
|||
.linksBtm{ |
|||
font-size: 20px; |
|||
} |
|||
.linksBtm a{ |
|||
margin-right: 100px; |
|||
font-weight: bold; |
|||
} |
|||
.rlogo{ |
|||
width:200px; |
|||
position: absolute; |
|||
right:0; |
|||
top:70px; |
|||
} |
|||
.footer { |
|||
font-size: 16px; |
|||
background: #000000; |
|||
} |
|||
|
|||
.footer .copyright span { |
|||
margin: 0 180px; |
|||
} |
|||
|
|||
.footer .copyright { |
|||
width: 1200px; |
|||
margin: 0 auto; |
|||
padding: 30px 0; |
|||
} |
|||
/* 平板--sm */ |
|||
@media screen and (max-width:992px) { |
|||
|
|||
.contactBox .wrapperBox{ |
|||
width:100%; |
|||
padding: 20px 0; |
|||
font-size: 12px; |
|||
} |
|||
.enText{ |
|||
font-size: 22px; |
|||
text-align: center; |
|||
} |
|||
.contactBox .wrapperBox>div{ |
|||
float: none; |
|||
width:100%; |
|||
padding: 0 15px; |
|||
} |
|||
.rightBox .enText{ |
|||
margin-top: 20px; |
|||
margin-bottom: 20px; |
|||
} |
|||
.contactBox .item{ |
|||
width:50%; |
|||
margin-right: 0; |
|||
} |
|||
.contactBox .item img{ |
|||
width: 100px; |
|||
margin:0 auto 15px; |
|||
} |
|||
.linksBox .wrapperBox{ |
|||
width:100%; |
|||
padding: 20px 15px; |
|||
} |
|||
.rlogo{ |
|||
display: none; |
|||
} |
|||
.links{ |
|||
margin-bottom: 15px; |
|||
} |
|||
.links > div{ |
|||
width: 100%; |
|||
float: none; |
|||
padding: 0; |
|||
text-align: center; |
|||
} |
|||
.links li{ |
|||
margin:4px 5px ; |
|||
display: inline-block; |
|||
font-size: 14px; |
|||
} |
|||
.links h3{ |
|||
font-size: 18px; |
|||
margin:10px 0; |
|||
} |
|||
.linksBtm{ |
|||
font-size: 16px; |
|||
text-align: center; |
|||
} |
|||
.linksBtm a{ |
|||
margin: 5px; |
|||
} |
|||
.footer .copyright{ |
|||
width: 100%; |
|||
padding: 10px; |
|||
font-size: 12px; |
|||
text-align: center; |
|||
} |
|||
.footer .copyright span{ |
|||
margin: 0; |
|||
} |
|||
.footer .copyright a:first-child{ |
|||
display: block; |
|||
margin:0 auto 3px; |
|||
font-size: 14px; |
|||
} |
|||
} |
2
web/static/css/app.41dc85feffab4c86186824838b3387de.css
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -1,80 +1,80 @@ |
|||
body { |
|||
margin: 0; |
|||
} |
|||
|
|||
.grey-bg { |
|||
background-color: rgb(250, 250, 250); |
|||
} |
|||
#app { |
|||
font: 14px/1.5 "Microsoft Yahei", 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; |
|||
} |
|||
|
|||
a { |
|||
color: #409eff; |
|||
text-decoration: none; |
|||
} |
|||
|
|||
.center-card { |
|||
width: 300px; |
|||
position: absolute; |
|||
top: 50%; |
|||
left: 50%; |
|||
transform: translate(-50%, -50%); |
|||
padding-top: 0px; |
|||
padding-left: 15px; |
|||
padding-right: 15px; |
|||
padding-bottom: 0px; |
|||
box-sizing: border-box; |
|||
} |
|||
|
|||
/* 水平居中的卡片 */ |
|||
.hor-center-card { |
|||
width: 700px; |
|||
margin: 20px auto; |
|||
padding-top: 0px; |
|||
padding-left: 15px; |
|||
padding-right: 15px; |
|||
padding-bottom: 0px; |
|||
box-sizing: border-box; |
|||
} |
|||
|
|||
.pull-right { |
|||
float: right; |
|||
} |
|||
|
|||
.pull-left { |
|||
float: left; |
|||
} |
|||
|
|||
.el-dropdown-link { |
|||
cursor: pointer; |
|||
color: #409eff; |
|||
} |
|||
|
|||
li { |
|||
list-style-type: none; |
|||
} |
|||
|
|||
.markdown-body ul li { |
|||
list-style-type: disc; |
|||
} |
|||
|
|||
.markdown-body ol li { |
|||
list-style-type: decimal; |
|||
} |
|||
|
|||
.text-center { |
|||
text-align: center; |
|||
} |
|||
|
|||
.text-left { |
|||
text-align: left; |
|||
} |
|||
|
|||
.block { |
|||
display: block; |
|||
} |
|||
|
|||
.el-message-box { |
|||
max-width: 80vw; |
|||
} |
|||
body { |
|||
margin: 0; |
|||
} |
|||
|
|||
.grey-bg { |
|||
background-color: rgb(250, 250, 250); |
|||
} |
|||
#app { |
|||
font: 14px/1.5 "Microsoft Yahei", 微软雅黑, Tahoma, Arial, Helvetica, STHeiti; |
|||
} |
|||
|
|||
a { |
|||
color: #409eff; |
|||
text-decoration: none; |
|||
} |
|||
|
|||
.center-card { |
|||
width: 300px; |
|||
position: absolute; |
|||
top: 50%; |
|||
left: 50%; |
|||
transform: translate(-50%, -50%); |
|||
padding-top: 0px; |
|||
padding-left: 15px; |
|||
padding-right: 15px; |
|||
padding-bottom: 0px; |
|||
box-sizing: border-box; |
|||
} |
|||
|
|||
/* 水平居中的卡片 */ |
|||
.hor-center-card { |
|||
width: 700px; |
|||
margin: 20px auto; |
|||
padding-top: 0px; |
|||
padding-left: 15px; |
|||
padding-right: 15px; |
|||
padding-bottom: 0px; |
|||
box-sizing: border-box; |
|||
} |
|||
|
|||
.pull-right { |
|||
float: right; |
|||
} |
|||
|
|||
.pull-left { |
|||
float: left; |
|||
} |
|||
|
|||
.el-dropdown-link { |
|||
cursor: pointer; |
|||
color: #409eff; |
|||
} |
|||
|
|||
li { |
|||
list-style-type: none; |
|||
} |
|||
|
|||
.markdown-body ul li { |
|||
list-style-type: disc; |
|||
} |
|||
|
|||
.markdown-body ol li { |
|||
list-style-type: decimal; |
|||
} |
|||
|
|||
.text-center { |
|||
text-align: center; |
|||
} |
|||
|
|||
.text-left { |
|||
text-align: left; |
|||
} |
|||
|
|||
.block { |
|||
display: block; |
|||
} |
|||
|
|||
.el-message-box { |
|||
max-width: 80vw; |
|||
} |
@ -1,82 +1,82 @@ |
|||
|
|||
/*reset*/ |
|||
html{-webkit-text-size-adjust:none; /*解决chrome浏览器下字体不能小于12px*/} |
|||
body{ color:#000000; font-family:Verdana, Arial, Helvetica, sans-serif;} |
|||
a{outline:none; text-decoration:none;} a:hover{ text-decoration:underline;} |
|||
html{zoom:1;}html *{outline:0;zoom:1;} html button::-moz-focus-inner{border-color:transparent!important;} |
|||
body{overflow-x: hidden; font-size:12px;} body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0;} table{/*border-collapse:collapse;border-spacing:0;*/} fieldset,a img{border:0;} address,caption,cite,code,dfn,em,th,var{font-style:normal;font-weight:normal;} li{list-style:none;} caption,th{text-align:left;} h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;} q:before,q:after{content:'';} |
|||
input[type="submit"], input[type="reset"], input[type="button"], button { -webkit-appearance: none; /*去掉苹果的默认UI来渲染按钮*/} em,i{ font-style:normal;} |
|||
|
|||
|
|||
|
|||
/*common*/ |
|||
.clearfix:after {content:"."; display:block; height:0; clear:both; visibility:hidden; }.clearfix {display:block;}.clear{ clear:both;} |
|||
.colwrapper { overflow:hidden; zoom:1 /*for ie*/; margin:5px auto; } |
|||
.strong{ font-weight: bold;} .left{ float: left;} .right{ float: right;} .center{ margin:0 auto; text-align:center;} |
|||
.show{ display:block; visibility:visible;}.hide{ display: none; visibility:hidden;} |
|||
.block{ display:block;} .inline{ display:inline;} |
|||
.break{ word-wrap:break-word;overflow:hidden; /*word-break:break-all;*/} |
|||
|
|||
.tal{ text-align:left} .tar{ text-align:right;} |
|||
|
|||
/*文字两侧对齐*/ |
|||
.justify { |
|||
text-align:justify; |
|||
text-justify:distribute-all-lines;/*ie6-8*/ |
|||
text-align-last:justify;/* ie9*/ |
|||
-moz-text-align-last:justify;/*ff*/ |
|||
-webkit-text-align-last:justify;/*chrome 20+*/ |
|||
} |
|||
|
|||
.toe{ |
|||
/*超出省略号*/ |
|||
word-break:keep-all; |
|||
white-space:nowrap; |
|||
overflow:hidden; |
|||
text-overflow:ellipsis; |
|||
} |
|||
@media screen and (-webkit-min-device-pixel-ratio:0){/* chrome*/ |
|||
.justify:after{ |
|||
content:"."; |
|||
display: inline-block; |
|||
width:100%; |
|||
overflow:hidden; |
|||
height:0; |
|||
} |
|||
} |
|||
|
|||
a{ color:inherit; text-decoration: none;} |
|||
a:hover{ color:#3e6ed4; text-decoration: none;} |
|||
|
|||
body{font-family: "Microsoft YaHei",sans-serif;} |
|||
|
|||
.css3{ |
|||
/*transition: all 0.3s ease-in-out 0s;*/ |
|||
|
|||
-webkit-transform:translate3d(0, -20px, 0); |
|||
-ms-transform:translate3d(0, -20px, 0); |
|||
transform:translate3d(0, -20px, 0); |
|||
|
|||
-webkit-transition-property:opacity, -webkit-transform; |
|||
transition-property:opacity, transform; |
|||
-webkit-transition-duration:1000ms; |
|||
transition-duration:1000ms; |
|||
-webkit-transition-timing-function:cubic-bezier(0.25, 0.46, 0.33, 0.98); |
|||
transition-timing-function:cubic-bezier(0.25, 0.46, 0.33, 0.98); |
|||
|
|||
-webkit-transition-delay:800ms; |
|||
transition-delay:800ms |
|||
} |
|||
.css3.animated{ |
|||
-webkit-transform:translate3d(0, 0, 0); |
|||
-ms-transform:translate3d(0, 0, 0); |
|||
transform:translate3d(0, 0, 0); |
|||
} |
|||
@media screen and (max-width: 650px) { |
|||
|
|||
} |
|||
|
|||
@media screen and (max-width: 480px) { |
|||
|
|||
} |
|||
|
|||
|
|||
/*reset*/ |
|||
html{-webkit-text-size-adjust:none; /*解决chrome浏览器下字体不能小于12px*/} |
|||
body{ color:#000000; font-family:Verdana, Arial, Helvetica, sans-serif;} |
|||
a{outline:none; text-decoration:none;} a:hover{ text-decoration:underline;} |
|||
html{zoom:1;}html *{outline:0;zoom:1;} html button::-moz-focus-inner{border-color:transparent!important;} |
|||
body{overflow-x: hidden; font-size:12px;} body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,code,form,fieldset,legend,input,textarea,p,blockquote,th,td{margin:0;padding:0;} table{/*border-collapse:collapse;border-spacing:0;*/} fieldset,a img{border:0;} address,caption,cite,code,dfn,em,th,var{font-style:normal;font-weight:normal;} li{list-style:none;} caption,th{text-align:left;} h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:normal;} q:before,q:after{content:'';} |
|||
input[type="submit"], input[type="reset"], input[type="button"], button { -webkit-appearance: none; /*去掉苹果的默认UI来渲染按钮*/} em,i{ font-style:normal;} |
|||
|
|||
|
|||
|
|||
/*common*/ |
|||
.clearfix:after {content:"."; display:block; height:0; clear:both; visibility:hidden; }.clearfix {display:block;}.clear{ clear:both;} |
|||
.colwrapper { overflow:hidden; zoom:1 /*for ie*/; margin:5px auto; } |
|||
.strong{ font-weight: bold;} .left{ float: left;} .right{ float: right;} .center{ margin:0 auto; text-align:center;} |
|||
.show{ display:block; visibility:visible;}.hide{ display: none; visibility:hidden;} |
|||
.block{ display:block;} .inline{ display:inline;} |
|||
.break{ word-wrap:break-word;overflow:hidden; /*word-break:break-all;*/} |
|||
|
|||
.tal{ text-align:left} .tar{ text-align:right;} |
|||
|
|||
/*文字两侧对齐*/ |
|||
.justify { |
|||
text-align:justify; |
|||
text-justify:distribute-all-lines;/*ie6-8*/ |
|||
text-align-last:justify;/* ie9*/ |
|||
-moz-text-align-last:justify;/*ff*/ |
|||
-webkit-text-align-last:justify;/*chrome 20+*/ |
|||
} |
|||
|
|||
.toe{ |
|||
/*超出省略号*/ |
|||
word-break:keep-all; |
|||
white-space:nowrap; |
|||
overflow:hidden; |
|||
text-overflow:ellipsis; |
|||
} |
|||
@media screen and (-webkit-min-device-pixel-ratio:0){/* chrome*/ |
|||
.justify:after{ |
|||
content:"."; |
|||
display: inline-block; |
|||
width:100%; |
|||
overflow:hidden; |
|||
height:0; |
|||
} |
|||
} |
|||
|
|||
a{ color:inherit; text-decoration: none;} |
|||
a:hover{ color:#3e6ed4; text-decoration: none;} |
|||
|
|||
body{font-family: "Microsoft YaHei",sans-serif;} |
|||
|
|||
.css3{ |
|||
/*transition: all 0.3s ease-in-out 0s;*/ |
|||
|
|||
-webkit-transform:translate3d(0, -20px, 0); |
|||
-ms-transform:translate3d(0, -20px, 0); |
|||
transform:translate3d(0, -20px, 0); |
|||
|
|||
-webkit-transition-property:opacity, -webkit-transform; |
|||
transition-property:opacity, transform; |
|||
-webkit-transition-duration:1000ms; |
|||
transition-duration:1000ms; |
|||
-webkit-transition-timing-function:cubic-bezier(0.25, 0.46, 0.33, 0.98); |
|||
transition-timing-function:cubic-bezier(0.25, 0.46, 0.33, 0.98); |
|||
|
|||
-webkit-transition-delay:800ms; |
|||
transition-delay:800ms |
|||
} |
|||
.css3.animated{ |
|||
-webkit-transform:translate3d(0, 0, 0); |
|||
-ms-transform:translate3d(0, 0, 0); |
|||
transform:translate3d(0, 0, 0); |
|||
} |
|||
@media screen and (max-width: 650px) { |
|||
|
|||
} |
|||
|
|||
@media screen and (max-width: 480px) { |
|||
|
|||
} |
|||
|
@ -1,333 +1,333 @@ |
|||
* { |
|||
margin: 0; |
|||
padding: 0; |
|||
-webkit-appearance: none; |
|||
/*去掉浏览器默认样式*/ |
|||
-webkit-tap-highlight-color: rgba(0, 0, 0, 0); |
|||
-webkit-touch-callout: none; |
|||
box-sizing: border-box; |
|||
} |
|||
|
|||
body, |
|||
.body { |
|||
|
|||
-webkit-text-size-adjust: 100%; |
|||
/*关闭自动调整字体*/ |
|||
-webkit-overflow-scrolling: touch; |
|||
overflow-scrolling: touch; |
|||
} |
|||
|
|||
|
|||
/*pad*/ |
|||
img { |
|||
max-width: 100%; |
|||
} |
|||
|
|||
input[type="submit"], |
|||
input[type="reset"], |
|||
input[type="button"], |
|||
button { |
|||
-webkit-appearance: none; |
|||
/*去掉苹果的默认UI来渲染按钮*/ |
|||
} |
|||
|
|||
@media only screen and (max-width:1480px) { |
|||
.wrapper { |
|||
width: 1240px; |
|||
} |
|||
|
|||
.hbanner .wrapper { |
|||
background-size: 650px auto; |
|||
} |
|||
|
|||
.hrow .txt h2 { |
|||
font-size: 36px; |
|||
} |
|||
|
|||
.hrow .txt p { |
|||
font-size: 18px; |
|||
} |
|||
|
|||
} |
|||
|
|||
/* 电脑小屏--md */ |
|||
@media screen and (max-width:1200px) { |
|||
.wrapper { |
|||
width: 1170px; |
|||
} |
|||
|
|||
/*价格*/ |
|||
.mprice-main .wrapper { |
|||
padding-left: 150px; |
|||
position: relative; |
|||
margin-right: 20px; |
|||
|
|||
} |
|||
|
|||
.mprice-main { |
|||
background-size: cover; |
|||
padding-bottom: 40px; |
|||
padding-top: 100px; |
|||
} |
|||
|
|||
.mprice-main .itemwrap { |
|||
white-space: nowrap; |
|||
overflow-x: scroll; |
|||
padding-top: 80px; |
|||
} |
|||
|
|||
.mprice-main .item { |
|||
float: none; |
|||
display: inline-block; |
|||
vertical-align: top; |
|||
width: 200px; |
|||
} |
|||
|
|||
.mprice-main .item ul.tit { |
|||
padding-left: 20px; |
|||
} |
|||
|
|||
.mprice-main .itemtit { |
|||
position: absolute; |
|||
left: 0; |
|||
top: 0; |
|||
} |
|||
|
|||
.mprice-main .item .btn a { |
|||
width: 120px; |
|||
height: 45px; |
|||
line-height: 45px; |
|||
font-size: 14px; |
|||
} |
|||
|
|||
.mprice-explain { |
|||
padding: 60px 0; |
|||
} |
|||
|
|||
.mprice-explain .wrapper { |
|||
padding: 0 20px; |
|||
} |
|||
|
|||
} |
|||
|
|||
/* 平板--sm */ |
|||
@media screen and (max-width:992px) { |
|||
|
|||
|
|||
.wrapper { |
|||
width: auto; |
|||
} |
|||
|
|||
.hbanner .wrapper { |
|||
background-size: 300px auto; |
|||
background-position: center 100px; |
|||
padding-top: 400px; |
|||
height: auto; |
|||
padding-bottom: 100px; |
|||
} |
|||
|
|||
.hbanner-txt .btns a { |
|||
width: auto; |
|||
min-width: 120px; |
|||
height: 45px; |
|||
line-height: 45px; |
|||
} |
|||
|
|||
.hbanner-txt { |
|||
padding-left: 40px; |
|||
/*text-align: center;*/ |
|||
} |
|||
|
|||
.hbanner-txt h2 { |
|||
font-size: 24px; |
|||
} |
|||
|
|||
.hbanner-txt .list li { |
|||
margin-bottom: 15px; |
|||
} |
|||
|
|||
.hrow .img { |
|||
width: auto; |
|||
float: none; |
|||
text-align: center; |
|||
padding-top: 0; |
|||
} |
|||
|
|||
.hrow { |
|||
height: auto !important; |
|||
padding-bottom: 100px; |
|||
padding-top: 100px; |
|||
} |
|||
|
|||
.hrow .txt { |
|||
width: auto; |
|||
float: none; |
|||
padding-top: 40px; |
|||
} |
|||
|
|||
.hrow .img>img { |
|||
max-width: 220px; |
|||
} |
|||
|
|||
.hrow .txt h2 { |
|||
font-size: 24px; |
|||
margin-bottom: 20px; |
|||
} |
|||
|
|||
.hrow .txt p { |
|||
font-size: 14px; |
|||
padding-bottom: 10px; |
|||
} |
|||
|
|||
.hfoot { |
|||
padding-top: 100px; |
|||
height: auto; |
|||
padding-bottom: 120px; |
|||
background-size: cover; |
|||
} |
|||
|
|||
.hfoot h2 { |
|||
font-size: 24px; |
|||
} |
|||
|
|||
.hfoot h2 br { |
|||
display: block; |
|||
} |
|||
|
|||
.hfoot .btn { |
|||
width: auto; |
|||
min-width: 120px; |
|||
height: 45px; |
|||
line-height: 45px; |
|||
} |
|||
|
|||
/*下载*/ |
|||
.downpage { |
|||
width: auto; |
|||
margin-left: 20px; |
|||
margin-right: 20px; |
|||
margin-top: 100px; |
|||
margin-bottom: 100px; |
|||
} |
|||
|
|||
.downlist { |
|||
padding: 40px 0; |
|||
} |
|||
|
|||
.downlist .body { |
|||
margin-top: 40px; |
|||
} |
|||
|
|||
.downlist .body li { |
|||
display: block; |
|||
margin-bottom: 40px; |
|||
} |
|||
|
|||
.downlist .body .btn a { |
|||
width: auto; |
|||
min-width: 120px; |
|||
height: 45px; |
|||
line-height: 45px; |
|||
font-size: 14px; |
|||
} |
|||
|
|||
/*注册*/ |
|||
.form-box { |
|||
width: auto; |
|||
margin-left: 20px; |
|||
margin-right: 20px; |
|||
margin-top: 150px; |
|||
margin-bottom: 100px; |
|||
} |
|||
|
|||
.form { |
|||
padding: 20px; |
|||
padding-top: 70px; |
|||
} |
|||
|
|||
.form-btns button { |
|||
height: 45px; |
|||
line-height: 45px; |
|||
font-size: 14px; |
|||
} |
|||
|
|||
.form-list .text { |
|||
height: 45px; |
|||
} |
|||
|
|||
.form-list .textcode+img { |
|||
height: 45px; |
|||
width: 100px; |
|||
} |
|||
|
|||
/*帮助中心*/ |
|||
.searchBox { |
|||
height: auto; |
|||
padding-top: 20px; |
|||
padding-bottom: 20px; |
|||
} |
|||
|
|||
.searchBox .wrapperBox { |
|||
width: 100%; |
|||
padding: 0 15px; |
|||
} |
|||
|
|||
.tip-text { |
|||
font-size: 18px; |
|||
} |
|||
|
|||
.input-group { |
|||
height: 40px; |
|||
padding-left: 40px; |
|||
border-radius: 20px; |
|||
} |
|||
|
|||
.input-group .btn { |
|||
font-size: 18px; |
|||
line-height: 36px; |
|||
width: 80px |
|||
} |
|||
|
|||
.input-group>img { |
|||
width: 24px; |
|||
top: 6px; |
|||
left: 10px; |
|||
} |
|||
|
|||
.input-group .form-control { |
|||
line-height: 38px; |
|||
font-size: 16px; |
|||
} |
|||
|
|||
h2.title { |
|||
font-size: 20px; |
|||
margin-bottom: 30px; |
|||
} |
|||
|
|||
.docListBox { |
|||
width: 100%; |
|||
padding: 20px 15px; |
|||
} |
|||
|
|||
.docListBox a { |
|||
width: 100%; |
|||
height: auto; |
|||
padding-top: 10px; |
|||
padding-bottom: 10px; |
|||
float:none; |
|||
font-size: 14px; |
|||
margin: 0; |
|||
border-top: 1px solid#EDEDED; |
|||
} |
|||
.docListBox a::before{ |
|||
top:50%; |
|||
margin-top: -20px; |
|||
} |
|||
|
|||
} |
|||
|
|||
@media screen and (max-width:768px) { |
|||
/*.wrapper{ |
|||
width: 750px; |
|||
}*/ |
|||
} |
|||
* { |
|||
margin: 0; |
|||
padding: 0; |
|||
-webkit-appearance: none; |
|||
/*去掉浏览器默认样式*/ |
|||
-webkit-tap-highlight-color: rgba(0, 0, 0, 0); |
|||
-webkit-touch-callout: none; |
|||
box-sizing: border-box; |
|||
} |
|||
|
|||
body, |
|||
.body { |
|||
|
|||
-webkit-text-size-adjust: 100%; |
|||
/*关闭自动调整字体*/ |
|||
-webkit-overflow-scrolling: touch; |
|||
overflow-scrolling: touch; |
|||
} |
|||
|
|||
|
|||
/*pad*/ |
|||
img { |
|||
max-width: 100%; |
|||
} |
|||
|
|||
input[type="submit"], |
|||
input[type="reset"], |
|||
input[type="button"], |
|||
button { |
|||
-webkit-appearance: none; |
|||
/*去掉苹果的默认UI来渲染按钮*/ |
|||
} |
|||
|
|||
@media only screen and (max-width:1480px) { |
|||
.wrapper { |
|||
width: 1240px; |
|||
} |
|||
|
|||
.hbanner .wrapper { |
|||
background-size: 650px auto; |
|||
} |
|||
|
|||
.hrow .txt h2 { |
|||
font-size: 36px; |
|||
} |
|||
|
|||
.hrow .txt p { |
|||
font-size: 18px; |
|||
} |
|||
|
|||
} |
|||
|
|||
/* 电脑小屏--md */ |
|||
@media screen and (max-width:1200px) { |
|||
.wrapper { |
|||
width: 1170px; |
|||
} |
|||
|
|||
/*价格*/ |
|||
.mprice-main .wrapper { |
|||
padding-left: 150px; |
|||
position: relative; |
|||
margin-right: 20px; |
|||
|
|||
} |
|||
|
|||
.mprice-main { |
|||
background-size: cover; |
|||
padding-bottom: 40px; |
|||
padding-top: 100px; |
|||
} |
|||
|
|||
.mprice-main .itemwrap { |
|||
white-space: nowrap; |
|||
overflow-x: scroll; |
|||
padding-top: 80px; |
|||
} |
|||
|
|||
.mprice-main .item { |
|||
float: none; |
|||
display: inline-block; |
|||
vertical-align: top; |
|||
width: 200px; |
|||
} |
|||
|
|||
.mprice-main .item ul.tit { |
|||
padding-left: 20px; |
|||
} |
|||
|
|||
.mprice-main .itemtit { |
|||
position: absolute; |
|||
left: 0; |
|||
top: 0; |
|||
} |
|||
|
|||
.mprice-main .item .btn a { |
|||
width: 120px; |
|||
height: 45px; |
|||
line-height: 45px; |
|||
font-size: 14px; |
|||
} |
|||
|
|||
.mprice-explain { |
|||
padding: 60px 0; |
|||
} |
|||
|
|||
.mprice-explain .wrapper { |
|||
padding: 0 20px; |
|||
} |
|||
|
|||
} |
|||
|
|||
/* 平板--sm */ |
|||
@media screen and (max-width:992px) { |
|||
|
|||
|
|||
.wrapper { |
|||
width: auto; |
|||
} |
|||
|
|||
.hbanner .wrapper { |
|||
background-size: 300px auto; |
|||
background-position: center 100px; |
|||
padding-top: 400px; |
|||
height: auto; |
|||
padding-bottom: 100px; |
|||
} |
|||
|
|||
.hbanner-txt .btns a { |
|||
width: auto; |
|||
min-width: 120px; |
|||
height: 45px; |
|||
line-height: 45px; |
|||
} |
|||
|
|||
.hbanner-txt { |
|||
padding-left: 40px; |
|||
/*text-align: center;*/ |
|||
} |
|||
|
|||
.hbanner-txt h2 { |
|||
font-size: 24px; |
|||
} |
|||
|
|||
.hbanner-txt .list li { |
|||
margin-bottom: 15px; |
|||
} |
|||
|
|||
.hrow .img { |
|||
width: auto; |
|||
float: none; |
|||
text-align: center; |
|||
padding-top: 0; |
|||
} |
|||
|
|||
.hrow { |
|||
height: auto !important; |
|||
padding-bottom: 100px; |
|||
padding-top: 100px; |
|||
} |
|||
|
|||
.hrow .txt { |
|||
width: auto; |
|||
float: none; |
|||
padding-top: 40px; |
|||
} |
|||
|
|||
.hrow .img>img { |
|||
max-width: 220px; |
|||
} |
|||
|
|||
.hrow .txt h2 { |
|||
font-size: 24px; |
|||
margin-bottom: 20px; |
|||
} |
|||
|
|||
.hrow .txt p { |
|||
font-size: 14px; |
|||
padding-bottom: 10px; |
|||
} |
|||
|
|||
.hfoot { |
|||
padding-top: 100px; |
|||
height: auto; |
|||
padding-bottom: 120px; |
|||
background-size: cover; |
|||
} |
|||
|
|||
.hfoot h2 { |
|||
font-size: 24px; |
|||
} |
|||
|
|||
.hfoot h2 br { |
|||
display: block; |
|||
} |
|||
|
|||
.hfoot .btn { |
|||
width: auto; |
|||
min-width: 120px; |
|||
height: 45px; |
|||
line-height: 45px; |
|||
} |
|||
|
|||
/*下载*/ |
|||
.downpage { |
|||
width: auto; |
|||
margin-left: 20px; |
|||
margin-right: 20px; |
|||
margin-top: 100px; |
|||
margin-bottom: 100px; |
|||
} |
|||
|
|||
.downlist { |
|||
padding: 40px 0; |
|||
} |
|||
|
|||
.downlist .body { |
|||
margin-top: 40px; |
|||
} |
|||
|
|||
.downlist .body li { |
|||
display: block; |
|||
margin-bottom: 40px; |
|||
} |
|||
|
|||
.downlist .body .btn a { |
|||
width: auto; |
|||
min-width: 120px; |
|||
height: 45px; |
|||
line-height: 45px; |
|||
font-size: 14px; |
|||
} |
|||
|
|||
/*注册*/ |
|||
.form-box { |
|||
width: auto; |
|||
margin-left: 20px; |
|||
margin-right: 20px; |
|||
margin-top: 150px; |
|||
margin-bottom: 100px; |
|||
} |
|||
|
|||
.form { |
|||
padding: 20px; |
|||
padding-top: 70px; |
|||
} |
|||
|
|||
.form-btns button { |
|||
height: 45px; |
|||
line-height: 45px; |
|||
font-size: 14px; |
|||
} |
|||
|
|||
.form-list .text { |
|||
height: 45px; |
|||
} |
|||
|
|||
.form-list .textcode+img { |
|||
height: 45px; |
|||
width: 100px; |
|||
} |
|||
|
|||
/*帮助中心*/ |
|||
.searchBox { |
|||
height: auto; |
|||
padding-top: 20px; |
|||
padding-bottom: 20px; |
|||
} |
|||
|
|||
.searchBox .wrapperBox { |
|||
width: 100%; |
|||
padding: 0 15px; |
|||
} |
|||
|
|||
.tip-text { |
|||
font-size: 18px; |
|||
} |
|||
|
|||
.input-group { |
|||
height: 40px; |
|||
padding-left: 40px; |
|||
border-radius: 20px; |
|||
} |
|||
|
|||
.input-group .btn { |
|||
font-size: 18px; |
|||
line-height: 36px; |
|||
width: 80px |
|||
} |
|||
|
|||
.input-group>img { |
|||
width: 24px; |
|||
top: 6px; |
|||
left: 10px; |
|||
} |
|||
|
|||
.input-group .form-control { |
|||
line-height: 38px; |
|||
font-size: 16px; |
|||
} |
|||
|
|||
h2.title { |
|||
font-size: 20px; |
|||
margin-bottom: 30px; |
|||
} |
|||
|
|||
.docListBox { |
|||
width: 100%; |
|||
padding: 20px 15px; |
|||
} |
|||
|
|||
.docListBox a { |
|||
width: 100%; |
|||
height: auto; |
|||
padding-top: 10px; |
|||
padding-bottom: 10px; |
|||
float:none; |
|||
font-size: 14px; |
|||
margin: 0; |
|||
border-top: 1px solid#EDEDED; |
|||
} |
|||
.docListBox a::before{ |
|||
top:50%; |
|||
margin-top: -20px; |
|||
} |
|||
|
|||
} |
|||
|
|||
@media screen and (max-width:768px) { |
|||
/*.wrapper{ |
|||
width: 750px; |
|||
}*/ |
|||
} |
1586
web/static/css/style.css
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -1,411 +1,411 @@ |
|||
/*** |
|||
This is part of jsdifflib v1.0. <http://snowtide.com/jsdifflib>
|
|||
|
|||
Copyright (c) 2007, Snowtide Informatics Systems, Inc. |
|||
All rights reserved. |
|||
|
|||
Redistribution and use in source and binary forms, with or without modification, |
|||
are permitted provided that the following conditions are met: |
|||
|
|||
* Redistributions of source code must retain the above copyright notice, this |
|||
list of conditions and the following disclaimer. |
|||
* Redistributions in binary form must reproduce the above copyright notice, |
|||
this list of conditions and the following disclaimer in the documentation |
|||
and/or other materials provided with the distribution. |
|||
* Neither the name of the Snowtide Informatics Systems nor the names of its |
|||
contributors may be used to endorse or promote products derived from this |
|||
software without specific prior written permission. |
|||
|
|||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY |
|||
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
|||
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT |
|||
SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, |
|||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED |
|||
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR |
|||
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
|||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN |
|||
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH |
|||
DAMAGE. |
|||
***/ |
|||
/* Author: Chas Emerick <cemerick@snowtide.com> */ |
|||
__whitespace = {" ":true, "\t":true, "\n":true, "\f":true, "\r":true}; |
|||
|
|||
difflib = { |
|||
defaultJunkFunction: function (c) { |
|||
return __whitespace.hasOwnProperty(c); |
|||
}, |
|||
|
|||
stripLinebreaks: function (str) { return str.replace(/^[\n\r]*|[\n\r]*$/g, ""); }, |
|||
|
|||
stringAsLines: function (str) { |
|||
var lfpos = str.indexOf("\n"); |
|||
var crpos = str.indexOf("\r"); |
|||
var linebreak = ((lfpos > -1 && crpos > -1) || crpos < 0) ? "\n" : "\r"; |
|||
|
|||
var lines = str.split(linebreak); |
|||
for (var i = 0; i < lines.length; i++) { |
|||
lines[i] = difflib.stripLinebreaks(lines[i]); |
|||
} |
|||
|
|||
return lines; |
|||
}, |
|||
|
|||
// iteration-based reduce implementation
|
|||
__reduce: function (func, list, initial) { |
|||
if (initial != null) { |
|||
var value = initial; |
|||
var idx = 0; |
|||
} else if (list) { |
|||
var value = list[0]; |
|||
var idx = 1; |
|||
} else { |
|||
return null; |
|||
} |
|||
|
|||
for (; idx < list.length; idx++) { |
|||
value = func(value, list[idx]); |
|||
} |
|||
|
|||
return value; |
|||
}, |
|||
|
|||
// comparison function for sorting lists of numeric tuples
|
|||
__ntuplecomp: function (a, b) { |
|||
var mlen = Math.max(a.length, b.length); |
|||
for (var i = 0; i < mlen; i++) { |
|||
if (a[i] < b[i]) return -1; |
|||
if (a[i] > b[i]) return 1; |
|||
} |
|||
|
|||
return a.length == b.length ? 0 : (a.length < b.length ? -1 : 1); |
|||
}, |
|||
|
|||
__calculate_ratio: function (matches, length) { |
|||
return length ? 2.0 * matches / length : 1.0; |
|||
}, |
|||
|
|||
// returns a function that returns true if a key passed to the returned function
|
|||
// is in the dict (js object) provided to this function; replaces being able to
|
|||
// carry around dict.has_key in python...
|
|||
__isindict: function (dict) { |
|||
return function (key) { return dict.hasOwnProperty(key); }; |
|||
}, |
|||
|
|||
// replacement for python's dict.get function -- need easy default values
|
|||
__dictget: function (dict, key, defaultValue) { |
|||
return dict.hasOwnProperty(key) ? dict[key] : defaultValue; |
|||
}, |
|||
|
|||
SequenceMatcher: function (a, b, isjunk) { |
|||
this.set_seqs = function (a, b) { |
|||
this.set_seq1(a); |
|||
this.set_seq2(b); |
|||
} |
|||
|
|||
this.set_seq1 = function (a) { |
|||
if (a == this.a) return; |
|||
this.a = a; |
|||
this.matching_blocks = this.opcodes = null; |
|||
} |
|||
|
|||
this.set_seq2 = function (b) { |
|||
if (b == this.b) return; |
|||
this.b = b; |
|||
this.matching_blocks = this.opcodes = this.fullbcount = null; |
|||
this.__chain_b(); |
|||
} |
|||
|
|||
this.__chain_b = function () { |
|||
var b = this.b; |
|||
var n = b.length; |
|||
var b2j = this.b2j = {}; |
|||
var populardict = {}; |
|||
for (var i = 0; i < b.length; i++) { |
|||
var elt = b[i]; |
|||
if (b2j.hasOwnProperty(elt)) { |
|||
var indices = b2j[elt]; |
|||
if (n >= 200 && indices.length * 100 > n) { |
|||
populardict[elt] = 1; |
|||
delete b2j[elt]; |
|||
} else { |
|||
indices.push(i); |
|||
} |
|||
} else { |
|||
b2j[elt] = [i]; |
|||
} |
|||
} |
|||
|
|||
for (var elt in populardict) { |
|||
if (populardict.hasOwnProperty(elt)) { |
|||
delete b2j[elt]; |
|||
} |
|||
} |
|||
|
|||
var isjunk = this.isjunk; |
|||
var junkdict = {}; |
|||
if (isjunk) { |
|||
for (var elt in populardict) { |
|||
if (populardict.hasOwnProperty(elt) && isjunk(elt)) { |
|||
junkdict[elt] = 1; |
|||
delete populardict[elt]; |
|||
} |
|||
} |
|||
for (var elt in b2j) { |
|||
if (b2j.hasOwnProperty(elt) && isjunk(elt)) { |
|||
junkdict[elt] = 1; |
|||
delete b2j[elt]; |
|||
} |
|||
} |
|||
} |
|||
|
|||
this.isbjunk = difflib.__isindict(junkdict); |
|||
this.isbpopular = difflib.__isindict(populardict); |
|||
} |
|||
|
|||
this.find_longest_match = function (alo, ahi, blo, bhi) { |
|||
var a = this.a; |
|||
var b = this.b; |
|||
var b2j = this.b2j; |
|||
var isbjunk = this.isbjunk; |
|||
var besti = alo; |
|||
var bestj = blo; |
|||
var bestsize = 0; |
|||
var j = null; |
|||
|
|||
var j2len = {}; |
|||
var nothing = []; |
|||
for (var i = alo; i < ahi; i++) { |
|||
var newj2len = {}; |
|||
var jdict = difflib.__dictget(b2j, a[i], nothing); |
|||
for (var jkey in jdict) { |
|||
if (jdict.hasOwnProperty(jkey)) { |
|||
j = jdict[jkey]; |
|||
if (j < blo) continue; |
|||
if (j >= bhi) break; |
|||
newj2len[j] = k = difflib.__dictget(j2len, j - 1, 0) + 1; |
|||
if (k > bestsize) { |
|||
besti = i - k + 1; |
|||
bestj = j - k + 1; |
|||
bestsize = k; |
|||
} |
|||
} |
|||
} |
|||
j2len = newj2len; |
|||
} |
|||
|
|||
while (besti > alo && bestj > blo && !isbjunk(b[bestj - 1]) && a[besti - 1] == b[bestj - 1]) { |
|||
besti--; |
|||
bestj--; |
|||
bestsize++; |
|||
} |
|||
|
|||
while (besti + bestsize < ahi && bestj + bestsize < bhi && |
|||
!isbjunk(b[bestj + bestsize]) && |
|||
a[besti + bestsize] == b[bestj + bestsize]) { |
|||
bestsize++; |
|||
} |
|||
|
|||
while (besti > alo && bestj > blo && isbjunk(b[bestj - 1]) && a[besti - 1] == b[bestj - 1]) { |
|||
besti--; |
|||
bestj--; |
|||
bestsize++; |
|||
} |
|||
|
|||
while (besti + bestsize < ahi && bestj + bestsize < bhi && isbjunk(b[bestj + bestsize]) && |
|||
a[besti + bestsize] == b[bestj + bestsize]) { |
|||
bestsize++; |
|||
} |
|||
|
|||
return [besti, bestj, bestsize]; |
|||
} |
|||
|
|||
this.get_matching_blocks = function () { |
|||
if (this.matching_blocks != null) return this.matching_blocks; |
|||
var la = this.a.length; |
|||
var lb = this.b.length; |
|||
|
|||
var queue = [[0, la, 0, lb]]; |
|||
var matching_blocks = []; |
|||
var alo, ahi, blo, bhi, qi, i, j, k, x; |
|||
while (queue.length) { |
|||
qi = queue.pop(); |
|||
alo = qi[0]; |
|||
ahi = qi[1]; |
|||
blo = qi[2]; |
|||
bhi = qi[3]; |
|||
x = this.find_longest_match(alo, ahi, blo, bhi); |
|||
i = x[0]; |
|||
j = x[1]; |
|||
k = x[2]; |
|||
|
|||
if (k) { |
|||
matching_blocks.push(x); |
|||
if (alo < i && blo < j) |
|||
queue.push([alo, i, blo, j]); |
|||
if (i+k < ahi && j+k < bhi) |
|||
queue.push([i + k, ahi, j + k, bhi]); |
|||
} |
|||
} |
|||
|
|||
matching_blocks.sort(difflib.__ntuplecomp); |
|||
|
|||
var i1 = j1 = k1 = block = 0; |
|||
var non_adjacent = []; |
|||
for (var idx in matching_blocks) { |
|||
if (matching_blocks.hasOwnProperty(idx)) { |
|||
block = matching_blocks[idx]; |
|||
i2 = block[0]; |
|||
j2 = block[1]; |
|||
k2 = block[2]; |
|||
if (i1 + k1 == i2 && j1 + k1 == j2) { |
|||
k1 += k2; |
|||
} else { |
|||
if (k1) non_adjacent.push([i1, j1, k1]); |
|||
i1 = i2; |
|||
j1 = j2; |
|||
k1 = k2; |
|||
} |
|||
} |
|||
} |
|||
|
|||
if (k1) non_adjacent.push([i1, j1, k1]); |
|||
|
|||
non_adjacent.push([la, lb, 0]); |
|||
this.matching_blocks = non_adjacent; |
|||
return this.matching_blocks; |
|||
} |
|||
|
|||
this.get_opcodes = function () { |
|||
if (this.opcodes != null) return this.opcodes; |
|||
var i = 0; |
|||
var j = 0; |
|||
var answer = []; |
|||
this.opcodes = answer; |
|||
var block, ai, bj, size, tag; |
|||
var blocks = this.get_matching_blocks(); |
|||
for (var idx in blocks) { |
|||
if (blocks.hasOwnProperty(idx)) { |
|||
block = blocks[idx]; |
|||
ai = block[0]; |
|||
bj = block[1]; |
|||
size = block[2]; |
|||
tag = ''; |
|||
if (i < ai && j < bj) { |
|||
tag = 'replace'; |
|||
} else if (i < ai) { |
|||
tag = 'delete'; |
|||
} else if (j < bj) { |
|||
tag = 'insert'; |
|||
} |
|||
if (tag) answer.push([tag, i, ai, j, bj]); |
|||
i = ai + size; |
|||
j = bj + size; |
|||
|
|||
if (size) answer.push(['equal', ai, i, bj, j]); |
|||
} |
|||
} |
|||
|
|||
return answer; |
|||
} |
|||
|
|||
// this is a generator function in the python lib, which of course is not supported in javascript
|
|||
// the reimplementation builds up the grouped opcodes into a list in their entirety and returns that.
|
|||
this.get_grouped_opcodes = function (n) { |
|||
if (!n) n = 3; |
|||
var codes = this.get_opcodes(); |
|||
if (!codes) codes = [["equal", 0, 1, 0, 1]]; |
|||
var code, tag, i1, i2, j1, j2; |
|||
if (codes[0][0] == 'equal') { |
|||
code = codes[0]; |
|||
tag = code[0]; |
|||
i1 = code[1]; |
|||
i2 = code[2]; |
|||
j1 = code[3]; |
|||
j2 = code[4]; |
|||
codes[0] = [tag, Math.max(i1, i2 - n), i2, Math.max(j1, j2 - n), j2]; |
|||
} |
|||
if (codes[codes.length - 1][0] == 'equal') { |
|||
code = codes[codes.length - 1]; |
|||
tag = code[0]; |
|||
i1 = code[1]; |
|||
i2 = code[2]; |
|||
j1 = code[3]; |
|||
j2 = code[4]; |
|||
codes[codes.length - 1] = [tag, i1, Math.min(i2, i1 + n), j1, Math.min(j2, j1 + n)]; |
|||
} |
|||
|
|||
var nn = n + n; |
|||
var group = []; |
|||
var groups = []; |
|||
for (var idx in codes) { |
|||
if (codes.hasOwnProperty(idx)) { |
|||
code = codes[idx]; |
|||
tag = code[0]; |
|||
i1 = code[1]; |
|||
i2 = code[2]; |
|||
j1 = code[3]; |
|||
j2 = code[4]; |
|||
if (tag == 'equal' && i2 - i1 > nn) { |
|||
group.push([tag, i1, Math.min(i2, i1 + n), j1, Math.min(j2, j1 + n)]); |
|||
groups.push(group); |
|||
group = []; |
|||
i1 = Math.max(i1, i2-n); |
|||
j1 = Math.max(j1, j2-n); |
|||
} |
|||
|
|||
group.push([tag, i1, i2, j1, j2]); |
|||
} |
|||
} |
|||
|
|||
if (group && !(group.length == 1 && group[0][0] == 'equal')) groups.push(group) |
|||
|
|||
return groups; |
|||
} |
|||
|
|||
this.ratio = function () { |
|||
matches = difflib.__reduce( |
|||
function (sum, triple) { return sum + triple[triple.length - 1]; }, |
|||
this.get_matching_blocks(), 0); |
|||
return difflib.__calculate_ratio(matches, this.a.length + this.b.length); |
|||
} |
|||
|
|||
this.quick_ratio = function () { |
|||
var fullbcount, elt; |
|||
if (this.fullbcount == null) { |
|||
this.fullbcount = fullbcount = {}; |
|||
for (var i = 0; i < this.b.length; i++) { |
|||
elt = this.b[i]; |
|||
fullbcount[elt] = difflib.__dictget(fullbcount, elt, 0) + 1; |
|||
} |
|||
} |
|||
fullbcount = this.fullbcount; |
|||
|
|||
var avail = {}; |
|||
var availhas = difflib.__isindict(avail); |
|||
var matches = numb = 0; |
|||
for (var i = 0; i < this.a.length; i++) { |
|||
elt = this.a[i]; |
|||
if (availhas(elt)) { |
|||
numb = avail[elt]; |
|||
} else { |
|||
numb = difflib.__dictget(fullbcount, elt, 0); |
|||
} |
|||
avail[elt] = numb - 1; |
|||
if (numb > 0) matches++; |
|||
} |
|||
|
|||
return difflib.__calculate_ratio(matches, this.a.length + this.b.length); |
|||
} |
|||
|
|||
this.real_quick_ratio = function () { |
|||
var la = this.a.length; |
|||
var lb = this.b.length; |
|||
return _calculate_ratio(Math.min(la, lb), la + lb); |
|||
} |
|||
|
|||
this.isjunk = isjunk ? isjunk : difflib.defaultJunkFunction; |
|||
this.a = this.b = null; |
|||
this.set_seqs(a, b); |
|||
} |
|||
}; |
|||
|
|||
/*** |
|||
This is part of jsdifflib v1.0. <http://snowtide.com/jsdifflib>
|
|||
|
|||
Copyright (c) 2007, Snowtide Informatics Systems, Inc. |
|||
All rights reserved. |
|||
|
|||
Redistribution and use in source and binary forms, with or without modification, |
|||
are permitted provided that the following conditions are met: |
|||
|
|||
* Redistributions of source code must retain the above copyright notice, this |
|||
list of conditions and the following disclaimer. |
|||
* Redistributions in binary form must reproduce the above copyright notice, |
|||
this list of conditions and the following disclaimer in the documentation |
|||
and/or other materials provided with the distribution. |
|||
* Neither the name of the Snowtide Informatics Systems nor the names of its |
|||
contributors may be used to endorse or promote products derived from this |
|||
software without specific prior written permission. |
|||
|
|||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY |
|||
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES |
|||
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT |
|||
SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, |
|||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED |
|||
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR |
|||
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
|||
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN |
|||
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH |
|||
DAMAGE. |
|||
***/ |
|||
/* Author: Chas Emerick <cemerick@snowtide.com> */ |
|||
__whitespace = {" ":true, "\t":true, "\n":true, "\f":true, "\r":true}; |
|||
|
|||
difflib = { |
|||
defaultJunkFunction: function (c) { |
|||
return __whitespace.hasOwnProperty(c); |
|||
}, |
|||
|
|||
stripLinebreaks: function (str) { return str.replace(/^[\n\r]*|[\n\r]*$/g, ""); }, |
|||
|
|||
stringAsLines: function (str) { |
|||
var lfpos = str.indexOf("\n"); |
|||
var crpos = str.indexOf("\r"); |
|||
var linebreak = ((lfpos > -1 && crpos > -1) || crpos < 0) ? "\n" : "\r"; |
|||
|
|||
var lines = str.split(linebreak); |
|||
for (var i = 0; i < lines.length; i++) { |
|||
lines[i] = difflib.stripLinebreaks(lines[i]); |
|||
} |
|||
|
|||
return lines; |
|||
}, |
|||
|
|||
// iteration-based reduce implementation
|
|||
__reduce: function (func, list, initial) { |
|||
if (initial != null) { |
|||
var value = initial; |
|||
var idx = 0; |
|||
} else if (list) { |
|||
var value = list[0]; |
|||
var idx = 1; |
|||
} else { |
|||
return null; |
|||
} |
|||
|
|||
for (; idx < list.length; idx++) { |
|||
value = func(value, list[idx]); |
|||
} |
|||
|
|||
return value; |
|||
}, |
|||
|
|||
// comparison function for sorting lists of numeric tuples
|
|||
__ntuplecomp: function (a, b) { |
|||
var mlen = Math.max(a.length, b.length); |
|||
for (var i = 0; i < mlen; i++) { |
|||
if (a[i] < b[i]) return -1; |
|||
if (a[i] > b[i]) return 1; |
|||
} |
|||
|
|||
return a.length == b.length ? 0 : (a.length < b.length ? -1 : 1); |
|||
}, |
|||
|
|||
__calculate_ratio: function (matches, length) { |
|||
return length ? 2.0 * matches / length : 1.0; |
|||
}, |
|||
|
|||
// returns a function that returns true if a key passed to the returned function
|
|||
// is in the dict (js object) provided to this function; replaces being able to
|
|||
// carry around dict.has_key in python...
|
|||
__isindict: function (dict) { |
|||
return function (key) { return dict.hasOwnProperty(key); }; |
|||
}, |
|||
|
|||
// replacement for python's dict.get function -- need easy default values
|
|||
__dictget: function (dict, key, defaultValue) { |
|||
return dict.hasOwnProperty(key) ? dict[key] : defaultValue; |
|||
}, |
|||
|
|||
SequenceMatcher: function (a, b, isjunk) { |
|||
this.set_seqs = function (a, b) { |
|||
this.set_seq1(a); |
|||
this.set_seq2(b); |
|||
} |
|||
|
|||
this.set_seq1 = function (a) { |
|||
if (a == this.a) return; |
|||
this.a = a; |
|||
this.matching_blocks = this.opcodes = null; |
|||
} |
|||
|
|||
this.set_seq2 = function (b) { |
|||
if (b == this.b) return; |
|||
this.b = b; |
|||
this.matching_blocks = this.opcodes = this.fullbcount = null; |
|||
this.__chain_b(); |
|||
} |
|||
|
|||
this.__chain_b = function () { |
|||
var b = this.b; |
|||
var n = b.length; |
|||
var b2j = this.b2j = {}; |
|||
var populardict = {}; |
|||
for (var i = 0; i < b.length; i++) { |
|||
var elt = b[i]; |
|||
if (b2j.hasOwnProperty(elt)) { |
|||
var indices = b2j[elt]; |
|||
if (n >= 200 && indices.length * 100 > n) { |
|||
populardict[elt] = 1; |
|||
delete b2j[elt]; |
|||
} else { |
|||
indices.push(i); |
|||
} |
|||
} else { |
|||
b2j[elt] = [i]; |
|||
} |
|||
} |
|||
|
|||
for (var elt in populardict) { |
|||
if (populardict.hasOwnProperty(elt)) { |
|||
delete b2j[elt]; |
|||
} |
|||
} |
|||
|
|||
var isjunk = this.isjunk; |
|||
var junkdict = {}; |
|||
if (isjunk) { |
|||
for (var elt in populardict) { |
|||
if (populardict.hasOwnProperty(elt) && isjunk(elt)) { |
|||
junkdict[elt] = 1; |
|||
delete populardict[elt]; |
|||
} |
|||
} |
|||
for (var elt in b2j) { |
|||
if (b2j.hasOwnProperty(elt) && isjunk(elt)) { |
|||
junkdict[elt] = 1; |
|||
delete b2j[elt]; |
|||
} |
|||
} |
|||
} |
|||
|
|||
this.isbjunk = difflib.__isindict(junkdict); |
|||
this.isbpopular = difflib.__isindict(populardict); |
|||
} |
|||
|
|||
this.find_longest_match = function (alo, ahi, blo, bhi) { |
|||
var a = this.a; |
|||
var b = this.b; |
|||
var b2j = this.b2j; |
|||
var isbjunk = this.isbjunk; |
|||
var besti = alo; |
|||
var bestj = blo; |
|||
var bestsize = 0; |
|||
var j = null; |
|||
|
|||
var j2len = {}; |
|||
var nothing = []; |
|||
for (var i = alo; i < ahi; i++) { |
|||
var newj2len = {}; |
|||
var jdict = difflib.__dictget(b2j, a[i], nothing); |
|||
for (var jkey in jdict) { |
|||
if (jdict.hasOwnProperty(jkey)) { |
|||
j = jdict[jkey]; |
|||
if (j < blo) continue; |
|||
if (j >= bhi) break; |
|||
newj2len[j] = k = difflib.__dictget(j2len, j - 1, 0) + 1; |
|||
if (k > bestsize) { |
|||
besti = i - k + 1; |
|||
bestj = j - k + 1; |
|||
bestsize = k; |
|||
} |
|||
} |
|||
} |
|||
j2len = newj2len; |
|||
} |
|||
|
|||
while (besti > alo && bestj > blo && !isbjunk(b[bestj - 1]) && a[besti - 1] == b[bestj - 1]) { |
|||
besti--; |
|||
bestj--; |
|||
bestsize++; |
|||
} |
|||
|
|||
while (besti + bestsize < ahi && bestj + bestsize < bhi && |
|||
!isbjunk(b[bestj + bestsize]) && |
|||
a[besti + bestsize] == b[bestj + bestsize]) { |
|||
bestsize++; |
|||
} |
|||
|
|||
while (besti > alo && bestj > blo && isbjunk(b[bestj - 1]) && a[besti - 1] == b[bestj - 1]) { |
|||
besti--; |
|||
bestj--; |
|||
bestsize++; |
|||
} |
|||
|
|||
while (besti + bestsize < ahi && bestj + bestsize < bhi && isbjunk(b[bestj + bestsize]) && |
|||
a[besti + bestsize] == b[bestj + bestsize]) { |
|||
bestsize++; |
|||
} |
|||
|
|||
return [besti, bestj, bestsize]; |
|||
} |
|||
|
|||
this.get_matching_blocks = function () { |
|||
if (this.matching_blocks != null) return this.matching_blocks; |
|||
var la = this.a.length; |
|||
var lb = this.b.length; |
|||
|
|||
var queue = [[0, la, 0, lb]]; |
|||
var matching_blocks = []; |
|||
var alo, ahi, blo, bhi, qi, i, j, k, x; |
|||
while (queue.length) { |
|||
qi = queue.pop(); |
|||
alo = qi[0]; |
|||
ahi = qi[1]; |
|||
blo = qi[2]; |
|||
bhi = qi[3]; |
|||
x = this.find_longest_match(alo, ahi, blo, bhi); |
|||
i = x[0]; |
|||
j = x[1]; |
|||
k = x[2]; |
|||
|
|||
if (k) { |
|||
matching_blocks.push(x); |
|||
if (alo < i && blo < j) |
|||
queue.push([alo, i, blo, j]); |
|||
if (i+k < ahi && j+k < bhi) |
|||
queue.push([i + k, ahi, j + k, bhi]); |
|||
} |
|||
} |
|||
|
|||
matching_blocks.sort(difflib.__ntuplecomp); |
|||
|
|||
var i1 = j1 = k1 = block = 0; |
|||
var non_adjacent = []; |
|||
for (var idx in matching_blocks) { |
|||
if (matching_blocks.hasOwnProperty(idx)) { |
|||
block = matching_blocks[idx]; |
|||
i2 = block[0]; |
|||
j2 = block[1]; |
|||
k2 = block[2]; |
|||
if (i1 + k1 == i2 && j1 + k1 == j2) { |
|||
k1 += k2; |
|||
} else { |
|||
if (k1) non_adjacent.push([i1, j1, k1]); |
|||
i1 = i2; |
|||
j1 = j2; |
|||
k1 = k2; |
|||
} |
|||
} |
|||
} |
|||
|
|||
if (k1) non_adjacent.push([i1, j1, k1]); |
|||
|
|||
non_adjacent.push([la, lb, 0]); |
|||
this.matching_blocks = non_adjacent; |
|||
return this.matching_blocks; |
|||
} |
|||
|
|||
this.get_opcodes = function () { |
|||
if (this.opcodes != null) return this.opcodes; |
|||
var i = 0; |
|||
var j = 0; |
|||
var answer = []; |
|||
this.opcodes = answer; |
|||
var block, ai, bj, size, tag; |
|||
var blocks = this.get_matching_blocks(); |
|||
for (var idx in blocks) { |
|||
if (blocks.hasOwnProperty(idx)) { |
|||
block = blocks[idx]; |
|||
ai = block[0]; |
|||
bj = block[1]; |
|||
size = block[2]; |
|||
tag = ''; |
|||
if (i < ai && j < bj) { |
|||
tag = 'replace'; |
|||
} else if (i < ai) { |
|||
tag = 'delete'; |
|||
} else if (j < bj) { |
|||
tag = 'insert'; |
|||
} |
|||
if (tag) answer.push([tag, i, ai, j, bj]); |
|||
i = ai + size; |
|||
j = bj + size; |
|||
|
|||
if (size) answer.push(['equal', ai, i, bj, j]); |
|||
} |
|||
} |
|||
|
|||
return answer; |
|||
} |
|||
|
|||
// this is a generator function in the python lib, which of course is not supported in javascript
|
|||
// the reimplementation builds up the grouped opcodes into a list in their entirety and returns that.
|
|||
this.get_grouped_opcodes = function (n) { |
|||
if (!n) n = 3; |
|||
var codes = this.get_opcodes(); |
|||
if (!codes) codes = [["equal", 0, 1, 0, 1]]; |
|||
var code, tag, i1, i2, j1, j2; |
|||
if (codes[0][0] == 'equal') { |
|||
code = codes[0]; |
|||
tag = code[0]; |
|||
i1 = code[1]; |
|||
i2 = code[2]; |
|||
j1 = code[3]; |
|||
j2 = code[4]; |
|||
codes[0] = [tag, Math.max(i1, i2 - n), i2, Math.max(j1, j2 - n), j2]; |
|||
} |
|||
if (codes[codes.length - 1][0] == 'equal') { |
|||
code = codes[codes.length - 1]; |
|||
tag = code[0]; |
|||
i1 = code[1]; |
|||
i2 = code[2]; |
|||
j1 = code[3]; |
|||
j2 = code[4]; |
|||
codes[codes.length - 1] = [tag, i1, Math.min(i2, i1 + n), j1, Math.min(j2, j1 + n)]; |
|||
} |
|||
|
|||
var nn = n + n; |
|||
var group = []; |
|||
var groups = []; |
|||
for (var idx in codes) { |
|||
if (codes.hasOwnProperty(idx)) { |
|||
code = codes[idx]; |
|||
tag = code[0]; |
|||
i1 = code[1]; |
|||
i2 = code[2]; |
|||
j1 = code[3]; |
|||
j2 = code[4]; |
|||
if (tag == 'equal' && i2 - i1 > nn) { |
|||
group.push([tag, i1, Math.min(i2, i1 + n), j1, Math.min(j2, j1 + n)]); |
|||
groups.push(group); |
|||
group = []; |
|||
i1 = Math.max(i1, i2-n); |
|||
j1 = Math.max(j1, j2-n); |
|||
} |
|||
|
|||
group.push([tag, i1, i2, j1, j2]); |
|||
} |
|||
} |
|||
|
|||
if (group && !(group.length == 1 && group[0][0] == 'equal')) groups.push(group) |
|||
|
|||
return groups; |
|||
} |
|||
|
|||
this.ratio = function () { |
|||
matches = difflib.__reduce( |
|||
function (sum, triple) { return sum + triple[triple.length - 1]; }, |
|||
this.get_matching_blocks(), 0); |
|||
return difflib.__calculate_ratio(matches, this.a.length + this.b.length); |
|||
} |
|||
|
|||
this.quick_ratio = function () { |
|||
var fullbcount, elt; |
|||
if (this.fullbcount == null) { |
|||
this.fullbcount = fullbcount = {}; |
|||
for (var i = 0; i < this.b.length; i++) { |
|||
elt = this.b[i]; |
|||
fullbcount[elt] = difflib.__dictget(fullbcount, elt, 0) + 1; |
|||
} |
|||
} |
|||
fullbcount = this.fullbcount; |
|||
|
|||
var avail = {}; |
|||
var availhas = difflib.__isindict(avail); |
|||
var matches = numb = 0; |
|||
for (var i = 0; i < this.a.length; i++) { |
|||
elt = this.a[i]; |
|||
if (availhas(elt)) { |
|||
numb = avail[elt]; |
|||
} else { |
|||
numb = difflib.__dictget(fullbcount, elt, 0); |
|||
} |
|||
avail[elt] = numb - 1; |
|||
if (numb > 0) matches++; |
|||
} |
|||
|
|||
return difflib.__calculate_ratio(matches, this.a.length + this.b.length); |
|||
} |
|||
|
|||
this.real_quick_ratio = function () { |
|||
var la = this.a.length; |
|||
var lb = this.b.length; |
|||
return _calculate_ratio(Math.min(la, lb), la + lb); |
|||
} |
|||
|
|||
this.isjunk = isjunk ? isjunk : difflib.defaultJunkFunction; |
|||
this.a = this.b = null; |
|||
this.set_seqs(a, b); |
|||
} |
|||
}; |
|||
|
@ -1,83 +1,83 @@ |
|||
/* |
|||
This is part of jsdifflib v1.0. <http://github.com/cemerick/jsdifflib> |
|||
|
|||
Copyright 2007 - 2011 Chas Emerick <cemerick@snowtide.com>. All rights reserved. |
|||
|
|||
Redistribution and use in source and binary forms, with or without modification, are |
|||
permitted provided that the following conditions are met: |
|||
|
|||
1. Redistributions of source code must retain the above copyright notice, this list of |
|||
conditions and the following disclaimer. |
|||
|
|||
2. Redistributions in binary form must reproduce the above copyright notice, this list |
|||
of conditions and the following disclaimer in the documentation and/or other materials |
|||
provided with the distribution. |
|||
|
|||
THIS SOFTWARE IS PROVIDED BY Chas Emerick ``AS IS'' AND ANY EXPRESS OR IMPLIED |
|||
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND |
|||
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Chas Emerick OR |
|||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
|||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
|||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON |
|||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
|||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
|||
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|||
|
|||
The views and conclusions contained in the software and documentation are those of the |
|||
authors and should not be interpreted as representing official policies, either expressed |
|||
or implied, of Chas Emerick. |
|||
*/ |
|||
table.diff { |
|||
border-collapse:collapse; |
|||
border:1px solid darkgray; |
|||
white-space:pre-wrap |
|||
} |
|||
table.diff tbody { |
|||
font-family:Courier, monospace |
|||
} |
|||
table.diff tbody th { |
|||
font-family:verdana,arial,'Bitstream Vera Sans',helvetica,sans-serif; |
|||
background:#EED; |
|||
font-size:11px; |
|||
font-weight:normal; |
|||
border:1px solid #BBC; |
|||
color:#886; |
|||
padding:.3em .5em .1em 2em; |
|||
text-align:right; |
|||
vertical-align:top |
|||
} |
|||
table.diff thead { |
|||
border-bottom:1px solid #BBC; |
|||
background:#EFEFEF; |
|||
font-family:Verdana |
|||
} |
|||
table.diff thead th.texttitle { |
|||
text-align:left |
|||
} |
|||
table.diff tbody td { |
|||
padding:0px .4em; |
|||
padding-top:.4em; |
|||
vertical-align:top; |
|||
} |
|||
table.diff .empty { |
|||
background-color:#DDD; |
|||
} |
|||
table.diff .replace { |
|||
background-color:#FD8 |
|||
} |
|||
table.diff .delete { |
|||
background-color:#E99; |
|||
} |
|||
table.diff .skip { |
|||
background-color:#EFEFEF; |
|||
border:1px solid #AAA; |
|||
border-right:1px solid #BBC; |
|||
} |
|||
table.diff .insert { |
|||
background-color:#9E9 |
|||
} |
|||
table.diff th.author { |
|||
text-align:right; |
|||
border-top:1px solid #BBC; |
|||
background:#EFEFEF |
|||
/* |
|||
This is part of jsdifflib v1.0. <http://github.com/cemerick/jsdifflib> |
|||
|
|||
Copyright 2007 - 2011 Chas Emerick <cemerick@snowtide.com>. All rights reserved. |
|||
|
|||
Redistribution and use in source and binary forms, with or without modification, are |
|||
permitted provided that the following conditions are met: |
|||
|
|||
1. Redistributions of source code must retain the above copyright notice, this list of |
|||
conditions and the following disclaimer. |
|||
|
|||
2. Redistributions in binary form must reproduce the above copyright notice, this list |
|||
of conditions and the following disclaimer in the documentation and/or other materials |
|||
provided with the distribution. |
|||
|
|||
THIS SOFTWARE IS PROVIDED BY Chas Emerick ``AS IS'' AND ANY EXPRESS OR IMPLIED |
|||
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND |
|||
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Chas Emerick OR |
|||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
|||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
|||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON |
|||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
|||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
|||
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|||
|
|||
The views and conclusions contained in the software and documentation are those of the |
|||
authors and should not be interpreted as representing official policies, either expressed |
|||
or implied, of Chas Emerick. |
|||
*/ |
|||
table.diff { |
|||
border-collapse:collapse; |
|||
border:1px solid darkgray; |
|||
white-space:pre-wrap |
|||
} |
|||
table.diff tbody { |
|||
font-family:Courier, monospace |
|||
} |
|||
table.diff tbody th { |
|||
font-family:verdana,arial,'Bitstream Vera Sans',helvetica,sans-serif; |
|||
background:#EED; |
|||
font-size:11px; |
|||
font-weight:normal; |
|||
border:1px solid #BBC; |
|||
color:#886; |
|||
padding:.3em .5em .1em 2em; |
|||
text-align:right; |
|||
vertical-align:top |
|||
} |
|||
table.diff thead { |
|||
border-bottom:1px solid #BBC; |
|||
background:#EFEFEF; |
|||
font-family:Verdana |
|||
} |
|||
table.diff thead th.texttitle { |
|||
text-align:left |
|||
} |
|||
table.diff tbody td { |
|||
padding:0px .4em; |
|||
padding-top:.4em; |
|||
vertical-align:top; |
|||
} |
|||
table.diff .empty { |
|||
background-color:#DDD; |
|||
} |
|||
table.diff .replace { |
|||
background-color:#FD8 |
|||
} |
|||
table.diff .delete { |
|||
background-color:#E99; |
|||
} |
|||
table.diff .skip { |
|||
background-color:#EFEFEF; |
|||
border:1px solid #AAA; |
|||
border-right:1px solid #BBC; |
|||
} |
|||
table.diff .insert { |
|||
background-color:#9E9 |
|||
} |
|||
table.diff th.author { |
|||
text-align:right; |
|||
border-top:1px solid #BBC; |
|||
background:#EFEFEF |
|||
} |
@ -1,198 +1,198 @@ |
|||
/* |
|||
This is part of jsdifflib v1.0. <http://github.com/cemerick/jsdifflib>
|
|||
|
|||
Copyright 2007 - 2011 Chas Emerick <cemerick@snowtide.com>. All rights reserved. |
|||
|
|||
Redistribution and use in source and binary forms, with or without modification, are |
|||
permitted provided that the following conditions are met: |
|||
|
|||
1. Redistributions of source code must retain the above copyright notice, this list of |
|||
conditions and the following disclaimer. |
|||
|
|||
2. Redistributions in binary form must reproduce the above copyright notice, this list |
|||
of conditions and the following disclaimer in the documentation and/or other materials |
|||
provided with the distribution. |
|||
|
|||
THIS SOFTWARE IS PROVIDED BY Chas Emerick ``AS IS'' AND ANY EXPRESS OR IMPLIED |
|||
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND |
|||
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Chas Emerick OR |
|||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
|||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
|||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON |
|||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
|||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
|||
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|||
|
|||
The views and conclusions contained in the software and documentation are those of the |
|||
authors and should not be interpreted as representing official policies, either expressed |
|||
or implied, of Chas Emerick. |
|||
*/ |
|||
diffview = { |
|||
/** |
|||
* Builds and returns a visual diff view. The single parameter, `params', should contain
|
|||
* the following values: |
|||
* |
|||
* - baseTextLines: the array of strings that was used as the base text input to SequenceMatcher |
|||
* - newTextLines: the array of strings that was used as the new text input to SequenceMatcher |
|||
* - opcodes: the array of arrays returned by SequenceMatcher.get_opcodes() |
|||
* - baseTextName: the title to be displayed above the base text listing in the diff view; defaults |
|||
* to "Base Text" |
|||
* - newTextName: the title to be displayed above the new text listing in the diff view; defaults |
|||
* to "New Text" |
|||
* - contextSize: the number of lines of context to show around differences; by default, all lines |
|||
* are shown |
|||
* - viewType: if 0, a side-by-side diff view is generated (default); if 1, an inline diff view is |
|||
* generated |
|||
*/ |
|||
buildView: function (params) { |
|||
var baseTextLines = params.baseTextLines; |
|||
var newTextLines = params.newTextLines; |
|||
var opcodes = params.opcodes; |
|||
var baseTextName = params.baseTextName ? params.baseTextName : "Base Text"; |
|||
var newTextName = params.newTextName ? params.newTextName : "New Text"; |
|||
var contextSize = params.contextSize; |
|||
var inline = (params.viewType == 0 || params.viewType == 1) ? params.viewType : 0; |
|||
|
|||
if (baseTextLines == null) |
|||
throw "Cannot build diff view; baseTextLines is not defined."; |
|||
if (newTextLines == null) |
|||
throw "Cannot build diff view; newTextLines is not defined."; |
|||
if (!opcodes) |
|||
throw "Canno build diff view; opcodes is not defined."; |
|||
|
|||
function celt (name, clazz) { |
|||
var e = document.createElement(name); |
|||
e.className = clazz; |
|||
return e; |
|||
} |
|||
|
|||
function telt (name, text) { |
|||
var e = document.createElement(name); |
|||
e.appendChild(document.createTextNode(text)); |
|||
return e; |
|||
} |
|||
|
|||
function ctelt (name, clazz, text) { |
|||
var e = document.createElement(name); |
|||
e.className = clazz; |
|||
e.appendChild(document.createTextNode(text)); |
|||
return e; |
|||
} |
|||
|
|||
var tdata = document.createElement("thead"); |
|||
var node = document.createElement("tr"); |
|||
tdata.appendChild(node); |
|||
if (inline) { |
|||
node.appendChild(document.createElement("th")); |
|||
node.appendChild(document.createElement("th")); |
|||
node.appendChild(ctelt("th", "texttitle", baseTextName + " vs. " + newTextName)); |
|||
} else { |
|||
node.appendChild(document.createElement("th")); |
|||
node.appendChild(ctelt("th", "texttitle", baseTextName)); |
|||
node.appendChild(document.createElement("th")); |
|||
node.appendChild(ctelt("th", "texttitle", newTextName)); |
|||
} |
|||
tdata = [tdata]; |
|||
|
|||
var rows = []; |
|||
var node2; |
|||
|
|||
/** |
|||
* Adds two cells to the given row; if the given row corresponds to a real |
|||
* line number (based on the line index tidx and the endpoint of the |
|||
* range in question tend), then the cells will contain the line number |
|||
* and the line of text from textLines at position tidx (with the class of |
|||
* the second cell set to the name of the change represented), and tidx + 1 will |
|||
* be returned. Otherwise, tidx is returned, and two empty cells are added |
|||
* to the given row. |
|||
*/ |
|||
function addCells (row, tidx, tend, textLines, change) { |
|||
if (tidx < tend) { |
|||
row.appendChild(telt("th", (tidx + 1).toString())); |
|||
row.appendChild(ctelt("td", change, textLines[tidx].replace(/\t/g, "\u00a0\u00a0\u00a0\u00a0"))); |
|||
return tidx + 1; |
|||
} else { |
|||
row.appendChild(document.createElement("th")); |
|||
row.appendChild(celt("td", "empty")); |
|||
return tidx; |
|||
} |
|||
} |
|||
|
|||
function addCellsInline (row, tidx, tidx2, textLines, change) { |
|||
row.appendChild(telt("th", tidx == null ? "" : (tidx + 1).toString())); |
|||
row.appendChild(telt("th", tidx2 == null ? "" : (tidx2 + 1).toString())); |
|||
row.appendChild(ctelt("td", change, textLines[tidx != null ? tidx : tidx2].replace(/\t/g, "\u00a0\u00a0\u00a0\u00a0"))); |
|||
} |
|||
|
|||
for (var idx = 0; idx < opcodes.length; idx++) { |
|||
code = opcodes[idx]; |
|||
change = code[0]; |
|||
var b = code[1]; |
|||
var be = code[2]; |
|||
var n = code[3]; |
|||
var ne = code[4]; |
|||
var rowcnt = Math.max(be - b, ne - n); |
|||
var toprows = []; |
|||
var botrows = []; |
|||
for (var i = 0; i < rowcnt; i++) { |
|||
// jump ahead if we've alredy provided leading context or if this is the first range
|
|||
if (contextSize && opcodes.length > 1 && ((idx > 0 && i == contextSize) || (idx == 0 && i == 0)) && change=="equal") { |
|||
var jump = rowcnt - ((idx == 0 ? 1 : 2) * contextSize); |
|||
if (jump > 1) { |
|||
toprows.push(node = document.createElement("tr")); |
|||
|
|||
b += jump; |
|||
n += jump; |
|||
i += jump - 1; |
|||
node.appendChild(telt("th", "...")); |
|||
if (!inline) node.appendChild(ctelt("td", "skip", "")); |
|||
node.appendChild(telt("th", "...")); |
|||
node.appendChild(ctelt("td", "skip", "")); |
|||
|
|||
// skip last lines if they're all equal
|
|||
if (idx + 1 == opcodes.length) { |
|||
break; |
|||
} else { |
|||
continue; |
|||
} |
|||
} |
|||
} |
|||
|
|||
toprows.push(node = document.createElement("tr")); |
|||
if (inline) { |
|||
if (change == "insert") { |
|||
addCellsInline(node, null, n++, newTextLines, change); |
|||
} else if (change == "replace") { |
|||
botrows.push(node2 = document.createElement("tr")); |
|||
if (b < be) addCellsInline(node, b++, null, baseTextLines, "delete"); |
|||
if (n < ne) addCellsInline(node2, null, n++, newTextLines, "insert"); |
|||
} else if (change == "delete") { |
|||
addCellsInline(node, b++, null, baseTextLines, change); |
|||
} else { |
|||
// equal
|
|||
addCellsInline(node, b++, n++, baseTextLines, change); |
|||
} |
|||
} else { |
|||
b = addCells(node, b, be, baseTextLines, change); |
|||
n = addCells(node, n, ne, newTextLines, change); |
|||
} |
|||
} |
|||
|
|||
for (var i = 0; i < toprows.length; i++) rows.push(toprows[i]); |
|||
for (var i = 0; i < botrows.length; i++) rows.push(botrows[i]); |
|||
} |
|||
|
|||
rows.push(node = ctelt("th", "author", "diff view generated by ")); |
|||
node.setAttribute("colspan", inline ? 3 : 4); |
|||
node.appendChild(node2 = telt("a", "jsdifflib")); |
|||
node2.setAttribute("href", "http://github.com/cemerick/jsdifflib"); |
|||
|
|||
tdata.push(node = document.createElement("tbody")); |
|||
for (var idx in rows) rows.hasOwnProperty(idx) && node.appendChild(rows[idx]); |
|||
|
|||
node = celt("table", "diff" + (inline ? " inlinediff" : "")); |
|||
for (var idx in tdata) tdata.hasOwnProperty(idx) && node.appendChild(tdata[idx]); |
|||
return node; |
|||
} |
|||
}; |
|||
|
|||
/* |
|||
This is part of jsdifflib v1.0. <http://github.com/cemerick/jsdifflib>
|
|||
|
|||
Copyright 2007 - 2011 Chas Emerick <cemerick@snowtide.com>. All rights reserved. |
|||
|
|||
Redistribution and use in source and binary forms, with or without modification, are |
|||
permitted provided that the following conditions are met: |
|||
|
|||
1. Redistributions of source code must retain the above copyright notice, this list of |
|||
conditions and the following disclaimer. |
|||
|
|||
2. Redistributions in binary form must reproduce the above copyright notice, this list |
|||
of conditions and the following disclaimer in the documentation and/or other materials |
|||
provided with the distribution. |
|||
|
|||
THIS SOFTWARE IS PROVIDED BY Chas Emerick ``AS IS'' AND ANY EXPRESS OR IMPLIED |
|||
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND |
|||
FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Chas Emerick OR |
|||
CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
|||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR |
|||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON |
|||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING |
|||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF |
|||
ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
|||
|
|||
The views and conclusions contained in the software and documentation are those of the |
|||
authors and should not be interpreted as representing official policies, either expressed |
|||
or implied, of Chas Emerick. |
|||
*/ |
|||
diffview = { |
|||
/** |
|||
* Builds and returns a visual diff view. The single parameter, `params', should contain
|
|||
* the following values: |
|||
* |
|||
* - baseTextLines: the array of strings that was used as the base text input to SequenceMatcher |
|||
* - newTextLines: the array of strings that was used as the new text input to SequenceMatcher |
|||
* - opcodes: the array of arrays returned by SequenceMatcher.get_opcodes() |
|||
* - baseTextName: the title to be displayed above the base text listing in the diff view; defaults |
|||
* to "Base Text" |
|||
* - newTextName: the title to be displayed above the new text listing in the diff view; defaults |
|||
* to "New Text" |
|||
* - contextSize: the number of lines of context to show around differences; by default, all lines |
|||
* are shown |
|||
* - viewType: if 0, a side-by-side diff view is generated (default); if 1, an inline diff view is |
|||
* generated |
|||
*/ |
|||
buildView: function (params) { |
|||
var baseTextLines = params.baseTextLines; |
|||
var newTextLines = params.newTextLines; |
|||
var opcodes = params.opcodes; |
|||
var baseTextName = params.baseTextName ? params.baseTextName : "Base Text"; |
|||
var newTextName = params.newTextName ? params.newTextName : "New Text"; |
|||
var contextSize = params.contextSize; |
|||
var inline = (params.viewType == 0 || params.viewType == 1) ? params.viewType : 0; |
|||
|
|||
if (baseTextLines == null) |
|||
throw "Cannot build diff view; baseTextLines is not defined."; |
|||
if (newTextLines == null) |
|||
throw "Cannot build diff view; newTextLines is not defined."; |
|||
if (!opcodes) |
|||
throw "Canno build diff view; opcodes is not defined."; |
|||
|
|||
function celt (name, clazz) { |
|||
var e = document.createElement(name); |
|||
e.className = clazz; |
|||
return e; |
|||
} |
|||
|
|||
function telt (name, text) { |
|||
var e = document.createElement(name); |
|||
e.appendChild(document.createTextNode(text)); |
|||
return e; |
|||
} |
|||
|
|||
function ctelt (name, clazz, text) { |
|||
var e = document.createElement(name); |
|||
e.className = clazz; |
|||
e.appendChild(document.createTextNode(text)); |
|||
return e; |
|||
} |
|||
|
|||
var tdata = document.createElement("thead"); |
|||
var node = document.createElement("tr"); |
|||
tdata.appendChild(node); |
|||
if (inline) { |
|||
node.appendChild(document.createElement("th")); |
|||
node.appendChild(document.createElement("th")); |
|||
node.appendChild(ctelt("th", "texttitle", baseTextName + " vs. " + newTextName)); |
|||
} else { |
|||
node.appendChild(document.createElement("th")); |
|||
node.appendChild(ctelt("th", "texttitle", baseTextName)); |
|||
node.appendChild(document.createElement("th")); |
|||
node.appendChild(ctelt("th", "texttitle", newTextName)); |
|||
} |
|||
tdata = [tdata]; |
|||
|
|||
var rows = []; |
|||
var node2; |
|||
|
|||
/** |
|||
* Adds two cells to the given row; if the given row corresponds to a real |
|||
* line number (based on the line index tidx and the endpoint of the |
|||
* range in question tend), then the cells will contain the line number |
|||
* and the line of text from textLines at position tidx (with the class of |
|||
* the second cell set to the name of the change represented), and tidx + 1 will |
|||
* be returned. Otherwise, tidx is returned, and two empty cells are added |
|||
* to the given row. |
|||
*/ |
|||
function addCells (row, tidx, tend, textLines, change) { |
|||
if (tidx < tend) { |
|||
row.appendChild(telt("th", (tidx + 1).toString())); |
|||
row.appendChild(ctelt("td", change, textLines[tidx].replace(/\t/g, "\u00a0\u00a0\u00a0\u00a0"))); |
|||
return tidx + 1; |
|||
} else { |
|||
row.appendChild(document.createElement("th")); |
|||
row.appendChild(celt("td", "empty")); |
|||
return tidx; |
|||
} |
|||
} |
|||
|
|||
function addCellsInline (row, tidx, tidx2, textLines, change) { |
|||
row.appendChild(telt("th", tidx == null ? "" : (tidx + 1).toString())); |
|||
row.appendChild(telt("th", tidx2 == null ? "" : (tidx2 + 1).toString())); |
|||
row.appendChild(ctelt("td", change, textLines[tidx != null ? tidx : tidx2].replace(/\t/g, "\u00a0\u00a0\u00a0\u00a0"))); |
|||
} |
|||
|
|||
for (var idx = 0; idx < opcodes.length; idx++) { |
|||
code = opcodes[idx]; |
|||
change = code[0]; |
|||
var b = code[1]; |
|||
var be = code[2]; |
|||
var n = code[3]; |
|||
var ne = code[4]; |
|||
var rowcnt = Math.max(be - b, ne - n); |
|||
var toprows = []; |
|||
var botrows = []; |
|||
for (var i = 0; i < rowcnt; i++) { |
|||
// jump ahead if we've alredy provided leading context or if this is the first range
|
|||
if (contextSize && opcodes.length > 1 && ((idx > 0 && i == contextSize) || (idx == 0 && i == 0)) && change=="equal") { |
|||
var jump = rowcnt - ((idx == 0 ? 1 : 2) * contextSize); |
|||
if (jump > 1) { |
|||
toprows.push(node = document.createElement("tr")); |
|||
|
|||
b += jump; |
|||
n += jump; |
|||
i += jump - 1; |
|||
node.appendChild(telt("th", "...")); |
|||
if (!inline) node.appendChild(ctelt("td", "skip", "")); |
|||
node.appendChild(telt("th", "...")); |
|||
node.appendChild(ctelt("td", "skip", "")); |
|||
|
|||
// skip last lines if they're all equal
|
|||
if (idx + 1 == opcodes.length) { |
|||
break; |
|||
} else { |
|||
continue; |
|||
} |
|||
} |
|||
} |
|||
|
|||
toprows.push(node = document.createElement("tr")); |
|||
if (inline) { |
|||
if (change == "insert") { |
|||
addCellsInline(node, null, n++, newTextLines, change); |
|||
} else if (change == "replace") { |
|||
botrows.push(node2 = document.createElement("tr")); |
|||
if (b < be) addCellsInline(node, b++, null, baseTextLines, "delete"); |
|||
if (n < ne) addCellsInline(node2, null, n++, newTextLines, "insert"); |
|||
} else if (change == "delete") { |
|||
addCellsInline(node, b++, null, baseTextLines, change); |
|||
} else { |
|||
// equal
|
|||
addCellsInline(node, b++, n++, baseTextLines, change); |
|||
} |
|||
} else { |
|||
b = addCells(node, b, be, baseTextLines, change); |
|||
n = addCells(node, n, ne, newTextLines, change); |
|||
} |
|||
} |
|||
|
|||
for (var i = 0; i < toprows.length; i++) rows.push(toprows[i]); |
|||
for (var i = 0; i < botrows.length; i++) rows.push(botrows[i]); |
|||
} |
|||
|
|||
rows.push(node = ctelt("th", "author", "diff view generated by ")); |
|||
node.setAttribute("colspan", inline ? 3 : 4); |
|||
node.appendChild(node2 = telt("a", "jsdifflib")); |
|||
node2.setAttribute("href", "http://github.com/cemerick/jsdifflib"); |
|||
|
|||
tdata.push(node = document.createElement("tbody")); |
|||
for (var idx in rows) rows.hasOwnProperty(idx) && node.appendChild(rows[idx]); |
|||
|
|||
node = celt("table", "diff" + (inline ? " inlinediff" : "")); |
|||
for (var idx in tdata) tdata.hasOwnProperty(idx) && node.appendChild(tdata[idx]); |
|||
return node; |
|||
} |
|||
}; |
|||
|
@ -1,342 +1,342 @@ |
|||
"use strict"; |
|||
|
|||
var os = require("os"); |
|||
var gulp = require("gulp"); |
|||
var gutil = require("gulp-util"); |
|||
var sass = require("gulp-ruby-sass"); |
|||
var jshint = require("gulp-jshint"); |
|||
var uglify = require("gulp-uglifyjs"); |
|||
var rename = require("gulp-rename"); |
|||
var concat = require("gulp-concat"); |
|||
var notify = require("gulp-notify"); |
|||
var header = require("gulp-header"); |
|||
var minifycss = require("gulp-minify-css"); |
|||
//var jsdoc = require("gulp-jsdoc");
|
|||
//var jsdoc2md = require("gulp-jsdoc-to-markdown");
|
|||
var pkg = require("./package.json"); |
|||
var dateFormat = require("dateformatter").format; |
|||
var replace = require("gulp-replace"); |
|||
|
|||
pkg.name = "Editor.md"; |
|||
pkg.today = dateFormat; |
|||
|
|||
var headerComment = ["/*", |
|||
" * <%= pkg.name %>", |
|||
" *", |
|||
" * @file <%= fileName(file) %> ", |
|||
" * @version v<%= pkg.version %> ", |
|||
" * @description <%= pkg.description %>", |
|||
" * @license MIT License", |
|||
" * @author <%= pkg.author %>", |
|||
" * {@link <%= pkg.homepage %>}", |
|||
" * @updateTime <%= pkg.today('Y-m-d') %>", |
|||
" */", |
|||
"\r\n"].join("\r\n"); |
|||
|
|||
var headerMiniComment = "/*! <%= pkg.name %> v<%= pkg.version %> | <%= fileName(file) %> | <%= pkg.description %> | MIT License | By: <%= pkg.author %> | <%= pkg.homepage %> | <%=pkg.today('Y-m-d') %> */\r\n"; |
|||
|
|||
var scssTask = function(fileName, path) { |
|||
|
|||
path = path || "scss/"; |
|||
|
|||
var distPath = "css"; |
|||
|
|||
return sass(path + fileName + ".scss", { style: "expanded", sourcemap: false, noCache : true }) |
|||
.pipe(gulp.dest(distPath)) |
|||
.pipe(header(headerComment, {pkg : pkg, fileName : function(file) { |
|||
var name = file.path.split(file.base); |
|||
return name[1].replace("\\", ""); |
|||
}})) |
|||
.pipe(gulp.dest(distPath)) |
|||
.pipe(rename({ suffix: ".min" })) |
|||
.pipe(gulp.dest(distPath)) |
|||
.pipe(minifycss()) |
|||
.pipe(gulp.dest(distPath)) |
|||
.pipe(header(headerMiniComment, {pkg : pkg, fileName : function(file) { |
|||
var name = file.path.split(file.base); |
|||
return name[1].replace("\\", ""); |
|||
}})) |
|||
.pipe(gulp.dest(distPath)) |
|||
.pipe(notify({ message: fileName + ".scss task completed!" })); |
|||
}; |
|||
|
|||
gulp.task("scss", function() { |
|||
return scssTask("editormd"); |
|||
}); |
|||
|
|||
gulp.task("scss2", function() { |
|||
return scssTask("editormd.preview"); |
|||
}); |
|||
|
|||
gulp.task("scss3", function() { |
|||
return scssTask("editormd.logo"); |
|||
}); |
|||
|
|||
gulp.task("js", function() { |
|||
return gulp.src("./src/editormd.js") |
|||
.pipe(jshint("./.jshintrc")) |
|||
.pipe(jshint.reporter("default")) |
|||
.pipe(header(headerComment, {pkg : pkg, fileName : function(file) { |
|||
var name = file.path.split(file.base); |
|||
return name[1].replace(/[\\\/]?/, ""); |
|||
}})) |
|||
.pipe(gulp.dest("./")) |
|||
.pipe(rename({ suffix: ".min" })) |
|||
.pipe(uglify()) // {outSourceMap: true, sourceRoot: './'}
|
|||
.pipe(gulp.dest("./")) |
|||
.pipe(header(headerMiniComment, {pkg : pkg, fileName : function(file) { |
|||
var name = file.path.split(file.base + ( (os.platform() === "win32") ? "\\" : "/") ); |
|||
return name[1].replace(/[\\\/]?/, ""); |
|||
}})) |
|||
.pipe(gulp.dest("./")) |
|||
.pipe(notify({ message: "editormd.js task complete" })); |
|||
}); |
|||
|
|||
gulp.task("amd", function() { |
|||
var replaceText1 = [ |
|||
'var cmModePath = "codemirror/mode/";', |
|||
' var cmAddonPath = "codemirror/addon/";', |
|||
'', |
|||
' var codeMirrorModules = [', |
|||
' "jquery", "marked", "prettify",', |
|||
' "katex", "raphael", "underscore", "flowchart", "jqueryflowchart", "sequenceDiagram",', |
|||
'', |
|||
' "codemirror/lib/codemirror",', |
|||
' cmModePath + "css/css",', |
|||
' cmModePath + "sass/sass",', |
|||
' cmModePath + "shell/shell",', |
|||
' cmModePath + "sql/sql",', |
|||
' cmModePath + "clike/clike",', |
|||
' cmModePath + "php/php",', |
|||
' cmModePath + "xml/xml",', |
|||
' cmModePath + "markdown/markdown",', |
|||
' cmModePath + "javascript/javascript",', |
|||
' cmModePath + "htmlmixed/htmlmixed",', |
|||
' cmModePath + "gfm/gfm",', |
|||
' cmModePath + "http/http",', |
|||
' cmModePath + "go/go",', |
|||
' cmModePath + "dart/dart",', |
|||
' cmModePath + "coffeescript/coffeescript",', |
|||
' cmModePath + "nginx/nginx",', |
|||
' cmModePath + "python/python",', |
|||
' cmModePath + "perl/perl",', |
|||
' cmModePath + "lua/lua",', |
|||
' cmModePath + "r/r", ', |
|||
' cmModePath + "ruby/ruby", ', |
|||
' cmModePath + "rst/rst",', |
|||
' cmModePath + "smartymixed/smartymixed",', |
|||
' cmModePath + "vb/vb",', |
|||
' cmModePath + "vbscript/vbscript",', |
|||
' cmModePath + "velocity/velocity",', |
|||
' cmModePath + "xquery/xquery",', |
|||
' cmModePath + "yaml/yaml",', |
|||
' cmModePath + "erlang/erlang",', |
|||
' cmModePath + "jade/jade",', |
|||
'', |
|||
' cmAddonPath + "edit/trailingspace", ', |
|||
' cmAddonPath + "dialog/dialog", ', |
|||
' cmAddonPath + "search/searchcursor", ', |
|||
' cmAddonPath + "search/search", ', |
|||
' cmAddonPath + "scroll/annotatescrollbar", ', |
|||
' cmAddonPath + "search/matchesonscrollbar", ', |
|||
' cmAddonPath + "display/placeholder", ', |
|||
' cmAddonPath + "edit/closetag", ', |
|||
' cmAddonPath + "fold/foldcode",', |
|||
' cmAddonPath + "fold/foldgutter",', |
|||
' cmAddonPath + "fold/indent-fold",', |
|||
' cmAddonPath + "fold/brace-fold",', |
|||
' cmAddonPath + "fold/xml-fold", ', |
|||
' cmAddonPath + "fold/markdown-fold",', |
|||
' cmAddonPath + "fold/comment-fold", ', |
|||
' cmAddonPath + "mode/overlay", ', |
|||
' cmAddonPath + "selection/active-line", ', |
|||
' cmAddonPath + "edit/closebrackets", ', |
|||
' cmAddonPath + "display/fullscreen",', |
|||
' cmAddonPath + "search/match-highlighter"', |
|||
' ];', |
|||
'', |
|||
' define(codeMirrorModules, factory);' |
|||
].join("\r\n"); |
|||
|
|||
var replaceText2 = [ |
|||
"if (typeof define == \"function\" && define.amd) {", |
|||
" $ = arguments[0];", |
|||
" marked = arguments[1];", |
|||
" prettify = arguments[2];", |
|||
" katex = arguments[3];", |
|||
" Raphael = arguments[4];", |
|||
" _ = arguments[5];", |
|||
" flowchart = arguments[6];", |
|||
" CodeMirror = arguments[9];", |
|||
" }" |
|||
].join("\r\n"); |
|||
|
|||
gulp.src("src/editormd.js") |
|||
.pipe(rename({ suffix: ".amd" })) |
|||
.pipe(gulp.dest('./')) |
|||
.pipe(header(headerComment, {pkg : pkg, fileName : function(file) { |
|||
var name = file.path.split(file.base); |
|||
return name[1].replace(/[\\\/]?/, ""); |
|||
}})) |
|||
.pipe(gulp.dest("./")) |
|||
.pipe(replace("/* Require.js define replace */", replaceText1)) |
|||
.pipe(gulp.dest('./')) |
|||
.pipe(replace("/* Require.js assignment replace */", replaceText2)) |
|||
.pipe(gulp.dest('./')) |
|||
.pipe(rename({ suffix: ".min" })) |
|||
.pipe(uglify()) //{outSourceMap: true, sourceRoot: './'}
|
|||
.pipe(gulp.dest("./")) |
|||
.pipe(header(headerMiniComment, {pkg : pkg, fileName : function(file) { |
|||
var name = file.path.split(file.base + ( (os.platform() === "win32") ? "\\" : "/") ); |
|||
return name[1].replace(/[\\\/]?/, ""); |
|||
}})) |
|||
.pipe(gulp.dest("./")) |
|||
.pipe(notify({ message: "amd version task complete"})); |
|||
}); |
|||
|
|||
|
|||
var codeMirror = { |
|||
path : { |
|||
src : { |
|||
mode : "lib/codemirror/mode", |
|||
addon : "lib/codemirror/addon" |
|||
}, |
|||
dist : "lib/codemirror" |
|||
}, |
|||
modes : [ |
|||
"css", |
|||
"sass", |
|||
"shell", |
|||
"sql", |
|||
"clike", |
|||
"php", |
|||
"xml", |
|||
"markdown", |
|||
"javascript", |
|||
"htmlmixed", |
|||
"gfm", |
|||
"http", |
|||
"go", |
|||
"dart", |
|||
"coffeescript", |
|||
"nginx", |
|||
"python", |
|||
"perl", |
|||
"lua", |
|||
"r", |
|||
"ruby", |
|||
"rst", |
|||
"smartymixed", |
|||
"vb", |
|||
"vbscript", |
|||
"velocity", |
|||
"xquery", |
|||
"yaml", |
|||
"erlang", |
|||
"jade", |
|||
], |
|||
|
|||
addons : [ |
|||
"edit/trailingspace", |
|||
"dialog/dialog", |
|||
"search/searchcursor", |
|||
"search/search", |
|||
"scroll/annotatescrollbar", |
|||
"search/matchesonscrollbar", |
|||
"display/placeholder", |
|||
"edit/closetag", |
|||
"fold/foldcode", |
|||
"fold/foldgutter", |
|||
"fold/indent-fold", |
|||
"fold/brace-fold", |
|||
"fold/xml-fold", |
|||
"fold/markdown-fold", |
|||
"fold/comment-fold", |
|||
"mode/overlay", |
|||
"selection/active-line", |
|||
"edit/closebrackets", |
|||
"display/fullscreen", |
|||
"search/match-highlighter" |
|||
] |
|||
}; |
|||
|
|||
gulp.task("cm-mode", function() { |
|||
|
|||
var modes = [ |
|||
codeMirror.path.src.mode + "/meta.js" |
|||
]; |
|||
|
|||
for(var i in codeMirror.modes) { |
|||
var mode = codeMirror.modes[i]; |
|||
modes.push(codeMirror.path.src.mode + "/" + mode + "/" + mode + ".js"); |
|||
} |
|||
|
|||
return gulp.src(modes) |
|||
.pipe(concat("modes.min.js")) |
|||
.pipe(gulp.dest(codeMirror.path.dist)) |
|||
.pipe(uglify()) // {outSourceMap: true, sourceRoot: codeMirror.path.dist}
|
|||
.pipe(gulp.dest(codeMirror.path.dist)) |
|||
.pipe(header(headerMiniComment, {pkg : pkg, fileName : function(file) { |
|||
var name = file.path.split(file.base + "\\"); |
|||
return (name[1]?name[1]:name[0]).replace(/\\/g, ""); |
|||
}})) |
|||
.pipe(gulp.dest(codeMirror.path.dist)) |
|||
.pipe(notify({ message: "codemirror-mode task complete!" })); |
|||
}); |
|||
|
|||
gulp.task("cm-addon", function() { |
|||
|
|||
var addons = []; |
|||
|
|||
for(var i in codeMirror.addons) { |
|||
var addon = codeMirror.addons[i]; |
|||
addons.push(codeMirror.path.src.addon + "/" + addon + ".js"); |
|||
} |
|||
|
|||
return gulp.src(addons) |
|||
.pipe(concat("addons.min.js")) |
|||
.pipe(gulp.dest(codeMirror.path.dist)) |
|||
.pipe(uglify()) //{outSourceMap: true, sourceRoot: codeMirror.path.dist}
|
|||
.pipe(gulp.dest(codeMirror.path.dist)) |
|||
.pipe(header(headerMiniComment, {pkg : pkg, fileName : function(file) { |
|||
var name = file.path.split(file.base + "\\"); |
|||
return (name[1]?name[1]:name[0]).replace(/\\/g, ""); |
|||
}})) |
|||
.pipe(gulp.dest(codeMirror.path.dist)) |
|||
.pipe(notify({ message: "codemirror-addon.js task complete" })); |
|||
}); |
|||
/* |
|||
gulp.task("jsdoc", function(){ |
|||
return gulp.src(["./src/editormd.js", "README.md"]) |
|||
.pipe(jsdoc.parser()) |
|||
.pipe(jsdoc.generator("./docs/html")); |
|||
}); |
|||
|
|||
gulp.task("jsdoc2md", function() { |
|||
return gulp.src("src/js/editormd.js") |
|||
.pipe(jsdoc2md()) |
|||
.on("error", function(err){ |
|||
gutil.log(gutil.colors.red("jsdoc2md failed"), err.message); |
|||
}) |
|||
.pipe(rename(function(path) { |
|||
path.extname = ".md"; |
|||
})) |
|||
.pipe(gulp.dest("docs/markdown")); |
|||
}); |
|||
*/ |
|||
gulp.task("watch", function() { |
|||
gulp.watch("scss/editormd.scss", ["scss"]); |
|||
gulp.watch("scss/editormd.preview.scss", ["scss", "scss2"]); |
|||
gulp.watch("scss/editormd.logo.scss", ["scss", "scss3"]); |
|||
gulp.watch("src/editormd.js", ["js", "amd"]); |
|||
}); |
|||
|
|||
gulp.task("default", function() { |
|||
gulp.run("scss"); |
|||
gulp.run("scss2"); |
|||
gulp.run("scss3"); |
|||
gulp.run("js"); |
|||
gulp.run("amd"); |
|||
gulp.run("cm-addon"); |
|||
gulp.run("cm-mode"); |
|||
"use strict"; |
|||
|
|||
var os = require("os"); |
|||
var gulp = require("gulp"); |
|||
var gutil = require("gulp-util"); |
|||
var sass = require("gulp-ruby-sass"); |
|||
var jshint = require("gulp-jshint"); |
|||
var uglify = require("gulp-uglifyjs"); |
|||
var rename = require("gulp-rename"); |
|||
var concat = require("gulp-concat"); |
|||
var notify = require("gulp-notify"); |
|||
var header = require("gulp-header"); |
|||
var minifycss = require("gulp-minify-css"); |
|||
//var jsdoc = require("gulp-jsdoc");
|
|||
//var jsdoc2md = require("gulp-jsdoc-to-markdown");
|
|||
var pkg = require("./package.json"); |
|||
var dateFormat = require("dateformatter").format; |
|||
var replace = require("gulp-replace"); |
|||
|
|||
pkg.name = "Editor.md"; |
|||
pkg.today = dateFormat; |
|||
|
|||
var headerComment = ["/*", |
|||
" * <%= pkg.name %>", |
|||
" *", |
|||
" * @file <%= fileName(file) %> ", |
|||
" * @version v<%= pkg.version %> ", |
|||
" * @description <%= pkg.description %>", |
|||
" * @license MIT License", |
|||
" * @author <%= pkg.author %>", |
|||
" * {@link <%= pkg.homepage %>}", |
|||
" * @updateTime <%= pkg.today('Y-m-d') %>", |
|||
" */", |
|||
"\r\n"].join("\r\n"); |
|||
|
|||
var headerMiniComment = "/*! <%= pkg.name %> v<%= pkg.version %> | <%= fileName(file) %> | <%= pkg.description %> | MIT License | By: <%= pkg.author %> | <%= pkg.homepage %> | <%=pkg.today('Y-m-d') %> */\r\n"; |
|||
|
|||
var scssTask = function(fileName, path) { |
|||
|
|||
path = path || "scss/"; |
|||
|
|||
var distPath = "css"; |
|||
|
|||
return sass(path + fileName + ".scss", { style: "expanded", sourcemap: false, noCache : true }) |
|||
.pipe(gulp.dest(distPath)) |
|||
.pipe(header(headerComment, {pkg : pkg, fileName : function(file) { |
|||
var name = file.path.split(file.base); |
|||
return name[1].replace("\\", ""); |
|||
}})) |
|||
.pipe(gulp.dest(distPath)) |
|||
.pipe(rename({ suffix: ".min" })) |
|||
.pipe(gulp.dest(distPath)) |
|||
.pipe(minifycss()) |
|||
.pipe(gulp.dest(distPath)) |
|||
.pipe(header(headerMiniComment, {pkg : pkg, fileName : function(file) { |
|||
var name = file.path.split(file.base); |
|||
return name[1].replace("\\", ""); |
|||
}})) |
|||
.pipe(gulp.dest(distPath)) |
|||
.pipe(notify({ message: fileName + ".scss task completed!" })); |
|||
}; |
|||
|
|||
gulp.task("scss", function() { |
|||
return scssTask("editormd"); |
|||
}); |
|||
|
|||
gulp.task("scss2", function() { |
|||
return scssTask("editormd.preview"); |
|||
}); |
|||
|
|||
gulp.task("scss3", function() { |
|||
return scssTask("editormd.logo"); |
|||
}); |
|||
|
|||
gulp.task("js", function() { |
|||
return gulp.src("./src/editormd.js") |
|||
.pipe(jshint("./.jshintrc")) |
|||
.pipe(jshint.reporter("default")) |
|||
.pipe(header(headerComment, {pkg : pkg, fileName : function(file) { |
|||
var name = file.path.split(file.base); |
|||
return name[1].replace(/[\\\/]?/, ""); |
|||
}})) |
|||
.pipe(gulp.dest("./")) |
|||
.pipe(rename({ suffix: ".min" })) |
|||
.pipe(uglify()) // {outSourceMap: true, sourceRoot: './'}
|
|||
.pipe(gulp.dest("./")) |
|||
.pipe(header(headerMiniComment, {pkg : pkg, fileName : function(file) { |
|||
var name = file.path.split(file.base + ( (os.platform() === "win32") ? "\\" : "/") ); |
|||
return name[1].replace(/[\\\/]?/, ""); |
|||
}})) |
|||
.pipe(gulp.dest("./")) |
|||
.pipe(notify({ message: "editormd.js task complete" })); |
|||
}); |
|||
|
|||
gulp.task("amd", function() { |
|||
var replaceText1 = [ |
|||
'var cmModePath = "codemirror/mode/";', |
|||
' var cmAddonPath = "codemirror/addon/";', |
|||
'', |
|||
' var codeMirrorModules = [', |
|||
' "jquery", "marked", "prettify",', |
|||
' "katex", "raphael", "underscore", "flowchart", "jqueryflowchart", "sequenceDiagram",', |
|||
'', |
|||
' "codemirror/lib/codemirror",', |
|||
' cmModePath + "css/css",', |
|||
' cmModePath + "sass/sass",', |
|||
' cmModePath + "shell/shell",', |
|||
' cmModePath + "sql/sql",', |
|||
' cmModePath + "clike/clike",', |
|||
' cmModePath + "php/php",', |
|||
' cmModePath + "xml/xml",', |
|||
' cmModePath + "markdown/markdown",', |
|||
' cmModePath + "javascript/javascript",', |
|||
' cmModePath + "htmlmixed/htmlmixed",', |
|||
' cmModePath + "gfm/gfm",', |
|||
' cmModePath + "http/http",', |
|||
' cmModePath + "go/go",', |
|||
' cmModePath + "dart/dart",', |
|||
' cmModePath + "coffeescript/coffeescript",', |
|||
' cmModePath + "nginx/nginx",', |
|||
' cmModePath + "python/python",', |
|||
' cmModePath + "perl/perl",', |
|||
' cmModePath + "lua/lua",', |
|||
' cmModePath + "r/r", ', |
|||
' cmModePath + "ruby/ruby", ', |
|||
' cmModePath + "rst/rst",', |
|||
' cmModePath + "smartymixed/smartymixed",', |
|||
' cmModePath + "vb/vb",', |
|||
' cmModePath + "vbscript/vbscript",', |
|||
' cmModePath + "velocity/velocity",', |
|||
' cmModePath + "xquery/xquery",', |
|||
' cmModePath + "yaml/yaml",', |
|||
' cmModePath + "erlang/erlang",', |
|||
' cmModePath + "jade/jade",', |
|||
'', |
|||
' cmAddonPath + "edit/trailingspace", ', |
|||
' cmAddonPath + "dialog/dialog", ', |
|||
' cmAddonPath + "search/searchcursor", ', |
|||
' cmAddonPath + "search/search", ', |
|||
' cmAddonPath + "scroll/annotatescrollbar", ', |
|||
' cmAddonPath + "search/matchesonscrollbar", ', |
|||
' cmAddonPath + "display/placeholder", ', |
|||
' cmAddonPath + "edit/closetag", ', |
|||
' cmAddonPath + "fold/foldcode",', |
|||
' cmAddonPath + "fold/foldgutter",', |
|||
' cmAddonPath + "fold/indent-fold",', |
|||
' cmAddonPath + "fold/brace-fold",', |
|||
' cmAddonPath + "fold/xml-fold", ', |
|||
' cmAddonPath + "fold/markdown-fold",', |
|||
' cmAddonPath + "fold/comment-fold", ', |
|||
' cmAddonPath + "mode/overlay", ', |
|||
' cmAddonPath + "selection/active-line", ', |
|||
' cmAddonPath + "edit/closebrackets", ', |
|||
' cmAddonPath + "display/fullscreen",', |
|||
' cmAddonPath + "search/match-highlighter"', |
|||
' ];', |
|||
'', |
|||
' define(codeMirrorModules, factory);' |
|||
].join("\r\n"); |
|||
|
|||
var replaceText2 = [ |
|||
"if (typeof define == \"function\" && define.amd) {", |
|||
" $ = arguments[0];", |
|||
" marked = arguments[1];", |
|||
" prettify = arguments[2];", |
|||
" katex = arguments[3];", |
|||
" Raphael = arguments[4];", |
|||
" _ = arguments[5];", |
|||
" flowchart = arguments[6];", |
|||
" CodeMirror = arguments[9];", |
|||
" }" |
|||
].join("\r\n"); |
|||
|
|||
gulp.src("src/editormd.js") |
|||
.pipe(rename({ suffix: ".amd" })) |
|||
.pipe(gulp.dest('./')) |
|||
.pipe(header(headerComment, {pkg : pkg, fileName : function(file) { |
|||
var name = file.path.split(file.base); |
|||
return name[1].replace(/[\\\/]?/, ""); |
|||
}})) |
|||
.pipe(gulp.dest("./")) |
|||
.pipe(replace("/* Require.js define replace */", replaceText1)) |
|||
.pipe(gulp.dest('./')) |
|||
.pipe(replace("/* Require.js assignment replace */", replaceText2)) |
|||
.pipe(gulp.dest('./')) |
|||
.pipe(rename({ suffix: ".min" })) |
|||
.pipe(uglify()) //{outSourceMap: true, sourceRoot: './'}
|
|||
.pipe(gulp.dest("./")) |
|||
.pipe(header(headerMiniComment, {pkg : pkg, fileName : function(file) { |
|||
var name = file.path.split(file.base + ( (os.platform() === "win32") ? "\\" : "/") ); |
|||
return name[1].replace(/[\\\/]?/, ""); |
|||
}})) |
|||
.pipe(gulp.dest("./")) |
|||
.pipe(notify({ message: "amd version task complete"})); |
|||
}); |
|||
|
|||
|
|||
var codeMirror = { |
|||
path : { |
|||
src : { |
|||
mode : "lib/codemirror/mode", |
|||
addon : "lib/codemirror/addon" |
|||
}, |
|||
dist : "lib/codemirror" |
|||
}, |
|||
modes : [ |
|||
"css", |
|||
"sass", |
|||
"shell", |
|||
"sql", |
|||
"clike", |
|||
"php", |
|||
"xml", |
|||
"markdown", |
|||
"javascript", |
|||
"htmlmixed", |
|||
"gfm", |
|||
"http", |
|||
"go", |
|||
"dart", |
|||
"coffeescript", |
|||
"nginx", |
|||
"python", |
|||
"perl", |
|||
"lua", |
|||
"r", |
|||
"ruby", |
|||
"rst", |
|||
"smartymixed", |
|||
"vb", |
|||
"vbscript", |
|||
"velocity", |
|||
"xquery", |
|||
"yaml", |
|||
"erlang", |
|||
"jade", |
|||
], |
|||
|
|||
addons : [ |
|||
"edit/trailingspace", |
|||
"dialog/dialog", |
|||
"search/searchcursor", |
|||
"search/search", |
|||
"scroll/annotatescrollbar", |
|||
"search/matchesonscrollbar", |
|||
"display/placeholder", |
|||
"edit/closetag", |
|||
"fold/foldcode", |
|||
"fold/foldgutter", |
|||
"fold/indent-fold", |
|||
"fold/brace-fold", |
|||
"fold/xml-fold", |
|||
"fold/markdown-fold", |
|||
"fold/comment-fold", |
|||
"mode/overlay", |
|||
"selection/active-line", |
|||
"edit/closebrackets", |
|||
"display/fullscreen", |
|||
"search/match-highlighter" |
|||
] |
|||
}; |
|||
|
|||
gulp.task("cm-mode", function() { |
|||
|
|||
var modes = [ |
|||
codeMirror.path.src.mode + "/meta.js" |
|||
]; |
|||
|
|||
for(var i in codeMirror.modes) { |
|||
var mode = codeMirror.modes[i]; |
|||
modes.push(codeMirror.path.src.mode + "/" + mode + "/" + mode + ".js"); |
|||
} |
|||
|
|||
return gulp.src(modes) |
|||
.pipe(concat("modes.min.js")) |
|||
.pipe(gulp.dest(codeMirror.path.dist)) |
|||
.pipe(uglify()) // {outSourceMap: true, sourceRoot: codeMirror.path.dist}
|
|||
.pipe(gulp.dest(codeMirror.path.dist)) |
|||
.pipe(header(headerMiniComment, {pkg : pkg, fileName : function(file) { |
|||
var name = file.path.split(file.base + "\\"); |
|||
return (name[1]?name[1]:name[0]).replace(/\\/g, ""); |
|||
}})) |
|||
.pipe(gulp.dest(codeMirror.path.dist)) |
|||
.pipe(notify({ message: "codemirror-mode task complete!" })); |
|||
}); |
|||
|
|||
gulp.task("cm-addon", function() { |
|||
|
|||
var addons = []; |
|||
|
|||
for(var i in codeMirror.addons) { |
|||
var addon = codeMirror.addons[i]; |
|||
addons.push(codeMirror.path.src.addon + "/" + addon + ".js"); |
|||
} |
|||
|
|||
return gulp.src(addons) |
|||
.pipe(concat("addons.min.js")) |
|||
.pipe(gulp.dest(codeMirror.path.dist)) |
|||
.pipe(uglify()) //{outSourceMap: true, sourceRoot: codeMirror.path.dist}
|
|||
.pipe(gulp.dest(codeMirror.path.dist)) |
|||
.pipe(header(headerMiniComment, {pkg : pkg, fileName : function(file) { |
|||
var name = file.path.split(file.base + "\\"); |
|||
return (name[1]?name[1]:name[0]).replace(/\\/g, ""); |
|||
}})) |
|||
.pipe(gulp.dest(codeMirror.path.dist)) |
|||
.pipe(notify({ message: "codemirror-addon.js task complete" })); |
|||
}); |
|||
/* |
|||
gulp.task("jsdoc", function(){ |
|||
return gulp.src(["./src/editormd.js", "README.md"]) |
|||
.pipe(jsdoc.parser()) |
|||
.pipe(jsdoc.generator("./docs/html")); |
|||
}); |
|||
|
|||
gulp.task("jsdoc2md", function() { |
|||
return gulp.src("src/js/editormd.js") |
|||
.pipe(jsdoc2md()) |
|||
.on("error", function(err){ |
|||
gutil.log(gutil.colors.red("jsdoc2md failed"), err.message); |
|||
}) |
|||
.pipe(rename(function(path) { |
|||
path.extname = ".md"; |
|||
})) |
|||
.pipe(gulp.dest("docs/markdown")); |
|||
}); |
|||
*/ |
|||
gulp.task("watch", function() { |
|||
gulp.watch("scss/editormd.scss", ["scss"]); |
|||
gulp.watch("scss/editormd.preview.scss", ["scss", "scss2"]); |
|||
gulp.watch("scss/editormd.logo.scss", ["scss", "scss3"]); |
|||
gulp.watch("src/editormd.js", ["js", "amd"]); |
|||
}); |
|||
|
|||
gulp.task("default", function() { |
|||
gulp.run("scss"); |
|||
gulp.run("scss2"); |
|||
gulp.run("scss3"); |
|||
gulp.run("js"); |
|||
gulp.run("amd"); |
|||
gulp.run("cm-addon"); |
|||
gulp.run("cm-mode"); |
|||
}); |
@ -1,22 +1,22 @@ |
|||
The MIT License (MIT) |
|||
|
|||
Copyright (c) 2015 pandao |
|||
|
|||
Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
of this software and associated documentation files (the "Software"), to deal |
|||
in the Software without restriction, including without limitation the rights |
|||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
copies of the Software, and to permit persons to whom the Software is |
|||
furnished to do so, subject to the following conditions: |
|||
|
|||
The above copyright notice and this permission notice shall be included in all |
|||
copies or substantial portions of the Software. |
|||
|
|||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|||
SOFTWARE. |
|||
|
|||
The MIT License (MIT) |
|||
|
|||
Copyright (c) 2015 pandao |
|||
|
|||
Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
of this software and associated documentation files (the "Software"), to deal |
|||
in the Software without restriction, including without limitation the rights |
|||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
copies of the Software, and to permit persons to whom the Software is |
|||
furnished to do so, subject to the following conditions: |
|||
|
|||
The above copyright notice and this permission notice shall be included in all |
|||
copies or substantial portions of the Software. |
|||
|
|||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|||
SOFTWARE. |
|||
|
@ -1,119 +1,119 @@ |
|||
# Editor.md |
|||
|
|||
 |
|||
|
|||
 |
|||
 |
|||
 |
|||
 |
|||
 |
|||
 |
|||
|
|||
**Editor.md** : The open source embeddable online markdown editor (component), based on CodeMirror & jQuery & Marked. |
|||
|
|||
### Features |
|||
|
|||
- Support Standard Markdown / CommonMark and GFM (GitHub Flavored Markdown); |
|||
- Full-featured: Real-time Preview, Image (cross-domain) upload, Preformatted text/Code blocks/Tables insert, Code fold, Search replace, Read only, Themes, Multi-languages, L18n, HTML entities, Code syntax highlighting...; |
|||
- Markdown Extras : Support [ToC (Table of Contents)](https://pandao.github.io/editor.md/examples/toc.html), [Emoji](https://pandao.github.io/editor.md/examples/emoji.html), [Task lists](https://pandao.github.io/editor.md/examples/task-lists.html), [@Links](https://pandao.github.io/editor.md/examples/@links.html)...; |
|||
- Compatible with all major browsers (IE8+), compatible Zepto.js and iPad; |
|||
- Support [decode & fliter of the HTML tags & attributes](https://pandao.github.io/editor.md/examples/html-tags-decode.html); |
|||
- Support [TeX (LaTeX expressions, Based on KaTeX)](https://pandao.github.io/editor.md/examples/katex.html), [Flowchart](https://pandao.github.io/editor.md/examples/flowchart.html) and [Sequence Diagram](https://pandao.github.io/editor.md/examples/sequence-diagram.html) of Markdown extended syntax; |
|||
- Support AMD/CMD (Require.js & Sea.js) Module Loader, and Custom/define editor plugins; |
|||
|
|||
[README & Examples (English)](https://pandao.github.io/editor.md/en.html) |
|||
|
|||
|
|||
-------- |
|||
|
|||
**Editor.md** 是一款开源的、可嵌入的 Markdown 在线编辑器(组件),基于 CodeMirror、jQuery 和 Marked 构建。 |
|||
|
|||
 |
|||
|
|||
#### 主要特性 |
|||
|
|||
- 支持通用 Markdown / CommonMark 和 GFM (GitHub Flavored Markdown) 风格的语法,也可[变身为代码编辑器](https://pandao.github.io/editor.md/examples/change-mode.html); |
|||
- 支持实时预览、图片(跨域)上传、预格式文本/代码/表格插入、代码折叠、跳转到行、搜索替换、只读模式、自定义样式主题和多语言语法高亮等功能; |
|||
- 支持 [ToC(Table of Contents)](https://pandao.github.io/editor.md/examples/toc.html)、[Emoji表情](https://pandao.github.io/editor.md/examples/emoji.html)、[Task lists](https://pandao.github.io/editor.md/examples/task-lists.html)、[@链接](https://pandao.github.io/editor.md/examples/@links.html)等 Markdown 扩展语法; |
|||
- 支持 TeX 科学公式(基于 [KaTeX](https://pandao.github.io/editor.md/examples/katex.html))、流程图 [Flowchart](https://pandao.github.io/editor.md/examples/flowchart.html) 和 [时序图 Sequence Diagram](https://pandao.github.io/editor.md/examples/sequence-diagram.html); |
|||
- 支持[识别和解析 HTML 标签,并且支持自定义过滤标签及属性解析](https://pandao.github.io/editor.md/examples/html-tags-decode.html),具有可靠的安全性和几乎无限的扩展性; |
|||
- 支持 AMD / CMD 模块化加载(支持 [Require.js](https://pandao.github.io/editor.md/examples/use-requirejs.html) & [Sea.js](https://pandao.github.io/editor.md/examples/use-seajs.html)),并且支持[自定义扩展插件](https://pandao.github.io/editor.md/examples/define-plugin.html); |
|||
- 兼容主流的浏览器(IE8+)和 [Zepto.js](https://pandao.github.io/editor.md/examples/use-zepto.html),且支持 iPad 等平板设备; |
|||
|
|||
#### Examples |
|||
|
|||
[https://pandao.github.io/editor.md/examples/index.html](https://pandao.github.io/editor.md/examples/index.html) |
|||
|
|||
#### Download & install |
|||
|
|||
[Github download](https://github.com/pandao/editor.md/archive/master.zip) |
|||
|
|||
Bower install : |
|||
|
|||
```shell |
|||
bower install editor.md |
|||
``` |
|||
|
|||
#### Usages |
|||
|
|||
HTML: |
|||
|
|||
```html |
|||
<link rel="stylesheet" href="editormd.min.css" /> |
|||
<div id="editormd"> |
|||
<textarea style="display:none;">### Hello Editor.md !</textarea> |
|||
</div> |
|||
``` |
|||
|
|||
> Tip: Editor.md can auto append `<textarea>` tag; |
|||
|
|||
javascript: |
|||
|
|||
```html |
|||
<script src="jquery.min.js"></script> |
|||
<script src="editormd.min.js"></script> |
|||
<script type="text/javascript"> |
|||
$(function() { |
|||
var editor = editormd("editormd", { |
|||
path : "../lib/" // Autoload modules mode, codemirror, marked... dependents libs path |
|||
}); |
|||
|
|||
/* |
|||
// or |
|||
var editor = editormd({ |
|||
id : "editormd", |
|||
path : "../lib/" |
|||
}); |
|||
*/ |
|||
}); |
|||
</script> |
|||
``` |
|||
|
|||
Using modular script loader : |
|||
|
|||
- [Using Require.js](https://github.com/pandao/editor.md/tree/master/examples/use-requirejs.html) |
|||
- [Using Sea.js](https://github.com/pandao/editor.md/tree/master/examples/use-seajs.html) |
|||
|
|||
#### Dependents |
|||
|
|||
- [CodeMirror](http://codemirror.net/ "CodeMirror") |
|||
- [marked](https://github.com/chjj/marked "marked") |
|||
- [jQuery](http://jquery.com/ "jQuery") |
|||
- [FontAwesome](http://fontawesome.io/ "FontAwesome") |
|||
- [github-markdown.css](https://github.com/sindresorhus/github-markdown-css "github-markdown.css") |
|||
- [KaTeX](http://khan.github.io/KaTeX/ "KaTeX") |
|||
- [prettify.js](http://code.google.com/p/google-code-prettify/ "prettify.js") |
|||
- [Rephael.js](http://raphaeljs.com/ "Rephael.js") |
|||
- [flowchart.js](http://adrai.github.io/flowchart.js/ "flowchart.js") |
|||
- [sequence-diagram.js](http://bramp.github.io/js-sequence-diagrams/ "sequence-diagram.js") |
|||
- [Prefixes.scss](https://github.com/pandao/prefixes.scss "Prefixes.scss") |
|||
|
|||
#### Changes |
|||
|
|||
[Change logs](https://github.com/pandao/editor.md/blob/master/CHANGE.md) |
|||
|
|||
#### License |
|||
|
|||
The MIT License. |
|||
|
|||
Copyright (c) 2015 Pandao |
|||
# Editor.md |
|||
|
|||
 |
|||
|
|||
 |
|||
 |
|||
 |
|||
 |
|||
 |
|||
 |
|||
|
|||
**Editor.md** : The open source embeddable online markdown editor (component), based on CodeMirror & jQuery & Marked. |
|||
|
|||
### Features |
|||
|
|||
- Support Standard Markdown / CommonMark and GFM (GitHub Flavored Markdown); |
|||
- Full-featured: Real-time Preview, Image (cross-domain) upload, Preformatted text/Code blocks/Tables insert, Code fold, Search replace, Read only, Themes, Multi-languages, L18n, HTML entities, Code syntax highlighting...; |
|||
- Markdown Extras : Support [ToC (Table of Contents)](https://pandao.github.io/editor.md/examples/toc.html), [Emoji](https://pandao.github.io/editor.md/examples/emoji.html), [Task lists](https://pandao.github.io/editor.md/examples/task-lists.html), [@Links](https://pandao.github.io/editor.md/examples/@links.html)...; |
|||
- Compatible with all major browsers (IE8+), compatible Zepto.js and iPad; |
|||
- Support [decode & fliter of the HTML tags & attributes](https://pandao.github.io/editor.md/examples/html-tags-decode.html); |
|||
- Support [TeX (LaTeX expressions, Based on KaTeX)](https://pandao.github.io/editor.md/examples/katex.html), [Flowchart](https://pandao.github.io/editor.md/examples/flowchart.html) and [Sequence Diagram](https://pandao.github.io/editor.md/examples/sequence-diagram.html) of Markdown extended syntax; |
|||
- Support AMD/CMD (Require.js & Sea.js) Module Loader, and Custom/define editor plugins; |
|||
|
|||
[README & Examples (English)](https://pandao.github.io/editor.md/en.html) |
|||
|
|||
|
|||
-------- |
|||
|
|||
**Editor.md** 是一款开源的、可嵌入的 Markdown 在线编辑器(组件),基于 CodeMirror、jQuery 和 Marked 构建。 |
|||
|
|||
 |
|||
|
|||
#### 主要特性 |
|||
|
|||
- 支持通用 Markdown / CommonMark 和 GFM (GitHub Flavored Markdown) 风格的语法,也可[变身为代码编辑器](https://pandao.github.io/editor.md/examples/change-mode.html); |
|||
- 支持实时预览、图片(跨域)上传、预格式文本/代码/表格插入、代码折叠、跳转到行、搜索替换、只读模式、自定义样式主题和多语言语法高亮等功能; |
|||
- 支持 [ToC(Table of Contents)](https://pandao.github.io/editor.md/examples/toc.html)、[Emoji表情](https://pandao.github.io/editor.md/examples/emoji.html)、[Task lists](https://pandao.github.io/editor.md/examples/task-lists.html)、[@链接](https://pandao.github.io/editor.md/examples/@links.html)等 Markdown 扩展语法; |
|||
- 支持 TeX 科学公式(基于 [KaTeX](https://pandao.github.io/editor.md/examples/katex.html))、流程图 [Flowchart](https://pandao.github.io/editor.md/examples/flowchart.html) 和 [时序图 Sequence Diagram](https://pandao.github.io/editor.md/examples/sequence-diagram.html); |
|||
- 支持[识别和解析 HTML 标签,并且支持自定义过滤标签及属性解析](https://pandao.github.io/editor.md/examples/html-tags-decode.html),具有可靠的安全性和几乎无限的扩展性; |
|||
- 支持 AMD / CMD 模块化加载(支持 [Require.js](https://pandao.github.io/editor.md/examples/use-requirejs.html) & [Sea.js](https://pandao.github.io/editor.md/examples/use-seajs.html)),并且支持[自定义扩展插件](https://pandao.github.io/editor.md/examples/define-plugin.html); |
|||
- 兼容主流的浏览器(IE8+)和 [Zepto.js](https://pandao.github.io/editor.md/examples/use-zepto.html),且支持 iPad 等平板设备; |
|||
|
|||
#### Examples |
|||
|
|||
[https://pandao.github.io/editor.md/examples/index.html](https://pandao.github.io/editor.md/examples/index.html) |
|||
|
|||
#### Download & install |
|||
|
|||
[Github download](https://github.com/pandao/editor.md/archive/master.zip) |
|||
|
|||
Bower install : |
|||
|
|||
```shell |
|||
bower install editor.md |
|||
``` |
|||
|
|||
#### Usages |
|||
|
|||
HTML: |
|||
|
|||
```html |
|||
<link rel="stylesheet" href="editormd.min.css" /> |
|||
<div id="editormd"> |
|||
<textarea style="display:none;">### Hello Editor.md !</textarea> |
|||
</div> |
|||
``` |
|||
|
|||
> Tip: Editor.md can auto append `<textarea>` tag; |
|||
|
|||
javascript: |
|||
|
|||
```html |
|||
<script src="jquery.min.js"></script> |
|||
<script src="editormd.min.js"></script> |
|||
<script type="text/javascript"> |
|||
$(function() { |
|||
var editor = editormd("editormd", { |
|||
path : "../lib/" // Autoload modules mode, codemirror, marked... dependents libs path |
|||
}); |
|||
|
|||
/* |
|||
// or |
|||
var editor = editormd({ |
|||
id : "editormd", |
|||
path : "../lib/" |
|||
}); |
|||
*/ |
|||
}); |
|||
</script> |
|||
``` |
|||
|
|||
Using modular script loader : |
|||
|
|||
- [Using Require.js](https://github.com/pandao/editor.md/tree/master/examples/use-requirejs.html) |
|||
- [Using Sea.js](https://github.com/pandao/editor.md/tree/master/examples/use-seajs.html) |
|||
|
|||
#### Dependents |
|||
|
|||
- [CodeMirror](http://codemirror.net/ "CodeMirror") |
|||
- [marked](https://github.com/chjj/marked "marked") |
|||
- [jQuery](http://jquery.com/ "jQuery") |
|||
- [FontAwesome](http://fontawesome.io/ "FontAwesome") |
|||
- [github-markdown.css](https://github.com/sindresorhus/github-markdown-css "github-markdown.css") |
|||
- [KaTeX](http://khan.github.io/KaTeX/ "KaTeX") |
|||
- [prettify.js](http://code.google.com/p/google-code-prettify/ "prettify.js") |
|||
- [Rephael.js](http://raphaeljs.com/ "Rephael.js") |
|||
- [flowchart.js](http://adrai.github.io/flowchart.js/ "flowchart.js") |
|||
- [sequence-diagram.js](http://bramp.github.io/js-sequence-diagrams/ "sequence-diagram.js") |
|||
- [Prefixes.scss](https://github.com/pandao/prefixes.scss "Prefixes.scss") |
|||
|
|||
#### Changes |
|||
|
|||
[Change logs](https://github.com/pandao/editor.md/blob/master/CHANGE.md) |
|||
|
|||
#### License |
|||
|
|||
The MIT License. |
|||
|
|||
Copyright (c) 2015 Pandao |
8900
web/static/editor.md/css/editormd.css
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -1,98 +1,98 @@ |
|||
/* |
|||
* Editor.md |
|||
* |
|||
* @file editormd.logo.css |
|||
* @version v1.5.0 |
|||
* @description Open source online markdown editor. |
|||
* @license MIT License |
|||
* @author Pandao |
|||
* {@link https://github.com/pandao/editor.md} |
|||
* @updateTime 2015-06-09 |
|||
*/ |
|||
|
|||
/*! prefixes.scss v0.1.0 | Author: Pandao | https://github.com/pandao/prefixes.scss | MIT license | Copyright (c) 2015 */ |
|||
@font-face { |
|||
font-family: 'editormd-logo'; |
|||
src: url("../fonts/editormd-logo.eot?-5y8q6h"); |
|||
src: url(".../fonts/editormd-logo.eot?#iefix-5y8q6h") format("embedded-opentype"), url("../fonts/editormd-logo.woff?-5y8q6h") format("woff"), url("../fonts/editormd-logo.ttf?-5y8q6h") format("truetype"), url("../fonts/editormd-logo.svg?-5y8q6h#icomoon") format("svg"); |
|||
font-weight: normal; |
|||
font-style: normal; |
|||
} |
|||
.editormd-logo, |
|||
.editormd-logo-1x, |
|||
.editormd-logo-2x, |
|||
.editormd-logo-3x, |
|||
.editormd-logo-4x, |
|||
.editormd-logo-5x, |
|||
.editormd-logo-6x, |
|||
.editormd-logo-7x, |
|||
.editormd-logo-8x { |
|||
font-family: 'editormd-logo'; |
|||
speak: none; |
|||
font-style: normal; |
|||
font-weight: normal; |
|||
font-variant: normal; |
|||
text-transform: none; |
|||
font-size: inherit; |
|||
line-height: 1; |
|||
display: inline-block; |
|||
text-rendering: auto; |
|||
vertical-align: inherit; |
|||
-webkit-font-smoothing: antialiased; |
|||
-moz-osx-font-smoothing: grayscale; |
|||
} |
|||
.editormd-logo:before, |
|||
.editormd-logo-1x:before, |
|||
.editormd-logo-2x:before, |
|||
.editormd-logo-3x:before, |
|||
.editormd-logo-4x:before, |
|||
.editormd-logo-5x:before, |
|||
.editormd-logo-6x:before, |
|||
.editormd-logo-7x:before, |
|||
.editormd-logo-8x:before { |
|||
content: "\e1987"; |
|||
/* |
|||
HTML Entity 󡦇 |
|||
example: <span class="editormd-logo">󡦇</span> |
|||
*/ |
|||
} |
|||
|
|||
.editormd-logo-1x { |
|||
font-size: 1em; |
|||
} |
|||
|
|||
.editormd-logo-lg { |
|||
font-size: 1.2em; |
|||
} |
|||
|
|||
.editormd-logo-2x { |
|||
font-size: 2em; |
|||
} |
|||
|
|||
.editormd-logo-3x { |
|||
font-size: 3em; |
|||
} |
|||
|
|||
.editormd-logo-4x { |
|||
font-size: 4em; |
|||
} |
|||
|
|||
.editormd-logo-5x { |
|||
font-size: 5em; |
|||
} |
|||
|
|||
.editormd-logo-6x { |
|||
font-size: 6em; |
|||
} |
|||
|
|||
.editormd-logo-7x { |
|||
font-size: 7em; |
|||
} |
|||
|
|||
.editormd-logo-8x { |
|||
font-size: 8em; |
|||
} |
|||
|
|||
.editormd-logo-color { |
|||
color: #2196F3; |
|||
} |
|||
/* |
|||
* Editor.md |
|||
* |
|||
* @file editormd.logo.css |
|||
* @version v1.5.0 |
|||
* @description Open source online markdown editor. |
|||
* @license MIT License |
|||
* @author Pandao |
|||
* {@link https://github.com/pandao/editor.md} |
|||
* @updateTime 2015-06-09 |
|||
*/ |
|||
|
|||
/*! prefixes.scss v0.1.0 | Author: Pandao | https://github.com/pandao/prefixes.scss | MIT license | Copyright (c) 2015 */ |
|||
@font-face { |
|||
font-family: 'editormd-logo'; |
|||
src: url("../fonts/editormd-logo.eot?-5y8q6h"); |
|||
src: url(".../fonts/editormd-logo.eot?#iefix-5y8q6h") format("embedded-opentype"), url("../fonts/editormd-logo.woff?-5y8q6h") format("woff"), url("../fonts/editormd-logo.ttf?-5y8q6h") format("truetype"), url("../fonts/editormd-logo.svg?-5y8q6h#icomoon") format("svg"); |
|||
font-weight: normal; |
|||
font-style: normal; |
|||
} |
|||
.editormd-logo, |
|||
.editormd-logo-1x, |
|||
.editormd-logo-2x, |
|||
.editormd-logo-3x, |
|||
.editormd-logo-4x, |
|||
.editormd-logo-5x, |
|||
.editormd-logo-6x, |
|||
.editormd-logo-7x, |
|||
.editormd-logo-8x { |
|||
font-family: 'editormd-logo'; |
|||
speak: none; |
|||
font-style: normal; |
|||
font-weight: normal; |
|||
font-variant: normal; |
|||
text-transform: none; |
|||
font-size: inherit; |
|||
line-height: 1; |
|||
display: inline-block; |
|||
text-rendering: auto; |
|||
vertical-align: inherit; |
|||
-webkit-font-smoothing: antialiased; |
|||
-moz-osx-font-smoothing: grayscale; |
|||
} |
|||
.editormd-logo:before, |
|||
.editormd-logo-1x:before, |
|||
.editormd-logo-2x:before, |
|||
.editormd-logo-3x:before, |
|||
.editormd-logo-4x:before, |
|||
.editormd-logo-5x:before, |
|||
.editormd-logo-6x:before, |
|||
.editormd-logo-7x:before, |
|||
.editormd-logo-8x:before { |
|||
content: "\e1987"; |
|||
/* |
|||
HTML Entity 󡦇 |
|||
example: <span class="editormd-logo">󡦇</span> |
|||
*/ |
|||
} |
|||
|
|||
.editormd-logo-1x { |
|||
font-size: 1em; |
|||
} |
|||
|
|||
.editormd-logo-lg { |
|||
font-size: 1.2em; |
|||
} |
|||
|
|||
.editormd-logo-2x { |
|||
font-size: 2em; |
|||
} |
|||
|
|||
.editormd-logo-3x { |
|||
font-size: 3em; |
|||
} |
|||
|
|||
.editormd-logo-4x { |
|||
font-size: 4em; |
|||
} |
|||
|
|||
.editormd-logo-5x { |
|||
font-size: 5em; |
|||
} |
|||
|
|||
.editormd-logo-6x { |
|||
font-size: 6em; |
|||
} |
|||
|
|||
.editormd-logo-7x { |
|||
font-size: 7em; |
|||
} |
|||
|
|||
.editormd-logo-8x { |
|||
font-size: 8em; |
|||
} |
|||
|
|||
.editormd-logo-color { |
|||
color: #2196F3; |
|||
} |
@ -1,2 +1,2 @@ |
|||
/*! Editor.md v1.5.0 | editormd.logo.min.css | Open source online markdown editor. | MIT License | By: Pandao | https://github.com/pandao/editor.md | 2015-06-09 */ |
|||
/*! Editor.md v1.5.0 | editormd.logo.min.css | Open source online markdown editor. | MIT License | By: Pandao | https://github.com/pandao/editor.md | 2015-06-09 */ |
|||
/*! prefixes.scss v0.1.0 | Author: Pandao | https://github.com/pandao/prefixes.scss | MIT license | Copyright (c) 2015 */@font-face{font-family:editormd-logo;src:url(../fonts/editormd-logo.eot?-5y8q6h);src:url(.../fonts/editormd-logo.eot?#iefix-5y8q6h)format("embedded-opentype"),url(../fonts/editormd-logo.woff?-5y8q6h)format("woff"),url(../fonts/editormd-logo.ttf?-5y8q6h)format("truetype"),url(../fonts/editormd-logo.svg?-5y8q6h#icomoon)format("svg");font-weight:400;font-style:normal}.editormd-logo,.editormd-logo-1x,.editormd-logo-2x,.editormd-logo-3x,.editormd-logo-4x,.editormd-logo-5x,.editormd-logo-6x,.editormd-logo-7x,.editormd-logo-8x{font-family:editormd-logo;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;font-size:inherit;line-height:1;display:inline-block;text-rendering:auto;vertical-align:inherit;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.editormd-logo-1x:before,.editormd-logo-2x:before,.editormd-logo-3x:before,.editormd-logo-4x:before,.editormd-logo-5x:before,.editormd-logo-6x:before,.editormd-logo-7x:before,.editormd-logo-8x:before,.editormd-logo:before{content:"\e1987"}.editormd-logo-1x{font-size:1em}.editormd-logo-lg{font-size:1.2em}.editormd-logo-2x{font-size:2em}.editormd-logo-3x{font-size:3em}.editormd-logo-4x{font-size:4em}.editormd-logo-5x{font-size:5em}.editormd-logo-6x{font-size:6em}.editormd-logo-7x{font-size:7em}.editormd-logo-8x{font-size:8em}.editormd-logo-color{color:#2196F3} |
8
web/static/editor.md/css/editormd.min.css
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
7108
web/static/editor.md/css/editormd.preview.css
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
8
web/static/editor.md/css/editormd.preview.min.css
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
9334
web/static/editor.md/editormd.amd.js
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
6
web/static/editor.md/editormd.amd.min.js
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
8686
web/static/editor.md/editormd.js
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
2
web/static/editor.md/editormd.min.js
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -1,11 +1,11 @@ |
|||
<?xml version="1.0" standalone="no"?> |
|||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > |
|||
<svg xmlns="http://www.w3.org/2000/svg"> |
|||
<metadata>Generated by IcoMoon</metadata> |
|||
<defs> |
|||
<font id="icomoon" horiz-adv-x="1024"> |
|||
<font-face units-per-em="1024" ascent="960" descent="-64" /> |
|||
<missing-glyph horiz-adv-x="1024" /> |
|||
<glyph unicode=" " d="" horiz-adv-x="512" /> |
|||
<glyph unicode="󡦇" d="M726.954 68.236l-91.855-56.319-21.517 106.748 113.371-50.43zM876.293 709.493l12.502 28.106c6.469 14.545 23.659 21.147 38.201 14.681l60.652-26.984c14.546-6.468 21.149-23.661 14.68-38.201l-12.502-28.106-113.536 50.505zM720.236 424.478l116.041 260.86-7.209 69.019h-130.248l-233.736-522.358-245.476 522.358h-133.528l-71.266-742.442h82.462l47.785 562.498 264.047-562.498h43.141l252.85 562.498 15.14-149.939zM761.891 11.915l-6.068 60.094 117.030 263.097 33.757-323.192-144.719 0.001zM621.638 137.007l113.54-50.503 246.486 554.111-113.536 50.506-246.489-554.114z" horiz-adv-x="1017" /> |
|||
<?xml version="1.0" standalone="no"?> |
|||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" > |
|||
<svg xmlns="http://www.w3.org/2000/svg"> |
|||
<metadata>Generated by IcoMoon</metadata> |
|||
<defs> |
|||
<font id="icomoon" horiz-adv-x="1024"> |
|||
<font-face units-per-em="1024" ascent="960" descent="-64" /> |
|||
<missing-glyph horiz-adv-x="1024" /> |
|||
<glyph unicode=" " d="" horiz-adv-x="512" /> |
|||
<glyph unicode="󡦇" d="M726.954 68.236l-91.855-56.319-21.517 106.748 113.371-50.43zM876.293 709.493l12.502 28.106c6.469 14.545 23.659 21.147 38.201 14.681l60.652-26.984c14.546-6.468 21.149-23.661 14.68-38.201l-12.502-28.106-113.536 50.505zM720.236 424.478l116.041 260.86-7.209 69.019h-130.248l-233.736-522.358-245.476 522.358h-133.528l-71.266-742.442h82.462l47.785 562.498 264.047-562.498h43.141l252.85 562.498 15.14-149.939zM761.891 11.915l-6.068 60.094 117.030 263.097 33.757-323.192-144.719 0.001zM621.638 137.007l113.54-50.503 246.486 554.111-113.536 50.506-246.489-554.114z" horiz-adv-x="1017" /> |
|||
</font></defs></svg> |
1128
web/static/editor.md/fonts/fontawesome-webfont.svg
File diff suppressed because it is too large
View File
File diff suppressed because it is too large
View File
@ -1,127 +1,127 @@ |
|||
(function(){ |
|||
var factory = function (exports) { |
|||
var lang = { |
|||
name : "en", |
|||
description : "Open source online Markdown editor.", |
|||
tocTitle : "Table of Contents", |
|||
toolbar : { |
|||
undo : "Undo(Ctrl+Z)", |
|||
redo : "Redo(Ctrl+Y)", |
|||
bold : "Bold", |
|||
del : "Strikethrough", |
|||
italic : "Italic", |
|||
quote : "Block quote", |
|||
ucwords : "Words first letter convert to uppercase", |
|||
uppercase : "Selection text convert to uppercase", |
|||
lowercase : "Selection text convert to lowercase", |
|||
h1 : "Heading 1", |
|||
h2 : "Heading 2", |
|||
h3 : "Heading 3", |
|||
h4 : "Heading 4", |
|||
h5 : "Heading 5", |
|||
h6 : "Heading 6", |
|||
"list-ul" : "Unordered list", |
|||
"list-ol" : "Ordered list", |
|||
hr : "Horizontal rule", |
|||
link : "Link", |
|||
"reference-link" : "Reference link", |
|||
image : "Image", |
|||
code : "Code inline", |
|||
"preformatted-text" : "Preformatted text / Code block (Tab indent)", |
|||
"code-block" : "Code block (Multi-languages)", |
|||
table : "Tables", |
|||
datetime : "Datetime", |
|||
emoji : "Emoji", |
|||
"html-entities" : "HTML Entities", |
|||
pagebreak : "Page break", |
|||
watch : "Unwatch", |
|||
unwatch : "Watch", |
|||
preview : "HTML Preview (Press Shift + ESC exit)", |
|||
fullscreen : "Fullscreen (Press ESC exit)", |
|||
clear : "Clear", |
|||
search : "Search", |
|||
help : "Help", |
|||
info : "About " + exports.title |
|||
}, |
|||
buttons : { |
|||
enter : "Enter", |
|||
cancel : "Cancel", |
|||
close : "Close" |
|||
}, |
|||
dialog : { |
|||
link : { |
|||
title : "Link", |
|||
url : "Address", |
|||
urlTitle : "Title", |
|||
urlEmpty : "Error: Please fill in the link address." |
|||
}, |
|||
referenceLink : { |
|||
title : "Reference link", |
|||
name : "Name", |
|||
url : "Address", |
|||
urlId : "ID", |
|||
urlTitle : "Title", |
|||
nameEmpty: "Error: Reference name can't be empty.", |
|||
idEmpty : "Error: Please fill in reference link id.", |
|||
urlEmpty : "Error: Please fill in reference link url address." |
|||
}, |
|||
image : { |
|||
title : "Image", |
|||
url : "Address", |
|||
link : "Link", |
|||
alt : "Title", |
|||
uploadButton : "Upload", |
|||
imageURLEmpty : "Error: picture url address can't be empty.", |
|||
uploadFileEmpty : "Error: upload pictures cannot be empty!", |
|||
formatNotAllowed : "Error: only allows to upload pictures file, upload allowed image file format:" |
|||
}, |
|||
preformattedText : { |
|||
title : "Preformatted text / Codes", |
|||
emptyAlert : "Error: Please fill in the Preformatted text or content of the codes." |
|||
}, |
|||
codeBlock : { |
|||
title : "Code block", |
|||
selectLabel : "Languages: ", |
|||
selectDefaultText : "select a code language...", |
|||
otherLanguage : "Other languages", |
|||
unselectedLanguageAlert : "Error: Please select the code language.", |
|||
codeEmptyAlert : "Error: Please fill in the code content." |
|||
}, |
|||
htmlEntities : { |
|||
title : "HTML Entities" |
|||
}, |
|||
help : { |
|||
title : "Help" |
|||
} |
|||
} |
|||
}; |
|||
|
|||
exports.defaults.lang = lang; |
|||
}; |
|||
|
|||
// CommonJS/Node.js
|
|||
if (typeof require === "function" && typeof exports === "object" && typeof module === "object") |
|||
{ |
|||
module.exports = factory; |
|||
} |
|||
else if (typeof define === "function") // AMD/CMD/Sea.js
|
|||
{ |
|||
if (define.amd) { // for Require.js
|
|||
|
|||
define(["editormd"], function(editormd) { |
|||
factory(editormd); |
|||
}); |
|||
|
|||
} else { // for Sea.js
|
|||
define(function(require) { |
|||
var editormd = require("../editormd"); |
|||
factory(editormd); |
|||
}); |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
factory(window.editormd); |
|||
} |
|||
|
|||
(function(){ |
|||
var factory = function (exports) { |
|||
var lang = { |
|||
name : "en", |
|||
description : "Open source online Markdown editor.", |
|||
tocTitle : "Table of Contents", |
|||
toolbar : { |
|||
undo : "Undo(Ctrl+Z)", |
|||
redo : "Redo(Ctrl+Y)", |
|||
bold : "Bold", |
|||
del : "Strikethrough", |
|||
italic : "Italic", |
|||
quote : "Block quote", |
|||
ucwords : "Words first letter convert to uppercase", |
|||
uppercase : "Selection text convert to uppercase", |
|||
lowercase : "Selection text convert to lowercase", |
|||
h1 : "Heading 1", |
|||
h2 : "Heading 2", |
|||
h3 : "Heading 3", |
|||
h4 : "Heading 4", |
|||
h5 : "Heading 5", |
|||
h6 : "Heading 6", |
|||
"list-ul" : "Unordered list", |
|||
"list-ol" : "Ordered list", |
|||
hr : "Horizontal rule", |
|||
link : "Link", |
|||
"reference-link" : "Reference link", |
|||
image : "Image", |
|||
code : "Code inline", |
|||
"preformatted-text" : "Preformatted text / Code block (Tab indent)", |
|||
"code-block" : "Code block (Multi-languages)", |
|||
table : "Tables", |
|||
datetime : "Datetime", |
|||
emoji : "Emoji", |
|||
"html-entities" : "HTML Entities", |
|||
pagebreak : "Page break", |
|||
watch : "Unwatch", |
|||
unwatch : "Watch", |
|||
preview : "HTML Preview (Press Shift + ESC exit)", |
|||
fullscreen : "Fullscreen (Press ESC exit)", |
|||
clear : "Clear", |
|||
search : "Search", |
|||
help : "Help", |
|||
info : "About " + exports.title |
|||
}, |
|||
buttons : { |
|||
enter : "Enter", |
|||
cancel : "Cancel", |
|||
close : "Close" |
|||
}, |
|||
dialog : { |
|||
link : { |
|||
title : "Link", |
|||
url : "Address", |
|||
urlTitle : "Title", |
|||
urlEmpty : "Error: Please fill in the link address." |
|||
}, |
|||
referenceLink : { |
|||
title : "Reference link", |
|||
name : "Name", |
|||
url : "Address", |
|||
urlId : "ID", |
|||
urlTitle : "Title", |
|||
nameEmpty: "Error: Reference name can't be empty.", |
|||
idEmpty : "Error: Please fill in reference link id.", |
|||
urlEmpty : "Error: Please fill in reference link url address." |
|||
}, |
|||
image : { |
|||
title : "Image", |
|||
url : "Address", |
|||
link : "Link", |
|||
alt : "Title", |
|||
uploadButton : "Upload", |
|||
imageURLEmpty : "Error: picture url address can't be empty.", |
|||
uploadFileEmpty : "Error: upload pictures cannot be empty!", |
|||
formatNotAllowed : "Error: only allows to upload pictures file, upload allowed image file format:" |
|||
}, |
|||
preformattedText : { |
|||
title : "Preformatted text / Codes", |
|||
emptyAlert : "Error: Please fill in the Preformatted text or content of the codes." |
|||
}, |
|||
codeBlock : { |
|||
title : "Code block", |
|||
selectLabel : "Languages: ", |
|||
selectDefaultText : "select a code language...", |
|||
otherLanguage : "Other languages", |
|||
unselectedLanguageAlert : "Error: Please select the code language.", |
|||
codeEmptyAlert : "Error: Please fill in the code content." |
|||
}, |
|||
htmlEntities : { |
|||
title : "HTML Entities" |
|||
}, |
|||
help : { |
|||
title : "Help" |
|||
} |
|||
} |
|||
}; |
|||
|
|||
exports.defaults.lang = lang; |
|||
}; |
|||
|
|||
// CommonJS/Node.js
|
|||
if (typeof require === "function" && typeof exports === "object" && typeof module === "object") |
|||
{ |
|||
module.exports = factory; |
|||
} |
|||
else if (typeof define === "function") // AMD/CMD/Sea.js
|
|||
{ |
|||
if (define.amd) { // for Require.js
|
|||
|
|||
define(["editormd"], function(editormd) { |
|||
factory(editormd); |
|||
}); |
|||
|
|||
} else { // for Sea.js
|
|||
define(function(require) { |
|||
var editormd = require("../editormd"); |
|||
factory(editormd); |
|||
}); |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
factory(window.editormd); |
|||
} |
|||
|
|||
})(); |
@ -1,127 +1,127 @@ |
|||
(function(){ |
|||
var factory = function (exports) { |
|||
var lang = { |
|||
name : "zh-tw", |
|||
description : "開源在線Markdown編輯器<br/>Open source online Markdown editor.", |
|||
tocTitle : "目錄", |
|||
toolbar : { |
|||
undo : "撤銷(Ctrl+Z)", |
|||
redo : "重做(Ctrl+Y)", |
|||
bold : "粗體", |
|||
del : "刪除線", |
|||
italic : "斜體", |
|||
quote : "引用", |
|||
ucwords : "將所選的每個單詞首字母轉成大寫", |
|||
uppercase : "將所選文本轉成大寫", |
|||
lowercase : "將所選文本轉成小寫", |
|||
h1 : "標題1", |
|||
h2 : "標題2", |
|||
h3 : "標題3", |
|||
h4 : "標題4", |
|||
h5 : "標題5", |
|||
h6 : "標題6", |
|||
"list-ul" : "無序列表", |
|||
"list-ol" : "有序列表", |
|||
hr : "横线", |
|||
link : "链接", |
|||
"reference-link" : "引用鏈接", |
|||
image : "圖片", |
|||
code : "行內代碼", |
|||
"preformatted-text" : "預格式文本 / 代碼塊(縮進風格)", |
|||
"code-block" : "代碼塊(多語言風格)", |
|||
table : "添加表格", |
|||
datetime : "日期時間", |
|||
emoji : "Emoji 表情", |
|||
"html-entities" : "HTML 實體字符", |
|||
pagebreak : "插入分頁符", |
|||
watch : "關閉實時預覽", |
|||
unwatch : "開啟實時預覽", |
|||
preview : "全窗口預覽HTML(按 Shift + ESC 退出)", |
|||
fullscreen : "全屏(按 ESC 退出)", |
|||
clear : "清空", |
|||
search : "搜尋", |
|||
help : "使用幫助", |
|||
info : "關於" + exports.title |
|||
}, |
|||
buttons : { |
|||
enter : "確定", |
|||
cancel : "取消", |
|||
close : "關閉" |
|||
}, |
|||
dialog : { |
|||
link : { |
|||
title : "添加鏈接", |
|||
url : "鏈接地址", |
|||
urlTitle : "鏈接標題", |
|||
urlEmpty : "錯誤:請填寫鏈接地址。" |
|||
}, |
|||
referenceLink : { |
|||
title : "添加引用鏈接", |
|||
name : "引用名稱", |
|||
url : "鏈接地址", |
|||
urlId : "鏈接ID", |
|||
urlTitle : "鏈接標題", |
|||
nameEmpty: "錯誤:引用鏈接的名稱不能為空。", |
|||
idEmpty : "錯誤:請填寫引用鏈接的ID。", |
|||
urlEmpty : "錯誤:請填寫引用鏈接的URL地址。" |
|||
}, |
|||
image : { |
|||
title : "添加圖片", |
|||
url : "圖片地址", |
|||
link : "圖片鏈接", |
|||
alt : "圖片描述", |
|||
uploadButton : "本地上傳", |
|||
imageURLEmpty : "錯誤:圖片地址不能為空。", |
|||
uploadFileEmpty : "錯誤:上傳的圖片不能為空!", |
|||
formatNotAllowed : "錯誤:只允許上傳圖片文件,允許上傳的圖片文件格式有:" |
|||
}, |
|||
preformattedText : { |
|||
title : "添加預格式文本或代碼塊", |
|||
emptyAlert : "錯誤:請填寫預格式文本或代碼的內容。" |
|||
}, |
|||
codeBlock : { |
|||
title : "添加代碼塊", |
|||
selectLabel : "代碼語言:", |
|||
selectDefaultText : "請語言代碼語言", |
|||
otherLanguage : "其他語言", |
|||
unselectedLanguageAlert : "錯誤:請選擇代碼所屬的語言類型。", |
|||
codeEmptyAlert : "錯誤:請填寫代碼內容。" |
|||
}, |
|||
htmlEntities : { |
|||
title : "HTML實體字符" |
|||
}, |
|||
help : { |
|||
title : "使用幫助" |
|||
} |
|||
} |
|||
}; |
|||
|
|||
exports.defaults.lang = lang; |
|||
}; |
|||
|
|||
// CommonJS/Node.js
|
|||
if (typeof require === "function" && typeof exports === "object" && typeof module === "object") |
|||
{ |
|||
module.exports = factory; |
|||
} |
|||
else if (typeof define === "function") // AMD/CMD/Sea.js
|
|||
{ |
|||
if (define.amd) { // for Require.js
|
|||
|
|||
define(["editormd"], function(editormd) { |
|||
factory(editormd); |
|||
}); |
|||
|
|||
} else { // for Sea.js
|
|||
define(function(require) { |
|||
var editormd = require("../editormd"); |
|||
factory(editormd); |
|||
}); |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
factory(window.editormd); |
|||
} |
|||
|
|||
(function(){ |
|||
var factory = function (exports) { |
|||
var lang = { |
|||
name : "zh-tw", |
|||
description : "開源在線Markdown編輯器<br/>Open source online Markdown editor.", |
|||
tocTitle : "目錄", |
|||
toolbar : { |
|||
undo : "撤銷(Ctrl+Z)", |
|||
redo : "重做(Ctrl+Y)", |
|||
bold : "粗體", |
|||
del : "刪除線", |
|||
italic : "斜體", |
|||
quote : "引用", |
|||
ucwords : "將所選的每個單詞首字母轉成大寫", |
|||
uppercase : "將所選文本轉成大寫", |
|||
lowercase : "將所選文本轉成小寫", |
|||
h1 : "標題1", |
|||
h2 : "標題2", |
|||
h3 : "標題3", |
|||
h4 : "標題4", |
|||
h5 : "標題5", |
|||
h6 : "標題6", |
|||
"list-ul" : "無序列表", |
|||
"list-ol" : "有序列表", |
|||
hr : "横线", |
|||
link : "链接", |
|||
"reference-link" : "引用鏈接", |
|||
image : "圖片", |
|||
code : "行內代碼", |
|||
"preformatted-text" : "預格式文本 / 代碼塊(縮進風格)", |
|||
"code-block" : "代碼塊(多語言風格)", |
|||
table : "添加表格", |
|||
datetime : "日期時間", |
|||
emoji : "Emoji 表情", |
|||
"html-entities" : "HTML 實體字符", |
|||
pagebreak : "插入分頁符", |
|||
watch : "關閉實時預覽", |
|||
unwatch : "開啟實時預覽", |
|||
preview : "全窗口預覽HTML(按 Shift + ESC 退出)", |
|||
fullscreen : "全屏(按 ESC 退出)", |
|||
clear : "清空", |
|||
search : "搜尋", |
|||
help : "使用幫助", |
|||
info : "關於" + exports.title |
|||
}, |
|||
buttons : { |
|||
enter : "確定", |
|||
cancel : "取消", |
|||
close : "關閉" |
|||
}, |
|||
dialog : { |
|||
link : { |
|||
title : "添加鏈接", |
|||
url : "鏈接地址", |
|||
urlTitle : "鏈接標題", |
|||
urlEmpty : "錯誤:請填寫鏈接地址。" |
|||
}, |
|||
referenceLink : { |
|||
title : "添加引用鏈接", |
|||
name : "引用名稱", |
|||
url : "鏈接地址", |
|||
urlId : "鏈接ID", |
|||
urlTitle : "鏈接標題", |
|||
nameEmpty: "錯誤:引用鏈接的名稱不能為空。", |
|||
idEmpty : "錯誤:請填寫引用鏈接的ID。", |
|||
urlEmpty : "錯誤:請填寫引用鏈接的URL地址。" |
|||
}, |
|||
image : { |
|||
title : "添加圖片", |
|||
url : "圖片地址", |
|||
link : "圖片鏈接", |
|||
alt : "圖片描述", |
|||
uploadButton : "本地上傳", |
|||
imageURLEmpty : "錯誤:圖片地址不能為空。", |
|||
uploadFileEmpty : "錯誤:上傳的圖片不能為空!", |
|||
formatNotAllowed : "錯誤:只允許上傳圖片文件,允許上傳的圖片文件格式有:" |
|||
}, |
|||
preformattedText : { |
|||
title : "添加預格式文本或代碼塊", |
|||
emptyAlert : "錯誤:請填寫預格式文本或代碼的內容。" |
|||
}, |
|||
codeBlock : { |
|||
title : "添加代碼塊", |
|||
selectLabel : "代碼語言:", |
|||
selectDefaultText : "請語言代碼語言", |
|||
otherLanguage : "其他語言", |
|||
unselectedLanguageAlert : "錯誤:請選擇代碼所屬的語言類型。", |
|||
codeEmptyAlert : "錯誤:請填寫代碼內容。" |
|||
}, |
|||
htmlEntities : { |
|||
title : "HTML實體字符" |
|||
}, |
|||
help : { |
|||
title : "使用幫助" |
|||
} |
|||
} |
|||
}; |
|||
|
|||
exports.defaults.lang = lang; |
|||
}; |
|||
|
|||
// CommonJS/Node.js
|
|||
if (typeof require === "function" && typeof exports === "object" && typeof module === "object") |
|||
{ |
|||
module.exports = factory; |
|||
} |
|||
else if (typeof define === "function") // AMD/CMD/Sea.js
|
|||
{ |
|||
if (define.amd) { // for Require.js
|
|||
|
|||
define(["editormd"], function(editormd) { |
|||
factory(editormd); |
|||
}); |
|||
|
|||
} else { // for Sea.js
|
|||
define(function(require) { |
|||
var editormd = require("../editormd"); |
|||
factory(editormd); |
|||
}); |
|||
} |
|||
} |
|||
else |
|||
{ |
|||
factory(window.editormd); |
|||
} |
|||
|
|||
})(); |
@ -1,436 +1,436 @@ |
|||
List of CodeMirror contributors. Updated before every release. |
|||
|
|||
4r2r |
|||
Aaron Brooks |
|||
Abdelouahab |
|||
Abe Fettig |
|||
Adam Ahmed |
|||
Adam King |
|||
adanlobato |
|||
Adán Lobato |
|||
Adrian Aichner |
|||
aeroson |
|||
Ahmad Amireh |
|||
Ahmad M. Zawawi |
|||
ahoward |
|||
Akeksandr Motsjonov |
|||
Alberto González Palomo |
|||
Alberto Pose |
|||
Albert Xing |
|||
Alexander Pavlov |
|||
Alexander Schepanovski |
|||
Alexander Shvets |
|||
Alexander Solovyov |
|||
Alexandre Bique |
|||
alexey-k |
|||
Alex Piggott |
|||
Aliaksei Chapyzhenka |
|||
Amsul |
|||
amuntean |
|||
Amy |
|||
Ananya Sen |
|||
anaran |
|||
AndersMad |
|||
Anders Nawroth |
|||
Anderson Mesquita |
|||
Andrea G |
|||
Andreas Reischuck |
|||
Andre von Houck |
|||
Andrey Fedorov |
|||
Andrey Klyuchnikov |
|||
Andrey Lushnikov |
|||
Andy Joslin |
|||
Andy Kimball |
|||
Andy Li |
|||
angelozerr |
|||
angelo.zerr@gmail.com |
|||
Ankit |
|||
Ankit Ahuja |
|||
Ansel Santosa |
|||
Anthony Grimes |
|||
Anton Kovalyov |
|||
areos |
|||
as3boyan |
|||
AtomicPages LLC |
|||
Atul Bhouraskar |
|||
Aurelian Oancea |
|||
Bastian Müller |
|||
Bem Jones-Bey |
|||
benbro |
|||
Beni Cherniavsky-Paskin |
|||
Benjamin DeCoste |
|||
Ben Keen |
|||
Bernhard Sirlinger |
|||
Bert Chang |
|||
Billy Moon |
|||
binny |
|||
B Krishna Chaitanya |
|||
Blaine G |
|||
blukat29 |
|||
boomyjee |
|||
borawjm |
|||
Brandon Frohs |
|||
Brandon Wamboldt |
|||
Brett Zamir |
|||
Brian Grinstead |
|||
Brian Sletten |
|||
Bruce Mitchener |
|||
Chandra Sekhar Pydi |
|||
Charles Skelton |
|||
Cheah Chu Yeow |
|||
Chris Coyier |
|||
Chris Granger |
|||
Chris Houseknecht |
|||
Chris Morgan |
|||
Christian Oyarzun |
|||
Christian Petrov |
|||
Christopher Brown |
|||
ciaranj |
|||
CodeAnimal |
|||
ComFreek |
|||
Curtis Gagliardi |
|||
dagsta |
|||
daines |
|||
Dale Jung |
|||
Dan Bentley |
|||
Dan Heberden |
|||
Daniel, Dao Quang Minh |
|||
Daniele Di Sarli |
|||
Daniel Faust |
|||
Daniel Huigens |
|||
Daniel KJ |
|||
Daniel Neel |
|||
Daniel Parnell |
|||
Danny Yoo |
|||
darealshinji |
|||
Darius Roberts |
|||
Dave Myers |
|||
David Mignot |
|||
David Pathakjee |
|||
David Vázquez |
|||
deebugger |
|||
Deep Thought |
|||
Devon Carew |
|||
dignifiedquire |
|||
Dimage Sapelkin |
|||
Dmitry Kiselyov |
|||
domagoj412 |
|||
Dominator008 |
|||
Domizio Demichelis |
|||
Doug Wikle |
|||
Drew Bratcher |
|||
Drew Hintz |
|||
Drew Khoury |
|||
Dror BG |
|||
duralog |
|||
eborden |
|||
edsharp |
|||
ekhaled |
|||
Enam Mijbah Noor |
|||
Eric Allam |
|||
eustas |
|||
Fabien O'Carroll |
|||
Fabio Zendhi Nagao |
|||
Faiza Alsaied |
|||
Fauntleroy |
|||
fbuchinger |
|||
feizhang365 |
|||
Felipe Lalanne |
|||
Felix Raab |
|||
Filip Noetzel |
|||
flack |
|||
ForbesLindesay |
|||
Forbes Lindesay |
|||
Ford_Lawnmower |
|||
Forrest Oliphant |
|||
Frank Wiegand |
|||
Gabriel Gheorghian |
|||
Gabriel Horner |
|||
Gabriel Nahmias |
|||
galambalazs |
|||
Gautam Mehta |
|||
gekkoe |
|||
Gerard Braad |
|||
Gergely Hegykozi |
|||
Giovanni Calò |
|||
Glenn Jorde |
|||
Glenn Ruehle |
|||
Golevka |
|||
Gordon Smith |
|||
Grant Skinner |
|||
greengiant |
|||
Gregory Koberger |
|||
Guillaume Massé |
|||
Guillaume Massé |
|||
Gustavo Rodrigues |
|||
Hakan Tunc |
|||
Hans Engel |
|||
Hardest |
|||
Hasan Karahan |
|||
Herculano Campos |
|||
Hiroyuki Makino |
|||
hitsthings |
|||
Hocdoc |
|||
Ian Beck |
|||
Ian Dickinson |
|||
Ian Wehrman |
|||
Ian Wetherbee |
|||
Ice White |
|||
ICHIKAWA, Yuji |
|||
ilvalle |
|||
Ingo Richter |
|||
Irakli Gozalishvili |
|||
Ivan Kurnosov |
|||
Jacob Lee |
|||
Jakob Miland |
|||
Jakub Vrana |
|||
Jakub Vrána |
|||
James Campos |
|||
James Thorne |
|||
Jamie Hill |
|||
Jan Jongboom |
|||
jankeromnes |
|||
Jan Keromnes |
|||
Jan Odvarko |
|||
Jan T. Sott |
|||
Jared Forsyth |
|||
Jason |
|||
Jason Barnabe |
|||
Jason Grout |
|||
Jason Johnston |
|||
Jason San Jose |
|||
Jason Siefken |
|||
Jaydeep Solanki |
|||
Jean Boussier |
|||
jeffkenton |
|||
Jeff Pickhardt |
|||
jem (graphite) |
|||
Jeremy Parmenter |
|||
Jochen Berger |
|||
Johan Ask |
|||
John Connor |
|||
John Lees-Miller |
|||
John Snelson |
|||
John Van Der Loo |
|||
Jonathan Malmaud |
|||
jongalloway |
|||
Jon Malmaud |
|||
Jon Sangster |
|||
Joost-Wim Boekesteijn |
|||
Joseph Pecoraro |
|||
Joshua Newman |
|||
Josh Watzman |
|||
jots |
|||
jsoojeon |
|||
Juan Benavides Romero |
|||
Jucovschi Constantin |
|||
Juho Vuori |
|||
Justin Hileman |
|||
jwallers@gmail.com |
|||
kaniga |
|||
Ken Newman |
|||
Ken Rockot |
|||
Kevin Sawicki |
|||
Kevin Ushey |
|||
Klaus Silveira |
|||
Koh Zi Han, Cliff |
|||
komakino |
|||
Konstantin Lopuhin |
|||
koops |
|||
ks-ifware |
|||
kubelsmieci |
|||
KwanEsq |
|||
Lanfei |
|||
Lanny |
|||
Laszlo Vidacs |
|||
leaf corcoran |
|||
Leonid Khachaturov |
|||
Leon Sorokin |
|||
Leonya Khachaturov |
|||
Liam Newman |
|||
LM |
|||
lochel |
|||
Lorenzo Stoakes |
|||
Luciano Longo |
|||
Luke Stagner |
|||
lynschinzer |
|||
Maksim Lin |
|||
Maksym Taran |
|||
Malay Majithia |
|||
Manuel Rego Casasnovas |
|||
Marat Dreizin |
|||
Marcel Gerber |
|||
Marco Aurélio |
|||
Marco Munizaga |
|||
Marcus Bointon |
|||
Marek Rudnicki |
|||
Marijn Haverbeke |
|||
Mário Gonçalves |
|||
Mario Pietsch |
|||
Mark Lentczner |
|||
Marko Bonaci |
|||
Martin Balek |
|||
Martín Gaitán |
|||
Martin Hasoň |
|||
Mason Malone |
|||
Mateusz Paprocki |
|||
Mathias Bynens |
|||
mats cronqvist |
|||
Matthew Beale |
|||
Matthias Bussonnier |
|||
Matthias BUSSONNIER |
|||
Matt McDonald |
|||
Matt Pass |
|||
Matt Sacks |
|||
mauricio |
|||
Maximilian Hils |
|||
Maxim Kraev |
|||
Max Kirsch |
|||
Max Xiantu |
|||
mbarkhau |
|||
Metatheos |
|||
Micah Dubinko |
|||
Michael Lehenbauer |
|||
Michael Zhou |
|||
Mighty Guava |
|||
Miguel Castillo |
|||
mihailik |
|||
Mike |
|||
Mike Brevoort |
|||
Mike Diaz |
|||
Mike Ivanov |
|||
Mike Kadin |
|||
MinRK |
|||
Miraculix87 |
|||
misfo |
|||
mloginov |
|||
Moritz Schwörer |
|||
mps |
|||
mtaran-google |
|||
Narciso Jaramillo |
|||
Nathan Williams |
|||
ndr |
|||
nerbert |
|||
nextrevision |
|||
ngn |
|||
nguillaumin |
|||
Ng Zhi An |
|||
Nicholas Bollweg |
|||
Nicholas Bollweg (Nick) |
|||
Nick Small |
|||
Niels van Groningen |
|||
nightwing |
|||
Nikita Beloglazov |
|||
Nikita Vasilyev |
|||
Nikolay Kostov |
|||
nilp0inter |
|||
Nisarg Jhaveri |
|||
nlwillia |
|||
Norman Rzepka |
|||
pablo |
|||
Page |
|||
Panupong Pasupat |
|||
paris |
|||
Patil Arpith |
|||
Patrick Stoica |
|||
Patrick Strawderman |
|||
Paul Garvin |
|||
Paul Ivanov |
|||
Pavel Feldman |
|||
Pavel Strashkin |
|||
Paweł Bartkiewicz |
|||
peteguhl |
|||
Peter Flynn |
|||
peterkroon |
|||
Peter Kroon |
|||
prasanthj |
|||
Prasanth J |
|||
Radek Piórkowski |
|||
Rahul |
|||
Randall Mason |
|||
Randy Burden |
|||
Randy Edmunds |
|||
Rasmus Erik Voel Jensen |
|||
Ray Ratchup |
|||
Richard van der Meer |
|||
Richard Z.H. Wang |
|||
Robert Crossfield |
|||
Roberto Abdelkader Martínez Pérez |
|||
robertop23 |
|||
Robert Plummer |
|||
Ruslan Osmanov |
|||
Ryan Prior |
|||
sabaca |
|||
Samuel Ainsworth |
|||
sandeepshetty |
|||
Sander AKA Redsandro |
|||
santec |
|||
Sascha Peilicke |
|||
satchmorun |
|||
sathyamoorthi |
|||
SCLINIC\jdecker |
|||
Scott Aikin |
|||
Scott Goodhew |
|||
Sebastian Zaha |
|||
shaund |
|||
shaun gilchrist |
|||
Shawn A |
|||
sheopory |
|||
Shiv Deepak |
|||
Shmuel Englard |
|||
Shubham Jain |
|||
silverwind |
|||
snasa |
|||
soliton4 |
|||
sonson |
|||
spastorelli |
|||
srajanpaliwal |
|||
Stanislav Oaserele |
|||
Stas Kobzar |
|||
Stefan Borsje |
|||
Steffen Beyer |
|||
Steve O'Hara |
|||
stoskov |
|||
Taha Jahangir |
|||
Takuji Shimokawa |
|||
Tarmil |
|||
tel |
|||
tfjgeorge |
|||
Thaddee Tyl |
|||
TheHowl |
|||
think |
|||
Thomas Dvornik |
|||
Thomas Schmid |
|||
Tim Alby |
|||
Tim Baumann |
|||
Timothy Farrell |
|||
Timothy Hatcher |
|||
TobiasBg |
|||
Tomas-A |
|||
Tomas Varaneckas |
|||
Tom Erik Støwer |
|||
Tom MacWright |
|||
Tony Jian |
|||
Travis Heppe |
|||
Triangle717 |
|||
twifkak |
|||
Vestimir Markov |
|||
vf |
|||
Vincent Woo |
|||
Volker Mische |
|||
wenli |
|||
Wesley Wiser |
|||
Will Binns-Smith |
|||
William Jamieson |
|||
William Stein |
|||
Willy |
|||
Wojtek Ptak |
|||
Xavier Mendez |
|||
Yassin N. Hassan |
|||
YNH Webdev |
|||
Yunchi Luo |
|||
Yuvi Panda |
|||
Zachary Dremann |
|||
Zhang Hao |
|||
zziuni |
|||
魏鹏刚 |
|||
List of CodeMirror contributors. Updated before every release. |
|||
|
|||
4r2r |
|||
Aaron Brooks |
|||
Abdelouahab |
|||
Abe Fettig |
|||
Adam Ahmed |
|||
Adam King |
|||
adanlobato |
|||
Adán Lobato |
|||
Adrian Aichner |
|||
aeroson |
|||
Ahmad Amireh |
|||
Ahmad M. Zawawi |
|||
ahoward |
|||
Akeksandr Motsjonov |
|||
Alberto González Palomo |
|||
Alberto Pose |
|||
Albert Xing |
|||
Alexander Pavlov |
|||
Alexander Schepanovski |
|||
Alexander Shvets |
|||
Alexander Solovyov |
|||
Alexandre Bique |
|||
alexey-k |
|||
Alex Piggott |
|||
Aliaksei Chapyzhenka |
|||
Amsul |
|||
amuntean |
|||
Amy |
|||
Ananya Sen |
|||
anaran |
|||
AndersMad |
|||
Anders Nawroth |
|||
Anderson Mesquita |
|||
Andrea G |
|||
Andreas Reischuck |
|||
Andre von Houck |
|||
Andrey Fedorov |
|||
Andrey Klyuchnikov |
|||
Andrey Lushnikov |
|||
Andy Joslin |
|||
Andy Kimball |
|||
Andy Li |
|||
angelozerr |
|||
angelo.zerr@gmail.com |
|||
Ankit |
|||
Ankit Ahuja |
|||
Ansel Santosa |
|||
Anthony Grimes |
|||
Anton Kovalyov |
|||
areos |
|||
as3boyan |
|||
AtomicPages LLC |
|||
Atul Bhouraskar |
|||
Aurelian Oancea |
|||
Bastian Müller |
|||
Bem Jones-Bey |
|||
benbro |
|||
Beni Cherniavsky-Paskin |
|||
Benjamin DeCoste |
|||
Ben Keen |
|||
Bernhard Sirlinger |
|||
Bert Chang |
|||
Billy Moon |
|||
binny |
|||
B Krishna Chaitanya |
|||
Blaine G |
|||
blukat29 |
|||
boomyjee |
|||
borawjm |
|||
Brandon Frohs |
|||
Brandon Wamboldt |
|||
Brett Zamir |
|||
Brian Grinstead |
|||
Brian Sletten |
|||
Bruce Mitchener |
|||
Chandra Sekhar Pydi |
|||
Charles Skelton |
|||
Cheah Chu Yeow |
|||
Chris Coyier |
|||
Chris Granger |
|||
Chris Houseknecht |
|||
Chris Morgan |
|||
Christian Oyarzun |
|||
Christian Petrov |
|||
Christopher Brown |
|||
ciaranj |
|||
CodeAnimal |
|||
ComFreek |
|||
Curtis Gagliardi |
|||
dagsta |
|||
daines |
|||
Dale Jung |
|||
Dan Bentley |
|||
Dan Heberden |
|||
Daniel, Dao Quang Minh |
|||
Daniele Di Sarli |
|||
Daniel Faust |
|||
Daniel Huigens |
|||
Daniel KJ |
|||
Daniel Neel |
|||
Daniel Parnell |
|||
Danny Yoo |
|||
darealshinji |
|||
Darius Roberts |
|||
Dave Myers |
|||
David Mignot |
|||
David Pathakjee |
|||
David Vázquez |
|||
deebugger |
|||
Deep Thought |
|||
Devon Carew |
|||
dignifiedquire |
|||
Dimage Sapelkin |
|||
Dmitry Kiselyov |
|||
domagoj412 |
|||
Dominator008 |
|||
Domizio Demichelis |
|||
Doug Wikle |
|||
Drew Bratcher |
|||
Drew Hintz |
|||
Drew Khoury |
|||
Dror BG |
|||
duralog |
|||
eborden |
|||
edsharp |
|||
ekhaled |
|||
Enam Mijbah Noor |
|||
Eric Allam |
|||
eustas |
|||
Fabien O'Carroll |
|||
Fabio Zendhi Nagao |
|||
Faiza Alsaied |
|||
Fauntleroy |
|||
fbuchinger |
|||
feizhang365 |
|||
Felipe Lalanne |
|||
Felix Raab |
|||
Filip Noetzel |
|||
flack |
|||
ForbesLindesay |
|||
Forbes Lindesay |
|||
Ford_Lawnmower |
|||
Forrest Oliphant |
|||
Frank Wiegand |
|||
Gabriel Gheorghian |
|||
Gabriel Horner |
|||
Gabriel Nahmias |
|||
galambalazs |
|||
Gautam Mehta |
|||
gekkoe |
|||
Gerard Braad |
|||
Gergely Hegykozi |
|||
Giovanni Calò |
|||
Glenn Jorde |
|||
Glenn Ruehle |
|||
Golevka |
|||
Gordon Smith |
|||
Grant Skinner |
|||
greengiant |
|||
Gregory Koberger |
|||
Guillaume Massé |
|||
Guillaume Massé |
|||
Gustavo Rodrigues |
|||
Hakan Tunc |
|||
Hans Engel |
|||
Hardest |
|||
Hasan Karahan |
|||
Herculano Campos |
|||
Hiroyuki Makino |
|||
hitsthings |
|||
Hocdoc |
|||
Ian Beck |
|||
Ian Dickinson |
|||
Ian Wehrman |
|||
Ian Wetherbee |
|||
Ice White |
|||
ICHIKAWA, Yuji |
|||
ilvalle |
|||
Ingo Richter |
|||
Irakli Gozalishvili |
|||
Ivan Kurnosov |
|||
Jacob Lee |
|||
Jakob Miland |
|||
Jakub Vrana |
|||
Jakub Vrána |
|||
James Campos |
|||
James Thorne |
|||
Jamie Hill |
|||
Jan Jongboom |
|||
jankeromnes |
|||
Jan Keromnes |
|||
Jan Odvarko |
|||
Jan T. Sott |
|||
Jared Forsyth |
|||
Jason |
|||
Jason Barnabe |
|||
Jason Grout |
|||
Jason Johnston |
|||
Jason San Jose |
|||
Jason Siefken |
|||
Jaydeep Solanki |
|||
Jean Boussier |
|||
jeffkenton |
|||
Jeff Pickhardt |
|||
jem (graphite) |
|||
Jeremy Parmenter |
|||
Jochen Berger |
|||
Johan Ask |
|||
John Connor |
|||
John Lees-Miller |
|||
John Snelson |
|||
John Van Der Loo |
|||
Jonathan Malmaud |
|||
jongalloway |
|||
Jon Malmaud |
|||
Jon Sangster |
|||
Joost-Wim Boekesteijn |
|||
Joseph Pecoraro |
|||
Joshua Newman |
|||
Josh Watzman |
|||
jots |
|||
jsoojeon |
|||
Juan Benavides Romero |
|||
Jucovschi Constantin |
|||
Juho Vuori |
|||
Justin Hileman |
|||
jwallers@gmail.com |
|||
kaniga |
|||
Ken Newman |
|||
Ken Rockot |
|||
Kevin Sawicki |
|||
Kevin Ushey |
|||
Klaus Silveira |
|||
Koh Zi Han, Cliff |
|||
komakino |
|||
Konstantin Lopuhin |
|||
koops |
|||
ks-ifware |
|||
kubelsmieci |
|||
KwanEsq |
|||
Lanfei |
|||
Lanny |
|||
Laszlo Vidacs |
|||
leaf corcoran |
|||
Leonid Khachaturov |
|||
Leon Sorokin |
|||
Leonya Khachaturov |
|||
Liam Newman |
|||
LM |
|||
lochel |
|||
Lorenzo Stoakes |
|||
Luciano Longo |
|||
Luke Stagner |
|||
lynschinzer |
|||
Maksim Lin |
|||
Maksym Taran |
|||
Malay Majithia |
|||
Manuel Rego Casasnovas |
|||
Marat Dreizin |
|||
Marcel Gerber |
|||
Marco Aurélio |
|||
Marco Munizaga |
|||
Marcus Bointon |
|||
Marek Rudnicki |
|||
Marijn Haverbeke |
|||
Mário Gonçalves |
|||
Mario Pietsch |
|||
Mark Lentczner |
|||
Marko Bonaci |
|||
Martin Balek |
|||
Martín Gaitán |
|||
Martin Hasoň |
|||
Mason Malone |
|||
Mateusz Paprocki |
|||
Mathias Bynens |
|||
mats cronqvist |
|||
Matthew Beale |
|||
Matthias Bussonnier |
|||
Matthias BUSSONNIER |
|||
Matt McDonald |
|||
Matt Pass |
|||
Matt Sacks |
|||
mauricio |
|||
Maximilian Hils |
|||
Maxim Kraev |
|||
Max Kirsch |
|||
Max Xiantu |
|||
mbarkhau |
|||
Metatheos |
|||
Micah Dubinko |
|||
Michael Lehenbauer |
|||
Michael Zhou |
|||
Mighty Guava |
|||
Miguel Castillo |
|||
mihailik |
|||
Mike |
|||
Mike Brevoort |
|||
Mike Diaz |
|||
Mike Ivanov |
|||
Mike Kadin |
|||
MinRK |
|||
Miraculix87 |
|||
misfo |
|||
mloginov |
|||
Moritz Schwörer |
|||
mps |
|||
mtaran-google |
|||
Narciso Jaramillo |
|||
Nathan Williams |
|||
ndr |
|||
nerbert |
|||
nextrevision |
|||
ngn |
|||
nguillaumin |
|||
Ng Zhi An |
|||
Nicholas Bollweg |
|||
Nicholas Bollweg (Nick) |
|||
Nick Small |
|||
Niels van Groningen |
|||
nightwing |
|||
Nikita Beloglazov |
|||
Nikita Vasilyev |
|||
Nikolay Kostov |
|||
nilp0inter |
|||
Nisarg Jhaveri |
|||
nlwillia |
|||
Norman Rzepka |
|||
pablo |
|||
Page |
|||
Panupong Pasupat |
|||
paris |
|||
Patil Arpith |
|||
Patrick Stoica |
|||
Patrick Strawderman |
|||
Paul Garvin |
|||
Paul Ivanov |
|||
Pavel Feldman |
|||
Pavel Strashkin |
|||
Paweł Bartkiewicz |
|||
peteguhl |
|||
Peter Flynn |
|||
peterkroon |
|||
Peter Kroon |
|||
prasanthj |
|||
Prasanth J |
|||
Radek Piórkowski |
|||
Rahul |
|||
Randall Mason |
|||
Randy Burden |
|||
Randy Edmunds |
|||
Rasmus Erik Voel Jensen |
|||
Ray Ratchup |
|||
Richard van der Meer |
|||
Richard Z.H. Wang |
|||
Robert Crossfield |
|||
Roberto Abdelkader Martínez Pérez |
|||
robertop23 |
|||
Robert Plummer |
|||
Ruslan Osmanov |
|||
Ryan Prior |
|||
sabaca |
|||
Samuel Ainsworth |
|||
sandeepshetty |
|||
Sander AKA Redsandro |
|||
santec |
|||
Sascha Peilicke |
|||
satchmorun |
|||
sathyamoorthi |
|||
SCLINIC\jdecker |
|||
Scott Aikin |
|||
Scott Goodhew |
|||
Sebastian Zaha |
|||
shaund |
|||
shaun gilchrist |
|||
Shawn A |
|||
sheopory |
|||
Shiv Deepak |
|||
Shmuel Englard |
|||
Shubham Jain |
|||
silverwind |
|||
snasa |
|||
soliton4 |
|||
sonson |
|||
spastorelli |
|||
srajanpaliwal |
|||
Stanislav Oaserele |
|||
Stas Kobzar |
|||
Stefan Borsje |
|||
Steffen Beyer |
|||
Steve O'Hara |
|||
stoskov |
|||
Taha Jahangir |
|||
Takuji Shimokawa |
|||
Tarmil |
|||
tel |
|||
tfjgeorge |
|||
Thaddee Tyl |
|||
TheHowl |
|||
think |
|||
Thomas Dvornik |
|||
Thomas Schmid |
|||
Tim Alby |
|||
Tim Baumann |
|||
Timothy Farrell |
|||
Timothy Hatcher |
|||
TobiasBg |
|||
Tomas-A |
|||
Tomas Varaneckas |
|||
Tom Erik Støwer |
|||
Tom MacWright |
|||
Tony Jian |
|||
Travis Heppe |
|||
Triangle717 |
|||
twifkak |
|||
Vestimir Markov |
|||
vf |
|||
Vincent Woo |
|||
Volker Mische |
|||
wenli |
|||
Wesley Wiser |
|||
Will Binns-Smith |
|||
William Jamieson |
|||
William Stein |
|||
Willy |
|||
Wojtek Ptak |
|||
Xavier Mendez |
|||
Yassin N. Hassan |
|||
YNH Webdev |
|||
Yunchi Luo |
|||
Yuvi Panda |
|||
Zachary Dremann |
|||
Zhang Hao |
|||
zziuni |
|||
魏鹏刚 |
@ -1,19 +1,19 @@ |
|||
Copyright (C) 2014 by Marijn Haverbeke <marijnh@gmail.com> and others |
|||
|
|||
Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
of this software and associated documentation files (the "Software"), to deal |
|||
in the Software without restriction, including without limitation the rights |
|||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
copies of the Software, and to permit persons to whom the Software is |
|||
furnished to do so, subject to the following conditions: |
|||
|
|||
The above copyright notice and this permission notice shall be included in |
|||
all copies or substantial portions of the Software. |
|||
|
|||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
THE SOFTWARE. |
|||
Copyright (C) 2014 by Marijn Haverbeke <marijnh@gmail.com> and others |
|||
|
|||
Permission is hereby granted, free of charge, to any person obtaining a copy |
|||
of this software and associated documentation files (the "Software"), to deal |
|||
in the Software without restriction, including without limitation the rights |
|||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
|||
copies of the Software, and to permit persons to whom the Software is |
|||
furnished to do so, subject to the following conditions: |
|||
|
|||
The above copyright notice and this permission notice shall be included in |
|||
all copies or substantial portions of the Software. |
|||
|
|||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
|||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
|||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
|||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
|||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
|||
THE SOFTWARE. |
@ -1,12 +1,12 @@ |
|||
# CodeMirror |
|||
[](https://travis-ci.org/codemirror/CodeMirror) |
|||
[](https://www.npmjs.org/package/codemirror) |
|||
[Funding status: ](https://marijnhaverbeke.nl/fund/) |
|||
|
|||
CodeMirror is a JavaScript component that provides a code editor in |
|||
the browser. When a mode is available for the language you are coding |
|||
in, it will color your code, and optionally help with indentation. |
|||
|
|||
The project page is http://codemirror.net |
|||
The manual is at http://codemirror.net/doc/manual.html |
|||
The contributing guidelines are in [CONTRIBUTING.md](https://github.com/codemirror/CodeMirror/blob/master/CONTRIBUTING.md) |
|||
# CodeMirror |
|||
[](https://travis-ci.org/codemirror/CodeMirror) |
|||
[](https://www.npmjs.org/package/codemirror) |
|||
[Funding status: ](https://marijnhaverbeke.nl/fund/) |
|||
|
|||
CodeMirror is a JavaScript component that provides a code editor in |
|||
the browser. When a mode is available for the language you are coding |
|||
in, it will color your code, and optionally help with indentation. |
|||
|
|||
The project page is http://codemirror.net |
|||
The manual is at http://codemirror.net/doc/manual.html |
|||
The contributing guidelines are in [CONTRIBUTING.md](https://github.com/codemirror/CodeMirror/blob/master/CONTRIBUTING.md) |
@ -1,183 +1,183 @@ |
|||
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
|||
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
|||
|
|||
(function(mod) { |
|||
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
|||
mod(require("../../lib/codemirror")); |
|||
else if (typeof define == "function" && define.amd) // AMD
|
|||
define(["../../lib/codemirror"], mod); |
|||
else // Plain browser env
|
|||
mod(CodeMirror); |
|||
})(function(CodeMirror) { |
|||
"use strict"; |
|||
|
|||
var noOptions = {}; |
|||
var nonWS = /[^\s\u00a0]/; |
|||
var Pos = CodeMirror.Pos; |
|||
|
|||
function firstNonWS(str) { |
|||
var found = str.search(nonWS); |
|||
return found == -1 ? 0 : found; |
|||
} |
|||
|
|||
CodeMirror.commands.toggleComment = function(cm) { |
|||
var minLine = Infinity, ranges = cm.listSelections(), mode = null; |
|||
for (var i = ranges.length - 1; i >= 0; i--) { |
|||
var from = ranges[i].from(), to = ranges[i].to(); |
|||
if (from.line >= minLine) continue; |
|||
if (to.line >= minLine) to = Pos(minLine, 0); |
|||
minLine = from.line; |
|||
if (mode == null) { |
|||
if (cm.uncomment(from, to)) mode = "un"; |
|||
else { cm.lineComment(from, to); mode = "line"; } |
|||
} else if (mode == "un") { |
|||
cm.uncomment(from, to); |
|||
} else { |
|||
cm.lineComment(from, to); |
|||
} |
|||
} |
|||
}; |
|||
|
|||
CodeMirror.defineExtension("lineComment", function(from, to, options) { |
|||
if (!options) options = noOptions; |
|||
var self = this, mode = self.getModeAt(from); |
|||
var commentString = options.lineComment || mode.lineComment; |
|||
if (!commentString) { |
|||
if (options.blockCommentStart || mode.blockCommentStart) { |
|||
options.fullLines = true; |
|||
self.blockComment(from, to, options); |
|||
} |
|||
return; |
|||
} |
|||
var firstLine = self.getLine(from.line); |
|||
if (firstLine == null) return; |
|||
var end = Math.min(to.ch != 0 || to.line == from.line ? to.line + 1 : to.line, self.lastLine() + 1); |
|||
var pad = options.padding == null ? " " : options.padding; |
|||
var blankLines = options.commentBlankLines || from.line == to.line; |
|||
|
|||
self.operation(function() { |
|||
if (options.indent) { |
|||
var baseString = firstLine.slice(0, firstNonWS(firstLine)); |
|||
for (var i = from.line; i < end; ++i) { |
|||
var line = self.getLine(i), cut = baseString.length; |
|||
if (!blankLines && !nonWS.test(line)) continue; |
|||
if (line.slice(0, cut) != baseString) cut = firstNonWS(line); |
|||
self.replaceRange(baseString + commentString + pad, Pos(i, 0), Pos(i, cut)); |
|||
} |
|||
} else { |
|||
for (var i = from.line; i < end; ++i) { |
|||
if (blankLines || nonWS.test(self.getLine(i))) |
|||
self.replaceRange(commentString + pad, Pos(i, 0)); |
|||
} |
|||
} |
|||
}); |
|||
}); |
|||
|
|||
CodeMirror.defineExtension("blockComment", function(from, to, options) { |
|||
if (!options) options = noOptions; |
|||
var self = this, mode = self.getModeAt(from); |
|||
var startString = options.blockCommentStart || mode.blockCommentStart; |
|||
var endString = options.blockCommentEnd || mode.blockCommentEnd; |
|||
if (!startString || !endString) { |
|||
if ((options.lineComment || mode.lineComment) && options.fullLines != false) |
|||
self.lineComment(from, to, options); |
|||
return; |
|||
} |
|||
|
|||
var end = Math.min(to.line, self.lastLine()); |
|||
if (end != from.line && to.ch == 0 && nonWS.test(self.getLine(end))) --end; |
|||
|
|||
var pad = options.padding == null ? " " : options.padding; |
|||
if (from.line > end) return; |
|||
|
|||
self.operation(function() { |
|||
if (options.fullLines != false) { |
|||
var lastLineHasText = nonWS.test(self.getLine(end)); |
|||
self.replaceRange(pad + endString, Pos(end)); |
|||
self.replaceRange(startString + pad, Pos(from.line, 0)); |
|||
var lead = options.blockCommentLead || mode.blockCommentLead; |
|||
if (lead != null) for (var i = from.line + 1; i <= end; ++i) |
|||
if (i != end || lastLineHasText) |
|||
self.replaceRange(lead + pad, Pos(i, 0)); |
|||
} else { |
|||
self.replaceRange(endString, to); |
|||
self.replaceRange(startString, from); |
|||
} |
|||
}); |
|||
}); |
|||
|
|||
CodeMirror.defineExtension("uncomment", function(from, to, options) { |
|||
if (!options) options = noOptions; |
|||
var self = this, mode = self.getModeAt(from); |
|||
var end = Math.min(to.ch != 0 || to.line == from.line ? to.line : to.line - 1, self.lastLine()), start = Math.min(from.line, end); |
|||
|
|||
// Try finding line comments
|
|||
var lineString = options.lineComment || mode.lineComment, lines = []; |
|||
var pad = options.padding == null ? " " : options.padding, didSomething; |
|||
lineComment: { |
|||
if (!lineString) break lineComment; |
|||
for (var i = start; i <= end; ++i) { |
|||
var line = self.getLine(i); |
|||
var found = line.indexOf(lineString); |
|||
if (found > -1 && !/comment/.test(self.getTokenTypeAt(Pos(i, found + 1)))) found = -1; |
|||
if (found == -1 && (i != end || i == start) && nonWS.test(line)) break lineComment; |
|||
if (found > -1 && nonWS.test(line.slice(0, found))) break lineComment; |
|||
lines.push(line); |
|||
} |
|||
self.operation(function() { |
|||
for (var i = start; i <= end; ++i) { |
|||
var line = lines[i - start]; |
|||
var pos = line.indexOf(lineString), endPos = pos + lineString.length; |
|||
if (pos < 0) continue; |
|||
if (line.slice(endPos, endPos + pad.length) == pad) endPos += pad.length; |
|||
didSomething = true; |
|||
self.replaceRange("", Pos(i, pos), Pos(i, endPos)); |
|||
} |
|||
}); |
|||
if (didSomething) return true; |
|||
} |
|||
|
|||
// Try block comments
|
|||
var startString = options.blockCommentStart || mode.blockCommentStart; |
|||
var endString = options.blockCommentEnd || mode.blockCommentEnd; |
|||
if (!startString || !endString) return false; |
|||
var lead = options.blockCommentLead || mode.blockCommentLead; |
|||
var startLine = self.getLine(start), endLine = end == start ? startLine : self.getLine(end); |
|||
var open = startLine.indexOf(startString), close = endLine.lastIndexOf(endString); |
|||
if (close == -1 && start != end) { |
|||
endLine = self.getLine(--end); |
|||
close = endLine.lastIndexOf(endString); |
|||
} |
|||
if (open == -1 || close == -1 || |
|||
!/comment/.test(self.getTokenTypeAt(Pos(start, open + 1))) || |
|||
!/comment/.test(self.getTokenTypeAt(Pos(end, close + 1)))) |
|||
return false; |
|||
|
|||
// Avoid killing block comments completely outside the selection.
|
|||
// Positions of the last startString before the start of the selection, and the first endString after it.
|
|||
var lastStart = startLine.lastIndexOf(startString, from.ch); |
|||
var firstEnd = lastStart == -1 ? -1 : startLine.slice(0, from.ch).indexOf(endString, lastStart + startString.length); |
|||
if (lastStart != -1 && firstEnd != -1 && firstEnd + endString.length != from.ch) return false; |
|||
// Positions of the first endString after the end of the selection, and the last startString before it.
|
|||
firstEnd = endLine.indexOf(endString, to.ch); |
|||
var almostLastStart = endLine.slice(to.ch).lastIndexOf(startString, firstEnd - to.ch); |
|||
lastStart = (firstEnd == -1 || almostLastStart == -1) ? -1 : to.ch + almostLastStart; |
|||
if (firstEnd != -1 && lastStart != -1 && lastStart != to.ch) return false; |
|||
|
|||
self.operation(function() { |
|||
self.replaceRange("", Pos(end, close - (pad && endLine.slice(close - pad.length, close) == pad ? pad.length : 0)), |
|||
Pos(end, close + endString.length)); |
|||
var openEnd = open + startString.length; |
|||
if (pad && startLine.slice(openEnd, openEnd + pad.length) == pad) openEnd += pad.length; |
|||
self.replaceRange("", Pos(start, open), Pos(start, openEnd)); |
|||
if (lead) for (var i = start + 1; i <= end; ++i) { |
|||
var line = self.getLine(i), found = line.indexOf(lead); |
|||
if (found == -1 || nonWS.test(line.slice(0, found))) continue; |
|||
var foundEnd = found + lead.length; |
|||
if (pad && line.slice(foundEnd, foundEnd + pad.length) == pad) foundEnd += pad.length; |
|||
self.replaceRange("", Pos(i, found), Pos(i, foundEnd)); |
|||
} |
|||
}); |
|||
return true; |
|||
}); |
|||
}); |
|||
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
|||
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
|||
|
|||
(function(mod) { |
|||
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
|||
mod(require("../../lib/codemirror")); |
|||
else if (typeof define == "function" && define.amd) // AMD
|
|||
define(["../../lib/codemirror"], mod); |
|||
else // Plain browser env
|
|||
mod(CodeMirror); |
|||
})(function(CodeMirror) { |
|||
"use strict"; |
|||
|
|||
var noOptions = {}; |
|||
var nonWS = /[^\s\u00a0]/; |
|||
var Pos = CodeMirror.Pos; |
|||
|
|||
function firstNonWS(str) { |
|||
var found = str.search(nonWS); |
|||
return found == -1 ? 0 : found; |
|||
} |
|||
|
|||
CodeMirror.commands.toggleComment = function(cm) { |
|||
var minLine = Infinity, ranges = cm.listSelections(), mode = null; |
|||
for (var i = ranges.length - 1; i >= 0; i--) { |
|||
var from = ranges[i].from(), to = ranges[i].to(); |
|||
if (from.line >= minLine) continue; |
|||
if (to.line >= minLine) to = Pos(minLine, 0); |
|||
minLine = from.line; |
|||
if (mode == null) { |
|||
if (cm.uncomment(from, to)) mode = "un"; |
|||
else { cm.lineComment(from, to); mode = "line"; } |
|||
} else if (mode == "un") { |
|||
cm.uncomment(from, to); |
|||
} else { |
|||
cm.lineComment(from, to); |
|||
} |
|||
} |
|||
}; |
|||
|
|||
CodeMirror.defineExtension("lineComment", function(from, to, options) { |
|||
if (!options) options = noOptions; |
|||
var self = this, mode = self.getModeAt(from); |
|||
var commentString = options.lineComment || mode.lineComment; |
|||
if (!commentString) { |
|||
if (options.blockCommentStart || mode.blockCommentStart) { |
|||
options.fullLines = true; |
|||
self.blockComment(from, to, options); |
|||
} |
|||
return; |
|||
} |
|||
var firstLine = self.getLine(from.line); |
|||
if (firstLine == null) return; |
|||
var end = Math.min(to.ch != 0 || to.line == from.line ? to.line + 1 : to.line, self.lastLine() + 1); |
|||
var pad = options.padding == null ? " " : options.padding; |
|||
var blankLines = options.commentBlankLines || from.line == to.line; |
|||
|
|||
self.operation(function() { |
|||
if (options.indent) { |
|||
var baseString = firstLine.slice(0, firstNonWS(firstLine)); |
|||
for (var i = from.line; i < end; ++i) { |
|||
var line = self.getLine(i), cut = baseString.length; |
|||
if (!blankLines && !nonWS.test(line)) continue; |
|||
if (line.slice(0, cut) != baseString) cut = firstNonWS(line); |
|||
self.replaceRange(baseString + commentString + pad, Pos(i, 0), Pos(i, cut)); |
|||
} |
|||
} else { |
|||
for (var i = from.line; i < end; ++i) { |
|||
if (blankLines || nonWS.test(self.getLine(i))) |
|||
self.replaceRange(commentString + pad, Pos(i, 0)); |
|||
} |
|||
} |
|||
}); |
|||
}); |
|||
|
|||
CodeMirror.defineExtension("blockComment", function(from, to, options) { |
|||
if (!options) options = noOptions; |
|||
var self = this, mode = self.getModeAt(from); |
|||
var startString = options.blockCommentStart || mode.blockCommentStart; |
|||
var endString = options.blockCommentEnd || mode.blockCommentEnd; |
|||
if (!startString || !endString) { |
|||
if ((options.lineComment || mode.lineComment) && options.fullLines != false) |
|||
self.lineComment(from, to, options); |
|||
return; |
|||
} |
|||
|
|||
var end = Math.min(to.line, self.lastLine()); |
|||
if (end != from.line && to.ch == 0 && nonWS.test(self.getLine(end))) --end; |
|||
|
|||
var pad = options.padding == null ? " " : options.padding; |
|||
if (from.line > end) return; |
|||
|
|||
self.operation(function() { |
|||
if (options.fullLines != false) { |
|||
var lastLineHasText = nonWS.test(self.getLine(end)); |
|||
self.replaceRange(pad + endString, Pos(end)); |
|||
self.replaceRange(startString + pad, Pos(from.line, 0)); |
|||
var lead = options.blockCommentLead || mode.blockCommentLead; |
|||
if (lead != null) for (var i = from.line + 1; i <= end; ++i) |
|||
if (i != end || lastLineHasText) |
|||
self.replaceRange(lead + pad, Pos(i, 0)); |
|||
} else { |
|||
self.replaceRange(endString, to); |
|||
self.replaceRange(startString, from); |
|||
} |
|||
}); |
|||
}); |
|||
|
|||
CodeMirror.defineExtension("uncomment", function(from, to, options) { |
|||
if (!options) options = noOptions; |
|||
var self = this, mode = self.getModeAt(from); |
|||
var end = Math.min(to.ch != 0 || to.line == from.line ? to.line : to.line - 1, self.lastLine()), start = Math.min(from.line, end); |
|||
|
|||
// Try finding line comments
|
|||
var lineString = options.lineComment || mode.lineComment, lines = []; |
|||
var pad = options.padding == null ? " " : options.padding, didSomething; |
|||
lineComment: { |
|||
if (!lineString) break lineComment; |
|||
for (var i = start; i <= end; ++i) { |
|||
var line = self.getLine(i); |
|||
var found = line.indexOf(lineString); |
|||
if (found > -1 && !/comment/.test(self.getTokenTypeAt(Pos(i, found + 1)))) found = -1; |
|||
if (found == -1 && (i != end || i == start) && nonWS.test(line)) break lineComment; |
|||
if (found > -1 && nonWS.test(line.slice(0, found))) break lineComment; |
|||
lines.push(line); |
|||
} |
|||
self.operation(function() { |
|||
for (var i = start; i <= end; ++i) { |
|||
var line = lines[i - start]; |
|||
var pos = line.indexOf(lineString), endPos = pos + lineString.length; |
|||
if (pos < 0) continue; |
|||
if (line.slice(endPos, endPos + pad.length) == pad) endPos += pad.length; |
|||
didSomething = true; |
|||
self.replaceRange("", Pos(i, pos), Pos(i, endPos)); |
|||
} |
|||
}); |
|||
if (didSomething) return true; |
|||
} |
|||
|
|||
// Try block comments
|
|||
var startString = options.blockCommentStart || mode.blockCommentStart; |
|||
var endString = options.blockCommentEnd || mode.blockCommentEnd; |
|||
if (!startString || !endString) return false; |
|||
var lead = options.blockCommentLead || mode.blockCommentLead; |
|||
var startLine = self.getLine(start), endLine = end == start ? startLine : self.getLine(end); |
|||
var open = startLine.indexOf(startString), close = endLine.lastIndexOf(endString); |
|||
if (close == -1 && start != end) { |
|||
endLine = self.getLine(--end); |
|||
close = endLine.lastIndexOf(endString); |
|||
} |
|||
if (open == -1 || close == -1 || |
|||
!/comment/.test(self.getTokenTypeAt(Pos(start, open + 1))) || |
|||
!/comment/.test(self.getTokenTypeAt(Pos(end, close + 1)))) |
|||
return false; |
|||
|
|||
// Avoid killing block comments completely outside the selection.
|
|||
// Positions of the last startString before the start of the selection, and the first endString after it.
|
|||
var lastStart = startLine.lastIndexOf(startString, from.ch); |
|||
var firstEnd = lastStart == -1 ? -1 : startLine.slice(0, from.ch).indexOf(endString, lastStart + startString.length); |
|||
if (lastStart != -1 && firstEnd != -1 && firstEnd + endString.length != from.ch) return false; |
|||
// Positions of the first endString after the end of the selection, and the last startString before it.
|
|||
firstEnd = endLine.indexOf(endString, to.ch); |
|||
var almostLastStart = endLine.slice(to.ch).lastIndexOf(startString, firstEnd - to.ch); |
|||
lastStart = (firstEnd == -1 || almostLastStart == -1) ? -1 : to.ch + almostLastStart; |
|||
if (firstEnd != -1 && lastStart != -1 && lastStart != to.ch) return false; |
|||
|
|||
self.operation(function() { |
|||
self.replaceRange("", Pos(end, close - (pad && endLine.slice(close - pad.length, close) == pad ? pad.length : 0)), |
|||
Pos(end, close + endString.length)); |
|||
var openEnd = open + startString.length; |
|||
if (pad && startLine.slice(openEnd, openEnd + pad.length) == pad) openEnd += pad.length; |
|||
self.replaceRange("", Pos(start, open), Pos(start, openEnd)); |
|||
if (lead) for (var i = start + 1; i <= end; ++i) { |
|||
var line = self.getLine(i), found = line.indexOf(lead); |
|||
if (found == -1 || nonWS.test(line.slice(0, found))) continue; |
|||
var foundEnd = found + lead.length; |
|||
if (pad && line.slice(foundEnd, foundEnd + pad.length) == pad) foundEnd += pad.length; |
|||
self.replaceRange("", Pos(i, found), Pos(i, foundEnd)); |
|||
} |
|||
}); |
|||
return true; |
|||
}); |
|||
}); |
@ -1,85 +1,85 @@ |
|||
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
|||
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
|||
|
|||
(function(mod) { |
|||
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
|||
mod(require("../../lib/codemirror")); |
|||
else if (typeof define == "function" && define.amd) // AMD
|
|||
define(["../../lib/codemirror"], mod); |
|||
else // Plain browser env
|
|||
mod(CodeMirror); |
|||
})(function(CodeMirror) { |
|||
var modes = ["clike", "css", "javascript"]; |
|||
|
|||
for (var i = 0; i < modes.length; ++i) |
|||
CodeMirror.extendMode(modes[i], {blockCommentContinue: " * "}); |
|||
|
|||
function continueComment(cm) { |
|||
if (cm.getOption("disableInput")) return CodeMirror.Pass; |
|||
var ranges = cm.listSelections(), mode, inserts = []; |
|||
for (var i = 0; i < ranges.length; i++) { |
|||
var pos = ranges[i].head, token = cm.getTokenAt(pos); |
|||
if (token.type != "comment") return CodeMirror.Pass; |
|||
var modeHere = CodeMirror.innerMode(cm.getMode(), token.state).mode; |
|||
if (!mode) mode = modeHere; |
|||
else if (mode != modeHere) return CodeMirror.Pass; |
|||
|
|||
var insert = null; |
|||
if (mode.blockCommentStart && mode.blockCommentContinue) { |
|||
var end = token.string.indexOf(mode.blockCommentEnd); |
|||
var full = cm.getRange(CodeMirror.Pos(pos.line, 0), CodeMirror.Pos(pos.line, token.end)), found; |
|||
if (end != -1 && end == token.string.length - mode.blockCommentEnd.length && pos.ch >= end) { |
|||
// Comment ended, don't continue it
|
|||
} else if (token.string.indexOf(mode.blockCommentStart) == 0) { |
|||
insert = full.slice(0, token.start); |
|||
if (!/^\s*$/.test(insert)) { |
|||
insert = ""; |
|||
for (var j = 0; j < token.start; ++j) insert += " "; |
|||
} |
|||
} else if ((found = full.indexOf(mode.blockCommentContinue)) != -1 && |
|||
found + mode.blockCommentContinue.length > token.start && |
|||
/^\s*$/.test(full.slice(0, found))) { |
|||
insert = full.slice(0, found); |
|||
} |
|||
if (insert != null) insert += mode.blockCommentContinue; |
|||
} |
|||
if (insert == null && mode.lineComment && continueLineCommentEnabled(cm)) { |
|||
var line = cm.getLine(pos.line), found = line.indexOf(mode.lineComment); |
|||
if (found > -1) { |
|||
insert = line.slice(0, found); |
|||
if (/\S/.test(insert)) insert = null; |
|||
else insert += mode.lineComment + line.slice(found + mode.lineComment.length).match(/^\s*/)[0]; |
|||
} |
|||
} |
|||
if (insert == null) return CodeMirror.Pass; |
|||
inserts[i] = "\n" + insert; |
|||
} |
|||
|
|||
cm.operation(function() { |
|||
for (var i = ranges.length - 1; i >= 0; i--) |
|||
cm.replaceRange(inserts[i], ranges[i].from(), ranges[i].to(), "+insert"); |
|||
}); |
|||
} |
|||
|
|||
function continueLineCommentEnabled(cm) { |
|||
var opt = cm.getOption("continueComments"); |
|||
if (opt && typeof opt == "object") |
|||
return opt.continueLineComment !== false; |
|||
return true; |
|||
} |
|||
|
|||
CodeMirror.defineOption("continueComments", null, function(cm, val, prev) { |
|||
if (prev && prev != CodeMirror.Init) |
|||
cm.removeKeyMap("continueComment"); |
|||
if (val) { |
|||
var key = "Enter"; |
|||
if (typeof val == "string") |
|||
key = val; |
|||
else if (typeof val == "object" && val.key) |
|||
key = val.key; |
|||
var map = {name: "continueComment"}; |
|||
map[key] = continueComment; |
|||
cm.addKeyMap(map); |
|||
} |
|||
}); |
|||
}); |
|||
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
|||
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
|||
|
|||
(function(mod) { |
|||
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
|||
mod(require("../../lib/codemirror")); |
|||
else if (typeof define == "function" && define.amd) // AMD
|
|||
define(["../../lib/codemirror"], mod); |
|||
else // Plain browser env
|
|||
mod(CodeMirror); |
|||
})(function(CodeMirror) { |
|||
var modes = ["clike", "css", "javascript"]; |
|||
|
|||
for (var i = 0; i < modes.length; ++i) |
|||
CodeMirror.extendMode(modes[i], {blockCommentContinue: " * "}); |
|||
|
|||
function continueComment(cm) { |
|||
if (cm.getOption("disableInput")) return CodeMirror.Pass; |
|||
var ranges = cm.listSelections(), mode, inserts = []; |
|||
for (var i = 0; i < ranges.length; i++) { |
|||
var pos = ranges[i].head, token = cm.getTokenAt(pos); |
|||
if (token.type != "comment") return CodeMirror.Pass; |
|||
var modeHere = CodeMirror.innerMode(cm.getMode(), token.state).mode; |
|||
if (!mode) mode = modeHere; |
|||
else if (mode != modeHere) return CodeMirror.Pass; |
|||
|
|||
var insert = null; |
|||
if (mode.blockCommentStart && mode.blockCommentContinue) { |
|||
var end = token.string.indexOf(mode.blockCommentEnd); |
|||
var full = cm.getRange(CodeMirror.Pos(pos.line, 0), CodeMirror.Pos(pos.line, token.end)), found; |
|||
if (end != -1 && end == token.string.length - mode.blockCommentEnd.length && pos.ch >= end) { |
|||
// Comment ended, don't continue it
|
|||
} else if (token.string.indexOf(mode.blockCommentStart) == 0) { |
|||
insert = full.slice(0, token.start); |
|||
if (!/^\s*$/.test(insert)) { |
|||
insert = ""; |
|||
for (var j = 0; j < token.start; ++j) insert += " "; |
|||
} |
|||
} else if ((found = full.indexOf(mode.blockCommentContinue)) != -1 && |
|||
found + mode.blockCommentContinue.length > token.start && |
|||
/^\s*$/.test(full.slice(0, found))) { |
|||
insert = full.slice(0, found); |
|||
} |
|||
if (insert != null) insert += mode.blockCommentContinue; |
|||
} |
|||
if (insert == null && mode.lineComment && continueLineCommentEnabled(cm)) { |
|||
var line = cm.getLine(pos.line), found = line.indexOf(mode.lineComment); |
|||
if (found > -1) { |
|||
insert = line.slice(0, found); |
|||
if (/\S/.test(insert)) insert = null; |
|||
else insert += mode.lineComment + line.slice(found + mode.lineComment.length).match(/^\s*/)[0]; |
|||
} |
|||
} |
|||
if (insert == null) return CodeMirror.Pass; |
|||
inserts[i] = "\n" + insert; |
|||
} |
|||
|
|||
cm.operation(function() { |
|||
for (var i = ranges.length - 1; i >= 0; i--) |
|||
cm.replaceRange(inserts[i], ranges[i].from(), ranges[i].to(), "+insert"); |
|||
}); |
|||
} |
|||
|
|||
function continueLineCommentEnabled(cm) { |
|||
var opt = cm.getOption("continueComments"); |
|||
if (opt && typeof opt == "object") |
|||
return opt.continueLineComment !== false; |
|||
return true; |
|||
} |
|||
|
|||
CodeMirror.defineOption("continueComments", null, function(cm, val, prev) { |
|||
if (prev && prev != CodeMirror.Init) |
|||
cm.removeKeyMap("continueComment"); |
|||
if (val) { |
|||
var key = "Enter"; |
|||
if (typeof val == "string") |
|||
key = val; |
|||
else if (typeof val == "object" && val.key) |
|||
key = val.key; |
|||
var map = {name: "continueComment"}; |
|||
map[key] = continueComment; |
|||
cm.addKeyMap(map); |
|||
} |
|||
}); |
|||
}); |
@ -1,32 +1,32 @@ |
|||
.CodeMirror-dialog { |
|||
position: absolute; |
|||
left: 0; right: 0; |
|||
background: white; |
|||
z-index: 15; |
|||
padding: .1em .8em; |
|||
overflow: hidden; |
|||
color: #333; |
|||
} |
|||
|
|||
.CodeMirror-dialog-top { |
|||
border-bottom: 1px solid #eee; |
|||
top: 0; |
|||
} |
|||
|
|||
.CodeMirror-dialog-bottom { |
|||
border-top: 1px solid #eee; |
|||
bottom: 0; |
|||
} |
|||
|
|||
.CodeMirror-dialog input { |
|||
border: none; |
|||
outline: none; |
|||
background: transparent; |
|||
width: 20em; |
|||
color: inherit; |
|||
font-family: monospace; |
|||
} |
|||
|
|||
.CodeMirror-dialog button { |
|||
font-size: 70%; |
|||
} |
|||
.CodeMirror-dialog { |
|||
position: absolute; |
|||
left: 0; right: 0; |
|||
background: white; |
|||
z-index: 15; |
|||
padding: .1em .8em; |
|||
overflow: hidden; |
|||
color: #333; |
|||
} |
|||
|
|||
.CodeMirror-dialog-top { |
|||
border-bottom: 1px solid #eee; |
|||
top: 0; |
|||
} |
|||
|
|||
.CodeMirror-dialog-bottom { |
|||
border-top: 1px solid #eee; |
|||
bottom: 0; |
|||
} |
|||
|
|||
.CodeMirror-dialog input { |
|||
border: none; |
|||
outline: none; |
|||
background: transparent; |
|||
width: 20em; |
|||
color: inherit; |
|||
font-family: monospace; |
|||
} |
|||
|
|||
.CodeMirror-dialog button { |
|||
font-size: 70%; |
|||
} |
@ -1,155 +1,155 @@ |
|||
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
|||
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
|||
|
|||
// Open simple dialogs on top of an editor. Relies on dialog.css.
|
|||
|
|||
(function(mod) { |
|||
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
|||
mod(require("../../lib/codemirror")); |
|||
else if (typeof define == "function" && define.amd) // AMD
|
|||
define(["../../lib/codemirror"], mod); |
|||
else // Plain browser env
|
|||
mod(CodeMirror); |
|||
})(function(CodeMirror) { |
|||
function dialogDiv(cm, template, bottom) { |
|||
var wrap = cm.getWrapperElement(); |
|||
var dialog; |
|||
dialog = wrap.appendChild(document.createElement("div")); |
|||
if (bottom) |
|||
dialog.className = "CodeMirror-dialog CodeMirror-dialog-bottom"; |
|||
else |
|||
dialog.className = "CodeMirror-dialog CodeMirror-dialog-top"; |
|||
|
|||
if (typeof template == "string") { |
|||
dialog.innerHTML = template; |
|||
} else { // Assuming it's a detached DOM element.
|
|||
dialog.appendChild(template); |
|||
} |
|||
return dialog; |
|||
} |
|||
|
|||
function closeNotification(cm, newVal) { |
|||
if (cm.state.currentNotificationClose) |
|||
cm.state.currentNotificationClose(); |
|||
cm.state.currentNotificationClose = newVal; |
|||
} |
|||
|
|||
CodeMirror.defineExtension("openDialog", function(template, callback, options) { |
|||
if (!options) options = {}; |
|||
|
|||
closeNotification(this, null); |
|||
|
|||
var dialog = dialogDiv(this, template, options.bottom); |
|||
var closed = false, me = this; |
|||
function close(newVal) { |
|||
if (typeof newVal == 'string') { |
|||
inp.value = newVal; |
|||
} else { |
|||
if (closed) return; |
|||
closed = true; |
|||
dialog.parentNode.removeChild(dialog); |
|||
me.focus(); |
|||
|
|||
if (options.onClose) options.onClose(dialog); |
|||
} |
|||
} |
|||
|
|||
var inp = dialog.getElementsByTagName("input")[0], button; |
|||
if (inp) { |
|||
if (options.value) { |
|||
inp.value = options.value; |
|||
inp.select(); |
|||
} |
|||
|
|||
if (options.onInput) |
|||
CodeMirror.on(inp, "input", function(e) { options.onInput(e, inp.value, close);}); |
|||
if (options.onKeyUp) |
|||
CodeMirror.on(inp, "keyup", function(e) {options.onKeyUp(e, inp.value, close);}); |
|||
|
|||
CodeMirror.on(inp, "keydown", function(e) { |
|||
if (options && options.onKeyDown && options.onKeyDown(e, inp.value, close)) { return; } |
|||
if (e.keyCode == 27 || (options.closeOnEnter !== false && e.keyCode == 13)) { |
|||
inp.blur(); |
|||
CodeMirror.e_stop(e); |
|||
close(); |
|||
} |
|||
if (e.keyCode == 13) callback(inp.value, e); |
|||
}); |
|||
|
|||
if (options.closeOnBlur !== false) CodeMirror.on(inp, "blur", close); |
|||
|
|||
inp.focus(); |
|||
} else if (button = dialog.getElementsByTagName("button")[0]) { |
|||
CodeMirror.on(button, "click", function() { |
|||
close(); |
|||
me.focus(); |
|||
}); |
|||
|
|||
if (options.closeOnBlur !== false) CodeMirror.on(button, "blur", close); |
|||
|
|||
button.focus(); |
|||
} |
|||
return close; |
|||
}); |
|||
|
|||
CodeMirror.defineExtension("openConfirm", function(template, callbacks, options) { |
|||
closeNotification(this, null); |
|||
var dialog = dialogDiv(this, template, options && options.bottom); |
|||
var buttons = dialog.getElementsByTagName("button"); |
|||
var closed = false, me = this, blurring = 1; |
|||
function close() { |
|||
if (closed) return; |
|||
closed = true; |
|||
dialog.parentNode.removeChild(dialog); |
|||
me.focus(); |
|||
} |
|||
buttons[0].focus(); |
|||
for (var i = 0; i < buttons.length; ++i) { |
|||
var b = buttons[i]; |
|||
(function(callback) { |
|||
CodeMirror.on(b, "click", function(e) { |
|||
CodeMirror.e_preventDefault(e); |
|||
close(); |
|||
if (callback) callback(me); |
|||
}); |
|||
})(callbacks[i]); |
|||
CodeMirror.on(b, "blur", function() { |
|||
--blurring; |
|||
setTimeout(function() { if (blurring <= 0) close(); }, 200); |
|||
}); |
|||
CodeMirror.on(b, "focus", function() { ++blurring; }); |
|||
} |
|||
}); |
|||
|
|||
/* |
|||
* openNotification |
|||
* Opens a notification, that can be closed with an optional timer |
|||
* (default 5000ms timer) and always closes on click. |
|||
* |
|||
* If a notification is opened while another is opened, it will close the |
|||
* currently opened one and open the new one immediately. |
|||
*/ |
|||
CodeMirror.defineExtension("openNotification", function(template, options) { |
|||
closeNotification(this, close); |
|||
var dialog = dialogDiv(this, template, options && options.bottom); |
|||
var closed = false, doneTimer; |
|||
var duration = options && typeof options.duration !== "undefined" ? options.duration : 5000; |
|||
|
|||
function close() { |
|||
if (closed) return; |
|||
closed = true; |
|||
clearTimeout(doneTimer); |
|||
dialog.parentNode.removeChild(dialog); |
|||
} |
|||
|
|||
CodeMirror.on(dialog, 'click', function(e) { |
|||
CodeMirror.e_preventDefault(e); |
|||
close(); |
|||
}); |
|||
|
|||
if (duration) |
|||
doneTimer = setTimeout(close, duration); |
|||
|
|||
return close; |
|||
}); |
|||
}); |
|||
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
|||
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
|||
|
|||
// Open simple dialogs on top of an editor. Relies on dialog.css.
|
|||
|
|||
(function(mod) { |
|||
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
|||
mod(require("../../lib/codemirror")); |
|||
else if (typeof define == "function" && define.amd) // AMD
|
|||
define(["../../lib/codemirror"], mod); |
|||
else // Plain browser env
|
|||
mod(CodeMirror); |
|||
})(function(CodeMirror) { |
|||
function dialogDiv(cm, template, bottom) { |
|||
var wrap = cm.getWrapperElement(); |
|||
var dialog; |
|||
dialog = wrap.appendChild(document.createElement("div")); |
|||
if (bottom) |
|||
dialog.className = "CodeMirror-dialog CodeMirror-dialog-bottom"; |
|||
else |
|||
dialog.className = "CodeMirror-dialog CodeMirror-dialog-top"; |
|||
|
|||
if (typeof template == "string") { |
|||
dialog.innerHTML = template; |
|||
} else { // Assuming it's a detached DOM element.
|
|||
dialog.appendChild(template); |
|||
} |
|||
return dialog; |
|||
} |
|||
|
|||
function closeNotification(cm, newVal) { |
|||
if (cm.state.currentNotificationClose) |
|||
cm.state.currentNotificationClose(); |
|||
cm.state.currentNotificationClose = newVal; |
|||
} |
|||
|
|||
CodeMirror.defineExtension("openDialog", function(template, callback, options) { |
|||
if (!options) options = {}; |
|||
|
|||
closeNotification(this, null); |
|||
|
|||
var dialog = dialogDiv(this, template, options.bottom); |
|||
var closed = false, me = this; |
|||
function close(newVal) { |
|||
if (typeof newVal == 'string') { |
|||
inp.value = newVal; |
|||
} else { |
|||
if (closed) return; |
|||
closed = true; |
|||
dialog.parentNode.removeChild(dialog); |
|||
me.focus(); |
|||
|
|||
if (options.onClose) options.onClose(dialog); |
|||
} |
|||
} |
|||
|
|||
var inp = dialog.getElementsByTagName("input")[0], button; |
|||
if (inp) { |
|||
if (options.value) { |
|||
inp.value = options.value; |
|||
inp.select(); |
|||
} |
|||
|
|||
if (options.onInput) |
|||
CodeMirror.on(inp, "input", function(e) { options.onInput(e, inp.value, close);}); |
|||
if (options.onKeyUp) |
|||
CodeMirror.on(inp, "keyup", function(e) {options.onKeyUp(e, inp.value, close);}); |
|||
|
|||
CodeMirror.on(inp, "keydown", function(e) { |
|||
if (options && options.onKeyDown && options.onKeyDown(e, inp.value, close)) { return; } |
|||
if (e.keyCode == 27 || (options.closeOnEnter !== false && e.keyCode == 13)) { |
|||
inp.blur(); |
|||
CodeMirror.e_stop(e); |
|||
close(); |
|||
} |
|||
if (e.keyCode == 13) callback(inp.value, e); |
|||
}); |
|||
|
|||
if (options.closeOnBlur !== false) CodeMirror.on(inp, "blur", close); |
|||
|
|||
inp.focus(); |
|||
} else if (button = dialog.getElementsByTagName("button")[0]) { |
|||
CodeMirror.on(button, "click", function() { |
|||
close(); |
|||
me.focus(); |
|||
}); |
|||
|
|||
if (options.closeOnBlur !== false) CodeMirror.on(button, "blur", close); |
|||
|
|||
button.focus(); |
|||
} |
|||
return close; |
|||
}); |
|||
|
|||
CodeMirror.defineExtension("openConfirm", function(template, callbacks, options) { |
|||
closeNotification(this, null); |
|||
var dialog = dialogDiv(this, template, options && options.bottom); |
|||
var buttons = dialog.getElementsByTagName("button"); |
|||
var closed = false, me = this, blurring = 1; |
|||
function close() { |
|||
if (closed) return; |
|||
closed = true; |
|||
dialog.parentNode.removeChild(dialog); |
|||
me.focus(); |
|||
} |
|||
buttons[0].focus(); |
|||
for (var i = 0; i < buttons.length; ++i) { |
|||
var b = buttons[i]; |
|||
(function(callback) { |
|||
CodeMirror.on(b, "click", function(e) { |
|||
CodeMirror.e_preventDefault(e); |
|||
close(); |
|||
if (callback) callback(me); |
|||
}); |
|||
})(callbacks[i]); |
|||
CodeMirror.on(b, "blur", function() { |
|||
--blurring; |
|||
setTimeout(function() { if (blurring <= 0) close(); }, 200); |
|||
}); |
|||
CodeMirror.on(b, "focus", function() { ++blurring; }); |
|||
} |
|||
}); |
|||
|
|||
/* |
|||
* openNotification |
|||
* Opens a notification, that can be closed with an optional timer |
|||
* (default 5000ms timer) and always closes on click. |
|||
* |
|||
* If a notification is opened while another is opened, it will close the |
|||
* currently opened one and open the new one immediately. |
|||
*/ |
|||
CodeMirror.defineExtension("openNotification", function(template, options) { |
|||
closeNotification(this, close); |
|||
var dialog = dialogDiv(this, template, options && options.bottom); |
|||
var closed = false, doneTimer; |
|||
var duration = options && typeof options.duration !== "undefined" ? options.duration : 5000; |
|||
|
|||
function close() { |
|||
if (closed) return; |
|||
closed = true; |
|||
clearTimeout(doneTimer); |
|||
dialog.parentNode.removeChild(dialog); |
|||
} |
|||
|
|||
CodeMirror.on(dialog, 'click', function(e) { |
|||
CodeMirror.e_preventDefault(e); |
|||
close(); |
|||
}); |
|||
|
|||
if (duration) |
|||
doneTimer = setTimeout(close, duration); |
|||
|
|||
return close; |
|||
}); |
|||
}); |
@ -1,6 +1,6 @@ |
|||
.CodeMirror-fullscreen { |
|||
position: fixed; |
|||
top: 0; left: 0; right: 0; bottom: 0; |
|||
height: auto; |
|||
z-index: 9; |
|||
} |
|||
.CodeMirror-fullscreen { |
|||
position: fixed; |
|||
top: 0; left: 0; right: 0; bottom: 0; |
|||
height: auto; |
|||
z-index: 9; |
|||
} |
@ -1,41 +1,41 @@ |
|||
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
|||
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
|||
|
|||
(function(mod) { |
|||
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
|||
mod(require("../../lib/codemirror")); |
|||
else if (typeof define == "function" && define.amd) // AMD
|
|||
define(["../../lib/codemirror"], mod); |
|||
else // Plain browser env
|
|||
mod(CodeMirror); |
|||
})(function(CodeMirror) { |
|||
"use strict"; |
|||
|
|||
CodeMirror.defineOption("fullScreen", false, function(cm, val, old) { |
|||
if (old == CodeMirror.Init) old = false; |
|||
if (!old == !val) return; |
|||
if (val) setFullscreen(cm); |
|||
else setNormal(cm); |
|||
}); |
|||
|
|||
function setFullscreen(cm) { |
|||
var wrap = cm.getWrapperElement(); |
|||
cm.state.fullScreenRestore = {scrollTop: window.pageYOffset, scrollLeft: window.pageXOffset, |
|||
width: wrap.style.width, height: wrap.style.height}; |
|||
wrap.style.width = ""; |
|||
wrap.style.height = "auto"; |
|||
wrap.className += " CodeMirror-fullscreen"; |
|||
document.documentElement.style.overflow = "hidden"; |
|||
cm.refresh(); |
|||
} |
|||
|
|||
function setNormal(cm) { |
|||
var wrap = cm.getWrapperElement(); |
|||
wrap.className = wrap.className.replace(/\s*CodeMirror-fullscreen\b/, ""); |
|||
document.documentElement.style.overflow = ""; |
|||
var info = cm.state.fullScreenRestore; |
|||
wrap.style.width = info.width; wrap.style.height = info.height; |
|||
window.scrollTo(info.scrollLeft, info.scrollTop); |
|||
cm.refresh(); |
|||
} |
|||
}); |
|||
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
|||
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
|||
|
|||
(function(mod) { |
|||
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
|||
mod(require("../../lib/codemirror")); |
|||
else if (typeof define == "function" && define.amd) // AMD
|
|||
define(["../../lib/codemirror"], mod); |
|||
else // Plain browser env
|
|||
mod(CodeMirror); |
|||
})(function(CodeMirror) { |
|||
"use strict"; |
|||
|
|||
CodeMirror.defineOption("fullScreen", false, function(cm, val, old) { |
|||
if (old == CodeMirror.Init) old = false; |
|||
if (!old == !val) return; |
|||
if (val) setFullscreen(cm); |
|||
else setNormal(cm); |
|||
}); |
|||
|
|||
function setFullscreen(cm) { |
|||
var wrap = cm.getWrapperElement(); |
|||
cm.state.fullScreenRestore = {scrollTop: window.pageYOffset, scrollLeft: window.pageXOffset, |
|||
width: wrap.style.width, height: wrap.style.height}; |
|||
wrap.style.width = ""; |
|||
wrap.style.height = "auto"; |
|||
wrap.className += " CodeMirror-fullscreen"; |
|||
document.documentElement.style.overflow = "hidden"; |
|||
cm.refresh(); |
|||
} |
|||
|
|||
function setNormal(cm) { |
|||
var wrap = cm.getWrapperElement(); |
|||
wrap.className = wrap.className.replace(/\s*CodeMirror-fullscreen\b/, ""); |
|||
document.documentElement.style.overflow = ""; |
|||
var info = cm.state.fullScreenRestore; |
|||
wrap.style.width = info.width; wrap.style.height = info.height; |
|||
window.scrollTo(info.scrollLeft, info.scrollTop); |
|||
cm.refresh(); |
|||
} |
|||
}); |
@ -1,94 +1,94 @@ |
|||
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
|||
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
|||
|
|||
(function(mod) { |
|||
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
|||
mod(require("../../lib/codemirror")); |
|||
else if (typeof define == "function" && define.amd) // AMD
|
|||
define(["../../lib/codemirror"], mod); |
|||
else // Plain browser env
|
|||
mod(CodeMirror); |
|||
})(function(CodeMirror) { |
|||
CodeMirror.defineExtension("addPanel", function(node, options) { |
|||
if (!this.state.panels) initPanels(this); |
|||
|
|||
var info = this.state.panels; |
|||
if (options && options.position == "bottom") |
|||
info.wrapper.appendChild(node); |
|||
else |
|||
info.wrapper.insertBefore(node, info.wrapper.firstChild); |
|||
var height = (options && options.height) || node.offsetHeight; |
|||
this._setSize(null, info.heightLeft -= height); |
|||
info.panels++; |
|||
return new Panel(this, node, options, height); |
|||
}); |
|||
|
|||
function Panel(cm, node, options, height) { |
|||
this.cm = cm; |
|||
this.node = node; |
|||
this.options = options; |
|||
this.height = height; |
|||
this.cleared = false; |
|||
} |
|||
|
|||
Panel.prototype.clear = function() { |
|||
if (this.cleared) return; |
|||
this.cleared = true; |
|||
var info = this.cm.state.panels; |
|||
this.cm._setSize(null, info.heightLeft += this.height); |
|||
info.wrapper.removeChild(this.node); |
|||
if (--info.panels == 0) removePanels(this.cm); |
|||
}; |
|||
|
|||
Panel.prototype.changed = function(height) { |
|||
var newHeight = height == null ? this.node.offsetHeight : height; |
|||
var info = this.cm.state.panels; |
|||
this.cm._setSize(null, info.height += (newHeight - this.height)); |
|||
this.height = newHeight; |
|||
}; |
|||
|
|||
function initPanels(cm) { |
|||
var wrap = cm.getWrapperElement(); |
|||
var style = window.getComputedStyle ? window.getComputedStyle(wrap) : wrap.currentStyle; |
|||
var height = parseInt(style.height); |
|||
var info = cm.state.panels = { |
|||
setHeight: wrap.style.height, |
|||
heightLeft: height, |
|||
panels: 0, |
|||
wrapper: document.createElement("div") |
|||
}; |
|||
wrap.parentNode.insertBefore(info.wrapper, wrap); |
|||
var hasFocus = cm.hasFocus(); |
|||
info.wrapper.appendChild(wrap); |
|||
if (hasFocus) cm.focus(); |
|||
|
|||
cm._setSize = cm.setSize; |
|||
if (height != null) cm.setSize = function(width, newHeight) { |
|||
if (newHeight == null) return this._setSize(width, newHeight); |
|||
info.setHeight = newHeight; |
|||
if (typeof newHeight != "number") { |
|||
var px = /^(\d+\.?\d*)px$/.exec(newHeight); |
|||
if (px) { |
|||
newHeight = Number(px[1]); |
|||
} else { |
|||
info.wrapper.style.height = newHeight; |
|||
newHeight = info.wrapper.offsetHeight; |
|||
info.wrapper.style.height = ""; |
|||
} |
|||
} |
|||
cm._setSize(width, info.heightLeft += (newHeight - height)); |
|||
height = newHeight; |
|||
}; |
|||
} |
|||
|
|||
function removePanels(cm) { |
|||
var info = cm.state.panels; |
|||
cm.state.panels = null; |
|||
|
|||
var wrap = cm.getWrapperElement(); |
|||
info.wrapper.parentNode.replaceChild(wrap, info.wrapper); |
|||
wrap.style.height = info.setHeight; |
|||
cm.setSize = cm._setSize; |
|||
cm.setSize(); |
|||
} |
|||
}); |
|||
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
|||
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
|||
|
|||
(function(mod) { |
|||
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
|||
mod(require("../../lib/codemirror")); |
|||
else if (typeof define == "function" && define.amd) // AMD
|
|||
define(["../../lib/codemirror"], mod); |
|||
else // Plain browser env
|
|||
mod(CodeMirror); |
|||
})(function(CodeMirror) { |
|||
CodeMirror.defineExtension("addPanel", function(node, options) { |
|||
if (!this.state.panels) initPanels(this); |
|||
|
|||
var info = this.state.panels; |
|||
if (options && options.position == "bottom") |
|||
info.wrapper.appendChild(node); |
|||
else |
|||
info.wrapper.insertBefore(node, info.wrapper.firstChild); |
|||
var height = (options && options.height) || node.offsetHeight; |
|||
this._setSize(null, info.heightLeft -= height); |
|||
info.panels++; |
|||
return new Panel(this, node, options, height); |
|||
}); |
|||
|
|||
function Panel(cm, node, options, height) { |
|||
this.cm = cm; |
|||
this.node = node; |
|||
this.options = options; |
|||
this.height = height; |
|||
this.cleared = false; |
|||
} |
|||
|
|||
Panel.prototype.clear = function() { |
|||
if (this.cleared) return; |
|||
this.cleared = true; |
|||
var info = this.cm.state.panels; |
|||
this.cm._setSize(null, info.heightLeft += this.height); |
|||
info.wrapper.removeChild(this.node); |
|||
if (--info.panels == 0) removePanels(this.cm); |
|||
}; |
|||
|
|||
Panel.prototype.changed = function(height) { |
|||
var newHeight = height == null ? this.node.offsetHeight : height; |
|||
var info = this.cm.state.panels; |
|||
this.cm._setSize(null, info.height += (newHeight - this.height)); |
|||
this.height = newHeight; |
|||
}; |
|||
|
|||
function initPanels(cm) { |
|||
var wrap = cm.getWrapperElement(); |
|||
var style = window.getComputedStyle ? window.getComputedStyle(wrap) : wrap.currentStyle; |
|||
var height = parseInt(style.height); |
|||
var info = cm.state.panels = { |
|||
setHeight: wrap.style.height, |
|||
heightLeft: height, |
|||
panels: 0, |
|||
wrapper: document.createElement("div") |
|||
}; |
|||
wrap.parentNode.insertBefore(info.wrapper, wrap); |
|||
var hasFocus = cm.hasFocus(); |
|||
info.wrapper.appendChild(wrap); |
|||
if (hasFocus) cm.focus(); |
|||
|
|||
cm._setSize = cm.setSize; |
|||
if (height != null) cm.setSize = function(width, newHeight) { |
|||
if (newHeight == null) return this._setSize(width, newHeight); |
|||
info.setHeight = newHeight; |
|||
if (typeof newHeight != "number") { |
|||
var px = /^(\d+\.?\d*)px$/.exec(newHeight); |
|||
if (px) { |
|||
newHeight = Number(px[1]); |
|||
} else { |
|||
info.wrapper.style.height = newHeight; |
|||
newHeight = info.wrapper.offsetHeight; |
|||
info.wrapper.style.height = ""; |
|||
} |
|||
} |
|||
cm._setSize(width, info.heightLeft += (newHeight - height)); |
|||
height = newHeight; |
|||
}; |
|||
} |
|||
|
|||
function removePanels(cm) { |
|||
var info = cm.state.panels; |
|||
cm.state.panels = null; |
|||
|
|||
var wrap = cm.getWrapperElement(); |
|||
info.wrapper.parentNode.replaceChild(wrap, info.wrapper); |
|||
wrap.style.height = info.setHeight; |
|||
cm.setSize = cm._setSize; |
|||
cm.setSize(); |
|||
} |
|||
}); |
@ -1,58 +1,58 @@ |
|||
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
|||
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
|||
|
|||
(function(mod) { |
|||
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
|||
mod(require("../../lib/codemirror")); |
|||
else if (typeof define == "function" && define.amd) // AMD
|
|||
define(["../../lib/codemirror"], mod); |
|||
else // Plain browser env
|
|||
mod(CodeMirror); |
|||
})(function(CodeMirror) { |
|||
CodeMirror.defineOption("placeholder", "", function(cm, val, old) { |
|||
var prev = old && old != CodeMirror.Init; |
|||
if (val && !prev) { |
|||
cm.on("blur", onBlur); |
|||
cm.on("change", onChange); |
|||
onChange(cm); |
|||
} else if (!val && prev) { |
|||
cm.off("blur", onBlur); |
|||
cm.off("change", onChange); |
|||
clearPlaceholder(cm); |
|||
var wrapper = cm.getWrapperElement(); |
|||
wrapper.className = wrapper.className.replace(" CodeMirror-empty", ""); |
|||
} |
|||
|
|||
if (val && !cm.hasFocus()) onBlur(cm); |
|||
}); |
|||
|
|||
function clearPlaceholder(cm) { |
|||
if (cm.state.placeholder) { |
|||
cm.state.placeholder.parentNode.removeChild(cm.state.placeholder); |
|||
cm.state.placeholder = null; |
|||
} |
|||
} |
|||
function setPlaceholder(cm) { |
|||
clearPlaceholder(cm); |
|||
var elt = cm.state.placeholder = document.createElement("pre"); |
|||
elt.style.cssText = "height: 0; overflow: visible"; |
|||
elt.className = "CodeMirror-placeholder"; |
|||
elt.appendChild(document.createTextNode(cm.getOption("placeholder"))); |
|||
cm.display.lineSpace.insertBefore(elt, cm.display.lineSpace.firstChild); |
|||
} |
|||
|
|||
function onBlur(cm) { |
|||
if (isEmpty(cm)) setPlaceholder(cm); |
|||
} |
|||
function onChange(cm) { |
|||
var wrapper = cm.getWrapperElement(), empty = isEmpty(cm); |
|||
wrapper.className = wrapper.className.replace(" CodeMirror-empty", "") + (empty ? " CodeMirror-empty" : ""); |
|||
|
|||
if (empty) setPlaceholder(cm); |
|||
else clearPlaceholder(cm); |
|||
} |
|||
|
|||
function isEmpty(cm) { |
|||
return (cm.lineCount() === 1) && (cm.getLine(0) === ""); |
|||
} |
|||
}); |
|||
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
|||
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
|||
|
|||
(function(mod) { |
|||
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
|||
mod(require("../../lib/codemirror")); |
|||
else if (typeof define == "function" && define.amd) // AMD
|
|||
define(["../../lib/codemirror"], mod); |
|||
else // Plain browser env
|
|||
mod(CodeMirror); |
|||
})(function(CodeMirror) { |
|||
CodeMirror.defineOption("placeholder", "", function(cm, val, old) { |
|||
var prev = old && old != CodeMirror.Init; |
|||
if (val && !prev) { |
|||
cm.on("blur", onBlur); |
|||
cm.on("change", onChange); |
|||
onChange(cm); |
|||
} else if (!val && prev) { |
|||
cm.off("blur", onBlur); |
|||
cm.off("change", onChange); |
|||
clearPlaceholder(cm); |
|||
var wrapper = cm.getWrapperElement(); |
|||
wrapper.className = wrapper.className.replace(" CodeMirror-empty", ""); |
|||
} |
|||
|
|||
if (val && !cm.hasFocus()) onBlur(cm); |
|||
}); |
|||
|
|||
function clearPlaceholder(cm) { |
|||
if (cm.state.placeholder) { |
|||
cm.state.placeholder.parentNode.removeChild(cm.state.placeholder); |
|||
cm.state.placeholder = null; |
|||
} |
|||
} |
|||
function setPlaceholder(cm) { |
|||
clearPlaceholder(cm); |
|||
var elt = cm.state.placeholder = document.createElement("pre"); |
|||
elt.style.cssText = "height: 0; overflow: visible"; |
|||
elt.className = "CodeMirror-placeholder"; |
|||
elt.appendChild(document.createTextNode(cm.getOption("placeholder"))); |
|||
cm.display.lineSpace.insertBefore(elt, cm.display.lineSpace.firstChild); |
|||
} |
|||
|
|||
function onBlur(cm) { |
|||
if (isEmpty(cm)) setPlaceholder(cm); |
|||
} |
|||
function onChange(cm) { |
|||
var wrapper = cm.getWrapperElement(), empty = isEmpty(cm); |
|||
wrapper.className = wrapper.className.replace(" CodeMirror-empty", "") + (empty ? " CodeMirror-empty" : ""); |
|||
|
|||
if (empty) setPlaceholder(cm); |
|||
else clearPlaceholder(cm); |
|||
} |
|||
|
|||
function isEmpty(cm) { |
|||
return (cm.lineCount() === 1) && (cm.getLine(0) === ""); |
|||
} |
|||
}); |
@ -1,64 +1,64 @@ |
|||
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
|||
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
|||
|
|||
(function(mod) { |
|||
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
|||
mod(require("../../lib/codemirror")); |
|||
else if (typeof define == "function" && define.amd) // AMD
|
|||
define(["../../lib/codemirror"], mod); |
|||
else // Plain browser env
|
|||
mod(CodeMirror); |
|||
})(function(CodeMirror) { |
|||
"use strict"; |
|||
|
|||
CodeMirror.defineOption("rulers", false, function(cm, val, old) { |
|||
if (old && old != CodeMirror.Init) { |
|||
clearRulers(cm); |
|||
cm.off("refresh", refreshRulers); |
|||
} |
|||
if (val && val.length) { |
|||
setRulers(cm); |
|||
cm.on("refresh", refreshRulers); |
|||
} |
|||
}); |
|||
|
|||
function clearRulers(cm) { |
|||
for (var i = cm.display.lineSpace.childNodes.length - 1; i >= 0; i--) { |
|||
var node = cm.display.lineSpace.childNodes[i]; |
|||
if (/(^|\s)CodeMirror-ruler($|\s)/.test(node.className)) |
|||
node.parentNode.removeChild(node); |
|||
} |
|||
} |
|||
|
|||
function setRulers(cm) { |
|||
var val = cm.getOption("rulers"); |
|||
var cw = cm.defaultCharWidth(); |
|||
var left = cm.charCoords(CodeMirror.Pos(cm.firstLine(), 0), "div").left; |
|||
var minH = cm.display.scroller.offsetHeight + 30; |
|||
for (var i = 0; i < val.length; i++) { |
|||
var elt = document.createElement("div"); |
|||
elt.className = "CodeMirror-ruler"; |
|||
var col, cls = null, conf = val[i]; |
|||
if (typeof conf == "number") { |
|||
col = conf; |
|||
} else { |
|||
col = conf.column; |
|||
if (conf.className) elt.className += " " + conf.className; |
|||
if (conf.color) elt.style.borderColor = conf.color; |
|||
if (conf.lineStyle) elt.style.borderLeftStyle = conf.lineStyle; |
|||
if (conf.width) elt.style.borderLeftWidth = conf.width; |
|||
cls = val[i].className; |
|||
} |
|||
elt.style.left = (left + col * cw) + "px"; |
|||
elt.style.top = "-50px"; |
|||
elt.style.bottom = "-20px"; |
|||
elt.style.minHeight = minH + "px"; |
|||
cm.display.lineSpace.insertBefore(elt, cm.display.cursorDiv); |
|||
} |
|||
} |
|||
|
|||
function refreshRulers(cm) { |
|||
clearRulers(cm); |
|||
setRulers(cm); |
|||
} |
|||
}); |
|||
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
|||
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
|||
|
|||
(function(mod) { |
|||
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
|||
mod(require("../../lib/codemirror")); |
|||
else if (typeof define == "function" && define.amd) // AMD
|
|||
define(["../../lib/codemirror"], mod); |
|||
else // Plain browser env
|
|||
mod(CodeMirror); |
|||
})(function(CodeMirror) { |
|||
"use strict"; |
|||
|
|||
CodeMirror.defineOption("rulers", false, function(cm, val, old) { |
|||
if (old && old != CodeMirror.Init) { |
|||
clearRulers(cm); |
|||
cm.off("refresh", refreshRulers); |
|||
} |
|||
if (val && val.length) { |
|||
setRulers(cm); |
|||
cm.on("refresh", refreshRulers); |
|||
} |
|||
}); |
|||
|
|||
function clearRulers(cm) { |
|||
for (var i = cm.display.lineSpace.childNodes.length - 1; i >= 0; i--) { |
|||
var node = cm.display.lineSpace.childNodes[i]; |
|||
if (/(^|\s)CodeMirror-ruler($|\s)/.test(node.className)) |
|||
node.parentNode.removeChild(node); |
|||
} |
|||
} |
|||
|
|||
function setRulers(cm) { |
|||
var val = cm.getOption("rulers"); |
|||
var cw = cm.defaultCharWidth(); |
|||
var left = cm.charCoords(CodeMirror.Pos(cm.firstLine(), 0), "div").left; |
|||
var minH = cm.display.scroller.offsetHeight + 30; |
|||
for (var i = 0; i < val.length; i++) { |
|||
var elt = document.createElement("div"); |
|||
elt.className = "CodeMirror-ruler"; |
|||
var col, cls = null, conf = val[i]; |
|||
if (typeof conf == "number") { |
|||
col = conf; |
|||
} else { |
|||
col = conf.column; |
|||
if (conf.className) elt.className += " " + conf.className; |
|||
if (conf.color) elt.style.borderColor = conf.color; |
|||
if (conf.lineStyle) elt.style.borderLeftStyle = conf.lineStyle; |
|||
if (conf.width) elt.style.borderLeftWidth = conf.width; |
|||
cls = val[i].className; |
|||
} |
|||
elt.style.left = (left + col * cw) + "px"; |
|||
elt.style.top = "-50px"; |
|||
elt.style.bottom = "-20px"; |
|||
elt.style.minHeight = minH + "px"; |
|||
cm.display.lineSpace.insertBefore(elt, cm.display.cursorDiv); |
|||
} |
|||
} |
|||
|
|||
function refreshRulers(cm) { |
|||
clearRulers(cm); |
|||
setRulers(cm); |
|||
} |
|||
}); |
@ -1,161 +1,161 @@ |
|||
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
|||
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
|||
|
|||
(function(mod) { |
|||
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
|||
mod(require("../../lib/codemirror")); |
|||
else if (typeof define == "function" && define.amd) // AMD
|
|||
define(["../../lib/codemirror"], mod); |
|||
else // Plain browser env
|
|||
mod(CodeMirror); |
|||
})(function(CodeMirror) { |
|||
var DEFAULT_BRACKETS = "()[]{}''\"\""; |
|||
var DEFAULT_TRIPLES = "'\""; |
|||
var DEFAULT_EXPLODE_ON_ENTER = "[]{}"; |
|||
var SPACE_CHAR_REGEX = /\s/; |
|||
|
|||
var Pos = CodeMirror.Pos; |
|||
|
|||
CodeMirror.defineOption("autoCloseBrackets", false, function(cm, val, old) { |
|||
if (old != CodeMirror.Init && old) |
|||
cm.removeKeyMap("autoCloseBrackets"); |
|||
if (!val) return; |
|||
var pairs = DEFAULT_BRACKETS, triples = DEFAULT_TRIPLES, explode = DEFAULT_EXPLODE_ON_ENTER; |
|||
if (typeof val == "string") pairs = val; |
|||
else if (typeof val == "object") { |
|||
if (val.pairs != null) pairs = val.pairs; |
|||
if (val.triples != null) triples = val.triples; |
|||
if (val.explode != null) explode = val.explode; |
|||
} |
|||
var map = buildKeymap(pairs, triples); |
|||
if (explode) map.Enter = buildExplodeHandler(explode); |
|||
cm.addKeyMap(map); |
|||
}); |
|||
|
|||
function charsAround(cm, pos) { |
|||
var str = cm.getRange(Pos(pos.line, pos.ch - 1), |
|||
Pos(pos.line, pos.ch + 1)); |
|||
return str.length == 2 ? str : null; |
|||
} |
|||
|
|||
// Project the token type that will exists after the given char is
|
|||
// typed, and use it to determine whether it would cause the start
|
|||
// of a string token.
|
|||
function enteringString(cm, pos, ch) { |
|||
var line = cm.getLine(pos.line); |
|||
var token = cm.getTokenAt(pos); |
|||
if (/\bstring2?\b/.test(token.type)) return false; |
|||
var stream = new CodeMirror.StringStream(line.slice(0, pos.ch) + ch + line.slice(pos.ch), 4); |
|||
stream.pos = stream.start = token.start; |
|||
for (;;) { |
|||
var type1 = cm.getMode().token(stream, token.state); |
|||
if (stream.pos >= pos.ch + 1) return /\bstring2?\b/.test(type1); |
|||
stream.start = stream.pos; |
|||
} |
|||
} |
|||
|
|||
function buildKeymap(pairs, triples) { |
|||
var map = { |
|||
name : "autoCloseBrackets", |
|||
Backspace: function(cm) { |
|||
if (cm.getOption("disableInput")) return CodeMirror.Pass; |
|||
var ranges = cm.listSelections(); |
|||
for (var i = 0; i < ranges.length; i++) { |
|||
if (!ranges[i].empty()) return CodeMirror.Pass; |
|||
var around = charsAround(cm, ranges[i].head); |
|||
if (!around || pairs.indexOf(around) % 2 != 0) return CodeMirror.Pass; |
|||
} |
|||
for (var i = ranges.length - 1; i >= 0; i--) { |
|||
var cur = ranges[i].head; |
|||
cm.replaceRange("", Pos(cur.line, cur.ch - 1), Pos(cur.line, cur.ch + 1)); |
|||
} |
|||
} |
|||
}; |
|||
var closingBrackets = ""; |
|||
for (var i = 0; i < pairs.length; i += 2) (function(left, right) { |
|||
closingBrackets += right; |
|||
map["'" + left + "'"] = function(cm) { |
|||
if (cm.getOption("disableInput")) return CodeMirror.Pass; |
|||
var ranges = cm.listSelections(), type, next; |
|||
for (var i = 0; i < ranges.length; i++) { |
|||
var range = ranges[i], cur = range.head, curType; |
|||
var next = cm.getRange(cur, Pos(cur.line, cur.ch + 1)); |
|||
if (!range.empty()) { |
|||
curType = "surround"; |
|||
} else if (left == right && next == right) { |
|||
if (cm.getRange(cur, Pos(cur.line, cur.ch + 3)) == left + left + left) |
|||
curType = "skipThree"; |
|||
else |
|||
curType = "skip"; |
|||
} else if (left == right && cur.ch > 1 && triples.indexOf(left) >= 0 && |
|||
cm.getRange(Pos(cur.line, cur.ch - 2), cur) == left + left && |
|||
(cur.ch <= 2 || cm.getRange(Pos(cur.line, cur.ch - 3), Pos(cur.line, cur.ch - 2)) != left)) { |
|||
curType = "addFour"; |
|||
} else if (left == '"' || left == "'") { |
|||
if (!CodeMirror.isWordChar(next) && enteringString(cm, cur, left)) curType = "both"; |
|||
else return CodeMirror.Pass; |
|||
} else if (cm.getLine(cur.line).length == cur.ch || closingBrackets.indexOf(next) >= 0 || SPACE_CHAR_REGEX.test(next)) { |
|||
curType = "both"; |
|||
} else { |
|||
return CodeMirror.Pass; |
|||
} |
|||
if (!type) type = curType; |
|||
else if (type != curType) return CodeMirror.Pass; |
|||
} |
|||
|
|||
cm.operation(function() { |
|||
if (type == "skip") { |
|||
cm.execCommand("goCharRight"); |
|||
} else if (type == "skipThree") { |
|||
for (var i = 0; i < 3; i++) |
|||
cm.execCommand("goCharRight"); |
|||
} else if (type == "surround") { |
|||
var sels = cm.getSelections(); |
|||
for (var i = 0; i < sels.length; i++) |
|||
sels[i] = left + sels[i] + right; |
|||
cm.replaceSelections(sels, "around"); |
|||
} else if (type == "both") { |
|||
cm.replaceSelection(left + right, null); |
|||
cm.execCommand("goCharLeft"); |
|||
} else if (type == "addFour") { |
|||
cm.replaceSelection(left + left + left + left, "before"); |
|||
cm.execCommand("goCharRight"); |
|||
} |
|||
}); |
|||
}; |
|||
if (left != right) map["'" + right + "'"] = function(cm) { |
|||
var ranges = cm.listSelections(); |
|||
for (var i = 0; i < ranges.length; i++) { |
|||
var range = ranges[i]; |
|||
if (!range.empty() || |
|||
cm.getRange(range.head, Pos(range.head.line, range.head.ch + 1)) != right) |
|||
return CodeMirror.Pass; |
|||
} |
|||
cm.execCommand("goCharRight"); |
|||
}; |
|||
})(pairs.charAt(i), pairs.charAt(i + 1)); |
|||
return map; |
|||
} |
|||
|
|||
function buildExplodeHandler(pairs) { |
|||
return function(cm) { |
|||
if (cm.getOption("disableInput")) return CodeMirror.Pass; |
|||
var ranges = cm.listSelections(); |
|||
for (var i = 0; i < ranges.length; i++) { |
|||
if (!ranges[i].empty()) return CodeMirror.Pass; |
|||
var around = charsAround(cm, ranges[i].head); |
|||
if (!around || pairs.indexOf(around) % 2 != 0) return CodeMirror.Pass; |
|||
} |
|||
cm.operation(function() { |
|||
cm.replaceSelection("\n\n", null); |
|||
cm.execCommand("goCharLeft"); |
|||
ranges = cm.listSelections(); |
|||
for (var i = 0; i < ranges.length; i++) { |
|||
var line = ranges[i].head.line; |
|||
cm.indentLine(line, null, true); |
|||
cm.indentLine(line + 1, null, true); |
|||
} |
|||
}); |
|||
}; |
|||
} |
|||
}); |
|||
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
|||
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
|||
|
|||
(function(mod) { |
|||
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
|||
mod(require("../../lib/codemirror")); |
|||
else if (typeof define == "function" && define.amd) // AMD
|
|||
define(["../../lib/codemirror"], mod); |
|||
else // Plain browser env
|
|||
mod(CodeMirror); |
|||
})(function(CodeMirror) { |
|||
var DEFAULT_BRACKETS = "()[]{}''\"\""; |
|||
var DEFAULT_TRIPLES = "'\""; |
|||
var DEFAULT_EXPLODE_ON_ENTER = "[]{}"; |
|||
var SPACE_CHAR_REGEX = /\s/; |
|||
|
|||
var Pos = CodeMirror.Pos; |
|||
|
|||
CodeMirror.defineOption("autoCloseBrackets", false, function(cm, val, old) { |
|||
if (old != CodeMirror.Init && old) |
|||
cm.removeKeyMap("autoCloseBrackets"); |
|||
if (!val) return; |
|||
var pairs = DEFAULT_BRACKETS, triples = DEFAULT_TRIPLES, explode = DEFAULT_EXPLODE_ON_ENTER; |
|||
if (typeof val == "string") pairs = val; |
|||
else if (typeof val == "object") { |
|||
if (val.pairs != null) pairs = val.pairs; |
|||
if (val.triples != null) triples = val.triples; |
|||
if (val.explode != null) explode = val.explode; |
|||
} |
|||
var map = buildKeymap(pairs, triples); |
|||
if (explode) map.Enter = buildExplodeHandler(explode); |
|||
cm.addKeyMap(map); |
|||
}); |
|||
|
|||
function charsAround(cm, pos) { |
|||
var str = cm.getRange(Pos(pos.line, pos.ch - 1), |
|||
Pos(pos.line, pos.ch + 1)); |
|||
return str.length == 2 ? str : null; |
|||
} |
|||
|
|||
// Project the token type that will exists after the given char is
|
|||
// typed, and use it to determine whether it would cause the start
|
|||
// of a string token.
|
|||
function enteringString(cm, pos, ch) { |
|||
var line = cm.getLine(pos.line); |
|||
var token = cm.getTokenAt(pos); |
|||
if (/\bstring2?\b/.test(token.type)) return false; |
|||
var stream = new CodeMirror.StringStream(line.slice(0, pos.ch) + ch + line.slice(pos.ch), 4); |
|||
stream.pos = stream.start = token.start; |
|||
for (;;) { |
|||
var type1 = cm.getMode().token(stream, token.state); |
|||
if (stream.pos >= pos.ch + 1) return /\bstring2?\b/.test(type1); |
|||
stream.start = stream.pos; |
|||
} |
|||
} |
|||
|
|||
function buildKeymap(pairs, triples) { |
|||
var map = { |
|||
name : "autoCloseBrackets", |
|||
Backspace: function(cm) { |
|||
if (cm.getOption("disableInput")) return CodeMirror.Pass; |
|||
var ranges = cm.listSelections(); |
|||
for (var i = 0; i < ranges.length; i++) { |
|||
if (!ranges[i].empty()) return CodeMirror.Pass; |
|||
var around = charsAround(cm, ranges[i].head); |
|||
if (!around || pairs.indexOf(around) % 2 != 0) return CodeMirror.Pass; |
|||
} |
|||
for (var i = ranges.length - 1; i >= 0; i--) { |
|||
var cur = ranges[i].head; |
|||
cm.replaceRange("", Pos(cur.line, cur.ch - 1), Pos(cur.line, cur.ch + 1)); |
|||
} |
|||
} |
|||
}; |
|||
var closingBrackets = ""; |
|||
for (var i = 0; i < pairs.length; i += 2) (function(left, right) { |
|||
closingBrackets += right; |
|||
map["'" + left + "'"] = function(cm) { |
|||
if (cm.getOption("disableInput")) return CodeMirror.Pass; |
|||
var ranges = cm.listSelections(), type, next; |
|||
for (var i = 0; i < ranges.length; i++) { |
|||
var range = ranges[i], cur = range.head, curType; |
|||
var next = cm.getRange(cur, Pos(cur.line, cur.ch + 1)); |
|||
if (!range.empty()) { |
|||
curType = "surround"; |
|||
} else if (left == right && next == right) { |
|||
if (cm.getRange(cur, Pos(cur.line, cur.ch + 3)) == left + left + left) |
|||
curType = "skipThree"; |
|||
else |
|||
curType = "skip"; |
|||
} else if (left == right && cur.ch > 1 && triples.indexOf(left) >= 0 && |
|||
cm.getRange(Pos(cur.line, cur.ch - 2), cur) == left + left && |
|||
(cur.ch <= 2 || cm.getRange(Pos(cur.line, cur.ch - 3), Pos(cur.line, cur.ch - 2)) != left)) { |
|||
curType = "addFour"; |
|||
} else if (left == '"' || left == "'") { |
|||
if (!CodeMirror.isWordChar(next) && enteringString(cm, cur, left)) curType = "both"; |
|||
else return CodeMirror.Pass; |
|||
} else if (cm.getLine(cur.line).length == cur.ch || closingBrackets.indexOf(next) >= 0 || SPACE_CHAR_REGEX.test(next)) { |
|||
curType = "both"; |
|||
} else { |
|||
return CodeMirror.Pass; |
|||
} |
|||
if (!type) type = curType; |
|||
else if (type != curType) return CodeMirror.Pass; |
|||
} |
|||
|
|||
cm.operation(function() { |
|||
if (type == "skip") { |
|||
cm.execCommand("goCharRight"); |
|||
} else if (type == "skipThree") { |
|||
for (var i = 0; i < 3; i++) |
|||
cm.execCommand("goCharRight"); |
|||
} else if (type == "surround") { |
|||
var sels = cm.getSelections(); |
|||
for (var i = 0; i < sels.length; i++) |
|||
sels[i] = left + sels[i] + right; |
|||
cm.replaceSelections(sels, "around"); |
|||
} else if (type == "both") { |
|||
cm.replaceSelection(left + right, null); |
|||
cm.execCommand("goCharLeft"); |
|||
} else if (type == "addFour") { |
|||
cm.replaceSelection(left + left + left + left, "before"); |
|||
cm.execCommand("goCharRight"); |
|||
} |
|||
}); |
|||
}; |
|||
if (left != right) map["'" + right + "'"] = function(cm) { |
|||
var ranges = cm.listSelections(); |
|||
for (var i = 0; i < ranges.length; i++) { |
|||
var range = ranges[i]; |
|||
if (!range.empty() || |
|||
cm.getRange(range.head, Pos(range.head.line, range.head.ch + 1)) != right) |
|||
return CodeMirror.Pass; |
|||
} |
|||
cm.execCommand("goCharRight"); |
|||
}; |
|||
})(pairs.charAt(i), pairs.charAt(i + 1)); |
|||
return map; |
|||
} |
|||
|
|||
function buildExplodeHandler(pairs) { |
|||
return function(cm) { |
|||
if (cm.getOption("disableInput")) return CodeMirror.Pass; |
|||
var ranges = cm.listSelections(); |
|||
for (var i = 0; i < ranges.length; i++) { |
|||
if (!ranges[i].empty()) return CodeMirror.Pass; |
|||
var around = charsAround(cm, ranges[i].head); |
|||
if (!around || pairs.indexOf(around) % 2 != 0) return CodeMirror.Pass; |
|||
} |
|||
cm.operation(function() { |
|||
cm.replaceSelection("\n\n", null); |
|||
cm.execCommand("goCharLeft"); |
|||
ranges = cm.listSelections(); |
|||
for (var i = 0; i < ranges.length; i++) { |
|||
var line = ranges[i].head.line; |
|||
cm.indentLine(line, null, true); |
|||
cm.indentLine(line + 1, null, true); |
|||
} |
|||
}); |
|||
}; |
|||
} |
|||
}); |
@ -1,166 +1,166 @@ |
|||
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
|||
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
|||
|
|||
/** |
|||
* Tag-closer extension for CodeMirror. |
|||
* |
|||
* This extension adds an "autoCloseTags" option that can be set to |
|||
* either true to get the default behavior, or an object to further |
|||
* configure its behavior. |
|||
* |
|||
* These are supported options: |
|||
* |
|||
* `whenClosing` (default true) |
|||
* Whether to autoclose when the '/' of a closing tag is typed. |
|||
* `whenOpening` (default true) |
|||
* Whether to autoclose the tag when the final '>' of an opening |
|||
* tag is typed. |
|||
* `dontCloseTags` (default is empty tags for HTML, none for XML) |
|||
* An array of tag names that should not be autoclosed. |
|||
* `indentTags` (default is block tags for HTML, none for XML) |
|||
* An array of tag names that should, when opened, cause a |
|||
* blank line to be added inside the tag, and the blank line and |
|||
* closing line to be indented. |
|||
* |
|||
* See demos/closetag.html for a usage example. |
|||
*/ |
|||
|
|||
(function(mod) { |
|||
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
|||
mod(require("../../lib/codemirror"), require("../fold/xml-fold")); |
|||
else if (typeof define == "function" && define.amd) // AMD
|
|||
define(["../../lib/codemirror", "../fold/xml-fold"], mod); |
|||
else // Plain browser env
|
|||
mod(CodeMirror); |
|||
})(function(CodeMirror) { |
|||
CodeMirror.defineOption("autoCloseTags", false, function(cm, val, old) { |
|||
if (old != CodeMirror.Init && old) |
|||
cm.removeKeyMap("autoCloseTags"); |
|||
if (!val) return; |
|||
var map = {name: "autoCloseTags"}; |
|||
if (typeof val != "object" || val.whenClosing) |
|||
map["'/'"] = function(cm) { return autoCloseSlash(cm); }; |
|||
if (typeof val != "object" || val.whenOpening) |
|||
map["'>'"] = function(cm) { return autoCloseGT(cm); }; |
|||
cm.addKeyMap(map); |
|||
}); |
|||
|
|||
var htmlDontClose = ["area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "meta", "param", |
|||
"source", "track", "wbr"]; |
|||
var htmlIndent = ["applet", "blockquote", "body", "button", "div", "dl", "fieldset", "form", "frameset", "h1", "h2", "h3", "h4", |
|||
"h5", "h6", "head", "html", "iframe", "layer", "legend", "object", "ol", "p", "select", "table", "ul"]; |
|||
|
|||
function autoCloseGT(cm) { |
|||
if (cm.getOption("disableInput")) return CodeMirror.Pass; |
|||
var ranges = cm.listSelections(), replacements = []; |
|||
for (var i = 0; i < ranges.length; i++) { |
|||
if (!ranges[i].empty()) return CodeMirror.Pass; |
|||
var pos = ranges[i].head, tok = cm.getTokenAt(pos); |
|||
var inner = CodeMirror.innerMode(cm.getMode(), tok.state), state = inner.state; |
|||
if (inner.mode.name != "xml" || !state.tagName) return CodeMirror.Pass; |
|||
|
|||
var opt = cm.getOption("autoCloseTags"), html = inner.mode.configuration == "html"; |
|||
var dontCloseTags = (typeof opt == "object" && opt.dontCloseTags) || (html && htmlDontClose); |
|||
var indentTags = (typeof opt == "object" && opt.indentTags) || (html && htmlIndent); |
|||
|
|||
var tagName = state.tagName; |
|||
if (tok.end > pos.ch) tagName = tagName.slice(0, tagName.length - tok.end + pos.ch); |
|||
var lowerTagName = tagName.toLowerCase(); |
|||
// Don't process the '>' at the end of an end-tag or self-closing tag
|
|||
if (!tagName || |
|||
tok.type == "string" && (tok.end != pos.ch || !/[\"\']/.test(tok.string.charAt(tok.string.length - 1)) || tok.string.length == 1) || |
|||
tok.type == "tag" && state.type == "closeTag" || |
|||
tok.string.indexOf("/") == (tok.string.length - 1) || // match something like <someTagName />
|
|||
dontCloseTags && indexOf(dontCloseTags, lowerTagName) > -1 || |
|||
closingTagExists(cm, tagName, pos, state, true)) |
|||
return CodeMirror.Pass; |
|||
|
|||
var indent = indentTags && indexOf(indentTags, lowerTagName) > -1; |
|||
replacements[i] = {indent: indent, |
|||
text: ">" + (indent ? "\n\n" : "") + "</" + tagName + ">", |
|||
newPos: indent ? CodeMirror.Pos(pos.line + 1, 0) : CodeMirror.Pos(pos.line, pos.ch + 1)}; |
|||
} |
|||
|
|||
for (var i = ranges.length - 1; i >= 0; i--) { |
|||
var info = replacements[i]; |
|||
cm.replaceRange(info.text, ranges[i].head, ranges[i].anchor, "+insert"); |
|||
var sel = cm.listSelections().slice(0); |
|||
sel[i] = {head: info.newPos, anchor: info.newPos}; |
|||
cm.setSelections(sel); |
|||
if (info.indent) { |
|||
cm.indentLine(info.newPos.line, null, true); |
|||
cm.indentLine(info.newPos.line + 1, null, true); |
|||
} |
|||
} |
|||
} |
|||
|
|||
function autoCloseCurrent(cm, typingSlash) { |
|||
var ranges = cm.listSelections(), replacements = []; |
|||
var head = typingSlash ? "/" : "</"; |
|||
for (var i = 0; i < ranges.length; i++) { |
|||
if (!ranges[i].empty()) return CodeMirror.Pass; |
|||
var pos = ranges[i].head, tok = cm.getTokenAt(pos); |
|||
var inner = CodeMirror.innerMode(cm.getMode(), tok.state), state = inner.state; |
|||
if (typingSlash && (tok.type == "string" || tok.string.charAt(0) != "<" || |
|||
tok.start != pos.ch - 1)) |
|||
return CodeMirror.Pass; |
|||
// Kludge to get around the fact that we are not in XML mode
|
|||
// when completing in JS/CSS snippet in htmlmixed mode. Does not
|
|||
// work for other XML embedded languages (there is no general
|
|||
// way to go from a mixed mode to its current XML state).
|
|||
if (inner.mode.name != "xml") { |
|||
if (cm.getMode().name == "htmlmixed" && inner.mode.name == "javascript") |
|||
replacements[i] = head + "script>"; |
|||
else if (cm.getMode().name == "htmlmixed" && inner.mode.name == "css") |
|||
replacements[i] = head + "style>"; |
|||
else |
|||
return CodeMirror.Pass; |
|||
} else { |
|||
if (!state.context || !state.context.tagName || |
|||
closingTagExists(cm, state.context.tagName, pos, state)) |
|||
return CodeMirror.Pass; |
|||
replacements[i] = head + state.context.tagName + ">"; |
|||
} |
|||
} |
|||
cm.replaceSelections(replacements); |
|||
ranges = cm.listSelections(); |
|||
for (var i = 0; i < ranges.length; i++) |
|||
if (i == ranges.length - 1 || ranges[i].head.line < ranges[i + 1].head.line) |
|||
cm.indentLine(ranges[i].head.line); |
|||
} |
|||
|
|||
function autoCloseSlash(cm) { |
|||
if (cm.getOption("disableInput")) return CodeMirror.Pass; |
|||
return autoCloseCurrent(cm, true); |
|||
} |
|||
|
|||
CodeMirror.commands.closeTag = function(cm) { return autoCloseCurrent(cm); }; |
|||
|
|||
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; |
|||
} |
|||
|
|||
// If xml-fold is loaded, we use its functionality to try and verify
|
|||
// whether a given tag is actually unclosed.
|
|||
function closingTagExists(cm, tagName, pos, state, newTag) { |
|||
if (!CodeMirror.scanForClosingTag) return false; |
|||
var end = Math.min(cm.lastLine() + 1, pos.line + 500); |
|||
var nextClose = CodeMirror.scanForClosingTag(cm, pos, null, end); |
|||
if (!nextClose || nextClose.tag != tagName) return false; |
|||
var cx = state.context; |
|||
// If the immediate wrapping context contains onCx instances of
|
|||
// the same tag, a closing tag only exists if there are at least
|
|||
// that many closing tags of that type following.
|
|||
for (var onCx = newTag ? 1 : 0; cx && cx.tagName == tagName; cx = cx.prev) ++onCx; |
|||
pos = nextClose.to; |
|||
for (var i = 1; i < onCx; i++) { |
|||
var next = CodeMirror.scanForClosingTag(cm, pos, null, end); |
|||
if (!next || next.tag != tagName) return false; |
|||
pos = next.to; |
|||
} |
|||
return true; |
|||
} |
|||
}); |
|||
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
|||
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
|||
|
|||
/** |
|||
* Tag-closer extension for CodeMirror. |
|||
* |
|||
* This extension adds an "autoCloseTags" option that can be set to |
|||
* either true to get the default behavior, or an object to further |
|||
* configure its behavior. |
|||
* |
|||
* These are supported options: |
|||
* |
|||
* `whenClosing` (default true) |
|||
* Whether to autoclose when the '/' of a closing tag is typed. |
|||
* `whenOpening` (default true) |
|||
* Whether to autoclose the tag when the final '>' of an opening |
|||
* tag is typed. |
|||
* `dontCloseTags` (default is empty tags for HTML, none for XML) |
|||
* An array of tag names that should not be autoclosed. |
|||
* `indentTags` (default is block tags for HTML, none for XML) |
|||
* An array of tag names that should, when opened, cause a |
|||
* blank line to be added inside the tag, and the blank line and |
|||
* closing line to be indented. |
|||
* |
|||
* See demos/closetag.html for a usage example. |
|||
*/ |
|||
|
|||
(function(mod) { |
|||
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
|||
mod(require("../../lib/codemirror"), require("../fold/xml-fold")); |
|||
else if (typeof define == "function" && define.amd) // AMD
|
|||
define(["../../lib/codemirror", "../fold/xml-fold"], mod); |
|||
else // Plain browser env
|
|||
mod(CodeMirror); |
|||
})(function(CodeMirror) { |
|||
CodeMirror.defineOption("autoCloseTags", false, function(cm, val, old) { |
|||
if (old != CodeMirror.Init && old) |
|||
cm.removeKeyMap("autoCloseTags"); |
|||
if (!val) return; |
|||
var map = {name: "autoCloseTags"}; |
|||
if (typeof val != "object" || val.whenClosing) |
|||
map["'/'"] = function(cm) { return autoCloseSlash(cm); }; |
|||
if (typeof val != "object" || val.whenOpening) |
|||
map["'>'"] = function(cm) { return autoCloseGT(cm); }; |
|||
cm.addKeyMap(map); |
|||
}); |
|||
|
|||
var htmlDontClose = ["area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "meta", "param", |
|||
"source", "track", "wbr"]; |
|||
var htmlIndent = ["applet", "blockquote", "body", "button", "div", "dl", "fieldset", "form", "frameset", "h1", "h2", "h3", "h4", |
|||
"h5", "h6", "head", "html", "iframe", "layer", "legend", "object", "ol", "p", "select", "table", "ul"]; |
|||
|
|||
function autoCloseGT(cm) { |
|||
if (cm.getOption("disableInput")) return CodeMirror.Pass; |
|||
var ranges = cm.listSelections(), replacements = []; |
|||
for (var i = 0; i < ranges.length; i++) { |
|||
if (!ranges[i].empty()) return CodeMirror.Pass; |
|||
var pos = ranges[i].head, tok = cm.getTokenAt(pos); |
|||
var inner = CodeMirror.innerMode(cm.getMode(), tok.state), state = inner.state; |
|||
if (inner.mode.name != "xml" || !state.tagName) return CodeMirror.Pass; |
|||
|
|||
var opt = cm.getOption("autoCloseTags"), html = inner.mode.configuration == "html"; |
|||
var dontCloseTags = (typeof opt == "object" && opt.dontCloseTags) || (html && htmlDontClose); |
|||
var indentTags = (typeof opt == "object" && opt.indentTags) || (html && htmlIndent); |
|||
|
|||
var tagName = state.tagName; |
|||
if (tok.end > pos.ch) tagName = tagName.slice(0, tagName.length - tok.end + pos.ch); |
|||
var lowerTagName = tagName.toLowerCase(); |
|||
// Don't process the '>' at the end of an end-tag or self-closing tag
|
|||
if (!tagName || |
|||
tok.type == "string" && (tok.end != pos.ch || !/[\"\']/.test(tok.string.charAt(tok.string.length - 1)) || tok.string.length == 1) || |
|||
tok.type == "tag" && state.type == "closeTag" || |
|||
tok.string.indexOf("/") == (tok.string.length - 1) || // match something like <someTagName />
|
|||
dontCloseTags && indexOf(dontCloseTags, lowerTagName) > -1 || |
|||
closingTagExists(cm, tagName, pos, state, true)) |
|||
return CodeMirror.Pass; |
|||
|
|||
var indent = indentTags && indexOf(indentTags, lowerTagName) > -1; |
|||
replacements[i] = {indent: indent, |
|||
text: ">" + (indent ? "\n\n" : "") + "</" + tagName + ">", |
|||
newPos: indent ? CodeMirror.Pos(pos.line + 1, 0) : CodeMirror.Pos(pos.line, pos.ch + 1)}; |
|||
} |
|||
|
|||
for (var i = ranges.length - 1; i >= 0; i--) { |
|||
var info = replacements[i]; |
|||
cm.replaceRange(info.text, ranges[i].head, ranges[i].anchor, "+insert"); |
|||
var sel = cm.listSelections().slice(0); |
|||
sel[i] = {head: info.newPos, anchor: info.newPos}; |
|||
cm.setSelections(sel); |
|||
if (info.indent) { |
|||
cm.indentLine(info.newPos.line, null, true); |
|||
cm.indentLine(info.newPos.line + 1, null, true); |
|||
} |
|||
} |
|||
} |
|||
|
|||
function autoCloseCurrent(cm, typingSlash) { |
|||
var ranges = cm.listSelections(), replacements = []; |
|||
var head = typingSlash ? "/" : "</"; |
|||
for (var i = 0; i < ranges.length; i++) { |
|||
if (!ranges[i].empty()) return CodeMirror.Pass; |
|||
var pos = ranges[i].head, tok = cm.getTokenAt(pos); |
|||
var inner = CodeMirror.innerMode(cm.getMode(), tok.state), state = inner.state; |
|||
if (typingSlash && (tok.type == "string" || tok.string.charAt(0) != "<" || |
|||
tok.start != pos.ch - 1)) |
|||
return CodeMirror.Pass; |
|||
// Kludge to get around the fact that we are not in XML mode
|
|||
// when completing in JS/CSS snippet in htmlmixed mode. Does not
|
|||
// work for other XML embedded languages (there is no general
|
|||
// way to go from a mixed mode to its current XML state).
|
|||
if (inner.mode.name != "xml") { |
|||
if (cm.getMode().name == "htmlmixed" && inner.mode.name == "javascript") |
|||
replacements[i] = head + "script>"; |
|||
else if (cm.getMode().name == "htmlmixed" && inner.mode.name == "css") |
|||
replacements[i] = head + "style>"; |
|||
else |
|||
return CodeMirror.Pass; |
|||
} else { |
|||
if (!state.context || !state.context.tagName || |
|||
closingTagExists(cm, state.context.tagName, pos, state)) |
|||
return CodeMirror.Pass; |
|||
replacements[i] = head + state.context.tagName + ">"; |
|||
} |
|||
} |
|||
cm.replaceSelections(replacements); |
|||
ranges = cm.listSelections(); |
|||
for (var i = 0; i < ranges.length; i++) |
|||
if (i == ranges.length - 1 || ranges[i].head.line < ranges[i + 1].head.line) |
|||
cm.indentLine(ranges[i].head.line); |
|||
} |
|||
|
|||
function autoCloseSlash(cm) { |
|||
if (cm.getOption("disableInput")) return CodeMirror.Pass; |
|||
return autoCloseCurrent(cm, true); |
|||
} |
|||
|
|||
CodeMirror.commands.closeTag = function(cm) { return autoCloseCurrent(cm); }; |
|||
|
|||
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; |
|||
} |
|||
|
|||
// If xml-fold is loaded, we use its functionality to try and verify
|
|||
// whether a given tag is actually unclosed.
|
|||
function closingTagExists(cm, tagName, pos, state, newTag) { |
|||
if (!CodeMirror.scanForClosingTag) return false; |
|||
var end = Math.min(cm.lastLine() + 1, pos.line + 500); |
|||
var nextClose = CodeMirror.scanForClosingTag(cm, pos, null, end); |
|||
if (!nextClose || nextClose.tag != tagName) return false; |
|||
var cx = state.context; |
|||
// If the immediate wrapping context contains onCx instances of
|
|||
// the same tag, a closing tag only exists if there are at least
|
|||
// that many closing tags of that type following.
|
|||
for (var onCx = newTag ? 1 : 0; cx && cx.tagName == tagName; cx = cx.prev) ++onCx; |
|||
pos = nextClose.to; |
|||
for (var i = 1; i < onCx; i++) { |
|||
var next = CodeMirror.scanForClosingTag(cm, pos, null, end); |
|||
if (!next || next.tag != tagName) return false; |
|||
pos = next.to; |
|||
} |
|||
return true; |
|||
} |
|||
}); |
@ -1,51 +1,51 @@ |
|||
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
|||
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
|||
|
|||
(function(mod) { |
|||
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
|||
mod(require("../../lib/codemirror")); |
|||
else if (typeof define == "function" && define.amd) // AMD
|
|||
define(["../../lib/codemirror"], mod); |
|||
else // Plain browser env
|
|||
mod(CodeMirror); |
|||
})(function(CodeMirror) { |
|||
"use strict"; |
|||
|
|||
var listRE = /^(\s*)(>[> ]*|[*+-]\s|(\d+)\.)(\s*)/, |
|||
emptyListRE = /^(\s*)(>[> ]*|[*+-]|(\d+)\.)(\s*)$/, |
|||
unorderedListRE = /[*+-]\s/; |
|||
|
|||
CodeMirror.commands.newlineAndIndentContinueMarkdownList = function(cm) { |
|||
if (cm.getOption("disableInput")) return CodeMirror.Pass; |
|||
var ranges = cm.listSelections(), replacements = []; |
|||
for (var i = 0; i < ranges.length; i++) { |
|||
var pos = ranges[i].head, match; |
|||
var eolState = cm.getStateAfter(pos.line); |
|||
var inList = eolState.list !== false; |
|||
var inQuote = eolState.quote !== false; |
|||
|
|||
if (!ranges[i].empty() || (!inList && !inQuote) || !(match = cm.getLine(pos.line).match(listRE))) { |
|||
cm.execCommand("newlineAndIndent"); |
|||
return; |
|||
} |
|||
if (cm.getLine(pos.line).match(emptyListRE)) { |
|||
cm.replaceRange("", { |
|||
line: pos.line, ch: 0 |
|||
}, { |
|||
line: pos.line, ch: pos.ch + 1 |
|||
}); |
|||
replacements[i] = "\n"; |
|||
|
|||
} else { |
|||
var indent = match[1], after = match[4]; |
|||
var bullet = unorderedListRE.test(match[2]) || match[2].indexOf(">") >= 0 |
|||
? match[2] |
|||
: (parseInt(match[3], 10) + 1) + "."; |
|||
|
|||
replacements[i] = "\n" + indent + bullet + after; |
|||
} |
|||
} |
|||
|
|||
cm.replaceSelections(replacements); |
|||
}; |
|||
}); |
|||
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
|||
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
|||
|
|||
(function(mod) { |
|||
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
|||
mod(require("../../lib/codemirror")); |
|||
else if (typeof define == "function" && define.amd) // AMD
|
|||
define(["../../lib/codemirror"], mod); |
|||
else // Plain browser env
|
|||
mod(CodeMirror); |
|||
})(function(CodeMirror) { |
|||
"use strict"; |
|||
|
|||
var listRE = /^(\s*)(>[> ]*|[*+-]\s|(\d+)\.)(\s*)/, |
|||
emptyListRE = /^(\s*)(>[> ]*|[*+-]|(\d+)\.)(\s*)$/, |
|||
unorderedListRE = /[*+-]\s/; |
|||
|
|||
CodeMirror.commands.newlineAndIndentContinueMarkdownList = function(cm) { |
|||
if (cm.getOption("disableInput")) return CodeMirror.Pass; |
|||
var ranges = cm.listSelections(), replacements = []; |
|||
for (var i = 0; i < ranges.length; i++) { |
|||
var pos = ranges[i].head, match; |
|||
var eolState = cm.getStateAfter(pos.line); |
|||
var inList = eolState.list !== false; |
|||
var inQuote = eolState.quote !== false; |
|||
|
|||
if (!ranges[i].empty() || (!inList && !inQuote) || !(match = cm.getLine(pos.line).match(listRE))) { |
|||
cm.execCommand("newlineAndIndent"); |
|||
return; |
|||
} |
|||
if (cm.getLine(pos.line).match(emptyListRE)) { |
|||
cm.replaceRange("", { |
|||
line: pos.line, ch: 0 |
|||
}, { |
|||
line: pos.line, ch: pos.ch + 1 |
|||
}); |
|||
replacements[i] = "\n"; |
|||
|
|||
} else { |
|||
var indent = match[1], after = match[4]; |
|||
var bullet = unorderedListRE.test(match[2]) || match[2].indexOf(">") >= 0 |
|||
? match[2] |
|||
: (parseInt(match[3], 10) + 1) + "."; |
|||
|
|||
replacements[i] = "\n" + indent + bullet + after; |
|||
} |
|||
} |
|||
|
|||
cm.replaceSelections(replacements); |
|||
}; |
|||
}); |
@ -1,120 +1,120 @@ |
|||
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
|||
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
|||
|
|||
(function(mod) { |
|||
if (typeof exports == "object" && typeof module == "object") // CommonJS
|
|||
mod(require("../../lib/codemirror")); |
|||
else if (typeof define == "function" && define.amd) // AMD
|
|||
define(["../../lib/codemirror"], mod); |
|||
else // Plain browser env
|
|||
mod(CodeMirror); |
|||
})(function(CodeMirror) { |
|||
var ie_lt8 = /MSIE \d/.test(navigator.userAgent) && |
|||
(document.documentMode == null || document.documentMode < 8); |
|||
|
|||
var Pos = CodeMirror.Pos; |
|||
|
|||
var matching = {"(": ")>", ")": "(<", "[": "]>", "]": "[<", "{": "}>", "}": "{<"}; |
|||
|
|||
function findMatchingBracket(cm, where, strict, config) { |
|||
var line = cm.getLineHandle(where.line), pos = where.ch - 1; |
|||
var match = (pos >= 0 && matching[line.text.charAt(pos)]) || matching[line.text.charAt(++pos)]; |
|||
if (!match) return null; |
|||
var dir = match.charAt(1) == ">" ? 1 : -1; |
|||
if (strict && (dir > 0) != (pos == where.ch)) return null; |
|||
var style = cm.getTokenTypeAt(Pos(where.line, pos + 1)); |
|||
|
|||
var found = scanForBracket(cm, Pos(where.line, pos + (dir > 0 ? 1 : 0)), dir, style || null, config); |
|||
if (found == null) return null; |
|||
return {from: Pos(where.line, pos), to: found && found.pos, |
|||
match: found && found.ch == match.charAt(0), forward: dir > 0}; |
|||
} |
|||
|
|||
// bracketRegex is used to specify which type of bracket to scan
|
|||
// should be a regexp, e.g. /[[\]]/
|
|||
//
|
|||
// Note: If "where" is on an open bracket, then this bracket is ignored.
|
|||
//
|
|||
// Returns false when no bracket was found, null when it reached
|
|||
// maxScanLines and gave up
|
|||
function scanForBracket(cm, where, dir, style, config) { |
|||
var maxScanLen = (config && config.maxScanLineLength) || 10000; |
|||
var maxScanLines = (config && config.maxScanLines) || 1000; |
|||
|
|||
var stack = []; |
|||
var re = config && config.bracketRegex ? config.bracketRegex : /[(){}[\]]/; |
|||
var lineEnd = dir > 0 ? Math.min(where.line + maxScanLines, cm.lastLine() + 1) |
|||
: Math.max(cm.firstLine() - 1, where.line - maxScanLines); |
|||
for (var lineNo = where.line; lineNo != lineEnd; lineNo += dir) { |
|||
var line = cm.getLine(lineNo); |
|||
if (!line) continue; |
|||
var pos = dir > 0 ? 0 : line.length - 1, end = dir > 0 ? line.length : -1; |
|||
if (line.length > maxScanLen) continue; |
|||
if (lineNo == where.line) pos = where.ch - (dir < 0 ? 1 : 0); |
|||
for (; pos != end; pos += dir) { |
|||
var ch = line.charAt(pos); |
|||
if (re.test(ch) && (style === undefined || cm.getTokenTypeAt(Pos(lineNo, pos + 1)) == style)) { |
|||
var match = matching[ch]; |
|||
if ((match.charAt(1) == ">") == (dir > 0)) stack.push(ch); |
|||
else if (!stack.length) return {pos: Pos(lineNo, pos), ch: ch}; |
|||
else stack.pop(); |
|||
} |
|||
} |
|||
} |
|||
return lineNo - dir == (dir > 0 ? cm.lastLine() : cm.firstLine()) ? false : null; |
|||
} |
|||
|
|||
function matchBrackets(cm, autoclear, config) { |
|||
// Disable brace matching in long lines, since it'll cause hugely slow updates
|
|||
var maxHighlightLen = cm.state.matchBrackets.maxHighlightLineLength || 1000; |
|||
var marks = [], ranges = cm.listSelections(); |
|||
for (var i = 0; i < ranges.length; i++) { |
|||
var match = ranges[i].empty() && findMatchingBracket(cm, ranges[i].head, false, config); |
|||
if (match && cm.getLine(match.from.line).length <= maxHighlightLen) { |
|||
var style = match.match ? "CodeMirror-matchingbracket" : "CodeMirror-nonmatchingbracket"; |
|||
marks.push(cm.markText(match.from, Pos(match.from.line, match.from.ch + 1), {className: style})); |
|||
if (match.to && cm.getLine(match.to.line).length <= maxHighlightLen) |
|||
marks.push(cm.markText(match.to, Pos(match.to.line, match.to.ch + 1), {className: style})); |
|||
} |
|||
} |
|||
|
|||
if (marks.length) { |
|||
// Kludge to work around the IE bug from issue #1193, where text
|
|||
// input stops going to the textare whever this fires.
|
|||
if (ie_lt8 && cm.state.focused) cm.focus(); |
|||
|
|||
var clear = function() { |
|||
cm.operation(function() { |
|||
for (var i = 0; i < marks.length; i++) marks[i].clear(); |
|||
}); |
|||
}; |
|||
if (autoclear) setTimeout(clear, 800); |
|||
else return clear; |
|||
} |
|||
} |
|||
|
|||
var currentlyHighlighted = null; |
|||
function doMatchBrackets(cm) { |
|||
cm.operation(function() { |
|||
if (currentlyHighlighted) {currentlyHighlighted(); currentlyHighlighted = null;} |
|||
currentlyHighlighted = matchBrackets(cm, false, cm.state.matchBrackets); |
|||
}); |
|||
} |
|||
|
|||
CodeMirror.defineOption("matchBrackets", false, function(cm, val, old) { |
|||
if (old && old != CodeMirror.Init) |
|||
cm.off("cursorActivity", doMatchBrackets); |
|||
if (val) { |
|||
cm.state.matchBrackets = typeof val == "object" ? val : {}; |
|||
cm.on("cursorActivity", doMatchBrackets); |
|||
} |
|||
}); |
|||
|
|||
CodeMirror.defineExtension("matchBrackets", function() {matchBrackets(this, true);}); |
|||
CodeMirror.defineExtension("findMatchingBracket", function(pos, strict, config){ |
|||
return findMatchingBracket(this, pos, strict, config); |
|||
}); |
|||
CodeMirror.defineExtension("scanForBracket", function(pos, dir, style, config){ |
|||
return scanForBracket(this, pos, dir, style, config); |
|||
}); |
|||
}); |
|||
// CodeMirror, copyright (c) by Marijn Haverbeke and others
|
|||
// Distributed under an MIT license: http://codemirror.net/LICENSE
|
|||
|
|||