# PR #857 Full Feature Update Integration **Date:** 2026-02-14 ## Task Description Implemented the full feature update from PR #857 ("feat: Add dictionary word lookup feature") into our fork, following the detailed plan in `pr_857_update_integration_190041ae.plan.md`. This covered dictionary intelligence features (stemming, edit distance, fuzzy matching), the `ActivityWithSubactivity` refactor for inline definition display, en-dash/em-dash splitting, cross-page hyphenation, reverse-chronological lookup history, and a new "Did you mean?" suggestions activity. ## Changes Made ### New Files (2) - **`src/activities/reader/DictionarySuggestionsActivity.h`** — New "Did you mean?" activity header. Adapted from PR with `orientation` parameter for our `DictionaryDefinitionActivity` constructor. - **`src/activities/reader/DictionarySuggestionsActivity.cpp`** — Suggestions list UI with `UITheme`-aware layout, sub-activity management for definition display. ### Modified Files (9) 1. **`src/util/Dictionary.h`** — Added `getStemVariants()`, `findSimilar()` (public) and `editDistance()` (private) declarations. 2. **`src/util/Dictionary.cpp`** — Added ~250 lines: morphological stemming (`getStemVariants`), Levenshtein distance (`editDistance`), and fuzzy index scan (`findSimilar`). Preserved fork's `/.dictionary/` paths, `stardictCmp`/`asciiCaseCmp`, `cacheExists()`/`deleteCache()`. 3. **`src/activities/reader/DictionaryDefinitionActivity.h`** — Added optional `onDone` callback parameter and member. Enables "Done" button to exit all the way back to the reader. 4. **`src/activities/reader/DictionaryDefinitionActivity.cpp`** — Split Confirm handler: calls `onDone()` if set, else `onBack()`. Button hint shows "Done" when callback provided. Preserved all HTML parsing, styled rendering, side button hints. 5. **`src/activities/reader/DictionaryWordSelectActivity.h`** — Changed base class to `ActivityWithSubactivity`. Replaced `onLookup` callback with `nextPageFirstWord` string. Added `pendingBackFromDef`/`pendingExitToReader` state. 6. **`src/activities/reader/DictionaryWordSelectActivity.cpp`** — Major update: - En-dash/em-dash splitting in `extractWords()` (splits on U+2013/U+2014) - Cross-page hyphenation in `mergeHyphenatedWords()` using `nextPageFirstWord` - Cascading lookup flow: exact → stem variants → similar suggestions → "Not found" - Sub-activity delegation in `loop()` for definition/suggestions screens - Preserved custom `drawHints()` with overlap detection and `PageForward`/`PageBack` support 7. **`src/activities/reader/LookedUpWordsActivity.h`** — Replaced `onSelectWord` with `onDone` callback. Added `readerFontId`, `orientation`, `pendingBackFromDef`/`pendingExitToReader`, `getPageItems()`. 8. **`src/activities/reader/LookedUpWordsActivity.cpp`** — Major rewrite: - Reverse-chronological word display - Inline cascading lookup flow (same as word select) - `UITheme`-aware layout with `GUI.drawHeader()`/`GUI.drawList()` - `onNextRelease`/`onPreviousRelease`/`onNextContinuous`/`onPreviousContinuous` navigation - Sub-activity management for definition/suggestions - Preserved delete confirmation mode 9. **`src/activities/reader/EpubReaderActivity.cpp`** — Simplified LOOKUP handler (removed `onLookup` callback, added `nextPageFirstWord` extraction). Simplified LOOKED_UP_WORDS handler (removed inline lookup, passes `readerFontId` and `orientation`). Removed unused `LookupHistory.h` include. ### Cleanup - Removed unused `DictionaryDefinitionActivity.h` include from `EpubReaderActivity.h` - Removed unused `util/LookupHistory.h` include from `EpubReaderActivity.cpp` ## Architectural Summary **Before:** `EpubReaderActivity` orchestrated definition display via callbacks — word select and history both called back to the reader to create definition activities. **After:** `DictionaryWordSelectActivity` and `LookedUpWordsActivity` manage their own sub-activity chains (definition, suggestions) using `ActivityWithSubactivity`. This enables the cascading lookup flow: exact match → stem variants → similar suggestions → "Not found". ## What Was Preserved (Fork Advantages) - Full HTML parsing in `DictionaryDefinitionActivity` - Custom `drawHints()` with overlap detection in `DictionaryWordSelectActivity` - `PageForward`/`PageBack` button support in word selection - `DELETE_DICT_CACHE` menu item and `cacheExists()`/`deleteCache()` - `stardictCmp`/`asciiCaseCmp` for proper StarDict index comparison - `/.dictionary/` path prefix ## Follow-up Items - Test the full lookup flow on device (exact → stems → suggestions → not found) - Verify cross-page hyphenation with a book that has page-spanning hyphenated words - Verify en-dash/em-dash splitting with books using those characters - Confirm reverse-chronological history order is intuitive for users