X-Git-Url: https://git.mdrn.pl/fnpeditor.git/blobdiff_plain/a287eed34e6c59d08ece25f89b05ad4bfc182835..4ae1d665fcd3af9fb06d664418f02f365933d9ae:/modules/visualEditor.js
diff --git a/modules/visualEditor.js b/modules/visualEditor.js
index b03b14b..a607d86 100644
--- a/modules/visualEditor.js
+++ b/modules/visualEditor.js
@@ -34,13 +34,7 @@ rng.modules.visualEditor = function(sandbox) {
this.node.on('keydown', '#rng-visualEditor-contentWrapper', function(e) {
if(e.which === 13) {
e.preventDefault();
- var anchor = $(window.getSelection().anchorNode);
- if(anchor[0].nodeType === Node.TEXT_NODE)
- anchor = anchor.parent();
- var newNode = anchor.clone().empty();
- newNode.attr('id', '');
- anchor.after(newNode);
- view.selectNode(newNode);
+ view.insertNewNode(null, null);
}
});
@@ -77,9 +71,6 @@ rng.modules.visualEditor = function(sandbox) {
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
- if(mutation.addedNodes.length > 0) {
- console.log(mutation.addedNodes);
- }
_.each(mutation.addedNodes, function(node) {
node = $(node);
node.parent().find('[wlxml-tag]').each(function() {
@@ -91,7 +82,57 @@ rng.modules.visualEditor = function(sandbox) {
});
});
var config = { attributes: true, childList: true, characterData: true, subtree: true };
- observer.observe(this.node.find('#rng-visualEditor-contentWrapper')[0], config);
+ observer.observe(this.node.find('#rng-visualEditor-contentWrapper')[0], config);
+
+ this.gridToggled = false;
+ },
+ _createNode: function(wlxmlTag, wlxmlClass) {
+ var toBlock = ['div', 'document', 'section', 'header'];
+ var htmlTag = _.contains(toBlock, wlxmlTag) ? 'div' : 'span';
+ var toret = $('<' + htmlTag + '>');
+ toret.attr('wlxml-tag', wlxmlTag);
+ if(wlxmlClass)
+ toret.attr('wlxml-class', wlxmlClass);
+ return toret;
+ },
+ insertNewNode: function(wlxmlTag, wlxmlClass) {
+ //TODO: Insert inline
+ var anchor = $(window.getSelection().anchorNode);
+ if(anchor[0].nodeType === Node.TEXT_NODE)
+ anchor = anchor.parent();
+ if(anchor.text() === '') {
+ var todel = anchor;
+ anchor = anchor.parent();
+ todel.remove();
+ }
+ var newNode = this._createNode(wlxmlTag || anchor.attr('wlxml-tag'), wlxmlClass || anchor.attr('wlxml-class'));
+ anchor.after(newNode);
+ mediator.nodeCreated(newNode);
+ isDirty = true;
+ },
+ wrapSelectionWithNewNode: function(wlxmlTag, wlxmlClass) {
+
+ var selection = window.getSelection();
+ if(selection.anchorNode === selection.focusNode && selection.anchorNode.nodeType === Node.TEXT_NODE) {
+ var startOffset = selection.anchorOffset;
+ var endOffset = selection.focusOffset;
+ if(startOffset > endOffset) {
+ var tmp = startOffset;
+ startOffset = endOffset;
+ endOffset = tmp;
+ }
+ var node = selection.anchorNode;
+ var prefix = node.data.substr(0, startOffset);
+ var suffix = node.data.substr(endOffset);
+ var core = node.data.substr(startOffset, endOffset - startOffset);
+ var newNode = this._createNode(wlxmlTag, wlxmlClass);
+ newNode.text(core);
+ $(node).replaceWith(newNode);
+ newNode.before(prefix);
+ newNode.after(suffix);
+ mediator.nodeCreated(newNode);
+ isDirty = true;
+ }
},
getMetaData: function() {
var toret = {};
@@ -119,8 +160,12 @@ rng.modules.visualEditor = function(sandbox) {
return this.node.find('#rng-visualEditor-content').html();
},
_markSelected: function(node) {
+ this.dimNode(node);
+
this.node.find('.rng-current').removeClass('rng-current');
+
node.addClass('rng-current');
+
this.currentNode = node;
mediator.nodeSelected(node);
},
@@ -140,10 +185,20 @@ rng.modules.visualEditor = function(sandbox) {
this.selectNode(node);
},
highlightNode: function(node) {
- node.addClass('rng-hover');
+ if(!this.gridToggled) {
+ node.addClass('rng-hover');
+ var label = node.attr('wlxml-tag');
+ if(node.attr('wlxml-class'))
+ label += ' / ' + node.attr('wlxml-class');
+ var tag = $('
').addClass('rng-visualEditor-nodeHoverTag').text(label);
+ node.append(tag);
+ }
},
dimNode: function(node) {
- node.removeClass('rng-hover');
+ if(!this.gridToggled) {
+ node.removeClass('rng-hover');
+ node.find('.rng-visualEditor-nodeHoverTag').remove();
+ }
},
highlightNodeById: function(id) {
var node = this.node.find('#'+id);
@@ -171,6 +226,13 @@ rng.modules.visualEditor = function(sandbox) {
var newRow = $(sandbox.getTemplate('metaItem')({key: key || '', value: value || ''}));
newRow.appendTo(this.metaTable);
return newRow;
+ },
+ toggleGrid: function(toggle) {
+ this.node.find('[wlxml-tag]').toggleClass('rng-hover', toggle);
+ this.gridToggled = toggle;
+ },
+ toggleTags: function(toggle) {
+
}
};
@@ -194,31 +256,7 @@ rng.modules.visualEditor = function(sandbox) {
mediator.getCurrentNode().attr('wlxml-'+attr, target.val());
isDirty = true;
});
-
- view.node.on('change', '.rng-visualEditor-editPaneSelectionForm select', function(e) {
- var target = $(e.target);
- var selection = window.getSelection();
- if(selection.anchorNode === selection.focusNode && selection.anchorNode.nodeType === Node.TEXT_NODE) {
- var startOffset = selection.anchorOffset;
- var endOffset = selection.focusOffset;
- if(startOffset > endOffset) {
- var tmp = startOffset;
- startOffset = endOffset;
- endOffset = tmp;
- }
- var node = selection.anchorNode;
- var prefix = node.data.substr(0, startOffset);
- var suffix = node.data.substr(endOffset);
- var core = node.data.substr(startOffset, endOffset - startOffset);
- var newNode = $('' + core + '');
- $(node).replaceWith(newNode);
- newNode.before(prefix);
- newNode.after(suffix);
- mediator.nodeCreated(newNode);
- isDirty = true;
- }
- });
-
+
view.node.on('click', '.rng-visualEditor-editPaneSurrouding a', function(e) {
var target = $(e.target);
mediator.nodeDimmedById(target.attr('data-id'));
@@ -245,12 +283,12 @@ rng.modules.visualEditor = function(sandbox) {
var pane = this.node.find('#rng-visualEditor-edit');
pane.html( $(sandbox.getTemplate('editPane')({tag: node.attr('wlxml-tag'), klass: node.attr('wlxml-class')})));
- var parent = {
+ var parent = node.parent('[wlxml-tag]').length ? {
repr: node.parent().attr('wlxml-tag') + ' / ' + (node.parent().attr('wlxml-class') || '[[no class]]'),
id: node.parent().attr('id')
- }
+ } : undefined;
var children = [];
- node.children().each(function() {
+ node.children('[wlxml-tag]').each(function() {
var child = $(this);
children.push({repr: child.attr('wlxml-tag') + ' / ' + (child.attr('wlxml-class') || '[[no class]]'), id: child.attr('id')});
});
@@ -267,8 +305,30 @@ rng.modules.visualEditor = function(sandbox) {
}
}
+ var toolbarView = {
+ node: view.node.find('#rng-visualEditor-toolbar'),
+ setup: function() {
+ var view = this;
+
+ view.node.find('button').click(function(e) {
+ var btn = $(e.currentTarget);
+ if(btn.attr('data-btn-type') === 'toggle') {
+ btn.toggleClass('active')
+ mediator.toolbarButtonToggled(btn.attr('data-btn'), btn.hasClass('active'));
+ }
+ if(btn.attr('data-btn-type') === 'cmd') {
+ mediator.toolbarButtonCmd(btn.attr('data-btn'));
+ }
+ });
+ },
+ getOption: function(option) {
+ return this.node.find('.rng-visualEditor-toolbarOption[data-option=' + option +']').val();
+ }
+ }
+
view.setup();
sideBarView.setup();
+ toolbarView.setup();
var mediator = {
getCurrentNode: function() {
@@ -276,7 +336,6 @@ rng.modules.visualEditor = function(sandbox) {
},
nodeCreated: function(node) {
view.selectNode(node);
-
},
nodeSelected: function(node) {
sideBarView.updateEditPane(node);
@@ -290,6 +349,23 @@ rng.modules.visualEditor = function(sandbox) {
nodeDimmedById: function(id) {
view.dimNodeById(id);
},
+ toolbarButtonToggled: function(btn, toggle) {
+ if(btn === 'grid')
+ view.toggleGrid(toggle);
+ if(btn === 'tags')
+ view.toggleTags(toggle);
+ },
+ toolbarButtonCmd: function(btn) {
+ if(btn === 'new-node') {
+ if(window.getSelection().isCollapsed)
+ view.insertNewNode(toolbarView.getOption('newTag-tag'), toolbarView.getOption('newTag-class'));
+ else {
+ this.wrapWithNodeRequest(toolbarView.getOption('newTag-tag'), toolbarView.getOption('newTag-class'));
+ }
+
+
+ }
+ },
nodeHovered: function(node) {
view.highlightNode(node);
sideBarView.highlightNode(node.attr('id'));
@@ -297,7 +373,11 @@ rng.modules.visualEditor = function(sandbox) {
nodeBlured: function(node) {
view.dimNode(node);
sideBarView.dimNode(node.attr('id'));
+ },
+ wrapWithNodeRequest: function(wlxmlTag, wlxmlClass) {
+ view.wrapSelectionWithNewNode(wlxmlTag, wlxmlClass);
}
+
}
var isDirty = false;