engine.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. /* global hexo */
  2. 'use strict';
  3. const crypto = require('crypto');
  4. hexo.extend.helper.register('next_inject', function(point) {
  5. return hexo.theme.config.injects[point]
  6. .map(item => this.partial(item.layout, item.locals, item.options))
  7. .join('');
  8. });
  9. hexo.extend.helper.register('next_js', function(...urls) {
  10. const { js } = hexo.theme.config;
  11. return urls.map(url => this.js(`${js}/${url}`)).join('');
  12. });
  13. hexo.extend.helper.register('next_vendors', function(url) {
  14. if (url.startsWith('//')) return url;
  15. const internal = hexo.theme.config.vendors._internal;
  16. return this.url_for(`${internal}/${url}`);
  17. });
  18. hexo.extend.helper.register('post_edit', function(src) {
  19. const theme = hexo.theme.config;
  20. if (!theme.post_edit.enable) return '';
  21. return this.next_url(theme.post_edit.url + src, '<i class="fa fa-pencil-alt"></i>', {
  22. class: 'post-edit-link',
  23. title: this.__('post.edit')
  24. });
  25. });
  26. hexo.extend.helper.register('post_nav', function(post) {
  27. const theme = hexo.theme.config;
  28. if (theme.post_navigation === false || (!post.prev && !post.next)) return '';
  29. const prev = theme.post_navigation === 'right' ? post.prev : post.next;
  30. const next = theme.post_navigation === 'right' ? post.next : post.prev;
  31. const left = prev ? `
  32. <a href="${this.url_for(prev.path)}" rel="prev" title="${prev.title}">
  33. <i class="fa fa-chevron-left"></i> ${prev.title}
  34. </a>` : '';
  35. const right = next ? `
  36. <a href="${this.url_for(next.path)}" rel="next" title="${next.title}">
  37. ${next.title} <i class="fa fa-chevron-right"></i>
  38. </a>` : '';
  39. return `
  40. <div class="post-nav">
  41. <div class="post-nav-item">${left}</div>
  42. <div class="post-nav-item">${right}</div>
  43. </div>`;
  44. });
  45. hexo.extend.helper.register('gitalk_md5', function(path) {
  46. let str = this.url_for(path);
  47. str.replace('index.html', '');
  48. return crypto.createHash('md5').update(str).digest('hex');
  49. });
  50. hexo.extend.helper.register('canonical', function() {
  51. // https://support.google.com/webmasters/answer/139066
  52. const { permalink } = hexo.config;
  53. let url = this.url.replace(/index\.html$/, '');
  54. if (!permalink.endsWith('.html')) {
  55. url = url.replace(/\.html$/, '');
  56. }
  57. return `<link rel="canonical" href="${url}">`;
  58. });
  59. /**
  60. * Get page path given a certain language tag
  61. */
  62. hexo.extend.helper.register('i18n_path', function(language) {
  63. const { path, lang } = this.page;
  64. const base = path.startsWith(lang) ? path.slice(lang.length + 1) : path;
  65. return this.url_for(`${this.languages.indexOf(language) === 0 ? '' : '/' + language}/${base}`);
  66. });
  67. /**
  68. * Get the language name
  69. */
  70. hexo.extend.helper.register('language_name', function(language) {
  71. const name = hexo.theme.i18n.__(language)('name');
  72. return name === 'name' ? language : name;
  73. });