Skip to content

Commit 0509f3e

Browse files
Merge pull request #52 from devgateway/task/fix-links
2 parents caf50d1 + 1309131 commit 0509f3e

File tree

2 files changed

+65
-49
lines changed

2 files changed

+65
-49
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@devgateway/wp-react-lib": patch
3+
---
4+
5+
Fix links and remove old process.env.VITE_REACT_APP_WP_HOSTS

wp-react-lib/src/util/index.js

Lines changed: 60 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,72 @@
1-
const useHash = process.env.VITE_REACT_APP_USE_HASH_LINKS;
1+
const localReplaceLink = (url, locale) => {
2+
if (!url) {
3+
return "";
4+
}
5+
const safeLocale = locale || "en";
26

7+
try {
8+
let pathname = url;
39

4-
export const replaceLink = (url, locale) => {
5-
//console.log("--------- replaceLink--------------")
6-
//console.log(process.env.REACT_APP_WP_HOSTS)
7-
const replacementTarget = process.env.VITE_REACT_APP_WP_HOSTS?.split(",") || []
8-
let all = new RegExp("^(http|https)://(" + replacementTarget.join('|') + ")", "ig");
9-
if (useHash && url) {
10-
return url.replaceAll(all, "#" + locale)
11-
} else if (url) {
12-
return url.replaceAll(all, "/" + locale)
10+
// If absolute URL, extract pathname and ignore origin
11+
if (/^https?:\/\//i.test(url)) {
12+
const parsed = new URL(url);
13+
pathname = parsed.pathname + (parsed.search || "") + (parsed.hash || "");
14+
}
15+
16+
if (!pathname.startsWith("/wp/")) {
17+
return url; // Not a WordPress path, leave unchanged
1318
}
19+
20+
const afterWp = pathname.slice(3); // remove '/wp'
21+
22+
if (!afterWp.startsWith("/" + safeLocale)) {
23+
return "/" + safeLocale + afterWp;
24+
}
25+
26+
return afterWp;
27+
} catch (e) {
28+
console.error("Error parsing URL:", e);
29+
return url;
30+
}
31+
};
32+
33+
export const replaceLink = (url, locale) => {
34+
if (!url) {
35+
return "";
36+
}
37+
return localReplaceLink(url, locale);
1438
}
1539

1640
export const replaceHTMLinks = (html, locale) => {
17-
//console.log("--------- replaceHTMLinks--------------")
18-
// console.log(process.env.REACT_APP_WP_HOSTS)
19-
const replacementTarget = process.env.VITE_REACT_APP_WP_HOSTS?.split(",") || []
20-
let all = new RegExp("^(http|https)://(" + replacementTarget.join('|') + ")", "ig");
21-
22-
let link;
23-
let regex = /href\s*=\s*(['"])(https?:\/\/.+?)\1/ig;
24-
25-
let newHtml = html
26-
while ((link = regex.exec(html)) !== null) {
27-
let href = link[2]
28-
let newLink
29-
if (useHash) {
30-
newLink = href.replace(all, '#' + locale) //TODO:fix it!
31-
} else {
32-
newLink = href.replace(all, '' + locale) //TODO:fix it!
33-
}
34-
newHtml = newHtml.replaceAll(link[2], newLink)
35-
}
36-
if (useHash) {
37-
let anchor = /href="#([^"]*)"/ig;
38-
let re2 = new RegExp(anchor, "i");
39-
while ((link = anchor.exec(html)) !== null) {
40-
let href = link[0]
41-
let newLink = href.replace(re2, 'href="javascript:document.getElementById(\'' + link[1] + '\').scrollIntoView({block: \'start\', behavior: \'smooth\'})"')
42-
newHtml = newHtml.replaceAll(link[0], newLink)
43-
}
41+
//console.log("--------- replaceHTMLinks--------------")
42+
// console.log(process.env.REACT_APP_WP_HOSTS)
43+
44+
let link;
45+
// Match both absolute (http/https) and relative WP links in a single pass
46+
let linkRegex = /href\s*=\s*(['"])(https?:\/\/.*?|\/wp\/.*?)\1/ig;
47+
48+
let newHtml = html
49+
while ((link = linkRegex.exec(html)) !== null) {
50+
let href = link[2]
51+
let newLink = localReplaceLink(href, locale)
52+
if (newLink !== href) {
53+
newHtml = newHtml.replaceAll(href, newLink)
4454
}
45-
return newHtml;
55+
}
56+
return newHtml;
4657
}
4758

4859
export const removePatternBrackets = (html) => {
49-
const bracketReplacement = `###${Math.random()}###`; // A unique string to mark replacements
50-
const regex = new RegExp(`\\[${bracketReplacement}.*?]`, 'ig'); // No lookbehind, matches pattern within square brackets
51-
if (html) {
52-
return html
53-
.replaceAll('[:', `[${bracketReplacement}`) // Use square brackets to match regex pattern
54-
.replaceAll(regex, '') // Remove entire pattern inside square brackets
55-
.replaceAll(`${bracketReplacement}`, ''); // Clean up any remaining placeholders
56-
} else {
57-
return null;
58-
}
60+
const bracketReplacement = `###${Math.random()}###`; // A unique string to mark replacements
61+
const regex = new RegExp(`\\[${bracketReplacement}.*?]`, 'ig'); // No lookbehind, matches pattern within square brackets
62+
if (html) {
63+
return html
64+
.replaceAll('[:', `[${bracketReplacement}`) // Use square brackets to match regex pattern
65+
.replaceAll(regex, '') // Remove entire pattern inside square brackets
66+
.replaceAll(`${bracketReplacement}`, ''); // Clean up any remaining placeholders
67+
} else {
68+
return null;
69+
}
5970
};
6071

61-
export default {replaceHTMLinks, replaceLink}
72+
export default { replaceHTMLinks, replaceLink }

0 commit comments

Comments
 (0)