OcttKB/Wiki-OcttKB/plugins/relink/$__plugins_flibbles_relink_...

133 lines
3.6 KiB
JavaScript

/*\
module-type: widget
Creates a mangler widget for field validation. This isn't meant to be used
by the user. It's only used in Relink configuration.
\*/
var Widget = require("$:/core/modules/widgets/widget.js").widget;
var language = require('$:/plugins/flibbles/relink/js/language.js');
var utils = require('$:/plugins/flibbles/relink/js/utils.js');
var RelinkManglerWidget = function(parseTreeNode,options) {
this.initialise(parseTreeNode,options);
this.addEventListeners([
{type: "relink-add-field", handler: "handleAddFieldEvent"},
{type: "relink-add-operator", handler: "handleAddOperatorEvent"},
{type: "relink-add-parameter", handler: "handleAddParameterEvent"},
{type: "relink-add-attribute", handler: "handleAddAttributeEvent"}
]);
};
exports.relinkmangler = RelinkManglerWidget;
RelinkManglerWidget.prototype = new Widget();
// This wraps alert so it can be monkeypatched during testing.
RelinkManglerWidget.prototype.alert = function(message) {
alert(message);
};
RelinkManglerWidget.prototype.handleAddFieldEvent = function(event) {
var param = event.paramObject;
if (typeof param !== "object" || !param.field) {
// Can't handle it.
return true;
}
var trimmedName = param.field.trim();
if (!trimmedName) {
// Still can't handle it, but don't warn.
return true;
}
if(!$tw.utils.isValidFieldName(trimmedName)) {
this.alert($tw.language.getString(
"InvalidFieldName",
{variables:
{fieldName: trimmedName}
}
));
} else {
add(this.wiki, "fields", trimmedName);
}
return true;
};
/**Not much validation, even though there are definitely illegal
* operator names. If you input on, Relink won't relink it, but it
* won't choke on it either. Tiddlywiki will...
*/
RelinkManglerWidget.prototype.handleAddOperatorEvent = function(event) {
var param = event.paramObject;
if (param) {
add(this.wiki, "operators", param.operator);
}
return true;
};
RelinkManglerWidget.prototype.handleAddParameterEvent = function(event) {
var param = event.paramObject;
if (param && param.macro && param.parameter) {
if (/\s/.test(param.macro.trim())) {
this.alert(language.getString(
"text/plain",
"Error/InvalidMacroName",
{ variables: {macroName: param.macro},
wiki: this.wiki
}
));
} else if (/[ \/]/.test(param.parameter.trim())) {
this.alert(language.getString(
"text/plain",
"Error/InvalidParameterName",
{ variables: {parameterName: param.parameter},
wiki: this.wiki
}
));
} else {
add(this.wiki, "macros", param.macro, param.parameter);
}
}
return true;
};
RelinkManglerWidget.prototype.handleAddAttributeEvent = function(event) {
var param = event.paramObject;
if (param && param.element && param.attribute) {
if (/[ \/]/.test(param.element.trim())) {
this.alert(language.getString(
"text/plain",
"Error/InvalidElementName",
{ variables: {elementName: param.element},
wiki: this.wiki
}
));
} else if (/[ \/]/.test(param.attribute.trim())) {
this.alert(language.getString(
"text/plain",
"Error/InvalidAttributeName",
{ variables: {attributeName: param.attribute},
wiki: this.wiki
}
));
} else {
add(this.wiki, "attributes", param.element, param.attribute);
}
}
return true;
};
function add(wiki, category/*, path parts*/) {
var path = "$:/config/flibbles/relink/" + category;
for (var x = 2; x < arguments.length; x++) {
var part = arguments[x];
// Abort if it's falsy, or only whitespace. Also, trim spaces
if (!part || !(part = part.trim())) {
return;
}
path = path + "/" + part;
}
var def = utils.getDefaultType(wiki);
wiki.addTiddler({title: path, text: def});
};