/* global hexo */ 'use strict'; const { resolve, basename } = require('path'); const { readFileSync } = require('fs'); const cheerio = require('cheerio'); const lunr = require('lunr'); const full_url_for = hexo.extend.helper.get('full_url_for').bind(hexo); const localizedPath = ['tutorials', 'filters', 'tags', 'playground', 'api']; hexo.extend.helper.register('page_nav', function() { const type = this.page.canonical_path.split('/')[0]; const sidebar = this.site.data.sidebar[type]; const path = basename(this.path); const list = {}; const prefix = 'sidebar.' + type + '.'; for (const i in sidebar) { if (typeof sidebar[i] === 'string') list[sidebar[i]] = i; else for (const j in sidebar[i]) list[sidebar[i][j]] = j; } const keys = Object.keys(list); const index = keys.indexOf(path); let result = ''; if (index > 0) { result += `${this.__('page.prev')}`; } if (index < keys.length - 1) { result += `${this.__('page.next')}`; } return result; }); hexo.extend.helper.register('raw', function(filepath) { const content = readFileSync(resolve(this.view_dir, filepath)); return content; }); hexo.extend.helper.register('doc_sidebar', function(className) { const type = this.page.canonical_path.split('/')[0]; const sidebar = this.site.data.sidebar[type]; const path = basename(this.path); let result = ''; const self = this; const prefix = 'sidebar.' + type + '.'; if (typeof sidebar === 'undefined') { return ''; } for (const [title, menu] of Object.entries(sidebar)) { if (typeof menu === 'string') renderLink(title, menu); else renderSection(title, menu); } return result; function renderLink(text, link) { let itemClass = className + '-link'; if (link === path) itemClass += ' current'; const localized = self.__(prefix + text) === prefix + text ? text : self.__(prefix + text); result += '' + localized + ''; } function renderSection(title, menu) { result += '' + self.__(prefix + title) + ''; for (const [text, link] of Object.entries(menu)) renderLink(text, link); } }); hexo.extend.helper.register('header_menu', function(className) { const menu = this.site.data.menu; let result = ''; const self = this; const lang = this.page.lang; const isEnglish = lang === 'en'; for (const [title, path] of Object.entries(menu)) { let langPath = path; if (!isEnglish && ~localizedPath.indexOf(title)) langPath = lang + path; const url = self.url_for(langPath); const active = ('/' + this.page.canonical_path).slice(0, path.length) === path ? ' active' : ''; result += `${self.__('menu.' + title)}`; } return result; }); hexo.extend.helper.register('canonical_url', function(lang) { let path = this.page.path; if (lang && lang !== 'en') path = lang + '/' + path; return full_url_for(path); }); hexo.extend.helper.register('url_for_lang', function(path) { const lang = this.page.lang; let url = this.url_for(path); if (lang !== 'en' && path[0] === '/') url = '/' + lang + path; return url; }); hexo.extend.helper.register('raw_link', path => `https://github.com/hexojs/site/edit/master/source/${path}`); hexo.extend.helper.register('page_anchor', str => { const $ = cheerio.load(str, {decodeEntities: false}); const headings = $('h1, h2, h3, h4, h5, h6'); if (!headings.length) return str; headings.each(function() { const id = $(this).attr('id'); $(this) .addClass('article-heading') .append(``); }); return $.html(); }); // Will be replace with full_url_for after hexo v4 release hexo.extend.helper.register('canonical_path_for_nav', function() { const path = this.page.canonical_path; for (const slug of localizedPath) if (path.startsWith(slug)) return path; return ''; }); hexo.extend.helper.register('lang_name', function(lang) { const data = this.site.data.languages[lang]; return data.name || data; }); hexo.extend.helper.register('hexo_version', function() { return this.env.version; });