X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/3957e054be29921a1ace348bdebdcb805a1f89ff..9b533fdbfd08bd764744ae3a0d4717c87b61cf18:/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 bd67db6c..e43905c9 100644 --- a/src/redakcja/static/js/wiki/view_editor_wysiwyg.js +++ b/src/redakcja/static/js/wiki/view_editor_wysiwyg.js @@ -121,9 +121,6 @@ - - - /* Insert theme using current selection */ function addTheme(){ @@ -141,11 +138,9 @@ return false; } - // remember the selected range var range = selection.getRangeAt(0); - if ($(range.startContainer).is('.html-editarea') || $(range.endContainer).is('.html-editarea')) { window.alert("Motywy można oznaczaÄ tylko na tekÅcie nie otwartym do edycji. \n Zamknij edytowany fragment i spróbuj ponownie."); @@ -228,29 +223,53 @@ if(editArea) { var specialCharsContainer = $("
"); - 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 = "WystÄ piÅ bÅÄ d:
'+text+'
'; - if (source) - err += ''+source.replace(/&/g, '&').replace(/' - $('#html-view').html(err); - _finalize(failure); + function _finalize(callback){ + $.unblockUI(); + if (callback) + callback(); } - }); - }; - - VisualPerspective.prototype.onExit = function(success, failure){ - var self = this; - self.caret.detach(); - - $.wiki.exitTab('#PropertiesPerspective'); - - $.blockUI({ - message: 'Zapisywanie widoku...' - }); + xml2html({ + xml: this.doc.text, + base: this.doc.getBase(), + success: function(element){ + + var htmlView = $('#html-view'); + htmlView.html(element); + if ('PropertiesPerspective' in $.wiki.perspectives) + $.wiki.perspectives.PropertiesPerspective.enable(); + + _finalize(success); + }, + error: function(text, source){ + let err = 'WystÄ piÅ bÅÄ d:
'+text+'
'; + if (source) + err += ''+source.replace(/&/g, '&').replace(/' + $('#html-view').html(err); + _finalize(failure); + } + }); + } - function _finalize(callback){ - $.unblockUI(); - if (callback) - callback(); + 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('WystÄ piÅ bÅÄ d:
' + text + ''); + } + }); + } + }); } - if ($('#html-view .error').length > 0) - return _finalize(failure); + onExit(success, failure) { + var self = this; - html2text({ - element: $('#html-view').get(0), - stripOuter: true, - success: function(text){ - self.doc.setText(text); - _finalize(success); - }, - error: function(text){ - $('#source-editor').html('WystÄ piÅ bÅÄ d:
' + text + ''); - _finalize(failure); - } - }); - }; + self.caret.detach(); - VisualPerspective.prototype.insertInlineTag = function(tag) { - this.caret.detach(); + if ('PropertiesPerspective' in $.wiki.perspectives) + $.wiki.perspectives.PropertiesPerspective.disable(); - let selection = window.getSelection(); - var n = selection.rangeCount; - if (n != 1 || selection.isCollapsed) { - window.alert("Nie zaznaczono obszaru"); - return false - } - let range = selection.getRangeAt(0); + self.flush().then(() => { + success && success(); + }).catch((e) => { + // TODO report + console.log('REJECTED!', e); + failure && failure(); + }); + }; - // Make sure that: - // Both ends are in the same x-node container. - // TODO: That the container is a inline-text container. - let node = range.startContainer; - if (node.nodeType == node.TEXT_NODE) { - node = node.parentNode; - } - let endNode = range.endContainer; - if (endNode.nodeType == endNode.TEXT_NODE) { - endNode = endNode.parentNode; - } - if (node != endNode) { - window.alert("ZÅy obszar."); - return false; - } + insertInlineTag(tag) { + this.caret.detach(); + let self = this; - // We will construct a HTML element with the range selected. - let div = $(""); + let selection = window.getSelection(); + var n = selection.rangeCount; + if (n != 1 || selection.isCollapsed) { + window.alert("Nie zaznaczono obszaru"); + return false + } + let range = selection.getRangeAt(0); - contents = $(node).contents(); - let startChildIndex = node == range.startContainer ? 0 : contents.index(range.startContainer); - let endChildIndex = contents.index(range.endContainer); + // Make sure that: + // Both ends are in the same x-node container. + // Both ends are set to text nodes. + // TODO: That the container is a inline-text container. + let commonNode = range.endContainer; - current = range.startContainer; - if (current.nodeType == current.TEXT_NODE) { - current = current.splitText(range.startOffset); - } - while (current != range.endContainer) { - n = current.nextSibling; - $(current).appendTo(div); - current = n; - } - if (current.nodeType == current.TEXT_NODE) { - end = current.splitText(range.endOffset); - } - $(current).appendTo(div); - - html2text({ - element: div[0], - success: function(d) { - xml2html({ - xml: d = '<' + tag + '>' + d + '' + tag + '>', - success: function(html) { - // What if no end? - node.insertBefore($(html)[0], end); - } - }); - }, - error: function(a, b) { - console.log(a, b); + if (commonNode.nodeType == Node.TEXT_NODE) { + commonNode = commonNode.parentNode; + } + let node = range.startContainer; + if (node.nodeType == Node.TEXT_NODE) { + node = node.parentNode; + } + if (node != commonNode) { + window.alert("ZÅy obszar."); + return false; } - }); - }; - VisualPerspective.prototype.insertAtRange = function(range, elem) { - let self = this; - let $end = $(range.endContainer); - if ($end.attr('id') == 'caret') { - self.caret.insert(elem); - } else { - range.insertNode(elem[0]); - } - } + let end; + if (range.endContainer.nodeType == Node.TEXT_NODE) { + end = range.endContainer.splitText(range.endOffset); + } else { + end = document.createTextNode(''); + let cont = $(range.endContainer).contents(); + if (range.endOffset < cont.length) { + range.endContainer.insertBefore(end, cont[range.endOffset]) + } else { + range.endContainer.append(end); + } + } - VisualPerspective.prototype.addReference = function() { - let self = this; - var selection = window.getSelection(); - var n = selection.rangeCount; + let current; + if (range.startContainer.nodeType == Node.TEXT_NODE) { + current = range.startContainer.splitText(range.startOffset); + } else { + current = document.createTextNode(''); + let cont = $(range.startContainer).contents(); + if (range.startOffset < cont.length) { + range.startContainer.insertBefore(current, cont[range.startOffset]) + } else { + startNode.append(current); + } + } - // TODO: if no selection, take caret position.. - if (n == 0) { - window.alert("Nie zaznaczono żadnego obszaru"); - return false; + // We will construct a HTML element with the range selected. + let div = $(""); + while (current != end) { + n = current.nextSibling; + $(current).appendTo(div); + current = n; + } + + html2text({ + element: div[0], + success: function(d) { + xml2html({ + xml: d = '<' + tag + '>' + d + '' + tag + '>', + success: function(html) { + // What if no end? + node.insertBefore($(html)[0], end); + self.flush(); + } + }); + }, + error: function(a, b) { + console.log(a, b); + } + }); } - var range = selection.getRangeAt(n - 1); - if (!verifyTagInsertPoint(range.endContainer)) { - window.alert("Nie można wstawiÄ w to miejsce referencji."); - return false; + insertAtRange(range, elem) { + let self = this; + let $end = $(range.endContainer); + if ($end.attr('id') == 'caret') { + self.caret.insert(elem); + } else { + range.insertNode(elem[0]); + } } - var tag = $(''); + addReference() { + let self = this; + var selection = window.getSelection(); + var n = selection.rangeCount; - range.collapse(false); - self.insertAtRange(range, tag); + // TODO: if no selection, take caret position.. + if (n == 0) { + window.alert("Nie zaznaczono żadnego obszaru"); + return false; + } - xml2html({ - xml: '', - success: function(text){ - var t = $(text); - tag.replaceWith(t); - openForEdit(t); - }, - error: function(){ - tag.remove(); - alert('BÅÄ d przy dodawaniu referncji:' + errors); + var range = selection.getRangeAt(n - 1); + if (!verifyTagInsertPoint(range.endContainer)) { + window.alert("Nie można wstawiÄ w to miejsce referencji."); + return false; } - }) + + var tag = $(''); + + range.collapse(false); + self.insertAtRange(range, tag); + + xml2html({ + xml: '', + success: function(text){ + var t = $(text); + tag.replaceWith(t); + openForEdit(t); + }, + error: function(){ + tag.remove(); + alert('BÅÄ d przy dodawaniu referncji:' + errors); + } + }) + } } $.wiki.VisualPerspective = VisualPerspective;