Disclaimer: The locations displayed in this demonstration are purely fictional. It is more than likely that no store with the items listed actually exists at that location!
+ Disclaimer:
+ The locations displayed in this demonstration are purely fictional.
+ It is more than likely that no store with the items listed actually
+ exists at that location!
+
Index: solr/example/solr/collection1/conf/velocity/head.vm
===================================================================
--- solr/example/solr/collection1/conf/velocity/head.vm (revision 1470587)
+++ solr/example/solr/collection1/conf/velocity/head.vm (working copy)
@@ -1,12 +1,15 @@
+#**
+ * Provide elements for the section of the HTML document
+ *#
- ## An example of using an arbitrary request parameter
- #param('title')
-
+ ## An example of using an arbitrary request parameter
+ #param('title')
+
-
-
+
+
\ No newline at end of file
+
Index: solr/example/solr/collection1/conf/velocity/cluster_results.vm
===================================================================
--- solr/example/solr/collection1/conf/velocity/cluster_results.vm (revision 1470587)
+++ solr/example/solr/collection1/conf/velocity/cluster_results.vm (working copy)
@@ -1,12 +1,31 @@
+#**
+ * Actual rendering of Clusters
+ *#
+
+## For each cluster
#foreach ($clusters in $response.response.clusters)
- #set($labels = $clusters.get('labels'))
- #set($docs = $clusters.get('docs'))
-
#foreach ($label in $labels)$label#if( $foreach.hasNext ),#end#end
- #end
-
-
-
-#end
\ No newline at end of file
+
+ #set($labels = $clusters.get('labels'))
+ #set($docs = $clusters.get('docs'))
+
+ ## This Cluster's Heading
+
+ #foreach ($label in $labels)
+ ## Keep the following line together to prevent
+ ## a space appearing before each comma
+ $label#if( $foreach.hasNext ),#end
+ #end
+
+
+ ## This Cluster's Documents
+
+ ## For each doc in this cluster
+ #foreach ($cluDoc in $docs)
+
- #end
-
-
-
-#end
\ No newline at end of file
Index: solr/example/solr/collection1/conf/velocity/product_doc.vm
===================================================================
--- solr/example/solr/collection1/conf/velocity/product_doc.vm (revision 1470587)
+++ solr/example/solr/collection1/conf/velocity/product_doc.vm (working copy)
@@ -1,3 +1,8 @@
+#**
+ * Render a hit representing a Product
+ * assumed to have a field called "name"
+ *#
+
#field('name') #if($params.getBool('mlt', false) == false)More Like This#end
##do we have a physical store for this product
#set($store = $doc.getFieldValue('store'))
@@ -24,4 +29,4 @@
No Similar Items Found
#end
-#parse('debug.vm')
\ No newline at end of file
+#parse('debug.vm')
Index: solr/example/solr/collection1/conf/velocity/mime_type_lists.vm
===================================================================
--- solr/example/solr/collection1/conf/velocity/mime_type_lists.vm (revision 0)
+++ solr/example/solr/collection1/conf/velocity/mime_type_lists.vm (revision 0)
@@ -0,0 +1,68 @@
+#**
+ * Define some Mime-Types, short and long form
+ *#
+
+## MimeType to extension map for detecting file type
+## and showing proper icon
+## List of types match the icons in /solr/img/filetypes
+
+## Short MimeType Names
+## Was called $supportedtypes
+#set($supportedMimeTypes = "7z;ai;aiff;asc;audio;bin;bz2;c;cfc;cfm;chm;class;conf;cpp;cs;css;csv;deb;divx;doc;dot;eml;enc;file;gif;gz;hlp;htm;html;image;iso;jar;java;jpeg;jpg;js;lua;m;mm;mov;mp3;mpg;odc;odf;odg;odi;odp;ods;odt;ogg;pdf;pgp;php;pl;png;ppt;ps;py;ram;rar;rb;rm;rpm;rtf;sig;sql;swf;sxc;sxd;sxi;sxw;tar;tex;tgz;txt;vcf;video;vsd;wav;wma;wmv;xls;xml;xpi;xvid;zip")
+
+## Long Form: map MimeType headers to our Short names
+## Was called $extMap
+#set( $mimeExtensionsMap = {
+ "application/x-7z-compressed": "7z",
+ "application/postscript": "ai",
+ "application/pgp-signature": "asc",
+ "application/octet-stream": "bin",
+ "application/x-bzip2": "bz2",
+ "text/x-c": "c",
+ "application/vnd.ms-htmlhelp": "chm",
+ "application/java-vm": "class",
+ "text/css": "css",
+ "text/csv": "csv",
+ "application/x-debian-package": "deb",
+ "application/msword": "doc",
+ "message/rfc822": "eml",
+ "image/gif": "gif",
+ "application/winhlp": "hlp",
+ "text/html": "html",
+ "application/java-archive": "jar",
+ "text/x-java-source": "java",
+ "image/jpeg": "jpeg",
+ "application/javascript": "js",
+ "application/vnd.oasis.opendocument.chart": "odc",
+ "application/vnd.oasis.opendocument.formula": "odf",
+ "application/vnd.oasis.opendocument.graphics": "odg",
+ "application/vnd.oasis.opendocument.image": "odi",
+ "application/vnd.oasis.opendocument.presentation": "odp",
+ "application/vnd.oasis.opendocument.spreadsheet": "ods",
+ "application/vnd.oasis.opendocument.text": "odt",
+ "application/pdf": "pdf",
+ "application/pgp-encrypted": "pgp",
+ "image/png": "png",
+ "application/vnd.ms-powerpoint": "ppt",
+ "audio/x-pn-realaudio": "ram",
+ "application/x-rar-compressed": "rar",
+ "application/vnd.rn-realmedia": "rm",
+ "application/rtf": "rtf",
+ "application/x-shockwave-flash": "swf",
+ "application/vnd.sun.xml.calc": "sxc",
+ "application/vnd.sun.xml.draw": "sxd",
+ "application/vnd.sun.xml.impress": "sxi",
+ "application/vnd.sun.xml.writer": "sxw",
+ "application/x-tar": "tar",
+ "application/x-tex": "tex",
+ "text/plain": "txt",
+ "text/x-vcard": "vcf",
+ "application/vnd.visio": "vsd",
+ "audio/x-wav": "wav",
+ "audio/x-ms-wma": "wma",
+ "video/x-ms-wmv": "wmv",
+ "application/vnd.ms-excel": "xls",
+ "application/xml": "xml",
+ "application/x-xpinstall": "xpi",
+ "application/zip": "zip"
+})
Index: solr/example/solr/collection1/conf/velocity/facet_fields.vm
===================================================================
--- solr/example/solr/collection1/conf/velocity/facet_fields.vm (revision 1470587)
+++ solr/example/solr/collection1/conf/velocity/facet_fields.vm (working copy)
@@ -1,15 +1,23 @@
+#**
+ * Display facets based on field values
+ * e.g.: fields specified by &facet.field=
+ *#
+
#if($response.facetFields)
-
Field Facets
- #foreach($field in $response.facetFields)
- ## Hide facets without value
- #if($field.values.size() > 0)
+
+ Field Facets
+
+ #foreach($field in $response.facetFields)
+ ## Hide facets without value
+ #if($field.values.size() > 0)
$field.name
-
- #end
- #end
- #end
\ No newline at end of file
+ #end ## end if > 0
+ #end ## end for each facet field
+#end ## end if response has facet fields
Index: solr/example/solr/collection1/conf/velocity/hitGrouped.vm
===================================================================
--- solr/example/solr/collection1/conf/velocity/hitGrouped.vm (revision 1470587)
+++ solr/example/solr/collection1/conf/velocity/hitGrouped.vm (working copy)
@@ -1,24 +0,0 @@
-
Price: $!number.currency($mltHit.getFieldValue('price')) In Stock: $mltHit.getFieldValue('inStock')
-
-
- #end
-
- #elseif($mltOn && $mlt.size() == 0)
-
No Similar Items Found
- #end
-
-#parse('debug.vm')
\ No newline at end of file
Index: solr/example/solr/collection1/conf/velocity/hit.vm
===================================================================
--- solr/example/solr/collection1/conf/velocity/hit.vm (revision 1470587)
+++ solr/example/solr/collection1/conf/velocity/hit.vm (working copy)
@@ -1,11 +1,25 @@
+#**
+ * Called for each matching document but then
+ * calls one of product_doc, join_doc or richtext_doc
+ * depending on which fields the doc has
+ *#
+
#set($docId = $doc.getFieldValue('id'))
-#if($doc.getFieldValue('name'))
- #parse("product-doc.vm")
-#elseif($doc.getFieldValue('compName_s'))
- #parse("join-doc.vm")
-#else
- #parse("richtext-doc.vm")
-#end
+
+ ## Has a "name" field ?
+ #if($doc.getFieldValue('name'))
+ #parse("product_doc.vm")
+
+ ## Has a "compName_s" field ?
+ #elseif($doc.getFieldValue('compName_s'))
+ #parse("join_doc.vm")
+
+ ## Fallback to richtext_doc
+ #else
+ #parse("richtext_doc.vm")
+
+ #end
+
+
+#parse('debug.vm')
Index: solr/example/solr/collection1/conf/velocity/query_form.vm
===================================================================
--- solr/example/solr/collection1/conf/velocity/query_form.vm (revision 1470587)
+++ solr/example/solr/collection1/conf/velocity/query_form.vm (working copy)
@@ -1,10 +1,27 @@
+#**
+ * Renders the main query form
+ *#
+
Index: solr/example/solr/collection1/conf/velocity/error.vm
===================================================================
--- solr/example/solr/collection1/conf/velocity/error.vm (revision 0)
+++ solr/example/solr/collection1/conf/velocity/error.vm (revision 0)
@@ -0,0 +1,11 @@
+#**
+ * Show Error Message, if any
+ *#
+
+## Show Error Message, if any
+## Usually rendered inside div class=error
+
+#if( $response.response.error.code )
+
ERROR $response.response.error.code
+ $response.response.error.msg
+#end
Index: solr/example/solr/collection1/conf/velocity/did_you_mean.vm
===================================================================
--- solr/example/solr/collection1/conf/velocity/did_you_mean.vm (revision 1470587)
+++ solr/example/solr/collection1/conf/velocity/did_you_mean.vm (working copy)
@@ -1,4 +1,9 @@
+#**
+ * Hyperlinked spelling suggestions in results list
+ *#
+
#set($dym = $response.response.spellcheck.suggestions.collation.collationQuery)
#if($dym)
- Did you mean $esc.html($dym)?
-#end
\ No newline at end of file
+ Did you mean
+ $esc.html($dym)?
+#end
Index: solr/example/solr/collection1/conf/velocity/browse.vm
===================================================================
--- solr/example/solr/collection1/conf/velocity/browse.vm (revision 1470587)
+++ solr/example/solr/collection1/conf/velocity/browse.vm (working copy)
@@ -1,9 +1,13 @@
-#set($searcher=$request.searcher)
-#set($params=$request.params)
+#**
+ * Main entry point into the /browse templates
+ *#
+
+#set($searcher = $request.searcher)
+#set($params = $request.params)
#set($clusters = $response.response.clusters)
#set($mltResults = $response.response.get("moreLikeThis"))
#set($annotate = $params.get("annotateBrowse"))
-#parse('query.vm')
+#parse('query_form.vm')
#parse('did_you_mean.vm')
@@ -11,40 +15,19 @@
- #if($response.response.get('grouped'))
- $response.response.get('grouped').size() group(s) found in ${response.responseHeader.QTime} ms
- #else$page.results_found results found in ${response.responseHeader.QTime} ms
- Page $page.current_page_number of $page.page_count#end
+ #parse("pagination_top.vm")
+
+ #end ## end of foreach group in grouping.value.groups
+ ## div tag for entire list of groups
+
+ ## end of div class=result-document
+
+## Debug Info
+#if($params.getBool("debugQuery",false))
+
+ toggle explain
+
+#end
+
+ ## TODO: pretty sure this is an extra div, OR we're missing a top level
Index: solr/example/solr/collection1/conf/velocity/jquery.autocomplete.js
===================================================================
--- solr/example/solr/collection1/conf/velocity/jquery.autocomplete.js (revision 1470587)
+++ solr/example/solr/collection1/conf/velocity/jquery.autocomplete.js (working copy)
@@ -1,763 +0,0 @@
-/*
- * Autocomplete - jQuery plugin 1.1pre
- *
- * Copyright (c) 2007 Dylan Verheul, Dan G. Switzer, Anjesh Tuladhar, Jörn Zaefferer
- *
- * Dual licensed under the MIT and GPL licenses:
- * http://www.opensource.org/licenses/mit-license.php
- * http://www.gnu.org/licenses/gpl.html
- *
- * Revision: $Id: jquery.autocomplete.js 5785 2008-07-12 10:37:33Z joern.zaefferer $
- *
- */
-
-;(function($) {
-
-$.fn.extend({
- autocomplete: function(urlOrData, options) {
- var isUrl = typeof urlOrData == "string";
- options = $.extend({}, $.Autocompleter.defaults, {
- url: isUrl ? urlOrData : null,
- data: isUrl ? null : urlOrData,
- delay: isUrl ? $.Autocompleter.defaults.delay : 10,
- max: options && !options.scroll ? 10 : 150
- }, options);
-
- // if highlight is set to false, replace it with a do-nothing function
- options.highlight = options.highlight || function(value) { return value; };
-
- // if the formatMatch option is not specified, then use formatItem for backwards compatibility
- options.formatMatch = options.formatMatch || options.formatItem;
-
- return this.each(function() {
- new $.Autocompleter(this, options);
- });
- },
- result: function(handler) {
- return this.bind("result", handler);
- },
- search: function(handler) {
- return this.trigger("search", [handler]);
- },
- flushCache: function() {
- return this.trigger("flushCache");
- },
- setOptions: function(options){
- return this.trigger("setOptions", [options]);
- },
- unautocomplete: function() {
- return this.trigger("unautocomplete");
- }
-});
-
-$.Autocompleter = function(input, options) {
-
- var KEY = {
- UP: 38,
- DOWN: 40,
- DEL: 46,
- TAB: 9,
- RETURN: 13,
- ESC: 27,
- COMMA: 188,
- PAGEUP: 33,
- PAGEDOWN: 34,
- BACKSPACE: 8
- };
-
- // Create $ object for input element
- var $input = $(input).attr("autocomplete", "off").addClass(options.inputClass);
-
- var timeout;
- var previousValue = "";
- var cache = $.Autocompleter.Cache(options);
- var hasFocus = 0;
- var lastKeyPressCode;
- var config = {
- mouseDownOnSelect: false
- };
- var select = $.Autocompleter.Select(options, input, selectCurrent, config);
-
- var blockSubmit;
-
- // prevent form submit in opera when selecting with return key
- $.browser.opera && $(input.form).bind("submit.autocomplete", function() {
- if (blockSubmit) {
- blockSubmit = false;
- return false;
- }
- });
-
- // only opera doesn't trigger keydown multiple times while pressed, others don't work with keypress at all
- $input.bind(($.browser.opera ? "keypress" : "keydown") + ".autocomplete", function(event) {
- // track last key pressed
- lastKeyPressCode = event.keyCode;
- switch(event.keyCode) {
-
- case KEY.UP:
- event.preventDefault();
- if ( select.visible() ) {
- select.prev();
- } else {
- onChange(0, true);
- }
- break;
-
- case KEY.DOWN:
- event.preventDefault();
- if ( select.visible() ) {
- select.next();
- } else {
- onChange(0, true);
- }
- break;
-
- case KEY.PAGEUP:
- event.preventDefault();
- if ( select.visible() ) {
- select.pageUp();
- } else {
- onChange(0, true);
- }
- break;
-
- case KEY.PAGEDOWN:
- event.preventDefault();
- if ( select.visible() ) {
- select.pageDown();
- } else {
- onChange(0, true);
- }
- break;
-
- // matches also semicolon
- case options.multiple && $.trim(options.multipleSeparator) == "," && KEY.COMMA:
- case KEY.TAB:
- case KEY.RETURN:
- if( selectCurrent() ) {
- // stop default to prevent a form submit, Opera needs special handling
- event.preventDefault();
- blockSubmit = true;
- return false;
- }
- break;
-
- case KEY.ESC:
- select.hide();
- break;
-
- default:
- clearTimeout(timeout);
- timeout = setTimeout(onChange, options.delay);
- break;
- }
- }).focus(function(){
- // track whether the field has focus, we shouldn't process any
- // results if the field no longer has focus
- hasFocus++;
- }).blur(function() {
- hasFocus = 0;
- if (!config.mouseDownOnSelect) {
- hideResults();
- }
- }).click(function() {
- // show select when clicking in a focused field
- if ( hasFocus++ > 1 && !select.visible() ) {
- onChange(0, true);
- }
- }).bind("search", function() {
- // TODO why not just specifying both arguments?
- var fn = (arguments.length > 1) ? arguments[1] : null;
- function findValueCallback(q, data) {
- var result;
- if( data && data.length ) {
- for (var i=0; i < data.length; i++) {
- if( data[i].result.toLowerCase() == q.toLowerCase() ) {
- result = data[i];
- break;
- }
- }
- }
- if( typeof fn == "function" ) fn(result);
- else $input.trigger("result", result && [result.data, result.value]);
- }
- $.each(trimWords($input.val()), function(i, value) {
- request(value, findValueCallback, findValueCallback);
- });
- }).bind("flushCache", function() {
- cache.flush();
- }).bind("setOptions", function() {
- $.extend(options, arguments[1]);
- // if we've updated the data, repopulate
- if ( "data" in arguments[1] )
- cache.populate();
- }).bind("unautocomplete", function() {
- select.unbind();
- $input.unbind();
- $(input.form).unbind(".autocomplete");
- });
-
-
- function selectCurrent() {
- var selected = select.selected();
- if( !selected )
- return false;
-
- var v = selected.result;
- previousValue = v;
-
- if ( options.multiple ) {
- var words = trimWords($input.val());
- if ( words.length > 1 ) {
- v = words.slice(0, words.length - 1).join( options.multipleSeparator ) + options.multipleSeparator + v;
- }
- v += options.multipleSeparator;
- }
-
- $input.val(v);
- hideResultsNow();
- $input.trigger("result", [selected.data, selected.value]);
- return true;
- }
-
- function onChange(crap, skipPrevCheck) {
- if( lastKeyPressCode == KEY.DEL ) {
- select.hide();
- return;
- }
-
- var currentValue = $input.val();
-
- if ( !skipPrevCheck && currentValue == previousValue )
- return;
-
- previousValue = currentValue;
-
- currentValue = lastWord(currentValue);
- if ( currentValue.length >= options.minChars) {
- $input.addClass(options.loadingClass);
- if (!options.matchCase)
- currentValue = currentValue.toLowerCase();
- request(currentValue, receiveData, hideResultsNow);
- } else {
- stopLoading();
- select.hide();
- }
- };
-
- function trimWords(value) {
- if ( !value ) {
- return [""];
- }
- var words = value.split( options.multipleSeparator );
- var result = [];
- $.each(words, function(i, value) {
- if ( $.trim(value) )
- result[i] = $.trim(value);
- });
- return result;
- }
-
- function lastWord(value) {
- if ( !options.multiple )
- return value;
- var words = trimWords(value);
- return words[words.length - 1];
- }
-
- // fills in the input box w/the first match (assumed to be the best match)
- // q: the term entered
- // sValue: the first matching result
- function autoFill(q, sValue){
- // autofill in the complete box w/the first match as long as the user hasn't entered in more data
- // if the last user key pressed was backspace, don't autofill
- if( options.autoFill && (lastWord($input.val()).toLowerCase() == q.toLowerCase()) && lastKeyPressCode != KEY.BACKSPACE ) {
- // fill in the value (keep the case the user has typed)
- $input.val($input.val() + sValue.substring(lastWord(previousValue).length));
- // select the portion of the value not typed by the user (so the next character will erase)
- $.Autocompleter.Selection(input, previousValue.length, previousValue.length + sValue.length);
- }
- };
-
- function hideResults() {
- clearTimeout(timeout);
- timeout = setTimeout(hideResultsNow, 200);
- };
-
- function hideResultsNow() {
- var wasVisible = select.visible();
- select.hide();
- clearTimeout(timeout);
- stopLoading();
- if (options.mustMatch) {
- // call search and run callback
- $input.search(
- function (result){
- // if no value found, clear the input box
- if( !result ) {
- if (options.multiple) {
- var words = trimWords($input.val()).slice(0, -1);
- $input.val( words.join(options.multipleSeparator) + (words.length ? options.multipleSeparator : "") );
- }
- else
- $input.val( "" );
- }
- }
- );
- }
- if (wasVisible)
- // position cursor at end of input field
- $.Autocompleter.Selection(input, input.value.length, input.value.length);
- };
-
- function receiveData(q, data) {
- if ( data && data.length && hasFocus ) {
- stopLoading();
- select.display(data, q);
- autoFill(q, data[0].value);
- select.show();
- } else {
- hideResultsNow();
- }
- };
-
- function request(term, success, failure) {
- if (!options.matchCase)
- term = term.toLowerCase();
- var data = cache.load(term);
- data = null; // Avoid buggy cache and go to Solr every time
- // recieve the cached data
- if (data && data.length) {
- success(term, data);
- // if an AJAX url has been supplied, try loading the data now
- } else if( (typeof options.url == "string") && (options.url.length > 0) ){
-
- var extraParams = {
- timestamp: +new Date()
- };
- $.each(options.extraParams, function(key, param) {
- extraParams[key] = typeof param == "function" ? param() : param;
- });
-
- $.ajax({
- // try to leverage ajaxQueue plugin to abort previous requests
- mode: "abort",
- // limit abortion to this input
- port: "autocomplete" + input.name,
- dataType: options.dataType,
- url: options.url,
- data: $.extend({
- q: lastWord(term),
- limit: options.max
- }, extraParams),
- success: function(data) {
- var parsed = options.parse && options.parse(data) || parse(data);
- cache.add(term, parsed);
- success(term, parsed);
- }
- });
- } else {
- // if we have a failure, we need to empty the list -- this prevents the the [TAB] key from selecting the last successful match
- select.emptyList();
- failure(term);
- }
- };
-
- function parse(data) {
- var parsed = [];
- var rows = data.split("\n");
- for (var i=0; i < rows.length; i++) {
- var row = $.trim(rows[i]);
- if (row) {
- row = row.split("|");
- parsed[parsed.length] = {
- data: row,
- value: row[0],
- result: options.formatResult && options.formatResult(row, row[0]) || row[0]
- };
- }
- }
- return parsed;
- };
-
- function stopLoading() {
- $input.removeClass(options.loadingClass);
- };
-
-};
-
-$.Autocompleter.defaults = {
- inputClass: "ac_input",
- resultsClass: "ac_results",
- loadingClass: "ac_loading",
- minChars: 1,
- delay: 400,
- matchCase: false,
- matchSubset: true,
- matchContains: false,
- cacheLength: 10,
- max: 100,
- mustMatch: false,
- extraParams: {},
- selectFirst: false,
- formatItem: function(row) { return row[0]; },
- formatMatch: null,
- autoFill: false,
- width: 0,
- multiple: false,
- multipleSeparator: ", ",
- highlight: function(value, term) {
- return value.replace(new RegExp("(?![^&;]+;)(?!<[^<>]*)(" + term.replace(/([\^\$\(\)\[\]\{\}\*\.\+\?\|\\])/gi, "\\$1") + ")(?![^<>]*>)(?![^&;]+;)", "gi"), "$1");
- },
- scroll: true,
- scrollHeight: 180
-};
-
-$.Autocompleter.Cache = function(options) {
-
- var data = {};
- var length = 0;
-
- function matchSubset(s, sub) {
- if (!options.matchCase)
- s = s.toLowerCase();
- var i = s.indexOf(sub);
- if (options.matchContains == "word"){
- i = s.toLowerCase().search("\\b" + sub.toLowerCase());
- }
- if (i == -1) return false;
- return i == 0 || options.matchContains;
- };
-
- function add(q, value) {
- if (length > options.cacheLength){
- flush();
- }
- if (!data[q]){
- length++;
- }
- data[q] = value;
- }
-
- function populate(){
- if( !options.data ) return false;
- // track the matches
- var stMatchSets = {},
- nullData = 0;
-
- // no url was specified, we need to adjust the cache length to make sure it fits the local data store
- if( !options.url ) options.cacheLength = 1;
-
- // track all options for minChars = 0
- stMatchSets[""] = [];
-
- // loop through the array and create a lookup structure
- for ( var i = 0, ol = options.data.length; i < ol; i++ ) {
- var rawValue = options.data[i];
- // if rawValue is a string, make an array otherwise just reference the array
- rawValue = (typeof rawValue == "string") ? [rawValue] : rawValue;
-
- var value = options.formatMatch(rawValue, i+1, options.data.length);
- if ( value === false )
- continue;
-
- var firstChar = value.charAt(0).toLowerCase();
- // if no lookup array for this character exists, look it up now
- if( !stMatchSets[firstChar] )
- stMatchSets[firstChar] = [];
-
- // if the match is a string
- var row = {
- value: value,
- data: rawValue,
- result: options.formatResult && options.formatResult(rawValue) || value
- };
-
- // push the current match into the set list
- stMatchSets[firstChar].push(row);
-
- // keep track of minChars zero items
- if ( nullData++ < options.max ) {
- stMatchSets[""].push(row);
- }
- };
-
- // add the data items to the cache
- $.each(stMatchSets, function(i, value) {
- // increase the cache size
- options.cacheLength++;
- // add to the cache
- add(i, value);
- });
- }
-
- // populate any existing data
- setTimeout(populate, 25);
-
- function flush(){
- data = {};
- length = 0;
- }
-
- return {
- flush: flush,
- add: add,
- populate: populate,
- load: function(q) {
- if (!options.cacheLength || !length)
- return null;
- /*
- * if dealing w/local data and matchContains than we must make sure
- * to loop through all the data collections looking for matches
- */
- if( !options.url && options.matchContains ){
- // track all matches
- var csub = [];
- // loop through all the data grids for matches
- for( var k in data ){
- // don't search through the stMatchSets[""] (minChars: 0) cache
- // this prevents duplicates
- if( k.length > 0 ){
- var c = data[k];
- $.each(c, function(i, x) {
- // if we've got a match, add it to the array
- if (matchSubset(x.value, q)) {
- csub.push(x);
- }
- });
- }
- }
- return csub;
- } else
- // if the exact item exists, use it
- if (data[q]){
- return data[q];
- } else
- if (options.matchSubset) {
- for (var i = q.length - 1; i >= options.minChars; i--) {
- var c = data[q.substr(0, i)];
- if (c) {
- var csub = [];
- $.each(c, function(i, x) {
- if (matchSubset(x.value, q)) {
- csub[csub.length] = x;
- }
- });
- return csub;
- }
- }
- }
- return null;
- }
- };
-};
-
-$.Autocompleter.Select = function (options, input, select, config) {
- var CLASSES = {
- ACTIVE: "ac_over"
- };
-
- var listItems,
- active = -1,
- data,
- term = "",
- needsInit = true,
- element,
- list;
-
- // Create results
- function init() {
- if (!needsInit)
- return;
- element = $("")
- .hide()
- .addClass(options.resultsClass)
- .css("position", "absolute")
- .appendTo(document.body);
-
- list = $("
").appendTo(element).mouseover( function(event) {
- if(target(event).nodeName && target(event).nodeName.toUpperCase() == 'LI') {
- active = $("li", list).removeClass(CLASSES.ACTIVE).index(target(event));
- $(target(event)).addClass(CLASSES.ACTIVE);
- }
- }).click(function(event) {
- $(target(event)).addClass(CLASSES.ACTIVE);
- select();
- // TODO provide option to avoid setting focus again after selection? useful for cleanup-on-focus
- input.focus();
- return false;
- }).mousedown(function() {
- config.mouseDownOnSelect = true;
- }).mouseup(function() {
- config.mouseDownOnSelect = false;
- });
-
- if( options.width > 0 )
- element.css("width", options.width);
-
- needsInit = false;
- }
-
- function target(event) {
- var element = event.target;
- while(element && element.tagName != "LI")
- element = element.parentNode;
- // more fun with IE, sometimes event.target is empty, just ignore it then
- if(!element)
- return [];
- return element;
- }
-
- function moveSelect(step) {
- listItems.slice(active, active + 1).removeClass(CLASSES.ACTIVE);
- movePosition(step);
- var activeItem = listItems.slice(active, active + 1).addClass(CLASSES.ACTIVE);
- if(options.scroll) {
- var offset = 0;
- listItems.slice(0, active).each(function() {
- offset += this.offsetHeight;
- });
- if((offset + activeItem[0].offsetHeight - list.scrollTop()) > list[0].clientHeight) {
- list.scrollTop(offset + activeItem[0].offsetHeight - list.innerHeight());
- } else if(offset < list.scrollTop()) {
- list.scrollTop(offset);
- }
- }
- };
-
- function movePosition(step) {
- active += step;
- if (active < 0) {
- active = listItems.size() - 1;
- } else if (active >= listItems.size()) {
- active = 0;
- }
- }
-
- function limitNumberOfItems(available) {
- return options.max && options.max < available
- ? options.max
- : available;
- }
-
- function fillList() {
- list.empty();
- var max = limitNumberOfItems(data.length);
- for (var i=0; i < max; i++) {
- if (!data[i])
- continue;
- var formatted = options.formatItem(data[i].data, i+1, max, data[i].value, term);
- if ( formatted === false )
- continue;
- var li = $("").html( options.highlight(formatted, term) ).addClass(i%2 == 0 ? "ac_even" : "ac_odd").appendTo(list)[0];
- $.data(li, "ac_data", data[i]);
- }
- listItems = list.find("li");
- if ( options.selectFirst ) {
- listItems.slice(0, 1).addClass(CLASSES.ACTIVE);
- active = 0;
- }
- // apply bgiframe if available
- if ( $.fn.bgiframe )
- list.bgiframe();
- }
-
- return {
- display: function(d, q) {
- init();
- data = d;
- term = q;
- fillList();
- },
- next: function() {
- moveSelect(1);
- },
- prev: function() {
- moveSelect(-1);
- },
- pageUp: function() {
- if (active != 0 && active - 8 < 0) {
- moveSelect( -active );
- } else {
- moveSelect(-8);
- }
- },
- pageDown: function() {
- if (active != listItems.size() - 1 && active + 8 > listItems.size()) {
- moveSelect( listItems.size() - 1 - active );
- } else {
- moveSelect(8);
- }
- },
- hide: function() {
- element && element.hide();
- listItems && listItems.removeClass(CLASSES.ACTIVE);
- active = -1;
- },
- visible : function() {
- return element && element.is(":visible");
- },
- current: function() {
- return this.visible() && (listItems.filter("." + CLASSES.ACTIVE)[0] || options.selectFirst && listItems[0]);
- },
- show: function() {
- var offset = $(input).offset();
- element.css({
- width: typeof options.width == "string" || options.width > 0 ? options.width : $(input).width(),
- top: offset.top + input.offsetHeight,
- left: offset.left
- }).show();
- if(options.scroll) {
- list.scrollTop(0);
- list.css({
- maxHeight: options.scrollHeight,
- overflow: 'auto'
- });
-
- if($.browser.msie && typeof document.body.style.maxHeight === "undefined") {
- var listHeight = 0;
- listItems.each(function() {
- listHeight += this.offsetHeight;
- });
- var scrollbarsVisible = listHeight > options.scrollHeight;
- list.css('height', scrollbarsVisible ? options.scrollHeight : listHeight );
- if (!scrollbarsVisible) {
- // IE doesn't recalculate width when scrollbar disappears
- listItems.width( list.width() - parseInt(listItems.css("padding-left")) - parseInt(listItems.css("padding-right")) );
- }
- }
-
- }
- },
- selected: function() {
- var selected = listItems && listItems.filter("." + CLASSES.ACTIVE).removeClass(CLASSES.ACTIVE);
- return selected && selected.length && $.data(selected[0], "ac_data");
- },
- emptyList: function (){
- list && list.empty();
- },
- unbind: function() {
- element && element.remove();
- }
- };
-};
-
-$.Autocompleter.Selection = function(field, start, end) {
- if( field.createTextRange ){
- var selRange = field.createTextRange();
- selRange.collapse(true);
- selRange.moveStart("character", start);
- selRange.moveEnd("character", end);
- selRange.select();
- } else if( field.setSelectionRange ){
- field.setSelectionRange(start, end);
- } else {
- if( field.selectionStart ){
- field.selectionStart = start;
- field.selectionEnd = end;
- }
- }
- field.focus();
-};
-
-})(jQuery);
\ No newline at end of file
Index: solr/example/solr/collection1/conf/velocity/pagination_top.vm
===================================================================
--- solr/example/solr/collection1/conf/velocity/pagination_top.vm (revision 0)
+++ solr/example/solr/collection1/conf/velocity/pagination_top.vm (revision 0)
@@ -0,0 +1,29 @@
+#**
+ * Paging and Staticis at top of results
+ *#
+
+## Usually rendered in pagination div tag
+
+## Grouped Results / Not Paginated
+#if($response.response.get('grouped'))
+
+
+
+ $response.response.get('grouped').size() group(s)
+
+ found in ${response.responseHeader.QTime} ms
+
+
+## Regular Results / Use Paging Links if needed
+#else
+
+
+ $page.results_found
+ results found in
+ ${response.responseHeader.QTime} ms
+
+
+ Page $page.current_page_number
+ of $page.page_count
+
+#end ## end else non-grouped results, normal pagination
Index: solr/example/solr/collection1/conf/velocity/layout.vm
===================================================================
--- solr/example/solr/collection1/conf/velocity/layout.vm (revision 1470587)
+++ solr/example/solr/collection1/conf/velocity/layout.vm (working copy)
@@ -1,3 +1,7 @@
+#**
+ * Overall HTML page layout
+ *#
+
#parse("head.vm")
Index: solr/example/solr/collection1/conf/velocity/richtext_doc.vm
===================================================================
--- solr/example/solr/collection1/conf/velocity/richtext_doc.vm (revision 1470587)
+++ solr/example/solr/collection1/conf/velocity/richtext_doc.vm (working copy)
@@ -1,64 +1,21 @@
-## Mimetype to extension map for detecting file type and show icon
-## List of types match the icons in /solr/img/filetypes
-#set($extMap = {"application/x-7z-compressed": "7z",
- "application/postscript": "ai",
- "application/pgp-signature": "asc",
- "application/octet-stream": "bin",
- "application/x-bzip2": "bz2",
- "text/x-c": "c",
- "application/vnd.ms-htmlhelp": "chm",
- "application/java-vm": "class",
- "text/css": "css",
- "text/csv": "csv",
- "application/x-debian-package": "deb",
- "application/msword": "doc",
- "message/rfc822": "eml",
- "image/gif": "gif",
- "application/winhlp": "hlp",
- "text/html": "html",
- "application/java-archive": "jar",
- "text/x-java-source": "java",
- "image/jpeg": "jpeg",
- "application/javascript": "js",
- "application/vnd.oasis.opendocument.chart": "odc",
- "application/vnd.oasis.opendocument.formula": "odf",
- "application/vnd.oasis.opendocument.graphics": "odg",
- "application/vnd.oasis.opendocument.image": "odi",
- "application/vnd.oasis.opendocument.presentation": "odp",
- "application/vnd.oasis.opendocument.spreadsheet": "ods",
- "application/vnd.oasis.opendocument.text": "odt",
- "application/pdf": "pdf",
- "application/pgp-encrypted": "pgp",
- "image/png": "png",
- "application/vnd.ms-powerpoint": "ppt",
- "audio/x-pn-realaudio": "ram",
- "application/x-rar-compressed": "rar",
- "application/vnd.rn-realmedia": "rm",
- "application/rtf": "rtf",
- "application/x-shockwave-flash": "swf",
- "application/vnd.sun.xml.calc": "sxc",
- "application/vnd.sun.xml.draw": "sxd",
- "application/vnd.sun.xml.impress": "sxi",
- "application/vnd.sun.xml.writer": "sxw",
- "application/x-tar": "tar",
- "application/x-tex": "tex",
- "text/plain": "txt",
- "text/x-vcard": "vcf",
- "application/vnd.visio": "vsd",
- "audio/x-wav": "wav",
- "audio/x-ms-wma": "wma",
- "video/x-ms-wmv": "wmv",
- "application/vnd.ms-excel": "xls",
- "application/xml": "xml",
- "application/x-xpinstall": "xpi",
- "application/zip": "zip"})
+#**
+ * Render a complex document in the results list
+ *#
+## Load Mime-Type List and Mapping
+#parse('mime_type_lists.vm')
+## Sets:
+## * supportedMimeTypes, AKA supportedtypes
+## * mimeExtensionsMap, AKA extMap
+## Title
#if($doc.getFieldValue('title'))
#set($title = $esc.html($doc.getFirstValue('title')))
#else
#set($title = "["+$doc.getFieldValue('id')+"]")
#end
+
+## URL
#if($doc.getFieldValue('url'))
#set($url = $doc.getFieldValue('url'))
#elseif($doc.getFieldValue('resourcename'))
@@ -66,49 +23,131 @@
#else
#set($url = "$doc.getFieldValue('id')")
#end
-#set($supportedtypes = "7z;ai;aiff;asc;audio;bin;bz2;c;cfc;cfm;chm;class;conf;cpp;cs;css;csv;deb;divx;doc;dot;eml;enc;file;gif;gz;hlp;htm;html;image;iso;jar;java;jpeg;jpg;js;lua;m;mm;mov;mp3;mpg;odc;odf;odg;odi;odp;ods;odt;ogg;pdf;pgp;php;pl;png;ppt;ps;py;ram;rar;rb;rm;rpm;rtf;sig;sql;swf;sxc;sxd;sxi;sxw;tar;tex;tgz;txt;vcf;video;vsd;wav;wma;wmv;xls;xml;xpi;xvid;zip")
+
+## Sort out Mime-Type
#set($ct = $list.get($doc.getFirstValue('content_type').split(";"),0))
#set($filename = $doc.getFieldValue('resourcename'))
+#set($filetype = false)
+#set($filetype = $mimeExtensionsMap.get($ct))
-#set($filetype = false)
-#set($filetype = $extMap.get($ct))
-##TODO: falling back to file extension is convenient, except when you don't have an icon for that extension
-## example "application/vnd.openxmlformats-officedocument.wordprocessingml.document" document
-## with a .docx extension. It'd be nice to fall back to an "unknown" or the existing "file" type
-## We sort of do this below, but only if the filename has no extension (anything after the last dot).
-#if(!$filetype)#set($filetype = $filename.substring($filename.lastIndexOf(".")).substring(1))#end
-##if(!$filetype)#set($filetype = "file")#end
-##if(!$supportedtypes.contains($filetype))#set($filetype = "file")#end
+## TODO: falling back to file extension is convenient,
+## except when you don't have an icon for that extension
+## example "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
+## document with a .docx extension.
+## It'd be nice to fall back to an "unknown" or the existing "file" type
+## We sort of do this below, but only if the filename has no extension
+## (anything after the last dot).
+
+#if(!$filetype)
+ #set($filetype = $filename.substring($filename.lastIndexOf(".")).substring(1))
+#end
+
+## #if(!$filetype)
+## #set($filetype = "file")
+## #end
+## #if(!$supportedMimeTypes.contains($filetype))
+## #set($filetype = "file")
+## #end
+
+## Row 1: Icon and Title and mlt link
-## Small file type icons from http://www.splitbrain.org/projects/file_icons (public domain)
-
-$title #if($params.getBool('mlt', false) == false)More Like This#end
-
Id: #field('id')
+ ## Icon
+ ## Small file type icons from http://www.splitbrain.org/projects/file_icons (public domain)
+
+
+ ## Title, hyperlinked
+
+ $title
+
+ ## Link for MLT / More Like This / Find Similar
+
+ #if($params.getBool('mlt', false) == false)
+
+ More Like This
+ #end
+
+
+
+
+## Row 2?: ID / URL
+
+
+ toggle all fields
+
- #foreach($fieldname in $doc.fieldNames)
-
- $fieldname :
-
- #foreach($value in $doc.getFieldValues($fieldname))
- $esc.html($value)
- #end
-
- #end
-
+ #foreach($fieldname in $doc.fieldNames)
+
+ $fieldname :
+
+ #foreach($value in $doc.getFieldValues($fieldname))
+ $esc.html($value)
+ #end
+
+
+ #end
-#end
\ No newline at end of file
+#end
Index: solr/example/solr/collection1/conf/velocity/VM_global_library.vm
===================================================================
--- solr/example/solr/collection1/conf/velocity/VM_global_library.vm (revision 1470587)
+++ solr/example/solr/collection1/conf/velocity/VM_global_library.vm (working copy)
@@ -1,3 +1,8 @@
+#**
+ * Global macros used by other templates.
+ * This file must be named VM_global_library.vm
+ * in order for Velocity to find it.
+ *#
#macro(param $key)$request.params.get($key)#end
@@ -167,4 +172,4 @@
#else
$math.add($inval,$gapval)##
#end
-#end
\ No newline at end of file
+#end
Index: solr/example/solr/collection1/conf/velocity/tabs.vm
===================================================================
--- solr/example/solr/collection1/conf/velocity/tabs.vm (revision 1470587)
+++ solr/example/solr/collection1/conf/velocity/tabs.vm (working copy)
@@ -1,6 +1,50 @@
+#**
+ * Provides navigation/access to Advanced search options
+ * Usually displayed near the top of the page
+ *#
+
##TODO: Make some nice tabs here
+
#set($queryOpts = $params.get("queryOpts"))
-Examples: #if($queryOpts && $queryOpts != "")Simple#{else}Simple#end
-#if($queryOpts == "spatial")Spatial#elseSpatial#end
-#if($queryOpts == "group")Group By#elseGroup By#end
-
\ No newline at end of file
+
+
+
+ Type of Search:
+
+ ##queryOpts=$queryOpts
+
+ ## return to Simple Search
+ ##set( $selected = ($queryOpts && $queryOpts != "") )
+ #set( $selected = ! $queryOpts )
+
+ #if($selected)
+ Simple
+ #else
+
+ Simple
+ #end
+
+
+ ## GEO-Spatial / Location Based
+ #set( $selected = ($queryOpts == "spatial") )
+
+ #if($selected)
+ Spatial
+ #else
+
+ Spatial
+ #end
+
+
+ ## Group By Field
+ #set( $selected = ($queryOpts == "group") )
+
+ #if($selected)
+ Group By
+ #else
+
+ Group By
+ #end
+
+
+
Index: solr/example/solr/collection1/conf/velocity/README.txt
===================================================================
--- solr/example/solr/collection1/conf/velocity/README.txt (revision 0)
+++ solr/example/solr/collection1/conf/velocity/README.txt (revision 0)
@@ -0,0 +1,101 @@
+Introduction
+------------
+Solr Search Velocity Templates
+
+A quick demo of using Solr. These were previously called Solritas
+
+You typically access these templates via:
+ http://localhost:8983/solr/collection1/browse
+
+It's called "browse" because you can click around with your mouse
+without needing to type any search terms. And of course it
+also works as a standard search app as well.
+
+Known Limitations
+-----------------
+* The /browse and the VelocityResponseWriter component
+ serve content directly from Solr, which usually requires
+ Solr's rest API to be exposed. Advanced users could
+ potentially access other parts of Solr directly.
+* There are some hard coded fields in these templates.
+ Since these templates live under conf, they should be
+ considered part of the overall configuation, and
+ must be coordinated with schema.xml and solrconfig.xml
+
+Velocity Info
+-------------
+Java-based template language.
+
+It's nice in this context because change to the templates
+are immediately visible in browser on the next visit.
+
+Links:
+ http://velocity.apache.org
+ http://wiki.apache.org/velocity/
+ http://velocity.apache.org/engine/releases/velocity-1.7/user-guide.html
+
+
+File List
+---------
+
+System and Misc:
+ VM_global_library.vm - Macros used other templates,
+ exact filename is important for Velocity to see it
+ error.vm - shows errors, if any
+ debug.vm - includes toggle links for "explain" and "all fields"
+ activated by debug link in footer.vm
+ README.txt - this file
+
+Overall Page Composition:
+ browse.vm - Main entry point into templates
+ layout.vm - overall HTML page layout
+ head.vm - elements in the section of the HTML document
+ header.vm - top section of page visible to users
+ footer.vm - bottom section of page visible to users,
+ includes debug and help links
+ main.css - CSS style for overall pages
+ see also jquery_autocomplete.css
+
+Query Form and Options:
+ query_form.vm - renders query form
+ query_group.vm - group by fields
+ e.g.: Manufacturer or Poplularity
+ query_spatial.vm - select box for location based Geospacial search
+
+Spelling Suggestions:
+ did_you_mean.vm - hyperlinked spelling suggestions in results
+ suggest.vm - dynamic spelling suggestions
+ as you type in the search form
+ jquery_autocomplete.js - supporting files for dynamic suggestions
+ jquery_autocomplete.css - Most CSS is defined in main.css
+
+
+Search Results, General:
+ (see also browse.vm)
+ tabs.vm - provides navigation to advanced search options
+ pagination_top.vm - paging and staticis at top of results
+ pagination_bottom.vm - paging and staticis at bottom of results
+ results_list.vm
+ hit.vm - called for each matching doc,
+ decides which template to use
+ hit_grouped.vm - display results grouped by field values
+ product_doc.vm - display a Product
+ join_doc.vm - display a joined document
+ richtext_doc.vm - display a complex/misc. document
+ hit_plain.vm - basic display of all fields,
+ edit results_list.vm to enable this
+
+
+Search Results, Facets & Clusters:
+ facets.vm - calls the 4 facet and 1 cluster template
+ facet_fields.vm - display facets based on field values
+ e.g.: fields specified by &facet.field=
+ facet_queries.vm - display facets based on specific facet queries
+ e.g.: facets specified by &facet.query=
+ facet_ranges.vm - display facets based on ranges
+ e.g.: ranges specified by &facet.range=
+ facet_pivot.vm - display pivot based facets
+ e.g.: facets specified by &facet.pivot=
+ cluster.vm - if clustering is available
+ then call cluster_results.vm
+ cluster_results.vm - actual rendering of clusters
Index: solr/example/solr/collection1/conf/velocity/main.css
===================================================================
--- solr/example/solr/collection1/conf/velocity/main.css (revision 1470587)
+++ solr/example/solr/collection1/conf/velocity/main.css (working copy)
@@ -49,10 +49,32 @@
position: relative;
}
+.tabs-bar {
+ padding: 5px;
+ width: 100%;
+ border: 1px solid;
+ border-width: 0px 0px 1px 0px;
+}
+.tab {
+ font-weight: bold;
+ padding: 5px;
+ margin: 0px 5px;
+ border: 1px solid;
+ background-color: #dddddd;
+ border-top-left-radius: 4px;
+ border-top-right-radius: 4px;
+}
+.tab:hover {
+ background: #FEC293;
+}
+.tab.selected {
+ background-color: #ffffff;
+ border-bottom: 1px solid #ffffff;
+}
+
.navigators h2 {
background: #FEC293;
- border: 1px solid #ce9d77;
- padding: 5px;
+ padding: 2px 5px;
}
.navigators ul {
Index: solr/example/solr/collection1/conf/velocity/results_list.vm
===================================================================
--- solr/example/solr/collection1/conf/velocity/results_list.vm (revision 0)
+++ solr/example/solr/collection1/conf/velocity/results_list.vm (revision 0)
@@ -0,0 +1,22 @@
+#**
+ * Render the main Results List
+ *#
+
+## Usually displayed inside div class=results
+
+#if($response.response.get('grouped'))
+
+ #foreach($grouping in $response.response.get('grouped'))
+ #parse("hit_grouped.vm")
+ #end
+
+#else
+
+ #foreach($doc in $response.results)
+ #parse("hit.vm")
+ ## Can get an extremely simple view of the doc
+ ## which might be nicer for debugging
+ ##parse("hit_plain.vm")
+ #end
+
+#end
Index: solr/example/solr/collection1/conf/velocity/richtext-doc.vm
===================================================================
--- solr/example/solr/collection1/conf/velocity/richtext-doc.vm (revision 1470587)
+++ solr/example/solr/collection1/conf/velocity/richtext-doc.vm (working copy)
@@ -1,114 +0,0 @@
-## Mimetype to extension map for detecting file type and show icon
-## List of types match the icons in /solr/img/filetypes
-#set($extMap = {"application/x-7z-compressed": "7z",
- "application/postscript": "ai",
- "application/pgp-signature": "asc",
- "application/octet-stream": "bin",
- "application/x-bzip2": "bz2",
- "text/x-c": "c",
- "application/vnd.ms-htmlhelp": "chm",
- "application/java-vm": "class",
- "text/css": "css",
- "text/csv": "csv",
- "application/x-debian-package": "deb",
- "application/msword": "doc",
- "message/rfc822": "eml",
- "image/gif": "gif",
- "application/winhlp": "hlp",
- "text/html": "html",
- "application/java-archive": "jar",
- "text/x-java-source": "java",
- "image/jpeg": "jpeg",
- "application/javascript": "js",
- "application/vnd.oasis.opendocument.chart": "odc",
- "application/vnd.oasis.opendocument.formula": "odf",
- "application/vnd.oasis.opendocument.graphics": "odg",
- "application/vnd.oasis.opendocument.image": "odi",
- "application/vnd.oasis.opendocument.presentation": "odp",
- "application/vnd.oasis.opendocument.spreadsheet": "ods",
- "application/vnd.oasis.opendocument.text": "odt",
- "application/pdf": "pdf",
- "application/pgp-encrypted": "pgp",
- "image/png": "png",
- "application/vnd.ms-powerpoint": "ppt",
- "audio/x-pn-realaudio": "ram",
- "application/x-rar-compressed": "rar",
- "application/vnd.rn-realmedia": "rm",
- "application/rtf": "rtf",
- "application/x-shockwave-flash": "swf",
- "application/vnd.sun.xml.calc": "sxc",
- "application/vnd.sun.xml.draw": "sxd",
- "application/vnd.sun.xml.impress": "sxi",
- "application/vnd.sun.xml.writer": "sxw",
- "application/x-tar": "tar",
- "application/x-tex": "tex",
- "text/plain": "txt",
- "text/x-vcard": "vcf",
- "application/vnd.visio": "vsd",
- "audio/x-wav": "wav",
- "audio/x-ms-wma": "wma",
- "video/x-ms-wmv": "wmv",
- "application/vnd.ms-excel": "xls",
- "application/xml": "xml",
- "application/x-xpinstall": "xpi",
- "application/zip": "zip"})
-
-
-#if($doc.getFieldValue('title'))
- #set($title = $esc.html($doc.getFirstValue('title')))
-#else
- #set($title = "["+$doc.getFieldValue('id')+"]")
-#end
-#if($doc.getFieldValue('url'))
- #set($url = $doc.getFieldValue('url'))
-#elseif($doc.getFieldValue('resourcename'))
- #set($url = "file:///$doc.getFieldValue('resourcename')")
-#else
- #set($url = "$doc.getFieldValue('id')")
-#end
-#set($supportedtypes = "7z;ai;aiff;asc;audio;bin;bz2;c;cfc;cfm;chm;class;conf;cpp;cs;css;csv;deb;divx;doc;dot;eml;enc;file;gif;gz;hlp;htm;html;image;iso;jar;java;jpeg;jpg;js;lua;m;mm;mov;mp3;mpg;odc;odf;odg;odi;odp;ods;odt;ogg;pdf;pgp;php;pl;png;ppt;ps;py;ram;rar;rb;rm;rpm;rtf;sig;sql;swf;sxc;sxd;sxi;sxw;tar;tex;tgz;txt;vcf;video;vsd;wav;wma;wmv;xls;xml;xpi;xvid;zip")
-#set($ct = $list.get($doc.getFirstValue('content_type').split(";"),0))
-#set($filename = $doc.getFieldValue('resourcename'))
-
-#set($filetype = false)
-#set($filetype = $extMap.get($ct))
-##TODO: falling back to file extension is convenient, except when you don't have an icon for that extension
-## example "application/vnd.openxmlformats-officedocument.wordprocessingml.document" document
-## with a .docx extension. It'd be nice to fall back to an "unknown" or the existing "file" type
-## We sort of do this below, but only if the filename has no extension (anything after the last dot).
-#if(!$filetype)#set($filetype = $filename.substring($filename.lastIndexOf(".")).substring(1))#end
-##if(!$filetype)#set($filetype = "file")#end
-##if(!$supportedtypes.contains($filetype))#set($filetype = "file")#end
-
-## Small file type icons from http://www.splitbrain.org/projects/file_icons (public domain)
-
-$title #if($params.getBool('mlt', false) == false)More Like This#end