henkan 0.1.3 → 0.2.1

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 +94 -57
  2. package/dist/index.cjs.js.map +3 -3
  3. package/dist/index.mjs +92 -57
  4. package/dist/index.mjs.map +3 -3
  5. package/dist/types/types.d.ts +24 -3
  6. package/dist/types/types.d.ts.map +1 -1
  7. package/dist/types/utils.d.ts.map +1 -1
  8. package/docs/api/README.md +1 -0
  9. package/docs/api/functions/capitalizeString.md +1 -1
  10. package/docs/api/functions/convertJMdict.md +1 -1
  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 +14 -4
  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 +8 -8
  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 +31 -21
  42. package/docs/api/interfaces/KanjiComponent.md +3 -3
  43. package/docs/api/interfaces/KanjiForm.md +3 -3
  44. package/docs/api/interfaces/NoteAndTag.md +31 -0
  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 +4 -4
  48. package/docs/api/interfaces/ResultEntry.md +7 -7
  49. package/docs/api/interfaces/TanakaExample.md +7 -7
  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 +14 -14
  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 +3 -3
package/dist/index.cjs.js CHANGED
@@ -1397,8 +1397,11 @@ function convertKanjiDic(xmlString) {
1397
1397
  }
1398
1398
  if (isValidArray(group.meaning)) {
1399
1399
  for (const meaning of group.meaning)
1400
- if (typeof meaning === "string")
1400
+ if (typeof meaning === "string") {
1401
+ if (kanjiObj.isKokuji === void 0 && meaning === "(kokuji)")
1402
+ kanjiObj.isKokuji = true;
1401
1403
  groupObj.meanings.push(meaning);
1404
+ }
1402
1405
  }
1403
1406
  if (groupObj.readings.length > 0 || groupObj.meanings.length > 0)
1404
1407
  rmObj.groups.push(groupObj);
@@ -1580,11 +1583,12 @@ function lookupWordNote(key, notes, tags, required, fallback) {
1580
1583
  );
1581
1584
  if (!info) {
1582
1585
  if (required) throw new Error(`Invalid note info for ${key}`);
1583
- notes.push(fallback != null ? fallback : key);
1584
- return;
1586
+ if (notes) notes.push(fallback != null ? fallback : key);
1587
+ return { note: fallback != null ? fallback : key };
1585
1588
  }
1586
- tags.push(info[0]);
1587
- notes.push(info[1]);
1589
+ if (tags) tags.push(`word::${info[0]}`);
1590
+ if (notes) notes.push(info[1]);
1591
+ return { note: info[1], tag: `word::${info[0]}` };
1588
1592
  }
1589
1593
  var wordAddNoteArray = (arr, cb) => {
1590
1594
  if (!arr) return;
@@ -1601,40 +1605,50 @@ function getWord(dict, id, kanjiDic, examples, dictWord, noteTypeName, deckPath)
1601
1605
  translations: [],
1602
1606
  noteID: `word_${dictWord.id}`,
1603
1607
  ...noteTypeName ? { noteTypeName } : {},
1604
- ...deckPath ? { deckPath } : {}
1608
+ ...deckPath ? { deckPath } : {},
1609
+ tags: []
1605
1610
  };
1611
+ if (dictWord.isCommon === true) word.common = true;
1606
1612
  if (dictWord.kanjiForms)
1607
1613
  word.kanjiForms = dictWord.kanjiForms.map(
1608
- (dictKanjiForm) => {
1609
- if (dictKanjiForm.commonness && dictKanjiForm.commonness.length > 0 && word.common === void 0)
1610
- word.common = true;
1611
- return {
1612
- kanjiForm: dictKanjiForm.form,
1613
- ...dictKanjiForm.notes ? {
1614
- notes: dictKanjiForm.notes.map(
1615
- (note) => capitalizeString(note)
1616
- )
1617
- } : {}
1618
- };
1619
- }
1614
+ (dictKanjiForm) => ({
1615
+ kanjiForm: dictKanjiForm.form,
1616
+ ...dictKanjiForm.notes ? {
1617
+ notes: dictKanjiForm.notes.map((note) => {
1618
+ var _a;
1619
+ const noteAndTag = lookupWordNote(
1620
+ note,
1621
+ void 0,
1622
+ word.tags,
1623
+ false,
1624
+ note
1625
+ );
1626
+ return capitalizeString((_a = noteAndTag.note) != null ? _a : note);
1627
+ })
1628
+ } : {}
1629
+ })
1620
1630
  );
1621
- word.readings = dictWord.readings.map((dictReading) => {
1622
- if (dictReading.commonness && dictReading.commonness.length > 0 && word.common === void 0)
1623
- word.common = true;
1624
- return {
1625
- reading: dictReading.reading,
1626
- ...dictReading.kanjiFormRestrictions || dictReading.notes ? {
1627
- notes: [
1628
- ...dictReading.kanjiFormRestrictions ? dictReading.kanjiFormRestrictions.map(
1629
- (restriction) => `Reading restricted to ${restriction}`
1630
- ) : [],
1631
- ...dictReading.notes ? dictReading.notes.map(
1632
- (note) => capitalizeString(note)
1633
- ) : []
1634
- ]
1635
- } : {}
1636
- };
1637
- });
1631
+ word.readings = dictWord.readings.map((dictReading) => ({
1632
+ reading: dictReading.reading,
1633
+ ...dictReading.kanjiFormRestrictions || dictReading.notes ? {
1634
+ notes: [
1635
+ ...dictReading.kanjiFormRestrictions ? dictReading.kanjiFormRestrictions.map(
1636
+ (restriction) => `Reading restricted to ${restriction}`
1637
+ ) : [],
1638
+ ...dictReading.notes ? dictReading.notes.map((note) => {
1639
+ var _a;
1640
+ const noteAndTag = lookupWordNote(
1641
+ note,
1642
+ void 0,
1643
+ word.tags,
1644
+ false,
1645
+ note
1646
+ );
1647
+ return capitalizeString((_a = noteAndTag.note) != null ? _a : note);
1648
+ }) : []
1649
+ ]
1650
+ } : {}
1651
+ }));
1638
1652
  let usuallyInKanaMeanings = 0;
1639
1653
  word.translations = dictWord.meanings.map((dictMeaning) => {
1640
1654
  if (!dictMeaning.translations)
@@ -1655,7 +1669,6 @@ function getWord(dict, id, kanjiDic, examples, dictWord, noteTypeName, deckPath)
1655
1669
  }
1656
1670
  );
1657
1671
  const notes = [];
1658
- word.tags = [];
1659
1672
  wordAddNoteArray(
1660
1673
  dictMeaning.kanjiFormRestrictions,
1661
1674
  (restriction) => notes.push(`Meaning restricted to ${restriction}`)
@@ -1726,7 +1739,7 @@ function getWord(dict, id, kanjiDic, examples, dictWord, noteTypeName, deckPath)
1726
1739
  }
1727
1740
  if (word.kanji.length === 0) delete word.kanji;
1728
1741
  }
1729
- if (examples) {
1742
+ if (examples && dictWord.hasPhrases === true) {
1730
1743
  const readings = new Set(
1731
1744
  word.readings.filter(
1732
1745
  (reading) => !reading.notes || reading.notes && !reading.notes.some(
@@ -1798,6 +1811,7 @@ function getWord(dict, id, kanjiDic, examples, dictWord, noteTypeName, deckPath)
1798
1811
  }
1799
1812
  }
1800
1813
  function getKanji(kanjiChar, dict, jmDict, svgList, noteTypeName, deckPath) {
1814
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i;
1801
1815
  try {
1802
1816
  const dictKanji = dict.find(
1803
1817
  (entry) => entry.kanji === kanjiChar
@@ -1912,26 +1926,35 @@ function getKanji(kanjiChar, dict, jmDict, svgList, noteTypeName, deckPath) {
1912
1926
  let codePoint = kanji.kanji.codePointAt(0);
1913
1927
  if (codePoint !== void 0) {
1914
1928
  codePoint = codePoint.toString(16);
1929
+ const fileNames = [
1930
+ `0${codePoint}.svg`,
1931
+ `${codePoint}.svg`
1932
+ ];
1915
1933
  const svg = svgList.find(
1916
- (svgFile) => svgFile.toLowerCase() === `0${codePoint}.svg` || svgFile.toLowerCase() === `${codePoint}.svg`
1934
+ (svgFile) => fileNames.includes(svgFile.toLowerCase())
1917
1935
  );
1918
1936
  if (svg) kanji.svg = svg;
1919
1937
  }
1920
1938
  }
1921
1939
  kanji.tags = [];
1922
- if (kanji.meanings && kanji.meanings.some((meaning) => meaning === "(kokuji)")) {
1923
- kanji.tags.push("kokuji");
1924
- kanji.meanings = kanji.meanings.filter(
1925
- (meaning) => meaning !== "(kokuji)"
1926
- );
1940
+ if (dictKanji.isKokuji === true) {
1941
+ kanji.kokuji = true;
1942
+ kanji.tags.push("kanji::kokuji");
1943
+ if (kanji.meanings)
1944
+ kanji.meanings.splice(
1945
+ kanji.meanings.findIndex(
1946
+ (meaning) => meaning === "(kokuji)"
1947
+ ),
1948
+ 1
1949
+ );
1927
1950
  }
1928
1951
  kanji.tags.push(
1929
- ...!kanji.onyomi ? ["no::onyomi"] : [],
1930
- ...!kanji.kunyomi ? ["no::kunyomi"] : [],
1931
- ...kanji.nanori ? ["has::nanori"] : [],
1932
- ...kanji.svg ? ["has::svg"] : [],
1933
- ...kanji.strokes && kanji.strokes.length > 0 ? [`strokes::${kanji.strokes}`] : [],
1934
- ...kanji.words ? ["has::words"] : []
1952
+ `kanji::onyomi::${(_b = (_a = kanji.onyomi) == null ? void 0 : _a.length) != null ? _b : 0}`,
1953
+ `kanji::kunyomi::${(_d = (_c = kanji.kunyomi) == null ? void 0 : _c.length) != null ? _d : 0}`,
1954
+ `kanji::nanori::${(_f = (_e = kanji.nanori) == null ? void 0 : _e.length) != null ? _f : 0}`,
1955
+ `kanji::strokes::${(_g = kanji.strokes) != null ? _g : "unknown"}`,
1956
+ `kanji::words::${(_i = (_h = kanji.words) == null ? void 0 : _h.length) != null ? _i : 0}`,
1957
+ ...kanji.svg ? ["kanji::has_svg"] : []
1935
1958
  );
1936
1959
  return kanji;
1937
1960
  } else throw new Error(`Kanji ${kanjiChar} not found`);
@@ -1940,6 +1963,7 @@ function getKanji(kanjiChar, dict, jmDict, svgList, noteTypeName, deckPath) {
1940
1963
  }
1941
1964
  }
1942
1965
  function getKanjiExtended(kanjiChar, info, dict, useJpdbWords, jmDict, svgList, noteTypeName, deckPath) {
1966
+ var _a, _b, _c, _d;
1943
1967
  try {
1944
1968
  const kanji = getKanji(
1945
1969
  kanjiChar,
@@ -1955,12 +1979,25 @@ function getKanjiExtended(kanjiChar, info, dict, useJpdbWords, jmDict, svgList,
1955
1979
  kanji.mnemonic = info.mnemonic;
1956
1980
  if (useJpdbWords === true && info.words && info.words.length > 0)
1957
1981
  kanji.words = info.words;
1958
- if (kanji.mnemonic && kanji.mnemonic.length > 0 && kanji.tags)
1959
- kanji.tags.push("has::mnemonic");
1960
- if (kanji.components && kanji.components.length > 0 && kanji.tags)
1961
- kanji.tags.push(`components::${kanji.components.length}`);
1962
- if (kanji.words && kanji.tags && !kanji.tags.includes("has::words"))
1963
- kanji.tags.push("has::words");
1982
+ if (kanji.tags) {
1983
+ kanji.tags.push(`kanji::components::${(_b = (_a = kanji.components) == null ? void 0 : _a.length) != null ? _b : 0}`);
1984
+ if (kanji.mnemonic && kanji.mnemonic.length > 0)
1985
+ kanji.tags.push("kanji::has_mnemonic");
1986
+ if (useJpdbWords === true && kanji.words) {
1987
+ if (!kanji.tags.some((tag, index) => {
1988
+ var _a2, _b2;
1989
+ if (tag.startsWith("kanji::words::")) {
1990
+ kanji.tags.splice(
1991
+ index,
1992
+ 1,
1993
+ `kanji::words::${(_b2 = (_a2 = kanji.words) == null ? void 0 : _a2.length) != null ? _b2 : 0}`
1994
+ );
1995
+ return true;
1996
+ } else return false;
1997
+ }))
1998
+ kanji.tags.push(`kanji::words::${(_d = (_c = kanji.words) == null ? void 0 : _c.length) != null ? _d : 0}`);
1999
+ }
2000
+ }
1964
2001
  if (kanji.fromJpdb === true && (kanji.mnemonic || kanji.components && kanji.components.length > 0 || kanji.words))
1965
2002
  kanji.source = `https://jpdb.io/kanji/${kanji.kanji}#a`;
1966
2003
  return kanji;
@@ -2165,12 +2202,12 @@ function generateAnkiNote(entry) {
2165
2202
  (onyomiEntry) => createEntry(
2166
2203
  `<span class="kanji kanji-onyomi">${onyomiEntry}</span>`
2167
2204
  )
2168
- ).join("") : '<span class="kanji kanji-onyomi">(no onyomi) (kokuji)</span>',
2205
+ ).join("") : `<span class="kanji kanji-onyomi">(no onyomi) ${entry.kokuji === true ? "(kokuji)" : ""}</span`,
2169
2206
  entry.kunyomi ? entry.kunyomi.map(
2170
2207
  (kunyomiEntry) => createEntry(
2171
2208
  `<span class="kanji kanji-kunyomi">${kunyomiEntry}</span>`
2172
2209
  )
2173
- ).join("") : '<span class="kanji kanji-kunyomi">(no kunyomi)</span>',
2210
+ ).join("") : `<span class="kanji kanji-kunyomi">(no kunyomi) ${entry.kokuji === true ? "(kokuji)" : ""}</span>`,
2174
2211
  entry.nanori ? entry.nanori.map(
2175
2212
  (nanoriEntry) => createEntry(
2176
2213
  `<span class="kanji kanji-nanori">${nanoriEntry}</span>`