snipplrCallback({"id":63962,"title":"javascript-search-indexer","source":"
  1. importPackage(<\/span>java.io<\/span>)<\/span>;<\/span><\/div><\/li>
  2. load(<\/span>".\/rhino\/lib.js"<\/span>)<\/span>;<\/span><\/div><\/li>
  3.  <\/div><\/li>
  4. var<\/span> rootPath =<\/span> arguments[<\/span>0<\/span>]<\/span>;<\/span><\/div><\/li>
  5. var<\/span> startPath=<\/span> new<\/span> File(<\/span>rootPath)<\/span>;<\/span><\/div><\/li>
  6. var<\/span> fileList =<\/span> directoryList(<\/span>startPath.getCanonicalPath<\/span>(<\/span>)<\/span>)<\/span>;<\/span><\/div><\/li>
  7. var<\/span> fileList =<\/span> filterDirectoryList(<\/span>fileList,<\/span> true<\/span>,<\/span> "html"<\/span>)<\/span>;<\/span><\/div><\/li>
  8. var<\/span> searchIndex =<\/span> indexFiles(<\/span>fileList,<\/span> rootPath)<\/span>;<\/span><\/div><\/li>
  9.  <\/div><\/li>
  10.  <\/div><\/li>
  11. serializeToDisk(<\/span>searchIndex,<\/span> ".\/search\/searchindex.js"<\/span>,<\/span> true<\/span>)<\/span>;<\/span><\/div><\/li>
  12. serializeToDisk(<\/span>searchIndex,<\/span> rootPath +<\/span> "\/search\/searchindex.js"<\/span>)<\/span>;<\/span><\/div><\/li>
  13.  <\/div><\/li>
  14. function<\/span> indexFiles(<\/span>fileList,<\/span> rootPath)<\/span>{<\/span><\/div><\/li>
  15. \tvar<\/span> searchIndex =<\/span> [<\/span>]<\/span>;<\/span><\/div><\/li>
  16. \tfor<\/span> (<\/span>var<\/span> i =<\/span> 0<\/span>;<\/span> i <<\/span> fileList.length<\/span>;<\/span> i++<\/span>)<\/span>{<\/span><\/div><\/li>
  17. \t\tvar<\/span> fileToRead =<\/span> fileList[<\/span>i]<\/span>[<\/span>'path'<\/span>]<\/span>;<\/span><\/div><\/li>
  18.  <\/div><\/li>
  19. \t\tvar<\/span> contentFilter =<\/span> fileToRead.indexOf<\/span>(<\/span>"\/articles\/"<\/span>)<\/span> +<\/span> fileToRead.indexOf<\/span>(<\/span>"\/tags\/"<\/span>)<\/span>;<\/span><\/div><\/li>
  20. \t\tvar<\/span> badFilter =<\/span> fileToRead.indexOf<\/span>(<\/span>"\/bad\/"<\/span>)<\/span><\/div><\/li>
  21. \t\tif<\/span> (<\/span>contentFilter ><\/span> 0<\/span> &&<\/span> badFilter <<\/span> 1<\/span>)<\/span>{<\/span><\/div><\/li>
  22. \t\t\tvar<\/span> resultSet =<\/span> indexContentPage(<\/span>fileToRead,<\/span> rootPath)<\/span>;<\/span><\/div><\/li>
  23.  <\/div><\/li>
  24. \t\t\t\/\/TODO: Go back and make this stuff optional in indexContentPage,<\/span><\/div><\/li>
  25. \t\t\t\/\/Adding stuff in the indexer required me to kill it from search json. <\/span><\/div><\/li>
  26. \t\t\tdelete<\/span> resultSet[<\/span>'filepath'<\/span>]<\/span>;<\/span><\/div><\/li>
  27. \t\t\tdelete<\/span> resultSet[<\/span>'contents'<\/span>]<\/span>;<\/span><\/div><\/li>
  28. \t\t\tresultSet[<\/span>'lastModified'<\/span>]<\/span> =<\/span> new<\/span> Date<\/span>(<\/span>resultSet[<\/span>'lastModified'<\/span>]<\/span>)<\/span>;<\/span><\/div><\/li>
  29.  <\/div><\/li>
  30. \t\t\tsearchIndex.push<\/span>(<\/span>resultSet)<\/span>;<\/span><\/div><\/li>
  31.  <\/div><\/li>
  32. \t\t}<\/span>\t<\/div><\/li>
  33. \t}<\/span><\/div><\/li>
  34. \treturn<\/span> searchIndex;<\/span><\/div><\/li>
  35. }<\/span><\/div><\/li>
  36.  <\/div><\/li>
  37. function<\/span> serializeToDisk(<\/span>content,<\/span> location,<\/span> prettyify)<\/span>{<\/span><\/div><\/li>
  38. \tvar<\/span> prettyify =<\/span> typeof<\/span> prettyify !==<\/span> 'undefined'<\/span> ?<\/span> prettyify :<\/span> false<\/span>;<\/span><\/div><\/li>
  39. \tvar<\/span> fstream =<\/span> new<\/span> FileWriter(<\/span>location)<\/span>;<\/span><\/div><\/li>
  40. \tvar<\/span> out =<\/span> new<\/span> BufferedWriter(<\/span>fstream)<\/span>;<\/span><\/div><\/li>
  41. \tif<\/span> (<\/span>prettyify)<\/span>{<\/span><\/div><\/li>
  42. \t\tout.write<\/span>(<\/span>JSON.stringify<\/span>(<\/span>content,<\/span> null<\/span>,<\/span> 3<\/span>)<\/span>)<\/span>;<\/span><\/div><\/li>
  43. \t}<\/span><\/div><\/li>
  44. \telse<\/span>{<\/span><\/div><\/li>
  45. \t\tout.write<\/span>(<\/span>JSON.stringify<\/span>(<\/span>content)<\/span>)<\/span>;<\/span><\/div><\/li>
  46. \t}<\/span><\/div><\/li>
  47.  <\/div><\/li>
  48.  <\/div><\/li>
  49. \tout.close<\/span>(<\/span>)<\/span>;<\/span><\/div><\/li>
  50. }<\/span><\/div><\/li>
  51.  <\/div><\/li>
  52.  <\/div><\/li>
  53. importPackage(<\/span>java.io<\/span>)<\/span>;<\/span><\/div><\/li>
  54.  <\/div><\/li>
  55. function<\/span> directoryList(<\/span>startPath)<\/span>{<\/span><\/div><\/li>
  56. \tvar<\/span> fileObject=<\/span>new<\/span> File(<\/span>startPath)<\/span>;<\/span><\/div><\/li>
  57. \tvar<\/span> list =<\/span> fileObject.list<\/span>(<\/span>)<\/span>;<\/span><\/div><\/li>
  58. \tvar<\/span> results =<\/span> [<\/span>]<\/span>;<\/span> <\/div><\/li>
  59.  <\/div><\/li>
  60. \tfor<\/span> (<\/span>var<\/span> i=<\/span>0<\/span>;<\/span> i<<\/span>list.length<\/span>;<\/span> i++<\/span>)<\/span> {<\/span><\/div><\/li>
  61. \t var<\/span> child =<\/span> new<\/span> File(<\/span>startPath +<\/span> "\/"<\/span> +<\/span> list[<\/span>i]<\/span>)<\/span>;<\/span><\/div><\/li>
  62.  <\/div><\/li>
  63. \t if<\/span> (<\/span>child.isDirectory<\/span>(<\/span>)<\/span>)<\/span>{<\/span><\/div><\/li>
  64. \t \tvar<\/span> recurseDirectoryListing =<\/span> directoryList(<\/span>child.getCanonicalPath<\/span>(<\/span>)<\/span>)<\/span>;<\/span><\/div><\/li>
  65. \t \tresults =<\/span> results.concat<\/span>(<\/span>recurseDirectoryListing)<\/span>;<\/span><\/div><\/li>
  66. \t }<\/span><\/div><\/li>
  67. \t else<\/span>{<\/span><\/div><\/li>
  68. \t \tvar<\/span> fileArray =<\/span> {<\/span>}<\/span>;<\/span><\/div><\/li>
  69. \t \tfileArray[<\/span>'path'<\/span>]<\/span> =<\/span> child.getCanonicalPath<\/span>(<\/span>)<\/span>;<\/span><\/div><\/li>
  70. \t \tfileArray[<\/span>'name'<\/span>]<\/span> =<\/span> child.getName<\/span>(<\/span>)<\/span>;<\/span><\/div><\/li>
  71. \t \tfileArray[<\/span>'parent'<\/span>]<\/span> =<\/span> child.getParent<\/span>(<\/span>)<\/span>;<\/span><\/div><\/li>
  72. \t \tfileArray[<\/span>'hidden'<\/span>]<\/span> =<\/span> child.isHidden<\/span>(<\/span>)<\/span>;<\/span><\/div><\/li>
  73. \t \tfileArray[<\/span>'dir'<\/span>]<\/span> =<\/span> child.isDirectory<\/span>(<\/span>)<\/span>;<\/span><\/div><\/li>
  74. \t \tfileArray[<\/span>'lastModified'<\/span>]<\/span> =<\/span> child.lastModified<\/span>(<\/span>)<\/span>;<\/span><\/div><\/li>
  75. \t \tvar<\/span> pos =<\/span> fileArray[<\/span>'name'<\/span>]<\/span>.lastIndexOf<\/span>(<\/span>'.'<\/span>)<\/span>;<\/span><\/div><\/li>
  76. \t \tif<\/span> (<\/span>pos <<\/span> 0<\/span>)<\/span>{<\/span><\/div><\/li>
  77. \t\t\t\tfileArray[<\/span>'ext'<\/span>]<\/span> =<\/span> ''<\/span>;<\/span><\/div><\/li>
  78. \t\t\t}<\/span>else<\/span>{<\/span><\/div><\/li>
  79. \t\t\t\tfileArray[<\/span>'ext'<\/span>]<\/span> =<\/span> fileArray[<\/span>'name'<\/span>]<\/span>.substring<\/span>(<\/span>pos+<\/span>1<\/span>)<\/span>;<\/span><\/div><\/li>
  80. \t\t\t}<\/span>\t<\/div><\/li>
  81.  <\/div><\/li>
  82. \t \tresults.push<\/span>(<\/span>fileArray)<\/span>;<\/span><\/div><\/li>
  83. \t }<\/span><\/div><\/li>
  84.  <\/div><\/li>
  85. \t}<\/span><\/div><\/li>
  86. \treturn<\/span> results;<\/span><\/div><\/li>
  87. }<\/span><\/div><\/li>
  88.  <\/div><\/li>
  89. function<\/span> filterDirectoryList(<\/span>directoryList,<\/span> filesOnly,<\/span> extension,<\/span> folderToTarget)<\/span>{<\/span><\/div><\/li>
  90.  <\/div><\/li>
  91. \tvar<\/span> filesOnly =<\/span> typeof<\/span> filesOnly !==<\/span> 'undefined'<\/span> ?<\/span> filesOnly :<\/span> false<\/span>;<\/span><\/div><\/li>
  92. \tvar<\/span> extension =<\/span> typeof<\/span> extension !==<\/span> 'undefined'<\/span> ?<\/span> extension :<\/span> ''<\/span>;<\/span><\/div><\/li>
  93. \tvar<\/span> folderToTarget =<\/span> typeof<\/span> folderToTarget !==<\/span> 'undefined'<\/span> ?<\/span> folderToTarget :<\/span> ''<\/span>;<\/span><\/div><\/li>
  94.  <\/div><\/li>
  95. \tvar<\/span> results =<\/span> [<\/span>]<\/span>;<\/span> <\/div><\/li>
  96.  <\/div><\/li>
  97. \tfor<\/span> (<\/span>var<\/span> i=<\/span>0<\/span>;<\/span> i<<\/span>directoryList.length<\/span>;<\/span> i++<\/span>)<\/span> {<\/span><\/div><\/li>
  98. \t\tvar<\/span> file =<\/span> directoryList[<\/span>i]<\/span>;<\/span><\/div><\/li>
  99.  <\/div><\/li>
  100. \t\tif<\/span> (<\/span>filesOnly &&<\/span> file.dir<\/span>)<\/span>{<\/span><\/div><\/li>
  101. \t\t\tcontinue<\/span>;<\/span><\/div><\/li>
  102. \t\t}<\/span><\/div><\/li>
  103.  <\/div><\/li>
  104. \t\tif<\/span> (<\/span>extension.length<\/span> ><\/span> 0<\/span> &&<\/span> (<\/span>file.ext<\/span> !=<\/span> extension)<\/span>)<\/span>{<\/span><\/div><\/li>
  105. \t\t\tcontinue<\/span>;<\/span><\/div><\/li>
  106. \t\t}<\/span><\/div><\/li>
  107.  <\/div><\/li>
  108. \t\tif<\/span> (<\/span>folderToTarget.length<\/span> ><\/span> 0<\/span> &&<\/span> file.path<\/span>.indexOf<\/span>(<\/span>folderToTarget)<\/span> <<\/span> 0<\/span>)<\/span>{<\/span><\/div><\/li>
  109. \t\t\tcontinue<\/span>;<\/span><\/div><\/li>
  110. \t\t}<\/span><\/div><\/li>
  111.  <\/div><\/li>
  112. \t\tresults.push<\/span>(<\/span>file)<\/span>;<\/span><\/div><\/li>
  113. \t}<\/span>\t<\/div><\/li>
  114. \treturn<\/span> results;<\/span><\/div><\/li>
  115. }<\/span><\/div><\/li>
  116.  <\/div><\/li>
  117. function<\/span> displayDirectoryList(<\/span>fileList)<\/span>{<\/span><\/div><\/li>
  118. \tfor<\/span> (<\/span>var<\/span> i=<\/span>0<\/span>;<\/span> i<<\/span>fileList.length<\/span>;<\/span> i++<\/span>)<\/span> {<\/span><\/div><\/li>
  119. \t\tprint(<\/span>fileList[<\/span>i]<\/span>[<\/span>'path'<\/span>]<\/span> )<\/span>;<\/span> <\/div><\/li>
  120. \t\tprint(<\/span>fileList[<\/span>i]<\/span>[<\/span>'lastModified'<\/span>]<\/span>)<\/span>;<\/span><\/div><\/li>
  121.  <\/div><\/li>
  122. \t}<\/span><\/div><\/li>
  123. }<\/span><\/div><\/li>
  124.  <\/div><\/li>
  125. function<\/span> displayIndexList(<\/span>indexList)<\/span>{<\/span><\/div><\/li>
  126. \tfor<\/span> (<\/span>var<\/span> i=<\/span>0<\/span>;<\/span> i<<\/span>indexList.length<\/span>;<\/span> i++<\/span>)<\/span> {<\/span><\/div><\/li>
  127. \t\tprint(<\/span>indexList[<\/span>i]<\/span>[<\/span>'url'<\/span>]<\/span> )<\/span>;<\/span><\/div><\/li>
  128. \t\tprint(<\/span>indexList[<\/span>i]<\/span>[<\/span>'title'<\/span>]<\/span> )<\/span>;<\/span><\/div><\/li>
  129. \t}<\/span>\t <\/div><\/li>
  130. }<\/span><\/div><\/li>
  131.  <\/div><\/li>
  132. function<\/span> createURLPath(<\/span>filePath,<\/span> rootPath)<\/span>{<\/span><\/div><\/li>
  133. \tvar<\/span> base =<\/span> filePath.replace<\/span>(<\/span>rootPath,<\/span> ""<\/span>)<\/span>;<\/span><\/div><\/li>
  134. \tbase =<\/span> base.replace<\/span>(<\/span>"index.html"<\/span>,<\/span> ""<\/span>)<\/span>;<\/span><\/div><\/li>
  135. \tbase =<\/span> base.replace<\/span>(<\/span>"\/tags\/"<\/span>,<\/span> "\/"<\/span>)<\/span>;<\/span><\/div><\/li>
  136. \tbase =<\/span> base.replace<\/span>(<\/span>"\/articles\/"<\/span>,<\/span> "\/"<\/span>)<\/span>;<\/span><\/div><\/li>
  137.  <\/div><\/li>
  138. \treturn<\/span> base;<\/span><\/div><\/li>
  139. }<\/span><\/div><\/li>
  140.  <\/div><\/li>
  141. function<\/span> grabBettwenTags(<\/span>html,<\/span> tag)<\/span>{<\/span><\/div><\/li>
  142. \tvar<\/span> tag =<\/span> typeof<\/span> tag !==<\/span> 'undefined'<\/span> ?<\/span> tag :<\/span> "p"<\/span>;<\/span><\/div><\/li>
  143. \tvar<\/span> start =<\/span> html.indexOf<\/span>(<\/span>"<"<\/span> +<\/span> tag,<\/span> html)<\/span> +<\/span> tag.length<\/span> +<\/span> 2<\/span>;<\/span><\/div><\/li>
  144. \tvar<\/span> end =<\/span> html.indexOf<\/span>(<\/span>"<\/"<\/span> +<\/span> tag,<\/span> start )<\/span>;<\/span><\/div><\/li>
  145. \treturn<\/span> html.slice<\/span>(<\/span>start,<\/span> end)<\/span>;<\/span><\/div><\/li>
  146. }<\/span><\/div><\/li>
  147.  <\/div><\/li>
  148. function<\/span> indexContentPage(<\/span>filePath,<\/span> rootPath)<\/span>{<\/span><\/div><\/li>
  149. \tvar<\/span> fileContents =<\/span> readFile(<\/span>filePath)<\/span>;<\/span><\/div><\/li>
  150. \tvar<\/span> resultSet =<\/span> {<\/span>}<\/span>;<\/span><\/div><\/li>
  151. \tresultSet[<\/span>'filepath'<\/span>]<\/span> =<\/span> String<\/span>(<\/span>filePath)<\/span>;<\/span><\/div><\/li>
  152. \tresultSet[<\/span>'url'<\/span>]<\/span> =<\/span> String<\/span>(<\/span>createURLPath(<\/span>filePath,<\/span> rootPath)<\/span>)<\/span>;<\/span><\/div><\/li>
  153. \tresultSet[<\/span>'title'<\/span>]<\/span> =<\/span> String<\/span>(<\/span>grabBettwenTags(<\/span>fileContents,<\/span> "h1"<\/span>)<\/span>)<\/span>;<\/span><\/div><\/li>
  154. \tresultSet[<\/span>'titleContents'<\/span>]<\/span> =<\/span> resultSet[<\/span>'title'<\/span>]<\/span>.replace<\/span>(<\/span>\/<(?:.|\\n)*?>\/gm<\/span>,<\/span> ''<\/span>)<\/span>;<\/span><\/div><\/li>
  155. \tresultSet[<\/span>'rawContents'<\/span>]<\/span> =<\/span> String<\/span>(<\/span>fileContents)<\/span>.replace<\/span>(<\/span>\/<(?:.|\\n)*?>\/gm<\/span>,<\/span> ''<\/span>)<\/span>;<\/span><\/div><\/li>
  156. \tresultSet[<\/span>'summary'<\/span>]<\/span> =<\/span> String<\/span>(<\/span>grabBettwenTags(<\/span>fileContents,<\/span> "p"<\/span>)<\/span>)<\/span>;<\/span><\/div><\/li>
  157. \tresultSet[<\/span>'lastModified'<\/span>]<\/span> =<\/span> File(<\/span>filePath)<\/span>.lastModified<\/span>(<\/span>)<\/span>;<\/span><\/div><\/li>
  158. \tresultSet[<\/span>'contents'<\/span>]<\/span> =<\/span> fileContents;<\/span><\/div><\/li>
  159. \treturn<\/span> resultSet;<\/span><\/div><\/li>
  160. }<\/span><\/div><\/li><\/ol><\/pre>","link":"https:\/\/snipplr.com\/view\/63962\/javascript-search-indexer"});