You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
information-system/js/kindeditor/plugins/ace/ace.js

301 lines
11 KiB
JavaScript

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

var aceeditor='';
var ke_edit_h = 0;
var ke_edit_w = 0;
var isfullscreen=false;
KindEditor.plugin('ace', function(K) {
var editor = this, name = 'ace',clickcount=0;
//单击按钮, clickcount=0显示ace编辑器clickcount=1隐藏ace编辑器
editor.clickToolbar(name, function(){
if (clickcount==0) {
var need_clear=false;
if (editor.html()=='') {
need_clear=true;
};
//在文字视图中选中的内容
var selectedHtml=editor.selectedHtml();
var isnoselection=false;
if (!selectedHtml) {
editor.insertHtml('<!--wozhedoushiweiledingweia-->');
selectedHtml='<!--wozhedoushiweiledingweia-->';
isnoselection=true;
};
//判断ace编辑器是否已存在不存在则重新初始化
if($("#ace-editor").length==0) {
showace();
}
//根据全屏与否设置调试信息容器位置
fullscreen_set();
//设置ace编辑器内容及其样式
if (need_clear) {
aceeditor.setValue('');
}else{
aceeditor.setValue(editor.html());
}
if (!isnoselection) {
//判断是否图片、图片的话用图片路径判断
if (selectedHtml.match(/<img(.*)>/g)) {
var ispicture=selectedHtml.match(/src="([^">]+)/g);
selectedHtml=ispicture[0];
};
//选择多段落时分开搜索
selectedHtml=selectedHtml.replace(/<\/ul>/g,'');
selectedHtml=selectedHtml.replace(/<ul.*?>/ig,'');
selectedHtml=selectedHtml.replace(/<\/li>/g,'<p>');
selectedHtml=selectedHtml.replace(/<li.*?>/ig,'');
selectedHtml=selectedHtml.replace(/<\/h.*?>/g,'<p>');
selectedHtml=selectedHtml.replace(/<h.*?>/ig,'');
selectedHtml=selectedHtml.replace(/ data-ke-src=\".*?\"/ig,'');
selectedHtml=selectedHtml.replace(/&amp;/ig,'&');
selectedHtml=selectedHtml.replace(/<p.*?>/g,'<p>');
var duanluo=selectedHtml.split('<p>');
setTimeout(function(){
for (var i =0;i<duanluo.length; i++) {
duanluo[i]=duanluo[i].replace(/<\/p>/,'');
if (duanluo[i]!='') {
selectedHtml=duanluo[i];
dingwei(selectedHtml,false);
};
};
},100);
}
else
{
setTimeout(dingwei(selectedHtml,true),100);
}
$(".ke-toolbar>span").addClass("ke-disabled").css({"opacity":"0.5"});
$(".ke-icon-ace").parent("span").removeClass("ke-disabled").css({"opacity":"1.0"});
$(".ke-statusbar").hide();
$("#tecate-errors").show();
clickcount=1;
}else{
//aceeditor.insert('<em id="conghtmldingweidaoshejishitu"></em>');
editor.html(aceeditor.getValue());
//var $dingweiyuansu=$("iframe.ke-edit-iframe").contents().find("#conghtmldingweidaoshejishitu");
//$("iframe.ke-edit-iframe").contents().find(".ke-content").scrollTop($dingweiyuansu.offset().top-200);
//$dingweiyuansu.remove();
$("#ace-editor,#tecate-errors").hide();
$(".ke-toolbar>span").removeClass("ke-disabled").css({"opacity":"1.0"});
$(".ke-statusbar").show();
if(is_fullscreen()==false)$(".ke-edit").css({"height":ke_edit_h-100});
clickcount=0;
}
//实时同步内容、并检测html完整性
aceeditor.getSession().on('change', function(e) {
editor.html(aceeditor.getValue());
//validatehtml(aceeditor.getValue());
});
aceeditor.getSession().setUseWrapMode(true);
});
});
//查找指定内容
function dingwei(selectedHtml,isnoselection)
{
var range=aceeditor.find(selectedHtml, {
skipCurrent: true,
backwards: false,
wrap: true,
regExp: false,
caseSensitive: false,
wholeWord: false
});
if (range) {
var haha=range.toString();
var start=haha.indexOf('[');
var end=haha.indexOf(']');
haha=haha.substr((start+1));
var linenum=haha.split('/')[0];
aceeditor.gotoLine(++linenum);
aceeditor.session.highlight(aceeditor.$search.$options.re);
isnoselection==true && aceeditor.replace('',selectedHtml);
aceeditor.addSelectionMarker(range);
setTimeout(function(){
aceeditor.removeSelectionMarker(range);
},1800);
};
}
//ace编辑器初始化
function showace()
{
var ace_style ='margin:0;position:absolute;top:0;left:0;';
$(".ke-edit-iframe").after('<div id="ace-editor" style="'+ace_style+'"></div>');
$(".ke-edit").css({"position":"relative"});
aceeditor = ace.edit("ace-editor");
aceeditor.setTheme("ace/theme/dreamweaver");
aceeditor.getSession().setMode("ace/mode/html");
$("<div id='tecate-errors'></div>").appendTo(".ke-edit");
}
//根据全屏与否设置调试信息容器位置
function fullscreen_set()
{
ke_edit_h = $(".ke-edit-iframe").height();
ke_edit_w = $(".ke-edit-iframe").width();
if(is_fullscreen()){
ke_edit_h=ke_edit_h-90;
$("#ace-editor").css({"width":ke_edit_w,"height":ke_edit_h,"display":"block"});
$("#tecate-errors").css({height:"50px"});
}else{
$("#ace-editor").css({"width":ke_edit_w,"height":ke_edit_h,"display":"block"});
$(".ke-edit").css({"height":ke_edit_h=ke_edit_h+80});
$("#tecate-errors").css({height:"40px"});
}
$("#tecate-errors").css({
position:"absolute",
bottom:0,
left:0,
width:"100%",
padding: "10px 0px",
"border-top":"10px solid #e8e8e8",
"border-bottom":"10px solid #e8e8e8",
backgroundColor: '#f2dede',
color: '#b94a48',
fontFamily: '"Helvetica Neue", Helvetica, sans-serif',
fontSize: '14px',
"overflow-y": "scroll"
});
}
//html完整性检测
function validatehtml(htmldata)
{
$('#tecate-errors').html('');
Tecate.getPageSource(Tecate.evaluateHTML,htmldata);
}
function is_fullscreen(){
if($("div.ke-container").css("position")=="absolute"){
return true;
}else{
return false;
}
}
//html完整性检测具体过程
var Tecate = Tecate || {};
//可用的html元素
Tecate.validHTMLElements = [ "a", "abbr", "acronym", "address", "applet", "area", "article", "aside", "audio", "b", "base", "basefont", "bdi", "bdo", "bgsound", "big", "blink", "blockquote", "body", "br", "button", "canvas", "caption", "center", "cite", "code", "colgroup", "del", "details", "dfn", "dir", "div", "dl", "!doctype", "dt","dd", "em", "embed", "fieldset", "figcaption", "figure", "font", "footer", "form", "frame", "h1", "h2", "h3", "h4", "h5", "h6", "head", "header", "hgroup", "hr", "html", "i", "iframe", "img", "input", "ins", "kbd", "keygen", "label", "legend", "li", "link", "listing", "map", "mark", "marquee", "menu", "meta", "meter", "nav", "noscript", "object", "ol", "optgroup", "option", "output", "p", "param", "plaintext", "pre", "progress", "q", "ruby", "s", "samp", "script", "section", "select", "small", "source", "span", "strike", "strong", "style", "sub", "summary", "sup", "table", "tbody", "td", "textarea", "tfoot", "th", "thead", "time", "title", "tr", "track", "tt", "u", "ul", "var", "video", "wbr", "xmp" ];
Tecate.missingClosingBracket = {
'regex': new RegExp("(<[^>]+<)", "g"),
'message': "Opening bracket with no closing bracket"
},
Tecate.invalidHTMLElement = {
'regex': new RegExp("(<(?!/\?" + Tecate.validHTMLElements.join("\\b|/\?") + "\\b)[^ \n>]+)", "gi"),
'message': "Opening HTML tag without a valid element name"
},
Tecate.missingEquals = {
'regex': new RegExp("(<[^=>]+['\"]\\S+['\"]([^>]*>)?)", "g"),
'message': "Missing equals sign for attribute"
},
Tecate.missingQuoteAfterEquals = {
'regex': new RegExp("( [^\"']+=[^'\"]+['\"])[ >]", "g"),
'message': "Missing quote after equals sign for attribute"
},
Tecate.missingQuoteAtEndOfAttribute = {
'regex': new RegExp("(\\S+=['\"][^'\">]+(>|['\"][^ />]))", "g"),
'message': "Missing quote at the end of the attribute"
};
Tecate.errors = [
Tecate.missingQuoteAtEndOfAttribute,
Tecate.missingQuoteAfterEquals,
Tecate.missingClosingBracket,
Tecate.missingEquals,
Tecate.invalidHTMLElement
];
Tecate.getPageSource = function(callback,htmldata) {
return callback(htmldata);
};
Tecate.insertErrorDiv = function() {
var list = $("<ul id='tecate-errors-list'></ul>").css({
padding: "0 10px",
backgroundColor: '#f2dede',
margin: 0
});
$('#tecate-errors').html(list);
};
Tecate.htmlEscapes = {
'&': '&amp;',
'<': '&lt;',
'>': '&gt;',
'"': '&quot;',
"'": '&#x27;',
'/': '&#x2F;'
};
Tecate.htmlEscaper = /[&<>"'\/]/g;
// Escape a string for HTML interpolation.
Tecate.escapeHTML = function(unsafe) {
return ('' + unsafe).replace(Tecate.htmlEscaper, function(match) {
return Tecate.htmlEscapes[match];
});
};
Tecate.appendError = function(error) {
$("#tecate-errors-list").append($("<li>" + error.errorString + ': <code>' + Tecate.escapeHTML(error.error) + '</code> on line ' + error.line + "</li>"));
};
Tecate.showErrors = function(errorsList) {
if (errorsList.length === 0) {
return;
}
Tecate.insertErrorDiv();
for (var i = 0; i < errorsList.length; i++) {
Tecate.appendError(errorsList[i]);
}
};
Tecate.getErrorLines = function(idx, html) {
var lines = html.split('\n');
var count = 0;
for (var i = 0; i < lines.length; i++) {
count = count + lines[i].length;
if (idx <= count) {
return i + 1;
}
}
return lines.length;
};
Tecate.stripComments = function(html) {
return html.replace(/<!--([\s\S]*)--(\s*)>/g, "");
};
/**
* Note, this is dumb - won't get dynamically inserted scripts or anything
*/
Tecate.stripTag = function(html, tagName) {
return html.replace(new RegExp(
"<" + tagName + "[^>]*>([\\s\\S]*)</" + tagName + ">", "g"), "");
};
// XXX this should return the errorsList and delegate to another function to
// render
Tecate.evaluateHTML = function(html) {
var result;
var errorsList = [];
var noScripts = Tecate.stripTag(html, 'script');
var noStyles = Tecate.stripTag(noScripts, 'style');
var commentFreeHtml = Tecate.stripComments(noStyles);
for (var i = 0; i < Tecate.errors.length; i++) {
var error = Tecate.errors[i];
while ((result = error.regex.exec(commentFreeHtml)) !== null) {
errorsList.push({
'errorString': error.message,
'error': result[1],
'line': Tecate.getErrorLines(html.indexOf(result[1]), html),
'html': html
});
}
}
Tecate.showErrors(errorsList);
};