diff src/nabble/view/naml/search.naml @ 0:7ecd1a4ef557

add content
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 21 Mar 2019 19:15:52 -0600
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/nabble/view/naml/search.naml	Thu Mar 21 19:15:52 2019 -0600
@@ -0,0 +1,462 @@
+<macro name="search_page" requires="servlet">
+	<n.search_page_html/>
+</macro>
+
+<macro name="search_page_html" requires="servlet">
+	<n.define_search_query_field/>
+	<n.node_page.search_namespace.>
+		<n.set_var name='didSearch' value="false" />
+		<n.catch_exception. id="search-block">
+			<n.do_search_using_params />
+			<n.set_var name='didSearch' value="true" />
+		</n.catch_exception.>
+		<n.html>
+			<head>
+				<meta name="robots" content="noindex,nofollow"/>
+				<n.search_page_title/>
+				<n.set_cookies did_search="[n.var name='didSearch'/]" />
+				<n.search_page_style/>
+			</head>
+			<body>
+				<n.show_search_form/>
+				<n.show_search_error/>
+				<n.search_results_header/>
+
+				<n.results.loop.current_node.>
+					<n.search_result_row/>
+				</n.results.loop.current_node.>
+
+				<n.search_pagination/>
+
+				<n.if.not.lucene_is_ready>
+					<then.index_rebuilt_notice/>
+				</n.if.not.lucene_is_ready>
+
+				<n.if.has_results>
+					<then.show_search_form/>
+				</n.if.has_results>
+			</body>
+		</n.html>
+	</n.node_page.search_namespace.>
+</macro>
+
+<macro name="search_page_title" requires="search">
+	<n.title.>
+		<n.case_all.>Search for '<n.search_query_field.value/>'</n.case_all.>
+		<n.case_author_search.>Messages of <n.user.name/></n.case_author_search.>
+	</n.title.>
+</macro>
+
+<macro name="search_page_style" requires="search">
+	<style type="text/css">
+		.nabble td.verbose-search-box {
+			text-align: left;
+			padding-top: .33em;
+			padding-bottom: .33em;
+			padding-left: .17em;
+		}
+		div.search-results-header {
+	        margin:2em 0 1em;
+	        font-size:90%;
+		}
+	</style>
+</macro>
+
+<macro name="search_results_header" requires="search">
+	<div class="search-results-header">
+		<n.if.has_resort>
+			<then>
+				<n.sort_controls/>
+			</then>
+		</n.if.has_resort>
+
+		<img src="/images/search.png" class="image16"/>
+		Found <n.total_posts/> <n.search_description/>
+	</div>
+</macro>
+
+<macro name="search_result_row" requires="node,search">
+	<div style="margin-bottom:1.5em">
+		<div style="margin-bottom:.2em" class="adbayes-content">
+			<n.search_result_topic_subject/>
+			<n.search_result_post_subject/>
+		</div>
+
+		<div style="margin-bottom:.2em" class="adbayes-content">
+			<n.search_result_message_fragment/>
+		</div>
+
+		<div class="weak-color" style="font-size:80%">
+			<n.search_result_in_app/>
+			<n.search_result_on_date/>
+			<n.if.not.is_author_search>
+				<then>
+					by <n.owner.user_link/>
+				</then>
+			</n.if.not.is_author_search>
+			&mdash; <n.topic_node.replies/> replies in thread
+		</div>
+	</div>
+</macro>
+
+<macro name="search_result_topic_subject" requires="node,search">
+	<span class="second-font big-title">
+		<n.node_link text="[n.highlight.topic_node.subject/]" />
+	</span>
+</macro>
+
+<macro name="search_result_post_subject" requires="node,search">
+	<n.if.not.regex_matches pattern=".*[n.regex_quote.topic_node.subject/]" text="[n.subject/]">
+		<then>&nbsp; (<n.highlight.subject/>)</then>
+	</n.if.not.regex_matches>
+</macro>
+
+<macro name="search_result_message_fragment" requires="node,search">
+	<n.highlight.hide_emails.fragment. size="300">
+		<n.message.as_text/>
+	</n.highlight.hide_emails.fragment.>
+</macro>
+
+<macro name="search_result_in_app" requires="node,search">
+	<n.if.is_in_app>
+		<then>
+			in <n.get_app_node.><n.node_link text="[n.highlight.subject/]" /></n.get_app_node.>
+		</then>
+	</n.if.is_in_app>
+</macro>
+
+<macro name="search_result_on_date" requires="node,search">
+	<script type="text/javascript">
+		Nabble.postDate = new Date(<n.when_created.raw_time/>);
+		document.write(Nabble.isToday(Nabble.postDate) ? " at " : " on ");
+		document.write(Nabble.formatDateShort(Nabble.postDate));
+	</script>
+</macro>
+
+
+<macro name="search_pagination" requires="search">
+	<n.search_paging.>
+		<n.if.has_paging>
+			<then>
+				<div style="font-size:90%;text-align:right;margin-bottom:1em">
+					<n.if.has_previous_page>
+						<then>
+							<a href="[n.previous_page_path/]">&laquo; Prev <n.rows_per_page/></a>
+							<n.if.has_next_page>
+								<then> - </then>
+							</n.if.has_next_page>
+						</then>
+					</n.if.has_previous_page>
+					<n.if.has_next_page>
+						<then>
+							<a href="[n.next_page_path/]">Next <n.rows_per_page/> &raquo;</a>
+						</then>
+					</n.if.has_next_page>
+				</div>
+			</then>
+		</n.if.has_paging>
+	</n.search_paging.>
+</macro>
+
+<macro name="index_rebuilt_notice" requires="search">
+	<div class="info-message rounded" style="text-align:center;padding:.5em;margin:.5em 0">
+		<t><b>Warning:</b> The search index is currently being rebuilt. Search results may be incomplete.</t>
+	</div>
+</macro>
+
+<macro name="sort_controls" requires="search">
+	<div style="float:right;margin:0 1em">
+		<n.if.sorted_by_date>
+			<then>
+				<a href="[n.sort_by_relevance_path/]"><t>Sort by relevance</t></a> | <t>Sorted by date</t>
+			</then>
+			<else>
+				<t>Sorted by relevance</t> | <a href="[n.sort_by_date_path/]"><t>Sort by date</t></a>
+			</else>
+		</n.if.sorted_by_date>
+	</div>
+</macro>
+
+<macro name="search_description" requires="search">
+	<n.if.has_query>
+		<then>matching posts for <b><n.search_query_field.value/></b></then>
+		<else>posts</else>
+	</n.if.has_query>
+	in <n.page_node.node_link/>
+	<n.case_author_search.>
+		by <n.user.user_link/>
+	</n.case_author_search.>
+	<n.if.has_days>
+		<then>within <n.days/> days</then>
+	</n.if.has_days>
+	<n.search_paging.>
+		<n.if.has_paging>
+			<then>Showing posts <n.current_page.page_row.plus.one/> to <n.current_page.page_row.plus.rows_per_page/>.</then>
+		</n.if.has_paging>
+	</n.search_paging.>
+</macro>
+
+<macro name="show_search_error" requires="search">
+	<n.format_error.handle_exception. for="search-block">
+		<n.exception. name="search_query_parse_error">
+			This query is invalid.
+			<br/>For more information, read about <a href="http://lucene.apache.org/java/2_4_1/queryparsersyntax.html">Lucene query parser syntax</a>
+		</n.exception.>
+		<n.exception. name="too_many_search_clauses">
+			Your search will give too many matches.
+		</n.exception.>
+	</n.format_error.handle_exception.>
+</macro>
+
+<macro name="show_search_form" requires="search">
+	<div class="shaded-bg-color rounded">
+		<n.page_node.search_form.>
+			<table>
+				<tr>
+					<td class="verbose-search-box">
+						<style type="text/css">
+							div.field-title { margin-top: 0; }
+						</style>
+						<div class="second-font field-title">Search</div>
+						<n.case_author_search.>
+							<select name="author">
+								<option value="[n.author_param/]" selected="true">posts by '<n.user.name/>'</option>
+								<option value="">all posts</option>
+							</select>
+						</n.case_author_search.>
+						<n.search_query_field.input size="40" />
+						<select name="days">
+							<n.if.not.contains_substring string="-0-1-7-30-90-180-365-" substring="-[n.days/]-">
+								<then>
+									<n.days_option. value="[n.days/]">past <n.days/> days</n.days_option.>
+								</then>
+							</n.if.not.contains_substring>
+							<n.days_option. value="0">all dates</n.days_option.>
+							<n.days_option. value="1">past 24 hours</n.days_option.>
+							<n.days_option. value="7">past week</n.days_option.>
+							<n.days_option. value="30">past month</n.days_option.>
+							<n.days_option. value="90">past 3 months</n.days_option.>
+							<n.days_option. value="180">past 6 months</n.days_option.>
+							<n.days_option. value="365">past year</n.days_option.>
+						</select>
+						&nbsp;<input type="submit" value="Go &raquo;" />
+					</td>
+					<td style="font-size:90%;padding:0 0 .3em 1em;vertical-align:bottom">
+						<div style="margin-bottom:.4em">
+							<a href="[n.advanced_search_path_using_params/]">Advanced Search</a>
+						</div>
+						<a href="[n.help.search.url/]">Show Tips</a>
+					</td>
+				</tr>
+			</table>
+		</n.page_node.search_form.>
+	</div>
+</macro>
+
+<macro name="case_all" requires="search" dot_parameter="do">
+	<n.if.is_all>
+		<then><n.do/></then>
+	</n.if.is_all>
+</macro>
+
+<macro name="case_author_search" requires="search" dot_parameter="do">
+	<n.if.is_author_search>
+		<then><n.do/></then>
+	</n.if.is_author_search>
+</macro>
+
+<macro name="days_option" requires="search" parameters="value" dot_parameter="text">
+	<n.option. value="[n.value/]" selected="[n.days/]"><n.text/></n.option.>
+</macro>
+
+<macro name="option" parameters="value,selected" dot_parameter="text">
+	<n.if.equal value1="[n.value/]" value2="[n.selected/]">
+		<then>
+			<option value="[n.value/]" selected="true"><n.text/></option>
+		</then>
+		<else>
+			<option value="[n.value/]"><n.text/></option>
+		</else>
+	</n.if.equal>
+</macro>
+
+<macro name="define_search_query_field">
+	<n.if.not.is_null.search_query_field.value>
+		<then>
+			<n.search_query_field.set_value.>
+				<n.regex_replace_all. pattern="\band\b" replacement="AND">
+					<n.regex_replace_all. pattern="\bor\b" replacement="OR">
+						<n.trim.search_query_field.value/>
+					</n.regex_replace_all.>
+				</n.regex_replace_all.>
+			</n.search_query_field.set_value.>
+		</then>
+	</n.if.not.is_null.search_query_field.value>
+</macro>
+
+<macro name="search_query_field" dot_parameter="do">
+	<n.field. name="query"><n.do/></n.field.>
+</macro>
+
+<macro name="do_search_using_params" requires="search">
+	<n.if.not.is_empty.author_param>
+		<then.query_author.author_param/>
+	</n.if.not.is_empty.author_param>
+	<n.do_search length="[n.search_page_length/]"
+		query="[n.query_param/]"
+		days="[n.get_parameter name='days'/]"
+		start="[n.search_page_index_record/]"
+		sort="[n.get_parameter name='sort'/]"
+	/>
+</macro>
+
+<macro name="author_param">
+	<n.get_parameter name='author'/>
+</macro>
+
+<macro name="query_param">
+	<n.get_parameter name='query'/>
+</macro>
+
+
+
+<macro name="previous_page_path" requires="paging,search">
+	<n.search_path_using_params index_record="[n.previous_page.page_row/]" />
+</macro>
+
+<macro name="next_page_path" requires="paging,search">
+	<n.search_path_using_params index_record="[n.next_page.page_row/]" />
+</macro>
+
+<macro name="sort_by_relevance_path">
+	<n.search_path_using_params sort="relevance" index_record="0" />
+</macro>
+
+<macro name="sort_by_date_path">
+	<n.search_path_using_params sort="date" index_record="0" />
+</macro>
+
+<macro name="search_path_using_params" parameters="query,author,days,index_record,sort" requires="node_page,servlet">
+	<n.page_node.>
+		<n.search_path>
+			<query><n.default_to_param name="query" value="[n.query/]" /></query>
+			<author><n.default_to_param name="author" value="[n.author/]" /></author>
+			<days><n.default_to_param name="days" value="[n.days/]" /></days>
+			<index_record><n.default_to_param name="index_record" value="[n.index_record/]" /></index_record>
+			<sort><n.default_to_param name="sort" value="[n.sort/]" /></sort>
+		</n.search_path>
+	</n.page_node.>
+</macro>
+
+<macro name="default_to_param" parameters="name" dot_parameter="value">
+	<n.default>
+		<text><n.value/></text>
+		<to><n.get_parameter name="[n.name/]"/></to>
+	</n.default>
+</macro>
+
+<macro name="search_path" parameters="query,author,days,index_record,sort" requires="node">
+	<n.encode_url.remove_spaces.>
+		/template/NamlServlet.jtp?macro=search_page&node=<n.id/>
+		<n.add_to_path name="query" value="[n.query/]" />
+		<n.add_to_path name="author" value="[n.author/]" />
+		<n.add_to_path name="days" value="[n.days/]" />
+		<n.add_to_path name="i" value="[n.index_record/]" default_value="0" />
+		<n.add_to_path name="sort" value="[n.sort/]" default_value="relevance" />
+	</n.encode_url.remove_spaces.>
+</macro>
+
+<macro name="page_search_box" parameters="author" requires="node,servlet">
+	<n.search_form.
+		style="display: inline; margin: 0;"
+		author="[n.author/]"
+	>
+		<input id="nabble.searchQuery" type="text" class="medium-border-color" name="query" size="20" />
+	</n.search_form.>
+</macro>
+
+<macro name="search_form" dot_parameter="do" parameters="style,query,author,days" requires="node">
+	<form style="[n.style/]" action="/template/NamlServlet.jtp">
+		<input type="hidden" name="macro" value="search_page" />
+		<input type="hidden" name="node" value="[n.id/]" />
+		<n.hidden_field name="query" value="[n.query/]" />
+		<n.hidden_field name="author" value="[n.author/]" />
+		<n.hidden_field name="days" value="[n.days/]" />
+		<n.do/>
+	</form>
+</macro>
+
+<macro name="hidden_field" parameters="name,default_value" dot_parameter="value">
+	<n.if.not.is_null.value>
+		<then>
+			<n.if.not.equal value1="[n.value/]" value2="[n.default_value/]">
+				<then>
+					<input type='hidden' name="[n.name/]" value="[n.value/]"/>
+				</then>
+			</n.if.not.equal>
+		</then>
+	</n.if.not.is_null.value>
+</macro>
+
+<macro name="advanced_search_path_using_params" parameters="days" requires="node">
+	<n.advanced_search_path>
+		<days><n.default_to_param name="days" value="[n.days/]" /></days>
+	</n.advanced_search_path>
+</macro>
+
+<macro name="advanced_search_path" parameters="days" requires="node">
+	<n.encode_url.remove_spaces.>
+		/template/NamlServlet.jtp?macro=adv_search_page&node=<n.id/>
+		<n.add_to_path name="days" value="[n.days/]" />
+	</n.encode_url.remove_spaces.>
+</macro>
+
+
+<macro name="search_page_index_record">
+	<n.get_parameter name="i"/>
+</macro>
+
+<macro name="search_page_length">
+	12
+</macro>
+
+<macro name="search_paging" dot_parameter="do">
+	<n.paging
+		total_rows = "[n.total_posts/]"
+		current_row="[n.search_page_index_record/]"
+		rows_per_page="[n.search_page_length/]"
+		do = "[n.do/]"
+	/>
+</macro>
+
+
+<macro name="is_all">
+	<n.not.is_author_search/>
+</macro>
+
+<macro name="is_author_search">
+	<n.not.is_empty.author_param />
+</macro>
+
+<macro name="set_cookies" parameters="did_search">
+	<script type="text/javascript">
+		<n.if.both condition1="[n.not.is_empty.query_param/]" condition2="[n.did_search/]">
+			<then>
+				Nabble.setCookie("query", "<n.javascript_string_encode.query_param/>");
+				Nabble.setCookie("searchterms", "<n.search_terms/>");
+			</then>
+			<else>
+				Nabble.deleteCookie("query");
+				Nabble.deleteCookie("searchterms");
+			</else>
+		</n.if.both>
+		<n.if.is_author_search>
+			<then>
+				Nabble.setCookie("searchuser", "<n.user.search_id/>");
+			</then>
+			<else>
+				Nabble.deleteCookie("searchuser");
+			</else>
+		</n.if.is_author_search>
+	</script>
+</macro>