Add character count
This commit is contained in:
@@ -5,8 +5,13 @@
|
|||||||
import { clamp } from '$lib/util';
|
import { clamp } from '$lib/util';
|
||||||
import { Input, Popover, Range } from 'flowbite-svelte';
|
import { Input, Popover, Range } from 'flowbite-svelte';
|
||||||
import MangaPage from './MangaPage.svelte';
|
import MangaPage from './MangaPage.svelte';
|
||||||
import { ChervonDoubleLeftSolid, ChervonDoubleRightSolid } from 'flowbite-svelte-icons';
|
import {
|
||||||
import { afterUpdate } from 'svelte';
|
ChervonDoubleLeftSolid,
|
||||||
|
ChervonDoubleRightSolid,
|
||||||
|
ChevronLeftSolid,
|
||||||
|
ChevronRightSolid
|
||||||
|
} from 'flowbite-svelte-icons';
|
||||||
|
import { afterUpdate, onMount } from 'svelte';
|
||||||
import Cropper from './Cropper.svelte';
|
import Cropper from './Cropper.svelte';
|
||||||
|
|
||||||
const volume = $currentVolume;
|
const volume = $currentVolume;
|
||||||
@@ -45,6 +50,7 @@
|
|||||||
}
|
}
|
||||||
updateProgress(volume.mokuroData.volume_uuid, clamp(newPage, 1, pages?.length));
|
updateProgress(volume.mokuroData.volume_uuid, clamp(newPage, 1, pages?.length));
|
||||||
zoomDefault();
|
zoomDefault();
|
||||||
|
updateCharacterCount(clamp(newPage, 1, pages?.length));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -69,6 +75,8 @@
|
|||||||
? `${page},${page + 1} / ${pages?.length}`
|
? `${page},${page + 1} / ${pages?.length}`
|
||||||
: `${page} / ${pages?.length}`;
|
: `${page} / ${pages?.length}`;
|
||||||
|
|
||||||
|
$: charDisplay = `${charCount} / ${maxCharCount}`;
|
||||||
|
|
||||||
let hasCoverSetting = $settings.hasCover;
|
let hasCoverSetting = $settings.hasCover;
|
||||||
|
|
||||||
$: {
|
$: {
|
||||||
@@ -90,6 +98,12 @@
|
|||||||
|
|
||||||
afterUpdate(() => {
|
afterUpdate(() => {
|
||||||
zoomDefault();
|
zoomDefault();
|
||||||
|
updateCharacterCount(page);
|
||||||
|
});
|
||||||
|
|
||||||
|
onMount(() => {
|
||||||
|
getMaxCharCount();
|
||||||
|
updateCharacterCount(page);
|
||||||
});
|
});
|
||||||
|
|
||||||
function handleShortcuts(event: KeyboardEvent & { currentTarget: EventTarget & Window }) {
|
function handleShortcuts(event: KeyboardEvent & { currentTarget: EventTarget & Window }) {
|
||||||
@@ -124,6 +138,39 @@
|
|||||||
break;
|
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;
|
||||||
|
}
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<svelte:window on:resize={zoomDefault} on:keyup|preventDefault={handleShortcuts} />
|
<svelte:window on:resize={zoomDefault} on:keyup|preventDefault={handleShortcuts} />
|
||||||
@@ -136,6 +183,7 @@
|
|||||||
on:click={() => changePage($settings.rightToLeft ? pages.length : 1, true)}
|
on:click={() => changePage($settings.rightToLeft ? pages.length : 1, true)}
|
||||||
class="hover:text-primary-600"
|
class="hover:text-primary-600"
|
||||||
/>
|
/>
|
||||||
|
<ChevronLeftSolid on:click={(e) => left(e, true)} class="hover:text-primary-600" />
|
||||||
<Input
|
<Input
|
||||||
type="number"
|
type="number"
|
||||||
size="sm"
|
size="sm"
|
||||||
@@ -144,6 +192,7 @@
|
|||||||
on:click={onInputClick}
|
on:click={onInputClick}
|
||||||
on:change={onManualPageChange}
|
on:change={onManualPageChange}
|
||||||
/>
|
/>
|
||||||
|
<ChevronRightSolid on:click={(e) => right(e, true)} class="hover:text-primary-600" />
|
||||||
<ChervonDoubleRightSolid
|
<ChervonDoubleRightSolid
|
||||||
on:click={() => changePage($settings.rightToLeft ? 1 : pages.length, true)}
|
on:click={() => changePage($settings.rightToLeft ? 1 : pages.length, true)}
|
||||||
class="hover:text-primary-600"
|
class="hover:text-primary-600"
|
||||||
@@ -152,12 +201,9 @@
|
|||||||
<Range min={1} max={pages.length} bind:value={manualPage} on:change={onManualPageChange} />
|
<Range min={1} max={pages.length} bind:value={manualPage} on:change={onManualPageChange} />
|
||||||
</div>
|
</div>
|
||||||
</Popover>
|
</Popover>
|
||||||
<button
|
<button class="absolute opacity-50 left-5 top-5 z-10 mix-blend-difference" id="page-num">
|
||||||
class="absolute opacity-50 left-5 top-5 z-10 mix-blend-difference"
|
<p class="text-left" class:hidden={!$settings.charCount}>{charDisplay}</p>
|
||||||
class:hidden={!$settings.pageNum}
|
<p class="text-left" class:hidden={!$settings.pageNum}>{pageDisplay}</p>
|
||||||
id="page-num"
|
|
||||||
>
|
|
||||||
{pageDisplay}
|
|
||||||
</button>
|
</button>
|
||||||
<div class="flex">
|
<div class="flex">
|
||||||
<Panzoom>
|
<Panzoom>
|
||||||
|
|||||||
@@ -11,6 +11,7 @@
|
|||||||
{ key: 'displayOCR', text: 'OCR enabled', value: $settings.displayOCR },
|
{ key: 'displayOCR', text: 'OCR enabled', value: $settings.displayOCR },
|
||||||
{ key: 'boldFont', text: 'Bold font', value: $settings.boldFont },
|
{ key: 'boldFont', text: 'Bold font', value: $settings.boldFont },
|
||||||
{ key: 'pageNum', text: 'Show page number', value: $settings.pageNum },
|
{ 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 }
|
{ key: 'mobile', text: 'Mobile', value: $settings.mobile }
|
||||||
] as { key: SettingsKey; text: string; value: any }[];
|
] as { key: SettingsKey; text: string; value: any }[];
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ export type Settings = {
|
|||||||
displayOCR: boolean;
|
displayOCR: boolean;
|
||||||
boldFont: boolean;
|
boldFont: boolean;
|
||||||
pageNum: boolean;
|
pageNum: boolean;
|
||||||
|
charCount: boolean;
|
||||||
hasCover: boolean;
|
hasCover: boolean;
|
||||||
mobile: boolean;
|
mobile: boolean;
|
||||||
backgroundColor: string;
|
backgroundColor: string;
|
||||||
@@ -64,6 +65,7 @@ const defaultSettings: Settings = {
|
|||||||
textBoxBorders: false,
|
textBoxBorders: false,
|
||||||
boldFont: false,
|
boldFont: false,
|
||||||
pageNum: true,
|
pageNum: true,
|
||||||
|
charCount: false,
|
||||||
mobile: false,
|
mobile: false,
|
||||||
backgroundColor: '#0d0d0f',
|
backgroundColor: '#0d0d0f',
|
||||||
fontSize: 'auto',
|
fontSize: 'auto',
|
||||||
|
|||||||
Reference in New Issue
Block a user