From 7253c8777427220579a26da76e58277bbe1cda20 Mon Sep 17 00:00:00 2001 From: Botvid Johansson Date: Fri, 7 Feb 2025 11:51:49 +0100 Subject: [PATCH] =?UTF-8?q?man=20kan=20skriva=20med=20f=C3=B6rkortningar?= =?UTF-8?q?=20fr=C3=A5n=20standardlistan?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/textarea.svelte | 28 +++++++++++++++-- src/lib/textarea/main.ts | 1 - src/modules/shortforms.ts | 57 ++++++++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+), 4 deletions(-) create mode 100644 src/modules/shortforms.ts diff --git a/src/components/textarea.svelte b/src/components/textarea.svelte index 4ec7042..bda1c2e 100644 --- a/src/components/textarea.svelte +++ b/src/components/textarea.svelte @@ -3,9 +3,13 @@ import { browser } from '$app/environment'; import { getCurrentWord, insertExpandedPhrase, insertText } from '$lib/textarea/main'; + import { cacheShortforms, expandShortform } from '../modules/shortforms'; + import { defaultExpanders } from '../modules/keyboard'; import type { Shortform } from '../db/main'; + import AccordionTrigger from '$lib/components/ui/accordion/accordion-trigger.svelte'; export let activeShortforms: Array; + let shortforms: Map; let state = { capitalizeNext: true, currentWord: '' @@ -15,18 +19,36 @@ let text = ''; onMount(() => { + shortforms = cacheShortforms([890324]); if (browser) { let t = document.getElementById('doc') as HTMLTextAreaElement; if (t != null) { textarea = t; setTimeout(() => { textarea.focus(); - console.log('focus the textarae'); + console.log('focus the textarea'); }, 25); } } }); + const expand = (e: InputEvent) => { + const expander = e.data as string; + // console.log("expander:", expander); + if (defaultExpanders.has(expander)) { + const expanderRules = defaultExpanders.get(expander)!; + const currentWord = getCurrentWord(textarea).trim(); + const expandedPhrase = expandShortform(shortforms, currentWord); + if (expanderRules.fullstop) { + // console.log("should capitalize next"); + state.capitalizeNext = true; + } + if (expandedPhrase != '') { + insertExpandedPhrase(textarea, expander, currentWord.length, expandedPhrase); + e.preventDefault(); + } + } + }; const change = () => { if (textarea != null) { if (textarea.value.length == 0) { @@ -34,6 +56,7 @@ } } }; + const input = (e: InputEvent) => { if (e.inputType == 'insertText') { const key = e.data || ''; @@ -43,8 +66,7 @@ state.capitalizeNext = false; e.preventDefault(); } - //expand(e); - console.log(activeShortforms); + expand(e); } if (e.inputType == 'insertText') { } diff --git a/src/lib/textarea/main.ts b/src/lib/textarea/main.ts index c297c3b..0437830 100644 --- a/src/lib/textarea/main.ts +++ b/src/lib/textarea/main.ts @@ -19,7 +19,6 @@ const findIndexOfCurrentWord = (textarea: HTMLTextAreaElement) => { startIndex >= 0 && /\p{Letter}|\p{Number}/u.test(currentValue[startIndex]) ) { - console.log(currentValue[startIndex]); startIndex--; } return startIndex; diff --git a/src/modules/shortforms.ts b/src/modules/shortforms.ts new file mode 100644 index 0000000..f989453 --- /dev/null +++ b/src/modules/shortforms.ts @@ -0,0 +1,57 @@ +import { db } from "../db/main" +import { type Shortform } from "../db/main" +export function cacheShortforms(lists: Array = []) { + let shortforms = new Map(); + // console.log("Caching shortforms with lists:", lists); + + var n = 0; + var shortforms_length = 0; + var phrases_length = 0; + if (lists.length < 1) { + default_shortforms.map((sf: ShortformExportType) => { + shortforms.set(sf.sf, { phrase: sf.p, last: sf.u }); + /* + n += 1; + shortforms_length += sf.sf.length; + phrases_length += sf.p.length; + */ + }); + /* + console.log("Average shortform length:", shortforms_length / n); + console.log("Average phrases length:", phrases_length / n); + */ + } + else { + lists.forEach(listid => { + db.shortforms.where("listid").equals(listid).toArray().then(sfs => { + sfs.forEach(sf => { + shortforms.set(sf.shortform, sf) + }) + }) + + }) + } + return shortforms; +} +export function expandShortform( + cache: Map, + ShortForm: string, +): string { + const u = new Date(); + const shortform = ShortForm.toLowerCase(); + if (cache.has(shortform)) { + const phrase = cache.get(shortform).phrase; + cache.set(shortform, { phrase: phrase, last: u }); + + if (shortform.match(/(\d+)/) || ShortForm === shortform) { + return phrase; + } else if (ShortForm === shortform.toUpperCase() && ShortForm.length > 1) { + return phrase.toUpperCase(); + } else if (/^\p{Lu}(\p{L}*)/u.test(ShortForm)) { + return phrase.charAt(0).toUpperCase() + phrase.substring(1); + } else { + return phrase; + } + } + return ""; +}