Annotation of kupuMPIWG/common/kupucleanupexpressions.js, revision 1.1
1.1 ! dwinter 1: /*****************************************************************************
! 2: *
! 3: * Copyright (c) 2003-2004 Kupu Contributors. All rights reserved.
! 4: *
! 5: * This software is distributed under the terms of the Kupu
! 6: * License. See LICENSE.txt for license text. For a list of Kupu
! 7: * Contributors see CREDITS.txt.
! 8: *
! 9: *****************************************************************************/
! 10:
! 11: // $Id: kupueditor.js 7951 2004-12-21 15:06:38Z guido $
! 12:
! 13: // WARNING: this file can contain non-ascii characters, *always* make sure your
! 14: // text-editor uses 'UTF-8' as the character encoding!!
! 15:
! 16: function CleanupExpressionsTool(actionselectid, performactionbuttonid) {
! 17: /* tool that allows global replace actions on the text contents
! 18:
! 19: the actions will be presented to the user as a list of some
! 20: sort (e.g. select) of which the user can choose one, when (s)he
! 21: does the system will use a set of regular expressions and
! 22: replacements on the code, when a match of the expression is
! 23: encountered the match will be replaced with the replacement
! 24:
! 25: matches and replacements can be configured from the XML, the
! 26: format is:
! 27:
! 28: <config>
! 29: <cleanup_expressions>
! 30: <set>
! 31: <name>Convert single quotes to curly ones</name>
! 32: <expression>
! 33: <reg>
! 34: (\W)'
! 35: </reg>
! 36: <replacement>
! 37: \1‘
! 38: </replacement>
! 39: </expression>
! 40: <expression>
! 41: <reg>
! 42: '
! 43: </reg>
! 44: <replacement>
! 45: ’
! 46: </replacement>
! 47: </expression>
! 48: </set>
! 49: <set>
! 50: <name>Reduce whitespace</name>
! 51: <expression>
! 52: <reg>
! 53: [ ]{2}
! 54: </reg>
! 55: <replacement>
! 56:  
! 57: </replacement>
! 58: </expression>
! 59: </set>
! 60: </cleanup_expressions>
! 61: </config>
! 62:
! 63: */
! 64: this.actionselect = document.getElementById(actionselectid);
! 65: this.performactionbutton = document.getElementById(performactionbuttonid);
! 66: };
! 67:
! 68: CleanupExpressionsTool.prototype = new KupuTool;
! 69:
! 70: CleanupExpressionsTool.prototype.initialize = function(editor) {
! 71: /* initialize the tool, read the regexp sets into a mapping */
! 72: this.editor = editor;
! 73: // mapping name -> [[regexp, replacement], ...]
! 74: this.expressions = this.generateExpressionsMapping();
! 75: // populate action select
! 76: this.populateActionSelect(this.expressions);
! 77: // add the event handler to the button
! 78: addEventHandler(this.performactionbutton, 'click', this.performAction,
! 79: this);
! 80: };
! 81:
! 82: CleanupExpressionsTool.prototype.generateExpressionsMapping = function() {
! 83: /* convert the config struct to a somewhat simpler mapping */
! 84: var ret = {};
! 85: var expressions = this.editor.config['cleanup_expressions'];
! 86: if (!expressions) {
! 87: // no expressions in the XML config, bail out
! 88: alert('no cleanup expressions configured');
! 89: return ret;
! 90: };
! 91: var sets = expressions.set;
! 92: for (var i=0; i < sets.length; i++) {
! 93: var set = sets[i];
! 94: var name = set.name;
! 95: ret[name] = [];
! 96: var exprs = set.expression;
! 97: // may be list type as well as object
! 98: if (exprs.length) {
! 99: for (var j=0; j < exprs.length; j++) {
! 100: var expr = exprs[j];
! 101: var regexp = expr.reg.strip();
! 102: var replacement = this._prepareReplacement(expr.replacement)
! 103: ret[name].push([regexp, replacement]);
! 104: };
! 105: } else {
! 106: var regexp = exprs.reg.strip();
! 107: var replacement = this._prepareReplacement(exprs.replacement);
! 108: ret[name].push([regexp, replacement]);
! 109: };
! 110: };
! 111: return ret;
! 112: };
! 113:
! 114: CleanupExpressionsTool.prototype._prepareReplacement = function(data) {
! 115: /* replace \x([0-9a-f]{2}) escapes with the unicode value of \1 */
! 116: data = data.strip();
! 117: var reg = /\\x([0-9a-f]{2})/g;
! 118: while (true) {
! 119: var match = reg.exec(data);
! 120: if (!match || !match.length) {
! 121: return data;
! 122: };
! 123: data = data.replace(match[0], String.fromCharCode(parseInt(match[1], 16)));
! 124: };
! 125: };
! 126:
! 127: CleanupExpressionsTool.prototype.populateActionSelect = function(mapping) {
! 128: /* populate the select with which the user can choose actions */
! 129: for (var name in mapping) {
! 130: var option = document.createElement('option');
! 131: option.value = name;
! 132: option.appendChild(document.createTextNode(name));
! 133: this.actionselect.appendChild(option);
! 134: };
! 135: this.actionselect.style.width = '100%';
! 136: };
! 137:
! 138: CleanupExpressionsTool.prototype.performAction = function() {
! 139: /* perform a single action (set of regexps/replacements) to the whole body */
! 140: var action = this.actionselect.options[
! 141: this.actionselect.selectedIndex].value;
! 142: var sets = this.expressions[action];
! 143: for (var i=0; i < sets.length; i++) {
! 144: var body = this.editor.getInnerDocument().getElementsByTagName('body')[0];
! 145: var nodeiterator = new NodeIterator(body);
! 146: while (true) {
! 147: var current = nodeiterator.next();
! 148: if (!current) {
! 149: break;
! 150: };
! 151: if (current.nodeType == 3) {
! 152: var value = current.nodeValue;
! 153: if (value.strip()) {
! 154: this.performReplaceOnNode(current, sets[i][0], sets[i][1]);
! 155: };
! 156: };
! 157: };
! 158: };
! 159: alert('Cleanup done');
! 160: };
! 161:
! 162: CleanupExpressionsTool.prototype.performReplaceOnNode = function(node, regexp, replacement) {
! 163: /* perform the replacement to the contents of a single node */
! 164: var value = node.nodeValue;
! 165: while (true) {
! 166: var reg = new RegExp(regexp, 'g');
! 167: var match = reg.exec(value);
! 168: if (!match || !match.length) {
! 169: node.nodeValue = value;
! 170: return;
! 171: };
! 172: value = value.replace(match[0], this.createReplacement(replacement, match));
! 173: };
! 174: };
! 175:
! 176: CleanupExpressionsTool.prototype.createReplacement = function(pattern, interpolations) {
! 177: /* interpolate '\[0-9]' escapes, they will be replaced with interpolations[n] where
! 178: n is the number behind the backslash */
! 179: var reg = /\\([0-9])/g;
! 180: while (true) {
! 181: var match = reg.exec(pattern);
! 182: if (!match || !match.length) {
! 183: return pattern;
! 184: };
! 185: pattern = pattern.replace(match[0], interpolations[parseInt(match[1])]);
! 186: };
! 187: };
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>