From 6ba15319a8d8e44dab857f1ef8c156f32e646c29 Mon Sep 17 00:00:00 2001 From: Huang Xin Date: Fri, 11 Apr 2025 12:30:08 +0800 Subject: [PATCH] fix: reverse punctuation transform when highlighting (#862) --- .../app/reader/components/FoliateViewer.tsx | 1 + .../reader/components/annotator/Annotator.tsx | 20 ++++++++++++++----- .../src/services/transformService.ts | 5 ++++- .../src/services/transformers/index.ts | 2 +- .../src/services/transformers/punctuation.ts | 8 +++++--- .../src/services/transformers/types.ts | 2 ++ 6 files changed, 28 insertions(+), 10 deletions(-) diff --git a/apps/readest-app/src/app/reader/components/FoliateViewer.tsx b/apps/readest-app/src/app/reader/components/FoliateViewer.tsx index 4d78b9a3..46ce02f8 100644 --- a/apps/readest-app/src/app/reader/components/FoliateViewer.tsx +++ b/apps/readest-app/src/app/reader/components/FoliateViewer.tsx @@ -66,6 +66,7 @@ const FoliateViewer: React.FC<{ bookKey, viewSettings, content: data, + transformers: ['punctuation'], }; return Promise.resolve(transformContent(ctx)); } diff --git a/apps/readest-app/src/app/reader/components/annotator/Annotator.tsx b/apps/readest-app/src/app/reader/components/annotator/Annotator.tsx index 4bc2755d..679424c7 100644 --- a/apps/readest-app/src/app/reader/components/annotator/Annotator.tsx +++ b/apps/readest-app/src/app/reader/components/annotator/Annotator.tsx @@ -25,6 +25,7 @@ import { useNotesSync } from '../../hooks/useNotesSync'; import { getPopupPosition, getPosition, Position, TextSelection } from '@/utils/sel'; import { eventDispatcher } from '@/utils/event'; import { findTocItemBS } from '@/utils/toc'; +import { transformContent } from '@/services/transformService'; import { HIGHLIGHT_COLOR_HEX } from '@/services/constants'; import AnnotationPopup from './AnnotationPopup'; import WiktionaryPopup from './WiktionaryPopup'; @@ -88,25 +89,34 @@ const Annotator: React.FC<{ bookKey: string }> = ({ bookKey }) => { const isValidSelection = (sel: Selection) => { return sel && sel.toString().trim().length > 0 && sel.rangeCount > 0; }; - const makeSelection = (sel: Selection, rebuildRange = false) => { + const transformCtx = { + bookKey, + viewSettings: getViewSettings(bookKey)!, + content: '', + transformers: ['punctuation'], + reversePunctuationTransform: true, + }; + const makeSelection = async (sel: Selection, rebuildRange = false) => { isTextSelected.current = true; const range = sel.getRangeAt(0); if (rebuildRange) { sel.removeAllRanges(); sel.addRange(range); } - setSelection({ key: bookKey, text: sel.toString(), range, index }); + transformCtx['content'] = sel.toString(); + setSelection({ key: bookKey, text: await transformContent(transformCtx), range, index }); }; // FIXME: extremely hacky way to dismiss system selection tools on iOS - const makeSelectionOnIOS = (sel: Selection) => { + const makeSelectionOnIOS = async (sel: Selection) => { isTextSelected.current = true; const range = sel.getRangeAt(0); setTimeout(() => { sel.removeAllRanges(); - setTimeout(() => { + setTimeout(async () => { if (!isTextSelected.current) return; sel.addRange(range); - setSelection({ key: bookKey, text: range.toString(), range, index }); + transformCtx['content'] = range.toString(); + setSelection({ key: bookKey, text: await transformContent(transformCtx), range, index }); }, 40); }, 0); }; diff --git a/apps/readest-app/src/services/transformService.ts b/apps/readest-app/src/services/transformService.ts index 0db64743..44c2e358 100644 --- a/apps/readest-app/src/services/transformService.ts +++ b/apps/readest-app/src/services/transformService.ts @@ -1,9 +1,12 @@ -import { activeTransformers } from './transformers'; +import { availableTransformers } from './transformers'; import { TransformContext } from './transformers/types'; export const transformContent = async (ctx: TransformContext): Promise => { let transformed = ctx.content; + const activeTransformers = ctx.transformers + .map((name) => availableTransformers.find((transformer) => transformer.name === name)) + .filter((transformer) => !!transformer); for (const transformer of activeTransformers) { try { transformed = await transformer.transform({ ...ctx, content: transformed }); diff --git a/apps/readest-app/src/services/transformers/index.ts b/apps/readest-app/src/services/transformers/index.ts index c7da70c2..8ef20f1f 100644 --- a/apps/readest-app/src/services/transformers/index.ts +++ b/apps/readest-app/src/services/transformers/index.ts @@ -2,7 +2,7 @@ import type { Transformer } from './types'; import { translateTransformer } from './translate'; import { punctuationTransformer } from './punctuation'; -export const activeTransformers: Transformer[] = [ +export const availableTransformers: Transformer[] = [ punctuationTransformer, translateTransformer, // Add more transformers here diff --git a/apps/readest-app/src/services/transformers/punctuation.ts b/apps/readest-app/src/services/transformers/punctuation.ts index bfed3698..8e1c4846 100644 --- a/apps/readest-app/src/services/transformers/punctuation.ts +++ b/apps/readest-app/src/services/transformers/punctuation.ts @@ -11,14 +11,16 @@ export const punctuationTransformer: Transformer = { name: 'punctuation', transform: async (ctx) => { - if (!ctx.content.includes('