188 lines
6.5 KiB
JavaScript
188 lines
6.5 KiB
JavaScript
/*****************************************************************************
|
||
*
|
||
* Copyright (c) 2003-2004 Kupu Contributors. All rights reserved.
|
||
*
|
||
* This software is distributed under the terms of the Kupu
|
||
* License. See LICENSE.txt for license text. For a list of Kupu
|
||
* Contributors see CREDITS.txt.
|
||
*
|
||
*****************************************************************************/
|
||
|
||
// $Id: kupueditor.js 7951 2004-12-21 15:06:38Z guido $
|
||
|
||
// WARNING: this file can contain non-ascii characters, *always* make sure your
|
||
// text-editor uses 'UTF-8' as the character encoding!!
|
||
|
||
function CleanupExpressionsTool(actionselectid, performactionbuttonid) {
|
||
/* tool that allows global replace actions on the text contents
|
||
|
||
the actions will be presented to the user as a list of some
|
||
sort (e.g. select) of which the user can choose one, when (s)he
|
||
does the system will use a set of regular expressions and
|
||
replacements on the code, when a match of the expression is
|
||
encountered the match will be replaced with the replacement
|
||
|
||
matches and replacements can be configured from the XML, the
|
||
format is:
|
||
|
||
<config>
|
||
<cleanup_expressions>
|
||
<set>
|
||
<name>Convert single quotes to curly ones</name>
|
||
<expression>
|
||
<reg>
|
||
(\W)'
|
||
</reg>
|
||
<replacement>
|
||
\1‘
|
||
</replacement>
|
||
</expression>
|
||
<expression>
|
||
<reg>
|
||
'
|
||
</reg>
|
||
<replacement>
|
||
’
|
||
</replacement>
|
||
</expression>
|
||
</set>
|
||
<set>
|
||
<name>Reduce whitespace</name>
|
||
<expression>
|
||
<reg>
|
||
[ ]{2}
|
||
</reg>
|
||
<replacement>
|
||
 
|
||
</replacement>
|
||
</expression>
|
||
</set>
|
||
</cleanup_expressions>
|
||
</config>
|
||
|
||
*/
|
||
this.actionselect = document.getElementById(actionselectid);
|
||
this.performactionbutton = document.getElementById(performactionbuttonid);
|
||
};
|
||
|
||
CleanupExpressionsTool.prototype = new KupuTool;
|
||
|
||
CleanupExpressionsTool.prototype.initialize = function(editor) {
|
||
/* initialize the tool, read the regexp sets into a mapping */
|
||
this.editor = editor;
|
||
// mapping name -> [[regexp, replacement], ...]
|
||
this.expressions = this.generateExpressionsMapping();
|
||
// populate action select
|
||
this.populateActionSelect(this.expressions);
|
||
// add the event handler to the button
|
||
addEventHandler(this.performactionbutton, 'click', this.performAction,
|
||
this);
|
||
};
|
||
|
||
CleanupExpressionsTool.prototype.generateExpressionsMapping = function() {
|
||
/* convert the config struct to a somewhat simpler mapping */
|
||
var ret = {};
|
||
var expressions = this.editor.config['cleanup_expressions'];
|
||
if (!expressions) {
|
||
// no expressions in the XML config, bail out
|
||
alert('no cleanup expressions configured');
|
||
return ret;
|
||
};
|
||
var sets = expressions.set;
|
||
for (var i=0; i < sets.length; i++) {
|
||
var set = sets[i];
|
||
var name = set.name;
|
||
ret[name] = [];
|
||
var exprs = set.expression;
|
||
// may be list type as well as object
|
||
if (exprs.length) {
|
||
for (var j=0; j < exprs.length; j++) {
|
||
var expr = exprs[j];
|
||
var regexp = expr.reg.strip();
|
||
var replacement = this._prepareReplacement(expr.replacement)
|
||
ret[name].push([regexp, replacement]);
|
||
};
|
||
} else {
|
||
var regexp = exprs.reg.strip();
|
||
var replacement = this._prepareReplacement(exprs.replacement);
|
||
ret[name].push([regexp, replacement]);
|
||
};
|
||
};
|
||
return ret;
|
||
};
|
||
|
||
CleanupExpressionsTool.prototype._prepareReplacement = function(data) {
|
||
/* replace \x([0-9a-f]{2}) escapes with the unicode value of \1 */
|
||
data = data.strip();
|
||
var reg = /\\x([0-9a-f]{2})/g;
|
||
while (true) {
|
||
var match = reg.exec(data);
|
||
if (!match || !match.length) {
|
||
return data;
|
||
};
|
||
data = data.replace(match[0], String.fromCharCode(parseInt(match[1], 16)));
|
||
};
|
||
};
|
||
|
||
CleanupExpressionsTool.prototype.populateActionSelect = function(mapping) {
|
||
/* populate the select with which the user can choose actions */
|
||
for (var name in mapping) {
|
||
var option = document.createElement('option');
|
||
option.value = name;
|
||
option.appendChild(document.createTextNode(name));
|
||
this.actionselect.appendChild(option);
|
||
};
|
||
this.actionselect.style.width = '100%';
|
||
};
|
||
|
||
CleanupExpressionsTool.prototype.performAction = function() {
|
||
/* perform a single action (set of regexps/replacements) to the whole body */
|
||
var action = this.actionselect.options[
|
||
this.actionselect.selectedIndex].value;
|
||
var sets = this.expressions[action];
|
||
for (var i=0; i < sets.length; i++) {
|
||
var body = this.editor.getInnerDocument().getElementsByTagName('body')[0];
|
||
var nodeiterator = new NodeIterator(body);
|
||
while (true) {
|
||
var current = nodeiterator.next();
|
||
if (!current) {
|
||
break;
|
||
};
|
||
if (current.nodeType == 3) {
|
||
var value = current.nodeValue;
|
||
if (value.strip()) {
|
||
this.performReplaceOnNode(current, sets[i][0], sets[i][1]);
|
||
};
|
||
};
|
||
};
|
||
};
|
||
alert('Cleanup done');
|
||
};
|
||
|
||
CleanupExpressionsTool.prototype.performReplaceOnNode = function(node, regexp, replacement) {
|
||
/* perform the replacement to the contents of a single node */
|
||
var value = node.nodeValue;
|
||
while (true) {
|
||
var reg = new RegExp(regexp, 'g');
|
||
var match = reg.exec(value);
|
||
if (!match || !match.length) {
|
||
node.nodeValue = value;
|
||
return;
|
||
};
|
||
value = value.replace(match[0], this.createReplacement(replacement, match));
|
||
};
|
||
};
|
||
|
||
CleanupExpressionsTool.prototype.createReplacement = function(pattern, interpolations) {
|
||
/* interpolate '\[0-9]' escapes, they will be replaced with interpolations[n] where
|
||
n is the number behind the backslash */
|
||
var reg = /\\([0-9])/g;
|
||
while (true) {
|
||
var match = reg.exec(pattern);
|
||
if (!match || !match.length) {
|
||
return pattern;
|
||
};
|
||
pattern = pattern.replace(match[0], interpolations[parseInt(match[1])]);
|
||
};
|
||
};
|