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.
Files changed (58) hide show
  1. package/dist/index.cjs.js +103 -71
  2. package/dist/index.cjs.js.map +3 -3
  3. package/dist/index.mjs +99 -69
  4. package/dist/index.mjs.map +3 -3
  5. package/dist/types/types.d.ts +5 -3
  6. package/dist/types/types.d.ts.map +1 -1
  7. package/dist/types/utils.d.ts +2 -2
  8. package/dist/types/utils.d.ts.map +1 -1
  9. package/docs/api/functions/capitalizeString.md +1 -1
  10. package/docs/api/functions/convertJMdict.md +3 -3
  11. package/docs/api/functions/convertKanjiDic.md +1 -1
  12. package/docs/api/functions/convertKradFile.md +1 -1
  13. package/docs/api/functions/convertRadkFile.md +1 -1
  14. package/docs/api/functions/convertTanakaCorpus.md +1 -1
  15. package/docs/api/functions/generateAnkiNote.md +1 -1
  16. package/docs/api/functions/generateAnkiNotesFile.md +1 -1
  17. package/docs/api/functions/getKanji.md +1 -1
  18. package/docs/api/functions/getKanjiExtended.md +1 -1
  19. package/docs/api/functions/getWord.md +1 -1
  20. package/docs/api/functions/isStringArray.md +1 -1
  21. package/docs/api/functions/isValidArray.md +1 -1
  22. package/docs/api/functions/isValidArrayWithFirstElement.md +1 -1
  23. package/docs/api/functions/makeSSML.md +1 -1
  24. package/docs/api/functions/shuffleArray.md +1 -1
  25. package/docs/api/functions/synthesizeSpeech.md +1 -1
  26. package/docs/api/interfaces/DictKanji.md +5 -5
  27. package/docs/api/interfaces/DictKanjiForm.md +4 -4
  28. package/docs/api/interfaces/DictKanjiMisc.md +5 -5
  29. package/docs/api/interfaces/DictKanjiReading.md +3 -3
  30. package/docs/api/interfaces/DictKanjiReadingMeaning.md +3 -3
  31. package/docs/api/interfaces/DictKanjiReadingMeaningGroup.md +3 -3
  32. package/docs/api/interfaces/DictKanjiWithRadicals.md +3 -3
  33. package/docs/api/interfaces/DictMeaning.md +11 -11
  34. package/docs/api/interfaces/DictRadical.md +4 -4
  35. package/docs/api/interfaces/DictReading.md +5 -5
  36. package/docs/api/interfaces/DictWord.md +19 -17
  37. package/docs/api/interfaces/ExamplePart.md +7 -7
  38. package/docs/api/interfaces/Grammar.md +15 -15
  39. package/docs/api/interfaces/GrammarMeaning.md +3 -3
  40. package/docs/api/interfaces/Kana.md +11 -11
  41. package/docs/api/interfaces/Kanji.md +22 -22
  42. package/docs/api/interfaces/KanjiComponent.md +3 -3
  43. package/docs/api/interfaces/KanjiForm.md +4 -4
  44. package/docs/api/interfaces/NoteAndTag.md +3 -3
  45. package/docs/api/interfaces/Phrase.md +4 -4
  46. package/docs/api/interfaces/Radical.md +16 -16
  47. package/docs/api/interfaces/Reading.md +5 -5
  48. package/docs/api/interfaces/ResultEntry.md +7 -7
  49. package/docs/api/interfaces/TanakaExample.md +6 -6
  50. package/docs/api/interfaces/Translation.md +3 -3
  51. package/docs/api/interfaces/UsefulRegExps.md +9 -9
  52. package/docs/api/interfaces/Word.md +16 -16
  53. package/docs/api/type-aliases/Dict.md +1 -1
  54. package/docs/api/type-aliases/DictName.md +1 -1
  55. package/docs/api/type-aliases/EntryType.md +1 -1
  56. package/docs/api/type-aliases/JLPT.md +1 -1
  57. package/docs/api/type-aliases/Result.md +1 -1
  58. 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
- const kanjiFormExamples = [];
1334
- const readingMatchingKanjiFormExamples = [];
1335
- const readingExamples = [];
1336
- const partParts = /* @__PURE__ */ new Set();
1337
- for (const example of examples)
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
- const readingAsBaseFormMatch = readings2.has(
1351
- part.baseForm
1352
- );
1353
- const referenceIDMatch = part.referenceID !== void 0 && entryObj.id !== void 0 && part.referenceID === entryObj.id;
1354
- if (readingAsReadingMatch || readingAsBaseFormMatch || referenceIDMatch) {
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 (glossSpecificExamples.length === 5)
1385
- wordExamples = [...glossSpecificExamples];
1386
- else if (glossSpecificExamples.length > 0) {
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 _a2;
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((_a2 = noteAndTag.note) != null ? _a2 : note);
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 _a2;
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((_a2 = noteAndTag.note) != null ? _a2 : note);
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 (examples && dictWord.phraseIDs && dictWord.phraseIDs.length > 0) {
1810
- word.phrases = [];
1811
- const phraseIDs = new Set(dictWord.phraseIDs);
1812
- for (const ex of examples)
1813
- if (phraseIDs.has(ex.id))
1814
- word.phrases.push({
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`);