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.
- package/dist/__tests__/generators.test.js +32 -8
- package/dist/__tests__/generators.test.js.map +1 -1
- package/dist/checker/checker.d.ts.map +1 -1
- package/dist/checker/checker.js +23 -1
- package/dist/checker/checker.js.map +1 -1
- package/dist/cli/commands/build.js +1 -1
- package/dist/cli/commands/build.js.map +1 -1
- package/dist/formatter/formatter.d.ts.map +1 -1
- package/dist/formatter/formatter.js +6 -1
- package/dist/formatter/formatter.js.map +1 -1
- package/dist/generators/musicxml.d.ts +1 -1
- package/dist/generators/musicxml.d.ts.map +1 -1
- package/dist/generators/musicxml.js +18 -1
- package/dist/generators/musicxml.js.map +1 -1
- package/dist/interpreter/interpreter.d.ts.map +1 -1
- package/dist/interpreter/interpreter.js +76 -5
- package/dist/interpreter/interpreter.js.map +1 -1
- package/dist/interpreter/runtime.d.ts +5 -3
- package/dist/interpreter/runtime.d.ts.map +1 -1
- package/dist/interpreter/runtime.js +3 -0
- package/dist/interpreter/runtime.js.map +1 -1
- package/dist/lexer/lexer.d.ts.map +1 -1
- package/dist/lexer/lexer.js +17 -1
- package/dist/lexer/lexer.js.map +1 -1
- package/dist/parser/parser.d.ts.map +1 -1
- package/dist/parser/parser.js +35 -5
- package/dist/parser/parser.js.map +1 -1
- package/dist/types/ast.d.ts +4 -3
- package/dist/types/ast.d.ts.map +1 -1
- package/dist/utils/kanji.d.ts +18 -0
- package/dist/utils/kanji.d.ts.map +1 -0
- package/dist/utils/kanji.js +77 -0
- package/dist/utils/kanji.js.map +1 -0
- package/package.json +3 -1
|
@@ -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.
|
|
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": {
|