better auto-correction
authorRadek Czajka <radoslaw.czajka@nowoczesnapolska.org.pl>
Tue, 3 Aug 2010 09:32:09 +0000 (11:32 +0200)
committerRadek Czajka <radoslaw.czajka@nowoczesnapolska.org.pl>
Tue, 3 Aug 2010 10:23:48 +0000 (12:23 +0200)
apps/toolbar/fixtures/initial_data.yaml
redakcja/static/js/button_scripts.js

index 723732d..c7b5af6 100644 (file)
@@ -38,8 +38,8 @@
     model: toolbar.buttongroup
     pk: 17
 -   fields:
-        group: [14, 12]
         accesskey: a
+        group: [14, 12]
         label: akapit
         link: ''
         params: '{"tag": "akap"}'
@@ -49,8 +49,8 @@
     model: toolbar.button
     pk: 39
 -   fields:
-        group: [14]
         accesskey: ''
+        group: [14]
         label: akapit cd.
         link: ''
         params: '{"tag": "akap_cd"}'
@@ -60,8 +60,8 @@
     model: toolbar.button
     pk: 40
 -   fields:
-        group: [14]
         accesskey: d
+        group: [14]
         label: akapit dialogowy
         link: ''
         params: '{"tag": "akap_dialog"}'
@@ -71,8 +71,8 @@
     model: toolbar.button
     pk: 41
 -   fields:
-        group: [1]
         accesskey: ''
+        group: [1]
         label: akt
         link: ''
         params: '{"tag": "akt"}'
@@ -82,8 +82,8 @@
     model: toolbar.button
     pk: 14
 -   fields:
-        group: [13]
         accesskey: ''
+        group: [13]
         label: autor
         link: ''
         params: '{"tag": "autor_utworu"}'
     model: toolbar.button
     pk: 32
 -   fields:
-        group: [2]
         accesskey: ''
+        group: [2]
         label: Podstawowa
         link: ''
         params: '[["fulltextregexp", {"exprs": [["\ufeff", ""], ["$[\\s]*\\d+[\\s]*^",
-            ""], ["-\\s*^", ""], ["\\,\\.\\.|\\.\\,\\.|\\.\\.\\,", "..."]]}], ["lineregexp",
-            {"exprs": [["^\\s+|\\s+$", ""], ["\\s+", " "], ["(,,)\\s+|\\s+(\")", "$1"],
-            ["(\\d)[\u2014-](\\d)", "$1--$2"], ["[\u2014]", "---"], ["<(/?)P([aert])",
-            "<$1p$2"], ["([^\\.])(\\s*)</p", "$1.$2</p"], ["([,\\.:;!\\?])([^\\s\\\\])",
-            "$1 $2"], ["([^\\s])\\s+([,\\.:;!\\?])", "$1$2"]]}]]'
+            ""], ["-\\s*^", ""], ["\\,\\.\\.|\\.\\,\\.|\\.\\.\\,", "..."], ["<(/?)P([aert])",
+            "<$1p$2"], ["[\u2014\u2013\u2010-]+", "---"], ["(\\d)---(\\d)", "$1--$2"],
+            ["(\\S)---(\\S)", "$1-$2"]]}], ["lineregexp", {"exprs": [["^\\s+|\\s+$",
+            ""], ["\\s+", " "], ["(,,)\\s+", "$1"], ["\\s+(\")", "$1"], ["([^\\.])(\\s*)</p",
+            "$1.$2</p"], ["([,\\.:;!\\?])([^\\s\\\\])", "$1 $2"], ["([^\\s])\\s+([,\\.:;!\\?])",
+            "$1$2"]]}]]'
         scriptlet: macro
         slug: basic_correction
-        tooltip: "Wykonuj\u0119 operacj\u0119 z novel-pages i poem-pages."
+        tooltip: "Wykonuj\u0119 podstawow\u0105 korekt\u0119 tekstu."
     model: toolbar.button
     pk: 4
 -   fields:
-        group: [2]
         accesskey: ''
+        group: [2]
         label: "zamiana cudzys\u0142ow\xF3w 1"
         link: ''
         params: '{"exprs": [["\u00ab|\u201e", ",,"], ["\u00bb", "\""], ["([^=])\"([\u0104\u0118\u00d3\u0141\u017b\u0179\u0106\u0143\u0105\u017c\u017a\u015b\u0144\u00f3\u0142\u0107\\w])",
     model: toolbar.button
     pk: 89
 -   fields:
-        group: [2]
         accesskey: ''
+        group: [2]
         label: "zamiana cudzys\u0142ow\xF3w 2"
         link: ''
         params: '{"exprs": [["\u00bb|\u201e", ",,"], ["\u00ab", "\""], ["([^=])\"([\u0104\u0118\u00d3\u0141\u017b\u0179\u0106\u0143\u0105\u017c\u017a\u015b\u0144\u00f3\u0142\u0107\\w])",
     model: toolbar.button
     pk: 77
 -   fields:
-        group: [1]
         accesskey: ''
+        group: [1]
         label: "cz\u0119\u015B\u0107/ksi\u0119ga"
         link: ''
         params: '{"tag": "naglowek_czesc"}'
     model: toolbar.button
     pk: 10
 -   fields:
-        group: [13, 22]
         accesskey: ''
+        group: [13, 22]
         label: dedykacja
         link: ''
         params: '{"tag": "dedykacja"}'
     model: toolbar.button
     pk: 74
 -   fields:
-        group: [12]
         accesskey: ''
+        group: [12]
         label: didaskalia
         link: ''
         params: '{"tag": "didaskalia"}'
     model: toolbar.button
     pk: 62
 -   fields:
-        group: [22]
         accesskey: ''
+        group: [22]
         label: "didaskalia pocz\u0105tkowe"
         link: ''
         params: '{"tag": "miejsce_czas"}'
     model: toolbar.button
     pk: 79
 -   fields:
-        group: [12]
         accesskey: ''
+        group: [12]
         label: didaskalia tekstowe
         link: ''
         params: '{"tag": "didask_tekst"}'
     model: toolbar.button
     pk: 63
 -   fields:
-        group: [21]
         accesskey: ''
+        group: [21]
         label: "d\u0142ugi cyt. poet."
         link: ''
         params: '{"tag": "poezja_cyt"}'
     model: toolbar.button
     pk: 67
 -   fields:
-        group: [21]
         accesskey: ''
+        group: [21]
         label: "d\u0142ugi cytat"
         link: ''
         params: '{"tag": "dlugi_cyt"}'
     model: toolbar.button
     pk: 42
 -   fields:
-        group: [11]
         accesskey: ''
+        group: [11]
         label: dramat wiersz.
         link: ''
         params: '{"tag": "dramat_wierszowany_l"}'
     model: toolbar.button
     pk: 20
 -   fields:
-        group: [11]
         accesskey: ''
+        group: [11]
         label: "dramat wiersz./w. \u0142am"
         link: ''
         params: '{"tag": "dramat_wierszowany_lp"}'
     model: toolbar.button
     pk: 22
 -   fields:
-        group: [11]
         accesskey: ''
+        group: [11]
         label: "dramat wsp\xF3\u0142czesny"
         link: ''
         params: '{"tag": "dramat_wspolczesny"}'
     model: toolbar.button
     pk: 21
 -   fields:
-        group: [13]
         accesskey: ''
+        group: [13]
         label: "dzie\u0142o nadrz\u0119dne"
         link: ''
         params: '{"tag": "dzielo_nadrzedne"}'
     model: toolbar.button
     pk: 38
 -   fields:
-        group: [27]
         accesskey: ''
+        group: [27]
         label: extra
         link: ''
         params: '{"tag": "extra"}'
     model: toolbar.button
     pk: 96
 -   fields:
-        group: []
         accesskey: ''
+        group: []
         label: Wydrukuj
         link: print/html
         params: '[]'
     model: toolbar.button
     pk: 87
 -   fields:
-        group: [12]
         accesskey: k
+        group: [12]
         label: kwestia
         link: ''
         params: '{"tag": "kwestia"}'
     model: toolbar.button
     pk: 82
 -   fields:
-        group: [11]
         accesskey: ''
+        group: [11]
         label: liryka
         link: ''
         params: '{"tag": "liryka_l"}'
     model: toolbar.button
     pk: 23
 -   fields:
-        group: [11]
         accesskey: ''
+        group: [11]
         label: "liryka/w. \u0142am"
         link: ''
         params: '{"tag": "liryka_lp"}'
     model: toolbar.button
     pk: 24
 -   fields:
-        group: [22]
         accesskey: ''
+        group: [22]
         label: "lista os\xF3b"
         link: ''
         params: '{"tag": "lista_osob"}'
     model: toolbar.button
     pk: 93
 -   fields:
-        group: [22]
         accesskey: ''
+        group: [22]
         label: 'typ osoby '
         link: ''
         params: '{"tag": "lista_osoba", "attrs": {"typ": ""}}'
     model: toolbar.button
     pk: 78
 -   fields:
-        group: [15]
         accesskey: ''
+        group: [15]
         label: matemat.
         link: ''
         params: '{"tag": "mat"}'
     model: toolbar.button
     pk: 47
 -   fields:
-        group: [13, 22]
         accesskey: ''
+        group: [13, 22]
         label: motto
         link: ''
         params: '{"tag": "motto"}'
     model: toolbar.button
     pk: 75
 -   fields:
-        group: [13, 22]
         accesskey: ''
+        group: [13, 22]
         label: motto podpis
         link: ''
         params: '{"tag": "motto_podpis"}'
     model: toolbar.button
     pk: 37
 -   fields:
-        group: [12]
         accesskey: ''
+        group: [2]
+        label: ",,\u2026\" na \xAB\u2026\xBB"
+        link: ''
+        params: '{"exprs": [[",,", "\u00ab"], ["\"", "\u00bb"]]}'
+        scriptlet: fulltextregexp
+        slug: na-francuskie
+        tooltip: "Zamienia cudzys\u0142owy podw\xF3jne na francuskie"
+    model: toolbar.button
+    pk: 2
+-   fields:
+        accesskey: ''
+        group: [2]
+        label: ",,\u2026\" na \xBB\u2026\xAB"
+        link: ''
+        params: '{"exprs": [[",,", "\u00bb"], ["\"", "\u00ab"]]}'
+        scriptlet: fulltextregexp
+        slug: na-niemieckie
+        tooltip: "Zamienia cudzys\u0142owy podw\xF3jne na niemieckie"
+    model: toolbar.button
+    pk: 3
+-   fields:
+        accesskey: ''
+        group: [12]
         label: "nag\u0142\xF3wek kwestii"
         link: ''
         params: '{"tag": "naglowek_osoba"}'
     model: toolbar.button
     pk: 16
 -   fields:
-        group: [22]
         accesskey: ''
+        group: [22]
         label: "nag\u0142\xF3wek listy"
         link: ''
         params: '{"tag": "naglowek_listy"}'
     model: toolbar.button
     pk: 94
 -   fields:
-        group: [13]
         accesskey: ''
+        group: [13]
         label: nazwa utworu
         link: ''
         params: '{"tag": "nazwa_utworu"}'
     model: toolbar.button
     pk: 33
 -   fields:
-        group: [13]
         accesskey: ''
+        group: [13]
         label: nota
         link: ''
         params: '{"tag": "nota"}'
     model: toolbar.button
     pk: 35
 -   fields:
-        group: [11]
         accesskey: ''
+        group: [11]
         label: opowiadanie
         link: ''
         params: '{"tag": "opowiadanie"}'
     model: toolbar.button
     pk: 18
 -   fields:
-        group: [12]
         accesskey: b
+        group: [12]
         label: osoba
         link: ''
         params: '{"tag": "osoba"}'
     model: toolbar.button
     pk: 64
 -   fields:
-        group: [22]
         accesskey: ''
+        group: [22]
         label: osoba na liscie
         link: ''
         params: '{"tag": "lista_osoba"}'
     model: toolbar.button
     pk: 95
 -   fields:
-        group: [1]
         accesskey: ''
+        group: [1]
         label: "podrozdzia\u0142"
         link: ''
         params: '{"tag": "naglowek_podrozdzial"}'
     model: toolbar.button
     pk: 12
 -   fields:
-        group: [1]
         accesskey: ''
+        group: [1]
         label: "podtytu\u0142"
         link: ''
         params: '{"tag": "podtytul"}'
     model: toolbar.button
     pk: 34
 -   fields:
-        group: [11]
         accesskey: ''
+        group: [11]
         label: "powie\u015B\u0107"
         link: ''
         params: '{"tag": "powiesc"}'
     model: toolbar.button
     pk: 19
 -   fields:
-        group: []
         accesskey: ''
+        group: []
         label: Wydrukuj
         link: print/xml
         params: '[]'
     model: toolbar.button
     pk: 86
 -   fields:
-        group: [26]
         accesskey: ''
+        group: [26]
         label: przypis autorski
         link: ''
         params: '{"tag": "pa"}'
     model: toolbar.button
     pk: 68
 -   fields:
-        group: [26]
         accesskey: ''
+        group: [26]
         label: przypis edytorski
         link: ''
         params: '{"tag": "pe"}'
     model: toolbar.button
     pk: 71
 -   fields:
-        group: [26]
         accesskey: ''
+        group: [26]
         label: przypis redaktorski
         link: ''
         params: '{"tag": "pr"}'
     model: toolbar.button
     pk: 70
 -   fields:
-        group: [26]
         accesskey: ''
+        group: [26]
         label: "przypis t\u0142umacza"
         link: ''
         params: '{"tag": "pt"}'
     model: toolbar.button
     pk: 69
 -   fields:
-        group: [1]
         accesskey: ''
+        group: [1]
         label: "rozdzia\u0142"
         link: ''
         params: '{"tag": "naglowek_rozdzial"}'
     model: toolbar.button
     pk: 11
 -   fields:
-        group: [1]
         accesskey: ''
+        group: [1]
         label: scena
         link: ''
         params: '{"tag": "naglowek_scena"}'
     model: toolbar.button
     pk: 15
 -   fields:
-        group: [16]
         accesskey: ''
+        group: [16]
         label: asterysk
         link: ''
         params: '{"nocontent": "true", "tag": "sekcja_asterysk"}'
     model: toolbar.button
     pk: 54
 -   fields:
-        group: [16]
         accesskey: ''
+        group: [16]
         label: linia
         link: ''
         params: '{"nocontent": "true", "tag": "separator_linia"}'
     model: toolbar.button
     pk: 55
 -   fields:
-        group: [16]
         accesskey: ''
+        group: [16]
         label: "\u015Bwiat\u0142o"
         link: ''
         params: '{"nocontent": "true", "tag": "sekcja_swiatlo"}'
     model: toolbar.button
     pk: 53
 -   fields:
-        group: [15]
         accesskey: ''
+        group: [15]
         label: "s\u0142owo obce"
         link: ''
         params: '{"tag": "slowo_obce"}'
     model: toolbar.button
     pk: 46
 -   fields:
-        group: [1]
         accesskey: ''
+        group: [1]
         label: "\u015Br\xF3dtytu\u0142"
         link: ''
         params: '{"tag": "srodtytul"}'
     model: toolbar.button
     pk: 13
 -   fields:
-        group: [2]
-        accesskey: ''
-        label: "Usu\u0144 spacj\u0119"
-        link: ''
-        params: '{"exprs": [["^\\s+|\\s+$", ""], ["\\s+", " "], ["(,,)\\s+", "$1"],
-            ["\\s+(\")", "$1"]]}'
-        scriptlet: lineregexp
-        slug: strip_whitespace
-        tooltip: "Usuwa zb\u0119dne spacj\u0119 z dokumentu."
-    model: toolbar.button
-    pk: 3
--   fields:
-        group: [12, 17]
         accesskey: s
+        group: [12, 17]
         label: strofa
         link: ''
         params: '{"tag": "strofa"}'
     model: toolbar.button
     pk: 81
 -   fields:
-        group: [11]
         accesskey: ''
+        group: [11]
         label: "tag g\u0142\xF3wny"
         link: ''
         params: '{"tag": "utwor"}'
     model: toolbar.button
     pk: 17
 -   fields:
-        group: [2]
         accesskey: u
+        group: [2]
         label: "A<sup>\u2193</sup>"
         link: ''
         params: '[]'
     model: toolbar.button
     pk: 76
 -   fields:
-        group: [15]
         accesskey: ''
+        group: [15]
         label: "tytu\u0142 dzie\u0142a"
         link: ''
         params: '{"tag": "tytul_dziela"}'
     model: toolbar.button
     pk: 92
 -   fields:
-        group: [15]
         accesskey: ''
+        group: [15]
         label: "tytu\u0142 dzie\u0142a typ 1"
         link: ''
         params: '{"tag": "tytul_dziela", "attrs": {"typ": "1"}}'
     model: toolbar.button
     pk: 45
 -   fields:
-        group: [27]
         accesskey: ''
+        group: [27]
         label: uwaga
         link: ''
         params: '{"tag": "uwaga"}'
     model: toolbar.button
     pk: 51
 -   fields:
-        group: [14, 17]
         accesskey: ''
+        group: [14, 17]
         label: wers akap.
         link: ''
         params: '{"tag": "wers_akap"}'
     model: toolbar.button
     pk: 83
 -   fields:
-        group: [12, 17]
         accesskey: ''
+        group: [12, 17]
         label: wers cd.
         link: ''
         params: '{"tag": "wers_cd"}'
     model: toolbar.button
     pk: 85
 -   fields:
-        group: [12, 17]
         accesskey: w
+        group: [12, 17]
         label: "wers mocno wci\u0119ty"
         link: ''
         params: '{"tag": "wers_wciety", "attrs": {"typ": ""}}'
     model: toolbar.button
     pk: 84
 -   fields:
-        group: [12, 17]
         accesskey: q
+        group: [12, 17]
         label: "wers wci\u0119ty"
         link: ''
         params: '{"tag": "wers_wciety", "attrs": {"typ": "1"}}'
     model: toolbar.button
     pk: 91
 -   fields:
-        group: [15]
         accesskey: ''
+        group: [15]
         label: www
         link: ''
         params: '{"tag": "www"}'
     model: toolbar.button
     pk: 48
 -   fields:
-        group: [15]
         accesskey: ''
+        group: [15]
         label: "wyr\xF3\u017Cnienie"
         link: ''
         params: '{"tag": "wyroznienie"}'
     model: toolbar.button
     pk: 44
 -   fields:
-        group: [11]
         accesskey: ''
+        group: [11]
         label: wywiad
         link: ''
         params: '{"tag": "wywiad"}'
     model: toolbar.button
     pk: 25
 -   fields:
-        group: [21]
         accesskey: ''
+        group: [21]
         label: "wywiad odpowied\u017A"
         link: ''
         params: '{"tag": "wywiad_odp"}'
     model: toolbar.button
     pk: 73
 -   fields:
-        group: [21]
         accesskey: ''
+        group: [21]
         label: wywiad pytanie
         link: ''
         params: '{"tag": "wywiad_pyt"}'
     model: toolbar.button
     pk: 72
 -   fields:
-        group: [2]
         accesskey: ''
-        label: "Zamie\u0144 dywiz"
-        link: ''
-        params: '{"exprs": [["(\\s)-(\\s)", "$1---$2"], ["^(\\s*)-(\\s)", "$1---$2"],
-            ["(\\s)-(\\s*)$", "$1---$2"], ["(\\d)[\u2014\u2013\u2010-](\\d)", "$1--$2"],
-            ["\u2014\u2013\u2010", "---"]]}'
-        scriptlet: lineregexp
-        slug: zamien_dywiz
-        tooltip: "Zamienia '\u2014' na '---', oraz '1\u20142' na '1--2'."
-    model: toolbar.button
-    pk: 2
--   fields:
         group: [16]
-        accesskey: ''
         label: "zast\u0119pnik wersu"
         link: ''
         params: '{"tag": "zastepnik_wersu"}'
             \r\n\r\n\r\n\r\n\r\n\r\n\r\npanel.fireEvent('contentChanged');"}
     model: toolbar.scriptlet
     pk: insert_stanza
-
index 2a585dc..4aa0c95 100644 (file)
@@ -48,9 +48,8 @@ function ScriptletCenter()
 {
     this.scriptlets = {};
 
-    this.scriptlets['insert_tag'] = function(context, params, done)
+    this.scriptlets['insert_tag'] = function(context, params, text, move_forward, done)
     {
-        var text = this.XMLEditorSelectedText(context);
         var start_tag = '<'+params.tag;
         var move_cursor = false;
 
@@ -95,18 +94,14 @@ function ScriptletCenter()
             }
         }
 
-        this.XMLEditorReplaceSelectedText(context, output);
-
-        try {
-            if (move_cursor) {
-                this.XMLEditorMoveCursorForward(context, params.tag.length+2);
-            }
-        } catch(e) {}
+        if (move_cursor) {
+            move_forward += params.tag.length+2;
+        }
 
-               done();
+        done(output, move_forward);
     }.bind(this);
 
-    this.scriptlets['lineregexp'] = function(context, params, done) {
+    this.scriptlets['lineregexp'] = function(context, params, text, move_forward, done) {
                var self = this;
 
         var exprs = $.map(params.exprs, function(expr) {
@@ -120,8 +115,7 @@ function ScriptletCenter()
         });
 
         var partial = true;
-        var text = this.XMLEditorSelectedText(context);
-        if(!text) return done();
+        if(!text) done(text, move_forward);
 
         var changed = 0;
         var lines = text.split('\n');
@@ -138,15 +132,15 @@ function ScriptletCenter()
             if(old_line != line) changed += 1;
             return line;
         }, function(newlines) {
-                       if(changed > 0) {
-                               self.XMLEditorReplaceSelectedText(context, newlines.join('\n') );
-                       };
+            if(changed > 0) {
+                text = newlines.join('\n');
+            };
 
-                       done();
+            done(text, move_forward);
                });
     }.bind(this);
 
-    this.scriptlets['fulltextregexp'] = function(context, params, done) {
+    this.scriptlets['fulltextregexp'] = function(context, params, text, move_forward, done) {
                var self = this;
 
         var exprs = $.map(params.exprs, function(expr) {
@@ -160,47 +154,39 @@ function ScriptletCenter()
                 };
         });
 
-        var text = this.XMLEditorSelectedText(context);
-        if(!text) return done();
+        if(!text) done(text, move_forward);
         var original = text;$
 
                nblck_each(exprs, function(expr, index) {
                        $progress.html(600 + index);
             text = text.replace(expr.rx, expr.repl);
         }, function() {
-                       if( original != text) {
-                  self.XMLEditorReplaceSelectedText(context, text);
-               }
-
-                       done();
+                       done(text, move_forward);
                });
     }.bind(this);
 
-    this.scriptlets['macro'] = function(context, params, done) {
+    this.scriptlets['macro'] = function(context, params, text, move_forward, done) {
         var self = this;
                var i = 0;
 
-               function next() {
+               function next(text, move_forward) {
                if (i < params.length) {
                                var e = params[i];
                                i = i + 1;
-                               self.scriptlets[e[0]](context, e[1], next);
+                               self.scriptlets[e[0]](context, e[1], text, move_forward, next);
                        }
                        else {
-                               done();
+                               done(text, move_forward);
                        }
         };
 
-               next();
+               next(text, move_forward);
     }.bind(this);
 
-    this.scriptlets['lowercase'] = function(context, params, done)
+    this.scriptlets['lowercase'] = function(context, params, text, move_forward, done)
     {
-        var text = this.XMLEditorSelectedText(context);
-
-        if(!text) return;
+        if(!text) done(text, move_forward);
 
-        var repl = '';
         var lcase = text.toLowerCase();
         var ucase = text.toUpperCase();
 
@@ -214,18 +200,14 @@ function ScriptletCenter()
                     return '';
                 }
             });
-            repl = words.join(' ');
+            text = words.join(' ');
         }
 
-        if(repl != text) this.XMLEditorReplaceSelectedText(context, repl);
-
-               done();
+        done(text, move_forward);
     }.bind(this);
 
 
-    this.scriptlets["insert_stanza"] = function(context, params, done) {
-        var text = this.XMLEditorSelectedText(context);
-
+    this.scriptlets["insert_stanza"] = function(context, params, text, move_forward, done) {
         if(text) {
             var verses = text.split('\n');
             text = ''; var buf = ''; var ebuf = '';
@@ -243,14 +225,12 @@ function ScriptletCenter()
                 }
             }
             text = text + buf + '\n</strofa>' + ebuf;
-            this.XMLEditorReplaceSelectedText(context, text);
         }
-
-        if (!text) {
-            this.XMLEditorMoveCursorForward(context, params.tag.length + 2);
+        else {
+            move_forward += params.tag.length + 2;
         }
 
-               done();
+        done(text, move_forward);
     }.bind(this);
 
 }
@@ -267,10 +247,20 @@ ScriptletCenter.prototype.callInteractive = function(opts) {
 
        $.blockUI({message: $progress, showOverlay: false});
 
-       self.scriptlets[opts.action](opts.context, opts.extra, function(){
+    var input = self.XMLEditorSelectedText(opts.context);
+       self.scriptlets[opts.action](opts.context, opts.extra, input, 0, function(output, move_forward){
            /*if(timer)
                clearTimeout(timer);
            else */
+        if (input != output) {
+            self.XMLEditorReplaceSelectedText(opts.context, output)
+        }
+        if (move_forward) {
+            try {
+                self.XMLEditorMoveCursorForward(opts.context, move_forward)
+            }
+            catch(e) {}
+        }
            $.unblockUI(); // done
        });
 }