takomusic 1.3.10 → 1.3.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,77 @@
1
+ // Kanji to Hiragana conversion utility using kuroshiro
2
+ // @ts-ignore - kuroshiro has no type definitions
3
+ import Kuroshiro from 'kuroshiro';
4
+ // @ts-ignore - kuroshiro-analyzer-kuromoji has no type definitions
5
+ import KuromojiAnalyzer from 'kuroshiro-analyzer-kuromoji';
6
+ // Singleton instance
7
+ let kuroshiroInstance = null;
8
+ let initPromise = null;
9
+ // Check if string contains kanji (CJK Unified Ideographs)
10
+ export function containsKanji(str) {
11
+ return /[\u4E00-\u9FFF]/.test(str);
12
+ }
13
+ // Initialize kuroshiro (must be called before conversion)
14
+ async function initKuroshiro() {
15
+ if (kuroshiroInstance)
16
+ return;
17
+ if (initPromise) {
18
+ await initPromise;
19
+ return;
20
+ }
21
+ initPromise = (async () => {
22
+ kuroshiroInstance = new Kuroshiro();
23
+ await kuroshiroInstance.init(new KuromojiAnalyzer());
24
+ })();
25
+ await initPromise;
26
+ }
27
+ /**
28
+ * Convert kanji to hiragana
29
+ * @param text Text that may contain kanji
30
+ * @returns Text with kanji converted to hiragana
31
+ */
32
+ export async function kanjiToHiragana(text) {
33
+ if (!containsKanji(text)) {
34
+ return text;
35
+ }
36
+ await initKuroshiro();
37
+ if (!kuroshiroInstance) {
38
+ throw new Error('Failed to initialize kuroshiro');
39
+ }
40
+ return kuroshiroInstance.convert(text, { to: 'hiragana' });
41
+ }
42
+ /**
43
+ * Convert kanji to hiragana synchronously using cache
44
+ * For use in contexts where async is not available
45
+ * Returns original text if conversion not cached
46
+ */
47
+ const conversionCache = new Map();
48
+ export async function preloadKanjiConversions(texts) {
49
+ const textsWithKanji = texts.filter(containsKanji);
50
+ if (textsWithKanji.length === 0)
51
+ return;
52
+ await initKuroshiro();
53
+ for (const text of textsWithKanji) {
54
+ if (!conversionCache.has(text)) {
55
+ const converted = await kanjiToHiragana(text);
56
+ conversionCache.set(text, converted);
57
+ }
58
+ }
59
+ }
60
+ export function getCachedHiragana(text) {
61
+ return conversionCache.get(text) ?? null;
62
+ }
63
+ /**
64
+ * Convert all kanji lyrics in an array of note-like objects
65
+ * Returns the texts with kanji converted to hiragana
66
+ */
67
+ export async function convertKanjiLyrics(lyrics) {
68
+ const results = [];
69
+ for (const lyric of lyrics) {
70
+ if (containsKanji(lyric)) {
71
+ const converted = await kanjiToHiragana(lyric);
72
+ results.push({ original: lyric, converted });
73
+ }
74
+ }
75
+ return results;
76
+ }
77
+ //# sourceMappingURL=kanji.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kanji.js","sourceRoot":"","sources":["../../src/utils/kanji.ts"],"names":[],"mappings":"AAAA,uDAAuD;AAEvD,iDAAiD;AACjD,OAAO,SAAS,MAAM,WAAW,CAAC;AAClC,mEAAmE;AACnE,OAAO,gBAAgB,MAAM,6BAA6B,CAAC;AAE3D,qBAAqB;AACrB,IAAI,iBAAiB,GAAqB,IAAI,CAAC;AAC/C,IAAI,WAAW,GAAyB,IAAI,CAAC;AAE7C,0DAA0D;AAC1D,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,OAAO,iBAAiB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACrC,CAAC;AAED,0DAA0D;AAC1D,KAAK,UAAU,aAAa;IAC1B,IAAI,iBAAiB;QAAE,OAAO;IAE9B,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,WAAW,CAAC;QAClB,OAAO;IACT,CAAC;IAED,WAAW,GAAG,CAAC,KAAK,IAAI,EAAE;QACxB,iBAAiB,GAAG,IAAI,SAAS,EAAE,CAAC;QACpC,MAAM,iBAAiB,CAAC,IAAI,CAAC,IAAI,gBAAgB,EAAE,CAAC,CAAC;IACvD,CAAC,CAAC,EAAE,CAAC;IAEL,MAAM,WAAW,CAAC;AACpB,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAY;IAChD,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC;QACzB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,aAAa,EAAE,CAAC;IAEtB,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;IACpD,CAAC;IAED,OAAO,iBAAiB,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,UAAU,EAAE,CAAC,CAAC;AAC7D,CAAC;AAED;;;;GAIG;AACH,MAAM,eAAe,GAAG,IAAI,GAAG,EAAkB,CAAC;AAElD,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,KAAe;IAC3D,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;IACnD,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAExC,MAAM,aAAa,EAAE,CAAC;IAEtB,KAAK,MAAM,IAAI,IAAI,cAAc,EAAE,CAAC;QAClC,IAAI,CAAC,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,IAAI,CAAC,CAAC;YAC9C,eAAe,CAAC,GAAG,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;QACvC,CAAC;IACH,CAAC;AACH,CAAC;AAED,MAAM,UAAU,iBAAiB,CAAC,IAAY;IAC5C,OAAO,eAAe,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;AAC3C,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,MAAgB;IAEhB,MAAM,OAAO,GAA8C,EAAE,CAAC;IAE9D,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,SAAS,GAAG,MAAM,eAAe,CAAC,KAAK,CAAC,CAAC;YAC/C,OAAO,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;QAC/C,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "takomusic",
3
- "version": "1.3.10",
3
+ "version": "1.3.12",
4
4
  "description": "TakoMusic - A domain-specific language for music composition that generates VSQX, MusicXML, and MIDI",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -41,6 +41,8 @@
41
41
  "vitest": "^1.0.0"
42
42
  },
43
43
  "dependencies": {
44
+ "kuroshiro": "^1.2.0",
45
+ "kuroshiro-analyzer-kuromoji": "^1.1.0",
44
46
  "toml": "^3.0.0"
45
47
  },
46
48
  "engines": {