stylist.js
来自「Hippo CMS是一个以信息为中心的开源内容管理系统。Hippo CMS目标是」· JavaScript 代码 · 共 542 行 · 第 1/2 页
JS
542 行
{
var thiers = el.className.trim().split(' ');
var new_thiers = [ ];
var ours = classes.split(' ');
for(var x = 0; x < thiers.length; x++)
{
var exists = false;
for(var i = 0; exists == false && i < ours.length; i++)
{
if(ours[i] == thiers[x])
{
exists = true;
}
}
if(exists == false)
{
new_thiers[new_thiers.length] = thiers[x];
}
}
if(new_thiers.length == 0 && el._stylist_usedToBe && el._stylist_usedToBe.length > 0 && el._stylist_usedToBe[el._stylist_usedToBe.length - 1].className != null)
{
// Revert back to what we were IF the classes are identical
var last_el = el._stylist_usedToBe[el._stylist_usedToBe.length - 1];
var last_classes = HTMLArea.arrayFilter(last_el.className.trim().split(' '), function(c) { if (c == null || c.trim() == '') { return false;} return true; });
if(
(new_thiers.length == 0)
||
(
HTMLArea.arrayContainsArray(new_thiers, last_classes)
&& HTMLArea.arrayContainsArray(last_classes, new_thiers)
)
)
{
el = this.switchElementTag(el, last_el.tagName);
new_thiers = last_classes;
}
else
{
// We can't rely on the remembered tags any more
el._stylist_usedToBe = [ ];
}
}
if( new_thiers.length > 0
|| el.tagName.toLowerCase() != 'span'
|| (el.id && el.id != '')
)
{
el.className = new_thiers.join(' ').trim();
}
else
{
// Must be a span with no classes and no id, so we can splice it out
var prnt = el.parentNode;
var childs = el.childNodes;
for(var x = 0; x < childs.length; x++)
{
prnt.insertBefore(childs[x], el);
}
prnt.removeChild(el);
}
}
};
/**
* Change the tag of an element
*/
HTMLArea.prototype.switchElementTag = function(el, tag)
{
var prnt = el.parentNode;
var new_el = this._doc.createElement(tag);
if(HTMLArea.is_ie || el.hasAttribute('id')) new_el.setAttribute('id', el.getAttribute('id'));
if(HTMLArea.is_ie || el.hasAttribute('style')) new_el.setAttribute('style', el.getAttribute('style'));
var childs = el.childNodes;
for(var x = 0; x < childs.length; x++)
{
new_el.appendChild(childs[x].cloneNode(true));
}
prnt.insertBefore(new_el, el);
new_el._stylist_usedToBe = [el.tagName];
prnt.removeChild(el);
this.selectNodeContents(new_el);
return new_el;
};
HTMLArea.prototype._getAncestorsClassNames = function(sel)
{
// Scan upwards to find a block level element that we can change or apply to
var prnt = this._activeElement(sel);
if(prnt == null)
{
prnt = (HTMLArea.is_ie ? this._createRange(sel).parentElement() : this._createRange(sel).commonAncestorContainer);
}
var classNames = [ ];
while(prnt)
{
if(prnt.nodeType == 1)
{
var classes = prnt.className.trim().split(' ');
for(var x = 0; x < classes.length; x++)
{
classNames[classNames.length] = classes[x];
}
if(prnt.tagName.toLowerCase() == 'body') break;
if(prnt.tagName.toLowerCase() == 'table' ) break;
}
prnt = prnt.parentNode;
}
return classNames;
};
HTMLArea.prototype._ancestorsWithClasses = function(sel, tag, classes)
{
var ancestors = [ ];
var prnt = this._activeElement(sel);
if(prnt == null)
{
try
{
prnt = (HTMLArea.is_ie ? this._createRange(sel).parentElement() : this._createRange(sel).commonAncestorContainer);
}
catch(e)
{
return ancestors;
}
}
var search_classes = classes.trim().split(' ');
while(prnt)
{
if(prnt.nodeType == 1)
{
if(tag == null || prnt.tagName.toLowerCase() == tag)
{
var classes = prnt.className.trim().split(' ');
var found_all = true;
for(var i = 0; i < search_classes.length; i++)
{
var found_class = false;
for(var x = 0; x < classes.length; x++)
{
if(search_classes[i] == classes[x])
{
found_class = true;
break;
}
}
if(!found_class)
{
found_all = false;
break;
}
}
if(found_all) ancestors[ancestors.length] = prnt;
}
if(prnt.tagName.toLowerCase() == 'body') break;
if(prnt.tagName.toLowerCase() == 'table' ) break;
}
prnt = prnt.parentNode;
}
return ancestors;
};
HTMLArea.ripStylesFromCSSFile = function(URL)
{
var css = HTMLArea._geturlcontent(URL);
return HTMLArea.ripStylesFromCSSString(css);
};
HTMLArea.ripStylesFromCSSString = function(css)
{
// We are only interested in the selectors, the rules are not important
// so we'll drop out all coments and rules
RE_comment = /\/\*(.|\r|\n)*?\*\//g;
RE_rule = /\{(.|\r|\n)*?\}/g;
css = css.replace(RE_comment, '');
css = css.replace(RE_rule, ',');
// And split on commas
css = css.split(',');
// And add those into our structure
var selectors = { };
for(var x = 0; x < css.length; x++)
{
if(css[x].trim())
{
selectors[css[x].trim()] = css[x].trim();
}
}
return selectors;
};
// Make our right side panel and insert appropriatly
function Stylist(editor, args)
{
this.editor = editor;
editor._stylist = null; // This needs to be changes to be Stylist::_stylist sometime
editor._stylist = editor.addPanel('right');
HTMLArea.addClass(editor._stylist, 'stylist');
var stylist = this;
editor.notifyOn('modechange',
function(e,args)
{
switch(args.mode)
{
case 'text':
{
editor.hidePanel(editor._stylist);
break;
}
case 'wysiwyg':
{
editor.showPanel(editor._stylist);
break;
}
}
}
);
}
Stylist._pluginInfo =
{
name : "Stylist",
version : "1.0",
developer: "James Sleeman",
developer_url: "http://www.gogo.co.nz/",
c_owner : "Gogo Internet Services",
license : "htmlArea",
sponsor : "Gogo Internet Services",
sponsor_url : "http://www.gogo.co.nz/"
};
Stylist.prototype.onGenerate = function()
{
var editor = this.editor;
if(typeof editor.config.css_style == 'undefined' || HTMLArea.objectProperties(editor.config.css_style).length == 0)
{
editor.removePanel(editor._stylist);
editor._stylist = null;
}
};
Stylist.prototype.onUpdateToolbar = function()
{
if(this.editor._stylist)
{
if(this._timeoutID)
{
window.clearTimeout(this._timeoutID);
}
var e = this.editor;
this._timeoutID = window.setTimeout(function() { e._fillStylist(); }, 250);
}
};
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?