mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2024-08-28 12:02:40 +00:00
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;
|
||
|
|
||
|
})();
|