mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2024-09-17 17:59:45 +00:00
106 lines
2.9 KiB
JavaScript
106 lines
2.9 KiB
JavaScript
|
/*\
|
||
|
title: $:/core/macros/edit/editors/texteditor.js
|
||
|
type: application/javascript
|
||
|
module-type: editor
|
||
|
|
||
|
\*/
|
||
|
(function(){
|
||
|
|
||
|
/*jslint node: true, browser: true */
|
||
|
"use strict";
|
||
|
|
||
|
function TextEditor(macroNode) {
|
||
|
this.macroNode = macroNode;
|
||
|
}
|
||
|
|
||
|
TextEditor.prototype.getChildren = function() {
|
||
|
var tiddler = this.macroNode.wiki.getTiddler(this.macroNode.tiddlerTitle),
|
||
|
field = this.macroNode.hasParameter("field") ? this.macroNode.params.field : "title",
|
||
|
value;
|
||
|
if(tiddler) {
|
||
|
value = tiddler.getFieldString(field);
|
||
|
} else {
|
||
|
switch(field) {
|
||
|
case "text":
|
||
|
value = "Type the text for the tiddler '" + this.macroNode.tiddlerTitle + "'";
|
||
|
break;
|
||
|
case "title":
|
||
|
value = this.macroNode.tiddlerTitle;
|
||
|
break;
|
||
|
default:
|
||
|
value = "";
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
var attributes = {
|
||
|
"class": ["tw-edit-field"]
|
||
|
},
|
||
|
tagName,
|
||
|
content = [];
|
||
|
if(field === "text") {
|
||
|
tagName = "textarea";
|
||
|
content.push($tw.Tree.Text(value));
|
||
|
} else {
|
||
|
tagName = "input";
|
||
|
attributes.type = "text";
|
||
|
attributes.value = value;
|
||
|
}
|
||
|
return [$tw.Tree.Element(tagName,attributes,content)];
|
||
|
};
|
||
|
|
||
|
TextEditor.prototype.addEventHandlers = function() {
|
||
|
this.macroNode.domNode.addEventListener("focus",this,false);
|
||
|
this.macroNode.domNode.addEventListener("keyup",this,false);
|
||
|
};
|
||
|
|
||
|
TextEditor.prototype.handleEvent = function(event) {
|
||
|
// Get the value of the field if it might have changed
|
||
|
if("keyup".split(" ").indexOf(event.type) !== -1) {
|
||
|
this.saveChanges();
|
||
|
}
|
||
|
// Whatever the event, fix the height of the textarea if required
|
||
|
var self = this;
|
||
|
window.setTimeout(function() {
|
||
|
self.fixHeight();
|
||
|
},5);
|
||
|
return true;
|
||
|
};
|
||
|
|
||
|
TextEditor.prototype.saveChanges = function() {
|
||
|
var text = this.macroNode.children[0].domNode.value,
|
||
|
tiddler = this.macroNode.wiki.getTiddler(this.macroNode.tiddlerTitle);
|
||
|
if(tiddler && text !== tiddler.fields[this.macroNode.params.field]) {
|
||
|
var update = {};
|
||
|
update[this.macroNode.params.field] = text;
|
||
|
this.macroNode.wiki.addTiddler(new $tw.Tiddler(tiddler,update));
|
||
|
}
|
||
|
};
|
||
|
|
||
|
TextEditor.prototype.fixHeight = function() {
|
||
|
if(this.macroNode.children[0] && this.macroNode.children[0].domNode) {
|
||
|
var wrapper = this.macroNode.domNode,
|
||
|
textarea = this.macroNode.children[0].domNode;
|
||
|
// Set the text area height to 1px temporarily, which allows us to read the true scrollHeight
|
||
|
var prevWrapperHeight = wrapper.style.height;
|
||
|
wrapper.style.height = textarea.style.height + "px";
|
||
|
textarea.style.overflow = "hidden";
|
||
|
textarea.style.height = "1px";
|
||
|
textarea.style.height = textarea.scrollHeight + "px";
|
||
|
wrapper.style.height = prevWrapperHeight;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
TextEditor.prototype.postRenderInDom = function() {
|
||
|
this.fixHeight();
|
||
|
};
|
||
|
|
||
|
TextEditor.prototype.isRefreshable = function() {
|
||
|
// Don't refresh the editor if it contains the caret or selection
|
||
|
return !window.getSelection().containsNode(this.macroNode.domNode, true);
|
||
|
};
|
||
|
|
||
|
exports["text/x-tiddlywiki"] = TextEditor;
|
||
|
exports["text/plain"] = TextEditor;
|
||
|
|
||
|
})();
|