|
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"; |
2 | 6 |
|
| 7 | + try { |
| 8 | + let pathname = url; |
3 | 9 |
|
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 |
13 | 18 | } |
| 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); |
14 | 38 | } |
15 | 39 |
|
16 | 40 | 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) |
44 | 54 | } |
45 | | - return newHtml; |
| 55 | + } |
| 56 | + return newHtml; |
46 | 57 | } |
47 | 58 |
|
48 | 59 | 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 | + } |
59 | 70 | }; |
60 | 71 |
|
61 | | -export default {replaceHTMLinks, replaceLink} |
| 72 | +export default { replaceHTMLinks, replaceLink } |
0 commit comments