mirror of
https://github.com/Jermolene/TiddlyWiki5
synced 2024-12-02 14:29:55 +00:00
refactor: move links ast extractor to a file
This commit is contained in:
parent
61d5484f09
commit
5600a00cd8
@ -12,6 +12,66 @@ AST information extractor for indexers.
|
|||||||
/*global $tw: false */
|
/*global $tw: false */
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
|
/*
|
||||||
|
Return an array of tiddler titles that are directly linked within the given parse tree
|
||||||
|
*/
|
||||||
|
exports.extractLinks = function(parseTreeRoot) {
|
||||||
|
// Count up the links
|
||||||
|
var links = [],
|
||||||
|
checkParseTree = function(parseTree) {
|
||||||
|
for(var t=0; t<parseTree.length; t++) {
|
||||||
|
var parseTreeNode = parseTree[t];
|
||||||
|
if(parseTreeNode.type === "link" && parseTreeNode.attributes.to && parseTreeNode.attributes.to.type === "string") {
|
||||||
|
var value = parseTreeNode.attributes.to.value;
|
||||||
|
if(links.indexOf(value) === -1) {
|
||||||
|
links.push(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(parseTreeNode.children) {
|
||||||
|
checkParseTree(parseTreeNode.children);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
checkParseTree(parseTreeRoot);
|
||||||
|
return links;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Return an array of tiddler titles that are directly linked from the specified tiddler
|
||||||
|
*/
|
||||||
|
exports.getTiddlerLinks = function(title) {
|
||||||
|
var self = this;
|
||||||
|
// We'll cache the links so they only get computed if the tiddler changes
|
||||||
|
return this.getCacheForTiddler(title,"links",function() {
|
||||||
|
// Parse the tiddler
|
||||||
|
var parser = self.parseTiddler(title);
|
||||||
|
if(parser) {
|
||||||
|
return self.extractLinks(parser.tree);
|
||||||
|
}
|
||||||
|
return [];
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Return an array of tiddler titles that link to the specified tiddler
|
||||||
|
*/
|
||||||
|
exports.getTiddlerBacklinks = function(targetTitle) {
|
||||||
|
var self = this,
|
||||||
|
backIndexer = this.getIndexer("BackIndexer"),
|
||||||
|
backlinks = backIndexer && backIndexer.subIndexers.link.lookup(targetTitle);
|
||||||
|
|
||||||
|
if(!backlinks) {
|
||||||
|
backlinks = [];
|
||||||
|
this.forEachTiddler(function(title,tiddler) {
|
||||||
|
var links = self.getTiddlerLinks(title);
|
||||||
|
if(links.indexOf(targetTitle) !== -1) {
|
||||||
|
backlinks.push(title);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return backlinks;
|
||||||
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Return an array of tiddler titles that are directly transcluded within the given parse tree. `title` is the tiddler being parsed, we will ignore its self-referential transclusions, only return
|
Return an array of tiddler titles that are directly transcluded within the given parse tree. `title` is the tiddler being parsed, we will ignore its self-referential transclusions, only return
|
||||||
*/
|
*/
|
||||||
|
@ -489,66 +489,6 @@ exports.forEachTiddler = function(/* [options,]callback */) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
|
||||||
Return an array of tiddler titles that are directly linked within the given parse tree
|
|
||||||
*/
|
|
||||||
exports.extractLinks = function(parseTreeRoot) {
|
|
||||||
// Count up the links
|
|
||||||
var links = [],
|
|
||||||
checkParseTree = function(parseTree) {
|
|
||||||
for(var t=0; t<parseTree.length; t++) {
|
|
||||||
var parseTreeNode = parseTree[t];
|
|
||||||
if(parseTreeNode.type === "link" && parseTreeNode.attributes.to && parseTreeNode.attributes.to.type === "string") {
|
|
||||||
var value = parseTreeNode.attributes.to.value;
|
|
||||||
if(links.indexOf(value) === -1) {
|
|
||||||
links.push(value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if(parseTreeNode.children) {
|
|
||||||
checkParseTree(parseTreeNode.children);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
checkParseTree(parseTreeRoot);
|
|
||||||
return links;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
Return an array of tiddler titles that are directly linked from the specified tiddler
|
|
||||||
*/
|
|
||||||
exports.getTiddlerLinks = function(title) {
|
|
||||||
var self = this;
|
|
||||||
// We'll cache the links so they only get computed if the tiddler changes
|
|
||||||
return this.getCacheForTiddler(title,"links",function() {
|
|
||||||
// Parse the tiddler
|
|
||||||
var parser = self.parseTiddler(title);
|
|
||||||
if(parser) {
|
|
||||||
return self.extractLinks(parser.tree);
|
|
||||||
}
|
|
||||||
return [];
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
Return an array of tiddler titles that link to the specified tiddler
|
|
||||||
*/
|
|
||||||
exports.getTiddlerBacklinks = function(targetTitle) {
|
|
||||||
var self = this,
|
|
||||||
backIndexer = this.getIndexer("BackIndexer"),
|
|
||||||
backlinks = backIndexer && backIndexer.subIndexers.link.lookup(targetTitle);
|
|
||||||
|
|
||||||
if(!backlinks) {
|
|
||||||
backlinks = [];
|
|
||||||
this.forEachTiddler(function(title,tiddler) {
|
|
||||||
var links = self.getTiddlerLinks(title);
|
|
||||||
if(links.indexOf(targetTitle) !== -1) {
|
|
||||||
backlinks.push(title);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return backlinks;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Return a hashmap of tiddler titles that are referenced but not defined. Each value is the number of times the missing tiddler is referenced
|
Return a hashmap of tiddler titles that are referenced but not defined. Each value is the number of times the missing tiddler is referenced
|
||||||
*/
|
*/
|
||||||
|
Loading…
Reference in New Issue
Block a user