lunrHelper.js 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. var lunr = require('lunr'),
  2. cheerio = require('cheerio'),
  3. template = require('./template'),
  4. sanitizeHtml = require('sanitize-html'),
  5. path = require('jsdoc/path'),
  6. fs = require('jsdoc/fs'),
  7. helper = require('jsdoc/util/templateHelper');
  8. var store = exports.store = {};
  9. var index = exports.index = lunr(function(){
  10. this.field('longname', {boost: 1000});
  11. this.field('name', {boost: 500});
  12. this.field('tags', {boost: 300});
  13. this.field('kind', {boost: 110});
  14. this.field('title', {boost: 100});
  15. this.field('summary', {boost: 70});
  16. this.field('description', {boost: 50});
  17. this.field('body');
  18. this.ref('id');
  19. });
  20. var sanitize = function(html){
  21. if (typeof html !== 'string') return void 0;
  22. return sanitizeHtml(html, {allowedTags: [], allowedAttributes: []}).replace(/\s+/g, ' ').trim();
  23. };
  24. var _variations = function(parts){
  25. var result = [];
  26. result.push(parts.join('.'));
  27. if (parts.length > 1){
  28. parts.shift();
  29. result.push(_variations(parts));
  30. } else if (parts.length === 1){
  31. var instance = parts[0].indexOf('#');
  32. if (instance !== -1){
  33. result.push(parts[0].substr(instance + 1));
  34. }
  35. }
  36. return result.join(' ');
  37. };
  38. var variations = function(longname){
  39. if (typeof longname != 'string' || longname === '') return '';
  40. return _variations(longname.split('.'));
  41. };
  42. var tags = function(doclet){
  43. var result = [];
  44. if (doclet.longname && doclet.longname !== ''){
  45. result.push(variations(doclet.longname));
  46. }
  47. return result.join(' ');
  48. };
  49. var parseBody = function(html){
  50. if (!html || typeof html !== 'string') return;
  51. var $ = cheerio.load(html);
  52. return $('#main').text().replace(/\s+/g, ' ').trim();
  53. };
  54. var add = exports.add = function(doclet, html){
  55. var id = helper.longnameToUrl[doclet.longname];
  56. index.add(store[id] = {
  57. "id": id,
  58. "kind": doclet.kind,
  59. "title": doclet.pageTitle,
  60. "longname": doclet.longname,
  61. "name": doclet.name,
  62. "tags": tags(doclet),
  63. "summary": sanitize(helper.resolveLinks(doclet.summary)),
  64. "description": sanitize(helper.resolveLinks(doclet.classdesc || doclet.description)),
  65. "body": parseBody(html)
  66. });
  67. if (doclet.kind === 'class' || doclet.kind === 'namespace'){
  68. doclet.symbols.member.forEach(function(member){
  69. add(member);
  70. });
  71. doclet.symbols.function.forEach(function(fn){
  72. add(fn);
  73. });
  74. doclet.symbols.typedef.forEach(function(typedef){
  75. add(typedef);
  76. });
  77. }
  78. };
  79. exports.writeFilesSync = function(pretty){
  80. var jsonFile = path.join(template.config.dir.output, 'js/lunr-data.json'),
  81. dataFile = path.join(template.config.dir.output, 'js/lunr-data.js'),
  82. data = {index: index, store: store},
  83. json = pretty ? JSON.stringify(data, null, 2) : JSON.stringify(data);
  84. fs.writeFileSync(jsonFile, json, "utf8");
  85. fs.writeFileSync(dataFile, "window.lunrData = " + json + ";", "utf8");
  86. };