ni_nitdoc: moved QuickSearch js to it's own file
authorAlexandre Terrasa <alexandre@moz-code.org>
Thu, 12 Sep 2013 05:26:20 +0000 (01:26 -0400)
committerAlexandre Terrasa <alexandre@moz-code.org>
Thu, 12 Sep 2013 05:26:20 +0000 (01:26 -0400)
Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>

share/ni_nitdoc/scripts/Nitdoc.QuickSearch.js [new file with mode: 0644]
share/ni_nitdoc/scripts/js-facilities.js
src/ni_nitdoc.nit

diff --git a/share/ni_nitdoc/scripts/Nitdoc.QuickSearch.js b/share/ni_nitdoc/scripts/Nitdoc.QuickSearch.js
new file mode 100644 (file)
index 0000000..101bde3
--- /dev/null
@@ -0,0 +1,244 @@
+/*
+ *     QuickSearch
+ */
+
+// Current search results preview table
+var currentTable = null;
+
+//Hightlighted index in search result preview table
+var currentIndex = -1;
+
+$(document).ready(function() {
+
+       // Insert search field
+       $("nav.main ul")
+       .append(
+               $(document.createElement("li"))
+               .append(
+                       $(document.createElement("form"))
+                       .append(
+                               $(document.createElement("input"))
+                               .attr({
+                                       id: "search",
+                                       type:   "text",
+                                       autocomplete: "off",
+                                       value: "quick search..."
+                               })
+                               .addClass("notUsed")
+
+                               // Key management
+                               .keyup(function(e) {
+                                       switch(e.keyCode) {
+                                               // Up
+                                               case 38:
+                                                       Nitdoc.QuickSearch.selectPrevResult();
+                                               break;
+
+                                               // Down
+                                               case 40:
+                                                       Nitdoc.QuickSearch.selectNextResult();
+                                               break;
+                                               // Enter
+                                               case 13:
+                                                       Nitdoc.QuickSearch.goToResult();
+                                                       return false;
+                                               break;
+
+                                               // Escape
+                                               case 27:
+                                                       $(this).blur();
+                                                       Nitdoc.QuickSearch.close();
+                                               break;
+
+                                               // Other keys
+                                               default:
+                                                       var query = $("#search").val();
+                                                       if(!query) {
+                                                               return false;
+                                                       }
+                                                       var results = Nitdoc.QuickSearch.search(query);
+                                                       Nitdoc.QuickSearch.showResults(query, results);
+                                               break;
+                                       }
+                               })
+                               .focusout(function() {
+                                       if($(this).val() == "") {
+                                               $(this).addClass("notUsed");
+                                               $(this).val("quick search...");
+                                       }
+                               })
+                               .focusin(function() {
+                                       if($(this).val() == "quick search...") {
+                                               $(this).removeClass("notUsed");
+                                               $(this).val("");
+                                       }
+                               })
+                       )
+                       .submit( function() {
+                               return false;
+                       })
+               )
+        );
+
+        // Close quicksearch list on click
+        $(document).click(function(e) {
+               Nitdoc.QuickSearch.close();
+        });
+});
+
+var Nitdoc = {};
+Nitdoc.QuickSearch = {};
+
+// Do search
+Nitdoc.QuickSearch.search = function(query) {
+       // Escape regexp related characters in query
+       query = query.replace(/\\/gi, "\\\\");
+       query = query.replace(/\[/gi, "\\[");
+       query = query.replace(/\|/gi, "\\|");
+       query = query.replace(/\*/gi, "\\*");
+       query = query.replace(/\+/gi, "\\+");
+       query = query.replace(/\?/gi, "\\?");
+       query = query.replace(/\(/gi, "\\(");
+       query = query.replace(/\)/gi, "\\)");
+       query = query.replace(/&/gi, "&&");
+       // Look for matches in JSON entries
+       var results = new Array();
+       var regexp = new RegExp("^" + query, "i");
+       for(var entry in entries) {
+               var match = entry.match(regexp);
+               if(match != null) {
+                       for(var i in entries[entry]) {
+                               var result = entries[entry][i];
+                               result.entry = entry;
+                               results[results.length] = result;
+                       }
+               }
+       }
+       return results;
+}
+
+// Display resulsts in popup table
+Nitdoc.QuickSearch.showResults = function(query, results) {
+       // Remove previous table
+       if(currentTable != null) {
+               currentTable.remove();
+       }
+       // Build results table
+       currentIndex = -1;
+       currentTable = $(document.createElement("table"));
+       var overflow = 0;
+       for(var i in results) {
+               if(i > 10) {
+                       overflow++;
+                       break;
+               }
+               var result = results[i];
+               currentTable.append(
+                       $(document.createElement("tr"))
+                       .data("searchDetails", {name: result.entry, url: result.url})
+                       .data("index", i)
+                       .append($(document.createElement("td")).html(result.entry))
+                       .append(
+                               $(document.createElement("td"))
+                                       .addClass("entryInfo")
+                                       .html(result.txt + "&nbsp;&raquo;")
+                       )
+                       .mouseover( function() {
+                               $(currentTable.find("tr")[currentIndex]).removeClass("activeSearchResult");
+                               $(this).addClass("activeSearchResult");
+                               currentIndex = $(this).data("index");
+                       })
+                       .mouseout( function() {
+                               $(this).removeClass("activeSearchResult");
+                        })
+                       .click( function() {
+                               window.location = $(this).data("searchDetails")["url"];
+                       })
+               );
+       }
+       if(overflow > 0) {
+               currentTable.append(
+                       $("<tr class='overflow'>")
+                       .append(
+                               $("<td colspan='2'>")
+                               .append(
+                                       $("<a href='#' title='Show all results' data-query='"+ query +"'>" + overflow + " more results for '" + query + "'</a>")
+                                       .click(function() {
+                                               window.location = "search.html#q=" + $(this).attr("data-query");
+                                               if(window.location.href.indexOf("search.html") > -1) {
+                                                       location.reload();
+                                               }
+                                       })
+                               )
+                       )
+               );
+       }
+       // Initialize table properties
+       currentTable.attr("id", "searchTable");
+       currentTable.css("position", "absolute");
+       currentTable.width($("#search").outerWidth());
+       $("body").append(currentTable);
+       currentTable.offset({left: $("#search").offset().left + ($("#search").outerWidth() - currentTable.outerWidth()), top: $("#search").offset().top + $("#search").outerHeight()});
+       // Preselect first entry
+       if(currentTable.find("tr").length > 0) {
+               currentIndex = 0;
+               $(currentTable.find("tr")[currentIndex]).addClass("activeSearchResult");
+               $("#search").focus();
+       }
+}
+
+// Select the previous result
+Nitdoc.QuickSearch.selectPrevResult = function() {
+       // If already on first result, focus search input
+       if(currentIndex == 0) {
+               $("#search").val($(currentTable.find("tr")[currentIndex]).data("searchDetails").name);
+               $("#search").focus();
+       // Else select previous result
+       } else if(currentIndex > 0) {
+               $(currentTable.find("tr")[currentIndex]).removeClass("activeSearchResult");
+               currentIndex--;
+               $(currentTable.find("tr")[currentIndex]).addClass("activeSearchResult");
+               $("#search").val($(currentTable.find("tr")[currentIndex]).data("searchDetails").name);
+               $("#search").focus();
+       }
+}
+
+// Select the next result
+Nitdoc.QuickSearch.selectNextResult = function() {
+       if(currentIndex < currentTable.find("tr").length - 1) {
+               if($(currentTable.find("tr")[currentIndex + 1]).hasClass("overflow")) {
+                       return;
+               }
+               $(currentTable.find("tr")[currentIndex]).removeClass("activeSearchResult");
+               currentIndex++;
+               $(currentTable.find("tr")[currentIndex]).addClass("activeSearchResult");
+               $("#search").val($(currentTable.find("tr")[currentIndex]).data("searchDetails").name);
+               $("#search").focus();
+       }
+}
+
+// Load selected search result
+Nitdoc.QuickSearch.goToResult = function() {
+       if(currentIndex > -1) {
+               window.location = $(currentTable.find("tr")[currentIndex]).data("searchDetails").url;
+               return;
+       }
+
+       if($("#search").val().length == 0) { return; }
+
+       window.location = "search.html#q=" + $("#search").val();
+       if(window.location.href.indexOf("search.html") > -1) {
+               location.reload();
+       }
+}
+
+// Close the QuickSearch results
+Nitdoc.QuickSearch.close = function(target) {
+       if(target != $("#search")[0] && target != $("#searchTable")[0]) {
+               if(currentTable != null) {
+                       currentTable.remove();
+                       currentTable = null;
+               }
+       }
+}
+
index 5643e33..611f44b 100644 (file)
@@ -4,25 +4,12 @@
 $.expr[':'].icontains = function(obj, index, meta, stack){\r
        return (obj.textContent.replace(/\[[0-9]+\]/g, "") || obj.innerText.replace(/\[[0-9]+\]/g, "") || jQuery(obj).text().replace(/\[[0-9]+\]/g, "") || '').toLowerCase().indexOf(meta[3].toLowerCase()) >= 0;\r
 };\r
-/*\r
- *     Quick Search global vars\r
- */\r
-\r
-// Current search results preview table\r
-var currentTable = null;\r
-\r
-//Hightlighted index in search result preview table\r
-var currentIndex = -1;\r
 \r
 /*\r
 * Add folding and filtering facilities to class description page.\r
 */\r
 $(document).ready(function() {\r
 \r
-       /*\r
-       * Nav block folding\r
-       */\r
-\r
        // Menu nav folding\r
        $(".menu nav h3")\r
        .prepend(\r
@@ -40,205 +27,6 @@ $(document).ready(function() {
                        $(this).nextAll().toggle();\r
        })\r
 \r
-       // Insert search field\r
-       $("nav.main ul")\r
-       .append(\r
-               $(document.createElement("li"))\r
-               .append(\r
-                       $(document.createElement("form"))\r
-                       .append(\r
-                               $(document.createElement("input"))\r
-                               .attr({\r
-                                       id: "search",\r
-                                       type:   "text",\r
-                                       autocomplete: "off",\r
-                                       value: "quick search..."\r
-                               })\r
-                               .addClass("notUsed")\r
-\r
-                               // Key management\r
-                               .keyup(function(e) {\r
-                                       switch(e.keyCode) {\r
-                                               // Select previous result on "Up"\r
-                                               case 38:\r
-                                                       // If already on first result, focus search input\r
-                                                       if(currentIndex == 0) {\r
-                                                               $("#search").val($(currentTable.find("tr")[currentIndex]).data("searchDetails").name);\r
-                                                               $("#search").focus();\r
-                                                       // Else select previous result\r
-                                                       } else if(currentIndex > 0) {\r
-                                                               $(currentTable.find("tr")[currentIndex]).removeClass("activeSearchResult");\r
-                                                               currentIndex--;\r
-                                                               $(currentTable.find("tr")[currentIndex]).addClass("activeSearchResult");\r
-                                                               $("#search").val($(currentTable.find("tr")[currentIndex]).data("searchDetails").name);\r
-                                                               $("#search").focus();\r
-                                                       }\r
-                                               break;\r
-\r
-                                               // Select next result on "Down"\r
-                                               case 40:\r
-                                                       if(currentIndex < currentTable.find("tr").length - 1) {\r
-                                                               if($(currentTable.find("tr")[currentIndex + 1]).hasClass("overflow")) {\r
-                                                                       break;\r
-                                                               }\r
-                                                               $(currentTable.find("tr")[currentIndex]).removeClass("activeSearchResult");\r
-                                                               currentIndex++;\r
-                                                               $(currentTable.find("tr")[currentIndex]).addClass("activeSearchResult");\r
-                                                               $("#search").val($(currentTable.find("tr")[currentIndex]).data("searchDetails").name);\r
-                                                               $("#search").focus();\r
-                                                       }\r
-                                               break;\r
-                                               // Go to url on "Enter"\r
-                                               case 13:\r
-                                                       if(currentIndex > -1) {\r
-                                                               window.location = $(currentTable.find("tr")[currentIndex]).data("searchDetails").url;\r
-                                                               return false;\r
-                                                       }\r
-                                                       if($("#search").val().length == 0)\r
-                                                               return false\r
-\r
-                                                       window.location = "search.html#q=" + $("#search").val();\r
-                                                       if(window.location.href.indexOf("search.html") > -1) {\r
-                                                               location.reload();\r
-                                                       }\r
-                                                       return false;\r
-                                               break;\r
-\r
-                                               // Hide results preview on "Escape"\r
-                                               case 27:\r
-                                                       $(this).blur();\r
-                                                       if(currentTable != null) {\r
-                                                               currentTable.remove();\r
-                                                               currentTable = null;\r
-                                                       }\r
-                                               break;\r
-\r
-                                               default:\r
-                                                       if($("#search").val().length == 0) {\r
-                                                               return false;\r
-                                                       }\r
-\r
-                                                       // Remove previous table\r
-                                                       if(currentTable != null) {\r
-                                                               currentTable.remove();\r
-                                                       }\r
-\r
-                                                       // Build results table\r
-                                                       currentIndex = -1;\r
-                                                       currentTable = $(document.createElement("table"));\r
-\r
-                                                       // Escape regexp related characters in query\r
-                                                       var origQuery = $("#search").val();\r
-                                                       var query = origQuery;\r
-                                                       query = query.replace(/\\/gi, "\\\\");\r
-                                                       query = query.replace(/\[/gi, "\\[");\r
-                                                       query = query.replace(/\|/gi, "\\|");\r
-                                                       query = query.replace(/\*/gi, "\\*");\r
-                                                       query = query.replace(/\+/gi, "\\+");\r
-                                                       query = query.replace(/\?/gi, "\\?");\r
-                                                       query = query.replace(/\(/gi, "\\(");\r
-                                                       query = query.replace(/\)/gi, "\\)");\r
-                                                       query = query.replace(/&/gi, "&&");\r
-\r
-                                                       var index = 0;\r
-                                                       var regexp = new RegExp("^" + query);\r
-                                                       var overflow = 0;\r
-                                                       for(var entry in entries) {\r
-                                                               var result = entry.match(regexp);\r
-                                                               if(result != null) {\r
-                                                                       for(var i = 0; i < entries[entry].length; i++) {\r
-                                                                               if(index > 10) {\r
-                                                                                       overflow++;\r
-                                                                                       break;\r
-                                                                               }\r
-                                                                               currentTable.append(\r
-                                                                                       $(document.createElement("tr"))\r
-                                                                                       .data("searchDetails", {name: entry, url: entries[entry][i]["url"]})\r
-                                                                                       .data("index", index)\r
-                                                                                       .append($(document.createElement("td")).html(entry))\r
-                                                                                       .append(\r
-                                                                                               $(document.createElement("td"))\r
-                                                                                                       .addClass("entryInfo")\r
-                                                                                                       .html(entries[entry][i]["txt"] + "&nbsp;&raquo;"))\r
-                                                                                       .mouseover( function() {\r
-                                                                                               $(currentTable.find("tr")[currentIndex]).removeClass("activeSearchResult");\r
-                                                                                               $(this).addClass("activeSearchResult");\r
-                                                                                               currentIndex = $(this).data("index");\r
-                                                                                       })\r
-                                                                                       .mouseout( function() {\r
-                                                                                               $(this).removeClass("activeSearchResult");\r
-                                                                                        })\r
-                                                                                       .click( function() {\r
-                                                                                               window.location = $(this).data("searchDetails")["url"];\r
-                                                                                       })\r
-                                                                               );\r
-                                                                               index++;\r
-                                                                       }\r
-                                                               }\r
-                                                       }\r
-                                                       if(overflow > 0) {\r
-                                                               currentTable.append(\r
-                                                                       $("<tr class='overflow'>")\r
-                                                                       .append(\r
-                                                                               $("<td colspan='2'>")\r
-                                                                               .append(\r
-                                                                                       $("<a href='#' title='Show all results' data-query='"+ origQuery +"'>" + overflow + " more results for '" + origQuery + "'</a>")\r
-                                                                                       .click(function() {\r
-                                                                                               window.location = "search.html#q=" + $(this).attr("data-query");\r
-                                                                                               if(window.location.href.indexOf("search.html") > -1) {\r
-                                                                                                       location.reload();\r
-                                                                                               }\r
-                                                                                       })\r
-                                                                               )\r
-                                                                       )\r
-                                                               );\r
-                                                       }\r
-\r
-                                                       // Initialize table properties\r
-                                                       currentTable.attr("id", "searchTable");\r
-                                                       currentTable.css("position", "absolute");\r
-                                                       currentTable.width($("#search").outerWidth());\r
-                                                       $("header").append(currentTable);\r
-                                                       currentTable.offset({left: $("#search").offset().left + ($("#search").outerWidth() - currentTable.outerWidth()), top: $("#search").offset().top + $("#search").outerHeight()});\r
-\r
-                                                       // Preselect first entry\r
-                                                       if(currentTable.find("tr").length > 0) {\r
-                                                               currentIndex = 0;\r
-                                                               $(currentTable.find("tr")[currentIndex]).addClass("activeSearchResult");\r
-                                                               $("#search").focus();\r
-                                                       }\r
-                                               break;\r
-                                       }\r
-                               })\r
-                               .focusout(function() {\r
-                                       if($(this).val() == "") {\r
-                                               $(this).addClass("notUsed");\r
-                                               $(this).val("quick search...");\r
-                                       }\r
-                               })\r
-                               .focusin(function() {\r
-                                       if($(this).val() == "quick search...") {\r
-                                               $(this).removeClass("notUsed");\r
-                                               $(this).val("");\r
-                                       }\r
-                               })\r
-                       )\r
-                       .submit( function() {\r
-                               return false;\r
-                       })\r
-               )\r
-        );\r
-\r
-        // Close quicksearch list on click\r
-        $(document).click(function(e) {\r
-               if(e.target != $("#search")[0] && e.target != $("#searchTable")[0]) {\r
-                       if(currentTable != null) {\r
-                               currentTable.remove();\r
-                               currentTable = null;\r
-                       }\r
-               }\r
-        });\r
-\r
        // Insert filter field\r
        $("article.filterable h2, nav.filterable h3")\r
        .after(\r
index 155f90f..61f9f7a 100644 (file)
@@ -215,6 +215,7 @@ abstract class NitdocPage
                append("<script type='text/javascript' src='scripts/base64.js'></script>")
                append("<script type='text/javascript' src='scripts/github.js'></script>")
                append("<script type='text/javascript' src='scripts/js-facilities.js'></script>")
+               append("<script type='text/javascript' src='scripts/Nitdoc.QuickSearch.js'></script>")
                append("<link rel='stylesheet' href='styles/main.css' type='text/css' media='screen'/>")
                append("<link rel='stylesheet' href='styles/github.css' type='text/css' media='screen'/>")
                var title = ""