app.naml
<macro name="view_app" requires="servlet,nabble,basic">
<n.switch. value="[n.get_node_from_parameter.type/]">
<n.case. value="forum">
<n.call_view_forum/>
</n.case.>
<n.case. value="mixed">
<n.call_view_mixed/>
</n.case.>
<n.case. value="category">
<n.view_category/>
</n.case.>
<n.case. value="board">
<n.view_board/>
</n.case.>
<n.case. value="gallery">
<n.view_gallery/>
</n.case.>
<n.case. value="blog">
<n.view_blog/>
</n.case.>
<n.case. value="news">
<n.view_news/>
</n.case.>
<n.default_case.throw_runtime_exception text="invalid app type: '[n.switch_value/]'" />
</n.switch.>
</macro>
<macro name="call_view_forum">
<n.call_view_standard/>
</macro>
<namespace name="app_namespace" />
<namespace name="narrow_app_namespace" />
<macro name="apply_app_namespace" dot_parameter="do">
<n.app_namespace.do/>
</macro>
// workgroup stuff --- will clean up later [Hugo - Aug 2011]
<namespace name="workgroup_app_namespace" />
<namespace name="workgroup_narrow_app_namespace" />
<macro name="apply_workgroup_app_namespace" dot_parameter="do">
<n.workgroup_app_namespace.do />
</macro>
<macro name="view_app canonical path" requires="http_request">
<n.view_app_canonical_path/>
</macro>
<macro name="view_topics canonical path" requires="http_request">
<n.view_app_canonical_path/>
</macro>
add more as needed
<macro name="view_app_canonical_path" requires="http_request">
<n.get_node_from_parameter.path
template="[n.get_parameter name='macro'/]"
index_record="[n.get_parameter name='index_record'/]"
date="[n.get_parameter name='date'/]"
/>
</macro>
<macro name="app_html" parameters="head,body" requires="servlet">
<n.app_min_html>
<head>
<n.head/>
<n.app_meta/>
<n.increment_view_count/>
</head>
<body>
<n.page_node.app_hardcoded_notices/>
<n.newsflash/>
<n.show_administrator_notice/>
<n.app_body_header/>
<n.body/>
<n.app_body_footer/>
</body>
</n.app_min_html>
</macro>
<macro name="app_min_html" parameters="head,body" requires="servlet">
<n.node_page.>
<n.app_caching/>
<n.check_that_is_app/>
<n.html>
<head>
<n.head/>
</head>
<body>
<n.body/>
</body>
</n.html>
</n.node_page.>
</macro>
<macro name="app_caching" requires="node_page">
<n.uncache_for.>
<n.descendant_changes.page_node.id/>
<n.bread_crumb_changes.page_node.id/>
</n.uncache_for.>
</macro>
<macro name="node_parameter_or_root" dot_parameter="do">
<n.if.has_parameter name="node">
<then.get_node_from_parameter.do/>
<else.root_node.do/>
</n.if.has_parameter>
</macro>
<macro name="embedding_redirection_js">
<n.node_parameter_or_root.>
<n.if.has_embedding_redirection_url>
<then>
<script type="text/javascript">
var embeddedUrl = '<n.embedding_redirection_url/>';
var botPattern = "(googlebot\/|Googlebot-Mobile|Googlebot-Image|Google favicon|Mediapartners-Google|bingbot|slurp|java|wget|curl|Commons-HttpClient|Python-urllib|libwww|httpunit|nutch|phpcrawl|msnbot|jyxobot|FAST-WebCrawler|FAST Enterprise Crawler|biglotron|teoma|convera|seekbot|gigablast|exabot|ngbot|ia_archiver|GingerCrawler|webmon |httrack|webcrawler|grub.org|UsineNouvelleCrawler|antibot|netresearchserver|speedy|fluffy|bibnum.bnf|findlink|msrbot|panscient|yacybot|AISearchBot|IOI|ips-agent|tagoobot|MJ12bot|dotbot|woriobot|yanga|buzzbot|mlbot|yandexbot|purebot|Linguee Bot|Voyager|CyberPatrol|voilabot|baiduspider|citeseerxbot|spbot|twengabot|postrank|turnitinbot|scribdbot|page2rss|sitebot|linkdex|Adidxbot|blekkobot|ezooms|dotbot|Mail.RU_Bot|discobot|heritrix|findthatfile|europarchive.org|NerdByNature.Bot|sistrix crawler|ahrefsbot|Aboundex|domaincrawler|wbsearchbot|summify|ccbot|edisterbot|seznambot|ec2linkfinder|gslfbot|aihitbot|intelium_bot|facebookexternalhit|yeti|RetrevoPageAnalyzer|lb-spider|sogou|lssbot|careerbot|wotbox|wocbot|ichiro|DuckDuckBot|lssrocketcrawler|drupact|webcompanycrawler|acoonbot|openindexspider|gnam gnam spider|web-archive-net.com.bot|backlinkcrawler|coccoc|integromedb|content crawler spider|toplistbot|seokicks-robot|it2media-domain-crawler|ip-web-crawler.com|siteexplorer.info|elisabot|proximic|changedetection|blexbot|arabot|WeSEE:Search|niki-bot|CrystalSemanticsBot|rogerbot|360Spider|psbot|InterfaxScanBot|Lipperhey SEO Service|CC Metadata Scaper|g00g1e.net|GrapeshotCrawler|urlappendbot|brainobot|fr-crawler|binlar|SimpleCrawler|Livelapbot|Twitterbot|cXensebot|smtbot|bnf.fr_bot|A6-Indexer|ADmantX|Facebot|Twitterbot|OrangeBot|memorybot|AdvBot|MegaIndex|SemanticScholarBot|ltx71|nerdybot|xovibot|BUbiNG|Qwantify|archive.org_bot|Applebot|TweetmemeBot|crawler4j|findxbot|SemrushBot|yoozBot|lipperhey|y!j-asr|Domain Re-Animator Bot|AddThis)";
var re = new RegExp(botPattern, 'i');
if( !Nabble.isEmbedded && !re.test(navigator.userAgent) ) {
var url = top.location.href;
var posHtml = url.lastIndexOf('.html');
var c = '-';
var hash;
if (url.indexOf('?') == -1 && posHtml > 0) {
var posStart = url.lastIndexOf('-');
hash = (posStart > 0)? url.substring(posStart+1, posHtml):'';
} else {
hash = url.replace(new RegExp('https?://'), '');
hash = hash.substring(hash.indexOf('/')+1);
hash = hash;
c = '+';
}
if (Nabble.analytics) Nabble.analytics();
var _hash = hash.length==1?'':'#nabble' + c + encodeURIComponent(hash);
if (top.location.hash) {
var realHash = top.location.hash.substring(1);
_hash += '|' + encodeURIComponent(realHash);
}
_hash = _hash.length == 8 ? '' : _hash;
top.location.replace(embeddedUrl + _hash);
}
</script>
</then>
</n.if.has_embedding_redirection_url>
</n.node_parameter_or_root.>
</macro>
<macro name="check_that_is_app">
<n.if.not.page_node.is_app>
<then.redirect_to.page_node.url/>
</n.if.not.page_node.is_app>
</macro>
<macro name="app_meta" requires="node_page,servlet">
<n.if>
<condition>
<n.both>
<condition1.is_null.app_index_record/>
<condition2.equal value1="[n.app_template/]" value2="[n.app_default_template/]"/>
</n.both>
</condition>
<then>
<n.app_meta_description/>
<n.app_meta_keywords/>
</then>
<else>
<META NAME="robots" CONTENT="noindex,follow"/>
</else>
</n.if>
</macro>
<macro name="app_meta_description" requires="node_page">
<META NAME="description" CONTENT="[n.page_node.build_meta_description/]"/>
</macro>
<macro name="build_meta_description" requires="node">
<n.if.has_property name="page_meta_description">
<then.get_property name="page_meta_description"/>
<else.default_meta_description/>
</n.if.has_property>
</macro>
<macro name="app_meta_keywords" requires="node_page">
<META NAME="keywords" CONTENT="[n.page_node.build_meta_keywords/]"/>
</macro>
<macro name="build_meta_keywords" requires="node">
<n.default_meta_keywords/>
</macro>
<macro name="app_body_footer">
<n.comment.>To be overridden</n.comment.>
</macro>
<macro name="app_title">
<title><n.compress.>
<n.page_node.app_title_contents/>
<n.page_node.app_title_ending/>
</n.compress.></title>
</macro>
<macro name="app_title_contents" requires="node">
<n.if.has_property name="page_title">
<then.get_property name="page_title"/>
<else.default_app_title_contents/>
</n.if.has_property>
</macro>
<macro name="default_app_title_contents" requires="node">
<n.if.not.is_root>
<then><n.root_node.subject/> -</then>
</n.if.not.is_root>
<n.subject/>
</macro>
<macro name="app_title_ending" requires="node">
<n.if.not.equal value1="[n.app_template/]" value2="[n.app_default_template/]">
<then>| <n.capitalize.substring text="[n.app_template/]" begin="5" /></then>
</n.if.not.equal>
<n.hide_if_equals. value1="[n.app_page_number/]" value2="1">
| <t>Page <t.number.app_page_number/></t>
</n.hide_if_equals.>
</macro>
<macro name="app_body_header" requires="node_page,servlet">
<n.page_node.>
<div id="forum-header">
<h1 id="forum-title" class="app-title-[n.id/] adbayes-content"><n.subject/></h1>
<div id="description-box" class="adbayes-content">
<n.node_message_as_html/>
</div>
<div id="search-box" class="search-box">
<n.search_box/>
</div>
</div>
</n.page_node.>
</macro>
<macro name="app_topic_pagination" requires="node_page,servlet" parameters="margin">
<n.paging.
total_rows="[n.app_topic_count/]"
current_row="[n.app_index_record/]"
rows_per_page="[n.app_rows_per_page/]"
>
<n.generic_paging>
<margin>
<n.default. to='.55em .2em'>
<n.margin/>
</n.default.>
</margin>
<url>
<n.app_paged_url/>
</url>
</n.generic_paging>
</n.paging.>
</macro>
<macro name="app_child_pagination" requires="node_page,servlet" parameters="margin">
<n.paging.
total_rows="[n.page_node.child_count/]"
current_row="[n.app_index_record/]"
rows_per_page="[n.app_rows_per_page/]"
>
<n.generic_paging>
<margin>
<n.default. to='.55em .2em'>
<n.margin/>
</n.default.>
</margin>
<url>
<n.app_paged_url/>
</url>
</n.generic_paging>
</n.paging.>
</macro>
<macro name="app_paged_url" requires="paging_page,node_page,servlet">
<n.page_node.path
template="[n.app_template/]"
date="[n.app_date/]"
index_record="[n.page_row/]"
/>
</macro>
<macro name="app_topic_count" requires="node_page,servlet">
<n.page_node.topic_count filter="[n.app_topic_filter/]" />
</macro>
<macro name="app_topic_filter" requires="node_page,servlet">
<n.cache var="app_topic_filter" value="[n.calc_app_topic_filter/]" />
</macro>
<macro name="calc_app_topic_filter" requires="node_page,servlet">
<n.if.not.is_null.app_date>
<then.page_node.date_filter date="[n.app_date/]" />
<else.null />
</n.if.not.is_null.app_date>
</macro>
<macro name="is_front_page" requires="servlet">
<n.equal value1="[n.app_template/]" value2="view_app" />
</macro>
<macro name="app_index_record" requires="servlet">
<n.get_parameter name="index_record"/>
</macro>
<macro name="app_template" requires="servlet">
<n.get_parameter name="macro"/>
</macro>
<macro name="app_date" requires="servlet">
<n.get_parameter name="date"/>
</macro>
<macro name="generic_paging" requires="paging" parameters="margin,url">
<n.if.has_paging>
<then>
<n.put_in_head.>
<style type="text/css">
span.current-page { padding: .1em .4em; }
span.page { padding: .1em; }
span.pages a { padding: .1em .4em; }
span.current-page { border-width:1px; border-style:solid; }
span.pages {
float:right;
white-space:nowrap;
font-weight:normal;
}
</style>
</n.put_in_head.>
<n.remove_spaces_between_tags.>
<span class="pages" style="padding:[n.margin/]">
<n.if.not.is_at_beginning>
<then>
<n.first_page.link url="[n.url/]" /> ...
</then>
</n.if.not.is_at_beginning>
<n.neighboring_pages.show url="[n.url/]" />
<n.if.not.is_at_end>
<then>
... <n.last_page.link url="[n.url/]" />
</then>
</n.if.not.is_at_end>
</span>
</n.remove_spaces_between_tags.>
</then>
</n.if.has_paging>
</macro>
<macro name="show" requires="paging_page" parameters="url">
<n.if.is_current_page>
<then>
<span class="current-page medium-border-color"><n.page_number/></span>
</then>
<else>
<n.link url="[n.url/]" />
</else>
</n.if.is_current_page>
</macro>
<macro name="link" requires="paging_page" parameters="url">
<span class="page">
<a href="[n.url/]" title="[t]Page [t.number.page_number/][/t]"><n.page_number/></a>
</span>
</macro>
<macro name="set_app_rows_per_page" parameters="rows_per_page">
<n.global_set_var name="app_rows_per_page" value="[n.rows_per_page/]" />
</macro>
<macro name="app_rows_per_page" requires="node_page">
<n.cache var="app_rows_per_page" value="[n.page_node.default_rows_per_page/]" />
</macro>
<macro name="app_page_number" requires="node_page,servlet">
<n.cache. var="app_page_number">
<n.paging.
total_rows="0"
current_row="[n.app_index_record/]"
rows_per_page="[n.app_rows_per_page/]"
>
<n.current_page_number/>
</n.paging.>
</n.cache.>
</macro>
<macro name="url" parameters="template,index_record,date" requires="node">
<n.remove_spaces.>
<n.base_url/>
<n.path
template="[n.template/]"
index_record="[n.index_record/]"
date="[n.date/]"
/>
</n.remove_spaces.>
</macro>
<macro name="path" parameters="template,index_record,date" requires="node">
<n.if.is_app>
<then>
<n.app_path
template="[n.template/]"
index_record="[n.index_record/]"
date="[n.date/]"
/>
</then>
<else>
<n.post_path />
</else>
</n.if.is_app>
</macro>
<macro name="app_path" parameters="template,index_record,date" requires="node">
<n.encode_url.remove_spaces.>
<n.set_var. name="index_record">
<n.to_null_if. equals="0">
<n.index_record/>
</n.to_null_if.>
</n.set_var.>
<n.set_var. name="template">
<n.to_null_if. equals="[n.app_default_template/]">
<n.template/>
</n.to_null_if.>
</n.set_var.>
<n.if.not.is_null.var name="template">
<then>
<n.if.not.starts_with prefix="view_" text="[n.var name='template'/]">
<then>
<n.throw_runtime_exception.>
template = <n.var name='template'/>
</n.throw_runtime_exception.>
</then>
</n.if.not.starts_with>
<n.set_var. name="template">
<n.substring text="[n.var name='template'/]" begin="5" />
</n.set_var.>
</then>
</n.if.not.is_null.var>
/
<n.if>
<condition>
<n.not.all_true.>
<n.is_root/>
<n.is_null.var name='template'/>
<n.is_null.date/>
<n.is_null.var name='index_record'/>
</n.not.all_true.>
</condition>
<then>
<n.url_encoded_subject/>
-f<n.id/>
<n.hide_null.prepend. prefix="i"><n.var name="index_record"/></n.hide_null.prepend.>
<n.hide_null.prepend. prefix="d"><n.date/></n.hide_null.prepend.>
<n.hide_null.prepend. prefix="."><n.var name="template"/></n.hide_null.prepend.>
.html
</then>
</n.if>
</n.encode_url.remove_spaces.>
</macro>
<macro name="app_path_by_date" parameters="date" requires="node">
<n.app_path
template="[n.app_template/]"
index_record="[n.app_index_record/]"
date="[n.date/]"
/>
</macro>
<macro name="app_url" parameters="template,index_record,date" requires="node">
<n.base_url/><n.app_path
template="[n.template/]"
index_record="[n.index_record/]"
date="[n.date/]"
/>
</macro>
<macro name="app_default_template">
view_app
</macro>
<macro name="is_pinned_in_loop" requires="node,node_list">
<n.both>
<condition1>
<n.is_pinned/>
</condition1>
<condition2>
<n.parent_node.equals.loop_node/>
</condition2>
</n.both>
</macro>
<macro name="is_in_subapp" requires="node,node_list">
<n.both>
<condition1>
<n.is_post/>
</condition1>
<condition2>
<n.both>
<condition1>
<n.has_loop_node/>
</condition1>
<condition2>
<n.get_app_node.not.equals.loop_node/>
</condition2>
</n.both>
</condition2>
</n.both>
</macro>
<macro name="subapp_link" requires="node,node_list">
<n.if.is_in_subapp>
<then>
<n.get_app_node.node_link/>
</then>
</n.if.is_in_subapp>
</macro>
<macro name="subapp_link_on_hover" requires="node,node_list">
<n.if.is_in_subapp>
<then>
<n.link_on_hover
id = "[n.id/]"
href = "[n.get_app_node.path/]"
text = "[n.get_app_node.subject/]"
/>
</then>
</n.if.is_in_subapp>
</macro>
<macro name="link_on_hover" parameters="id,href,text">
<n.put_in_head.>
<script type="text/javascript">
<![CDATA[
function createMouseTrick(nodeid) {
$(document).ready(function() {
var $text = $('#hover-text'+nodeid);
var $link = $('#hover-link'+nodeid);
var entered = false;
var count = 0;
$text.mouseover(function() {
$(this).hide();
$link.show();
checkMouse();
});
$link.mouseover(function() {
entered = true;
});
$link.mouseout(function() {
$link.hide();
$text.show();
count = 0;
entered = false;
});
function checkMouse() {
if (!entered) {
count++;
if (count < 5) {
setTimeout(checkMouse, 100);
} else {
$link.hide();
$text.show();
count = 0;
entered = false;
}
}
}
});
};
]]>
</script>
</n.put_in_head.>
<span id="hover-text[n.id/]"><n.text/></span>
<script type="text/javascript">
document.write('<a id="hover-link[n.id/]" href="[n.href/]" style="display:none">');
document.write('<n.javascript_string_encode.get_app_node.text/>');
document.write('</a>');
createMouseTrick(<n.id/>);
</script>
</macro>
just for now:
<macro name="view_comment" requires="servlet">
<n.redirect_to.node_page.page_node.url/>
</macro>
<macro name="view_blog_entry" requires="servlet">
<n.redirect_to.node_page.page_node.url/>
</macro>
<macro name="view_gallery_entry" requires="servlet">
<n.redirect_to.node_page.page_node.url/>
</macro>
<macro name="view_news_entry" requires="servlet">
<n.redirect_to.node_page.page_node.url/>
</macro>
<macro name="children_list" parameters="start,length,filter,sort" dot_parameter="do" requires="node">
<n.children_list_standard start="[n.start/]" length="[n.length/]" filter="[n.filter/]" do="[n.do/]" />
</macro>
<macro name="topics_list" parameters="start,length,filter,sort" dot_parameter="do" requires="node">
<n.topics_list_standard start="[n.start/]" length="[n.length/]" filter="[n.filter/]" sort="[n.sort/]" do="[n.do/]" />
</macro>
<macro name="app_hardcoded_notices" requires="node_page,servlet">
<n.inactive_node_deletion_ui/>
<script type="text/javascript">
$(document).ready(function() {
if (Nabble.appnotice) {
$('#creation-ad').slideDown();
Nabble.setVar('appnotice',null);
}
});
</script>
<n.if.should_show_creation_notice>
<then>
<div id="creation-ad" class="app-notice light-border-color info-message" style="display:none">
<n.congratulations_notice/>
</div>
<script type="text/javascript">
/* Fix for widget creation (weebly) */
if (Nabble.getParent().nabbleinfo && !Nabble.getParent().nabbleinfo.what) {
Nabble.getParent().nabbleinfo.what = '<n.page_node.lower_case_view_name/>';
}
</script>
</then>
</n.if.should_show_creation_notice>
</macro>
<macro name="congratulations_notice">
<div class="big-title second-font"><t>Congratulations!</t></div>
<t>Your <t.app.page_node.lower_case_view_name/> has been successfully created.</t><br/>
<t>Please check your inbox now and activate your account in order to have access to all features.</t><br/>
<button class="toolbar action-button" onclick="$('#creation-ad').slideUp();" style="margin:.5em 1em 0">
<t>Close this message</t>
</button>
</macro>
<macro name="inactive_node_deletion_ui" requires="node_page">
<n.if.page_node_is_scheduled_for_deletion>
<then>
<script type="text/javascript">
function clearDeleteDate() {
$.getScript('/forum/ClearDeleteDate.jtp');
}
</script>
<div id="inactive-delete" class="app-notice info-message">
<div class="big-title second-font">This <n.page_node.lower_case_view_name/> will be deleted soon!</div>
Nabble has scheduled this <n.page_node.lower_case_view_name/> to be deleted on
<script type="text/javascript">document.write(Nabble.formatDateLong(new Date(<n.site_delete_date.raw_time/>)))</script>
due to its inactivity.<br/>
Click on the button below if you want to save this <n.page_node.lower_case_view_name/> from deletion.<br/>
<input type="button" value="Don't delete this [n.page_node.lower_case_view_name/]" onclick="clearDeleteDate()" style="margin:.5em 1em 0"></input>
</div>
</then>
</n.if.page_node_is_scheduled_for_deletion>
</macro>