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