diff options
| -rw-r--r-- | test/data/templates/old-default-anki-field-templates.handlebars | 169 | ||||
| -rw-r--r-- | test/options-util.test.js | 37 | 
2 files changed, 206 insertions, 0 deletions
| diff --git a/test/data/templates/old-default-anki-field-templates.handlebars b/test/data/templates/old-default-anki-field-templates.handlebars new file mode 100644 index 00000000..42deae23 --- /dev/null +++ b/test/data/templates/old-default-anki-field-templates.handlebars @@ -0,0 +1,169 @@ +{{#*inline "glossary-single"}} +    {{~#unless brief~}} +        {{~#if definitionTags~}}<i>({{#each definitionTags}}{{name}}{{#unless @last}}, {{/unless}}{{/each}})</i> {{/if~}} +        {{~#if only~}}({{#each only}}{{{.}}}{{#unless @last}}, {{/unless}}{{/each}} only) {{/if~}} +    {{~/unless~}} +    {{~#if glossary.[1]~}} +        {{~#if compactGlossaries~}} +            {{#each glossary}}{{#multiLine}}{{.}}{{/multiLine}}{{#unless @last}} | {{/unless}}{{/each}} +        {{~else~}} +            <ul>{{#each glossary}}<li>{{#multiLine}}{{.}}{{/multiLine}}</li>{{/each}}</ul> +        {{~/if~}} +    {{~else~}} +        {{~#multiLine}}{{glossary.[0]}}{{/multiLine~}} +    {{~/if~}} +{{/inline}} + +{{#*inline "audio"}} +    {{~#if definition.audioFileName~}} +        [sound:{{definition.audioFileName}}] +    {{~/if~}} +{{/inline}} + +{{#*inline "character"}} +    {{~definition.character~}} +{{/inline}} + +{{#*inline "dictionary"}} +    {{~definition.dictionary~}} +{{/inline}} + +{{#*inline "expression"}} +    {{~#if merge~}} +        {{~#if modeTermKana~}} +            {{~#each definition.reading~}} +                {{{.}}} +                {{~#unless @last}}、{{/unless~}} +            {{~else~}} +                {{~#each definition.expression~}} +                    {{{.}}} +                    {{~#unless @last}}、{{/unless~}} +                {{~/each~}} +            {{~/each~}} +        {{~else~}} +            {{~#each definition.expression~}} +                {{{.}}} +                {{~#unless @last}}、{{/unless~}} +            {{~/each~}} +        {{~/if~}} +    {{~else~}} +        {{~#if modeTermKana~}} +            {{~#if definition.reading~}} +                {{definition.reading}} +            {{~else~}} +                {{definition.expression}} +            {{~/if~}} +        {{~else~}} +            {{definition.expression}} +        {{~/if~}} +    {{~/if~}} +{{/inline}} + +{{#*inline "furigana"}} +    {{~#if merge~}} +        {{~#each definition.expressions~}} +            <span class="expression-{{termFrequency}}">{{~#furigana}}{{{.}}}{{/furigana~}}</span> +            {{~#unless @last}}、{{/unless~}} +        {{~/each~}} +    {{~else~}} +        {{#furigana}}{{{definition}}}{{/furigana}} +    {{~/if~}} +{{/inline}} + +{{#*inline "furigana-plain"}} +    {{~#if merge~}} +        {{~#each definition.expressions~}} +            <span class="expression-{{termFrequency}}">{{~#furiganaPlain}}{{{.}}}{{/furiganaPlain~}}</span> +            {{~#unless @last}}、{{/unless~}} +        {{~/each~}} +    {{~else~}} +        {{#furiganaPlain}}{{{definition}}}{{/furiganaPlain}} +    {{~/if~}} +{{/inline}} + +{{#*inline "glossary"}} +    <div style="text-align: left;"> +    {{~#if modeKanji~}} +        {{~#if definition.glossary.[1]~}} +            <ol>{{#each definition.glossary}}<li>{{.}}</li>{{/each}}</ol> +        {{~else~}} +            {{definition.glossary.[0]}} +        {{~/if~}} +    {{~else~}} +        {{~#if group~}} +            {{~#if definition.definitions.[1]~}} +                <ol>{{#each definition.definitions}}<li>{{> glossary-single brief=../brief compactGlossaries=../compactGlossaries}}</li>{{/each}}</ol> +            {{~else~}} +                {{~> glossary-single definition.definitions.[0] brief=brief compactGlossaries=compactGlossaries~}} +            {{~/if~}} +        {{~else if merge~}} +            {{~#if definition.definitions.[1]~}} +                <ol>{{#each definition.definitions}}<li>{{> glossary-single brief=../brief compactGlossaries=../compactGlossaries}}</li>{{/each}}</ol> +            {{~else~}} +                {{~> glossary-single definition.definitions.[0] brief=brief compactGlossaries=compactGlossaries~}} +            {{~/if~}} +        {{~else~}} +            {{~> glossary-single definition brief=brief compactGlossaries=compactGlossaries~}} +        {{~/if~}} +    {{~/if~}} +    </div> +{{/inline}} + +{{#*inline "glossary-brief"}} +    {{~> glossary brief=true ~}} +{{/inline}} + +{{#*inline "kunyomi"}} +    {{~#each definition.kunyomi}}{{.}}{{#unless @last}}, {{/unless}}{{/each~}} +{{/inline}} + +{{#*inline "onyomi"}} +    {{~#each definition.onyomi}}{{.}}{{#unless @last}}, {{/unless}}{{/each~}} +{{/inline}} + +{{#*inline "reading"}} +    {{~#unless modeTermKana~}} +        {{~#if merge~}} +            {{~#each definition.reading~}} +                {{{.}}} +                {{~#unless @last}}、{{/unless~}} +            {{~/each~}} +        {{~else~}} +            {{~definition.reading~}} +        {{~/if~}} +    {{~/unless~}} +{{/inline}} + +{{#*inline "sentence"}} +    {{~#if definition.cloze}}{{definition.cloze.sentence}}{{/if~}} +{{/inline}} + +{{#*inline "cloze-prefix"}} +    {{~#if definition.cloze}}{{definition.cloze.prefix}}{{/if~}} +{{/inline}} + +{{#*inline "cloze-body"}} +    {{~#if definition.cloze}}{{definition.cloze.body}}{{/if~}} +{{/inline}} + +{{#*inline "cloze-suffix"}} +    {{~#if definition.cloze}}{{definition.cloze.suffix}}{{/if~}} +{{/inline}} + +{{#*inline "tags"}} +    {{~#mergeTags definition group merge}}{{this}}{{/mergeTags~}} +{{/inline}} + +{{#*inline "url"}} +    <a href="{{definition.url}}">{{definition.url}}</a> +{{/inline}} + +{{#*inline "screenshot"}} +    <img src="{{definition.screenshotFileName}}" /> +{{/inline}} + +{{#*inline "document-title"}} +    {{~context.document.title~}} +{{/inline}} + +{{~> (lookup . "marker") ~}} diff --git a/test/options-util.test.js b/test/options-util.test.js index 8fe0e212..78ac0009 100644 --- a/test/options-util.test.js +++ b/test/options-util.test.js @@ -628,6 +628,42 @@ async function testUpdate() {  }  /** */ +async function testCumulativeFieldTemplatesUpdates() { +    /** +     * @param {string} templates +     * @returns {Map<string, string>} +     */ +    const getHandlebarsPartials = (templates) => { +        const inlinePartialRegex = /{{~?#\*inline .*?"([^"]*)"~?}}.*?{{~?\/inline~?}}/gs; +        const matches = templates.matchAll(inlinePartialRegex); +        const partials = new Map(); +        for (const match of matches) { +            const [template, name] = match; +            partials.set(name, template); +        } +        return partials; +    }; +    test('CumulativeFieldTemplatesUpdates', async () => { +        const optionsUtil = new OptionsUtil(); +        await optionsUtil.prepare(); + +        const options = /** @type {import('core').SafeAny} */ (createOptionsTestData1()); + +        const oldAnkiFieldTemplates = fs.readFileSync(path.join(dirname, 'data', 'templates', 'old-default-anki-field-templates.handlebars'), {encoding: 'utf8'}); +        const defaultAnkiFieldTemplates = fs.readFileSync(path.join(dirname, '..', 'ext', 'data', 'templates', 'default-anki-field-templates.handlebars'), {encoding: 'utf8'}); + +        options.profiles[0].options.anki.fieldTemplates = oldAnkiFieldTemplates; +        const optionsUpdated = structuredClone(await optionsUtil.update(options)); +        const fieldTemplatesUpdated = optionsUpdated.profiles[0].options.anki.fieldTemplates || ''; + +        const partialsUpdated = getHandlebarsPartials(fieldTemplatesUpdated); +        const partialsExpected = getHandlebarsPartials(defaultAnkiFieldTemplates); + +        expect(partialsUpdated).toStrictEqual(partialsExpected); +    }); +} + +/** */  async function testDefault() {      describe('Default', () => {          /** @type {((options: import('options-util').IntermediateOptions) => void)[]} */ @@ -1697,6 +1733,7 @@ async function main() {      await testUpdate();      await testDefault();      await testFieldTemplatesUpdate(); +    await testCumulativeFieldTemplatesUpdates();  }  await main(); |