Uproszczenie struktury pakietu vstorage (teraz jest zwykłym modułem) i jego testów...
[redakcja.git] / platforma / static / js / button_scripts.js
1 function ScriptletCenter()
2 {
3     this.scriptlets = {};
4
5     this.scriptlets['insert_tag'] = function(context, params)
6     {
7         var text = this.XMLEditorSelectedText(context);
8         var start_tag = '<'+params.tag;
9         var move_cursor = false;
10
11         for (var attr in params.attrs) {
12             start_tag += ' '+attr+'="' + params.attrs[attr] + '"';
13         }
14
15         start_tag += '>';
16         var end_tag = '</'+params.tag+'>';
17
18         if(text.length > 0) {
19             // tokenize
20             var output = '';
21             var token = '';
22             for(var index=0; index < text.length; index++)
23             {
24                 if (text[index].match(/\s/)) { // whitespace
25                     token += text[index];
26                 }
27                 else { // character
28                     output += token;
29                     if(output == token) output += start_tag;
30                     token = '';
31                     output += text[index];
32                 }
33             }
34
35             if( output[output.length-1] == '\\' ) {
36                 output = output.substr(0, output.length-1) + end_tag + '\\';
37             } else {
38                 output += end_tag;
39             }
40             output += token;
41         }
42         else {
43             if(params.nocontent) {
44                 output = "<"+params.tag +" />";
45             }
46             else {
47                 output = start_tag + end_tag;
48                 move_cursor = true;
49             }
50         }
51
52         this.XMLEditorReplaceSelectedText(context, output);
53
54         try {
55             if (move_cursor) {
56                 this.XMLEditorMoveCursorForward(context, params.tag.length+2);
57             }
58         } catch(e) {}
59
60     }.bind(this);
61
62     this.scriptlets['lineregexp'] = function(context, params) {
63
64         var exprs = $.map(params.exprs, function(expr) {
65             var opts = "g";
66             if(expr.length > 2) {
67                 opts = expr[2];
68             } return {
69                 rx: new RegExp(expr[0], opts),
70                 repl: expr[1]
71                 };
72         });
73
74         var partial = true;
75         var text = this.XMLEditorSelectedText(context);
76         if(!text) return;
77
78         var changed = 0;
79         var lines = text.split('\n');
80         lines = $.map(lines, function(line) {
81             var old_line = line;
82             $(exprs).each(function() {
83                 var expr = this;
84                 line = line.replace(expr.rx, expr.repl);
85             });
86
87             if(old_line != line) changed += 1;
88             return line;
89         });
90
91         if(changed > 0) {
92             this.XMLEditorReplaceSelectedText(context, lines.join('\n') );
93         }
94     }.bind(this);
95
96     this.scriptlets['codemirror_fontsize'] = function(context, params) {
97         var frameBody = this.XMLEditorBody(context);
98
99         if(params.fontSize) {
100             frameBody.css('font-size', params.fontSize);
101         }
102         else {
103             var old_size = parseInt(frameBody.css('font-size'), 10);
104             frameBody.css('font-size', old_size + (params.change || 0) );
105         }
106         
107     }.bind(this);
108
109     this.scriptlets['fulltextregexp'] = function(context, params) {
110         var exprs = $.map(params.exprs, function(expr) {
111             var opts = "mg";
112             if(expr.length > 2) {
113                 opts = expr[2];
114             }
115             return {
116                 rx: new RegExp(expr[0], opts),
117                 repl: expr[1]
118                 };
119         });
120
121         var text = this.XMLEditorSelectedText(context);
122         if(!text) return;
123         var original = text;
124         $(exprs).each(function() {
125             text = text.replace(this.rx, this.repl);
126         });
127
128         if( original != text) {
129             this.XMLEditorReplaceSelectedText(context, text);
130         }
131     }.bind(this);
132
133     this.scriptlets['macro'] = function(context, params) {
134         var self = this;
135
136         $(params).each(function() {
137             $.log(this[0], this[1]);
138             self.scriptlets[this[0]](context, this[1]);
139         });
140     }.bind(this);
141
142     this.scriptlets['lowercase'] = function(context, params)
143     {
144         var text = this.XMLEditorSelectedText(context);
145
146         if(!text) return;
147
148         var repl = '';
149         var lcase = text.toLowerCase();
150         var ucase = text.toUpperCase();
151
152         if(lcase == text) repl = ucase; /* was lowercase */
153         else if(ucase != text) repl = lcase; /* neither lower- or upper-case */
154         else { /* upper case -> camel-case */
155             var words = $(lcase.split(/\s/)).map(function() {
156                 if(this.length > 0) { 
157                     return this[0].toUpperCase() + this.slice(1);
158                 } else {
159                     return '';
160                 }
161             });
162             repl = words.join(' ');
163         }
164
165         if(repl != text) this.XMLEditorReplaceSelectedText(context, repl);
166     }.bind(this);
167
168
169     this.scriptlets["insert_stanza"] = function(context, params) {
170         var text = this.XMLEditorSelectedText(context);
171
172         if(text) {
173             var verses = text.split('\n');
174             text = ''; var buf = ''; var ebuf = '';
175             var first = true;
176
177             for(var i=0;  i < verses.length; i++) {
178                 var verse = verses[i].replace(/^\s+/, "").replace(/\s+$/, "");
179                 if(verse) {
180                     text += (buf ? buf + '/\n' : '') + ebuf;
181                     buf = (first ? '<strofa>\n' : '') + verses[i];
182                     ebuf = '';
183                     first = false;
184                 } else {
185                     ebuf += '\n' + verses[i];
186                 }
187             }
188             text = text + buf + '\n</strofa>' + ebuf;
189             this.XMLEditorReplaceSelectedText(context, text);
190         }
191
192         if (!text) {
193             this.XMLEditorMoveCursorForward(context, params.tag.length + 2);
194         }
195         
196     }.bind(this);
197
198 }
199
200 ScriptletCenter.prototype.XMLEditorSelectedText = function(panel) {
201     return panel.contentView.editor.selection();
202 };
203
204 ScriptletCenter.prototype.XMLEditorReplaceSelectedText = function(panel, replacement)
205 {
206     panel.contentView.editor.replaceSelection(replacement);
207     // Tell XML view that it's data has changed
208     panel.contentView.editorDataChanged();
209 };
210
211 ScriptletCenter.prototype.XMLEditorMoveCursorForward = function(panel, n) {
212     var pos = panel.contentView.editor.cursorPosition();
213     panel.contentView.editor.selectLines(pos.line, pos.character + n);
214 };
215
216 var scriptletCenter;
217
218 $(function() {
219     scriptletCenter = new ScriptletCenter();
220 });