12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061 |
- /* global hexo */
- 'use strict';
- const { htmlTag } = require('hexo-util');
- const url = require('url');
- hexo.extend.helper.register('next_url', function(path, text, options = {}) {
- const { config } = this;
- const data = url.parse(path);
- const siteHost = url.parse(config.url).hostname || config.url;
- const theme = hexo.theme.config;
- let exturl = '';
- let tag = 'a';
- let attrs = { href: this.url_for(path) };
- // If `exturl` enabled, set spanned links only on external links.
- if (theme.exturl && data.protocol && data.hostname !== siteHost) {
- tag = 'span';
- exturl = 'exturl';
- const encoded = Buffer.from(path).toString('base64');
- attrs = {
- class : exturl,
- 'data-url': encoded
- };
- }
- for (let key in options) {
- /**
- * If option have `class` attribute, add it to
- * 'exturl' class if `exturl` option enabled.
- */
- if (exturl !== '' && key === 'class') {
- attrs[key] += ' ' + options[key];
- } else {
- attrs[key] = options[key];
- }
- }
- if (attrs.class && Array.isArray(attrs.class)) {
- attrs.class = attrs.class.join(' ');
- }
- // If it's external link, rewrite attributes.
- if (data.protocol && data.hostname !== siteHost) {
- attrs.external = null;
- if (!theme.exturl) {
- // Only for simple link need to rewrite/add attributes.
- attrs.rel = 'noopener';
- attrs.target = '_blank';
- } else {
- // Remove rel attributes for `exturl` in main menu.
- attrs.rel = null;
- }
- }
- return htmlTag(tag, attrs, decodeURI(text), false);
- });
|