henkan 0.4.0 → 0.5.0
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/index.cjs.js +103 -71
- package/dist/index.cjs.js.map +3 -3
- package/dist/index.mjs +99 -69
- package/dist/index.mjs.map +3 -3
- package/dist/types/types.d.ts +5 -3
- package/dist/types/types.d.ts.map +1 -1
- package/dist/types/utils.d.ts +2 -2
- package/dist/types/utils.d.ts.map +1 -1
- package/docs/api/functions/capitalizeString.md +1 -1
- package/docs/api/functions/convertJMdict.md +3 -3
- package/docs/api/functions/convertKanjiDic.md +1 -1
- package/docs/api/functions/convertKradFile.md +1 -1
- package/docs/api/functions/convertRadkFile.md +1 -1
- package/docs/api/functions/convertTanakaCorpus.md +1 -1
- package/docs/api/functions/generateAnkiNote.md +1 -1
- package/docs/api/functions/generateAnkiNotesFile.md +1 -1
- package/docs/api/functions/getKanji.md +1 -1
- package/docs/api/functions/getKanjiExtended.md +1 -1
- package/docs/api/functions/getWord.md +1 -1
- package/docs/api/functions/isStringArray.md +1 -1
- package/docs/api/functions/isValidArray.md +1 -1
- package/docs/api/functions/isValidArrayWithFirstElement.md +1 -1
- package/docs/api/functions/makeSSML.md +1 -1
- package/docs/api/functions/shuffleArray.md +1 -1
- package/docs/api/functions/synthesizeSpeech.md +1 -1
- package/docs/api/interfaces/DictKanji.md +5 -5
- package/docs/api/interfaces/DictKanjiForm.md +4 -4
- package/docs/api/interfaces/DictKanjiMisc.md +5 -5
- package/docs/api/interfaces/DictKanjiReading.md +3 -3
- package/docs/api/interfaces/DictKanjiReadingMeaning.md +3 -3
- package/docs/api/interfaces/DictKanjiReadingMeaningGroup.md +3 -3
- package/docs/api/interfaces/DictKanjiWithRadicals.md +3 -3
- package/docs/api/interfaces/DictMeaning.md +11 -11
- package/docs/api/interfaces/DictRadical.md +4 -4
- package/docs/api/interfaces/DictReading.md +5 -5
- package/docs/api/interfaces/DictWord.md +19 -17
- package/docs/api/interfaces/ExamplePart.md +7 -7
- package/docs/api/interfaces/Grammar.md +15 -15
- package/docs/api/interfaces/GrammarMeaning.md +3 -3
- package/docs/api/interfaces/Kana.md +11 -11
- package/docs/api/interfaces/Kanji.md +22 -22
- package/docs/api/interfaces/KanjiComponent.md +3 -3
- package/docs/api/interfaces/KanjiForm.md +4 -4
- package/docs/api/interfaces/NoteAndTag.md +3 -3
- package/docs/api/interfaces/Phrase.md +4 -4
- package/docs/api/interfaces/Radical.md +16 -16
- package/docs/api/interfaces/Reading.md +5 -5
- package/docs/api/interfaces/ResultEntry.md +7 -7
- package/docs/api/interfaces/TanakaExample.md +6 -6
- package/docs/api/interfaces/Translation.md +3 -3
- package/docs/api/interfaces/UsefulRegExps.md +9 -9
- package/docs/api/interfaces/Word.md +16 -16
- package/docs/api/type-aliases/Dict.md +1 -1
- package/docs/api/type-aliases/DictName.md +1 -1
- package/docs/api/type-aliases/EntryType.md +1 -1
- package/docs/api/type-aliases/JLPT.md +1 -1
- package/docs/api/type-aliases/Result.md +1 -1
- package/package.json +2 -2
package/dist/index.cjs.js
CHANGED
|
@@ -1225,6 +1225,15 @@ function convertJMdict(xmlString, examples) {
|
|
|
1225
1225
|
const dict = [];
|
|
1226
1226
|
import_xml2js.default.parseString(dictParsed, (err, result) => {
|
|
1227
1227
|
if (err) throw err;
|
|
1228
|
+
const tanakaParts = examples && examples.length > 0 ? new Set(
|
|
1229
|
+
examples.map(
|
|
1230
|
+
(example) => example.parts.map((part) => [
|
|
1231
|
+
part.baseForm,
|
|
1232
|
+
...part.reading ? [part.reading] : [],
|
|
1233
|
+
...part.referenceID ? [part.referenceID] : []
|
|
1234
|
+
])
|
|
1235
|
+
).flat(2)
|
|
1236
|
+
) : void 0;
|
|
1228
1237
|
if (result.JMdict && typeof result.JMdict === "object" && isValidArray(result.JMdict.entry))
|
|
1229
1238
|
for (const entry of result.JMdict.entry) {
|
|
1230
1239
|
const entryObj = {
|
|
@@ -1330,70 +1339,24 @@ function convertJMdict(xmlString, examples) {
|
|
|
1330
1339
|
)) && (entryObj.isCommon === void 0 || kanjiForm.commonness && kanjiForm.commonness.length > 0)
|
|
1331
1340
|
).map((kanjiForm) => kanjiForm.form)
|
|
1332
1341
|
) : void 0;
|
|
1333
|
-
|
|
1334
|
-
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
for (const part of example.parts) {
|
|
1339
|
-
const readingAsReadingMatch = part.reading !== void 0 && readings2.has(part.reading);
|
|
1340
|
-
if (kanjiForms2 && kanjiForms2.size > 0 && kanjiForms2.has(part.baseForm)) {
|
|
1341
|
-
if (readingAsReadingMatch) {
|
|
1342
|
-
readingMatchingKanjiFormExamples.push(example);
|
|
1343
|
-
partParts.add(part.baseForm).add(part.reading);
|
|
1344
|
-
} else {
|
|
1345
|
-
kanjiFormExamples.push(example);
|
|
1346
|
-
partParts.add(part.baseForm);
|
|
1347
|
-
}
|
|
1342
|
+
let existsExample = false;
|
|
1343
|
+
if (kanjiForms2 && kanjiForms2.size > 0 && tanakaParts) {
|
|
1344
|
+
for (const kf of kanjiForms2)
|
|
1345
|
+
if (tanakaParts.has(kf)) {
|
|
1346
|
+
existsExample = true;
|
|
1348
1347
|
break;
|
|
1349
1348
|
}
|
|
1350
|
-
|
|
1351
|
-
|
|
1352
|
-
|
|
1353
|
-
|
|
1354
|
-
|
|
1355
|
-
readingExamples.push(example);
|
|
1356
|
-
if (readingAsReadingMatch) partParts.add(part.reading);
|
|
1357
|
-
if (readingAsBaseFormMatch) partParts.add(part.baseForm);
|
|
1358
|
-
if (referenceIDMatch) partParts.add(part.referenceID);
|
|
1349
|
+
}
|
|
1350
|
+
if (!existsExample && readings2.size > 0 && tanakaParts) {
|
|
1351
|
+
for (const r of readings2)
|
|
1352
|
+
if (tanakaParts.has(r)) {
|
|
1353
|
+
existsExample = true;
|
|
1359
1354
|
break;
|
|
1360
1355
|
}
|
|
1361
|
-
}
|
|
1362
|
-
const exampleSize = readingMatchingKanjiFormExamples.length + kanjiFormExamples.length + readingExamples.length;
|
|
1363
|
-
const includeKanjiFormExamples = readingMatchingKanjiFormExamples.length < Math.max(2, Math.round(exampleSize * 0.05));
|
|
1364
|
-
const includeReadingExamples = entryObj.usuallyInKana === void 0 && includeKanjiFormExamples && readingExamples.length >= Math.max(10, Math.round(exampleSize * 0.15)) || entryObj.usuallyInKana === true && readingExamples.length >= Math.max(2, Math.round(exampleSize * 0.5));
|
|
1365
|
-
let wordExamples = [
|
|
1366
|
-
...readingMatchingKanjiFormExamples,
|
|
1367
|
-
...includeKanjiFormExamples ? kanjiFormExamples : [],
|
|
1368
|
-
...includeReadingExamples ? readingExamples : []
|
|
1369
|
-
];
|
|
1370
|
-
const glossSpecificExamples = [];
|
|
1371
|
-
const seenPhrases = /* @__PURE__ */ new Set();
|
|
1372
|
-
for (let i = 0; i < entryObj.meanings.length; i++) {
|
|
1373
|
-
outer: for (const example of wordExamples) {
|
|
1374
|
-
if (seenPhrases.has(example.phrase)) continue;
|
|
1375
|
-
for (const part of example.parts)
|
|
1376
|
-
if (part.glossNumber === i + 1 && (partParts.has(part.baseForm) || part.reading && partParts.has(part.reading) || part.referenceID && partParts.has(part.referenceID))) {
|
|
1377
|
-
glossSpecificExamples.push(example);
|
|
1378
|
-
seenPhrases.add(example.phrase);
|
|
1379
|
-
break outer;
|
|
1380
|
-
}
|
|
1381
|
-
}
|
|
1382
|
-
if (glossSpecificExamples.length === 5) break;
|
|
1383
1356
|
}
|
|
1384
|
-
if (
|
|
1385
|
-
|
|
1386
|
-
|
|
1387
|
-
const seenPhrases2 = new Set(
|
|
1388
|
-
glossSpecificExamples.map((ex) => ex.phrase)
|
|
1389
|
-
);
|
|
1390
|
-
wordExamples = [
|
|
1391
|
-
...glossSpecificExamples,
|
|
1392
|
-
...wordExamples.filter((ex) => !seenPhrases2.has(ex.phrase)).slice(0, 5 - glossSpecificExamples.length)
|
|
1393
|
-
];
|
|
1394
|
-
}
|
|
1395
|
-
if (wordExamples.length > 0)
|
|
1396
|
-
entryObj.phraseIDs = (wordExamples.length > 5 ? wordExamples.slice(0, 5) : wordExamples).map((ex) => ex.id);
|
|
1357
|
+
if (!existsExample && tanakaParts && tanakaParts.has(entryObj.id))
|
|
1358
|
+
existsExample = true;
|
|
1359
|
+
if (existsExample) entryObj.hasPhrases = true;
|
|
1397
1360
|
}
|
|
1398
1361
|
if (entryObj.id.length > 0 && entryObj.readings.length > 0 && entryObj.meanings.length > 0)
|
|
1399
1362
|
dict.push(entryObj);
|
|
@@ -1662,7 +1625,6 @@ var wordAddNoteArray = (arr, cb) => {
|
|
|
1662
1625
|
for (const v of arr) cb(v);
|
|
1663
1626
|
};
|
|
1664
1627
|
function getWord(dict, id, kanjiDic, examples, dictWord, noteTypeName, deckPath) {
|
|
1665
|
-
var _a;
|
|
1666
1628
|
try {
|
|
1667
1629
|
if (!dictWord && id && dict)
|
|
1668
1630
|
dictWord = dict.find((entry) => entry.id === id);
|
|
@@ -1683,7 +1645,7 @@ function getWord(dict, id, kanjiDic, examples, dictWord, noteTypeName, deckPath)
|
|
|
1683
1645
|
kanjiForm: dictKanjiForm.form,
|
|
1684
1646
|
...dictKanjiForm.notes ? {
|
|
1685
1647
|
notes: dictKanjiForm.notes.map((note) => {
|
|
1686
|
-
var
|
|
1648
|
+
var _a;
|
|
1687
1649
|
const noteAndTag = lookupWordNote(
|
|
1688
1650
|
note,
|
|
1689
1651
|
void 0,
|
|
@@ -1691,7 +1653,7 @@ function getWord(dict, id, kanjiDic, examples, dictWord, noteTypeName, deckPath)
|
|
|
1691
1653
|
false,
|
|
1692
1654
|
note
|
|
1693
1655
|
);
|
|
1694
|
-
return capitalizeString((
|
|
1656
|
+
return capitalizeString((_a = noteAndTag.note) != null ? _a : note);
|
|
1695
1657
|
})
|
|
1696
1658
|
} : {},
|
|
1697
1659
|
...dictKanjiForm.commonness && dictKanjiForm.commonness.length > 0 ? { common: true } : {}
|
|
@@ -1705,7 +1667,7 @@ function getWord(dict, id, kanjiDic, examples, dictWord, noteTypeName, deckPath)
|
|
|
1705
1667
|
(restriction) => `Reading restricted to ${restriction}`
|
|
1706
1668
|
) : [],
|
|
1707
1669
|
...dictReading.notes ? dictReading.notes.map((note) => {
|
|
1708
|
-
var
|
|
1670
|
+
var _a;
|
|
1709
1671
|
const noteAndTag = lookupWordNote(
|
|
1710
1672
|
note,
|
|
1711
1673
|
void 0,
|
|
@@ -1713,7 +1675,7 @@ function getWord(dict, id, kanjiDic, examples, dictWord, noteTypeName, deckPath)
|
|
|
1713
1675
|
false,
|
|
1714
1676
|
note
|
|
1715
1677
|
);
|
|
1716
|
-
return capitalizeString((
|
|
1678
|
+
return capitalizeString((_a = noteAndTag.note) != null ? _a : note);
|
|
1717
1679
|
}) : []
|
|
1718
1680
|
]
|
|
1719
1681
|
} : {},
|
|
@@ -1806,16 +1768,86 @@ function getWord(dict, id, kanjiDic, examples, dictWord, noteTypeName, deckPath)
|
|
|
1806
1768
|
}
|
|
1807
1769
|
if (word.kanji.length === 0) delete word.kanji;
|
|
1808
1770
|
}
|
|
1809
|
-
if (
|
|
1810
|
-
|
|
1811
|
-
|
|
1812
|
-
|
|
1813
|
-
|
|
1814
|
-
word.
|
|
1771
|
+
if (dictWord.hasPhrases === true && examples) {
|
|
1772
|
+
const readings = new Set(
|
|
1773
|
+
word.readings.filter(
|
|
1774
|
+
(reading) => (!reading.notes || !reading.notes.some(
|
|
1775
|
+
(note) => notSearchedForms.has(note)
|
|
1776
|
+
)) && (word.common === void 0 || reading.common === true)
|
|
1777
|
+
).map((reading) => reading.reading)
|
|
1778
|
+
);
|
|
1779
|
+
const kanjiForms = word.kanjiForms ? new Set(
|
|
1780
|
+
word.kanjiForms.filter(
|
|
1781
|
+
(kanjiForm) => (!kanjiForm.notes || !kanjiForm.notes.some(
|
|
1782
|
+
(note) => notSearchedForms.has(note)
|
|
1783
|
+
)) && (word.common === void 0 || kanjiForm.common === true)
|
|
1784
|
+
).map((kanjiForm) => kanjiForm.kanjiForm)
|
|
1785
|
+
) : void 0;
|
|
1786
|
+
const kanjiFormExamples = [];
|
|
1787
|
+
const readingMatchingKanjiFormExamples = [];
|
|
1788
|
+
const readingExamples = [];
|
|
1789
|
+
const partParts = /* @__PURE__ */ new Set();
|
|
1790
|
+
for (const example of examples)
|
|
1791
|
+
for (const part of example.parts) {
|
|
1792
|
+
const readingAsReadingMatch = part.reading !== void 0 && readings.has(part.reading);
|
|
1793
|
+
if (kanjiForms && kanjiForms.size > 0 && kanjiForms.has(part.baseForm)) {
|
|
1794
|
+
if (readingAsReadingMatch) {
|
|
1795
|
+
readingMatchingKanjiFormExamples.push(example);
|
|
1796
|
+
partParts.add(part.baseForm).add(part.reading);
|
|
1797
|
+
} else {
|
|
1798
|
+
kanjiFormExamples.push(example);
|
|
1799
|
+
partParts.add(part.baseForm);
|
|
1800
|
+
}
|
|
1801
|
+
break;
|
|
1802
|
+
}
|
|
1803
|
+
const readingAsBaseFormMatch = readings.has(part.baseForm);
|
|
1804
|
+
const referenceIDMatch = part.referenceID !== void 0 && word.id !== void 0 && part.referenceID === word.id;
|
|
1805
|
+
if (readingAsReadingMatch || readingAsBaseFormMatch || referenceIDMatch) {
|
|
1806
|
+
readingExamples.push(example);
|
|
1807
|
+
if (readingAsReadingMatch) partParts.add(part.reading);
|
|
1808
|
+
if (readingAsBaseFormMatch) partParts.add(part.baseForm);
|
|
1809
|
+
if (referenceIDMatch) partParts.add(part.referenceID);
|
|
1810
|
+
break;
|
|
1811
|
+
}
|
|
1812
|
+
}
|
|
1813
|
+
const exampleSize = readingMatchingKanjiFormExamples.length + kanjiFormExamples.length + readingExamples.length;
|
|
1814
|
+
const includeKanjiFormExamples = readingMatchingKanjiFormExamples.length < Math.max(2, Math.round(exampleSize * 0.05));
|
|
1815
|
+
const includeReadingExamples = word.usuallyInKana === void 0 && includeKanjiFormExamples && readingExamples.length >= Math.max(10, Math.round(exampleSize * 0.15)) || word.usuallyInKana === true && readingExamples.length >= Math.max(2, Math.round(exampleSize * 0.5));
|
|
1816
|
+
let wordExamples = [
|
|
1817
|
+
...readingMatchingKanjiFormExamples,
|
|
1818
|
+
...includeKanjiFormExamples ? kanjiFormExamples : [],
|
|
1819
|
+
...includeReadingExamples ? readingExamples : []
|
|
1820
|
+
];
|
|
1821
|
+
const glossSpecificExamples = [];
|
|
1822
|
+
const seenPhrases = /* @__PURE__ */ new Set();
|
|
1823
|
+
for (let i = 0; i < word.translations.length; i++) {
|
|
1824
|
+
outer: for (const example of wordExamples) {
|
|
1825
|
+
if (seenPhrases.has(example.phrase)) continue;
|
|
1826
|
+
for (const part of example.parts)
|
|
1827
|
+
if (part.glossNumber === i + 1 && (partParts.has(part.baseForm) || part.reading && partParts.has(part.reading) || part.referenceID && partParts.has(part.referenceID))) {
|
|
1828
|
+
glossSpecificExamples.push(example);
|
|
1829
|
+
seenPhrases.add(example.phrase);
|
|
1830
|
+
break outer;
|
|
1831
|
+
}
|
|
1832
|
+
}
|
|
1833
|
+
if (glossSpecificExamples.length === 5) break;
|
|
1834
|
+
}
|
|
1835
|
+
if (glossSpecificExamples.length === 5)
|
|
1836
|
+
wordExamples = [...glossSpecificExamples];
|
|
1837
|
+
else if (glossSpecificExamples.length > 0)
|
|
1838
|
+
wordExamples = [
|
|
1839
|
+
...glossSpecificExamples,
|
|
1840
|
+
...wordExamples.filter((ex) => !seenPhrases.has(ex.phrase)).slice(0, 5 - glossSpecificExamples.length)
|
|
1841
|
+
];
|
|
1842
|
+
if (wordExamples.length > 0)
|
|
1843
|
+
word.phrases = (wordExamples.length > 5 ? wordExamples.slice(0, 5) : wordExamples).map((ex) => {
|
|
1844
|
+
var _a;
|
|
1845
|
+
return {
|
|
1815
1846
|
phrase: (_a = ex.furigana) != null ? _a : ex.phrase,
|
|
1816
1847
|
translation: ex.translation,
|
|
1817
1848
|
originalPhrase: ex.phrase
|
|
1818
|
-
}
|
|
1849
|
+
};
|
|
1850
|
+
});
|
|
1819
1851
|
}
|
|
1820
1852
|
return word;
|
|
1821
1853
|
} else throw new Error(`Word${id ? ` ${id}` : ""} not found`);
|