123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612 |
- /**
- * 插入代码插件
- * @file
- * @since 1.2.6.1
- */
- UE.plugins["insertcode"] = function() {
- var me = this;
- me.ready(function() {
- utils.cssRule(
- "pre",
- "pre{margin:.5em 0;padding:.4em .6em;border-radius:8px;background:#f8f8f8;}",
- me.document
- );
- });
- me.setOpt("insertcode", {
- as3: "ActionScript3",
- bash: "Bash/Shell",
- cpp: "C/C++",
- css: "Css",
- cf: "CodeFunction",
- "c#": "C#",
- delphi: "Delphi",
- diff: "Diff",
- erlang: "Erlang",
- groovy: "Groovy",
- html: "Html",
- java: "Java",
- jfx: "JavaFx",
- js: "Javascript",
- pl: "Perl",
- php: "Php",
- plain: "Plain Text",
- ps: "PowerShell",
- python: "Python",
- ruby: "Ruby",
- scala: "Scala",
- sql: "Sql",
- vb: "Vb",
- xml: "Xml"
- });
- /**
- * 插入代码
- * @command insertcode
- * @method execCommand
- * @param { String } cmd 命令字符串
- * @param { String } lang 插入代码的语言
- * @example
- * ```javascript
- * editor.execCommand( 'insertcode', 'javascript' );
- * ```
- */
- /**
- * 如果选区所在位置是插入插入代码区域,返回代码的语言
- * @command insertcode
- * @method queryCommandValue
- * @param { String } cmd 命令字符串
- * @return { String } 返回代码的语言
- * @example
- * ```javascript
- * editor.queryCommandValue( 'insertcode' );
- * ```
- */
- me.commands["insertcode"] = {
- execCommand: function(cmd, lang) {
- var me = this,
- rng = me.selection.getRange(),
- pre = domUtils.findParentByTagName(rng.startContainer, "pre", true);
- if (pre) {
- pre.className = "brush:" + lang + ";toolbar:false;";
- } else {
- var code = "";
- if (rng.collapsed) {
- code = browser.ie && browser.ie11below
- ? browser.version <= 8 ? " " : ""
- : "<br/>";
- } else {
- var frag = rng.extractContents();
- var div = me.document.createElement("div");
- div.appendChild(frag);
- utils.each(
- UE.filterNode(
- UE.htmlparser(div.innerHTML.replace(/[\r\t]/g, "")),
- me.options.filterTxtRules
- ).children,
- function(node) {
- if (browser.ie && browser.ie11below && browser.version > 8) {
- if (node.type == "element") {
- if (node.tagName == "br") {
- code += "\n";
- } else if (!dtd.$empty[node.tagName]) {
- utils.each(node.children, function(cn) {
- if (cn.type == "element") {
- if (cn.tagName == "br") {
- code += "\n";
- } else if (!dtd.$empty[node.tagName]) {
- code += cn.innerText();
- }
- } else {
- code += cn.data;
- }
- });
- if (!/\n$/.test(code)) {
- code += "\n";
- }
- }
- } else {
- code += node.data + "\n";
- }
- if (!node.nextSibling() && /\n$/.test(code)) {
- code = code.replace(/\n$/, "");
- }
- } else {
- if (browser.ie && browser.ie11below) {
- if (node.type == "element") {
- if (node.tagName == "br") {
- code += "<br>";
- } else if (!dtd.$empty[node.tagName]) {
- utils.each(node.children, function(cn) {
- if (cn.type == "element") {
- if (cn.tagName == "br") {
- code += "<br>";
- } else if (!dtd.$empty[node.tagName]) {
- code += cn.innerText();
- }
- } else {
- code += cn.data;
- }
- });
- if (!/br>$/.test(code)) {
- code += "<br>";
- }
- }
- } else {
- code += node.data + "<br>";
- }
- if (!node.nextSibling() && /<br>$/.test(code)) {
- code = code.replace(/<br>$/, "");
- }
- } else {
- code += node.type == "element"
- ? dtd.$empty[node.tagName] ? "" : node.innerText()
- : node.data;
- if (!/br\/?\s*>$/.test(code)) {
- if (!node.nextSibling()) return;
- code += "<br>";
- }
- }
- }
- }
- );
- }
- me.execCommand(
- "inserthtml",
- '<pre id="coder"class="brush:' +
- lang +
- ';toolbar:false">' +
- code +
- "</pre>",
- true
- );
- pre = me.document.getElementById("coder");
- domUtils.removeAttributes(pre, "id");
- var tmpNode = pre.previousSibling;
- if (
- tmpNode &&
- ((tmpNode.nodeType == 3 &&
- tmpNode.nodeValue.length == 1 &&
- browser.ie &&
- browser.version == 6) ||
- domUtils.isEmptyBlock(tmpNode))
- ) {
- domUtils.remove(tmpNode);
- }
- var rng = me.selection.getRange();
- if (domUtils.isEmptyBlock(pre)) {
- rng.setStart(pre, 0).setCursor(false, true);
- } else {
- rng.selectNodeContents(pre).select();
- }
- }
- },
- queryCommandValue: function() {
- var path = this.selection.getStartElementPath();
- var lang = "";
- utils.each(path, function(node) {
- if (node.nodeName == "PRE") {
- var match = node.className.match(/brush:([^;]+)/);
- lang = match && match[1] ? match[1] : "";
- return false;
- }
- });
- return lang;
- }
- };
- me.addInputRule(function(root) {
- utils.each(root.getNodesByTagName("pre"), function(pre) {
- var brs = pre.getNodesByTagName("br");
- if (brs.length) {
- browser.ie &&
- browser.ie11below &&
- browser.version > 8 &&
- utils.each(brs, function(br) {
- var txt = UE.uNode.createText("\n");
- br.parentNode.insertBefore(txt, br);
- br.parentNode.removeChild(br);
- });
- return;
- }
- if (browser.ie && browser.ie11below && browser.version > 8) return;
- var code = pre.innerText().split(/\n/);
- pre.innerHTML("");
- utils.each(code, function(c) {
- if (c.length) {
- pre.appendChild(UE.uNode.createText(c));
- }
- pre.appendChild(UE.uNode.createElement("br"));
- });
- });
- });
- me.addOutputRule(function(root) {
- utils.each(root.getNodesByTagName("pre"), function(pre) {
- var code = "";
- utils.each(pre.children, function(n) {
- if (n.type == "text") {
- //在ie下文本内容有可能末尾带有\n要去掉
- //trace:3396
- code += n.data.replace(/[ ]/g, " ").replace(/\n$/, "");
- } else {
- if (n.tagName == "br") {
- code += "\n";
- } else {
- code += !dtd.$empty[n.tagName] ? "" : n.innerText();
- }
- }
- });
- pre.innerText(code.replace(/( |\n)+$/, ""));
- });
- });
- //不需要判断highlight的command列表
- me.notNeedCodeQuery = {
- help: 1,
- undo: 1,
- redo: 1,
- source: 1,
- print: 1,
- searchreplace: 1,
- fullscreen: 1,
- preview: 1,
- insertparagraph: 1,
- elementpath: 1,
- insertcode: 1,
- inserthtml: 1,
- selectall: 1
- };
- //将queyCommamndState重置
- var orgQuery = me.queryCommandState;
- me.queryCommandState = function(cmd) {
- var me = this;
- if (
- !me.notNeedCodeQuery[cmd.toLowerCase()] &&
- me.selection &&
- me.queryCommandValue("insertcode")
- ) {
- return -1;
- }
- return UE.Editor.prototype.queryCommandState.apply(this, arguments);
- };
- me.addListener("beforeenterkeydown", function() {
- var rng = me.selection.getRange();
- var pre = domUtils.findParentByTagName(rng.startContainer, "pre", true);
- if (pre) {
- me.fireEvent("saveScene");
- if (!rng.collapsed) {
- rng.deleteContents();
- }
- if (!browser.ie || browser.ie9above) {
- var tmpNode = me.document.createElement("br"),
- pre;
- rng.insertNode(tmpNode).setStartAfter(tmpNode).collapse(true);
- var next = tmpNode.nextSibling;
- if (!next && (!browser.ie || browser.version > 10)) {
- rng.insertNode(tmpNode.cloneNode(false));
- } else {
- rng.setStartAfter(tmpNode);
- }
- pre = tmpNode.previousSibling;
- var tmp;
- while (pre) {
- tmp = pre;
- pre = pre.previousSibling;
- if (!pre || pre.nodeName == "BR") {
- pre = tmp;
- break;
- }
- }
- if (pre) {
- var str = "";
- while (
- pre &&
- pre.nodeName != "BR" &&
- new RegExp("^[\\s" + domUtils.fillChar + "]*$").test(pre.nodeValue)
- ) {
- str += pre.nodeValue;
- pre = pre.nextSibling;
- }
- if (pre.nodeName != "BR") {
- var match = pre.nodeValue.match(
- new RegExp("^([\\s" + domUtils.fillChar + "]+)")
- );
- if (match && match[1]) {
- str += match[1];
- }
- }
- if (str) {
- str = me.document.createTextNode(str);
- rng.insertNode(str).setStartAfter(str);
- }
- }
- rng.collapse(true).select(true);
- } else {
- if (browser.version > 8) {
- var txt = me.document.createTextNode("\n");
- var start = rng.startContainer;
- if (rng.startOffset == 0) {
- var preNode = start.previousSibling;
- if (preNode) {
- rng.insertNode(txt);
- var fillchar = me.document.createTextNode(" ");
- rng
- .setStartAfter(txt)
- .insertNode(fillchar)
- .setStart(fillchar, 0)
- .collapse(true)
- .select(true);
- }
- } else {
- rng.insertNode(txt).setStartAfter(txt);
- var fillchar = me.document.createTextNode(" ");
- start = rng.startContainer.childNodes[rng.startOffset];
- if (start && !/^\n/.test(start.nodeValue)) {
- rng.setStartBefore(txt);
- }
- rng
- .insertNode(fillchar)
- .setStart(fillchar, 0)
- .collapse(true)
- .select(true);
- }
- } else {
- var tmpNode = me.document.createElement("br");
- rng.insertNode(tmpNode);
- rng.insertNode(me.document.createTextNode(domUtils.fillChar));
- rng.setStartAfter(tmpNode);
- pre = tmpNode.previousSibling;
- var tmp;
- while (pre) {
- tmp = pre;
- pre = pre.previousSibling;
- if (!pre || pre.nodeName == "BR") {
- pre = tmp;
- break;
- }
- }
- if (pre) {
- var str = "";
- while (
- pre &&
- pre.nodeName != "BR" &&
- new RegExp("^[ " + domUtils.fillChar + "]*$").test(pre.nodeValue)
- ) {
- str += pre.nodeValue;
- pre = pre.nextSibling;
- }
- if (pre.nodeName != "BR") {
- var match = pre.nodeValue.match(
- new RegExp("^([ " + domUtils.fillChar + "]+)")
- );
- if (match && match[1]) {
- str += match[1];
- }
- }
- str = me.document.createTextNode(str);
- rng.insertNode(str).setStartAfter(str);
- }
- rng.collapse(true).select();
- }
- }
- me.fireEvent("saveScene");
- return true;
- }
- });
- me.addListener("tabkeydown", function(cmd, evt) {
- var rng = me.selection.getRange();
- var pre = domUtils.findParentByTagName(rng.startContainer, "pre", true);
- if (pre) {
- me.fireEvent("saveScene");
- if (evt.shiftKey) {
- } else {
- if (!rng.collapsed) {
- var bk = rng.createBookmark();
- var start = bk.start.previousSibling;
- while (start) {
- if (pre.firstChild === start && !domUtils.isBr(start)) {
- pre.insertBefore(me.document.createTextNode(" "), start);
- break;
- }
- if (domUtils.isBr(start)) {
- pre.insertBefore(
- me.document.createTextNode(" "),
- start.nextSibling
- );
- break;
- }
- start = start.previousSibling;
- }
- var end = bk.end;
- start = bk.start.nextSibling;
- if (pre.firstChild === bk.start) {
- pre.insertBefore(
- me.document.createTextNode(" "),
- start.nextSibling
- );
- }
- while (start && start !== end) {
- if (domUtils.isBr(start) && start.nextSibling) {
- if (start.nextSibling === end) {
- break;
- }
- pre.insertBefore(
- me.document.createTextNode(" "),
- start.nextSibling
- );
- }
- start = start.nextSibling;
- }
- rng.moveToBookmark(bk).select();
- } else {
- var tmpNode = me.document.createTextNode(" ");
- rng
- .insertNode(tmpNode)
- .setStartAfter(tmpNode)
- .collapse(true)
- .select(true);
- }
- }
- me.fireEvent("saveScene");
- return true;
- }
- });
- me.addListener("beforeinserthtml", function(evtName, html) {
- var me = this,
- rng = me.selection.getRange(),
- pre = domUtils.findParentByTagName(rng.startContainer, "pre", true);
- if (pre) {
- if (!rng.collapsed) {
- rng.deleteContents();
- }
- var htmlstr = "";
- if (browser.ie && browser.version > 8) {
- utils.each(
- UE.filterNode(UE.htmlparser(html), me.options.filterTxtRules)
- .children,
- function(node) {
- if (node.type == "element") {
- if (node.tagName == "br") {
- htmlstr += "\n";
- } else if (!dtd.$empty[node.tagName]) {
- utils.each(node.children, function(cn) {
- if (cn.type == "element") {
- if (cn.tagName == "br") {
- htmlstr += "\n";
- } else if (!dtd.$empty[node.tagName]) {
- htmlstr += cn.innerText();
- }
- } else {
- htmlstr += cn.data;
- }
- });
- if (!/\n$/.test(htmlstr)) {
- htmlstr += "\n";
- }
- }
- } else {
- htmlstr += node.data + "\n";
- }
- if (!node.nextSibling() && /\n$/.test(htmlstr)) {
- htmlstr = htmlstr.replace(/\n$/, "");
- }
- }
- );
- var tmpNode = me.document.createTextNode(
- utils.html(htmlstr.replace(/ /g, " "))
- );
- rng.insertNode(tmpNode).selectNode(tmpNode).select();
- } else {
- var frag = me.document.createDocumentFragment();
- utils.each(
- UE.filterNode(UE.htmlparser(html), me.options.filterTxtRules)
- .children,
- function(node) {
- if (node.type == "element") {
- if (node.tagName == "br") {
- frag.appendChild(me.document.createElement("br"));
- } else if (!dtd.$empty[node.tagName]) {
- utils.each(node.children, function(cn) {
- if (cn.type == "element") {
- if (cn.tagName == "br") {
- frag.appendChild(me.document.createElement("br"));
- } else if (!dtd.$empty[node.tagName]) {
- frag.appendChild(
- me.document.createTextNode(
- utils.html(cn.innerText().replace(/ /g, " "))
- )
- );
- }
- } else {
- frag.appendChild(
- me.document.createTextNode(
- utils.html(cn.data.replace(/ /g, " "))
- )
- );
- }
- });
- if (frag.lastChild.nodeName != "BR") {
- frag.appendChild(me.document.createElement("br"));
- }
- }
- } else {
- frag.appendChild(
- me.document.createTextNode(
- utils.html(node.data.replace(/ /g, " "))
- )
- );
- }
- if (!node.nextSibling() && frag.lastChild.nodeName == "BR") {
- frag.removeChild(frag.lastChild);
- }
- }
- );
- rng.insertNode(frag).select();
- }
- return true;
- }
- });
- //方向键的处理
- me.addListener("keydown", function(cmd, evt) {
- var me = this,
- keyCode = evt.keyCode || evt.which;
- if (keyCode == 40) {
- var rng = me.selection.getRange(),
- pre,
- start = rng.startContainer;
- if (
- rng.collapsed &&
- (pre = domUtils.findParentByTagName(rng.startContainer, "pre", true)) &&
- !pre.nextSibling
- ) {
- var last = pre.lastChild;
- while (last && last.nodeName == "BR") {
- last = last.previousSibling;
- }
- if (
- last === start ||
- (rng.startContainer === pre &&
- rng.startOffset == pre.childNodes.length)
- ) {
- me.execCommand("insertparagraph");
- domUtils.preventDefault(evt);
- }
- }
- }
- });
- //trace:3395
- me.addListener("delkeydown", function(type, evt) {
- var rng = this.selection.getRange();
- rng.txtToElmBoundary(true);
- var start = rng.startContainer;
- if (
- domUtils.isTagNode(start, "pre") &&
- rng.collapsed &&
- domUtils.isStartInblock(rng)
- ) {
- var p = me.document.createElement("p");
- domUtils.fillNode(me.document, p);
- start.parentNode.insertBefore(p, start);
- domUtils.remove(start);
- rng.setStart(p, 0).setCursor(false, true);
- domUtils.preventDefault(evt);
- return true;
- }
- });
- };
|