From f06823e4e3e41928cbbc9bb4e96523b048250cdd Mon Sep 17 00:00:00 2001 From: ZXY101 Date: Mon, 25 Sep 2023 14:14:32 +0200 Subject: [PATCH] Add character count --- src/lib/components/Reader/Reader.svelte | 62 ++++++++++++++++--- .../components/Settings/ReaderToggles.svelte | 1 + src/lib/settings/index.ts | 2 + 3 files changed, 57 insertions(+), 8 deletions(-) diff --git a/src/lib/components/Reader/Reader.svelte b/src/lib/components/Reader/Reader.svelte index 25607a0..805176f 100644 --- a/src/lib/components/Reader/Reader.svelte +++ b/src/lib/components/Reader/Reader.svelte @@ -5,8 +5,13 @@ import { clamp } from '$lib/util'; import { Input, Popover, Range } from 'flowbite-svelte'; import MangaPage from './MangaPage.svelte'; - import { ChervonDoubleLeftSolid, ChervonDoubleRightSolid } from 'flowbite-svelte-icons'; - import { afterUpdate } from 'svelte'; + import { + ChervonDoubleLeftSolid, + ChervonDoubleRightSolid, + ChevronLeftSolid, + ChevronRightSolid + } from 'flowbite-svelte-icons'; + import { afterUpdate, onMount } from 'svelte'; import Cropper from './Cropper.svelte'; const volume = $currentVolume; @@ -45,6 +50,7 @@ } updateProgress(volume.mokuroData.volume_uuid, clamp(newPage, 1, pages?.length)); zoomDefault(); + updateCharacterCount(clamp(newPage, 1, pages?.length)); } } @@ -69,6 +75,8 @@ ? `${page},${page + 1} / ${pages?.length}` : `${page} / ${pages?.length}`; + $: charDisplay = `${charCount} / ${maxCharCount}`; + let hasCoverSetting = $settings.hasCover; $: { @@ -90,6 +98,12 @@ afterUpdate(() => { zoomDefault(); + updateCharacterCount(page); + }); + + onMount(() => { + getMaxCharCount(); + updateCharacterCount(page); }); function handleShortcuts(event: KeyboardEvent & { currentTarget: EventTarget & Window }) { @@ -124,6 +138,39 @@ break; } } + + let charCount = 0; + + function updateCharacterCount(currentPage: number) { + charCount = 0; + if (pages && $settings.charCount) { + for (let i = 0; i < currentPage; i++) { + const blocks = pages[i].blocks; + blocks.forEach((block) => { + block.lines.forEach((line) => { + charCount += line.length; + }); + }); + } + } + } + + let maxCharCount = 0; + + function getMaxCharCount() { + if (pages) { + for (let i = 0; i < pages.length; i++) { + const blocks = pages[i].blocks; + blocks.forEach((block) => { + block.lines.forEach((line) => { + maxCharCount += line.length; + }); + }); + } + } + + return maxCharCount; + } @@ -136,6 +183,7 @@ on:click={() => changePage($settings.rightToLeft ? pages.length : 1, true)} class="hover:text-primary-600" /> + left(e, true)} class="hover:text-primary-600" /> + right(e, true)} class="hover:text-primary-600" /> changePage($settings.rightToLeft ? 1 : pages.length, true)} class="hover:text-primary-600" @@ -152,12 +201,9 @@ -
diff --git a/src/lib/components/Settings/ReaderToggles.svelte b/src/lib/components/Settings/ReaderToggles.svelte index d725620..18e072f 100644 --- a/src/lib/components/Settings/ReaderToggles.svelte +++ b/src/lib/components/Settings/ReaderToggles.svelte @@ -11,6 +11,7 @@ { key: 'displayOCR', text: 'OCR enabled', value: $settings.displayOCR }, { key: 'boldFont', text: 'Bold font', value: $settings.boldFont }, { key: 'pageNum', text: 'Show page number', value: $settings.pageNum }, + { key: 'charCount', text: 'Show character count', value: $settings.charCount }, { key: 'mobile', text: 'Mobile', value: $settings.mobile } ] as { key: SettingsKey; text: string; value: any }[]; diff --git a/src/lib/settings/index.ts b/src/lib/settings/index.ts index 89d581a..b504312 100644 --- a/src/lib/settings/index.ts +++ b/src/lib/settings/index.ts @@ -33,6 +33,7 @@ export type Settings = { displayOCR: boolean; boldFont: boolean; pageNum: boolean; + charCount: boolean; hasCover: boolean; mobile: boolean; backgroundColor: string; @@ -64,6 +65,7 @@ const defaultSettings: Settings = { textBoxBorders: false, boldFont: false, pageNum: true, + charCount: false, mobile: false, backgroundColor: '#0d0d0f', fontSize: 'auto',