From cf036d41e9fda5c7202aa02a6bbe1a23364e4402 Mon Sep 17 00:00:00 2001 From: bLue Date: Sat, 11 May 2024 10:42:16 +0800 Subject: [PATCH] chore: support html cdn proxy rewrite --- .umirc.js | 4 ++++ src/components/ProblemContent.tsx | 2 ++ src/pages/competitions/$id/overview.tsx | 3 ++- src/utils/misc.ts | 11 +++++++++++ 4 files changed, 19 insertions(+), 1 deletion(-) diff --git a/.umirc.js b/.umirc.js index 9d48e9b..62db0a2 100644 --- a/.umirc.js +++ b/.umirc.js @@ -4,6 +4,8 @@ console.log('Using build target:', buildTarget); console.log('Using COMPETITION_SIDE:', process.env.COMPETITION_SIDE === '1'); process.env.CDN_URL && console.log('Using CDN_URL:', process.env.CDN_URL); process.env.MEDIA_URL && console.log('Using MEDIA_URL:', process.env.MEDIA_URL); +process.env.CDN_RAW_URL_BEFORE_PROXY && console.log('Using CDN_RAW_URL_BEFORE_PROXY:', process.env.CDN_RAW_URL_BEFORE_PROXY); +process.env.CDN_PROXY && console.log('Using CDN_PROXY:', process.env.CDN_PROXY); const publicPathPrefix = process.env.CDN_URL || ''; @@ -40,6 +42,8 @@ export default { 'process.env.COMPETITION_SIDE': process.env.COMPETITION_SIDE === '1' ? '1' : '', 'process.env.CDN_URL': process.env.CDN_URL || '', 'process.env.MEDIA_URL': process.env.MEDIA_URL || '', + 'process.env.CDN_RAW_URL_BEFORE_PROXY': process.env.CDN_RAW_URL_BEFORE_PROXY || '', + 'process.env.CDN_PROXY': process.env.CDN_PROXY || '', 'process.env.PUBLIC_PATH': process.env.NODE_ENV === 'production' ? usingPublicPath : '/', 'process.env.DATA_USING_GIT': process.env.DATA_USING_GIT === '1', }, diff --git a/src/components/ProblemContent.tsx b/src/components/ProblemContent.tsx index 7973bda..77c396a 100644 --- a/src/components/ProblemContent.tsx +++ b/src/components/ProblemContent.tsx @@ -11,6 +11,7 @@ import { loadCustomFont, getCustomFontStyleForReact } from '@/utils/customFont'; import ReactPlayer from 'react-player/file'; import { userActiveEmitter, UserActiveEvents } from '@/events/userActive'; import { pickGenshinAudioUrlFromConf } from '@/utils/spGenshin'; +import { replaceString } from '@/utils/misc'; export interface Props { loading: boolean; @@ -97,6 +98,7 @@ class ProblemContent extends React.Component { if (res === '

') { res = ''; } + process.env.CDN_PROXY && (res = replaceString(res, [process.env.CDN_RAW_URL_BEFORE_PROXY], process.env.CDN_PROXY)); return res; }; diff --git a/src/pages/competitions/$id/overview.tsx b/src/pages/competitions/$id/overview.tsx index 017bda0..6701b64 100644 --- a/src/pages/competitions/$id/overview.tsx +++ b/src/pages/competitions/$id/overview.tsx @@ -42,7 +42,7 @@ import ProblemTitle from '@/components/ProblemTitle'; import { Howl } from 'howler'; import GeneralForm from '@/components/GeneralForm'; import constants from '@/configs/constants'; -import { sleep } from '@/utils/misc'; +import { sleep, replaceString } from '@/utils/misc'; import GenshinTable from '@/components/GenshinTable'; export interface Props extends ReduxProps, FormProps { @@ -480,6 +480,7 @@ class CompetitionOverview extends React.Component { if (res === '

') { res = ''; } + process.env.CDN_PROXY && (res = replaceString(res, [process.env.CDN_RAW_URL_BEFORE_PROXY], process.env.CDN_PROXY)); return res; }; diff --git a/src/utils/misc.ts b/src/utils/misc.ts index 7b44076..78201da 100644 --- a/src/utils/misc.ts +++ b/src/utils/misc.ts @@ -208,3 +208,14 @@ export function isCompetitionSide() { export function randomlyPickOne(arr: T[]): T { return arr[Math.floor(Math.random() * arr.length)]; } + +export function replaceString(str: string, sourceString: string[], targetString: string): string { + let result = str; + sourceString.forEach((sourcePath) => { + // 为了安全地替换字符串,需要对 sourcePath 进行转义,因为它可能包含正则表达式的特殊字符 + const escapedSourcePath = sourcePath.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); + const regex = new RegExp(escapedSourcePath, 'g'); + result = result.replace(regex, targetString); + }); + return result; +}