diff options
| author | Darius Jahandarie <djahandarie@gmail.com> | 2023-12-06 03:53:16 +0000 | 
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-12-06 03:53:16 +0000 | 
| commit | bd5bc1a5db29903bc098995cd9262c4576bf76af (patch) | |
| tree | c9214189e0214480fcf6539ad1c6327aef6cbd1c /ext/js/templates/sandbox/template-renderer-media-provider.js | |
| parent | fd6bba8a2a869eaf2b2c1fa49001f933fce3c618 (diff) | |
| parent | 23e6fb76319c9ed7c9bcdc3efba39bc5dd38f288 (diff) | |
Merge pull request #339 from toasted-nutbread/type-annotations
Type annotations
Diffstat (limited to 'ext/js/templates/sandbox/template-renderer-media-provider.js')
| -rw-r--r-- | ext/js/templates/sandbox/template-renderer-media-provider.js | 67 | 
1 files changed, 64 insertions, 3 deletions
| diff --git a/ext/js/templates/sandbox/template-renderer-media-provider.js b/ext/js/templates/sandbox/template-renderer-media-provider.js index 33ddec21..d8a0a16d 100644 --- a/ext/js/templates/sandbox/template-renderer-media-provider.js +++ b/ext/js/templates/sandbox/template-renderer-media-provider.js @@ -20,9 +20,11 @@ import {Handlebars} from '../../../lib/handlebars.js';  export class TemplateRendererMediaProvider {      constructor() { +        /** @type {?import('anki-note-builder').Requirement[]} */          this._requirements = null;      } +    /** @type {?import('anki-note-builder').Requirement[]} */      get requirements() {          return this._requirements;      } @@ -31,12 +33,24 @@ export class TemplateRendererMediaProvider {          this._requirements = value;      } +    /** +     * @param {import('anki-templates').NoteData} root +     * @param {unknown[]} args +     * @param {import('core').SerializableObject} namedArgs +     * @returns {boolean} +     */      hasMedia(root, args, namedArgs) {          const {media} = root;          const data = this._getMediaData(media, args, namedArgs);          return (data !== null);      } +    /** +     * @param {import('anki-templates').NoteData} root +     * @param {unknown[]} args +     * @param {import('core').SerializableObject} namedArgs +     * @returns {?string} +     */      getMedia(root, args, namedArgs) {          const {media} = root;          const data = this._getMediaData(media, args, namedArgs); @@ -45,16 +59,24 @@ export class TemplateRendererMediaProvider {              if (typeof result === 'string') { return result; }          }          const defaultValue = namedArgs.default; -        return typeof defaultValue !== 'undefined' ? defaultValue : ''; +        return defaultValue === null || typeof defaultValue === 'string' ? defaultValue : '';      }      // Private +    /** +     * @param {import('anki-note-builder').Requirement} value +     */      _addRequirement(value) {          if (this._requirements === null) { return; }          this._requirements.push(value);      } +    /** +     * @param {import('anki-templates').MediaObject} data +     * @param {import('core').SerializableObject} namedArgs +     * @returns {string} +     */      _getFormattedValue(data, namedArgs) {          let {value} = data;          const {escape=true} = namedArgs; @@ -64,6 +86,12 @@ export class TemplateRendererMediaProvider {          return value;      } +    /** +     * @param {import('anki-templates').Media} media +     * @param {unknown[]} args +     * @param {import('core').SerializableObject} namedArgs +     * @returns {?(import('anki-templates').MediaObject)} +     */      _getMediaData(media, args, namedArgs) {          const type = args[0];          switch (type) { @@ -78,6 +106,11 @@ export class TemplateRendererMediaProvider {          }      } +    /** +     * @param {import('anki-templates').Media} media +     * @param {import('anki-templates').MediaSimpleType} type +     * @returns {?import('anki-templates').MediaObject} +     */      _getSimpleMediaData(media, type) {          const result = media[type];          if (typeof result === 'object' && result !== null) { return result; } @@ -85,12 +118,19 @@ export class TemplateRendererMediaProvider {          return null;      } +    /** +     * @param {import('anki-templates').Media} media +     * @param {unknown} path +     * @param {import('core').SerializableObject} namedArgs +     * @returns {?import('anki-templates').MediaObject} +     */      _getDictionaryMedia(media, path, namedArgs) { +        if (typeof path !== 'string') { return null; }          const {dictionaryMedia} = media;          const {dictionary} = namedArgs; +        if (typeof dictionary !== 'string') { return null; }          if (              typeof dictionaryMedia !== 'undefined' && -            typeof dictionary === 'string' &&              Object.prototype.hasOwnProperty.call(dictionaryMedia, dictionary)          ) {              const dictionaryMedia2 = dictionaryMedia[dictionary]; @@ -109,8 +149,15 @@ export class TemplateRendererMediaProvider {          return null;      } +    /** +     * @param {import('anki-templates').Media} media +     * @param {unknown} text +     * @param {import('core').SerializableObject} namedArgs +     * @returns {?import('anki-templates').MediaObject} +     */      _getTextFurigana(media, text, namedArgs) { -        const {readingMode=null} = namedArgs; +        if (typeof text !== 'string') { return null; } +        const readingMode = this._normalizeReadingMode(namedArgs.readingMode);          const {textFurigana} = media;          if (Array.isArray(textFurigana)) {              for (const entry of textFurigana) { @@ -125,4 +172,18 @@ export class TemplateRendererMediaProvider {          });          return null;      } + +    /** +     * @param {unknown} value +     * @returns {?import('anki-templates').TextFuriganaReadingMode} +     */ +    _normalizeReadingMode(value) { +        switch (value) { +            case 'hiragana': +            case 'katakana': +                return value; +            default: +                return null; +        } +    }  } |