Add part of speech info (#1561)

* Add part of speech info to headwords

* Expose parts of speech to Anki template rendering

* Expose parts of speech

* Update pitch accent categories

* Update docs

* Add part-of-speech

* Update options and tests

* Update markers

* Update test data
This commit is contained in:
toasted-nutbread 2021-03-26 19:50:54 -04:00 committed by GitHub
parent 482dd8c8d8
commit 90f7d5ba07
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
15 changed files with 753 additions and 128 deletions

View File

@ -170,6 +170,7 @@ Flashcard fields can be configured with the following steps:
`{glossary}` | List of definitions for the term (output format depends on whether running in *grouped* mode).
`{glossary-brief}` | List of definitions for the term in a more compact format.
`{glossary-no-dictionary}` | List of definitions for the term, except the dictionary tag is omitted.
`{part-of-speech}` | Part of speech information for the term.
`{pitch-accents}` | List of pitch accent downstep notations for the term.
`{pitch-accent-graphs}` | List of pitch accent graphs for the term.
`{pitch-accent-positions}` | List of accent downstep positions for the term as a number.

View File

@ -270,6 +270,10 @@ namespace Translation {
* Tags for the headword.
*/
tags: Tag[];
/**
* List of word classes (part of speech) for the headword.
*/
wordClasses: string[];
}
/**

View File

@ -0,0 +1,30 @@
{{#*inline "part-of-speech-pretty"}}
{{~#if (op "===" . "v1")~}}Ichidan verb
{{~else if (op "===" . "v5")~}}Godan verb
{{~else if (op "===" . "vk")~}}Kuru verb
{{~else if (op "===" . "vs")~}}Suru verb
{{~else if (op "===" . "vz")~}}Zuru verb
{{~else if (op "===" . "adj-i")~}}I-adjective
{{~else if (op "===" . "n")~}}Noun
{{~else~}}{{.}}
{{~/if~}}
{{/inline}}
{{#*inline "part-of-speech"}}
{{~#scope~}}
{{~#if (op "!==" definition.type "kanji")~}}
{{~#set "first" true}}{{/set~}}
{{~#each definition.expressions~}}
{{~#each wordClasses~}}
{{~#unless (get (concat "used_" .))~}}
{{~> part-of-speech-pretty . ~}}
{{~#unless (get "first")}}, {{/unless~}}
{{~#set (concat "used_" .) true~}}{{~/set~}}
{{~#set "first" false~}}{{~/set~}}
{{~/unless~}}
{{~/each~}}
{{~/each~}}
{{~#if (get "first")~}}Unknown{{~/if~}}
{{~/if~}}
{{~/scope~}}
{{/inline}}

View File

@ -341,4 +341,35 @@
{{~/scope~}}
{{/inline}}
{{#*inline "part-of-speech-pretty"}}
{{~#if (op "===" . "v1")~}}Ichidan verb
{{~else if (op "===" . "v5")~}}Godan verb
{{~else if (op "===" . "vk")~}}Kuru verb
{{~else if (op "===" . "vs")~}}Suru verb
{{~else if (op "===" . "vz")~}}Zuru verb
{{~else if (op "===" . "adj-i")~}}I-adjective
{{~else if (op "===" . "n")~}}Noun
{{~else~}}{{.}}
{{~/if~}}
{{/inline}}
{{#*inline "part-of-speech"}}
{{~#scope~}}
{{~#if (op "!==" definition.type "kanji")~}}
{{~#set "first" true}}{{/set~}}
{{~#each definition.expressions~}}
{{~#each wordClasses~}}
{{~#unless (get (concat "used_" .))~}}
{{~> part-of-speech-pretty . ~}}
{{~#unless (get "first")}}, {{/unless~}}
{{~#set (concat "used_" .) true~}}{{~/set~}}
{{~#set "first" false~}}{{~/set~}}
{{~/unless~}}
{{~/each~}}
{{~/each~}}
{{~#if (get "first")~}}Unknown{{~/if~}}
{{~/if~}}
{{~/scope~}}
{{/inline}}
{{~> (lookup . "marker") ~}}

View File

@ -441,7 +441,7 @@ class AnkiNoteDataCreator {
const results = [];
const {headwords} = dictionaryEntry;
for (let i = 0, ii = headwords.length; i < ii; ++i) {
const {term, reading, tags, sources: [{deinflectedText}]} = headwords[i];
const {term, reading, tags, sources: [{deinflectedText}], wordClasses} = headwords[i];
const termTags = this.createCachedValue(this._convertTags.bind(this, tags));
const frequencies = this.createCachedValue(this._getTermExpressionFrequencies.bind(this, dictionaryEntry, i));
const pitches = this.createCachedValue(this._getTermExpressionPitches.bind(this, dictionaryEntry, i));
@ -455,7 +455,8 @@ class AnkiNoteDataCreator {
get frequencies() { return self.getCachedValue(frequencies); },
get pitches() { return self.getCachedValue(pitches); },
get furiganaSegments() { return self.getCachedValue(furiganaSegments); },
get termFrequency() { return self.getCachedValue(termFrequency); }
get termFrequency() { return self.getCachedValue(termFrequency); },
wordClasses
};
results.push(item);
}

View File

@ -459,7 +459,7 @@ class OptionsUtil {
{async: false, update: this._updateVersion7.bind(this)},
{async: true, update: this._updateVersion8.bind(this)},
{async: false, update: this._updateVersion9.bind(this)},
{async: false, update: this._updateVersion10.bind(this)}
{async: true, update: this._updateVersion10.bind(this)}
];
}
@ -750,9 +750,11 @@ class OptionsUtil {
return options;
}
_updateVersion10(options) {
async _updateVersion10(options) {
// Version 10 changes:
// Removed global option useSettingsV2.
// Added part-of-speech field template.
await this._applyAnkiFieldTemplatesPatch(options, '/data/templates/anki-field-templates-upgrade-v10.handlebars');
delete options.global.useSettingsV2;
return options;
}

View File

@ -250,10 +250,14 @@ class DisplayGenerator {
node.dataset.readingIsSame = `${reading === expression}`;
node.dataset.frequency = DictionaryDataUtil.getTermFrequency(termTags);
const pitchAccentCategories = this._getPitchAccentCategories(reading, pronunciations, headwordIndex);
const {wordClasses} = headword;
const pitchAccentCategories = this._getPitchAccentCategories(reading, pronunciations, wordClasses, headwordIndex);
if (pitchAccentCategories !== null) {
node.dataset.pitchAccentCategories = pitchAccentCategories;
}
if (wordClasses.length > 0) {
node.dataset.wordClasses = wordClasses.join(' ');
}
this._setTextContent(node.querySelector('.expression-reading'), reading);
@ -762,13 +766,14 @@ class DisplayGenerator {
}
}
_getPitchAccentCategories(reading, pronunciations, headwordIndex) {
_getPitchAccentCategories(reading, pronunciations, wordClasses, headwordIndex) {
if (pronunciations.length === 0) { return null; }
const isVerbOrAdjective = this._isVerbOrAdjective(wordClasses);
const categories = new Set();
for (const pronunciation of pronunciations) {
if (pronunciation.headwordIndex !== headwordIndex) { continue; }
for (const {position} of pronunciation.pitches) {
const category = this._japaneseUtil.getPitchCategory(reading, position, false);
const category = this._japaneseUtil.getPitchCategory(reading, position, isVerbOrAdjective);
if (category !== null) {
categories.add(category);
}
@ -776,4 +781,19 @@ class DisplayGenerator {
}
return categories.size > 0 ? [...categories].join(' ') : null;
}
_isVerbOrAdjective(wordClasses) {
for (const wordClass of wordClasses) {
switch (wordClass) {
case 'v1':
case 'v5':
case 'vs':
case 'vk':
case 'vz':
case 'adj-i':
return true;
}
}
return false;
}
}

View File

@ -917,8 +917,8 @@ class Translator {
return {originalText, transformedText, deinflectedText, isPrimary};
}
_createTermHeadword(index, term, reading, sources, tags) {
return {index, term, reading, sources, tags};
_createTermHeadword(index, term, reading, sources, tags, wordClasses) {
return {index, term, reading, sources, tags, wordClasses};
}
_createTermDefinition(index, headwordIndices, dictionary, tags, entries) {
@ -953,7 +953,7 @@ class Translator {
}
_createTermDictionaryEntryFromDatabaseEntry(databaseEntry, originalText, transformedText, deinflectedText, reasons, isPrimary, enabledDictionaryMap) {
const {expression, reading: rawReading, definitionTags, termTags, glossary, score, dictionary, id, sequence} = databaseEntry;
const {expression, reading: rawReading, definitionTags, termTags, glossary, score, dictionary, id, sequence, rules} = databaseEntry;
const reading = (rawReading.length > 0 ? rawReading : expression);
const {index: dictionaryIndex, priority: dictionaryPriority} = this._getDictionaryOrder(dictionary, enabledDictionaryMap);
const sourceTermExactMatchCount = (isPrimary && deinflectedText === expression ? 1 : 0);
@ -975,7 +975,7 @@ class Translator {
dictionaryPriority,
sourceTermExactMatchCount,
maxTransformedTextLength,
[this._createTermHeadword(0, expression, reading, [source], headwordTagGroups)],
[this._createTermHeadword(0, expression, reading, [source], headwordTagGroups, rules)],
[this._createTermDefinition(0, [0], dictionary, definitionTagGroups, glossary)]
);
}
@ -1100,15 +1100,16 @@ class Translator {
_addTermHeadwords(headwordsMap, headwords) {
const headwordIndexMap = [];
for (const {term, reading, sources, tags} of headwords) {
for (const {term, reading, sources, tags, wordClasses} of headwords) {
const key = this._createMapKey([term, reading]);
let headword = headwordsMap.get(key);
if (typeof headword === 'undefined') {
headword = this._createTermHeadword(headwordsMap.size, term, reading, [], []);
headword = this._createTermHeadword(headwordsMap.size, term, reading, [], [], []);
headwordsMap.set(key, headword);
}
this._addUniqueSources(headword.sources, sources);
this._addUniqueTagGroups(headword.tags, tags);
this._addUniqueStrings(headword.wordClasses, wordClasses);
headwordIndexMap.push(headword.index);
}
return headwordIndexMap;

View File

@ -99,6 +99,7 @@ class AnkiController {
'glossary',
'glossary-brief',
'glossary-no-dictionary',
'part-of-speech',
'pitch-accents',
'pitch-accent-graphs',
'pitch-accent-positions',

View File

@ -2651,6 +2651,10 @@
<td><code class="anki-field-marker">{glossary-no-dictionary}</code></td>
<td>List of definitions for the term, except the dictionary tag is omitted.</td>
</tr>
<tr>
<td><code class="anki-field-marker">{part-of-speech}</code></td>
<td>Part of speech information for the term.</td>
</tr>
<tr>
<td><code class="anki-field-marker">{pitch-accents}</code></td>
<td>List of pitch accent downstep notations for the term.</td>

File diff suppressed because one or more lines are too long

View File

@ -388,7 +388,8 @@
"furigana": "だ"
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": []
}
],
"glossary": [
@ -605,7 +606,8 @@
"furigana": "ダース"
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": []
}
],
"glossary": [
@ -831,7 +833,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -1056,7 +1061,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -1281,7 +1289,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -1506,7 +1517,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -1727,7 +1741,8 @@
"furigana": "だ"
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": []
}
],
"glossary": [
@ -1944,7 +1959,8 @@
"furigana": "ダース"
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": []
}
],
"glossary": [
@ -2200,7 +2216,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -2511,7 +2530,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -2822,7 +2844,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -3133,7 +3158,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -3416,7 +3444,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -3643,7 +3674,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -3870,7 +3904,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -4097,7 +4134,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -4318,7 +4358,8 @@
"furigana": "だ"
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": []
}
],
"glossary": [
@ -4535,7 +4576,8 @@
"furigana": "ダース"
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": []
}
],
"glossary": [
@ -4730,7 +4772,8 @@
"furigana": "がぞう"
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": []
}
],
"glossary": [
@ -4934,7 +4977,8 @@
"furigana": "だ"
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": []
}
],
"glossary": [
@ -5156,7 +5200,8 @@
"furigana": "ダース"
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": []
}
],
"glossary": [
@ -5382,7 +5427,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -5607,7 +5655,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -5837,7 +5888,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -6062,7 +6116,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -6322,7 +6379,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -6633,7 +6693,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -6916,7 +6979,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -7143,7 +7209,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -7403,7 +7472,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -7714,7 +7786,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -7997,7 +8072,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -8224,7 +8302,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -8423,7 +8504,8 @@
"furigana": "がぞう"
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": []
}
],
"glossary": [
@ -8688,7 +8770,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"termTags": [
@ -9028,7 +9113,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"termTags": [
@ -9322,7 +9410,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"termTags": [
@ -9568,7 +9659,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"termTags": [
@ -9808,7 +9902,8 @@
"furigana": "だ"
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": []
}
],
"termTags": [
@ -10021,7 +10116,8 @@
"furigana": "ダース"
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": []
}
],
"termTags": [
@ -10295,7 +10391,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
},
{
"sourceTerm": "打ち込む",
@ -10399,7 +10498,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"definitions": [
@ -10810,7 +10912,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
},
{
"sourceTerm": "打つ",
@ -10884,7 +10989,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"definitions": [
@ -11191,7 +11299,8 @@
"furigana": "だ"
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": []
}
],
"definitions": [
@ -11379,7 +11488,8 @@
"furigana": "ダース"
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": []
}
],
"definitions": [
@ -11610,7 +11720,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -11925,7 +12038,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -12240,7 +12356,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -12555,7 +12674,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -12838,7 +12960,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -13065,7 +13190,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -13292,7 +13420,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -13519,7 +13650,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -13740,7 +13874,8 @@
"furigana": "だ"
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": []
}
],
"glossary": [
@ -13957,7 +14092,8 @@
"furigana": "ダース"
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": []
}
],
"glossary": [
@ -14213,7 +14349,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -14524,7 +14663,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -14835,7 +14977,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -15146,7 +15291,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -15429,7 +15577,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -15656,7 +15807,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -15883,7 +16037,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -16110,7 +16267,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -16331,7 +16491,8 @@
"furigana": "だ"
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": []
}
],
"glossary": [
@ -16548,7 +16709,8 @@
"furigana": "ダース"
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": []
}
],
"glossary": [
@ -16804,7 +16966,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -17115,7 +17280,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -17426,7 +17594,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -17737,7 +17908,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -18020,7 +18194,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -18247,7 +18424,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -18474,7 +18654,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -18701,7 +18884,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -18922,7 +19108,8 @@
"furigana": "だ"
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": []
}
],
"glossary": [
@ -19139,7 +19326,8 @@
"furigana": "ダース"
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": []
}
],
"glossary": [
@ -19322,7 +19510,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -19442,7 +19633,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"n"
]
}
],
"glossary": [
@ -19564,7 +19758,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"glossary": [
@ -19788,7 +19985,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
},
{
"sourceTerm": "打ち込む",
@ -19892,7 +20092,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"definitions": [
@ -20303,7 +20506,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
},
{
"sourceTerm": "打つ",
@ -20377,7 +20583,10 @@
"furigana": ""
}
],
"termFrequency": "normal"
"termFrequency": "normal",
"wordClasses": [
"v5"
]
}
],
"definitions": [

View File

@ -312,7 +312,8 @@
],
"redundant": false
}
]
],
"wordClasses": []
}
],
"definitions": [
@ -442,7 +443,8 @@
],
"redundant": false
}
]
],
"wordClasses": []
}
],
"definitions": [
@ -578,6 +580,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -708,6 +713,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -838,6 +846,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -968,6 +979,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -1098,7 +1112,8 @@
],
"redundant": false
}
]
],
"wordClasses": []
}
],
"definitions": [
@ -1228,7 +1243,8 @@
],
"redundant": false
}
]
],
"wordClasses": []
}
],
"definitions": [
@ -1364,6 +1380,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -1512,6 +1531,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -1656,6 +1678,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -1804,6 +1829,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -1954,6 +1982,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -2086,6 +2117,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -2218,6 +2252,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -2350,6 +2387,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -2480,7 +2520,8 @@
],
"redundant": false
}
]
],
"wordClasses": []
}
],
"definitions": [
@ -2610,7 +2651,8 @@
],
"redundant": false
}
]
],
"wordClasses": []
}
],
"definitions": [
@ -2746,7 +2788,8 @@
],
"redundant": false
}
]
],
"wordClasses": []
}
],
"definitions": [
@ -2872,7 +2915,8 @@
],
"redundant": false
}
]
],
"wordClasses": []
}
],
"definitions": [
@ -3008,7 +3052,8 @@
],
"redundant": false
}
]
],
"wordClasses": []
}
],
"definitions": [
@ -3144,6 +3189,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -3274,6 +3322,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -3410,6 +3461,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -3540,6 +3594,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -3676,6 +3733,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -3820,6 +3880,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -3970,6 +4033,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -4102,6 +4168,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -4238,6 +4307,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -4386,6 +4458,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -4536,6 +4611,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -4668,6 +4746,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -4804,7 +4885,8 @@
],
"redundant": false
}
]
],
"wordClasses": []
}
],
"definitions": [
@ -4900,7 +4982,10 @@
"isPrimary": true
}
],
"tags": []
"tags": [],
"wordClasses": [
"v5"
]
}
],
"definitions": [
@ -4944,7 +5029,10 @@
"isPrimary": true
}
],
"tags": []
"tags": [],
"wordClasses": [
"v5"
]
}
],
"definitions": [
@ -4988,7 +5076,10 @@
"isPrimary": true
}
],
"tags": []
"tags": [],
"wordClasses": [
"v5"
]
}
],
"definitions": [
@ -5032,7 +5123,10 @@
"isPrimary": true
}
],
"tags": []
"tags": [],
"wordClasses": [
"v5"
]
}
],
"definitions": [
@ -5078,7 +5172,10 @@
"isPrimary": true
}
],
"tags": []
"tags": [],
"wordClasses": [
"v5"
]
}
],
"definitions": [
@ -5124,7 +5221,10 @@
"isPrimary": true
}
],
"tags": []
"tags": [],
"wordClasses": [
"v5"
]
}
],
"definitions": [
@ -5170,7 +5270,10 @@
"isPrimary": true
}
],
"tags": []
"tags": [],
"wordClasses": [
"v5"
]
}
],
"definitions": [
@ -5216,7 +5319,10 @@
"isPrimary": true
}
],
"tags": []
"tags": [],
"wordClasses": [
"v5"
]
}
],
"definitions": [
@ -5260,7 +5366,8 @@
"isPrimary": true
}
],
"tags": []
"tags": [],
"wordClasses": []
}
],
"definitions": [
@ -5304,7 +5411,8 @@
"isPrimary": true
}
],
"tags": []
"tags": [],
"wordClasses": []
}
],
"definitions": [
@ -5416,6 +5524,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -5603,6 +5714,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -5792,6 +5906,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -5963,6 +6080,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -6132,7 +6252,8 @@
],
"redundant": false
}
]
],
"wordClasses": []
}
],
"definitions": [
@ -6262,7 +6383,8 @@
],
"redundant": false
}
]
],
"wordClasses": []
}
],
"definitions": [
@ -6420,6 +6542,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
},
{
@ -6474,6 +6599,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -6776,6 +6904,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
},
{
@ -6830,6 +6961,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -7095,7 +7229,8 @@
],
"redundant": false
}
]
],
"wordClasses": []
}
],
"definitions": [
@ -7225,7 +7360,8 @@
],
"redundant": false
}
]
],
"wordClasses": []
}
],
"definitions": [
@ -7365,6 +7501,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -7517,6 +7656,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -7665,6 +7807,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -7817,6 +7962,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -7967,6 +8115,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -8099,6 +8250,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -8231,6 +8385,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -8363,6 +8520,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -8493,7 +8653,8 @@
],
"redundant": false
}
]
],
"wordClasses": []
}
],
"definitions": [
@ -8623,7 +8784,8 @@
],
"redundant": false
}
]
],
"wordClasses": []
}
],
"definitions": [
@ -8759,6 +8921,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -8907,6 +9072,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -9051,6 +9219,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -9199,6 +9370,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -9349,6 +9523,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -9481,6 +9658,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -9613,6 +9793,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -9745,6 +9928,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -9875,7 +10061,8 @@
],
"redundant": false
}
]
],
"wordClasses": []
}
],
"definitions": [
@ -10005,7 +10192,8 @@
],
"redundant": false
}
]
],
"wordClasses": []
}
],
"definitions": [
@ -10141,6 +10329,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -10289,6 +10480,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -10433,6 +10627,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -10581,6 +10778,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -10731,6 +10931,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -10863,6 +11066,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -10995,6 +11201,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -11127,6 +11336,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -11257,7 +11469,8 @@
],
"redundant": false
}
]
],
"wordClasses": []
}
],
"definitions": [
@ -11387,7 +11600,8 @@
],
"redundant": false
}
]
],
"wordClasses": []
}
],
"definitions": [
@ -11499,6 +11713,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -11562,7 +11779,10 @@
"isPrimary": true
}
],
"tags": []
"tags": [],
"wordClasses": [
"n"
]
}
],
"definitions": [
@ -11641,6 +11861,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -11766,6 +11989,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
},
{
@ -11820,6 +12046,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],
@ -12122,6 +12351,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
},
{
@ -12176,6 +12408,9 @@
],
"redundant": false
}
],
"wordClasses": [
"v5"
]
}
],

View File

@ -88,6 +88,7 @@ function getFieldMarkers(type) {
'glossary',
'glossary-brief',
'glossary-no-dictionary',
'part-of-speech',
'pitch-accents',
'pitch-accent-graphs',
'pitch-accent-positions',

View File

@ -625,6 +625,7 @@ async function testFieldTemplatesUpdate(extDir) {
const update4 = loadDataFile('data/templates/anki-field-templates-upgrade-v4.handlebars');
const update6 = loadDataFile('data/templates/anki-field-templates-upgrade-v6.handlebars');
const update8 = loadDataFile('data/templates/anki-field-templates-upgrade-v8.handlebars');
const update10 = loadDataFile('data/templates/anki-field-templates-upgrade-v10.handlebars');
const data = [
// Standard format
@ -645,6 +646,7 @@ ${update2}
${update4}
${update6}
${update8}
${update10}
{{~> (lookup . "marker") ~}}`.trimStart()
},
// Non-standard marker format
@ -665,7 +667,8 @@ ${update8}
${update2}
${update4}
${update6}
${update8}`.trimStart()
${update8}
${update10}`.trimStart()
},
// Empty test
{
@ -677,6 +680,7 @@ ${update2}
${update4}
${update6}
${update8}
${update10}
{{~> (lookup . "marker") ~}}`.trimStart()
},
// Definition tags update
@ -750,6 +754,7 @@ ${update2}
${update4}
${update6}
${update8}
${update10}
{{~> (lookup . "marker") ~}}
`.trimStart()
},
@ -890,6 +895,7 @@ ${update8}
{{/inline}}
${update8}
${update10}
{{~> (lookup . "marker") ~}}`.trimStart()
}
];