Skip to content

Commit

Permalink
perf(externalink): improved regexp
Browse files Browse the repository at this point in the history
  • Loading branch information
SukkaW committed Jul 25, 2020
1 parent 9076422 commit 5aecc10
Show file tree
Hide file tree
Showing 3 changed files with 17 additions and 9 deletions.
12 changes: 8 additions & 4 deletions lib/plugins/filter/after_post_render/external_link.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

const { isExternalLink } = require('hexo-util');
let EXTERNAL_LINK_POST_ENABLED = true;
const rATag = /<a(?:\s+?|\s+?[^<>]+\s+?)?href=["']([^<>"']+)["'][^<>]*>/gi;
const rTargetAttr = /target=/i;
const rRelAttr = /rel=/i;
const rRelStrAttr = /rel=["']([^<>"']*)["']/i;

function externalLinkFilter(data) {
if (!EXTERNAL_LINK_POST_ENABLED) return;
Expand All @@ -13,11 +17,11 @@ function externalLinkFilter(data) {
return;
}

data.content = data.content.replace(/<a(?:\s+?|\s+?[^<>]+)?href=["']([^<>"']+)["'][^<>]*>/gi, (str, href) => {
if (!isExternalLink(href, url, external_link.exclude) || /target=/i.test(str)) return str;
data.content = data.content.replace(rATag, (str, href) => {
if (!isExternalLink(href, url, external_link.exclude) || rTargetAttr.test(str)) return str;

if (/rel=/i.test(str)) {
str = str.replace(/rel=["']([^<>"']*)["']/i, (relStr, rel) => {
if (rRelAttr.test(str)) {
str = str.replace(rRelStrAttr, (relStr, rel) => {
return rel.includes('noopenner') ? relStr : `rel="${rel} noopener"`;
});
return str.replace('href=', 'target="_blank" href=');
Expand Down
12 changes: 8 additions & 4 deletions lib/plugins/filter/after_render/external_link.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,10 @@
const { isExternalLink } = require('hexo-util');

let EXTERNAL_LINK_SITE_ENABLED = true;
const rATag = /<a(?:\s+?|\s+?[^<>]+\s+?)?href=["']([^<>"']+)["'][^<>]*>/gi;
const rTargetAttr = /target=/i;
const rRelAttr = /rel=/i;
const rRelStrAttr = /rel=["']([^<>"']*)["']/i;

function externalLinkFilter(data) {
if (!EXTERNAL_LINK_SITE_ENABLED) return;
Expand All @@ -14,11 +18,11 @@ function externalLinkFilter(data) {
return;
}

return data.replace(/<a(?:\s+?|\s+?[^<>]+)?href=["']([^<>"']+)["'][^<>]*>/gi, (str, href) => {
if (!isExternalLink(href, url, external_link.exclude) || /target=/i.test(str)) return str;
return data.replace(rATag, (str, href) => {
if (!isExternalLink(href, url, external_link.exclude) || rTargetAttr.test(str)) return str;

if (/rel=/i.test(str)) {
str = str.replace(/rel=["']([^<>"']*)["']/i, (relStr, rel) => {
if (rRelAttr.test(str)) {
str = str.replace(rRelStrAttr, (relStr, rel) => {
return rel.includes('noopenner') ? relStr : `rel="${rel} noopener"`;
});
return str.replace('href=', 'target="_blank" href=');
Expand Down
2 changes: 1 addition & 1 deletion lib/plugins/filter/after_render/meta_generator.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ function hexoMetaGeneratorInject(data) {
if (!NEED_INJECT) return;

if (!this.config.meta_generator
|| data.match(/<meta\s+(?:[^<>]+\s)?name=['|"]?generator['|"]?/i)) {
|| data.match(/<meta\s+(?:[^<>/]+\s)?name=['"]generator['"]/i)) {
NEED_INJECT = false;
return;
}
Expand Down

0 comments on commit 5aecc10

Please sign in to comment.