fix(perf): process external links in frontend
parent
3c3fefda71
commit
f5185d52d0
|
@ -2,8 +2,23 @@
|
||||||
<%- _js(cdn('moment', '2.22.2', 'min/moment-with-locales.min.js')) %>
|
<%- _js(cdn('moment', '2.22.2', 'min/moment-with-locales.min.js')) %>
|
||||||
<script>moment.locale("<%= get_config('language', 'en') %>");</script>
|
<script>moment.locale("<%= get_config('language', 'en') %>");</script>
|
||||||
|
|
||||||
|
<%
|
||||||
|
let externalLink = get_config('external_link');
|
||||||
|
if (typeof externalLink === 'boolean') {
|
||||||
|
externalLink = { enable: externalLink, exclude: [] };
|
||||||
|
} else {
|
||||||
|
externalLink = {
|
||||||
|
enable: typeof externalLink.enable === 'boolean' ? externalLink.enable : true,
|
||||||
|
exclude: externalLink.exclude || []
|
||||||
|
};
|
||||||
|
}
|
||||||
|
%>
|
||||||
<script>
|
<script>
|
||||||
var IcarusThemeSettings = {
|
var IcarusThemeSettings = {
|
||||||
|
site: {
|
||||||
|
url: '<%= config.url %>',
|
||||||
|
external_link: <%- JSON.stringify(externalLink) %>
|
||||||
|
},
|
||||||
article: {
|
article: {
|
||||||
highlight: {
|
highlight: {
|
||||||
clipboard: <%= get_config('article.highlight.clipboard', true) %>,
|
clipboard: <%= get_config('article.highlight.clipboard', true) %>,
|
||||||
|
@ -14,13 +29,13 @@ var IcarusThemeSettings = {
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<% if (get_config('article.highlight.clipboard')) { %>
|
<% if (get_config('article.highlight.clipboard')) { %>
|
||||||
<%- _js(cdn('clipboard', '2.0.4', 'dist/clipboard.min.js'), true) %>
|
<%- _js(cdn('clipboard', '2.0.4', 'dist/clipboard.min.js'), true) %>
|
||||||
<% } %>
|
<% } %>
|
||||||
|
|
||||||
<% if (has_config('plugins')) { %>
|
<% if (has_config('plugins')) { %>
|
||||||
<% for (let plugin in get_config('plugins')) { %>
|
<% for (let plugin in get_config('plugins')) { %>
|
||||||
<%- _partial('plugin/' + plugin, { head: false, plugin: get_config('plugins')[plugin] }) %>
|
<%- _partial('plugin/' + plugin, { head: false, plugin: get_config('plugins')[plugin] }) %>
|
||||||
<% } %>
|
<% } %>
|
||||||
<% } %>
|
<% } %>
|
||||||
|
|
||||||
<%- _js('js/main', true) %>
|
<%- _js('js/main', true) %>
|
|
@ -1,5 +1,8 @@
|
||||||
{
|
{
|
||||||
"name": "hexo-theme-icarus",
|
"name": "hexo-theme-icarus",
|
||||||
"version": "2.6.0",
|
"version": "2.6.0",
|
||||||
"private": true
|
"private": true,
|
||||||
}
|
"engines": {
|
||||||
|
"node": ">=8.3.0"
|
||||||
|
}
|
||||||
|
}
|
|
@ -103,4 +103,49 @@
|
||||||
$mask.on('click', toggleToc);
|
$mask.on('click', toggleToc);
|
||||||
$('.navbar-main .catalogue').on('click', toggleToc);
|
$('.navbar-main .catalogue').on('click', toggleToc);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// hexo-util/lib/is_external_link.js
|
||||||
|
function isExternalLink(input, sitehost, exclude) {
|
||||||
|
try {
|
||||||
|
sitehost = new URL(sitehost).hostname;
|
||||||
|
} catch (e) { }
|
||||||
|
|
||||||
|
if (!sitehost) return false;
|
||||||
|
|
||||||
|
// handle relative url
|
||||||
|
const data = new URL(input, 'http://' + sitehost);
|
||||||
|
|
||||||
|
// handle mailto: javascript: vbscript: and so on
|
||||||
|
if (data.origin === 'null') return false;
|
||||||
|
|
||||||
|
const host = data.hostname;
|
||||||
|
|
||||||
|
if (exclude) {
|
||||||
|
exclude = Array.isArray(exclude) ? exclude : [exclude];
|
||||||
|
|
||||||
|
if (exclude && exclude.length) {
|
||||||
|
for (const i of exclude) {
|
||||||
|
if (host === i) return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (host !== sitehost) return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof (IcarusThemeSettings) !== 'undefined' &&
|
||||||
|
typeof (IcarusThemeSettings.site.url) !== 'undefined' &&
|
||||||
|
typeof (IcarusThemeSettings.site.external_link) !== 'undefined' &&
|
||||||
|
IcarusThemeSettings.site.external_link.enable) {
|
||||||
|
$('.article .content a').filter(function (i, link) {
|
||||||
|
return link.href && link.classList.length === 0 && isExternalLink(link.href,
|
||||||
|
IcarusThemeSettings.site.url,
|
||||||
|
IcarusThemeSettings.site.external_link.exclude);
|
||||||
|
}).each(function (i, link) {
|
||||||
|
link.relList.add('noopener');
|
||||||
|
link.target = '_blank';
|
||||||
|
});
|
||||||
|
}
|
||||||
})(jQuery);
|
})(jQuery);
|
||||||
|
|
Loading…
Reference in New Issue