Template:Seealso

  • You do not have permissions to view this page - please try logging in.
Inhaltsverzeichnis
keine Gliederung

Version seit 07:24, 13 Feb 2026

zu dieser Version.

Zurück zu Versionshistorie.

Zeige aktuelle Version

/***
    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("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("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("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("ListPages", { 
                pages: misc,
                style: "bullets",
                sort: "custom"
            });
        }
        
        //--- Show Parent Page (if no other pages were shown) ---
        if(parents && !#topics && !#tutorials && !#troubleshootings && !#references && !#misc) {
            template("ListPages", { 
                pages: [ page.parent ],
                style: "bullets",
                sort: "custom"
            });
        }
    </div>
</div>
Deki Appliance - Powered by TurnKey Linux