Inhaltsverzeichnis
keine Gliederung
/***
USAGE:
SeeAlso(pages, exclude, limit, parents)
Show pages related to current page by hierarchy and by see: and keyword: tags.
PARAMETERS:
(optional) pages : list (default: child pages of current page)
List of pages to organize based on their tags.
(optional) exclude : list (default: none)
List of pages to exclude from the related list.
(optional) limit : num (default: 8)
Limit of related pages to use to determine if additional pages need to be discovered and included in the related list.
(optional) parents : bool (default: true)
Show link to parent page if no other links are shown.
***/
// Redirect to custom page, if any
var template_custom = wiki.inclusions(true)[-1].path .. 'Custom';
if (wiki.pageexists(template_custom)) {
return template(template_custom, $);
}
var pages = $0 ?? $pages;
var exclude = $1 ?? $exclude ?? [ ];
var limit = $2 ?? $limit ?? 8;
var parents = $5 ?? $parents ?? true;
//--- Aggregate Pages ---
// if no pages were provided, enumerate child pages
if(pages is nil) {
let pages = [
wiki.getpage(id)
foreach
var id in [ num.cast(xml.text(id)) foreach var id in wiki.tree(_, 1)["//@pageid"] ]
];
}
// find tags with the 'see:' prefix (or no prefix) and include the definition page or related pages
let pages ..= [
p .. { origin: 'tags' }
foreach
var tag in page.tags where (tag.type === 'text') && (string.startswith(tag.name, 'see:', true) || !string.contains(tag.name, ':')),
var def = tag.definition,
var p in ((def && (def.id != page.id)) ? [ def ] : tag.pages) where p.id != page.id
];
// find tags with the 'keyword:' prefix and include search results for them
if(#pages < limit) {
var terms = [
'"' .. string.escape(string.substr(tag.name, 8)) .. '"'
foreach
var tag in page.tags where (tag.type == 'text') && string.startswith(tag.name, 'keyword:')
];
if(#terms) {
var searchString = string.join(terms, ' ');
var defaultSearch = 'type:wiki AND namespace:main';
// find main guide (tagged article:topic-guide), if any
var pathSearch = '';
foreach (var parent in page.parents) {
var isTopic = #[tag foreach var tag in parent.tags where (tag.type == 'text' && string.endswith(tag.name, 'topic-guide'))] > 0;
if (isTopic) {
let pathSearch = ' AND path:' .. parent.path .. '/*';
break;
}
}
// keyword must appear in title
var titleSearch = ' AND title:' .. searchString;
var searchQuery = defaultSearch .. titleSearch .. pathSearch;
let pages ..= [
p .. { origin: 'keyword' }
foreach
var p in wiki.getsearch(searchString, limit - #pages, _, searchQuery)
];
}
}
// de-duplicate pages
var uniquepages = [ ];
var pageids = [ ];
foreach(var p in pages) {
if((p.id != page.id) && (p.id not in pageids) && (p.id not in exclude)) {
let pageids ..= [ p.id ];
let uniquepages ..= [ p ];
}
}
let pages = list.sort(uniquepages, 'path');
// enumerate all pages and classify them
let pages = [
p .. {
topic: #[ t foreach var t in tags where string.startswith(t.value, 'article:topic') ] > 0,
tutorial: #[ t foreach var t in tags where string.startswith(t.value, 'article:task-tutorial') ] > 0,
troubleshooting: #[ t foreach var t in tags where string.startswith(t.value, 'article:task-troubleshooting') ] > 0,
reference: #[ t foreach var t in tags where string.startswith(t.value, 'article:reference') ] > 0,
beginner: #[ t foreach var t in tags where string.endswith(t.value, 'beginner') ] > 0,
intermediate: #[ t foreach var t in tags where string.endswith(t.value, 'intermediate') ] > 0,
advanced: #[ t foreach var t in tags where string.endswith(t.value, 'advanced') ] > 0
} foreach
var p in pages where p.id != page.id,
var tags = p.tags
];
<div class="noindex">
<div class="mt-control-block-content">
//--- Show Topic Pages ---
var topics = [ p foreach var p in pages where p.topic ];
if(#topics > 0) {
if(#topics < #pages) {
<div class="mt-control-page-subtitle"> wiki.localize("MindTouch.IDF.topics"); </div>
}
<dl class="mt-control-seealso">
foreach(var p in topics) {
<dt> web.link(p.uri, p.title) </dt>
<dd> wiki.text(p.path, "Overview") </dd>
}
</dl>
}
//--- Show Tutorial Pages ---
var tutorials = [ p foreach var p in pages where p.tutorial ];
var beginner_label = xml.text(wiki.localize("MindTouch.IDF.tutorial.beginner.short"));
var intermediate_label = xml.text(wiki.localize("MindTouch.IDF.tutorial.intermediate.short"));
var advanced_label = xml.text(wiki.localize("MindTouch.IDF.tutorial.advanced.short"));
var tutorials = [ p .. { sortlabel: beginner_label } foreach var p in tutorials where p.beginner ] ..
[ p .. { sortlabel: intermediate_label } foreach var p in tutorials where p.intermediate ] ..
[ p .. { sortlabel: advanced_label } foreach var p in tutorials where p.advanced ];
if(#tutorials > 0) {
if(#tutorials < #pages) {
<div class="mt-control-page-subtitle"> wiki.localize("MindTouch.IDF.tutorial") </div>
}
template("MindTouch/Controls/ListPages", {
pages: tutorials,
style: "bullets",
sort: "custom"
});
}
//--- Show Troubleshooting Pages ---
var troubleshootings = [ p foreach var p in pages where p.troubleshooting ];
if(#troubleshootings > 0) {
if(#troubleshootings < #pages) {
<div class="mt-control-page-subtitle"> wiki.localize("MindTouch.IDF.troubleshooting") </div>
}
template("MindTouch/Controls/ListPages", {
pages: troubleshootings,
style: "bullets",
sort: "custom"
});
}
//--- Show Reference Pages ---
var references = [ p foreach var p in pages where p.reference ];
if(#references > 0) {
if(#references < #pages) {
<div class="mt-control-page-subtitle"> wiki.localize("MindTouch.IDF.reference") </div>
}
template("MindTouch/Controls/ListPages", {
pages: references,
style: "bullets",
sort: "custom"
});
}
//--- Show Miscellaneous Pages ---
var misc = [ p foreach var p in pages where !p.topic && !p.tutorial && !p.troubleshooting && !p.reference ];
if(#misc > 0) {
if(#misc < #pages) {
<div class="mt-control-page-subtitle"> wiki.localize("MindTouch.IDF.other") </div>
}
template("MindTouch/Controls/ListPages", {
pages: misc,
style: "bullets",
sort: "custom"
});
}
//--- Show Parent Page (if no other pages were shown) ---
if(parents && !#topics && !#tutorials && !#troubleshootings && !#references && !#misc) {
template("MindTouch/Controls/ListPages", {
pages: [ page.parent ],
style: "bullets",
sort: "custom"
});
}
</div>
</div>

