X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/f769689fb6c21d76aa70f4113ba918e45b528576..d3dfd4b8285e3b5939f7865907cc0537e948b6b6:/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 f3d18fd7..decc7339 100644
--- a/src/redakcja/static/js/wiki/view_editor_wysiwyg.js
+++ b/src/redakcja/static/js/wiki/view_editor_wysiwyg.js
@@ -18,15 +18,21 @@
/* Verify insertion port for annotation or theme */
function verifyTagInsertPoint(node){
- if (node.nodeType == 3) { // Text Node
+ if (node.nodeType == Node.TEXT_NODE) {
node = node.parentNode;
}
- if (node.nodeType != 1) {
+ if (node.nodeType != Node.ELEMENT_NODE) {
return false;
}
node = $(node);
+ if (node.attr('id') == 'caret') {
+ node = node.parent();
+ }
+ while (node.attr('x-pass-thru')) {
+ node = node.parent();
+ }
var xtype = node.attr('x-node');
if (!xtype || (xtype.search(':') >= 0) ||
@@ -36,6 +42,12 @@
return false;
}
+ return true;
+ }
+
+ function verifyThemeBoundaryPoint(node) {
+ if (!verifyTagInsertPoint(node)) return false;
+ node = $(node);
// don't allow themes inside annotations
if (node.closest('[x-node="pe"]').length > 0)
return false;
@@ -50,10 +62,10 @@
var text = "";
$(fragment.childNodes).each(function(){
- if (this.nodeType == 3) // textNode
+ if (this.nodeType == Node.TEXT_NODE)
text += this.nodeValue;
else {
- if (this.nodeType == 1 &&
+ if (this.nodeType == Node.ELEMENT_NODE &&
$.inArray($(this).attr('x-node'), ANNOT_FORBIDDEN) == -1) {
text += html2plainText(this);
}
@@ -69,76 +81,32 @@
var selection = window.getSelection();
var n = selection.rangeCount;
- if (n == 0) {
+ if (selection.isCollapsed) {
window.alert("Nie zaznaczono żadnego obszaru");
return false;
}
- // for now allow only 1 range
- if (n > 1) {
- window.alert("Zaznacz jeden obszar");
- return false;
- }
-
- // remember the selected range
- var range = selection.getRangeAt(0);
+ var range = selection.getRangeAt(n - 1);
if (!verifyTagInsertPoint(range.endContainer)) {
window.alert("Nie można wstawiÄ w to miejsce przypisu.");
return false;
}
- // BUG #273 - selected text can contain themes, which should be omitted from
- // defining term
- var text = html2plainText(range.cloneContents());
- var tag = $('');
- range.collapse(false);
- range.insertNode(tag[0]);
-
- xml2html({
- xml: '
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 + ''); + } + }); + } + }); } - perspective = this; - xml2html({ - xml: this.doc.text, - base: this.doc.getBase(), - success: function(element){ + onExit(success, failure) { + var self = this; - var htmlView = $('#html-view'); - htmlView.html(element); + self.caret.detach(); - _finalize(success); - }, - error: function(text, source){ - err = 'WystÄ piÅ bÅÄ d:
'+text+'
'; - if (source) - err += ''+source.replace(/&/g, '&').replace(/' - $('#html-view').html(err); - _finalize(failure); - } - }); - }; + if ('PropertiesPerspective' in $.wiki.perspectives) + $.wiki.perspectives.PropertiesPerspective.disable(); - VisualPerspective.prototype.onExit = function(success, failure){ - var self = this; + self.flush().then(() => { + success && success(); + }).catch((e) => { + // TODO report + console.log('REJECTED!', e); + failure && failure(); + }); + }; - self.caret.detach(); + insertInlineTag(tag) { + this.caret.detach(); + let self = this; - $.wiki.exitTab('#PropertiesPerspective'); - - $.blockUI({ - message: 'Zapisywanie widoku...' - }); + 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); - function _finalize(callback){ - $.unblockUI(); - if (callback) - callback(); - } + // 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; - if ($('#html-view .error').length > 0) - return _finalize(failure); + 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; + } - 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); + 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.insertInlineTag = function(tag) { - this.caret.detach(); + 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); + } + } - 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); + // We will construct a HTML element with the range selected. + let div = $(""); + while (current != end) { + n = current.nextSibling; + $(current).appendTo(div); + current = n; + } - // 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; + 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); + } + }); } - if (node != endNode) { - window.alert("ZÅy obszar."); - 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]); + } } - // We will construct a HTML element with the range selected. - let div = $(""); + addReference() { + let self = this; + var selection = window.getSelection(); + var n = selection.rangeCount; - contents = $(node).contents(); - let startChildIndex = node == range.startContainer ? 0 : contents.index(range.startContainer); - let endChildIndex = contents.index(range.endContainer); + // TODO: if no selection, take caret position.. + if (n == 0) { + window.alert("Nie zaznaczono żadnego obszaru"); + return false; + } - 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); + 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;