/***
USAGE:
ListPages(pages, sort, reverse, limit, style, stripTitlePrefix)
create a bulleted list of sorted pages with an optional limit
PARAMETERS:
(optional) pages : list/map/str
list/map of pages to list; if pages is a str, then it is used as a path to a parent page to list all subpages;
defaults to list of subpages of current page
(optional) sort : str
sort order for pages; one of 'custom', 'updated', 'created', 'viewed', 'rated', or 'title'; defaults to 'title'
(optional) reverse : bool
reverse sort order; defaults to false
(optional) limit : num
maximum number of pages to show; defaults to no limit
(optional) style : str
list style to use; one of 'numbers' or 'bullets'; defaults to 'numbers'
(optional) stripTitlePrefix : str
strip title prefix when present; defaults to none
***/
var pages = $0 ?? $pages ?? page.subpages;
if(pages is str) let pages = wiki.getpage(pages).subpages;
if(pages is map) let pages = map.values(pages);
var sort = $1 ?? $sort ?? 'title';
var reverse = $2 ?? $reverse ?? false;
var limit = $3 ?? $limit;
var liststyle = $4 ?? $style ?? 'numbers';
var striptitleprefix = $5 ?? $striptitleprefix;
var dateformat = $dateformat ?? xml.text(wiki.localize('MindTouch.Templates.Controls.ListPages.dateformat'));
var numformat = $numformat ?? xml.text(wiki.localize('MindTouch.Templates.Controls.ListPages.numformat'));
// sort pages list depending on sort order
switch(sort) {
case 'updated':
let pages = [ p .. { sortkey: date.format(d, 'yyyyMMddHHmmss'), sortlabel: date.format(d, dateformat) } foreach var p in pages, var d = p.date ];
case 'created':
let pages = [ p .. { sortkey: date.format(d, 'yyyyMMddHHmmss'), sortlabel: date.format(d, dateformat) } foreach var p in pages, var d = p.revisions[0].date ];
case 'viewed':
case 'viewcount':
let pages = [ p .. { sortkey: num.format(p.viewcount, '0000000000'), sortlabel: num.format(p.viewcount, numformat) } foreach var p in pages ];
case 'rated':
let pages = [ p .. { sortkey: num.format(r.score ?? 0, '0.000000000'), sortlabel: r.score ? num.format(r.score, '###%') : nil } foreach var p in pages, var r = p.rating ];
break;
case 'custom':
break;
case 'title':
default:
let pages = [ p .. { sortkey: p.title, sortlabel: nil } foreach var p in pages ];
}
// determine list style
var listelem;
switch(string.tolower(liststyle)) {
case 'bullets':
let listelem = 'ul';
case 'numbers':
default:
let listelem = 'ol';
}
// check if there is at least one page to show
if(#pages) {
let pages = list.sort(pages, 'sortkey', reverse);
<font size="-1">
<(listelem)>
foreach(var p in pages where limit ? (__count < limit) : true) {
<li>
var title = p.title;
if(striptitleprefix && string.startswith(p.title, striptitleprefix, true)) {
let title = string.trim(string.substr(p.title, #striptitleprefix));
}
web.link(p.uri, title);
// check if there is a label to show
if(p.sortlabel) {
<span style="color: rgb(128, 128, 128); font-size: smaller;">
' ('; p.sortlabel; ')';
</span>
}
</li>
}
</>
</font>
}