/* global hexo */ 'use strict'; var pathFn = require('path'); var _ = require('lodash'); var cheerio = require('cheerio'); var lunr = require('lunr'); var localizedPath = ['docs', 'api']; function startsWith(str, start) { return str.substring(0, start.length) === start; } hexo.extend.helper.register('page_nav', function() { var type = this.page.canonical_path.split('/')[0]; var sidebar = this.site.data.sidebar[type]; var path = pathFn.basename(this.path); var list = {}; var prefix = 'sidebar.' + type + '.'; for (var i in sidebar) { for (var j in sidebar[i]) { list[sidebar[i][j]] = j; } } var keys = Object.keys(list); var index = keys.indexOf(path); var result = ''; if (index > 0) { result += '' + '' + this.__('page.prev') + ''; } if (index < keys.length - 1) { result += '' + '' + this.__('page.next') + ''; } return result; }); hexo.extend.helper.register('doc_sidebar', function(className) { var type = this.page.canonical_path.split('/')[0]; var sidebar = this.site.data.sidebar[type]; var path = pathFn.basename(this.path); var result = ''; var self = this; var prefix = 'sidebar.' + type + '.'; _.each(sidebar, function(menu, title) { result += '' + self.__(prefix + title) + ''; _.each(menu, function(link, text) { var itemClass = className + '-link'; if (link === path) itemClass += ' current'; result += '' + self.__(prefix + text) + ''; }); }); return result; }); hexo.extend.helper.register('header_menu', function(className) { var menu = this.site.data.menu; var result = ''; var self = this; var lang = this.page.lang; var isEnglish = lang === 'en'; _.each(menu, function(path, title) { if (!isEnglish && ~localizedPath.indexOf(title)) path = lang + path; result += '' + self.__('menu.' + title) + ''; }); return result; }); hexo.extend.helper.register('canonical_url', function(lang) { var path = this.page.canonical_path; if (lang && lang !== 'en') path = lang + '/' + path; return this.config.url + '/' + path; }); hexo.extend.helper.register('url_for_lang', function(path) { var lang = this.page.lang; var url = this.url_for(path); if (lang !== 'en' && url[0] === '/') url = '/' + lang + url; return url; }); hexo.extend.helper.register('raw_link', function(path) { return 'https://github.com/hexojs/site/edit/master/source/' + path; }); hexo.extend.helper.register('page_anchor', function(str) { var $ = cheerio.load(str, {decodeEntities: false}); var headings = $('h1, h2, h3, h4, h5, h6'); if (!headings.length) return str; headings.each(function() { var id = $(this).attr('id'); $(this) .addClass('article-heading') .append(''); }); return $.html(); }); hexo.extend.helper.register('lunr_index', function(data) { var index = lunr(function() { this.field('name', {boost: 10}); this.field('tags', {boost: 50}); this.field('description'); this.ref('id'); _.sortBy(data, 'name').forEach((item, i) => { this.add(_.assign({ id: i }, item)); }); }); return JSON.stringify(index); }); hexo.extend.helper.register('canonical_path_for_nav', function() { var path = this.page.canonical_path; if (startsWith(path, 'docs/') || startsWith(path, 'api/')) { return path; } return ''; }); hexo.extend.helper.register('lang_name', function(lang) { var data = this.site.data.languages[lang]; return data.name || data; }); hexo.extend.helper.register('disqus_lang', function() { var lang = this.page.lang; var data = this.site.data.languages[lang]; return data.disqus_lang || lang; }); hexo.extend.helper.register('hexo_version', function() { return this.env.version; });