|
|
PageDirectoryFrom $1
Table of contentsNo headers/***
PageDirectory
creates a searchable directory of pages organized by tabs and filtered by tags
Arguments:
path : str (optional, default: current page path)
page path the the parent page where the subpages to be organized are located
most_popular : map (optional, default: none)
show section for most popular pages that have a given tag
tag : str
tag to used for the split between left and right columns for most popular;
left pages have the tag, right pages do not
title : str
title shown for left column
tabs : list (optional, default: empty list)
list of maps describing each tab to show; map entries may contain the following fields
label : str
label for the tab
key : str
key used to identify the selected tab
featured_limit : num (optional, default: 15)
number of pages to show in the "Featured" category
cache_prefix : str (optional, default: none)
when set, caches the page directory for a given view using this key
tag_constraint : str -or- list (optional, default: none)
only list pages that have all of the specified tags
***/
// read parameters
var path = $path ?? page.path;
var most_popular = $most_popular;
var tabs = $tabs ?? [ ];
var featured_limit = $featured_limit ?? 15;
var cache_prefix = $cache_prefix;
var tag_constraint = $tag_constraint;
// check how the current page is being invoked
var query = __request.args.q;
var view = __request.args.v ?? (query ? 'search' : 'featured');
// define variables
var render;
var cache_id;
var pages;
var constraint = 'type:wiki AND path:' .. string.searchescape(path) .. '*';
if(tag_constraint is str) {
let constraint ..= ' AND tag:"' .. string.escape(tag_constraint) .. '"';
} else if(tag_constraint is list) {
let constraint ..= ' AND ' .. string.join([ ' AND tag:"' .. string.escape(tag) .. '"' foreach var tag in tag_constraint where tag is str ], ' AND ');
}
// check if a search was requested
if(query) {
if(path[-1] != '/') {
let path = path .. '/';
}
let pages = wiki.getsearch(query, 1000, _, constraint);
} else {
let pages = wiki.getsearch(constraint, 1000);
if(cache_prefix) {
let cache_id = cache_prefix .. '-cache-' .. view;
let render = __env.webcache && webcache.fetch(cache_id);
}
}
if(!render) {
let render = (
// remove pages starting with '*'
let parent_page = wiki.getpage(path);
let pages = [ p foreach var p in pages where !string.startswith(p.name, '*') && p.parent.id == parent_page.id ];
// show page count
<p> wiki.localize("MindTouch.Templates.Controls.PageDirectory.entrycount", [ num.format(#pages, "#,##0") ]) </p>;
<p> string.nbsp </p>
// show directory based on current views
<table width="100%" cellspacing="0" cellpadding="0" border="1">
<tr>
<td>
if(view == 'featured') {
<strong> wiki.localize("MindTouch.Templates.Controls.PageDirectory.viewfeatured") </strong>;
} else {
web.link(page.uri, wiki.localize("MindTouch.Templates.Controls.PageDirectory.viewfeatured"));
}
</td>
if(#tabs) {
foreach(var tab in tabs) {
<td>
if(view == tab.key) {
<strong> wiki.localize("MindTouch.Templates.Controls.PageDirectory.viewby", [ tab.label ]) </strong>;
} else {
web.link(page.uri & { v: tab.key }, wiki.localize("MindTouch.Templates.Controls.PageDirectory.viewby", [ tab.label ]));
}
</td>
}
} else {
<td>
if(view == 'all') {
<strong> wiki.localize("MindTouch.Templates.Controls.PageDirectory.viewall") </strong>;
} else {
web.link(page.uri & { v: 'all' }, wiki.localize("MindTouch.Templates.Controls.PageDirectory.viewall"));
}
</td>
}
<td>
<form method="get" action=(page.uri)>
if(view == 'search') {
<strong> wiki.localize("MindTouch.Templates.Controls.PageDirectory.search"); </strong>;
} else {
wiki.localize("MindTouch.Templates.Controls.PageDirectory.search");
}
;
<input name="q" type="text" value=(query ?? '') />
<input type="submit" value="Go" />
</form>
</td>
</tr>
</table>
switch(view) {
case 'featured':
// show 'Most Popular' and 'Recently Added' entries
<table width="100%" cellspacing="0" cellpadding="5" border="0" style="table-layout: fixed;">
if(most_popular && most_popular.tag && most_popular.title) {
<tr valign="top">
<td>
<h3> wiki.localize("MindTouch.Templates.Controls.PageDirectory.mostpopularfor", [ most_popular.title ]); </h3>
template("MindTouch/Controls/ListPages", { pages: [ p foreach var p in pages where p.tags[most_popular.tag] is not nil ], sort: 'viewcount', reverse: true, limit: featured_limit, style: 'bullets' })
</td>
<td>
<h3> wiki.localize("MindTouch.Templates.Controls.PageDirectory.mostpopularfor", [ xml.text(wiki.localize("MindTouch.Templates.Controls.PageDirectory.other")) ]); </h3>
template("MindTouch/Controls/ListPages", { pages: [ p foreach var p in pages where p.tags[most_popular.tag] is nil ], sort: 'viewcount', reverse: true, limit: featured_limit, style: 'bullets' })
</td>
</tr>
} else {
<tr valign="top">
<td colspan="2">
<h3> wiki.localize("MindTouch.Templates.Controls.PageDirectory.mostpopular" ); </h3>
template("MindTouch/Controls/ListPages", { pages: pages, sort: 'viewcount', reverse: true, limit: featured_limit, style: 'bullets' })
</td>
</tr>
}
<tr valign="top">
<td>
<h3> wiki.localize("MindTouch.Templates.Controls.PageDirectory.recentlyadded") </h3>
template("MindTouch/Controls/ListPages", { pages: pages, sort: 'created', reverse: true, limit: featured_limit, style: 'bullets' })
</td>
<td>
<h3> wiki.localize("MindTouch.Templates.Controls.PageDirectory.recentlyupdated") </h3>
template("MindTouch/Controls/ListPages", { pages: pages, sort: 'updated', reverse: true, limit: featured_limit, style: 'bullets' })
</td>
</tr>
</table>
case 'all':
<h3> wiki.localize("MindTouch.Templates.Controls.PageDirectory.directoryfor", [ string.tocamelcase(view) ]) </h3>
template("MindTouch/Controls/ListPages", { pages: pages, sort: 'title' });
case 'search':
<h3> wiki.localize("MindTouch.Templates.Controls.PageDirectory.searchresults") </h3>
template("MindTouch/Controls/ListPages", { pages: pages, sort: 'viewcount', reverse: true });
default:
<h3> wiki.localize("MindTouch.Templates.Controls.PageDirectory.directoryfor", [ string.tocamelcase(view) ]) </h3>
template("MindTouch/Controls/TagDirectory", { pages: pages, tagprefix: view, columns: 3, listpagesoptions: { sort: 'title', reverse: false } })
}
<br/><hr/><br/>
);
if(cache_id && __env.webcache) {
webcache.store(cache_id, render);
} else {
render;
}
} else {
render;
}
Tags: (Edit tags)
|
Powered by MindTouch Core |
Disclaimer: Vespa Labs contains information that is VERY likely to wreck your scooter and possibly yourself both intentionally (i.e. gaining more peformance while sacrificing reliability + safety) and unintentionally (i.e. misleading or incorrect information). Vespa Labs is only a wiki and intended as a dumping ground for information and not as a properly reviewed source. The same disclaimers that wikipedia.org use apply to Vespa Labs. The short version is use information at your own risk, both information on the main wiki and in the user areas are intended to be used only as "thought provoking" for someone that knows what they are doing. If you try to implement a "thought" Vespa Labs is not reponsible and if something goes wrong we hope that you live and update the offending information with corrections to warn others.
Vespa Labs is an international site and therefore may contain information that is not road legal in some countries/states and may also invalidate insurance policies. Treat all information as experimental and for "race use only" (i.e. not for road use - even if it is implied or explicitly stated). Refer to and adhere to your local road and legal rules, as well as the manufacturers recommendations.