diff --git a/apps/ba-online-toolbox/package.json b/apps/ba-online-toolbox/package.json index 8bf80f44..e27c2b54 100644 --- a/apps/ba-online-toolbox/package.json +++ b/apps/ba-online-toolbox/package.json @@ -33,7 +33,6 @@ "xxhashjs": "~0.2.2", "@types/xxhashjs": "~0.2.4", "uuid": "~11.0.5", - "radash": "~12.1.0", "mockjs": "~1.1.0", "diff": "~7.0.0", "diff2html": "~3.4.51", @@ -41,7 +40,8 @@ "highlight.js": "~11.11.1", "@types/diff": "~7.0.0", "html2canvas": "~1.4.1", - "@vueuse/components": "~12.4.0" + "@vueuse/components": "~12.4.0", + "radashi": "~12.3.4" }, "devDependencies": { "taze": "^18.1.0", diff --git a/apps/ba-online-toolbox/public/image/diff.svg b/apps/ba-online-toolbox/public/image/diff.svg index ecb865b2..99cb288f 100644 --- a/apps/ba-online-toolbox/public/image/diff.svg +++ b/apps/ba-online-toolbox/public/image/diff.svg @@ -1,5 +1,4 @@ - diff --git a/apps/ba-online-toolbox/public/image/momotalk.svg b/apps/ba-online-toolbox/public/image/momotalk.svg index 0051f1c2..f3a1278e 100644 --- a/apps/ba-online-toolbox/public/image/momotalk.svg +++ b/apps/ba-online-toolbox/public/image/momotalk.svg @@ -1,5 +1,4 @@ - diff --git a/apps/ba-online-toolbox/src/App.vue b/apps/ba-online-toolbox/src/App.vue index 2dbff212..0df5d60e 100644 --- a/apps/ba-online-toolbox/src/App.vue +++ b/apps/ba-online-toolbox/src/App.vue @@ -1,5 +1,5 @@
+

+ {{ props.title[`Text${props.from}`] }} + {{ props.idx + 1 }}/{{ props.total }} +

+
+ + + +
+
+ + + diff --git a/apps/ba-online-toolbox/src/tools/v2-MomotalkEditor/components/MmtkComponents/MmtkUnit.vue b/apps/ba-online-toolbox/src/tools/v2-MomotalkEditor/components/MmtkComponents/MmtkUnit.vue new file mode 100644 index 00000000..123b9651 --- /dev/null +++ b/apps/ba-online-toolbox/src/tools/v2-MomotalkEditor/components/MmtkComponents/MmtkUnit.vue @@ -0,0 +1,78 @@ + + + + + diff --git a/apps/ba-online-toolbox/src/tools/v2-MomotalkEditor/components/MomotalkContainer.vue b/apps/ba-online-toolbox/src/tools/v2-MomotalkEditor/components/MomotalkContainer.vue new file mode 100644 index 00000000..b1b1be01 --- /dev/null +++ b/apps/ba-online-toolbox/src/tools/v2-MomotalkEditor/components/MomotalkContainer.vue @@ -0,0 +1,42 @@ + + + + + diff --git a/apps/ba-online-toolbox/src/tools/v2-MomotalkEditor/components/MomotalkEditorWrapper.vue b/apps/ba-online-toolbox/src/tools/v2-MomotalkEditor/components/MomotalkEditorWrapper.vue new file mode 100644 index 00000000..db27584b --- /dev/null +++ b/apps/ba-online-toolbox/src/tools/v2-MomotalkEditor/components/MomotalkEditorWrapper.vue @@ -0,0 +1,270 @@ + + + + + diff --git a/apps/ba-online-toolbox/src/tools/v2-MomotalkEditor/components/MomotalkFileLoader.vue b/apps/ba-online-toolbox/src/tools/v2-MomotalkEditor/components/MomotalkFileLoader.vue new file mode 100644 index 00000000..1e593c66 --- /dev/null +++ b/apps/ba-online-toolbox/src/tools/v2-MomotalkEditor/components/MomotalkFileLoader.vue @@ -0,0 +1,189 @@ + + diff --git a/apps/ba-online-toolbox/src/tools/v2-MomotalkEditor/components/widgets/EInput.vue b/apps/ba-online-toolbox/src/tools/v2-MomotalkEditor/components/widgets/EInput.vue new file mode 100644 index 00000000..1ea451d7 --- /dev/null +++ b/apps/ba-online-toolbox/src/tools/v2-MomotalkEditor/components/widgets/EInput.vue @@ -0,0 +1,288 @@ + + + + + diff --git a/apps/ba-online-toolbox/src/tools/v2-MomotalkEditor/store/momotalkEditorStore.ts b/apps/ba-online-toolbox/src/tools/v2-MomotalkEditor/store/momotalkEditorStore.ts new file mode 100644 index 00000000..abfab224 --- /dev/null +++ b/apps/ba-online-toolbox/src/tools/v2-MomotalkEditor/store/momotalkEditorStore.ts @@ -0,0 +1,115 @@ +import { defineStore } from "pinia"; +import type { + FileContent, + Language, + Title, + Content, + ContentTranslation, +} from "../types/Momotalks"; + +// composition API 会导致 persistedstate 不能持久化存储 +export const momotalkEditorStore = defineStore("momotalk-editor", { + state: () => ({ + momotalkFileData: null as FileContent | null, + defaultTranslator: "", + defaultProofreader: "", + selectedTranslation: "Jp" as Language, + targetTranslation: "Cn" as Language, + isProofreaderMode: false, + isDownloaded: false, + }), + + getters: { + getMomotalkFileData: state => state.momotalkFileData, + getTranslator: state => + state.momotalkFileData?.translator || state.defaultTranslator, + getProofreader: state => + state.momotalkFileData?.proofreader || state.defaultProofreader, + getMomotalkTitle: state => state.momotalkFileData?.title ?? [], + getSplittedMomotalk: state => state, + getSelectedTranslation: state => state.selectedTranslation, + getTargetTranslation: state => state.targetTranslation, + getProofreaderMode: state => state.isProofreaderMode, + + getMomotalkFromScheduleId: state => (scheduleId: string | number) => { + const msgList = state.momotalkFileData?.content || []; + const favorSchedule = parseInt((scheduleId + "").slice(5)); + if (!favorSchedule) return []; + const scheduleIndex = msgList.findIndex( + el => el.ConditionValue == favorSchedule + ); + let i = scheduleIndex + 1; + while (i < msgList.length) { + if (msgList[i].ConditionValue != 0) { + break; + } + i++; + } + return msgList.slice(scheduleIndex, i); + }, + + getDownloadReadyFileData: state => (isProofreaded: boolean) => { + const { momotalkFileData: preparedData } = state; + if (isProofreaded) { + // 过滤掉 unsure flag + preparedData!.title = preparedData!.title.map( + el => ({ ...el }) as Omit + ); + preparedData!.content = preparedData!.content.map( + el => ({ ...el }) as Omit + ); + } + return preparedData; + }, + getIsDownloaded: state => state.isDownloaded, + }, + + actions: { + setMomotalkFileData(data: FileContent) { + this.momotalkFileData = data; + }, + setTranslator(translator: string) { + this.defaultTranslator = translator; + this.momotalkFileData!.translator = translator; + }, + setProofreader(proofreader: string) { + this.defaultProofreader = proofreader; + this.momotalkFileData!.proofreader = proofreader; + }, + setSelectedTranslation(translation: Language) { + this.selectedTranslation = translation; + }, + setTargetTranslation(translation: Language) { + this.targetTranslation = translation; + }, + setProofreaderMode(mode: boolean) { + this.isProofreaderMode = mode; + }, + setMessage(messageUnit: Content) { + const msgIdx = + this.momotalkFileData?.content.findIndex( + el => el.Id == messageUnit.Id + ) ?? -1; + if (msgIdx > -1) { + this.momotalkFileData!.content[msgIdx] = messageUnit; + } + }, + reset() { + this.momotalkFileData = null; + }, + setIsDownloaded(isDownloaded: boolean) { + this.isDownloaded = isDownloaded; + }, + }, + persist: { + storage: localStorage, + pick: [ + "momotalkFileData", + "defaultTranslator", + "defaultProofreader", + "selectedTranslation", + "targetTranslation", + "isProofreaderMode", + ], + }, +}); diff --git a/apps/ba-online-toolbox/src/tools/v2-MomotalkEditor/types/Momotalks.ts b/apps/ba-online-toolbox/src/tools/v2-MomotalkEditor/types/Momotalks.ts new file mode 100644 index 00000000..239a87dd --- /dev/null +++ b/apps/ba-online-toolbox/src/tools/v2-MomotalkEditor/types/Momotalks.ts @@ -0,0 +1,72 @@ +export type Language = "Kr" | "Jp" | "Cn" | "En" | "Th" | "Tw"; + +export type FileContent = { + CharacterId: number; + translator?: string; + proofreader?: string; + title: Title[]; + content: Content[]; +}; + +export type Title = { + GroupId: number; + FavorScheduleId: number; + CharacterId: number; + TextJp: string; + TextCn: string; + TextKr: string; + TextEn: string; + TextTh: string; + TextTw: string; + unsure?: boolean; +}; + +export type GeneralTranslation = Omit< + Title, + "GroupId" | "FavorScheduleId" | "CharacterId" +>; + +export type Content = { + MessageGroupId: number; + Id: number; + CharacterId: number; + MessageCondition: "None" | "FavorRankUp" | "Answer" | "Feedback"; + ConditionValue: number; + PreConditionGroupId: number; + FavorScheduleId: number; + NextGroupId: number; + FeedbackTimeMillisec: number; + MessageType: "Text" | "Image" | "None"; + ImagePath?: string; + MessageKR?: string; + MessageJP: string; + MessageCN?: string; + MessageEN?: string; + MessageTH?: string; + MessageTW?: string; + unsure?: boolean; +}; + +export type ContentTranslation = Omit< + Content, + "MessageGroupId" | "Id" | "CharacterId" | "MessageCondition" +>; + +export type Student = { + id: number; + familyName: StudentName; + name: StudentName; + nickname: string[] | number[]; + club: string; + affiliation: string; + rarity: number; + type: string; + armorType: string; + weapon: string; +}; + +export type StudentName = { + cn: string; + jp: string; + en: string; +}; diff --git a/apps/ba-online-toolbox/vite.config.ts b/apps/ba-online-toolbox/vite.config.ts index ef601181..de5f5612 100644 --- a/apps/ba-online-toolbox/vite.config.ts +++ b/apps/ba-online-toolbox/vite.config.ts @@ -4,8 +4,11 @@ import { defineConfig } from "vite"; import legacy from "@vitejs/plugin-legacy"; import vue from "@vitejs/plugin-vue"; import AutoImport from "unplugin-auto-import/vite"; -import { ElementPlusResolver } from "unplugin-vue-components/resolvers"; -import { NaiveUiResolver } from "unplugin-vue-components/resolvers"; +import { + ElementPlusResolver, + NaiveUiResolver, + ArcoResolver, +} from "unplugin-vue-components/resolvers"; import Components from "unplugin-vue-components/vite"; import UnoCSS from "unocss/vite"; import { @@ -51,10 +54,16 @@ export default defineConfig({ AutoImport({ include: [/\.[tj]sx?$/, /\.vue$/, /\.vue\?vue/, /\.md$/], imports: ["vue", "vue-router"], - resolvers: [ElementPlusResolver(), NaiveUiResolver()], + resolvers: [ElementPlusResolver(), NaiveUiResolver(), ArcoResolver()], }), Components({ - resolvers: [ElementPlusResolver(), NaiveUiResolver()], + resolvers: [ + ElementPlusResolver(), + NaiveUiResolver(), + ArcoResolver({ + sideEffect: true, + }), + ], }), vue(), UnoCSS({ diff --git a/apps/viewer-next/nuxt.config.ts b/apps/viewer-next/nuxt.config.ts index 5a3c21ed..8d0e3085 100644 --- a/apps/viewer-next/nuxt.config.ts +++ b/apps/viewer-next/nuxt.config.ts @@ -28,7 +28,6 @@ export default defineNuxtConfig({ "@pinia-plugin-persistedstate/nuxt", // "nuxt-swiper", "nuxt-typed-router", - "nuxt-radash", ], vite: { css: { diff --git a/apps/viewer-next/package.json b/apps/viewer-next/package.json index eaa40031..b825a42d 100644 --- a/apps/viewer-next/package.json +++ b/apps/viewer-next/package.json @@ -26,7 +26,8 @@ "element-plus": "^2.9.3", "@vitejs/plugin-vue-jsx": "~4.1.1", "markdown-it-implicit-figures": "~0.12.0", - "@mdit/plugin-img-size": "~0.14.0" + "@mdit/plugin-img-size": "~0.14.0", + "radashi": "~12.3.4" }, "devDependencies": { "@formkit/auto-animate": "^0.8.2", @@ -38,7 +39,6 @@ "@pinia/nuxt": "^0.5.4", "@unocss/nuxt": "^65.4.0", "@vueuse/nuxt": "^12.4.0", - "nuxt-radash": "^1.0.0", "nuxt-swiper": "^2.0.0", "nuxt-typed-router": "^3.7.3" } diff --git a/common/config/rush/pnpm-lock.yaml b/common/config/rush/pnpm-lock.yaml index 20a07fdc..d4dbe2b3 100644 --- a/common/config/rush/pnpm-lock.yaml +++ b/common/config/rush/pnpm-lock.yaml @@ -84,9 +84,9 @@ importers: pinia-plugin-persistedstate: specifier: ^4.2.0 version: 4.2.0(@pinia/nuxt@0.5.5(magicast@0.3.5)(rollup@4.24.0)(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3)))(magicast@0.3.5)(pinia@2.3.0(typescript@5.7.3)(vue@3.5.13(typescript@5.7.3)))(rollup@4.24.0) - radash: - specifier: ~12.1.0 - version: 12.1.0 + radashi: + specifier: ~12.3.4 + version: 12.3.4 unocss: specifier: ^65.4.0 version: 65.4.0(@unocss/webpack@65.4.0(rollup@4.24.0))(postcss@8.4.49)(rollup@4.24.0)(vite@5.4.10(@types/node@22.10.5)(sass@1.83.1)(terser@5.37.0))(vue@3.5.13(typescript@5.7.3)) @@ -729,6 +729,9 @@ importers: nuxt: specifier: 3.15.1 version: 3.15.1(@parcel/watcher@2.4.1)(@types/node@22.10.5)(db0@0.2.1)(eslint@9.18.0(jiti@2.4.2))(magicast@0.3.5)(optionator@0.9.3)(rollup@4.24.0)(sass@1.83.1)(terser@5.37.0)(tsx@4.19.1)(typescript@5.7.3)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(sass@1.83.1)(terser@5.37.0)(tsx@4.19.1)(yaml@2.7.0))(yaml@2.7.0) + radashi: + specifier: ~12.3.4 + version: 12.3.4 unocss: specifier: ^65.4.0 version: 65.4.0(@unocss/webpack@65.4.0(rollup@4.24.0))(postcss@8.4.49)(rollup@4.24.0)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(sass@1.83.1)(terser@5.37.0)(tsx@4.19.1)(yaml@2.7.0))(vue@3.5.13(typescript@5.7.3)) @@ -772,9 +775,6 @@ importers: '@vueuse/nuxt': specifier: ^12.4.0 version: 12.4.0(magicast@0.3.5)(nuxt@3.15.1(@parcel/watcher@2.4.1)(@types/node@22.10.5)(db0@0.2.1)(eslint@9.18.0(jiti@2.4.2))(magicast@0.3.5)(optionator@0.9.3)(rollup@4.24.0)(sass@1.83.1)(terser@5.37.0)(tsx@4.19.1)(typescript@5.7.3)(vite@6.0.7(@types/node@22.10.5)(jiti@2.4.2)(sass@1.83.1)(terser@5.37.0)(tsx@4.19.1)(yaml@2.7.0))(yaml@2.7.0))(rollup@4.24.0)(typescript@5.7.3) - nuxt-radash: - specifier: ^1.0.0 - version: 1.0.0(magicast@0.3.5)(rollup@4.24.0)(webpack-sources@3.2.3) nuxt-swiper: specifier: ^2.0.0 version: 2.0.0(magicast@0.3.5)(rollup@4.24.0) @@ -8328,9 +8328,6 @@ packages: engines: {node: ^16.10.0 || >=18.0.0} hasBin: true - nuxt-radash@1.0.0: - resolution: {integrity: sha512-Ms24jNb2HCCRvcshr57T31JG9ZI+tWxWWmnToyVCEdCFgRBv3bsu5aKyHtofRQlSYdEB5b1oZHv4a2E1bMtfEg==} - nuxt-site-config-kit@3.0.6: resolution: {integrity: sha512-QBOFzAIo+D02avFQQ7gNlRyA372/PQlgW2IjL2nttvjfHapqYbvP6tIP55soL+1+D8YvF/bGZgS+vJtfQhroUg==} @@ -9169,14 +9166,14 @@ packages: queue-tick@1.0.1: resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} - radash@11.0.0: - resolution: {integrity: sha512-CRWxTFTDff0IELGJ/zz58yY4BDgyI14qSM5OLNKbCItJrff7m7dXbVF0kWYVCXQtPb3SXIVhXvAImH6eT7VLSg==} - engines: {node: '>=14.18.0'} - radash@12.1.0: resolution: {integrity: sha512-b0Zcf09AhqKS83btmUeYBS8tFK7XL2e3RvLmZcm0sTdF1/UUlHSsjXdCcWNxe7yfmAlPve5ym0DmKGtTzP6kVQ==} engines: {node: '>=14.18.0'} + radashi@12.3.4: + resolution: {integrity: sha512-EC+EhNBJItMLo/D3GR87raHf7W1hkbHUT7Y3Y7/3O+cwMOulRfuZ3g+EU0KT9eikaj8vwLA4ia+bdaXkBGuT4Q==} + engines: {node: '>=16.0.0'} + radix3@1.1.2: resolution: {integrity: sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==} @@ -19876,16 +19873,6 @@ snapshots: nuxi@3.20.0: {} - nuxt-radash@1.0.0(magicast@0.3.5)(rollup@4.24.0)(webpack-sources@3.2.3): - dependencies: - '@nuxt/kit': 3.12.4(magicast@0.3.5)(rollup@4.24.0)(webpack-sources@3.2.3) - radash: 11.0.0 - transitivePeerDependencies: - - magicast - - rollup - - supports-color - - webpack-sources - nuxt-site-config-kit@3.0.6(magicast@0.3.5)(rollup@4.24.0)(vue@3.5.13(typescript@5.7.3)): dependencies: '@nuxt/kit': 3.15.1(magicast@0.3.5)(rollup@4.24.0) @@ -20947,10 +20934,10 @@ snapshots: queue-tick@1.0.1: {} - radash@11.0.0: {} - radash@12.1.0: {} + radashi@12.3.4: {} + radix3@1.1.2: {} randombytes@2.1.0: