From c1dbe886a0a9537cb61a4e211de583bcffbe2bf8 Mon Sep 17 00:00:00 2001 From: kwaroran Date: Sat, 11 Nov 2023 14:00:54 +0900 Subject: [PATCH] [feat] metrica plugin --- src/lang/en.ts | 1 + src/lib/Setting/Pages/PluginSettings.svelte | 6 ++ src/ts/plugins/metrica.ts | 68 +++++++++++++++++++++ src/ts/process/scripts.ts | 7 +++ src/ts/storage/database.ts | 1 + 5 files changed, 83 insertions(+) create mode 100644 src/ts/plugins/metrica.ts diff --git a/src/lang/en.ts b/src/lang/en.ts index 1beef228..c98423b1 100644 --- a/src/lang/en.ts +++ b/src/lang/en.ts @@ -99,6 +99,7 @@ export const languageEnglish = { romanizer: "Romanizer is a plugin that converts non-roman characters to roman characters to reduce tokens when using non-roman characters while requesting data. this can result diffrent output from the original model. it is not recommended to use this plugin when using roman characters on chat.", oaiRandomUser: "If enabled, random uuid would be put on user parameter on request, and would be changed on refresh. this can be used to prevent AI from identifying user.", inlayImages: "If enabled, images could be inlayed to the chat and AIs can see it if they support it.", + metrica: 'Metric Systemizer is a plugin that converts metrics to imperial units when request, and vice versa on output to show user metric system while using imperial for performace. it is not recommended to use this plugin when using imperial units on chat.', }, setup: { chooseProvider: "Choose AI Provider", diff --git a/src/lib/Setting/Pages/PluginSettings.svelte b/src/lib/Setting/Pages/PluginSettings.svelte index 342d6164..de0a486f 100644 --- a/src/lib/Setting/Pages/PluginSettings.svelte +++ b/src/lib/Setting/Pages/PluginSettings.svelte @@ -30,6 +30,12 @@
+
+ Metric Systemizer (Official Plugin) +
+
+ +
{#each $DataBase.plugins as plugin, i}
diff --git a/src/ts/plugins/metrica.ts b/src/ts/plugins/metrica.ts new file mode 100644 index 00000000..23f9adc5 --- /dev/null +++ b/src/ts/plugins/metrica.ts @@ -0,0 +1,68 @@ + +const convertion:[string,string,number][] = [ + ['kg', 'lbs', 2.20462], + ['m', 'ft', 3.28084], + ['cm', 'in', 0.393701], + ['mm', 'in', 0.0393701], + ['km', 'mi', 0.621371], + ['killogram', 'pound', 2.20462], + ['meter', 'foot', 3.28084], + ['centimeter', 'inch', 0.393701], + ['millimeter', 'inch', 0.0393701], + ['kilometer', 'mile', 0.621371], +] + +export function metricaPlugin(data:string, toSystem:'metrics'|'imperial'){ + const c = convertion.sort((a,b) => b[0].length - a[0].length); + + for(let i=0;i 0){ + i--; + if(data[i] === ' ' || data[i] === '\n' || data[i] === '\t' || data[i] === ','){ + continue + } + if(data[i] === '.'){ + number = '.' + number; + continue; + } + if(isNaN(Number(data[i]))){ + break; + } + number = data[i] + number; + } + i++ + while(data[i] === ' ' || data[i] === '\n' || data[i] === '\t' || data[i] === ','){ + i++; + } + return { + number: number === '' ? 0 : Number(number), + index: i + }; + } + + let sub = '' + let sublen = 0; + for(let j=0;j= 1) ? num.toFixed(0) : num.toFixed(1); + const newData = data.substring(0, n.index) + rto + ' ' + to + data.substring(i+from.length); + const offset = newData.length - data.length; + i += offset; + data = newData; + } + } + } + + } + return data +} \ No newline at end of file diff --git a/src/ts/process/scripts.ts b/src/ts/process/scripts.ts index 0c86592c..5253da2f 100644 --- a/src/ts/process/scripts.ts +++ b/src/ts/process/scripts.ts @@ -8,6 +8,7 @@ import { selectSingleFile } from "../util"; import { risuChatParser as risuChatParserOrg, type simpleCharacterArgument } from "../parser"; import { autoMarkPlugin } from "../plugins/automark"; import { runCharacterJS } from "../plugins/embedscript"; +import { metricaPlugin } from "../plugins/metrica"; const dreg = /{{data}}/g const randomness = /\|\|\|/g @@ -62,6 +63,12 @@ export async function processScriptFull(char:character|groupChat|simpleCharacter if(db.officialplugins.automark && mode === 'editdisplay'){ data = autoMarkPlugin(data) } + if(db.officialplugins.metrica && mode === 'editdisplay'){ + data = metricaPlugin(data, 'metrics') + } + if(db.officialplugins.metrica && (mode === 'editinput' || mode === 'editoutput')){ + data = metricaPlugin(data, 'imperial') + } data = await runCharacterJS({ code: char.virtualscript ?? null, mode, diff --git a/src/ts/storage/database.ts b/src/ts/storage/database.ts index 0f48b2dd..40e6f696 100644 --- a/src/ts/storage/database.ts +++ b/src/ts/storage/database.ts @@ -363,6 +363,7 @@ export interface Database{ officialplugins: { automark?: boolean romanizer?: boolean + metrica?: boolean } currentPluginProvider: string zoomsize:number