X-Git-Url: https://git.mdrn.pl/redakcja.git/blobdiff_plain/f769689fb6c21d76aa70f4113ba918e45b528576..d86195c3b7dc2726a9eff10fdb2b9f5190ca15fe:/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..2e1c28d2 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;
@@ -44,16 +56,16 @@
}
/* 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 = "";
$(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);
+ }
+ })
+ }
+
+ 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;
+ 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;