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:                   &#x20;
        !            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>