handlebarsHelper.js 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. var helper = require('jsdoc/util/templateHelper');
  2. var template = require('./template');
  3. var handlebars = require('handlebars');
  4. // require and register the layout helpers for handlebars
  5. require('handlebars-layouts').register(handlebars);
  6. var tmpl = exports.tmpl = require('../tmpl');
  7. exports.render = function(doclet, resolveLinks){
  8. var tmp = tmpl.doclet;
  9. if (tmpl[doclet.kind]){
  10. tmp = tmpl[doclet.kind];
  11. }
  12. var html = tmp({
  13. crumbs: template.createCrumbs(doclet),
  14. doclet: doclet,
  15. config: template.config,
  16. options: template.options,
  17. navbar: template.navbar
  18. });
  19. if (resolveLinks){
  20. html = helper.resolveLinks(html);
  21. }
  22. return html;
  23. };
  24. handlebars.registerHelper("json", function(context, options){
  25. try {
  26. return !!options.hash.pretty ? JSON.stringify(context, null, 2) : JSON.stringify(context);
  27. } catch(err) {
  28. return err.message;
  29. }
  30. });
  31. handlebars.registerHelper("symbol", function(doclet, options){
  32. var result = "", kind = doclet.kind;
  33. if (kind === 'class' && options.hash.primary){
  34. kind = 'function';
  35. }
  36. if (tmpl['symbol/'+kind]){
  37. result = tmpl['symbol/'+kind](doclet, {data: options.hash});
  38. } else if (template.kinds.pages.indexOf(kind) !== -1 && !options.hash.primary) {
  39. result = tmpl['symbol/page'](doclet, {data: options.hash});
  40. } else {
  41. result = tmpl['symbol/inline'](doclet, {data: options.hash});
  42. }
  43. return new handlebars.SafeString(result);
  44. });
  45. handlebars.registerHelper("type-names", function(type){
  46. var result = "";
  47. if (type && type.names && type.names.length){
  48. type.names.forEach(function(name, i){
  49. if (i > 0) result += ' | ';
  50. result += '<span class="param-type">'+helper.linkto(name, helper.htmlsafe(name))+'</span>';
  51. });
  52. }
  53. return new handlebars.SafeString(result);
  54. });
  55. handlebars.registerHelper("param-attribs", function(param){
  56. var result = "";
  57. if (param){
  58. if (param.optional){
  59. result += '&lt;optional&gt;<br/>'
  60. }
  61. if (param.nullable){
  62. result += '&lt;nullable&gt;<br/>'
  63. }
  64. if (param.variable){
  65. result += '&lt;repeatable&gt;<br/>'
  66. }
  67. }
  68. return new handlebars.SafeString(result);
  69. });
  70. handlebars.registerHelper("callout", function(title, classes, options){
  71. title = typeof title === 'string' ? title : '';
  72. classes = typeof classes === 'string' ? classes : 'callout-default';
  73. var result = '<div class="callout '+classes+'">';
  74. result += '<h5>'+title+'</h5>';
  75. result += options.fn(this);
  76. return result + '</div>';
  77. });
  78. handlebars.registerHelper("single", function(array, options){
  79. if (!array || !array.length) return "";
  80. if (array.length === 1){
  81. return options.fn(array[0]);
  82. }
  83. return options.inverse(this);
  84. });
  85. handlebars.registerHelper("linkto", function(longname){
  86. return new handlebars.SafeString(template.linkto(longname));
  87. });