X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/9d566b4741eb66bf09b5c7d213aa8541886e100a..8da57c41af2d69702bbc23c7a64adc6f102d2bcd:/src/redakcja/static/js/wiki/view_editor_wysiwyg.js diff --git a/src/redakcja/static/js/wiki/view_editor_wysiwyg.js b/src/redakcja/static/js/wiki/view_editor_wysiwyg.js index c8f84e1f..3d4ca02c 100644 --- a/src/redakcja/static/js/wiki/view_editor_wysiwyg.js +++ b/src/redakcja/static/js/wiki/view_editor_wysiwyg.js @@ -56,7 +56,7 @@ } /* Convert HTML fragment to plaintext */ - var ANNOT_FORBIDDEN = ['pt', 'pa', 'pr', 'pe', 'begin', 'end', 'motyw']; + var ANNOT_FORBIDDEN = ['pt', 'pa', 'pr', 'pe', 'ptrad', 'begin', 'end', 'motyw']; function html2plainText(fragment){ var text = ""; @@ -110,7 +110,7 @@ success: function(text){ var t = $(text); tag.replaceWith(t); - openForEdit(t); + openForEdit(t, trim=false); }, error: function(){ tag.remove(); @@ -223,29 +223,53 @@ if(editArea) { var specialCharsContainer = $("<div id='specialCharsContainer'><a href='#' id='specialCharsClose'>Zamknij</a><table id='tableSpecialChars' style='width: 600px;'></table></div>"); - var specialChars = ['â', 'Ä','Ä ','Ä','Ä','Ä','Ä','Å','Å','Å','Å','Ã','ó','Å','Å','Å»','ż','Ź','ź','Ã','á','Ã','à ', - 'Ã','â','Ã','ä','à ','Ã¥','Ä','Ä','Ä','Ä','Ã','ã', - 'Ã','æ','Ã','ç','Ä','Ä','Ä','Ä','Ä','Ä','Ã','é','Ã','è', - 'Ã','ê','Ã','ë','Ä','Ä','Ä','Ä','Ä ','Ä¡','Ħ','ħ','Ã','Ã','Ã','î', - 'Ī','Ä«','Ĭ','Ä','Ľ','ľ','Ã','ñ','Å','Å','Ã','ó','Ã','ö', - 'Ã','ô','Å','Å','Ç','Ç','Å','Å','Ã','ø','Å','Å','Å ', - 'Å¡','Å','Å','Ť','Å¥','Å¢','Å£','Å°','ű','Ã','ú','Ã','ù', - 'Ã','ü','Å®','ů','Ū','Å«','Ã','û','Ŭ','Å', - 'Ã','ý','Ž','ž','Ã','Ã','ð','Ã','þ','Ð','а','Ð', - 'б','Ð','в','Ð','г','Ð','д','Ð','е','Ð','Ñ','Ð', - 'ж','Ð','з','Ð','и','Ð','й','Ð','к','Ð','л','Ð', - 'м','Ð','н','Ð','о','Ð','п','Ð ','Ñ','С','Ñ', - 'Т','Ñ','У','Ñ','Ф','Ñ','Ð¥','Ñ ','Ц','Ñ','Ч', - 'Ñ','Ш','Ñ','Щ','Ñ','Ъ','Ñ','Ы','Ñ','Ь','Ñ','Ð', - 'Ñ','Ю','Ñ','Я','Ñ','Ñ','Ñ','Ñ','Ñ','Ñ','Ñ','Ñ', - 'Ò','Ò','Î','α','Î','β','Î','γ','Î','δ','Î','ε', - 'Î','ζ','Î','η','Î','θ','Î','ι','Î','κ','Î','λ','Î', - 'μ','Î','ν','Î','ξ','Î','ο','Î ','Ï','Ρ','Ï','Σ','Ï','Ï', - 'Τ','Ï','Î¥','Ï ','Φ','Ï','Χ','Ï','Ψ','Ï','Ω','Ï','â', - 'â','¡','¿','$','¢','£','â¬','©','®','°','¹','²','³', - '¼','½','¾','â ','§','â°','â¢','â','â','â','â', - 'â','â','ââ','«','»','«»','»«','â','[',']','~','|','â','·', - 'Ã','÷','â','â ','±','â¤','â¥','â']; + var specialChars = [ + 'â', 'Ä','Ä ','Ä','Ä','Ä','Ä','Å','Å','Å','Å','Ã','ó','Å','Å','Å»','ż','Ź','ź','Ã','á','Ã','à ', + 'Ã','â','Ã','ä','à ','Ã¥','Ä','Ä','Ä','Ä','Ã','ã', + 'Ã','æ','Ã','ç','Ä','Ä','Ä','Ä','Ä','Ä','Ã','é','Ã','è', + 'Ã','ê','Ã','ë','Ä','Ä','Ä','Ä','Ä ','Ä¡','Ħ','ħ','Ã','Ã','Ã','î', + 'Ī','Ä«','Ĭ','Ä','Ľ','ľ','Ã','ñ','Å','Å','Ã','ó','Ã','ö', + 'Ã','ô','Å','Å','Ç','Ç','Å','Å','Ã','ø','Å','Å','Å ', + 'Å¡','Å','Å','Ť','Å¥','Å¢','Å£','Å°','ű','Ã','ú','Ã','ù', + 'Ã','ü','Å®','ů','Ū','Å«','Ã','û','Ŭ','Å', + 'Ã','ý','Ž','ž','Ã','Ã','ð','Ã','þ','Ð','а','Ð', + 'б','Ð','в','Ð','г','Ð','д','Ð','е','Ð','Ñ','Ð', + 'ж','Ð','з','Ð','и','Ð','й','Ð','к','Ð','л','Ð', + 'м','Ð','н','Ð','о','Ð','п','Ð ','Ñ','С','Ñ', + 'Т','Ñ','У','Ñ','Ф','Ñ','Ð¥','Ñ ','Ц','Ñ','Ч', + 'Ñ','Ш','Ñ','Щ','Ñ','Ъ','Ñ','Ы','Ñ','Ь','Ñ','Ð', + 'Ñ','Ю','Ñ','Я','Ñ','Ñ','Ñ','Ñ','Ñ','Ñ','Ñ','Ñ', + 'Ò','Ò','Î','α','Î','β','Î','γ','Î','δ','Î','ε', + 'Î','ζ','Î','η','Î','θ','Î','ι','Î','κ','Î','λ','Î', + 'μ','Î','ν','Î','ξ','Î','ο','Î ','Ï','Ρ','Ï','Σ','Ï','Ï', + 'Τ','Ï','Î¥','Ï ','Φ','Ï','Χ','Ï','Ψ','Ï','Ω','Ï','â', + 'â','¡','¿','$','¢','£','â¬','©','®','°','¹','²','³', + '¼','½','¾','â ','§','â°','â¢','â','â','â','â', + 'â','â','ââ','«','»','«»','»«','â','[',']','~','|','â','·', + 'Ã','÷','â','â ','±','â¤','â¥','â', + + // Hebrew + '\u05d0', '\u05d1', '\u05d2', '\u05d3', '\u05d4', '\u05d5', '\u05d6', '\u05d7', + '\u05d8', '\u05d9', '\u05da', '\u05db', '\u05dc', '\u05dd', '\u05de', '\u05df', + '\u05e0', '\u05e1', '\u05e2', '\u05e3', '\u05e4', '\u05e5', '\u05e6', '\u05e7', + '\u05e8', '\u05e9', '\u05e0', '\u05ea', + + '\u0591', '\u0592', '\u0593', '\u0594', '\u0595', '\u0596', '\u0597', + '\u0598', '\u0599', '\u059a', '\u059b', '\u059c', '\u059d', '\u059e', '\u059f', + '\u05a0', '\u05a1', '\u05a2', '\u05a3', '\u05a4', '\u05a5', '\u05a6', '\u05a7', + '\u05a8', '\u05a9', '\u05aa', '\u05ab', '\u05ac', '\u05ad', '\u05ae', '\u05af', + '\u05b0', '\u05b1', '\u05b2', '\u05b3', '\u05b4', '\u05b5', '\u05b6', '\u05b7', + '\u05b8', '\u05b9', '\u05ba', '\u05bb', '\u05bc', '\u05bd', '\u05be', '\u05bf', + '\u05c0', '\u05c1', '\u05c2', '\u05c3', '\u05c4', '\u05c5', '\u05c6', '\u05c7', + + '\ufb1d', '\ufb1e', '\ufb1f', + '\ufb20', '\ufb21', '\ufb22', '\ufb23', '\ufb24', '\ufb25', '\ufb26', '\ufb27', + '\ufb28', '\ufb29', '\ufb2a', '\ufb2b', '\ufb2c', '\ufb2d', '\ufb2e', '\ufb2f', + '\ufb30', '\ufb31', '\ufb32', '\ufb33', '\ufb34', '\ufb35', '\ufb36', + '\ufb38', '\ufb39', '\ufb3a', '\ufb3b', '\ufb3c', '\ufb3e', + '\ufb40', '\ufb41', '\ufb43', '\ufb44', '\ufb46', '\ufb47', + '\ufb48', '\ufb49', '\ufb4a', '\ufb4b', '\ufb4c', '\ufb4d', '\ufb4e', '\ufb4f', + ] var tableContent = "<tr>"; for(var i in specialChars) { @@ -381,7 +405,7 @@ } /* open edition window for selected fragment */ - function openForEdit($origin){ + function openForEdit($origin, trim=true){ var $box = null // annotations overlay their sub box - not their own box // @@ -491,7 +515,11 @@ element: source, stripOuter: true, success: function(text){ - $('textarea', $overlay).val($.trim(text)); + let ttext = text; + if (trim) { + ttext = ttext.trim(); + } + $('textarea', $overlay).val(ttext); setTimeout(function(){ $('textarea', $overlay).elastic().focus(); @@ -526,6 +554,7 @@ $origin.html($(element).html()); } $overlay.remove(); + $.wiki.activePerspective().flush(); }, error: function(text){ alert('BÅÄ d! ' + text); @@ -609,89 +638,109 @@ class VisualPerspective extends $.wiki.Perspective { constructor(options) { - var old_callback = options.callback; - - options.callback = function(){ - let self = this; - var element = $("#html-view"); - var button = $('<button class="edit-button active-block-button">Edytuj</button>'); - var uwagaButton = $('<button class="uwaga-button active-block-button">Uwaga</button>'); - - if (!CurrentDocument.readonly) { - - $('#html-view').bind('mousemove', function(event){ - var editable = $(event.target).closest('*[x-editable]'); - $('.active', element).not(editable).removeClass('active').children('.active-block-button').remove(); - - if (!editable.hasClass('active')) { - editable.addClass('active').append(button); - if (!editable.is('[x-edit-attribute]') && - !editable.is('.annotation-inline-box') && - !editable.is('[x-edit-no-format]') - ) { - editable.append(uwagaButton); - } - } - if (editable.is('.annotation-inline-box')) { - $('*[x-annotation-box]', editable).css({ - }).show(); + super(options); + let self = this; + var element = $("#html-view"); + var button = $('<button class="edit-button active-block-button">Edytuj</button>'); + var uwagaButton = $('<button class="uwaga-button active-block-button">Uwaga</button>'); + + if (!CurrentDocument.readonly) { + + $('#html-view').bind('mousemove', function(event){ + var editable = $(event.target).closest('*[x-editable]'); + $('.active', element).not(editable).removeClass('active').children('.active-block-button').remove(); + + if (!editable.hasClass('active')) { + editable.addClass('active').append(button); + if (!editable.is('[x-edit-attribute]') && + !editable.is('.annotation-inline-box') && + !editable.is('[x-edit-no-format]') + ) { + editable.append(uwagaButton); } - }); - - self.caret = new Caret(element); - - $('#insert-reference-button').click(function(){ - self.addReference(); - return false; - }); - - $('#insert-annotation-button').click(function(){ - addAnnotation(); - return false; - }); + } + if (editable.is('.annotation-inline-box')) { + $('*[x-annotation-box]', editable).css({ + }).show(); + } + if (editable.is('.reference-inline-box')) { + let preview = $('*[x-preview]', editable); + preview.show(); + let link = $("a", preview); + let href = link.attr('href'); + if (link.attr('title') == '?' && href.startsWith('https://www.wikidata.org/wiki/')) { + link.attr('title', 'â¦'); + let qid = href.split('/').reverse()[0]; + $.ajax({ + url: 'https://www.wikidata.org/w/rest.php/wikibase/v1/entities/items/' + qid + '?_fields=labels', + dataType: "json", + success: function(data) { + link.attr( + 'title', + data['labels']['pl'] || data['labels']['en'] + ); + }, + }); + } + } + }); - $('#insert-theme-button').click(function(){ - addTheme(); - return false; - }); + self.caret = new Caret(element); + $('#insert-reference-button').click(function(){ + self.flush(); + self.addReference(); + return false; + }); - $(".insert-inline-tag").click(function() { - self.insertInlineTag($(this).attr('data-tag')); - return false; - }); + $('#insert-annotation-button').click(function(){ + self.flush(); + addAnnotation(); + return false; + }); - $(".insert-char").click(function() { - addSymbol(caret=self.caret); - return false; - }); + $('#insert-theme-button').click(function(){ + self.flush(); + addTheme(); + return false; + }); - $(document).on('click', '.edit-button', function(event){ - event.preventDefault(); - openForEdit($(this).parent()); - }); + $(".insert-inline-tag").click(function() { + self.flush(); + self.insertInlineTag($(this).attr('data-tag')); + return false; + }); - $(document).on('click', '.uwaga-button', function(event){ - event.preventDefault(); - createUwagaBefore($(this).parent()); - }); - } + $(".insert-char").click(function() { + self.flush(); + addSymbol(caret=self.caret); + return false; + }); - $(document).on('click', '[x-node="motyw"]', function(){ - selectTheme($(this).attr('theme-class')); + $(document).on('click', '.edit-button', function(event){ + self.flush(); + event.preventDefault(); + openForEdit($(this).parent()); }); - element.on('click', '.annotation', function(event) { + $(document).on('click', '.uwaga-button', function(event){ + self.flush(); event.preventDefault(); - event.redakcja_caret_ignore = true; - $('[x-annotation-box]', $(this).parent()).toggleClass('editing'); - self.caret.detach(); + createUwagaBefore($(this).parent()); }); + } - old_callback.call(this); - }; + $(document).on('click', '[x-node="motyw"]', function(){ + selectTheme($(this).attr('theme-class')); + }); - super(options); + element.on('click', '.annotation', function(event) { + self.flush(); + event.preventDefault(); + event.redakcja_caret_ignore = true; + $('[x-annotation-box]', $(this).parent()).toggleClass('editing'); + self.caret.detach(); + }); } onEnter(success, failure) { @@ -707,6 +756,7 @@ callback(); } + let self = this; xml2html({ xml: this.doc.text, base: this.doc.getBase(), @@ -714,6 +764,9 @@ var htmlView = $('#html-view'); htmlView.html(element); + self.renumber(); + if ('PropertiesPerspective' in $.wiki.perspectives) + $.wiki.perspectives.PropertiesPerspective.enable(); _finalize(success); }, @@ -725,44 +778,51 @@ _finalize(failure); } }); - }; + } + + flush() { + let self = this; + return new Promise((resolve, reject) => { + if ($('#html-view .error').length > 0) { + reject() + } else { + //return _finalize(failure); + html2text({ + element: $('#html-view').get(0), + stripOuter: true, + success: (text) => { + self.doc.setText(text); + resolve(); + }, + error: (text) => { + reject(text); + //$('#source-editor').html('<p>WystÄ piÅ bÅÄ d:</p><pre>' + text + '</pre>'); + } + }); + } + }); + } onExit(success, failure) { var self = this; self.caret.detach(); - $.wiki.exitTab('#PropertiesPerspective'); + if ('PropertiesPerspective' in $.wiki.perspectives) + $.wiki.perspectives.PropertiesPerspective.disable(); - $.blockUI({ - message: 'Zapisywanie widoku...' - }); - - function _finalize(callback){ - $.unblockUI(); - if (callback) - callback(); - } - - if ($('#html-view .error').length > 0) - return _finalize(failure); - - html2text({ - element: $('#html-view').get(0), - stripOuter: true, - success: function(text){ - self.doc.setText(text); - _finalize(success); - }, - error: function(text){ - $('#source-editor').html('<p>WystÄ piÅ bÅÄ d:</p><pre>' + text + '</pre>'); - _finalize(failure); - } + self.flush().then(() => { + success && success(); + }).catch((e) => { + // TODO report + console.log('REJECTED!', e); + failure && failure(); }); }; insertInlineTag(tag) { this.caret.detach(); + let self = this; let selection = window.getSelection(); var n = selection.rangeCount; @@ -832,6 +892,7 @@ success: function(html) { // What if no end? node.insertBefore($(html)[0], end); + self.flush(); } }); }, @@ -886,6 +947,23 @@ } }) } + + renumber() { + let number = 0; + $('#html-view *').each((i, e) => { + let $e = $(e); + if ($e.closest('[x-node="abstrakt"]').length) return; + if ($e.closest('[x-node="nota_red"]').length) return; + if ($e.closest('[x-annotation-box="true"]').length) return; + let node = $e.attr('x-node'); + if (node == 'numeracja') { + number = 0; + } else if (['werset', 'akap', 'wers'].includes(node)) { + number ++; + $e.attr('x-number', number); + } + }) + } } $.wiki.VisualPerspective = VisualPerspective;