📄 tiny_mce_src.js
字号:
s += (s ? ' ' : '') + k + ': ' + v + ';';
}
});
return s;
},
loadCSS : function(u) {
var t = this, d = t.doc;
if (!u)
u = '';
each(u.split(','), function(u) {
if (t.files[u])
return;
t.files[u] = true;
t.add(t.select('head')[0], 'link', {rel : 'stylesheet', href : tinymce._addVer(u)});
});
},
// #if !jquery
addClass : function(e, c) {
return this.run(e, function(e) {
var o;
if (!c)
return 0;
if (this.hasClass(e, c))
return e.className;
o = this.removeClass(e, c);
return e.className = (o != '' ? (o + ' ') : '') + c;
});
},
removeClass : function(e, c) {
var t = this, re;
return t.run(e, function(e) {
var v;
if (t.hasClass(e, c)) {
if (!re)
re = new RegExp("(^|\\s+)" + c + "(\\s+|$)", "g");
v = e.className.replace(re, ' ');
return e.className = tinymce.trim(v != ' ' ? v : '');
}
return e.className;
});
},
hasClass : function(n, c) {
n = this.get(n);
if (!n || !c)
return false;
return (' ' + n.className + ' ').indexOf(' ' + c + ' ') !== -1;
},
show : function(e) {
return this.setStyle(e, 'display', 'block');
},
hide : function(e) {
return this.setStyle(e, 'display', 'none');
},
isHidden : function(e) {
e = this.get(e);
return e.style.display == 'none' || this.getStyle(e, 'display') == 'none';
},
// #endif
uniqueId : function(p) {
return (!p ? 'mce_' : p) + (this.counter++);
},
setHTML : function(e, h) {
var t = this;
return this.run(e, function(e) {
var x, i, nl, n, p, x;
h = t.processHTML(h);
if (isIE) {
function set() {
try {
// IE will remove comments from the beginning
// unless you padd the contents with something
e.innerHTML = '<br />' + h;
e.removeChild(e.firstChild);
} catch (ex) {
// IE sometimes produces an unknown runtime error on innerHTML if it's an block element within a block element for example a div inside a p
// This seems to fix this problem
// Remove all child nodes
while (e.firstChild)
e.firstChild.removeNode();
// Create new div with HTML contents and a BR infront to keep comments
x = t.create('div');
x.innerHTML = '<br />' + h;
// Add all children from div to target
each (x.childNodes, function(n, i) {
// Skip br element
if (i)
e.appendChild(n);
});
}
};
// IE has a serious bug when it comes to paragraphs it can produce an invalid
// DOM tree if contents like this <p><ul><li>Item 1</li></ul></p> is inserted
// It seems to be that IE doesn't like a root block element placed inside another root block element
if (t.settings.fix_ie_paragraphs)
h = h.replace(/<p><\/p>|<p([^>]+)><\/p>|<p[^\/+]\/>/gi, '<p$1 mce_keep="true"> </p>');
set();
if (t.settings.fix_ie_paragraphs) {
// Check for odd paragraphs this is a sign of a broken DOM
nl = e.getElementsByTagName("p");
for (i = nl.length - 1, x = 0; i >= 0; i--) {
n = nl[i];
if (!n.hasChildNodes()) {
if (!n.mce_keep) {
x = 1; // Is broken
break;
}
n.removeAttribute('mce_keep');
}
}
}
// Time to fix the madness IE left us
if (x) {
// So if we replace the p elements with divs and mark them and then replace them back to paragraphs
// after we use innerHTML we can fix the DOM tree
h = h.replace(/<p([^>]+)>|<p>/g, '<div$1 mce_tmp="1">');
h = h.replace(/<\/p>/g, '</div>');
// Set the new HTML with DIVs
set();
// Replace all DIV elements with he mce_tmp attibute back to paragraphs
// This is needed since IE has a annoying bug see above for details
// This is a slow process but it has to be done. :(
if (t.settings.fix_ie_paragraphs) {
nl = e.getElementsByTagName("DIV");
for (i = nl.length - 1; i >= 0; i--) {
n = nl[i];
// Is it a temp div
if (n.mce_tmp) {
// Create new paragraph
p = t.doc.createElement('p');
// Copy all attributes
n.cloneNode(false).outerHTML.replace(/([a-z0-9\-_]+)=/gi, function(a, b) {
var v;
if (b !== 'mce_tmp') {
v = n.getAttribute(b);
if (!v && b === 'class')
v = n.className;
p.setAttribute(b, v);
}
});
// Append all children to new paragraph
for (x = 0; x<n.childNodes.length; x++)
p.appendChild(n.childNodes[x].cloneNode(true));
// Replace div with new paragraph
n.swapNode(p);
}
}
}
}
} else
e.innerHTML = h;
return h;
});
},
processHTML : function(h) {
var t = this, s = t.settings;
if (!s.process_html)
return h;
// Convert strong and em to b and i in FF since it can't handle them
if (tinymce.isGecko) {
h = h.replace(/<(\/?)strong>|<strong( [^>]+)>/gi, '<$1b$2>');
h = h.replace(/<(\/?)em>|<em( [^>]+)>/gi, '<$1i$2>');
} else if (isIE)
h = h.replace(/'/g, '''); // IE can't handle apos
// Fix some issues
h = h.replace(/<a( )([^>]+)\/>|<a\/>/gi, '<a$1$2></a>'); // Force open
// Store away src and href in mce_src and mce_href since browsers mess them up
if (s.keep_values) {
h = h.replace(/<!\[CDATA\[([\s\S]+)\]\]>/g, '<!--[CDATA[$1]]-->');
// Wrap scripts and styles in comments for serialization purposes
if (/<script|style/.test(h)) {
function trim(s) {
// Remove prefix and suffix code for element
s = s.replace(/^[\r\n]*|[\r\n]*$/g, '');
s = s.replace(/^\s*(\/\/\s*<!--|\/\/\s*<\[CDATA\[|<!--|<\[CDATA\[)[\r\n]*/g, '');
s = s.replace(/\s*(\/\/\s*\]\]>|\/\/\s*-->|\]\]>|-->)\s*$/g, '');
return s;
};
// Preserve script elements
h = h.replace(/<script([^>]+|)>([\s\S]*?)<\/script>/g, function(v, a, b) {
// Remove prefix and suffix code for script element
b = trim(b);
// Force type attribute
if (!a)
a = ' type="text/javascript"';
// Wrap contents in a comment
if (b)
b = '<!--\n' + b + '\n// -->';
// Output fake element
return '<mce:script' + a + '>' + b + '</mce:script>';
});
// Preserve style elements
h = h.replace(/<style([^>]+|)>([\s\S]*?)<\/style>/g, function(v, a, b) {
b = trim(b);
return '<mce:style' + a + '><!--\n' + b + '\n--></mce:style><style' + a + ' mce_bogus="1">' + b + '</style>';
});
}
// Process all tags with src, href or style
h = h.replace(/<([\w:]+) [^>]*(src|href|style|shape|coords)[^>]*>/gi, function(a, n) {
function handle(m, b, c) {
var u = c;
// Tag already got a mce_ version
if (a.indexOf('mce_' + b) != -1)
return m;
if (b == 'style') {
// Why did I need this one?
//if (isIE)
// u = t.serializeStyle(t.parseStyle(u));
// No mce_style for elements with these since they might get resized by the user
if (t._isRes(c))
return m;
if (s.hex_colors) {
u = u.replace(/rgb\([^\)]+\)/g, function(v) {
return t.toHex(v);
});
}
if (s.url_converter) {
u = u.replace(/url\([\'\"]?([^\)\'\"]+)\)/g, function(x, c) {
return 'url(' + t.encode(s.url_converter.call(s.url_converter_scope || t, t.decode(c), b, n)) + ')';
});
}
} else if (b != 'coords' && b != 'shape') {
if (s.url_converter)
u = t.encode(s.url_converter.call(s.url_converter_scope || t, t.decode(c), b, n));
}
return ' ' + b + '="' + c + '" mce_' + b + '="' + u + '"';
};
a = a.replace(/ (src|href|style|coords|shape)=[\"]([^\"]+)[\"]/gi, handle); // W3C
a = a.replace(/ (src|href|style|coords|shape)=[\']([^\']+)[\']/gi, handle); // W3C
return a.replace(/ (src|href|style|coords|shape)=([^\s\"\'>]+)/gi, handle); // IE
});
}
return h;
},
getOuterHTML : function(e) {
var d;
e = this.get(e);
if (!e)
return null;
if (isIE)
return e.outerHTML;
d = (e.ownerDocument || this.doc).createElement("body");
d.appendChild(e.cloneNode(true));
return d.innerHTML;
},
setOuterHTML : function(e, h, d) {
var t = this;
return this.run(e, function(e) {
var n, tp;
e = t.get(e);
d = d || e.ownerDocument || t.doc;
if (isIE && e.nodeType == 1)
e.outerHTML = h;
else {
tp = d.createElement("body");
tp.innerHTML = h;
n = tp.lastChild;
while (n) {
t.insertAfter(n.cloneNode(true), e);
n = n.previousSibling;
}
t.remove(e);
}
});
},
decode : function(s) {
var e;
// Look for entities to decode
if (/&[^;]+;/.test(s)) {
// Decode the entities using a div element not super efficient but less code
e = this.doc.createElement("div");
e.innerHTML = s;
return !e.firstChild ? s : e.firstChild.nodeValue;
}
return s;
},
encode : function(s) {
return s ? ('' + s).replace(/[<>&\"]/g, function (c, b) {
switch (c) {
case '&':
return '&';
case '"':
return '"';
case '<':
return '<';
case '>':
return '>';
}
return c;
}) : s;
},
// #if !jquery
insertAfter : function(n, r) {
var t = this;
r = t.get(r);
return this.run(n, function(n) {
var p, ns;
p = r.parentNode;
ns = r.nextSibling;
if (ns)
p.insertBefore(n, ns);
else
p.appendChild(n);
return n;
});
},
// #endif
isBlock : function(n) {
if (n.nodeType && n.nodeType !== 1)
return false;
n = n.nodeName || n;
return /^(H[1-6]|HR|P|DIV|ADDRESS|PRE|FORM|TABLE|LI|OL|UL|TD|CAPTION|BLOCKQUOTE|CENTER|DL|DT|DD|DIR|FIELDSET|NOSCRIPT|NOFRAMES|MENU|ISINDEX|SAMP)$/.test(n);
},
// #if !jquery
replace : function(n, o, k) {
if (is(o, 'array'))
n = n.cloneNode(true);
return this.run(o, function(o) {
if (k) {
each(o.childNodes, function(c) {
n.appendChild(c.cloneNode(true));
});
}
// Fix IE psuedo leak for elements since replacing elements if fairly common
// Will break parentNode for some unknown reason
/* if (isIE && o.nodeType === 1) {
o.parentNode.insertBefore(n, o);
o.outerHTML = '';
return n;
}*/
return o.parentNode.replaceChild(n, o);
});
},
// #endif
toHex : function(s) {
var c = /^\s*rgb\s*?\(\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?\)\s*$/i.exec(s);
function hex(s) {
s = parseInt(s).toString(16);
return s.length > 1 ? s : '0' + s; // 0 -> 00
};
if (c) {
s = '#' + hex(c[1]) + hex(c[2]) + hex(c[3]);
return s;
}
return s;
},
getClasses : function() {
var t = this, cl = [], i, lo = {}, f = t.settings.class_filter, ov;
if (t.classes)
return t.classes;
function addClasses(s) {
// IE style imports
each(s.imports, function(r) {
addClasses(r);
});
each(s.cssRules || s.rules, function(r) {
// Real type or fake it on IE
switch (r.type || 1) {
// Rule
case 1:
if (r.selectorText) {
each(r.selectorText.split(','), function(v) {
v = v.replace(/^\s*|\s*$|^\s\./g, "");
// Is internal or it doesn't contain a class
if (/\.mce/.test(v) || !/\.[\w\-]+$/.test(v))
return;
// Remove everything but class name
ov = v;
v = v.replace(/.*\.([a-z0-9_\-]+).*/i, '$1');
// Filter classes
if (f && !(v = f(v, ov)))
return;
if (!lo[v]) {
cl.push({'class' : v});
lo[v] = 1;
}
});
}
break;
// Import
case 3:
addClasses(r.styleSheet);
break;
}
});
};
try {
each(t.doc.styleSheets, addClasses);
} catch (ex) {
// Ignore
}
if (cl.length > 0)
t.classes = cl;
return cl;
},
run : function(e, f, s) {
var t = this, o;
if (t.doc && typeof(e) === 'string')
e = t.get(e);
if (!e)
return false;
s = s || this;
if (!e.nodeType && (e.length || e.length === 0)) {
o = [];
each(e, function(e, i) {
if (e) {
if (typeof(e) == 'string')
e = t.doc.getElementById(e);
o.push(f.call(s, e, i));
}
});
return o;
}
return f.call(s, e);
},
getAttribs : function(n) {
var o;
n = this.get(n);
if (!n)
return [];
if (isIE) {
o = [];
// Object will throw exception in IE
if (n.nodeName == 'OBJECT')
return n.attributes;
// It's crazy that this is faster in IE but it's because it returns all attributes all the time
n.cloneNode(false).outerHTML.replace(/([a-z0-9\:\-_]+)=/gi, function(a, b) {
o.push({specified : 1, nodeName : b});
});
return o;
}
return n.attributes;
},
destroy : function(s) {
var t = this;
t.win = t.doc = t.root = null;
// Manual destroy then remove unload handler
if (!s)
tinymce.removeUnload(t.destroy);
},
_isRes : function(c) {
// Is live resizble element
return /^(top|left|bottom|right|width|height)/i.test(c) || /;\s*(top|left|bottom|right|width|height)/i.test(c);
}
/*
walk : function(n, f, s) {
var d = this.doc, w;
if (d.createTreeWalker) {
w = d.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, false);
while ((n = w.nextNode()) != null)
f.call(s || this, n);
} else
tinymce.walk(n, f, 'childNodes', s);
}
*/
/*
toRGB : function(s) {
var c = /^\s*?#([0-9A-F]{2})([0-9A-F]{1,2})([0-9A-F]{2})?\s*?$/.exec(s);
if (c) {
// #FFF -> #FFFFFF
if (!is(c[3]))
c[3] = c[2] = c[1];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -