62 lines
1.5 KiB
JavaScript
62 lines
1.5 KiB
JavaScript
/* 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);
|
|
});
|