X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/0171e11c886d0d294fb05f461fe6ec1b389f02d5..650db5dfe3ae7ddd3d9e6b93d5ca1f84b20f7309:/redakcja/static/js/button_scripts.js diff --git a/redakcja/static/js/button_scripts.js b/redakcja/static/js/button_scripts.js index 953383ce..ef2b794d 100644 --- a/redakcja/static/js/button_scripts.js +++ b/redakcja/static/js/button_scripts.js @@ -48,8 +48,12 @@ function ScriptletCenter() { this.scriptlets = {}; - this.scriptlets['insert_tag'] = function(context, params, text, move_forward, done) + this.scriptlets['insert_tag'] = function(context, params, text, move_forward, move_up, done) { + var padding_top = ''; + for (var i=params.padding_top; i; i--) + padding_top += '\n'; + var start_tag = '<'+params.tag; var cursor_inside = false; @@ -60,6 +64,10 @@ function ScriptletCenter() start_tag += '>'; var end_tag = ''; + var padding_bottom = ''; + for (var i=params.padding_bottom; i; i--) + padding_bottom += '\n'; + if(text.length > 0) { // tokenize var output = ''; @@ -71,40 +79,41 @@ function ScriptletCenter() } else { // character output += token; - if(output == token) output += start_tag; + if(output == token) output += padding_top + start_tag; token = ''; output += text[index]; } } if( output[output.length-1] == '\\' ) { - output = output.substr(0, output.length-1) + end_tag + '\\'; + output = output.substr(0, output.length-1) + end_tag + padding_bottom + '\\'; } else { - output += end_tag; + output += end_tag + padding_bottom; } output += token; // keep cursor inside tag if some previous scriptlet has already moved it - cursor_inside = move_forward != 0; + cursor_inside = move_forward != 0 || move_up != 0; } else { if(params.nocontent) { - output = "<"+params.tag +" />"; + output = padding_top + "<"+params.tag +" />" + padding_bottom; } else { - output = start_tag + end_tag; + output = padding_top + start_tag + end_tag + padding_bottom; cursor_inside = true; } } if (cursor_inside) { - move_forward -= params.tag.length+3; + move_forward -= params.tag.length + 3; + move_up += params.padding_bottom || 0; } - done(output, move_forward); + done(output, move_forward, move_up); }.bind(this); - this.scriptlets['lineregexp'] = function(context, params, text, move_forward, done) { + this.scriptlets['lineregexp'] = function(context, params, text, move_forward, move_up, done) { var self = this; var exprs = $.map(params.exprs, function(expr) { @@ -117,7 +126,7 @@ function ScriptletCenter() }; }); - if(!text) done(text, move_forward); + if(!text) done(text, move_forward, move_up); var changed = 0; var lines = text.split('\n'); @@ -138,11 +147,11 @@ function ScriptletCenter() text = newlines.join('\n'); }; - done(text, move_forward); + done(text, move_forward, move_up); }); }.bind(this); - this.scriptlets['fulltextregexp'] = function(context, params, text, move_forward, done) { + this.scriptlets['fulltextregexp'] = function(context, params, text, move_forward, move_up, done) { var self = this; var exprs = $.map(params.exprs, function(expr) { @@ -156,42 +165,50 @@ function ScriptletCenter() }; }); - if(!text) done(text, move_forward); + if(!text) done(text, move_forward, move_up); nblck_each(exprs, function(expr, index) { $progress.html(600 + index); text = text.replace(expr.rx, expr.repl); }, function() { - done(text, move_forward); + done(text, move_forward, move_up); }); }.bind(this); - this.scriptlets['macro'] = function(context, params, text, move_forward, done) { + this.scriptlets['macro'] = function(context, params, text, move_forward, move_up, done) { var self = this; var i = 0; - function next(text, move_forward) { + function next(text, move_forward, move_up) { if (i < params.length) { var e = params[i]; i = i + 1; - self.scriptlets[e[0]](context, e[1], text, move_forward, next); + self.scriptlets[e[0]](context, e[1], text, move_forward, move_up, next); } else { - done(text, move_forward); + done(text, move_forward, move_up); } }; - next(text, move_forward); + next(text, move_forward, move_up); }.bind(this); - this.scriptlets['lowercase'] = function(context, params, text, move_forward, done) + this.scriptlets['lowercase'] = function(context, params, text, move_forward, move_up, done) { - if(!text) done(text, move_forward); - done(text.toLowerCase(), move_forward); + if(!text) done(text, move_forward, move_up); + done(text.toLowerCase(), move_forward, move_up); }.bind(this); - this.scriptlets["insert_stanza"] = function(context, params, text, move_forward, done) { + this.scriptlets["insert_stanza"] = function(context, params, text, move_forward, move_up, done) { + var padding_top = ''; + for (var i=params.padding_top; i; i--) + padding_top += '\n'; + + var padding_bottom = ''; + for (var i=params.padding_bottom; i; i--) + padding_bottom += '\n'; + if(text) { var verses = text.split('\n'); text = ''; var buf = ''; var ebuf = ''; @@ -208,53 +225,67 @@ function ScriptletCenter() ebuf += '\n' + verses[i]; } } - text = text + buf + '\n' + ebuf; + text = padding_top + text + buf + '\n' + padding_bottom + ebuf; } else { - text = "" + text = padding_top + "" + padding_bottom; move_forward -= "".length; + move_up += params.padding_bottom || 0; } - done(text, move_forward); + done(text, move_forward, move_up); }.bind(this); - this.scriptlets['autotag'] = function(context, params, text, move_forward, done) + this.scriptlets['autotag'] = function(context, params, text, move_forward, move_up, done) { - if(!text.match(/^\n+$/)) done(text, move_forward); + if(!text.match(/^\n+$/)) done(text, move_forward, move_up); + + var output = ''; - function insert_done(output, mf) { - text += output; + function insert_done(text, mf, mu) { + output += text; } if (!params.split) params.split = 2; if (!params.padding) params.padding = 3; - chunks = text.replace(/^\n+|\n+$/, '').split(new RegExp("\\n{"+params.split+",}")); - text = text.match(/^\n+/); - if (!text) - text = ''; - padding = ''; - for(; params.padding; params.padding--) { - padding += "\n"; - } - if (params.tag == 'strofa') tagger = this.scriptlets['insert_stanza']; else tagger = this.scriptlets['insert_tag']; - for (i in chunks) { - if (chunks[i]) { - if (params.tag == 'akap' && chunks[i].match(/^---/)) - tag = 'akap_dialog'; - else tag = params.tag; - tagger(context, {tag: tag}, chunks[i], 0, insert_done); - text += padding; - } + var padding_top = text.match(/^\n+/) + output = padding_top ? padding_top[0] : ''; + + padding = ''; + for(var i=params.padding; i; --i) { + padding += "\n"; + } + + text = text.substr(output.length); + var chunk_reg = new RegExp("^([\\s\\S]+?)(\\n{"+params.split+",}|$)"); + while (match = text.match(chunk_reg)) { + if (params.tag == 'akap' && match[1].match(/^---/)) + tag = 'akap_dialog'; + else tag = params.tag; + tagger(context, {tag: tag}, match[1], 0, 0, insert_done); + if (match[2].length > params.padding) + output += match[2]; + else + output += padding; + text = text.substr(match[0].length) } - done(text, move_forward); + output += text; + + done(output, move_forward, move_up); + }.bind(this); + + + this.scriptlets['slugify'] = function(context, params, text, move_forward, move_up, done) + { + done(slugify(text.replace(/_/g, '-')), move_forward, move_up); }.bind(this); } @@ -272,16 +303,16 @@ ScriptletCenter.prototype.callInteractive = function(opts) { $.blockUI({message: $progress, showOverlay: false}); var input = self.XMLEditorSelectedText(opts.context); - self.scriptlets[opts.action](opts.context, opts.extra, input, 0, function(output, move_forward){ + self.scriptlets[opts.action](opts.context, opts.extra, input, 0, 0, function(output, move_forward, move_up){ /*if(timer) clearTimeout(timer); else */ if (input != output) { self.XMLEditorReplaceSelectedText(opts.context, output) } - if (move_forward) { + if (move_forward || move_up) { try { - self.XMLEditorMoveCursorForward(opts.context, move_forward) + self.XMLEditorMoveCursorForward(opts.context, move_forward, move_up) } catch(e) {} } @@ -300,9 +331,24 @@ ScriptletCenter.prototype.XMLEditorReplaceSelectedText = function(editor, replac editor.replaceSelection(replacement); }; -ScriptletCenter.prototype.XMLEditorMoveCursorForward = function(panel, n) { +ScriptletCenter.prototype.XMLEditorMoveCursorForward = function(panel, right, up) { var pos = panel.cursorPosition(); - panel.selectLines(pos.line, pos.character + n); + if (up) { + line = pos.line; + while (up < 0) { + line = panel.nextLine(line); + ++up; + } + while (up > 0) { + line = panel.prevLine(line); + --up; + } + len = panel.lineContent(line).length; + panel.selectLines(line, len + right); + } + else { + panel.selectLines(pos.line, pos.character + right); + } }; var scriptletCenter;