From fd7f90236d52d11b1f4742959fb6fcd105de4764 Mon Sep 17 00:00:00 2001
From: Huang Xin
Date: Wed, 26 Nov 2025 18:31:31 +0800
Subject: [PATCH] compat(ios): avoid lookbehind assertions for iOS older than
16.4 (#2553)
---
apps/readest-app/package.json | 3 ++-
apps/readest-app/src/app/error.tsx | 22 ++++++++++++++-----
.../src/services/transformers/whitespace.ts | 2 +-
apps/readest-app/src/utils/number.ts | 14 +++++-------
packages/foliate-js | 2 +-
5 files changed, 26 insertions(+), 17 deletions(-)
diff --git a/apps/readest-app/package.json b/apps/readest-app/package.json
index 12daed14..95e237fb 100644
--- a/apps/readest-app/package.json
+++ b/apps/readest-app/package.json
@@ -46,7 +46,8 @@
"update-metadata": "bash ./scripts/sync-release-notes.sh release-notes.json ../../data/metainfo/appdata.xml",
"check:optional-chaining": "count=$(grep -rno '\\?\\.[a-zA-Z_$]' .next/static/chunks/* out/_next/static/chunks/* | wc -l); if [ \"$count\" -gt 0 ]; then echo '❌ Optional chaining found in output!'; exit 1; else echo '✅ No optional chaining found.'; fi",
"check:translations": "count=$(grep -rno '__STRING_NOT_TRANSLATED__' public/locales/* | wc -l); if [ \"$count\" -gt 0 ]; then echo '❌ Untranslated strings found!'; exit 1; else echo '✅ All strings translated.'; fi",
- "check:all": "pnpm check:translations",
+ "check:lookbehind-regex": "count=$(grep -rnoE '\\(\\?<[!=]' .next/static/chunks/* out/_next/static/chunks/* | wc -l); if [ \"$count\" -gt 0 ]; then echo '❌ Lookbehind regex found in output!'; exit 1; else echo '✅ No lookbehind regex found.'; fi",
+ "check:all": "pnpm check:translations && pnpm check:lookbehind-regex",
"build-check": "pnpm build && pnpm build-web && pnpm check:all"
},
"dependencies": {
diff --git a/apps/readest-app/src/app/error.tsx b/apps/readest-app/src/app/error.tsx
index 422cafc2..9590e822 100644
--- a/apps/readest-app/src/app/error.tsx
+++ b/apps/readest-app/src/app/error.tsx
@@ -54,17 +54,27 @@ export default function Error({ error, reset }: ErrorPageProps) {
)}
-
-
+
+
{_('Error Details:')}
-
{error.message}
- {browserInfo &&
Browser: {browserInfo}
}
+
+ {error.message}
+
+ {browserInfo && (
+
+ Browser: {browserInfo}
+
+ )}
{error.stack && (
-
+
{error.stack.split('\n').slice(0, 3).join('\n')}
)}
- {error.digest &&
Error ID: {error.digest}
}
+ {error.digest && (
+
+ Error ID: {error.digest}
+
+ )}
diff --git a/apps/readest-app/src/services/transformers/whitespace.ts b/apps/readest-app/src/services/transformers/whitespace.ts
index 62eb3789..720b2bb6 100644
--- a/apps/readest-app/src/services/transformers/whitespace.ts
+++ b/apps/readest-app/src/services/transformers/whitespace.ts
@@ -8,7 +8,7 @@ export const whitespaceTransformer: Transformer = {
if (viewSettings.overrideLayout) {
const cleaned = ctx.content
// Replace but skip literal " "
- .replace(/(? (amp ? match : ' '))
// Replace literal non-breaking space characters (U+00A0) with normal spaces
.replace(/\u00A0/g, ' ')
// Collapse consecutive spaces into one
diff --git a/apps/readest-app/src/utils/number.ts b/apps/readest-app/src/utils/number.ts
index e06baaa7..e1ae25c5 100644
--- a/apps/readest-app/src/utils/number.ts
+++ b/apps/readest-app/src/utils/number.ts
@@ -36,15 +36,13 @@ export const localizeNumber = (num: number, language: string, isIndex = false):
if (!isIndex) {
if (isTraditional) {
- result = result.replace(
- /^貳$|(?