* Add _getExpressionAndReading utility
* Add _getExpressionReadingKey utility
* Add _getAudioOptions
* Separate some logic into _createAudioFromInfoList
* Update cache data format so that it can be accessed synchronously
* Allow sources to be manually specified
* Add options to enable playback of a specific entry of a source
* Use a standard map
* Wrap function
* Improve cache to support multiple different source arrays
For the same reading/expression
* Rename variable
* Use null instead of an error
* Simplify details
* Simplify audio creation
* Return an array of sources instead of a single item
* Use sourceIndex instead of index
* Rename APIs
* Return more info about the source
* Return source instead of sourceIndex
* Create HotkeyHelpController
* Expose getAllTemplates
* Update hotkeys on the context page
* Update hotkeys on the display pages
* Fix display issue where a hotkey used to be defined but no longer is
* Add support for allowing TextScanner.search to force focus
* Simplify query parser searched event forwarding
* Defer fallback creation
* Simplify event listeners
* Change type to pointerType
* Change cause to eventType
* Change empty to passive; make .search function passive
* Remove unused input index
* Create AnkiNoteData
* Create AnkiNoteDataDefinitionProxyHandler
* Update media injection
* Create AnkiNoteDataDefinitionSecondaryProperties
* Update note context format
* Expose url and cloze on definition
* Simplify for understandability
* Remove unused _createNoteData
* Update public object
* Remove trims on sentence, since it should already be trimmed
* Fix unused global
* Pass url into setContent
* Update where url is checked from
* Add documentTitle to state information
* Update how _getNoteContext gets the document title
* Update how url is fetched for options context
* Pass document title in to 'searched' event
* Refactor note adding/viewing functions
* Move _addDefinition
* Update where anki field templates are assigned
* Update _createNote to not include options/templates arguments
* Simplify getAnkiNoteInfo to not require duplicateScope
* Move TemplateRendererProxy creation into AnkiNoteBuilder
* Simplify _stringReplaceAsync
* Organize note generation
* Rename API
* Make the template rendering function more generic
* Rename sentenceExtent with sentenceScanExtent
* Update TextScanner.setOptions
* Change function argument order
* Rename quote map variables
* Fix edge case quote handling
* Update terminator maps to support character inclusion
* Copy set intersection functions
* Remove unused functions
* Simplify url check
* Remove parseUrl
* Simplify stringReverse
* Remove hasOwn due to infrequent use
* Rename errorToJson/jsonToError to de/serializeError
For clarity on intended use.
* Fix time argument on timeout
* Add missing return value
* Throw an error for unexpected argument values
* Add documentation comments
* Add support for regex replacements during the translation process
* Allow assignment of textReplacements
* Rename
* Set up test data
* Write expected data
* Set up options
* Prevent infinite loop if regex matches empty string
* Implement setting controller
* Add support for testing pattern replacements