From 9230e4b682b26eb7f3ff38b891f1c22dec1b66bb Mon Sep 17 00:00:00 2001 From: Abe Jellinek <1770299+AbeJellinek@users.noreply.github.com> Date: Fri, 27 Mar 2026 15:59:50 -0400 Subject: [PATCH 01/21] Use SDT for Reading Mode and Read Aloud --- .gitmodules | 3 + src/common/annotation-manager.js | 8 +- .../modal-popup/appearance-popup.js | 112 ++-- src/common/components/reader-ui.js | 3 +- src/common/components/toolbar.js | 6 +- src/common/read-aloud/sdt-segments.ts | 383 ++++++++++++ src/common/read-aloud/segments.ts | 19 + src/common/reader.js | 524 +++++++++++++--- src/common/types.ts | 36 +- src/common/view.js | 1 - .../components/overlay/annotation-overlay.tsx | 11 +- src/dom/common/dom-view.tsx | 108 ++-- src/dom/common/lib/range.ts | 222 +------ src/dom/common/lib/read-aloud.ts | 421 ++++--------- src/dom/epub/epub-view.ts | 29 +- src/dom/sdt/lib/create-position-mapper.ts | 22 + src/dom/sdt/lib/epub-position-mapper.ts | 225 +++++++ src/dom/sdt/lib/pdf-position-mapper.ts | 389 ++++++++++++ src/dom/sdt/lib/position-index.ts | 141 +++++ src/dom/sdt/lib/renderer.ts | 237 ++++++++ src/dom/sdt/lib/snapshot-position-mapper.ts | 197 ++++++ src/dom/sdt/lib/utilities.ts | 9 + src/dom/sdt/sdt-view.ts | 569 ++++++++++++++++++ src/dom/sdt/stylesheets/sdt.scss | 164 +++++ src/dom/snapshot/reading-mode/index.ts | 177 ------ src/dom/snapshot/reading-mode/node-mapping.ts | 79 --- src/dom/snapshot/snapshot-view.ts | 166 ++--- .../snapshot/stylesheets/reading-mode.scss | 75 --- src/index.dev.js | 108 ++++ src/pdf/pdf-view.js | 429 +++++-------- src/pdf/read-aloud-segments.js | 555 ----------------- structured-document-text | 1 + webpack.config.js | 16 +- 33 files changed, 3383 insertions(+), 2062 deletions(-) create mode 100644 src/common/read-aloud/sdt-segments.ts create mode 100644 src/common/read-aloud/segments.ts create mode 100644 src/dom/sdt/lib/create-position-mapper.ts create mode 100644 src/dom/sdt/lib/epub-position-mapper.ts create mode 100644 src/dom/sdt/lib/pdf-position-mapper.ts create mode 100644 src/dom/sdt/lib/position-index.ts create mode 100644 src/dom/sdt/lib/renderer.ts create mode 100644 src/dom/sdt/lib/snapshot-position-mapper.ts create mode 100644 src/dom/sdt/lib/utilities.ts create mode 100644 src/dom/sdt/sdt-view.ts create mode 100644 src/dom/sdt/stylesheets/sdt.scss delete mode 100644 src/dom/snapshot/reading-mode/index.ts delete mode 100644 src/dom/snapshot/reading-mode/node-mapping.ts delete mode 100644 src/dom/snapshot/stylesheets/reading-mode.scss delete mode 100644 src/pdf/read-aloud-segments.js create mode 160000 structured-document-text diff --git a/.gitmodules b/.gitmodules index a840b87e3..53e910ebd 100644 --- a/.gitmodules +++ b/.gitmodules @@ -5,3 +5,6 @@ [submodule "epubjs/epub.js"] path = epubjs/epub.js url = https://github.com/zotero/epub.js.git +[submodule "structured-document-text"] + path = structured-document-text + url = https://github.com/zotero/structured-document-text.git diff --git a/src/common/annotation-manager.js b/src/common/annotation-manager.js index fc21326f7..df11939e5 100644 --- a/src/common/annotation-manager.js +++ b/src/common/annotation-manager.js @@ -14,7 +14,7 @@ class AnnotationManager { colors: [], tags: [], authors: [], - hiddenIDs: [], + enabledTypes: null, }; this._readOnly = options.readOnly; this._authorName = options.authorName; @@ -399,10 +399,10 @@ class AnnotationManager { this._annotations.forEach(x => delete x._score); let annotations = this._annotations.slice(); - let { tags, colors, authors, query, hiddenIDs } = this._filter; + let { tags, colors, authors, query, enabledTypes } = this._filter; - if (hiddenIDs.length) { - annotations = annotations.filter(x => !hiddenIDs.includes(x.id)); + if (enabledTypes) { + annotations = annotations.filter(x => enabledTypes.includes(x.type)); } if (tags.length || colors.length || authors.length) { diff --git a/src/common/components/modal-popup/appearance-popup.js b/src/common/components/modal-popup/appearance-popup.js index f81349936..07d7f633c 100644 --- a/src/common/components/modal-popup/appearance-popup.js +++ b/src/common/components/modal-popup/appearance-popup.js @@ -260,56 +260,6 @@ function AppearancePopup(props) { return (
- {type === 'pdf' && ( -
-
- -
- - - -
-
-
- -
- - - -
-
-
- )} {type === 'epub' && (
@@ -352,9 +302,9 @@ function AppearancePopup(props) { )}
)} - {(type === 'epub' || type === 'snapshot') && !(type === 'epub' && props.viewStats.fixedLayout) && ( + {!(type === 'epub' && props.viewStats.fixedLayout) && (
- {type === 'snapshot' && ( + {(type === 'snapshot' || type === 'pdf') && (
props.onChangeReadingModeEnabled(e.target.checked)} />
)} - {(type === 'epub' || props.viewStats.readingModeEnabled) && ( + {(type === 'epub' || props.readingModeEnabled) && ( )}
)} + {type === 'pdf' && !props.viewStats.readingModeEnabled && ( +
+
+ +
+ + + +
+
+
+ +
+ + + +
+
+
+ )}
diff --git a/src/common/components/reader-ui.js b/src/common/components/reader-ui.js index 62157a69f..e5c0281dd 100644 --- a/src/common/components/reader-ui.js +++ b/src/common/components/reader-ui.js @@ -135,7 +135,7 @@ const ReaderUI = React.forwardRef((props, ref) => { enableNavigateBack={viewStats.canNavigateBack} enableNavigateToPreviousPage={viewStats.canNavigateToPreviousPage} enableNavigateToNextPage={viewStats.canNavigateToNextPage} - readingModeEnabled={viewStats.readingModeEnabled} + readingModeEnabled={state.readingModeEnabled} appearancePopup={state.appearancePopup} readAloudState={state.readAloudState} findPopupOpen={findState.popupOpen} @@ -235,6 +235,7 @@ const ReaderUI = React.forwardRef((props, ref) => { colorScheme={state.colorScheme} lightTheme={state.lightTheme} darkTheme={state.darkTheme} + readingModeEnabled={state.readingModeEnabled} splitType={state.splitType} viewStats={viewStats} onChangeSplitType={props.onChangeSplitType} diff --git a/src/common/components/toolbar.js b/src/common/components/toolbar.js index 660b6bd34..ea8d6d943 100644 --- a/src/common/components/toolbar.js +++ b/src/common/components/toolbar.js @@ -211,7 +211,7 @@ function Toolbar(props) { onClick={() => handleToolClick('note')} > - {props.type === 'pdf' && ( + {props.type === 'pdf' && !props.readingModeEnabled && ( )} - {props.type === 'pdf' && ( + {props.type === 'pdf' && !props.readingModeEnabled && ( )} - {props.type === 'pdf' && ( + {props.type === 'pdf' && !props.readingModeEnabled && (