Annotation of kupuMPIWG/common/kupucleanupexpressions.js, revision 1.1.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>