mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2024-12-27 10:30:28 +00:00
ae04a425c0
* Add tests for backlinks * Add backlinks indexer * Use backlinks indexer in getTiddlerBacklinks if available * Extract link extraction into its own method This way we can provide an arbitrary parse tree, rather than just a title, which will allow us to compare lists of outgoing links between versions of a single tiddler * Use new extractLinks method in backlinks indexer ...rather than copy-pasting the implementation * Remove ES6-isms TiddlyWiki needs to work with browsers that only support ES5
87 lines
1.8 KiB
JavaScript
87 lines
1.8 KiB
JavaScript
/*\
|
|
title: $:/core/modules/indexers/backlinks-indexer.js
|
|
type: application/javascript
|
|
module-type: indexer
|
|
|
|
Indexes the tiddlers' backlinks
|
|
|
|
\*/
|
|
(function(){
|
|
|
|
/*jslint node: true, browser: true */
|
|
/*global modules: false */
|
|
"use strict";
|
|
|
|
|
|
function BacklinksIndexer(wiki) {
|
|
this.wiki = wiki;
|
|
}
|
|
|
|
BacklinksIndexer.prototype.init = function() {
|
|
this.index = null;
|
|
}
|
|
|
|
BacklinksIndexer.prototype.rebuild = function() {
|
|
this.index = null;
|
|
}
|
|
|
|
BacklinksIndexer.prototype._getLinks = function(tiddler) {
|
|
var parser = this.wiki.parseText(tiddler.fields.type, tiddler.fields.text, {});
|
|
if(parser) {
|
|
return this.wiki.extractLinks(parser.tree);
|
|
}
|
|
return [];
|
|
}
|
|
|
|
BacklinksIndexer.prototype.update = function(updateDescriptor) {
|
|
if(!this.index) {
|
|
return;
|
|
}
|
|
var newLinks = [],
|
|
oldLinks = [],
|
|
self = this;
|
|
if(updateDescriptor.old.exists) {
|
|
oldLinks = this._getLinks(updateDescriptor.old.tiddler);
|
|
}
|
|
if(updateDescriptor.new.exists) {
|
|
newLinks = this._getLinks(updateDescriptor.new.tiddler);
|
|
}
|
|
|
|
$tw.utils.each(oldLinks,function(link) {
|
|
if(self.index[link]) {
|
|
delete self.index[link][updateDescriptor.old.tiddler.fields.title];
|
|
}
|
|
});
|
|
$tw.utils.each(newLinks,function(link) {
|
|
if(!self.index[link]) {
|
|
self.index[link] = Object.create(null);
|
|
}
|
|
self.index[link][updateDescriptor.new.tiddler.fields.title] = true;
|
|
});
|
|
}
|
|
|
|
BacklinksIndexer.prototype.lookup = function(title) {
|
|
if(!this.index) {
|
|
this.index = Object.create(null);
|
|
var self = this;
|
|
this.wiki.forEachTiddler(function(title,tiddler) {
|
|
var links = self._getLinks(tiddler);
|
|
$tw.utils.each(links, function(link) {
|
|
if(!self.index[link]) {
|
|
self.index[link] = Object.create(null);
|
|
}
|
|
self.index[link][title] = true;
|
|
});
|
|
});
|
|
}
|
|
if(this.index[title]) {
|
|
return Object.keys(this.index[title]);
|
|
} else {
|
|
return [];
|
|
}
|
|
}
|
|
|
|
exports.BacklinksIndexer = BacklinksIndexer;
|
|
|
|
})();
|