OcttKB/Wiki-OcttKB/plugins/relink/$__plugins_flibbles_relink_js_bulkops.js

81 lines
2.4 KiB
JavaScript

/*\
module-type: startup
Replaces the relinkTiddler defined in $:/core/modules/wiki-bulkops.js
This is a startup instead of a wikimethods module-type because it's the only
way to ensure this runs after the old relinkTiddler method is applied.
\*/
(function(){
/*jslint node: false, browser: true */
/*global $tw: false */
"use strict";
var language = require('$:/plugins/flibbles/relink/js/language.js');
var utils = require("$:/plugins/flibbles/relink/js/utils.js");
exports.name = "redefine-relinkTiddler";
exports.synchronous = true;
// load-modules is when wikimethods are applied in
// ``$:/core/modules/startup/load-modules.js``
exports.after = ['load-modules'];
// We come before commands because they may do renaming, or jasmine testing
exports.before = ['commands'];
exports.startup = function() {
$tw.Wiki.prototype.relinkTiddler = relinkTiddler;
};
/** Walks through all relinkable tiddlers and relinks them.
* This replaces the existing function in core Tiddlywiki.
*/
function relinkTiddler(fromTitle, toTitle, options) {
options = options || {};
var failures = [];
var indexer = utils.getIndexer(this);
var records = indexer.relinkLookup(fromTitle, toTitle, options);
for (var title in records) {
var entries = records[title],
changes = Object.create(null),
update = false,
fails = false;
for (var field in entries) {
var entry = entries[field];
fails = fails || entry.impossible;
if (entry.output !== undefined) {
changes[field] = entry.output;
update = true;
}
}
if (fails) {
failures.push(title);
}
// If any fields changed, update tiddler
if (update) {
console.log("Renaming '"+fromTitle+"' to '"+toTitle+"' in '" + title + "'");
var tiddler = this.getTiddler(title);
var modifyField = utils.touchModifyField(this) ? this.getModificationFields() : undefined;
var newTiddler = new $tw.Tiddler(tiddler,changes,modifyField)
newTiddler = $tw.hooks.invokeHook("th-relinking-tiddler",newTiddler,tiddler);
this.addTiddler(newTiddler);
// If the title changed, we need to perform a nested rename
if (newTiddler.fields.title !== title) {
this.deleteTiddler(title);
this.relinkTiddler(title, newTiddler.fields.title,options);
}
}
};
if (failures.length > 0) {
var options = $tw.utils.extend(
{ variables: {to: toTitle, from: fromTitle},
wiki: this},
options );
language.reportFailures(failures, options);
}
};
})();