~/f/rstudio/RPMS.2017 ~/f/rstudio ~/f/rstudio RPMS.2017/rstudio-2022.02.2+485-0.0.x86_64.rpm RPMS/rstudio-2022.02.2+485-0.0.x86_64.rpm differ: byte 225, line 1 Comparing rstudio-2022.02.2+485-0.0.x86_64.rpm to rstudio-2022.02.2+485-0.0.x86_64.rpm comparing the rpm tags of rstudio --- old-rpm-tags +++ new-rpm-tags @@ -1314 +1314 @@ -/usr/libexec/rstudio/www/js/panmirror/panmirror_quantum.js.map f4f47deca8e3840747cc68ff39556fd2e230cdc3ef326ed82315df45a22ff2d9 0 +/usr/libexec/rstudio/www/js/panmirror/panmirror_quantum.js.map 4fd1cbbb910c28f22b634b2c086a4e8233874d24800d94c7da63396d4e7accf0 0 comparing rpmtags comparing RELEASE comparing PROVIDES comparing scripts comparing filelist comparing file checksum creating rename script RPM file checksum differs. Extracting packages /usr/libexec/rstudio/www/js/panmirror/panmirror_quantum.js.map differs (UTF-8 Unicode text, with very long lines, with no line terminators) --- old//usr/libexec/rstudio/www/js/panmirror/panmirror_quantum.js.map 2022-05-21 00:00:00.000000000 +0000 +++ new//usr/libexec/rstudio/www/js/panmirror/panmirror_quantum.js.map 2022-05-21 00:00:00.000000000 +0000 @@ -1 +1 @@ -{"version":3,"sources":["src/polyfill/index.ts","src/polyfill/isconnected.ts","src/index.ts","src/polyfill/custom-event.ts","src/editor/editor.ts","src/api/cite.ts","src/api/doi.ts","src/api/ui-dialogs.ts","src/api/pandoc_attr.ts","src/api/extension.ts","src/api/pandoc_capabilities.ts","src/api/pandoc.ts","src/api/quote.ts","src/api/math.ts","src/api/mark.ts","src/api/text.ts","src/api/code.ts","src/api/node.ts","src/api/link.ts","src/api/html.ts","src/api/events.ts","src/api/event-types.ts","src/api/pandoc_format.ts","src/api/yaml.ts","src/api/format.ts","src/api/object.ts","src/api/log.ts","src/api/basekeys.ts","src/api/selection.ts","src/api/transaction.ts","src/api/slice.ts","src/api/platform.ts","src/api/outline.ts","src/api/rmd.ts","src/api/list.ts","src/api/command.ts","src/api/ui.ts","src/api/trailing_p.ts","src/api/paragraph.ts","src/api/util.ts","src/api/location.ts","src/api/dom.ts","src/api/scroll.ts","src/api/navigation.ts","src/api/xref.ts","src/api/pandoc_id.ts","src/api/raw.ts","src/api/image.ts","src/api/fixup.ts","src/api/css.ts","src/api/change.ts","src/api/input_rule.ts","src/api/wrap.ts","src/nodes/yaml_metadata/yaml_metadata-title.ts","src/behaviors/outline.ts","src/behaviors/find.ts","src/behaviors/omni_insert/omni_insert.ts","src/api/completion.ts","src/behaviors/omni_insert/omni_insert-completion.tsx","src/api/omni_insert.ts","src/api/placeholder.ts","src/behaviors/completion/completion.ts","src/behaviors/completion/completion-popup.tsx","src/api/widgets/popup.tsx","src/api/promise.ts","src/behaviors/spelling/spelling-interactive.ts","src/behaviors/spelling/spelling.ts","src/api/spelling.ts","src/behaviors/spelling/spelling-realtime.ts","src/pandoc/pandoc_converter.ts","src/api/pandoc_capsule.ts","src/api/base64.ts","src/pandoc/pandoc_to_prosemirror.ts","src/pandoc/pandoc_from_prosemirror.ts","src/api/fragment.ts","src/editor/editor-extensions.ts","src/nodes/text.ts","src/nodes/paragraph.ts","src/nodes/heading.ts","src/nodes/blockquote.ts","src/nodes/code_block.ts","src/nodes/list/list.ts","src/nodes/list/list-commands.ts","src/nodes/div/div.ts","src/nodes/div/div-callout.ts","src/nodes/div/div-tabset.ts","src/nodes/list/list-checked.ts","src/nodes/list/list-pandoc.ts","src/nodes/image/image.ts","src/nodes/image/image-dialog.ts","src/nodes/image/image-util.ts","src/nodes/image/image-textsel.ts","src/nodes/image/figure.ts","src/api/decoration.ts","src/nodes/image/image-view.ts","src/nodes/image/image-resize.ts","src/api/widgets/widgets.ts","src/nodes/image/figure-keys.ts","src/nodes/image/image-events.ts","src/nodes/hr.ts","src/nodes/hard_break.ts","src/nodes/null.ts","src/marks/em.ts","src/marks/strong.ts","src/marks/code.ts","src/marks/link/link.ts","src/marks/link/link-command.ts","src/marks/link/link-auto.ts","src/api/clipboard.ts","src/marks/link/link-headings.ts","src/marks/link/link-popup.tsx","src/api/widgets/tooltip.ts","src/api/widgets/button.tsx","src/api/text-popup.ts","src/api/widgets/react.ts","src/api/widgets/decoration.ts","src/behaviors/select_all.ts","src/behaviors/history.ts","src/behaviors/cursor.ts","src/behaviors/clear_formatting.ts","src/behaviors/smarty.ts","src/behaviors/attr_duplicate_id.ts","src/behaviors/trailing_p.ts","src/behaviors/empty_mark.ts","src/behaviors/escape_mark.ts","src/behaviors/code_block_input.ts","src/behaviors/paste_text.ts","src/behaviors/bottom_padding.ts","src/behaviors/insert_symbol/insert_symbol-plugin-symbol.tsx","src/api/unicode.ts","src/behaviors/insert_symbol/insert_symbol-plugin.tsx","src/behaviors/insert_symbol/insert_symbol-popup.tsx","src/api/focus.ts","src/api/widgets/select.tsx","src/api/widgets/text.tsx","src/behaviors/insert_symbol/insert_symbol-grid.tsx","src/behaviors/insert_symbol/insert_symbol-grid-cell.tsx","src/behaviors/insert_symbol/insert_symbol-grid-preview.tsx","src/behaviors/insert_symbol/symbols.ts","src/behaviors/insert_symbol/insert_symbol-plugin-emoji.tsx","src/api/emoji.ts","src/api/emojis-all.ts","src/marks/emoji/emoji.ts","src/marks/emoji/emoji-completion.tsx","src/behaviors/insert_symbol/insert_symbol-emoji-skintone.tsx","src/behaviors/insert_symbol/insert_special_characters.ts","src/behaviors/nbsp.ts","src/behaviors/remove_section.ts","src/behaviors/slides.ts","src/marks/strikeout.ts","src/marks/superscript.ts","src/marks/subscript.ts","src/marks/smallcaps.ts","src/marks/underline.ts","src/marks/raw_inline/raw_inline.ts","src/marks/raw_inline/raw_tex.ts","src/api/mark-highlight.ts","src/api/tex.ts","src/marks/raw_inline/raw_html.ts","src/marks/math/math.ts","src/marks/math/math-commands.ts","src/marks/math/math-transaction.ts","src/marks/math/math-highlight.ts","src/marks/math/math-popup.ts","src/marks/math/math-view.ts","src/api/attr_edit/attr_edit-decoration.tsx","src/marks/math/math-keys.ts","src/marks/cite/cite.ts","src/api/bibliography/bibliography.ts","src/api/bibliography/bibliography-provider_local.ts","src/api/path.ts","src/api/bibliography/bibDB.ts","src/api/csl.ts","src/api/crossref.ts","src/api/csl-text.ts","src/api/bibtex/bibtex.ts","src/api/bibtex/fields.ts","src/api/bibtex/language.ts","src/api/bibtex/types.ts","src/api/bibtex/formatting.ts","src/api/bibtex/characters.ts","src/api/bibliography/bibliography-provider_zotero.ts","src/api/zotero.ts","src/marks/cite/cite-completion.tsx","src/api/widgets/completion.tsx","src/marks/cite/cite-completion-bibliography.ts","src/marks/cite/cite-completion-quarto-xref.ts","src/marks/xref/xref-completion.tsx","src/marks/cite/cite-completion-search.ts","src/marks/cite/cite-highlight.ts","src/marks/cite/cite-completion_doi.tsx","src/api/widgets/completion-detailed.tsx","src/marks/cite/cite-doi.ts","src/marks/cite/cite-popup.tsx","src/marks/cite/cite-commands.ts","src/behaviors/insert_citation/insert_citation.tsx","src/api/widgets/tag-input.tsx","src/api/widgets/navigation-tree.tsx","src/api/widgets/dialog-buttons.tsx","src/behaviors/insert_citation/source_panels/insert_citation-source-panel.ts","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-bibliography.tsx","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-typeahead-search.tsx","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-list.tsx","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-list-item.tsx","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-doi.tsx","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-latent-search.tsx","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-list-item-detailed.tsx","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-crossref.tsx","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-pubmed.tsx","src/api/pubmed.ts","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-datacite.tsx","src/api/datacite.ts","src/behaviors/insert_citation/insert_citation-bibliography-picker.tsx","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-packages.tsx","src/api/widgets/checkbox-input.tsx","src/marks/cite/cite-popup-xref.tsx","src/marks/span.ts","src/marks/xref/xref.ts","src/marks/xref/xref-popup.tsx","src/behaviors/insert_xref/insert_xref.tsx","src/behaviors/insert_xref/insert_xref_index.ts","src/marks/raw_inline/raw_html_comment.ts","src/marks/shortcode.ts","src/nodes/footnote/footnote.ts","src/api/shortcode.ts","src/nodes/footnote/footnote-editor.ts","src/nodes/footnote/footnote-transaction.ts","src/nodes/raw_block.ts","src/nodes/yaml_metadata/yaml_metadata.ts","src/nodes/yaml_metadata/yaml_metadata-capsule.ts","src/nodes/rmd_chunk/rmd_chunk.ts","src/nodes/rmd_chunk/rmd_chunk-image.ts","src/nodes/rmd_chunk/rmd_chunk-capsule.ts","src/nodes/line_block.ts","src/nodes/table/table.ts","src/nodes/table/table-commands.ts","src/nodes/table/table-nodes.ts","src/nodes/table/table-pandoc.ts","src/nodes/table/table-columns.ts","src/nodes/table/table-capsule.ts","src/nodes/table/table-contextmenu.ts","src/nodes/table/table-paste.ts","src/nodes/definition_list/definition_list.ts","src/nodes/definition_list/definition_list-commands.ts","src/nodes/definition_list/definition_list-insert.ts","src/nodes/definition_list/definition-list-keys.ts","src/nodes/definition_list/definition_list-inputrule.ts","src/api/position.ts","src/nodes/definition_list/definition_list-pandoc.ts","src/nodes/shortcode_block.ts","src/nodes/html_preserve.ts","src/optional/ace/ace.ts","src/api/cursor.ts","src/optional/ace/ace-render-queue.ts","src/optional/ace/ace-placeholder.ts","src/optional/ace/ace-node-views.ts","src/behaviors/attr_edit/attr_edit.ts","src/behaviors/attr_edit/attr_edit-command.ts","src/editor/editor-theme.ts","src/editor/editor-images.ts","src/editor/editor-menus.ts","src/api/table.ts","src/editor/editor-schema.ts","src/api/presentation.ts"],"names":["_c47e","f","r","id","cached","m","exports","Object","isFrozen","input","default","module","editor_1","Editor","UITools","mod","__esModule","value","custom_event_1","__importDefault","isconnected_1","t","_","label","ops","push","op","pop","trys","body","call","thisArg","e","y","done","__spreadArrays","this","s","i","il","arguments","length","Array","k","a","j","jl","defineProperty","prosemirror_inputrules_1","prosemirror_keymap_1","prosemirror_model_1","prosemirror_state_1","prosemirror_view_1","prosemirror_utils_1","cite_1","ui_dialogs_1","pandoc_capabilities_1","omni_insert_1","spelling_interactive_1","spelling_realtime_1","pandoc_converter_1","editor_extensions_1","EditorCommands","command_1","EditorCommandId","attr","propsToInput","attrPropsToInput","inputToProps","attrInputToProps","pandocAutoIdentifier","text","pandoc_id_1","image","validUnits","percentUnit","css_1","kPercentUnit","unitToPixels","image_1","pixelsToUnit","roundUnit","format","parseFormatConfig","pandoc_format_1","pandocFormatConfigFromCode","citation","citeUI","PluginKey","parent","context","options","pandocFormat","pandocCapabilities","_this","maxContentWidth","events","events_1","DOMEditorEvents","keybindings","initExtensions","editorSchema","extensions","EditorState","create","initialDoc","attributes","dispatchTransaction","bind","EditorDOMParser","schema","view","dom","add","editor_theme_1","defaultTheme","PandocConverter","server","pandoc","setAttribute","addEventListener","event_types_1","ScrollEvent","pandocFmt","editor","_a","spellCheck","codeEditor","rmdImagePreview","hideFormatComment","className","codeChunks","bookdownXRef","bookdownPart","blogdownMathInCode","rmdExtensions","hugoExtensions","__assign","shortcodes","docTypes","ui","images","defaultImages","omni_insert","sent","resolve","event","handler","subscribe","eventName","title","setTitle","state","setMarkdown","markdown","emitUpdate","Promise","doc","line_wrapping","unrecognized","example_lists","unparsed_meta","loc","tr_1","i_1","getMarkdownTr","canonical","location","pandocConverter","toProsemirror","result","isInitialDoc","plugins","updateState","getEditingLocation","tr","setTextSelection","pos","applyFixups","fixup_1","FixupContext","Load","emitEvent","UpdateEvent","getMarkdownCode","prototype","attrs","initial","getMarkdown","__generator","code","outline_1","getEditingOutlineLocation","getHTML","getTitle","getSelection","navigation_id","navigationIdForSelection","setEditingLocation","outlineLocation","previousLocation","getOutline","getFindReplace","selectCurrent","find_1","selectFirst","selectNext","selectPrevious","replace","getSpellingDoc","pandocMarks","spelling","spellingInvalidateAllWords","invalidateAllWords","spellingInvalidateWord","word","invalidateWord","extensionFixups","getSelectedText","replaceSelection","selection","from","empty","marks","$from","dispatch","sel","TextSelection","trSetSel","getYamlFrontMatter","nodes","yaml_metadata","yaml_1","yamlFrontMatter","presentation_1","getPresentationEditorLocation","navigateToPresentationEditorLocation","positionForPresentationEditorLocation","navigate","navigation_1","NavigationType","Pos","String","applyYamlFrontMatter","yaml","focus","blur","insertChunk","chunkPlaceholder","type","recordCurrent","animate","NavigateEvent","nav","resize","applyFixupsOnResize","ResizeEvent","initFn","getMenus","commands","commandKeys","map","command","keymap","isActive","isEnabled","plural","execute","keepFocus","applyTheme","theme","classList","toggle","darkMode","setMaxContentWidth","maxWidth","minPadding","minContentPadding","syncContentWidth","setKeybindings","keyBindings","reconfigure","createPlugins","getEditorFormat","getPandocFormat","getPandocFormatConfig","isRmd","pandocFormatConfigFromDoc","lastTrSelectionOnly","selectionSet","docChanged","apply","StateChangeEvent","storedMarksSet","getMeta","transaction_1","kFixupTransaction","outline_2","previousOutline","OutlineChangeEvent","DispatchEvent","eventType","detail","emit","pandocExtensions","navigation","registerCompletionExtension","register","omniInsertExtension","omniInserters","markFilter","registerRealtimeSpelling","registerPlugins","realtimeSpellingPlugin","baseKeysPlugin","baseKeys","appendTransactionsPlugin","appendTransactions","hooks","Plugin","inputRulesPlugin","input_rule_1","markInputRuleFilter","plugin","inputRules","rules","handleTextInput","props","to","domEventsPlugin","key","handleDOMEvents","FocusEvent","keydown","prefs","tabKeyMoveFocus","pluginKeys","forEach","keys","ctrlKeyCodes","keyCombo","match","keyCode","toUpperCase","prosemirrorKeydownHandler","keydownHandler","keybindingsPlugin","keyEvent","ctrlKey","keyCommand","defaultKeys","clientWidth","applyPadding","LayoutEvent","fixups","fixup","nodeFromJSON","content","__awaiter","outlineNode","getOutlineNodes","reverse","find","node","_super","DOMParser","fromSchema","parse","preserveWhitespace","parseSlice","doi_1","pinyin_1","transliteration_1","kInvalidCiteKeyChars","existingIds","baseId","char","charCodeAt","fromCharCode","isHanzi","asciiOnlyBaseId","includes","proposedId","count","safeBaseId","suggestCiteId","csl","citeIdLeading","author","family","literal","shortTitle","substr","Math","min","issued","yearIssued","datePart","formatForPreview","pairs","name","undefined","dateParts","formatIssuedDate","containerTitle","volume","page","cslAny","charAt","slice","createUniqueCiteId","URL","DOI","urlForDOI","formatAuthors","authors","maxLength","_b","_c","_d","previous","endsWith","index","current","substring","array","addAuthorOrEtAl","previousAuthorStr","newAuthorStr","authorStr","etAlStr","lastSpace","lastIndexOf","etAl","date","singleDatePart","citeProps","suggestedId","previewFields","kCrossrefMatches","findDOI","token","regex","hasDOI","doi","asPandocClass","clz","asHtmlId","startsWith","asHtmlClass","kAlertTypeInfo","kAlertTypeWarning","keyvalue","classes","split","style","pandoc_attr_1","pandocAttrKeyvalueFromText","kv","join","extension_1","kPandocAttrClasses","kPandocAttrKeyvalue","separator","convertedText","inQuotes","ch","trim","line","parts","kWidthAttrib","kAlignAttrib","kFigAltAttrib","kFigAlignAttrib","kFigEnvAttrib","kCodeBlockAttr","kCodeBlockText","pandocAttrAvailable","pandocAttrFrom","pandocAttr","pandocAttrRemoveClass","isArray","_i","predicate","foundClass","pandocAttrGetKeyvalue","keyval","entry","keyvalue_1","pandocAttrRemoveKeyvalue","filter","pandocAttrInSpec","spec","tok","c","kPandocAttrId","pandocAttrToDomAttr","marker","domAttr","el","forceAttrs","excludedNames","includedNames","hasAttribute","getAttribute","val","resolveCurrent","remainder","partitioned","partition","base","extensionIfEnabled","extension","kPandocAttrExtensions","extensionEnabled","getPandocCapabilities","getCapabilities","version","api_version","output_formats","pandoc_1","parsePandocListOutput","highlight_languages","PandocTokenType","quote_1","math_1","code_1","link_1","tokens","hasOwnProperty","mapValue","mapToken","mappedTok","tokenHasChildren","imageAttributesAvailable","link_attributes","raw_html","output","kRawBlockFormat","kRawBlockContent","kWriteSpaces","stringifyTokens","unemoji","elem","Str","Space","SoftBreak","LineBreak","kLinkChildren","Span","kSpanChildren","Quoted","kQuoteType","stringifyMath","Code","kCodeText","forEachToken","mapTokens","tokenTextEscaped","marksByPriority","markWriters","aPriority","priority","QuoteType","DoubleQuote","kSingleQuoteRegEx","RegExp","kSingleQuotes","begin","end","kDoubleQuotes","quotesForType","kDoubleQuoteRegEx","MathType","Inline","kMathType","kMathContent","kMathId","editorMath","delimter","delimiterForType","mathTypeIsActive","text_1","$pos","start","link","mark","offset","startIndex","startPos","child","nodeSize","endIndex","childCount","isInSet","endPos","markIsActive","storedMarks","range","nodesBetween","markItem","getMarkRange","markType","$head","removeInvalidatedMarks","re","findChildrenByMark","markedNode","removeStoredMark","validLength","removeMark","nd","markRange","trimmedText","trimStart","countSpace","mergedTextNodes","_node","_pos","parentNode","allowsMarkType","textNode","exec","refText","rangeHasMark","anchor","lastIndex","nodeIndex","textNodes","str1","str2","sensitivity","clipboardTextParser","$context","codeViews","codeViewType","codeView","createFromPastePattern","test","codeNode","nodeType","createAndFill","Slice","Fragment","n","p","canInsertNode","canInsertNodeAtPos","asSelection","d","depth","canReplaceWith","findTopLevelBodyNodes","findNodeOfTypeInSelection","foundNode","lastNode","last","nodeIsActive","findSelectedNodeOfType","findParentNode","kLinkTarget","LinkType","ids","headings","findChildren","findChildrenByType","heading","level","textContent","escapeHTMLAttribute","div","appendChild","innerHTML","kHTMLCommentRegEx","isHTMLComment","html","noEmptyAttribs","tag","attribs","selfClosing","DOMSerializer","serializeNode","generateHTML","firstYamlBlock","mdExtensions","object_1","findValue","yamlMarkdownOptions","yamlFormatConfig","readPandocFormatConfig","formatConfig","pandocFormatConfigFromCommentInCode","keyValueRegEx","matchPandocFormatComment","field","fields","keyValueMatch","variables_1","source","obj","toString","mode","asString","rmd_extensions","doctype","str","references","references_location","references_prefix","prefix","toLowerCase","asBoolean","parseExtensions","enabled","splitPandocFormatString","optionsPos","indexOf","commonmarkExtensions","rawHTML","includeTexMathDollars","format_1","kHugoDocType","kMarkdownGithubFormat","yamlMetadataNodes","foundFirstRawInline","config","pandocFormatConfigFromYamlInCode","warnings","baseName","formatOptions","variant","validOptionNames","fullName","invalidFormat","invalidOptions","pandocMode","kMarkdownMmdFormat","kMarkdownStrictFormat","kGfmFormat","kCommonmarkFormat","kCommonmarkXFormat","kMarkdownVariants","listExtensions","option","pandocFormatWith","hasFencedCodeBlocks","backtick_code_blocks","fenced_code_blocks","kBookdownDocType","kPresentationDocType","node_1","isYamlMetadataNode","titleMatch","kYamlMetadataTitleRegex","firstYaml","firstYamlNode","stripYamlDelimeters","yamlText","updatedYaml","replaceRangeWith","updatedYamlNode","insert","yamlNodes_1","titleFromYamlMetadataNode","yamlMetadataNameValueRegex","valueMatch","parseYaml","kFirstYamlBlockRegex","yamlCode","js_yaml_1","load","onWarning","log_1","logException","yamlParsed","dump","object","some","ignoreKey","homeKey","editingNode","head","coordsAtPos","beginDocPos","isOnPreviousLine","endKey","editingRootNode","endDocPos","top","bottom","arrowBodyNodeBoundary","dir","endOfTextblock","selection_1","selectionIsBodyTopLevel","side","nextPos","Selection","near","after","before","currentRootNode","nextRootNode","endTopLevelBodyNodeBoundary","scrollIntoView","BaseKey","Enter","prosemirror_commands_1","splitBlock","liftEmptyBlock","createParagraphNear","Backspace","selectNodeBackward","joinBackward","deleteSelection","Tab","ShiftTab","Delete","selectNodeForward","joinForward","platform_1","kPlatformMac","Home","End","ArrowLeft","ArrowUp","ArrowDown","ModArrowDown","undoInputRule","x","commandMap","baseKey","unshift","values","_e","isTextblock","cursorOffset","parentOffset","nodeText","prosemirror_gapcursor_1","selectionIsWithinRange","selectionIsWithin","nodeWithPos","selectionHasRange","selectionIsImageNode","NodeSelection","figure","selectionIsEmptyParagraph","paragraph","selectionWithinLastBodyParagraph","editingRoot","lastChild","slice_1","kPasteTransaction","kSetMarkdownTransaction","kNavigationTransaction","kInsertSymbolTransaction","kInsertCompletionTransaction","MarkTransaction","addMark","insertText","transactionsDocChanged","transactions","transaction","transactionsChangeSet","oldState","newState","transactions_1","changeSet","addSteps","mapping","maps","complete","oldSize","old","curSize","cur","outer","scan","sameMarkup","size","step","sliceContentLength","handlers","handlers_1","nodeAt","nodeFilter","haveChange","changes","change","fromA","toA","checkForChange","append","_loop_1","handlers_2","trTransform","prosemirror_transform_1","Transform","transactionsAreTypingChange","hasNode","descendants","navigator","platform","rmd_chunk","bullet_list","outlineNodes","bodyNode","childNode","kYamlMetadataOutlineItemType","itemsWithPos","getDocumentOutline","item","active","position","chunk","rmd_1","rmdChunkEngineAndLabel","kHeadingOutlineItemType","isOutlineNode","canInsertRmdChunk","within","findParentNodeOfType","table","list_item","blockquote","activeRmdChunk","rmdNode","rmdChunk","rmdChunkNodes_1","rmdChunkNode","chunks","lines","trimLeft","meta","matchLang","isContainerChunk","lang","delimiter","reduce","ticks","idx","insertRmdChunk","GapCursor","toggleBlockType","list_1","precedingListItemInsertPos","rmdText","util_1","uuidv4","prevListItemPos","precedingListItemInsert","previousRmdChunks","localeCompare","kEvalFalseRegEx","table_cell","table_header","cell","markedRange","mark_1","textBetween","ListType","extendStatics","__extends","b","setPrototypeOf","__proto__","__","constructor","assign","prosemirror_schema_list_1","ui_1","trailing_p_1","ProsemirrorCommand","omniInsert","MarkCommand","toggleMarkType","NodeCommand","BlockCommand","blockType","toggleType","WrapCommand","wrapType","toggleWrap","InsertCharacterCommand","codeRange","defaultToggleMark","toggletype","setBlockType","$anchor","lift","wrapIn","listType","itemType","blockRange","$to","isList","parentList","tight","setNodeMarkup","listSpacing","kListSpacingTight","replaceSelectionWith","selectAfter","requiresTrailingP","insertTrailingP","sameParent","allowKey","endCaptionPos","above","indexAfter","contentMatchAt","defaultType","abs","paragraph_1","insertTrailingPTransform","dom_1","outlineItemSimillarToNode","outlineItem","docOutlneNode","nodeA","nodeB","scrollTop","docOutlineLocationNode","items","documentOutline","docOutlineNode","locationIsBetweenDocOutlineNodes","restoreSelection","scroll_1","scrollToPos","cs","getComputedStyle","asNumber","parseFloat","paddingX","paddingLeft","paddingRight","paddingY","paddingTop","paddingBottom","borderY","borderTopWidth","borderBottomWidth","width","offsetWidth","borderX","height","offsetHeight","onElementRemoved","container","onRemoved","mutationsList","mutation","removedNodes","center","ordered_list","parentDiv","findParentNodeOfTypeClosestToPos","resultPos","resultNode","nodeDOM","scroller","zenscroll_1","createScroller","containerEl","duration","onDone","intoView","HTMLElement","xref_1","navigateToId","navigateToHref","href","editorFormat","xref","xrefPosition","xrefType","xrefPos","prevPos","max","dest","parentElement","navigateToPos","Id","Href","navigateToHeading","XRef","navigateToXRef","locators","colonPos","xrefInfo","id_1","locator_1","markType_1","hasXRef","nodeTypes","suffix","dashPos","xrefPositionLocate","quartoXrefPositionLocators","bookdownXrefPositionLocators","captions","prosemirror_utils_2","table_caption","mathType","math","prevNodeMath","thm","quartoDivLocator","lem","h2","headingLocator","h3","h4","h5","h6","fig","rmdChunkHasXRef","tab","raw_1","kTexFormat","cnj","thereomLocator","def","engine","pattern","pandocAsciify","newch","chars","len","asciify","gfmAutoIdentifier","editRawBlockCommand","raw_block","action","rawBlock","raw","prevSel","createRawNode","asyncEditRawBlock","containerWidth","kPixelUnit","ImageType","isValidImageSizeUnit","unit","kValidUnits","imageSizePropWithUnit","prop","isNaturalAspectRatio","dims","defaultValue","naturalWidth","naturalHeight","pixels","round","attrib","_match","p1","p2","removeStyleAttrib","extractSizeStyles","keyvalues","newKeyvalues","getValue","pair","kHeightAttrib","kStyleAttrib","_attrib","setProperty","replaceClassWithStyle","contains","remove","removeAttribute","children_1","children","EditorChangeType","diff_match_patch_1","timeout","dmp","diff_match_patch","Diff_Timeout","diff","diff_main","diff_cleanupSemantic","DIFF_INSERT","Insert","DIFF_DELETE","Error","regexp","getAttrs","InputRule","textIndex","delimStart","delete","Function","markStart","markInputRule","delimiterMarkInputRule","prefixMask","delim","contentPattern","textStart","textEnd","maskOffset","disabledMarks","marksWithNoInputRules","marksInRange_1","maskedMarkTypes","maskedMarkTypes_1","wrappingRule","wrappingInputRule","joinPredicate","paraContent","isText","sentence","hardBreak","hardBreakPos","init","_config","titleFromState","titleLine","foundTitle","updatedMetadata","updatedNode","yamlNode","hasOutlineIdsTransaction","usedIds","Set","outlineId","setMeta","GoToNextSection","goToOutlineCommand","GoToPreviousChunk","editorOutline","transactionsHaveChange","transactionsAffectOutline","targetType","outline","target","sequence","Map","rootOutlineItem","defaultLevel","typename","sequenceLast","getState","FindPlugin","instance","DecorationSet","updating","update","prevState","clearResultObserver","isResultSelected","scrollToSelectedResult","decorations","resultElement","resultObserverTimer","term","escape","updateResults","selectResult","afterSelection","matchesTerm","selectedText","wrap","searchTo","decorationSet","withResultUpdates","searchFrom","decoration","lastDecoration","nextDecoration","tr_3","tr_4","selectionMarks","marksAcross","replaceAll","replaced","hasTerm","tr_5","clear","kAddToHistoryTransaction","resultDecorations","search","findRegEx","Decoration","inline","class","setSelection","watchForSelectedResult","MutationObserver","records","observer","ele","isResultNode","observe","childList","window","setTimeout","resultObserver","disconnect","clearTimeout","querySelector","scrollElement","nextParent","offsetParent","caseSensitive","findPlugin","inclusive","parseDOM","toDOM","readers","writer","writeInlines","OmniInsertCommand","inputRuleFilter","completionHandlers","omni_insert_completion_1","omniInsertCompletionHandler","OmniInsert","completion_1","selectionAllowsCompletions","kCompletionDefaultMaxVisible","prevHandler","scope","Node","replacement","omniInsertCompletions","inserter","keywords","keyword","sort","thenby_1","firstBy","omniInsertGroupCompare","thenBy","omniInsertPriorityCompare","direction","completion","deleteRange","selectionOffset","removeCommandText","component","OmniInserterView","kOmniInsertRegex","query","placeholder_1","placeholderDecoration","translateText","completions","OmniInsertGroup","placeholder","pluginKey","set","emptyNode","textBefore","completionTextBeforeCursor","prevToken","isPaste","scrollUnsubscribe","removeEventListener","clearCompletions","pluginState","handled","horizontal","completionsActive","kbEvent","insertCompletion","selectedIndex","renderCompletions","forwardKey","completionPageSize","preventDefault","stopPropagation","promise_1","PromiseQueue","resetSelection","setAllCompletions","updatedCompletions","requestVersion_1","setDisplayedCompletions","displayedCompletions","updateCompletions","completionStream_1","stream","filteredCompletions","allCompletions","requestAllCompletions_1","hideNoResults","completionPopup","completion_popup_1","createCompletionPopup","renderCompletionPopup","performCompletionReplacement","CompletionPlugin","__importStar","document","createElement","zIndex","popup","completionPopupSize","positionStyles","selectionCoords","left","innerHeight","innerWidth","cursorCoords","completionPopupPositionStyles","applyStyles","render","react_1","CompletionPopup","destroyCompletionPopup","unmountComponentAtNode","concat","popup_1","Popup","CompletionList","kCompletionDefaultItemHeight","useRef","containerRef","scrollToRow","getElementsByClassName","ref","completionCount","header","completionHeader","headerProps","message","lineHeight","colSpan","completionsHeader","itemHeight","kNoResultsHeight","noResults","completionsNoResults","verticalCompletions","itemEventHandler","completionItemCell","onClick","onMouseMove","onHover","cellWidths","maxVisible","kCompletionDefaultWidth","headerHeight","horizontalCellWidths","total","contentEditable","queue","catch","err","running","reject","dequeue","spelling_1","excludedMarks","onCheckBegin","getWords","excluded","spellingDocPlugin","createAnchor","getText","wordRange","fromCoords","toCoords","spellingDocKey","get","SpellingDocPlugin","checking","anchors","setPosition","getPosition","SpellingAnchor","onCheckEnd","isBlock","classifier","findBeginWord","findEndWord","beginPos","classifyCharacter","currentPos","advanceToWord","endWordPos","excludeWord","words","shift","spellcheckerWord","kCharClassWord","kCharClassBoundary","kCharClassNonWord","spelling_2","hasFocus","realtimeEnabled","hasBeenFocused","word_1","wordDecos","decos","prosemirror_changeset_1","ChangeSet","steps","AddMarkStep","RemoveMarkStep","markStep","markRanges","removeRanges_1","fromPos","toPos","fromB","toB","addRanges_1","spellingDecorations","cursorDecos","realtimeSpellingKey","contextmenu","spellingSuggestionContextMenuHandler","focusUnsubscribe","updateSpelling","v_1","isConnected","excludeCursor","ranges","rangeMap","wordText","incorrectWords_1","checkWords","wordsToCheck","incorrectWord","ranges_1","cursor","menuItems","showContextMenu","clientX","clientY","schema_1","posAtDOM","deco","from_1","to_1","word_2","suggestionList","suggestions","suggestion","menuAction","ignoreWord","pandocPreprocessors","pandocTokensFilters","pandocBlockReaders","pandocInlineHTMLReaders","pandocBlockCapsuleFilters","pandocMarkWriters","autoIds","preprocessor","blockCapsuleFilters","pandoc_capsule_1","pandocMarkdownWithBlockCapsules","original","pandoc_to_prosemirror_1","pandocToProsemirror","ast","tokensFilters","blockReaders","inlineHTMLReaders","postprocessor","fromProsemirror","pandocOptions","referenceLocation","isParagraphNode","firstChild","paraNode","hard_break","disabledTableTypes","disabledFormatOptions","atxHeaders","dpi","column","parseInt","wrapOptions","astToMarkdown","adjustedFormat","disabled","newFormat","ext","kBlockCapsuleSentinel","handleText","encodedBlockCapsuleRegex","flags","envelopeLen","base64_1","base64Decode","record","fieldValue","blockCapsuleSourceWithoutPrefix","capsuleFilter","p3","p4","originalPos","positions","discard","extract","defaultExtractor","capsule","base64Encode","enclose","encodedRecord","decodeBlockCapsuleText","filters","blockCapsuleTextHandler","textFilter","stripPrefix","CodeBlock","RawBlock","parsePandocBlockCapsule","blockCapsuleParagraphTokenHandler","tokenRegex","Para","codeUnits","Uint16Array","Uint8Array","buffer","bytes","binary","Parser","createHandlers","ParserState","openNode","addNode","closeMark","writeText","hasInlineHTMLWriter","parser","writeInlineHTML","logUnrecognized","logExampleList","isNodeOpen","blocks","resolvePandocBlockCapsuleText","Null","prevTok","lineBreaks","columnBreaks","sentenceBreaks","gfm_auto_identifiers","heading_ids","hasShortcutHeadingLinks","equalsIgnoreCase","autoIdentifier","ascii_identifiers","headingIds","has","toLocaleLowerCase","Link","heading_1","kHeadingLevel","kHeadingAttr","kHeadingChildren","astBlocks","writeTokens","targetAst","lineWrapping","targetTokens","writeToken","blockCapsule","writeNode","reader","getChildren","this_1","block","blockReaders_1","blockReader","nodeType_2","closeNode","code_block","pandocAttrReadAST","readers_1","stack","Mark","none","notes","topNodeType","hasExampleLists","exampleLists","merged","info","isInline","openMark","addToSet","removeFromSet","openNoteNode","note","footnoteNumber","unrecognizedTokens","maybeMerge","sameSet","pandocFromProsemirror","apiVersion","nodeWriters","notesNode","PandocWriter","writeNodes","initEscapeCharacters","write","writeSpaces","spaceAfter","output_1","spaceBefore","outputText","trimRight","writeArray","writeAttr","preventEscapeCharacters","kPreventBracketEscape","flushTextRun","textRun_1","smart","manualEscapeCharacters","writeNote","Note","noteBody","fragment","nextNode","childIndex","currentChild","nodeMarks","next","markedNodes","activeMarks","md","fragment_1","fragmentText","escapeSymbols","escaped","escapeCharacters","RawInline","withOption","fill","tex_math_single_backslash","allEscapeCharacters","emjojiMark","emoji","emojihint","blockquote_1","code_block_1","figure_1","hr_1","hard_break_1","null_1","em_1","strong_1","history_1","select_all_1","cursor_1","clear_formatting_1","smarty_1","attr_duplicate_id_1","empty_mark_1","escape_mark_1","code_block_input_1","paste_text_1","footnote_1","manager","ExtensionManager","slides_1","bottom_padding_1","insert_symbol_plugin_symbol_1","insert_special_characters_1","nbsp_1","remove_section_1","yaml_metadata_1","rmd_chunk_1","table_1","definition_list_1","raw_block_1","shortcode_block_1","html_preserve_1","superscript_1","code_2","codeViewClipboardPlugin","collect","pandocNodes","collectFrom","pandocPostprocessors","pandocReaders","flatMap","tokensFilter","inlineHTMLReader","blockCapsuleFilter","pandocNodeWriters","code_view","views","attrEditors","appendMarkTransactions","appendMarkTransaction","collector","results","visitor","quote","Plain","InsertParagraphCommand","HeadingCommand","headingCommandFn","heading1","heading1_dark","heading2OmniInsert","heading2","heading2_dark","headingOmniInsert","heading4OmniInsert","heading4","heading4_dark","description","group","Headings","headingName","pandocAttrSupported","pandocAttrParseDom","header_attributes","mmd_header_identifiers","headingAttrs","headingAttr","data-link","preferHidden","partMatch","cut","writeBookdownH1","Heading1","heading1OmniInsert","Heading5","Heading6","textblockTypeInputRule","kHeadingLevels","pandocAttrParseText","emptyHeadingPlaceholderPlugin","CodeBlockFormat","codeBlockFormatCommandFn","languages","code_block_dark","fenced_code_attributes","potentialLang","codeBlockProps","dialogs","editCodeBlock","applyProps","propsWithLangClass","codeBlock","tags","right","editFn","codeNodeSpec","hasAttr","pandocAttrSpec","codeBlockLang","attrEditFn","codeBlockAttrEdit","CodeBlockFormatCommand","exitCode","ListNumberStyle","listAttrEdit","capabilities","list_commands_1","editListPropertiesCommandFn","task_lists","fancy_lists","startnum","tasks","checked","list_pandoc_1","readPandocList","number_delim","ListNumberDelim","DefaultDelim","order","number_style","typeToNumberStyle","numberDelim","fancy","DefaultStyle","Decimal","UpperAlpha","LowerRoman","UpperRoman","Example","OrderedList","writePandocOrderedList","nodeViews","ListCommand","BulletList","bulletListOmniInsert","orderedListOmniInsert","ListItemSink","sinkListItem","ListItemLift","liftListItem","ListItemSplit","splitListItem","list_checked_1","CheckedListItemCommand","CheckedListItemToggleCommand","basekeys_1","isNotInHeading","conditionalWrappingInputRule","tightFn","div_1","listItemType","autoJoin","toggleList","TightListCommand","editList","EditListPropertiesCommand","incrementalDiv","divAttrs","$endPos","wrapping","incremental","Ordered","liftTarget","nodeRange","targetLiftDepth","isFullDivSelection","pandocAttrHasClass","editDiv","createDiv","removeDiv","defining","data-div","divCommand","Div","canApplyDivInputRule","attribMatch","cmds","DivCommand","Common","div_dark","appendTransaction","_transactions","_oldState","createCalloutDiv","Content","generic","calloutType","calloutAppearance","calloutIcon","calloutCaption","resultAttr","_l","callout","pandocAttrSetKeyvalue","appearance","icon","caption","_h","Tabset","insertTabsetCommandFn","tabset_dark","tabset","CheckedListItemNodeView","getPos","editable","ev","contentDOM","checkedListItemCommandFn","itemNode","setItemChecked","checkedListItemToggleCommandFn","check","baseInputRule","fragmentWithCheck","raw_inline","mappedTokens","lastWasChecked","writeListItemInlines","example","readNumberStyle","childAttrs","childWithChecked","listNodeOptions","writePandocListItem","writePandocBulletList","imageAttributes","src","decodeURI","readPandocTitle","requireHTML","writeRawMarkdown","linkTo","writeFigure","writeLink","imageInlineHTMLReader","isImage","image_util_1","inlineHTMLIsImage","imageAttrsFromHTML","imageDOMOutputSpec","imageDOMAttributes","alt","parseFromString","imageCommand","editorUI","img","imgDimensions","pandocImageHandler","imagePandocOutputWriter","imageNodeAttrsSpec","imageAttr","imageAttrsFromDOM","Image","attr_edit","noDecorator","_schema","imageTextSelectionPlugin","imageEventsPlugin","imagePropsWithSizes","linkMark","Figure","kQuartoDocType","align","env","editImage","units","isNaturalHeight","newImage","imageProps","insertAndSelectNode","partitionedKeyvalue","sizeWithUnit","ensureContainerWidth","imagePos","findParentNodeClosestToPos","domAtPos","resizeContainer","elementInnerDimensions","resizeEl","definition_list","convertImagesToFigure","imagesToFiguresTransform","linkAttrs","getMarkAttrs","mappedImagePos","writerHasProhibitedFigureParent","contentElement","isParaWrappingFigure","html_1","isSingleLineHTML","isHTMLImageBlock","fixupContext","figureKeys","image_view_1","imageNodeViewPlugins","ImageNodeView","editorEvents","unregisterWatchImg","implicitFigures","implicit_figures","resizeUI","selectOnClick","imgBroken","onerror","onclick","ondblclick","image_dialog_1","imageDialog","imageDimensionsFromImg","updateImg","figcaption","noPropagateClick","manageFigcaption","ondragstart","initResizeContainer","updateImageSize","destroy","clearSizeOnVisibleTimer","detachResizeUI","selectNode","draggable","image_resize_1","isResizeUICompatible","detach","attachResizeUI","ignoreMutation","mapResourceToURL","updateImageViewSize","isFigure","sizeOnVisibleTimer","setInterval","clearInterval","imageContainerWidth","noImplicitFigures","emptyFigcaption","selectionInFigcaption","hide","display","minHeight","margin","widthWithUnit","heightWithUnit","setMarginsForAlignment","marginWidth","marginRight","marginLeft","overflow","incompatibleWidth","incompatibleHeight","imageNode","imgContainerWidth","updateImageNodeFromShelf","hasPercentWidth","updateImageNodeSize","shelf","onInit","onWidthChanged","onHeightChanged","onUnitsChanged","onEditImage","uiImages","widgets_1","createPopup","editorContainer","updatePosition","editorBox","getBoundingClientRect","imageBox","editingScrollContainerEl","editingRootScrollContainerElement","positionTimer","panel","createHorizontalPanel","addToPanel","widget","addHorizontalPanelCell","paddingSpan","createInputLabel","wLabel","createTextInput","inputClasses","hLabel","hInput","onchange","hAutoLabel","unitsSelect","checkboxWrapper","lockCheckbox","lockLabel","createImageButton","properties","onload","manageUnitsUI","percentSizing","isNaN","getDim","wInput","shelfSizeFromImage","setWidth","setHeight","lock","resizeShelf","sync","lockRatio","prevUnits","widthPixels","widthInUnits","handle","onSizing","onSizingComplete","onPointerDown","startWidth","pageX","pageY","movedX","startX","movedY","startHeight","onPointerUp","havePointerEvents","releasePointerCapture","pointerId","onPointerMove","setPointerCapture","resizeHandle","cssFloat","liftStyle","liftImgStyle","widthProp","heightProp","verticalAlign","onDestroyed","observer_1","subtree","button","imageEl","optionEl","widthChars","atEnd","selectFigureCaption","selectFigure","verticalArrowCanAdvanceWithinTextBlock","exitNode","isWithinEmptyCaption","parentIndex","previousNode","parentTextBlock","figureSelection","nodePos","arrowHandler","ArrowRight","clipboardEvent","clipboardData","types","clipboardUris","then","uris","handleImageUris","getData","dragEvent","dataTransfer","coordinates","posAtCoords","uriList","droppedUris","imageUris","uri","drop","imageDrop","handlePaste","imagePaste","horizontal_rule_dark","horizontal_rule","HorizontalRule","insertNode","hrOmniInsert","selectable","ModEnter","ShiftEnter","atom","Emph","_mark","writeMark","Em","em","Strong","strong","inline_code_attributes","codeAttrs","autolink_bare_uris","citations","linkAttr","data-heading","extraAttr","kLinkTargetUrl","kLinkTargetTitle","linkCommand","onEditLink","result_1","Heading","asyncEditLink","link_dark","remainStart","linkEnd","matchText","copy","fromArray","linkText_1","attrs_1","matchedHeading_1","headingLink","headingText","headingPos","linkPos","clipboard_1","tooltip_1","button_1","linkCmd","removeLinkCmd","kMaxLinkWidth","React","LinkPopup","maxLinkWidth","openURL","clipboard","linkText","isSupported","LinkButton","showCopyButton","ImageButton","on","grav","show","onKeyDown","forwardRef","tabIndex","specKey","dismissOnEdit","makeLinksAccessible","onCmdClick","kRestoreLocationTransaction","target_1","decorationPosition_1","decoration_1","textRangePopupDecorationPosition","editorView","ignoreSelection","stopEvent","textPopupDecorator","decorationEl","visibility","reactRenderForEditorView","links","getElementsByTagName","onkeydown","click","ReactDOM","element","editingBox","editingEl","editingBoxStyle","topPadding","popupStyle","rangeCoords","rightPos","prosemirror_history_1","history","SelectAll","selectAll","findBlockNodes","childBlocksSelection","gapArrowHandler","prosemirror_dropcursor_1","dropCursor","gapClickHandler","createGapCursor","$divPos","nodeBefore","mouseEvent","clickPos","inside","divNode","blockRequiresGap","$clickPos_1","nodeAfter","kFormattingMarks","markName","setStoredMarks","definition_list_term","definition_list_description","clearFormatting","enDash","ellipsis","emDash","fancyQuotesToSimple","hasAttrId","attrNode","mk","markRange_1","scannedRanges","extensionIfPandocAttrEnabled","fencedAttributes","langAttrib","codeBlockInputRuleEnter","canApplyCodeBlockInputRule","paragraphNode","paragraphRect","editorRect","bodyEl","bodyElement","insert_symbol_plugin_1","symbol_dark","symbol","filterPlaceholderHint","symbolGroups","symbols_1","insertSymbolTransaction","symbolCharacter","searchTerm","UnicodeSymbolDataProvider","symbolGroupNames","symbolGroup","flat","codepoint","groupName","symbols","unicode_1","parseCodepoint","filterText","filteredSymbols","fromCodePoint","Symbol","performInsertSymbol","symbolOmniInsert","InsertSymbolPlugin","isValidCodepoint","hexOnlyText","hexValue","Number","valueOf","showPopup","closePopup","focusChanged","panelPositionStylesForCurrentSelection","react_dom_1","insertSymbolPopup","maximumTopPosition","minimumTopPosition","popupTopPosition","maximumLeftPosition","minimumLeftPosition","searchImage","searchPlaceholder","dataProvider","insert_symbol_grid_preview_1","InsertSymbolPopup","popupHeight","popupWidth","useState","setFilterText","selectedSymbolGroup","setSelectedSymbolGroup","selectedSymbolIndex","setSelectedSymbolIndex","preferenceChanged","setPreferenceChanged","symbolDataProvider","getSymbols","useMemo","filterSymbols","useEffect","focusElement","textRef","handleSelectedSymbolCommitted","onInsertSymbol","preferencesProps","onPreferencesChanged","preferenceRef","lastElement","onClose","shiftKey","focus_1","isElementFocused","gridRef","altKey","newIndex","insert_symbol_grid_1","newIndexForKeyboardEvent","gridWidth","TextInput","iconAdornment","onChange","selectRef","selectedOptions","selectedGroupName","symbolIndex","activeElement","SelectInput","characterWidth","onKeyUp","onKeyPress","onFocus","onPaste","SymbolCharacterGrid","columnWidth","floor","numberOfColumns","characterCellData","onSelectionChanged","selectedItemClassName","scrollToItem","rowIndex","symbolCharacters","react_window_1","FixedSizeGrid","columnCount","rowCount","ceil","rowHeight","itemData","SymbolCharacterCell","numberOfCells","prevRow","currentIndex","nextRow","nextPage","prevPage","itemIndex","characterGridCellItemData","onSelectionCommitted","symbolPreviewStyle","fontSize","insert_symbol_emoji_skintone_1","SymbolEmojiPreferencesPanel","bestAlias","aliases","alias","emoji_2","nodeForEmoji","kCategoryAll","emoji_1","emojiCategories","EmojiSymbolDataProvider","skinTone","emojiSkinTone","symbolForEmoji","hasMarkdownRepresentation","Emoji","emojiOmniInsert","emojis_all_1","emojis","emojiWithSkinTone","supportsSkinTone","emojiRaw","category","characterForSkinTone","SkinTone","Default","None","hasSkinTone","kEmojiAttr","kEmojiContent","catgegory","categories","emojiString","emojiWithSkinTonePreference","emojiFromChar","emojiAlias","kEmojis_1","emojiForAllSkinTones","Light","MediumLight","Medium","MediumDark","Dark","hint","prompt","emojiMark","emojiChar","emojiFromAlias","emojiName","emojiCompletionHandler","emojiSkintonePreferenceCompletionHandler","charLoc","skinToneEmoji","Save","markTr","markFrom","EmojiView","kEmojiCompletionRegEx","prefix_1","completions_1","setEmojiSkinTone","EmojiSkintonePreferenceHeaderView","kHeaderHeight","pref","kCellWidth","emojiText","selectedSkinTone","setSelectedSkinTone","previewEmoji","setSelectSkinTone","getCurrentSkinToneIndex","previewEmojiWithSkinTones","findIndex","nextSkinTone","selectSkinTone","commitSkinTonePreference","skinToneSelectedClass","handleButtonClick","EmDash","pastePluginKey","transformPastedHTML","highlightNode","forChangedNodes","highlightPluginKey","ReplaceStep","isRemoval","isSectionRemoval","fullySelectedDiv","divSelFrom","divSelTo","fullySelectedDivSection","insertSlideColumns","columnsContent","columnAttrs","insertSlidePause","InsertSlidePause","slide_pause_dark","slide_pause","InsertSlideNotes","insertSlideNotes","slide_notes_dark","slide_notes","InsertSlideColumns","slide_columns_dark","slide_columns","Strikeout","strikeout","Superscript","superscript","Subscript","subscript","SmallCaps","Smallcaps","smallcaps","RawInlineInsertCommand","defaultFormat","outputFormats","editRawInline","raw_inline_dark","RawInlineCommand","kRawInlineFormat","kRawInlineContent","raw_attribute","rawTexMark","raw_tex","texText","texMatchLength","tex_1","texLength","addStoredMark","setTexSelectionAfterInsert","InsertInlineLatexCommand","TexInline","latexHighlightingPlugin","mark_highlight_1","markHighlightPlugin","_attrs","markHighlightDecorations","noInputRules","splitInvalidatedMarks","texInputRule","braces","highlighter","decorationsForDoc","removeDecorations","addDecorations","markDecorations","rehighlightParent_1","isLetter","inBraces","braceLevel","inBrackets","bracketLevel","rawhtmlMark","endLoc","startLoc","isHTMLTag","close","void","isVoidTag","endTag","tagStartLoc","inSingleQuote","inDoubleQuote","rawHtmlInputRule","raw_inline_1","isRawHTMLFormat","writeInlneHTML","isSingleTag","data-type","spellcheck","kInlineMathRegex","mathText","Display","beginMatch","endMatch","splice","pendingTokens","filteredTokens","tokens_1","mathToken","flushPendingTokens","inlineMathNav","math_keys_1","displayMathNewline","mathLength","startMath","math_commands_1","InsertInlineMathCommand","InsertDisplayMathCommand","singleLineDisplayMath","math_transaction_1","mathAppendMarkTransaction","math_inline_dark","math_inline","allowNewline","DisplayMath","insertMathCommand","math_display_dark","math_display","displayMathOmniInsert","insertMath","mathMark","mathRange","mathAttrs","editMath","maths_1","mathAttr","MathPopupPlugin","lodash_debounce_1","updatePopup","updatePopupTimer","resizeUnsubscribe","mousemove","lastRenderedMath","$mousePos","equationPreview","rangeStartCoords","rangeEndCoords","editingRootNodeClosestToPos","editingElStyle","styles","inlineMath","typeset","error","autoscollPopup","popupBox","mathBottom","editorEl","toY","mathText_1","mathjaxDiv","isActiveTab","editMathAttributesEnabled","attr_edit_decoration_1","attrEditDecorationWidget","editMathAttributes","prevMathRange","delta","verticalArrowHandler","mathPos","kEditAttrShortcut","rightPaddingOffset","attrsNode","attrsEl","offsetParentStyle","AttrEditDecoration","cssProps","noSelectOnClick","attrEdit","buttonTitle","lodash_uniqby_1","kCiteIdBasePattern","bibManager","_event","cite_id","parsedDOI","cite_doi_1","doiFromSlice","doiText","findDoiInLocalBibliography","allowsWrites","citeIdInputRule","citeIdLen","citeIdLength","citeStart","citeEnd","readPandocCite","citeMark","cite","writeCitation","citationPrefix","suppress","citationMode","CitationMode","SuppressAuthor","citeIdMark","citationId","inTextSuffix","AuthorInText","citationSuffix","kNoteCiteRegex","kInTextCiteRegex","kInTextCiteWithSuffixRegEx","kCiteId","kFindInTextCiteWithSuffixRegex","applyCiteMarks","provider","performCiteCompletionReplacement","existingEntry","bibliographyFiles","writableBibliographyFiles","writableFile","insertCite","writableBiblios","thisWritableBiblio","writable","displayPath","bibliographyFile","fullPath","writableBiblioPath","isProject","project","providerKey","ensureSourcesInBibliography","idText","sources","providersWithWarnings","zoteroUseBetterBibtex","isBibTexBibliography","all","withWarning","warning","warningForProvider","yesNoMessage","every","idMark","kCitationIdRegex","citeText","bibliography_1","BibliographyManager","zotero","Cite","closeCite","openCite","cite_2","parentText","beginBracketPos","prefixMatch","cite_commands_1","InsertCitationCommand","bibliographyManager","trans","citeLength","cite_completion_doi_1","citationDoiCompletionHandler","citationCompletionHandler","cite_popup_xref_1","citeXrefPopupPlugin","cite_popup_1","citePopupPlugin","bibliography_provider_local_1","bibliographyFileForPath","path","bibliographyTypes","defaultBiblioType","bibliographyDefaultType","displayName","kFields","weight","zoteroServer","BibliographyDataProviderZotero","refreshCollectionData","parsedYamlNodes","docPath","providersNeedUpdate","providersEntries","idSort","parseYamlNodes","providers","getDefaultResourceDir","prev","curr","isWritable","hasSources","allSources","kLocalBibliographyProviderKey","sourcesForProvider","sourcesForProviderCollection","collectionKey","localSources","bibFile","localProviders","providerName","prov","dataProviderBibTeX","generateBibTeX","bibDB_1","toBibTeX","warningMessage","warningProvider","findIdInLocalBibliography","searchProviderCollection","searchProvider","searchSources","limit","searchIndex","kSearchOptions","$and","q","prime","resourcePath","yamlBlocks","parsedYamls","refBlockParsedYamls","parsedYaml","lastReferenceParsedYaml","referenceBlockFromYaml","getBibliography","bibliographiesAbsolute","refBlock","etag","bibliography","updateIndex","collections","collectionKeys","itemsForCollection","project_biblios","kPermissableFileExtensions","projectBiblio","path_1","getExtension","bibliographyFilesFromDocument","BibliographyDataProviderLocal","bibliographyFilesFromDoc","bibliographyValues","valueFromYamlText","bibliographiesRelative","biblioNode","createBiblographyYamlNode","yamlWithBib","addBibliographyToYamlNode","firstBlock","joinPaths","root","expandPaths","rootPath","isAbsolute","isWindows","isWinPathSeparator","CHAR_COLON","CHAR_FORWARD_SLASH","fileName","lastDot","biblatex_csl_converter_1","BibTypes","bibTypeKey","cslType","bibType","misc","keySortOrder","publisher","enumerableCSL","aOrder","bOrder","cslKey","biblatex","BibFieldTypes","bibFieldKey","bibField","cslFieldName","bibFieldDatas","bibFieldData","nodeValue_1","cslDate","edtfDate","csl_1","cslDateToEDTFDate","options_1","optionKey","options_2","rangeArray","bibDBFieldName","required","optional","eitheror","shouldIncludeField","bibObject","pmNode","csl_text_1","cslTextToProsemirrorNode","nodes_1","BibLatexExporter","bibDB","traditionalNames","cslToBibDB","bibtex_1","bibDbToBibTeX","ensureValidCSLType","cslTypes","crossref_1","crossRefTypeToCSLType","sanitizeForCiteproc","sanitizeProperties","property","license","contributor","abstract","cslFromDoc","cslParsedYamls","part","partStr","_f","_g","_j","_k","_m","_o","_p","_q","_r","_s","_t","_u","_v","_w","_x","_y","_z","article","articleJournal","articleMagazine","articleNewspaper","review","reviewBook","article_dark","bill","legislation","legalCase","treaty","legal","legal_dark","book","manuscript","thesis","book_dark","broadcast","broadcast_dark","dataset","data","data_dark","entryDictionary","entryEncylopedia","entry_dark","image_dark","map_dark","motionPicture","movie","movie_dark","musicalScore","song","song_dark","post","postWeblog","webpage","web","web_dark","paperConference","interview","pamphlet","personalCommunication","report","speech","other","other_dark","chapter","graphic","patent","kCrossrefItemsPerPage","imageForCrossrefType","crossRefTypes","monograph","journalArticle","journalVolume","journal","journalIssue","proceedingsArticle","dissertation","reportSeries","editedBook","bookChapter","bookSet","bookTrack","referenceBook","referenceEntry","postedContent","standard","standardSeries","peerReview","proceedingsSeries","proceedings","prettyType","bookSection","bookPart","bookSeries","kCslDOMParser","cslDOMParser","tagSpec","sup","sub","spanSpec","nocase","keysToExport","entryObject","csl_type","types_1","typeMapping","bibtex","bib_type","bibTexType","entry_key","fieldsForExport","fieldKey","fields_1","FieldMap","fieldType","typeReader","bibtexKey_1","outputFields","bibtexValue","year","month","formatText","formatRange","formatKey","escapeNonAscii","bibtexEntry","bibtexEntries","toBibtex","entries","bibTexStr","sortedKeys","rawValue","booktitle","howpublished","pages","edition","issue","url","codePointAt","characters_1","thisNodeMarks","closing","closeTags","lastNodeMarks","closeTag","formatting_1","FormattingTags","open","opening","formattedText","verbatim","doNotEscape","formatNames","names","formattedNames","given","protect","bookauthor","language_1","lanagugeMappings","series","swedish","thai","BibTextTypes","inbook","phdthesis","unpublished","inproceedings","bibtexType","manual","incollection","conference","mastersthesis","techreport","fieldsRequired","fieldsOptional","booklet","fieldsEitherOr","character","latex","decimal","731","ungrouped","780","__rest","kZoteroProviderKey","_ui","_resourcePath","useCache_1","newCollections","specResult","zoteroConfig","getCollections","collectionSpecs","status","collection","existingCollection","allCollections","col","allCollectionSpecs","toBibliographyCollection","hasUpdates","zoteroSpec","parentKey","bibliographyPaths","bibTeX","betterBibtexExport","zotero_1","kZoteroBibTeXTranslator","libraryID","orderedByType","completionProviders","citeSearch","_state","currentEntries_1","loadedEntries_1","providerCount_1","promises","currentEntries","streamEntries","sortEntries","updatedEntries","_events","cite_completion_bibliography_1","bibliographyCiteCompletionProvider","cite_completion_search_1","completionIndex","completionId","filterCitations","CiteCompletionItemView","CompletionItemView","kCiteCompletionWidth","imageAdornment","primaryText","secondaryText","detailText","htmlTitle","imageForType","forceLightMode","bibliography_provider_zotero_1","zoteroOverlay","cslName","referenceEntryForSource","kQuartoXRefTypes","kCiteCompletionTypeXref","getDocumentPath","referenceEntryForXref","loadedEntries","FuseIndex","xrefCompletions","xrefKey","xrefView","xrefs","fuse","createIndex","typeQuery","colonLoc","isCaseSensitive","shouldSort","withSavedDocument","refs","kXRefTypes","subTitle","kTableType","table_dark","h1","kEqType","exr","kGenericType","kTheoremType","theorem_dark","theorem","equation_dark","equation","defaultEntries","includeMatches","threshold","completion_detailed_1","cslEntry","CompletionItemDetailedView","kCompletionWidth","bibMgr","isXRef","source_1","previewHtml","finalHtml","citationHTML","JSON","stringify","rootDiv","classNames","ensureSafeLinkIsPresent","urlForCitation","CitePopup","Citation","alreadyInCite","includeWrapper","wrapperText","preCiteIdRange","endOfWrapper","initialSelectionKey","selectionKey","setCitationDefaultInText","intextCitationStyle","bibliographySources","bibliographySources_1","citeIdText","performInsertCitations","initiallySelectedNodeKey","containerHeight","confirm","cancel","showProgress","hideProgress","windowHeight","crossrefSourcePanel","crossref","dataciteSourcePanel","datacite","packageSourcePanel","environment","bibliographySourcePanel","InsertCitationPanel","onOk","requiresProgress","bibliographySourceProviders","sourceProvider","isSlowGeneratingBibliographySource","toBibliographySource","onCancel","configuration","insertCitationConfiguration","setInsertCitationConfiguration","treeSourceData","statusMessage","selectedPanelProvider","placeHolderMessage","existingBibliographyFile","createBibliographyFile","changeExtension","citationDefaultInText","setInsertCitationPanelState","insertCitationPanelState","updatedState","citationsToAdd","displayedCitations","mergeCitations","selectedCitation","mergedCitationsToAdd","typeAheadSearch","selectedNode","panelRef","streamTimerId","panelProvider","panelForNode","setSelectedPanelProvider","refreshSearchCallback","insert_citation_source_panel_1","CitationSourceListStatus","useCallback","existingState","panelHeight","memoizedTypeaheadSearch","onExecuteSearch","searchCanceled","inProgress","progressMessage","existingCitationIds","searchResult","onConfirm","deleteCitation","selCite","filteredCitations","totalCitationCount","panelToDisplay","citationProps","navigation_tree_1","NavigationTree","suggestedPanel","tag_input_1","TagInput","displayText","isEditable","isIdEditable","targetSource","currentlySelectedCitation","onTagValidate","insert_citation_bibliography_picker_1","CitationBibliographyPicker","onCreateBibliographyFileNameChanged","biblographyFile","dialog_buttons_1","DialogButtons","nodeForKey","selected","toAdd","Tag","onTagDeleted","onTagChanged","editing","setEditing","editingText","setEditingText","setDisplayText","restoreFocusAfterCancel","useLayoutEffect","editTextInput","onEditClick","validationMessage","alert","kAlertTypeError","showingValidationError","commitTagEdit","pathToNode","expanded","visibleNodes","vizNodes","fixedList","stepNode","onSelectedNodeChanged","FixedSizeList","itemSize","showSelection","preventFocus","NavigationTreeItem","indentLevel","selectedClassName","nodeList","allNodes","increment","containsChild","existingSource","finalId","rootImageForProvider","zotero_root","bibligraphy","toTree","containers","folderImage","treeMap","currentNode","hasParent","rootNodes","zotero_collection","bibligraphy_folder","folderImageForProvider","BibligraphySourcePanel","treeNode","local_sources","providerNodes","onResults","useBetterBibTex","toCitationListEntries","insert_citation_source_panel_typeahead_search_1","CitationSourceTypeheadSearchPanel","onSearchTermChanged","onSelectedIndexChanged","onAddCitation","listContainer","searchBoxRef","focusSearch","insert_citation_source_panel_list_1","CitationSourceList","focusPrevious","insert_citation_source_panel_list_item_1","CitationSourcePanelListItem","currentCitation","handleListKeyDown","handleIncrementIndex","itemsPerPage","onBlur","itemCount","onRemoveCitation","showSeparator","itemProvider","search_progress","citationListData","citationEntry","maxIdLength","alreadyAdded","_selectedNode","e_1","matchExistingSourceCitationListEntry","toCitationListEntry","errorForStatus","insert_citation_source_panel_list_item_detailed_1","pasted","performSearch","lastSearch","initialFocusSet","CitationSourcePanelListItemDetailed","doiServer","dedupeCitationIds_1","citationEntries","works","work","coercedCSL","crossrefWork","crossrefWorkTitle","pubmed","pubMedResult","docs","pubmed_1","pubTypes","doiResult","sanitizedCSL","noResultsMessage","sortFirstAuthor","pubDate","creators","creator","fetchCSL","dataciteResult","familyName","publicationYear","packageInfo","citeInfos","packageCitationToCSL","citeInfo","people","bibtextTypeToCSLType","person","date-parts","suggestPackageCiteId","incrementName","retryCount","pkgIndex","getRPackageState","pkg","pkgInfos","sorted","fuse_js_1","searchFields","searchField","PackageSourcePanel","packages","getPackageIndex","packageInfos","parsed","quartoXrefForId","xrefs_1","span","getSelectionMarkRange","asyncEditSpan","native_spans","data-span","all_symbols_escapable","stripRefBackslashTransform","potentialXRef","bookdownXRefUI","CrossReference","References","cross_reference_dark","cross_reference","insert_xref_1","insertXref","xref_2","xrefForId","select_1","xref_completion_1","insert_xref_index_1","lastSelectedStyleIndex","kXRefStyles","fn","xRefTypes","kTheoremTypes","type_table","type_equation","type_listing","htmlDialog","_showProgress","_hideProgress","windowWidth","InsertXrefPanel","styleIndex","onInsertXref","loadXRefs","quartoIndexForFile","setXrefs","selectedXRefIndex","setSelectedXRefIndex","selectedTypeIndex","setSelectedTypeIndex","selectedStyleIndex","setSelectedStyleIndex","styleSelectRef","prefixRef","typeOrder","unique","filteredXrefs","filtered","xrefIndex","filterXrefs","typeNodes","insertItem","currentStyle","currentPrefix","memoizedTextFilter","txt","handleKeyboardEvent","incrementIndex","acceptSelected","ondoubleclick","thisXref","onDoubleClick","InsertHTMLCommentCommand","HTMLComment","raw_html_comment","comment_dark","comment","data-format","isComment","kHTMLCommentMarkRegEx","detectAndApplyMarks","commentMarkAttribs","detectAndCreateShortcodes","shortcode_1","kShortcodeRegEx","shortcode","noSpelling","excludes","markTr_1","kShortcodePattern","writePandocNote","noteNode","footnote","number","footnoteOmniInsert","footnote_dark","selectedFootnote","findNoteNode","data-ref","data-content","footnote_editor_1","footnoteEditorActivationPlugin","footnoteEditorNodeViews","filterTransaction","footnote_transaction_1","footnoteFilterTransaction","footnoteSelectNoteAppendTransaction","Footnote","canInsertFootnote","edit","selectedNote","footnoteNode","ref_1","matching","ref_2","nodeDecoration","findFootnoteNode","NoteEditorView","footnoteEditorKeyDownHandler","firstNode","lastTextBlock","selectFootnote","findNotesContainer","noteWithPos","footnotes","findAllFootnotes","notesContainer","findAllNotes","toJSON","newNote","fromJSON","allNotes","footnoteFixupTransform","activeNote","tex","isLatexBeginOrEnd","RawBlockCommand","rawAttribute","textTrimmed","isSingleChildParagraph","isParagraphWrappingLatexBeginOrEnd","isParagraphWrappingRawLatexBeginOrEnd","matches","embeddedTickRegEx","matchRev","FormatRawBlockCommand","HTMLBlock","kHTMLFormat","Blocks","html_block_dark","html_block","TexBlock","YamlMetadata","yaml_block_dark","yaml_block","yaml_metadata_capsule_1","yamlMetadataBlockCapsuleFilter","YamlMetadataCommand","yaml_metadata_title_1","yamlMetadataTitlePlugin","RmdChunkCommand","Chunks","RChunkCommand","r_chunk_dark","r_chunk","PythonChunkCommand","python_chunk","BashChunkCommand","bash_chunk_dark","bash_chunk","rcpp_chunk_dark","rcpp_chunk","RcppChunkCommand","SQLChunkCommand","SQLCodeChunk","D3ChunkCommand","D3CodeChunk","d3_chunk","ExpandAllChunksCommand","ExpandAllChunks","ChunkExpansionCommand","CollapseAllChunksCommand","CollapseAllChunks","md_index","firstLineMeta","lineNumbers","lineNumberFormatter","lineNumber","lineCount","bookdownTheorems","StanChunkCommand","rmd_chunk_image_1","RmdChunkImagePreviewPlugin","uiContext","imagePreviewDecorations","isRmdChunkNode","widthMatch","firstLine","width_1","stripQuotes","imagePath_1","unsubscribe","watchResource","alignCenter_1","kBlockCapsuleType","capsuleText","LineBlock","line_block","tableTabKey","grid_tables","pipe_tables","simple_tables","multiline_tables","table_captions","table_nodes_1","tableCaptionNode","tableCellNode","tableHeaderNode","tableRowNode","Table","table_commands_1","insertTable","insertTableOmniInsert","TableInsertTable","TablePreviousCell","prosemirror_tables_1","goToNextCell","TableColumnCommand","TableAddColumnAfter","addColumns","TableAddColumnBefore","TableRowCommand","TableAddRowAfter","addRows","TableAddRowBefore","TableDeleteRow","deleteRow","TableColumnAlignmentCommand","TableAlignColumnRight","CssAlignment","Right","TableAlignColumnCenter","Center","TableAlignColumnDefault","TableToggleCaptionCommand","headerOptional","columnResizing","handleWidth","table_paste_1","tablePaste","table_contextmenu_1","TableContextMenuPlugin","tableShiftTabKey","multiline","table_columns_1","fixupTableWidths","tableRepairTransform","table_container","numRows","rows","cells","cellType","tableCaption","tableContainer","selectionPos","cols","inactive","Lists","deleteTable","columns","rect","selectedRect","addRow","alignments_1","rowNode","rowOffset","cellPos","cellOffset","cellNode","colIndex","TableToggleHeaderCommand","TableToggleHeader","toggleHeader","isInTable","TableToggleCaption","tr_2","left_1","right_1","selectionCell","tableStart","TableMap","CellSelection","rectBetween","$anchorCell","$headCell","tableGroup","getFromDOM","textAlign","kDefaultCellClasses","table_pandoc_1","readPandocTable","writePandocTableContainer","table_capsule_1","tableBlockCapsuleFilter","colgroup","childElementCount","colpercents","firstRow","colWidth","colWidths","tableColumnWidths","writePandocTable","writePandocTableCaption","table_row","writePandocTableNodes","writePandocTableHeaderNodes","alignments","AlignLeft","Left","AlignRight","AlignCenter","AlignDefault","tableToken","ColWidth","columnPercents","parseRow","row","captionBlock","widths","ColWidthDefault","headerCut","tableColumnAlignments","colwidth","availableWidth","colsWithWidth","totalWidth","pct","extraPercent_1","totalPercent","colWidths_1","tables_1","kTableBlockCapsuleType","DefinitionList","definition","unparsedTable_1","TableDeleteColumn","subMenu","TableAlignColumnLeft","menuVisible","sliceHasNode","currentColumn","columnAlignments","headerPos","childPos","definition_lists","definition_list_pandoc_1","writePandocDefinitionListDescription","readPandocDefinitionList","writePandocDefinitionList","definition_list_inputrule_1","definitionInputRule","definition_list_insert_1","insertDefinitionListAppendTransaction","emptyNodePlaceholderPlugin","termText","insertTermText","insertDefinitionList","createDefinitionDescription","definition_list_dark","InsertDefinitionList","InsertDefinitionListItemCommand","createFn","dlTypes","insertPos","InsertDefinitionTerm","InsertDefinitionDescription","lists_1","listPos","list","listParent","listIndex","definitionList","prevCursor","definitionListEnter","parentTerm","selectionNode","isParagraph","isEmpty","position_1","isLastChild","descriptionNode","endOfDescriptionEnter","isOnlyChild","emptyTermBackspace","emptyDescriptionBackspace","advancePos","definitionListShiftTab","backwardPos","prevNode","listNode","depthOffset","isParagraphAfterParagraph","prevPara","writeCurrent","writePandocDefinitionListTerm","kShortcodeBlockCapsuleType","_p3","shortcode_block","borderColorClass","isParaWrappingShortcode","Shortcode","shortcodeNode","htmlPreserveBlockCapsuleFilter","kHtmlPreserveBlockCapsuleType","handleToken","html_preserve","aceExtension","aceRenderQueue","ace_render_queue_1","AceRenderQueue","ace_node_views_1","AceNodeViews","AceNodeView","aceNodeViews","activeView","handleClick","ExpandChunk","activeAceNodeViewCommand","nodeView","setExpanded","CollapseChunk","editorOptions","gapCursorPending","selectionMarker","queuedSelection","subscriptions","renderedWidth","scrollRow","mouseDown","preview","ace_placeholder_1","AcePlaceholder","getElement","updateMode","onEditorDispatch","initEditor","renderQueue","unsub","_decos","editSession","AceRange","require","Range","getDocument","computeChange","fromPoints","indexToPosition","findMarkers","removeMarker","findPluginState","markerTo","markerFrom","markerId","addMarker","escaping","aceEditor","setSelectionRange","QueuedSelection","setGapCursorPending","pending","getExpanded","_mutation","forwardSelection","asProseMirrorSelection","session","getRange","positionToIndex","highlightSelectionAcross","valueChanged","getContents","replaceWith","scrollParent","offsetTop","viewTop","viewBottom","createChunkEditor","scrollCursorIntoView","getSession","cursorDirty","addCommand","arrowMaybeEscape","readOnly","bindKey","backspaceMaybeDeleteNode","undo","redo","win","insertParagraph","mac","getCursorPosition","executeSelection","renderer","metrics","$fontMetrics","$observer","setContainer","debounceResize","evt","resizeTimer","setMode","execCommand","getLength","innerText","getCursor","containerRect","cursorRect","down","up","oldEnd","oldVal","newEnd","newVal","cursorPos","prevNodePos","nextNodePos","nextNodeTextBlock","nextNodeCode","targetPos","renderCompleted","updateTimer","needsSort","bypass","visible","onUpdate","IntersectionObserver","entries_1","processRenderQueue","isIntersecting","cancelTimer","onScroll","scheduleRender","isRenderCompleted","renderTimer","delayMs","activeNodeView","prevNodePos_1","nv","state_1","editors","pandocAttrEnabled","attr_edit_command_1","AttrEditCommand","AttrEditDecorationPlugin","noKeyvalueTags","editorNode","attrTags","attrEditNodeCommandFn","ed","decoratorsForDoc","preferHiddenDecorators_1","dec","parentWithAttrs","decorator","editMarkAttrs","editAttr","idHint","gutterBackgroundColor","gutterTextColor","textColor","surfaceWidgetTextColor","lightTextColor","linkTextColor","invisibleTextColor","markupTextColor","findTextBackgroundColor","findTextBorderColor","blockBorderColor","focusOutlineColor","paneBorderColor","fixedWidthFont","fixedWidthFontSizePt","proportionalFont","proportionalFontSizePt","atomColor","tagColor","attributeColor","hrColor","linkColor","errorColor","setStyleElement","css","styleEl","getElementById","defaults","backgroundColor","borderBackgroundColor","placeholderTextColor","selectionColor","cursorColor","metadataBackgroundColor","chunkBackgroundColor","spanBackgroundColor","divBackgroundColor","commentColor","commentBackgroundColor","nodeSelectionColor","padding","copy_png_1","properties_png_1","properties_deco_png_1","properties_deco_dark_png_1","removelink_png_1","runchunk_png_1","runprevchunks_png_1","search_png_1","search_progress_gif_1","generic_png_1","heading1_png_1","heading1_dark_png_1","heading2_png_1","heading2_dark_png_1","heading3_png_1","heading3_dark_png_1","heading4_png_1","heading4_dark_png_1","bullet_list_png_1","bullet_list_dark_png_1","ordered_list_png_1","ordered_list_dark_png_1","blockquote_png_1","blockquote_dark_png_1","math_inline_png_1","math_inline_dark_png_1","math_display_png_1","math_display_dark_png_1","html_block_png_1","html_block_dark_png_1","line_block_png_1","line_block_dark_png_1","emoji_png_1","emoji_dark_png_1","comment_png_1","comment_dark_png_1","div_png_1","div_dark_png_1","code_block_png_1","code_block_dark_png_1","footnote_png_1","footnote_dark_png_1","citation_png_1","citation_dark_png_1","cross_reference_png_1","cross_reference_dark_png_1","symbol_png_1","symbol_dark_png_1","table_png_1","table_dark_png_1","definition_list_png_1","definition_list_dark_png_1","horizontal_rule_png_1","horizontal_rule_dark_png_1","image_png_1","image_dark_png_1","link_png_1","link_dark_png_1","paragraph_png_1","paragraph_dark_png_1","raw_block_png_1","raw_block_dark_png_1","raw_inline_png_1","raw_inline_dark_png_1","tex_block_png_1","tex_block_dark_png_1","yaml_block_png_1","yaml_block_dark_png_1","python_chunk_png_1","sql_chunk_png_1","d3_chunk_png_1","stan_chunk_png_1","bash_chunk_png_1","bash_chunk_dark_png_1","r_chunk_png_1","r_chunk_dark_png_1","rcpp_chunk_png_1","rcpp_chunk_dark_png_1","tabset_png_1","tabset_dark_png_1","slide_columns_png_1","slide_columns_dark_png_1","slide_pause_png_1","slide_pause_dark_png_1","slide_notes_png_1","slide_notes_dark_png_1","article_png_1","article_dark_png_1","book_png_1","book_dark_png_1","broadcast_png_1","broadcast_dark_png_1","data_png_1","data_dark_png_1","entry_png_1","entry_dark_png_1","image_png_2","image_dark_png_2","legal_png_1","legal_dark_png_1","map_png_1","map_dark_png_1","movie_png_1","movie_dark_png_1","other_png_1","other_dark_png_1","heading3","heading3_dark","bullet_list_dark","ordered_list_dark","blockquote_dark","line_block_dark","emoji_dark","citation_dark","paragraph_dark","raw_block_dark","tex_block","tex_block_dark","sql_chunk","stan_chunk","song_png_1","song_dark_png_1","local_sources_png_1","formatMenu","Underline","ListItemCheck","ListItemCheckToggle","EditListProperties","Blockquote","haveAnyOf","HTMLInline","ClearFormatting","AttrEdit","RCodeChunk","PythonCodeChunk","BashCodeChunk","StanCodeChunk","InlineMath","DefinitionDescription","EnDash","NonBreakingSpace","commands_1","editorMenus","TableDeleteTable","excludeInCode","kPresentationEditorLocationTitle","foundCursor","bodyNodes_1","bodyNodes","autoSlideLevel","kPresentationEditorLocationHeading"],"mappings":"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WAAAnV,GAEF,OAAK4a,GACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,UACH,KACAspB,EAAA,IAEF,WACE,UACA,KAEF,KAAK,KACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,SACH,IACAA,EAAA,IAEF,MACA,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACHA,EAAQ,IACR,MAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,UACH,KACAA,EAAA,IAEF,WACE,KACAA,EAAA,IAEF,MACA,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,SACH,SACA,KAEFA,EAAK,IACL,MACA,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,UACH,UACA,KAEF,KAAK,KACLA,EAAK,IACL,WACE,SACA,IAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,SACH,SACA,KAEF,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,IACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,SACH,SACA,IAEF,KAAK,KACL,KAAK,UACH,KACAA,EAAA,IAEF,MACA,KAAK,KACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,SACH,SACA,IAEF,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,WACE,SACA,IAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,SACH,SACA,IAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACHA,EAAQ,IACR,MAEF,KAAK,IACL,KAAK,SACH,SACA,IAEF,KAAK,IACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,SACH,SACA,IAEF,KAAK,KACL,KAAK,UACH,UACA,KAEFA,EAAK,IACL,MACA,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,SACH,SACA,IAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,UACH,UACA,KAEF,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,UACH,KACAA,EAAA,IAEF,MACA,KAAK,IACL,KAAK,SACH,SACA,IAEF,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACHA,EAAQ,IACR,MAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACHA,EAAQ,IACR,MAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,UACH,KACAA,EAAA,IAEF,WACE,UACA,KAEF,KAAK,KACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,SACH,IACAA,EAAA,IAEF,MACA,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACLA,EAAK,IACH,WACA,IAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACHA,EAAQ,IACR,MAEF,KAAK,KACLA,EAAK,IACH,WACA,IAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,SACH,KACAA,EAAA,IAEF,MACA,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,UACH,UACA,KAEF,KAAK,KACLA,EAAK,IACL,WACE,SACA,IAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,SACH,SACA,KAEF,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,IACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,SACH,SACA,KAEF,KAAK,KACL,KAAK,KACHA,EAAQ,IACR,MAEF,KAAK,KACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,IACL,KAAK,SACH,SACA,IAEF,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,SACH,SACA,IAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,SACH,SACA,IAEF,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACHA,EAAQ,IACR,MAEF,KAAK,IACL,KAAK,SACH,SACA,IAEF,KAAK,IA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E/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,qBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,mCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,mCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,kCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,kCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,oCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,mCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,mCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,2BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,2BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,6BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,4BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,4BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,2BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,6BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,6BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,4BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,4BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,8BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,aACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,aACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,YACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,eACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,MACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,kBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,cACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,aACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,kBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,aACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,oBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,UACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,oBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,oBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,uCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,4BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,6BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,4BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,6BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,4BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,eACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,WACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,OACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,UACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,oBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,qBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,eACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,aACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,oBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,qBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,mBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,mBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,sBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,mBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,oBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,uBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,oBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,qBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,sBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,qBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,oBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,UACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,QACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,UACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,SACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,SACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,UACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,QACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,mBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,oBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,mBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,qBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,qBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,mBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,mBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,oBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,mBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,qBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,qBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,mBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,qBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,mBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,kBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,eACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,cACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,sBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,yBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,kBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,qBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,mBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,oBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,oBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,6BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,uCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,uCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,uCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,uCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,uCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,uCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,uCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,yCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,wBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,kCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,aACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,aACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,aACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,aACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,aACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,aACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,8BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,6BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,oCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,mCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,oBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,mBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,0BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,wBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,yBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,yBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,aACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,aACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,SACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,kBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,sBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,oBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,mCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,uBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,wBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,mCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,4BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,kBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,SACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,0BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,uBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,uBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,0BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,aACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,qBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,qBACE/X,MAAM,IACNyzE,UAAO,MAGT17D,KAAA,YACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,aACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,mBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,WACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,iBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,uBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,oBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,oBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,0BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,6BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,uBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,4BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,0BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,0BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,6BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,yBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,0BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,sBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,4BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,sBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,iBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,uBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,8BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,yBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,uCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,6CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,4BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,2BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,2BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,uCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,wCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,iBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,iBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,yCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,yCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,0CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,6BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,0BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,0BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,2CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,iDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,wBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,yCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,yCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,oCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,oCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,8BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,sBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,oDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,6CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,oDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,6CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,sCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,mCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,eACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,8BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,mCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,oCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,6CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,8CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,8CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,+CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,oDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,6CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,8CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,6CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,8CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,sCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,uCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,sCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,sCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,uCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,uCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,sCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,sCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,uCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,uCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,yCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,wCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,wCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,uCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,yCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,yCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,wCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,wCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,iDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,iDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,iDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,iDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,yBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,yBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,yBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,sCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,mCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,yCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,0CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,2CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,8CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,6BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,oDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,+CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,sCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,8CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,+CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,oDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,oDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,sDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,sDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,uCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,mCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,mCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,mCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,mCACE/X,MAAM,IACNyzE,UAAO,gEAKbA,UAAA,OAEE,CACE17D,KAAA,yCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,yCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,mCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,0CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,sCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,sCAMP,EAEF17D,KAAA,UACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,aACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,uBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,eACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,uBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,YACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,YACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,QACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,aACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,oBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,mBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,qBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,6BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,2BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,eACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,gBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,kBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,kBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,aACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,qBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,WACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,YACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,oBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,gBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,kBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,cACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,YACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,cACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,kBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,WACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,cACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,QACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,kBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,UACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,kBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,cACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,kBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,cACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,aACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,eACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,QACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,WACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,kBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,kBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,mBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,mBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,kBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,qBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,6BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,YACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,UACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,QACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,aACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,YACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,SACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,uBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,aACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,kBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,YACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,YACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,cACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,0BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,8BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,yBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,0CACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,8CACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,kBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,sBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,2BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,eACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,eACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,gBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,8BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,qBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,uBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,yBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,yCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,qCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,eACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,eACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,mBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,gBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,YACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,cACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,yBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,cACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,sBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,eACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,eACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,mBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,yBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,wBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,2BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,0BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,6BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,6BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,gCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,oBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,UACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,oBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,gBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,mBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,oCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,6BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,gCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,sCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,yCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,4BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,4BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,qCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,qCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,WACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,WACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,uBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,uBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,4BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,4BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,mBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,mBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,YACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,cACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,kBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,oBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,wBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,0BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,mCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,qCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,8BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,gCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,WACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,0BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,kBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,qBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,8BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,aACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,aACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,eACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,gBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,gBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,yBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,uBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,wBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,4BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,eACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,eACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,gBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,gBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,uBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,aACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,YACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,YACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,UACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,YACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,SACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,OACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,SACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,sCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,6CACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,WACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,qDACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,0BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,0BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,qBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,8BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,0CACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,cACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,WACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,WACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,6BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,cACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,MACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,OACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,MACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,uBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,oBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,mBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,qBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,cACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,mBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,eACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,gBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,SACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,wCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,yCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,0BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,2BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,wBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,mBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,oBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,gBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,kBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,sBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,eACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,YACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,wBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,qBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,wBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,sBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,yBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,qCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,qCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,wBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,2BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,uBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,uBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,4BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,4BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,kCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,qCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,kCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,qCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,kCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,qCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,yBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,sCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,qCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,+CACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,oBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,8BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,6BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,yCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,2DACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iEACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,4BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,0BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,gCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,2BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,yCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,uCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,yDACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,+DACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,wBACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,8BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,4BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,0BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,iDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,cACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,8BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,mCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,6BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,sCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,eACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,6BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,8BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,6BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,mBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,sBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,iBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,4BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,8BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,mDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,mCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,oCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,yCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,0CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,mCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,yCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,0CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,iDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,0CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,2CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,wBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,2BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,4BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,yBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,0BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,mCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,oCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,8CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,iDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,+CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,8BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,6BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,uCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,oCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,eACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,uBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,8BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,sBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,cACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,6BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,eACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,iBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,sBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,2BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,6BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qEACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,oEACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,uEACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,sEACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qEACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,oEACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,uEACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,sEACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,yBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,oCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,mCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,6BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,uBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,mBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,0BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,wBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,wEACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,6BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,8CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,0BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,uBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,iBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,oBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,uBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,wCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,mBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,uBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,iBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,0BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,yBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,oCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,8BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,eACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,6BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,8BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,oBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,2BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,4BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,sBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,oBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,wBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,eACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,mCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,oDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,oCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,eACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,8CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,+CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,4BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,4BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,6BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,6BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,4BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,4BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,eACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,2BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,uBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,yCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,cACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,sBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,cACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,cACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,sCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,OACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,OACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,6BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,8BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,8BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,2BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,0BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,uBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,iBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,0BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,8BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,uBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,8BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,8BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,uBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,4BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,sDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,0CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,mCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,0CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,2BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,6BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,sBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,wBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,yBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,OACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,2BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,oCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,yCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,6BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,2BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,6BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,8BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,4BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,8BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,0BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,oCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,wCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,0CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,2CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,uCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,wBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,wBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,yBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,mBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,6BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,oCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,4BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,wBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,wBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,4BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,wBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,2BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,2BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,mDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,2BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,6BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,sBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,6CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,6BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,4BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,oBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,8BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,mBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,oBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,8BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,mCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,4BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,mCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,0BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,oCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,mCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,6BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,2BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,oDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,oDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,wBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,2BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,uBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,yCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,8BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,8BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,mCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,wCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,mCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,mDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,+CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,uDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,2BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,8BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,yCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,4CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,mCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,uDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,uDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,mCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,sCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,6CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,6CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,uDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,uDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,uEACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,uEACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,mCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,mDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,oCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,uCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,4CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,+CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,uBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,0BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,4CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,+CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,0BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,6BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,wCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,4BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,mDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,eACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,cACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,2BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,0BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,yCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,yCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,0CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,0CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,6BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,6BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,8BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,8BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,oBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,8BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,wCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,0CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,uCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,yCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,8BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,mCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,oCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,4BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,8BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,wBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,wBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,sBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,0BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,yBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,iDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,yBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,2BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,UACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,aACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,uBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,sCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,4CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,gDACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,8BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,sCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,mBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,iBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,yBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,+CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,8BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,kCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,sCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,6CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,wBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,0BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,6BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,4CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,+CACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qCACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,0BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,qBACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,2BACE/X,MAAM,IACNyzE,UAAO,QAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,OAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNy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AM,KACNyzE,UAAO,SAGT17D,KAAA,oBACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,U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AI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,YAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,YAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACH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lG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,eAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,eAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qB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AI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAA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J,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GA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","sourcesContent":["/*\n * index.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport polyfillIsConnected from './isconnected';\nimport polyfillCustomEvent from './custom-event';\n\nfunction polyfill() {\n polyfillIsConnected();\n polyfillCustomEvent();\n}\n\nexport default polyfill;\n","/*\n * Node.isConnected polyfill for IE and EdgeHTML\n * 2020-02-04\n *\n * By Eli Grey, https://eligrey.com\n * Public domain.\n * NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n */\n\nfunction polyfill() {\n if (!('isConnected' in Node.prototype)) {\n Object.defineProperty(Node.prototype, 'isConnected', {\n get() {\n return (\n !this.ownerDocument ||\n !(\n // tslint:disable-next-line: no-bitwise\n (this.ownerDocument.compareDocumentPosition(this) & this.DOCUMENT_POSITION_DISCONNECTED)\n )\n );\n },\n });\n }\n}\n\nexport default polyfill;\n","// apply polyfills\nimport polyfill from './polyfill/index';\npolyfill();\n\n// objects instantiated by the IDE\nexport { Editor, UITools } from './editor/editor';\n","/**\n * https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent\n *\n * From https://developer.mozilla.org/en-US/docs/MDN/About:\n * \"Any copyright is dedicated to the Public Domain. http://creativecommons.org/publicdomain/zero/1.0/\"\n */\nexport default function() {\n if (typeof window.CustomEvent === 'function') return false;\n\n function CustomEvent(event: any, params: any) {\n params = params || { bubbles: false, cancelable: false, detail: null };\n var evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n return evt;\n }\n\n window.CustomEvent = CustomEvent as any;\n}\n","/*\n * editor.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { inputRules } from 'prosemirror-inputrules';\nimport { keydownHandler } from 'prosemirror-keymap';\nimport { Node as ProsemirrorNode, Schema, DOMParser, ParseOptions } from 'prosemirror-model';\nimport { EditorState, Plugin, PluginKey, TextSelection, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport 'prosemirror-view/style/prosemirror.css';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { citeUI } from '../api/cite';\nimport { EditorOptions } from '../api/options';\nimport { ProsemirrorCommand, CommandFn, EditorCommand } from '../api/command';\nimport { EditorUI } from '../api/ui';\nimport {\n attrPropsToInput,\n attrInputToProps,\n AttrProps,\n AttrEditInput,\n InsertCiteProps,\n InsertCiteUI,\n} from '../api/ui-dialogs';\n\nimport { Extension } from '../api/extension';\nimport { PandocWriterOptions } from '../api/pandoc';\nimport { PandocCapabilities, getPandocCapabilities } from '../api/pandoc_capabilities';\nimport { fragmentToHTML } from '../api/html';\nimport { DOMEditorEvents, EventType, EventHandler } from '../api/events';\nimport {\n ScrollEvent,\n UpdateEvent,\n OutlineChangeEvent,\n StateChangeEvent,\n ResizeEvent,\n LayoutEvent,\n FocusEvent,\n DispatchEvent,\n NavigateEvent,\n BlurEvent,\n} from '../api/event-types';\nimport {\n PandocFormat,\n resolvePandocFormat,\n PandocFormatConfig,\n pandocFormatConfigFromCode,\n pandocFormatConfigFromDoc,\n} from '../api/pandoc_format';\nimport { baseKeysPlugin } from '../api/basekeys';\nimport {\n appendTransactionsPlugin,\n appendMarkTransactionsPlugin,\n kFixupTransaction,\n kAddToHistoryTransaction,\n kSetMarkdownTransaction,\n} from '../api/transaction';\nimport { EditorOutline, getOutlineNodes, EditingOutlineLocation, getEditingOutlineLocation } from '../api/outline';\nimport { EditingLocation, getEditingLocation, setEditingLocation } from '../api/location';\nimport { navigateTo, NavigationType } from '../api/navigation';\nimport { FixupContext } from '../api/fixup';\nimport { unitToPixels, pixelsToUnit, roundUnit, kValidUnits } from '../api/image';\nimport { kPercentUnit } from '../api/css';\nimport { EditorFormat } from '../api/format';\nimport { diffChars, EditorChange } from '../api/change';\nimport { markInputRuleFilter } from '../api/input_rule';\nimport { editorMath } from '../api/math';\nimport { EditorEvents } from '../api/events';\nimport { insertRmdChunk } from '../api/rmd';\nimport { EditorServer } from '../api/server';\nimport { pandocAutoIdentifier } from '../api/pandoc_id';\nimport { wrapSentences } from '../api/wrap';\nimport { yamlFrontMatter, applyYamlFrontMatter } from '../api/yaml';\nimport { EditorSpellingDoc } from '../api/spelling';\n\nimport { getTitle, setTitle } from '../nodes/yaml_metadata/yaml_metadata-title';\nimport { getOutline } from '../behaviors/outline';\nimport {\n FindOptions,\n find,\n matchCount,\n selectFirst,\n selectNext,\n selectPrevious,\n replace,\n replaceAll,\n clear,\n selectCurrent,\n} from '../behaviors/find';\n\nimport { omniInsertExtension } from '../behaviors/omni_insert/omni_insert';\nimport { completionExtension } from '../behaviors/completion/completion';\n\nimport { getSpellingDoc } from '../behaviors/spelling/spelling-interactive';\nimport { realtimeSpellingPlugin, invalidateAllWords, invalidateWord } from '../behaviors/spelling/spelling-realtime';\n\nimport { PandocConverter, PandocLineWrapping } from '../pandoc/pandoc_converter';\n\nimport { ExtensionManager, initExtensions } from './editor-extensions';\nimport { defaultTheme, EditorTheme, applyTheme, applyPadding } from './editor-theme';\nimport { defaultEditorUIImages } from './editor-images';\nimport { editorMenus, EditorMenus } from './editor-menus';\nimport { editorSchema } from './editor-schema';\n\n// import styles before extensions so they can be overriden by extensions\nimport './styles/frame.css';\nimport './styles/styles.css';\nimport { getPresentationEditorLocation, PresentationEditorLocation, positionForPresentationEditorLocation } from '../api/presentation';\n\nexport interface EditorCode {\n code: string;\n selection_only: boolean;\n location: EditingOutlineLocation;\n}\n\nexport interface EditorSetMarkdownResult {\n // editor view of markdown (as it will be persisted)\n canonical: string;\n\n // line wrapping\n line_wrapping: PandocLineWrapping;\n\n // unrecoginized pandoc tokens\n unrecognized: string[];\n\n // example lists?\n example_lists: boolean;\n\n // unparsed meta\n unparsed_meta: { [key: string]: any };\n\n // updated outline \n location: EditingOutlineLocation;\n}\n\nexport interface EditorContext {\n readonly server: EditorServer;\n readonly ui: EditorUI;\n readonly hooks?: EditorHooks;\n readonly extensions?: readonly Extension[];\n}\n\nexport interface EditorHooks {\n isEditable?: () => boolean;\n}\n\nexport interface EditorKeybindings {\n [id: string]: string[];\n}\n\nexport interface EditorSelection {\n from: number;\n to: number;\n navigation_id: string | null;\n}\n\nexport interface EditorFindReplace {\n find: (term: string, options: FindOptions) => boolean;\n matches: () => number;\n selectFirst: () => boolean;\n selectCurrent: () => boolean;\n selectNext: () => boolean;\n selectPrevious: () => boolean;\n replace: (text: string) => boolean;\n replaceAll: (text: string) => number;\n clear: () => boolean;\n}\n\nexport { EditorCommandId as EditorCommands } from '../api/command';\n\nexport interface UIToolsAttr {\n propsToInput(attr: AttrProps): AttrEditInput;\n inputToProps(input: AttrEditInput): AttrProps;\n pandocAutoIdentifier(text: string): string;\n}\n\nexport interface UIToolsImage {\n validUnits(): string[];\n percentUnit(): string;\n unitToPixels(value: number, unit: string, containerWidth: number): number;\n pixelsToUnit(pixels: number, unit: string, containerWidth: number): number;\n roundUnit(value: number, unit: string): string;\n}\n\nexport interface UIToolsFormat {\n parseFormatConfig(markdown: string, isRmd: boolean): PandocFormatConfig;\n}\n\nexport interface UIToolsSource {\n diffChars(from: string, to: string, timeout: number): EditorChange[];\n}\n\nexport interface UIToolsCitation {\n citeUI(citeProps: InsertCiteProps): InsertCiteUI;\n}\n\nexport class UITools {\n public readonly attr: UIToolsAttr;\n public readonly image: UIToolsImage;\n public readonly format: UIToolsFormat;\n public readonly source: UIToolsSource;\n public readonly citation: UIToolsCitation;\n\n constructor() {\n this.attr = {\n propsToInput: attrPropsToInput,\n inputToProps: attrInputToProps,\n pandocAutoIdentifier: (text: string) => pandocAutoIdentifier(text, false),\n };\n\n this.image = {\n validUnits: () => kValidUnits,\n percentUnit: () => kPercentUnit,\n unitToPixels,\n pixelsToUnit,\n roundUnit,\n };\n\n this.format = {\n parseFormatConfig: pandocFormatConfigFromCode,\n };\n\n this.source = {\n diffChars,\n };\n\n this.citation = {\n citeUI,\n };\n }\n}\n\nconst keybindingsPlugin = new PluginKey('keybindings');\n\nexport class Editor {\n // core context passed from client\n private readonly parent: HTMLElement;\n private readonly context: EditorContext;\n private readonly events: EditorEvents;\n\n // options (derived from defaults + config)\n private readonly options: EditorOptions;\n\n // format (pandocFormat includes additional diagnostics based on the validity of\n // provided mode + extensions)\n private readonly format: EditorFormat;\n private readonly pandocFormat: PandocFormat;\n\n // pandoc capabilities\n private pandocCapabilities: PandocCapabilities;\n\n // core prosemirror state/behaviors\n private readonly extensions: ExtensionManager;\n private readonly schema: Schema;\n private state: EditorState;\n private readonly view: EditorView;\n private readonly pandocConverter: PandocConverter;\n\n // setting via setKeybindings forces reconfiguration of EditorState\n // with plugins recreated\n private keybindings: EditorKeybindings;\n\n // content width constraints (if unset uses default editor CSS)\n private maxContentWidth = 0;\n private minContentPadding = 0;\n\n // keep track of whether the last transaction was selection-only\n private lastTrSelectionOnly = false;\n\n // create the editor -- note that the markdown argument does not substitute for calling\n // setMarkdown, rather it's used to read the format comment to determine how to\n // initialize the various editor features\n public static async create(\n parent: HTMLElement,\n context: EditorContext,\n format: EditorFormat,\n options: EditorOptions,\n ): Promise<Editor> {\n // provide option defaults\n options = {\n autoFocus: false,\n spellCheck: false,\n codeEditor: 'codemirror',\n rmdImagePreview: false,\n hideFormatComment: false,\n className: '',\n ...options,\n };\n\n // provide format defaults\n format = {\n pandocMode: format.pandocMode || 'markdown',\n pandocExtensions: format.pandocExtensions || '',\n rmdExtensions: {\n codeChunks: false,\n bookdownXRef: false,\n bookdownXRefUI: false,\n bookdownPart: false,\n blogdownMathInCode: false,\n ...format.rmdExtensions,\n },\n hugoExtensions: {\n shortcodes: false,\n ...format.hugoExtensions,\n },\n docTypes: format.docTypes || [],\n };\n\n // provide context defaults\n const defaultImages = defaultEditorUIImages();\n context = {\n ...context,\n ui: {\n ...context.ui,\n images: {\n ...defaultImages,\n ...context.ui.images,\n omni_insert: {\n ...defaultImages.omni_insert,\n ...context.ui.images,\n },\n citations: {\n ...defaultImages.citations,\n ...context.ui.images,\n },\n },\n },\n };\n\n // resolve the format\n const pandocFmt = await resolvePandocFormat(context.server.pandoc, format);\n\n // get pandoc capabilities\n const pandocCapabilities = await getPandocCapabilities(context.server.pandoc);\n\n // create editor\n const editor = new Editor(parent, context, options, format, pandocFmt, pandocCapabilities);\n\n // return editor\n return Promise.resolve(editor);\n }\n\n private constructor(\n parent: HTMLElement,\n context: EditorContext,\n options: EditorOptions,\n format: EditorFormat,\n pandocFormat: PandocFormat,\n pandocCapabilities: PandocCapabilities,\n ) {\n // initialize references\n this.parent = parent;\n this.events = new DOMEditorEvents(parent);\n this.context = context;\n this.options = options;\n this.format = format;\n this.keybindings = {};\n this.pandocFormat = pandocFormat;\n this.pandocCapabilities = pandocCapabilities;\n\n // create core extensions\n this.extensions = this.initExtensions();\n\n // create schema\n this.schema = editorSchema(this.extensions);\n\n // register completion handlers (done in a separate step b/c omni insert\n // completion handlers require access to the initializezd commands that\n // carry omni insert info)\n this.registerCompletionExtension();\n\n // register realtime spellchecking (done in a separate step b/c it\n // requires access to PandocMark definitions to determine which\n // marks to exclude from spellchecking)\n this.registerRealtimeSpelling();\n\n // create state\n this.state = EditorState.create({\n schema: this.schema,\n doc: this.initialDoc(),\n plugins: this.createPlugins(),\n });\n\n // additional dom attributes for editor node\n const attributes: { [name: string]: string } = {};\n if (options.className) {\n attributes.class = options.className;\n }\n\n // create view\n this.view = new EditorView(this.parent, {\n state: this.state,\n dispatchTransaction: this.dispatchTransaction.bind(this),\n domParser: new EditorDOMParser(this.schema),\n attributes,\n });\n\n // add custom restoreFocus handler to the view -- this provides a custom\n // handler for RStudio's FocusContext, necessary because the default\n // ProseMirror dom mutation handler picks up the focus and changes the\n // selection.\n Object.defineProperty(this.view.dom, 'restoreFocus', {\n value: () => {\n this.focus();\n },\n });\n\n // add proportinal font class to parent\n this.parent.classList.add('pm-proportional-font');\n\n // apply default theme\n this.applyTheme(defaultTheme());\n\n // create pandoc translator\n this.pandocConverter = new PandocConverter(\n this.schema,\n this.extensions,\n context.server.pandoc,\n this.pandocCapabilities,\n );\n\n // focus editor immediately if requested\n if (this.options.autoFocus) {\n setTimeout(() => {\n this.focus();\n }, 10);\n }\n\n // disale spellcheck if requested\n if (!this.options.spellCheck) {\n this.parent.setAttribute('spellcheck', 'false');\n }\n\n {\n // scroll event optimization, as recommended by\n // https://developer.mozilla.org/en-US/docs/Web/API/Document/scroll_event\n let ticking = false;\n this.parent.addEventListener(\n 'scroll',\n () => {\n if (!ticking) {\n window.requestAnimationFrame(() => {\n this.emitEvent(ScrollEvent);\n ticking = false;\n });\n ticking = true;\n }\n },\n { capture: true },\n );\n }\n }\n\n public destroy() {\n this.view.destroy();\n }\n\n public subscribe<TDetail>(event: EventType<TDetail> | string, handler: EventHandler<TDetail>): VoidFunction {\n if (typeof event === 'string') {\n return this.events.subscribe({ eventName: event }, handler);\n } else {\n return this.events.subscribe(event, handler);\n }\n }\n\n public setTitle(title: string) {\n const tr = setTitle(this.state, title);\n if (tr) {\n this.view.dispatch(tr);\n }\n }\n\n public async setMarkdown(\n markdown: string,\n options: PandocWriterOptions,\n emitUpdate: boolean,\n ): Promise<EditorSetMarkdownResult> {\n // get the result\n const result = await this.pandocConverter.toProsemirror(markdown, this.pandocFormat);\n const { doc, line_wrapping, unrecognized, example_lists, unparsed_meta } = result;\n\n // if we are preserving history but the existing doc is empty then create a new state\n // (resets the undo stack so that the initial setting of the document can't be undone)\n if (this.isInitialDoc()) {\n this.state = EditorState.create({\n schema: this.state.schema,\n doc,\n plugins: this.state.plugins,\n });\n this.view.updateState(this.state);\n } else {\n // note current editing location\n const loc = this.getEditingLocation();\n\n // replace the top level nodes in the doc\n const tr = this.state.tr;\n tr.setMeta(kSetMarkdownTransaction, true);\n let i = 0;\n tr.doc.descendants((node, pos) => {\n const mappedPos = tr.mapping.map(pos);\n tr.replaceRangeWith(mappedPos, mappedPos + node.nodeSize, doc.child(i));\n i++;\n return false;\n });\n // set selection to previous location if it's still valid\n if (loc.pos < tr.doc.nodeSize) {\n // eat exceptions that might result from an invalid position\n try {\n setTextSelection(loc.pos)(tr);\n } catch (e) {\n // do-nothing, this error can happen and shouldn't result in \n // a failure to setMarkdown\n }\n }\n // dispatch\n this.view.dispatch(tr);\n }\n\n // apply fixups\n this.applyFixups(FixupContext.Load);\n\n // notify listeners if requested\n if (emitUpdate) {\n this.emitEvent(UpdateEvent);\n this.emitEvent(OutlineChangeEvent);\n this.emitEvent(StateChangeEvent);\n }\n\n // return our current markdown representation (so the caller know what our\n // current 'view' of the doc as markdown looks like\n const getMarkdownTr = this.state.tr;\n const canonical = await this.getMarkdownCode(getMarkdownTr, options);\n const location = getEditingOutlineLocation(this.state);\n\n // return\n return {\n canonical,\n line_wrapping,\n unrecognized,\n example_lists,\n unparsed_meta,\n location\n };\n }\n\n // flag indicating whether we've ever had setMarkdown (currently we need this\n // because getMarkdown can only be called after setMarkdown b/c it needs\n // the API version retreived in setMarkdown -- we should remedy this)\n public isInitialDoc() {\n return this.state.doc.attrs.initial;\n }\n\n public async getMarkdown(options: PandocWriterOptions): Promise<EditorCode> {\n // get the code\n const tr = this.state.tr;\n const code = await this.getMarkdownCode(tr, options);\n\n // return code + perhaps outline location\n return {\n code,\n selection_only: this.lastTrSelectionOnly,\n location: getEditingOutlineLocation(this.state),\n };\n }\n\n public getEditingOutlineLocation(): EditingOutlineLocation {\n return getEditingOutlineLocation(this.state);\n }\n\n public getHTML(): string {\n return fragmentToHTML(this.state.schema, this.state.doc.content);\n }\n\n public getTitle() {\n return getTitle(this.state);\n }\n\n public getSelection(): EditorSelection {\n const { from, to } = this.state.selection;\n return {\n from,\n to,\n navigation_id: navigationIdForSelection(this.state),\n };\n }\n\n public getEditingLocation(): EditingLocation {\n return getEditingLocation(this.view);\n }\n\n public setEditingLocation(outlineLocation?: EditingOutlineLocation, previousLocation?: EditingLocation) {\n setEditingLocation(this.view, outlineLocation, previousLocation);\n }\n\n public getOutline(): EditorOutline {\n return getOutline(this.state) || [];\n }\n\n public getFindReplace(): EditorFindReplace {\n return {\n find: (term: string, options: FindOptions) => find(this.view, term, options),\n matches: () => matchCount(this.view),\n selectCurrent: () => selectCurrent(this.view),\n selectFirst: () => selectFirst(this.view),\n selectNext: () => selectNext(this.view),\n selectPrevious: () => selectPrevious(this.view),\n replace: (text: string) => replace(this.view, text),\n replaceAll: (text: string) => replaceAll(this.view, text),\n clear: () => clear(this.view),\n };\n }\n\n public getSpellingDoc(): EditorSpellingDoc {\n return getSpellingDoc(this.view, this.extensions.pandocMarks(), this.context.ui.spelling);\n }\n\n public spellingInvalidateAllWords() {\n invalidateAllWords(this.view);\n }\n\n public spellingInvalidateWord(word: string) {\n invalidateWord(this.view, word);\n }\n\n // get a canonical version of the passed markdown. this method doesn't mutate the\n // visual editor's state/view (it's provided as a performance optimiation for when\n // source mode is configured to save a canonical version of markdown)\n public async getCanonical(markdown: string, options: PandocWriterOptions): Promise<string> {\n // convert to prosemirror doc\n const result = await this.pandocConverter.toProsemirror(markdown, this.pandocFormat);\n\n // create a state for this doc\n const state = EditorState.create({\n schema: this.schema,\n doc: result.doc,\n plugins: this.state.plugins,\n });\n\n // apply load fixups (eumlating what a full round trip will do)\n const tr = state.tr;\n this.extensionFixups(tr, FixupContext.Load);\n\n // return markdown (will apply save fixups)\n return this.getMarkdownCode(tr, options);\n }\n\n public getSelectedText(): string {\n return this.state.doc.textBetween(this.state.selection.from, this.state.selection.to);\n }\n\n public replaceSelection(value: string): void {\n // retrieve properties we need from selection\n const { from, empty } = this.view.state.selection;\n\n // retrieve selection marks\n const marks = this.view.state.selection.$from.marks();\n\n // insert text\n const tr = this.view.state.tr.replaceSelectionWith(this.view.state.schema.text(value, marks), false);\n this.view.dispatch(tr);\n\n // update selection if necessary\n if (!empty) {\n const sel = TextSelection.create(this.view.state.doc, from, from + value.length);\n const trSetSel = this.view.state.tr.setSelection(sel);\n this.view.dispatch(trSetSel);\n }\n }\n\n public getYamlFrontMatter() {\n if (this.schema.nodes.yaml_metadata) {\n return yamlFrontMatter(this.view.state.doc);\n } else {\n return '';\n }\n }\n\n public getPresentationEditorLocation() {\n return getPresentationEditorLocation(this.state);\n }\n\n public navigateToPresentationEditorLocation(location: PresentationEditorLocation) {\n const pos = positionForPresentationEditorLocation(this.state, location);\n if (pos !== -1) {\n this.navigate(NavigationType.Pos, String(pos));\n }\n }\n\n public applyYamlFrontMatter(yaml: string) {\n if (this.schema.nodes.yaml_metadata) {\n applyYamlFrontMatter(this.view, yaml);\n }\n }\n\n public focus() {\n this.view.focus();\n }\n\n public blur() {\n (this.view.dom as HTMLElement).blur();\n }\n\n public insertChunk(chunkPlaceholder: string) {\n const insertCmd = insertRmdChunk(chunkPlaceholder);\n insertCmd(this.view.state, this.view.dispatch, this.view);\n this.focus();\n }\n\n public navigate(type: NavigationType, location: string, recordCurrent = true, animate = false) {\n // perform navigation\n const nav = navigateTo(this.view, this.format, type, location, animate);\n\n // emit event\n if (nav !== null) {\n if (!recordCurrent) {\n nav.prevPos = -1;\n }\n this.emitEvent(NavigateEvent, nav);\n }\n }\n\n public resize() {\n this.syncContentWidth();\n this.applyFixupsOnResize();\n this.emitEvent(ResizeEvent);\n }\n\n public enableDevTools(initFn: (view: EditorView, stateClass: any) => void) {\n initFn(this.view, { EditorState });\n }\n\n public getMenus(): EditorMenus {\n return editorMenus(this.context.ui, this.commands());\n }\n\n public commands(): EditorCommand[] {\n // get keybindings (merge user + default)\n const commandKeys = this.commandKeys();\n\n return this.extensions.commands(this.schema).map((command: ProsemirrorCommand) => {\n return {\n id: command.id,\n keymap: commandKeys[command.id],\n isActive: () => command.isActive(this.state),\n isEnabled: () => command.isEnabled(this.state),\n plural: () => command.plural(this.state),\n execute: () => {\n command.execute(this.state, this.view.dispatch, this.view);\n if (command.keepFocus) {\n this.focus();\n }\n },\n };\n });\n }\n\n public applyTheme(theme: EditorTheme) {\n // set global mode classes\n this.parent.classList.toggle('pm-dark-mode', !!theme.darkMode);\n this.parent.classList.toggle('pm-solarized-mode', !!theme.solarizedMode);\n // apply the rest of the theme\n applyTheme(theme);\n }\n\n public setMaxContentWidth(maxWidth: number, minPadding = 10) {\n this.maxContentWidth = maxWidth;\n this.minContentPadding = minPadding;\n this.syncContentWidth();\n }\n\n public setKeybindings(keyBindings: EditorKeybindings) {\n // validate that all of these keys can be rebound\n\n this.keybindings = keyBindings;\n this.state = this.state.reconfigure({\n schema: this.state.schema,\n plugins: this.createPlugins(),\n });\n }\n\n public getEditorFormat() {\n return this.format;\n }\n\n public getPandocFormat() {\n return this.pandocFormat;\n }\n\n public getPandocFormatConfig(isRmd: boolean): PandocFormatConfig {\n return pandocFormatConfigFromDoc(this.state.doc, isRmd);\n }\n\n private dispatchTransaction(tr: Transaction) {\n // track previous outline\n const previousOutline = getOutline(this.state);\n\n // track whether this was a selection-only transaction\n this.lastTrSelectionOnly = tr.selectionSet && !tr.docChanged;\n\n // apply the transaction\n this.state = this.state.apply(tr);\n this.view.updateState(this.state);\n\n // notify listeners of state change\n this.emitEvent(StateChangeEvent);\n\n // notify listeners of updates\n if (tr.docChanged || tr.storedMarksSet) {\n // fire updated (unless this was a fixup)\n if (!tr.getMeta(kFixupTransaction)) {\n this.emitEvent(UpdateEvent);\n }\n\n // fire outline changed if necessary\n if (getOutline(this.state) !== previousOutline) {\n this.emitEvent(OutlineChangeEvent);\n }\n }\n\n this.emitEvent(DispatchEvent, tr);\n\n this.emitEvent(LayoutEvent);\n }\n\n private emitEvent<TDetail>(eventType: EventType<TDetail>, detail?: TDetail) {\n this.events.emit(eventType, detail);\n }\n\n private initExtensions() {\n return initExtensions(\n {\n format: this.format,\n options: this.options,\n ui: this.context.ui,\n math: this.context.ui.math.typeset ? editorMath(this.context.ui) : undefined,\n events: {\n subscribe: this.subscribe.bind(this),\n emit: this.emitEvent.bind(this),\n },\n pandocExtensions: this.pandocFormat.extensions,\n pandocCapabilities: this.pandocCapabilities,\n server: this.context.server,\n navigation: {\n navigate: this.navigate.bind(this),\n },\n },\n this.context.extensions,\n );\n }\n\n private registerCompletionExtension() {\n // mark filter used to screen completions from noInputRules marks\n const markFilter = markInputRuleFilter(this.schema, this.extensions.pandocMarks());\n\n // register omni insert extension\n this.extensions.register([\n omniInsertExtension(this.extensions.omniInserters(this.schema), markFilter, this.context.ui),\n ]);\n\n // register completion extension\n this.extensions.register([\n completionExtension(this.extensions.completionHandlers(), markFilter, this.context.ui, this.events),\n ]);\n }\n\n private registerRealtimeSpelling() {\n this.extensions.registerPlugins(\n [realtimeSpellingPlugin(this.schema, this.extensions.pandocMarks(), this.context.ui, this.events)],\n true,\n );\n }\n\n private createPlugins(): Plugin[] {\n return [\n baseKeysPlugin(this.extensions.baseKeys(this.schema)),\n this.keybindingsPlugin(),\n appendTransactionsPlugin(this.extensions.appendTransactions(this.schema)),\n appendMarkTransactionsPlugin(this.extensions.appendMarkTransactions(this.schema)),\n ...this.extensions.plugins(this.schema),\n this.inputRulesPlugin(),\n this.editablePlugin(),\n this.domEventsPlugin(),\n ];\n }\n\n private editablePlugin() {\n const hooks = this.context.hooks || {};\n return new Plugin({\n key: new PluginKey('editable'),\n props: {\n editable: hooks.isEditable || (() => true),\n },\n });\n }\n\n private inputRulesPlugin() {\n // filter for disabling input rules for selected marks\n const markFilter = markInputRuleFilter(this.schema, this.extensions.pandocMarks());\n\n // create the defautl inputRules plugin\n const plugin = inputRules({ rules: this.extensions.inputRules(this.schema) });\n const handleTextInput = plugin.props.handleTextInput!;\n\n // override to disable input rules as requested\n // https://github.com/ProseMirror/prosemirror-inputrules/commit/b4bf67623aa4c4c1e096c20aa649c0e63751f337\n plugin.props.handleTextInput = (view: EditorView, from: number, to: number, text: string) => {\n if (!markFilter(view.state)) {\n return false;\n }\n return handleTextInput(view, from, to, text);\n };\n return plugin;\n }\n\n private domEventsPlugin(): Plugin {\n return new Plugin({\n key: new PluginKey('domevents'),\n props: {\n handleDOMEvents: {\n blur: (view: EditorView, event: Event) => {\n this.emitEvent(BlurEvent);\n return false;\n },\n focus: (view: EditorView, event: Event) => {\n this.emitEvent(FocusEvent, view.state.doc);\n return false;\n },\n keydown: (view: EditorView, event: Event) => {\n const kbEvent = event as KeyboardEvent;\n if (kbEvent.key === 'Tab' && this.context.ui.prefs.tabKeyMoveFocus()) {\n return true;\n } else {\n return false;\n }\n },\n },\n },\n });\n }\n\n private keybindingsPlugin(): Plugin {\n // get keybindings (merge user + default)\n const commandKeys = this.commandKeys();\n\n // command keys from extensions\n const pluginKeys: { [key: string]: CommandFn } = {};\n const commands = this.extensions.commands(this.schema);\n commands.forEach((command: ProsemirrorCommand) => {\n const keys = commandKeys[command.id];\n if (keys) {\n keys.forEach((key: string) => {\n pluginKeys[key] = command.execute;\n });\n }\n });\n\n // for windows desktop, build a list of control key handlers b/c qtwebengine\n // ends up corrupting ctrl+ keys so they don't hit the ace keybinding\n // (see: https://github.com/rstudio/rstudio/issues/7142)\n const ctrlKeyCodes: { [key: string]: CommandFn } = {};\n Object.keys(pluginKeys).forEach(keyCombo => {\n const match = keyCombo.match(/^Mod-([a-z\\\\])$/);\n if (match) {\n const key = match[1];\n const keyCode = key === '\\\\' ? 'Backslash' : `Key${key.toUpperCase()}`;\n ctrlKeyCodes[keyCode] = pluginKeys[keyCombo];\n }\n });\n\n // create default prosemirror handler\n const prosemirrorKeydownHandler = keydownHandler(pluginKeys);\n\n // return plugin\n return new Plugin({\n key: keybindingsPlugin,\n props: {\n handleKeyDown: (view: EditorView, event: KeyboardEvent) => {\n // workaround for Ctrl+ keys on windows desktop\n if (this.context.ui.context.isWindowsDesktop()) {\n const keyEvent = event as KeyboardEvent;\n if (keyEvent.ctrlKey) {\n const keyCommand = ctrlKeyCodes[keyEvent.code];\n if (keyCommand && keyCommand(this.view.state)) {\n keyCommand(this.view.state, this.view.dispatch, this.view);\n return true;\n }\n }\n }\n // default handling\n return prosemirrorKeydownHandler(view, event);\n },\n },\n });\n }\n\n private commandKeys(): { [key: string]: readonly string[] } {\n // start with keys provided within command definitions\n const commands = this.extensions.commands(this.schema);\n const defaultKeys = commands.reduce((keys: { [key: string]: readonly string[] }, command: ProsemirrorCommand) => {\n keys[command.id] = command.keymap;\n return keys;\n }, {});\n\n // merge with user keybindings\n return {\n ...defaultKeys,\n ...this.keybindings,\n };\n }\n\n // update parent padding based on content width settings (if specified)\n private syncContentWidth() {\n if (this.maxContentWidth && this.parent.clientWidth) {\n const minContentPadding = this.minContentPadding || 10;\n const parentWidth = this.parent.clientWidth;\n if (parentWidth > this.maxContentWidth + 2 * minContentPadding) {\n applyPadding(`calc((100% - ${this.maxContentWidth}px)/2)`);\n } else {\n applyPadding(this.minContentPadding + 'px');\n }\n }\n }\n\n private applyFixupsOnResize() {\n const docChanged = this.applyFixups(FixupContext.Resize);\n if (!docChanged) {\n // If applyFixupsOnResize returns true, then layout has already\n // been fired; if it hasn't, we must do so now\n this.emitEvent(LayoutEvent);\n }\n }\n\n private applyFixups(context: FixupContext) {\n let tr = this.state.tr;\n tr = this.extensionFixups(tr, context);\n if (tr.docChanged) {\n tr.setMeta(kAddToHistoryTransaction, false);\n tr.setMeta(kFixupTransaction, true);\n this.view.dispatch(tr);\n return true;\n }\n return false;\n }\n\n private extensionFixups(tr: Transaction, context: FixupContext) {\n this.extensions.fixups(this.schema, this.view).forEach(fixup => {\n tr = fixup(tr, context);\n });\n return tr;\n }\n\n private initialDoc(): ProsemirrorNode {\n return this.schema.nodeFromJSON({\n type: 'doc',\n attrs: {\n initial: true,\n },\n content: [\n { type: 'body', content: [{ type: 'paragraph' }] },\n { type: 'notes', content: [] },\n ],\n });\n }\n\n private async getMarkdownCode(tr: Transaction, options: PandocWriterOptions) {\n // apply save fixups\n this.extensionFixups(tr, FixupContext.Save);\n\n // apply sentence wrapping if requested\n if (options.wrap === 'sentence') {\n wrapSentences(tr);\n }\n\n // get code\n return this.pandocConverter.fromProsemirror(tr.doc, this.pandocFormat, options);\n }\n}\n\nfunction navigationIdForSelection(state: EditorState): string | null {\n const outline = getOutlineNodes(state.doc);\n const outlineNode = outline.reverse().find(node => node.pos < state.selection.from);\n if (outlineNode) {\n return outlineNode.node.attrs.navigation_id;\n } else {\n return null;\n }\n}\n\n// custom DOMParser that preserves all whitespace (required by display math marks)\nclass EditorDOMParser extends DOMParser {\n constructor(schema: Schema) {\n super(schema, DOMParser.fromSchema(schema).rules);\n }\n public parse(dom: Node, options?: ParseOptions) {\n return super.parse(dom, { ...options, preserveWhitespace: 'full' });\n }\n\n public parseSlice(dom: Node, options?: ParseOptions) {\n return super.parseSlice(dom, { ...options, preserveWhitespace: 'full' });\n }\n}\n","/*\n * cite.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { CSLName, CSLDate, CSL } from './csl';\nimport { InsertCiteProps, InsertCiteUI } from './ui-dialogs';\nimport { urlForDOI } from './doi';\n\nimport pinyin from 'pinyin';\nimport { transliterate } from 'transliteration';\n\nexport const kInvalidCiteKeyChars = /[\\]\\[\\s@',\\\\\\#}{~%&\\$\\^_]/g;\nconst kCiteIdLeadingLength = 8;\n\nexport function createUniqueCiteId(existingIds: string[], baseId: string): string {\n let count = 0;\n\n // Remove any non-8bit ascii characters, if possible\n // convert Hanzi characters to ascii\n let asciiOnlyBaseId = '';\n\n const isHanzi = (char: number) => {\n return char >= 13312 && char <= 40895;\n };\n\n for (let i = 0; i < baseId.length; i++) {\n const char = baseId.charCodeAt(i);\n if (char <= 255) {\n asciiOnlyBaseId = asciiOnlyBaseId + String.fromCharCode(char);\n } else if (isHanzi(char)) {\n asciiOnlyBaseId = asciiOnlyBaseId + pinyin(String.fromCharCode(char));\n } else {\n // Transliterate other non ascii characters to the citekey\n asciiOnlyBaseId = asciiOnlyBaseId + transliterate(String.fromCharCode(char));\n }\n }\n\n // If there are no characters left, just used a placeholder\n if (asciiOnlyBaseId.length === 0) {\n asciiOnlyBaseId = 'cite';\n }\n\n // The base ID but with invalid characters replaced\n let safeBaseId = asciiOnlyBaseId.replace(kInvalidCiteKeyChars, '');\n\n // Ensure that this is a valid citation, stripping any invalid characters\n let proposedId = safeBaseId;\n\n // If there is a conflict with an existing id, we will append\n // the following character and try again. If the conflict continues with\n // the postfix character added, we'll increment and keep going through the\n // alphabet\n const disambiguationStartCharacter = 97; // a\n\n while (existingIds.includes(proposedId)) {\n // If we've wrapped around to a and we haven't found a unique entry\n // Add an 'a' to the end and try again. Will ultimately create an entry like\n // Teague2012aaaf\n if (count !== 0 && count % 26 === 0) {\n safeBaseId = safeBaseId + String.fromCharCode(disambiguationStartCharacter);\n }\n\n const postfix = String.fromCharCode(disambiguationStartCharacter + (count % 26));\n proposedId = safeBaseId + postfix;\n count++;\n }\n return proposedId;\n}\n\n// Suggests a bibliographic identifier based upon the source\nexport function suggestCiteId(existingIds: string[], csl: CSL) {\n const author = csl.author;\n const issued = csl.issued;\n\n // Try to get the last name\n let citeIdLeading = '';\n if (author && author.length > 0) {\n if (author[0].family) {\n citeIdLeading = author[0].family;\n } else if (author[0].literal) {\n citeIdLeading = author[0].literal;\n }\n }\n\n // If we can't use author information, try using short title,\n // the title, or perhaps the type to construct a leading part of the\n // citeId.\n if (citeIdLeading.length === 0) {\n const shortTitle = csl['short-title'];\n if (shortTitle && shortTitle?.length > 0) {\n citeIdLeading = shortTitle.substr(0, Math.min(kCiteIdLeadingLength, shortTitle.length));\n } else if (csl.title) {\n citeIdLeading = csl.title.substr(0, Math.min(kCiteIdLeadingLength, csl.title.length));\n } else {\n citeIdLeading = csl.type;\n }\n }\n\n // Try to get the publication year\n let datePart = '';\n if (issued && issued['date-parts'] && issued['date-parts'].length > 0) {\n const yearIssued = issued['date-parts'][0][0];\n // Sometimes, data arrives with a null value, ignore null\n if (yearIssued) {\n datePart = yearIssued + '';\n }\n }\n\n // Create a deduplicated string against the existing entries\n let baseId = `${citeIdLeading.toLowerCase()}${datePart}`;\n if (baseId.length === 0) {\n baseId = 'untitled';\n }\n\n return createUniqueCiteId(existingIds, baseId);\n}\n\nexport interface CiteField {\n name: string;\n value: string;\n}\n\nexport function urlForCitation(csl: CSL): string | undefined {\n if (csl.URL) {\n return csl.URL;\n } else if (csl.DOI) {\n return urlForDOI(csl.DOI);\n }\n}\n\nexport function formatForPreview(csl: CSL): CiteField[] {\n const pairs = new Array<CiteField>();\n if (csl.title) {\n pairs.push({ name: 'Title', value: csl.title });\n }\n pairs.push({ name: 'Authors', value: formatAuthors(csl.author, 255) });\n if (csl.issued && isValidDate(csl.issued)) {\n pairs.push({ name: 'Issue Date', value: formatIssuedDate(csl.issued) });\n }\n\n const containerTitle = csl['container-title'];\n if (containerTitle) {\n pairs.push({ name: 'Publication', value: containerTitle });\n }\n\n const volume = csl.volume;\n if (volume) {\n pairs.push({ name: 'Volume', value: volume });\n }\n\n const page = csl.page;\n if (page) {\n pairs.push({ name: 'Page(s)', value: page });\n }\n\n const cslAny = csl as { [key: string]: any };\n Object.keys(csl).forEach(key => {\n if (!kFilteredFields.includes(key)) {\n const value = cslAny[key];\n // Don't display complex fields or fields that aren't strings\n if (typeof value === 'string') {\n // Capitalize preview names\n const name = key.charAt(0).toUpperCase() + key.slice(1);\n pairs.push({ name, value });\n }\n }\n });\n\n return pairs;\n}\n\nconst kFilteredFields = [\n 'id',\n 'title',\n 'author',\n 'issued',\n 'container-title',\n 'volume',\n 'page',\n 'abstract',\n 'provider',\n];\n\n// Sometimes, data arrives with a null value\n// This function will validate that the year (required) doesn't\n// contain null\nfunction isValidDate(date: CSLDate): boolean {\n const dateParts = date['date-parts'];\n if (dateParts) {\n const invalidElement = dateParts.find(datePart => datePart[0] === null);\n return invalidElement === undefined;\n }\n return true;\n}\n\n// TODO: Needs to support localization of the templated strings\nconst kEtAl = 'et al.';\nexport function formatAuthors(authors?: CSLName[], maxLength?: number): string {\n // No author(s) specified\n if (!authors || authors.length === 0) {\n return '';\n }\n\n return authors\n .map(author => {\n if (author.literal?.length) {\n return author.literal;\n } else if (author.given?.length && author.family?.length) {\n // Family and Given name\n return `${author.family}, ${author.given.substring(0, 1)}`;\n } else if (author.family?.length) {\n // Family name only\n return `${author.family}`;\n } else {\n return '';\n }\n })\n .reduce((previous, current, index, array) => {\n // Ignore any additional authors if the string\n // exceeds the maximum length\n if ((maxLength && previous.length >= maxLength) || previous.endsWith(kEtAl)) {\n return previous;\n }\n\n if (index === 0) {\n // Too long, truncate\n if (maxLength && current.length > maxLength) {\n return `${current.substring(0, maxLength - 1)}…`;\n }\n // The first author\n return current;\n } else if (index > 0 && index === array.length - 1) {\n // The last author\n return addAuthorOrEtAl(previous, `${previous}, and ${current}`, maxLength);\n } else {\n // Middle authors\n return addAuthorOrEtAl(previous, `${previous}, ${current}`, maxLength);\n }\n });\n}\n\nfunction addAuthorOrEtAl(previousAuthorStr: string, newAuthorStr: string, maxLength?: number) {\n // if adding the string would make it too long, truncate\n if (maxLength && newAuthorStr.length > maxLength) {\n return etAl(previousAuthorStr, maxLength);\n }\n return newAuthorStr;\n}\n\nfunction etAl(authorStr: string, maxLength: number) {\n // First try just using et al., then shorten existing\n // author to accomodate\n const etAlStr = `${authorStr} ${kEtAl}`;\n if (maxLength && etAlStr.length > maxLength) {\n // First try to truncate to a space\n const lastSpace = authorStr.lastIndexOf(' ');\n if (lastSpace) {\n return `${authorStr.substr(0, lastSpace)} ${kEtAl}`;\n } else {\n // As a last resort, truncate with ellipsis\n const excessLength = etAlStr.length - maxLength - 1;\n return `${authorStr.substr(0, authorStr.length - excessLength)}… ${kEtAl}`;\n }\n }\n return etAlStr;\n}\n\n// TODO: Needs to support localization of the templated strings\nexport function formatIssuedDate(date: CSLDate | undefined): string {\n // No issue date for this\n if (!date) {\n return '';\n }\n\n const dateParts = date['date-parts'];\n if (dateParts) {\n switch (dateParts.length) {\n // There is a date range\n case 2:\n return `${dateParts[0][0]}-${dateParts[1][0]}`;\n // Only a single date\n case 1:\n // Note that it is possible to receive an entry with a single null entry\n // For examples:\n // 10.1163/1874-6772_seg_a44_588\n const singleDatePart = dateParts[0][0];\n return `${singleDatePart ? singleDatePart : ''}`;\n\n // Seems like a malformed date :(\n case 0:\n default:\n return '';\n }\n }\n return '';\n}\n\nexport function citeUI(citeProps: InsertCiteProps): InsertCiteUI {\n if (citeProps.csl) {\n const suggestedId = suggestCiteId(citeProps.existingIds, citeProps.csl);\n const previewFields = formatForPreview(citeProps.csl);\n return {\n suggestedId,\n previewFields,\n };\n } else {\n // This should never happen - this function should always be called with a work\n return {\n suggestedId: '',\n previewFields: [],\n };\n }\n}\n","/*\n * doi.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport interface DOIResult {\n status: 'ok' | 'notfound' | 'nohost' | 'error';\n message: any | null;\n error: string;\n}\n\nexport interface DOIServer {\n fetchCSL: (doi: string, progressDelay: number) => Promise<DOIResult>;\n}\n\n// ^10.\\d{4,9}/[-._;()/:A-Z0-9]+$\n// Core regexes come from https://www.crossref.org/blog/dois-and-matching-regular-expressions/\nconst kModernCrossrefDOIRegex = /10.\\d{4,9}\\/[-._;()/:A-Z0-9]+$/i;\nconst kEarlyWileyCrossrefDOIRegex = /10.1002\\/[^\\s]+$/i;\nconst kOtherCrossrefDOIRegex1 = /10.\\\\d{4}\\/\\d+-\\d+X?(\\d+)\\d+<[\\d\\w]+:[\\d\\w]*>\\d+.\\d+.\\w+;\\d$/i;\nconst kOtherCrossrefDOIRegex2 = /10.1021\\/\\w\\w\\d+$/i;\nconst kOtherCrossrefDOIRegex3 = /10.1207\\/[\\w\\d]+\\&\\d+_\\d+$/i;\n\nconst kCrossrefMatches = [\n kModernCrossrefDOIRegex,\n kEarlyWileyCrossrefDOIRegex,\n kOtherCrossrefDOIRegex1,\n kOtherCrossrefDOIRegex2,\n kOtherCrossrefDOIRegex3,\n];\n\n// Determines whether a a given string may be a DOI\n// Note that this will validate the form of the string, but not\n// whether it is actually a registered DOI\nexport function hasDOI(token: string): boolean {\n return findDOI(token) !== undefined;\n}\n\nexport function findDOI(token: string): string | undefined {\n let match = null;\n kCrossrefMatches.find(regex => {\n match = token.match(regex);\n return match && match[0].length > 0;\n });\n\n if (match === null) {\n return undefined;\n } else {\n return match[0];\n }\n}\n\nexport function urlForDOI(doi: string): string {\n return `https://doi.org/${doi}`;\n}\n","/*\n * ui-dialogs.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { LinkTargets, LinkCapabilities, LinkType } from './link';\nimport { ImageDimensions } from './image';\nimport { ListCapabilities, ListType } from './list';\nimport { TableCapabilities } from './table';\nimport { CSL } from './csl';\nimport { CiteField } from './cite';\nimport { kStyleAttrib, attrPartitionKeyvalue, pandocAttrKeyvalueFromText } from './pandoc_attr';\n\nexport interface EditorDialogs {\n alert: AlertFn;\n yesNoMessage: YesNoMessageFn;\n editLink: LinkEditorFn;\n editImage: ImageEditorFn;\n editCodeBlock: CodeBlockEditorFn;\n editList: ListEditorFn;\n editAttr: AttrEditorFn;\n editSpan: AttrEditorFn;\n editDiv: DivAttrEditorFn;\n editCallout: CalloutEditorFn;\n editRawInline: RawFormatEditorFn;\n editRawBlock: RawFormatEditorFn;\n editMath: MathEditorFn;\n insertTable: InsertTableFn;\n insertTabset: InsertTabsetFn;\n insertCite: InsertCiteFn;\n htmlDialog: EditorHTMLDialogFn;\n}\n\nexport type EditorHTMLDialogFn = (\n title: string,\n okText: string | null,\n create: EditorHTMLDialogCreateFn,\n focus: VoidFunction,\n validate: EditorHTMLDialogValidateFn,\n) => Promise<boolean>;\n\nexport type EditorHTMLDialogCreateFn = (\n containerWidth: number,\n containerHeight: number,\n confirm: VoidFunction,\n cancel: VoidFunction,\n showProgress: (message: string) => void,\n hideProgress: VoidFunction,\n) => HTMLElement;\n\nexport type EditorHTMLDialogValidateFn = () => string | null;\n\nexport const kAlertTypeInfo = 1;\nexport const kAlertTypeWarning = 2;\nexport const kAlertTypeError = 3;\n\nexport type AlertFn = (message: string, title: string, type: number) => Promise<boolean>;\n\nexport type YesNoMessageFn = (\n message: string,\n title: string,\n type: number,\n yesLabel: string,\n noLabel: string,\n) => Promise<boolean>;\n\nexport type AttrEditorFn = (attr: AttrProps, idHint?: string) => Promise<AttrEditResult | null>;\n\nexport type DivAttrEditorFn = (attr: AttrProps, removeEnabled: boolean) => Promise<AttrEditResult | null>;\n\nexport type CalloutEditorFn = (props: CalloutEditProps, removeEnabled: boolean) => Promise<CalloutEditResult | null>;\n\nexport type LinkEditorFn = (\n link: LinkProps,\n targets: LinkTargets,\n capabilities: LinkCapabilities,\n) => Promise<LinkEditResult | null>;\n\nexport type ImageEditorFn = (\n image: ImageProps,\n dims: ImageDimensions | null,\n figure: boolean,\n editAttributes: boolean,\n) => Promise<ImageEditResult | null>;\n\nexport type CodeBlockEditorFn = (\n codeBlock: CodeBlockProps,\n attributes: boolean,\n languages: string[],\n) => Promise<CodeBlockEditResult | null>;\n\nexport type ListEditorFn = (list: ListProps, capabilities: ListCapabilities) => Promise<ListEditResult | null>;\n\nexport type MathEditorFn = (id: string) => Promise<string | null>;\n\nexport type RawFormatEditorFn = (raw: RawFormatProps, outputFormats: string[]) => Promise<RawFormatResult | null>;\n\nexport type InsertTableFn = (capabilities: TableCapabilities) => Promise<InsertTableResult | null>;\n\nexport type InsertCiteFn = (props: InsertCiteProps) => Promise<InsertCiteResult | null>;\n\nexport type InsertTabsetFn = () => Promise<InsertTabsetResult | null>;\n\nexport interface AttrProps {\n readonly id?: string;\n readonly classes?: string[];\n readonly keyvalue?: Array<[string, string]>;\n}\n\nexport interface AttrEditResult {\n readonly action: 'edit' | 'remove';\n readonly attr: AttrProps;\n}\n\nexport interface CalloutEditProps {\n attr: AttrProps;\n callout: CalloutProps;\n}\n\nexport interface CalloutEditResult extends CalloutEditProps {\n readonly action: \"edit\" | \"remove\";\n}\n\nexport interface CalloutProps {\n type: string;\n appearance: string;\n icon: boolean;\n caption: string;\n}\n\nexport interface LinkProps extends AttrProps {\n readonly type: LinkType;\n readonly text: string;\n readonly href: string;\n readonly heading?: string;\n readonly title?: string;\n}\n\nexport interface LinkEditResult {\n readonly action: 'edit' | 'remove';\n readonly link: LinkProps;\n}\n\nexport interface ImageProps extends AttrProps {\n src: string | null;\n title?: string;\n caption?: string;\n alt?: string;\n align?: string;\n env?: string;\n linkTo?: string;\n width?: number;\n height?: number;\n units?: string;\n lockRatio?: boolean;\n}\n\nexport type ImageEditResult = ImageProps;\n\nexport interface CodeBlockProps extends AttrProps {\n lang: string;\n}\n\nexport type CodeBlockEditResult = CodeBlockProps;\n\nexport interface ListProps {\n type: ListType;\n tight: boolean;\n order: number;\n number_style: string;\n number_delim: string;\n incremental: \"default\" | \"incremental\" | \"nonincremental\";\n}\n\nexport type ListEditResult = ListProps;\n\nexport interface InsertTableResult {\n rows: number;\n cols: number;\n header: boolean;\n caption?: string;\n}\n\nexport interface InsertTabsetResult {\n tabs: string[];\n attr: AttrProps;\n}\n\nexport interface InsertCiteProps {\n doi: string;\n existingIds: string[];\n bibliographyFiles: string[];\n provider?: string;\n csl?: CSL;\n citeUI?: InsertCiteUI;\n}\n\nexport interface InsertCiteUI {\n suggestedId: string;\n previewFields: CiteField[];\n}\n\nexport interface InsertCiteResult {\n id: string;\n bibliographyFile: string;\n csl: CSL;\n}\n\nexport interface RawFormatProps {\n content: string;\n format: string;\n}\n\nexport interface RawFormatResult {\n readonly action: 'edit' | 'remove';\n readonly raw: RawFormatProps;\n}\n\nexport interface AttrEditInput {\n id?: string;\n classes?: string;\n style?: string;\n keyvalue?: string;\n}\n\nexport function attrInputToProps(attr: AttrEditInput): AttrProps {\n const classes = attr.classes ? attr.classes.split(/\\s+/) : [];\n let keyvalue: Array<[string, string]> | undefined;\n if (attr.keyvalue || attr.style) {\n let text = attr.keyvalue || '';\n if (attr.style) {\n text += `\\nstyle=${attr.style}\\n`;\n }\n keyvalue = pandocAttrKeyvalueFromText(text, '\\n');\n }\n return {\n id: asPandocId(attr.id || ''),\n classes: classes.map(asPandocClass),\n keyvalue,\n };\n}\n\nfunction asPandocId(id: string) {\n return id.replace(/^#/, '');\n}\n\nfunction asPandocClass(clz: string) {\n return clz.replace(/^\\./, '');\n}\n\nexport function attrPropsToInput(attr: AttrProps): AttrEditInput {\n let style: string | undefined;\n let keyvalue: string | undefined;\n if (attr.keyvalue) {\n const partitionedKeyvalue = attrPartitionKeyvalue([kStyleAttrib], attr.keyvalue);\n if (partitionedKeyvalue.partitioned.length > 0) {\n style = partitionedKeyvalue.partitioned[0][1];\n }\n keyvalue = attrTextFromKeyvalue(partitionedKeyvalue.base);\n }\n\n return {\n id: asHtmlId(attr.id) || undefined,\n classes: attr.classes ? attr.classes.map(asHtmlClass).join(' ') : undefined,\n style,\n keyvalue,\n };\n}\n\nfunction attrTextFromKeyvalue(keyvalue: Array<[string, string]>) {\n return keyvalue.map(kv => `${kv[0]}=${kv[1]}`).join('\\n');\n}\n\nfunction asHtmlId(id: string | undefined) {\n if (id) {\n if (id.startsWith('#')) {\n return id;\n } else {\n return '#' + id;\n }\n } else {\n return id;\n }\n}\n\nfunction asHtmlClass(clz: string | undefined) {\n if (clz) {\n if (clz.startsWith('.')) {\n return clz;\n } else {\n return '.' + clz;\n }\n } else {\n return clz;\n }\n}\n","/*\n * pandoc_attr.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { NodeSpec, MarkSpec } from 'prosemirror-model';\n\nimport { PandocToken, PandocExtensions } from './pandoc';\nimport { extensionEnabled, extensionIfEnabled, Extension } from './extension';\n\nexport const kPandocAttrId = 0;\nexport const kPandocAttrClasses = 1;\nexport const kPandocAttrKeyvalue = 2;\n\nconst kDataPmPandocAttr = 'data-pm-pandoc-attr';\n\nexport const kWidthAttrib = 'width';\nexport const kHeightAttrib = 'height';\nexport const kStyleAttrib = 'style';\nexport const kAlignAttrib = 'align';\nexport const kFigAltAttrib = 'fig-alt';\nexport const kFigAlignAttrib = 'fig-align';\nexport const kFigEnvAttrib = 'fig-env';\n\nexport const kCodeBlockAttr = 0;\nexport const kCodeBlockText = 1;\n\nexport const kSpanAttr = 0;\nexport const kSpanChildren = 1;\n\nexport interface PandocAttr {\n id: string;\n classes: string[];\n keyvalue: Array<[string, string]>;\n}\n\nexport const pandocAttrSpec = {\n id: { default: null },\n classes: { default: [] },\n keyvalue: { default: [] },\n};\n\nexport function pandocAttrAvailable(attrs: any, keyvalue = true) {\n return !!attrs.id || \n (attrs.classes && attrs.classes.length > 0) || \n (keyvalue && attrs.keyvalue && attrs.keyvalue.length > 0);\n}\n\nexport function pandocAttrFrom(attrs: any) {\n const pandocAttr: any = {};\n if (attrs.id) {\n pandocAttr.id = attrs.id;\n }\n if (attrs.classes) {\n pandocAttr.classes = attrs.classes;\n }\n if (attrs.keyvalue) {\n pandocAttr.keyvalue = attrs.keyvalue;\n }\n\n return pandocAttr;\n}\n\nexport function pandocAttrEnsureClass(attr: any, name: string) {\n attr.classes = [name].concat((attr.classes || []).filter((clz: string) => clz !== name));\n}\n\nexport function pandocAttrRemoveClass(attr: any, predicate: (str: string) => boolean) : string | undefined {\n let foundClass: string | undefined;\n if (Array.isArray(attr.classes)) {\n const classes: string[] = [];\n for (const clz of attr.classes) {\n if (predicate(clz)) {\n foundClass = clz;\n } else {\n classes.push(clz);\n }\n }\n attr.classes = classes;\n return foundClass;\n \n } else {\n return undefined;\n }\n}\n\nexport function pandocAttrHasClass(attrs: any, predicate: (str: string) => boolean) {\n if (Array.isArray(attrs.classes)) {\n const classes = attrs.classes as string[];\n return classes.some(clz => predicate(clz));\n } else {\n return false;\n }\n}\n\nexport function pandocAttrGetKeyvalue(attr: any, key: string) {\n if (attr.keyvalue) {\n const entry = attr.keyvalue.find((keyval: string[]) => keyval[0] === key);\n if (entry) {\n return entry[1];\n } else {\n return undefined;\n }\n } else {\n return undefined;\n }\n}\n\nexport function pandocAttrSetKeyvalue(attr: any, key: string, value: string) {\n const keyvalue = [...(attr.keyvalue || [])] as string[][];\n let add = true;\n for (const entry of keyvalue) {\n if (entry[0] === key) {\n entry[1] = value;\n add = false;\n break;\n }\n }\n if (add) {\n keyvalue.push([key, value]);\n }\n attr.keyvalue = keyvalue;\n}\n\nexport function pandocAttrRemoveKeyvalue(attr: any, key: string) {\n if (attr.keyvalue) {\n attr.keyvalue = attr.keyvalue.filter((entry: string[]) => entry[0] !== key);\n }\n}\n\nexport function pandocAttrInSpec(spec: NodeSpec | MarkSpec) {\n const keys = Object.keys((spec.attrs as object) || {});\n return keys.includes('id') && keys.includes('classes') && keys.includes('keyvalue');\n}\n\nexport function pandocAttrReadAST(tok: PandocToken, index: number) {\n const pandocAttr = tok.c[index];\n return {\n id: pandocAttr[kPandocAttrId] || undefined,\n classes: pandocAttr[kPandocAttrClasses],\n keyvalue: pandocAttr[kPandocAttrKeyvalue],\n };\n}\n\nexport function pandocAttrToDomAttr(attrs: any, marker = true) {\n // id and class\n const domAttr: any = {};\n if (attrs.id) {\n domAttr.id = attrs.id;\n }\n if (attrs.classes && attrs.classes.length > 0) {\n domAttr.class = attrs.classes.join(' ');\n }\n\n // keyvalue pairs\n attrs.keyvalue.forEach((keyvalue: [string, string]) => {\n domAttr[keyvalue[0]] = keyvalue[1];\n });\n\n // marker\n if (marker) {\n domAttr[kDataPmPandocAttr] = '1';\n }\n\n return domAttr;\n}\n\nexport function pandocAttrParseDom(el: Element, attrs: { [key: string]: string | null }, forceAttrs = false) {\n // exclude any keys passed to us\n const excludedNames = Object.keys(attrs);\n\n // if this isn't from a prosemirror pandoc node then include only src and alt\n const includedNames: string[] = [];\n if (!forceAttrs && !el.hasAttribute(kDataPmPandocAttr)) {\n includedNames.push('src', 'alt');\n }\n\n // read attributes\n const attr: any = {};\n attr.classes = [];\n attr.keyvalue = [];\n el.getAttributeNames().forEach(name => {\n const value: string = el.getAttribute(name) as string;\n // exclude attributes already parsed and prosemirror internal attributes\n if (excludedNames.indexOf(name) === -1 && !name.startsWith('data-pm')) {\n // if we have an include filter then use it\n if (!includedNames.length || includedNames.includes(name)) {\n if (name === 'id') {\n attr.id = value;\n } else if (name === 'class') {\n attr.classes = value\n .split(/\\s+/)\n .filter(val => !!val.length)\n .filter(val => !val.startsWith('pm-'));\n } else {\n attr.keyvalue.push([name, value]);\n }\n }\n }\n });\n return attr;\n}\n\nexport function pandocAttrParseText(attr: string): PandocAttr | null {\n attr = attr.trim();\n\n let id = '';\n const classes: string[] = [];\n let remainder = '';\n\n let current = '';\n const resolveCurrent = () => {\n const resolve = current;\n current = '';\n\n if (resolve.length === 0) {\n return true;\n } else if (resolve.startsWith('#')) {\n if (id.length === 0 && resolve.length > 1) {\n id = resolve.substr(1);\n return true;\n } else {\n return false;\n }\n } else if (resolve.startsWith('.')) {\n if (resolve.length > 1) {\n classes.push(resolve.substr(1));\n return true;\n } else {\n return false;\n }\n } else {\n remainder = resolve;\n return true;\n }\n };\n\n for (let i = 0; i < attr.length; i++) {\n let inQuotes = false;\n const ch = attr[i];\n inQuotes = ch === '\"' ? !inQuotes : inQuotes;\n if (ch !== ' ' && !inQuotes) {\n current += ch;\n } else if (resolveCurrent()) {\n // if we have a remainder then the rest of the string is the remainder\n if (remainder.length > 0) {\n remainder = remainder + attr.substr(i);\n break;\n }\n } else {\n return null;\n }\n }\n\n if (resolveCurrent()) {\n if (id.length === 0 && classes.length === 0) {\n remainder = attr;\n }\n return {\n id,\n classes,\n keyvalue: remainder.length > 0 ? pandocAttrKeyvalueFromText(remainder, ' ') : [],\n };\n } else {\n return null;\n }\n}\n\nexport function pandocAttrKeyvalueFromText(text: string, separator: ' ' | '\\n'): Array<[string, string]> {\n // if the separator is a space then convert unquoted spaces to newline\n if (separator === ' ') {\n let convertedText = '';\n let inQuotes = false;\n for (let i = 0; i < text.length; i++) {\n let ch = text.charAt(i);\n if (ch === '\"') {\n inQuotes = !inQuotes;\n } else if (ch === ' ' && !inQuotes) {\n ch = '\\n';\n }\n convertedText += ch;\n }\n text = convertedText;\n }\n\n const lines = text.trim().split('\\n');\n return lines.map(line => {\n const parts = line.trim().split('=');\n return [parts[0], (parts[1] || '').replace(/^\"/, '').replace(/\"$/, '')];\n });\n}\n\nexport interface AttrKeyvaluePartitioned {\n base: Array<[string, string]>;\n partitioned: Array<[string, string]>;\n}\n\nexport function attrPartitionKeyvalue(partition: string[], keyvalue: Array<[string, string]>): AttrKeyvaluePartitioned {\n const base = new Array<[string, string]>();\n const partitioned = new Array<[string, string]>();\n\n keyvalue.forEach(kv => {\n if (partition.includes(kv[0])) {\n partitioned.push(kv);\n } else {\n base.push(kv);\n }\n });\n\n return {\n base,\n partitioned,\n };\n}\n\nexport function extensionIfPandocAttrEnabled(extension: Extension) {\n return extensionIfEnabled(extension, kPandocAttrExtensions);\n}\n\nexport function pandocAttrEnabled(pandocExtensions: PandocExtensions) {\n return extensionEnabled(pandocExtensions, kPandocAttrExtensions);\n}\n\nconst kPandocAttrExtensions = [\n 'link_attributes',\n 'mmd_link_attributes',\n 'mmd_header_identifiers',\n 'header_attributes',\n 'fenced_code_attributes',\n 'inline_code_attributes',\n 'bracketed_spans',\n 'native_spans',\n 'fenced_divs',\n 'native_divs',\n];\n","/*\n * extension.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { InputRule } from 'prosemirror-inputrules';\nimport { Schema } from 'prosemirror-model';\nimport { Plugin } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { ProsemirrorCommand } from './command';\nimport { PandocMark } from './mark';\nimport { PandocNode } from './node';\nimport { EditorUI } from './ui';\nimport { BaseKeyBinding } from './basekeys';\nimport { AppendTransactionHandler, AppendMarkTransactionHandler } from './transaction';\nimport { EditorOptions } from './options';\nimport { PandocExtensions } from './pandoc';\nimport { FixupFn } from './fixup';\nimport { EditorEvents } from './events';\nimport { PandocCapabilities } from './pandoc_capabilities';\nimport { EditorFormat } from './format';\nimport { MarkInputRuleFilter } from './input_rule';\nimport { CompletionHandler } from './completion';\nimport { EditorNavigation } from './navigation';\nimport { EditorMath } from './math';\nimport { EditorServer } from './server';\n\nexport interface Extension {\n marks?: PandocMark[];\n nodes?: PandocNode[];\n baseKeys?: (schema: Schema) => readonly BaseKeyBinding[];\n inputRules?: (schema: Schema, markFilter: MarkInputRuleFilter) => readonly InputRule[];\n commands?: (schema: Schema) => readonly ProsemirrorCommand[];\n plugins?: (schema: Schema) => readonly Plugin[];\n appendTransaction?: (schema: Schema) => readonly AppendTransactionHandler[];\n appendMarkTransaction?: (schema: Schema) => readonly AppendMarkTransactionHandler[];\n fixups?: (schema: Schema, view: EditorView) => Readonly<FixupFn[]>;\n completionHandlers?: () => readonly CompletionHandler[];\n}\n\nexport interface ExtensionContext {\n pandocExtensions: PandocExtensions;\n pandocCapabilities: PandocCapabilities;\n server: EditorServer;\n ui: EditorUI;\n math?: EditorMath;\n format: EditorFormat;\n options: EditorOptions;\n events: EditorEvents;\n navigation: EditorNavigation;\n}\n\nexport type ExtensionFn = (context: ExtensionContext) => Extension | null;\n\n// create an ExtensionFn for a given extension and format option that must be enabled\nexport function extensionIfEnabled(extension: Extension, name: string | string[]) {\n return (context: ExtensionContext) => {\n if (extensionEnabled(context.pandocExtensions, name)) {\n return extension;\n } else {\n return null;\n }\n };\n}\n\nexport function extensionEnabled(pandocExtensions: PandocExtensions, name: string | string[]) {\n // match single extension name\n if (typeof name === 'string') {\n if (pandocExtensions[name]) {\n return true;\n }\n\n // match any one of several names\n } else if (Array.isArray(name)) {\n for (const nm of name) {\n if (pandocExtensions[nm]) {\n return true;\n }\n }\n }\n\n return false;\n}\n","/*\n * pandoc_capabilities.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { PandocServer, parsePandocListOutput, PandocApiVersion } from './pandoc';\n\nexport interface PandocCapabilitiesResult {\n version: string;\n api_version: PandocApiVersion;\n output_formats: string;\n highlight_languages: string;\n}\n\nexport interface PandocCapabilities {\n version: string;\n api_version: PandocApiVersion;\n output_formats: string[];\n highlight_languages: string[];\n}\n\nexport async function getPandocCapabilities(server: PandocServer) {\n const result = await server.getCapabilities();\n return {\n version: result.version,\n api_version: result.api_version,\n output_formats: parsePandocListOutput(result.output_formats),\n highlight_languages: parsePandocListOutput(result.highlight_languages),\n };\n}\n","/*\n * pandoc.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Fragment, Mark, Node as ProsemirrorNode, Schema, NodeType } from 'prosemirror-model';\n\nimport { PandocAttr, pandocAttrReadAST, kSpanChildren, kSpanAttr } from './pandoc_attr';\nimport { PandocCapabilitiesResult } from './pandoc_capabilities';\nimport { kQuoteType, kQuoteChildren, QuoteType } from './quote';\nimport { BibliographyResult } from './bibliography/bibliography-provider_local';\n\nimport { stringifyMath } from './math';\nimport { kCodeText } from './code';\nimport { kLinkChildren } from './link';\n\nexport interface PandocServer {\n getCapabilities(): Promise<PandocCapabilitiesResult>;\n markdownToAst(markdown: string, format: string, options: string[]): Promise<PandocAst>;\n astToMarkdown(ast: PandocAst, format: string, options: string[]): Promise<string>;\n listExtensions(format: string): Promise<string>;\n getBibliography(\n file: string | null,\n bibliography: string[],\n refBlock: string | null,\n etag: string | null,\n ): Promise<BibliographyResult>;\n addToBibliography(\n bibliography: string,\n project: boolean,\n id: string,\n sourceAsJson: string,\n sourceAsBibTeX: string,\n ): Promise<boolean>;\n citationHTML(file: string | null, sourceAsJson: string, csl: string | null): Promise<string>;\n}\n\nexport interface PandocWriterReferencesOptions {\n location?: string; // block | section | document\n prefix?: string;\n}\n\nexport interface PandocWriterOptions {\n atxHeaders?: boolean;\n references?: PandocWriterReferencesOptions;\n wrap?: string;\n dpi?: number;\n}\n\nexport interface PandocExtensions {\n abbreviations: boolean;\n all_symbols_escapable: boolean;\n amuse: boolean;\n angle_brackets_escapable: boolean;\n ascii_identifiers: boolean;\n auto_identifiers: boolean;\n autolink_bare_uris: boolean;\n backtick_code_blocks: boolean;\n blank_before_blockquote: boolean;\n blank_before_header: boolean;\n bracketed_spans: boolean;\n citations: boolean;\n compact_definition_lists: boolean;\n definition_lists: boolean;\n east_asian_line_breaks: boolean;\n emoji: boolean;\n empty_paragraphs: boolean;\n epub_html_exts: boolean;\n escaped_line_breaks: boolean;\n example_lists: boolean;\n fancy_lists: boolean;\n fenced_code_attributes: boolean;\n fenced_code_blocks: boolean;\n fenced_divs: boolean;\n footnotes: boolean;\n four_space_rule: boolean;\n gfm_auto_identifiers: boolean;\n grid_tables: boolean;\n hard_line_breaks: boolean;\n header_attributes: boolean;\n ignore_line_breaks: boolean;\n implicit_figures: boolean;\n implicit_header_references: boolean;\n inline_code_attributes: boolean;\n inline_notes: boolean;\n intraword_underscores: boolean;\n latex_macros: boolean;\n line_blocks: boolean;\n link_attributes: boolean;\n lists_without_preceding_blankline: boolean;\n literate_haskell: boolean;\n markdown_attribute: boolean;\n markdown_in_html_blocks: boolean;\n mmd_header_identifiers: boolean;\n mmd_link_attributes: boolean;\n mmd_title_block: boolean;\n multiline_tables: boolean;\n native_divs: boolean;\n native_spans: boolean;\n native_numbering: boolean;\n ntb: boolean;\n old_dashes: boolean;\n pandoc_title_block: boolean;\n pipe_tables: boolean;\n raw_attribute: boolean;\n raw_html: boolean;\n raw_tex: boolean;\n shortcut_reference_links: boolean;\n simple_tables: boolean;\n smart: boolean;\n space_in_atx_header: boolean;\n spaced_reference_links: boolean;\n startnum: boolean;\n strikeout: boolean;\n subscript: boolean;\n superscript: boolean;\n styles: boolean;\n task_lists: boolean;\n table_captions: boolean;\n tex_math_dollars: boolean;\n tex_math_double_backslash: boolean;\n tex_math_single_backslash: boolean;\n yaml_metadata_block: boolean;\n gutenberg: boolean;\n // attributes: boolean; (not yet)\n [key: string]: boolean;\n}\n\nexport function imageAttributesAvailable(pandocExtensions: PandocExtensions) {\n return pandocExtensions.link_attributes || pandocExtensions.raw_html;\n}\n\nexport function parsePandocListOutput(output: string) {\n return output.split(/\\r?\\n/).filter(entry => entry.length);\n}\n\nexport interface PandocAst {\n blocks: PandocToken[];\n 'pandoc-api-version': PandocApiVersion;\n meta: any;\n heading_ids?: string[]; // used only for reading not writing\n}\n\nexport type PandocApiVersion = number[];\n\nexport interface PandocToken {\n t: string;\n c?: any;\n}\n\n// https://github.com/jgm/pandoc-types/blob/master/Text/Pandoc/Definition.hs\nexport enum PandocTokenType {\n Str = 'Str',\n Space = 'Space',\n Strong = 'Strong',\n Emph = 'Emph',\n Code = 'Code',\n Superscript = 'Superscript',\n Subscript = 'Subscript',\n Strikeout = 'Strikeout',\n SmallCaps = 'SmallCaps',\n Underline = 'Underline',\n Quoted = 'Quoted',\n RawInline = 'RawInline',\n RawBlock = 'RawBlock',\n LineBlock = 'LineBlock',\n Para = 'Para',\n Plain = 'Plain',\n Header = 'Header',\n CodeBlock = 'CodeBlock',\n BlockQuote = 'BlockQuote',\n BulletList = 'BulletList',\n OrderedList = 'OrderedList',\n DefinitionList = 'DefinitionList',\n Image = 'Image',\n Link = 'Link',\n Note = 'Note',\n Cite = 'Cite',\n Table = 'Table',\n AlignRight = 'AlignRight',\n AlignLeft = 'AlignLeft',\n AlignDefault = 'AlignDefault',\n AlignCenter = 'AlignCenter',\n ColWidth = 'ColWidth',\n ColWidthDefault = 'ColWidthDefault',\n HorizontalRule = 'HorizontalRule',\n LineBreak = 'LineBreak',\n SoftBreak = 'SoftBreak',\n Math = 'Math',\n InlineMath = 'InlineMath',\n DisplayMath = 'DisplayMath',\n Div = 'Div',\n Span = 'Span',\n Null = 'Null',\n}\n\nexport interface PandocTokenReader {\n // pandoc token name (e.g. \"Str\", \"Emph\", etc.)\n readonly token: PandocTokenType;\n\n // If present, gives a chance for the reader to decide whether it actually\n // wants to handle the token, based on factors other than the PandocTokenType\n readonly match?: (tok: PandocToken) => boolean;\n\n // one and only one of these values must also be set\n readonly text?: boolean;\n readonly node?: string;\n readonly block?: string;\n readonly mark?: string;\n readonly code_block?: boolean;\n\n // functions for getting attributes and children\n getAttrs?: (tok: PandocToken) => any;\n getChildren?: (tok: PandocToken) => any[];\n getText?: (tok: PandocToken) => string;\n\n // lower-level handler function that overrides the above handler attributes\n // (they are ignored when handler is specified)\n handler?: (schema: Schema) => (writer: ProsemirrorWriter, tok: PandocToken) => void;\n\n // post-processor for performing fixups that rely on seeing the entire\n // document (e.g. recognizing implicit header references)\n postprocessor?: PandocPostprocessorFn;\n}\n\n// constants used to read the contents of raw blocks\nexport const kRawBlockFormat = 0;\nexport const kRawBlockContent = 1;\n\n// filter sequences of tokens (e.g. for reducing some adjacent tokens to a single token)\nexport type PandocTokensFilterFn = (tokens: PandocToken[], writer: ProsemirrorWriter) => PandocToken[];\n\n// special reader that gets a first shot at blocks (i.e. to convert a para w/ a single image into a figure)\nexport type PandocBlockReaderFn = (schema: Schema, tok: PandocToken, writer: ProsemirrorWriter) => boolean;\n\n// reader that gets a first shot at inline html (e.g. image node parsing an <img> tag)\nexport type PandocInlineHTMLReaderFn = (schema: Schema, html: string, writer?: ProsemirrorWriter) => boolean;\n\nexport interface ProsemirrorWriter {\n // open (then close) a node container\n openNode(type: NodeType, attrs: {}): void;\n closeNode(): ProsemirrorNode;\n\n // special open call for note node containers\n openNoteNode(ref: string): void;\n\n // add a node to the current container\n addNode(type: NodeType, attrs: {}, content: ProsemirrorNode[]): ProsemirrorNode | null;\n\n // open and close marks\n openMark(mark: Mark): void;\n closeMark(mark: Mark): void;\n\n // add text to the current node using the current mark set\n writeText(text: string): void;\n\n // write tokens into the current node\n writeTokens(tokens: PandocToken[]): void;\n\n // see if any inline HTML readers want to handle this html\n hasInlineHTMLWriter(html: string): boolean;\n writeInlineHTML(html: string): void;\n\n // log an unrecoginzed token type\n logUnrecognized(token: string): void;\n\n // log the presence of example lists\n logExampleList(): void;\n\n // query whether a given node type is open\n // (useful for e.g. conditional behavior when in a list or table)\n isNodeOpen(type: NodeType): boolean;\n}\n\nexport interface PandocNodeWriter {\n readonly name: string;\n readonly write: PandocNodeWriterFn;\n}\n\nexport type PandocNodeWriterFn = (output: PandocOutput, node: ProsemirrorNode) => void;\n\nexport type PandocPreprocessorFn = (markdown: string) => string;\n\nexport type PandocPostprocessorFn = (doc: ProsemirrorNode) => ProsemirrorNode;\n\nexport interface PandocMarkWriter {\n // pandoc mark name\n readonly name: string;\n\n // The 'priority' property allows us to dicate the order of nesting\n // for marks (this is required b/c Prosemirror uses a flat structure\n // whereby multiple marks are attached to text nodes). This allows us\n // to e.g. ensure that strong and em always occur outside code.\n readonly priority: number;\n\n // writer function\n readonly write: PandocMarkWriterFn;\n}\n\nexport type PandocMarkWriterFn = (output: PandocOutput, mark: Mark, parent: Fragment) => void;\n\nexport const kWriteSpaces = 'writeSpaces';\nexport const kPreventBracketEscape = 'preventBracketEscape';\n\nexport type PandocOutputOption = typeof kWriteSpaces | typeof kPreventBracketEscape;\n\n\n\nexport interface PandocOutput {\n extensions: PandocExtensions;\n write(value: any): void;\n writeToken(type: PandocTokenType, content?: (() => void) | any): void;\n writeMark(type: PandocTokenType, parent: Fragment, expelEnclosingWhitespace?: boolean): void;\n writeArray(content: () => void): void;\n writeAttr(id?: string, classes?: string[], keyvalue?: [[string, string]]): void;\n writeText(text: string | null): void;\n writeLink(href: string, title: string, attr: PandocAttr | null, f: () => void): void;\n writeNode(node: ProsemirrorNode): void;\n writeNodes(parent: ProsemirrorNode): void;\n writeNote(note: ProsemirrorNode): void;\n writeInlines(fragment: Fragment): void;\n writeRawMarkdown(markdown: Fragment | string, escapeSymbols?: boolean): void;\n withOption(option: PandocOutputOption, value: boolean, f: () => void): void;\n}\n\n// collect the text from a collection of pandoc ast\n// elements (ignores marks, useful for ast elements\n// that support marks but whose prosemirror equivalent\n// does not, e.g. image alt text)\n// https://github.com/jgm/pandoc/blob/83880b0dbc318703babfbb6905b1046fa48f1216/src/Text/Pandoc/Shared.hs#L439\nexport function stringifyTokens(c: PandocToken[], unemoji = false): string {\n return c\n .map(elem => {\n if (elem.t === PandocTokenType.Str) {\n return elem.c;\n } else if (\n elem.t === PandocTokenType.Space ||\n elem.t === PandocTokenType.SoftBreak ||\n elem.t === PandocTokenType.LineBreak\n ) {\n return ' ';\n } else if (elem.t === PandocTokenType.Link) {\n return stringifyTokens(elem.c[kLinkChildren]);\n } else if (elem.t === PandocTokenType.Span) {\n const attr = pandocAttrReadAST(elem, kSpanAttr);\n if (unemoji && attr.classes && attr.classes[0] === 'emoji') {\n return attr.keyvalue[0][1];\n } else {\n return stringifyTokens(elem.c[kSpanChildren]);\n }\n } else if (elem.t === PandocTokenType.Quoted) {\n const type = elem.c[kQuoteType].t;\n const quote = type === QuoteType.SingleQuote ? \"'\" : '\"';\n return quote + stringifyTokens(elem.c[kQuoteChildren]) + quote;\n } else if (elem.t === PandocTokenType.Math) {\n return stringifyMath(elem);\n } else if (elem.t === PandocTokenType.Code) {\n return elem.c[kCodeText];\n } else if (elem.c) {\n return stringifyTokens(elem.c);\n } else {\n return '';\n }\n })\n .join('');\n}\n\nexport function forEachToken(tokens: PandocToken[], f: (tok: PandocToken) => void) {\n mapTokens(tokens, (tok: PandocToken) => {\n f(tok);\n return tok;\n });\n}\n\nexport function mapTokens(tokens: PandocToken[], f: (tok: PandocToken) => PandocToken) {\n function isToken(val: any) {\n if (val !== null && typeof val === 'object') {\n return val.hasOwnProperty('t');\n } else {\n return false;\n }\n }\n\n function tokenHasChildren(tok: PandocToken) {\n return tok !== null && typeof tok === 'object' && Array.isArray(tok.c);\n }\n\n function mapValue(val: any): any {\n if (isToken(val)) {\n return mapToken(val);\n } else if (Array.isArray(val)) {\n return val.map(mapValue);\n } else {\n return val;\n }\n }\n\n function mapToken(tok: PandocToken): PandocToken {\n const mappedTok = f(tok);\n if (tokenHasChildren(mappedTok)) {\n mappedTok.c = mappedTok.c.map(mapValue);\n }\n return mappedTok;\n }\n\n return tokens.map(mapToken);\n}\n\nexport function tokenTextEscaped(t: PandocToken) {\n return t.c.replace(/\\\\/g, `\\\\\\\\`);\n}\n\n// sort marks by priority (in descending order)\nexport function marksByPriority(marks: Mark[], markWriters: { [key: string]: PandocMarkWriter }) {\n return marks.sort((a: Mark, b: Mark) => {\n const aPriority = markWriters[a.type.name].priority;\n const bPriority = markWriters[b.type.name].priority;\n if (aPriority < bPriority) {\n return 1;\n } else if (bPriority < aPriority) {\n return -1;\n } else {\n return 0;\n }\n });\n}\n","/*\n * quote.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport const kQuoteType = 0;\nexport const kQuoteChildren = 1;\n\nexport enum QuoteType {\n SingleQuote = 'SingleQuote',\n DoubleQuote = 'DoubleQuote',\n}\n\nexport function quotesForType(type: QuoteType) {\n const dblQuote = type === QuoteType.DoubleQuote;\n return {\n begin: dblQuote ? '“' : '‘',\n end: dblQuote ? '”' : '’',\n };\n}\n\n// create regexs for removing quotes\nconst kSingleQuotes = quotesForType(QuoteType.SingleQuote);\nconst kSingleQuoteRegEx = new RegExp(`[${kSingleQuotes.begin}${kSingleQuotes.end}]`, 'g');\nconst kDoubleQuotes = quotesForType(QuoteType.DoubleQuote);\nconst kDoubleQuoteRegEx = new RegExp(`[${kDoubleQuotes.begin}${kDoubleQuotes.end}]`, 'g');\n\nexport function fancyQuotesToSimple(text: string) {\n return text.replace(kSingleQuoteRegEx, \"'\").replace(kDoubleQuoteRegEx, '\"');\n}\n","/*\n * math.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState } from 'prosemirror-state';\n\nimport { EditorUI } from './ui';\nimport { PandocToken } from './pandoc';\nimport { markIsActive, getMarkAttrs } from './mark';\n\nexport const kMathType = 0;\nexport const kMathContent = 1;\n\n// additional field we stick into the AST for quarto crossref ids\nexport const kMathId = 2;\n\nexport enum MathType {\n Inline = 'InlineMath',\n Display = 'DisplayMath',\n}\n\nexport interface EditorMath {\n typeset: (el: HTMLElement, math: string, priority: boolean) => Promise<boolean>;\n}\n\nexport function editorMath(ui: EditorUI): EditorMath {\n // return a promise that will typeset this node's math (including retrying as long as is\n // required if the element is not yet connected to the DOM)\n return {\n typeset: (el: HTMLElement, math: string, priority: boolean): Promise<boolean> => {\n return new Promise(resolve => {\n // regular typeset if we are already connected\n if (el.isConnected) {\n ui.math.typeset!(el, math, priority).then(resolve);\n } else {\n // otherwise wait 100ms then retry\n const timerId = setInterval(() => {\n if (el.isConnected) {\n clearInterval(timerId);\n ui.math.typeset!(el, math, priority).then(resolve);\n }\n }, 100);\n }\n });\n },\n };\n}\n\nexport function delimiterForType(type: string) {\n if (type === MathType.Inline) {\n return '$';\n } else {\n return '$$';\n }\n}\n\nexport function stringifyMath(tok: PandocToken) {\n const delimter = delimiterForType(tok.c[kMathType].t);\n return delimter + tok.c[kMathContent] + delimter;\n}\n\nexport function mathTypeIsActive(state: EditorState, type: MathType) {\n const schema = state.schema;\n return (\n markIsActive(state, schema.marks.math) &&\n getMarkAttrs(state.doc, state.selection, schema.marks.math).type === type\n );\n}\n\n","/*\n * mark.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Mark, MarkSpec, MarkType, ResolvedPos, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorState, Selection, Transaction } from 'prosemirror-state';\n\nimport { PandocTokenReader, PandocMarkWriterFn, PandocInlineHTMLReaderFn, PandocTokensFilterFn } from './pandoc';\nimport { mergedTextNodes } from './text';\nimport { findChildrenByMark } from 'prosemirror-utils';\nimport { MarkTransaction } from './transaction';\n\nexport interface PandocMark {\n readonly name: string;\n readonly spec: MarkSpec;\n readonly noInputRules?: boolean;\n readonly noSpelling?: boolean;\n readonly pandoc: {\n readonly readers: readonly PandocTokenReader[];\n readonly inlineHTMLReader?: PandocInlineHTMLReaderFn;\n readonly tokensFilter?: PandocTokensFilterFn;\n readonly writer: {\n priority: number;\n write: PandocMarkWriterFn;\n };\n };\n}\n\nexport function markIsActive(context: EditorState | Transaction, type: MarkType) {\n const { from, $from, to, empty } = context.selection;\n\n if (empty) {\n return type && !!type.isInSet(context.storedMarks || $from.marks());\n }\n\n return !!context.doc.rangeHasMark(from, to, type);\n}\n\nexport function getMarkAttrs(doc: ProsemirrorNode, range: { from: number; to: number }, type: MarkType) {\n const { from, to } = range;\n let marks: Mark[] = [];\n\n doc.nodesBetween(from, to, node => {\n marks = [...marks, ...node.marks];\n });\n\n const mark = marks.find(markItem => markItem.type.name === type.name);\n\n if (mark) {\n return mark.attrs;\n }\n\n return {};\n}\n\nexport function getMarkRange($pos?: ResolvedPos, type?: MarkType) {\n if (!$pos || !type) {\n return false;\n }\n\n const start = $pos.parent.childAfter($pos.parentOffset);\n\n if (!start.node) {\n return false;\n }\n\n const link = start.node.marks.find((mark: Mark) => mark.type === type);\n if (!link) {\n return false;\n }\n\n let startIndex = $pos.index();\n let startPos = $pos.start() + start.offset;\n let endIndex = startIndex + 1;\n let endPos = startPos + start.node.nodeSize;\n\n while (startIndex > 0 && link.isInSet($pos.parent.child(startIndex - 1).marks)) {\n startIndex -= 1;\n startPos -= $pos.parent.child(startIndex).nodeSize;\n }\n\n while (endIndex < $pos.parent.childCount && link.isInSet($pos.parent.child(endIndex).marks)) {\n endPos += $pos.parent.child(endIndex).nodeSize;\n endIndex += 1;\n }\n\n return { from: startPos, to: endPos };\n}\n\nexport function getSelectionMarkRange(selection: Selection, markType: MarkType): { from: number; to: number } {\n let range: { from: number; to: number };\n if (selection.empty) {\n range = getMarkRange(selection.$head, markType) as { from: number; to: number };\n } else {\n range = { from: selection.from, to: selection.to };\n }\n return range;\n}\n\nexport function removeInvalidatedMarks(\n tr: MarkTransaction,\n node: ProsemirrorNode,\n pos: number,\n re: RegExp,\n markType: MarkType,\n) {\n re.lastIndex = 0;\n const markedNodes = findChildrenByMark(node, markType, true);\n markedNodes.forEach(markedNode => {\n const from = pos + 1 + markedNode.pos;\n const markedRange = getMarkRange(tr.doc.resolve(from), markType);\n if (markedRange) {\n const text = tr.doc.textBetween(markedRange.from, markedRange.to);\n if (!text.match(re)) {\n tr.removeMark(markedRange.from, markedRange.to, markType);\n tr.removeStoredMark(markType);\n }\n }\n });\n re.lastIndex = 0;\n}\n\nexport function splitInvalidatedMarks(\n tr: MarkTransaction,\n node: ProsemirrorNode,\n pos: number,\n validLength: (text: string) => number,\n markType: MarkType,\n removeMark?: (from: number, to: number) => void,\n) {\n const hasMarkType = (nd: ProsemirrorNode) => markType.isInSet(nd.marks);\n const markedNodes = findChildrenByMark(node, markType, true);\n\n const remove = (from: number, to: number, type: MarkType) => {\n if (removeMark) {\n removeMark(from, to);\n } else {\n tr.removeMark(from, to, type);\n }\n };\n\n markedNodes.forEach(markedNode => {\n const mark = hasMarkType(markedNode.node);\n if (mark) {\n const from = pos + 1 + markedNode.pos;\n const markRange = getMarkRange(tr.doc.resolve(from), markType);\n if (markRange) {\n const text = tr.doc.textBetween(markRange.from, markRange.to);\n\n // Trim any leading space and count how much we trimmed\n const trimmedText = text.trimStart();\n const countSpace = text.length - trimmedText.length;\n\n // Remove the mark from any trimmed space at the start\n if (countSpace > 0) {\n remove(markRange.from, markRange.from + countSpace, markType);\n }\n\n // find the valid length of the text and remove the mark from \n // anything after the end of the valid length\n const length = validLength(trimmedText);\n if (length > -1 && length !== text.length) {\n remove(markRange.from + length + countSpace, markRange.to, markType);\n }\n }\n }\n });\n}\n\nexport function detectAndApplyMarks(\n tr: MarkTransaction,\n node: ProsemirrorNode,\n pos: number,\n re: RegExp,\n markType: MarkType,\n attrs: (match: RegExpMatchArray) => {},\n filter?: (from: number, to: number) => boolean,\n text?: (match: RegExpMatchArray) => string,\n) {\n re.lastIndex = 0;\n const textNodes = mergedTextNodes(node, (_node: ProsemirrorNode, _pos: number, parentNode: ProsemirrorNode) =>\n parentNode.type.allowsMarkType(markType),\n );\n textNodes.forEach(textNode => {\n re.lastIndex = 0;\n let match = re.exec(textNode.text);\n while (match !== null) {\n const refText = text ? text(match) : match[0];\n const from = pos + 1 + textNode.pos + match.index + (match[0].length - refText.length);\n const to = from + refText.length;\n const range = getMarkRange(tr.doc.resolve(to), markType);\n if (\n (!range || range.from !== from || range.to !== to) &&\n !tr.doc.rangeHasMark(from, to, markType.schema.marks.code)\n ) {\n if (!filter || filter(from, to)) {\n const mark = markType.create(attrs instanceof Function ? attrs(match) : attrs);\n tr.addMark(from, to, mark);\n if (tr.selection.anchor === to) {\n tr.removeStoredMark(mark.type);\n }\n }\n }\n match = re.lastIndex !== 0 ? re.exec(textNode.text) : null;\n }\n });\n re.lastIndex = 0;\n}\n","/*\n * text.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nexport interface TextWithPos {\n readonly text: string;\n readonly pos: number;\n}\n\nexport function mergedTextNodes(\n doc: ProsemirrorNode,\n filter?: (node: ProsemirrorNode, pos: number, parentNode: ProsemirrorNode) => boolean,\n): TextWithPos[] {\n const textNodes: TextWithPos[] = [];\n let nodeIndex = 0;\n doc.descendants((node, pos, parentNode) => {\n if (node.isText) {\n // apply filter\n if (filter && !filter(node, pos, parentNode)) {\n return false;\n }\n\n // join existing contiguous range of text nodes or create a new one\n if (textNodes[nodeIndex]) {\n textNodes[nodeIndex] = {\n text: textNodes[nodeIndex].text + node.text,\n pos: textNodes[nodeIndex].pos,\n };\n } else {\n textNodes[nodeIndex] = {\n text: node.text || '',\n pos,\n };\n }\n } else {\n nodeIndex += 1;\n }\n });\n return textNodes;\n}\n\nexport function stripQuotes(text: string) {\n return text.replace(/[\"']/g, '');\n}\n\nexport function equalsIgnoreCase(str1: string, str2: string) {\n if (!str1 && !!str2) {\n return false;\n } else if (!!str1 && !str2) {\n return false;\n } else if (str1 === str2) {\n return true;\n } else {\n return str1.localeCompare(str2, undefined, { sensitivity: 'accent' }) === 0;\n }\n}\n","/*\n * code.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Plugin, PluginKey } from 'prosemirror-state';\n\nimport { CodeViewOptions, canInsertNodeAtPos } from './node';\nimport { ResolvedPos, Slice, Fragment } from 'prosemirror-model';\n\nexport const kCodeAttr = 0;\nexport const kCodeText = 1;\n\nexport function codeNodeSpec() {\n return {\n content: 'text*',\n group: 'block',\n marks: '',\n code: true,\n defining: true,\n isolating: true,\n };\n}\n\nexport function codeViewClipboardPlugin(codeViews: { [key: string]: CodeViewOptions }) {\n return new Plugin({\n key: new PluginKey('code-view-clipboard'),\n props: {\n clipboardTextParser: (text: string, $context: ResolvedPos): any => {\n // see if any of the code views want to handle this text\n for (const codeViewType of Object.keys(codeViews)) {\n const codeView = codeViews[codeViewType];\n if (codeView.createFromPastePattern && codeView.createFromPastePattern.test(text)) {\n const schema = $context.node().type.schema;\n const nodeType = schema.nodes[codeViewType];\n if (canInsertNodeAtPos($context, nodeType)) {\n const textNode = schema.text(text);\n const codeNode = nodeType.createAndFill({}, textNode);\n return new Slice(Fragment.from(codeNode), 0, 0);\n }\n }\n }\n return null;\n },\n },\n });\n}\n","/*\n * node.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, NodeSpec, NodeType, ResolvedPos } from 'prosemirror-model';\nimport { EditorState, Selection, NodeSelection } from 'prosemirror-state';\nimport {\n findParentNode,\n findSelectedNodeOfType,\n ContentNodeWithPos,\n NodeWithPos,\n findParentNodeOfType,\n findChildrenByType,\n findChildren,\n findParentNodeOfTypeClosestToPos,\n} from 'prosemirror-utils';\n\nimport { EditorView } from 'prosemirror-view';\n\nimport {\n PandocTokenReader,\n PandocNodeWriterFn,\n PandocPreprocessorFn,\n PandocBlockReaderFn,\n PandocInlineHTMLReaderFn,\n PandocTokensFilterFn,\n} from './pandoc';\nimport { PandocBlockCapsuleFilter } from './pandoc_capsule';\n\nimport { AttrEditOptions } from './attr_edit';\nimport { CommandFn } from './command';\n\nexport interface PandocNode {\n readonly name: string;\n readonly spec: NodeSpec;\n readonly code_view?: CodeViewOptions;\n readonly attr_edit?: () => AttrEditOptions | null;\n readonly pandoc: {\n readonly readers?: readonly PandocTokenReader[];\n readonly writer?: PandocNodeWriterFn;\n readonly preprocessor?: PandocPreprocessorFn;\n readonly tokensFilter?: PandocTokensFilterFn;\n readonly blockReader?: PandocBlockReaderFn;\n readonly inlineHTMLReader?: PandocInlineHTMLReaderFn;\n readonly blockCapsuleFilter?: PandocBlockCapsuleFilter;\n };\n}\n\nexport interface CodeViewOptions {\n lang: (node: ProsemirrorNode, content: string) => string | null;\n attrEditFn?: CommandFn;\n createFromPastePattern?: RegExp;\n classes?: string[];\n borderColorClass?: string;\n firstLineMeta?: boolean;\n lineNumbers?: boolean;\n bookdownTheorems?: boolean;\n lineNumberFormatter?: (lineNumber: number, lineCount?: number, line?: string) => string;\n}\n\nexport type NodeTraversalFn = (\n node: Node,\n pos: number,\n parent: Node,\n index: number,\n) => boolean | void | null | undefined;\n\nexport function findTopLevelBodyNodes(doc: ProsemirrorNode, predicate: (node: ProsemirrorNode) => boolean) {\n const body = findChildrenByType(doc, doc.type.schema.nodes.body, false)[0];\n const offset = body.pos + 1;\n const nodes = findChildren(body.node, predicate, false);\n return nodes.map(value => ({ ...value, pos: value.pos + offset }));\n}\n\nexport function findNodeOfTypeInSelection(selection: Selection, type: NodeType): ContentNodeWithPos | undefined {\n return findSelectedNodeOfType(type)(selection) || findParentNode((n: ProsemirrorNode) => n.type === type)(selection);\n}\n\nexport function firstNode(parent: NodeWithPos, predicate: (node: ProsemirrorNode) => boolean) {\n let foundNode: NodeWithPos | undefined;\n parent.node.descendants((node, pos) => {\n if (!foundNode) {\n if (predicate(node)) {\n foundNode = {\n node,\n pos: parent.pos + 1 + pos,\n };\n return false;\n }\n } else {\n return false;\n }\n });\n return foundNode;\n}\n\nexport function lastNode(parent: NodeWithPos, predicate: (node: ProsemirrorNode) => boolean) {\n let last: NodeWithPos | undefined;\n parent.node.descendants((node, pos) => {\n if (predicate(node)) {\n last = {\n node,\n pos: parent.pos + 1 + pos,\n };\n }\n });\n return last;\n}\n\nexport function nodeIsActive(state: EditorState, type: NodeType, attrs = {}) {\n const predicate = (n: ProsemirrorNode) => n.type === type;\n const node = findSelectedNodeOfType(type)(state.selection) || findParentNode(predicate)(state.selection);\n\n if (!Object.keys(attrs).length || !node) {\n return !!node;\n }\n\n return node.node.hasMarkup(type, attrs);\n}\n\nexport function canInsertNode(context: EditorState | Selection, nodeType: NodeType) {\n const selection = asSelection(context);\n const $from = selection.$from;\n return canInsertNodeAtPos($from, nodeType);\n}\n\nexport function canInsertNodeAtPos($pos: ResolvedPos, nodeType: NodeType) {\n for (let d = $pos.depth; d >= 0; d--) {\n const index = $pos.index(d);\n if ($pos.node(d).canReplaceWith(index, index, nodeType)) {\n return true;\n }\n }\n return false;\n}\n\nexport function canInsertTextNode(context: EditorState | Selection) {\n const selection = asSelection(context);\n return canInsertNode(selection, selection.$head.parent.type.schema.nodes.text);\n}\n\nexport function insertAndSelectNode(view: EditorView, node: ProsemirrorNode) {\n // create new transaction\n const tr = view.state.tr;\n\n // insert the node over the existing selection\n tr.ensureMarks(node.marks);\n tr.replaceSelectionWith(node);\n\n // set selection to inserted node (or don't if our selection calculate was off,\n // as can happen when we insert into a list bullet)\n const selectionPos = tr.doc.resolve(tr.mapping.map(view.state.selection.from, -1));\n const selectionNode = tr.doc.nodeAt(selectionPos.pos);\n if (selectionNode && selectionNode.type === node.type) {\n tr.setSelection(new NodeSelection(selectionPos));\n }\n\n // dispatch transaction\n view.dispatch(tr);\n}\n\nexport function editingRootNode(selection: Selection) {\n const schema = selection.$head.node().type.schema;\n return findParentNodeOfType(schema.nodes.body)(selection) || findParentNodeOfType(schema.nodes.note)(selection);\n}\n\nexport function editingRootNodeClosestToPos($pos: ResolvedPos) {\n const schema = $pos.node().type.schema;\n return (\n findParentNodeOfTypeClosestToPos($pos, schema.nodes.body) ||\n findParentNodeOfTypeClosestToPos($pos, schema.nodes.note)\n );\n}\n\nexport function editingRootScrollContainerElement(view: EditorView) {\n const editingNode = editingRootNode(view.state.selection);\n if (editingNode) {\n const editingEl = view.domAtPos(editingNode.pos + 1).node;\n return editingEl.parentElement;\n } else {\n return undefined;\n }\n}\n\nfunction asSelection(context: EditorState | Selection) {\n return context instanceof EditorState ? context.selection : context;\n}\n","/*\n * link.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { findChildren, findChildrenByType } from 'prosemirror-utils';\n\nexport const kLinkTargetUrl = 0;\nexport const kLinkTargetTitle = 1;\n\nexport const kLinkAttr = 0;\nexport const kLinkChildren = 1;\nexport const kLinkTarget = 2;\n\nexport enum LinkType {\n URL = 0,\n Heading = 1,\n ID = 2,\n}\n\nexport interface LinkCapabilities {\n headings: boolean;\n attributes: boolean;\n text: boolean;\n}\n\nexport interface LinkTargets {\n readonly ids: string[];\n readonly headings: LinkHeadingTarget[];\n}\n\nexport interface LinkHeadingTarget {\n readonly level: number;\n readonly text: string;\n}\n\nexport async function linkTargets(doc: ProsemirrorNode) {\n const ids = findChildren(doc, node => !!node.attrs.id).map(value => value.node.attrs.id);\n\n const headings = findChildrenByType(doc, doc.type.schema.nodes.heading).map(heading => ({\n level: heading.node.attrs.level,\n text: heading.node.textContent,\n }));\n\n return {\n ids,\n headings,\n };\n}\n","/*\n * html.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema, DOMSerializer, Fragment } from 'prosemirror-model';\n\nexport const kHTMLCommentRegEx = /(?:^|[^`])(<!--([\\s\\S]*?)-->)/;\n\nexport function isHTMLComment(html: string) {\n return !!html.match(kHTMLCommentRegEx);\n}\n\nexport function isSingleLineHTML(html: string) {\n return html.trimRight().split('\\n').length === 1;\n}\n\nexport function asHTMLTag(\n tag: string,\n attribs: { [key: string]: string },\n selfClosing = false,\n noEmptyAttribs = false,\n) {\n const attribsHTML = Object.keys(attribs)\n .filter(name => !noEmptyAttribs || attribs[name])\n .map(name => `${name}=\"${escapeHTMLAttribute(attribs[name])}\"`)\n .join(' ');\n return `<${tag} ${attribsHTML}${selfClosing ? '/' : ''}>`;\n}\n\nexport function escapeHTMLAttribute(value: string) {\n return value\n .replace(/&/g, '&') // must be first replacement\n .replace(/'/g, ''')\n .replace(/\"/g, '"')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n}\n\nexport function nodeToHTML(schema: Schema, node: ProsemirrorNode) {\n return generateHTML(() => DOMSerializer.fromSchema(schema).serializeNode(node));\n}\n\nexport function fragmentToHTML(schema: Schema, fragment: Fragment) {\n return generateHTML(() => DOMSerializer.fromSchema(schema).serializeFragment(fragment));\n}\n\nfunction generateHTML(generator: () => Node | DocumentFragment) {\n const div = document.createElement('div');\n const output = generator();\n div.appendChild(output);\n return div.innerHTML;\n}\n","/*\n * events.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n/**\n * Represents an event type; only a single instance of this should exist per\n * event type (akin to PluginKey) and it should be visible to everyone who wants\n * to subscribe to or emit events of that type. Do not create one of these\n * directly, instead use makeEventType().\n */\nexport interface EventType<TDetail> {\n readonly eventName: string;\n // This field is needed only to prevent TDetail from being ignored by the type\n // checker; if TDetail isn't used, tsc acts as if EventType isn't generic.\n readonly dummy?: TDetail;\n}\n\n/**\n * Type signature of event-handler functions; the TDetail must match with the\n * EventType<TDetail> being subscribed to.\n *\n * (Note that the detail is always optional. I couldn't figure out how to make\n * it mandatory for some event types, forbidden for others, and optional for\n * still others, so it's just optional for everyone.)\n */\nexport type EventHandler<TDetail> = (detail?: TDetail) => void;\n\n/**\n * Generic interface for objects that support eventing.\n *\n * TODO: I don't see a reason why this interface should support both\n * subscription *and* emitting, the latter seems like something private.\n */\nexport interface EditorEvents {\n subscribe<TDetail>(event: EventType<TDetail>, handler: EventHandler<TDetail>): VoidFunction;\n emit<TDetail>(event: EventType<TDetail>, detail?: TDetail): void;\n}\n\n/**\n * Creates a new type of event. Use the TDetail type parameter to indicate the\n * type of data, if any, that event handlers can expect.\n */\nexport function makeEventType<TDetail = void>(eventName: string) {\n return { eventName: `panmirror${eventName}` } as EventType<TDetail>;\n}\n\n/**\n * An implementation of EditorEvents, using the DOM event system.\n */\nexport class DOMEditorEvents implements EditorEvents {\n private readonly el: HTMLElement;\n\n constructor(el: HTMLElement) {\n this.el = el;\n }\n\n public emit<TDetail>(eventType: EventType<TDetail>, detail?: TDetail) {\n // Note: CustomEvent requires polyfill for IE, see\n // https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent\n const event = new CustomEvent(eventType.eventName, { detail });\n return this.el.dispatchEvent(event);\n }\n\n public subscribe<TDetail>(eventType: EventType<TDetail>, handler: EventHandler<TDetail>) {\n const listener = function(this: any, evt: Event) {\n const detail: TDetail | undefined = (evt as CustomEvent).detail;\n handler.call(this, detail);\n };\n this.el.addEventListener(eventType.eventName, listener);\n return () => {\n this.el.removeEventListener(eventType.eventName, listener);\n };\n }\n}\n","/*\n * event-types.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Transaction } from 'prosemirror-state';\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { makeEventType } from './events';\nimport { Navigation } from './navigation';\n\nexport const UpdateEvent = makeEventType('Update');\nexport const OutlineChangeEvent = makeEventType('OutlineChange');\nexport const StateChangeEvent = makeEventType('StateChange');\nexport const ResizeEvent = makeEventType('Resize');\nexport const LayoutEvent = makeEventType('Layout');\nexport const ScrollEvent = makeEventType('Scroll');\nexport const BlurEvent = makeEventType('Blur');\nexport const FocusEvent = makeEventType<ProsemirrorNode>('Focus');\nexport const DispatchEvent = makeEventType<Transaction>('Dispatch');\nexport const NavigateEvent = makeEventType<Navigation>('Navigate');\n","/*\n * pandoc_format.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { PandocServer, PandocExtensions } from './pandoc';\nimport { EditorFormat, kHugoDocType } from './format';\nimport { firstYamlBlock, yamlMetadataNodes } from './yaml';\nimport { findValue } from './object';\n\nexport const kMarkdownFormat = 'markdown';\nexport const kMarkdownPhpextraFormat = 'markdown_phpextra';\nexport const kMarkdownGithubFormat = 'markdown_github';\nexport const kMarkdownMmdFormat = 'markdown_mmd';\nexport const kMarkdownStrictFormat = 'markdown_strict';\nexport const kGfmFormat = 'gfm';\nexport const kCommonmarkFormat = 'commonmark';\nexport const kCommonmarkXFormat = 'commonmark_x';\n\nexport interface PandocFormat {\n mode: string;\n baseName: string;\n fullName: string;\n extensions: PandocExtensions;\n warnings: PandocFormatWarnings;\n}\n\nexport interface PandocFormatWarnings {\n invalidFormat: string;\n invalidOptions: string[];\n}\n\nexport interface PandocFormatConfig {\n mode?: string;\n extensions?: string;\n rmdExtensions?: string;\n wrap?: string;\n doctypes?: string[];\n references_location?: string;\n references_prefix?: string;\n canonical?: boolean;\n}\n\nexport function matchPandocFormatComment(code: string) {\n const magicCommentRegEx = /^<!--\\s+-\\*-([\\s\\S]*?)-\\*-\\s+-->\\s*$/m;\n return code.match(magicCommentRegEx);\n}\n\nexport function pandocFormatConfigFromDoc(doc: ProsemirrorNode, isRmd: boolean) {\n return pandocFormatConfigFromYamlInDoc(doc, isRmd) || pandocFormatConfigFromCommentInDoc(doc) || {};\n}\n\nexport function pandocFormatConfigFromCode(code: string, isRmd: boolean): PandocFormatConfig {\n return pandocFormatConfigFromYamlInCode(code, isRmd) || pandocFormatConfigFromCommentInCode(code) || {};\n}\n\nfunction pandocFormatConfigFromYamlInCode(code: string, isRmd: boolean): PandocFormatConfig | null {\n // get the first yaml block in the file\n const yaml = firstYamlBlock(code);\n\n // did we find yaml?\n if (yaml) {\n // see if we have any md_extensions defined\n let mdExtensions : string | undefined = isRmd ? findValue('md_extensions', yaml?.output) : undefined;\n if (!mdExtensions) {\n // look for quarto 'from'\n const from = findValue('from', yaml);\n if (from) {\n const fromStr = String(from);\n const extensions = fromStr.match(/^\\w+([+-][\\w+-]+)$/);\n if (extensions) {\n mdExtensions = extensions[1];\n }\n }\n }\n\n // see if we have any markdown options defined\n let yamlFormatConfig: PandocFormatConfig | undefined;\n const yamlMarkdownOptions = yaml?.editor_options?.markdown;\n if (yamlMarkdownOptions instanceof Object) {\n yamlFormatConfig = readPandocFormatConfig(yamlMarkdownOptions);\n }\n\n // combine and return\n if (mdExtensions || yamlFormatConfig) {\n const formatConfig: PandocFormatConfig = yamlFormatConfig ? yamlFormatConfig : {};\n if (mdExtensions) {\n formatConfig.extensions = mdExtensions + (formatConfig.extensions || '');\n }\n return formatConfig;\n } else {\n return null;\n }\n } else {\n return null;\n }\n}\n\nfunction pandocFormatConfigFromYamlInDoc(doc: ProsemirrorNode, isRmd: boolean): PandocFormatConfig | null {\n const yamlNodes = yamlMetadataNodes(doc);\n if (yamlNodes.length > 0) {\n return pandocFormatConfigFromYamlInCode(yamlNodes[0].node.textContent, isRmd);\n } else {\n return null;\n }\n}\n\nfunction pandocFormatConfigFromCommentInCode(code: string): PandocFormatConfig | null {\n const keyValueRegEx = /^([^:]+):\\s*(.*)$/;\n const match = matchPandocFormatComment(code);\n if (match) {\n const comment = match[1];\n // split into semicolons\n const fields = comment.split(/\\s*;\\s/).map(field => field.trim());\n const variables: { [key: string]: string } = {};\n fields.forEach(field => {\n const keyValueMatch = field.match(keyValueRegEx);\n if (keyValueMatch) {\n variables[keyValueMatch[1].trim()] = keyValueMatch[2].trim();\n }\n });\n return readPandocFormatConfig(variables);\n } else {\n return null;\n }\n}\n\nfunction pandocFormatConfigFromCommentInDoc(doc: ProsemirrorNode): PandocFormatConfig | null {\n let config: PandocFormatConfig | null = null;\n let foundFirstRawInline = false;\n doc.descendants((node, pos) => {\n // don't search once we've found our target\n if (foundFirstRawInline) {\n return false;\n }\n\n // if it's a text node with a raw-html then scan it for the format comment\n const schema = doc.type.schema;\n if (\n node.isText &&\n schema.marks.raw_html_comment &&\n schema.marks.raw_html_comment.isInSet(node.marks) &&\n node.attrs.format\n ) {\n foundFirstRawInline = true;\n config = pandocFormatConfigFromCommentInCode(node.textContent);\n return false;\n } else {\n return true;\n }\n });\n return config;\n}\n\nfunction readPandocFormatConfig(source: { [key: string]: any }) {\n const asString = (obj: any): string => {\n if (typeof obj === 'string') {\n return obj;\n } else if (obj) {\n return obj.toString();\n } else {\n return '';\n }\n };\n\n const asBoolean = (obj: any) => {\n if (typeof obj === 'boolean') {\n return obj;\n } else {\n const str = asString(obj).toLowerCase();\n return str === 'true' || str === '1';\n }\n };\n\n const readWrap = () => {\n const wrap = source.wrap || source.wrap_column || source['fill-column'];\n if (wrap) {\n return asString(wrap);\n } else {\n return undefined;\n }\n };\n\n const formatConfig: PandocFormatConfig = {};\n if (source.mode) {\n formatConfig.mode = asString(source.mode);\n }\n if (source.extensions) {\n formatConfig.extensions = asString(source.extensions);\n }\n if (source.rmd_extensions) {\n formatConfig.rmdExtensions = asString(source.rmd_extensions);\n }\n formatConfig.wrap = readWrap();\n if (source.doctype) {\n formatConfig.doctypes = asString(source.doctype)\n .split(',')\n .map(str => str.trim());\n }\n if (source.references) {\n if (typeof source.references === 'string') {\n formatConfig.references_location = source.references;\n } else {\n formatConfig.references_location = source.references.location;\n formatConfig.references_prefix = source.references.prefix;\n }\n }\n if (source.canonical) {\n formatConfig.canonical = asBoolean(source.canonical);\n }\n return formatConfig;\n}\n\nexport async function resolvePandocFormat(pandoc: PandocServer, format: EditorFormat): Promise<PandocFormat> {\n // additional markdown variants we support\n const kMarkdownVariants: { [key: string]: string[] } = {\n [kCommonmarkFormat]: commonmarkExtensions(),\n [kCommonmarkXFormat]: commonmarkXExtensions(),\n [kGfmFormat]: gfmExtensions(),\n goldmark: goldmarkExtensions(format),\n blackfriday: blackfridayExtensions(format),\n };\n\n // setup warnings\n const warnings: PandocFormatWarnings = { invalidFormat: '', invalidOptions: [] };\n\n // alias options and basename\n let options = format.pandocExtensions;\n let baseName = format.pandocMode;\n\n // validate the base format (fall back to markdown if it's not known)\n if (\n ![\n kMarkdownFormat,\n kMarkdownPhpextraFormat,\n kMarkdownGithubFormat,\n kMarkdownMmdFormat,\n kMarkdownStrictFormat,\n kGfmFormat,\n kCommonmarkFormat,\n kCommonmarkXFormat\n ]\n .concat(Object.keys(kMarkdownVariants))\n .includes(baseName)\n ) {\n warnings.invalidFormat = baseName;\n baseName = 'markdown';\n }\n\n // format options we will be building\n let formatOptions: string;\n\n // if we are using a variant then get it's base options and merge with user options\n if (kMarkdownVariants[baseName]) {\n const variant = kMarkdownVariants[baseName];\n options = variant.map(option => `${option}`).join('') + options;\n baseName = 'markdown_strict';\n }\n\n // query for format options\n formatOptions = await pandoc.listExtensions(baseName);\n\n // active pandoc extensions\n const pandocExtensions: { [key: string]: boolean } = {};\n\n // first parse extensions for format\n parseExtensions(formatOptions).forEach(option => {\n pandocExtensions[option.name] = option.enabled;\n });\n\n // now parse extensions for user options (validate and build format name)\n const validOptionNames = parseExtensions(formatOptions).map(option => option.name);\n\n let fullName = baseName;\n parseExtensions(options).forEach(option => {\n // validate that the option is valid\n if (validOptionNames.includes(option.name)) {\n // add option\n fullName += (option.enabled ? '+' : '-') + option.name;\n pandocExtensions[option.name] = option.enabled;\n } else {\n warnings.invalidOptions.push(option.name);\n }\n });\n\n // return format name, enabled extensiosn, and warnings\n return {\n mode: format.pandocMode,\n baseName,\n fullName,\n extensions: (pandocExtensions as unknown) as PandocExtensions,\n warnings,\n };\n}\n\nfunction parseExtensions(options: string) {\n // remove any linebreaks\n options = options.split('\\n').join();\n\n // parse into separate entries\n const extensions: Array<{ name: string; enabled: boolean }> = [];\n const re = /([+-])([a-z_]+)/g;\n let match = re.exec(options);\n while (match) {\n extensions.push({ name: match[2], enabled: match[1] === '+' });\n match = re.exec(options);\n }\n\n return extensions;\n}\n\nexport function pandocFormatWith(format: string, prepend: string, append: string) {\n const split = splitPandocFormatString(format);\n return `${split.format}${prepend}${split.options}${append}`;\n}\n\nexport function splitPandocFormatString(format: string) {\n // split out base format from options\n let optionsPos = format.indexOf('-');\n if (optionsPos === -1) {\n optionsPos = format.indexOf('+');\n }\n const base = optionsPos === -1 ? format : format.substr(0, optionsPos);\n const options = optionsPos === -1 ? '' : format.substr(optionsPos);\n return {\n format: base,\n options,\n };\n}\n\nexport function hasFencedCodeBlocks(pandocExtensions: PandocExtensions) {\n return pandocExtensions.backtick_code_blocks || pandocExtensions.fenced_code_blocks;\n}\n\n// e.g. [My Heading] to link to ## My Heading\nexport function hasShortcutHeadingLinks(pandocExtensions: PandocExtensions) {\n return pandocExtensions.implicit_header_references && pandocExtensions.shortcut_reference_links;\n}\n\nfunction commonmarkExtensions(rawHTML = true) {\n const extensions = [\n rawHTML ? '+raw_html' : '-raw_html',\n '+all_symbols_escapable',\n '+backtick_code_blocks',\n '+fenced_code_blocks',\n '+space_in_atx_header',\n '+intraword_underscores',\n '+lists_without_preceding_blankline',\n '+shortcut_reference_links',\n ];\n return extensions;\n}\n\n// https://github.com/jgm/pandoc/commit/0aed9dd589189a9bbe5cae99e0e024e2d4a92c36\nfunction commonmarkXExtensions() {\n const extensions = [\n '+pipe_tables',\n '+raw_html',\n '+auto_identifiers',\n '+strikeout',\n '+task_lists',\n '+emoji',\n '+raw_tex',\n '+smart',\n '+tex_math_dollars',\n '+superscript',\n '+subscript',\n '+definition_lists',\n '+footnotes',\n '+fancy_lists',\n '+fenced_divs',\n '+bracketed_spans',\n '+raw_attribute',\n '+implicit_header_references',\n // '+attributes' (not yet)\n ];\n return extensions;\n}\n\nfunction gfmExtensions() {\n const extensions = [\n ...commonmarkExtensions(),\n '+auto_identifiers',\n '+autolink_bare_uris',\n '+emoji',\n '+gfm_auto_identifiers',\n '+pipe_tables',\n '+strikeout',\n '+task_lists',\n '+tex_math_dollars',\n '+footnotes'\n ];\n return extensions;\n}\n\n// https://gohugo.io/getting-started/configuration-markup/#goldmark\n// https://github.com/yuin/goldmark/#html-renderer-options\nfunction goldmarkExtensions(format: EditorFormat) {\n const extensions = [\n // start with commonmark\n ...commonmarkExtensions(false),\n\n // adds most of gfm\n '+pipe_tables',\n '+strikeout',\n '+autolink_bare_uris',\n '+task_lists',\n '+backtick_code_blocks',\n\n // plus some extras\n '+definition_lists',\n '+footnotes',\n '+smart',\n\n // hugo preprocessor supports yaml metadata\n '+yaml_metadata_block',\n ];\n\n if (includeTexMathDollars(format)) {\n extensions.push('+tex_math_dollars');\n }\n\n return extensions;\n}\n\n// https://github.com/russross/blackfriday/tree/v2#extensions\nfunction blackfridayExtensions(format: EditorFormat) {\n const extensions = [\n '+intraword_underscores',\n '+pipe_tables',\n '+backtick_code_blocks',\n '+definition_lists',\n '+footnotes',\n '+autolink_bare_uris',\n '+strikeout',\n '+smart',\n '+yaml_metadata_block',\n ];\n\n if (includeTexMathDollars(format)) {\n extensions.push('+tex_math_dollars');\n }\n\n return extensions;\n}\n\nfunction includeTexMathDollars(format: EditorFormat) {\n // hugo users often sort out some way to include math so we enable it for hugo\n return format.docTypes.includes(kHugoDocType) || format.rmdExtensions.blogdownMathInCode;\n}\n","/*\n * yaml.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { NodeWithPos } from 'prosemirror-utils';\nimport { EditorView } from 'prosemirror-view';\nimport { EditorState } from 'prosemirror-state';\n\nimport yaml from 'js-yaml';\n\nimport { findTopLevelBodyNodes } from './node';\nimport { logException } from './log';\n\nexport const kYamlMetadataTitleRegex = /\\ntitle:(.*)\\n/;\n\n// return yaml front matter (w/o enclosing --)\nexport function yamlFrontMatter(doc: ProsemirrorNode) {\n const firstYaml = firstYamlNode(doc);\n if (firstYaml) {\n return stripYamlDelimeters(firstYaml.node.textContent);\n } else {\n return '';\n }\n}\n\n// set yaml front matter (w/o enclosing ---)\nexport function applyYamlFrontMatter(view: EditorView, yamlText: string) {\n const schema = view.state.schema;\n const updatedYaml = `---\\n${yamlText}---`;\n const updatedYamlNode = schema.nodes.yaml_metadata.createAndFill({}, schema.text(updatedYaml));\n const tr = view.state.tr;\n const firstYaml = firstYamlNode(view.state.doc);\n if (firstYaml) {\n tr.replaceRangeWith(firstYaml.pos, firstYaml.pos + firstYaml.node.nodeSize, updatedYamlNode);\n } else {\n tr.insert(1, updatedYamlNode);\n }\n view.dispatch(tr);\n}\n\nexport function yamlMetadataNodes(doc: ProsemirrorNode) {\n return findTopLevelBodyNodes(doc, isYamlMetadataNode);\n}\n\nexport function isYamlMetadataNode(node: ProsemirrorNode) {\n return node.type === node.type.schema.nodes.yaml_metadata;\n}\n\nexport function titleFromState(state: EditorState) {\n const yamlNodes = yamlMetadataNodes(state.doc);\n for (const yamlNode of yamlNodes) {\n const title = titleFromYamlMetadataNode(yamlNode.node);\n if (title) {\n return title;\n }\n }\n return '';\n}\n\nexport function titleFromYamlMetadataNode(node: ProsemirrorNode) {\n const titleMatch = node.textContent.match(kYamlMetadataTitleRegex);\n if (titleMatch) {\n let title = titleMatch[1].trim();\n title = title.replace(/^[\"']|[\"']$/g, '');\n title = title.replace(/\\\\\"/g, '\"');\n title = title.replace(/''/g, \"'\");\n return title;\n } else {\n return null;\n }\n}\n\nexport function valueFromYamlText(name: string, yamlText: string) {\n // Must start and end with either a new line or the start/end of line\n const yamlMetadataNameValueRegex = new RegExp(`(?:\\\\n|^)${name}:(.*)(?:\\\\n|$)`);\n\n // Find the name and value\n const valueMatch = yamlText.match(yamlMetadataNameValueRegex);\n if (valueMatch) {\n // Read the matched value\n const valueStr = valueMatch[1].trim();\n\n // Parse the value (could be string, array, etc...)\n const value = parseYaml(valueStr);\n return value;\n } else {\n return null;\n }\n}\n\nconst kFirstYamlBlockRegex = /\\s*---[ \\t]*\\n(?![ \\t]*\\n)([\\W\\w]*?)\\n[\\t >]*(?:---|\\.\\.\\.)[ \\t]*/m;\n\nexport function firstYamlBlock(code: string): { [key: string]: any } | null {\n const match = code.match(kFirstYamlBlockRegex);\n if (match && match.index === 0) {\n const yamlCode = match[1];\n const yamlParsed = parseYaml(yamlCode);\n if (typeof yamlParsed === 'object') {\n return yamlParsed;\n } else {\n return null;\n }\n } else {\n return null;\n }\n}\n\nexport function parseYaml(yamlCode: string) : unknown {\n try {\n \n const yamlParsed = yaml.load(yamlCode, {\n onWarning: logException,\n });\n return yamlParsed;\n } catch (e) {\n logException(e);\n return null;\n }\n}\n\nexport function toYamlCode(obj: any): string | null {\n try {\n const yamlCode = yaml.dump(obj);\n return yamlCode;\n } catch (e) {\n logException(e);\n return null;\n }\n}\n\nexport function stripYamlDelimeters(yamlCode: string) {\n return yamlCode.replace(/^[ \\t-]+\\n/, '').replace(/\\n[ \\t-\\.]+$/, '');\n}\n\nexport interface ParsedYaml {\n yamlCode: string;\n yaml: any;\n node: NodeWithPos;\n}\n\nexport function parseYamlNodes(doc: ProsemirrorNode): ParsedYaml[] {\n const yamlNodes = yamlMetadataNodes(doc);\n\n const parsedYamlNodes = yamlNodes.map<ParsedYaml>(node => {\n const yamlText = node.node.textContent;\n const yamlCode = stripYamlDelimeters(yamlText);\n return { yamlCode, yaml: parseYaml(yamlCode), node };\n });\n return parsedYamlNodes;\n}\n\nfunction firstYamlNode(doc: ProsemirrorNode) {\n const yamlNodes = yamlMetadataNodes(doc);\n if (yamlNodes && yamlNodes.length > 0) {\n return yamlNodes[0];\n } else {\n return '';\n }\n}\n","/*\n * format.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport interface EditorFormat {\n readonly pandocMode: string;\n readonly pandocExtensions: string;\n readonly rmdExtensions: EditorRmdExtensions;\n readonly hugoExtensions: EditorHugoExtensions;\n readonly docTypes: EditorExtendedDocType[];\n}\n\nexport interface EditorRmdExtensions {\n readonly codeChunks?: boolean;\n readonly bookdownXRef?: boolean;\n readonly bookdownXRefUI?: boolean;\n readonly bookdownPart?: boolean;\n readonly blogdownMathInCode?: boolean;\n}\n\nexport interface EditorHugoExtensions {\n readonly shortcodes?: boolean;\n}\n\nexport const kBookdownDocType = 'bookdown';\nexport const kHugoDocType = 'hugo';\nexport const kQuartoDocType = 'quarto';\nexport const kPresentationDocType = 'presentation';\n\nexport type EditorExtendedDocType = 'bookdown' | 'hugo' | 'quarto' | 'presentation';\n","/*\n * object.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport function findValue(key: string, object?: { [key: string]: any }) {\n if (!object) {\n return undefined;\n }\n\n let value;\n\n Object.keys(object).some(k => {\n if (k === key) {\n value = object[k];\n return true;\n }\n if (object[k] && typeof object[k] === 'object') {\n value = findValue(key, object[k]);\n return value !== undefined;\n }\n return false;\n });\n\n return value;\n}\n","/*\n * log.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport function logException(e: Error) {\n // TODO: log exceptions (we don't want to use console.log in production code, so this would\n // utilize some sort of external logging facility)\n // console.log(e);\n}\n","/*\n * basekeys.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport {\n splitBlock,\n liftEmptyBlock,\n createParagraphNear,\n selectNodeBackward,\n joinBackward,\n deleteSelection,\n selectNodeForward,\n joinForward,\n chainCommands,\n} from 'prosemirror-commands';\nimport { undoInputRule } from 'prosemirror-inputrules';\nimport { keymap } from 'prosemirror-keymap';\nimport { EditorState, Transaction, Plugin, Selection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { CommandFn } from './command';\nimport { editingRootNodeClosestToPos, editingRootNode } from './node';\nimport { selectionIsBodyTopLevel } from './selection';\nimport { kPlatformMac } from './platform';\n\nexport enum BaseKey {\n Home = 'Home',\n End = 'End',\n Enter = 'Enter',\n ModEnter = 'Mod-Enter',\n ShiftEnter = 'Shift-Enter',\n Backspace = 'Backspace',\n Delete = 'Delete|Mod-Delete', // Use pipes to register multiple commands\n Tab = 'Tab',\n ShiftTab = 'Shift-Tab',\n ArrowUp = 'Up|ArrowUp',\n ArrowDown = 'Down|ArrowDown',\n ArrowLeft = 'Left|ArrowLeft',\n ArrowRight = 'Right|ArrowRight',\n ModArrowUp = 'Mod-Up|Mod-ArrowUp',\n ModArrowDown = 'Mod-Down|Mod-ArrowDown',\n CtrlHome = 'Ctrl-Home',\n CtrlEnd = 'Ctrl-End',\n ShiftArrowLeft = 'Shift-Left|Shift-ArrowLeft',\n ShiftArrowRight = 'Shift-Right|Shift-ArrowRight',\n AltArrowLeft = 'Alt-Left|Alt-ArrowLeft',\n AltArrowRight = 'Alt-Right|Alt-ArrowRight',\n CtrlArrowLeft = 'Ctrl-Left|Ctrl-ArrowLeft',\n CtrlArrowRight = 'Ctrl-Right|Ctrl-ArrowRight',\n CtrlShiftArrowLeft = 'Ctrl-Shift-Left|Ctrl-Shift-ArrowLeft',\n CtrlShiftArrowRight = 'Ctrl-Shift-Right|Ctrl-Shift-ArrowRight',\n}\n\nexport interface BaseKeyBinding {\n key: BaseKey;\n command: CommandFn;\n}\n\nexport function baseKeysPlugin(keys: readonly BaseKeyBinding[]): Plugin {\n // collect all keys\n const pluginKeys = [\n // base enter key behaviors\n { key: BaseKey.Enter, command: splitBlock },\n { key: BaseKey.Enter, command: liftEmptyBlock },\n { key: BaseKey.Enter, command: createParagraphNear },\n\n // base backspace key behaviors\n { key: BaseKey.Backspace, command: selectNodeBackward },\n { key: BaseKey.Backspace, command: joinBackward },\n { key: BaseKey.Backspace, command: deleteSelection },\n\n // base tab key behavior (ignore)\n { key: BaseKey.Tab, command: ignoreKey },\n { key: BaseKey.ShiftTab, command: ignoreKey },\n\n // base delete key behaviors\n { key: BaseKey.Delete, command: selectNodeForward },\n { key: BaseKey.Delete, command: joinForward },\n { key: BaseKey.Delete, command: deleteSelection },\n\n // base home/end key behaviors (Mac desktop default behavior advances to beginning/end of\n // document, so we provide our own implementation rather than relying on contentEditable)\n kPlatformMac ? { key: BaseKey.Home, command: homeKey } : null,\n kPlatformMac ? { key: BaseKey.End, command: endKey } : null,\n\n // base arrow key behavior (prevent traversing top-level body notes)\n { key: BaseKey.ArrowLeft, command: arrowBodyNodeBoundary('left') },\n { key: BaseKey.ArrowUp, command: arrowBodyNodeBoundary('up') },\n { key: BaseKey.ArrowRight, command: arrowBodyNodeBoundary('right') },\n { key: BaseKey.ArrowDown, command: arrowBodyNodeBoundary('down') },\n { key: BaseKey.ModArrowDown, command: endTopLevelBodyNodeBoundary() },\n { key: BaseKey.CtrlEnd, command: endTopLevelBodyNodeBoundary() },\n\n // merge keys provided by extensions\n ...keys,\n\n // undoInputRule is always the highest priority backspace key\n { key: BaseKey.Backspace, command: undoInputRule },\n ].filter(x => !!x);\n\n // build arrays for each BaseKey type\n const commandMap: { [key: string]: CommandFn[] } = {};\n for (const baseKey of Object.values(BaseKey)) {\n commandMap[baseKey] = [];\n }\n pluginKeys.forEach(key => {\n if (key) {\n commandMap[key.key].unshift(key.command);\n }\n });\n\n const bindings: { [key: string]: CommandFn } = {};\n for (const baseKey of Object.values(BaseKey)) {\n const commands = commandMap[baseKey];\n // baseKey may contain multiple keys, separated by |\n for (const subkey of baseKey.split(/\\|/)) {\n bindings[subkey] = chainCommands(...commands);\n }\n }\n\n // return keymap\n return keymap(bindings);\n}\n\nexport function verticalArrowCanAdvanceWithinTextBlock(selection: Selection, dir: 'up' | 'down') {\n const $head = selection.$head;\n const node = $head.node();\n if (node.isTextblock) {\n const cursorOffset = $head.parentOffset;\n const nodeText = node.textContent;\n if (dir === 'down' && nodeText.substr(cursorOffset).includes('\\n')) {\n return true;\n }\n if (dir === 'up' && nodeText.substr(0, cursorOffset).includes('\\n')) {\n return true;\n }\n }\n return false;\n}\n\ninterface Coords {\n left: number;\n right: number;\n top: number;\n bottom: number;\n}\n\nfunction ignoreKey(state: EditorState, dispatch?: (tr: Transaction) => void) {\n return true;\n}\n\nfunction homeKey(state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) {\n const selection = state.selection;\n const editingNode = editingRootNode(selection);\n if (editingNode && dispatch && view) {\n const head = view.coordsAtPos(selection.head);\n const beginDocPos = editingNode.start;\n for (let pos = selection.from - 1; pos >= beginDocPos; pos--) {\n const coords = view.coordsAtPos(pos);\n if (isOnPreviousLine(head, coords) || pos === beginDocPos) {\n const tr = state.tr;\n setTextSelection(pos + 1)(tr);\n dispatch(tr);\n break;\n }\n }\n }\n return true;\n}\n\nfunction endKey(state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) {\n const selection = state.selection;\n const editingNode = editingRootNode(selection);\n if (editingNode && dispatch && view) {\n const head = view.coordsAtPos(selection.head);\n const endDocPos = editingNode.start + editingNode.node.nodeSize;\n for (let pos = selection.from + 1; pos < endDocPos; pos++) {\n const coords = view.coordsAtPos(pos);\n if (isOnNextLine(head, coords) || pos === endDocPos) {\n const tr = state.tr;\n setTextSelection(pos - 1)(tr);\n dispatch(tr);\n break;\n }\n }\n }\n return true;\n}\n\n// helpers to check for a y coordinate on a diffent line that the selection\n\n// y coorinates are sometimes off by 1 or 2 due to margin/padding (e.g. for\n// inline code spans or spelling marks) so the comparision only succeeds if\n// the vertical extents of the two coords don't overlap. If this proves to\n// still have false positives, we could lookahead to the next a few dozen\n// positions to check if we ever \"return to\" the head's baseline--only a\n// permanent change would indicate that the line has truly changed.\n\nfunction isOnNextLine(head: Coords, pos: Coords) {\n return head.bottom < pos.top;\n}\n\nfunction isOnPreviousLine(head: Coords, pos: Coords) {\n return head.top > pos.bottom;\n}\n\nfunction arrowBodyNodeBoundary(dir: 'up' | 'down' | 'left' | 'right') {\n return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n if (view && view.endOfTextblock(dir) && selectionIsBodyTopLevel(state.selection)) {\n const side = dir === 'left' || dir === 'up' ? -1 : 1;\n const $head = state.selection.$head;\n const nextPos = Selection.near(state.doc.resolve(side > 0 ? $head.after() : $head.before()), side);\n const currentRootNode = editingRootNodeClosestToPos($head);\n const nextRootNode = editingRootNodeClosestToPos(nextPos.$head);\n return currentRootNode?.node?.type !== nextRootNode?.node?.type;\n } else {\n return false;\n }\n };\n}\n\nfunction endTopLevelBodyNodeBoundary() {\n return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n const editingNode = editingRootNode(state.selection);\n if (editingNode && selectionIsBodyTopLevel(state.selection)) {\n if (dispatch) {\n const tr = state.tr;\n setTextSelection(editingNode.pos + editingNode.node.nodeSize - 2)(tr).scrollIntoView();\n dispatch(tr);\n }\n return true;\n } else {\n return false;\n }\n };\n}\n","/*\n * selection.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Selection, NodeSelection } from 'prosemirror-state';\nimport { Schema } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\nimport { GapCursor } from 'prosemirror-gapcursor';\n\nimport { NodeWithPos, setTextSelection } from 'prosemirror-utils';\n\nimport { kAddToHistoryTransaction, kRestoreLocationTransaction } from './transaction';\nimport { editingRootNode } from './node';\n\nexport function selectionIsWithin(selection: Selection, nodeWithPos: NodeWithPos) {\n const from = nodeWithPos.pos + 1;\n const to = from + nodeWithPos.node.nodeSize;\n return selectionIsWithinRange(selection, { from, to });\n}\n\nexport function selectionHasRange(selection: Selection, range: { from: number; to: number }) {\n return selection.from === range.from && selection.to === range.to;\n}\n\nexport function selectionIsWithinRange(selection: Selection, range: { from: number; to: number }) {\n return selection.anchor >= range.from && selection.anchor <= range.to;\n}\n\nexport function selectionIsBodyTopLevel(selection: Selection) {\n const { $head } = selection;\n const parentNode = $head.node($head.depth - 1);\n return parentNode && \n (parentNode.type === parentNode.type.schema.nodes.body ||\n (selection instanceof GapCursor && parentNode.type === parentNode.type.schema.nodes.doc));\n}\n\nexport function selectionIsImageNode(schema: Schema, selection: Selection) {\n return selection instanceof NodeSelection && [schema.nodes.image, schema.nodes.figure].includes(selection.node.type);\n}\n\nexport function selectionIsEmptyParagraph(schema: Schema, selection: Selection) {\n const { $head } = selection;\n return $head.parent.type === schema.nodes.paragraph && $head.parent.childCount === 0;\n}\n\nexport function selectionWithinLastBodyParagraph(selection: Selection) {\n if (selectionIsBodyTopLevel(selection)) {\n const editingRoot = editingRootNode(selection);\n if (editingRoot) {\n const node = selection.$head.node();\n return node === editingRoot.node.lastChild && node.type === node.type.schema.nodes.paragraph;\n }\n }\n return false;\n}\n\nexport function restoreSelection(view: EditorView, pos: number) {\n const tr = view.state.tr;\n if (pos < view.state.doc.nodeSize) {\n setTextSelection(pos)(tr);\n tr.setMeta(kAddToHistoryTransaction, false);\n tr.setMeta(kRestoreLocationTransaction, true);\n view.dispatch(tr);\n }\n}\n","/*\n * transaction.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Transaction, EditorState, Plugin, PluginKey, Selection } from 'prosemirror-state';\nimport { Node as ProsemirrorNode, Mark, MarkType, Slice } from 'prosemirror-model';\nimport { ChangeSet } from 'prosemirror-changeset';\nimport { ReplaceStep, Step, Transform } from 'prosemirror-transform';\n\nimport { sliceContentLength } from './slice';\n\nexport const kPasteTransaction = 'paste';\nexport const kSetMarkdownTransaction = 'setMarkdown';\nexport const kAddToHistoryTransaction = 'addToHistory';\nexport const kFixupTransaction = 'docFixup';\nexport const kRestoreLocationTransaction = 'restoreLocation';\nexport const kNavigationTransaction = 'navigationTransaction';\nexport const kInsertSymbolTransaction = 'insertSymbol';\nexport const kInsertCompletionTransaction = 'insertCompletion';\n\nexport type TransactionsFilter = (transactions: Transaction[], oldState: EditorState, newState: EditorState) => boolean;\n\nexport type TransactionNodeFilter = (\n node: ProsemirrorNode<any>,\n pos: number,\n parent: ProsemirrorNode<any>,\n index: number,\n) => boolean;\n\nexport interface AppendTransactionHandler {\n name: string;\n filter?: TransactionsFilter;\n nodeFilter?: TransactionNodeFilter;\n append: (tr: Transaction, transactions: Transaction[], oldState: EditorState, newState: EditorState) => void;\n}\n\n// wrapper for transaction that is guaranteed not to modify the position of any\n// nodes in the document (useful for grouping many disparate handlers that arne't\n// aware of each other's actions onto the same trasaction)\nexport class MarkTransaction {\n private tr: Transaction;\n\n constructor(tr: Transaction) {\n this.tr = tr;\n }\n get doc(): ProsemirrorNode {\n return this.tr.doc;\n }\n get selection(): Selection {\n return this.tr.selection;\n }\n public addMark(from: number, to: number, mark: Mark): this {\n this.tr.addMark(from, to, mark);\n return this;\n }\n public removeMark(from: number, to: number, mark?: Mark | MarkType): this {\n this.tr.removeMark(from, to, mark);\n return this;\n }\n public removeStoredMark(mark: Mark | MarkType): this {\n this.tr.removeStoredMark(mark);\n return this;\n }\n public insertText(text: string, from: number): this {\n this.tr.insertText(text, from, from + text.length);\n return this;\n }\n}\n\nexport interface AppendMarkTransactionHandler {\n name: string;\n filter: (node: ProsemirrorNode, transactions: Transaction[]) => boolean;\n append: (tr: MarkTransaction, node: ProsemirrorNode, pos: number, state: EditorState) => void;\n}\n\nexport function appendMarkTransactionsPlugin(handlers: readonly AppendMarkTransactionHandler[]): Plugin {\n return new Plugin({\n key: new PluginKey('appendMarkTransactions'),\n\n appendTransaction: (transactions: Transaction[], oldState: EditorState, newState: EditorState) => {\n // skip for selection-only changes\n if (!transactionsDocChanged(transactions)) {\n return;\n }\n\n // create transaction\n const tr = newState.tr;\n\n // create markTransaction wrapper\n const markTr = new MarkTransaction(tr);\n\n forChangedNodes(\n oldState,\n newState,\n node => true,\n (node: ProsemirrorNode, pos: number) => {\n for (const handler of handlers) {\n // get a fresh view of the node\n node = tr.doc.nodeAt(pos)!;\n\n // call the handler\n if (handler.filter(node, transactions)) {\n handler.append(markTr, node, pos, newState);\n }\n }\n },\n );\n\n // return transaction\n if (tr.docChanged || tr.selectionSet || tr.storedMarksSet) {\n return tr;\n }\n },\n });\n}\n\nexport function appendTransactionsPlugin(handlers: readonly AppendTransactionHandler[]): Plugin {\n return new Plugin({\n key: new PluginKey('appendTransactions'),\n\n appendTransaction: (transactions: Transaction[], oldState: EditorState, newState: EditorState) => {\n // skip for selection-only changes\n if (!transactionsDocChanged(transactions)) {\n return;\n }\n\n // create transaction\n const tr = newState.tr;\n\n // compute the changeSet\n if (transactionsAreTypingChange(transactions)) {\n const changeSet = transactionsChangeSet(transactions, oldState, newState);\n\n // call each handler\n for (const handler of handlers) {\n // track whether there is a change\n let haveChange = false;\n\n // call filters if we have them\n if (handler.filter || handler.nodeFilter) {\n // first the low-level transaction filter\n if (handler.filter) {\n haveChange = handler.filter(transactions, oldState, newState);\n }\n\n // if that doesn't detect a change then try the nodeFilter if we have one\n if (!haveChange && handler.nodeFilter) {\n const checkForChange = (\n node: ProsemirrorNode<any>,\n pos: number,\n parent: ProsemirrorNode<any>,\n index: number,\n ) => {\n if (handler.nodeFilter!(node, pos, parent, index)) {\n haveChange = true;\n return false;\n }\n };\n\n for (const change of changeSet.changes) {\n oldState.doc.nodesBetween(change.fromA, change.toA, checkForChange);\n newState.doc.nodesBetween(change.fromB, change.toB, checkForChange);\n }\n }\n\n // no filters means we should always run (force haveChange to true)\n } else {\n haveChange = true;\n }\n\n // run the handler if applicable\n if (haveChange) {\n handler.append(tr, transactions, oldState, newState);\n }\n }\n\n // run them all if this is a larger change\n } else {\n handlers.forEach(handler => handler.append(tr, transactions, oldState, newState));\n }\n\n // return transaction\n if (tr.docChanged || tr.selectionSet || tr.storedMarksSet) {\n return tr;\n }\n },\n });\n}\n\nexport function transactionsDocChanged(transactions: Transaction[]) {\n return transactions.some(transaction => transaction.docChanged);\n}\n\nexport function transactionsChangeSet(transactions: Transaction[], oldState: EditorState, newState: EditorState) {\n let changeSet = ChangeSet.create(oldState.doc);\n for (const transaction of transactions) {\n changeSet = changeSet.addSteps(newState.doc, transaction.mapping.maps);\n }\n return changeSet;\n}\n\nexport function trTransform(tr: Transaction, f: (transform: Transform) => void): Transaction {\n // create a new transform so we can do position mapping relative\n // to the actions taken here (b/c the transaction might already\n // have other steps so we can't do tr.mapping.map)\n const newActions = new Transform(tr.doc);\n\n // call the function (passing it a mapping function that uses our newActions)\n f(newActions);\n\n // copy the contents of newActions to the actual transaction\n for (const step of newActions.steps) {\n tr.step(step);\n }\n\n // return the transaction for chaining\n return tr;\n}\n\nexport function transactionsHaveChange(\n transactions: Transaction[],\n oldState: EditorState,\n newState: EditorState,\n predicate: (node: ProsemirrorNode<any>, pos: number, parent: ProsemirrorNode<any>, index: number) => boolean,\n) {\n // screen out transactions with no doc changes\n if (!transactionsDocChanged(transactions)) {\n return false;\n }\n\n // function to check for whether we have a change and set a flag if we do\n let haveChange = false;\n const checkForChange = (node: ProsemirrorNode<any>, pos: number, parent: ProsemirrorNode<any>, index: number) => {\n if (predicate(node, pos, parent, index)) {\n haveChange = true;\n return false;\n }\n };\n\n // for each change in each transaction, check for a node that matches the predicate in either the old or new doc\n const changeSet = transactionsChangeSet(transactions, oldState, newState);\n\n for (const change of changeSet.changes) {\n oldState.doc.nodesBetween(change.fromA, change.toA, checkForChange);\n newState.doc.nodesBetween(change.fromB, change.toB, checkForChange);\n if (haveChange) {\n break;\n }\n }\n\n return haveChange;\n}\n\nexport function forChangedNodes(\n oldState: EditorState | null,\n newState: EditorState,\n predicate: (node: ProsemirrorNode) => boolean,\n f: (node: ProsemirrorNode, pos: number) => boolean | void,\n) {\n let complete = false;\n const handler = (node: ProsemirrorNode, pos: number) => {\n if (complete) {\n return;\n }\n\n if (!predicate || predicate(node)) {\n if (f(node, pos) === false) {\n complete = true;\n }\n }\n };\n\n if (!oldState) {\n newState.doc.descendants(handler);\n } else if (oldState.doc !== newState.doc) {\n changedDescendants(oldState.doc, newState.doc, 0, handler);\n }\n}\n\n// Helper for iterating through the nodes in a document that changed\n// compared to the given previous document. Useful for avoiding\n// duplicate work on each transaction.\n// from: https://github.com/ProseMirror/prosemirror-tables/blob/master/src/fixtables.js\nfunction changedDescendants(\n old: ProsemirrorNode,\n cur: ProsemirrorNode,\n offset: number,\n f: (node: ProsemirrorNode, pos: number) => void,\n) {\n const oldSize = old.childCount;\n const curSize = cur.childCount;\n outer: for (let i = 0, j = 0; i < curSize; i++) {\n const child = cur.child(i);\n for (let scan = j, e = Math.min(oldSize, i + 3); scan < e; scan++) {\n if (old.child(scan) === child) {\n j = scan + 1;\n offset += child.nodeSize;\n continue outer;\n }\n }\n f(child, offset);\n if (j < oldSize && old.child(j).sameMarkup(child)) {\n changedDescendants(old.child(j), child, offset + 1, f);\n } else {\n child.nodesBetween(0, child.content.size, f, offset + 1);\n }\n offset += child.nodeSize;\n }\n}\n\nexport function transactionsAreTypingChange(transactions: Transaction[]) {\n if (\n transactions.length === 1 &&\n transactions[0].steps.length === 1 &&\n transactions[0].steps[0] instanceof ReplaceStep\n ) {\n // step to examine\n const step: any = transactions[0].steps[0];\n\n // insert single chraracter or new empty slice (e.g. from enter after a paragraph)\n if (step.from === step.to && sliceContentLength(step.slice) <= 1) {\n return true;\n }\n\n // remove single character\n if (Math.abs(step.from - step.to) === 1 && step.slice.content.size === 0) {\n return true;\n }\n }\n\n return false;\n}\n\nexport interface RangeStep extends Step {\n from: number;\n to: number;\n}\n\nexport interface SliceStep extends RangeStep {\n slice: Slice;\n}\n","/*\n * slice.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Slice, Node as ProsemirrorNode } from 'prosemirror-model';\n\nexport function sliceContentLength(slice: Slice) {\n let length = 0;\n for (let i = 0; i < slice.content.childCount; i++) {\n length += slice.content.child(i).textContent.length;\n }\n return length;\n}\n\nexport function sliceHasNode(slice: Slice, predicate: (node: ProsemirrorNode) => boolean) {\n let hasNode = false;\n slice.content.descendants(node => {\n if (predicate(node)) {\n hasNode = true;\n return false;\n }\n });\n return hasNode;\n}\n","/*\n * platform.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport const kPlatformMac = typeof navigator !== 'undefined' ? /Mac/.test(navigator.platform) : false;\n","/*\n * outline.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorState } from 'prosemirror-state';\n\nimport { NodeWithPos, findChildrenByType, findChildren } from 'prosemirror-utils';\n\nimport { findTopLevelBodyNodes } from './node';\nimport { titleFromYamlMetadataNode } from './yaml';\nimport { rmdChunkEngineAndLabel } from './rmd';\n\nexport interface EditorOutlineItem {\n navigation_id: string;\n type: EditorOutlineItemType;\n level: number;\n sequence: number;\n title: string;\n children: EditorOutlineItem[];\n}\n\nexport const kHeadingOutlineItemType = 'heading';\nexport const kRmdchunkOutlineItemType = 'rmd_chunk';\nexport const kYamlMetadataOutlineItemType = 'yaml_metadata';\n\nexport type EditorOutlineItemType = 'heading' | 'rmd_chunk' | 'yaml_metadata';\n\nexport type EditorOutline = EditorOutlineItem[];\n\nexport interface EditingOutlineLocationItem {\n type: EditorOutlineItemType;\n level: number;\n title: string;\n active: boolean;\n position: number;\n}\n\nexport interface EditingOutlineLocation {\n items: EditingOutlineLocationItem[];\n}\n\nexport function getEditingOutlineLocation(state: EditorState): EditingOutlineLocation {\n // traverse document outline to get base location info\n const itemsWithPos = getDocumentOutline(state).map(nodeWithPos => {\n const schema = state.schema;\n const node = nodeWithPos.node;\n const item: EditingOutlineLocationItem = {\n type: kYamlMetadataOutlineItemType,\n level: 0,\n title: '',\n active: false,\n position: nodeWithPos.pos,\n };\n if (node.type === schema.nodes.yaml_metadata) {\n item.type = kYamlMetadataOutlineItemType;\n item.title = titleFromYamlMetadataNode(node) || '';\n } else if (node.type === schema.nodes.rmd_chunk) {\n item.type = kRmdchunkOutlineItemType;\n const chunk = rmdChunkEngineAndLabel(node.textContent);\n if (chunk) {\n item.title = chunk.label;\n }\n } else if (node.type === schema.nodes.heading) {\n item.type = kHeadingOutlineItemType;\n item.level = node.attrs.level;\n item.title = node.textContent;\n }\n return {\n item,\n pos: nodeWithPos.pos,\n };\n });\n\n // return the location, set the active item by scanning backwards until\n // we find an item with a position before the cursor\n let foundActive = false;\n const items: EditingOutlineLocationItem[] = [];\n for (let i = itemsWithPos.length - 1; i >= 0; i--) {\n const item = itemsWithPos[i].item;\n if (!foundActive && itemsWithPos[i].pos < state.selection.from) {\n item.active = true;\n foundActive = true;\n }\n items.unshift(item);\n }\n\n // return the outline\n return { items };\n}\n\n// get a document outline that matches the scheme provided in EditingOutlineLocation:\n// - yaml metadata blocks\n// - top-level headings\n// - rmd chunks at the top level or within a top-level list or div,\nexport function getDocumentOutline(state: EditorState): NodeWithPos[] {\n // get top level body nodes\n const schema = state.schema;\n const bodyNodes = findTopLevelBodyNodes(state.doc, node => {\n return [\n schema.nodes.yaml_metadata,\n schema.nodes.rmd_chunk,\n schema.nodes.heading,\n schema.nodes.bullet_list,\n schema.nodes.ordered_list,\n schema.nodes.div\n ].includes(node.type);\n });\n\n // reduce (explode lists into contained rmd chunks)\n const outlineNodes: NodeWithPos[] = [];\n bodyNodes.forEach(bodyNode => {\n // explode lists\n if ([schema.nodes.bullet_list, schema.nodes.ordered_list].includes(bodyNode.node.type)) {\n // look for rmd chunks within list items (non-recursive, only want top level)\n findChildrenByType(bodyNode.node, schema.nodes.list_item, false).forEach(listItemNode => {\n findChildrenByType(listItemNode.node, schema.nodes.rmd_chunk, false).forEach(rmdChunkNode => {\n outlineNodes.push({\n node: rmdChunkNode.node,\n pos: bodyNode.pos + 1 + listItemNode.pos + 1 + rmdChunkNode.pos,\n });\n });\n });\n\n // find headings and rmd chunks within divs\n } else if (schema.nodes.div === bodyNode.node.type) {\n findChildren(bodyNode.node, \n node => [schema.nodes.rmd_chunk, schema.nodes.heading].includes(node.type),\n true)\n .forEach(childNode => {\n outlineNodes.push({\n node: childNode.node,\n pos: bodyNode.pos + 1 + childNode.pos\n });\n }\n );\n \n // other nodes go straight through\n } else {\n outlineNodes.push(bodyNode);\n }\n });\n\n // return outline nodes\n return outlineNodes;\n}\n\nexport function getOutlineNodes(doc: ProsemirrorNode) {\n return findTopLevelBodyNodes(doc, isOutlineNode);\n}\n\nexport function isOutlineNode(node: ProsemirrorNode) {\n if (node.type.spec.attrs) {\n return node.type.spec.attrs.hasOwnProperty('navigation_id');\n } else {\n return false;\n }\n}\n","/*\n * rmd.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, NodeType } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { GapCursor } from 'prosemirror-gapcursor';\n\nimport {\n findParentNodeOfType,\n findChildrenByType,\n findChildren,\n findChildrenByMark,\n setTextSelection,\n} from 'prosemirror-utils';\n\nimport { getMarkRange } from './mark';\nimport { precedingListItemInsertPos, precedingListItemInsert } from './list';\nimport { toggleBlockType } from './command';\nimport { selectionIsBodyTopLevel } from './selection';\nimport { uuidv4 } from './util';\n\nexport interface EditorRmdChunk {\n lang: string;\n meta: string;\n code: string;\n delimiter: string;\n}\n\nexport type ExecuteRmdChunkFn = (chunk: EditorRmdChunk) => void;\n\nexport function canInsertRmdChunk(state: EditorState) {\n // must either be at the body top level, within a list item, within a div, or within a\n // blockquote (and never within a table)\n const schema = state.schema;\n const within = (nodeType: NodeType) => !!findParentNodeOfType(nodeType)(state.selection);\n if (within(schema.nodes.table)) {\n return false;\n }\n if (\n !selectionIsBodyTopLevel(state.selection) &&\n !within(schema.nodes.list_item) &&\n !within(schema.nodes.blockquote) &&\n schema.nodes.div && !within(schema.nodes.div)\n ) {\n return false;\n }\n\n return true;\n}\n\nexport function insertRmdChunk(chunkPlaceholder: string) {\n return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n const schema = state.schema;\n\n if (\n !(state.selection instanceof GapCursor) &&\n !toggleBlockType(schema.nodes.rmd_chunk, schema.nodes.paragraph)(state) &&\n !precedingListItemInsertPos(state.doc, state.selection)\n ) {\n return false;\n }\n\n // must either be at the body top level, within a list item, within a div, or within a\n // blockquote (and never within a table)\n if (!canInsertRmdChunk(state)) {\n return false;\n }\n\n if (dispatch) {\n // perform insert\n const tr = state.tr;\n const rmdText = schema.text(chunkPlaceholder);\n const rmdNode = schema.nodes.rmd_chunk.create({ navigation_id: uuidv4() }, rmdText);\n const prevListItemPos = precedingListItemInsertPos(tr.doc, tr.selection);\n if (prevListItemPos) {\n precedingListItemInsert(tr, prevListItemPos, rmdNode);\n } else {\n tr.replaceSelectionWith(rmdNode);\n setTextSelection(tr.selection.from - 2)(tr);\n }\n\n dispatch(tr);\n }\n\n return true;\n };\n}\n\nexport function activeRmdChunk(state: EditorState): EditorRmdChunk | null {\n if (state.schema.nodes.rmd_chunk) {\n const rmdNode = findParentNodeOfType(state.schema.nodes.rmd_chunk)(state.selection);\n if (rmdNode) {\n return rmdChunk(rmdNode.node.textContent);\n }\n }\n return null;\n}\n\nexport function previousExecutableRmdChunks(state: EditorState, pos = state.selection.from): EditorRmdChunk[] {\n const activeChunk = activeRmdChunk(state);\n const lang = activeChunk ? activeChunk.lang : 'r';\n const kEvalFalseRegEx = /eval\\s*=\\s*F(?:ALSE)?/;\n return previousRmdChunks(state, pos, chunk => {\n return (\n chunk.lang.localeCompare(lang, undefined, { sensitivity: 'accent' }) === 0 && !kEvalFalseRegEx.test(chunk.meta)\n );\n });\n}\n\nexport function previousRmdChunks(state: EditorState, pos: number, filter?: (chunk: EditorRmdChunk) => boolean) {\n // chunks to return\n const chunks: EditorRmdChunk[] = [];\n\n // find all chunks in the document and return ones before the position that pass the specified filter\n const schema = state.schema;\n const rmdChunkNodes = findChildrenByType(state.doc, schema.nodes.rmd_chunk);\n for (const rmdChunkNode of rmdChunkNodes) {\n if (rmdChunkNode.pos + rmdChunkNode.node.nodeSize > pos) {\n break;\n }\n const chunk = rmdChunk(rmdChunkNode.node.textContent);\n if (chunk && (!filter || filter(chunk))) {\n chunks.push(chunk);\n }\n }\n\n // return chunks\n return chunks;\n}\n\nexport function rmdChunk(code: string): EditorRmdChunk | null {\n let lines = code.trimLeft().split('\\n');\n if (lines.length > 0) {\n const meta = lines[0].replace(/^[\\s`\\{]*(.*?)\\}?\\s*$/, '$1');\n const matchLang = meta.match(/\\w+/);\n const lang = matchLang ? matchLang[0] : '';\n\n const isContainerChunk = [\"verbatim\", \"asis\", \"comment\"].includes(lang);\n\n // for container chunks, delimiter is one backtick greater than the most \n // ticks we've found starting a line (otherwise is ```)\n const delimiter = isContainerChunk ? lines.reduce((ticks: string, line: string) => {\n const match = line.match(/^```+/);\n if (match && (match[0].length >= ticks.length)) {\n ticks = match[0] + \"`\";\n }\n return ticks;\n }, \"```\") : \"```\";\n\n // filter out stray ``` if this isn't a container chunk\n if (!isContainerChunk) {\n // remove lines, other than the first, which are chunk delimiters (start\n // with ```). these are generally unintended but can be accidentally\n // introduced by e.g., pasting a chunk with its delimiters into visual mode,\n // where delimiters are implicit. if these lines aren't removed, they create\n // nested chunks that break parsing and can corrupt the document (see case\n // 8452)\n lines = lines.filter((line, idx) => {\n if (idx === 0) {\n return true;\n }\n return !line.startsWith(\"```\");\n });\n }\n \n\n // a completely empty chunk (no second line) should be returned\n // as such. if it's not completely empty then append a newline\n // to the result of split (so that the chunk ends w/ a newline)\n const chunkCode = lines.length > 1 ? lines.slice(1).join('\\n') + '\\n' : '';\n\n return {\n lang,\n meta,\n code: chunkCode,\n delimiter\n };\n } else {\n return null;\n }\n}\n\nexport function mergeRmdChunks(chunks: EditorRmdChunk[]) {\n if (chunks.length) {\n const merged = {\n lang: chunks[0].lang,\n meta: '',\n code: '',\n };\n chunks.forEach(chunk => (merged.code += chunk.code + '\\n'));\n return merged;\n } else {\n return null;\n }\n}\n\n/**\n * Attempts to extract the engine name and label from a chunk header.\n * \n * @param text The chunk header, e.g. {r foo}\n * @returns An object with `engine` and `label` properties, or null.\n */\nexport function rmdChunkEngineAndLabel(text: string) {\n // Match the engine and label with a regex\n const match = text.match(/^\\{([a-zA-Z0-9_]+)[\\s,]+([a-zA-Z0-9/._='\"-]+)/);\n if (match) {\n // The second capturing group in the regex matches the first string after\n // the engine. This might be a label (e.g., {r label}), but could also be\n // a chunk option (e.g., {r echo=FALSE}). If it has an =, presume that it's\n // an option.\n if (match[2].indexOf(\"=\") !== -1) {\n return null;\n }\n return {\n engine: match[1],\n label: match[2],\n };\n } else {\n return null;\n }\n}\n\nexport function haveTableCellsWithInlineRcode(doc: ProsemirrorNode) {\n const schema = doc.type.schema;\n const haveRCode = !!doc.type.schema.nodes.rmd_chunk;\n if (haveRCode) {\n const isTableCell = (node: ProsemirrorNode) =>\n node.type === schema.nodes.table_cell || node.type === schema.nodes.table_header;\n return findChildren(doc, isTableCell).some(cell => {\n if (doc.rangeHasMark(cell.pos, cell.pos + cell.node.nodeSize, schema.marks.code)) {\n const markedNodes = findChildrenByMark(cell.node, schema.marks.code, true);\n return markedNodes.some(markedNode => {\n const from = cell.pos + 1 + markedNode.pos;\n const markedRange = getMarkRange(doc.resolve(from), schema.marks.code);\n if (markedRange) {\n const text = doc.textBetween(markedRange.from, markedRange.to);\n return /^r[ #].+$/.test(text);\n } else {\n return false;\n }\n });\n } else {\n return false;\n }\n });\n } else {\n return false;\n }\n}\n","/*\n * list.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { Transaction, Selection } from 'prosemirror-state';\n\nimport { findParentNodeOfType, setTextSelection } from 'prosemirror-utils';\n\nexport enum ListType {\n Ordered = 'OrderedList',\n Bullet = 'BulletList',\n}\n\nexport interface ListCapabilities {\n tasks: boolean;\n fancy: boolean;\n example: boolean;\n order: boolean;\n incremental: boolean;\n}\n\nexport function isList(node: ProsemirrorNode | null | undefined) {\n if (node) {\n const schema = node.type.schema;\n return node.type === schema.nodes.bullet_list || node.type === schema.nodes.ordered_list;\n } else {\n return false;\n }\n}\n\nexport function precedingListItemInsertPos(doc: ProsemirrorNode, selection: Selection) {\n // selection just be empty\n if (!selection.empty) {\n return null;\n }\n\n // check for insert position in preceding list item (only trigger when\n // the user is at the very beginning of a new bullet)\n const schema = doc.type.schema;\n const $head = selection.$head;\n const parentListItem = findParentNodeOfType(schema.nodes.list_item)(selection);\n if (parentListItem) {\n const $liPos = doc.resolve(parentListItem.pos);\n const listIndex = $liPos.index();\n const parentIndex = $head.index($head.depth - 1);\n const parentOffset = $head.parentOffset;\n if (listIndex > 0 && parentIndex === 0 && parentOffset === 0) {\n const pos = $liPos.pos - 1;\n return pos;\n } else {\n return null;\n }\n } else {\n return null;\n }\n}\n\nexport function precedingListItemInsert(tr: Transaction, pos: number, node: ProsemirrorNode) {\n tr.deleteRange(tr.selection.from, tr.selection.from + 1);\n tr.insert(pos, node);\n setTextSelection(tr.mapping.map(pos), -1)(tr);\n return tr;\n}\n","/*\n * command.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { lift, setBlockType, toggleMark, wrapIn } from 'prosemirror-commands';\nimport { MarkType, Node as ProsemirrorNode, NodeType } from 'prosemirror-model';\nimport { wrapInList, liftListItem } from 'prosemirror-schema-list';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { findParentNode, findParentNodeOfType, setTextSelection } from 'prosemirror-utils';\nimport { EditorView } from 'prosemirror-view';\n\nimport { markIsActive, getMarkRange } from './mark';\nimport { canInsertNode, nodeIsActive } from './node';\nimport { pandocAttrInSpec, pandocAttrAvailable, pandocAttrFrom } from './pandoc_attr';\nimport { isList } from './list';\nimport { OmniInsert } from './omni_insert';\nimport { EditorUIPrefs, kListSpacingTight } from './ui';\nimport { selectionIsWithinRange, selectionHasRange } from './selection';\nimport { requiresTrailingP, insertTrailingP } from './trailing_p';\n\nexport enum EditorCommandId {\n // text editing\n Undo = '201CA961-829E-4708-8FBC-8896FDE85A10',\n Redo = 'B6272475-04E0-48C0-86E3-DAFA763BDF7B',\n SelectAll = 'E42BF0DA-8A02-4FCE-A202-7EA8A4833FC5',\n ClearFormatting = 'C22D8CC4-0A9F-41D5-B540-7DAAAB80F344',\n\n // formatting\n Strong = '83B04020-1195-4A65-8A8E-7C173C87F439',\n Em = '9E1B73E4-8140-43C3-92E4-A5E2583F40E6',\n Code = '32621150-F829-4B8F-B5BD-627FABBBCF53',\n Strikeout = 'D5F0225B-EC73-4600-A1F3-01F418EE8CB4',\n Superscript = '0200D2FC-B5AF-423B-8B7A-4A7FC3DAA6AF',\n Subscript = '3150428F-E468-4E6E-BF53-A2713E59B4A0',\n Smallcaps = '41D8030F-5E8B-48F2-B1EE-6BC40FD502E4',\n Underline = '7F0E6AE2-08F4-4594-9BA2-E6B8B27FA8F7',\n Paragraph = '20EC2695-75CE-4DCD-A644-266E9F5F5913',\n Heading1 = '5B77642B-923D-4440-B85D-1A27C9CF9D77',\n Heading2 = '42985A4B-6BF2-4EEF-AA30-3E84A8B9111C',\n Heading3 = '3F84D9DF-5EF6-484C-8615-BAAE2AC9ECE2',\n Heading4 = 'DA76731D-1D84-4DBA-9BEF-A6F73536F0B9',\n Heading5 = '59E24247-A140-466A-BC96-3C8ADABB57A5',\n Heading6 = 'DB495DF5-8501-43C7-AE07-59CE9D9C373D',\n CodeBlock = '3BA12A49-3E29-4ABC-9A49-436A3B49B880',\n CodeBlockFormat = '07A6F2AA-01DC-41D7-9F01-AA91EAD856EE',\n Blockquote = 'AF0717E7-E4BA-4909-9F10-17EB757CDD0F',\n LineBlock = 'F401687C-B995-49AF-B2B0-59C158174FD5',\n AttrEdit = '0F8A254D-9272-46BF-904D-3A9D68B91032',\n Span = '852CF3E3-8A2B-420D-BD95-F79C54118E7E',\n Div = '15EDB8F1-6015-4DA9-AE50-5987B24C1D96',\n InsertDiv = 'ACA1521B-8875-4113-9D43-B47F0038B19F',\n\n // lists\n BulletList = 'D897FD2B-D6A4-44A7-A404-57B5251FBF64',\n OrderedList = '3B8B82D5-7B6C-4480-B7DD-CF79C6817980',\n TightList = 'A32B668F-74F3-43D7-8759-6576DDE1D603',\n ListItemSink = '7B503FA6-6576-4397-89EF-37887A1B2EED',\n ListItemLift = '53F89F57-22E2-4FCC-AF71-3E382EC10FC8',\n ListItemSplit = '19BBD87F-96D6-4276-B7B8-470652CF4106',\n ListItemCheck = '2F6DA9D8-EE57-418C-9459-50B6FD84137F',\n ListItemCheckToggle = '34D30F3D-8441-44AD-B75A-415DA8AC740B',\n EditListProperties = 'E006A68C-EA39-4954-91B9-DDB07D1CBDA2',\n\n // tables\n TableInsertTable = 'FBE39613-2DAA-445D-9E92-E1EABFB33E2C',\n TableToggleHeader = 'A5EDA226-A3CA-4C1B-8D4D-C2675EF51AFF',\n TableToggleCaption = 'C598D85C-E15C-4E10-9850-95882AEC7E60',\n TableNextCell = '14299819-3E19-4A27-8D0B-8035315CF0B4',\n TablePreviousCell = '0F041FB5-0203-4FF1-9D13-B16606A80F3E',\n TableAddColumnBefore = '2447B81F-E07A-4C7D-8026-F2B148D5FF4A',\n TableAddColumnAfter = 'ED86CFAF-D0B3-4B1F-9BB8-89987A939C8C',\n TableDeleteColumn = 'B3D077BC-DD51-4E3A-8AD4-DE5DE686F7C4',\n TableAddRowBefore = 'E97FB318-4052-41E5-A2F5-55B64E9826A5',\n TableAddRowAfter = '3F28FA24-4BDD-4C13-84FF-9C5E1D4B04D6',\n TableDeleteRow = '5F3B4DCD-5006-43A5-A069-405A946CAC68',\n TableDeleteTable = '116D1E68-9315-4FEB-B6A0-AD25B3B9C881',\n TableAlignColumnLeft = '0CD6A2A4-06F9-435D-B8C9-070B22B19D8',\n TableAlignColumnRight = '86D90C12-BB12-4A9D-802F-D00EB7CEF2C5',\n TableAlignColumnCenter = '63333996-2F65-4586-8494-EA9CAB5A7751',\n TableAlignColumnDefault = '7860A9C1-60AF-40AD-9EB8-A10F6ADF25C5',\n\n // insert\n OmniInsert = '12F96C13-38C1-4266-A0A1-E871D8C709FB',\n Table = 'CBD3ACC6-B2A3-457D-885C-EDA600F6FC67',\n Link = '842FCB9A-CA61-4C5F-A0A0-43507B4B3FA9',\n RemoveLink = '072D2084-218D-4A34-AF1F-7E196AF684B2',\n Image = '808220A3-2B83-4CB6-BCC1-46565D54FA47',\n Footnote = '1D1A73C0-F0E1-4A0F-BEBC-08398DE14A4D',\n ParagraphInsert = '4E68830A-3E68-450A-B3F3-2591F4EB6B9A',\n HorizontalRule = 'EAA7115B-181C-49EC-BDB1-F0FF10369278',\n YamlMetadata = '431B5A45-1B25-4A55-9BAF-C0FE95D9B2B6',\n Shortcode = '0FDDA7E8-419D-4A5D-A1F5-74061466655D',\n InlineMath = 'A35C562A-0BD6-4B14-93D5-6FF3BE1A0C8A',\n DisplayMath = '3E36BA99-2AE9-47C3-8C85-7CC5314A88DF',\n Citation = 'EFFCFC81-F2E7-441E-B7FA-C693146B4185',\n CrossReference = '48CEED4F-1D18-4AF9-8686-9FEB5DF6BCC8',\n DefinitionList = 'CFAB8F4D-3350-4398-9754-8DE0FB95167B',\n DefinitionTerm = '204D1A8F-8EE6-424A-8E69-99768C85B39E',\n DefinitionDescription = 'F0738D83-8E11-4CB5-B958-390190A2D7DD',\n Symbol = '1419765F-6E4A-4A4C-8670-D9E8578EA996',\n Emoji = 'F73896A2-02CC-4E5D-A596-78444A1D2A37',\n EmDash = '5B0DD33B-6209-4713-B8BB-60B5CA0BC3B3',\n EnDash = 'C32AFE32-0E57-4A16-9C39-88EB1D82B8B4',\n NonBreakingSpace = 'CF6428AB-F36E-446C-8661-2781B2CD1169',\n HardLineBreak = '3606FF87-866C-4729-8F3F-D065388FC339',\n Tabset = '7327AF95-3EA7-42C8-8C42-D4CB0D15CAE4',\n Callout = 'DC86C28A-0140-4EB5-A745-2C1EFA55C94D',\n\n // raw\n TexInline = 'CFE8E9E5-93BA-4FFA-9A77-BA7EFC373864',\n TexBlock = 'BD11A6A7-E528-40A2-8139-3F8F5F556ED2',\n HTMLComment = 'F973CBA4-2882-4AC5-A642-47F4733EBDD4',\n HTMLInline = 'C682C6B5-E58D-498C-A38F-FB07BEC3A82D',\n HTMLBlock = '6F9F64AF-711F-4F91-8642-B51C41717F31',\n RawInline = '984167C8-8582-469C-97D8-42CB12773657',\n RawBlock = 'F5757992-4D33-45E6-86DC-F7D7B174B1EC',\n\n // chunk\n RCodeChunk = 'EBFD21FF-4A6E-4D88-A2E0-B38470B00BB9',\n BashCodeChunk = '5FBB7283-E8AB-450C-9359-A4658CBCD136',\n D3CodeChunk = 'C73CA46C-B56F-40B6-AEFA-DDBB30CA8C08',\n PythonCodeChunk = '42A7A138-421A-4DCF-8A88-FE2F8EC5B8F6',\n RcppCodeChunk = '6BD2810B-6B20-4358-8AA4-74BBFFC92AC3',\n SQLCodeChunk = '41D61FD2-B56B-48A7-99BC-2F60BC0D9F78',\n StanCodeChunk = '65D33344-CBE9-438C-B337-A538F8D7FCE5',\n ExecuteCurentRmdChunk = '31C799F3-EF18-4F3A-92E6-51F7A3193A1B',\n ExecuteCurrentPreviousRmdChunks = 'D3FDE96-0264-4364-ADFF-E87A75405B0B',\n ExpandChunk = '0226518C-559A-4BFC-A5BD-244BEE8175AA',\n CollapseChunk = '4AFBBC0C-A6DA-4019-B85F-374636E349C3',\n ExpandAllChunks = 'B217913B-67C9-457F-B766-7FCCB502F611',\n CollapseAllChunks = '9907A864-D707-4410-93A4-07871A8C43A6',\n\n // outline\n GoToNextSection = 'AE827BDA-96F8-4E84-8030-298D98386765',\n GoToPreviousSection = 'E6AA728C-2B75-4939-9123-0F082837ACDF',\n GoToNextChunk = '50DD6E51-13B5-4F1E-A46B-6A33EB1609D9',\n GoToPreviousChunk = '8D105D33-78FE-4A98-8195-6B71361424C5',\n\n // slides\n InsertSlidePause = 'FCA8BF2E-2668-4919-92FC-02083EB48246',\n InsertSlideNotes = '9C709915-02BE-4F4F-9CEB-50E17973C9BE',\n InsertSlideColumns = 'AE62D05F-1415-4E1F-84AE-753EE2393002'\n}\n\nexport interface EditorCommand {\n readonly id: EditorCommandId;\n readonly keymap: readonly string[];\n readonly isEnabled: () => boolean;\n readonly isActive: () => boolean;\n readonly plural: () => number;\n readonly execute: () => void;\n}\n\nexport class ProsemirrorCommand {\n public readonly id: EditorCommandId;\n public readonly keymap: readonly string[];\n public readonly execute: CommandFn;\n public readonly omniInsert?: OmniInsert;\n public readonly keepFocus: boolean;\n\n constructor(\n id: EditorCommandId,\n keymap: readonly string[],\n execute: CommandFn,\n omniInsert?: OmniInsert,\n keepFocus?: boolean,\n ) {\n this.id = id;\n this.keymap = keymap;\n this.execute = execute;\n this.omniInsert = omniInsert;\n this.keepFocus = !(keepFocus === false);\n }\n\n public isEnabled(state: EditorState): boolean {\n return this.execute(state);\n }\n\n public isActive(state: EditorState): boolean {\n return false;\n }\n\n public plural(state: EditorState): number {\n return 1;\n }\n}\n\nexport class MarkCommand extends ProsemirrorCommand {\n public readonly markType: MarkType;\n public readonly attrs: object;\n\n constructor(id: EditorCommandId, keymap: string[], markType: MarkType, attrs = {}) {\n super(id, keymap, toggleMarkType(markType, attrs) as CommandFn);\n this.markType = markType;\n this.attrs = attrs;\n }\n\n public isActive(state: EditorState) {\n return markIsActive(state, this.markType);\n }\n}\n\nexport class NodeCommand extends ProsemirrorCommand {\n public readonly nodeType: NodeType;\n public readonly attrs: object;\n\n constructor(\n id: EditorCommandId,\n keymap: string[],\n nodeType: NodeType,\n attrs: object,\n execute: CommandFn,\n omniInsert?: OmniInsert,\n ) {\n super(id, keymap, execute, omniInsert);\n this.nodeType = nodeType;\n this.attrs = attrs;\n }\n\n public isActive(state: EditorState) {\n return nodeIsActive(state, this.nodeType, this.attrs);\n }\n}\n\nexport class BlockCommand extends NodeCommand {\n constructor(\n id: EditorCommandId,\n keymap: string[],\n blockType: NodeType,\n toggleType: NodeType,\n attrs = {},\n omniInsert?: OmniInsert,\n ) {\n super(id, keymap, blockType, attrs, toggleBlockType(blockType, toggleType, attrs), omniInsert);\n }\n}\n\nexport class WrapCommand extends NodeCommand {\n constructor(id: EditorCommandId, keymap: string[], wrapType: NodeType, attrs = {}, omniInsert?: OmniInsert) {\n super(id, keymap, wrapType, attrs, toggleWrap(wrapType, attrs), omniInsert);\n }\n}\n\nexport class InsertCharacterCommand extends ProsemirrorCommand {\n constructor(id: EditorCommandId, ch: string, keymap: string[]) {\n super(id, keymap, (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n // enable/disable command\n const schema = state.schema;\n if (!canInsertNode(state, schema.nodes.text)) {\n return false;\n }\n if (dispatch) {\n const tr = state.tr;\n tr.replaceSelectionWith(schema.text(ch), true).scrollIntoView();\n dispatch(tr);\n }\n\n return true;\n });\n }\n}\n\nexport type CommandFn = (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => boolean;\n\nexport function toggleMarkType(markType: MarkType, attrs?: { [key: string]: any }) {\n const defaultToggleMark = toggleMark(markType, attrs);\n\n return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n // disallow non-code marks when the selection is contained within a code mark\n // (this is a pandoc constraint). note that we can allow them if the selection\n // contains the code mark range entirely (as in that case the code mark will\n // nest within the other mark)\n if (markType !== state.schema.marks.code) {\n if (markIsActive(state, state.schema.marks.code)) {\n const codeRange = getMarkRange(state.selection.$anchor, state.schema.marks.code);\n if (\n codeRange &&\n selectionIsWithinRange(state.selection, codeRange) &&\n !selectionHasRange(state.selection, codeRange)\n ) {\n return false;\n }\n }\n }\n\n // default implementation\n return defaultToggleMark(state, dispatch);\n };\n}\n\nexport function toggleList(listType: NodeType, itemType: NodeType, prefs: EditorUIPrefs): CommandFn {\n return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n const { selection } = state;\n const { $from, $to } = selection;\n const range = $from.blockRange($to);\n\n if (!range) {\n return false;\n }\n\n const parentList = findParentNode(isList)(selection);\n\n if (range.depth >= 1 && parentList && range.depth - parentList.depth <= 1) {\n if (isList(parentList.node) && listType.validContent(parentList.node.content)) {\n if (parentList.node.type !== listType) {\n if (dispatch) {\n const tr: Transaction = state.tr;\n const attrs: { [key: string]: any } = {};\n if (parentList.node.attrs.tight) {\n attrs.tight = true;\n }\n tr.setNodeMarkup(parentList.pos, listType, attrs);\n dispatch(tr);\n }\n return true;\n } else {\n return liftListItem(itemType)(state, dispatch);\n }\n }\n }\n\n // if we are in a heading then this isn't valid\n if (findParentNodeOfType(state.schema.nodes.heading)(state.selection)) {\n return false;\n }\n\n // reflect tight preference\n const tight = prefs.listSpacing() === kListSpacingTight;\n\n return wrapInList(listType, { tight })(state, dispatch);\n };\n}\n\nexport function toggleBlockType(type: NodeType, toggletype: NodeType, attrs = {}): CommandFn {\n return (state: EditorState, dispatch?: (tr: Transaction<any>) => void) => {\n if (!dispatch) {\n return type === toggletype || setBlockType(type, { ...attrs })(state, dispatch);\n }\n\n // if the type has pandoc attrs then see if we can transfer from the existing node\n let pandocAttr: any = {};\n if (pandocAttrInSpec(type.spec)) {\n const parentNode = state.selection.$anchor.node();\n if (parentNode && pandocAttrAvailable(parentNode.attrs)) {\n pandocAttr = pandocAttrFrom(parentNode.attrs);\n }\n }\n\n return setBlockType(type, { ...attrs, ...pandocAttr })(state, dispatch);\n };\n}\n\nexport function toggleWrap(type: NodeType, attrs?: { [key: string]: any }): CommandFn {\n return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n const isActive = nodeIsActive(state, type, attrs);\n\n if (isActive) {\n return lift(state, dispatch);\n }\n\n return wrapIn(type, attrs)(state, dispatch);\n };\n}\n\nexport function insertNode(nodeType: NodeType, attrs = {}, selectAfter = false): CommandFn {\n return (state: EditorState, dispatch?: (tr: Transaction<any>) => void) => {\n if (!canInsertNode(state, nodeType)) {\n return false;\n }\n\n if (dispatch) {\n const tr = state.tr;\n tr.replaceSelectionWith(nodeType.create(attrs));\n if (selectAfter) {\n if (requiresTrailingP(tr.selection)) {\n insertTrailingP(tr);\n setTextSelection(tr.selection.to + 1, 1)(tr);\n }\n }\n dispatch(tr);\n }\n\n return true;\n };\n}\n\nexport function exitNode(\n nodeType: NodeType,\n depth: number,\n allowKey: boolean,\n filter = (_node: ProsemirrorNode) => true,\n) {\n return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n // must be within the node type and pass the filter\n const { $head, $anchor } = state.selection;\n if ($head.parent.type !== nodeType || !filter($head.parent)) {\n return false;\n }\n\n // must be empty and entirely contained by the node\n if (!$head.sameParent($anchor) || !state.selection.empty) {\n return !allowKey;\n }\n\n // must be at the end of the node\n const node = findParentNodeOfType(nodeType)(state.selection)!;\n const endCaptionPos = node.pos + node.node.nodeSize - 1;\n if (state.selection.from !== endCaptionPos) {\n return !allowKey;\n }\n\n // insert must be valid in container above\n const above = $head.node(depth);\n const after = $head.indexAfter(depth);\n const type = above.contentMatchAt(after).defaultType!;\n if (!above.canReplaceWith(after, after, type)) {\n return !allowKey;\n }\n\n // perform insert\n if (dispatch) {\n const tr = state.tr;\n const pos = node.pos + node.node.nodeSize + (Math.abs(depth) - 1);\n tr.insert(pos, type.create());\n setTextSelection(pos, 1)(tr);\n dispatch(tr.scrollIntoView());\n }\n\n return true;\n };\n}\n","/*\n * ui.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { SkinTone } from './emoji';\nimport { XRef } from './xref';\n\nimport { EditorUIImages } from './ui-images';\nimport { EditorDialogs } from './ui-dialogs';\nimport { EditorUISpelling } from './spelling';\n\nexport interface EditorUI {\n dialogs: EditorDialogs;\n display: EditorDisplay;\n math: EditorUIMath;\n context: EditorUIContext;\n prefs: EditorUIPrefs;\n images: EditorUIImages;\n chunks: EditorUIChunks;\n spelling: EditorUISpelling;\n}\n\n/**\n * Callbacks supplied to the host to interact with a code chunk and its output.\n */\nexport interface EditorUIChunkCallbacks {\n getPos: () => number;\n scrollIntoView: (ele: HTMLElement) => void;\n scrollCursorIntoView: () => void;\n getTextContent: () => string;\n}\n\nexport interface EditorUIChunks {\n // create a code chunk editor\n createChunkEditor: (type: string, element: Element, index: number, classes: string[], callbacks: EditorUIChunkCallbacks) => ChunkEditor;\n\n // expand or collapse all chunk editors\n setChunksExpanded: (expanded: boolean) => void;\n}\n\nexport interface ChunkEditor {\n editor: unknown;\n setMode(mode: string): void;\n executeSelection(): void;\n element: HTMLElement;\n destroy(): void;\n setExpanded(expanded: boolean): void;\n getExpanded(): boolean;\n}\n\nexport interface EditorUIContext {\n // check if we are the active tab\n isActiveTab: () => boolean;\n\n // get the path to the current document\n getDocumentPath: () => string | null;\n\n // ensure the edited document is saved on the server before proceeding\n // (note this just means that the server has a copy of it for e.g.\n // indexing xrefs, from the user's standpoint the doc is still dirty)\n withSavedDocument: () => Promise<boolean>;\n\n // get the default directory for resources (e.g. where relative links point to)\n getDefaultResourceDir: () => string;\n\n // map from a filesystem path to a resource reference\n mapPathToResource: (path: string) => string;\n\n // map from a resource reference (e.g. images/foo.png) to a URL we can use in the document\n mapResourceToURL: (path: string) => string;\n\n // watch a resource for changes (returns an unsubscribe function)\n watchResource: (path: string, notify: VoidFunction) => VoidFunction;\n\n // translate a string\n translateText: (text: string) => string;\n\n // are there dropped uris available?\n droppedUris: () => string[] | null;\n\n // uris from the clipboard\n clipboardUris: () => Promise<string[] | null>;\n\n // image from the clipboard (returned as file path)\n clipboardImage: () => Promise<string | null>;\n\n // resolve image uris (make relative, copy to doc local 'images' dir, etc)\n resolveImageUris: (uris: string[]) => Promise<string[]>;\n\n // are we running in windows desktop mode?\n isWindowsDesktop: () => boolean;\n}\n\nexport interface EditorMenuItem {\n text?: string;\n exec?: VoidFunction;\n command?: string;\n separator?: boolean;\n subMenu?: {\n items: EditorMenuItem[];\n };\n}\n\nexport interface EditorUIMath {\n typeset?: (el: HTMLElement, text: string, priority: boolean) => Promise<boolean>;\n}\n\nexport interface EditorDisplay {\n openURL: (url: string) => void;\n navigateToXRef: (file: string, xref: XRef) => void;\n showContextMenu?: (items: EditorMenuItem[], clientX: number, clientY: number) => Promise<boolean>;\n}\n\nexport const kListSpacingTight = 'tight';\nexport const kListSpacingSpaced = 'spaced';\nexport type ListSpacing = 'tight' | 'spaced';\n\nexport interface EditorUIPrefs {\n darkMode: () => boolean;\n listSpacing: () => ListSpacing;\n equationPreview: () => boolean;\n packageListingEnabled: () => boolean;\n tabKeyMoveFocus: () => boolean;\n emojiSkinTone: () => SkinTone;\n setEmojiSkinTone: (skinTone: SkinTone) => void;\n zoteroUseBetterBibtex: () => boolean;\n setBibliographyDefaultType: (type: string) => void;\n bibliographyDefaultType: () => string;\n citationDefaultInText: () => boolean;\n setCitationDefaultInText: (value: boolean) => void;\n}\n","/*\n * trailing_p.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Transaction, Selection } from 'prosemirror-state';\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { Transform } from 'prosemirror-transform';\nimport { ContentNodeWithPos } from 'prosemirror-utils';\n\nimport { editingRootNode } from '../api/node';\nimport { trTransform } from '../api/transaction';\nimport { isParagraphNode } from '../api/paragraph';\n\n\nexport function insertTrailingP(tr: Transaction) {\n const editingNode = editingRootNode(tr.selection);\n if (editingNode) {\n trTransform(tr, insertTrailingPTransform(editingNode));\n }\n}\n\n\nexport function requiresTrailingP(selection: Selection) {\n const editingRoot = editingRootNode(selection);\n if (editingRoot) {\n return !isParagraphNode(editingRoot.node.lastChild) || isDisplayMathNode(editingRoot.node.lastChild);\n } else {\n return false;\n }\n}\n\nfunction insertTrailingPTransform(editingNode: ContentNodeWithPos) {\n return (tr: Transform) => {\n const schema = editingNode.node.type.schema;\n tr.insert(editingNode.pos + editingNode.node.nodeSize - 1, schema.nodes.paragraph.create());\n };\n}\n\nfunction isDisplayMathNode(node: ProsemirrorNode | null | undefined) {\n if (node && node.firstChild) {\n return node.childCount === 1 && node.type.schema.marks.math?.isInSet(node.firstChild.marks);\n } else {\n return false;\n }\n}\n","/*\n * paragraph.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { canInsertNode } from './node';\n\nexport function insertParagraph(state: EditorState, dispatch?: (tr: Transaction) => void) {\n const schema = state.schema;\n\n if (!canInsertNode(state, schema.nodes.paragraph)) {\n return false;\n }\n\n if (dispatch) {\n const tr = state.tr;\n tr.replaceSelectionWith(schema.nodes.paragraph.create());\n setTextSelection(state.selection.from + 1, 1)(tr);\n dispatch(tr);\n }\n\n return true;\n}\n\nexport function isParagraphNode(node: ProsemirrorNode | null | undefined) {\n if (node) {\n const schema = node.type.schema;\n return node.type === schema.nodes.paragraph;\n } else {\n return false;\n }\n}\n","/*\n * util.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n// tslint:disable:no-bitwise\nexport function uuidv4() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n","import { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\nimport { NodeWithPos } from 'prosemirror-utils';\n\nimport { bodyElement } from './dom';\nimport {\n kYamlMetadataOutlineItemType,\n kHeadingOutlineItemType,\n kRmdchunkOutlineItemType,\n EditingOutlineLocation,\n getDocumentOutline,\n EditingOutlineLocationItem,\n} from './outline';\nimport { restoreSelection } from './selection';\nimport { scrollToPos } from './scroll';\n\nexport interface EditingLocation {\n pos: number;\n scrollTop: number;\n}\n\nexport function getEditingLocation(view: EditorView): EditingLocation {\n const pos = view.state.selection.from;\n const bodyEl = bodyElement(view);\n const scrollTop = bodyEl.scrollTop;\n return { pos, scrollTop };\n}\n\nexport function setEditingLocation(\n view: EditorView,\n outlineLocation?: EditingOutlineLocation,\n previousLocation?: EditingLocation,\n) {\n // get the current document outline\n const documentOutline = getDocumentOutline(view.state);\n\n // if all of the types and levels match up to the active outline item,\n // then we have a candidate match\n let docOutlineLocationNode: NodeWithPos | undefined;\n\n if (outlineLocation) {\n for (let i = 0; i < outlineLocation.items.length && i < documentOutline.length; i++) {\n // get the item and it's peer\n const item = outlineLocation.items[i];\n const docOutlineNode = documentOutline[i];\n\n // if they don't match then bail (can't resolve different interpretations of the outline)\n if (!outlineItemSimillarToNode(item, docOutlineNode.node)) {\n break;\n }\n\n // if this is the active item\n if (item.active) {\n // see if the previous location is actually a better target (because it's between this location and\n // the next outline node). in that case we don't set the target node and we leave the restorePos\n // at the previous location\n if (!locationIsBetweenDocOutlineNodes(docOutlineNode, documentOutline[i + 1], previousLocation)) {\n // set the target\n docOutlineLocationNode = docOutlineNode;\n\n // if this is an rmd chunk then advance to the second line\n if (docOutlineNode.node.type === view.state.schema.nodes.rmd_chunk) {\n const chunkText = docOutlineNode.node.textContent;\n const newlineIdx = chunkText.indexOf('\\n');\n if (newlineIdx !== -1) {\n docOutlineLocationNode.pos += newlineIdx + 2;\n }\n }\n }\n\n break;\n }\n }\n }\n\n // do the restore\n if (docOutlineLocationNode) {\n restoreSelection(view, docOutlineLocationNode.pos);\n scrollToPos(view, docOutlineLocationNode.pos);\n } else if (previousLocation) {\n restoreSelection(view, previousLocation.pos);\n bodyElement(view).scrollTop = previousLocation.scrollTop;\n }\n}\n\nfunction outlineItemSimillarToNode(outlineItem: EditingOutlineLocationItem, docOutlneNode: ProsemirrorNode) {\n const schema = docOutlneNode.type.schema;\n if (outlineItem.type === kYamlMetadataOutlineItemType) {\n return docOutlneNode.type === schema.nodes.yaml_metadata;\n } else if (outlineItem.type === kRmdchunkOutlineItemType) {\n return docOutlneNode.type === schema.nodes.rmd_chunk;\n } else if (outlineItem.type === kHeadingOutlineItemType) {\n return docOutlneNode.type === schema.nodes.heading && docOutlneNode.attrs.level === outlineItem.level;\n } else {\n return false;\n }\n}\n\nfunction locationIsBetweenDocOutlineNodes(nodeA: NodeWithPos, nodeB?: NodeWithPos, location?: EditingLocation) {\n // bail if we don't have all the arguments\n if (!nodeB || !location) {\n return false;\n }\n return nodeA.pos < location.pos && nodeB.pos > location.pos;\n}\n","/*\n * dom.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView } from 'prosemirror-view';\n\nexport function bodyElement(view: EditorView): HTMLElement {\n return view.dom.firstChild as HTMLElement;\n}\n\nexport function isElementVisible(el: HTMLElement) {\n return !!(el.offsetWidth || el.offsetHeight || el.getClientRects().length);\n}\n\nexport function elementInnerDimensions(el: HTMLElement) {\n const cs = getComputedStyle(el);\n\n const asNumber = (x: string | null) => (x ? parseFloat(x) : 0);\n const paddingX = asNumber(cs.paddingLeft) + asNumber(cs.paddingRight);\n const paddingY = asNumber(cs.paddingTop) + asNumber(cs.paddingBottom);\n const borderX = asNumber(cs.borderLeftWidth) + asNumber(cs.borderRightWidth);\n const borderY = asNumber(cs.borderTopWidth) + asNumber(cs.borderBottomWidth);\n\n return {\n width: el.offsetWidth - paddingX - borderX,\n height: el.offsetHeight - paddingY - borderY,\n };\n}\n\nexport function onElementRemoved(container: Node, el: HTMLElement, onRemoved: VoidFunction) {\n const observer = new MutationObserver(mutationsList => {\n mutationsList.forEach(mutation => {\n mutation.removedNodes.forEach(node => {\n if (node === el) {\n onRemoved();\n }\n });\n });\n });\n observer.observe(container, { attributes: false, childList: true, subtree: true });\n}\n","/*\n * scroll.ts\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView } from 'prosemirror-view';\nimport { findParentNodeOfTypeClosestToPos } from 'prosemirror-utils';\n\nimport zenscroll from 'zenscroll';\n\nimport { editingRootNodeClosestToPos, editingRootNode } from './node';\n\nexport function scrollIntoView(\n view: EditorView,\n pos: number,\n center = true,\n duration?: number,\n offset?: number,\n onDone?: VoidFunction,\n) {\n // resolve position and determine container\n const $pos = view.state.doc.resolve(pos);\n const container = editingRootNodeClosestToPos($pos);\n\n // if we have a container then do the scroll\n if (container) {\n const schema = view.state.schema;\n const containerEl = view.nodeDOM(container.pos) as HTMLElement;\n const parentList = findParentNodeOfTypeClosestToPos($pos, [schema.nodes.ordered_list, schema.nodes.bullet_list]);\n const parentDiv = schema.nodes.div ? findParentNodeOfTypeClosestToPos($pos, schema.nodes.div) : undefined;\n const resultPos = parentList || parentDiv ? $pos.before(2) : $pos.before();\n const resultNode = view.nodeDOM(resultPos) as HTMLElement;\n if (container && resultNode) {\n const scroller = zenscroll.createScroller(containerEl, duration, offset);\n if (center) {\n scroller.center(resultNode, duration, offset, onDone);\n } else {\n scroller.intoView(resultNode, duration, onDone);\n }\n }\n }\n}\n\nexport function scrollToPos(view: EditorView, pos: number, duration?: number, offset?: number, onDone?: VoidFunction) {\n const node = view.nodeDOM(pos);\n if (node instanceof HTMLElement) {\n const editingRoot = editingRootNode(view.state.selection)!;\n const container = view.nodeDOM(editingRoot.pos) as HTMLElement;\n const scroller = zenscroll.createScroller(container, duration, offset);\n if (duration) {\n scroller.to(node, duration, onDone);\n } else {\n scroller.to(node, 0, onDone);\n }\n }\n}\n","/*\n * navigation.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView } from 'prosemirror-view';\n\nimport { setTextSelection, Predicate, findChildren, findDomRefAtPos } from 'prosemirror-utils';\n\nimport zenscroll from 'zenscroll';\n\nimport { editingRootNode } from './node';\nimport { kNavigationTransaction } from './transaction';\nimport { xrefPosition } from './xref';\nimport { EditorFormat, kQuartoDocType } from './format';\n\nexport interface EditorNavigation {\n navigate: (type: NavigationType, location: string, animate?: boolean) => void;\n}\n\nexport enum NavigationType {\n Pos = 'pos',\n Id = 'id',\n Href = 'href',\n Heading = 'heading',\n XRef = 'xref',\n}\n\nexport interface Navigation {\n pos: number;\n prevPos: number;\n}\n\nexport function navigateTo(\n view: EditorView,\n format: EditorFormat,\n type: NavigationType,\n location: string,\n animate = true,\n): Navigation | null {\n switch (type) {\n case NavigationType.Pos:\n return navigateToPos(view, parseInt(location, 10), animate);\n case NavigationType.Id:\n return navigateToId(view, location, animate);\n case NavigationType.Href:\n return navigateToHref(view, location, animate);\n case NavigationType.Heading:\n return navigateToHeading(view, location, animate);\n case NavigationType.XRef:\n return navigateToXRef(view, format, location, animate);\n default:\n return null;\n }\n}\n\nexport function navigateToId(view: EditorView, id: string, animate = true): Navigation | null {\n return navigate(view, node => id === node.attrs.navigation_id, animate);\n}\n\nexport function navigateToHref(view: EditorView, href: string, animate = true): Navigation | null {\n return navigate(view, node => node.attrs.id === href, animate);\n}\n\nexport function navigateToHeading(view: EditorView, heading: string, animate = true): Navigation | null {\n return navigate(\n view,\n node => {\n return (\n node.type === view.state.schema.nodes.heading &&\n node.textContent.localeCompare(heading, undefined, { sensitivity: 'accent' }) === 0\n );\n },\n animate,\n );\n}\n\nexport function navigateToXRef(view: EditorView, editorFormat: EditorFormat, xref: string, animate = true): Navigation | null {\n const xrefType = editorFormat.docTypes.includes(kQuartoDocType) ? \"quarto\" : \"bookdown\";\n const xrefPos = xrefPosition(view.state.doc, xref, xrefType);\n if (xrefPos !== -1) {\n return navigateToPos(view, xrefPos, animate);\n } else {\n return null;\n }\n}\n\nexport function navigateToPos(view: EditorView, pos: number, animate = true): Navigation | null {\n // get previous position\n const prevPos = view.state.selection.from;\n\n // need to target at least the body\n pos = Math.max(pos, 2);\n\n // set selection\n const tr = view.state.tr;\n setTextSelection(pos)(tr);\n tr.setMeta(kNavigationTransaction, true);\n view.dispatch(tr);\n\n // find a targetable dom node at the position\n const node = findDomRefAtPos(pos, view.domAtPos.bind(view));\n if (node instanceof HTMLElement) {\n // auto-scroll to position (delay so we can grab the focus, as autoscrolling\n // doesn't seem to work unless you have the focus)\n setTimeout(() => {\n view.focus();\n const editingRoot = editingRootNode(view.state.selection)!;\n const container = view.nodeDOM(editingRoot.pos) as HTMLElement;\n const scroller = zenscroll.createScroller(container, 700, 20);\n // some nodes' DOM elements are grandchildren rather than direct children\n // of the scroll container; move up a level if this is the case\n let dest = node;\n if (node.parentElement &&\n node.parentElement.parentElement &&\n node.parentElement.parentElement.parentElement === container) {\n dest = node.parentElement;\n }\n if (animate) {\n scroller.to(dest);\n } else {\n scroller.to(dest, 0);\n }\n }, 200);\n\n return { pos, prevPos };\n } else {\n return null;\n }\n}\n\nfunction navigate(view: EditorView, predicate: Predicate, animate = true): Navigation | null {\n const result = findChildren(view.state.doc, predicate);\n if (result.length) {\n // pos points immediately before the node so add 1 to it\n const pos = result[0].pos + 1;\n return navigateToPos(view, pos, animate);\n } else {\n return null;\n }\n}\n","/*\n * xref.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, MarkType } from 'prosemirror-model';\n\nimport { findChildrenByMark } from 'prosemirror-utils';\n\nimport { pandocAutoIdentifier } from './pandoc_id';\nimport { rmdChunkEngineAndLabel } from './rmd';\nimport { kTexFormat } from './raw';\nimport { findChildrenByType } from 'prosemirror-utils';\n\nexport interface XRefServer {\n indexForFile: (file: string) => Promise<XRefs>;\n xrefForId: (file: string, id: string) => Promise<XRefs>;\n quartoIndexForFile: (file: string) => Promise<XRefs>;\n quartoXrefForId: (file: string, id: string) => Promise<XRefs>;\n}\n\nexport interface XRefs {\n baseDir: string;\n refs: XRef[];\n}\n\nexport interface XRef {\n file: string;\n type: string;\n id: string;\n suffix: string;\n title?: string;\n}\n\nexport type XRefType = \"quarto\" | \"bookdown\";\n\nexport function xrefKey(xref: XRef, xrefType?: XRefType) {\n if (xrefType === \"quarto\") {\n // Quarto keys are merely type-id\n if (xref.suffix) {\n return `${xref.type}-${xref.id}${xref.suffix}`;\n } else {\n return `${xref.type}-${xref.id}`;\n }\n } else {\n // headings don't include their type in the key\n const key = /^h\\d$/.test(xref.type)\n ? xref.id\n : // no colon if there is no type\n xref.type.length > 0\n ? `${xref.type}:${xref.id}`\n : xref.id;\n\n // return key with suffix\n return key + xref.suffix;\n }\n}\n\nexport function parseQuartoXRef(xref: string) {\n const dashPos = xref.indexOf('-');\n if (dashPos !== -1) {\n return {\n type: xref.substring(0, dashPos),\n id: xref.substring(dashPos + 1),\n };\n } else {\n return null;\n }\n}\n\nexport function xrefPosition(doc: ProsemirrorNode, xref: string, xrefType: XRefType): number {\n\n if (xrefType === 'quarto') {\n return xrefPositionLocate(doc, xref, quartoXrefPositionLocators);\n } else {\n return xrefPositionLocate(doc, xref, bookdownXrefPositionLocators);\n }\n}\n\nfunction xrefPositionLocate(doc: ProsemirrorNode, xref: string, locators: Record<string, XRefPositionLocator>) {\n // -1 if not found\n let xrefPos = -1;\n\n // get type and id\n const xrefInfo = parseBookdownXRef(xref);\n if (xrefInfo) {\n const { type, id } = xrefInfo;\n const locator = locators[type];\n if (locator) {\n // if this locator finds by mark then look at doc for marks\n if (locator.markType) {\n const schema = doc.type.schema;\n const markType = schema.marks[locator.markType];\n const markedNodes = findChildrenByMark(doc, markType, true);\n markedNodes.forEach(markedNode => {\n // bail if we already found it\n if (xrefPos !== -1) {\n return false;\n }\n // see if we can locate the xref\n if (locator.hasXRef(markedNode.node, id, markType)) {\n xrefPos = markedNode.pos;\n }\n });\n }\n if (xrefPos === -1 && locator.nodeTypes) {\n // otherwise recursively examine nodes to find the xref\n doc.descendants((node, pos) => {\n // bail if we already found it\n if (xrefPos !== -1) {\n return false;\n }\n // see if we can locate the xref\n if (locator.nodeTypes!.includes(node.type.name) && locator.hasXRef(node, id)) {\n xrefPos = pos;\n return false;\n }\n });\n }\n }\n }\n\n // return the position\n return xrefPos;\n}\n\nfunction parseBookdownXRef(xref: string) {\n const colonPos = xref.indexOf(':');\n if (colonPos !== -1) {\n return {\n type: xref.substring(0, colonPos),\n id: xref.substring(colonPos + 1),\n };\n } else {\n return null;\n }\n}\n\ninterface XRefPositionLocator {\n markType?: string;\n nodeTypes?: string[];\n hasXRef: (node: ProsemirrorNode, id: string, markType?: MarkType) => boolean;\n}\n\nconst quartoXrefPositionLocators: { [key: string]: XRefPositionLocator } = {\n sec: quartoHeadingLocator(),\n fig: quartoFigureLocator(),\n tbl: quartoTableLocator(),\n eq: quartoMathLocator(),\n lst: quartoListingLocator(),\n thm: quartoDivLocator(\"thm\"),\n lem: quartoDivLocator(\"lem\"),\n cor: quartoDivLocator(\"cor\"),\n prp: quartoDivLocator(\"prp\"),\n cnj: quartoDivLocator(\"cnj\"),\n def: quartoDivLocator(\"def\"),\n exm: quartoDivLocator(\"exm\"),\n exr: quartoDivLocator(\"exr\"),\n};\n\n\nfunction quartoMathLocator() {\n return {\n nodeTypes: ['paragraph'],\n hasXRef: (node: ProsemirrorNode, id: string) => {\n const mathType = node.type.schema.marks.math;\n let prevNodeMath = false;\n for (let i = 0; i < node.childCount; i++) {\n const childNode = node.child(i);\n if (prevNodeMath) {\n const text = childNode.textContent;\n if (!!text.match(/^\\s*\\{\\#eq\\-.*\\}/)) {\n return true;\n }\n }\n prevNodeMath = !!childNode.marks.find(\n mark => mark.type === mathType && mark.attrs.type === \"DisplayMath\"\n );\n }\n return false;\n },\n };\n}\n\nfunction quartoFigureLocator() {\n return {\n nodeTypes: ['figure'],\n hasXRef: (node: ProsemirrorNode, id: string) => {\n return node.attrs.id === `fig-${id}`;\n },\n };\n}\n\nfunction quartoHeadingLocator() {\n return {\n nodeTypes: ['heading'],\n hasXRef: (node: ProsemirrorNode, id: string) => {\n return node.attrs.id === `sec-${id}`;\n },\n };\n}\n\nfunction quartoTableLocator() {\n return {\n nodeTypes: ['table_container'],\n hasXRef: (node: ProsemirrorNode, id: string) => {\n // Look for a table which has a table caption that contains the id\n const captions = findChildrenByType(node, node.type.schema.nodes.table_caption);\n if (captions.length) {\n return !!captions[0].node.textContent.match(/\\{\\#tbl\\-.*\\}/);\n }\n return false;\n },\n };\n}\n\nfunction quartoDivLocator(type: string) {\n return {\n nodeTypes: ['div'],\n hasXRef: (node: ProsemirrorNode, id: string) => {\n return node.attrs.id === `${type}-${id}`;\n },\n };\n}\n\nfunction quartoListingLocator() {\n return {\n nodeTypes: ['code_block'],\n hasXRef: (node: ProsemirrorNode, id: string) => {\n const attrs = node.attrs;\n return attrs.id === `lst-${id}`;\n },\n };\n}\n\nconst bookdownXrefPositionLocators: { [key: string]: XRefPositionLocator } = {\n h1: headingLocator(),\n h2: headingLocator(),\n h3: headingLocator(),\n h4: headingLocator(),\n h5: headingLocator(),\n h6: headingLocator(),\n fig: {\n nodeTypes: ['rmd_chunk'],\n hasXRef: (node: ProsemirrorNode, id: string) => rmdChunkHasXRef(node, 'r', id, /^\\{.*[ ,].*fig\\.cap\\s*=.*\\}\\s*\\n/m),\n },\n tab: {\n nodeTypes: ['rmd_chunk', 'table_container'],\n hasXRef: (node: ProsemirrorNode, id: string) => {\n if (node.type.name === 'rmd_chunk') {\n return rmdChunkHasXRef(node, 'r', id, /kable\\s*\\([\\s\\S]*caption/);\n } else if (node.type.name === 'table_container') {\n const caption = node.child(1);\n const match = caption.textContent.match(/^\\s*\\(#tab\\:([a-zA-Z0-9\\/-]+)\\)\\s*(.*)$/);\n return !!match && match[1].localeCompare(id, undefined, { sensitivity: 'accent' }) === 0;\n } else {\n return false;\n }\n },\n },\n eq: {\n nodeTypes: ['raw_block'],\n markType: 'math',\n hasXRef: (node: ProsemirrorNode, id: string, markType?: MarkType) => {\n // if it's not a mark then ensure it is tex format before proceeding\n if (!markType && (node.attrs.format !== kTexFormat)) {\n return false;\n }\n const match = node.textContent.match(/^.*\\(\\\\#eq:([a-zA-Z0-9\\/-]+)\\).*$/m);\n return !!match && match[1].localeCompare(id, undefined, { sensitivity: 'accent' }) === 0;\n },\n },\n thm: thereomLocator('theorem'),\n lem: thereomLocator('lemma'),\n cor: thereomLocator('corollary'),\n prp: thereomLocator('proposition'),\n cnj: thereomLocator('conjecture'),\n def: thereomLocator('definition'),\n exr: thereomLocator('exercise'),\n};\n\nfunction rmdChunkHasXRef(node: ProsemirrorNode, engine: string, label: string, pattern?: RegExp) {\n const chunk = rmdChunkEngineAndLabel(node.textContent);\n const match = node.textContent.match(/^\\{([a-zA-Z0-9_]+)[\\s,]+([a-zA-Z0-9/-]+)/);\n if (chunk) {\n return (\n chunk.engine.localeCompare(engine, undefined, { sensitivity: 'accent' }) === 0 &&\n chunk.label === label &&\n (!pattern || !!node.textContent.match(pattern))\n );\n } else {\n return false;\n }\n}\n\nfunction headingLocator() {\n return {\n nodeTypes: ['heading'],\n hasXRef: (node: ProsemirrorNode, id: string) => {\n // note we use default pandoc auto id semantics here no matter what the documnet\n // happens to use b/c our xref indexing code also does this (so only ids generated\n // using the 'standard' rules will be in the index)\n return node.attrs.id === id || pandocAutoIdentifier(node.textContent, false) === id;\n },\n };\n}\n\nfunction thereomLocator(engine: string) {\n return {\n nodeTypes: ['rmd_chunk'],\n hasXRef: (node: ProsemirrorNode, id: string) => {\n // look for conventional engine/label\n if (rmdChunkHasXRef(node, engine, id)) {\n return true;\n } else {\n // look for explicit label= syntax\n const match = node.textContent.match(/^\\{([a-zA-Z0-9_]+)[\\s,]+label\\s*=\\s*['\"]([^\"']+)['\"].*\\}/);\n return !!match && match[1].localeCompare(engine, undefined, { sensitivity: 'accent' }) === 0 && match[2] === id;\n }\n },\n };\n}\n","/*\n * pandoc_id.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n// emulate pandoc behavior (https://pandoc.org/MANUAL.html#headings-and-sections)\nexport function pandocAutoIdentifier(text: string, asciify: boolean) {\n if (asciify) {\n text = pandocAsciify(text);\n }\n\n return (\n text\n // Remove all non-alphanumeric characters, except underscores, hyphens, and periods.\n .replace(/[!\"#$%&')*+,\\/:;<=>?@\\[\\\\\\]^`{|}~]/g, '') // filterPunct\n\n // Replace all spaces with hyphens\n .replace(/\\s/g, '-')\n\n // Convert all alphabetic characters to lowercase\n .toLowerCase()\n\n // Remove everything up to the first letter\n .replace(/^[^A-Za-z]+/, '')\n );\n}\n\n// emulate github behavior (note that unemoji should be done prior to calling this)\n// https://pandoc.org/MANUAL.html#extension-gfm_auto_identifiers\n// https://github.com/jgm/pandoc/blob/83880b0dbc318703babfbb6905b1046fa48f1216/src/Text/Pandoc/Shared.hs#L539\nexport function gfmAutoIdentifier(text: string, asciify: boolean) {\n if (asciify) {\n text = pandocAsciify(text);\n }\n\n return text\n .replace(/[!\"#$%&')*+,\\.\\/:;<=>?@\\[\\\\\\]^`{|}~]/g, '') // filterPunct (all but underscore and hyphen)\n .replace(/\\s/g, '-') // spaceToDash\n .toLowerCase(); // toLower\n}\n\n// https://github.com/jgm/pandoc/blob/a5fa55969f1b4afc0ca3e38be50b69c65d43a460/src/Text/Pandoc/Asciify.hs\nexport function pandocAsciify(text: string) {\n const chars: number[] = [];\n const len = text.length;\n let newch;\n for (let i = 0; i < len; i++) {\n newch = '';\n const ch = text.charCodeAt(i);\n switch (ch) {\n case 192:\n case 193:\n case 194:\n case 195:\n case 196:\n case 197:\n case 256:\n case 258:\n case 260:\n case 461:\n case 512:\n case 514:\n case 550:\n case 7680:\n case 7840:\n case 7842:\n newch = 'A';\n break;\n\n case 7682:\n case 7684:\n case 7686:\n newch = 'B';\n break;\n\n case 199:\n case 262:\n case 264:\n case 266:\n case 268:\n newch = 'C';\n break;\n\n case 270:\n case 7690:\n case 7692:\n case 7694:\n case 7696:\n case 7698:\n newch = 'D';\n break;\n\n case 200:\n case 201:\n case 203:\n case 274:\n case 276:\n case 278:\n case 280:\n case 282:\n case 516:\n case 518:\n case 552:\n case 7704:\n case 7706:\n case 7864:\n case 7866:\n case 7868:\n newch = 'E';\n break;\n\n case 7710:\n newch = 'F';\n break;\n\n case 284:\n case 286:\n case 288:\n case 290:\n case 486:\n case 500:\n case 7712:\n newch = 'G';\n break;\n\n case 292:\n case 542:\n case 7714:\n case 7716:\n case 7718:\n case 7720:\n case 7722:\n newch = 'H';\n break;\n\n case 204:\n case 205:\n case 206:\n case 207:\n case 296:\n case 298:\n case 300:\n case 302:\n case 304:\n case 463:\n case 520:\n case 522:\n case 7724:\n case 7880:\n case 7882:\n newch = 'I';\n break;\n\n case 308:\n newch = 'J';\n break;\n\n case 310:\n case 488:\n case 7728:\n case 7730:\n case 7732:\n case 8490:\n newch = 'K';\n break;\n\n case 313:\n case 315:\n case 317:\n case 7734:\n case 7738:\n case 7740:\n newch = 'L';\n break;\n\n case 7742:\n case 7744:\n case 7746:\n newch = 'M';\n break;\n\n case 209:\n case 323:\n case 325:\n case 327:\n case 504:\n case 7748:\n case 7750:\n case 7752:\n case 7754:\n newch = 'N';\n break;\n\n case 210:\n case 211:\n case 212:\n case 213:\n case 214:\n case 332:\n case 334:\n case 336:\n case 416:\n case 465:\n case 490:\n case 524:\n case 526:\n case 558:\n case 7884:\n case 7886:\n newch = 'O';\n break;\n\n case 7764:\n case 7766:\n newch = 'P';\n break;\n\n case 340:\n case 342:\n case 344:\n case 528:\n case 530:\n case 7768:\n case 7770:\n case 7774:\n newch = 'R';\n break;\n\n case 346:\n case 348:\n case 350:\n case 352:\n case 536:\n case 7776:\n case 7778:\n newch = 'S';\n break;\n\n case 354:\n case 356:\n case 538:\n case 7786:\n case 7788:\n case 7790:\n case 7792:\n newch = 'T';\n break;\n\n case 217:\n case 218:\n case 219:\n case 220:\n case 360:\n case 362:\n case 364:\n case 366:\n case 368:\n case 370:\n case 431:\n case 467:\n case 532:\n case 534:\n case 7794:\n case 7796:\n case 7798:\n case 7908:\n case 7910:\n newch = 'U';\n break;\n\n case 7804:\n case 7806:\n newch = 'V';\n break;\n\n case 372:\n case 7808:\n case 7810:\n case 7812:\n case 7814:\n case 7816:\n newch = 'W';\n break;\n\n case 7818:\n case 7820:\n newch = 'X';\n break;\n\n case 221:\n case 374:\n case 376:\n case 562:\n case 7822:\n case 7922:\n case 7924:\n case 7926:\n case 7928:\n newch = 'Y';\n break;\n\n case 377:\n case 379:\n case 381:\n case 7824:\n case 7826:\n case 7828:\n newch = 'Z';\n break;\n\n case 224:\n case 225:\n case 226:\n case 227:\n case 228:\n case 229:\n case 257:\n case 259:\n case 261:\n case 462:\n case 513:\n case 515:\n case 551:\n case 553:\n case 7681:\n case 7841:\n case 7843:\n newch = 'a';\n break;\n\n case 7683:\n case 7685:\n case 7687:\n newch = 'b';\n break;\n\n case 231:\n case 263:\n case 265:\n case 267:\n case 269:\n newch = 'c';\n break;\n\n case 271:\n case 7691:\n case 7693:\n case 7695:\n case 7697:\n case 7699:\n newch = 'd';\n break;\n\n case 232:\n case 233:\n case 234:\n case 235:\n case 275:\n case 277:\n case 279:\n case 281:\n case 283:\n case 517:\n case 519:\n case 7705:\n case 7707:\n case 7865:\n case 7867:\n case 7869:\n newch = 'e';\n break;\n\n case 7711:\n newch = 'f';\n break;\n\n case 285:\n case 287:\n case 289:\n case 291:\n case 487:\n case 501:\n case 7713:\n newch = 'g';\n break;\n\n case 293:\n case 543:\n case 7715:\n case 7717:\n case 7719:\n case 7721:\n case 7723:\n case 7830:\n newch = 'h';\n break;\n\n case 236:\n case 237:\n case 238:\n case 239:\n case 297:\n case 299:\n case 301:\n case 303:\n case 305:\n case 464:\n case 521:\n case 523:\n case 7725:\n case 7881:\n case 7883:\n newch = 'i';\n break;\n\n case 309:\n case 496:\n newch = 'j';\n break;\n\n case 311:\n case 489:\n case 7729:\n case 7731:\n case 7733:\n newch = 'k';\n break;\n\n case 314:\n case 316:\n case 318:\n case 7735:\n case 7739:\n case 7741:\n newch = 'l';\n break;\n\n case 7743:\n case 7745:\n case 7747:\n newch = 'm';\n break;\n\n case 241:\n case 324:\n case 326:\n case 328:\n case 505:\n case 7749:\n case 7751:\n case 7753:\n case 7755:\n newch = 'n';\n break;\n\n case 242:\n case 243:\n case 244:\n case 245:\n case 246:\n case 333:\n case 335:\n case 337:\n case 417:\n case 432:\n case 466:\n case 491:\n case 525:\n case 527:\n case 559:\n case 7885:\n case 7887:\n newch = 'o';\n break;\n\n case 7765:\n case 7767:\n newch = 'p';\n break;\n\n case 341:\n case 343:\n case 345:\n case 529:\n case 531:\n case 7769:\n case 7771:\n case 7775:\n newch = 'r';\n break;\n\n case 347:\n case 349:\n case 351:\n case 353:\n case 537:\n case 7777:\n case 7779:\n newch = 's';\n break;\n\n case 355:\n case 357:\n case 539:\n case 7787:\n case 7789:\n case 7791:\n case 7793:\n case 7831:\n newch = 't';\n break;\n\n case 249:\n case 250:\n case 251:\n case 252:\n case 361:\n case 363:\n case 365:\n case 367:\n case 369:\n case 371:\n case 468:\n case 533:\n case 535:\n case 7795:\n case 7797:\n case 7799:\n case 7909:\n case 7911:\n newch = 'u';\n break;\n\n case 7805:\n case 7807:\n newch = 'v';\n break;\n\n case 373:\n case 7809:\n case 7811:\n case 7813:\n case 7815:\n case 7817:\n case 7832:\n newch = 'w';\n break;\n\n case 7819:\n case 7821:\n newch = 'x';\n break;\n\n case 253:\n case 255:\n case 375:\n case 563:\n case 7833:\n case 7923:\n case 7925:\n case 7927:\n case 7929:\n newch = 'y';\n break;\n\n case 378:\n case 380:\n case 382:\n case 7825:\n case 7827:\n case 7829:\n newch = 'z';\n break;\n\n case 894:\n newch = ';';\n break;\n\n case 8175:\n newch = '`';\n break;\n\n case 8800:\n newch = '=';\n break;\n\n case 8814:\n newch = '<';\n break;\n\n case 8815:\n newch = '>';\n break;\n }\n if (newch) {\n chars.push(newch.charCodeAt(0));\n } else if (ch < 128) {\n chars.push(ch);\n }\n }\n\n // return string\n return String.fromCharCode(...chars);\n}\n","/*\n * raw.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { Schema } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\n\nimport { findParentNodeOfType, setTextSelection } from 'prosemirror-utils';\n\nimport { EditorUI } from './ui';\nimport { setBlockType } from 'prosemirror-commands';\n\nexport const kTexFormat = 'tex';\nexport const kHTMLFormat = 'html';\nexport const kHTML4Format = 'html4';\nexport const kHTML5Format = 'html5';\n\nexport function isRawHTMLFormat(format: string) {\n return [kHTMLFormat, kHTML4Format, kHTML5Format].includes(format);\n}\n\nexport function editRawBlockCommand(ui: EditorUI, outputFormats: string[]) {\n return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n const schema = state.schema;\n\n // enable if we are either inside a raw block or we can insert a raw block\n const rawBlock = findParentNodeOfType(schema.nodes.raw_block)(state.selection);\n\n if (!rawBlock && !setBlockType(schema.nodes.raw_block, { format: 'html' })(state)) {\n return false;\n }\n\n async function asyncEditRawBlock() {\n if (dispatch) {\n // get existing attributes (if any)\n const raw = {\n format: '',\n content: '',\n };\n if (rawBlock) {\n raw.format = rawBlock.node.attrs.format;\n }\n\n // show dialog\n const result = await ui.dialogs.editRawBlock(raw, outputFormats);\n if (result) {\n const tr = state.tr;\n\n // remove means convert the block to text\n if (rawBlock) {\n const range = { from: rawBlock.pos, to: rawBlock.pos + rawBlock.node.nodeSize };\n if (result.action === 'remove') {\n tr.setBlockType(range.from, range.to, schema.nodes.paragraph);\n } else if (result.action === 'edit') {\n tr.setNodeMarkup(range.from, rawBlock.node.type, { format: result.raw.format });\n setTextSelection(tr.selection.from - 1, -1)(tr);\n }\n } else {\n insertRawNode(tr, result.raw.format);\n }\n\n dispatch(tr);\n }\n }\n\n if (view) {\n view.focus();\n }\n }\n asyncEditRawBlock();\n\n return true;\n };\n}\n\n// function to create a raw node\nfunction createRawNode(schema: Schema, format: string) {\n return schema.nodes.raw_block.create({ format })!;\n}\n\n// function to create and insert a raw node, then set selection inside of it\nfunction insertRawNode(tr: Transaction, format: string) {\n const schema = tr.doc.type.schema;\n const prevSel = tr.selection;\n tr.replaceSelectionWith(createRawNode(schema, format), false);\n setTextSelection(tr.mapping.map(prevSel.from), -1)(tr);\n}\n","/*\n * image.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { kPixelUnit, kPercentUnit } from './css';\n\nconst kDpi = 96;\n\n// https://github.com/jgm/pandoc/blob/master/src/Text/Pandoc/ImageSize.hs\nexport const kValidUnits = [kPixelUnit, 'in', 'cm', 'mm', kPercentUnit];\n\nexport enum ImageType {\n Image,\n Figure,\n}\n\nexport interface ImageDimensions {\n naturalWidth: number | null;\n naturalHeight: number | null;\n containerWidth: number;\n}\n\nexport function isValidImageSizeUnit(unit: string) {\n return kValidUnits.includes(unit);\n}\n\nexport function imageSizePropWithUnit(prop: string | null) {\n if (prop) {\n const match = prop.match(/(^\\d*\\.?\\d*)(.*)$/);\n if (match) {\n return {\n size: parseFloat(match[1]),\n unit: match[2],\n };\n } else {\n return null;\n }\n } else {\n return null;\n }\n}\n\nexport function isNaturalAspectRatio(width: number, height: number, dims: ImageDimensions, defaultValue: boolean) {\n if (dims.naturalWidth && dims.naturalHeight) {\n const diff = Math.abs(width / height - dims.naturalWidth / dims.naturalHeight);\n return diff <= 0.01 * (width / height);\n } else {\n // no naturalWidth or naturalHeight, return default\n return defaultValue;\n }\n}\n\nexport function unitToPixels(value: number, unit: string, containerWidth: number) {\n let pixels;\n switch (unit) {\n case 'in':\n pixels = value * kDpi;\n break;\n case 'mm':\n pixels = value * (kDpi / 25.4);\n break;\n case 'cm':\n pixels = value * (kDpi / 2.54);\n break;\n case kPercentUnit:\n pixels = (value / 100) * ensureContainerWidth(containerWidth);\n break;\n case kPixelUnit:\n default:\n pixels = value;\n break;\n }\n return Math.round(pixels);\n}\n\nexport function pixelsToUnit(pixels: number, unit: string, containerWidth: number) {\n switch (unit) {\n case 'in':\n return pixels / kDpi;\n case 'mm':\n return (pixels / kDpi) * 25.4;\n case 'cm':\n return (pixels / kDpi) * 2.54;\n case kPercentUnit:\n return (pixels / ensureContainerWidth(containerWidth)) * 100;\n case kPixelUnit:\n default:\n return pixels;\n }\n}\n\nexport function roundUnit(value: number, unit: string) {\n switch (unit) {\n case 'in':\n return value.toFixed(2);\n case 'cm':\n return value.toFixed(1);\n default:\n return Math.round(value).toString();\n }\n}\n\n// sometime when we are called before the DOM renders the containerWidth\n// is 0, in this case provide a default of 1000\nexport function ensureContainerWidth(containerWidth: number) {\n return containerWidth || 1000;\n}\n","/*\n * extension.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Transaction } from 'prosemirror-state';\n\nexport enum FixupContext {\n Load,\n Save,\n Resize,\n}\n\nexport type FixupFn = (tr: Transaction, fixupContext: FixupContext) => Transaction;\n","/*\n * css.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { kWidthAttrib, kHeightAttrib, kStyleAttrib } from './pandoc_attr';\n\nexport const kPercentUnit = '%';\nexport const kPixelUnit = 'px';\nexport function removeStyleAttrib(style: string, attrib: string, handler?: (attrib: string, value: string) => void) {\n const pattern = '(' + attrib + ')\\\\:\\\\s*([^;]+);?';\n const regex = new RegExp(pattern, 'g');\n return style.replace(regex, (_match, p1, p2) => {\n if (handler) {\n handler(p1, p2);\n }\n return '';\n });\n}\n\nexport function extractSizeStyles(keyvalues: Array<[string, string]> | undefined) {\n if (!keyvalues) {\n return keyvalues;\n }\n\n let newKeyvalues = keyvalues;\n\n const getValue = (key: string) => {\n const pair = newKeyvalues.find(keyvalue => keyvalue[0] === key);\n return pair ? pair[1] : null;\n };\n\n const setValue = (key: string, value: string | null) => {\n newKeyvalues = newKeyvalues.filter(keyvalue => keyvalue[0] !== key);\n if (value) {\n newKeyvalues.push([key, value]);\n }\n };\n\n let width = getValue(kWidthAttrib);\n let height = getValue(kHeightAttrib);\n let style = getValue(kStyleAttrib);\n\n if (style) {\n style = removeStyleAttrib(style, kWidthAttrib, (_attrib, value) => {\n if (!width) {\n width = value;\n }\n });\n style = removeStyleAttrib(style, kHeightAttrib, (_attrib, value) => {\n if (!height) {\n height = value;\n }\n });\n\n // remove leading ; from style\n style = style.replace(/^\\s*;+\\s*/, '').trimLeft();\n }\n\n setValue(kWidthAttrib, width);\n setValue(kHeightAttrib, height);\n setValue(kStyleAttrib, style);\n\n return newKeyvalues;\n}\n\nexport function applyStyles(el: HTMLElement, classes?: string[], style?: { [key: string]: string }) {\n if (classes) {\n if (classes) {\n classes.forEach(clz => el.classList.add(clz));\n }\n }\n if (style) {\n Object.keys(style).forEach(name => {\n el.style.setProperty(name, style[name]);\n });\n }\n}\n\nexport function replaceClassWithStyle(el: HTMLElement, className: string, style: { [key: string]: string }) {\n if (el.classList.contains(className)) {\n el.classList.remove(className);\n if (el.classList.length === 0) {\n el.removeAttribute('class');\n }\n\n Object.keys(style).forEach(name => {\n el.style.setProperty(name, style[name]);\n });\n }\n const children: any = el.children;\n for (const child of children) {\n replaceClassWithStyle(child, className, style);\n }\n}\n","/*\n * diff.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { diff_match_patch, DIFF_DELETE, DIFF_EQUAL, DIFF_INSERT } from 'diff-match-patch';\n\nexport enum EditorChangeType {\n Insert = 1,\n Equal = 0,\n Delete = -1,\n}\n\nexport interface EditorChange {\n type: EditorChangeType;\n value: string;\n}\n\nexport function diffChars(from: string, to: string, timeout: number): EditorChange[] {\n const dmp = new diff_match_patch();\n dmp.Diff_Timeout = timeout;\n const diff = dmp.diff_main(from, to);\n dmp.diff_cleanupSemantic(diff);\n return diff.map(d => {\n let type: EditorChangeType;\n switch (d[0]) {\n case DIFF_INSERT:\n type = EditorChangeType.Insert;\n break;\n case DIFF_EQUAL:\n type = EditorChangeType.Equal;\n break;\n case DIFF_DELETE:\n type = EditorChangeType.Delete;\n break;\n default:\n throw new Error('Unexpected diff type: ' + d[0]);\n }\n return {\n type,\n value: d[1],\n };\n });\n}\n","/*\n * input_rule.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { Schema, MarkType, NodeType, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { InputRule, wrappingInputRule } from 'prosemirror-inputrules';\n\nimport { PandocMark, markIsActive } from './mark';\n\nexport function markInputRule(\n regexp: RegExp,\n markType: MarkType,\n filter: MarkInputRuleFilter,\n getAttrs?: ((match: string[]) => object) | object,\n) {\n return new InputRule(regexp, (state: EditorState, match: string[], start: number, end: number) => {\n if (!filter(state, start, end)) {\n return null;\n }\n\n // remove any leading delimter (modulo spaces)\n const textIndex = match[0].indexOf(match[1]);\n const prefix = match[0].substring(0, textIndex).replace(/^\\s/, \"\");\n const delimStart = start + textIndex - prefix.length;\n const tr = state.tr;\n tr.delete(delimStart, delimStart + prefix.length);\n\n // create mark\n const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs;\n const mark = markType.create(attrs);\n\n // apply it to the matching core text\n const markStart = start + textIndex - prefix.length;\n tr.addMark(markStart, markStart + match[1].length, mark);\n tr.removeStoredMark(mark); // Do not continue with mark.\n return tr;\n });\n}\n\nexport function delimiterMarkInputRule(\n delim: string,\n markType: MarkType,\n filter: MarkInputRuleFilter,\n prefixMask?: string,\n noEnclosingWhitespace?: boolean,\n) {\n // create distinct patterns depending on whether we allow enclosing whitespace\n const contentPattern = noEnclosingWhitespace\n ? `[^\\\\s${delim}][^${delim}]+[^\\\\s${delim}]|[^\\\\s${delim}]{1,2}`\n : `[^${delim}]+`;\n\n // if there is no prefix mask then this is simple regex we can pass to markInputRule\n if (!prefixMask) {\n const regexp = `(?:${delim})(${contentPattern})(?:${delim})$`;\n return markInputRule(new RegExp(regexp), markType, filter);\n\n // otherwise we need custom logic to get mark placement/eliding right\n } else {\n // build regex\n const regexp = `(^|[^${prefixMask}])(?:${delim})(${contentPattern})(?:${delim})$`;\n\n // return rule\n return new InputRule(new RegExp(regexp), (state: EditorState, match: string[], start: number, end: number) => {\n if (!filter(state, start, end)) {\n return null;\n }\n\n // init transaction\n const tr = state.tr;\n\n // compute offset for mask (should be zero if this was the beginning of a line,\n // in all other cases it would be the length of the any mask found).\n const maskOffset = match[1].length;\n\n // position of text to be formatted\n const textStart = start + match[0].indexOf(match[2]);\n const textEnd = textStart + match[2].length;\n\n // remove trailing markdown\n tr.delete(textEnd, end);\n\n // update start/end to reflect the leading mask which we want to leave alone\n start = start + maskOffset;\n end = start + match[2].length;\n\n // remove leading markdown\n tr.delete(start, textStart);\n\n // add mark\n const mark = markType.create();\n tr.addMark(start, end, mark);\n\n // remove stored mark so typing continues w/o the mark\n tr.removeStoredMark(mark);\n\n // return transaction\n return tr;\n });\n }\n}\n\nexport type MarkInputRuleFilter = (context: EditorState | Transaction, from?: number, to?: number) => boolean;\n\nexport function markInputRuleFilter(schema: Schema, marks: readonly PandocMark[]): MarkInputRuleFilter {\n const maskedMarkTypes = marksWithNoInputRules(schema, marks);\n\n return (context: EditorState | Transaction, from?: number, to?: number) => {\n if (from !== undefined && to !== undefined && from !== to) {\n const marksInRange: MarkType[] = [];\n context.doc.nodesBetween(from, to, node => {\n node.marks.forEach(mark => marksInRange.push(mark.type));\n });\n return !marksInRange.some(markType => maskedMarkTypes.includes(markType));\n }\n if (from === undefined) {\n for (const markType of maskedMarkTypes) {\n if (markIsActive(context, markType)) {\n return false;\n }\n }\n }\n return true;\n };\n}\n\nexport function conditionalWrappingInputRule(\n regexp: RegExp,\n nodeType: NodeType,\n predicate: (state: EditorState) => boolean,\n getAttrs?: { [key: string]: any } | ((p: string[]) => { [key: string]: any } | null | undefined),\n joinPredicate?: (p1: string[], p2: ProsemirrorNode) => boolean,\n): InputRule {\n const wrappingRule: any = wrappingInputRule(regexp, nodeType, getAttrs, joinPredicate);\n return new InputRule(regexp, (state: EditorState, match: string[], start: number, end: number) => {\n if (!predicate(state)) {\n return null;\n }\n return wrappingRule.handler(state, match, start, end);\n });\n}\n\nfunction marksWithNoInputRules(schema: Schema, marks: readonly PandocMark[]): MarkType[] {\n const disabledMarks: MarkType[] = [];\n marks.forEach((mark: PandocMark) => {\n if (mark.noInputRules) {\n disabledMarks.push(schema.marks[mark.name]);\n }\n });\n return disabledMarks;\n}\n","/*\n * wrap.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Transaction } from 'prosemirror-state';\nimport { Transform } from 'prosemirror-transform';\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\n\nimport { split } from 'sentence-splitter';\n\nimport { trTransform } from './transaction';\nimport { findChildrenByType, findParentNodeOfTypeClosestToPos } from 'prosemirror-utils';\n\nexport function wrapSentences(tr: Transaction) {\n trTransform(tr, wrapSentencesTransform);\n}\n\nfunction wrapSentencesTransform(tr: Transform) {\n // find all paragraphs in doc\n const schema = tr.doc.type.schema;\n const paragraphs = findChildrenByType(tr.doc, schema.nodes.paragraph);\n\n // insert linebreaks in paragraphs (go backwards to preserve positions)\n paragraphs.reverse().forEach(paragraph => {\n // don't break sentences inside tight list items\n const $pos = tr.doc.resolve(paragraph.pos);\n const parent = $pos.node($pos.depth);\n if (parent.type === schema.nodes.list_item && $pos.node($pos.depth - 1).attrs.tight) {\n return;\n }\n\n // don't break sentences inside tables\n if (schema.nodes.table && findParentNodeOfTypeClosestToPos($pos, schema.nodes.table)) {\n return;\n }\n\n // extract text (use \\n for hard_break)\n // based on https://github.com/ProseMirror/prosemirror-model/blob/eef20c8c6dbf841b1d70859df5d59c21b5108a4f/src/fragment.js#L46\n // (but do no handling for leafs b/c we don't have any in our schema and nothing for blocks\n // b/c this is a paragraph so won't have nested blocks. We use our own implementation so that\n // we can correctly count node types that imply text but don't actually have any text\n // (e.g. hard_break)\n \n let textContent = \"\";\n const paraContent = paragraph.node.content;\n const from = 0;\n const to = paraContent.size;\n paraContent.nodesBetween(from, to, (node: ProsemirrorNode, pos: number) => {\n if (node.isText) {\n textContent += node.text!.slice(Math.max(from, pos) - pos, to - pos);\n } else if (node.type.name === \"hard_break\") {\n textContent += \"\\n\";\n }\n }, 0);\n\n // don't break bookdown text references\n if (/^\\(ref\\:[^\\s]+\\)\\s+[^\\s]/.test(textContent)) {\n return;\n }\n\n // break sentences in text\n const parts = split(textContent);\n parts\n .reverse()\n .filter(part => part.type === 'Sentence')\n .forEach(sentence => {\n // don't break sentence if at least one mark is active\n if (tr.doc.resolve(paragraph.pos + sentence.range[1] + 1).marks().length === 0) {\n const hardBreak = schema.text('\\n');\n const hardBreakPos = paragraph.pos + sentence.range[1] + 2;\n tr.insert(hardBreakPos, hardBreak);\n }\n });\n });\n}\n","/*\n * yaml_metadata-title.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Plugin, PluginKey, Transaction, EditorState } from 'prosemirror-state';\n\nimport { transactionsAreTypingChange, transactionsHaveChange } from '../../api/transaction';\nimport {\n isYamlMetadataNode,\n yamlMetadataNodes,\n kYamlMetadataTitleRegex,\n titleFromState,\n} from '../../api/yaml';\n\nconst plugin = new PluginKey<string>('yaml-metadata-title');\n\nexport function yamlMetadataTitlePlugin() {\n return new Plugin<string>({\n key: plugin,\n state: {\n init(_config, state: EditorState) {\n return titleFromState(state);\n },\n\n apply(tr: Transaction, title: string, oldState: EditorState, newState: EditorState) {\n const transactions = [tr];\n\n // doc didn't change, return existing title\n if (!tr.docChanged) {\n return title;\n\n // non-typing change, do a full rescan\n } else if (!transactionsAreTypingChange(transactions)) {\n return titleFromState(newState);\n\n // change that affects a yaml metadata block, do a full rescan\n } else if (transactionsHaveChange(transactions, oldState, newState, isYamlMetadataNode)) {\n return titleFromState(newState);\n }\n\n // otherwise return the existing title\n else {\n return title;\n }\n },\n },\n });\n}\n\nexport function getTitle(state: EditorState) {\n return plugin.getState(state);\n}\n\nexport function setTitle(state: EditorState, title: string) {\n // alias schema\n const schema = state.schema;\n\n // no-op if yaml_metadata isn't available\n if (!schema.nodes.yaml_metadata) {\n return;\n }\n\n // create transaction\n const tr = state.tr;\n\n // escape quotes in title then build the title line\n const escapedTitle = title.replace(/\"/g, `\\\\\"`);\n const titleLine = `\\ntitle: \"${escapedTitle}\"\\n`;\n\n // attempt to update existing title\n const yamlNodes = yamlMetadataNodes(tr.doc);\n let foundTitle = false;\n for (const yaml of yamlNodes) {\n const titleMatch = yaml.node.textContent.match(kYamlMetadataTitleRegex);\n if (titleMatch) {\n const updatedMetadata = yaml.node.textContent.replace(kYamlMetadataTitleRegex, titleLine);\n const updatedNode = schema.nodes.yaml_metadata.createAndFill({}, schema.text(updatedMetadata));\n tr.replaceRangeWith(yaml.pos, yaml.pos + yaml.node.nodeSize, updatedNode);\n foundTitle = true;\n break;\n }\n }\n\n // if we didn't find a title then inject one at the top\n if (!foundTitle) {\n const yamlText = schema.text(`---${titleLine}---`);\n const yamlNode = schema.nodes.yaml_metadata.create({}, yamlText);\n tr.insert(1, yamlNode);\n }\n\n // return transaction\n return tr;\n}\n\n","/*\n * oultine.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Plugin, PluginKey, EditorState, Transaction } from 'prosemirror-state';\nimport { Schema, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\n\nimport { NodeWithPos } from 'prosemirror-utils';\n\nimport { Extension } from '../api/extension';\nimport { transactionsHaveChange, kSetMarkdownTransaction } from '../api/transaction';\nimport { findTopLevelBodyNodes } from '../api/node';\nimport { uuidv4 } from '../api/util';\nimport {\n EditorOutlineItem,\n EditorOutlineItemType,\n EditorOutline,\n isOutlineNode,\n getEditingOutlineLocation,\n getDocumentOutline,\n} from '../api/outline';\nimport { navigateToPos } from '../api/navigation';\nimport { ProsemirrorCommand, EditorCommandId } from '../api/command';\nimport { rmdChunkEngineAndLabel } from '../api/rmd';\n\nconst kOutlineIdsTransaction = 'OutlineIds';\n\nconst plugin = new PluginKey<EditorOutline>('outline');\n\nconst extension: Extension = {\n appendTransaction: (schema: Schema) => {\n return [\n {\n name: 'outline',\n filter: hasOutlineIdsTransaction,\n nodeFilter: isOutlineNode,\n append: (tr: Transaction) => {\n const usedIds = new Set<string>();\n const needsOutlineId = (node: ProsemirrorNode) => {\n if (isOutlineNode(node)) {\n if (node.attrs.navigation_id === null) {\n return true;\n } else if (usedIds.has(node.attrs.navigation_id)) {\n return true;\n } else {\n usedIds.add(node.attrs.navigation_id);\n return false;\n }\n } else {\n return false;\n }\n };\n const needsOutlineIdNodes = findTopLevelBodyNodes(tr.doc, needsOutlineId);\n needsOutlineIdNodes.forEach(outlineId => {\n tr.setNodeMarkup(outlineId.pos, outlineId.node.type, {\n ...outlineId.node.attrs,\n navigation_id: uuidv4(),\n });\n tr.setMeta(kOutlineIdsTransaction, true);\n });\n },\n },\n ];\n },\n\n commands: () => {\n return [\n new ProsemirrorCommand(EditorCommandId.GoToNextSection, ['Mod-PageDown'], goToOutlineCommand('next', 'section')),\n new ProsemirrorCommand(EditorCommandId.GoToPreviousSection, ['Mod-PageUp'], goToOutlineCommand('previous', 'section')),\n new ProsemirrorCommand(EditorCommandId.GoToNextChunk, [], goToOutlineCommand('next', 'chunk')),\n new ProsemirrorCommand(EditorCommandId.GoToPreviousChunk, [], goToOutlineCommand('previous', 'chunk')),\n ];\n },\n\n plugins: (schema: Schema) => {\n return [\n new Plugin<EditorOutline>({\n key: plugin,\n\n // track editor outline as state changes\n state: {\n init: (_config, state: EditorState) => {\n return editorOutline(state);\n },\n apply: (tr: Transaction, value: EditorOutline, oldState: EditorState, newState: EditorState) => {\n if (transactionsAffectOutline([tr], oldState, newState)) {\n return editorOutline(newState);\n } else {\n return value; // don't need to map b/c there are no positions in the data structure\n }\n },\n },\n }),\n ];\n },\n};\n\nexport function goToOutlineCommand(dir: 'next' | 'previous', targetType: 'chunk' | 'section') {\n return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n if (dispatch && view) {\n let outline = getDocumentOutline(state);\n if (dir === 'previous') {\n outline = outline.reverse();\n }\n const target = outline.find(nodeWithPos => {\n // if we are only targeting chunks, do not navigate to other types, and vice versa\n const isChunk = nodeWithPos.node.type === state.schema.nodes.rmd_chunk;\n if (isChunk !== (targetType === 'chunk')) {\n return false;\n }\n\n if (dir === 'next') {\n return nodeWithPos.pos > state.selection.head;\n } else {\n return nodeWithPos.pos < state.selection.head - 1;\n }\n });\n if (target) {\n navigateToPos(view, target.pos, false);\n }\n }\n return true;\n };\n}\n\nfunction editorOutline(state: EditorState): EditorOutline {\n // get all of the headings (bail if there are none)\n const doc = state.doc;\n const outlineNodes = findTopLevelBodyNodes(doc, isOutlineNode);\n if (!outlineNodes.length) {\n return [];\n }\n\n // create mapping of node type names to their current sequence\n const sequence = new Map<string, number>();\n\n // function to create an outline item from a node\n const editorOutlineItem = (nodeWithPos: NodeWithPos, defaultLevel: number) => {\n const typename = nodeWithPos.node.type.name;\n\n // build sequence (ordinal of entry within node type)\n let sequenceLast = sequence.get(typename);\n if (sequenceLast === undefined) {\n sequenceLast = 0;\n }\n const sequenceNext = sequenceLast + 1;\n sequence.set(typename, sequenceNext);\n\n const item = {\n navigation_id: nodeWithPos.node.attrs.navigation_id,\n type: nodeWithPos.node.type.name as EditorOutlineItemType,\n level: nodeWithPos.node.attrs.level || defaultLevel,\n title: nodeWithPos.node.type.spec.code ? nodeWithPos.node.type.name : nodeWithPos.node.textContent,\n sequence: sequenceNext,\n children: [],\n };\n \n // if this is an R Markdown chunk, extract the title from the chunk\n if (nodeWithPos.node.type.name === 'rmd_chunk') {\n const chunk = rmdChunkEngineAndLabel(nodeWithPos.node.textContent);\n if (chunk) {\n item.title = chunk.label;\n }\n }\n return item; \n };\n\n // extract the outline\n const rootOutlineItem: EditorOutlineItem = {\n navigation_id: '',\n type: '' as EditorOutlineItemType,\n level: 0,\n sequence: 0,\n title: '',\n children: [],\n };\n const containers: EditorOutlineItem[] = [];\n containers.push(rootOutlineItem);\n const top = () => containers[containers.length - 1];\n outlineNodes.forEach(nodeWithPos => {\n // get outline item from document node\n const outlineItem = editorOutlineItem(nodeWithPos, top().level + 1);\n\n // pop containers until we reach <= our level\n while (outlineItem.level <= top().level) {\n containers.pop();\n }\n\n // add the outline node\n top().children.push(outlineItem);\n\n // make it the the active container if it's a heading\n if (outlineItem.type === 'heading') {\n containers.push(outlineItem);\n }\n });\n\n // return children of root\n return rootOutlineItem.children;\n}\n\nfunction hasOutlineIdsTransaction(transactions: Transaction[]) {\n return transactions.some(tr => tr.getMeta(kOutlineIdsTransaction));\n}\n\nfunction transactionsAffectOutline(transactions: Transaction[], oldState: EditorState, newState: EditorState) {\n return (\n transactions.some(tr => tr.getMeta(kSetMarkdownTransaction)) ||\n hasOutlineIdsTransaction(transactions) ||\n transactionsHaveChange(transactions, oldState, newState, isOutlineNode)\n );\n}\n\nexport function getOutline(state: EditorState): EditorOutline {\n return plugin.getState(state)!;\n}\n\nexport default extension;\n","/*\n * find.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Extension } from '../api/extension';\nimport { Plugin, PluginKey, EditorState, Transaction, TextSelection } from 'prosemirror-state';\nimport { DecorationSet, Decoration, EditorView } from 'prosemirror-view';\n\nimport { mergedTextNodes } from '../api/text';\nimport { kAddToHistoryTransaction } from '../api/transaction';\nimport { editingRootNode } from '../api/node';\nimport zenscroll from 'zenscroll';\n\nconst key = new PluginKey<DecorationSet>('find-plugin');\n\nclass FindPlugin extends Plugin<DecorationSet> {\n private term: string = '';\n private options: FindOptions = {};\n private updating: boolean = false;\n\n // The HTML element containing the last known selected search result\n private resultElement: HTMLElement|null = null;\n\n // A DOM mutation observer that watches for search results to be rendered\n private resultObserver: MutationObserver|null = null;\n\n // The ID for a timer that ensures the resultObserver completes quickly\n private resultObserverTimer: number = 0;\n\n constructor() {\n super({\n key,\n state: {\n init: (_config: { [key: string]: any }, instance: EditorState) => {\n return DecorationSet.empty;\n },\n apply: (tr: Transaction, old: DecorationSet, oldState: EditorState, newState: EditorState) => {\n if (this.updating) {\n return this.resultDecorations(tr);\n } else {\n return DecorationSet.empty;\n }\n },\n },\n view: () => ({\n update: (view: EditorView, prevState: EditorState) => {\n // Clear any previous search result observer\n this.clearResultObserver();\n\n // If there is a search result selected, navigate to it\n if (this.isResultSelected(view.state)) {\n this.scrollToSelectedResult(view, null);\n }\n },\n }),\n props: {\n decorations: (state: EditorState) => {\n return key.getState(state);\n },\n },\n });\n }\n\n public find(term: string, options: FindOptions) {\n return (state: EditorState<any>, dispatch?: (tr: Transaction<any>) => void) => {\n if (dispatch) {\n this.term = !options.regex ? term.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, (escape: string) => {\n return '\\\\u' + ('0000' + escape.charCodeAt(0).toString(16)).slice(-4);\n }) : term;\n this.options = options;\n this.updateResults(state, dispatch);\n }\n return true;\n };\n }\n\n public matchCount(state: EditorState) {\n return key.getState(state)!.find().length;\n }\n\n public selectFirst() {\n return (state: EditorState<any>, dispatch?: (tr: Transaction<any>) => void) => {\n const decorations: Decoration[] = key.getState(state)!.find(0);\n if (decorations.length === 0) {\n return false;\n }\n\n if (dispatch) {\n const tr = state.tr;\n this.selectResult(tr, decorations[0]);\n this.withResultUpdates(() => {\n dispatch(tr);\n });\n }\n\n return true;\n };\n }\n\n public selectCurrent() {\n return this.selectNext(false);\n }\n\n public selectNext(afterSelection = true) {\n return (state: EditorState<any>, dispatch?: (tr: Transaction<any>) => void) => {\n const selectedText = state.doc.textBetween(state.selection.from, state.selection.to);\n const searchFrom = afterSelection\n ? this.matchesTerm(selectedText)\n ? state.selection.to + 1\n : state.selection.to\n : state.selection.from;\n\n const decorationSet = key.getState(state)!;\n let decorations: Decoration[] = decorationSet.find(searchFrom);\n if (decorations.length === 0) {\n // check for wrapping\n if (this.options.wrap) {\n const searchTo = this.matchesTerm(selectedText) ? state.selection.from - 1 : state.selection.from;\n decorations = decorationSet.find(0, searchTo);\n if (decorations.length === 0) {\n return false;\n }\n // no wrapping\n } else {\n return false;\n }\n }\n\n if (dispatch) {\n const tr = state.tr;\n this.selectResult(tr, decorations[0]);\n this.withResultUpdates(() => {\n dispatch(tr);\n });\n }\n return true;\n };\n }\n\n public selectPrevious() {\n return (state: EditorState<any>, dispatch?: (tr: Transaction<any>) => void) => {\n // sort out where we are searching up to\n const selectedText = state.doc.textBetween(state.selection.from, state.selection.to);\n const searchTo = this.matchesTerm(selectedText) ? state.selection.from - 1 : state.selection.from;\n\n // get all decorations up to the current selection\n const decorationSet = key.getState(state)!;\n let decorations: Decoration[] = decorationSet.find(0, searchTo);\n if (decorations.length === 0) {\n // handle wrapping\n if (this.options.wrap) {\n const searchFrom = this.matchesTerm(selectedText) ? state.selection.to + 1 : state.selection.to;\n decorations = decorationSet.find(searchFrom);\n if (decorations.length === 0) {\n return false;\n }\n // no wrapping\n } else {\n return false;\n }\n }\n\n // find the one closest to the beginning of the current selection\n if (dispatch) {\n // now we need to find the decoration with the largest from value\n const decoration = decorations.reduce((lastDecoration, nextDecoration) => {\n if (nextDecoration.from > lastDecoration.from) {\n return nextDecoration;\n } else {\n return lastDecoration;\n }\n });\n\n const tr = state.tr;\n this.selectResult(tr, decoration);\n this.withResultUpdates(() => {\n dispatch(tr);\n });\n }\n return true;\n };\n }\n\n public replace(text: string) {\n return (state: EditorState<any>, dispatch?: (tr: Transaction<any>) => void) => {\n if (!this.isResultSelected(state)) {\n return false;\n }\n\n if (dispatch) {\n const tr = state.tr;\n const selectionMarks = tr.selection.$from.marksAcross(tr.selection.$to);\n if (text.length > 0) {\n tr.replaceSelectionWith(state.schema.text(text, selectionMarks), false);\n } else {\n tr.deleteSelection();\n }\n \n this.withResultUpdates(() => {\n dispatch(tr);\n });\n }\n\n return true;\n };\n }\n\n public replaceAll(text: string) {\n return (state: EditorState<any>, dispatch?: (tr: Transaction<any>) => void) => {\n \n let replaced = 0;\n\n if (!this.hasTerm()) {\n return replaced;\n }\n\n if (dispatch) {\n const tr = state.tr;\n\n const decorationSet = key.getState(state)!;\n\n const decorations: Decoration[] = decorationSet.find(0);\n decorations.forEach(decoration => {\n const from = tr.mapping.map(decoration.from);\n const to = tr.mapping.map(decoration.to);\n tr.insertText(text, from, to);\n replaced += 1;\n });\n this.withResultUpdates(() => {\n dispatch(tr);\n });\n }\n\n return replaced;\n };\n }\n\n public clear() {\n return (state: EditorState<any>, dispatch?: (tr: Transaction<any>) => void) => {\n if (dispatch) {\n this.term = '';\n this.options = {};\n this.updateResults(state, dispatch);\n }\n return true;\n };\n }\n\n private updateResults(state: EditorState, dispatch: (tr: Transaction<any>) => void) {\n this.withResultUpdates(() => {\n const tr = state.tr;\n tr.setMeta(kAddToHistoryTransaction, false);\n dispatch(tr);\n });\n }\n\n private resultDecorations(tr: Transaction): DecorationSet {\n // bail if no search term\n if (!this.hasTerm()) {\n return DecorationSet.empty;\n }\n\n // decorations to return\n const decorations: Decoration[] = [];\n\n // merge text nodes\n const textNodes = mergedTextNodes(tr.doc);\n\n textNodes.forEach(textNode => {\n const search = this.findRegEx();\n if (!search) {\n return;\n }\n\n let m;\n // tslint:disable-next-line no-conditional-assignment\n while ((m = search.exec(textNode.text))) {\n if (m[0] === '') {\n break;\n }\n const from = textNode.pos + m.index;\n const to = textNode.pos + m.index + m[0].length;\n const classes = ['pm-find-text'];\n if (from === tr.selection.from && to === tr.selection.to) {\n classes.push('pm-selected-text');\n }\n decorations.push(Decoration.inline(from, to, { class: classes.join(' ') }));\n }\n });\n\n // return as decoration set\n return decorations.length ? DecorationSet.create(tr.doc, decorations) : DecorationSet.empty;\n }\n\n private withResultUpdates(f: () => void) {\n this.updating = true;\n f();\n this.updating = false;\n }\n\n private selectResult(tr: Transaction, decoration: Decoration) {\n const selection = new TextSelection(tr.doc.resolve(decoration.from), tr.doc.resolve(decoration.to));\n return tr.setSelection(selection).scrollIntoView();\n }\n\n private isResultSelected(state: EditorState) {\n if (this.hasTerm()) {\n const selectedText = state.doc.textBetween(state.selection.from, state.selection.to);\n return this.matchesTerm(selectedText);\n } else {\n return false;\n }\n }\n\n /**\n * Watch for a search result to appear in the DOM. When it does, scroll it\n * into view.\n * \n * @param view The current EditorView \n */\n private watchForSelectedResult(view: EditorView) {\n // Clear any previous result observer\n this.clearResultObserver();\n\n // Create a new result observer to watch for results to be rendered\n this.resultObserver = new MutationObserver((records: MutationRecord[], observer: MutationObserver) => {\n let resultElement:HTMLElement|null = null;\n\n // Predicate for testing a node to see if it looks like the active search result\n const isResultNode = (node: Node): boolean => {\n if (node.nodeType !== node.ELEMENT_NODE) {\n return false;\n }\n const ele = node as HTMLElement;\n return ele.classList.contains('pm-find-text') && \n ele.classList.contains('pm-selected-text');\n };\n\n // Examine each mutation record to see if it's the one we're looking for\n records.forEach((mutation) => {\n switch(mutation.type) {\n case 'childList':\n // Case 1: a new search result node was added to the DOM\n mutation.addedNodes.forEach((node) => {\n if (isResultNode(node)) {\n resultElement = node as HTMLElement;\n }\n });\n break;\n case 'attributes':\n // Case 2: an existing node gained a \"class\" attribute and is now an\n // active search result\n if (isResultNode(mutation.target)) {\n resultElement = mutation.target as HTMLElement;\n }\n break;\n }\n });\n\n // If we found a result element, scroll it into view and turn off the DOM\n // observer. (If we didn't find one, it may be an irrelevant DOM mutation,\n // so ignore it.)\n if (resultElement) {\n this.scrollToSelectedResult(view, resultElement);\n this.clearResultObserver();\n }\n });\n\n const editingRoot = editingRootNode(view.state.selection);\n if (editingRoot) {\n const container = view.nodeDOM(editingRoot.pos) as HTMLElement;\n\n // Begin observing the editing surface for DOM mutations\n this.resultObserver.observe(container, {\n subtree: true,\n childList: true,\n attributeFilter: ['class'] // Only interested in changes to the \"class\" attribute\n });\n\n // The search results should appear quickly (we're really just waiting for\n // a render loop). If the observer runs for longer than 1s, just cancel\n // it, as it consumes resources and anything observed is likely to be\n // spurious.\n this.resultObserverTimer = window.setTimeout(() => {\n this.clearResultObserver();\n }, 1000);\n }\n }\n\n /**\n * Cleans all state related to the search result DOM observer\n */\n private clearResultObserver() {\n // Disconnect the result observer if running\n if (this.resultObserver !== null) {\n this.resultObserver.disconnect();\n this.resultObserver = null;\n }\n\n // Remove the result observer timer if running\n if (this.resultObserverTimer !== 0) {\n window.clearTimeout(this.resultObserverTimer);\n this.resultObserverTimer = 0;\n }\n }\n\n /**\n * Scrolls the selected search result into view.\n * \n * @param view The EditorView on which to act\n * @param resultElement The HTML element containing the search result, if known\n */\n private scrollToSelectedResult(view: EditorView, resultElement: HTMLElement|null) {\n const editingRoot = editingRootNode(view.state.selection);\n if (editingRoot) {\n const container = view.nodeDOM(editingRoot.pos) as HTMLElement;\n\n if (resultElement === null) {\n // Attempt to find a result element to scroll to if we weren't given one\n resultElement = container.querySelector(\".pm-find-text.pm-selected-text\");\n }\n\n if (resultElement === null || resultElement === this.resultElement) {\n // If we didn't find a result element, or if we found a stale one\n // (hasn't changed), defer scrolling until it has been rendered. This is\n // most common when the search result is inside an Ace editor chunk,\n // which puts the result in the DOM on a deferred render loop.\n this.watchForSelectedResult(view);\n return;\n } \n\n this.resultElement = resultElement;\n\n // Starting offset for scroll position \n let offset = 100;\n\n // Zenscroll can only scroll to a direct child element of the scroll\n // container, but the element containing the search result may be deeply\n // nested in the container. Walk up the DOM tree, summing the offsets,\n // until we get to an element that's actually a child of the scroll\n // container. \n let scrollElement = resultElement;\n while (scrollElement.offsetParent?.parentElement !== container) {\n offset += scrollElement.offsetTop;\n const nextParent = scrollElement.offsetParent;\n if (nextParent === null) {\n break;\n } \n scrollElement = nextParent as HTMLElement;\n }\n\n // Perform the scroll to the element's container plus its offset inside\n // the container.\n const scroller = zenscroll.createScroller(container);\n scroller.center(scrollElement, 350, offset);\n }\n }\n\n private hasTerm() {\n return this.term.length > 0;\n }\n\n private matchesTerm(text: string) {\n if (this.hasTerm()) {\n const regex = this.findRegEx();\n if (regex) {\n return regex.test(text);\n } else {\n return false;\n }\n } else {\n return false;\n }\n }\n\n private findRegEx() {\n try {\n return new RegExp(this.term, !this.options.caseSensitive ? 'gui' : 'gu');\n } catch {\n return null;\n }\n }\n}\n\nconst extension: Extension = {\n plugins: () => {\n return [new FindPlugin()];\n },\n};\n\nexport interface FindOptions {\n regex?: boolean;\n caseSensitive?: boolean;\n wrap?: boolean;\n}\n\nexport function find(view: EditorView, term: string, options: FindOptions): boolean {\n return findPlugin(view).find(term, options)(view.state, view.dispatch);\n}\n\nexport function matchCount(view: EditorView): number {\n return findPlugin(view).matchCount(view.state);\n}\n\nexport function selectFirst(view: EditorView): boolean {\n return findPlugin(view).selectFirst()(view.state, view.dispatch);\n}\n\nexport function selectCurrent(view: EditorView): boolean {\n return findPlugin(view).selectCurrent()(view.state, view.dispatch);\n}\n\nexport function selectNext(view: EditorView): boolean {\n return findPlugin(view).selectNext()(view.state, view.dispatch);\n}\n\nexport function selectPrevious(view: EditorView): boolean {\n return findPlugin(view).selectPrevious()(view.state, view.dispatch);\n}\n\nexport function replace(view: EditorView, text: string): boolean {\n return findPlugin(view).replace(text)(view.state, view.dispatch);\n}\n\nexport function replaceAll(view: EditorView, text: string) {\n return findPlugin(view).replaceAll(text)(view.state, view.dispatch);\n}\n\nexport function clear(view: EditorView): boolean {\n return findPlugin(view).clear()(view.state, view.dispatch);\n}\n\nexport function findPluginState(state: EditorState): DecorationSet | null | undefined {\n return key.getState(state);\n}\n\nfunction findPlugin(view: EditorView): FindPlugin {\n return key.get(view.state) as FindPlugin;\n}\n\nexport default extension;\n","/*\n * omni_insert.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport { DOMOutputSpecArray, Mark, Fragment } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { PandocOutput } from '../../api/pandoc';\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { selectionAllowsCompletions } from '../../api/completion';\nimport { OmniInserter } from '../../api/omni_insert';\nimport { MarkInputRuleFilter } from '../../api/input_rule';\nimport { EditorUI } from '../../api/ui';\n\nimport { omniInsertCompletionHandler } from './omni_insert-completion';\nimport { Extension } from '../../api/extension';\nimport { markIsActive } from '../../api/mark';\n\nexport function markOmniInsert() {\n return {\n marks: [\n {\n name: 'omni_insert',\n spec: {\n inclusive: true,\n noInputRules: true,\n parseDOM: [{ tag: \"span[class*='omni_insert']\" }],\n toDOM(): DOMOutputSpecArray {\n return ['span', { class: 'omni_insert' }];\n },\n },\n pandoc: {\n readers: [],\n writer: {\n priority: 30,\n write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n output.writeInlines(parent);\n },\n },\n },\n },\n ],\n };\n}\n\nexport function omniInsertExtension(\n omniInserters: OmniInserter[],\n inputRuleFilter: MarkInputRuleFilter,\n ui: EditorUI,\n): Extension {\n return {\n commands: () => [new OmniInsertCommand(inputRuleFilter)],\n completionHandlers: () => [omniInsertCompletionHandler(omniInserters, ui)],\n };\n}\n\nclass OmniInsertCommand extends ProsemirrorCommand {\n constructor(markFilter: MarkInputRuleFilter) {\n super(\n EditorCommandId.OmniInsert,\n ['Mod-/'],\n (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n // check whether selection allows completions\n if (!selectionAllowsCompletions(state.selection)) {\n return false;\n }\n\n // if the marks is already active then bail\n if (markIsActive(state, state.schema.marks.omni_insert)) {\n return false;\n }\n\n // check the mark filter\n if (!markFilter(state)) {\n return false;\n }\n\n if (dispatch) {\n const mark = state.schema.marks.omni_insert.create();\n const node = state.schema.text('/', [mark]);\n const tr = state.tr;\n tr.replaceSelectionWith(node, false);\n dispatch(tr);\n }\n\n return true;\n },\n );\n }\n}\n","/*\n * completion.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Selection, EditorState, Transaction, TextSelection } from 'prosemirror-state';\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\nimport { EditorView, DecorationSet } from 'prosemirror-view';\n\nimport { canInsertNode } from './node';\nimport { EditorUI } from './ui';\nimport { kInsertCompletionTransaction } from './transaction';\n\nexport const kCompletionDefaultItemHeight = 22;\nexport const kCompletionDefaultMaxVisible = 10;\nexport const kCompletionDefaultWidth = 180;\n\nexport interface CompletionContext {\n isPaste: boolean;\n}\n\nexport interface CompletionsStream<T = any> {\n items: T[];\n stream: () => T[] | null;\n}\n\nexport type Completions<T = any> = T[] | CompletionsStream<T>;\n\nexport interface CompletionResult<T = any> {\n pos: number;\n offset?: number;\n token: string;\n completions: (state: EditorState, context: CompletionContext) => Promise<Completions>;\n decorations?: DecorationSet;\n}\n\nexport interface CompletionHeaderProps {\n ui: EditorUI;\n message?: string;\n}\n\nexport interface CompletionHandler<T = any> {\n // unique id\n id: string;\n\n // An optional scope for this completion handler. Completions\n // triggered by a transaction will filter completion handlers\n // that share a scope with the completion handler that originated\n // a transaction.\n scope?: string;\n\n // filter for determing whether we can call this handler from a given context (default is to\n // never offer completions if a mark with noInputRules is active). set to null to\n // allow completion anywhere\n enabled?: ((context: EditorState | Transaction) => boolean) | null;\n\n // return a set of completions for the given context. text is the text before\n // before the cursor in the current node (but no more than 500 characters)\n completions(text: string, context: EditorState | Transaction): CompletionResult | null;\n\n // filter a previously returned set of completions\n filter?: (completions: T[], state: EditorState, token: string, prevToken?: string) => T[] | null;\n\n // provide a completion replacement as a string or node (can be passed null if the popup was dismissed)\n replacement?(schema: Schema, completion: T | null): string | ProsemirrorNode | null;\n\n // lower level replacement handler (can be passed null if the popup was dismissed)\n replace?(view: EditorView, pos: number, completion: T | null): Promise<any>;\n\n // completion view\n view: {\n // optional header component (will go inside a <th>)\n header?: () =>\n | {\n component: React.FC<CompletionHeaderProps> | React.ComponentClass<CompletionHeaderProps>;\n height: number;\n message?: string;\n }\n | undefined;\n\n // react compontent type for viewing the item\n component: React.FC<T> | React.ComponentClass<T>;\n\n key: (completion: T) => any;\n\n // width of completion item (defaults to 180).\n width?: number;\n\n // height of completion item (defaults to 22px)\n height?: number;\n\n // use horizontal orientation (defaults to false)\n // (optionally provide a set of item widths)\n horizontal?: boolean;\n horizontalItemWidths?: number[];\n\n // maximum number of visible items (defaults to 10). note that\n // this only applies to completion poupups w/ vertical orientation\n // (scrolling is not supported for horizontal orientation)\n maxVisible?: number;\n\n // hide 'no results' (default false)\n hideNoResults?: boolean;\n };\n}\n\nexport function selectionAllowsCompletions(selection: Selection) {\n const schema = selection.$head.parent.type.schema;\n\n // non empty selections don't have completions\n if (!selection.empty) {\n return false;\n }\n\n // must be able to insert text\n if (!canInsertNode(selection, schema.nodes.text)) {\n return false;\n }\n\n // must not be in a code mark\n if (schema.marks.code && !!schema.marks.code.isInSet(selection.$from.marks())) {\n return false;\n }\n\n // must not be in a code node\n if (selection.$head.parent.type.spec.code) {\n return false;\n }\n\n return true;\n}\n\n// Determine whether two completionHandlers share the same scope. By default\n// completion handlers will share scope only if they share an id, but handlers\n// can provide a scope if they'd like to coordinate.\nexport function completionsShareScope(handler: CompletionHandler, prevHandler?: CompletionHandler) {\n // There is no previous handler, not shared\n if (!prevHandler) {\n return false;\n }\n\n // Previous handler with the same scope as the current handler\n if (prevHandler.scope && prevHandler.scope === handler.scope) {\n return true;\n } else {\n // Previous handler has the same id as the current handler\n return prevHandler.id === handler.id;\n }\n}\n\nexport function performCompletionReplacement(tr: Transaction, pos: number, replacement: ProsemirrorNode | string) {\n // set selection to area we will be replacing\n tr.setSelection(new TextSelection(tr.doc.resolve(pos), tr.selection.$head));\n\n // ensure we have a node\n if (replacement instanceof ProsemirrorNode) {\n // combine it's marks w/ whatever is active at the selection\n const marks = tr.selection.$head.marks();\n\n // set selection and replace it\n tr.replaceSelectionWith(replacement, false);\n\n // propapate marks\n marks.forEach(mark => tr.addMark(pos, tr.selection.to, mark));\n } else {\n tr.insertText(replacement);\n }\n\n // mark the transaction as an completion insertion\n tr.setMeta(kInsertCompletionTransaction, true);\n}\n","/*\n * omni_insert.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Selection, Transaction } from 'prosemirror-state';\nimport { EditorView, DecorationSet } from 'prosemirror-view';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport React from 'react';\nimport { firstBy } from 'thenby';\n\nimport { OmniInserter, omniInsertGroupCompare, omniInsertPriorityCompare } from '../../api/omni_insert';\nimport { CompletionHandler, CompletionResult } from '../../api/completion';\n\nimport { EditorUI } from '../../api/ui';\nimport { placeholderDecoration } from '../../api/placeholder';\nimport { kAddToHistoryTransaction } from '../../api/transaction';\n\nimport './omni_insert-completion.css';\n\nexport function omniInsertCompletionHandler(\n omniInserters: OmniInserter[],\n ui: EditorUI,\n): CompletionHandler<OmniInserter> {\n return {\n id: 'E305158D-20D6-474D-84E6-06607CA58578',\n\n completions: omniInsertCompletions(omniInserters, ui),\n\n filter: (completions: OmniInserter[], state: EditorState, token: string) => {\n // match contents of name or keywords (and verify the command is enabled)\n return completions\n .filter(inserter => {\n return (\n token.length === 0 ||\n inserter.name.toLowerCase().indexOf(token) !== -1 ||\n inserter.keywords?.some(keyword => keyword.indexOf(token) !== -1)\n );\n })\n .filter(inserter => {\n return inserter.command(state);\n })\n .sort(\n firstBy(omniInsertGroupCompare)\n .thenBy(omniInsertPriorityCompare, { direction: 'desc' })\n .thenBy('name'),\n );\n },\n\n replace(view: EditorView, pos: number, completion: OmniInserter | null) {\n // helper to remove command text\n const removeCommandText = () => {\n const tr = view.state.tr;\n tr.deleteRange(pos, view.state.selection.head);\n tr.setMeta(kAddToHistoryTransaction, false);\n view.dispatch(tr);\n };\n\n // execute command if provided\n if (completion) {\n // remove existing text\n removeCommandText();\n\n // execute the command\n completion.command(view.state, view.dispatch, view);\n\n // perform any requested selection offset\n if (completion.selectionOffset) {\n const tr = view.state.tr;\n setTextSelection(tr.selection.from + completion.selectionOffset)(tr);\n tr.setMeta(kAddToHistoryTransaction, false);\n view.dispatch(tr);\n }\n\n // the activation of omni_insert wasn't part of 'natural' typing\n // in the document so remove it\n } else {\n removeCommandText();\n }\n return Promise.resolve();\n },\n\n view: {\n component: OmniInserterView,\n key: command => command.id,\n width: 320,\n height: 46,\n maxVisible: 6,\n },\n };\n}\n\nconst kOmniInsertRegex = /\\/([\\w]*)$/;\n\nfunction omniInsertCompletions(omniInserters: OmniInserter[], ui: EditorUI) {\n return (text: string, context: EditorState | Transaction): CompletionResult<OmniInserter> | null => {\n const match = text.match(kOmniInsertRegex);\n if (match) {\n // we need to either be at the beginning of our parent, OR the omni_insert mark needs\n // to be active (that indicates that we entered omni insert mode via a user command)\n if (match.index !== 0 && !isOmniInsertCommandActive(context.selection)) {\n return null;\n }\n\n // capture query (note that no query returns all).\n const query = match[1].toLowerCase();\n\n // include a decoration if the query is empty\n const decorations =\n query.length === 0\n ? DecorationSet.create(context.doc, [\n placeholderDecoration(context.selection.head, ui.context.translateText(' type to search...')),\n ])\n : undefined;\n\n // return the completion result\n return {\n // match at the /\n pos: context.selection.head - match[0].length,\n\n // unique identifier for this request\n token: query,\n\n // return all omniInserters (will refine via filter)\n completions: (state: EditorState) => {\n return Promise.resolve(omniInserters);\n },\n\n // search placehodler decorator if there is no query\n decorations,\n };\n } else {\n return null;\n }\n };\n}\n\nconst OmniInserterView: React.FC<OmniInserter> = inserter => {\n return (\n <table className={'pm-omni-insert-completion'}>\n <tbody>\n <tr>\n <td className={'pm-omni-insert-icon'}>\n <img className={'pm-block-border-color'} src={inserter.image()} alt=\"\" draggable=\"false\"/>\n </td>\n <td>\n <div className={'pm-omni-insert-name pm-completion-list-item-text'}>{inserter.name}</div>\n <div className={'pm-omni-insert-description pm-completion-list-item-text'}>{inserter.description}</div>\n </td>\n </tr>\n </tbody>\n </table>\n );\n};\n\nfunction isOmniInsertCommandActive(selection: Selection) {\n const schema = selection.$head.parent.type.schema;\n return schema.marks.omni_insert.isInSet(selection.$head.marks());\n}\n","/*\n * omni_insert.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { CommandFn } from './command';\n\n// descriptive info for omni insert\nexport interface OmniInsert {\n name: string;\n keywords?: string[];\n description: string;\n group: OmniInsertGroup;\n priority?: number;\n selectionOffset?: number;\n image: () => string;\n}\n\n// descriptive info + ability to identify/execute\nexport interface OmniInserter extends OmniInsert {\n id: string;\n command: CommandFn;\n}\n\nexport enum OmniInsertGroup {\n Common = 'Common',\n Headings = 'Headings',\n Lists = 'Lists',\n Math = 'Math',\n References = 'References',\n Content = 'Content',\n Blocks = 'Blocks',\n Chunks = 'Chunks',\n}\n\nconst omniInsertGroupOrder = new Map<string, number>(Object.keys(OmniInsertGroup).map((key, index) => [key, index]));\n\nexport function omniInsertGroupCompare(a: OmniInsert, b: OmniInsert) {\n return omniInsertGroupOrder.get(a.group)! - omniInsertGroupOrder.get(b.group)!;\n}\n\nexport function omniInsertPriorityCompare(a: OmniInsert, b: OmniInsert) {\n return (a.priority || 0) - (b.priority || 0);\n}\n","/*\n * placeholder.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, NodeType } from 'prosemirror-model';\nimport { EditorState, Transaction, Plugin, PluginKey } from 'prosemirror-state';\nimport { DecorationSet, Decoration, EditorView } from 'prosemirror-view';\n\nimport { findParentNode } from 'prosemirror-utils';\n\nimport { EditorUI } from './ui';\n\nexport function emptyNodePlaceholderPlugin(nodeType: NodeType, placeholder: (node: ProsemirrorNode) => string, filter?: (tr: Transaction) => boolean) {\n const pluginKey = new PluginKey(nodeType.name + '-empty-placeholder');\n\n return new Plugin<DecorationSet>({\n key: pluginKey,\n state: {\n init(_config: { [key: string]: any }, instance: EditorState) {\n return DecorationSet.empty;\n },\n apply(tr: Transaction, set: DecorationSet, oldState: EditorState, newState: EditorState) {\n // check for empty parent of our type\n const emptyNode = findParentNode(node => node.type === nodeType && node.childCount === 0)(tr.selection);\n if (emptyNode && (!filter || filter(tr))) {\n const decoration = placeholderDecoration(emptyNode.pos + 1, placeholder(emptyNode.node));\n return DecorationSet.create(tr.doc, [decoration]);\n } else {\n return DecorationSet.empty;\n }\n },\n },\n props: {\n decorations(state: EditorState) {\n return pluginKey.getState(state);\n },\n },\n });\n}\n\nexport function placeholderDecoration(pos: number, text: string) {\n return Decoration.widget(pos, (_view: EditorView, _getPos: () => number) => {\n const placeholder = window.document.createElement('span');\n placeholder.classList.add('pm-placeholder-text-color');\n placeholder.innerText = text;\n return placeholder;\n });\n}\n\nexport function iconAndTextPlaceholderDecoration(pos: number, icon: string, text: string) {\n return Decoration.widget(pos, (_view: EditorView, _getPos: () => number) => {\n const container = window.document.createElement('span');\n\n const iconImg = window.document.createElement('img');\n iconImg.classList.add('pm-placeholder-icon');\n iconImg.setAttribute('src', icon);\n iconImg.setAttribute('draggable', 'false');\n\n const message = window.document.createElement('span');\n message.classList.add('pm-placeholder-text-color');\n message.classList.add('pm-placeholder-text');\n message.innerText = text;\n\n container.appendChild(iconImg);\n container.appendChild(message);\n return container;\n });\n}\n\nexport function searchPlaceholderDecoration(pos: number, ui: EditorUI, text?: string) {\n return iconAndTextPlaceholderDecoration(pos, ui.images.search!, text || '');\n}\n","/*\n * completion.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n// TODO: it may be that we need to not do full re-requests from the filter\n// when we have streamed results (as they can cause reset of the allCompletions)\n\nimport { Plugin, PluginKey, Transaction, Selection, EditorState } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport {\n CompletionHandler,\n selectionAllowsCompletions,\n kCompletionDefaultMaxVisible,\n completionsShareScope,\n performCompletionReplacement,\n CompletionResult,\n Completions,\n CompletionsStream,\n} from '../../api/completion';\nimport { EditorEvents } from '../../api/events';\nimport { ScrollEvent } from '../../api/event-types';\n\nimport { createCompletionPopup, renderCompletionPopup, destroyCompletionPopup } from './completion-popup';\nimport { EditorUI } from '../../api/ui';\nimport { PromiseQueue } from '../../api/promise';\nimport { MarkInputRuleFilter } from '../../api/input_rule';\nimport { kInsertCompletionTransaction, kPasteTransaction } from '../../api/transaction';\n\ninterface CompletionState {\n handler?: CompletionHandler;\n result?: CompletionResult;\n prevToken?: string;\n isPaste?: boolean;\n}\n\nexport function completionExtension(\n handlers: readonly CompletionHandler[],\n inputRuleFilter: MarkInputRuleFilter,\n ui: EditorUI,\n events: EditorEvents,\n) {\n return {\n plugins: () => [new CompletionPlugin(handlers, inputRuleFilter, ui, events)],\n };\n}\n\nconst key = new PluginKey<CompletionState>('completion');\n\nclass CompletionPlugin extends Plugin<CompletionState> {\n // editor ui\n private readonly ui: EditorUI;\n\n // editor view\n private view: EditorView | null = null;\n\n // popup elemeent\n private completionPopup: HTMLElement | null = null;\n\n // currently selected index and last set of completions are held as transient\n // state because they can't be derived from the document state (selectedIndex\n // is derived from out of band user keyboard gestures and completions may\n // have required fulfilling an external promise). also use a version counter\n // used to invalidate async completion requests that are fulfilled after\n // an update has occurred\n private version = 0;\n private allCompletions: any[] = [];\n private completions: any[] = [];\n private horizontal = false;\n private selectedIndex = 0;\n\n // serialize async completion requests\n private completionQueue = new PromiseQueue();\n\n // events we need to unsubscribe from\n private readonly scrollUnsubscribe: VoidFunction;\n\n constructor(\n handlers: readonly CompletionHandler[],\n inputRuleFilter: MarkInputRuleFilter,\n ui: EditorUI,\n events: EditorEvents,\n ) {\n super({\n key,\n state: {\n init: () => ({}),\n apply: (tr: Transaction, prevState: CompletionState) => {\n // if we don't have a view then bail\n if (!this.view) {\n return {};\n }\n\n // selection only changes dismiss any active completion\n if (!tr.docChanged && !tr.storedMarksSet && tr.selectionSet) {\n return {};\n }\n\n // check whether completions are valid here\n if (!selectionAllowsCompletions(tr.selection)) {\n return {};\n }\n\n // calcluate text before cursor\n const textBefore = completionTextBeforeCursor(tr.selection);\n\n // if there is no text then don't handle it\n if (textBefore.length === 0) {\n return {};\n }\n\n const isPaste = tr.getMeta(kPasteTransaction) === true;\n\n // check for a handler that can provide completions at the current selection\n for (const handler of handlers) {\n // first check if the handler is enabled (null means use inputRuleFilter)\n if (handler.enabled === null || (handler.enabled ? handler.enabled(tr) : inputRuleFilter(tr))) {\n const result = handler.completions(textBefore, tr);\n if (result) {\n // check if the previous state had a completion from the same handler\n let prevToken: string | undefined;\n\n // If this completion shares scope with the previous completion\n // and this is a completion transaction, skip\n if (tr.getMeta(kInsertCompletionTransaction) && completionsShareScope(handler, prevState.handler)) {\n continue;\n }\n\n if (handler.id === prevState.handler?.id) {\n // pass the prevToken on if the completion was for the same position\n if (result.pos === prevState.result?.pos) {\n prevToken = prevState.result.token;\n }\n }\n\n // return state\n return { handler, result, prevToken, isPaste };\n }\n }\n }\n\n // no handler found\n return {};\n },\n },\n\n view: () => ({\n update: (view: EditorView) => {\n // increment version\n this.version++;\n\n // set view\n this.view = view;\n\n // update completions\n this.updateCompletions(view, true);\n },\n\n destroy: () => {\n // unsubscribe from events\n this.scrollUnsubscribe();\n window.document.removeEventListener('focusin', this.clearCompletions);\n\n // tear down the popup\n this.clearCompletions();\n },\n }),\n\n props: {\n decorations: (state: EditorState) => {\n const pluginState = key.getState(state);\n return pluginState?.result?.decorations;\n },\n\n handleDOMEvents: {\n keydown: (view: EditorView, event: Event) => {\n const kbEvent = event as KeyboardEvent;\n\n let handled = false;\n\n // determine meaning of keys based on orientation\n const forwardKey = this.horizontal ? 'ArrowRight' : 'ArrowDown';\n const backwardKey = this.horizontal ? 'ArrowLeft' : 'ArrowUp';\n\n if (this.completionsActive()) {\n switch (kbEvent.key) {\n case 'Escape':\n this.dismissCompletions();\n handled = true;\n break;\n case 'Enter':\n case 'Tab':\n this.insertCompletion(view, this.selectedIndex);\n handled = true;\n break;\n case backwardKey:\n this.selectedIndex = Math.max(this.selectedIndex - 1, 0);\n this.renderCompletions(view);\n handled = true;\n break;\n case forwardKey:\n this.selectedIndex = Math.min(this.selectedIndex + 1, this.completions.length - 1);\n this.renderCompletions(view);\n handled = true;\n break;\n case 'PageUp':\n this.selectedIndex = Math.max(this.selectedIndex - this.completionPageSize(), 0);\n this.renderCompletions(view);\n handled = true;\n break;\n case 'PageDown':\n this.selectedIndex = Math.min(\n this.selectedIndex + this.completionPageSize(),\n this.completions.length - 1,\n );\n this.renderCompletions(view);\n handled = true;\n break;\n case 'End':\n this.selectedIndex = this.completions.length - 1;\n this.renderCompletions(view);\n handled = true;\n break;\n case 'Home':\n this.selectedIndex = 0;\n this.renderCompletions(view);\n handled = true;\n break;\n }\n }\n\n // supress event if we handled it\n if (handled) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n // return status\n return handled;\n },\n },\n },\n });\n\n // capture reference to ui\n this.ui = ui;\n\n // hide completions when we scroll or the focus changes\n this.clearCompletions = this.clearCompletions.bind(this);\n this.scrollUnsubscribe = events.subscribe(ScrollEvent, this.clearCompletions);\n window.document.addEventListener('focusin', this.clearCompletions);\n }\n\n private updateCompletions(view: EditorView, resetSelection: boolean) {\n const state = key.getState(view.state);\n\n if (state?.handler && state?.result) {\n // track the request version to invalidate the result if an\n // update happens after it goes into flight\n const requestVersion = this.version;\n\n // make an async request for the completions, update allCompletions,\n // and then apply any filter we have (allows the completer to just return\n // everything from the aysnc query and fall back to the filter for refinement)\n const requestAllCompletions = async () => {\n // fetch completions\n const completions = await state.result!.completions(view.state, { isPaste: state.isPaste === true });\n\n // if we don't have a handler or result then return\n if (!state.handler || !state.result) {\n return;\n }\n\n // function to update completions\n const updateCompletions = (updatedCompletions: any[]) => {\n // save completions\n this.setAllCompletions(updatedCompletions, !!state.handler?.view.horizontal, resetSelection);\n\n // display if the request still maps to the current state\n if (state.handler && state.result && this.version === requestVersion) {\n // if there is a filter then call it and update displayed completions\n const displayedCompletions = state.handler.filter\n ? state.handler.filter(this.allCompletions, view.state, state.result.token)\n : null;\n if (displayedCompletions) {\n this.setDisplayedCompletions(displayedCompletions, !!state.handler.view.horizontal, resetSelection);\n }\n\n this.renderCompletions(view);\n }\n };\n\n // if we got an array, just set it. if we got a stream then poll it for it's update\n if (Array.isArray(completions)) {\n updateCompletions(completions);\n } else {\n const completionStream = completions as CompletionsStream;\n updateCompletions(completionStream.items);\n const pollingInterval = setInterval(() => {\n // if the document has been updated then invalidate\n if (this.version !== requestVersion) {\n clearInterval(pollingInterval);\n } else {\n // otherwise check the stream\n const result = completionStream.stream();\n if (result) {\n clearInterval(pollingInterval);\n updateCompletions(result);\n }\n }\n }, 300);\n }\n };\n\n // first see if we can do this exclusively via filter\n if (state.prevToken && state.handler.filter) {\n this.completionQueue.enqueue(async () => {\n // display if the request still maps to the current state\n if (state.handler && state.result && this.version === requestVersion) {\n const filteredCompletions = state.handler.filter!(\n this.allCompletions,\n view.state,\n state.result.token,\n state.prevToken,\n );\n\n // got a hit from the filter!\n if (filteredCompletions) {\n this.setDisplayedCompletions(filteredCompletions, !!state.handler.view.horizontal, resetSelection);\n this.renderCompletions(view);\n\n // couldn't use the filter, do a full request for all completions (so long as we aren't\n // already waiting on a strea,)\n } else {\n await requestAllCompletions();\n }\n }\n });\n } else {\n // no prevToken or no filter for this handler, request everything\n this.completionQueue.enqueue(requestAllCompletions);\n }\n } else {\n // no handler/result for this document state\n this.clearCompletions();\n }\n }\n\n private renderCompletions(view: EditorView) {\n const state = key.getState(view.state);\n\n if (state && state.handler && (this.completions.length > 0 || !state.handler.view.hideNoResults)) {\n const props = {\n handler: state.handler!,\n pos: state.result!.pos + (state.result!.offset || 0),\n completions: this.completions,\n selectedIndex: this.selectedIndex,\n noResults: this.ui.context.translateText('No Results'),\n onClick: (index: number) => {\n this.insertCompletion(view, index);\n },\n onHover: (index: number) => {\n this.selectedIndex = index;\n this.renderCompletions(view);\n },\n ui: this.ui,\n };\n\n // create the completion popup if we need to\n if (this.completionPopup === null) {\n this.completionPopup = createCompletionPopup();\n window.document.body.appendChild(this.completionPopup);\n }\n\n // render\n renderCompletionPopup(view, props, this.completionPopup);\n } else {\n // hide\n this.hideCompletionPopup();\n }\n }\n\n private async insertCompletion(view: EditorView, index: number) {\n // default index if not specified\n index = index || this.selectedIndex;\n\n const state = key.getState(view.state);\n if (state && state.handler) {\n // perform replacement\n const result = state.result!;\n\n // check low level handler first\n if (state.handler.replace) {\n // execute replace\n await state.handler.replace(view, result.pos, this.completions[index]);\n\n // use higher level handler\n } else if (state.handler.replacement) {\n // get replacement from handler\n const replacement = state.handler.replacement(view.state.schema, this.completions[index]);\n if (replacement) {\n const tr = view.state.tr;\n performCompletionReplacement(tr, result.pos, replacement);\n view.dispatch(tr);\n }\n }\n // set focus\n view.focus();\n }\n this.clearCompletions();\n }\n\n // explicit user dismiss of completion (e.g. Esc key)\n private async dismissCompletions() {\n // call lower-level replace on any active handler (w/ null). this gives\n // them a chance to dismiss any artifacts that were explicitly inserted\n // to trigger the handler (e.g. a cmd+/ for omni-insert)\n if (this.view) {\n const state = key.getState(this.view.state);\n if (state?.result && state.handler) {\n if (state.handler.replace) {\n await state.handler.replace(this.view, state.result.pos, null);\n } else if (state.handler.replacement) {\n state.handler.replacement(this.view.state.schema, null);\n }\n }\n }\n\n this.clearCompletions();\n }\n\n private clearCompletions() {\n this.setAllCompletions([], false, true);\n this.hideCompletionPopup();\n }\n\n private hideCompletionPopup() {\n if (this.completionPopup) {\n destroyCompletionPopup(this.completionPopup);\n this.completionPopup = null;\n }\n }\n\n private completionsActive() {\n return !!this.completionPopup;\n }\n\n private setAllCompletions(completions: any[], horizontal: boolean, resetSelection: boolean) {\n this.allCompletions = completions;\n this.setDisplayedCompletions(completions, horizontal, resetSelection);\n }\n\n private setDisplayedCompletions(completions: any[], horizontal: boolean, resetSelection: boolean) {\n this.completions = completions;\n this.horizontal = !!horizontal;\n\n // reset selection if requested or if the current index exceeds the # of completions\n if (resetSelection || this.selectedIndex > this.completions.length - 1) {\n this.selectedIndex = 0;\n }\n }\n\n private completionPageSize() {\n if (this.view) {\n const state = key.getState(this.view.state);\n return state?.handler?.view.maxVisible || kCompletionDefaultMaxVisible;\n } else {\n return kCompletionDefaultMaxVisible;\n }\n }\n}\n\n// extract the text before the cursor, dealing with block separators and\n// non-text leaf chracters (this is based on code in prosemirror-inputrules)\nfunction completionTextBeforeCursor(selection: Selection, maxLength = 500) {\n const { $head } = selection;\n return $head.parent.textBetween(\n Math.max(0, $head.parentOffset - maxLength), // start\n $head.parentOffset, // end\n undefined, // block separator\n '\\ufffc', // leaf char\n );\n}\n","/*\n * completion-popup.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView } from 'prosemirror-view';\n\nimport React, { useEffect } from 'react';\nimport ReactDOM from 'react-dom';\n\nimport zenscroll from 'zenscroll';\n\nimport { applyStyles } from '../../api/css';\nimport {\n CompletionHandler,\n kCompletionDefaultItemHeight,\n kCompletionDefaultMaxVisible,\n kCompletionDefaultWidth,\n} from '../../api/completion';\nimport { Popup } from '../../api/widgets/popup';\n\nimport './completion-popup.css';\nimport { EditorUI } from '../../api/ui';\n\nconst kNoResultsHeight = 22;\n\nexport interface CompletionListProps {\n handler: CompletionHandler;\n pos: number;\n completions: any[];\n selectedIndex: number;\n noResults: string;\n onHover: (index: number) => void;\n onClick: (index: number) => void;\n ui: EditorUI;\n}\n\nexport function createCompletionPopup(): HTMLElement {\n const popup = window.document.createElement('div');\n popup.style.position = 'absolute';\n popup.style.zIndex = '900';\n return popup;\n}\n\nexport function renderCompletionPopup(view: EditorView, props: CompletionListProps, popup: HTMLElement) {\n // position popup\n const size = completionPopupSize(props);\n const positionStyles = completionPopupPositionStyles(view, props.pos, size.width, size.height);\n applyStyles(popup, [], positionStyles);\n\n // render popup\n ReactDOM.render(<CompletionPopup {...props} />, popup);\n}\n\nexport function destroyCompletionPopup(popup: HTMLElement) {\n ReactDOM.unmountComponentAtNode(popup);\n popup.remove();\n}\n\nconst CompletionPopup: React.FC<CompletionListProps> = props => {\n // main completion popup + class + dark mode if appropriate\n const classes = ['pm-completion-popup'].concat(props.ui.prefs.darkMode() ? ['pm-dark-mode'] : []);\n return (\n <Popup classes={classes}>\n <CompletionList {...props} />\n </Popup>\n );\n};\n\nconst CompletionList: React.FC<CompletionListProps> = props => {\n const size = completionPopupSize(props);\n const itemHeight = props.handler.view.height || kCompletionDefaultItemHeight;\n\n // keep selected index in view\n const containerRef = React.useRef<HTMLDivElement>(null);\n useEffect(() => {\n const containerEl = containerRef.current;\n if (containerEl) {\n const rows = containerEl.getElementsByClassName('pm-completion-list-item-row');\n const scrollToRow = rows.item(props.selectedIndex);\n if (scrollToRow) {\n const scroller = zenscroll.createScroller(containerEl);\n scroller.intoView(scrollToRow as HTMLElement);\n }\n }\n }, [props.selectedIndex]);\n\n // item event handler\n const itemEventHandler = (index: number, handler: (index: number) => void) => {\n return (event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n handler(index);\n };\n };\n\n // completion source based on orientation\n const completions = props.handler.view.horizontal ? horizontalCompletions : verticalCompletions;\n\n const classes = ['pm-completion-list'].concat(props.handler.view.horizontal ? ['pm-completion-list-horizontal'] : []);\n\n return (\n <div\n ref={containerRef}\n className={classes.join(' ')}\n style={{ width: size.width + 'px', height: size.height + 'px' }}\n >\n <table>\n {completionsHeader(props.handler, props.completions.length, props)}\n <tbody>\n {completions(props, itemHeight, itemEventHandler)}\n {props.completions.length === 0 ? completionsNoResults(props) : null}\n </tbody>\n </table>\n </div>\n );\n};\n\nfunction completionsHeader(handler: CompletionHandler, completionCount: number, props: CompletionListProps) {\n if (handler.view.header) {\n const completionHeader = handler.view.header ? handler.view.header() : undefined;\n const headerProps = { message: completionHeader?.message, ...props };\n\n if (completionHeader) {\n const header = React.createElement(completionHeader.component, headerProps);\n return (\n <thead>\n <tr>\n <th\n style={{ lineHeight: completionHeader.height + 'px' }}\n colSpan={props.handler.view.horizontal ? completionCount : undefined}\n >\n {header}\n </th>\n </tr>\n </thead>\n );\n } else {\n return null;\n }\n } else {\n return null;\n }\n}\n\ntype ItemEventHandler = (index: number, handler: (index: number) => void) => (event: React.MouseEvent) => void;\n\nfunction verticalCompletions(props: CompletionListProps, itemHeight: number, itemEventHandler: ItemEventHandler) {\n return props.completions.map((completion, index) => {\n const { key, cell } = completionItemCell(props, completion, index);\n return (\n <tr\n key={key}\n style={{ lineHeight: itemHeight + 'px' }}\n className={'pm-completion-list-item-row'}\n onClick={itemEventHandler(index, props.onClick)}\n onMouseMove={itemEventHandler(index, props.onHover)}\n >\n {cell}\n </tr>\n );\n });\n}\n\nfunction horizontalCompletions(props: CompletionListProps, itemHeight: number, itemEventHandler: ItemEventHandler) {\n const cellWidths = horizontalCellWidths(props);\n return (\n <tr style={{ lineHeight: itemHeight + 'px' }}>\n {props.completions.map((completion, index) => {\n const { cell } = completionItemCell(props, completion, index, cellWidths[index], itemEventHandler);\n return cell;\n })}\n </tr>\n );\n}\n\nfunction completionItemCell(\n props: CompletionListProps,\n completion: any,\n index: number,\n width?: number,\n itemEventHandler?: ItemEventHandler,\n) {\n // need to provide key for both wrapper and item\n // https://stackoverflow.com/questions/28329382/understanding-unique-keys-for-array-children-in-react-js#answer-28329550\n const key = props.handler.view.key(completion);\n const item = React.createElement(props.handler.view.component, { ...completion, key });\n const className = 'pm-completion-list-item' + (index === props.selectedIndex ? ' pm-selected-list-item' : '');\n const cell = (\n <td\n key={key}\n style={width ? { width: width + 'px' } : undefined}\n className={className}\n onClick={itemEventHandler ? itemEventHandler(index, props.onClick) : undefined}\n onMouseMove={itemEventHandler ? itemEventHandler(index, props.onHover) : undefined}\n >\n {item}\n </td>\n );\n return { key, cell };\n}\n\nfunction completionsNoResults(props: CompletionListProps) {\n return (\n <tr\n className={'pm-completion-no-results pm-placeholder-text-color'}\n style={{ lineHeight: kNoResultsHeight + 'px' }}\n >\n <td>{props.noResults}</td>\n </tr>\n );\n}\n\nfunction completionPopupSize(props: CompletionListProps) {\n // kicker for list margins/border/etc\n const kCompletionsChrome = 8;\n\n // get view props (apply defaults)\n let { height: itemHeight = kCompletionDefaultItemHeight } = props.handler.view;\n const { maxVisible = kCompletionDefaultMaxVisible, width = kCompletionDefaultWidth } = props.handler.view;\n\n // add 2px for the border to item heights\n const kBorderPad = 2;\n itemHeight += kBorderPad;\n\n // compute header height\n let headerHeight = 0;\n if (props.handler.view.header) {\n const completionHeader = props.handler.view.header();\n if (completionHeader) {\n headerHeight = completionHeader.height + kBorderPad;\n }\n }\n\n // complete based on horizontal vs. vertical\n if (props.handler.view.horizontal) {\n // horizontal mode can provide explicit item widths\n const kTablePadding = 8;\n const kCellPadding = 8;\n const kCellBorders = 2;\n const totalWidth =\n horizontalCellWidths(props).reduce((total, current) => {\n return total + (current + kCellPadding + kCellBorders);\n }, 0) + kTablePadding;\n\n return {\n width: totalWidth,\n height: headerHeight + itemHeight + kCompletionsChrome,\n };\n } else {\n // compute height (subject it to a minimum require to display 'no results')\n const height =\n headerHeight +\n kCompletionsChrome +\n Math.max(itemHeight * Math.min(maxVisible, props.completions.length), kNoResultsHeight);\n\n // return\n return { width, height };\n }\n}\n\nfunction horizontalCellWidths(props: CompletionListProps) {\n const { width = kCompletionDefaultWidth } = props.handler.view;\n return props.completions.map((_completion, index) => {\n if (props.handler.view.horizontalItemWidths) {\n return props.handler.view.horizontalItemWidths[index] || width;\n } else {\n return width;\n }\n });\n}\n\nfunction completionPopupPositionStyles(view: EditorView, pos: number, width: number, height: number) {\n // some constants\n const kMinimumPaddingToEdge = 5;\n const kCompletionsVerticalPadding = 5;\n\n // default position\n const selectionCoords = view.coordsAtPos(pos);\n\n let top = selectionCoords.bottom + kCompletionsVerticalPadding;\n let left = selectionCoords.left;\n\n // see if we need to be above\n if (top + height + kMinimumPaddingToEdge >= window.innerHeight) {\n top = selectionCoords.top - height - kCompletionsVerticalPadding;\n }\n\n // see if we need to be to the left (use cursor as pos in this case)\n if (left + width + kMinimumPaddingToEdge >= window.innerWidth) {\n const cursorCoords = view.coordsAtPos(view.state.selection.head);\n left = cursorCoords.right - width;\n }\n\n return {\n left: left + 'px',\n top: top + 'px',\n };\n}\n","/*\n * popup.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\n\nimport { WidgetProps } from './react';\n\nexport type PopupProps = WidgetProps;\n\nexport const Popup: React.FC<PopupProps> = props => {\n const className = ['pm-popup', 'pm-text-color', 'pm-proportional-font', 'pm-pane-border-color', 'pm-background-color']\n .concat(props.classes || [])\n .join(' ');\n\n const style: React.CSSProperties = {\n ...props.style,\n position: 'absolute',\n zIndex: 10,\n };\n\n return (\n <div className={className} style={style} contentEditable={false} suppressContentEditableWarning={true}>\n {props.children}\n </div>\n );\n};\n","/*\n * promise.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\ninterface PendingPromise<T> {\n promise: () => Promise<T>;\n resolve: (result: T) => void;\n reject: (reason: any) => void;\n}\n\nexport class PromiseQueue<T = unknown> {\n private queue = new Array<PendingPromise<T>>();\n private running = false;\n\n public enqueue(promise: () => Promise<T>) {\n return new Promise<T>((resolve, reject) => {\n this.queue.push({\n promise,\n resolve,\n reject,\n });\n this.dequeue();\n });\n }\n\n private dequeue() {\n if (this.running) {\n return false;\n }\n const item = this.queue.shift();\n if (!item) {\n return false;\n }\n try {\n this.running = true;\n item\n .promise()\n .then(value => {\n this.running = false;\n item.resolve(value);\n this.dequeue();\n })\n .catch(err => {\n this.running = false;\n item.reject(err);\n this.dequeue();\n });\n } catch (err) {\n this.running = false;\n item.reject(err);\n this.dequeue();\n }\n return true;\n }\n}\n","/*\n * spelling-doc.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView, DecorationSet, Decoration } from 'prosemirror-view';\nimport { TextSelection, Plugin, PluginKey, EditorState, Transaction } from 'prosemirror-state';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { PandocMark } from '../../api/mark';\nimport {\n EditorWordRange,\n EditorSpellingDoc,\n EditorWordSource,\n EditorAnchor,\n EditorRect,\n EditorUISpelling,\n} from '../../api/spelling';\nimport { scrollIntoView } from '../../api/scroll';\n\nimport { excludedMarks, getWords, spellcheckerWord } from './spelling';\n\n// get the document interface required by interactive spellchecking\n\nexport function getSpellingDoc(\n view: EditorView,\n marks: readonly PandocMark[],\n spelling: EditorUISpelling,\n): EditorSpellingDoc {\n // alias schema\n const schema = view.state.schema;\n\n // intialize marks we don't want to check\n const excluded = excludedMarks(schema, marks);\n\n // check begin\n spellingDocPlugin(view.state).onCheckBegin();\n\n return {\n getWords: (start: number, end: number): EditorWordSource => {\n return getWords(view.state, start, end, spelling, excluded);\n },\n\n createAnchor: (pos: number): EditorAnchor => {\n return spellingDocPlugin(view.state).createAnchor(pos);\n },\n\n shouldCheck: (_wordRange: EditorWordRange): boolean => {\n return true;\n },\n\n setSelection: (wordRange: EditorWordRange) => {\n const tr = view.state.tr;\n tr.setSelection(TextSelection.create(tr.doc, wordRange.start, wordRange.end));\n view.dispatch(tr);\n },\n\n getText: (wordRange: EditorWordRange): string => {\n const word = view.state.doc.textBetween(wordRange.start, wordRange.end);\n return spellcheckerWord(word);\n },\n\n replaceSelection: (text: string) => {\n const tr = view.state.tr;\n const selectionMarks = tr.selection.$from.marks();\n tr.replaceSelectionWith(view.state.schema.text(text, selectionMarks), false);\n view.dispatch(tr);\n },\n\n getCursorPosition: (): number => {\n return view.state.selection.to;\n },\n\n getSelectionStart: (): number => {\n return view.state.selection.from;\n },\n\n getSelectionEnd: (): number => {\n return view.state.selection.to;\n },\n\n getCursorBounds: (): EditorRect => {\n const fromCoords = view.coordsAtPos(view.state.selection.from);\n const toCoords = view.coordsAtPos(view.state.selection.to);\n\n return {\n x: Math.min(fromCoords.left, toCoords.left),\n y: fromCoords.top,\n width: Math.abs(fromCoords.left - toCoords.left),\n height: toCoords.bottom - fromCoords.top,\n };\n },\n\n moveCursorNearTop: () => {\n scrollIntoView(view, view.state.selection.from, false, undefined, 100);\n },\n\n dispose: () => {\n spellingDocPlugin(view.state).onCheckEnd(view);\n },\n };\n}\n\n// companion plugin for SpellingDoc provided above (shows 'fake' selection during\n// interactive spell check dialog and maintains anchor position(s) across\n// transactions that occur while the dialog/doc is active)\n\nconst spellingDocKey = new PluginKey<DecorationSet>('spelling-doc-plugin');\n\nfunction spellingDocPlugin(state: EditorState) {\n return spellingDocKey.get(state) as SpellingDocPlugin;\n}\n\nexport class SpellingDocPlugin extends Plugin<DecorationSet> {\n private checking = false;\n private anchors: SpellingAnchor[] = [];\n\n constructor() {\n super({\n key: spellingDocKey,\n state: {\n init: () => {\n return DecorationSet.empty;\n },\n apply: (tr: Transaction, old: DecorationSet, oldState: EditorState, newState: EditorState) => {\n if (this.checking) {\n // map anchors\n this.anchors.forEach(anchor => {\n anchor.setPosition(tr.mapping.map(anchor.getPosition()));\n });\n\n // show selection\n if (!tr.selection.empty) {\n return DecorationSet.create(tr.doc, [\n Decoration.inline(tr.selection.from, tr.selection.to, { class: 'pm-selected-text' }),\n ]);\n }\n }\n\n return DecorationSet.empty;\n },\n },\n props: {\n decorations: (state: EditorState) => {\n return spellingDocKey.getState(state);\n },\n },\n });\n }\n\n public createAnchor(pos: number) {\n const anchor = new SpellingAnchor(pos);\n this.anchors.push(anchor);\n return anchor;\n }\n\n public onCheckBegin() {\n this.checking = true;\n }\n\n public onCheckEnd(view: EditorView) {\n this.checking = false;\n this.anchors = [];\n\n if (!view.state.selection.empty) {\n const tr = view.state.tr;\n setTextSelection(tr.selection.to)(tr);\n view.dispatch(tr);\n }\n }\n}\n\nclass SpellingAnchor implements EditorAnchor {\n private pos = 0;\n constructor(pos: number) {\n this.pos = pos;\n }\n public getPosition() {\n return this.pos;\n }\n public setPosition(pos: number) {\n this.pos = pos;\n }\n}\n\nconst extension = () => {\n return {\n plugins: () => {\n return [new SpellingDocPlugin()];\n },\n };\n};\n\nexport default extension;\n","/*\n * spelling.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { MarkType, Schema, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorState } from 'prosemirror-state';\n\nimport { EditorWordSource, EditorWordRange, EditorUISpelling, kCharClassNonWord } from '../../api/spelling';\nimport { PandocMark, getMarkRange } from '../../api/mark';\n\nexport const beginDocPos = () => 1;\nexport const endDocPos = (doc: ProsemirrorNode) => doc.nodeSize - 2;\n\nexport function getWords(\n state: EditorState,\n start: number,\n end: number,\n spelling: EditorUISpelling,\n excluded: MarkType[],\n): EditorWordSource {\n // provide defaults\n if (start === -1) {\n start = beginDocPos();\n }\n if (end === -1) {\n end = endDocPos(state.doc);\n }\n\n // enlarge range to begin/end\n const beginPos = findBeginWord(state, start, spelling.classifyCharacter);\n const endPos = findEndWord(state, end, spelling.classifyCharacter);\n\n const words: EditorWordRange[] = [];\n let currentPos = beginPos;\n while (currentPos <= endPos) {\n // advance until we find a word\n currentPos = advanceToWord(state, currentPos, spelling.classifyCharacter);\n if (currentPos >= endPos) {\n break;\n }\n\n // find end of word\n const endWordPos = findEndWord(state, currentPos, spelling.classifyCharacter);\n if (endWordPos === currentPos) {\n break;\n }\n\n // add word if it doesn't have an excluded type\n if (!excludeWord(state.doc, currentPos, endWordPos, excluded)) {\n const wordText = state.doc.textBetween(currentPos, endWordPos);\n words.push(\n ...spelling.breakWords(wordText).map(wordRange => {\n return {\n start: currentPos + wordRange.start,\n end: currentPos + wordRange.end,\n };\n }),\n );\n }\n\n // next word\n currentPos = endWordPos;\n }\n\n // return iterator over word range\n return {\n hasNext: () => {\n return words.length > 0;\n },\n next: () => {\n if (words.length > 0) {\n return words.shift()!;\n } else {\n return null;\n }\n },\n };\n}\n\nfunction excludeWord(doc: ProsemirrorNode, from: number, to: number, excluded: MarkType[]) {\n // does it have one of our excluded mark types?\n if (excluded.some(markType => doc.rangeHasMark(from, to, markType))) {\n return true;\n }\n\n // is it in a code block\n const $from = doc.resolve(from);\n if ($from.parent.isBlock && $from.parent.type.spec.code) {\n return true;\n }\n\n // it is in a link mark where the link text is a url?\n const schema = doc.type.schema;\n if (schema.marks.link && doc.rangeHasMark(from, to, schema.marks.link)) {\n const range = getMarkRange(doc.resolve(from), schema.marks.link);\n if (range && /^[a-z]+:\\/\\/.*$/.test(doc.textBetween(range.from, range.to))) {\n return true;\n }\n }\n\n // don't exclude\n return false;\n}\n\nexport function advanceToWord(state: EditorState, pos: number, classifier: (ch: number) => number) {\n while (pos < endDocPos(state.doc)) {\n const nextChar = charAt(state.doc, pos);\n if (classifier(nextChar) !== kCharClassNonWord) {\n break;\n } else {\n pos++;\n }\n }\n return pos;\n}\n\nexport function findBeginWord(state: EditorState, pos: number, classifier: (ch: number) => number) {\n // scan backwards until a non-word character is encountered\n while (pos >= beginDocPos()) {\n const prevChar = charAt(state.doc, pos - 1);\n if (classifier(prevChar) === kCharClassNonWord) {\n break;\n } else {\n pos--;\n }\n }\n // return the position\n return pos;\n}\n\nexport function findEndWord(state: EditorState, pos: number, classifier: (ch: number) => number) {\n // scan forwards until a non-word character is encountered\n while (pos < endDocPos(state.doc)) {\n const nextChar = charAt(state.doc, pos);\n if (classifier(nextChar) === kCharClassNonWord) {\n break;\n } else {\n pos++;\n }\n }\n\n // return the position\n return pos;\n}\n\n// get the chracter code at the specified position, returning character code 32 (a space)\n// for begin/end of document, block boundaries, and non-text leaf nodes\nexport function charAt(doc: ProsemirrorNode, pos: number) {\n if (pos < beginDocPos() || pos >= endDocPos(doc)) {\n return 32; // space for doc boundary\n } else {\n return (doc.textBetween(pos, pos + 1, ' ', ' ') || ' ').charCodeAt(0);\n }\n}\n\nexport function excludedMarks(schema: Schema, marks: readonly PandocMark[]): MarkType[] {\n return marks.filter(mark => mark.noSpelling).map(mark => schema.marks[mark.name]);\n}\n\nexport function spellcheckerWord(word: string) {\n return word.replace(/’/g, \"'\");\n}\n","/*\n * spelling.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport const kCharClassWord = 0;\nexport const kCharClassBoundary = 1;\nexport const kCharClassNonWord = 2;\n\nexport interface EditorUISpelling {\n // realtime interface\n realtimeEnabled: () => boolean;\n checkWords: (words: string[]) => string[];\n suggestionList: (word: string, callback: (suggestions: string[]) => void) => void;\n\n // dictionary\n isWordIgnored: (word: string) => boolean;\n ignoreWord: (word: string) => void;\n unignoreWord: (word: string) => void;\n addToDictionary: (word: string) => void;\n\n // word breaking\n breakWords: (text: string) => EditorWordRange[];\n classifyCharacter: (ch: number) => number;\n}\n\nexport interface EditorAnchor {\n getPosition: () => number;\n}\n\nexport interface EditorRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface EditorWordRange {\n start: number;\n end: number;\n}\n\nexport interface EditorWordSource {\n hasNext: () => boolean;\n next: () => EditorWordRange | null;\n}\n\nexport interface EditorSpellingDoc {\n getWords: (start: number, end: number) => EditorWordSource;\n\n createAnchor: (pos: number) => EditorAnchor;\n\n shouldCheck: (wordRange: EditorWordRange) => boolean;\n setSelection: (wordRange: EditorWordRange) => void;\n getText: (wordRange: EditorWordRange) => string;\n\n getCursorPosition: () => number;\n replaceSelection: (text: string) => void;\n getSelectionStart: () => number;\n getSelectionEnd: () => number;\n\n getCursorBounds: () => EditorRect;\n moveCursorNearTop: () => void;\n\n dispose: () => void;\n}\n","/*\n * spelling-realtime.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, MarkType } from 'prosemirror-model';\nimport { Plugin, PluginKey, EditorState, Transaction, TextSelection } from 'prosemirror-state';\nimport { DecorationSet, EditorView, Decoration, DecorationAttrs } from 'prosemirror-view';\nimport { AddMarkStep, RemoveMarkStep } from 'prosemirror-transform';\nimport { ChangeSet } from 'prosemirror-changeset';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { FocusEvent } from '../../api/event-types';\nimport { PandocMark } from '../../api/mark';\nimport {\n EditorUISpelling,\n EditorWordRange,\n kCharClassWord\n} from '../../api/spelling';\nimport { EditorEvents } from '../../api/events';\nimport { kAddToHistoryTransaction } from '../../api/transaction';\nimport { EditorUI, EditorMenuItem } from '../../api/ui';\n\nimport { excludedMarks, getWords, spellcheckerWord, findBeginWord, findEndWord, charAt } from './spelling';\n\nconst kUpdateSpellingTransaction = 'updateSpelling';\nconst kInvalidateSpellingWordTransaction = 'invalidateSpellingWord';\nconst kSpellingErrorClass = 'pm-spelling-error';\n\nconst realtimeSpellingKey = new PluginKey<DecorationSet>('spelling-realtime-plugin');\n\nexport function realtimeSpellingPlugin(\n schema: Schema,\n marks: readonly PandocMark[],\n ui: EditorUI,\n events: EditorEvents,\n) {\n return new RealtimeSpellingPlugin(excludedMarks(schema, marks), ui, events);\n}\n\nexport function invalidateAllWords(view: EditorView) {\n updateSpelling(view);\n}\n\nexport function invalidateWord(view: EditorView, word: string) {\n const tr = view.state.tr;\n tr.setMeta(kInvalidateSpellingWordTransaction, word);\n tr.setMeta(kAddToHistoryTransaction, false);\n view.dispatch(tr);\n}\n\nclass RealtimeSpellingPlugin extends Plugin<DecorationSet> {\n // track whether we've ever had the focus (don't do any spelling operations until then)\n private hasBeenFocused = true;\n\n private view: EditorView | null = null;\n private readonly ui: EditorUI;\n\n constructor(excluded: MarkType[], ui: EditorUI, events: EditorEvents) {\n super({\n key: realtimeSpellingKey,\n view: (view: EditorView) => {\n this.view = view;\n return {};\n },\n state: {\n init: (_config, state: EditorState) => {\n return DecorationSet.empty;\n },\n apply: (tr: Transaction, old: DecorationSet, oldState: EditorState, newState: EditorState) => {\n // if we somehow manage to get focus w/o our FocusEvent (below) being called then also\n // flip the hasBeenFocused bit here\n if (this.view?.hasFocus()) {\n this.hasBeenFocused = true;\n }\n\n // don't continue if either realtime spelling is disabled or we have never been focused\n if (!this.ui.spelling.realtimeEnabled() || !this.hasBeenFocused) {\n return DecorationSet.empty;\n }\n\n if (tr.getMeta(kUpdateSpellingTransaction)) {\n // explicit update request invalidates any existing decorations (this can happen when\n // we get focus for the very first time or when the main or secondary dictionaries change)\n return DecorationSet.create(newState.doc, spellingDecorations(newState, ui.spelling, excluded));\n } else if (tr.getMeta(kInvalidateSpellingWordTransaction)) {\n // for word invalidations we search through the decorations and remove words that match\n const word = tr.getMeta(kInvalidateSpellingWordTransaction) as string;\n\n // find decorations that have this word and remove them\n const wordDecos = old.find(undefined, undefined, spec => spec.word === word);\n\n // return decorators w/ those words removed\n return old.remove(wordDecos);\n } else if (tr.docChanged) {\n // perform an incremental update of spelling decorations (invalidate and re-scan\n // for decorations in changed ranges)\n\n // start w/ previous state\n let decos = old;\n\n // create change set from transaction\n let changeSet = ChangeSet.create(oldState.doc);\n changeSet = changeSet.addSteps(newState.doc, tr.mapping.maps);\n\n // collect ranges that had mark changes\n const markRanges: Array<{ from: number; to: number }> = [];\n for (const step of tr.steps) {\n if (step instanceof AddMarkStep || step instanceof RemoveMarkStep) {\n const markStep = step as any;\n markRanges.push({ from: markStep.from, to: markStep.to });\n }\n }\n\n // remove ranges = mark ranges + deleted ranges\n const removeRanges = markRanges.concat(\n changeSet.changes.map(change => ({ from: change.fromA, to: change.toA })),\n );\n\n // remove decorations from deleted ranges (expanding ranges to word boundaries)\n for (const range of removeRanges) {\n const fromPos = findBeginWord(oldState, range.from, ui.spelling.classifyCharacter);\n const toPos = findEndWord(oldState, range.to, ui.spelling.classifyCharacter);\n decos = decos.remove(decos.find(fromPos, toPos));\n }\n\n // map decoration positions to new document\n decos = decos.map(tr.mapping, tr.doc);\n\n // add ranges = mark ranges + inserted ranges\n const addRanges = markRanges.concat(\n changeSet.changes.map(change => ({ from: change.fromB, to: change.toB })),\n );\n\n // scan inserted ranges for spelling decorations (don't need to find word boundaries\n // b/c spellingDecorations already does that)\n for (const range of addRanges) {\n decos = decos.add(\n tr.doc,\n spellingDecorations(newState, ui.spelling, excluded, false, range.from - 1, range.to)\n );\n }\n\n // return decorators\n return decos;\n } else if (tr.selectionSet) {\n // if we had previously suppressed a decoration due to typing at the cursor, restore it\n // whenever the selection changes w/o the doc changing\n\n // start with previous state\n let decos = old;\n\n // find any special 'at cursor' errors\n const cursorDecos = decos.find(undefined, undefined, spec => !!spec.cursor);\n if (cursorDecos.length) {\n // there will only be one cursor, capture it's position then remove it\n const word = cursorDecos[0].spec.word as string;\n const { from, to } = cursorDecos[0];\n decos = decos.remove(cursorDecos);\n\n // add it back in as a real spelling error\n decos = decos.add(tr.doc, [Decoration.inline(from, to, { class: kSpellingErrorClass }, { word })]);\n }\n\n // return decorators\n return decos;\n } else {\n // no content or selection change, return old w/o mapping\n return old;\n }\n },\n },\n props: {\n decorations: (state: EditorState) => {\n return realtimeSpellingKey.getState(state);\n },\n handleDOMEvents: {\n contextmenu: spellingSuggestionContextMenuHandler(ui),\n },\n },\n });\n\n // save reference to ui\n this.ui = ui;\n\n // trigger update on first focus\n const focusUnsubscribe = events.subscribe(FocusEvent, () => {\n if (this.view) {\n focusUnsubscribe();\n this.hasBeenFocused = true;\n updateSpelling(this.view);\n\n // call a second time as no words will be cached initially, this simplifies the\n // need for threading a callback through the entire plugin system\n const v = this.view;\n setTimeout(() => {\n if (v.dom?.isConnected) {\n updateSpelling(v);\n }\n }, 5000); \n }\n });\n }\n}\n\nfunction spellingDecorations(\n state: EditorState,\n spelling: EditorUISpelling,\n excluded: MarkType[],\n excludeCursor = false,\n from = -1,\n to = -1,\n): Decoration[] {\n\n // a map of wordText -> [wordRange...]\n const rangeMap = new Map<string, EditorWordRange[]>();\n\n // break words\n const words = getWords(state, from, to, spelling, excluded);\n\n // spell check and return decorations for misspellings\n const decorations: Decoration[] = [];\n\n // words to pass to the spellchecker\n const wordsToCheck: string[] = [];\n\n while (words.hasNext()) {\n const word = words.next()!;\n const wordText = state.doc.textBetween(word.start, word.end);\n\n const ranges = rangeMap.get(wordText) || [];\n ranges.push(word);\n rangeMap.set(wordText, ranges);\n\n wordsToCheck.push(spellcheckerWord(wordText));\n }\n\n const incorrectWords: string[] = spelling.checkWords(wordsToCheck);\n\n for (const incorrectWord of incorrectWords) {\n const ranges: EditorWordRange[] | undefined = rangeMap.get(incorrectWord);\n\n if (!!ranges) {\n for (const range of ranges) {\n const attrs: DecorationAttrs = {};\n const spec: { [key: string]: any } = {\n word: incorrectWord,\n };\n if (excludeCursor && state.selection.head > range.start && state.selection.head <= range.end) {\n spec.cursor = true;\n } else {\n attrs.class = kSpellingErrorClass;\n }\n decorations.push(Decoration.inline(range.start, range.end, attrs, spec));\n }\n }\n }\n\n return decorations;\n}\n\nfunction spellingSuggestionContextMenuHandler(ui: EditorUI) {\n return (view: EditorView, event: Event) => {\n if (!ui.display.showContextMenu) {\n return false;\n }\n\n // helper to create a menu action\n const menuAction = (text: string, action: VoidFunction) => {\n return {\n text,\n exec: () => {\n action();\n view.focus();\n },\n };\n };\n\n // helper to show a context menu and prevent further event handling\n const showContextMenu = (menuItems: EditorMenuItem[]) => {\n // show the menu\n const { clientX, clientY } = event as MouseEvent;\n ui.display.showContextMenu!(menuItems, clientX, clientY);\n };\n\n if (event.target && event.target instanceof Node) {\n // alias schema\n const schema = view.state.schema;\n\n // find the spelling decoration at this position (if any)\n const pos = view.posAtDOM(event.target, 0);\n const deco = realtimeSpellingKey.getState(view.state)!.find(pos, pos);\n if (deco.length) {\n // prevent default handling\n event.stopPropagation();\n event.preventDefault();\n\n // get word\n const { from, to } = deco[0];\n const word = spellcheckerWord(view.state.doc.textBetween(from, to));\n\n const kMaxSuggetions = 5;\n ui.spelling.suggestionList(word, (suggestions: string[]): void => {\n // create menu w/ suggestions\n const menuItems: EditorMenuItem[] = suggestions.slice(0, kMaxSuggetions).map(suggestion => {\n return {\n text: suggestion,\n exec: () => {\n const tr = view.state.tr;\n tr.setSelection(TextSelection.create(tr.doc, from, to));\n const marks = tr.selection.$from.marks();\n tr.replaceSelectionWith(schema.text(suggestion, marks), false);\n setTextSelection(from + suggestion.length)(tr);\n view.dispatch(tr);\n view.focus();\n },\n };\n });\n if (menuItems.length) {\n menuItems.push({ separator: true });\n }\n\n menuItems.push(menuAction(ui.context.translateText('Ignore All'), () => ui.spelling.ignoreWord(word)));\n menuItems.push({ separator: true });\n menuItems.push(\n menuAction(ui.context.translateText('Add to Dictionary'), () => ui.spelling.addToDictionary(word)),\n );\n\n // show context menu\n showContextMenu(menuItems);\n });\n\n return true;\n }\n\n // find the word at this position and see if it's ignored. if so provide an unignore context menu\n const classify = ui.spelling.classifyCharacter;\n const mouseEvent = event as MouseEvent;\n const clickPos = view.posAtCoords({ left: mouseEvent.clientX, top: mouseEvent.clientY });\n if (clickPos) {\n const ch = charAt(view.state.doc, clickPos.pos);\n if (classify(ch) === kCharClassWord) {\n const from = findBeginWord(view.state, clickPos.pos, classify);\n const to = findEndWord(view.state, clickPos.pos, classify);\n const word = spellcheckerWord(view.state.doc.textBetween(from, to));\n\n if (ui.spelling.isWordIgnored(word)) {\n // prevent default handling\n event.stopPropagation();\n event.preventDefault();\n\n showContextMenu([\n menuAction(`${ui.context.translateText('Unignore')} \\'${word}\\'`, () => ui.spelling.unignoreWord(word)),\n ]);\n return true;\n }\n }\n }\n }\n\n return false;\n };\n}\n\nfunction updateSpelling(view: EditorView) {\n const tr = view.state.tr;\n tr.setMeta(kUpdateSpellingTransaction, true);\n tr.setMeta(kAddToHistoryTransaction, false);\n view.dispatch(tr);\n}\n","/*\n * pandoc_converter.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { findChildren } from 'prosemirror-utils';\n\nimport {\n PandocServer,\n PandocTokenReader,\n PandocNodeWriter,\n PandocMarkWriter,\n PandocPreprocessorFn,\n PandocBlockReaderFn,\n PandocPostprocessorFn,\n PandocInlineHTMLReaderFn,\n PandocWriterOptions,\n PandocTokensFilterFn,\n} from '../api/pandoc';\n\nimport { haveTableCellsWithInlineRcode } from '../api/rmd';\n\nimport { pandocFormatWith, PandocFormat, kGfmFormat, kCommonmarkFormat } from '../api/pandoc_format';\nimport { PandocCapabilities } from '../api/pandoc_capabilities';\nimport { PandocBlockCapsuleFilter, pandocMarkdownWithBlockCapsules } from '../api/pandoc_capsule';\n\nimport { ExtensionManager } from '../editor/editor-extensions';\n\nimport { pandocToProsemirror } from './pandoc_to_prosemirror';\nimport { pandocFromProsemirror } from './pandoc_from_prosemirror';\nimport { isParagraphNode } from '../api/paragraph';\n\nexport type PandocLineWrapping = 'none' | 'column' | 'sentence';\n\nexport interface PandocToProsemirrorResult {\n doc: ProsemirrorNode;\n line_wrapping: PandocLineWrapping;\n unrecognized: string[];\n example_lists: boolean;\n unparsed_meta: { [key: string]: any };\n}\n\nexport class PandocConverter {\n private readonly schema: Schema;\n private readonly preprocessors: readonly PandocPreprocessorFn[];\n private readonly postprocessors: readonly PandocPostprocessorFn[];\n private readonly readers: readonly PandocTokenReader[];\n private readonly tokensFilters: readonly PandocTokensFilterFn[];\n private readonly blockReaders: readonly PandocBlockReaderFn[];\n private readonly inlineHTMLReaders: readonly PandocInlineHTMLReaderFn[];\n private readonly blockCapsuleFilters: readonly PandocBlockCapsuleFilter[];\n private readonly nodeWriters: readonly PandocNodeWriter[];\n private readonly markWriters: readonly PandocMarkWriter[];\n private readonly pandoc: PandocServer;\n private readonly pandocCapabilities: PandocCapabilities;\n\n constructor(\n schema: Schema,\n extensions: ExtensionManager,\n pandoc: PandocServer,\n pandocCapabilities: PandocCapabilities,\n ) {\n this.schema = schema;\n\n this.preprocessors = extensions.pandocPreprocessors();\n this.postprocessors = extensions.pandocPostprocessors();\n this.readers = extensions.pandocReaders();\n this.tokensFilters = extensions.pandocTokensFilters();\n this.blockReaders = extensions.pandocBlockReaders();\n this.inlineHTMLReaders = extensions.pandocInlineHTMLReaders();\n this.blockCapsuleFilters = extensions.pandocBlockCapsuleFilters();\n this.nodeWriters = extensions.pandocNodeWriters();\n this.markWriters = extensions.pandocMarkWriters();\n\n this.pandoc = pandoc;\n this.pandocCapabilities = pandocCapabilities;\n }\n\n public async toProsemirror(markdown: string, format: PandocFormat): Promise<PandocToProsemirrorResult> {\n // save original markdown (for aligning capsule positions)\n const original = markdown;\n\n // adjust format. we always need to *read* raw_html, raw_attribute, and backtick_code_blocks b/c\n // that's how preprocessors hoist content through pandoc into our prosemirror token parser.\n // we always need to read with auto_identifiers so we can catch any auto-generated ids\n // required to fulfill links inside the document (we will strip out heading ids that\n // aren't explicit or a link target using the heading_ids returned with the ast). \n //\n // we always read all forms of tables (since they can always be written back out as raw_html)\n //\n // we also always read math (since it can always be output as 'asciimath')\n //\n // we disable 'smart' b/c that causes pandoc to insert non-breaking spaces before selected\n // abbreviations like e.g. rather, we do our own implementation of 'smart' when we read\n // PandocTokenType.Str from the ast\n\n // determine type of auto_ids\n const autoIds = format.extensions.gfm_auto_identifiers ? 'gfm_auto_identifiers' : 'auto_identifiers';\n const targetFormat = adjustedFormat(\n format.fullName,\n ['raw_html', 'raw_attribute', 'backtick_code_blocks', autoIds, \n 'grid_tables', 'pipe_tables', 'multiline_tables', 'simple_tables',\n 'tex_math_dollars'],\n ['smart'],\n );\n\n // run preprocessors\n this.preprocessors.forEach(preprocessor => {\n markdown = preprocessor(markdown);\n });\n\n // create source capsules\n this.blockCapsuleFilters.forEach(filter => {\n markdown = pandocMarkdownWithBlockCapsules(original, markdown, filter);\n });\n\n const ast = await this.pandoc.markdownToAst(markdown, targetFormat, []);\n const result = pandocToProsemirror(\n ast,\n this.schema,\n format.extensions,\n this.readers,\n this.tokensFilters,\n this.blockReaders,\n this.inlineHTMLReaders,\n this.blockCapsuleFilters,\n );\n\n // run post-processors\n this.postprocessors.forEach(postprocessor => {\n result.doc = postprocessor(result.doc);\n });\n\n // return the doc\n return result;\n }\n\n // NOTE: For a plain markdown file, this is the closest we can come to cannonicalizing w/ just pandoc:\n //\n // pandoc MANUAL.md --to markdown-auto_identifiers-smart -o MANUAL.md --self-contained --atx-headers --wrap=none\n //\n // For R Mardown files, we would need to pull out the Rmd chunks before sending to pandoc.\n //\n\n public async fromProsemirror(\n doc: ProsemirrorNode,\n pandocFormat: PandocFormat,\n options: PandocWriterOptions,\n ): Promise<string> {\n // generate pandoc ast\n const output = pandocFromProsemirror(\n doc,\n this.pandocCapabilities.api_version,\n pandocFormat,\n this.nodeWriters,\n this.markWriters,\n );\n\n // adjust format. we always need to be able to write raw_attribute b/c that's how preprocessors\n // hoist content through pandoc into our prosemirror token parser. since we open this door when\n // reading, users could end up writing raw inlines, and in that case we want them to echo back\n // to the source document just the way they came in. for writing markdown from pm we don't\n // ever want to generate auto identifiers so we disable them here. we also disable smart b/c\n // we do this manually above in pandocFromProsemirror (so we can avoid pandoc's insertion of\n // nbsp's after abbreviations, which is more approriate for final output than editing)\n let format = adjustedFormat(\n pandocFormat.fullName,\n ['raw_html', 'raw_attribute'], // always enable\n ['auto_identifiers', 'gfm_auto_identifiers', 'smart'],\n ); // always disable\n\n // disable selected format options\n format = pandocFormatWith(format, disabledFormatOptions(format, pandocFormat, doc), '');\n\n // prepare pandoc options\n let pandocOptions: string[] = [];\n if (!options.atxHeaders) {\n pandocOptions.push('--markdown-headings=setext');\n }\n if (options.dpi) {\n pandocOptions.push('--dpi');\n }\n // default to block level references (validate known types)\n let referenceLocation = 'block';\n if (options.references?.location) {\n referenceLocation = ['block', 'section', 'document'].includes(options.references.location)\n ? options.references.location\n : 'block';\n }\n pandocOptions.push(`--reference-location=${referenceLocation}`);\n\n // references prefix (if any)\n if (options.references?.prefix) {\n pandocOptions.push('--id-prefix', options.references.prefix);\n }\n\n // provide wrap options\n pandocOptions = pandocOptions.concat(wrapOptions(options));\n\n // render to markdown\n const markdown = await this.pandoc.astToMarkdown(output.ast, format, pandocOptions);\n\n // normalize newlines (don't know if pandoc uses \\r\\n on windows)\n return markdown.replace(/\\r\\n|\\n\\r|\\r/g, '\\n');\n }\n}\n\n// adjust the specified format\nfunction adjustedFormat(format: string, extensions: string[], disabled: string[]) {\n let newFormat = pandocFormatWith(\n format,\n '',\n extensions.map(ext => `+${ext}`).join('') + disabled.map(ext => `-${ext}`).join(''),\n );\n\n // any extension specified needs to not have a - anywhere in the format\n extensions.forEach(ext => {\n newFormat = newFormat.replace('-' + ext, '');\n });\n\n return newFormat;\n}\n\nfunction disabledFormatOptions(format: string, pandocFormat: PandocFormat, doc: ProsemirrorNode) {\n // (prefer pipe and grid tables). users can still force the availability of these by\n // adding those format flags but all known markdown variants that support tables also\n // support pipe tables so this seems unlikely to ever be required.\n let disabledTableTypes = '-simple_tables-multiline_tables';\n\n // if there are tables with inline R code then disable grid tables (as the inline\n // R code will mess up the column boundaries)\n if (haveTableCellsWithInlineRcode(doc) || \n (!gridTablesRequired(doc) && pandocFormat.extensions.pipe_tables)) {\n disabledTableTypes += '-grid_tables';\n }\n\n // gfm and commonmark variants don't allow simple/multiline/grid tables (just pipe tables)\n // and it's an error to even include these in the markdown format specifier -- so for\n // these modes we just nix the disabling\n if (format.startsWith(kGfmFormat) || format.startsWith(kCommonmarkFormat)) {\n disabledTableTypes = '';\n }\n\n // return\n return disabledTableTypes;\n}\n\nfunction gridTablesRequired(doc: ProsemirrorNode) {\n const schema = doc.type.schema;\n const isTableCell = (node: ProsemirrorNode) => node.type === schema.nodes.table_cell || node.type === schema.nodes.table_header;\n return findChildren(doc, isTableCell).some(cell => {\n // various things require grid tables (basically anyting that requires embedded newlines)\n\n // multiple blocks\n if (cell.node.childCount > 1) {\n return true;\n }\n\n // non paragraph block\n if (!isParagraphNode(cell.node.firstChild)) {\n return true;\n }\n\n // paragraph with hard break\n const paraNode = cell.node.firstChild!;\n return findChildren(paraNode, node => node.type === schema.nodes.hard_break).length > 0;\n }); \n}\n\nfunction wrapOptions(options: PandocWriterOptions) {\n const pandocOptions: string[] = [];\n if (options.wrap) {\n if (options.wrap === 'none' || options.wrap === 'sentence') {\n pandocOptions.push('--wrap=none');\n } else {\n const column = parseInt(options.wrap, 10);\n if (column) {\n pandocOptions.push('--wrap=auto');\n pandocOptions.push(`--columns=${column}`);\n } else {\n pandocOptions.push('--wrap=none');\n }\n }\n } else {\n pandocOptions.push('--wrap=none');\n }\n return pandocOptions;\n}\n","/*\n * pandoc_capsule.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\n\nimport { base64Encode, base64Decode } from './base64';\n\nimport { PandocToken, ProsemirrorWriter, mapTokens, PandocTokenType } from './pandoc';\n\n// constants used for creating/consuming capsules\nconst kFieldDelimiter = '\\n';\nconst kValueDelimiter = ':';\nconst kTypeField = 'type';\nconst kPositionField = 'position';\nconst kPrefixField = 'prefix';\nconst kSourceField = 'source';\nconst kSuffixField = 'suffix';\nconst kBlockCapsuleSentinel = '31B8E172-B470-440E-83D8-E6B185028602'.toLowerCase();\n\n// block capsule\nexport interface PandocBlockCapsule {\n type: string;\n position: number;\n prefix: string;\n source: string;\n suffix: string;\n}\n\n// preserve block source code through markdown parsing (e.g. for yaml metadata or rmd chunks).\n// block capsules remove markdown from the document before pandoc parses it (placing it into\n// a base64 encoded 'capsule'), then unwraps the capsule from the AST. All of this is done\n// by the function in this interface.\nexport interface PandocBlockCapsuleFilter {\n // unique type id for this capsule\n type: string;\n\n // regex that matches a prefix (match[1]), the source to preserve (match[2]), and a suffix (match[3])\n // we need the prefix/suffix for the cases where the preserved source needs to be put back exactly\n // where it came from (e.g. in a multi-line html comment). we also need it to fixup indentation in\n // cases where capsules are unwrapped within a code block or raw block. the prefix and suffix\n // must begin and end (respectively) with newlines, and consist entirely of whitespace (e.g. leading\n // space for indented block or incidental whitespace after block delimiter)\n match: RegExp;\n\n // optional seconary filter expression (applied to a successful match to ensure\n // that matching wasn't overly greedy)\n discard?: RegExp;\n\n // custom function for pulling out the 3 parts from a match (defaults to p1,p2,p3)\n extract?: (\n match: string,\n p1: string,\n p2: string,\n p3: string,\n p4: string,\n ) => { prefix: string; source: string; suffix: string };\n\n // provide a (text) envelope around the capsule, e.g.\n // - newlines to ensure that yaml is parsed as a standalone paragraph;\n // - backticks to ensure an Rmd is structurally parsed by pandoc as a codeblock\n enclose: (capsuleText: string, capsule: PandocBlockCapsule) => string;\n\n // examine a piece of text from within the pandoc ast and, if approproate, substitute any\n // capsules of my type for the original text (otherwise just return the passed string).\n // this method will generally use encodedBlockCapsuleRegex to create a regex to search\n // with, then upon finding a capsule, will unpack it with parsePandocBlockCapsule, compare\n // the type against our own type, and in the case they match do the substitution.\n handleText: (text: string, tok: PandocToken) => string;\n\n // do you want to handle this token as a capsule object? if so return the capsule text\n // (only the filter will know how to extract it from a pandoc token b/c it knows\n // where it was parsed from and what happened in the 'enclose' method)\n handleToken: (tok: PandocToken) => string | null;\n\n // write a capsule as a pandoc node\n writeNode: (schema: Schema, writer: ProsemirrorWriter, capsule: PandocBlockCapsule) => void;\n}\n\n// transform the passed markdown to include base64 encoded block capsules as specified by the\n// provided capsule filter. capsules are used to hoist block types that we don't want pandoc\n// to see (e.g. yaml metadata or Rmd chunks) out of the markdown, only to be re-inserted\n// after pandoc has yielded an ast. block capsules are a single base64 encoded pieced of\n// text that include the original content, the matched prefix and suffix, and a type\n// identifier for orchestrating the unpacking.\nexport function pandocMarkdownWithBlockCapsules(\n original: string,\n markdown: string,\n capsuleFilter: PandocBlockCapsuleFilter,\n) {\n // default extractor\n const defaultExtractor = (match: string, p1: string, p2: string, p3: string) => {\n return {\n prefix: p1,\n source: p2,\n suffix: p3,\n };\n };\n\n // find the original position of all the matches\n const positions: number[] = [];\n let match = capsuleFilter.match.exec(original);\n while (match != null) {\n positions.push(match.index);\n match = capsuleFilter.match.exec(original);\n }\n\n // reset capsule filter match index\n capsuleFilter.match.lastIndex = 0;\n\n // replace all w/ source preservation capsules\n return markdown.replace(capsuleFilter.match, (match: string, p1: string, p2: string, p3: string, p4: string) => {\n // read the original position of the match\n let position = 0;\n const originalPos = positions.shift();\n if (originalPos) {\n position = originalPos;\n }\n\n // if the capsuleFilter has a discard expression then check it\n if (capsuleFilter.discard && !!match.match(capsuleFilter.discard)) {\n return match;\n }\n\n // extract matches\n const extract = capsuleFilter.extract || defaultExtractor;\n const { prefix, source, suffix } = extract(match, p1, p2, p3, p4);\n\n // make the capsule\n const capsule: PandocBlockCapsule = {\n [kTypeField]: capsuleFilter.type,\n [kPositionField]: position,\n [kPrefixField]: prefix,\n [kSourceField]: source,\n [kSuffixField]: suffix,\n };\n\n // construct a field\n const field = (name: string, value: string) => `${name}${kValueDelimiter}${base64Encode(value)}`;\n\n // construct a record\n const record =\n field(kTypeField, capsule.type) +\n kFieldDelimiter +\n field(kPositionField, capsule.position.toString()) +\n kFieldDelimiter +\n field(kPrefixField, capsule.prefix) +\n kFieldDelimiter +\n field(kSourceField, capsule.source) +\n kFieldDelimiter +\n field(kSuffixField, capsule.suffix);\n\n // now base64 encode the entire record (so it can masquerade as a paragraph)\n const encodedRecord = base64Encode(record);\n\n // return capsule, which is:\n // - a base64 encoded record surrounded with a sentinel value\n // - enclosed in a filter specific envelope (used to influence pandoc parsing),\n // - surrounded by the original prefix and suffix\n return (\n prefix +\n capsuleFilter.enclose(\n `${kBlockCapsuleSentinel}${kValueDelimiter}${encodedRecord}${kValueDelimiter}${kBlockCapsuleSentinel}`,\n capsule,\n ) +\n suffix\n );\n });\n}\n\n// block capsules can also end up not as block tokens, but rather as text within another\n// token (e.g. within a backtick code block or raw_block). this function takes a set\n// of pandoc tokens and recursively converts block capsules that aren't of type\n// PandocTokenType.Str (which is what we'd see in a paragraph) into their original form\nexport function resolvePandocBlockCapsuleText(\n tokens: PandocToken[],\n filters: readonly PandocBlockCapsuleFilter[],\n): PandocToken[] {\n // process all tokens\n return mapTokens(tokens, token => {\n // look for non-string pandoc tokens\n if (token.t !== PandocTokenType.Str && token.c) {\n if (typeof token.c === 'string') {\n token.c = decodeBlockCapsuleText(token.c, token, filters);\n } else if (Array.isArray(token.c)) {\n const children = token.c.length;\n for (let i = 0; i < children; i++) {\n if (typeof token.c[i] === 'string') {\n token.c[i] = decodeBlockCapsuleText(token.c[i], token, filters);\n }\n }\n }\n }\n\n return token;\n });\n}\n\n// decode the text capsule by running all of the filters (as there could be nesting)\nexport function decodeBlockCapsuleText(text: string, tok: PandocToken, filters: readonly PandocBlockCapsuleFilter[]) {\n filters.forEach(filter => {\n text = filter.handleText(text, tok);\n });\n return text;\n}\n\nexport function blockCapsuleTextHandler(type: string, pattern: RegExp, textFilter?: (text: string) => string) {\n return (text: string, tok: PandocToken): string => {\n // if this is a code block or raw block then we need to strip the prefix\n // (b/c it could in a blockquote or indented in a list)\n const stripPrefix = tok.t === PandocTokenType.CodeBlock || tok.t === PandocTokenType.RawBlock;\n\n // replace text\n return text.replace(pattern, match => {\n const capsuleText = textFilter ? textFilter(match) : match;\n const capsule = parsePandocBlockCapsule(capsuleText);\n if (capsule.type === type) {\n if (stripPrefix) {\n return blockCapsuleSourceWithoutPrefix(capsule.source, capsule.prefix);\n } else {\n return capsule.source;\n }\n } else {\n return match;\n }\n });\n };\n}\n\n// token handler that looks for a paragraph token consisting entirely of a block capsule of our type.\n// if we find that then return the block capsule text\nexport function blockCapsuleParagraphTokenHandler(type: string) {\n const tokenRegex = encodedBlockCapsuleRegex('^', '$');\n return (tok: PandocToken) => {\n if (tok.t === PandocTokenType.Para) {\n if (tok.c.length === 1 && tok.c[0].t === PandocTokenType.Str) {\n const text = tok.c[0].c as string;\n const match = text.match(tokenRegex);\n if (match) {\n const capsuleRecord = parsePandocBlockCapsule(match[0]);\n if (capsuleRecord.type === type) {\n return match[0];\n }\n }\n }\n }\n return null;\n };\n}\n\n// create a regex that can be used to match a block capsule\nexport function encodedBlockCapsuleRegex(prefix?: string, suffix?: string, flags?: string) {\n return new RegExp(\n (prefix || '') +\n kBlockCapsuleSentinel +\n kValueDelimiter +\n '((?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?)' +\n kValueDelimiter +\n kBlockCapsuleSentinel +\n (suffix || ''),\n flags,\n );\n}\n\n// remove encoding envelope then parse the remaining text into a block capsule\nexport function parsePandocBlockCapsule(text: string): PandocBlockCapsule {\n const envelopeLen = kBlockCapsuleSentinel.length + kFieldDelimiter.length;\n const record = text.substring(envelopeLen, text.length - envelopeLen);\n const decodedRecord = base64Decode(record);\n const fields = decodedRecord.split(kFieldDelimiter);\n const fieldValue = (i: number) => base64Decode(fields[i].split(kValueDelimiter)[1]);\n return {\n [kTypeField]: fieldValue(0),\n [kPositionField]: parseInt(fieldValue(1), 10),\n [kPrefixField]: fieldValue(2),\n [kSourceField]: fieldValue(3),\n [kSuffixField]: fieldValue(4),\n };\n}\n\n// provide a version of the block capsule source with the prefix removed\n// from all but the very first line. this allows us to restore the text\n// to the level of indentation implied by the markdown (as opposed to the\n// level found literally in the source file)\nexport function blockCapsuleSourceWithoutPrefix(source: string, prefix: string) {\n // prefix represents the indentation level of the block's source code, strip that\n // same prefix from all the lines of code save for the first one\n const prefixStripRegEx = new RegExp('^' + prefix);\n const lines = source.split('\\n').map((line, index) => {\n return index > 0 ? line.replace(prefixStripRegEx, '') : line;\n });\n return lines.join('\\n');\n}\n","/*\n * base_64.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n// btoa and atob don't handle unicode strings, see\n// https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/btoa#Unicode_strings\n\n// these functions implement the suggested workaround ()\n\nexport function base64Encode(text: string) {\n const binary = toBinary(text);\n return window.btoa(binary);\n}\n\nexport function base64Decode(encoded: string) {\n const decoded = atob(encoded);\n return fromBinary(decoded);\n}\n\n// convert a Unicode string to a string in which each 16-bit unit occupies only one byte\nfunction toBinary(text: string) {\n const codeUnits = new Uint16Array(text.length);\n for (let i = 0; i < codeUnits.length; i++) {\n codeUnits[i] = text.charCodeAt(i);\n }\n const charCodes = Array.from(new Uint8Array(codeUnits.buffer)).map(code => String.fromCharCode(code));\n return charCodes.join('');\n}\n\n// reverse the conversion\nfunction fromBinary(binary: string) {\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n const charCodes = Array.from(new Uint16Array(bytes.buffer)).map(code => String.fromCharCode(code));\n return charCodes.join('');\n}\n","/*\n * pandoc_to_prosemirror.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Mark, Node as ProsemirrorNode, NodeType, Schema } from 'prosemirror-model';\n\nimport {\n PandocTokenReader,\n PandocToken,\n PandocAst,\n ProsemirrorWriter,\n PandocBlockReaderFn,\n PandocInlineHTMLReaderFn,\n PandocTokensFilterFn,\n PandocTokenType,\n mapTokens,\n stringifyTokens,\n PandocExtensions,\n forEachToken,\n} from '../api/pandoc';\nimport {\n pandocAttrReadAST,\n kCodeBlockAttr,\n kCodeBlockText,\n kPandocAttrClasses,\n kPandocAttrKeyvalue,\n} from '../api/pandoc_attr';\nimport {\n PandocBlockCapsuleFilter,\n parsePandocBlockCapsule,\n resolvePandocBlockCapsuleText,\n decodeBlockCapsuleText,\n} from '../api/pandoc_capsule';\n\nimport { PandocToProsemirrorResult, PandocLineWrapping } from './pandoc_converter';\nimport { kLinkTarget, kLinkTargetUrl, kLinkChildren, kLinkAttr, kLinkTargetTitle } from '../api/link';\nimport { kHeadingAttr, kHeadingLevel, kHeadingChildren } from '../api/heading';\nimport { pandocAutoIdentifier, gfmAutoIdentifier } from '../api/pandoc_id';\nimport { equalsIgnoreCase } from '../api/text';\nimport { hasShortcutHeadingLinks } from '../api/pandoc_format';\n\nexport function pandocToProsemirror(\n ast: PandocAst,\n schema: Schema,\n extensions: PandocExtensions,\n readers: readonly PandocTokenReader[],\n tokensFilters: readonly PandocTokensFilterFn[],\n blockReaders: readonly PandocBlockReaderFn[],\n inlineHTMLReaders: readonly PandocInlineHTMLReaderFn[],\n blockCapsuleFilters: readonly PandocBlockCapsuleFilter[],\n): PandocToProsemirrorResult {\n const parser = new Parser(\n schema,\n extensions,\n readers,\n tokensFilters,\n blockReaders,\n inlineHTMLReaders,\n blockCapsuleFilters,\n );\n return parser.parse(ast);\n}\n\nclass Parser {\n private readonly schema: Schema;\n private readonly extensions: PandocExtensions;\n private readonly tokensFilters: readonly PandocTokensFilterFn[];\n private readonly inlineHTMLReaders: readonly PandocInlineHTMLReaderFn[];\n private readonly blockCapsuleFilters: readonly PandocBlockCapsuleFilter[];\n private readonly handlers: { [token: string]: ParserTokenHandlerCandidate[] };\n\n constructor(\n schema: Schema,\n extensions: PandocExtensions,\n readers: readonly PandocTokenReader[],\n tokensFilters: readonly PandocTokensFilterFn[],\n blockReaders: readonly PandocBlockReaderFn[],\n inlineHTMLReaders: readonly PandocInlineHTMLReaderFn[],\n blockCapsuleFilters: readonly PandocBlockCapsuleFilter[],\n ) {\n this.schema = schema;\n this.extensions = extensions;\n this.tokensFilters = tokensFilters;\n this.inlineHTMLReaders = inlineHTMLReaders;\n // apply block capsule filters in reverse order\n this.blockCapsuleFilters = blockCapsuleFilters.slice().reverse();\n this.handlers = this.createHandlers(readers, blockReaders);\n }\n\n public parse(ast: PandocAst) {\n // create state\n const state: ParserState = new ParserState(this.schema);\n // create writer (compose state w/ writeTokens function)\n const parser = this;\n const writer: ProsemirrorWriter = {\n openNode: state.openNode.bind(state),\n closeNode: state.closeNode.bind(state),\n openNoteNode: state.openNoteNode.bind(state),\n addNode: state.addNode.bind(state),\n openMark: state.openMark.bind(state),\n closeMark: state.closeMark.bind(state),\n writeText: state.writeText.bind(state),\n hasInlineHTMLWriter(html: string) {\n return parser.hasInlineHTMLWriter(html);\n },\n writeInlineHTML(html: string) {\n return parser.writeInlineHTML(this, html);\n },\n writeTokens(tokens: PandocToken[]) {\n parser.writeTokens(this, tokens);\n },\n logUnrecognized: state.logUnrecognized.bind(state),\n logExampleList: state.logExampleList.bind(state),\n isNodeOpen: state.isNodeOpen.bind(state),\n };\n\n // process raw text capsules\n let targetAst = {\n ...ast,\n blocks: resolvePandocBlockCapsuleText(ast.blocks, this.blockCapsuleFilters),\n };\n\n // detect line wrapping\n const lineWrapping = detectLineWrapping(targetAst);\n\n // resolve heading ids\n targetAst = resolveHeadingIds(targetAst, this.extensions);\n\n // write all tokens\n writer.writeTokens(targetAst.blocks);\n\n // return\n return {\n doc: state.doc(),\n line_wrapping: lineWrapping,\n unrecognized: state.unrecognized(),\n example_lists: state.hasExampleLists(),\n unparsed_meta: ast.meta,\n };\n }\n\n private writeTokens(writer: ProsemirrorWriter, tokens: PandocToken[]) {\n // pass through tokens filters\n let targetTokens = tokens;\n this.tokensFilters.forEach(filter => {\n targetTokens = filter(targetTokens, writer);\n });\n\n // process tokens\n targetTokens.forEach(tok => this.writeToken(writer, tok));\n }\n\n private writeToken(writer: ProsemirrorWriter, tok: PandocToken) {\n // process block-level capsules\n for (const filter of this.blockCapsuleFilters) {\n const capsuleText = filter.handleToken?.(tok);\n if (capsuleText) {\n const blockCapsule = parsePandocBlockCapsule(capsuleText);\n // run all of the text filters in case there was nesting\n blockCapsule.source = decodeBlockCapsuleText(blockCapsule.source, tok, this.blockCapsuleFilters);\n filter.writeNode(this.schema, writer, blockCapsule);\n return;\n }\n }\n\n // look for a handler.match function that wants to handle this token\n const handlers = this.handlers[tok.t] || [];\n for (const handler of handlers) {\n // It's not enough for a pandoc reader's preferred token to match the\n // current token; it's possible based on the `match` method for the\n // reader to decline to handle it.\n if (handler.match && handler.match(tok)) {\n handler.handler(writer, tok);\n return;\n }\n }\n\n // if we didn't find one, look for the default handler\n for (const handler of handlers) {\n if (!handler.match) {\n handler.handler(writer, tok);\n return;\n }\n }\n\n // log unrecognized token\n writer.logUnrecognized(tok.t);\n }\n\n private hasInlineHTMLWriter(html: string) {\n for (const reader of this.inlineHTMLReaders) {\n if (reader(this.schema, html)) {\n return true;\n }\n }\n return false;\n }\n\n private writeInlineHTML(writer: ProsemirrorWriter, html: string) {\n for (const reader of this.inlineHTMLReaders) {\n if (reader(this.schema, html, writer)) {\n return;\n }\n }\n }\n\n // create parser token handler functions based on the passed readers\n private createHandlers(readers: readonly PandocTokenReader[], blockReaders: readonly PandocBlockReaderFn[]) {\n const handlers: { [token: string]: ParserTokenHandlerCandidate[] } = {};\n\n for (const reader of readers) {\n // resolve children (provide default impl)\n const getChildren = reader.getChildren || ((tok: PandocToken) => tok.c);\n\n // resolve getAttrs (provide default imple)\n const getAttrs = reader.getAttrs ? reader.getAttrs : (tok: PandocToken) => ({});\n\n let handler: ParserTokenHandler;\n\n // see if there is a low-level handler\n if (reader.handler) {\n handler = reader.handler(this.schema);\n }\n\n // text\n else if (reader.text) {\n handler = (writer: ProsemirrorWriter, tok: PandocToken) => {\n if (reader.getText) {\n const text = reader.getText(tok);\n writer.writeText(text);\n }\n };\n\n // marks\n } else if (reader.mark) {\n handler = (writer: ProsemirrorWriter, tok: PandocToken) => {\n const markType = this.schema.marks[reader.mark as string];\n const mark = markType.create(getAttrs(tok));\n writer.openMark(mark);\n if (reader.getText) {\n writer.writeText(reader.getText(tok));\n } else {\n writer.writeTokens(getChildren(tok));\n }\n writer.closeMark(mark);\n };\n\n // blocks\n } else if (reader.block) {\n const nodeType = this.schema.nodes[reader.block];\n handler = (writer: ProsemirrorWriter, tok: PandocToken) => {\n // give the block readers first crack (e.g. handle a paragraph node with\n // a single image as a figure node)\n for (const blockReader of blockReaders) {\n if (blockReader(this.schema, tok, writer)) {\n return;\n }\n }\n\n writer.openNode(nodeType, getAttrs(tok));\n if (reader.getText) {\n writer.writeText(reader.getText(tok));\n } else {\n writer.writeTokens(getChildren(tok));\n }\n writer.closeNode();\n };\n\n // nodes\n } else if (reader.node) {\n const nodeType = this.schema.nodes[reader.node];\n handler = (writer: ProsemirrorWriter, tok: PandocToken) => {\n if (reader.getChildren) {\n writer.openNode(nodeType, getAttrs(tok));\n writer.writeTokens(getChildren(tok));\n writer.closeNode();\n } else {\n let content: ProsemirrorNode[] = [];\n if (reader.getText) {\n content = [this.schema.text(reader.getText(tok))];\n }\n writer.addNode(nodeType, getAttrs(tok), content);\n }\n };\n\n // code blocks\n } else if (reader.code_block) {\n handler = (writer: ProsemirrorWriter, tok: PandocToken) => {\n // type/attr/text\n const nodeType = this.schema.nodes.code_block;\n const attr: {} = pandocAttrReadAST(tok, kCodeBlockAttr);\n const text = tok.c[kCodeBlockText] as string;\n\n // write node\n writer.openNode(nodeType, attr);\n writer.writeText(text);\n writer.closeNode();\n };\n } else {\n throw new Error('pandoc reader was malformed or unrecognized');\n }\n\n // Ensure an array exists\n handlers[reader.token] = handlers[reader.token] || [];\n\n handlers[reader.token].push({\n match: reader.match,\n handler,\n });\n }\n return handlers;\n }\n}\n\nclass ParserState {\n private readonly schema: Schema;\n private readonly stack: ParserStackElement[];\n private readonly notes: ProsemirrorNode[];\n private marks: Mark[];\n private footnoteNumber: number;\n private unrecognizedTokens: string[];\n private exampleLists: boolean;\n\n constructor(schema: Schema) {\n this.schema = schema;\n this.stack = [{ type: this.schema.nodes.body, attrs: {}, content: [] }];\n this.notes = [];\n this.marks = Mark.none;\n this.footnoteNumber = 1;\n this.unrecognizedTokens = [];\n this.exampleLists = false;\n }\n\n public doc(): ProsemirrorNode {\n const content: ProsemirrorNode[] = [];\n content.push(this.top().type.createAndFill(null, this.top().content) as ProsemirrorNode);\n content.push(this.schema.nodes.notes.createAndFill(null, this.notes) as ProsemirrorNode);\n return this.schema.topNodeType.createAndFill({}, content) as ProsemirrorNode;\n }\n\n public unrecognized(): string[] {\n return this.unrecognizedTokens;\n }\n\n public hasExampleLists(): boolean {\n return this.exampleLists;\n }\n\n public writeText(text: string) {\n if (!text) {\n return;\n }\n const nodes: ProsemirrorNode[] = this.top().content;\n const last: ProsemirrorNode = nodes[nodes.length - 1];\n const node: ProsemirrorNode = this.schema.text(text, this.marks);\n const merged: ProsemirrorNode | undefined = this.maybeMerge(last, node);\n if (last && merged) {\n nodes[nodes.length - 1] = merged;\n } else {\n nodes.push(node);\n }\n }\n\n public addNode(type: NodeType, attrs: {}, content: ProsemirrorNode[]) {\n const node: ProsemirrorNode | null | undefined = type.createAndFill(attrs, content, this.marks);\n if (!node) {\n return null;\n }\n if (this.stack.length) {\n if (type === this.schema.nodes.note) {\n this.notes.push(node);\n } else {\n this.top().content.push(node);\n }\n }\n return node;\n }\n\n public openNode(type: NodeType, attrs: {}) {\n this.stack.push({ type, attrs, content: [] });\n }\n\n public closeNode(): ProsemirrorNode {\n // get node info\n const info: ParserStackElement = this.stack.pop() as ParserStackElement;\n\n // clear marks if the node type isn't inline\n if (!info.type.isInline) {\n if (this.marks.length) {\n this.marks = Mark.none;\n }\n }\n\n return this.addNode(info.type, info.attrs, info.content) as ProsemirrorNode;\n }\n\n public openMark(mark: Mark) {\n this.marks = mark.addToSet(this.marks);\n }\n\n public closeMark(mark: Mark) {\n this.marks = mark.removeFromSet(this.marks);\n }\n\n public openNoteNode(ref: string) {\n this.openNode(this.schema.nodes.note, { ref, number: this.footnoteNumber++ });\n }\n\n public logUnrecognized(type: string) {\n if (!this.unrecognizedTokens.includes(type)) {\n this.unrecognizedTokens.push(type);\n }\n }\n\n public logExampleList() {\n this.exampleLists = true;\n }\n\n public isNodeOpen(type: NodeType) {\n return this.stack.some(value => value.type === type);\n }\n\n private top(): ParserStackElement {\n return this.stack[this.stack.length - 1];\n }\n\n private maybeMerge(a: ProsemirrorNode, b: ProsemirrorNode): ProsemirrorNode | undefined {\n if (a && a.isText && b.isText && Mark.sameSet(a.marks, b.marks)) {\n return this.schema.text(((a.text as string) + b.text) as string, a.marks);\n } else {\n return undefined;\n }\n }\n}\n\n// determine what sort of line wrapping is used within the file\nfunction detectLineWrapping(ast: PandocAst): PandocLineWrapping {\n // look for soft breaks and classify them as column or sentence breaks\n let columnBreaks = 0;\n let sentenceBreaks = 0;\n let prevTok: PandocToken = { t: PandocTokenType.Null };\n forEachToken(ast.blocks, tok => {\n if (tok.t === PandocTokenType.SoftBreak) {\n if (\n prevTok.t === PandocTokenType.Str &&\n typeof prevTok.c === 'string' &&\n ['.', '?', '!'].includes(prevTok.c.charAt(prevTok.c.length - 1))\n ) {\n sentenceBreaks++;\n } else {\n columnBreaks++;\n }\n }\n prevTok = tok;\n });\n\n // need to have > 5 line breaks or more line breaks than blocks to trigger detection\n // (prevents 'over-detection' if there are stray few soft breaks)\n const lineBreaks = columnBreaks + sentenceBreaks;\n if (lineBreaks > 5 || lineBreaks > ast.blocks.length) {\n if (sentenceBreaks > columnBreaks) {\n return 'sentence';\n } else {\n return 'column';\n }\n } else {\n return 'none';\n }\n}\n\n// determine which heading ids are valid based on explicit headings contained in the\n// document and any headings targeted by links. remove any heading ids not so identified\nfunction resolveHeadingIds(ast: PandocAst, extensions: PandocExtensions) {\n // determine function we will use to create auto-identifiers\n const autoIdentifier = extensions.gfm_auto_identifiers ? gfmAutoIdentifier : pandocAutoIdentifier;\n\n // start with ids we know are valid (i.e. ones the user added to the doc)\n const headingIds = new Set<string>((ast.heading_ids || []).map(id => id.toLocaleLowerCase()));\n\n // find ids referenced in links\n let astBlocks = mapTokens(ast.blocks, tok => {\n if (tok.t === PandocTokenType.Link) {\n const target = tok.c[kLinkTarget];\n const href = target[kLinkTargetUrl] as string;\n if (href.startsWith('#')) {\n // if we have support for implicit header references and shortcut reference links,\n // also check to see whether the link text resolves to the target (in that case\n // we don't need the explicit id). note that if that heading has an explicit\n // id defined then we also leave it alone.\n const text = stringifyTokens(tok.c[kLinkChildren], extensions.gfm_auto_identifiers);\n if (\n hasShortcutHeadingLinks(extensions) &&\n equalsIgnoreCase('#' + autoIdentifier(text, extensions.ascii_identifiers), href) &&\n !headingIds.has(href.toLocaleLowerCase())\n ) {\n // return a version of the link w/o the target\n return {\n t: PandocTokenType.Link,\n c: [tok.c[kLinkAttr], tok.c[kLinkChildren], ['#', tok.c[kLinkTarget][kLinkTargetTitle]]],\n };\n\n // otherwise note that it's a valid id\n } else {\n headingIds.add(href.toLocaleLowerCase());\n }\n }\n }\n // default to return token unmodified\n return tok;\n });\n\n // remove any heading ids not created by the user or required by a link\n astBlocks = mapTokens(ast.blocks, tok => {\n if (tok.t === PandocTokenType.Header) {\n const attr = pandocAttrReadAST(tok, kHeadingAttr);\n if (attr.id && !headingIds.has('#' + attr.id.toLocaleLowerCase())) {\n return {\n t: PandocTokenType.Header,\n c: [\n tok.c[kHeadingLevel],\n ['', tok.c[kHeadingAttr][kPandocAttrClasses], tok.c[kHeadingAttr][kPandocAttrKeyvalue]],\n tok.c[kHeadingChildren],\n ],\n };\n }\n }\n // default to just reflecting back the token\n return tok;\n });\n\n // return the ast\n return {\n ...ast,\n blocks: astBlocks,\n heading_ids: undefined,\n };\n}\n\ninterface ParserStackElement {\n type: NodeType;\n attrs: {};\n content: ProsemirrorNode[];\n}\n\ntype ParserTokenHandler = (writer: ProsemirrorWriter, tok: PandocToken) => void;\n\ninterface ParserTokenHandlerCandidate {\n match?: (tok: PandocToken) => boolean;\n handler: ParserTokenHandler;\n}\n","/*\n * pandoc_from_prosemirror.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Fragment, MarkType, Mark } from 'prosemirror-model';\n\nimport {\n PandocAst,\n PandocToken,\n PandocOutput,\n PandocNodeWriterFn,\n PandocNodeWriter,\n PandocMarkWriter,\n PandocApiVersion,\n PandocTokenType,\n PandocOutputOption,\n PandocExtensions,\n marksByPriority,\n kPreventBracketEscape,\n} from '../api/pandoc';\n\nimport { PandocFormat, kGfmFormat } from '../api/pandoc_format';\nimport { PandocAttr } from '../api/pandoc_attr';\nimport { fragmentText } from '../api/fragment';\nimport { fancyQuotesToSimple } from '../api/quote';\n\nexport function pandocFromProsemirror(\n doc: ProsemirrorNode,\n apiVersion: PandocApiVersion,\n format: PandocFormat,\n nodeWriters: readonly PandocNodeWriter[],\n markWriters: readonly PandocMarkWriter[],\n) {\n const bodyNode = doc.child(0);\n const notesNode = doc.child(1);\n const writer = new PandocWriter(apiVersion, format, nodeWriters, markWriters, notesNode);\n writer.writeNodes(bodyNode);\n return writer.output();\n}\n\nclass PandocWriter implements PandocOutput {\n private readonly ast: PandocAst;\n private readonly format: PandocFormat;\n private readonly nodeWriters: { [key: string]: PandocNodeWriterFn };\n private readonly markWriters: { [key: string]: PandocMarkWriter };\n private readonly notes: { [key: string]: ProsemirrorNode };\n private readonly containers: any[][];\n private readonly activeMarks: MarkType[];\n private options: { [key: string]: boolean };\n\n public readonly extensions: PandocExtensions;\n\n private readonly escapeCharacters: string[] = [];\n private readonly manualEscapeCharacters: Map<string, string> = new Map<string, string>();\n private readonly preventEscapeCharacters: string[] = [];\n\n constructor(\n apiVersion: PandocApiVersion,\n format: PandocFormat,\n nodeWriters: readonly PandocNodeWriter[],\n markWriters: readonly PandocMarkWriter[],\n notes: ProsemirrorNode,\n ) {\n // save format and extensions\n this.format = format;\n this.extensions = format.extensions;\n // compute escape characters based on format\n this.initEscapeCharacters();\n // create maps of node and mark writers\n this.nodeWriters = {};\n nodeWriters.forEach((writer: PandocNodeWriter) => {\n this.nodeWriters[writer.name] = writer.write;\n });\n this.markWriters = {};\n markWriters.forEach((writer: PandocMarkWriter) => {\n this.markWriters[writer.name] = writer;\n });\n // create map of notes\n this.notes = {};\n notes.forEach((note: ProsemirrorNode) => {\n this.notes[note.attrs.ref] = note;\n });\n\n this.ast = {\n blocks: [],\n 'pandoc-api-version': apiVersion,\n meta: {},\n };\n this.containers = [this.ast.blocks];\n this.activeMarks = [];\n this.options = {\n writeSpaces: true,\n };\n }\n\n public output() {\n return {\n ast: this.ast,\n };\n }\n\n public write(value: any) {\n const container = this.containers[this.containers.length - 1];\n container.push(value);\n }\n\n public writeToken(type: PandocTokenType, content?: (() => void) | any) {\n const token: PandocToken = {\n t: type,\n };\n if (content !== undefined) {\n if (typeof content === 'function') {\n token.c = [];\n this.fill(token.c, content);\n } else {\n token.c = content;\n }\n }\n this.write(token);\n }\n\n public writeMark(type: PandocTokenType, parent: Fragment, expelEnclosingWhitespace = true) {\n // expel enclosing whitepsace if requested and if the fragment isn't 100% spaces\n if (expelEnclosingWhitespace) {\n // build output spec\n const output = {\n spaceBefore: false,\n nodes: new Array<ProsemirrorNode>(),\n spaceAfter: false,\n };\n\n // if we see leading or trailing spaces we need to output them as tokens\n // and substitute text nodes\n parent.forEach((node: ProsemirrorNode, offset: number, index: number) => {\n // check for leading/trailing space in first/last nodes\n if (node.isText) {\n let outputText = node.textContent;\n\n // checking for leading space in first node\n if (output.nodes.length === 0 && node.textContent.match(/^\\s+/)) {\n output.spaceBefore = true;\n outputText = outputText.trimLeft();\n }\n\n // check for trailing space in last node\n if (index === parent.childCount - 1 && node.textContent.match(/\\s+$/)) {\n output.spaceAfter = true;\n outputText = outputText.trimRight();\n }\n\n // check for an entirely blank node\n if (outputText.match(/^\\s*$/)) {\n outputText = '';\n }\n\n // skip the node if it has nothing in it\n if (outputText.length > 0) {\n // if we modified the node's text then create a new node\n if (outputText !== node.textContent) {\n output.nodes.push(node.type.schema.text(outputText, node.marks));\n } else {\n output.nodes.push(node);\n }\n }\n } else {\n output.nodes.push(node);\n }\n });\n\n // output space tokens before/after mark as necessary\n if (output.nodes.length > 0) {\n if (output.spaceBefore) {\n this.writeToken(PandocTokenType.Space);\n }\n this.writeToken(type, () => {\n this.writeInlines(Fragment.from(output.nodes));\n });\n if (output.spaceAfter) {\n this.writeToken(PandocTokenType.Space);\n }\n }\n\n // normal codepath (not expelling existing whitespace)\n } else {\n this.writeToken(type, () => {\n this.writeInlines(parent);\n });\n }\n }\n\n public writeArray(content: () => void) {\n const arr: any[] = [];\n this.fill(arr, content);\n this.write(arr);\n }\n\n public writeAttr(id?: string, classes?: string[], keyvalue?: Array<[string, string]>) {\n this.write([id || '', classes || [], keyvalue || []]);\n }\n\n public writeText(text: string | null) {\n // determine which characters we shouldn't escape\n const preventEscapeCharacters = [ ...this.preventEscapeCharacters ];\n if (this.options[kPreventBracketEscape]) {\n preventEscapeCharacters.push('[', ']');\n }\n\n if (text) {\n let textRun = '';\n const flushTextRun = () => {\n if (textRun) {\n // if this is a line block, convert leading nbsp to regular space,\n if (!this.options.writeSpaces) {\n textRun = textRun.replace(/(^|\\n)+(\\u00A0+)/g, (_match, p1, p2) => {\n return p1 + Array(p2.length + 1).join(' ');\n });\n }\n\n // reverse smart punctuation. pandoc does this autmoatically for markdown\n // writing w/ +smart, however this also results in nbsp's being inserted\n // after selected abbreviations like e.g. and Mr., and we don't want that\n // to happen for editing (b/c the nbsp's weren't put there by the user\n // and are not obviously visible)\n if (this.extensions.smart) {\n textRun = textRun\n .replace(/—/g, '---')\n .replace(/–/g, '--')\n .replace(/…/g, '...');\n textRun = fancyQuotesToSimple(textRun);\n }\n \n this.writeToken(PandocTokenType.Str, textRun);\n textRun = '';\n }\n };\n for (let i = 0; i < text.length; i++) {\n const ch = text.charAt(i);\n if (this.options.writeSpaces && ch === ' ') {\n flushTextRun();\n this.writeToken(PandocTokenType.Space);\n } else if (preventEscapeCharacters.includes(ch)) {\n flushTextRun();\n this.writeRawMarkdown(ch);\n } else if (this.manualEscapeCharacters.has(ch)) {\n flushTextRun();\n this.writeRawMarkdown(this.manualEscapeCharacters.get(ch)!);\n } else {\n textRun += ch;\n }\n }\n flushTextRun();\n }\n }\n\n public writeLink(href: string, title: string, attr: PandocAttr | null, content: VoidFunction) {\n this.writeToken(PandocTokenType.Link, () => {\n // write attr if provided\n if (attr) {\n this.writeAttr(attr.id, attr.classes, attr.keyvalue);\n } else {\n this.writeAttr();\n }\n // write content\n this.writeArray(() => {\n content();\n });\n\n // write href\n this.write([href || '', title || '']);\n });\n }\n\n public writeNote(note: ProsemirrorNode) {\n // get corresponding note body\n const noteBody = this.notes[note.attrs.ref];\n\n // don't write empty footnotes (otherwise in block or section mode they gobble up the section below them)\n if (noteBody.textContent.trim().length > 0) {\n this.writeToken(PandocTokenType.Note, () => {\n this.writeNodes(noteBody);\n });\n }\n }\n\n public writeNode(node: ProsemirrorNode) {\n this.nodeWriters[node.type.name](this, node);\n }\n\n public writeNodes(parent: ProsemirrorNode) {\n parent.forEach(this.writeNode.bind(this));\n }\n\n public writeInlines(fragment: Fragment) {\n // get the marks from a node that are not already on the stack of active marks\n const nodeMarks = (node: ProsemirrorNode) => {\n // get marks ordered by writer priority\n let marks = marksByPriority(node.marks, this.markWriters);\n\n // remove active marks\n for (const activeMark of this.activeMarks) {\n marks = activeMark.removeFromSet(marks);\n }\n\n // return marks\n return marks;\n };\n\n // helpers to iterate through the nodes (sans any marks already on the stack)\n let currentChild = 0;\n const nextNode = () => {\n const childIndex = currentChild;\n currentChild++;\n return {\n node: fragment.child(childIndex),\n marks: nodeMarks(fragment.child(childIndex)),\n };\n };\n const putBackNode = () => {\n currentChild--;\n };\n\n // iterate through the nodes\n while (currentChild < fragment.childCount) {\n // get the next node\n let next = nextNode();\n\n // if there are active marks then collect them up and call the mark handler\n // with all nodes that it contains, otherwise just process it as a plain\n // unmarked node\n if (next.marks.length > 0) {\n // get the mark and start building a list of marked nodes\n const mark = next.marks[0];\n const markedNodes: ProsemirrorNode[] = [next.node];\n\n // inner iteration to find nodes that have this mark\n while (currentChild < fragment.childCount) {\n next = nextNode();\n // If the next node shares the same mark with the current node\n // then add this next node node as a child of the current node\n if (next.marks.some(nextMark => nextMark.eq(mark))) {\n markedNodes.push(next.node);\n } else {\n // no mark found, \"put back\" the node\n putBackNode();\n break;\n }\n }\n\n // call the mark writer after noting that this mark is active (which\n // will cause subsequent recursive invocations of this function to\n // not re-process this mark)\n this.activeMarks.push(mark.type);\n this.markWriters[mark.type.name].write(this, mark, Fragment.from(markedNodes));\n this.activeMarks.pop();\n } else {\n // ordinary unmarked node, call the node writer\n this.nodeWriters[next.node.type.name](this, next.node);\n }\n }\n }\n\n public writeRawMarkdown(markdown: Fragment | string, escapeSymbols?: boolean) {\n // collect markdown text if necessary\n let md = markdown instanceof Fragment ? fragmentText(markdown) : markdown;\n\n // escape symbols if requested\n if (escapeSymbols) {\n const escaped: string[] = [];\n for (let i = 0; i < md.length; i++) {\n const ch = md.charAt(i);\n if (this.escapeCharacters.includes(ch)) {\n escaped.push('\\\\' + ch);\n } else {\n escaped.push(ch);\n }\n }\n md = escaped.join('');\n }\n\n this.writeToken(PandocTokenType.RawInline, () => {\n this.write('markdown');\n this.write(md);\n });\n }\n\n public withOption(option: PandocOutputOption, value: boolean, f: () => void) {\n const previousValue = this.options[option];\n this.options[option] = value;\n f();\n this.options[option] = previousValue;\n }\n\n private fill(container: any[], content: () => void) {\n this.containers.push(container);\n content();\n this.containers.pop();\n }\n\n private initEscapeCharacters() {\n // gfm disallows [] escaping so that MediaWiki style page links (e.g. [[MyPage]]) work as expected\n // tex_math_single_backslash does not allow escaping of [] or () (as that conflicts with the math syntax)\n if (this.format.mode === kGfmFormat || this.format.extensions.tex_math_single_backslash) {\n this.preventEscapeCharacters.push('[', ']');\n }\n\n // tex_math_single_backslash does not allow escaping of [] or () (as that conflicts with the math syntax)\n if (this.format.extensions.tex_math_single_backslash) {\n this.preventEscapeCharacters.push('(', ')');\n }\n\n // filter standard escape characters w/ preventEscapeCharacters\n const allEscapeCharacters = ['\\\\', '`', '*', '_', '{', '}', '[', ']', '(', ')', '>', '#', '+', '-', '.', '!'];\n if (this.format.extensions.angle_brackets_escapable) {\n allEscapeCharacters.push('<');\n }\n this.escapeCharacters.push(...allEscapeCharacters.filter(ch => !this.preventEscapeCharacters.includes(ch)));\n\n // Manual escape characters are ones we can't rely on pandoc to automatically escape (b/c\n // they represent valid syntax for a markdown extension, e.g. '@' for citations).\n // For '@', since we already do special writing for spans we know are citation ids, we can\n // globally prescribe escaping behavior and never stomp over a citation. We also check\n // that '@' can be escaped in the current markdown format, and if not use an html escape.\n const atEscape = this.extensions.all_symbols_escapable ? '\\\\@' : '@';\n this.manualEscapeCharacters.set('@', atEscape);\n }\n}\n","/*\n * fragment.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Fragment } from 'prosemirror-model';\n\nexport function fragmentText(fragment: Fragment, unemoji = false) {\n let text = '';\n fragment.forEach(node => {\n const emjojiMark = node.marks.find(mark => mark.type === node.type.schema.marks.emoji);\n if (unemoji && emjojiMark) {\n return (text = text + (emjojiMark.attrs.emojihint || node.textContent));\n } else {\n return (text = text + node.textContent);\n }\n });\n return text;\n}\n","/*\n * editor-extensions.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { InputRule } from 'prosemirror-inputrules';\nimport { Schema } from 'prosemirror-model';\nimport { Plugin } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { ProsemirrorCommand } from '../api/command';\nimport { PandocMark } from '../api/mark';\nimport { PandocNode, CodeViewOptions } from '../api/node';\nimport { Extension, ExtensionFn, ExtensionContext } from '../api/extension';\nimport { BaseKeyBinding } from '../api/basekeys';\nimport { OmniInserter } from '../api/omni_insert';\nimport { AppendTransactionHandler, AppendMarkTransactionHandler } from '../api/transaction';\nimport { FixupFn } from '../api/fixup';\nimport {\n PandocTokenReader,\n PandocMarkWriter,\n PandocNodeWriter,\n PandocPreprocessorFn,\n PandocPostprocessorFn,\n PandocBlockReaderFn,\n PandocInlineHTMLReaderFn,\n PandocTokensFilterFn,\n} from '../api/pandoc';\nimport { PandocBlockCapsuleFilter } from '../api/pandoc_capsule';\nimport { markInputRuleFilter } from '../api/input_rule';\nimport { CompletionHandler } from '../api/completion';\n\n// required extensions (base non-customiziable pandoc nodes/marks + core behaviors)\nimport nodeText from '../nodes/text';\nimport nodeParagraph from '../nodes/paragraph';\nimport nodeHeading from '../nodes/heading';\nimport nodeBlockquote from '../nodes/blockquote';\nimport nodeCodeBlock from '../nodes/code_block';\nimport nodeLists from '../nodes/list/list';\nimport nodeImage from '../nodes/image/image';\nimport nodeFigure from '../nodes/image/figure';\nimport nodeHr from '../nodes/hr';\nimport nodeHardBreak from '../nodes/hard_break';\nimport nodeNull from '../nodes/null';\nimport markEm from '../marks/em';\nimport markStrong from '../marks/strong';\nimport markCode from '../marks/code';\nimport markLink from '../marks/link/link';\nimport behaviorHistory from '../behaviors/history';\nimport behaviorSelectAll from '../behaviors/select_all';\nimport behaviorCursor from '../behaviors/cursor';\nimport behaviorFind from '../behaviors/find';\nimport behaviorSpellingInteractive from '../behaviors/spelling/spelling-interactive';\nimport behaviorClearFormatting from '../behaviors/clear_formatting';\n\n// behaviors\nimport behaviorSmarty from '../behaviors/smarty';\nimport behaviorAttrDuplicateId from '../behaviors/attr_duplicate_id';\nimport behaviorTrailingP from '../behaviors/trailing_p';\nimport behaviorEmptyMark from '../behaviors/empty_mark';\nimport behaviorEscapeMark from '../behaviors/escape_mark';\nimport behaviorOutline from '../behaviors/outline';\nimport beahviorCodeBlockInput from '../behaviors/code_block_input';\nimport behaviorPasteText from '../behaviors/paste_text';\nimport behaviorBottomPadding from '../behaviors/bottom_padding';\nimport behaviorInsertSymbol from '../behaviors/insert_symbol/insert_symbol-plugin-symbol';\nimport behaviorInsertSymbolEmoji from '../behaviors/insert_symbol/insert_symbol-plugin-emoji';\nimport beahviorInsertSpecialCharacters from '../behaviors/insert_symbol/insert_special_characters';\nimport behaviorNbsp from '../behaviors/nbsp';\nimport behaviorRemoveSection from '../behaviors/remove_section';\nimport behaviorSlides from '../behaviors/slides';\n\n// marks\nimport markStrikeout from '../marks/strikeout';\nimport markSuperscript from '../marks/superscript';\nimport markSubscript from '../marks/subscript';\nimport markSmallcaps from '../marks/smallcaps';\nimport markUnderline from '../marks/underline';\nimport markRawInline from '../marks/raw_inline/raw_inline';\nimport markRawTex from '../marks/raw_inline/raw_tex';\nimport markRawHTML from '../marks/raw_inline/raw_html';\nimport markMath from '../marks/math/math';\nimport markCite from '../marks/cite/cite';\nimport markSpan from '../marks/span';\nimport markXRef from '../marks/xref/xref';\nimport markHTMLComment from '../marks/raw_inline/raw_html_comment';\nimport markShortcode from '../marks/shortcode';\nimport markEmoji from '../marks/emoji/emoji';\nimport { markOmniInsert } from '../behaviors/omni_insert/omni_insert';\n\n// nodes\nimport nodeFootnote from '../nodes/footnote/footnote';\nimport nodeRawBlock from '../nodes/raw_block';\nimport nodeYamlMetadata from '../nodes/yaml_metadata/yaml_metadata';\nimport nodeRmdCodeChunk from '../nodes/rmd_chunk/rmd_chunk';\nimport nodeDiv from '../nodes/div/div';\nimport nodeLineBlock from '../nodes/line_block';\nimport nodeTable from '../nodes/table/table';\nimport nodeDefinitionList from '../nodes/definition_list/definition_list';\nimport nodeShortcodeBlock from '../nodes/shortcode_block';\nimport nodeHtmlPreserve from '../nodes/html_preserve';\n\n// extension/plugin factories\nimport { aceExtension } from '../optional/ace/ace';\nimport { attrEditExtension } from '../behaviors/attr_edit/attr_edit';\nimport { codeViewClipboardPlugin } from '../api/code';\n\nexport function initExtensions(context: ExtensionContext, extensions?: readonly Extension[]): ExtensionManager {\n // create extension manager\n const manager = new ExtensionManager(context);\n\n // required extensions\n manager.register([\n nodeText,\n nodeParagraph,\n nodeHeading,\n nodeBlockquote,\n nodeLists,\n nodeCodeBlock,\n nodeImage,\n nodeFigure,\n nodeHr,\n nodeHardBreak,\n nodeNull,\n markEm,\n markStrong,\n markCode,\n markLink,\n behaviorHistory,\n behaviorSelectAll,\n behaviorCursor,\n behaviorFind,\n behaviorSpellingInteractive,\n behaviorClearFormatting,\n behaviorSlides\n ]);\n\n // optional extensions\n manager.register([\n // behaviors\n behaviorSmarty,\n behaviorAttrDuplicateId,\n behaviorTrailingP,\n behaviorEmptyMark,\n behaviorEscapeMark,\n behaviorOutline,\n beahviorCodeBlockInput,\n behaviorPasteText,\n behaviorBottomPadding,\n behaviorInsertSymbol,\n behaviorInsertSymbolEmoji,\n beahviorInsertSpecialCharacters,\n behaviorNbsp,\n behaviorRemoveSection,\n\n // nodes\n nodeDiv,\n nodeFootnote,\n nodeYamlMetadata,\n nodeRmdCodeChunk,\n nodeTable,\n nodeDefinitionList,\n nodeLineBlock,\n nodeRawBlock,\n nodeShortcodeBlock,\n nodeHtmlPreserve,\n\n // marks\n markUnderline,\n markStrikeout,\n markSuperscript,\n markSubscript,\n markSmallcaps,\n markHTMLComment,\n markRawTex,\n markRawHTML,\n markRawInline,\n markMath,\n markCite,\n markSpan,\n markXRef,\n markShortcode,\n markEmoji,\n markOmniInsert,\n ]);\n\n // register external extensions\n if (extensions) {\n manager.register(extensions);\n }\n\n // additional extensions dervied from other extensions (e.g. extensions that have registered attr editors)\n // note that all of these take a callback to access the manager -- this is so that if an extension earlier\n // in the chain registers something the later extensions are able to see it\n manager.register([\n // bindings to 'Edit Attribute' command and UI adornment\n attrEditExtension(context.pandocExtensions, context.ui, context.format, manager.attrEditors()),\n ]);\n\n // additional plugins derived from extensions\n const codeViews = manager.codeViews();\n const plugins: Plugin[] = [];\n if (context.options.codeEditor === 'ace') {\n manager.register([\n aceExtension(codeViews)\n ]);\n }\n plugins.push(codeViewClipboardPlugin(codeViews));\n\n // register plugins\n manager.registerPlugins(plugins);\n\n // return manager\n return manager;\n}\n\nexport class ExtensionManager {\n private context: ExtensionContext;\n private extensions: Extension[];\n\n public constructor(context: ExtensionContext) {\n this.context = context;\n this.extensions = [];\n }\n\n public register(extensions: ReadonlyArray<Extension | ExtensionFn>, priority = false): void {\n extensions.forEach(extension => {\n if (typeof extension === 'function') {\n const ext = extension(this.context);\n if (ext) {\n if (priority) {\n this.extensions.unshift(ext);\n } else {\n this.extensions.push(ext);\n }\n }\n } else {\n if (priority) {\n this.extensions.unshift(extension);\n } else {\n this.extensions.push(extension);\n }\n }\n });\n }\n\n public registerPlugins(plugins: Plugin[], priority = false) {\n this.register([{ plugins: () => plugins }], priority);\n }\n\n public pandocMarks(): readonly PandocMark[] {\n return this.collect(extension => extension.marks);\n }\n\n public pandocNodes(): readonly PandocNode[] {\n return this.collect(extension => extension.nodes);\n }\n\n public pandocPreprocessors(): readonly PandocPreprocessorFn[] {\n return this.collectFrom({\n node: node => [node.pandoc.preprocessor],\n });\n }\n\n public pandocPostprocessors(): readonly PandocPostprocessorFn[] {\n return this.pandocReaders().flatMap(reader => (reader.postprocessor ? [reader.postprocessor] : []));\n }\n\n public pandocTokensFilters(): readonly PandocTokensFilterFn[] {\n return this.collectFrom({\n mark: mark => [mark.pandoc.tokensFilter],\n node: node => [node.pandoc.tokensFilter],\n });\n }\n\n public pandocBlockReaders(): readonly PandocBlockReaderFn[] {\n return this.collectFrom({\n node: node => [node.pandoc.blockReader],\n });\n }\n\n public pandocInlineHTMLReaders(): readonly PandocInlineHTMLReaderFn[] {\n return this.collectFrom({\n mark: mark => [mark.pandoc.inlineHTMLReader],\n node: node => [node.pandoc.inlineHTMLReader],\n });\n }\n\n public pandocBlockCapsuleFilters(): readonly PandocBlockCapsuleFilter[] {\n return this.collectFrom({\n node: node => [node.pandoc.blockCapsuleFilter],\n });\n }\n\n public pandocReaders(): readonly PandocTokenReader[] {\n return this.collectFrom({\n mark: mark => mark.pandoc.readers,\n node: node => node.pandoc.readers ?? [],\n });\n }\n\n public pandocMarkWriters(): readonly PandocMarkWriter[] {\n return this.collectFrom({\n mark: mark => [{ name: mark.name, ...mark.pandoc.writer }],\n });\n }\n\n public pandocNodeWriters(): readonly PandocNodeWriter[] {\n return this.collectFrom({\n node: node => {\n return node.pandoc.writer ? [{ name: node.name, write: node.pandoc.writer! }] : [];\n },\n });\n }\n\n public commands(schema: Schema): readonly ProsemirrorCommand[] {\n return this.collect<ProsemirrorCommand>(extension => extension.commands?.(schema));\n }\n\n public omniInserters(schema: Schema): OmniInserter[] {\n const omniInserters: OmniInserter[] = [];\n const commands = this.commands(schema);\n commands.forEach(command => {\n if (command.omniInsert) {\n omniInserters.push({\n ...command.omniInsert,\n id: command.id,\n command: command.execute,\n });\n }\n });\n return omniInserters;\n }\n\n public codeViews() {\n const views: { [key: string]: CodeViewOptions } = {};\n this.pandocNodes().forEach((node: PandocNode) => {\n if (node.code_view) {\n views[node.name] = node.code_view;\n }\n });\n return views;\n }\n\n public attrEditors() {\n return this.collectFrom({\n node: node => [node.attr_edit?.()],\n });\n }\n\n public baseKeys(schema: Schema): readonly BaseKeyBinding[] {\n return this.collect(extension => extension.baseKeys?.(schema));\n }\n\n public appendTransactions(schema: Schema): readonly AppendTransactionHandler[] {\n return this.collect(extension => extension.appendTransaction?.(schema));\n }\n\n public appendMarkTransactions(schema: Schema): readonly AppendMarkTransactionHandler[] {\n return this.collect(extension => extension.appendMarkTransaction?.(schema));\n }\n\n public plugins(schema: Schema): readonly Plugin[] {\n return this.collect(extension => extension.plugins?.(schema));\n }\n\n public fixups(schema: Schema, view: EditorView): readonly FixupFn[] {\n return this.collect(extension => extension.fixups?.(schema, view));\n }\n\n public completionHandlers(): readonly CompletionHandler[] {\n return this.collect(extension => extension.completionHandlers?.());\n }\n\n // NOTE: return value not readonly b/c it will be fed directly to a\n // Prosemirror interface that doesn't take readonly\n public inputRules(schema: Schema): InputRule[] {\n const markFilter = markInputRuleFilter(schema, this.pandocMarks());\n return this.collect<InputRule>(extension => extension.inputRules?.(schema, markFilter));\n }\n\n private collect<T>(collector: (extension: Extension) => readonly T[] | undefined) {\n return this.collectFrom({\n extension: extension => collector(extension) ?? [],\n });\n }\n\n /**\n * Visits extensions in order of registration, providing optional callbacks\n * for extension, mark, and node. The return value of callbacks should be\n * arrays of (T | undefined | null); these will all be concatenated together,\n * with the undefined and nulls filtered out.\n *\n * @param visitor Object containing callback methods for the different\n * extension parts.\n */\n private collectFrom<T>(visitor: {\n extension?: (extension: Extension) => ReadonlyArray<T | undefined | null>;\n mark?: (mark: PandocMark) => ReadonlyArray<T | undefined | null>;\n node?: (node: PandocNode) => ReadonlyArray<T | undefined | null>;\n }): T[] {\n const results: Array<T | undefined | null> = [];\n\n this.extensions.forEach(extension => {\n if (visitor.extension) {\n results.push(...visitor.extension(extension));\n }\n if (visitor.mark && extension.marks) {\n results.push(...extension.marks.flatMap(visitor.mark));\n }\n if (visitor.node && extension.nodes) {\n results.push(...extension.nodes.flatMap(visitor.node));\n }\n });\n\n return results.filter(value => typeof value !== 'undefined' && value !== null) as T[];\n }\n}\n","/*\n * text.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { PandocOutput, PandocToken, PandocTokenType, ProsemirrorWriter } from '../api/pandoc';\nimport { ExtensionContext } from '../api/extension';\nimport { kQuoteType, QuoteType, kQuoteChildren, fancyQuotesToSimple } from '../api/quote';\n\nconst extension = (context: ExtensionContext) => {\n const readText = (text: string) => {\n // we explicitly don't want fancy quotes in the editor\n if (context.pandocExtensions.smart) {\n text = fancyQuotesToSimple(text);\n }\n \n if (context.pandocExtensions.smart) {\n return text\n .replace(/---/g, '—')\n .replace(/--/g, '–')\n .replace(/\\.\\.\\./g, '…');\n } else {\n return text;\n }\n };\n\n return {\n nodes: [\n {\n name: 'text',\n spec: {\n group: 'inline',\n toDOM(node: ProsemirrorNode): any {\n return node.text;\n },\n },\n pandoc: {\n readers: [\n { token: PandocTokenType.Str, text: true, getText: (t: PandocToken) => readText(t.c) },\n { token: PandocTokenType.Space, text: true, getText: () => ' ' },\n { token: PandocTokenType.SoftBreak, text: true, getText: () => ' ' },\n {\n token: PandocTokenType.Quoted,\n handler: () => (writer: ProsemirrorWriter, tok: PandocToken) => {\n const type = tok.c[kQuoteType].t;\n const quote = type === QuoteType.SingleQuote ? \"'\" : '\"';\n writer.writeTokens([{ t: 'Str', c: quote }, ...tok.c[kQuoteChildren], { t: 'Str', c: quote }]);\n },\n },\n ],\n writer: (output: PandocOutput, node: ProsemirrorNode) => {\n const text = node.textContent;\n output.writeText(text);\n },\n },\n },\n ],\n };\n};\n\nexport default extension;\n","/*\n * paragraph.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\n\nimport { BlockCommand, EditorCommandId, ProsemirrorCommand } from '../api/command';\nimport { Extension } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\nimport { insertParagraph } from '../api/paragraph';\nimport { emptyNodePlaceholderPlugin } from '../api/placeholder';\nimport { selectionWithinLastBodyParagraph } from '../api/selection';\nimport { kAddToHistoryTransaction } from '../api/transaction';\n\nconst extension: Extension = {\n nodes: [\n {\n name: 'paragraph',\n spec: {\n content: 'inline*',\n group: 'block list_item_block',\n parseDOM: [{ tag: 'p' }],\n toDOM() {\n return ['p', 0];\n },\n },\n pandoc: {\n readers: [\n { token: PandocTokenType.Para, block: 'paragraph' },\n { token: PandocTokenType.Plain, block: 'paragraph' },\n ],\n writer: (output: PandocOutput, node: ProsemirrorNode) => {\n output.writeToken(PandocTokenType.Para, () => {\n output.writeInlines(node.content);\n });\n },\n },\n },\n ],\n\n commands: (schema: Schema) => {\n return [\n new BlockCommand(EditorCommandId.Paragraph, ['Mod-Alt-0'], schema.nodes.paragraph, schema.nodes.paragraph),\n new InsertParagraphCommand(),\n ];\n },\n\n plugins: (schema: Schema) => {\n let showHint = true;\n return [emptyNodePlaceholderPlugin(schema.nodes.paragraph, node => \" type / to insert a block (code, math, figure, div, etc.)\", tr => {\n if (showHint !== false) {\n if (selectionWithinLastBodyParagraph(tr.selection)) {\n if (tr.docChanged) {\n showHint = false;\n return false;\n } else {\n return true;\n }\n } else {\n return false;\n }\n } else {\n return false;\n }\n })];\n },\n};\n\nclass InsertParagraphCommand extends ProsemirrorCommand {\n constructor() {\n super(EditorCommandId.ParagraphInsert, [], insertParagraph);\n }\n}\n\nexport default extension;\n","/*\n * heading.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { textblockTypeInputRule, InputRule } from 'prosemirror-inputrules';\nimport { Node as ProsemirrorNode, Schema, NodeType, Fragment } from 'prosemirror-model';\nimport { EditorState } from 'prosemirror-state';\nimport { findParentNode, findParentNodeOfType } from 'prosemirror-utils';\n\nimport { PandocOutput, PandocToken, PandocTokenType } from '../api/pandoc';\nimport { EditorCommandId, toggleBlockType, ProsemirrorCommand } from '../api/command';\nimport { Extension, ExtensionContext } from '../api/extension';\nimport {\n pandocAttrSpec,\n pandocAttrParseDom,\n pandocAttrToDomAttr,\n pandocAttrReadAST,\n pandocAttrParseText,\n} from '../api/pandoc_attr';\nimport { uuidv4 } from '../api/util';\nimport { EditorUI } from '../api/ui';\nimport { OmniInsert, OmniInsertGroup } from '../api/omni_insert';\nimport { emptyNodePlaceholderPlugin } from '../api/placeholder';\nimport { kHeadingLevel, kHeadingAttr, kHeadingChildren } from '../api/heading';\n\nconst kHeadingLevels = [1, 2, 3, 4, 5, 6];\n\nconst extension = (context: ExtensionContext): Extension => {\n const { pandocExtensions, format, ui } = context;\n\n const headingAttr = pandocExtensions.header_attributes || pandocExtensions.mmd_header_identifiers;\n\n return {\n nodes: [\n {\n name: 'heading',\n spec: {\n attrs: {\n level: { default: 1 },\n link: { default: null },\n navigation_id: { default: null },\n ...(headingAttr ? pandocAttrSpec : {}),\n },\n content: 'inline*',\n group: 'block',\n defining: true,\n parseDOM: [\n { tag: 'h1', getAttrs: headingAttrs(1, headingAttr) },\n { tag: 'h2', getAttrs: headingAttrs(2, headingAttr) },\n { tag: 'h3', getAttrs: headingAttrs(3, headingAttr) },\n { tag: 'h4', getAttrs: headingAttrs(4, headingAttr) },\n { tag: 'h5', getAttrs: headingAttrs(5, headingAttr) },\n { tag: 'h6', getAttrs: headingAttrs(6, headingAttr) },\n ],\n toDOM(node) {\n const attr = headingAttr ? pandocAttrToDomAttr(node.attrs) : {};\n attr.class = (attr.class || '').concat(' pm-heading');\n return [\n 'h' + node.attrs.level,\n {\n 'data-link': node.attrs.link,\n ...attr,\n },\n\n 0,\n ];\n },\n },\n\n attr_edit: () => {\n if (headingAttr) {\n return {\n type: (schema: Schema) => schema.nodes.heading,\n offset: {\n top: 2,\n right: 6,\n },\n preferHidden: true\n };\n } else {\n return null;\n }\n },\n\n pandoc: {\n readers: [\n {\n token: PandocTokenType.Header,\n block: 'heading',\n getAttrs: (tok: PandocToken) => ({\n level: tok.c[kHeadingLevel],\n navigation_id: uuidv4(),\n ...(headingAttr ? pandocAttrReadAST(tok, kHeadingAttr) : {}),\n }),\n getChildren: (tok: PandocToken) => tok.c[kHeadingChildren],\n },\n ],\n writer: (output: PandocOutput, node: ProsemirrorNode) => {\n output.writeToken(PandocTokenType.Header, () => {\n output.write(node.attrs.level);\n if (headingAttr) {\n output.writeAttr(node.attrs.id, node.attrs.classes, node.attrs.keyvalue);\n } else {\n output.writeAttr();\n }\n output.writeArray(() => {\n if (node.attrs.level === 1 && format.rmdExtensions.bookdownPart) {\n writeBookdownH1(output, node);\n } else {\n output.writeInlines(node.content);\n }\n });\n });\n },\n },\n },\n ],\n\n commands: (schema: Schema) => {\n return [\n new HeadingCommand(schema, EditorCommandId.Heading1, 1, heading1OmniInsert(ui)),\n new HeadingCommand(schema, EditorCommandId.Heading2, 2, heading2OmniInsert(ui)),\n new HeadingCommand(schema, EditorCommandId.Heading3, 3, heading3OmniInsert(ui)),\n new HeadingCommand(schema, EditorCommandId.Heading4, 4, heading4OmniInsert(ui)),\n new HeadingCommand(schema, EditorCommandId.Heading5, 5),\n new HeadingCommand(schema, EditorCommandId.Heading6, 6),\n ];\n },\n\n inputRules: (schema: Schema) => {\n const rules = [\n textblockTypeInputRule(\n new RegExp('^(#{1,' + kHeadingLevels.length + '})\\\\s$'),\n schema.nodes.heading,\n match => ({\n level: match[1].length,\n navigation_id: uuidv4(),\n }),\n ),\n ];\n\n if (headingAttr) {\n rules.push(headingAttributeInputRule(schema));\n }\n\n return rules;\n },\n\n plugins: (schema: Schema) => {\n return [emptyHeadingPlaceholderPlugin(schema.nodes.heading, ui)];\n },\n };\n};\n\nfunction headingAttributeInputRule(schema: Schema) {\n return new InputRule(/ {([^}]+)}$/, (state: EditorState, match: string[], start: number, end: number) => {\n // only fire in headings\n const heading = findParentNodeOfType(schema.nodes.heading)(state.selection);\n if (heading) {\n // try to parse the attributes\n const attrs = pandocAttrParseText(match[1]);\n if (attrs) {\n const tr = state.tr;\n tr.setNodeMarkup(heading.pos, undefined, {\n ...heading.node.attrs,\n ...attrs,\n });\n tr.deleteRange(start + 1, end);\n return tr;\n } else {\n return null;\n }\n } else {\n return null;\n }\n });\n}\n\nclass HeadingCommand extends ProsemirrorCommand {\n public readonly nodeType: NodeType;\n public readonly level: number;\n\n constructor(schema: Schema, id: EditorCommandId, level: number, omniInsert?: OmniInsert) {\n super(id, ['Mod-Alt-' + level], headingCommandFn(schema, level), omniInsert);\n this.nodeType = schema.nodes.heading;\n this.level = level;\n }\n\n public isActive(state: EditorState) {\n const predicate = (n: ProsemirrorNode) => n.type === this.nodeType && n.attrs.level === this.level;\n const node = findParentNode(predicate)(state.selection);\n return !!node;\n }\n}\n\nfunction heading1OmniInsert(ui: EditorUI) {\n return headingOmniInsert(ui, 1, ui.context.translateText('Part heading'), [\n ui.images.omni_insert?.heading1!,\n ui.images.omni_insert?.heading1_dark!,\n ]);\n}\n\nfunction heading2OmniInsert(ui: EditorUI) {\n return headingOmniInsert(ui, 2, ui.context.translateText('Section heading'), [\n ui.images.omni_insert?.heading2!,\n ui.images.omni_insert?.heading2_dark!,\n ]);\n}\nfunction heading3OmniInsert(ui: EditorUI) {\n return headingOmniInsert(ui, 3, ui.context.translateText('Sub-section heading'), [\n ui.images.omni_insert?.heading3!,\n ui.images.omni_insert?.heading3_dark!,\n ]);\n}\n\nfunction heading4OmniInsert(ui: EditorUI) {\n return headingOmniInsert(ui, 4, ui.context.translateText('Small heading'), [\n ui.images.omni_insert?.heading4!,\n ui.images.omni_insert?.heading4_dark!,\n ]);\n}\n\nfunction headingOmniInsert(ui: EditorUI, level: number, description: string, images: [string, string], group = OmniInsertGroup.Headings): OmniInsert {\n return {\n name: headingName(ui, level),\n keywords: [\"h\" + level],\n description,\n group,\n image: () => (ui.prefs.darkMode() ? images[1] : images[0]),\n };\n}\n\nfunction headingName(ui: EditorUI, level: number) {\n const kHeadingPrefix = ui.context.translateText('Heading');\n return `${kHeadingPrefix} ${level}`;\n}\n\nfunction headingCommandFn(schema: Schema, level: number) {\n return toggleBlockType(schema.nodes.heading, schema.nodes.paragraph, { level });\n}\n\n// function for getting attrs\nfunction headingAttrs(level: number, pandocAttrSupported: boolean) {\n return (dom: Node | string) => {\n const el = dom as Element;\n return {\n level,\n 'data-link': el.getAttribute('data-link'),\n ...(pandocAttrSupported ? pandocAttrParseDom(el, {}) : {}),\n };\n };\n}\n\nfunction emptyHeadingPlaceholderPlugin(nodeType: NodeType, ui: EditorUI) {\n return emptyNodePlaceholderPlugin(nodeType, node => headingName(ui, node.attrs.level));\n}\n\n// write a bookdown (PART) H1 w/o spurious \\\nfunction writeBookdownH1(output: PandocOutput, node: ProsemirrorNode) {\n // see if this is a (PART\\*). note we also match and replay any text\n // before the first ( in case the cursor sentinel ended up there\n const partMatch = node.textContent.match(/^([^()]*)\\(PART\\\\\\*\\)/);\n if (partMatch) {\n const schema = node.type.schema;\n output.writeInlines(Fragment.from(schema.text(partMatch[1] + '(PART*)')));\n output.writeInlines(node.content.cut(partMatch[0].length));\n } else {\n output.writeInlines(node.content);\n }\n}\n\nexport default extension;\n","/*\n * blockquote.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { wrappingInputRule } from 'prosemirror-inputrules';\nimport { Node as ProsemirrorNode, Schema, DOMOutputSpec } from 'prosemirror-model';\n\nimport { WrapCommand, EditorCommandId } from '../api/command';\nimport { ExtensionContext } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\nimport { EditorUI } from '../api/ui';\nimport { OmniInsertGroup } from '../api/omni_insert';\n\nconst extension = (context: ExtensionContext) => {\n const { ui } = context;\n\n return {\n nodes: [\n {\n name: 'blockquote',\n spec: {\n content: 'block+',\n group: 'block',\n defining: true,\n parseDOM: [{ tag: 'blockquote' }],\n toDOM(): DOMOutputSpec {\n return ['blockquote', { class: 'pm-blockquote pm-block-border-color' }, 0];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.BlockQuote,\n block: 'blockquote',\n },\n ],\n writer: (output: PandocOutput, node: ProsemirrorNode) => {\n output.writeToken(PandocTokenType.BlockQuote, () => {\n output.writeNodes(node);\n });\n },\n },\n },\n ],\n\n commands: (schema: Schema) => {\n return [new WrapCommand(EditorCommandId.Blockquote, [], schema.nodes.blockquote, {}, blockquoteOmniInsert(ui))];\n },\n\n inputRules: (schema: Schema) => {\n return [wrappingInputRule(/^\\s*>\\s$/, schema.nodes.blockquote)];\n },\n };\n};\n\nfunction blockquoteOmniInsert(ui: EditorUI) {\n return {\n name: ui.context.translateText('Blockquote'),\n description: ui.context.translateText('Section quoted from another source'),\n group: OmniInsertGroup.Blocks,\n priority: 8,\n image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.blockquote_dark! : ui.images.omni_insert?.blockquote!),\n };\n}\n\nexport default extension;\n","/*\n * code_block.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\nimport { newlineInCode, exitCode } from 'prosemirror-commands';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { findParentNodeOfType } from 'prosemirror-utils';\n\nimport { BlockCommand, EditorCommandId, ProsemirrorCommand, toggleBlockType } from '../api/command';\nimport { Extension, ExtensionContext } from '../api/extension';\nimport { BaseKey } from '../api/basekeys';\nimport { codeNodeSpec } from '../api/code';\nimport { PandocOutput, PandocTokenType, PandocExtensions } from '../api/pandoc';\nimport { pandocAttrSpec, pandocAttrParseDom, pandocAttrToDomAttr } from '../api/pandoc_attr';\nimport { PandocCapabilities } from '../api/pandoc_capabilities';\nimport { EditorUI } from '../api/ui';\nimport { CodeBlockProps } from '../api/ui-dialogs';\nimport { hasFencedCodeBlocks } from '../api/pandoc_format';\nimport { precedingListItemInsertPos, precedingListItemInsert } from '../api/list';\nimport { EditorOptions } from '../api/options';\nimport { OmniInsertGroup } from '../api/omni_insert';\n\nconst extension = (context: ExtensionContext): Extension => {\n const { pandocExtensions, pandocCapabilities, ui, options } = context;\n\n const hasAttr = hasFencedCodeBlocks(pandocExtensions);\n\n return {\n nodes: [\n {\n name: 'code_block',\n\n spec: {\n ...codeNodeSpec(),\n attrs: { ...(hasAttr ? pandocAttrSpec : {}) },\n parseDOM: [\n {\n tag: 'pre',\n preserveWhitespace: 'full',\n getAttrs: (node: Node | string) => {\n if (hasAttr) {\n const el = node as Element;\n return pandocAttrParseDom(el, {});\n } else {\n return {};\n }\n },\n },\n ],\n toDOM(node: ProsemirrorNode) {\n const fontClass = 'pm-fixedwidth-font';\n const attrs = hasAttr\n ? pandocAttrToDomAttr({\n ...node.attrs,\n classes: [...node.attrs.classes, fontClass],\n })\n : {\n class: fontClass,\n };\n return ['pre', attrs, ['code', 0]];\n },\n },\n\n code_view: {\n lang: (node: ProsemirrorNode) => {\n return codeBlockLang(node, options);\n },\n attrEditFn: codeBlockFormatCommandFn(pandocExtensions, ui, pandocCapabilities.highlight_languages),\n },\n\n attr_edit: codeBlockAttrEdit(pandocExtensions, pandocCapabilities, ui),\n\n pandoc: {\n readers: [\n {\n token: PandocTokenType.CodeBlock,\n code_block: true,\n },\n ],\n writer: (output: PandocOutput, node: ProsemirrorNode) => {\n output.writeToken(PandocTokenType.CodeBlock, () => {\n if (hasAttr) {\n const id = pandocExtensions.fenced_code_attributes ? node.attrs.id : '';\n const keyvalue = pandocExtensions.fenced_code_attributes ? node.attrs.keyvalue : [];\n output.writeAttr(id, node.attrs.classes, keyvalue);\n } else {\n output.writeAttr();\n }\n output.write(node.textContent);\n });\n },\n },\n },\n ],\n\n commands: (schema: Schema) => {\n const commands: ProsemirrorCommand[] = [\n new BlockCommand(EditorCommandId.CodeBlock, [], schema.nodes.code_block, schema.nodes.paragraph, {}),\n ];\n if (hasAttr) {\n commands.push(new CodeBlockFormatCommand(pandocExtensions, ui, pandocCapabilities.highlight_languages));\n }\n return commands;\n },\n\n baseKeys: () => {\n return [\n { key: BaseKey.Enter, command: newlineInCode },\n { key: BaseKey.ModEnter, command: exitCode },\n { key: BaseKey.ShiftEnter, command: exitCode },\n ];\n },\n };\n};\n\nclass CodeBlockFormatCommand extends ProsemirrorCommand {\n constructor(pandocExtensions: PandocExtensions, ui: EditorUI, languages: string[]) {\n super(\n EditorCommandId.CodeBlockFormat,\n ['Shift-Mod-\\\\'],\n codeBlockFormatCommandFn(pandocExtensions, ui, languages),\n {\n name: ui.context.translateText('Code Block...'),\n description: ui.context.translateText('Source code display'),\n group: OmniInsertGroup.Blocks,\n priority: 7,\n image: () =>\n ui.prefs.darkMode() ? ui.images.omni_insert?.code_block_dark! : ui.images.omni_insert?.code_block!,\n },\n );\n }\n}\n\nfunction codeBlockFormatCommandFn(pandocExtensions: PandocExtensions, ui: EditorUI, languages: string[]) {\n return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n // enable if we are either inside a code block or we can toggle to a code block\n const schema = state.schema;\n const codeBlock = findParentNodeOfType(schema.nodes.code_block)(state.selection);\n if (\n !codeBlock &&\n !toggleBlockType(schema.nodes.code_block, schema.nodes.paragraph)(state) &&\n !precedingListItemInsertPos(state.doc, state.selection)\n ) {\n return false;\n }\n\n async function asyncEditCodeBlock() {\n if (dispatch) {\n // get props to edit\n const codeBlockProps = codeBlock\n ? { ...(codeBlock.node.attrs as CodeBlockProps), lang: '' }\n : defaultCodeBlockProps();\n\n // set lang if the first class is from available languages\n // (alternatively if we don't support attributes then it's\n // automatically considered the language)\n if (codeBlockProps.classes && codeBlockProps.classes.length) {\n const potentialLang = codeBlockProps.classes[0];\n if (!pandocExtensions.fenced_code_attributes || languages.includes(potentialLang)) {\n codeBlockProps.lang = potentialLang;\n codeBlockProps.classes = codeBlockProps.classes.slice(1);\n }\n }\n\n // show dialog\n const result = await ui.dialogs.editCodeBlock(\n codeBlockProps,\n pandocExtensions.fenced_code_attributes,\n languages,\n );\n if (result) {\n // extract lang\n const applyProps = propsWithLangClass(result);\n\n // edit or toggle as appropriate\n if (codeBlock) {\n const tr = state.tr;\n tr.setNodeMarkup(codeBlock.pos, schema.nodes.code_block, applyProps);\n dispatch(tr);\n } else {\n const prevListItemPos = precedingListItemInsertPos(state.doc, state.selection);\n if (prevListItemPos) {\n const tr = state.tr;\n const block = schema.nodes.code_block.create(applyProps);\n precedingListItemInsert(tr, prevListItemPos, block);\n dispatch(tr);\n } else {\n toggleBlockType(schema.nodes.code_block, schema.nodes.paragraph, applyProps)(state, dispatch, view);\n }\n }\n }\n }\n\n if (view) {\n view.focus();\n }\n }\n\n asyncEditCodeBlock();\n\n return true;\n };\n}\n\nfunction defaultCodeBlockProps() {\n return { id: '', classes: [], keyvalue: [], lang: '' };\n}\n\nfunction propsWithLangClass(props: CodeBlockProps) {\n const newProps = { ...props };\n if (newProps.classes && newProps.lang) {\n newProps.classes.unshift(props.lang);\n }\n return newProps;\n}\n\n// determine the code block language. if it's an Rmd example (i.e. with `r ''`) and\n// we have rmdExampleHighlight enabled then use the Rmd chunk language for highlighting\nfunction codeBlockLang(node: ProsemirrorNode, options: EditorOptions) {\n if (node.attrs.classes && node.attrs.classes.length) {\n const lang = node.attrs.classes[0];\n if (options.rmdExampleHighlight && lang === 'md') {\n const match = node.textContent.match(/^```+\\s*\\{([a-zA-Z0-9_]+)( *[ ,].*)?\\}`r ''`/);\n if (match) {\n return match[1];\n }\n }\n return lang;\n } else {\n return null;\n }\n}\n\nfunction codeBlockAttrEdit(pandocExtensions: PandocExtensions, pandocCapabilities: PandocCapabilities, ui: EditorUI) {\n return () => {\n if (hasFencedCodeBlocks(pandocExtensions)) {\n return {\n type: (schema: Schema) => schema.nodes.code_block,\n tags: (node: ProsemirrorNode) => {\n const tags: string[] = [];\n if (node.attrs.id) {\n tags.push(`#${node.attrs.id}`);\n }\n if (node.attrs.classes) {\n for (let i=1; i<node.attrs.classes.length; i++) {\n tags.push(`.${node.attrs.classes[i]}`);\n } \n if (node.attrs.classes.length > 0) {\n const lang = node.attrs.classes[0];\n if (pandocCapabilities.highlight_languages.includes(lang) || lang === 'tex') {\n tags.push(lang);\n } else {\n tags.push(`.${lang}`);\n }\n }\n }\n if (node.attrs.keyvalue && node.attrs.keyvalue.length) {\n tags.push(`${node.attrs.keyvalue.map(\n (kv: [string,string]) => kv[0] + '=\"' + (kv[1] || '1') + '\"').join(' ')}\n `);\n }\n return tags;\n },\n offset: {\n top: 3,\n right: 0,\n },\n editFn: () => codeBlockFormatCommandFn(pandocExtensions, ui, pandocCapabilities.highlight_languages),\n };\n } else {\n return null;\n }\n };\n}\n\nexport default extension;\n","/*\n * list.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\nimport { liftListItem, sinkListItem, splitListItem } from 'prosemirror-schema-list';\nimport { Plugin, PluginKey, EditorState } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { findParentNodeOfType } from 'prosemirror-utils';\n\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { BaseKey } from '../../api/basekeys';\nimport { EditorUI, kListSpacingTight } from '../../api/ui';\nimport { ListCapabilities } from '../../api/list';\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { PandocTokenType } from '../../api/pandoc';\nimport { OmniInsertGroup } from '../../api/omni_insert';\nimport { conditionalWrappingInputRule } from '../../api/input_rule';\nimport { kPresentationDocType } from '../../api/format';\n\nimport { ListCommand, TightListCommand, EditListPropertiesCommand, editListPropertiesCommandFn } from './list-commands';\n\nimport {\n CheckedListItemNodeView,\n checkedListItemInputRule,\n checkedListInputRule,\n CheckedListItemCommand,\n CheckedListItemToggleCommand,\n} from './list-checked';\n\nimport { writePandocBulletList, writePandocOrderedList, readPandocList } from './list-pandoc';\n\nimport './list-styles.css';\n\nexport enum ListNumberStyle {\n DefaultStyle = 'DefaultStyle',\n Decimal = 'Decimal',\n LowerRoman = 'LowerRoman',\n UpperRoman = 'UpperRoman',\n LowerAlpha = 'LowerAlpha',\n UpperAlpha = 'UpperAlpha',\n Example = 'Example',\n}\n\n// NOTE: HTML output doesn't currently respect this and it's difficult to\n// do with CSS (especially for nested lists). So we allow the user to edit\n// it but it isn't reflected in the editor.\nexport enum ListNumberDelim {\n DefaultDelim = 'DefaultDelim',\n Period = 'Period',\n OneParen = 'OneParen',\n TwoParens = 'TwoParens',\n}\n\nconst plugin = new PluginKey('list');\n\nconst extension = (context: ExtensionContext): Extension => {\n const { pandocExtensions, ui, format } = context;\n\n // determine list capabilities based on active format options\n const capabilities: ListCapabilities = {\n tasks: pandocExtensions.task_lists,\n fancy: pandocExtensions.fancy_lists,\n /*\n Always disable example lists b/c they don't round trip through the AST:\n - (@good) referenced elsewhere via (@good) just becomes a generic example (@) with \n a literal numeric reference.\n - The writer doesn't preserve the (@) or the (@good) when writing\n */\n // example: pandocExtensions.fancy_lists && pandocExtensions.example_lists,\n example: false,\n order: pandocExtensions.startnum,\n incremental: format.docTypes.includes(kPresentationDocType)\n };\n\n return {\n nodes: [\n {\n name: 'list_item',\n spec: {\n content: 'list_item_block block*',\n attrs: {\n checked: { default: null },\n },\n defining: true,\n parseDOM: [\n {\n tag: 'li',\n getAttrs: (dom: Node | string) => {\n const el = dom as Element;\n const attrs: any = {};\n if (capabilities.tasks && el.hasAttribute('data-checked')) {\n attrs.checked = el.getAttribute('data-checked') === 'true';\n }\n return attrs;\n },\n },\n ],\n toDOM(node) {\n const attrs: any = {\n class: 'pm-list-item',\n };\n if (capabilities.tasks && node.attrs.checked !== null) {\n attrs['data-checked'] = node.attrs.checked ? 'true' : 'false';\n }\n return ['li', attrs, 0];\n },\n },\n pandoc: {},\n },\n {\n name: 'bullet_list',\n spec: {\n content: 'list_item+',\n group: 'block',\n attrs: {\n tight: { default: false },\n },\n parseDOM: [\n {\n tag: 'ul',\n getAttrs: (dom: Node | string) => {\n const el = dom as Element;\n const attrs: any = {};\n if (el.hasAttribute('data-tight')) {\n attrs.tight = true;\n }\n return attrs;\n },\n },\n ],\n toDOM(node) {\n const attrs: { [key: string]: string } = {};\n attrs.class = 'pm-list pm-bullet-list';\n if (node.attrs.tight) {\n attrs['data-tight'] = 'true';\n }\n return ['ul', attrs, 0];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.BulletList,\n handler: (schema: Schema) => readPandocList(schema.nodes.bullet_list, capabilities),\n },\n ],\n writer: writePandocBulletList(capabilities),\n },\n\n attr_edit: listAttrEdit('bullet_list', capabilities, ui),\n },\n {\n name: 'ordered_list',\n spec: {\n content: 'list_item+',\n group: 'block',\n attrs: {\n tight: { default: false },\n order: { default: 1 },\n number_style: { default: ListNumberStyle.DefaultStyle },\n number_delim: { default: ListNumberDelim.DefaultDelim },\n },\n parseDOM: [\n {\n tag: 'ol',\n getAttrs(dom: Node | string) {\n const el = dom as Element;\n\n const attrs: any = {};\n attrs.tight = el.hasAttribute('data-tight');\n\n if (capabilities.order) {\n const order: string | null = el.getAttribute('start');\n if (!order) {\n attrs.order = 1;\n } else {\n attrs.order = parseInt(order, 10) || 1;\n }\n }\n\n if (capabilities.fancy) {\n if (capabilities.example && el.getAttribute('data-example')) {\n attrs.number_style = ListNumberStyle.Example;\n } else {\n attrs.number_style = typeToNumberStyle(el.getAttribute('type'));\n }\n const numberDelim = el.getAttribute('data-number-delim');\n if (numberDelim) {\n attrs.number_delim = numberDelim;\n }\n }\n\n return attrs;\n },\n },\n ],\n toDOM(node) {\n const attrs: { [key: string]: string } = {};\n attrs.class = 'pm-list pm-ordered-list';\n if (node.attrs.tight) {\n attrs['data-tight'] = 'true';\n }\n if (capabilities.order && node.attrs.order !== 1) {\n attrs.start = node.attrs.order;\n }\n if (capabilities.fancy) {\n const type = numberStyleToType(node.attrs.number_style);\n if (type) {\n attrs.type = type;\n }\n if (capabilities.example) {\n if (node.attrs.number_style === ListNumberStyle.Example) {\n attrs['data-example'] = '1';\n }\n }\n attrs['data-number-delim'] = node.attrs.number_delim;\n }\n return ['ol', attrs, 0];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.OrderedList,\n handler: (schema: Schema) => readPandocList(schema.nodes.ordered_list, capabilities),\n },\n ],\n writer: writePandocOrderedList(capabilities),\n },\n\n attr_edit: listAttrEdit('ordered_list', capabilities, ui),\n },\n ],\n\n plugins: (schema: Schema) => {\n const plugins: Plugin[] = [];\n if (capabilities.tasks) {\n plugins.push(\n new Plugin({\n key: plugin,\n props: {\n nodeViews: {\n list_item(node: ProsemirrorNode, view: EditorView, getPos: boolean | (() => number)) {\n return new CheckedListItemNodeView(node, view, getPos as () => number);\n },\n },\n },\n }),\n );\n }\n return plugins;\n },\n\n commands: (schema: Schema) => {\n const commands = [\n new ListCommand(\n EditorCommandId.BulletList,\n [],\n schema.nodes.bullet_list,\n schema.nodes.list_item,\n bulletListOmniInsert(ui),\n ui.prefs,\n ),\n new ListCommand(\n EditorCommandId.OrderedList,\n [],\n schema.nodes.ordered_list,\n schema.nodes.list_item,\n orderedListOmniInsert(ui),\n ui.prefs,\n ),\n new ProsemirrorCommand(EditorCommandId.ListItemSink, ['Tab'], sinkListItem(schema.nodes.list_item)),\n new ProsemirrorCommand(EditorCommandId.ListItemLift, ['Shift-Tab'], liftListItem(schema.nodes.list_item)),\n new ProsemirrorCommand(EditorCommandId.ListItemSplit, ['Enter'], splitListItem(schema.nodes.list_item)),\n new TightListCommand(),\n ];\n if (capabilities.fancy) {\n commands.push(new EditListPropertiesCommand(ui, capabilities));\n }\n if (capabilities.tasks) {\n commands.push(\n new CheckedListItemCommand(schema.nodes.list_item),\n new CheckedListItemToggleCommand(schema.nodes.list_item),\n );\n }\n return commands;\n },\n\n baseKeys: (schema: Schema) => {\n return [\n { key: BaseKey.Enter, command: splitListItem(schema.nodes.list_item) },\n { key: BaseKey.Tab, command: sinkListItem(schema.nodes.list_item) },\n { key: BaseKey.ShiftTab, command: liftListItem(schema.nodes.list_item) },\n ];\n },\n\n inputRules: (schema: Schema) => {\n // reflect tight pref\n const tightFn = () => {\n return {\n tight: ui.prefs.listSpacing() === kListSpacingTight,\n };\n };\n\n const isNotInHeading = (state: EditorState) => {\n return !findParentNodeOfType(schema.nodes.heading)(state.selection);\n };\n\n const rules = [\n conditionalWrappingInputRule(/^\\s*([-+*])\\s$/, schema.nodes.bullet_list, isNotInHeading, tightFn),\n conditionalWrappingInputRule(\n /^(\\d+)\\.\\s$/,\n schema.nodes.ordered_list,\n isNotInHeading,\n match => ({ order: +match[1], tight: tightFn() }),\n (match, node) => node.childCount + node.attrs.order === +match[1],\n ),\n ];\n if (capabilities.tasks) {\n rules.push(checkedListItemInputRule(), checkedListInputRule(schema));\n }\n return rules;\n },\n };\n};\n\nfunction listAttrEdit(type: string, capabilities: ListCapabilities, ui: EditorUI) {\n return () => {\n return {\n type: (schema: Schema) => schema.nodes[type],\n editFn: () => editListPropertiesCommandFn(ui, capabilities),\n offset: {\n top: 5,\n right: 5,\n },\n preferHidden: true\n };\n };\n}\n\nfunction numberStyleToType(style: ListNumberStyle): string | null {\n switch (style) {\n case ListNumberStyle.DefaultStyle:\n case ListNumberStyle.Decimal:\n case ListNumberStyle.Example:\n return 'l';\n case ListNumberStyle.LowerAlpha:\n return 'a';\n case ListNumberStyle.UpperAlpha:\n return 'A';\n case ListNumberStyle.LowerRoman:\n return 'i';\n case ListNumberStyle.UpperRoman:\n return 'I';\n default:\n return null;\n }\n}\n\nfunction typeToNumberStyle(type: string | null): ListNumberStyle {\n switch (type) {\n case 'l':\n return ListNumberStyle.Decimal;\n case 'a':\n return ListNumberStyle.LowerAlpha;\n case 'A':\n return ListNumberStyle.UpperAlpha;\n case 'i':\n return ListNumberStyle.LowerRoman;\n case 'I':\n return ListNumberStyle.UpperRoman;\n default:\n return ListNumberStyle.Decimal;\n }\n}\n\nfunction bulletListOmniInsert(ui: EditorUI) {\n return {\n name: ui.context.translateText('Bullet List'),\n description: ui.context.translateText('List using bullets for items'),\n group: OmniInsertGroup.Common,\n priority: 4,\n image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.bullet_list_dark! : ui.images.omni_insert?.bullet_list!),\n };\n}\n\nfunction orderedListOmniInsert(ui: EditorUI) {\n return {\n name: ui.context.translateText('Numbered List'),\n description: ui.context.translateText('List using numbers for items'),\n group: OmniInsertGroup.Common,\n priority: 3,\n image: () =>\n ui.prefs.darkMode() ? ui.images.omni_insert?.ordered_list_dark! : ui.images.omni_insert?.ordered_list!,\n };\n}\n\nexport default extension;\n","/*\n * list-commands.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { NodeType, Node as ProsemirrorNode, NodeRange, Schema } from 'prosemirror-model';\nimport { EditorState, Transaction, Selection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { autoJoin } from 'prosemirror-commands';\nimport { NodeWithPos, findParentNode } from 'prosemirror-utils';\n\nimport { NodeCommand, toggleList, ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { EditorUI, EditorUIPrefs } from '../../api/ui';\nimport { ListProps } from '../../api/ui-dialogs';\nimport { ListType, ListCapabilities, isList } from '../../api/list';\nimport { OmniInsert } from '../../api/omni_insert';\nimport { findWrapping } from 'prosemirror-transform';\nimport { trRemoveDiv } from '../div/div';\nimport { pandocAttrHasClass, pandocAttrRemoveClass, pandocAttrEnsureClass } from '../../api/pandoc_attr';\n\nexport class ListCommand extends NodeCommand {\n constructor(\n id: EditorCommandId,\n keymap: string[],\n listType: NodeType,\n listItemType: NodeType,\n omniInsert: OmniInsert,\n prefs: EditorUIPrefs,\n ) {\n super(id, keymap, listType, {}, autoJoin(toggleList(listType, listItemType, prefs), [listType.name]), omniInsert);\n }\n}\n\nexport class TightListCommand extends ProsemirrorCommand {\n constructor() {\n super(\n EditorCommandId.TightList,\n ['Mod-Alt-9'],\n (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n const parentList = findParentNode(isList)(state.selection);\n if (!parentList) {\n return false;\n }\n\n if (dispatch) {\n const tr = state.tr;\n const node = parentList.node;\n tr.setNodeMarkup(parentList.pos, node.type, {\n ...node.attrs,\n tight: !node.attrs.tight,\n });\n dispatch(tr);\n }\n\n return true;\n },\n );\n }\n\n public isActive(state: EditorState): boolean {\n if (this.isEnabled(state)) {\n const itemNode = findParentNode(isList)(state.selection) as NodeWithPos;\n return itemNode.node.attrs.tight;\n } else {\n return false;\n }\n }\n}\n\nexport function editListPropertiesCommandFn(ui: EditorUI, capabilities: ListCapabilities) {\n return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n // see if a parent node is a list\n let node: ProsemirrorNode | null = null;\n let pos: number = 0;\n const nodeWithPos = findParentNode(isList)(state.selection);\n if (nodeWithPos) {\n node = nodeWithPos.node;\n pos = nodeWithPos.pos;\n }\n\n // return false (disabled) for no targets\n if (!node) {\n return false;\n }\n\n // execute command when requested\n async function asyncEditList() {\n if (dispatch) {\n await editList(node as ProsemirrorNode, pos, state, dispatch, ui, capabilities);\n if (view) {\n view.focus();\n }\n }\n }\n asyncEditList();\n\n return true;\n };\n}\n\nexport class EditListPropertiesCommand extends ProsemirrorCommand {\n constructor(ui: EditorUI, capabilities: ListCapabilities) {\n super(EditorCommandId.EditListProperties, [], editListPropertiesCommandFn(ui, capabilities));\n }\n}\n\nconst kListIncrementalDefault = \"default\";\nconst kListIncremental = \"incremental\";\nconst kListNonIncremental = \"nonincremental\";\n\nasync function editList(\n node: ProsemirrorNode,\n pos: number,\n state: EditorState,\n dispatch: (tr: Transaction<any>) => void,\n ui: EditorUI,\n capabilities: ListCapabilities,\n): Promise<void> {\n // get list properties\n const schema = node.type.schema;\n const attrs = node.attrs;\n const props = {\n ...attrs,\n type: node.type === schema.nodes.ordered_list ? ListType.Ordered : ListType.Bullet,\n } as ListProps;\n\n // if we support incremental lists then determine that value\n const incrementalDiv = wrappingIncrementalDiv(state.selection, schema);\n if (incrementalDiv && capabilities.incremental) {\n props.incremental = pandocAttrHasClass(incrementalDiv.node.attrs, clz => clz === kListIncremental) \n ? kListIncremental \n : kListNonIncremental;\n } else {\n props.incremental = kListIncrementalDefault;\n }\n\n // edit list\n const result = await ui.dialogs.editList(props, capabilities);\n\n // apply result\n if (result) {\n const tr = state.tr;\n const listType = result.type === ListType.Ordered ? schema.nodes.ordered_list : schema.nodes.bullet_list;\n tr.setNodeMarkup(pos, listType, {\n ...attrs,\n ...result,\n });\n\n \n if (capabilities.incremental) {\n\n // remove any existing wrapping\n if (result.incremental === kListIncrementalDefault) {\n if (incrementalDiv) {\n trRemoveDiv(tr, incrementalDiv);\n }\n // edit existing wrapping\n } else if (incrementalDiv) {\n const divAttrs = { ...incrementalDiv.node.attrs };\n pandocAttrRemoveClass(divAttrs, isIncrementalClass);\n pandocAttrEnsureClass(divAttrs, result.incremental);\n tr.setNodeMarkup(incrementalDiv.pos, schema.nodes.div, divAttrs);\n // create new wrapping\n } else {\n const $pos = tr.doc.resolve(pos);\n const $endPos = tr.doc.resolve(pos + node.nodeSize);\n const range = $pos.blockRange($endPos); \n if (range) {\n const wrapping = findWrapping(range, schema.nodes.div, { classes: [result.incremental]});\n if (wrapping) {\n tr.wrap(range, wrapping);\n }\n }\n }\n }\n \n dispatch(tr);\n }\n}\n\nfunction wrappingIncrementalDiv(selection: Selection, schema: Schema) {\n return findParentNode(nd => {\n return nd.type === schema.nodes.div && \n pandocAttrHasClass(nd.attrs, isIncrementalClass);\n })(selection);\n\n}\n\nfunction isIncrementalClass(clz: string) {\n return [kListIncremental, kListNonIncremental].includes(clz);\n}","/*\n * div.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema, DOMOutputSpec, ResolvedPos } from 'prosemirror-model';\nimport { EditorState, Transaction, Plugin, PluginKey, TextSelection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { findParentNodeOfType, ContentNodeWithPos } from 'prosemirror-utils';\nimport { wrapIn } from 'prosemirror-commands';\nimport { liftTarget } from 'prosemirror-transform';\n\nimport { ExtensionContext, Extension } from '../../api/extension';\nimport {\n pandocAttrSpec,\n pandocAttrToDomAttr,\n pandocAttrParseDom,\n pandocAttrReadAST,\n pandocAttrFrom,\n pandocAttrAvailable,\n PandocAttr,\n pandocAttrHasClass,\n} from '../../api/pandoc_attr';\nimport { PandocOutput, PandocTokenType, PandocToken } from '../../api/pandoc';\nimport { ProsemirrorCommand, EditorCommandId, toggleWrap } from '../../api/command';\nimport { EditorUI } from '../../api/ui';\nimport { OmniInsertGroup, OmniInsert } from '../../api/omni_insert';\nimport { markIsActive } from '../../api/mark';\nimport { BaseKey } from '../../api/basekeys';\nimport { attrInputToProps } from '../../api/ui-dialogs';\nimport { kQuartoDocType } from '../../api/format';\n\nimport { insertCalloutCommand, editCalloutDiv } from './div-callout';\nimport { insertTabsetCommand } from './div-tabset';\n\nimport './div-styles.css';\n\nconst DIV_ATTR = 0;\nconst DIV_CHILDREN = 1;\n\nconst extension = (context: ExtensionContext) : Extension | null => {\n const { pandocExtensions, format, ui } = context;\n\n if (!pandocExtensions.fenced_divs && !pandocExtensions.native_divs) {\n return null;\n }\n\n return {\n nodes: [\n {\n name: 'div',\n spec: {\n attrs: {\n ...pandocAttrSpec,\n },\n defining: true,\n content: 'block+',\n group: 'block list_item_block',\n parseDOM: [\n {\n tag: 'div[data-div=\"1\"]',\n getAttrs(dom: Node | string) {\n const attrs: {} = { 'data-div': 1 };\n return {\n ...attrs,\n ...pandocAttrParseDom(dom as Element, attrs),\n };\n },\n },\n ],\n toDOM(node: ProsemirrorNode): DOMOutputSpec {\n const attr = {\n 'data-div': '1',\n ...pandocAttrToDomAttr({\n ...node.attrs,\n classes: [...node.attrs.classes, 'pm-div', 'pm-div-background-color'],\n }),\n };\n return ['div', attr, 0];\n },\n },\n\n attr_edit: () => ({\n type: (schema: Schema) => schema.nodes.div,\n editFn: () => divCommand(ui, true),\n offset: {\n top: 3,\n right: 0\n }\n }),\n\n pandoc: {\n readers: [\n {\n token: PandocTokenType.Div,\n block: 'div',\n getAttrs: (tok: PandocToken) => ({\n ...pandocAttrReadAST(tok, DIV_ATTR),\n }),\n getChildren: (tok: PandocToken) => tok.c[DIV_CHILDREN],\n },\n ],\n writer: (output: PandocOutput, node: ProsemirrorNode) => {\n output.writeToken(PandocTokenType.Div, () => {\n output.writeAttr(node.attrs.id, node.attrs.classes, node.attrs.keyvalue);\n output.writeArray(() => {\n output.writeNodes(node);\n });\n });\n },\n },\n },\n ],\n\n baseKeys: () => {\n return [\n { key: BaseKey.Enter, command: divInputRuleEnter() },\n ];\n },\n\n commands: () => {\n const cmds = [\n // turn current block into a div\n new DivCommand(EditorCommandId.Div, ui, true),\n\n // insert a div\n new DivCommand(EditorCommandId.InsertDiv, ui, false, {\n name: ui.context.translateText('Div...'),\n description: ui.context.translateText('Block containing other content'),\n group: OmniInsertGroup.Common,\n priority: 6,\n image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.div_dark! : ui.images.omni_insert?.div!),\n }),\n ];\n\n // quarto div commands\n if (format.docTypes.includes(kQuartoDocType)) {\n cmds.push(\n insertCalloutCommand(ui),\n insertTabsetCommand(ui)\n );\n }\n\n return cmds;\n },\n\n plugins: (schema: Schema) => {\n return [\n new Plugin({\n key: new PluginKey(\"div-selection\"),\n appendTransaction: (_transactions: Transaction[], _oldState: EditorState, newState: EditorState) => {\n if (newState.selection.empty) {\n return;\n }\n const divNode = findParentNodeOfType(schema.nodes.div)(newState.selection);\n if (divNode && \n (newState.selection.anchor === divNode.start + 1) &&\n newState.selection.head === divNode.pos + divNode.node.nodeSize - 2) {\n const tr = newState.tr;\n const sel = TextSelection.create(tr.doc, divNode.start, divNode.start + divNode.node.nodeSize - 1);\n tr.setSelection(sel);\n return tr;\n }\n }\n }),\n ];\n },\n };\n};\n\nexport function removeDiv(state: EditorState, dispatch: (tr: Transaction) => void, div: ContentNodeWithPos) {\n const tr = state.tr;\n trRemoveDiv(tr, div);\n dispatch(tr);\n}\n\nexport function trRemoveDiv(tr: Transaction, div: ContentNodeWithPos) {\n const fromPos = tr.doc.resolve(div.pos + 1);\n const toPos = tr.doc.resolve(div.pos + div.node.nodeSize - 1);\n const nodeRange = fromPos.blockRange(toPos);\n if (nodeRange) {\n const targetLiftDepth = liftTarget(nodeRange);\n if (targetLiftDepth || targetLiftDepth === 0) {\n tr.lift(nodeRange, targetLiftDepth);\n }\n }\n}\n\nfunction divCommand(ui: EditorUI, allowEdit: boolean) {\n return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n // two different modes:\n // - editing attributes of an existing div\n // - wrapping (a la blockquote)\n const schema = state.schema;\n const div = allowEdit ? findParentNodeOfType(schema.nodes.div)(state.selection) : undefined;\n if (!div && !toggleWrap(schema.nodes.div)(state)) {\n return false;\n }\n\n async function asyncEditDiv() {\n if (dispatch) {\n // selecting nothing or entire div means edit, selecting text outside of a\n // div or a subset of an existing div means create new one\n const editMode = div && (state.selection.empty || isFullDivSelection(div, state));\n if (editMode) {\n const attr = pandocAttrFrom(div!.node.attrs);\n if (pandocAttrHasClass(attr, (clz) => clz.startsWith(\"callout-\"))) {\n await editCalloutDiv(ui, state, dispatch, div!);\n } else {\n await editDiv(ui, state, dispatch, div!);\n }\n } else {\n await createDiv(ui, state, dispatch);\n }\n if (view) {\n view.focus();\n }\n }\n }\n asyncEditDiv();\n\n return true;\n };\n}\n\nclass DivCommand extends ProsemirrorCommand {\n constructor(id: EditorCommandId, ui: EditorUI, allowEdit: boolean, omniInsert?: OmniInsert) {\n super(id, [], divCommand(ui, allowEdit), omniInsert);\n }\n}\n\nasync function createDiv(ui: EditorUI, state: EditorState, dispatch: (tr: Transaction) => void) {\n const result = await ui.dialogs.editDiv({}, false);\n if (result) {\n wrapIn(state.schema.nodes.div)(state, (tr: Transaction) => {\n const div = findParentNodeOfType(state.schema.nodes.div)(tr.selection)!;\n tr.setNodeMarkup(div.pos, div.node.type, result.attr);\n dispatch(tr);\n });\n }\n}\n\nasync function editDiv(ui: EditorUI, state: EditorState, dispatch: (tr: Transaction) => void, div: ContentNodeWithPos) {\n const attr = pandocAttrFrom(div.node.attrs);\n const result = await ui.dialogs.editDiv(attr, pandocAttrAvailable(attr));\n if (result) {\n if (result.action === 'edit') {\n const tr = state.tr;\n tr.setNodeMarkup(div.pos, div.node.type, result.attr);\n dispatch(tr);\n } else if (result.action === 'remove') {\n removeDiv(state, dispatch, div);\n }\n }\n}\n\n\nfunction isFullDivSelection(div: ContentNodeWithPos, state: EditorState) {\n const divStart = div.pos;\n const divEnd = div.pos + div.node.nodeSize;\n return state.selection.from - 2 === divStart && state.selection.to + 2 === divEnd;\n}\n\nfunction divInputRuleEnter() {\n return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n // see if the parent consist of a pending code block input rule\n const schema = state.schema;\n\n // selection must be empty\n if (!state.selection.empty) {\n return false;\n }\n\n // full text of parent must meet the pattern\n // eslint-disable-next-line no-useless-escape\n const match = state.selection.$head.parent.textContent.match(/^:{3,}(\\s+({.*?}|\\S+)?[\\s:]*)?$/);\n if (!match) {\n return false;\n }\n\n // no inline code marks\n if (markIsActive(state, schema.marks.code)) {\n return false;\n }\n\n // must be able to perform the replacement\n if (!canApplyDivInputRule(state)) {\n return false;\n }\n\n // execute\n if (dispatch) {\n // if it's just followed by whitespace then don't do it\n if (match[1] && match[1].trim().length === 0) {\n return false;\n }\n\n // parse attributes\n const attrs: PandocAttr = pandocAttrFrom({});\n const attribMatch = match[2];\n if (attribMatch) {\n const bracesMatch = attribMatch.match(/^{(.*?)}$/);\n if (bracesMatch) {\n const pandocAttrsText = bracesMatch[1];\n const pandocAttrsMatch = pandocAttrsText.match(/^\\s*(#\\S+)?\\s*((?:\\.\\S+\\s*)*)?(.*)?$/);\n if (pandocAttrsMatch) {\n const attrProps = attrInputToProps({ id: pandocAttrsMatch[1], classes: pandocAttrsMatch[2] });\n attrs.id = attrProps.id || '';\n attrs.classes = attrProps.classes || [];\n }\n } else {\n attrs.classes = [attribMatch];\n }\n }\n\n wrapIn(state.schema.nodes.div)(state, (tr: Transaction) => {\n const div = findParentNodeOfType(state.schema.nodes.div)(tr.selection)!;\n tr.setNodeMarkup(div.pos, div.node.type, attrs);\n const $head = tr.selection.$head;\n const start = $head.start();\n const end = start + $head.parent.textContent.length;\n tr.deleteRange(start, end);\n dispatch(tr);\n });\n }\n\n return true;\n };\n}\n\nfunction canReplaceNodeWithDiv(schema: Schema, $pos: ResolvedPos) {\n return $pos.node(-1).canReplaceWith($pos.index(-1), $pos.indexAfter(-1), schema.nodes.div);\n}\n\nfunction canApplyDivInputRule(state: EditorState) {\n const schema = state.schema;\n const { $head } = state.selection;\n return canReplaceNodeWithDiv(schema, $head);\n}\n\nexport default extension;\n","/*\n * div-callout.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from \"prosemirror-state\";\nimport { EditorView } from \"prosemirror-view\";\nimport { setTextSelection, ContentNodeWithPos, findParentNodeOfType } from \"prosemirror-utils\";\nimport { wrapIn } from \"prosemirror-commands\";\n\n\nimport { EditorCommandId, ProsemirrorCommand, toggleWrap } from \"../../api/command\";\nimport { EditorUI } from \"../../api/ui\";\nimport { OmniInsertGroup } from \"../../api/omni_insert\";\nimport { pandocAttrEnsureClass, pandocAttrSetKeyvalue, pandocAttrGetKeyvalue, \n pandocAttrRemoveKeyvalue, pandocAttrRemoveClass, pandocAttrFrom } from \"../../api/pandoc_attr\";\nimport { CalloutProps } from \"../../api/ui-dialogs\";\nimport { removeDiv } from \"./div\";\n\nexport function insertCalloutCommand(ui: EditorUI) {\n return new ProsemirrorCommand(EditorCommandId.Callout, [], insertCalloutCommandFn(ui), {\n name: ui.context.translateText('Callout'),\n description: ui.context.translateText('Content framed for special emphasis'),\n group: OmniInsertGroup.Content,\n priority: 2,\n image: () => ui.images.omni_insert?.generic!,\n });\n}\n\nexport async function editCalloutDiv(ui: EditorUI, state: EditorState, dispatch: (tr: Transaction) => void, div: ContentNodeWithPos) {\n \n // extract callout props\n const callout = defaultCallout();\n const attr = pandocAttrFrom(div.node.attrs);\n const calloutType = pandocAttrRemoveClass(attr, clz => clz.startsWith(\"callout-\"));\n if (calloutType) {\n let calloutAppearance = pandocAttrGetKeyvalue(attr, \"appearance\") as string | undefined;\n if (calloutAppearance) {\n pandocAttrRemoveKeyvalue(attr, \"appearance\");\n } else {\n calloutAppearance = \"default\";\n }\n let calloutIcon = true;\n if (pandocAttrGetKeyvalue(attr, \"icon\") === \"false\") {\n calloutIcon = false;\n pandocAttrRemoveKeyvalue(attr, \"icon\");\n }\n let calloutCaption = \"\";\n if (div.node.firstChild?.type === state.schema.nodes.heading) {\n calloutCaption = div.node.firstChild?.textContent || \"\";\n }\n callout.type = calloutType.replace(/^callout-/, \"\");\n callout.appearance = calloutAppearance;\n callout.icon = calloutIcon;\n callout.caption = calloutCaption;\n }\n \n // edit callout\n const result = await ui.dialogs.editCallout({ attr, callout }, true);\n \n if (result) {\n const tr = state.tr;\n if (result.action === 'edit') {\n \n // start with raw attributes\n const resultAttr = result.attr;\n\n // apply callout attributes \n pandocAttrEnsureClass(resultAttr, `callout-${result.callout.type}`);\n if (result.callout.appearance !== \"default\") {\n pandocAttrSetKeyvalue(resultAttr, \"appearance\", result.callout.appearance);\n }\n if (result.callout.icon !== true) {\n pandocAttrSetKeyvalue(resultAttr, \"icon\", \"false\");\n }\n\n // set node markup\n tr.setNodeMarkup(div.pos, div.node.type, resultAttr);\n\n // set caption if it's different\n if (result.callout && (callout?.caption !== result.callout?.caption)) {\n if (div.node.firstChild?.type === state.schema.nodes.heading) {\n if (result.callout?.caption) {\n tr.replaceRangeWith(\n div.start, \n div.start + div.node.firstChild?.nodeSize!, \n state.schema.nodes.heading.create(\n { level: 2 },\n state.schema.text(result.callout?.caption)\n )\n );\n } else {\n tr.deleteRange(div.start, div.start + div.node.firstChild?.nodeSize!);\n }\n } else if (result.callout?.caption) {\n tr.insert(\n div.start, \n state.schema.nodes.heading.create(\n { level: 2 }, \n state.schema.text(result.callout?.caption)\n )\n );\n }\n }\n dispatch(tr);\n\n } else if (result.action === 'remove') {\n removeDiv(state, dispatch, div); \n }\n }\n}\n\nfunction insertCalloutCommandFn(ui: EditorUI) {\n return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n \n const schema = state.schema;\n if (!toggleWrap(schema.nodes.div)(state)) {\n return false;\n }\n\n async function asyncInsertCallout() {\n if (dispatch) {\n await createCalloutDiv(ui, state, dispatch);\n if (view) {\n view.focus();\n }\n }\n }\n asyncInsertCallout();\n\n return true;\n };\n}\n\nasync function createCalloutDiv(ui: EditorUI, state: EditorState, dispatch: (tr: Transaction) => void) {\n const props = {\n attr: {},\n callout: defaultCallout()\n };\n const result = await ui.dialogs.editCallout(props, false);\n if (result) {\n wrapIn(state.schema.nodes.div)(state, (tr: Transaction) => {\n // set div props from callout\n const attr = result.attr as any;\n pandocAttrEnsureClass(attr, `callout-${result.callout.type}`);\n attr.keyvalue = attr.keyvalue || [];\n if (result.callout?.appearance !== \"default\") {\n attr.keyvalue.push([\"appearance\", result.callout.appearance]);\n }\n if (result.callout?.icon === false) {\n attr.keyvalue.push([\"icon\", \"false\"]);\n }\n const div = findParentNodeOfType(state.schema.nodes.div)(tr.selection)!;\n tr.setNodeMarkup(div.pos, div.node.type, attr);\n\n // insert caption if one is specified\n if (result.callout?.caption) {\n const calloutContent = [\n state.schema.nodes.heading.create(\n { level: 2 },\n state.schema.text(result.callout?.caption)\n ),\n state.schema.nodes.paragraph.create()\n ];\n tr.replaceWith(div.start, div.start + 1, calloutContent);\n setTextSelection(div.start + calloutContent[0].nodeSize)(tr);\n }\n dispatch(tr);\n });\n }\n}\n\nfunction defaultCallout() : CalloutProps {\n return {\n type: \"note\",\n appearance: \"default\",\n icon: true,\n caption: \"\"\n };\n}\n\n","/*\n * div-tabset.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from \"prosemirror-state\";\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { wrapIn } from \"prosemirror-commands\";\nimport { findParentNodeOfType, setTextSelection } from \"prosemirror-utils\";\nimport { EditorView } from \"prosemirror-view\";\n\nimport { EditorCommandId, ProsemirrorCommand, toggleWrap } from \"../../api/command\";\nimport { EditorUI } from \"../../api/ui\";\nimport { OmniInsertGroup } from \"../../api/omni_insert\";\nimport { pandocAttrEnsureClass } from \"../../api/pandoc_attr\";\n\n\nexport function insertTabsetCommand(ui: EditorUI) {\n return new ProsemirrorCommand(EditorCommandId.Tabset, [], insertTabsetCommandFn(ui), {\n name: ui.context.translateText('Tabset'),\n description: ui.context.translateText('Content divided into tabs'),\n group: OmniInsertGroup.Content,\n priority: 2,\n image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.tabset_dark! : ui.images.omni_insert?.tabset!),\n });\n}\n\nfunction insertTabsetCommandFn(ui: EditorUI) {\n return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n \n const schema = state.schema;\n if (!toggleWrap(schema.nodes.div)(state)) {\n return false;\n }\n\n async function asyncInsertTabset() {\n if (dispatch) {\n const result = await ui.dialogs.insertTabset();\n if (result) {\n wrapIn(state.schema.nodes.div)(state, (tr: Transaction) => {\n // locate inserted div\n const div = findParentNodeOfType(state.schema.nodes.div)(tr.selection)!;\n\n // ensure that .panel-tabset is the first class then set attributes\n pandocAttrEnsureClass(result.attr, \"panel-tabset\");\n tr.setNodeMarkup(div.pos, div.node.type, result.attr);\n \n // insert tabset\n const tabset: ProsemirrorNode[] = result.tabs.flatMap(tab => {\n return [\n schema.nodes.heading.create(\n { level: 2 },\n schema.text(tab)\n ),\n schema.nodes.paragraph.create()\n ];\n });\n tr.replaceWith(div.start, div.start + 1, tabset);\n\n // set selection\n setTextSelection(div.start + tabset[0].nodeSize)(tr);\n\n // dispatch\n dispatch(tr);\n });\n }\n if (view) {\n view.focus();\n }\n }\n }\n asyncInsertTabset();\n\n return true;\n };\n}\n\n\n\n","/*\n * list-checked.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema, Fragment, NodeType } from 'prosemirror-model';\nimport { NodeView, EditorView } from 'prosemirror-view';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { findParentNodeOfType, NodeWithPos, setTextSelection } from 'prosemirror-utils';\nimport { InputRule, wrappingInputRule } from 'prosemirror-inputrules';\n\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { PandocToken, mapTokens } from '../../api/pandoc';\n\n// custom NodeView that accomodates display / interaction with item check boxes\nexport class CheckedListItemNodeView implements NodeView {\n public readonly dom: HTMLElement;\n public readonly contentDOM: HTMLElement;\n\n private readonly node: ProsemirrorNode;\n private readonly view: EditorView;\n private readonly getPos: () => number;\n\n constructor(node: ProsemirrorNode, view: EditorView, getPos: () => number) {\n this.node = node;\n this.view = view;\n this.getPos = getPos;\n\n // create root li element\n this.dom = window.document.createElement('li');\n if (node.attrs.tight) {\n this.dom.setAttribute('data-tight', 'true');\n }\n\n const container = window.document.createElement('div');\n container.classList.add('list-item-container');\n this.dom.appendChild(container);\n\n // add checkbox for checked items\n if (node.attrs.checked !== null) {\n this.dom.setAttribute('data-checked', node.attrs.checked ? 'true' : 'false');\n\n // checkbox for editing checked state\n const input = window.document.createElement('input');\n input.classList.add('list-item-checkbox');\n input.setAttribute('type', 'checkbox');\n input.checked = node.attrs.checked;\n input.contentEditable = 'false';\n input.disabled = !(view as any).editable;\n input.addEventListener('mousedown', (ev: Event) => {\n ev.preventDefault(); // don't steal focus\n });\n input.addEventListener('change', (ev: Event) => {\n const tr = view.state.tr;\n tr.setNodeMarkup(getPos(), node.type, {\n ...node.attrs,\n checked: (ev.target as HTMLInputElement).checked,\n });\n setTextSelection(getPos() + 1)(tr);\n view.dispatch(tr);\n });\n container.appendChild(input);\n }\n\n // content div\n const content = window.document.createElement('div');\n content.classList.add('list-item-content');\n this.contentDOM = content;\n container.appendChild(content);\n }\n}\n\n// command to toggle checked list items\nexport function checkedListItemCommandFn(itemType: NodeType) {\n return (state: EditorState, dispatch?: ((tr: Transaction) => void) | undefined) => {\n const itemNode = findParentNodeOfType(itemType)(state.selection);\n if (!itemNode) {\n return false;\n }\n\n if (dispatch) {\n const tr = state.tr;\n if (itemNode.node.attrs.checked !== null) {\n setItemChecked(tr, itemNode, null);\n } else {\n setItemChecked(tr, itemNode, false);\n }\n\n dispatch(tr);\n }\n\n return true;\n };\n}\n\nexport function checkedListItemToggleCommandFn(itemType: NodeType) {\n return (state: EditorState, dispatch?: ((tr: Transaction) => void) | undefined) => {\n const itemNode = findParentNodeOfType(itemType)(state.selection);\n if (!itemNode || itemNode.node.attrs.checked === null) {\n return false;\n }\n\n if (dispatch) {\n const tr = state.tr;\n setItemChecked(tr, itemNode, !itemNode.node.attrs.checked);\n dispatch(tr);\n }\n\n return true;\n };\n}\n\nexport class CheckedListItemCommand extends ProsemirrorCommand {\n constructor(itemType: NodeType) {\n super(EditorCommandId.ListItemCheck, [], checkedListItemCommandFn(itemType));\n }\n\n public isActive(state: EditorState): boolean {\n if (this.isEnabled(state)) {\n const itemNode = findParentNodeOfType(state.schema.nodes.list_item)(state.selection) as NodeWithPos;\n return itemNode.node.attrs.checked !== null;\n } else {\n return false;\n }\n }\n}\n\nexport class CheckedListItemToggleCommand extends ProsemirrorCommand {\n private itemType: NodeType;\n\n constructor(itemType: NodeType) {\n super(EditorCommandId.ListItemCheckToggle, [], checkedListItemToggleCommandFn(itemType));\n this.itemType = itemType;\n }\n\n public isActive(state: EditorState): boolean {\n const itemNode = findParentNodeOfType(this.itemType)(state.selection);\n return itemNode && itemNode.node.attrs.checked;\n }\n}\n\n// allow users to type [x] or [ ] to define a checked list item\nexport function checkedListItemInputRule() {\n return new InputRule(/\\[([ x])\\]\\s$/, (state: EditorState, match: string[], start: number, end: number) => {\n const schema = state.schema;\n\n const itemNode = findParentNodeOfType(schema.nodes.list_item)(state.selection);\n if (itemNode) {\n // create transaction\n const tr = state.tr;\n\n // set checked\n setItemChecked(tr, itemNode, match[1]);\n\n // delete entered text\n tr.delete(start, end);\n\n // return transaction\n return tr;\n } else {\n return null;\n }\n });\n}\n\n// allow users to begin a new checked list by typing [x] or [ ] at the beginning of a line\nexport function checkedListInputRule(schema: Schema) {\n // regex to match checked list at the beginning of a line\n const regex = /^\\s*\\[([ x])\\]\\s$/;\n\n // we are going to steal the handler from the base bullet list wrapping input rule\n const baseInputRule: any = wrappingInputRule(regex, schema.nodes.bullet_list);\n\n return new InputRule(regex, (state: EditorState, match: string[], start: number, end: number) => {\n // call the base handler to create the bullet list\n const tr = baseInputRule.handler(state, match, start, end);\n if (tr) {\n // set the checkbox\n const itemNode = findParentNodeOfType(schema.nodes.list_item)(tr.selection);\n if (itemNode) {\n setItemChecked(tr, itemNode, match[1]);\n }\n\n return tr;\n } else {\n return null;\n }\n });\n}\n\nfunction setItemChecked(tr: Transaction, itemNode: NodeWithPos, check: null | boolean | string) {\n tr.setNodeMarkup(itemNode.pos, itemNode.node.type, {\n ...itemNode.node.attrs,\n checked: check === null ? null : typeof check === 'string' ? check === 'x' : check,\n });\n}\n// prepend a check mark to the provided fragment\nexport function fragmentWithCheck(schema: Schema, fragment: Fragment, checked: boolean) {\n // create a raw markdown node with [x] or [ ]\n const mark = schema.marks.raw_inline.create({ format: 'markdown' });\n const check = schema.text((checked ? '[x]' : '[ ]') + ' ', [mark]);\n return Fragment.from(check).append(fragment);\n}\n\nconst kCheckedChar = '☒';\nconst kUncheckedChar = '☐';\n\nexport function tokensWithChecked(tokens: PandocToken[]): { checked: null | boolean; tokens: PandocToken[] } {\n // will set this flag based on inspecting the first Str token\n let checked: null | boolean | undefined;\n let lastWasChecked = false;\n\n // map tokens\n const mappedTokens = mapTokens(tokens, tok => {\n // if the last token was checked then strip the next space\n if (tok.t === 'Space' && lastWasChecked) {\n lastWasChecked = false;\n return {\n t: 'Str',\n c: '',\n };\n }\n\n // derive 'checked' from first chraracter of first Str token encountered\n // if we find checked or unchecked then set the flag and strip off\n // the first 2 chraracters (the check and the space after it)\n else if (tok.t === 'Str' && checked === undefined) {\n let text = tok.c as string;\n if (text.charAt(0) === kCheckedChar) {\n checked = true;\n lastWasChecked = true;\n text = text.slice(1);\n } else if (text.charAt(0) === kUncheckedChar) {\n checked = false;\n lastWasChecked = true;\n text = text.slice(1);\n } else {\n checked = null;\n }\n return {\n t: 'Str',\n c: text,\n };\n } else {\n return tok;\n }\n });\n\n // return\n return {\n checked: checked !== undefined ? checked : null,\n tokens: mappedTokens,\n };\n}\n","/*\n * list-pandoc.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, NodeType, Fragment } from 'prosemirror-model';\n\nimport { PandocOutput, PandocToken, ProsemirrorWriter, PandocTokenType } from '../../api/pandoc';\n\nimport { fragmentWithCheck, tokensWithChecked } from './list-checked';\nimport { ListNumberDelim, ListNumberStyle } from './list';\nimport { ListCapabilities, isList } from '../../api/list';\n\nconst LIST_ATTRIBS = 0;\nconst LIST_CHILDREN = 1;\n\nconst LIST_ATTRIB_ORDER = 0;\nconst LIST_ATTRIB_NUMBER_STYLE = 1;\nconst LIST_ATTRIB_NUMBER_DELIM = 2;\n\n// Note that we are planning on eliminating the markdownOutputFilter after this commit\n// as there will be no more uses of it and it plays poorly w/ e.g. pandoc table output\n// which needs to reliably know the number of characters wide each column will be).\n// (previous uses of markdownOutputFilter were converted to use output.writeRawMarkdown).\n// So, if we are attempting to re-enable example lists b/c there is now round tripping\n// of example lists through the pandoc AST we need an alternative way to fixup\n// example list output (likely a more robust pandoc AST).\nconst kListItemExampleSentinel = '20543127-1873-4833-AC49-5B352CFA2AF5';\nconst kListItemExampleRegex = new RegExp(`\\\\(\\\\d+\\\\) ${kListItemExampleSentinel}`, 'g');\n\nexport function readPandocList(nodeType: NodeType, capabilities: ListCapabilities) {\n // alias schema\n const schema = nodeType.schema;\n\n // default extraction functions\n let getChildren = (tok: PandocToken) => tok.c;\n let getAttrs = (tok: PandocToken): { [key: string]: any } => ({});\n\n // function to read the number style (convert example to default if we\n // don't support example lists)\n const readNumberStyle = (attribs: any) => {\n if (capabilities.fancy) {\n const style = attribs[LIST_ATTRIB_NUMBER_STYLE].t;\n if (style === ListNumberStyle.Example && !capabilities.example) {\n return ListNumberStyle.DefaultStyle;\n } else {\n return style;\n }\n } else {\n return ListNumberStyle.DefaultStyle;\n }\n };\n\n // specialize for ordered_list\n if (nodeType === schema.nodes.ordered_list) {\n getAttrs = (tok: PandocToken) => {\n const attribs = tok.c[LIST_ATTRIBS];\n return {\n order: capabilities.order ? attribs[LIST_ATTRIB_ORDER] : 1,\n number_style: readNumberStyle(attribs),\n number_delim: capabilities.fancy ? attribs[LIST_ATTRIB_NUMBER_DELIM].t : ListNumberDelim.DefaultDelim,\n };\n };\n getChildren = (tok: PandocToken) => tok.c[LIST_CHILDREN];\n }\n\n const listItemNodeType = schema.nodes.list_item;\n return (writer: ProsemirrorWriter, tok: PandocToken) => {\n\n // determine if this is an example list and log if it is\n if ((nodeType === schema.nodes.ordered_list) && capabilities.fancy) {\n const style = tok.c[LIST_ATTRIBS][LIST_ATTRIB_NUMBER_STYLE].t;\n if (style === ListNumberStyle.Example) {\n writer.logExampleList();\n }\n }\n \n const children = getChildren(tok);\n const attrs = getAttrs(tok);\n attrs.tight = children.length && children[0].length && children[0][0].t === 'Plain';\n writer.openNode(nodeType, attrs);\n children.forEach((child: PandocToken[]) => {\n // setup tokens/attribs for output\n let tokens = child;\n const childAttrs: { checked: null | boolean } = { checked: null };\n\n // special task list processing if the current format supports task lists\n if (capabilities.tasks) {\n // look for checkbox in first character of child tokens\n // if we see it, remove it and set childAttrs.checked as appropriate\n const childWithChecked = tokensWithChecked(child);\n childAttrs.checked = childWithChecked.checked;\n tokens = childWithChecked.tokens;\n }\n\n // process children\n writer.openNode(listItemNodeType, childAttrs);\n writer.writeTokens(tokens);\n writer.closeNode();\n });\n writer.closeNode();\n };\n}\n\nexport function writePandocOrderedList(capabilities: ListCapabilities) {\n return (output: PandocOutput, node: ProsemirrorNode) => {\n // alias some list options\n const options = listNodeOptions(node, capabilities);\n\n // force delim to two parens for example styles. we do this\n // to simplify the search/replace of example list sentinels\n // during conversion post-processing\n const delim = options.example ? ListNumberDelim.TwoParens : node.attrs.number_delim;\n\n output.writeToken(PandocTokenType.OrderedList, () => {\n output.writeArray(() => {\n output.write(capabilities.order ? node.attrs.order : 1);\n output.writeToken(capabilities.fancy ? node.attrs.number_style : ListNumberStyle.DefaultStyle);\n output.writeToken(capabilities.fancy ? delim : ListNumberDelim.DefaultDelim);\n });\n output.writeArray(() => {\n node.forEach(item => writePandocListItem(output, options, item));\n });\n });\n };\n}\n\nexport function writePandocBulletList(capabilities: ListCapabilities) {\n return (output: PandocOutput, node: ProsemirrorNode) => {\n output.writeToken(PandocTokenType.BulletList, () => {\n node.forEach(item => writePandocListItem(output, listNodeOptions(node, capabilities), item));\n });\n };\n}\n\nexport function exampleListPandocMarkdownOutputFilter(markdown: string) {\n return markdown.replace(kListItemExampleRegex, '(@) ');\n}\n\ninterface ListNodeOptions {\n tight: boolean;\n example: boolean;\n}\n\nfunction listNodeOptions(node: ProsemirrorNode, capabilities: ListCapabilities): ListNodeOptions {\n const options = {\n tight: node.attrs.tight,\n example: capabilities.example ? node.attrs.number_style === ListNumberStyle.Example : false,\n };\n\n // if it's tight see if we need to override b/c of multiple blocks\n // (allow case of [paragraph,list] which is just a nested list)\n node.forEach(item => {\n if (options.tight && item.childCount > 1) {\n if (item.childCount > 2 || !isList(item.child(1)) ) {\n options.tight = false;\n }\n }\n });\n\n return options;\n}\n\nfunction writePandocListItem(output: PandocOutput, options: ListNodeOptions, node: ProsemirrorNode) {\n const checked = node.attrs.checked;\n\n output.writeArray(() => {\n node.forEach((itemNode: ProsemirrorNode, _offset, index) => {\n if (itemNode.type === node.type.schema.nodes.paragraph) {\n const paraItemBlockType = options.tight ? PandocTokenType.Plain : PandocTokenType.Para;\n output.writeToken(paraItemBlockType, () => {\n // for first item block, prepend check mark if we have one\n if (checked !== null && index === 0) {\n writeListItemInlines(\n output,\n options.example,\n fragmentWithCheck(node.type.schema, itemNode.content, checked),\n index,\n );\n } else {\n writeListItemInlines(output, options.example, itemNode.content, index);\n }\n });\n } else {\n output.writeNode(itemNode);\n }\n });\n });\n}\n\nfunction writeListItemInlines(output: PandocOutput, example: boolean, fragment: Fragment, index: number) {\n if (index === 0 && example) {\n output.writeToken(PandocTokenType.Str, kListItemExampleSentinel);\n }\n output.writeInlines(fragment);\n}\n","/*\n * image.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema, DOMOutputSpec } from 'prosemirror-model';\nimport { EditorState, NodeSelection, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { canInsertNode } from '../../api/node';\nimport { selectionIsImageNode, selectionIsEmptyParagraph } from '../../api/selection';\nimport {\n pandocAttrSpec,\n pandocAttrParseDom,\n pandocAttrToDomAttr,\n pandocAttrReadAST,\n pandocAttrAvailable,\n} from '../../api/pandoc_attr';\nimport {\n PandocOutput,\n PandocTokenType,\n ProsemirrorWriter,\n PandocToken,\n stringifyTokens,\n imageAttributesAvailable,\n} from '../../api/pandoc';\nimport { EditorUI } from '../../api/ui';\nimport { ImageDimensions } from '../../api/image';\nimport { asHTMLTag } from '../../api/html';\nimport { OmniInsertGroup } from '../../api/omni_insert';\nimport { EditorFormat } from '../../api/format';\n\nimport { imageDialog } from './image-dialog';\nimport { imageDimensionsFromImg, imageContainerWidth, inlineHTMLIsImage } from './image-util';\nimport { imageTextSelectionPlugin } from './image-textsel';\nimport { posHasProhibitedFigureParent } from './figure';\nimport { imageEventsPlugin } from './image-events';\nimport { imageNodeViewPlugins } from './image-view';\n\nconst TARGET_URL = 0;\nconst TARGET_TITLE = 1;\n\nconst IMAGE_ATTR = 0;\nconst IMAGE_ALT = 1;\nconst IMAGE_TARGET = 2;\n\nconst extension = (context: ExtensionContext): Extension => {\n const { pandocExtensions, ui, events, format } = context;\n\n const imageAttr = imageAttributesAvailable(pandocExtensions);\n\n return {\n nodes: [\n {\n name: 'image',\n spec: {\n inline: true,\n attrs: imageNodeAttrsSpec(false, imageAttr),\n group: 'inline',\n draggable: true,\n parseDOM: [\n {\n tag: 'img[src]',\n getAttrs(dom: Node | string) {\n return imageAttrsFromDOM(dom as Element, imageAttr);\n },\n },\n ],\n toDOM(node: ProsemirrorNode) {\n return imageDOMOutputSpec(node, imageAttr);\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.Image,\n handler: pandocImageHandler(false, imageAttr),\n },\n ],\n inlineHTMLReader: pandocExtensions.raw_html ? imageInlineHTMLReader : undefined,\n writer: imagePandocOutputWriter(false, ui),\n },\n\n attr_edit: () => ({\n type: (schema: Schema) => schema.nodes.image,\n noDecorator: true,\n editFn: () => imageCommand(ui, format, imageAttr),\n }),\n },\n ],\n\n commands: (_schema: Schema) => {\n return [\n new ProsemirrorCommand(\n EditorCommandId.Image,\n ['Shift-Mod-i'],\n imageCommand(ui, format, imageAttr),\n imageOmniInsert(ui),\n ),\n ];\n },\n\n plugins: (schema: Schema) => {\n return [\n imageTextSelectionPlugin(),\n imageEventsPlugin(ui),\n ...imageNodeViewPlugins('image', ui, format, events, pandocExtensions),\n ];\n },\n };\n};\n\nexport function pandocImageHandler(figure: boolean, imageAttributes: boolean) {\n return (schema: Schema) => (writer: ProsemirrorWriter, tok: PandocToken) => {\n // get attributes\n const target = tok.c[IMAGE_TARGET];\n const attrs = {\n src: decodeURI(target[TARGET_URL]),\n title: readPandocTitle(target[TARGET_TITLE]),\n caption: '',\n ...(imageAttributes ? pandocAttrReadAST(tok, IMAGE_ATTR) : {}),\n };\n\n // add alt as plain text if it's not a figure\n if (!figure) {\n attrs.caption = stringifyTokens(tok.c[IMAGE_ALT]);\n }\n\n // read image and (if appropriate) children\n writer.openNode(figure ? schema.nodes.figure : schema.nodes.image, attrs);\n if (figure) {\n writer.writeTokens(tok.c[IMAGE_ALT]);\n }\n writer.closeNode();\n };\n}\n\nexport function imagePandocOutputWriter(figure: boolean, ui: EditorUI) {\n return (output: PandocOutput, node: ProsemirrorNode) => {\n // default writer for markdown images\n let writer = () => {\n output.writeToken(PandocTokenType.Image, () => {\n if (output.extensions.link_attributes) {\n output.writeAttr(node.attrs.id, node.attrs.classes, node.attrs.keyvalue);\n } else {\n output.writeAttr();\n }\n output.writeArray(() => {\n if (figure) {\n output.writeInlines(node.content);\n } else {\n output.writeText(node.attrs.caption);\n }\n });\n output.write([encodeURI(node.attrs.src), node.attrs.title || '']);\n });\n };\n\n // see if we need to write raw html\n const requireHTML =\n pandocAttrAvailable(node.attrs) && // attribs need to be written\n !output.extensions.link_attributes && // markdown attribs not supported\n output.extensions.raw_html; // raw html is supported\n\n // if we do, then substitute a raw html writer\n if (node.attrs.raw || requireHTML) {\n writer = () => {\n const imgAttr = imageDOMAttributes(node, true, false);\n const html = asHTMLTag('img', imgAttr, true, true);\n output.writeRawMarkdown(html);\n };\n }\n\n // write (wrap in paragraph and possibly link for figures)\n if (figure) {\n let writeFigure = writer;\n if (node.attrs.linkTo) {\n writeFigure = () => {\n output.writeLink(node.attrs.linkTo, '', null, writer);\n };\n }\n output.writeToken(PandocTokenType.Para, writeFigure);\n } else {\n writer();\n }\n };\n}\n\n// parse inline html with <img> as image node\nfunction imageInlineHTMLReader(schema: Schema, html: string, writer?: ProsemirrorWriter) {\n const isImage = inlineHTMLIsImage(html);\n if (!isImage) {\n return false;\n }\n\n if (writer) {\n const attrs = imageAttrsFromHTML(html);\n if (attrs) {\n attrs.raw = true;\n writer.addNode(schema.nodes.image, attrs, []);\n } else {\n return false;\n }\n }\n\n return isImage;\n}\n\nexport function imageDOMOutputSpec(node: ProsemirrorNode, imageAttributes: boolean): DOMOutputSpec {\n return ['img', imageDOMAttributes(node, imageAttributes)];\n}\n\nexport function imageDOMAttributes(\n node: ProsemirrorNode,\n imageAttributes: boolean,\n marker = true,\n): { [key: string]: string } {\n const attr: { [key: string]: string } = {\n src: node.attrs.src,\n };\n const title = node.attrs.title;\n if (title) {\n attr.title = title;\n }\n const caption = node.attrs.caption || node.textContent;\n if (caption) {\n attr.alt = caption;\n }\n\n return {\n ...attr,\n ...(imageAttributes ? pandocAttrToDomAttr(node.attrs, marker) : {}),\n };\n}\n\nexport function imageNodeAttrsSpec(linkTo: boolean, imageAttributes: boolean) {\n return {\n src: {},\n title: { default: null },\n caption: { default: null },\n raw: { default: false },\n ...(linkTo ? { linkTo: { default: null } } : {}),\n ...(imageAttributes ? pandocAttrSpec : {}),\n };\n}\n\nexport function imageAttrsFromDOM(el: Element, imageAttributes: boolean, forceAttrs = false) {\n const attrs: { [key: string]: string | null } = {\n src: el.getAttribute('src') || null,\n title: el.getAttribute('title') || null,\n caption: el.getAttribute('alt') || null,\n };\n return {\n ...attrs,\n ...(imageAttributes ? pandocAttrParseDom(el, attrs, forceAttrs) : {}),\n };\n}\n\nexport function imageAttrsFromHTML(html: string) {\n const parser = new window.DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n if (doc.body && doc.body.firstChild instanceof HTMLImageElement) {\n return imageAttrsFromDOM(doc.body.firstChild, true, true);\n } else {\n return null;\n }\n}\n\nexport function imageCommand(editorUI: EditorUI, editorFormat: EditorFormat, imageAttributes: boolean) {\n return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n const schema = state.schema;\n\n if (!canInsertNode(state, schema.nodes.image) && !canInsertNode(state, schema.nodes.figure)) {\n return false;\n }\n\n if (dispatch && view) {\n // see if we are editing an existing node\n let node: ProsemirrorNode | null = null;\n let nodeType = schema.nodes.image;\n let img: HTMLImageElement | null = null;\n let imgDimensions: ImageDimensions | null = null;\n if (selectionIsImageNode(schema, state.selection)) {\n node = (state.selection as NodeSelection).node;\n nodeType = node.type;\n if (nodeType === schema.nodes.figure) {\n const figure = view.nodeDOM(state.selection.from) as HTMLElement;\n img = figure.firstChild!.firstChild as HTMLImageElement;\n } else {\n const span = view.nodeDOM(state.selection.from) as HTMLElement;\n img = span.firstChild! as HTMLImageElement;\n }\n if (img) {\n const containerWidth = imageContainerWidth(state.selection.from, view);\n imgDimensions = imageDimensionsFromImg(img, containerWidth);\n }\n }\n\n // see if we are in an empty paragraph (in that case insert a figure)\n if (\n selectionIsEmptyParagraph(schema, state.selection) &&\n !posHasProhibitedFigureParent(schema, state.selection.$head)\n ) {\n nodeType = schema.nodes.figure;\n }\n\n // show dialog\n imageDialog(node, imgDimensions, nodeType, view, editorUI, editorFormat, imageAttributes);\n }\n\n return true;\n };\n}\n\nfunction imageOmniInsert(ui: EditorUI) {\n return {\n name: ui.context.translateText('Figure / Image...'),\n description: ui.context.translateText('Figure or inline image'),\n group: OmniInsertGroup.Content,\n priority: 10,\n image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.image_dark! : ui.images.omni_insert?.image!),\n };\n}\n\nfunction readPandocTitle(title: string | null) {\n if (title) {\n return title.replace(/^(fig:)/, '');\n } else {\n return title;\n }\n}\n\nexport default extension;\n","/*\n * image-dialog.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, NodeType, Fragment, Mark } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\n\nimport { insertAndSelectNode } from '../../api/node';\nimport { EditorUI } from '../../api/ui';\nimport { ImageProps } from '../../api/ui-dialogs';\nimport { extractSizeStyles, kPercentUnit, kPixelUnit } from '../../api/css';\nimport { ImageType, ImageDimensions, isNaturalAspectRatio } from '../../api/image';\nimport { kWidthAttrib, kHeightAttrib, pandocAttrRemoveKeyvalue, \n pandocAttrGetKeyvalue, pandocAttrSetKeyvalue, \n kFigAlignAttrib, kFigEnvAttrib, kFigAltAttrib } from '../../api/pandoc_attr';\n import { EditorFormat, kQuartoDocType } from '../../api/format';\n\nimport { imagePropsWithSizes, hasPercentWidth } from './image-util';\n\nexport async function imageDialog(\n node: ProsemirrorNode | null,\n dims: ImageDimensions | null,\n nodeType: NodeType,\n view: EditorView,\n editorUI: EditorUI,\n editorFormat: EditorFormat,\n imageAttributes: boolean,\n) {\n // alias schema\n const schema = view.state.schema;\n\n // if we are being called with an existing node then read it's attributes\n let content = Fragment.empty;\n let image: ImageProps = { src: null };\n let linkMark: Mark | undefined;\n let marks: Mark[] = [];\n if (node && dims && node.type === nodeType) {\n // base attributess\n image = {\n ...(node.attrs as ImageProps),\n caption: nodeType === schema.nodes.figure ? node.textContent : node.attrs.caption,\n };\n\n // move width and height out of style and into keyvalue if necessary\n image = {\n ...image,\n keyvalue: extractSizeStyles(image.keyvalue),\n };\n\n // move width, height, and units out of keyvalue into explicit\n // top level image properties if necessary\n image = imagePropsWithSizes(image, dims);\n\n // record marks / linkTo\n if (nodeType === schema.nodes.image) {\n marks = node.marks;\n linkMark = node.marks.find(mark => mark.type === schema.marks.link);\n if (linkMark) {\n image.linkTo = linkMark.attrs.href;\n }\n }\n\n // content (will be caption for figures)\n content = node.content;\n } else {\n // create a new image\n image = nodeType.create(image).attrs as ImageProps;\n }\n\n // determine the type\n const type = nodeType === view.state.schema.nodes.image ? ImageType.Image : ImageType.Figure;\n\n // if this is a quarto figure then remove fig-align and fig-env from attributes\n const quartoFigure = (type === ImageType.Figure) && \n editorFormat.docTypes.includes(kQuartoDocType) && \n imageAttributes;\n if (quartoFigure) {\n // fig-alt\n image.alt = pandocAttrGetKeyvalue(image, kFigAltAttrib) || \"\";\n pandocAttrRemoveKeyvalue(image, kFigAltAttrib);\n // fig-align\n image.align = pandocAttrGetKeyvalue(image, kFigAlignAttrib) || \"default\";\n pandocAttrRemoveKeyvalue(image, kFigAlignAttrib);\n // fig env\n image.env = pandocAttrGetKeyvalue(image, kFigEnvAttrib) || \"\";\n pandocAttrRemoveKeyvalue(image, kFigEnvAttrib);\n }\n\n const result = await editorUI.dialogs.editImage(\n image, dims, type === ImageType.Figure, imageAttributes\n );\n if (result) {\n // since captions support inline formatting (and the dialog doesn't) we only want \n // to update the content if the alt/caption actually changed (as it will blow away\n // formatting)\n if (type === ImageType.Figure && image.caption !== result.caption) {\n if (result.caption) {\n content = Fragment.from(view.state.schema.text(result.caption));\n } else {\n content = Fragment.empty;\n }\n }\n\n // if we have align then move into keyvalue\n if (quartoFigure) {\n // fig-alt\n if (result.alt) {\n pandocAttrSetKeyvalue(result, kFigAltAttrib, result.alt);\n } else {\n pandocAttrRemoveKeyvalue(result, kFigAltAttrib);\n }\n // fig-align\n if (result.align) {\n if (result.align !== \"default\") {\n pandocAttrSetKeyvalue(result, kFigAlignAttrib, result.align);\n } else {\n pandocAttrRemoveKeyvalue(result, kFigAlignAttrib);\n }\n }\n // fig-env\n if (result.env) {\n pandocAttrSetKeyvalue(result, kFigEnvAttrib, result.env);\n } else {\n pandocAttrRemoveKeyvalue(result, kFigEnvAttrib);\n }\n }\n\n // if we have width and height move them into keyvalue\n let keyvalue = result.keyvalue;\n if (result.units) {\n // no units for px\n const units = result.units && result.units === kPixelUnit ? '' : result.units;\n // width\n if (result.width) {\n let width = result.width;\n if (hasPercentWidth(units)) {\n width = Math.min(width, 100);\n }\n keyvalue = keyvalue || [];\n keyvalue.push([kWidthAttrib, width + units]);\n }\n // only record height if it's not % units and it's not at it's natural height\n if (result.height && units !== kPercentUnit && !isNaturalHeight(result.width, result.height, dims)) {\n keyvalue = keyvalue || [];\n keyvalue.push([kHeightAttrib, result.height + units]);\n }\n }\n\n // merge updated keyvalue\n const imageProps = { ...result, keyvalue };\n\n // update or create link mark as necessary\n if (nodeType === schema.nodes.image) {\n if (linkMark) {\n marks = linkMark.removeFromSet(marks);\n if (imageProps.linkTo) {\n linkMark = linkMark.type.create({ ...linkMark.attrs, href: imageProps.linkTo });\n }\n } else if (imageProps.linkTo) {\n linkMark = schema.marks.link.create({ href: imageProps.linkTo });\n }\n if (imageProps.linkTo && linkMark) {\n marks = linkMark.addToSet(marks);\n }\n }\n\n // create the image\n const newImage = nodeType.createAndFill(imageProps, content, marks);\n\n // insert and select\n if (newImage) {\n insertAndSelectNode(view, newImage);\n }\n }\n\n if (view) {\n view.focus();\n }\n}\n\n// wrapper for isNaturalHeight that handles potentially undefined params\nfunction isNaturalHeight(width: number | undefined, height: number | undefined, dims: ImageDimensions | null) {\n if (width && height && dims) {\n return isNaturalAspectRatio(width, height, dims, false);\n } else {\n return false;\n }\n}\n","/*\n * image-util.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView } from 'prosemirror-view';\nimport { findParentNodeClosestToPos } from 'prosemirror-utils';\n\nimport { ImageProps } from '../../api/ui-dialogs';\nimport {\n imageSizePropWithUnit,\n isValidImageSizeUnit,\n ensureContainerWidth,\n isNaturalAspectRatio,\n ImageDimensions,\n} from '../../api/image';\nimport { kWidthAttrib, kHeightAttrib, attrPartitionKeyvalue } from '../../api/pandoc_attr';\nimport { kPercentUnit, kPixelUnit } from '../../api/css';\nimport { elementInnerDimensions } from '../../api/dom';\n\nexport function imagePropsWithSizes(image: ImageProps, dims: ImageDimensions) {\n // pull width, height, and units out of keyvalue if necessary\n // (enables front-ends to provide dedicated UI for width/height)\n // note that if the value doesn't use a unit supported by the\n // UI it's kept within the original keyvalue prop\n if (image.keyvalue) {\n let width: number | undefined;\n let height: number | undefined;\n let units: string | undefined;\n let lockRatio = true;\n const partitionedKeyvalue = attrPartitionKeyvalue([kWidthAttrib, kHeightAttrib], image.keyvalue);\n for (const kv of partitionedKeyvalue.partitioned) {\n const [key, value] = kv;\n let partitioned = false;\n const sizeWithUnit = imageSizePropWithUnit(value);\n if (sizeWithUnit) {\n sizeWithUnit.unit = sizeWithUnit.unit || kPixelUnit;\n if (isValidImageSizeUnit(sizeWithUnit.unit)) {\n if (key === kWidthAttrib) {\n width = sizeWithUnit.size;\n units = sizeWithUnit.unit;\n } else if (key === kHeightAttrib) {\n height = sizeWithUnit.size;\n units = units || sizeWithUnit.unit;\n }\n partitioned = true;\n }\n }\n if (!partitioned) {\n partitionedKeyvalue.base.push(kv);\n }\n }\n if (width && height) {\n lockRatio = isNaturalAspectRatio(width, height, dims, lockRatio);\n }\n return {\n ...image,\n width,\n height,\n units,\n lockRatio,\n keyvalue: partitionedKeyvalue.base,\n };\n } else {\n return image;\n }\n}\n\nexport function imageDimensionsFromImg(img: HTMLImageElement, containerWidth: number) {\n return {\n naturalWidth: img.naturalWidth || null,\n naturalHeight: img.naturalHeight || null,\n containerWidth: ensureContainerWidth(containerWidth),\n };\n}\n\nexport function hasPercentWidth(size: string | null) {\n return !!size && size.endsWith(kPercentUnit);\n}\n\nexport function imageContainerWidth(pos: number, view: EditorView) {\n let containerWidth = (view.dom as HTMLElement).offsetWidth;\n if (containerWidth > 0) {\n if (pos) {\n const imagePos = view.state.doc.resolve(pos);\n const resizeContainer = findParentNodeClosestToPos(imagePos, nd => nd.isBlock);\n if (resizeContainer) {\n const resizeEl = view.domAtPos(resizeContainer.pos + 1);\n containerWidth = elementInnerDimensions(resizeEl.node as HTMLElement).width;\n }\n }\n }\n\n return containerWidth;\n}\n\nexport function inlineHTMLIsImage(html: string) {\n return html\n .trimLeft()\n .toLowerCase()\n .startsWith('<img');\n}\n","/*\n * image-textsel.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction, NodeSelection, Plugin, PluginKey } from 'prosemirror-state';\nimport { DecorationSet, Decoration } from 'prosemirror-view';\nimport { nodeDecoration } from '../../api/decoration';\n\nconst pluginKey = new PluginKey('image-text-selection');\n\nexport function imageTextSelectionPlugin() {\n return new Plugin<DecorationSet>({\n key: pluginKey,\n state: {\n init(_config: { [key: string]: any }, instance: EditorState) {\n return DecorationSet.empty;\n },\n apply(tr: Transaction, set: DecorationSet, oldState: EditorState, newState: EditorState) {\n // no decorations for empty or node selection\n if (tr.selection.empty || tr.selection instanceof NodeSelection) {\n return DecorationSet.empty;\n }\n\n const schema = newState.schema;\n const decorations: Decoration[] = [];\n tr.doc.nodesBetween(tr.selection.from, tr.selection.to, (node, pos) => {\n if ([schema.nodes.image, schema.nodes.figure].includes(node.type)) {\n decorations.push(nodeDecoration({ node, pos }, { class: 'pm-image-text-selection' }));\n }\n });\n\n return DecorationSet.create(tr.doc, decorations);\n },\n },\n props: {\n decorations(state: EditorState) {\n return pluginKey.getState(state);\n },\n },\n });\n}\n","/*\n * figure.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema, Fragment, ResolvedPos } from 'prosemirror-model';\nimport { Transaction } from 'prosemirror-state';\nimport { Transform } from 'prosemirror-transform';\n\nimport { findChildrenByType, findParentNodeClosestToPos } from 'prosemirror-utils';\n\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { FixupContext } from '../../api/fixup';\nimport { isSingleLineHTML } from '../../api/html';\nimport { getMarkAttrs } from '../../api/mark';\nimport {\n PandocToken,\n PandocTokenType,\n ProsemirrorWriter,\n kRawBlockContent,\n kRawBlockFormat,\n imageAttributesAvailable,\n} from '../../api/pandoc';\nimport { trTransform } from '../../api/transaction';\n\nimport {\n imageAttrsFromDOM,\n imageNodeAttrsSpec,\n imageDOMOutputSpec,\n imagePandocOutputWriter,\n pandocImageHandler,\n imageAttrsFromHTML,\n imageCommand,\n} from './image';\nimport { inlineHTMLIsImage } from './image-util';\nimport { imageNodeViewPlugins } from './image-view';\nimport { figureKeys } from './figure-keys';\n\nconst extension = (context: ExtensionContext): Extension => {\n const { pandocExtensions, ui, events, format } = context;\n\n const imageAttr = imageAttributesAvailable(pandocExtensions);\n\n return {\n nodes: [\n {\n name: 'figure',\n spec: {\n attrs: imageNodeAttrsSpec(true, imageAttr),\n content: 'inline*',\n group: 'block',\n draggable: true,\n selectable: true,\n defining: true,\n parseDOM: [\n {\n tag: 'figure',\n contentElement: 'figcaption',\n getAttrs(dom: Node | string) {\n const el = dom as Element;\n const img = el.querySelector('img');\n if (img && img.parentNode === dom) {\n return imageAttrsFromDOM(img, imageAttr);\n } else {\n return {\n src: null,\n title: null,\n };\n }\n },\n },\n ],\n toDOM(node: ProsemirrorNode) {\n return ['figure', imageDOMOutputSpec(node, imageAttr), ['figcaption', { class: 'pm-figcaption' }, 0]];\n },\n },\n pandoc: {\n writer: imagePandocOutputWriter(true, ui),\n\n // intercept paragraphs with a single image and process them as figures\n blockReader: (schema: Schema, tok: PandocToken, writer: ProsemirrorWriter) => {\n // helper to process html image\n const handleHTMLImage = (html: string) => {\n const attrs = imageAttrsFromHTML(html);\n if (attrs) {\n attrs.raw = true;\n writer.addNode(schema.nodes.figure, attrs, []);\n return true;\n } else {\n return false;\n }\n };\n\n // unroll figure from paragraph with single image\n if (isParaWrappingFigure(tok) && !writerHasProhibitedFigureParent(schema, writer)) {\n const handler = pandocImageHandler(true, imageAttr)(schema);\n handler(writer, tok.c[0]);\n return true;\n // unroll figure from html RawBlock with single <img> tag\n } else if (isHTMLImageBlock(tok)) {\n return handleHTMLImage(tok.c[kRawBlockContent]);\n } else {\n return false;\n }\n },\n },\n\n attr_edit: () => ({\n type: (schema: Schema) => schema.nodes.figure,\n editFn: () => imageCommand(ui, format, imageAttr),\n offset: {\n top: 2,\n right: 0\n },\n noKeyvalueTags: true,\n preferHidden: true\n }),\n },\n ],\n\n fixups: (_schema: Schema) => {\n return [\n (tr: Transaction, fixupContext: FixupContext) => {\n if (fixupContext === FixupContext.Load) {\n return convertImagesToFigure(tr);\n } else {\n return tr;\n }\n },\n ];\n },\n\n appendTransaction: (schema: Schema) => {\n return [\n {\n name: 'figure-convert',\n nodeFilter: node => node.type === schema.nodes.image,\n append: convertImagesToFigure,\n },\n ];\n },\n\n baseKeys: figureKeys,\n\n plugins: (schema: Schema) => {\n return [...imageNodeViewPlugins('figure', ui, format, events, pandocExtensions)];\n },\n };\n};\n\nexport function posHasProhibitedFigureParent(schema: Schema, $pos: ResolvedPos) {\n return prohibitedFigureParents(schema).some(type => {\n return !!findParentNodeClosestToPos($pos, node => node.type === type);\n });\n}\n\nexport function writerHasProhibitedFigureParent(schema: Schema, writer: ProsemirrorWriter) {\n return prohibitedFigureParents(schema).some(writer.isNodeOpen);\n}\n\nfunction prohibitedFigureParents(schema: Schema) {\n return [schema.nodes.table_cell, schema.nodes.list_item, schema.nodes.definition_list];\n}\n\nfunction convertImagesToFigure(tr: Transaction) {\n return trTransform(tr, imagesToFiguresTransform);\n}\n\nfunction imagesToFiguresTransform(tr: Transform) {\n const schema = tr.doc.type.schema;\n const images = findChildrenByType(tr.doc, schema.nodes.image);\n images.forEach(image => {\n // position reflecting steps already taken in this handler\n const mappedImagePos = tr.mapping.mapResult(image.pos);\n\n // process image so long as it wasn't deleted by a previous step\n if (!mappedImagePos.deleted) {\n // resolve image pos\n const imagePos = tr.doc.resolve(mappedImagePos.pos);\n\n // if it's an image in a standalone paragraph, convert it to a figure\n if (\n imagePos.parent.type === schema.nodes.paragraph &&\n imagePos.parent.childCount === 1 &&\n !posHasProhibitedFigureParent(schema, imagePos)\n ) {\n // figure attributes\n const attrs = image.node.attrs;\n\n // extract linkTo from link mark (if any)\n if (schema.marks.link.isInSet(image.node.marks)) {\n const linkAttrs = getMarkAttrs(\n tr.doc,\n { from: mappedImagePos.pos, to: mappedImagePos.pos + image.node.nodeSize },\n schema.marks.link,\n );\n if (linkAttrs && linkAttrs.href) {\n attrs.linkTo = linkAttrs.href;\n }\n }\n\n // figure content\n const content = attrs.caption ? Fragment.from(schema.text(attrs.caption)) : Fragment.empty;\n\n // replace image with figure\n const figure = schema.nodes.figure.createAndFill(attrs, content);\n if (figure) {\n tr.replaceRangeWith(mappedImagePos.pos, mappedImagePos.pos + image.node.nodeSize, figure);\n }\n }\n }\n });\n}\n\nfunction isParaWrappingFigure(tok: PandocToken) {\n return isSingleChildParagraph(tok) && tok.c[0].t === PandocTokenType.Image;\n}\n\nfunction isHTMLImageBlock(tok: PandocToken) {\n if (tok.t === PandocTokenType.RawBlock) {\n const format = tok.c[kRawBlockFormat];\n const text = tok.c[kRawBlockContent] as string;\n return format === 'html' && isSingleLineHTML(text) && inlineHTMLIsImage(text);\n } else {\n return false;\n }\n}\n\nfunction isSingleChildParagraph(tok: PandocToken) {\n return tok.t === PandocTokenType.Para && tok.c && tok.c.length === 1;\n}\n\nexport default extension;\n","/*\n * decoration.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { NodeWithPos } from 'prosemirror-utils';\nimport { DecorationAttrs, Decoration } from 'prosemirror-view';\n\nexport function nodeDecoration(nodeWithPos: NodeWithPos, attrs: DecorationAttrs) {\n return Decoration.node(nodeWithPos.pos, nodeWithPos.pos + nodeWithPos.node.nodeSize, attrs);\n}\n","/*\n * image-view.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { NodeView, EditorView } from 'prosemirror-view';\nimport { NodeSelection, PluginKey, Plugin } from 'prosemirror-state';\n\nimport { EditorUI } from '../../api/ui';\nimport { ImageType } from '../../api/image';\nimport { PandocExtensions, imageAttributesAvailable } from '../../api/pandoc';\nimport { isElementVisible } from '../../api/dom';\nimport { EditorEvents } from '../../api/events';\nimport { ResizeEvent } from '../../api/event-types';\nimport { EditorFormat } from '../../api/format';\n\nimport { imageDialog } from './image-dialog';\nimport {\n attachResizeUI,\n initResizeContainer,\n ResizeUI,\n isResizeUICompatible,\n updateImageViewSize,\n} from './image-resize';\nimport { imageDimensionsFromImg, imageContainerWidth } from './image-util';\n\nimport './image-styles.css';\n\nexport function imageNodeViewPlugins(\n type: string,\n ui: EditorUI,\n format: EditorFormat,\n events: EditorEvents,\n pandocExtensions: PandocExtensions,\n): Plugin[] {\n return [\n new Plugin({\n key: new PluginKey(`${type}-node-view`),\n props: {\n nodeViews: {\n [type]: (node: ProsemirrorNode, view: EditorView, getPos: boolean | (() => number)) => {\n return new ImageNodeView(node, view, getPos as () => number, ui, format, events, pandocExtensions);\n },\n },\n },\n }),\n ];\n}\n\nclass ImageNodeView implements NodeView {\n // ProseMirror context\n private readonly type: ImageType;\n private node: ProsemirrorNode;\n private readonly view: EditorView;\n private readonly getPos: () => number;\n private readonly editorUI: EditorUI;\n private readonly editorFormat: EditorFormat;\n private readonly imageAttributes: boolean;\n private readonly implicitFigures: boolean;\n\n // DOM elements\n public readonly dom: HTMLElement;\n private readonly img: HTMLImageElement;\n public readonly contentDOM: HTMLElement | null;\n private readonly figcaption: HTMLElement | null;\n\n // transient state\n private imgBroken: boolean;\n\n // things to clean up\n private resizeUI: ResizeUI | null;\n private sizeOnVisibleTimer?: number;\n private unregisterOnResize: VoidFunction;\n private unregisterWatchImg: VoidFunction | null = null;\n\n constructor(\n node: ProsemirrorNode,\n view: EditorView,\n getPos: () => number,\n editorUI: EditorUI,\n editorFormat: EditorFormat,\n editorEvents: EditorEvents,\n pandocExtensions: PandocExtensions,\n ) {\n // determine type\n const schema = node.type.schema;\n this.type = node.type === schema.nodes.image ? ImageType.Image : ImageType.Figure;\n\n // save references\n this.node = node;\n this.view = view;\n this.getPos = getPos;\n this.imageAttributes = imageAttributesAvailable(pandocExtensions);\n this.implicitFigures = pandocExtensions.implicit_figures;\n this.editorUI = editorUI;\n this.editorFormat = editorFormat;\n this.resizeUI = null;\n this.imgBroken = false;\n\n // set node selection on click\n const selectOnClick = () => {\n const tr = view.state.tr;\n tr.setSelection(NodeSelection.create(view.state.doc, getPos()));\n view.dispatch(tr);\n };\n\n // show image dialog on double-click\n const editOnDblClick = () => {\n selectOnClick();\n imageDialog(\n this.node,\n imageDimensionsFromImg(this.img, this.containerWidth()),\n this.node.type,\n this.view,\n editorUI,\n editorFormat,\n this.imageAttributes,\n );\n };\n\n // stop propagation from child elmeents that need to handle click\n // (e.g. figcaption element)\n const noPropagateClick = (ev: MouseEvent) => {\n ev.stopPropagation();\n };\n\n // create the image (used by both image and figure node types)\n this.img = document.createElement('img');\n this.img.classList.add('pm-img');\n this.img.onload = () => {\n this.imgBroken = false;\n };\n this.img.onerror = () => {\n this.imgBroken = true;\n };\n this.img.onclick = selectOnClick;\n this.img.ondblclick = editOnDblClick;\n\n // wrap in figure if appropriate\n if (this.type === ImageType.Figure) {\n // create figure wrapper\n this.dom = document.createElement('figure');\n this.dom.classList.add('pm-figure');\n\n // create container\n const container = document.createElement('div');\n container.contentEditable = 'false';\n this.dom.append(container);\n\n // initialize the image\n container.append(this.img);\n this.updateImg();\n\n // create the caption and make it our contentDOM\n this.figcaption = document.createElement('figcaption');\n this.figcaption.classList.add('pm-figcaption');\n this.figcaption.classList.add('pm-node-caption');\n this.figcaption.onclick = noPropagateClick;\n this.figcaption.ondblclick = noPropagateClick;\n this.contentDOM = this.figcaption;\n this.dom.append(this.figcaption);\n\n // manage visibility\n this.manageFigcaption();\n\n // standard inline image\n } else {\n this.dom = document.createElement('span');\n\n this.dom.append(this.img);\n this.updateImg();\n\n this.contentDOM = null;\n this.figcaption = null;\n }\n\n // prevent drag/drop if the event doesn't target the image\n this.dom.ondragstart = (event: DragEvent) => {\n if (event.target !== this.img) {\n event.preventDefault();\n event.stopPropagation();\n }\n };\n\n // init resize if we support imageAttributes\n if (this.imageAttributes) {\n initResizeContainer(this.dom);\n }\n\n // update image size when the image first becomes visible\n this.updateSizeOnVisible();\n\n // update image size whenever the container is resized\n this.unregisterOnResize = editorEvents.subscribe(ResizeEvent, () => {\n this.updateImageSize();\n });\n }\n\n public destroy() {\n if (this.unregisterWatchImg) {\n this.unregisterWatchImg();\n }\n this.unregisterOnResize();\n this.clearSizeOnVisibleTimer();\n this.detachResizeUI();\n }\n\n public selectNode() {\n // mirror default implementation\n this.dom.classList.add('ProseMirror-selectednode');\n if (this.contentDOM || !this.node.type.spec.draggable) {\n this.dom.draggable = true;\n }\n\n // manage figcaption\n this.manageFigcaption();\n\n // attach resize UI\n this.attachResizeUI();\n }\n\n public deselectNode() {\n // mirror default implementation\n this.dom.classList.remove('ProseMirror-selectednode');\n if (this.contentDOM || !this.node.type.spec.draggable) {\n this.dom.draggable = false;\n }\n\n // remove resize UI\n this.detachResizeUI();\n }\n\n // update image with latest node/attributes\n public update(node: ProsemirrorNode) {\n // boilerplate type check\n if (node.type !== this.node.type) {\n return false;\n }\n\n // set new node and update the image\n this.node = node;\n this.updateImg();\n\n // if we already have resize UI then either update it\n // or detach it (if e.g. the units are no longer compatible)\n if (this.resizeUI) {\n if (isResizeUICompatible(this.img!)) {\n this.resizeUI.update();\n } else {\n this.resizeUI.detach();\n this.resizeUI = null;\n }\n // attach if the node is selected\n } else if (this.isNodeSelected()) {\n this.attachResizeUI();\n }\n return true;\n }\n\n // ignore mutations outside of the content dom so sizing actions don't cause PM re-render\n public ignoreMutation(mutation: MutationRecord | { type: 'selection'; target: Element }) {\n return !this.contentDOM || !this.contentDOM.contains(mutation.target);\n }\n\n // map node to img tag\n private updateImg() {\n // unsubscribe from any existing resource watcher\n if (this.unregisterWatchImg) {\n this.unregisterWatchImg();\n }\n\n // map to path reachable within current editing frame\n const src = this.node.attrs.src;\n this.img.src = this.editorUI.context.mapResourceToURL(src);\n\n // if this is a local resource then watch it and update when it changes\n if (!src.match(/^\\w+:\\/\\//)) {\n this.unregisterWatchImg = this.editorUI.context.watchResource(src, () => {\n this.img.src = this.editorUI.context.mapResourceToURL(src);\n });\n }\n\n // title/tooltip\n this.img.title = '';\n if (this.node.attrs.title) {\n this.img.title = this.node.attrs.title;\n }\n\n // ensure alt attribute so that we get default browser broken image treatment\n this.img.alt = this.node.textContent || this.node.attrs.src;\n\n // manage caption visibility\n this.manageFigcaption();\n\n // update size\n this.updateImageSize();\n }\n\n private updateImageSize() {\n const containerWidth = this.img.isConnected ? this.containerWidth() : 0;\n updateImageViewSize(this.node, this.img, this.isFigure() ? this.dom : null, containerWidth);\n }\n\n private updateSizeOnVisible() {\n const updateSizeOnVisible = () => {\n if (isElementVisible(this.img)) {\n this.updateImageSize();\n this.clearSizeOnVisibleTimer();\n }\n };\n this.sizeOnVisibleTimer = window.setInterval(updateSizeOnVisible, 200);\n }\n\n private clearSizeOnVisibleTimer() {\n if (this.sizeOnVisibleTimer) {\n clearInterval(this.sizeOnVisibleTimer);\n this.sizeOnVisibleTimer = undefined;\n }\n }\n\n // attach resize UI if appropriate\n private attachResizeUI() {\n if (this.imageAttributes && !this.imgBroken && isResizeUICompatible(this.img!)) {\n const imageNode = () => ({ pos: this.getPos(), node: this.node });\n const imgContainerWidth = () => this.containerWidth();\n this.resizeUI = attachResizeUI(imageNode, this.dom, this.img!, imgContainerWidth, \n this.view, this.editorUI, this.editorFormat);\n }\n }\n\n private detachResizeUI() {\n if (this.resizeUI) {\n this.resizeUI.detach();\n this.resizeUI = null;\n }\n }\n\n private isNodeSelected() {\n return this.dom.classList.contains('ProseMirror-selectednode');\n }\n\n private isFigure() {\n return this.type === ImageType.Figure;\n }\n\n private containerWidth() {\n return imageContainerWidth(this.getPos(), this.view);\n }\n\n private manageFigcaption() {\n // hide the figcaption if appropriate\n const noImplicitFigures = !this.implicitFigures;\n const emptyFigcaption = this.figcaption && this.node.textContent.length === 0;\n const selection = this.view.state.selection;\n const selectionInFigcaption = selection.empty && selection.$head.node() === this.node;\n const hide = noImplicitFigures || (emptyFigcaption && !selectionInFigcaption);\n\n // hide or show if we have a figcaption\n if (this.figcaption) {\n if (noImplicitFigures) {\n this.figcaption.style.display = 'none';\n this.figcaption.contentEditable = 'false';\n } else {\n this.figcaption.contentEditable = hide ? 'false' : 'true';\n this.figcaption.style.height = hide ? '0' : '';\n this.figcaption.style.minHeight = hide ? '0' : '';\n this.figcaption.style.margin = hide ? '0' : '';\n }\n }\n }\n}\n","/*\n * image-resize.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView } from 'prosemirror-view';\nimport { NodeWithPos } from 'prosemirror-utils';\nimport { NodeSelection } from 'prosemirror-state';\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport {\n createPopup,\n createHorizontalPanel,\n addHorizontalPanelCell,\n createInputLabel,\n createImageButton,\n createCheckboxInput,\n createSelectInput,\n createTextInput,\n} from '../../api/widgets/widgets';\nimport { EditorUI } from '../../api/ui';\nimport { editingRootScrollContainerElement } from '../../api/node';\nimport { extractSizeStyles, kPercentUnit, kPixelUnit, removeStyleAttrib } from '../../api/css';\nimport {\n imageSizePropWithUnit,\n isNaturalAspectRatio,\n unitToPixels,\n pixelsToUnit,\n roundUnit,\n kValidUnits,\n isValidImageSizeUnit,\n} from '../../api/image';\nimport { kWidthAttrib, kHeightAttrib, kStyleAttrib, kAlignAttrib, kFigAlignAttrib, pandocAttrGetKeyvalue } from '../../api/pandoc_attr';\nimport { EditorUIImages } from '../../api/ui-images';\nimport { EditorFormat } from '../../api/format';\n\nimport { imageDialog } from './image-dialog';\nimport { hasPercentWidth, imageDimensionsFromImg } from './image-util';\n\nconst kDataWidth = 'data-width';\nconst kDataHeight = 'data-height';\n\nconst kDefaultContainerDisplay = 'inline-block';\n\nexport function initResizeContainer(container: HTMLElement) {\n // add standard parent class\n container.classList.add('pm-image-resize-container', 'pm-selected-node-outline-color');\n\n // so that we are the offsetParent for the resize handles and shelf\n container.style.position = 'relative';\n\n // so that the container matches the size of the contained image\n container.style.display = kDefaultContainerDisplay;\n\n // so that the handles and shelf can be visible outside the boundaries of the image\n container.style.overflow = 'visible';\n\n // return for convenience\n return container;\n}\n\nexport function isResizeUICompatible(img: HTMLImageElement) {\n // incompatible if it has a width, but not a data-width\n const incompatibleWidth = img.style.width && !img.hasAttribute(kDataWidth);\n\n // incompatible if it has a height, but not a data-height\n const incompatibleHeight = img.style.height && img.style.height !== 'auto' && !img.hasAttribute(kDataHeight);\n\n return !incompatibleWidth && !incompatibleHeight;\n}\n\nexport interface ResizeUI {\n update: () => void;\n detach: () => void;\n}\n\nexport function attachResizeUI(\n imageNode: () => NodeWithPos,\n container: HTMLElement,\n img: HTMLImageElement,\n imgContainerWidth: () => number,\n view: EditorView,\n ui: EditorUI,\n format: EditorFormat\n): ResizeUI {\n // indicate that resize ui is active\n container.classList.add('pm-image-resize-active');\n\n // sync current state of shelf to node\n const updateImageNodeFromShelf = () => {\n updateImageNodeSize(\n view,\n imageNode(),\n img,\n imgContainerWidth,\n shelf.props.width(),\n shelf.props.height(),\n shelf.props.units(),\n );\n };\n\n // shelf init\n const onInitShelf = () => {\n // sync props\n shelf.sync();\n\n // default for lockRatio based on naturalWidth/naturalHeight\n const dims = imageDimensionsFromImg(img, imgContainerWidth());\n shelf.props.setLockRatio(isNaturalAspectRatio(shelf.props.width(), shelf.props.height(), dims, true));\n };\n\n // handle width changed from shelf\n const onWidthChanged = () => {\n const width = shelf.props.width();\n const height = shelf.props.lockRatio() ? (img.offsetHeight / img.offsetWidth) * width : shelf.props.height();\n shelf.props.setHeight(height);\n updateImageNodeFromShelf();\n };\n\n // handle height changed from shelf\n const onHeightChanged = () => {\n const height = shelf.props.height();\n const width = shelf.props.lockRatio() ? (img.offsetWidth / img.offsetHeight) * height : shelf.props.width();\n shelf.props.setWidth(width);\n updateImageNodeFromShelf();\n };\n\n // do necessary unit conversion when the units change\n const onUnitsChanged = () => {\n const prevUnits = shelfSizeFromImage(img).unit;\n const containerWidth = imgContainerWidth();\n\n const width = shelf.props.width();\n const widthPixels = unitToPixels(width, prevUnits, containerWidth);\n let widthInUnits = pixelsToUnit(widthPixels, shelf.props.units(), containerWidth);\n if (hasPercentWidth(shelf.props.units()) && widthInUnits > 100) {\n widthInUnits = 100;\n }\n shelf.props.setWidth(widthInUnits);\n\n const height = shelf.props.height();\n const heightPixels = unitToPixels(height, prevUnits, containerWidth);\n shelf.props.setHeight(pixelsToUnit(heightPixels, shelf.props.units(), containerWidth));\n\n updateImageNodeFromShelf();\n };\n\n // handle editImage request from shelf\n const onEditImage = () => {\n const nodeWithPos = imageNode();\n imageDialog(\n nodeWithPos.node,\n imageDimensionsFromImg(img, imgContainerWidth()),\n nodeWithPos.node.type,\n view,\n ui,\n format,\n true,\n );\n };\n\n // create resize shelf\n const shelf = resizeShelf(\n view,\n container,\n img,\n onInitShelf,\n onWidthChanged,\n onHeightChanged,\n onUnitsChanged,\n onEditImage,\n ui.images,\n ui.context.translateText,\n );\n\n // create resize handle and add it to the container\n const handle = resizeHandle(\n img,\n imageNode,\n container,\n imgContainerWidth,\n shelf.props.lockRatio,\n shelf.props.units,\n shelf.sync,\n updateImageNodeFromShelf,\n );\n container.append(handle);\n\n // return functions that can be used to update and detach the ui\n return {\n update: () => {\n shelf.sync();\n },\n detach: () => {\n container.classList.remove('pm-image-resize-active');\n handle.remove();\n shelf.remove();\n },\n };\n}\n\nfunction resizeShelf(\n view: EditorView,\n container: HTMLElement,\n img: HTMLImageElement,\n onInit: () => void,\n onWidthChanged: () => void,\n onHeightChanged: () => void,\n onUnitsChanged: () => void,\n onEditImage: () => void,\n uiImages: EditorUIImages,\n translateText: (text: string) => string,\n) {\n // create resize shelf\n const shelf = createPopup(view, []);\n\n // add the shelf to the editor container (so we don't mutate the editor dom)\n const editorContainer = view.dom.parentNode as HTMLElement;\n editorContainer.appendChild(shelf);\n\n // update shelf absolute position to make sure it's visible\n const updatePosition = () => {\n const kShelfRequiredSize = 333;\n const editorBox = editorContainer.getBoundingClientRect();\n const imageBox = container.getBoundingClientRect();\n shelf.style.top = imageBox.top - editorBox.top + imageBox.height + 6 + 'px';\n const positionLeft = imageBox.left + kShelfRequiredSize < editorBox.right;\n if (positionLeft) {\n shelf.style.right = '';\n shelf.style.left = imageBox.left - editorBox.left + 'px';\n } else {\n shelf.style.left = '';\n shelf.style.right = editorBox.right - imageBox.right + 'px';\n }\n };\n\n // detect when the editing root note scrolls and update the position\n const editingScrollContainerEl = editingRootScrollContainerElement(view);\n if (editingScrollContainerEl) {\n editingScrollContainerEl.addEventListener('scroll', updatePosition);\n }\n\n // update position every 50ms (cleanup drag/drop copy/paste mispositioning)\n const positionTimer = setInterval(updatePosition, 50);\n\n // main panel that holds the controls\n const panel = createHorizontalPanel();\n shelf.append(panel);\n const addToPanel = (widget: HTMLElement, paddingRight: number) => {\n addHorizontalPanelCell(panel, widget);\n if (paddingRight) {\n const paddingSpan = window.document.createElement('span');\n paddingSpan.style.width = paddingRight + kPixelUnit;\n addHorizontalPanelCell(panel, paddingSpan);\n }\n };\n\n // width\n const inputClasses = ['pm-text-color', 'pm-background-color'];\n const wLabel = createInputLabel('w:');\n addToPanel(wLabel, 4);\n const wInput = createTextInput(4, inputClasses);\n wInput.onchange = onWidthChanged;\n addToPanel(wInput, 8);\n\n // height\n const kHeightWidth = '38px';\n const hLabel = createInputLabel('h:');\n addToPanel(hLabel, 4);\n const hInput = createTextInput(4, inputClasses, { width: kHeightWidth });\n hInput.onchange = onHeightChanged;\n addToPanel(hInput, 0);\n const hAutoLabel = createInputLabel('(auto)', ['pm-light-text-color'], { width: kHeightWidth });\n addToPanel(hAutoLabel, 10);\n\n // units\n const unitsSelect = createSelectInput(kValidUnits, inputClasses);\n unitsSelect.onchange = () => {\n // drive focus to width and back to prevent wierd selection change\n // detection condition that causes PM to re-render the node the\n // next time we resize it\n wInput.focus();\n unitsSelect.focus();\n\n // manage UI\n manageUnitsUI();\n\n // notify client\n onUnitsChanged();\n };\n addToPanel(unitsSelect, 12);\n\n // lock ratio\n const checkboxWrapper = window.document.createElement('div');\n const lockCheckbox = createCheckboxInput();\n lockCheckbox.checked = true;\n checkboxWrapper.append(lockCheckbox);\n addToPanel(checkboxWrapper, 4);\n const lockLabel = createInputLabel(translateText('Lock ratio'));\n addToPanel(lockLabel, 20);\n\n // edit button\n const editImage = createImageButton(\n uiImages.properties!,\n ['pm-image-button-edit-properties'],\n translateText('Edit Attributes'),\n );\n editImage.onclick = onEditImage;\n addHorizontalPanelCell(panel, editImage);\n\n // run onInit (wait for image to load if necessary)\n if (img.complete) {\n setTimeout(onInit, 0);\n } else {\n img.onload = onInit;\n }\n\n // function used to manage units ui (percent vs. non-percent)\n const manageUnitsUI = () => {\n const percentSizing = unitsSelect.value === kPercentUnit;\n\n if (percentSizing) {\n lockCheckbox.checked = true;\n lockCheckbox.disabled = true;\n } else {\n lockCheckbox.disabled = false;\n }\n\n hInput.style.display = percentSizing ? 'none' : '';\n hAutoLabel.style.display = percentSizing ? '' : 'none';\n };\n manageUnitsUI();\n\n // helper function to get a dimension (returns null if input not currently valid)\n const getDim = (input: HTMLInputElement) => {\n const value = parseFloat(input.value);\n if (isNaN(value)) {\n return null;\n }\n if (value > 0) {\n return value;\n } else {\n return null;\n }\n };\n\n const setWidth = (width: number) => {\n wInput.value = roundUnit(width, unitsSelect.value);\n };\n const setHeight = (height: number) => {\n hInput.value = roundUnit(height, unitsSelect.value);\n };\n\n return {\n // shelf element\n el: shelf,\n\n // sync the shelf props to the current size/units of the image\n // we don't sync to the node b/c we want to benefit from automatic\n // unit handling in the conversion to the DOM\n sync: () => {\n const size = shelfSizeFromImage(img);\n unitsSelect.value = size.unit;\n setWidth(size.width);\n setHeight(size.height);\n\n // manage units ui\n manageUnitsUI();\n\n // ensure we are positioned correctly (not offscreen, wide enough, etc.)\n updatePosition();\n },\n\n position: () => {\n updatePosition();\n },\n\n remove: () => {\n if (editingScrollContainerEl) {\n editingScrollContainerEl.removeEventListener('scroll', updatePosition);\n }\n clearInterval(positionTimer);\n shelf.remove();\n },\n\n props: {\n width: () => getDim(wInput) || shelfSizeFromImage(img).width,\n setWidth,\n height: () => getDim(hInput) || shelfSizeFromImage(img).height,\n setHeight,\n units: () => unitsSelect.value,\n setUnits: (units: string) => (unitsSelect.value = units),\n lockRatio: () => lockCheckbox.checked,\n setLockRatio: (lock: boolean) => {\n if (!lockCheckbox.disabled) {\n lockCheckbox.checked = lock;\n }\n },\n },\n };\n}\n\nfunction resizeHandle(\n img: HTMLImageElement,\n imageNode: () => NodeWithPos,\n container: HTMLElement,\n imgContainerWidth: () => number,\n lockRatio: () => boolean,\n units: () => string,\n onSizing: () => void,\n onSizingComplete: () => void,\n) {\n const handle = document.createElement('span');\n handle.contentEditable = 'false';\n handle.classList.add('pm-image-resize-handle', 'pm-background-color', 'pm-selected-node-border-color');\n handle.style.position = 'absolute';\n handle.style.bottom = '-6px';\n handle.style.right = '-6px';\n handle.style.cursor = 'nwse-resize';\n\n const havePointerEvents = !!document.body.setPointerCapture;\n\n const onPointerDown = (ev: MouseEvent) => {\n ev.preventDefault();\n\n const startWidth = img.offsetWidth;\n const startHeight = img.offsetHeight;\n\n const startX = ev.pageX;\n const startY = ev.pageY;\n\n const containerWidth = imgContainerWidth();\n\n const onPointerMove = (e: MouseEvent) => {\n // detect pointer movement\n const movedX = e.pageX - startX;\n const movedY = e.pageY - startY;\n\n let width;\n let height;\n if (lockRatio()) {\n if (movedX >= movedY) {\n width = startWidth + movedX;\n height = startHeight + movedX * (startHeight / startWidth);\n } else {\n height = startHeight + movedY;\n width = startWidth + movedY * (startWidth / startHeight);\n }\n } else {\n width = startWidth + movedX;\n height = startHeight + movedY;\n }\n\n // determine the new width in units. If it's percent and > 100 then clip\n const widthInUnits = pixelsToUnit(width, units(), containerWidth);\n if (hasPercentWidth(units()) && widthInUnits > 100) {\n width = containerWidth;\n height = width * (startHeight / startWidth);\n }\n\n // set margins for any alignment we have\n const align = pandocAttrGetKeyvalue(imageNode().node.attrs, kFigAlignAttrib);\n if (align) {\n setMarginsForAlignment(container, align, width, containerWidth);\n }\n\n img.style.width = width + kPixelUnit;\n img.setAttribute(kDataWidth, pixelsToUnit(width, units(), containerWidth) + units());\n img.style.height = height + kPixelUnit;\n img.setAttribute(kDataHeight, pixelsToUnit(height, units(), containerWidth) + units());\n\n onSizing();\n };\n\n const onPointerUp = (e: MouseEvent) => {\n e.preventDefault();\n\n // stop listening to events\n if (havePointerEvents) {\n handle.releasePointerCapture((e as PointerEvent).pointerId);\n handle.removeEventListener('pointermove', onPointerMove);\n handle.removeEventListener('pointerup', onPointerUp);\n } else {\n document.removeEventListener('mousemove', onPointerMove);\n document.removeEventListener('mouseup', onPointerUp);\n }\n\n // update image size\n onSizingComplete();\n };\n\n if (havePointerEvents) {\n handle.setPointerCapture((ev as PointerEvent).pointerId);\n handle.addEventListener('pointermove', onPointerMove);\n handle.addEventListener('pointerup', onPointerUp);\n } else {\n document.addEventListener('mousemove', onPointerMove);\n document.addEventListener('mouseup', onPointerUp);\n }\n };\n\n if (havePointerEvents) {\n handle.addEventListener('pointerdown', onPointerDown);\n } else {\n handle.addEventListener('mousedown', onPointerDown);\n }\n\n return handle;\n}\n\n// derive the shelf size attributes from the image. takes advantage of any data-width\n// or data-height attributes, then falls back to actual offsetWidth/offsetHeight\n// as necessary\nfunction shelfSizeFromImage(img: HTMLImageElement) {\n // get attributes\n const width = img.getAttribute(kDataWidth);\n const height = img.getAttribute(kDataHeight);\n\n // if there is no width and no height, then use naturalWidth/naturalHeight\n if (!width && !height) {\n return {\n width: img.naturalWidth || img.offsetWidth,\n height: img.naturalHeight || img.offsetHeight,\n unit: kPixelUnit,\n };\n\n // read units\n } else {\n let widthWithUnit = imageSizePropWithUnit(width);\n let heightWithUnit = imageSizePropWithUnit(height);\n\n if (!widthWithUnit) {\n widthWithUnit = {\n size: heightWithUnit!.size * (img.offsetWidth / img.offsetHeight),\n unit: heightWithUnit!.unit,\n };\n }\n\n if (!heightWithUnit) {\n heightWithUnit = {\n size: widthWithUnit.size * (img.offsetHeight / img.offsetWidth),\n unit: widthWithUnit.unit,\n };\n }\n\n return {\n width: widthWithUnit.size,\n height: heightWithUnit.size,\n unit: widthWithUnit.unit,\n };\n }\n}\n\nfunction updateImageNodeSize(\n view: EditorView,\n image: NodeWithPos,\n img: HTMLImageElement,\n imgContainerWidth: () => number,\n width: number,\n height: number,\n unit: string,\n) {\n // don't write pixels explicitly\n unit = unit === kPixelUnit ? '' : unit;\n\n // edit width & height in keyvalue\n let keyvalue = extractSizeStyles(image.node.attrs.keyvalue as Array<[string, string]>)!;\n keyvalue = keyvalue.filter(value => ![kWidthAttrib, kHeightAttrib].includes(value[0]));\n keyvalue.push([kWidthAttrib, width + unit]);\n const dims = imageDimensionsFromImg(img, imgContainerWidth());\n if (!hasPercentWidth(width + unit) && !isNaturalAspectRatio(width, height, dims, false)) {\n keyvalue.push([kHeightAttrib, height + unit]);\n }\n\n // create transaction\n const tr = view.state.tr;\n\n // set new attributes\n tr.setNodeMarkup(image.pos, image.node.type, { ...image.node.attrs, keyvalue });\n\n // restore node selection if our tr.setNodeMarkup blew away the selection\n const prevState = view.state;\n if (prevState.selection instanceof NodeSelection && prevState.selection.from === image.pos) {\n tr.setSelection(NodeSelection.create(tr.doc, image.pos));\n }\n\n // dispatch transaction\n view.dispatch(tr);\n}\n\n// update the DOM representation of the image. extracts size-oriented attributes from the node and\n// applies them to the img element (alignment oriented attributes are applied to the figure elmenet)\nexport function updateImageViewSize(\n node: ProsemirrorNode,\n img: HTMLImageElement,\n figure: HTMLElement | null,\n containerWidth: number,\n) {\n // reset attributes (they'll be set to new values below)\n img.removeAttribute(kStyleAttrib);\n img.removeAttribute(kDataWidth);\n img.removeAttribute(kDataHeight);\n\n // reset figure styles (only reset styles that we explicitly set below, b/c some\n // styles may have been set by e.g. the attachResizeUI function)\n if (figure) {\n figure.style.cssFloat = '';\n figure.style.verticalAlign = '';\n figure.style.margin = '';\n figure.style.marginTop = '';\n figure.style.marginBottom = '';\n figure.style.marginRight = '';\n figure.style.marginLeft = '';\n figure.style.padding = '';\n figure.style.paddingTop = '';\n figure.style.paddingBottom = '';\n figure.style.paddingRight = '';\n figure.style.paddingLeft = '';\n figure.style.display = kDefaultContainerDisplay;\n }\n\n // apply keyvalue attribute to image\n if (node.attrs.keyvalue) {\n // factor width & height out of style\n const keyvalue = extractSizeStyles(node.attrs.keyvalue);\n\n // inspect all keys and process width, height, and style\n (keyvalue as Array<[string, string]>).forEach(attr => {\n // alias key and value\n const key = attr[0];\n let value = attr[1];\n\n // set align oriented styles on figure parent\n if (key === kStyleAttrib) {\n if (figure) {\n const liftStyle = (attrib: string, val: string) => figure.style.setProperty(attrib, val);\n value = removeStyleAttrib(value, 'float', liftStyle);\n value = removeStyleAttrib(value, 'vertical-align', liftStyle);\n value = removeStyleAttrib(value, 'padding(?:[\\\\w\\\\-])*', liftStyle);\n removeStyleAttrib(value, 'display', liftStyle); // leave display for lifting by image\n }\n\n // apply selected other styles to the image view (we don't just forward the entire\n // style attribute b/c that would interfere with setting of style props in the\n // width and height cases below). here we should enumerate all styles we think\n // users might want to see in the editor\n const liftImgStyle = (attrib: string, val: string) => img.style.setProperty(attrib, val);\n value = removeStyleAttrib(value, 'border(?:[\\\\w\\\\-])*', liftImgStyle);\n value = removeStyleAttrib(value, 'margin(?:[\\\\w\\\\-])*', liftImgStyle);\n value = removeStyleAttrib(value, 'display', liftImgStyle);\n } else if (key === kWidthAttrib) {\n // see if this is a unit we can edit\n const widthProp = imageSizePropWithUnit(value);\n if (widthProp) {\n widthProp.unit = widthProp.unit || kPixelUnit;\n if (isValidImageSizeUnit(widthProp.unit)) {\n img.setAttribute(kDataWidth, widthProp.size + widthProp.unit);\n img.style.width = unitToPixels(widthProp.size, widthProp.unit, containerWidth) + kPixelUnit;\n }\n }\n\n // if not, just pass it straight through (editing UI will be disabled)\n if (!img.hasAttribute(kDataWidth)) {\n img.style.width = value;\n }\n } else if (key === kHeightAttrib) {\n // see if this is a unit we can edit\n const heightProp = imageSizePropWithUnit(value);\n if (heightProp) {\n heightProp.unit = heightProp.unit || kPixelUnit;\n if (isValidImageSizeUnit(heightProp.unit)) {\n img.setAttribute(kDataHeight, heightProp.size + heightProp.unit);\n img.style.height = unitToPixels(heightProp.size, heightProp.unit, containerWidth) + kPixelUnit;\n }\n }\n\n // if not, just pass it straight through (editing UI will be disabled)\n if (!img.hasAttribute(kDataHeight)) {\n img.style.height = value;\n }\n\n // use of legacy 'align' attribute is common for some pandoc users\n // so we convert it to the requisite CSS and apply it to the figure container\n } else if (figure && key === kAlignAttrib) {\n switch (value) {\n case 'left':\n case 'right':\n figure.style.cssFloat = value;\n break;\n case 'top':\n case 'bottom':\n case 'middle':\n figure.style.verticalAlign = value;\n break;\n }\n }\n });\n\n // if we have a fig-align value then determine the displayed width and\n // apply margins as required to the figure\n if (figure) {\n const align = pandocAttrGetKeyvalue(node.attrs, kFigAlignAttrib);\n if (align && (align !== \"default\")) {\n let width: number | null = null;\n const widthProp = imageSizePropWithUnit(img.style.width);\n if (widthProp) {\n width = widthProp.size;\n } else {\n const dims = imageDimensionsFromImg(img, containerWidth);\n width = dims.naturalWidth;\n }\n if (width !== null) {\n setMarginsForAlignment(figure, align, width, containerWidth);\n }\n }\n }\n \n // if width is a percentage, then displayed height needs to be 'auto'\n if (hasPercentWidth(img.getAttribute(kDataWidth))) {\n img.style.height = 'auto';\n }\n }\n}\n\n\nfunction setMarginsForAlignment(el: HTMLElement, align: string, width: number, containerWidth: number) {\n const marginWidth = containerWidth - width;\n if (marginWidth > 0) {\n if (align === \"left\") {\n el.style.marginRight = marginWidth + kPixelUnit;\n } else if (align === \"right\") {\n el.style.marginLeft = marginWidth + kPixelUnit;\n } else if (align === \"center\") {\n el.style.marginLeft = (marginWidth/2) + kPixelUnit;\n el.style.marginRight = el.style.marginLeft ;\n }\n } else {\n el.style.marginLeft = \"\";\n el.style.marginRight = \"\" ;\n }\n}","/*\n * widgets.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView } from 'prosemirror-view';\n\nimport { applyStyles } from '../css';\n\nimport './widgets.css';\n\nexport function createHorizontalPanel() {\n const div = window.document.createElement('div');\n div.classList.add('pm-horizontal-panel');\n return div;\n}\n\nexport function addHorizontalPanelCell(panel: HTMLDivElement, el: HTMLElement) {\n el.classList.add('pm-horizontal-panel-cell');\n panel.append(el);\n}\n\nexport function createPopup(\n view: EditorView,\n classes: string[],\n onDestroyed?: () => void,\n style?: { [key: string]: string },\n) {\n // create popup\n const popup = window.document.createElement('span');\n popup.contentEditable = 'false';\n popup.classList.add(\n 'pm-popup',\n 'pm-text-color',\n 'pm-proportional-font',\n 'pm-pane-border-color',\n 'pm-background-color',\n );\n popup.style.position = 'absolute';\n popup.style.zIndex = '10';\n applyStyles(popup, classes, style);\n\n // create mutation observer that watches for destruction\n if (onDestroyed) {\n const observer = new MutationObserver(mutationsList => {\n mutationsList.forEach(mutation => {\n mutation.removedNodes.forEach(node => {\n if (node === popup) {\n observer.disconnect();\n onDestroyed();\n }\n });\n });\n });\n observer.observe(view.dom, { attributes: false, childList: true, subtree: true });\n }\n\n return popup;\n}\n\nexport function createImageButton(image: string, classes: string[], title: string, style?: { [key: string]: string }) {\n const button = window.document.createElement('button');\n button.classList.add('pm-image-button');\n button.title = title;\n applyStyles(button, classes, style);\n const imageEl = window.document.createElement('img') as HTMLImageElement;\n imageEl.src = image;\n imageEl.setAttribute('draggable', 'false');\n button.append(imageEl);\n return button;\n}\n\nexport function createInputLabel(text: string, classes?: string[], style?: { [key: string]: string }) {\n const label = window.document.createElement('label');\n label.innerText = text;\n label.classList.add('pm-input-label');\n applyStyles(label, classes, style);\n return label;\n}\n\nexport function createSelectInput(options: string[], classes?: string[], style?: { [key: string]: string }) {\n const select = window.document.createElement('select');\n appendOptions(select, options);\n select.classList.add('pm-input-select');\n select.classList.add('pm-pane-border-color');\n applyStyles(select, classes, style);\n return select;\n}\n\nfunction appendOptions(container: HTMLElement, options: string[]) {\n options.forEach(option => {\n const optionEl = window.document.createElement('option');\n optionEl.value = option;\n optionEl.textContent = option;\n container.append(optionEl);\n });\n}\n\nexport function createCheckboxInput(classes?: string[], style?: { [key: string]: string }) {\n const input = window.document.createElement('input');\n input.classList.add('pm-input-checkbox');\n input.type = 'checkbox';\n applyStyles(input, classes, style);\n return input;\n}\n\nexport function createTextInput(widthChars: number, classes?: string[], style?: { [key: string]: string }) {\n const input = document.createElement('input');\n input.type = 'text';\n input.classList.add('pm-input-text');\n input.classList.add('pm-pane-border-color');\n applyStyles(input, classes, style);\n input.style.width = widthChars + 'ch';\n return input;\n}\n","/*\n * figure-keys.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { EditorState, Transaction, NodeSelection, Selection, TextSelection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport {\n findParentNodeOfTypeClosestToPos,\n findSelectedNodeOfType,\n setTextSelection,\n ContentNodeWithPos,\n findParentNodeOfType,\n findParentNodeClosestToPos,\n} from 'prosemirror-utils';\n\nimport { BaseKey, verticalArrowCanAdvanceWithinTextBlock } from '../../api/basekeys';\nimport { exitNode } from '../../api/command';\n\nexport function figureKeys(schema: Schema) {\n return [\n { key: BaseKey.Enter, command: exitNode(schema.nodes.figure, -1, false) },\n { key: BaseKey.Backspace, command: backspaceHandler() },\n { key: BaseKey.ArrowLeft, command: arrowHandler('left') },\n { key: BaseKey.ArrowRight, command: arrowHandler('right') },\n { key: BaseKey.ArrowUp, command: arrowHandler('up') },\n { key: BaseKey.ArrowDown, command: arrowHandler('down') },\n ];\n}\n\nfunction backspaceHandler() {\n return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n // must be an empty selection\n const selection = state.selection;\n if (!selection.empty) {\n return false;\n }\n\n // must be a selection at the beginning of it's parent\n const schema = state.schema;\n const { $head } = state.selection;\n const { parentOffset } = $head;\n if (parentOffset !== 0) {\n return false;\n }\n\n // two scenarios: backspace within empty caption or backspace right after figure\n const isWithinEmptyCaption = $head.parent.type === schema.nodes.figure && $head.parent.childCount === 0;\n if (isWithinEmptyCaption) {\n if (dispatch) {\n // set a node selection for the figure\n const tr = state.tr;\n tr.setSelection(NodeSelection.create(tr.doc, $head.pos - 1));\n dispatch(tr);\n }\n return true;\n } else {\n // check if the previous node is a figure\n const parent = $head.node($head.depth - 1);\n const parentIndex = $head.index($head.depth - 1);\n if (parentIndex > 0) {\n const previousNode = parent.child(parentIndex - 1);\n if (previousNode.type === schema.nodes.figure) {\n if (dispatch) {\n const tr = state.tr;\n\n // if the current node is and empty textblock then remove it\n if ($head.node().childCount === 0) {\n const parentTextBlock = findParentNodeClosestToPos($head, node => node.isTextblock);\n if (parentTextBlock) {\n tr.deleteRange(parentTextBlock.pos, parentTextBlock.pos + parentTextBlock.node.nodeSize);\n }\n }\n\n const nodePos = $head.pos - previousNode.nodeSize - 1;\n const figureSelection = NodeSelection.create(tr.doc, nodePos);\n tr.setSelection(figureSelection);\n dispatch(tr);\n }\n return true;\n }\n }\n }\n\n return false;\n };\n}\n\nfunction arrowHandler(dir: 'up' | 'down' | 'left' | 'right') {\n return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n // select figure\n const selectFigure = (figure: ContentNodeWithPos) => {\n if (dispatch) {\n const tr = state.tr;\n const figureSelection = NodeSelection.create(state.doc, figure.pos);\n tr.setSelection(figureSelection).scrollIntoView();\n dispatch(tr);\n }\n };\n\n // select figure caption\n const selectFigureCaption = (figure: ContentNodeWithPos, atEnd = false) => {\n if (dispatch) {\n const tr = state.tr;\n setTextSelection(figure.pos + (atEnd ? figure.node.textContent.length + 1 : 0), 1)(tr);\n dispatch(tr);\n }\n };\n\n // alias schema and selection\n const { schema, selection } = state;\n\n // down/right arrow for node selection w/ caption drives cursor into caption\n if (\n (dir === 'down' || dir === 'right') &&\n selection instanceof NodeSelection &&\n selection.node.type === schema.nodes.figure\n ) {\n const figure = findSelectedNodeOfType(schema.nodes.figure)(selection);\n if (figure && figure.node.childCount > 0) {\n selectFigureCaption(figure);\n return true;\n }\n }\n\n // up/left arrow for selection in caption takes us back to the node selection\n if (\n (dir === 'up' || dir === 'left') &&\n selection instanceof TextSelection &&\n !!findParentNodeOfType(schema.nodes.figure)(selection)\n ) {\n if (dir === 'up' || (dir === 'left' && selection.$head.parentOffset === 0)) {\n const figure = findParentNodeOfType(schema.nodes.figure)(selection);\n if (figure) {\n selectFigure(figure);\n return true;\n }\n }\n\n // normal node traversal\n } else if (selection.empty && view && view.endOfTextblock(dir)) {\n // compute side offset\n const side = dir === 'left' || dir === 'up' ? -1 : 1;\n\n // get selection head\n const { $head } = selection;\n\n // see if this would traverse our type\n const nextPos = Selection.near(state.doc.resolve(side > 0 ? $head.after() : $head.before()), side);\n if (nextPos.$head) {\n const figure = findParentNodeOfTypeClosestToPos(nextPos.$head, schema.nodes.figure);\n if (figure) {\n // check for e.g. math where you can advance across embedded newlines\n if ((dir === 'up' || dir === 'down') && verticalArrowCanAdvanceWithinTextBlock(state.selection, dir)) {\n return false;\n }\n // arrowing back into a figure with a caption selects the caption\n if (side === -1 && figure.node.childCount > 0) {\n selectFigureCaption(figure, dir === 'left');\n // otherwise select the figure\n } else {\n selectFigure(figure);\n }\n return true;\n }\n }\n }\n\n // not handled\n return false;\n };\n}\n","/*\n * image-events.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView } from 'prosemirror-view';\n\nimport { Plugin, PluginKey } from 'prosemirror-state';\nimport { EditorUI } from '../../api/ui';\n\nconst kTextUriList = 'text/uri-list';\nconst kApplicationQtImage = 'application/x-qt-image';\n\nconst pluginKey = new PluginKey('image-events');\n\nexport function imageEventsPlugin(ui: EditorUI) {\n return new Plugin({\n key: pluginKey,\n props: {\n handleDOMEvents: {\n drop: imageDrop(ui),\n },\n handlePaste: imagePaste(ui),\n },\n });\n}\n\nfunction imagePaste(ui: EditorUI) {\n return (view: EditorView, event: Event) => {\n const clipboardEvent = event as ClipboardEvent;\n\n if (clipboardEvent.clipboardData) {\n // detect file pastes where there is no payload, in that case check to see\n // if there is clipboard data we can get from our context (e.g. from Qt)\n if (clipboardEvent.clipboardData.types.includes(kTextUriList)) {\n const uriList = clipboardEvent.clipboardData.getData(kTextUriList);\n if (uriList.length === 0) {\n ui.context.clipboardUris().then(uris => {\n if (uris) {\n handleImageUris(view, view.state.selection.from, event, uris, ui);\n }\n });\n event.preventDefault();\n return true;\n }\n // raw image paste (e.g. from an office doc)\n } else if (clipboardEvent.clipboardData.types.includes('application/x-qt-image')) {\n\n // don't process excel sheets (we want to use their html representation)\n const kTextHtml = \"text/html\";\n if (clipboardEvent.clipboardData.types.includes(kTextHtml) &&\n clipboardEvent.clipboardData.getData(kTextHtml).includes(\"content=Excel.Sheet\")) {\n return false;\n }\n \n ui.context.clipboardImage().then(image => {\n if (image) {\n handleImageUris(view, view.state.selection.from, event, [image], ui);\n }\n });\n event.preventDefault();\n return true;\n }\n }\n\n return false;\n };\n}\n\nfunction imageDrop(ui: EditorUI) {\n return (view: EditorView, event: Event) => {\n // alias to drag event so typescript knows about event.dataTransfer\n const dragEvent = event as DragEvent;\n\n // ensure we have data transfer\n if (!dragEvent.dataTransfer) {\n return false;\n }\n\n // ensure the drop coordinates map to an editor position\n const coordinates = view.posAtCoords({\n left: dragEvent.clientX,\n top: dragEvent.clientY,\n });\n if (!coordinates) {\n return false;\n }\n\n // array of uris\n let uris: string[] | null = null;\n\n // see if this is a drag of uris\n const uriList = dragEvent.dataTransfer.getData(kTextUriList);\n if (uriList) {\n uris = uriList.split('\\r?\\n');\n } else {\n // see if the ui context has some dropped uris\n uris = ui.context.droppedUris();\n }\n\n // process uris if we have them\n if (uris && handleImageUris(view, coordinates.pos, event, uris, ui)) {\n event.preventDefault();\n return true;\n } else {\n return false;\n }\n };\n}\n\nfunction handleImageUris(view: EditorView, pos: number, event: Event, uris: string[], ui: EditorUI): boolean {\n // filter out images\n const imageUris = uris.filter(uri => {\n // get extension and check it it's an image\n // https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Image_types#Common_image_file_types\n const kImageExtensions = [\n 'apng',\n 'bmp',\n 'gif',\n 'ico',\n 'cur',\n 'jpg',\n 'jpeg',\n 'jfif',\n 'pjpeg',\n 'pjp',\n 'png',\n 'svg',\n 'tif',\n 'tiff',\n 'webp',\n ];\n const extension = uri\n .split(/\\./)\n .pop()!\n .toLowerCase();\n return kImageExtensions.includes(extension);\n });\n\n // exit if we have no image uris\n if (imageUris.length === 0) {\n return false;\n }\n\n // resolve image uris then insert them. note that this is done\n // async so we return true indicating we've handled the drop and\n // then we actually do the insertion once it returns\n ui.context.resolveImageUris(imageUris).then(images => {\n const tr = view.state.tr;\n images.forEach(image => {\n const node = view.state.schema.nodes.image.create({ src: image });\n tr.insert(pos, node);\n });\n view.dispatch(tr);\n });\n\n // indicate that we will handle the event\n return true;\n}\n","/*\n * hr.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, DOMOutputSpec } from 'prosemirror-model';\nimport { InputRule } from 'prosemirror-inputrules';\nimport { findParentNodeOfType } from 'prosemirror-utils';\nimport { EditorState } from 'prosemirror-state';\n\nimport { ProsemirrorCommand, insertNode, EditorCommandId } from '../api/command';\nimport { ExtensionContext } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\nimport { EditorUI } from '../api/ui';\nimport { OmniInsertGroup } from '../api/omni_insert';\n\nimport './hr-styles.css';\n\nconst extension = (context: ExtensionContext) => {\n const { ui } = context;\n\n return {\n nodes: [\n {\n name: 'horizontal_rule',\n spec: {\n group: 'block',\n parseDOM: [{ tag: 'hr' }],\n toDOM(): DOMOutputSpec {\n return ['div', ['hr', { class: 'pm-border-background-color' }]];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.HorizontalRule,\n node: 'horizontal_rule',\n },\n ],\n writer: (output: PandocOutput) => {\n output.writeToken(PandocTokenType.HorizontalRule);\n },\n },\n },\n ],\n\n commands: (schema: Schema) => {\n return [\n new ProsemirrorCommand(\n EditorCommandId.HorizontalRule,\n [],\n insertNode(schema.nodes.horizontal_rule, {}, true),\n hrOmniInsert(ui),\n ),\n ];\n },\n\n inputRules: (_schema: Schema) => {\n return [\n new InputRule(/^\\*{3}$/, (state: EditorState, match: string[], start: number, end: number) => {\n const schema = state.schema;\n const paraNode = findParentNodeOfType(schema.nodes.paragraph)(state.selection);\n if (paraNode && state.selection.$anchor.depth === 2) {\n // only in top-level paragraphs\n return state.tr.replaceRangeWith(start, end, schema.nodes.horizontal_rule.create());\n } else {\n return null;\n }\n }),\n ];\n },\n };\n};\n\nfunction hrOmniInsert(ui: EditorUI) {\n return {\n name: ui.context.translateText('Horizontal Rule'),\n keywords: [\"hr\"],\n description: ui.context.translateText('Line that spans across the page'),\n group: OmniInsertGroup.Content,\n priority: 1,\n image: () =>\n ui.prefs.darkMode() ? ui.images.omni_insert?.horizontal_rule_dark! : ui.images.omni_insert?.horizontal_rule!,\n };\n}\n\nexport default extension;\n","/*\n * hard_break.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { Extension } from '../api/extension';\nimport { BaseKey } from '../api/basekeys';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\n\nconst extension: Extension = {\n nodes: [\n {\n name: 'hard_break',\n spec: {\n inline: true,\n group: 'inline',\n selectable: false,\n parseDOM: [{ tag: 'br' }],\n toDOM() {\n return ['br'];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.LineBreak,\n node: 'hard_break',\n },\n ],\n writer: (output: PandocOutput) => {\n output.writeToken(PandocTokenType.LineBreak);\n },\n },\n },\n ],\n\n baseKeys: (_schema: Schema) => {\n return [\n { key: BaseKey.ModEnter, command: hardBreakCommandFn() },\n { key: BaseKey.ShiftEnter, command: hardBreakCommandFn() },\n ];\n },\n};\n\nexport function hardBreakCommandFn() {\n return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n const br = state.schema.nodes.hard_break;\n if (dispatch) {\n dispatch(state.tr.replaceSelectionWith(br.create()).scrollIntoView());\n }\n return true;\n };\n}\n\nexport default extension;\n","/*\n * null.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Extension } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\n\nimport './null-styles.css';\n\nconst extension: Extension = {\n nodes: [\n {\n name: 'null',\n spec: {\n group: 'block',\n atom: true,\n selectable: false,\n parseDOM: [{ tag: \"div[class*='null-block']\" }],\n toDOM() {\n return ['div', { class: 'null-block' }];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.Null,\n node: 'null',\n },\n ],\n writer: (output: PandocOutput) => {\n output.writeToken(PandocTokenType.Null);\n },\n },\n },\n ],\n};\n\nexport default extension;\n","/*\n * em.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Mark, Fragment } from 'prosemirror-model';\n\nimport { MarkCommand, EditorCommandId } from '../api/command';\nimport { Extension } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\nimport { delimiterMarkInputRule, MarkInputRuleFilter } from '../api/input_rule';\n\nconst extension: Extension = {\n marks: [\n {\n name: 'em',\n spec: {\n group: 'formatting',\n parseDOM: [\n { tag: 'i' },\n { tag: 'em' },\n { style: 'font-weight', getAttrs: (value: string | Node) => (value as string) === 'italic' && null },\n ],\n toDOM() {\n return ['em'];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.Emph,\n mark: 'em',\n },\n ],\n writer: {\n priority: 4,\n write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n output.writeMark(PandocTokenType.Emph, parent);\n },\n },\n },\n },\n ],\n\n commands: (schema: Schema) => {\n return [new MarkCommand(EditorCommandId.Em, ['Mod-i'], schema.marks.em)];\n },\n\n inputRules: (schema: Schema, filter: MarkInputRuleFilter) => {\n return [\n delimiterMarkInputRule('\\\\*', schema.marks.em, filter, '\\\\*-`', true),\n delimiterMarkInputRule('_', schema.marks.em, filter, '\\\\w_`', true),\n ];\n },\n};\n\nexport default extension;\n","/*\n * strong.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Mark, Fragment } from 'prosemirror-model';\n\nimport { MarkCommand, EditorCommandId } from '../api/command';\nimport { Extension } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\nimport { delimiterMarkInputRule, MarkInputRuleFilter } from '../api/input_rule';\n\nconst extension: Extension = {\n marks: [\n {\n name: 'strong',\n spec: {\n group: 'formatting',\n parseDOM: [\n // This works around a Google Docs misbehavior where pasted content will be inexplicably wrapped in `<b>`\n // tags with a font-weight normal.\n {\n tag: 'b',\n getAttrs: (value: string | Node) => (value as HTMLElement).style.fontWeight !== 'normal' && null,\n },\n { tag: 'strong' },\n {\n style: 'font-weight',\n getAttrs: (value: string | Node) => /^(bold(er)?|[5-9]\\d{2,})$/.test(value as string) && null,\n },\n ],\n toDOM() {\n return ['strong'];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.Strong,\n mark: 'strong',\n },\n ],\n writer: {\n priority: 3,\n write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n output.writeMark(PandocTokenType.Strong, parent);\n },\n },\n },\n },\n ],\n\n commands: (schema: Schema) => {\n return [new MarkCommand(EditorCommandId.Strong, ['Mod-b'], schema.marks.strong)];\n },\n\n inputRules: (schema: Schema, filter: MarkInputRuleFilter) => {\n return [\n delimiterMarkInputRule('\\\\*\\\\*', schema.marks.strong, filter, '`', true),\n delimiterMarkInputRule('__', schema.marks.strong, filter, '\\\\w`', true),\n ];\n },\n};\n\nexport default extension;\n","/*\n * code.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Fragment, Mark, Node as ProsemirrorNode, Schema } from 'prosemirror-model';\n\nimport { MarkCommand, EditorCommandId } from '../api/command';\nimport { Extension, ExtensionContext } from '../api/extension';\nimport { pandocAttrSpec, pandocAttrParseDom, pandocAttrToDomAttr, pandocAttrReadAST } from '../api/pandoc_attr';\nimport { PandocToken, PandocOutput, PandocTokenType } from '../api/pandoc';\n\nimport { kCodeText, kCodeAttr } from '../api/code';\nimport { delimiterMarkInputRule, MarkInputRuleFilter } from '../api/input_rule';\n\nconst extension = (context: ExtensionContext): Extension => {\n const { pandocExtensions } = context;\n\n const codeAttrs = pandocExtensions.inline_code_attributes;\n\n return {\n marks: [\n {\n name: 'code',\n noInputRules: true,\n noSpelling: true,\n spec: {\n group: 'formatting',\n attrs: codeAttrs ? pandocAttrSpec : {},\n parseDOM: [\n {\n tag: 'code',\n getAttrs(dom: Node | string) {\n if (codeAttrs) {\n return pandocAttrParseDom(dom as Element, {});\n } else {\n return {};\n }\n },\n },\n ],\n toDOM(mark: Mark) {\n const fontClass = 'pm-code pm-fixedwidth-font pm-chunk-background-color pm-block-border-color';\n const attrs = codeAttrs\n ? pandocAttrToDomAttr({\n ...mark.attrs,\n classes: [...mark.attrs.classes, fontClass],\n })\n : {\n class: fontClass,\n };\n return ['code', attrs];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.Code,\n mark: 'code',\n getText: (tok: PandocToken) => tok.c[kCodeText],\n getAttrs: (tok: PandocToken) => {\n if (codeAttrs) {\n return pandocAttrReadAST(tok, kCodeAttr);\n } else {\n return {};\n }\n },\n },\n ],\n writer: {\n // lowest possible mark priority since it doesn't call writeInlines\n // (so will 'eat' any other marks on the stack)\n priority: 0,\n write: (output: PandocOutput, mark: Mark, parent: Fragment) => {\n // collect code and trim it (pandoc will do this on parse anyway)\n let code = '';\n parent.forEach((node: ProsemirrorNode) => (code = code + node.textContent));\n code = code.trim();\n if (code.length > 0) {\n output.writeToken(PandocTokenType.Code, () => {\n if (codeAttrs) {\n output.writeAttr(mark.attrs.id, mark.attrs.classes, mark.attrs.keyvalue);\n } else {\n output.writeAttr();\n }\n output.write(code);\n });\n }\n },\n },\n },\n },\n ],\n\n commands: (schema: Schema) => {\n return [new MarkCommand(EditorCommandId.Code, ['Mod-d'], schema.marks.code)];\n },\n\n inputRules: (schema: Schema, filter: MarkInputRuleFilter) => {\n return [delimiterMarkInputRule('`', schema.marks.code, filter)];\n },\n };\n};\n\nexport default extension;\n","/*\n * link.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Fragment, Mark, Schema } from 'prosemirror-model';\nimport { PluginKey, Plugin } from 'prosemirror-state';\n\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { PandocToken, PandocOutput, PandocTokenType } from '../../api/pandoc';\nimport {\n pandocAttrSpec,\n pandocAttrParseDom,\n pandocAttrToDomAttr,\n pandocAttrReadAST,\n PandocAttr,\n} from '../../api/pandoc_attr';\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { kLinkTarget, kLinkTargetUrl, kLinkTargetTitle, kLinkAttr, kLinkChildren } from '../../api/link';\nimport { hasShortcutHeadingLinks } from '../../api/pandoc_format';\n\nimport { linkCommand, removeLinkCommand, linkOmniInsert } from './link-command';\nimport { linkInputRules, linkPasteHandler } from './link-auto';\nimport { linkHeadingsPostprocessor, syncHeadingLinksAppendTransaction } from './link-headings';\nimport { linkPopupPlugin } from './link-popup';\n\nimport './link-styles.css';\n\nconst extension = (context: ExtensionContext): Extension => {\n const { pandocExtensions, ui, navigation } = context;\n\n const capabilities = {\n headings: hasShortcutHeadingLinks(pandocExtensions),\n attributes: pandocExtensions.link_attributes,\n text: true,\n };\n const linkAttr = pandocExtensions.link_attributes;\n const autoLink = pandocExtensions.autolink_bare_uris;\n const headingLink = hasShortcutHeadingLinks(pandocExtensions);\n const citations = pandocExtensions.citations;\n\n const excludes = citations ? { excludes: 'cite_id' } : {};\n\n return {\n marks: [\n {\n name: 'link',\n spec: {\n attrs: {\n href: {},\n heading: { default: null },\n title: { default: null },\n ...(linkAttr ? pandocAttrSpec : {}),\n },\n inclusive: false,\n ...excludes,\n parseDOM: [\n {\n tag: 'a[href]',\n getAttrs(dom: Node | string) {\n const el = dom as Element;\n const attrs: { [key: string]: string | null } = {\n href: el.getAttribute('href'),\n title: el.getAttribute('title'),\n heading: el.getAttribute('data-heading'),\n };\n return {\n ...attrs,\n ...(linkAttr ? pandocAttrParseDom(el, attrs) : {}),\n };\n },\n },\n ],\n toDOM(mark: Mark) {\n const linkClasses = 'pm-link pm-link-text-color';\n\n let extraAttr: any = {};\n if (linkAttr) {\n extraAttr = pandocAttrToDomAttr({\n ...mark.attrs,\n classes: [...mark.attrs.classes, linkClasses],\n });\n } else {\n extraAttr = { class: linkClasses };\n }\n\n return [\n 'a',\n {\n href: mark.attrs.href,\n title: mark.attrs.title,\n 'data-heading': mark.attrs.heading,\n ...extraAttr,\n },\n ];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.Link,\n mark: 'link',\n getAttrs: (tok: PandocToken) => {\n const target = tok.c[kLinkTarget];\n return {\n href: target[kLinkTargetUrl],\n title: target[kLinkTargetTitle] || null,\n ...(linkAttr ? pandocAttrReadAST(tok, kLinkAttr) : {}),\n };\n },\n getChildren: (tok: PandocToken) => tok.c[kLinkChildren],\n\n postprocessor: hasShortcutHeadingLinks(pandocExtensions) ? linkHeadingsPostprocessor : undefined,\n },\n ],\n\n writer: {\n priority: 12,\n write: (output: PandocOutput, mark: Mark, parent: Fragment) => {\n if (mark.attrs.heading) {\n output.writeRawMarkdown('[');\n output.writeInlines(parent);\n output.writeRawMarkdown(']');\n } else {\n output.writeLink(\n mark.attrs.href,\n mark.attrs.title,\n linkAttr ? (mark.attrs as PandocAttr) : null,\n () => {\n output.writeInlines(parent);\n },\n );\n }\n },\n },\n },\n },\n ],\n\n commands: (schema: Schema) => {\n return [\n new ProsemirrorCommand(\n EditorCommandId.Link,\n ['Mod-k'],\n linkCommand(schema.marks.link, ui.dialogs.editLink, capabilities),\n linkOmniInsert(ui),\n ),\n new ProsemirrorCommand(EditorCommandId.RemoveLink, [], removeLinkCommand(schema.marks.link)),\n ];\n },\n\n inputRules: linkInputRules(autoLink, headingLink),\n\n appendTransaction: (schema: Schema) =>\n pandocExtensions.implicit_header_references ? [syncHeadingLinksAppendTransaction()] : [],\n\n plugins: (schema: Schema) => {\n const plugins = [\n linkPopupPlugin(\n schema,\n ui,\n navigation,\n linkCommand(schema.marks.link, ui.dialogs.editLink, capabilities),\n removeLinkCommand(schema.marks.link),\n ),\n ];\n if (autoLink) {\n plugins.push(\n new Plugin({\n key: new PluginKey('link-auto'),\n props: {\n transformPasted: linkPasteHandler(schema),\n },\n }),\n );\n }\n return plugins;\n },\n };\n};\n\nexport default extension;\n","/*\n * link-command.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { MarkType } from 'prosemirror-model';\nimport { EditorUI } from '../../api/ui';\nimport { LinkEditorFn, LinkProps } from '../../api/ui-dialogs';\nimport { EditorState, Transaction, TextSelection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { findChildren } from 'prosemirror-utils';\n\nimport { markIsActive, getMarkAttrs, getSelectionMarkRange, getMarkRange } from '../../api/mark';\n\nimport { linkTargets, LinkCapabilities, LinkType } from '../../api/link';\nimport { OmniInsertGroup } from '../../api/omni_insert';\nimport { equalsIgnoreCase } from '../../api/text';\n\nexport function linkCommand(markType: MarkType, onEditLink: LinkEditorFn, capabilities: LinkCapabilities) {\n return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n // if the current node doesn't allow this mark return false\n if (!state.selection.$from.node().type.allowsMarkType(markType)) {\n return false;\n }\n\n async function asyncEditLink() {\n if (dispatch) {\n // collect link targets\n const targets = await linkTargets(state.doc);\n\n // get the range of the mark\n const range = getSelectionMarkRange(state.selection, markType);\n\n // get link attributes if we have them\n let link: { [key: string]: any } = {};\n\n // only get text if this is a text selection\n if (state.selection instanceof TextSelection) {\n link.text = state.doc.textBetween(range.from, range.to);\n capabilities.text = true;\n } else {\n capabilities.text = false;\n }\n\n // get other attributes\n if (markIsActive(state, markType)) {\n link = {\n ...link,\n ...getMarkAttrs(state.doc, range, markType),\n };\n } else {\n // if the link text is a URL then make it the default\n if (link.text && link.text.match(/^https?:\\/\\/.*$/)) {\n link.href = link.text;\n }\n }\n\n // determine type\n if (link.heading) {\n link.type = LinkType.Heading;\n } else if (link.href && link.href.startsWith('#')) {\n link.type = LinkType.ID;\n } else {\n link.type = LinkType.URL;\n }\n\n // show edit ui\n const result = await onEditLink({ ...link } as LinkProps, targets, capabilities);\n if (result) {\n const tr = state.tr;\n tr.removeMark(range.from, range.to, markType);\n if (result.action === 'edit') {\n // create the mark\n const mark = markType.create(result.link);\n\n // if the content changed then replace the range, otherwise\n if (capabilities.text && link.text !== result.link.text) {\n const node = markType.schema.text(result.link.text, [mark]);\n // if we are editing an existing link then replace it, otherwise replace the selection\n if (link.href) {\n tr.replaceRangeWith(range.from, range.to, node);\n } else {\n tr.replaceSelectionWith(node, false);\n }\n } else {\n tr.addMark(range.from, range.to, mark);\n }\n\n // if it's a heading link then update heading to indicate it has an associated link\n if (result.link.type === LinkType.Heading) {\n const heading = findChildren(\n tr.doc,\n node =>\n node.type === state.schema.nodes.heading &&\n equalsIgnoreCase(node.textContent, result.link.heading || ''),\n );\n if (heading.length > 0) {\n tr.setNodeMarkup(heading[0].pos, state.schema.nodes.heading, {\n ...heading[0].node.attrs,\n link: result.link.heading,\n });\n }\n }\n }\n dispatch(tr);\n }\n if (view) {\n view.focus();\n }\n }\n }\n asyncEditLink();\n\n return true;\n };\n}\n\nexport function linkOmniInsert(ui: EditorUI) {\n return {\n name: ui.context.translateText('Link...'),\n description: ui.context.translateText('Link to another location'),\n group: OmniInsertGroup.Content,\n priority: 8,\n image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.link_dark! : ui.images.omni_insert?.link!),\n };\n}\n\nexport function removeLinkCommand(markType: MarkType) {\n return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n const range = getMarkRange(state.selection.$from, markType);\n if (!range) {\n return false;\n }\n\n if (dispatch) {\n const tr = state.tr;\n tr.removeMark(range.from, range.to, markType);\n dispatch(tr);\n }\n\n return true;\n };\n}\n","/*\n * link-auto.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { InputRule } from 'prosemirror-inputrules';\nimport { EditorState } from 'prosemirror-state';\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { markInputRule, MarkInputRuleFilter } from '../../api/input_rule';\nimport { markPasteHandler } from '../../api/clipboard';\n\nexport function linkInputRules(autoLink: boolean, headingLink: boolean) {\n return (schema: Schema, filter: MarkInputRuleFilter) => {\n const rules = [\n // <link> style link\n markInputRule(/(?:(?:^|[^`])<)(https?:\\/\\/[^>]+)(?:>)$/, schema.marks.link, filter, (match: string[]) => ({\n href: match[1],\n })),\n // full markdown link\n new InputRule(/(?:\\[)([^\\]]+)(?:\\]\\()([^)]+)(?:\\))$/, (state: EditorState, match: string[], start: number, end: number) => {\n if (!filter(state, start, end)) {\n return null;\n }\n \n // remove any leading delimter (modulo spaces)\n const textIndex = match[0].indexOf(match[1]);\n const prefix = match[0].substring(0, textIndex).replace(/^\\s/, \"\");\n const delimStart = start + textIndex - prefix.length;\n const tr = state.tr;\n tr.delete(delimStart, delimStart + prefix.length);\n \n // create mark\n const attrs = { href: match[2] };\n const mark = schema.marks.link.create(attrs);\n \n // apply it to the matching core text\n const markStart = start + textIndex - prefix.length;\n tr.addMark(markStart, markStart + match[1].length, mark);\n tr.removeStoredMark(mark); // Do not continue with mark.\n \n // remove any remaining text\n const remainStart = markStart + match[1].length;\n tr.delete(remainStart, end);\n setTextSelection(remainStart)(tr);\n \n return tr;\n })\n ];\n\n if (autoLink) {\n // plain link\n rules.push(\n new InputRule(\n /(^|[^`])(https?:\\/\\/[^\\s]+\\w)[\\.\\?!\\,)]* $/,\n (state: EditorState, match: string[], start: number, end: number) => {\n const tr = state.tr;\n start = start + match[1].length;\n const linkEnd = start + match[2].length;\n tr.addMark(start, linkEnd, schema.marks.link.create({ href: match[2] }));\n tr.removeStoredMark(schema.marks.link);\n tr.insertText(' ');\n setTextSelection(end + 1)(tr);\n return tr;\n },\n ),\n );\n }\n\n return rules;\n };\n}\n\nexport function linkPasteHandler(schema: Schema) {\n return markPasteHandler(/(?:<)?([a-z]+:\\/\\/[^\\s>]+)(?:>)?/g, schema.marks.link, url => ({ href: url }));\n}\n","/*\n * clipboard.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Slice, Fragment, MarkType, Node as ProsemirrorNode } from 'prosemirror-model';\n\n// add marks to plain text pasted into the editor (e.g. urls become links)\n// https://github.com/ProseMirror/prosemirror/issues/90\nexport function markPasteHandler(regexp: RegExp, type: MarkType, getAttrs: (s: string) => {}) {\n const handler = (fragment: Fragment) => {\n regexp.lastIndex = 0;\n\n const nodes: ProsemirrorNode[] = [];\n\n fragment.forEach((child: ProsemirrorNode) => {\n if (child.isText) {\n const { text } = child;\n let pos = 0;\n let match;\n\n do {\n match = regexp.exec(text!);\n if (match) {\n const start = match.index;\n const end = start + match[0].length;\n const matchText = match.length > 1 ? match[1] : match[0];\n const attrs = getAttrs instanceof Function ? getAttrs(matchText) : getAttrs;\n if (start > 0) {\n nodes.push(child.cut(pos, start));\n }\n nodes.push(type.schema.text(matchText).mark(type.create(attrs).addToSet(child.marks)));\n pos = end;\n }\n } while (match);\n\n if (pos < text!.length) {\n nodes.push(child.cut(pos));\n }\n } else {\n nodes.push(child.copy(handler(child.content)));\n }\n });\n\n regexp.lastIndex = 0;\n\n return Fragment.fromArray(nodes);\n };\n\n return (slice: Slice) => new Slice(handler(slice.content), slice.openStart, slice.openEnd);\n}\n","/*\n * link-headings.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { findChildrenByType, findChildrenByMark } from 'prosemirror-utils';\n\nimport { getMarkRange, getMarkAttrs } from '../../api/mark';\nimport { Transaction } from 'prosemirror-state';\nimport { equalsIgnoreCase } from '../../api/text';\n\n// detect links to headings within the doc read from pandoc and update the doc\n// to note those headings in the link attributes\nexport function linkHeadingsPostprocessor(doc: ProsemirrorNode) {\n // alias schema\n const schema = doc.type.schema;\n\n // start with a list of all headings\n const headings = findChildrenByType(doc, schema.nodes.heading);\n\n // find link marks\n findChildrenByMark(doc, schema.marks.link).forEach(link => {\n const markRange = getMarkRange(doc.resolve(link.pos), schema.marks.link);\n if (markRange) {\n const attrs = getMarkAttrs(doc, markRange, schema.marks.link);\n const linkText = doc.textBetween(markRange.from, markRange.to);\n const matchedHeading = headings.find(heading => {\n return equalsIgnoreCase(heading.node.textContent, linkText) && !attrs.title && attrs.href === '#';\n });\n if (matchedHeading) {\n // point the link mark at this heading by name\n doc.nodesBetween(markRange.from, markRange.to, node => {\n const linkMark = node.marks.find(m => m.type === schema.marks.link);\n if (linkMark) {\n linkMark.attrs.heading = matchedHeading.node.textContent;\n }\n });\n\n // update the heading to indicate it has a named link to it\n matchedHeading.node.attrs.link = linkText;\n }\n }\n });\n\n // return doc\n return doc;\n}\n\nexport function syncHeadingLinksAppendTransaction() {\n return {\n name: 'sync-heading-links',\n nodeFilter: (node: ProsemirrorNode) =>\n node.type === node.type.schema.nodes.heading || node.type.schema.marks.link.isInSet(node.marks),\n append: (tr: Transaction) => {\n // alias schema\n const schema = tr.doc.type.schema;\n\n // fix links to be in sync with their text\n const links = findChildrenByMark(tr.doc, schema.marks.link);\n links.forEach(link => {\n const linkPos = tr.mapping.map(link.pos);\n const range = getMarkRange(tr.doc.resolve(linkPos), schema.marks.link);\n if (range) {\n const attrs = getMarkAttrs(tr.doc, range, schema.marks.link);\n const linkText = tr.doc.textBetween(range.from, range.to);\n if (attrs.heading && !equalsIgnoreCase(attrs.heading, linkText)) {\n tr.removeMark(range.from, range.to, schema.marks.link);\n tr.addMark(range.from, range.to, schema.marks.link.create({ ...attrs, heading: linkText }));\n }\n }\n });\n\n // if a heading has deviated from it's link, then update the link\n findChildrenByType(tr.doc, schema.nodes.heading).forEach(heading => {\n const headingPos = tr.mapping.map(heading.pos);\n const headingText = heading.node.textContent;\n const headingLink = heading.node.attrs.link;\n\n if (headingLink && !equalsIgnoreCase(headingLink, headingText) && headingText.length > 0) {\n // set the heading link text\n tr.setNodeMarkup(headingPos, schema.nodes.heading, {\n ...heading.node.attrs,\n link: headingText,\n });\n\n // find links that don't match and update them\n findChildrenByMark(tr.doc, schema.marks.link).forEach(link => {\n const linkPos = tr.mapping.map(link.pos);\n const range = getMarkRange(tr.doc.resolve(linkPos), schema.marks.link);\n if (range) {\n const attrs = getMarkAttrs(tr.doc, range, schema.marks.link);\n if (equalsIgnoreCase(attrs.heading, headingLink)) {\n tr.insertText(headingText, range.from, range.to);\n tr.addMark(\n range.from,\n range.from + headingText.length,\n schema.marks.link.create({ ...attrs, heading: headingText }),\n );\n }\n }\n });\n }\n });\n },\n };\n}\n","/*\n * LinkPopup.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { DecorationSet, EditorView } from 'prosemirror-view';\nimport { Selection, PluginKey } from 'prosemirror-state';\n\nimport * as React from 'react';\n\nimport ClipboardJS from 'clipboard';\n\nimport { EditorUI } from '../../api/ui';\nimport { LinkProps } from '../../api/ui-dialogs';\nimport { CommandFn } from '../../api/command';\n\nimport { selectionIsImageNode } from '../../api/selection';\n\nimport { showTooltip } from '../../api/widgets/tooltip';\n\nimport { WidgetProps } from '../../api/widgets/react';\nimport { LinkButton, ImageButton } from '../../api/widgets/button';\nimport { Popup } from '../../api/widgets/popup';\nimport { EditorNavigation, NavigationType } from '../../api/navigation';\nimport { Schema } from 'prosemirror-model';\nimport { textPopupDecorationPlugin, TextPopupTarget } from '../../api/text-popup';\n\nexport function linkPopupPlugin(\n schema: Schema,\n ui: EditorUI,\n nav: EditorNavigation,\n linkCmd: CommandFn,\n removeLinkCmd: CommandFn,\n) {\n const kPopupChromeWidth = 70;\n const kMaxLinkWidth = 300;\n const maxWidth = kMaxLinkWidth + kPopupChromeWidth;\n\n return textPopupDecorationPlugin({\n key: new PluginKey<DecorationSet>('link-popup'),\n markType: schema.marks.link,\n maxWidth,\n createPopup: (view: EditorView, target: TextPopupTarget<LinkProps>, style: React.CSSProperties) => {\n return Promise.resolve(\n <LinkPopup\n link={target.attrs}\n maxLinkWidth={kMaxLinkWidth - 10} // prevent off by pixel(s) overflow\n linkCmd={linkCmd}\n removeLinkCmd={removeLinkCmd}\n view={view}\n ui={ui}\n nav={nav}\n style={style}\n />,\n );\n },\n specKey: (target: TextPopupTarget<LinkProps>) => {\n const linkText = target.attrs.heading ? target.attrs.heading : target.attrs.href;\n return `link:${linkText}`;\n },\n filter: (selection: Selection) => {\n return !selectionIsImageNode(schema, selection);\n },\n onCmdClick: (target: TextPopupTarget<LinkProps>) => {\n ui.display.openURL(target.attrs.href);\n },\n });\n}\n\ninterface LinkPopupProps extends WidgetProps {\n link: LinkProps;\n maxLinkWidth: number;\n view: EditorView;\n ui: EditorUI;\n nav: EditorNavigation;\n linkCmd: CommandFn;\n removeLinkCmd: CommandFn;\n}\n\nconst LinkPopup: React.FC<LinkPopupProps> = props => {\n // link\n const linkText = props.link.heading ? props.link.heading : props.link.href;\n const onLinkClicked = () => {\n props.view.focus();\n if (props.link.heading) {\n props.nav.navigate(NavigationType.Heading, props.link.heading);\n } else if (props.link.href.startsWith('#')) {\n props.nav.navigate(NavigationType.Href, props.link.href.substr(1));\n } else {\n props.ui.display.openURL(props.link.href);\n }\n };\n\n // copy\n const showCopyButton = !props.link.heading && ClipboardJS.isSupported();\n let clipboard: ClipboardJS;\n const setCopyButton = (button: HTMLButtonElement | null) => {\n if (button) {\n clipboard = new ClipboardJS(button, {\n text: () => linkText,\n });\n clipboard.on('success', () => {\n showTooltip(button, props.ui.context.translateText('Copied to Clipboard'), 's');\n });\n } else {\n if (clipboard) {\n clipboard.destroy();\n }\n }\n };\n\n // remove\n const onRemoveClicked = () => {\n // in rstudio (w/ webkit) removing the link during the click results\n // in a page-navigation! defer to next event cycle to avoid this\n setTimeout(() => {\n props.removeLinkCmd(props.view.state, props.view.dispatch, props.view);\n props.view.focus();\n }, 0);\n };\n\n // edit\n const onEditClicked = () => {\n props.linkCmd(props.view.state, props.view.dispatch, props.view);\n };\n\n return (\n <Popup classes={['pm-popup-link']} style={props.style}>\n <LinkButton text={linkText} onClick={onLinkClicked} maxWidth={props.maxLinkWidth} />\n {showCopyButton ? (\n <ImageButton\n image={props.ui.images.copy!}\n classes={['pm-image-button-copy-link']}\n title={props.ui.context.translateText('Copy Link to Clipboard')}\n ref={setCopyButton}\n />\n ) : null}\n <ImageButton\n image={props.ui.images.removelink!}\n classes={['pm-image-button-remove-link']}\n title={props.ui.context.translateText('Remove Link')}\n onClick={onRemoveClicked}\n />\n <ImageButton\n image={props.ui.images.properties!}\n classes={['pm-image-button-edit-properties']}\n title={props.ui.context.translateText('Edit Attributes')}\n onClick={onEditClicked}\n />\n </Popup>\n );\n};\n","/*\n * tooltip.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport tlite from 'tlite';\n\nimport './tooltip.css';\n\nexport function showTooltip(\n el: Element,\n text: string,\n grav: 's' | 'n' | 'e' | 'w' | 'sw' | 'se' | 'nw' | 'ne' = 'n',\n timeout = 2000,\n) {\n el.setAttribute('title', '');\n el.setAttribute('data-tlite', text);\n tlite.show(el, { grav });\n setTimeout(() => tlite.hide(el), timeout);\n}\n","/*\n * button.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\n\nimport { WidgetProps } from './react';\n\nexport interface LinkButtonProps extends WidgetProps {\n text: string;\n onClick: () => void;\n title?: string;\n maxWidth?: number;\n}\n\nexport const LinkButton: React.FC<LinkButtonProps> = props => {\n const className = ['pm-link', 'pm-link-text-color'].concat(props.classes || []).join(' ');\n\n const style: React.CSSProperties = {\n ...props.style,\n maxWidth: props.maxWidth,\n };\n\n const onClick = (e: React.MouseEvent) => {\n e.preventDefault();\n props.onClick();\n };\n\n const onKeyDown = (e: React.KeyboardEvent) => {\n if (e.keyCode === 32) {\n e.preventDefault();\n props.onClick();\n }\n };\n\n return (\n <a\n href={props.text}\n tabIndex={0}\n onClick={onClick}\n onKeyDown={onKeyDown}\n title={props.title || props.text}\n className={className}\n style={style}\n >\n {props.text}\n </a>\n );\n};\n\nexport interface ImageButtonProps extends WidgetProps {\n title: string;\n image: string;\n tabIndex?: number;\n onClick?: () => void;\n}\n\nexport const ImageButton = React.forwardRef<HTMLButtonElement, ImageButtonProps>((props: ImageButtonProps, ref) => {\n const className = ['pm-image-button'].concat(props.classes || []).join(' ');\n const onClick = (e: React.MouseEvent) => {\n if (props.onClick) {\n e.preventDefault();\n props.onClick();\n }\n };\n return (\n <button\n onClick={onClick}\n title={props.title}\n className={className}\n style={props.style}\n ref={ref}\n tabIndex={props.tabIndex}\n >\n <img src={props.image} alt={props.title} draggable=\"false\"/>\n </button>\n );\n});\n\nexport interface TextButtonProps extends WidgetProps {\n title: string;\n onClick?: () => void;\n tabIndex?: number;\n disabled?: boolean;\n}\n\nexport const TextButton = React.forwardRef<HTMLButtonElement, TextButtonProps>((props: TextButtonProps, ref) => {\n const className = ['pm-text-button', 'pm-input-button'].concat(props.classes || []).join(' ');\n const onClick = (e: React.MouseEvent) => {\n if (props.onClick) {\n e.preventDefault();\n props.onClick();\n }\n };\n return (\n <button\n onClick={onClick}\n type=\"button\"\n className={className}\n style={props.style}\n ref={ref}\n tabIndex={props.tabIndex}\n disabled={props.disabled}\n >\n {props.title}\n </button>\n );\n});\n\nexport interface OutlineButtonProps extends WidgetProps {\n title: string;\n onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;\n tabIndex?: number;\n}\n\nexport const OutlineButton = React.forwardRef<HTMLButtonElement, OutlineButtonProps>(\n (props: OutlineButtonProps, ref) => {\n const className = ['pm-outline-button', 'pm-input-button', 'pm-input-outline-button']\n .concat(props.classes || [])\n .join(' ');\n return (\n <button\n onClick={props.onClick}\n type=\"button\"\n className={className}\n style={props.style}\n ref={ref}\n tabIndex={props.tabIndex}\n >\n {props.title}\n </button>\n );\n },\n);\n","/*\n * TextPopup.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { DecorationSet, Decoration, EditorView } from 'prosemirror-view';\nimport { Selection, Plugin, PluginKey, EditorState, Transaction } from 'prosemirror-state';\n\nimport * as React from 'react';\n\nimport { getMarkRange, getMarkAttrs } from './mark';\nimport { kRestoreLocationTransaction, kNavigationTransaction } from './transaction';\n\nimport { reactRenderForEditorView } from './widgets/react';\nimport { textRangePopupDecorationPosition } from './widgets/decoration';\nimport { kPlatformMac } from './platform';\nimport { MarkType } from 'prosemirror-model';\n\nexport interface TextPopupTarget<AttrsType = any> {\n attrs: AttrsType;\n text: string;\n}\n\nexport interface TextPopupDecoration<AttrsType = any> {\n key: PluginKey<DecorationSet>;\n markType: MarkType;\n maxWidth: number;\n createPopup: (\n view: EditorView,\n target: TextPopupTarget<AttrsType>,\n style: React.CSSProperties,\n ) => Promise<JSX.Element | null>;\n dismissOnEdit?: boolean;\n makeLinksAccessible?: boolean;\n specKey?: (target: TextPopupTarget<AttrsType>) => string;\n filter?: (selection: Selection) => boolean;\n onCmdClick?: (target: TextPopupTarget<AttrsType>) => void;\n}\n\nexport function textPopupDecorationPlugin(deco: TextPopupDecoration): Plugin<DecorationSet> {\n const {\n key,\n markType,\n maxWidth,\n createPopup,\n specKey,\n dismissOnEdit,\n makeLinksAccessible,\n filter,\n onCmdClick,\n } = deco;\n\n let editorView: EditorView;\n\n return new Plugin<DecorationSet>({\n key,\n view(view: EditorView) {\n editorView = view;\n return {};\n },\n state: {\n init: (_config: { [key: string]: any }) => {\n return DecorationSet.empty;\n },\n apply: (tr: Transaction, old: DecorationSet, _oldState: EditorState, newState: EditorState) => {\n // if this a restore location or navigation then return empty\n if (tr.getMeta(kRestoreLocationTransaction) || tr.getMeta(kNavigationTransaction)) {\n return DecorationSet.empty;\n }\n\n // if this is doc update and we have dismiss on edit then return empty\n if (dismissOnEdit && tr.docChanged) {\n return DecorationSet.empty;\n }\n\n // if the selection is contained within the mark then show the popup\n const selection = newState.selection;\n\n // TODO JJA: The mark range is undefined when the the selection is 'after' the mark\n // e.g. [@allaire2012|]\n // which means that the preview doesn't show\n const range = getMarkRange(selection.$from, markType);\n\n if (range) {\n // selection has to be bounded by the range\n if (selection.from < range.from || selection.to > range.to) {\n return DecorationSet.empty;\n }\n\n // apply the filter\n if (filter && !filter(selection)) {\n return DecorationSet.empty;\n }\n\n // don't show the link popup if it's positioned at the far left of the mark\n // (awkward when cursor is just left of an image)\n if (selection.empty && range.from === selection.from) {\n return DecorationSet.empty;\n }\n\n // mark target\n const attrs = getMarkAttrs(newState.doc, range, markType);\n const text = newState.doc.textBetween(range.from, range.to);\n const target = { attrs, text };\n\n // compute position (we need this both for setting the styles on the LinkPopup\n // as well as for setting the Decorator pos)\n const decorationPosition = textRangePopupDecorationPosition(editorView, range, maxWidth);\n\n // key if one was provided\n let decoratorSpec: { [key: string]: any } | undefined;\n if (specKey) {\n decoratorSpec = {\n key: decorationPosition.key + specKey(target),\n ignoreSelection: true,\n stopEvent: () => {\n return true;\n },\n };\n }\n\n // create decorator\n const textPopupDecorator = Decoration.widget(\n decorationPosition.pos,\n\n (view: EditorView, getPos: () => number) => {\n // create decorator and render popup into it\n const decorationEl = window.document.createElement('div');\n decorationEl.style.visibility = 'hidden';\n\n // create popup component\n createPopup(view, target, decorationPosition.style).then(popup => {\n if (popup) {\n reactRenderForEditorView(popup, decorationEl, view);\n\n // make sure links responsd to spacebar\n if (makeLinksAccessible) {\n const links = decorationEl.getElementsByTagName('a');\n // tslint:disable-next-line: prefer-for-of\n for (let i = 0; i < links.length; i++) {\n const link = links[0];\n link.onkeydown = (e: KeyboardEvent) => {\n if (e.keyCode === 32) {\n e.preventDefault();\n link.click();\n }\n };\n }\n }\n\n decorationEl.style.visibility = 'visible';\n }\n });\n\n return decorationEl;\n },\n\n decoratorSpec,\n );\n\n // return decorations\n return DecorationSet.create(tr.doc, [textPopupDecorator]);\n } else {\n return DecorationSet.empty;\n }\n },\n },\n props: {\n decorations: (state: EditorState) => {\n return key.getState(state);\n },\n handleClick: onCmdClick\n ? (view: EditorView, pos: number, event: MouseEvent) => {\n const keyPressed = kPlatformMac && event.metaKey;\n if (keyPressed) {\n const attrs = getMarkAttrs(view.state.doc, { from: pos, to: pos }, markType);\n const range = getMarkRange(view.state.doc.resolve(pos));\n if (attrs && range) {\n event.stopPropagation();\n event.preventDefault();\n const text = view.state.doc.textBetween(range.from, range.to);\n onCmdClick({ attrs, text });\n return true;\n }\n }\n return false;\n }\n : undefined,\n },\n });\n}\n","/*\n * react.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport * as React from 'react';\nimport * as ReactDOM from 'react-dom';\n\nimport { EditorView } from 'prosemirror-view';\n\nexport interface WidgetProps {\n classes?: string[];\n style?: React.CSSProperties;\n}\n\n// Render a react element into a DOM container that will eventually be added to the EditorView.dom\n// this function is necessary for situations where an element is created and then handed to ProseMirror\n// (unattached to the DOM), and then subsequently destoyed/unmounted by ProseMirror. We use a\n// MutationObserver to watch EditorView.dom for the element's removal then in response call\n// ReactDOM.unmountComponentAtNode\nexport function reactRenderForEditorView(element: React.ReactElement, container: HTMLElement, view: EditorView) {\n // render the react element into the container\n const ref = ReactDOM.render(element, container);\n\n // track view dom mutations to determine when ProseMirror has destroyed the element\n // (our cue to unmount/cleanup the react component)\n const observer = new MutationObserver(mutationsList => {\n mutationsList.forEach(mutation => {\n mutation.removedNodes.forEach(node => {\n if (node === container) {\n observer.disconnect();\n ReactDOM.unmountComponentAtNode(container);\n }\n });\n });\n });\n observer.observe(view.dom, { attributes: false, childList: true, subtree: true });\n\n // return the ref\n return ref;\n}\n","/*\n * decoration.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { ResolvedPos } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\n\nimport { editingRootNodeClosestToPos } from '../node';\n\nimport { kPixelUnit } from '../css';\n\nexport interface DecorationPosition {\n pos: number;\n style: { [key: string]: string };\n key: string;\n}\n\nexport function textRangePopupDecorationPosition(\n view: EditorView,\n range: { from: number; to: number },\n maxWidth: number,\n): DecorationPosition {\n // get the (window) DOM coordinates for the start of the range. we use range.from + 1 so\n // that ranges that are at the beginning of a line don't have their position set\n // to the previous line\n const rangeCoords = view.coordsAtPos(range.from + 1);\n\n // get the node, element, coordinates, and style for the current editing root\n const rangePos = view.state.doc.resolve(range.from);\n const editingNode = editingRootNodeClosestToPos(rangePos)!;\n const editingEl = view.domAtPos(editingNode!.pos + 1).node as HTMLElement;\n const editingBox = editingEl.getBoundingClientRect();\n const editingBoxStyle = window.getComputedStyle(editingEl);\n\n // base popup style\n const topPadding = parseInt(editingBoxStyle.paddingTop!, 10) || 0;\n const popupStyle = {\n top: rangeCoords.bottom - editingBox.top - topPadding + 5 + kPixelUnit,\n };\n\n // we need to compute whether the popup will be visible (horizontally), do\n // this by testing whether we have room for the max link width + controls/padding\n let style: { [key: string]: string };\n const positionRight = rangeCoords.left + maxWidth > editingBox.right;\n if (positionRight) {\n const rightCoords = view.coordsAtPos(range.to);\n const rightPos = rangeCoords.top === rightCoords.top ? editingBox.right - rightCoords.right : 0;\n style = {\n ...popupStyle,\n right: rightPos + kPixelUnit,\n };\n } else {\n const marginLeft =\n 'calc(' +\n (rangeCoords.left - editingBox.left) +\n 'px ' +\n ' - ' +\n editingBoxStyle.borderLeftWidth +\n ' - ' +\n editingBoxStyle.paddingLeft +\n ' - ' +\n editingBoxStyle.marginLeft +\n ' - 1ch' +\n ')';\n style = {\n ...popupStyle,\n marginLeft,\n };\n }\n\n // calculate key\n const key = Object.keys(style)\n .map(attrib => `${attrib}=${style[attrib]}`)\n .join(';');\n\n return {\n pos: editingNode.pos + editingNode.node.nodeSize - 1,\n style,\n key,\n };\n}\n\nfunction getEditingBox(view: EditorView, pos$: ResolvedPos) {\n const editingNode = editingRootNodeClosestToPos(pos$);\n const editingEl = view.domAtPos(editingNode!.pos + 1).node as HTMLElement;\n return editingEl.getBoundingClientRect();\n}\n","/*\n * select_all.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorState, Transaction, TextSelection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { findBlockNodes, ContentNodeWithPos } from 'prosemirror-utils';\n\nimport { Extension } from '../api/extension';\nimport { ProsemirrorCommand, EditorCommandId } from '../api/command';\nimport { editingRootNode } from '../api/node';\n\nconst extension: Extension = {\n commands: () => {\n return [new ProsemirrorCommand(EditorCommandId.SelectAll, ['Mod-a'], selectAll)];\n },\n};\n\nexport function selectAll(state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) {\n if (dispatch) {\n const editingRoot = editingRootNode(state.selection);\n if (editingRoot) {\n const schema = state.schema;\n const tr = state.tr;\n if (editingRoot.node.type === schema.nodes.note) {\n tr.setSelection(childBlocksSelection(tr.doc, editingRoot));\n } else {\n const start = tr.doc.resolve(editingRoot.pos);\n const end = tr.doc.resolve(editingRoot.pos + editingRoot.node.nodeSize);\n tr.setSelection(new TextSelection(start, end));\n }\n dispatch(tr);\n if (view) {\n // we do this to escape from embedded editors e.g. codemirror\n view.focus();\n }\n }\n }\n return true;\n}\n\nfunction childBlocksSelection(doc: ProsemirrorNode, parent: ContentNodeWithPos) {\n const blocks = findBlockNodes(parent.node);\n const begin = parent.start + blocks[0].pos + 1;\n const lastBlock = blocks[blocks.length - 1];\n const end = parent.start + lastBlock.pos + lastBlock.node.nodeSize;\n return TextSelection.create(doc, begin, end);\n}\n\nexport default extension;\n","/*\n * history.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { history, redo, undo } from 'prosemirror-history';\n\nimport { ProsemirrorCommand, EditorCommandId } from '../api/command';\nimport { Extension } from '../api/extension';\n\nconst extension: Extension = {\n commands: () => {\n return [\n new ProsemirrorCommand(EditorCommandId.Undo, ['Mod-z'], undo),\n new ProsemirrorCommand(EditorCommandId.Redo, ['Shift-Mod-z'], redo),\n ];\n },\n\n plugins: () => {\n return [history()];\n },\n};\n\nexport default extension;\n","/*\n * cursor.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { PluginKey, Plugin, EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { ResolvedPos, Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { dropCursor } from 'prosemirror-dropcursor';\nimport { gapCursor, GapCursor } from 'prosemirror-gapcursor';\nimport 'prosemirror-gapcursor/style/gapcursor.css';\n\nimport { findParentNodeOfTypeClosestToPos, findParentNodeOfType, findParentNode } from 'prosemirror-utils';\n\nimport { Extension } from '../api/extension';\nimport { BaseKey, verticalArrowCanAdvanceWithinTextBlock } from '../api/basekeys';\nimport { isList } from '../api/list';\n\nimport './cursor.css';\n\n\nconst extension: Extension = {\n\n baseKeys: () => {\n return [\n { key: BaseKey.ArrowLeft, command: gapArrowHandler('left') },\n { key: BaseKey.ArrowUp, command: gapArrowHandler('up') }\n ];\n },\n\n plugins: () => {\n return [\n gapCursor(), \n dropCursor(),\n new Plugin({\n key: new PluginKey('div-gap-cursor'),\n props: {\n handleDOMEvents: {\n click: gapClickHandler,\n },\n },\n })];\n },\n};\n\nfunction gapArrowHandler(dir: 'up' | 'left') {\n return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n \n\n // function to create a gap cursor\n const createGapCursor = ($pos: ResolvedPos) => {\n if (dispatch) {\n const cursor = new GapCursor($pos, $pos);\n const tr = state.tr;\n tr.setSelection(cursor);\n dispatch(tr);\n }\n return true;\n };\n\n if (state.selection.empty && view && view.endOfTextblock(dir)) {\n \n // get the selection\n const $head = state.selection.$head;\n\n // if we are in a block that handles up/down (e.g. display math)\n // then we don't want to make a gap cursor\n if (dir === 'up' && verticalArrowCanAdvanceWithinTextBlock(state.selection, dir)) {\n return false;\n }\n\n // check if we are in a div \n if (state.schema.nodes.div) {\n const div = findParentNodeOfType(state.schema.nodes.div)(state.selection);\n \n // if we are at the very top of a div then create a gap cursor\n if (div) {\n \n const $divPos = state.doc.resolve(div.pos);\n if ($head.index($head.depth - 1) === 0 && !(state.selection instanceof GapCursor)) {\n \n // if we are in a list item the calculations about view.endOfTextblock will be off\n if (findParentNode(isList)(state.selection)) {\n return false;\n }\n \n return createGapCursor(state.doc.resolve($divPos.pos + 1));\n // if we are between divs then create a gap cursor between them\n } else if ($divPos.nodeBefore?.type === state.schema.nodes.div) {\n return createGapCursor(state.doc.resolve($divPos.pos));\n } \n }\n }\n \n\n // if we are at the top of the document then create a gap cursor\n if (!$head.nodeBefore && ($head.pos <= 2)) {\n return createGapCursor(state.doc.resolve($head.pos - 1));\n }\n \n return false;\n\n } else {\n return false;\n }\n\n \n };\n}\n\n\nfunction gapClickHandler(view: EditorView, event: Event): boolean {\n\n const schema = view.state.schema;\n const mouseEvent = event as MouseEvent;\n const clickPos = view.posAtCoords({ left: mouseEvent.clientX, top: mouseEvent.clientY } );\n\n if (clickPos) {\n\n // resolve click pos\n const $clickPos = view.state.doc.resolve(clickPos.pos); \n\n // create a gap cursor at the click position\n const createGapCursor = () => {\n // focus the view\n view.focus();\n \n // create the gap cursor\n const tr = view.state.tr;\n const cursor = new GapCursor($clickPos, $clickPos); \n tr.setSelection(cursor);\n view.dispatch(tr);\n \n // prevent default event handling\n event.preventDefault();\n event.stopImmediatePropagation();\n return false;\n };\n \n // handle clicks at the top of divs\n if (schema.nodes.div) {\n const div = findParentNodeOfTypeClosestToPos(\n view.state.doc.resolve(clickPos.pos), schema.nodes.div\n );\n if (div && div.pos === clickPos.inside) {\n const divNode = view.nodeDOM(div.start);\n if (divNode instanceof HTMLElement) {\n if (Math.abs(mouseEvent.clientX - divNode.getBoundingClientRect().left) < 150) {\n return createGapCursor();\n }\n }\n }\n }\n\n // handle clicks between certain block types that don't have a natural text cursor\n // for inserting additioanl content\n const blockRequiresGap = (node: ProsemirrorNode | null | undefined) => {\n if (node) {\n return node.type === schema.nodes.div ||\n node.type === schema.nodes.figure ||\n node.type === schema.nodes.table ||\n node.type === schema.nodes.horizontal_rule ||\n node.type === schema.nodes.code_block;\n } else {\n return false;\n }\n };\n if (!clickPos.inside) {\n if (blockRequiresGap($clickPos.nodeBefore) && blockRequiresGap($clickPos.nodeAfter)) {\n return createGapCursor();\n }\n }\n\n // handle clicks above body\n // Take this out for now b/c it was interfering with other mouse \n // gestures (e.g. clicking on attr editor). keyboard gestures still\n // work to get to the top of the body\n /*\n if ($clickPos.parent.type === schema.nodes.body &&\n $clickPos.start() === $clickPos.pos) {\n \n return createGapCursor();\n\n }\n */\n }\n\n return false;\n}\n\nexport default extension;\n","/*\n * clear_formatting.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\n\nimport { Extension } from '../api/extension';\nimport { ProsemirrorCommand, EditorCommandId } from '../api/command';\nimport { liftTarget } from 'prosemirror-transform';\n\n// marks included in clear formatting\nconst kFormattingMarks = ['code', 'em', 'underline', 'smallcaps', 'span', 'strikeout', 'strong', 'superscript', 'subscript'];\n\n// for nodes, all nodes with isTextblock === true will be converted to paragraph, and all\n// nodes in this list will be lifted\nconst kLiftFormattingNodes = ['blockquote', 'line_block', 'div', 'raw_block'];\n\nconst extension: Extension = {\n commands: () => {\n return [new ProsemirrorCommand(EditorCommandId.ClearFormatting, ['Mod-\\\\'], clearFormatting)];\n },\n};\n\nexport function clearFormatting(state: EditorState, dispatch?: (tr: Transaction) => void) {\n if (dispatch) {\n // create transaction\n const tr = state.tr;\n\n // alias schema and selection\n const schema = state.schema;\n const { from, to } = tr.selection;\n\n // clear formatting marks\n kFormattingMarks.forEach(markName => {\n const mark = state.schema.marks[markName];\n if (mark) {\n tr.removeMark(from, to, mark);\n }\n });\n tr.setStoredMarks([]);\n\n // lift / set nodes as required\n tr.doc.nodesBetween(from, to, (node: ProsemirrorNode, pos: number) => {\n // ignore paragraph and text nodes (already have 'cleared' formatting)\n if (node.type === schema.nodes.paragraph || node.type === schema.nodes.text) {\n return;\n }\n\n // pass recursively through list container nodes\n if (\n node.type === schema.nodes.bullet_list ||\n node.type === schema.nodes.ordered_list ||\n node.type === schema.nodes.definition_list ||\n node.type === schema.nodes.definition_list_term ||\n node.type === schema.nodes.definition_list_description\n ) {\n return;\n }\n\n // get node range (map positions)\n const fromPos = tr.doc.resolve(tr.mapping.map(pos + 1));\n const toPos = tr.doc.resolve(tr.mapping.map(pos + node.nodeSize - 1));\n const nodeRange = fromPos.blockRange(toPos);\n\n // process text blocks and blocks that can be lifted (e.g. blockquote)\n if (nodeRange) {\n if (node.type.isTextblock) {\n tr.setNodeMarkup(nodeRange.start, schema.nodes.paragraph);\n } else if (kLiftFormattingNodes.includes(node.type.name)) {\n const targetLiftDepth = liftTarget(nodeRange);\n if (targetLiftDepth || targetLiftDepth === 0) {\n tr.lift(nodeRange, targetLiftDepth);\n }\n }\n }\n });\n\n dispatch(tr);\n }\n\n return true;\n}\n\nexport default extension;\n","/*\n * smarty.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { ellipsis, InputRule } from 'prosemirror-inputrules';\nimport { Plugin, PluginKey, EditorState } from 'prosemirror-state';\nimport { Schema } from 'prosemirror-model';\n\nimport { Extension, extensionIfEnabled } from '../api/extension';\nimport { fancyQuotesToSimple } from '../api/quote';\n\nconst plugin = new PluginKey('smartypaste');\n\n// match enDash but only for lines that aren't an html comment\nconst enDash = new InputRule(/[^!-`]--$/, (state: EditorState, match: string[], start: number, end: number) => {\n const { parent, parentOffset } = state.selection.$head;\n const precedingText = parent.textBetween(0, parentOffset);\n if (precedingText.indexOf('<!--') === -1) {\n const tr = state.tr;\n tr.insertText('–', end - 1, end);\n return tr;\n } else {\n return null;\n }\n});\n\nconst emDash = new InputRule(/(^|[^`])–-$/, (state: EditorState, match: string[], start: number, end: number) => {\n const tr = state.tr;\n tr.insertText('—', end - 1, end);\n return tr;\n});\n\nconst extension: Extension = {\n inputRules: () => {\n return [ellipsis, enDash, emDash];\n },\n\n plugins: (schema: Schema) => {\n return [\n // apply smarty rules to plain text pastes\n new Plugin({\n key: plugin,\n props: {\n transformPastedText(text: string) {\n // emdash\n text = text.replace(/(\\w)---(\\w)/g, '$1—$2');\n\n // endash\n text = text.replace(/(\\w)--(\\w)/g, '$1–$2');\n\n // ellipses\n text = text.replace(/\\.\\.\\./g, '…');\n\n // we explicitly don't want fancy quotes in the editor\n text = fancyQuotesToSimple(text);\n\n return text;\n },\n },\n }),\n ];\n },\n};\n\nexport default extensionIfEnabled(extension, 'smart');\n","/*\n * attr_duplicate_id.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Transaction } from 'prosemirror-state';\nimport { Schema, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { Step, AddMarkStep } from 'prosemirror-transform';\nimport { findChildren } from 'prosemirror-utils';\n\nimport { Extension } from '../api/extension';\nimport { getMarkAttrs, getMarkRange } from '../api/mark';\nimport { extensionIfPandocAttrEnabled } from '../api/pandoc_attr';\n\nconst extension: Extension = {\n appendTransaction: (_schema: Schema) => {\n // detect changes in content with ids\n const hasAttrId = (node: ProsemirrorNode) => {\n return !!node.attrs.id || node.marks.some(mark => !!mark.attrs.id);\n };\n\n // detect mark steps with new ids\n const attrMarkStep = (step: Step) => {\n return step instanceof AddMarkStep && !!(step as any).mark.attrs.id;\n };\n\n return [\n {\n name: 'attr_duplicate_id',\n filter: (transactions: Transaction[]) => transactions.some(transaction => transaction.steps.some(attrMarkStep)),\n nodeFilter: hasAttrId,\n append: (tr: Transaction) => {\n const usedIds = new Set<string>();\n const scannedRanges: Array<{ from: number; to: number }> = [];\n findChildren(tr.doc, hasAttrId, true).forEach(attrNode => {\n if (attrNode.node.attrs.id) {\n const id = attrNode.node.attrs.id;\n if (usedIds.has(id)) {\n const node = attrNode.node;\n tr.setNodeMarkup(attrNode.pos, undefined, { ...node.attrs, id: null }, node.marks);\n } else {\n usedIds.add(id);\n }\n } else {\n const mark = attrNode.node.marks.find(mk => !!mk.attrs.id)!;\n const markRange = getMarkRange(tr.doc.resolve(attrNode.pos), mark.type) as { from: number; to: number };\n const markAttrs = getMarkAttrs(tr.doc, markRange, mark.type);\n const id = markAttrs.id;\n if (id && !scannedRanges.find(range => range.from === markRange.from && range.to === markRange.to)) {\n scannedRanges.push(markRange);\n if (usedIds.has(id)) {\n tr.removeMark(markRange.from, markRange.to, mark.type);\n tr.addMark(markRange.from, markRange.to, mark.type.create({ ...mark.attrs, id: null }));\n } else {\n usedIds.add(id);\n }\n }\n }\n });\n },\n },\n ];\n },\n};\n\nexport default extensionIfPandocAttrEnabled(extension);\n","/*\n * trailing_p.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Transaction } from 'prosemirror-state';\nimport { Schema } from 'prosemirror-model';\nimport { Extension } from '../api/extension';\nimport { FixupContext } from '../api/fixup';\nimport { requiresTrailingP, insertTrailingP } from '../api/trailing_p';\n\nconst extension: Extension = {\n fixups: () => {\n return [\n (tr: Transaction, context: FixupContext) => {\n if (context === FixupContext.Load) {\n if (requiresTrailingP(tr.selection)) {\n insertTrailingP(tr);\n }\n }\n return tr;\n },\n ];\n },\n\n appendTransaction: (schema: Schema) => {\n return [\n {\n name: 'trailing_p',\n append: (tr: Transaction) => {\n if (requiresTrailingP(tr.selection)) {\n insertTrailingP(tr);\n }\n return tr;\n },\n },\n ];\n },\n};\n\nexport default extension;\n","/*\n * empty_mark.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { Transaction, EditorState } from 'prosemirror-state';\nimport { ReplaceStep } from 'prosemirror-transform';\n\nimport { Extension } from '../api/extension';\nimport { getMarkRange } from '../api/mark';\n\nconst extension: Extension = {\n appendTransaction: (schema: Schema) => {\n return [\n {\n name: 'clear_empty_mark',\n append: (tr: Transaction, transactions: Transaction[], _oldState: EditorState, newState: EditorState) => {\n // if we have an empty selection\n if (newState.selection.empty) {\n // if the last change removed text\n const removedText = transactions.some(transaction =>\n transaction.steps.some(step => {\n return step instanceof ReplaceStep && (step as any).slice.content.size === 0;\n }),\n );\n if (removedText) {\n // if there is a stored mark w/ 0 range then remove it\n newState.storedMarks?.forEach(mark => {\n const markRange = getMarkRange(tr.doc.resolve(tr.selection.from), mark.type);\n if (!markRange || markRange.from === markRange.to) {\n tr.removeStoredMark(mark);\n }\n });\n }\n }\n },\n },\n ];\n },\n};\n\nexport default extension;\n","/*\n * escape_mark.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { Schema } from 'prosemirror-model';\n\nimport { BaseKey } from '../api/basekeys';\nimport { Extension } from '../api/extension';\n\nconst extension: Extension = {\n baseKeys: (_schema: Schema) => {\n return [\n {\n key: BaseKey.ArrowRight,\n command: (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n if (state.selection.empty) {\n // if we are at the end of a parent text block and there are\n // marks stored in the state or active on the selection then\n // clear the stored marks and insert a space.\n const $head = state.selection.$head;\n const parent = $head.node($head.depth);\n if (\n parent.type.isTextblock &&\n $head.parentOffset === parent.textContent.length &&\n ($head.marks().length > 0 || !!state.storedMarks)\n ) {\n if (dispatch) {\n const tr = state.tr;\n tr.setStoredMarks([]);\n tr.insertText(' ');\n dispatch(tr);\n }\n return true;\n }\n }\n return false;\n },\n },\n ];\n },\n};\n\nexport default extension;\n","/*\n * code_block_input.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { Schema, ResolvedPos, Fragment } from 'prosemirror-model';\nimport { InputRule } from 'prosemirror-inputrules';\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { PandocExtensions } from '../api/pandoc';\nimport { EditorFormat } from '../api/format';\nimport { Extension, ExtensionContext } from '../api/extension';\nimport { precedingListItemInsertPos, precedingListItemInsert } from '../api/list';\nimport { pandocAttrFrom } from '../api/pandoc_attr';\nimport { BaseKey } from '../api/basekeys';\n\nimport { markIsActive } from '../api/mark';\nimport { canInsertRmdChunk } from '../api/rmd';\n\nconst extension = (context: ExtensionContext): Extension => {\n const { pandocExtensions, format } = context;\n\n const fencedAttributes = pandocExtensions.fenced_code_attributes || !!format.rmdExtensions.codeChunks;\n\n return {\n baseKeys: () => {\n return [{ key: BaseKey.Enter, command: codeBlockInputRuleEnter(pandocExtensions, fencedAttributes, format) }];\n },\n\n inputRules: () => {\n if (fencedAttributes) {\n return [\n new InputRule(/^```+{$/, (state: EditorState, match: string[], start: number, end: number) => {\n if (!canApplyCodeBlockInputRule(state)) {\n return null;\n }\n const tr = state.tr;\n tr.insertText('{}');\n setTextSelection(start + match[0].length)(tr);\n return tr;\n }),\n ];\n } else {\n return [];\n }\n },\n };\n};\n\nfunction codeBlockInputRuleEnter(pandocExtensions: PandocExtensions, fencedAttributes: boolean, format: EditorFormat) {\n return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n // see if the parent consist of a pending code block input rule\n const schema = state.schema;\n const { $head } = state.selection;\n\n // selection must be empty\n if (!state.selection.empty) {\n return false;\n }\n\n // full text of parent must meet the pattern\n // eslint-disable-next-line no-useless-escape\n const match = $head.parent.textContent.match(/^```+(?:(\\w+)|\\{([\\.=]?[^\\}]+)\\})?$/);\n if (!match) {\n return false;\n }\n\n // no inline code marks\n if (markIsActive(state, schema.marks.code)) {\n return false;\n }\n\n // must be able to perform the replacement\n if (!canApplyCodeBlockInputRule(state)) {\n return false;\n }\n\n // determine nature of insert\n const fenced = fencedAttributes && !!match[2];\n const langAttrib = fenced ? match[2] : match[1] || '';\n const rawBlock = fenced && pandocExtensions.raw_attribute && langAttrib.match(/^=\\w.*$/);\n const rmdChunk = fenced && !!format.rmdExtensions.codeChunks && langAttrib.match(/^\\w.*$/);\n\n // if it's an rmd chunk then apply further validation\n if (rmdChunk && !canInsertRmdChunk(state)) {\n return false;\n }\n\n // execute\n if (dispatch) {\n // eslint-disable-next-line no-useless-escape\n const lang = langAttrib.replace(/^[\\.=]/, '');\n\n // create transaction and clear input\n const tr = state.tr;\n const start = $head.start();\n const end = start + $head.parent.textContent.length;\n tr.deleteRange(start, end);\n\n // determine type and attrs\n const type = rawBlock ? schema.nodes.raw_block : rmdChunk ? schema.nodes.rmd_chunk : schema.nodes.code_block;\n const content = rmdChunk ? schema.text(`{${match[2]}}\\n`) : Fragment.empty;\n const attrs = rawBlock ? { format: lang } : !rmdChunk && lang.length ? pandocAttrFrom({ classes: [lang] }) : {};\n\n // see if this should go into a preceding list item\n const prevListItemPos = precedingListItemInsertPos(state.doc, state.selection);\n if (prevListItemPos) {\n const block = type.createAndFill(attrs, content);\n precedingListItemInsert(tr, prevListItemPos, block);\n } else {\n tr.insert(start, content);\n tr.setBlockType(start, start, type, attrs);\n }\n\n dispatch(tr);\n }\n\n return true;\n };\n}\n\nfunction canReplaceNodeWithCodeBlock(schema: Schema, $pos: ResolvedPos) {\n return $pos.node(-1).canReplaceWith($pos.index(-1), $pos.indexAfter(-1), schema.nodes.code_block);\n}\n\nfunction canApplyCodeBlockInputRule(state: EditorState) {\n const schema = state.schema;\n const { $head } = state.selection;\n return canReplaceNodeWithCodeBlock(schema, $head) || precedingListItemInsertPos(state.doc, state.selection);\n}\n\nexport default extension;\n","/*\n * plain_text_paste.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { ResolvedPos, Schema, Fragment, Slice } from 'prosemirror-model';\nimport { Plugin, PluginKey } from 'prosemirror-state';\n\nimport { Extension } from '../api/extension';\n\nconst extension: Extension = {\n plugins: (schema: Schema) => [pasteTextPlugin(schema)],\n};\n\nfunction pasteTextPlugin(schema: Schema) {\n return new Plugin({\n key: new PluginKey('paste-text'),\n\n props: {\n clipboardTextParser: (text: string, $context: ResolvedPos): any => {\n // if it's a single line then create a slice w/ marks from the context active\n if (text.indexOf('\\n') === -1) {\n const marks = $context.marks();\n const textNode = schema.text(text, marks);\n return new Slice(Fragment.from(textNode), 0, 0);\n } else {\n return null;\n }\n },\n },\n });\n}\n\nexport default extension;\n","/*\n * bottom_padding.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Selection, Plugin, PluginKey, EditorState } from 'prosemirror-state';\nimport { Schema } from 'prosemirror-model';\n\nimport zenscroll from 'zenscroll';\n\nimport { Extension } from '../api/extension';\nimport { selectionWithinLastBodyParagraph } from '../api/selection';\nimport { EditorView } from 'prosemirror-view';\nimport { bodyElement } from '../api/dom';\nimport { findParentNodeOfType } from 'prosemirror-utils';\n\n// when we get close to the bottom, we autoscroll to provide more padding\nconst kAutoscrollGapPx = 25;\n\nconst extension: Extension = {\n plugins: (schema: Schema) => {\n return [\n new Plugin({\n key: new PluginKey('bottom_padding'),\n view: () => ({\n update: (view: EditorView, prevState: EditorState) => {\n const selection = view.state.selection;\n if (selectionWithinLastBodyParagraph(selection)) {\n const paragraphNode = findParentNodeOfType(schema.nodes.paragraph)(selection);\n if (paragraphNode) {\n const paragraphEl = view.nodeDOM(paragraphNode.pos) as HTMLElement;\n const paragraphRect = paragraphEl.getBoundingClientRect();\n const editorEl = view.dom;\n const editorRect = editorEl.getBoundingClientRect();\n if (Math.abs(paragraphRect.bottom - editorRect.bottom) < kAutoscrollGapPx) {\n const bodyEl = bodyElement(view);\n const scroller = zenscroll.createScroller(bodyEl);\n scroller.toY(bodyEl.scrollHeight, 0);\n }\n }\n }\n },\n }),\n }),\n ];\n },\n};\n\nexport default extension;\n","/*\n * insert_symbol.tsx\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { PluginKey, Transaction, EditorState } from 'prosemirror-state';\n\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { EditorUI } from '../../api/ui';\nimport { parseCodepoint } from '../../api/unicode';\nimport { OmniInsertGroup } from '../../api/omni_insert';\n\nimport { performInsertSymbol, InsertSymbolPlugin } from './insert_symbol-plugin';\nimport { SymbolDataProvider, SymbolCharacterGroup, SymbolCharacter } from './insert_symbol-dataprovider';\n\nimport symbolData from './symbols';\n\nconst key = new PluginKey<boolean>('insert-symbol');\n\nconst extension = (context: ExtensionContext): Extension => {\n const { ui, events } = context;\n return {\n commands: () => {\n return [new ProsemirrorCommand(EditorCommandId.Symbol, [], performInsertSymbol(key), symbolOmniInsert(ui))];\n },\n plugins: (_schema: Schema) => {\n return [new InsertSymbolPlugin(key, new UnicodeSymbolDataProvider(), ui, events)];\n },\n };\n};\n\nfunction symbolOmniInsert(ui: EditorUI) {\n return {\n name: ui.context.translateText('Symbol...'),\n keywords: ['unicode', 'special', 'character'],\n description: ui.context.translateText('Unicode symbol / special character'),\n group: OmniInsertGroup.Content,\n priority: 6,\n image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.symbol_dark! : ui.images.omni_insert?.symbol!),\n };\n}\n\nclass UnicodeSymbolDataProvider implements SymbolDataProvider {\n constructor() {\n this.symbolGroups = symbolData.sort((a, b) => a.name.localeCompare(b.name));\n }\n private readonly symbolGroups: SymbolCharacterGroup[];\n\n public insertSymbolTransaction(\n symbolCharacter: SymbolCharacter,\n searchTerm: string,\n state: EditorState,\n ): Transaction {\n const tr = state.tr;\n tr.insertText(symbolCharacter.value);\n return tr;\n }\n\n public readonly filterPlaceholderHint = 'keyword or codepoint';\n\n public readonly symbolPreviewStyle: React.CSSProperties = { fontSize: '28px' } as React.CSSProperties;\n\n public symbolGroupNames(): string[] {\n return [kCategoryAll, ...this.symbolGroups.map(symbolGroup => symbolGroup.name)];\n }\n\n public getSymbols(groupName: string | undefined) {\n if (groupName === undefined || groupName === kCategoryAll) {\n return this.symbolGroups\n .map(symbolGroup => symbolGroup.symbols)\n .flat()\n .sort((a, b) => a.codepoint! - b.codepoint!);\n }\n return this.symbolGroups\n .filter(symbolGroup => groupName === symbolGroup.name)\n .map(symbolGroup => symbolGroup.symbols)\n .flat();\n }\n\n public filterSymbols(filterText: string, symbols: SymbolCharacter[]): SymbolCharacter[] {\n const codepoint = parseCodepoint(filterText);\n const filteredSymbols = symbols.filter(symbol => {\n // Search by name\n if (symbol.name.includes(filterText.toUpperCase())) {\n return true;\n }\n\n // Search by codepoint\n if (codepoint && symbol.codepoint === codepoint) {\n return true;\n }\n\n return false;\n });\n\n if (filteredSymbols.length === 0 && codepoint !== undefined) {\n return [\n {\n name: codepoint.toString(16),\n value: String.fromCodePoint(codepoint),\n codepoint,\n },\n ];\n }\n return filteredSymbols;\n }\n}\nconst kCategoryAll = 'All';\n\nexport default extension;\n","/*\n * unicode.ts\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n// Tries to parse a unicode codepoint string that a user might enter\n// For example:\n// U+2A1F\n// 2A1F\n// 10783\nconst kMinValidCodepoint = 0;\nconst kMaxValidCodepoint = 1114112;\n\nconst kHexCodepointPrefix = 'U+';\nconst kHexNumberPrefex = '0x';\n\nexport function parseCodepoint(codepointText: string): number | undefined {\n // Try parsing it as a base 10 int\n // Use non primitive Number so we get strict parsing\n const base10Value = Number(codepointText).valueOf();\n if (!Number.isNaN(base10Value)) {\n if (isValidCodepoint(base10Value)) {\n return base10Value;\n }\n }\n\n // It might have a user prefix for unicode character, remove\n let hexOnlyText = codepointText.toUpperCase();\n if (hexOnlyText.startsWith(kHexCodepointPrefix.toUpperCase())) {\n hexOnlyText = codepointText.substr(kHexCodepointPrefix.length, codepointText.length - kHexCodepointPrefix.length);\n }\n\n // try parsing it as a hex string\n // Use non primitive Number so we get strict parsing, prefix with 0x to ensure treatment as hex\n if (!hexOnlyText.startsWith(kHexNumberPrefex)) {\n hexOnlyText = kHexNumberPrefex + hexOnlyText;\n }\n const hexValue = Number(hexOnlyText).valueOf();\n if (!Number.isNaN(hexValue) && isValidCodepoint(hexValue)) {\n return hexValue;\n }\n\n return undefined;\n}\n\nfunction isValidCodepoint(codepoint: number) {\n return codepoint > kMinValidCodepoint && codepoint < kMaxValidCodepoint;\n}\n","/*\n * insert_symbol-plugin.tsx\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction, Plugin, PluginKey } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport React from 'react';\nimport ReactDOM from 'react-dom';\n\nimport { applyStyles } from '../../api/css';\nimport { EditorEvents } from '../../api/events';\nimport { canInsertNode } from '../../api/node';\nimport { EditorUI } from '../../api/ui';\n\nimport { InsertSymbolPopup } from './insert_symbol-popup';\nimport { SymbolDataProvider, SymbolCharacter } from './insert_symbol-dataprovider';\n\nimport { ScrollEvent } from '../../api/event-types';\n\nconst kMinimumPanelPaddingToEdgeOfView = 5;\n\nexport const performInsertSymbol = (pluginKey: PluginKey<boolean>) => {\n return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n if (!isEnabled(state)) {\n return false;\n }\n\n if (dispatch && view) {\n const plugin = pluginKey.get(state) as InsertSymbolPlugin;\n plugin.showPopup(view);\n }\n return true;\n };\n};\n\nfunction isEnabled(state: EditorState) {\n return canInsertNode(state, state.schema.nodes.text);\n}\n\nexport class InsertSymbolPlugin extends Plugin<boolean> {\n private readonly scrollUnsubscribe: VoidFunction;\n private readonly ui: EditorUI;\n private popup: HTMLElement | null = null;\n private dataProvider: SymbolDataProvider;\n\n constructor(pluginKey: PluginKey<boolean>, dataProvider: SymbolDataProvider, ui: EditorUI, events: EditorEvents) {\n super({\n key: pluginKey,\n view: () => ({\n update: () => {\n this.closePopup();\n },\n destroy: () => {\n this.closePopup();\n this.scrollUnsubscribe();\n window.document.removeEventListener('onfocus', this.focusChanged);\n },\n }),\n });\n\n this.dataProvider = dataProvider;\n this.ui = ui;\n this.closePopup = this.closePopup.bind(this);\n this.scrollUnsubscribe = events.subscribe(ScrollEvent, this.closePopup);\n\n this.focusChanged = this.focusChanged.bind(this);\n window.document.addEventListener('onfocus', this.focusChanged);\n }\n\n public showPopup(view: EditorView) {\n if (!this.popup) {\n const kHeight = 336;\n const kWidth = 450;\n\n this.popup = window.document.createElement('div');\n this.popup.tabIndex = 0;\n this.popup.style.position = 'absolute';\n this.popup.style.zIndex = '900';\n\n applyStyles(this.popup, [], this.panelPositionStylesForCurrentSelection(view, kHeight, kWidth));\n ReactDOM.render(this.insertSymbolPopup(view, [kHeight, kWidth]), this.popup);\n window.document.body.appendChild(this.popup);\n }\n }\n\n private panelPositionStylesForCurrentSelection(view: EditorView, height: number, width: number) {\n const selection = view.state.selection;\n const editorRect = view.dom.getBoundingClientRect();\n\n const selectionCoords = view.coordsAtPos(selection.from);\n\n const maximumTopPosition = Math.min(\n selectionCoords.bottom,\n window.innerHeight - height - kMinimumPanelPaddingToEdgeOfView,\n );\n const minimumTopPosition = editorRect.y;\n const popupTopPosition = Math.max(minimumTopPosition, maximumTopPosition);\n\n const maximumLeftPosition = Math.min(\n selectionCoords.right,\n window.innerWidth - width - kMinimumPanelPaddingToEdgeOfView,\n );\n const minimumLeftPosition = editorRect.x;\n const popupLeftPosition = Math.max(minimumLeftPosition, maximumLeftPosition);\n\n // styles we'll return\n const styles = {\n top: popupTopPosition + 'px',\n left: popupLeftPosition + 'px',\n };\n\n return styles;\n }\n\n private focusChanged() {\n if (window.document.activeElement !== this.popup && !this.popup?.contains(window.document.activeElement)) {\n this.closePopup();\n }\n }\n\n private closePopup() {\n if (this.popup) {\n ReactDOM.unmountComponentAtNode(this.popup);\n this.popup.remove();\n this.popup = null;\n }\n }\n\n private insertSymbolPopup(view: EditorView, size: [number, number]) {\n const insertSymbol = (symbolCharacter: SymbolCharacter, searchTerm: string) => {\n const tr = this.dataProvider.insertSymbolTransaction(symbolCharacter, searchTerm, view.state);\n view.dispatch(tr);\n view.focus();\n };\n\n const closePopup = () => {\n this.closePopup();\n view.focus();\n };\n\n return (\n <InsertSymbolPopup\n symbolDataProvider={this.dataProvider}\n onClose={closePopup}\n onInsertSymbol={insertSymbol}\n enabled={isEnabled(view.state)}\n size={size}\n searchImage={this.ui.images.search}\n searchPlaceholder={this.ui.context.translateText(this.dataProvider.filterPlaceholderHint)}\n ui={this.ui}\n />\n );\n }\n}\n","/*\n * insert_symbol-popup.tsx\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React, { ChangeEvent } from 'react';\n\nimport { EditorUI } from '../../api/ui';\nimport { isElementFocused, focusElement } from '../../api/focus';\nimport { Popup } from '../../api/widgets/popup';\nimport { SelectInput } from '../../api/widgets/select';\nimport { TextInput } from '../../api/widgets/text';\nimport { WidgetProps } from '../../api/widgets/react';\n\nimport { SymbolDataProvider, SymbolCharacter } from './insert_symbol-dataprovider';\nimport SymbolCharacterGrid, { newIndexForKeyboardEvent } from './insert_symbol-grid';\n\nimport './insert_symbol-styles.css';\nimport { SymbolPreview } from './insert_symbol-grid-preview';\n\ninterface InsertSymbolPopupProps extends WidgetProps {\n symbolDataProvider: SymbolDataProvider;\n enabled: boolean;\n size: [number, number];\n onInsertSymbol: (symbolCharacter: SymbolCharacter, searchTerm: string) => void;\n onClose: VoidFunction;\n ui: EditorUI;\n searchImage?: string;\n searchPlaceholder?: string;\n}\n\nexport const InsertSymbolPopup: React.FC<InsertSymbolPopupProps> = props => {\n const kPopupChromeHeight = 25;\n const popupHeight = props.size[0] - kPopupChromeHeight;\n const popupWidth = props.size[1];\n const style: React.CSSProperties = {\n ...props.style,\n height: popupHeight + 'px',\n width: popupWidth + 'px',\n };\n const classNames = ['pm-popup-insert-symbol'].concat(props.classes || []);\n\n const gridHeight = popupHeight - 108;\n const gridWidth = popupWidth;\n const kNumberOfcolumns = 11;\n\n const [filterText, setFilterText] = React.useState<string>('');\n const [selectedSymbolGroup, setSelectedSymbolGroup] = React.useState<string>();\n const [selectedSymbolIndex, setSelectedSymbolIndex] = React.useState<number>(0);\n const [preferenceChanged, setPreferenceChanged] = React.useState<number>(0);\n\n const symbols = React.useMemo(() => props.symbolDataProvider.getSymbols(selectedSymbolGroup), [\n selectedSymbolGroup,\n preferenceChanged,\n props.symbolDataProvider,\n ]);\n const filteredSymbols = React.useMemo(() => props.symbolDataProvider.filterSymbols(filterText, symbols), [\n filterText,\n symbols,\n props.symbolDataProvider,\n ]);\n\n // If the symbol list gets shorter than the selected index, move\n // selected cell into range\n React.useEffect(() => {\n if (selectedSymbolIndex > filteredSymbols.length) {\n setSelectedSymbolIndex(Math.max(filteredSymbols.length - 1, 0));\n }\n }, [selectedSymbolIndex, filteredSymbols]);\n\n const textRef = React.useRef<HTMLInputElement>(null);\n const selectRef = React.useRef<HTMLSelectElement>(null);\n const gridRef = React.useRef<HTMLDivElement>(null);\n const preferenceRef = React.useRef<HTMLElement>(null);\n\n // Focus the first text box\n React.useEffect(() => {\n focusElement(textRef.current);\n }, []);\n\n const options = props.symbolDataProvider.symbolGroupNames().map(name => (\n <option key={name} value={name}>\n {props.ui.context.translateText(name)}\n </option>\n ));\n\n const handleSelectChanged = (event: ChangeEvent<Element>) => {\n const value: string = (event.target as HTMLSelectElement).selectedOptions[0].value;\n const selectedGroupName: string | undefined = props.symbolDataProvider\n .symbolGroupNames()\n .find(name => name === value);\n if (selectedGroupName) {\n setSelectedSymbolGroup(selectedGroupName);\n }\n };\n\n const handleKeyboardEvent = (event: React.KeyboardEvent<HTMLElement>) => {\n // The last element might be the preference panel, if a provider\n // provides one\n function lastElement(): React.RefObject<HTMLElement> {\n if (preferenceRef.current !== null) {\n return preferenceRef;\n }\n return gridRef;\n }\n\n // Global Key Handling\n switch (event.key) {\n case 'Escape':\n // Esc key - close popup\n props.onClose();\n event.preventDefault();\n break;\n\n case 'Tab':\n if (event.shiftKey && isElementFocused(textRef.current)) {\n focusElement(lastElement().current);\n event.preventDefault();\n } else if (!event.shiftKey && isElementFocused(lastElement().current)) {\n focusElement(textRef.current);\n event.preventDefault();\n }\n break;\n\n case 'Enter':\n if (isElementFocused(textRef.current) || isElementFocused(gridRef.current)) {\n handleSelectedSymbolCommitted();\n event.preventDefault();\n }\n break;\n\n case 'ArrowLeft':\n case 'ArrowRight':\n case 'ArrowUp':\n case 'ArrowDown':\n case 'PageUp':\n case 'PageDown':\n // If the text filter is focused, forward arrow keys to the grid. If other elements are focused\n // they may need to handle arrow keys, so don't handle them in this case\n if (isElementFocused(textRef.current) && !event.shiftKey && !event.altKey && !event.ctrlKey) {\n const newIndex = newIndexForKeyboardEvent(\n event,\n selectedSymbolIndex,\n kNumberOfcolumns,\n filteredSymbols.length,\n );\n if (newIndex !== undefined && newIndex >= 0 && newIndex !== selectedSymbolIndex) {\n event.preventDefault();\n setSelectedSymbolIndex(newIndex);\n }\n }\n break;\n default:\n break;\n }\n };\n\n const handleSelectedSymbolChanged = (symbolIndex: number) => {\n setSelectedSymbolIndex(symbolIndex);\n };\n\n const handleSelectedSymbolCommitted = () => {\n if (filteredSymbols.length > selectedSymbolIndex) {\n props.onInsertSymbol(filteredSymbols[selectedSymbolIndex], textRef.current?.value || '');\n }\n };\n\n const handleTextChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n setFilterText(event?.target.value);\n };\n\n const handlePreferencesChanged = () => {\n setPreferenceChanged(preferenceChanged + 1);\n };\n\n const preferencesProps = {\n selectedSymbolIndex,\n context: props.ui.context,\n prefs: props.ui.prefs,\n onPreferencesChanged: handlePreferencesChanged,\n ref: preferenceRef,\n };\n\n const preferencesPanel = props.symbolDataProvider.symbolPreferencesPanel\n ? React.createElement(props.symbolDataProvider.symbolPreferencesPanel, preferencesProps)\n : undefined;\n\n return (\n <Popup classes={classNames} style={style}>\n <div onKeyDown={handleKeyboardEvent}>\n <div className=\"pm-popup-insert-symbol-search-container\" style={{ width: gridWidth }}>\n <TextInput\n width={20 + 'ch'}\n iconAdornment={props.searchImage}\n tabIndex={0}\n className=\"pm-popup-insert-symbol-search-textbox\"\n placeholder={props.searchPlaceholder}\n onChange={handleTextChange}\n ref={textRef}\n />\n <SelectInput\n tabIndex={0}\n ref={selectRef}\n className=\"pm-popup-insert-symbol-select-category\"\n onChange={handleSelectChanged}\n >\n {options}\n </SelectInput>\n </div>\n\n <hr className=\"pm-popup-insert-symbol-separator pm-border-background-color\" />\n <div className=\"pm-popup-insert-symbol-grid-container\">\n <SymbolCharacterGrid\n symbolCharacters={filteredSymbols}\n selectedIndex={selectedSymbolIndex}\n onSelectionChanged={handleSelectedSymbolChanged}\n onSelectionCommitted={handleSelectedSymbolCommitted}\n height={gridHeight}\n width={gridWidth}\n numberOfColumns={kNumberOfcolumns}\n ref={gridRef}\n ui={props.ui}\n />\n <div\n className=\"pm-popup-insert-symbol-no-matching pm-light-text-color\"\n style={{ display: filteredSymbols.length > 0 ? 'none' : 'block' }}\n >\n No matching symbols\n </div>\n </div>\n <hr className=\"pm-popup-insert-symbol-separator pm-border-background-color\" />\n {filteredSymbols[selectedSymbolIndex] && (\n <SymbolPreview\n symbolCharacter={filteredSymbols[selectedSymbolIndex]}\n symbolPreviewStyle={props.symbolDataProvider.symbolPreviewStyle}\n ui={props.ui}\n >\n {preferencesPanel}\n </SymbolPreview>\n )}\n </div>\n </Popup>\n );\n};\n","/*\n * focus.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport function isElementFocused(element: HTMLElement | null): boolean {\n if (element) {\n return window.document.activeElement === element;\n }\n return false;\n}\n\nexport function focusElement(element: HTMLElement | null) {\n if (element) {\n element.focus();\n }\n}\n","/*\n * select.tsx\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React, { ChangeEventHandler, ReactNode } from 'react';\n\nimport { WidgetProps } from './react';\n\nexport interface SelectInputProps extends WidgetProps {\n tabIndex?: number;\n className?: string;\n onChange?: ChangeEventHandler;\n children: ReactNode;\n defaultValue?: string;\n}\n\nexport const SelectInput = React.forwardRef<HTMLSelectElement, SelectInputProps>((props, ref) => {\n const style: React.CSSProperties = {\n ...props.style,\n };\n\n return (\n <select\n className={`pm-input-select pm-background-color pm-pane-border-color pm-text-color ${props.className}`}\n style={style}\n tabIndex={props.tabIndex}\n ref={ref}\n onChange={props.onChange}\n defaultValue={props.defaultValue}\n >\n {props.children}\n </select>\n );\n});\n","/*\n * text.tsx\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React, { ChangeEventHandler, KeyboardEventHandler, FocusEventHandler, ClipboardEventHandler } from 'react';\n\nimport { WidgetProps } from './react';\n\nimport './text.css';\n\nexport interface TextInputProps extends WidgetProps {\n width: string;\n tabIndex?: number;\n className?: string;\n placeholder?: string;\n iconAdornment?: string;\n value?: string;\n onChange?: ChangeEventHandler;\n onKeyDown?: KeyboardEventHandler<HTMLInputElement>;\n onKeyUp?: KeyboardEventHandler<HTMLInputElement>;\n onKeyPress?: KeyboardEventHandler<HTMLInputElement>;\n onBlur?: FocusEventHandler<HTMLInputElement>;\n onPaste?: ClipboardEventHandler<HTMLInputElement>;\n onFocus?: FocusEventHandler<HTMLInputElement>;\n}\n\nexport const TextInput = React.forwardRef<HTMLInputElement, TextInputProps>((props, ref) => {\n // Allow specifying an actual width (e.g. a percentage) or a character width\n // If a character width is specified, we should prefer to use the size attribute of the input\n // as the focus widget that is added to focus elements is confused by the 'ch' size in styles\n const characterWidth = props.width.endsWith('ch')\n ? parseInt(props.width.substr(0, props.width.length - 2), 10)\n : undefined;\n const style: React.CSSProperties = {\n ...props.style,\n width: characterWidth ? undefined : props.width,\n };\n\n return (\n <div className=\"pm-textinput-container\" style={style}>\n {props.iconAdornment ? <img src={props.iconAdornment} className=\"pm-textinput-icon\" alt=\"\" draggable=\"false\"/> : undefined}\n <input\n type=\"text\"\n placeholder={props.placeholder}\n size={characterWidth}\n className={`\n pm-input-text \n pm-textinput-input \n pm-text-color \n pm-background-color \n ${props.className}\n ${props.iconAdornment ? 'pm-textinput-input-with-icon' : ''}`}\n value={props.value !== undefined ? props.value : undefined}\n onChange={props.onChange}\n onKeyDown={props.onKeyDown}\n onKeyUp={props.onKeyUp}\n onKeyPress={props.onKeyPress}\n onBlur={props.onBlur}\n onFocus={props.onFocus}\n tabIndex={props.tabIndex}\n onPaste={props.onPaste}\n ref={ref}\n spellCheck={false}\n />\n </div>\n );\n});\n","/*\n * insert_symbol-grid.tsx\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\nimport { FixedSizeGrid } from 'react-window';\n\nimport debounce from 'lodash.debounce';\n\nimport { EditorUI } from '../../api/ui';\nimport { WidgetProps } from '../../api/widgets/react';\n\nimport { CharacterGridCellItemData, SymbolCharacterCell } from './insert_symbol-grid-cell';\nimport { SymbolCharacter } from './insert_symbol-dataprovider';\n\nimport './insert_symbol-grid-styles.css';\n\ninterface CharacterGridProps extends WidgetProps {\n height: number;\n width: number;\n numberOfColumns: number;\n symbolCharacters: SymbolCharacter[];\n selectedIndex: number;\n onSelectionChanged: (selectedIndex: number) => void;\n onSelectionCommitted: VoidFunction;\n ui: EditorUI;\n}\n\nconst selectedItemClassName = 'pm-grid-item-selected';\n\nconst SymbolCharacterGrid = React.forwardRef<any, CharacterGridProps>((props, ref) => {\n const columnWidth = Math.floor(props.width / props.numberOfColumns);\n const characterCellData: CharacterGridCellItemData = {\n symbolCharacters: props.symbolCharacters,\n numberOfColumns: props.numberOfColumns,\n selectedIndex: props.selectedIndex,\n onSelectionChanged: props.onSelectionChanged,\n onSelectionCommitted: props.onSelectionCommitted,\n selectedItemClassName,\n };\n\n const gridRef = React.useRef<FixedSizeGrid>(null);\n const handleScroll = debounce(() => {\n gridRef.current?.scrollToItem({ rowIndex: Math.floor(props.selectedIndex / props.numberOfColumns) });\n }, 5);\n\n React.useEffect(handleScroll, [props.selectedIndex]);\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n const newIndex = newIndexForKeyboardEvent(\n event,\n props.selectedIndex,\n props.numberOfColumns,\n props.symbolCharacters.length,\n );\n if (newIndex !== undefined) {\n props.onSelectionChanged(newIndex);\n event.preventDefault();\n }\n };\n\n return (\n <div onKeyDown={handleKeyDown} tabIndex={0} ref={ref}>\n <FixedSizeGrid\n columnCount={props.numberOfColumns}\n rowCount={Math.ceil(props.symbolCharacters.length / props.numberOfColumns)}\n height={props.height}\n width={props.width + 1}\n rowHeight={columnWidth}\n columnWidth={columnWidth}\n itemData={characterCellData}\n className=\"pm-symbol-grid\"\n ref={gridRef}\n >\n {SymbolCharacterCell}\n </FixedSizeGrid>\n </div>\n );\n});\n\nfunction previous(currentIndex: number, numberOfColumns: number, numberOfCells: number): number {\n const newIndex = currentIndex - 1;\n return Math.max(0, newIndex);\n}\nfunction next(currentIndex: number, numberOfColumns: number, numberOfCells: number): number {\n const newIndex = currentIndex + 1;\n return Math.min(numberOfCells - 1, newIndex);\n}\nfunction prevRow(currentIndex: number, numberOfColumns: number, numberOfCells: number): number {\n const newIndex = currentIndex - numberOfColumns;\n return newIndex >= 0 ? newIndex : currentIndex;\n}\nfunction nextRow(currentIndex: number, numberOfColumns: number, numberOfCells: number): number {\n const newIndex = currentIndex + numberOfColumns;\n return newIndex < numberOfCells ? newIndex : currentIndex;\n}\nfunction nextPage(currentIndex: number, numberOfColumns: number, numberOfCells: number): number {\n const newIndex = currentIndex + 6 * numberOfColumns;\n return Math.min(numberOfCells - 1, newIndex);\n}\nfunction prevPage(currentIndex: number, numberOfColumns: number, numberOfCells: number): number {\n const newIndex = currentIndex - 6 * numberOfColumns;\n return Math.max(0, newIndex);\n}\n\nexport const newIndexForKeyboardEvent = (\n event: React.KeyboardEvent,\n selectedIndex: number,\n numberOfColumns: number,\n numberOfCells: number,\n): number | undefined => {\n switch (event.key) {\n case 'ArrowLeft': // left\n return previous(selectedIndex, numberOfColumns, numberOfCells);\n\n case 'ArrowUp': // up\n return prevRow(selectedIndex, numberOfColumns, numberOfCells);\n\n case 'ArrowRight': // right\n return next(selectedIndex, numberOfColumns, numberOfCells);\n\n case 'ArrowDown': // down\n return nextRow(selectedIndex, numberOfColumns, numberOfCells);\n\n case 'PageDown':\n return nextPage(selectedIndex, numberOfColumns, numberOfCells);\n\n case 'PageUp':\n return prevPage(selectedIndex, numberOfColumns, numberOfCells);\n\n case 'Home':\n return 0;\n\n case 'End':\n return numberOfCells - 1;\n\n default:\n return undefined;\n }\n};\n\nexport default SymbolCharacterGrid;\n","/*\n * insert_symbol-grid-cell.tsx\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\nimport { GridChildComponentProps } from 'react-window';\n\nimport { SymbolCharacter } from './insert_symbol-dataprovider';\n\nexport interface CharacterGridCellItemData {\n symbolCharacters: SymbolCharacter[];\n numberOfColumns: number;\n selectedIndex: number;\n selectedItemClassName: string;\n onSelectionChanged: (selectedIndex: number) => void;\n onSelectionCommitted: VoidFunction;\n}\n\nexport const SymbolCharacterCell = (props: GridChildComponentProps) => {\n const characterGridCellItemData = props.data as CharacterGridCellItemData;\n const symbolCharacters = characterGridCellItemData.symbolCharacters;\n const itemIndex = props.rowIndex * characterGridCellItemData.numberOfColumns + props.columnIndex;\n\n const handleMouseEnter = (event: React.MouseEvent) => {\n characterGridCellItemData.onSelectionChanged(itemIndex);\n };\n\n // If we don't handle and eat the mouse down event, the mouse down will propagate to the parent\n // editor and result in loss of focus to this element\n const handleMouseDown = (event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n };\n\n const handleMouseClick = (event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n characterGridCellItemData.onSelectionCommitted();\n };\n\n if (itemIndex < symbolCharacters.length) {\n const ch = symbolCharacters[itemIndex];\n return (\n <div\n tabIndex={-1}\n style={props.style}\n className=\"pm-symbol-grid-container\"\n onClick={handleMouseClick}\n onMouseDown={handleMouseDown}\n onMouseEnter={handleMouseEnter}\n >\n <div\n className={`pm-symbol-grid-cell pm-grid-item pm-emoji-font ${\n characterGridCellItemData.selectedIndex === itemIndex ? characterGridCellItemData.selectedItemClassName : ''\n }`}\n >\n {ch.value || ''}\n </div>\n </div>\n );\n } else {\n return null;\n }\n};\n","/*\n * insert_symbol-grid-preview.tsx\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React, { CSSProperties, ReactNode } from 'react';\n\nimport { EditorUI } from '../../api/ui';\nimport { WidgetProps } from '../../api/widgets/react';\n\nimport { SymbolCharacter } from './insert_symbol-dataprovider';\n\nimport './insert_symbol-grid-preview.css';\n\ninterface SymbolPreviewProps extends WidgetProps {\n symbolCharacter: SymbolCharacter;\n symbolPreviewStyle: CSSProperties;\n ui: EditorUI;\n children: ReactNode;\n}\n\nexport const SymbolPreview = React.forwardRef<any, SymbolPreviewProps>((props, ref) => {\n return (\n <div style={{ height: '54px' }} className=\"pm-popup-insert-symbol-preview-container\" ref={ref}>\n <div className=\"pm-popup-insert-symbol-preview-thumbnail\">\n <div style={props.symbolPreviewStyle}>{props.symbolCharacter.value}</div>\n <div className=\"pm-popup-insert-symbol-preview-summary\">\n <div className=\"pm-popup-insert-symbol-preview-name pm-text-color\">\n {props.ui.context.translateText(props.symbolCharacter.name)}\n </div>\n <div className=\"pm-popup-insert-symbol-preview-markdown pm-light-text-color\">\n {props.symbolCharacter.markdown || `U+${props.symbolCharacter.codepoint?.toString(16)}`}\n </div>\n </div>\n </div>\n <div className=\"pm-popup-insert-symbol-preview-action\">{props.children}</div>\n </div>\n );\n});\n","import { SymbolCharacterGroup } from './insert_symbol-dataprovider';\n\nconst symbols: SymbolCharacterGroup[] = [\n {\n name: 'Miscellaneous',\n symbols: [\n {\n name: 'NO-BREAK SPACE',\n value: ' ',\n codepoint: 160,\n },\n {\n name: 'INVERTED EXCLAMATION MARK',\n value: '¡',\n codepoint: 161,\n },\n {\n name: 'CENT SIGN',\n value: '¢',\n codepoint: 162,\n },\n {\n name: 'POUND SIGN',\n value: '£',\n codepoint: 163,\n },\n {\n name: 'CURRENCY SIGN',\n value: '¤',\n codepoint: 164,\n },\n {\n name: 'YEN SIGN',\n value: '¥',\n codepoint: 165,\n },\n {\n name: 'BROKEN BAR',\n value: '¦',\n codepoint: 166,\n },\n {\n name: 'SECTION SIGN',\n value: '§',\n codepoint: 167,\n },\n {\n name: 'DIAERESIS',\n value: '¨',\n codepoint: 168,\n },\n {\n name: 'FEMININE ORDINAL INDICATOR',\n value: 'ª',\n codepoint: 170,\n },\n {\n name: 'LEFT-POINTING DOUBLE ANGLE QUOTATION MARK',\n value: '«',\n codepoint: 171,\n },\n {\n name: 'NOT SIGN',\n value: '¬',\n codepoint: 172,\n },\n {\n name: 'MACRON',\n value: '¯',\n codepoint: 175,\n },\n {\n name: 'DEGREE SIGN',\n value: '°',\n codepoint: 176,\n },\n {\n name: 'PLUS-MINUS SIGN',\n value: '±',\n codepoint: 177,\n },\n {\n name: 'SUPERSCRIPT TWO',\n value: '²',\n codepoint: 178,\n },\n {\n name: 'SUPERSCRIPT THREE',\n value: '³',\n codepoint: 179,\n },\n {\n name: 'ACUTE ACCENT',\n value: '´',\n codepoint: 180,\n },\n {\n name: 'MICRO SIGN',\n value: 'µ',\n codepoint: 181,\n },\n {\n name: 'PILCROW SIGN',\n value: '¶',\n codepoint: 182,\n },\n {\n name: 'MIDDLE DOT',\n value: '·',\n codepoint: 183,\n },\n {\n name: 'CEDILLA',\n value: '¸',\n codepoint: 184,\n },\n {\n name: 'SUPERSCRIPT ONE',\n value: '¹',\n codepoint: 185,\n },\n {\n name: 'MASCULINE ORDINAL INDICATOR',\n value: 'º',\n codepoint: 186,\n },\n {\n name: 'RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK',\n value: '»',\n codepoint: 187,\n },\n {\n name: 'VULGAR FRACTION ONE QUARTER',\n value: '¼',\n codepoint: 188,\n },\n {\n name: 'VULGAR FRACTION ONE HALF',\n value: '½',\n codepoint: 189,\n },\n {\n name: 'VULGAR FRACTION THREE QUARTERS',\n value: '¾',\n codepoint: 190,\n },\n {\n name: 'INVERTED QUESTION MARK',\n value: '¿',\n codepoint: 191,\n },\n {\n name: 'LATIN CAPITAL LETTER A WITH GRAVE',\n value: 'À',\n codepoint: 192,\n },\n {\n name: 'LATIN CAPITAL LETTER A WITH ACUTE',\n value: 'Á',\n codepoint: 193,\n },\n {\n name: 'LATIN CAPITAL LETTER A WITH CIRCUMFLEX',\n value: 'Â',\n codepoint: 194,\n },\n {\n name: 'LATIN CAPITAL LETTER A WITH TILDE',\n value: 'Ã',\n codepoint: 195,\n },\n {\n name: 'LATIN CAPITAL LETTER A WITH DIAERESIS',\n value: 'Ä',\n codepoint: 196,\n },\n {\n name: 'LATIN CAPITAL LETTER A WITH RING ABOVE',\n value: 'Å',\n codepoint: 197,\n },\n {\n name: 'LATIN CAPITAL LETTER AE',\n value: 'Æ',\n codepoint: 198,\n },\n {\n name: 'LATIN CAPITAL LETTER C WITH CEDILLA',\n value: 'Ç',\n codepoint: 199,\n },\n {\n name: 'LATIN CAPITAL LETTER E WITH GRAVE',\n value: 'È',\n codepoint: 200,\n },\n {\n name: 'LATIN CAPITAL LETTER E WITH ACUTE',\n value: 'É',\n codepoint: 201,\n },\n {\n name: 'LATIN CAPITAL LETTER E WITH CIRCUMFLEX',\n value: 'Ê',\n codepoint: 202,\n },\n {\n name: 'LATIN CAPITAL LETTER E WITH DIAERESIS',\n value: 'Ë',\n codepoint: 203,\n },\n {\n name: 'LATIN CAPITAL LETTER I WITH GRAVE',\n value: 'Ì',\n codepoint: 204,\n },\n {\n name: 'LATIN CAPITAL LETTER I WITH ACUTE',\n value: 'Í',\n codepoint: 205,\n },\n {\n name: 'LATIN CAPITAL LETTER I WITH CIRCUMFLEX',\n value: 'Î',\n codepoint: 206,\n },\n {\n name: 'LATIN CAPITAL LETTER I WITH DIAERESIS',\n value: 'Ï',\n codepoint: 207,\n },\n {\n name: 'LATIN CAPITAL LETTER ETH',\n value: 'Ð',\n codepoint: 208,\n },\n {\n name: 'LATIN CAPITAL LETTER N WITH TILDE',\n value: 'Ñ',\n codepoint: 209,\n },\n {\n name: 'LATIN CAPITAL LETTER O WITH GRAVE',\n value: 'Ò',\n codepoint: 210,\n },\n {\n name: 'LATIN CAPITAL LETTER O WITH ACUTE',\n value: 'Ó',\n codepoint: 211,\n },\n {\n name: 'LATIN CAPITAL LETTER O WITH CIRCUMFLEX',\n value: 'Ô',\n codepoint: 212,\n },\n {\n name: 'LATIN CAPITAL LETTER O WITH TILDE',\n value: 'Õ',\n codepoint: 213,\n },\n {\n name: 'LATIN CAPITAL LETTER O WITH DIAERESIS',\n value: 'Ö',\n codepoint: 214,\n },\n {\n name: 'MULTIPLICATION SIGN',\n value: '×',\n codepoint: 215,\n },\n {\n name: 'LATIN CAPITAL LETTER O WITH STROKE',\n value: 'Ø',\n codepoint: 216,\n },\n {\n name: 'LATIN CAPITAL LETTER U WITH GRAVE',\n value: 'Ù',\n codepoint: 217,\n },\n {\n name: 'LATIN CAPITAL LETTER U WITH ACUTE',\n value: 'Ú',\n codepoint: 218,\n },\n {\n name: 'LATIN CAPITAL LETTER U WITH CIRCUMFLEX',\n value: 'Û',\n codepoint: 219,\n },\n {\n name: 'LATIN CAPITAL LETTER U WITH DIAERESIS',\n value: 'Ü',\n codepoint: 220,\n },\n {\n name: 'LATIN CAPITAL LETTER Y WITH ACUTE',\n value: 'Ý',\n codepoint: 221,\n },\n {\n name: 'LATIN CAPITAL LETTER THORN',\n value: 'Þ',\n codepoint: 222,\n },\n {\n name: 'LATIN SMALL LETTER SHARP S',\n value: 'ß',\n codepoint: 223,\n },\n {\n name: 'LATIN SMALL LETTER A WITH GRAVE',\n value: 'à',\n codepoint: 224,\n },\n {\n name: 'LATIN SMALL LETTER A WITH ACUTE',\n value: 'á',\n codepoint: 225,\n },\n {\n name: 'LATIN SMALL LETTER A WITH CIRCUMFLEX',\n value: 'â',\n codepoint: 226,\n },\n {\n name: 'LATIN SMALL LETTER A WITH TILDE',\n value: 'ã',\n codepoint: 227,\n },\n {\n name: 'LATIN SMALL LETTER A WITH DIAERESIS',\n value: 'ä',\n codepoint: 228,\n },\n {\n name: 'LATIN SMALL LETTER A WITH RING ABOVE',\n value: 'å',\n codepoint: 229,\n },\n {\n name: 'LATIN SMALL LETTER AE',\n value: 'æ',\n codepoint: 230,\n },\n {\n name: 'LATIN SMALL LETTER C WITH CEDILLA',\n value: 'ç',\n codepoint: 231,\n },\n {\n name: 'LATIN SMALL LETTER E WITH GRAVE',\n value: 'è',\n codepoint: 232,\n },\n {\n name: 'LATIN SMALL LETTER E WITH ACUTE',\n value: 'é',\n codepoint: 233,\n },\n {\n name: 'LATIN SMALL LETTER E WITH CIRCUMFLEX',\n value: 'ê',\n codepoint: 234,\n },\n {\n name: 'LATIN SMALL LETTER E WITH DIAERESIS',\n value: 'ë',\n codepoint: 235,\n },\n {\n name: 'LATIN SMALL LETTER I WITH GRAVE',\n value: 'ì',\n codepoint: 236,\n },\n {\n name: 'LATIN SMALL LETTER I WITH ACUTE',\n value: 'í',\n codepoint: 237,\n },\n {\n name: 'LATIN SMALL LETTER I WITH CIRCUMFLEX',\n value: 'î',\n codepoint: 238,\n },\n {\n name: 'LATIN SMALL LETTER I WITH DIAERESIS',\n value: 'ï',\n codepoint: 239,\n },\n {\n name: 'LATIN SMALL LETTER ETH',\n value: 'ð',\n codepoint: 240,\n },\n {\n name: 'LATIN SMALL LETTER N WITH TILDE',\n value: 'ñ',\n codepoint: 241,\n },\n {\n name: 'LATIN SMALL LETTER O WITH GRAVE',\n value: 'ò',\n codepoint: 242,\n },\n {\n name: 'LATIN SMALL LETTER O WITH ACUTE',\n value: 'ó',\n codepoint: 243,\n },\n {\n name: 'LATIN SMALL LETTER O WITH CIRCUMFLEX',\n value: 'ô',\n codepoint: 244,\n },\n {\n name: 'LATIN SMALL LETTER O WITH TILDE',\n value: 'õ',\n codepoint: 245,\n },\n {\n name: 'LATIN SMALL LETTER O WITH DIAERESIS',\n value: 'ö',\n codepoint: 246,\n },\n {\n name: 'DIVISION SIGN',\n value: '÷',\n codepoint: 247,\n },\n {\n name: 'LATIN SMALL LETTER O WITH STROKE',\n value: 'ø',\n codepoint: 248,\n },\n {\n name: 'LATIN SMALL LETTER U WITH GRAVE',\n value: 'ù',\n codepoint: 249,\n },\n {\n name: 'LATIN SMALL LETTER U WITH ACUTE',\n value: 'ú',\n codepoint: 250,\n },\n {\n name: 'LATIN SMALL LETTER U WITH CIRCUMFLEX',\n value: 'û',\n codepoint: 251,\n },\n {\n name: 'LATIN SMALL LETTER U WITH DIAERESIS',\n value: 'ü',\n codepoint: 252,\n },\n {\n name: 'LATIN SMALL LETTER Y WITH ACUTE',\n value: 'ý',\n codepoint: 253,\n },\n {\n name: 'LATIN SMALL LETTER THORN',\n value: 'þ',\n codepoint: 254,\n },\n {\n name: 'LATIN SMALL LETTER Y WITH DIAERESIS',\n value: 'ÿ',\n codepoint: 255,\n },\n {\n name: 'ACCOUNT OF',\n value: '℀',\n codepoint: 8448,\n },\n {\n name: 'ADDRESSED TO THE SUBJECT',\n value: '℁',\n codepoint: 8449,\n },\n {\n name: 'DOUBLE-STRUCK CAPITAL C',\n value: 'ℂ',\n codepoint: 8450,\n },\n {\n name: 'DEGREE CELSIUS',\n value: '℃',\n codepoint: 8451,\n },\n {\n name: 'CENTRE LINE SYMBOL',\n value: '℄',\n codepoint: 8452,\n },\n {\n name: 'CARE OF',\n value: '℅',\n codepoint: 8453,\n },\n {\n name: 'CADA UNA',\n value: '℆',\n codepoint: 8454,\n },\n {\n name: 'EULER CONSTANT',\n value: 'ℇ',\n codepoint: 8455,\n },\n {\n name: 'SCRUPLE',\n value: '℈',\n codepoint: 8456,\n },\n {\n name: 'DEGREE FAHRENHEIT',\n value: '℉',\n codepoint: 8457,\n },\n {\n name: 'SCRIPT SMALL G',\n value: 'ℊ',\n codepoint: 8458,\n },\n {\n name: 'SCRIPT CAPITAL H',\n value: 'ℋ',\n codepoint: 8459,\n },\n {\n name: 'BLACK-LETTER CAPITAL H',\n value: 'ℌ',\n codepoint: 8460,\n },\n {\n name: 'DOUBLE-STRUCK CAPITAL H',\n value: 'ℍ',\n codepoint: 8461,\n },\n {\n name: 'PLANCK CONSTANT',\n value: 'ℎ',\n codepoint: 8462,\n },\n {\n name: 'PLANCK CONSTANT OVER TWO PI',\n value: 'ℏ',\n codepoint: 8463,\n },\n {\n name: 'SCRIPT CAPITAL I',\n value: 'ℐ',\n codepoint: 8464,\n },\n {\n name: 'BLACK-LETTER CAPITAL I',\n value: 'ℑ',\n codepoint: 8465,\n },\n {\n name: 'SCRIPT CAPITAL L',\n value: 'ℒ',\n codepoint: 8466,\n },\n {\n name: 'SCRIPT SMALL L',\n value: 'ℓ',\n codepoint: 8467,\n },\n {\n name: 'L B BAR SYMBOL',\n value: '℔',\n codepoint: 8468,\n },\n {\n name: 'DOUBLE-STRUCK CAPITAL N',\n value: 'ℕ',\n codepoint: 8469,\n },\n {\n name: 'NUMERO SIGN',\n value: '№',\n codepoint: 8470,\n },\n {\n name: 'SOUND RECORDING COPYRIGHT',\n value: '℗',\n codepoint: 8471,\n },\n {\n name: 'SCRIPT CAPITAL P',\n value: '℘',\n codepoint: 8472,\n },\n {\n name: 'DOUBLE-STRUCK CAPITAL P',\n value: 'ℙ',\n codepoint: 8473,\n },\n {\n name: 'DOUBLE-STRUCK CAPITAL Q',\n value: 'ℚ',\n codepoint: 8474,\n },\n {\n name: 'SCRIPT CAPITAL R',\n value: 'ℛ',\n codepoint: 8475,\n },\n {\n name: 'BLACK-LETTER CAPITAL R',\n value: 'ℜ',\n codepoint: 8476,\n },\n {\n name: 'DOUBLE-STRUCK CAPITAL R',\n value: 'ℝ',\n codepoint: 8477,\n },\n {\n name: 'PRESCRIPTION TAKE',\n value: '℞',\n codepoint: 8478,\n },\n {\n name: 'RESPONSE',\n value: '℟',\n codepoint: 8479,\n },\n {\n name: 'SERVICE MARK',\n value: '℠',\n codepoint: 8480,\n },\n {\n name: 'TELEPHONE SIGN',\n value: '℡',\n codepoint: 8481,\n },\n {\n name: 'VERSICLE',\n value: '℣',\n codepoint: 8483,\n },\n {\n name: 'DOUBLE-STRUCK CAPITAL Z',\n value: 'ℤ',\n codepoint: 8484,\n },\n {\n name: 'OUNCE SIGN',\n value: '℥',\n codepoint: 8485,\n },\n {\n name: 'OHM SIGN',\n value: 'Ω',\n codepoint: 8486,\n },\n {\n name: 'INVERTED OHM SIGN',\n value: '℧',\n codepoint: 8487,\n },\n {\n name: 'BLACK-LETTER CAPITAL Z',\n value: 'ℨ',\n codepoint: 8488,\n },\n {\n name: 'TURNED GREEK SMALL LETTER IOTA',\n value: '℩',\n codepoint: 8489,\n },\n {\n name: 'KELVIN SIGN',\n value: 'K',\n codepoint: 8490,\n },\n {\n name: 'ANGSTROM SIGN',\n value: 'Å',\n codepoint: 8491,\n },\n {\n name: 'SCRIPT CAPITAL B',\n value: 'ℬ',\n codepoint: 8492,\n },\n {\n name: 'BLACK-LETTER CAPITAL C',\n value: 'ℭ',\n codepoint: 8493,\n },\n {\n name: 'ESTIMATED SYMBOL',\n value: '℮',\n codepoint: 8494,\n },\n {\n name: 'SCRIPT SMALL E',\n value: 'ℯ',\n codepoint: 8495,\n },\n {\n name: 'SCRIPT CAPITAL E',\n value: 'ℰ',\n codepoint: 8496,\n },\n {\n name: 'SCRIPT CAPITAL F',\n value: 'ℱ',\n codepoint: 8497,\n },\n {\n name: 'TURNED CAPITAL F',\n value: 'Ⅎ',\n codepoint: 8498,\n },\n {\n name: 'SCRIPT CAPITAL M',\n value: 'ℳ',\n codepoint: 8499,\n },\n {\n name: 'SCRIPT SMALL O',\n value: 'ℴ',\n codepoint: 8500,\n },\n {\n name: 'ALEF SYMBOL',\n value: 'ℵ',\n codepoint: 8501,\n },\n {\n name: 'BET SYMBOL',\n value: 'ℶ',\n codepoint: 8502,\n },\n {\n name: 'GIMEL SYMBOL',\n value: 'ℷ',\n codepoint: 8503,\n },\n {\n name: 'DALET SYMBOL',\n value: 'ℸ',\n codepoint: 8504,\n },\n {\n name: 'ROTATED CAPITAL Q',\n value: '℺',\n codepoint: 8506,\n },\n {\n name: 'FACSIMILE SIGN',\n value: '℻',\n codepoint: 8507,\n },\n {\n name: 'DOUBLE-STRUCK SMALL PI',\n value: 'ℼ',\n codepoint: 8508,\n },\n {\n name: 'DOUBLE-STRUCK SMALL GAMMA',\n value: 'ℽ',\n codepoint: 8509,\n },\n {\n name: 'DOUBLE-STRUCK CAPITAL GAMMA',\n value: 'ℾ',\n codepoint: 8510,\n },\n {\n name: 'DOUBLE-STRUCK CAPITAL PI',\n value: 'ℿ',\n codepoint: 8511,\n },\n {\n name: 'DOUBLE-STRUCK N-ARY SUMMATION',\n value: '⅀',\n codepoint: 8512,\n },\n {\n name: 'TURNED SANS-SERIF CAPITAL G',\n value: '⅁',\n codepoint: 8513,\n },\n {\n name: 'TURNED SANS-SERIF CAPITAL L',\n value: '⅂',\n codepoint: 8514,\n },\n {\n name: 'REVERSED SANS-SERIF CAPITAL L',\n value: '⅃',\n codepoint: 8515,\n },\n {\n name: 'TURNED SANS-SERIF CAPITAL Y',\n value: '⅄',\n codepoint: 8516,\n },\n {\n name: 'DOUBLE-STRUCK ITALIC CAPITAL D',\n value: 'ⅅ',\n codepoint: 8517,\n },\n {\n name: 'DOUBLE-STRUCK ITALIC SMALL D',\n value: 'ⅆ',\n codepoint: 8518,\n },\n {\n name: 'DOUBLE-STRUCK ITALIC SMALL E',\n value: 'ⅇ',\n codepoint: 8519,\n },\n {\n name: 'DOUBLE-STRUCK ITALIC SMALL I',\n value: 'ⅈ',\n codepoint: 8520,\n },\n {\n name: 'DOUBLE-STRUCK ITALIC SMALL J',\n value: 'ⅉ',\n codepoint: 8521,\n },\n {\n name: 'PROPERTY LINE',\n value: '⅊',\n codepoint: 8522,\n },\n {\n name: 'TURNED AMPERSAND',\n value: '⅋',\n codepoint: 8523,\n },\n {\n name: 'PER SIGN',\n value: '⅌',\n codepoint: 8524,\n },\n {\n name: 'AKTIESELSKAB',\n value: '⅍',\n codepoint: 8525,\n },\n {\n name: 'TURNED SMALL F',\n value: 'ⅎ',\n codepoint: 8526,\n },\n {\n name: 'SYMBOL FOR SAMARITAN SOURCE',\n value: '⅏',\n codepoint: 8527,\n },\n {\n name: 'CIRCLED DIGIT ONE',\n value: '①',\n codepoint: 9312,\n },\n {\n name: 'CIRCLED DIGIT TWO',\n value: '②',\n codepoint: 9313,\n },\n {\n name: 'CIRCLED DIGIT THREE',\n value: '③',\n codepoint: 9314,\n },\n {\n name: 'CIRCLED DIGIT FOUR',\n value: '④',\n codepoint: 9315,\n },\n {\n name: 'CIRCLED DIGIT FIVE',\n value: '⑤',\n codepoint: 9316,\n },\n {\n name: 'CIRCLED DIGIT SIX',\n value: '⑥',\n codepoint: 9317,\n },\n {\n name: 'CIRCLED DIGIT SEVEN',\n value: '⑦',\n codepoint: 9318,\n },\n {\n name: 'CIRCLED DIGIT EIGHT',\n value: '⑧',\n codepoint: 9319,\n },\n {\n name: 'CIRCLED DIGIT NINE',\n value: '⑨',\n codepoint: 9320,\n },\n {\n name: 'CIRCLED NUMBER TEN',\n value: '⑩',\n codepoint: 9321,\n },\n {\n name: 'CIRCLED NUMBER ELEVEN',\n value: '⑪',\n codepoint: 9322,\n },\n {\n name: 'CIRCLED NUMBER TWELVE',\n value: '⑫',\n codepoint: 9323,\n },\n {\n name: 'CIRCLED NUMBER THIRTEEN',\n value: '⑬',\n codepoint: 9324,\n },\n {\n name: 'CIRCLED NUMBER FOURTEEN',\n value: '⑭',\n codepoint: 9325,\n },\n {\n name: 'CIRCLED NUMBER FIFTEEN',\n value: '⑮',\n codepoint: 9326,\n },\n {\n name: 'CIRCLED NUMBER SIXTEEN',\n value: '⑯',\n codepoint: 9327,\n },\n {\n name: 'CIRCLED NUMBER SEVENTEEN',\n value: '⑰',\n codepoint: 9328,\n },\n {\n name: 'CIRCLED NUMBER EIGHTEEN',\n value: '⑱',\n codepoint: 9329,\n },\n {\n name: 'CIRCLED NUMBER NINETEEN',\n value: '⑲',\n codepoint: 9330,\n },\n {\n name: 'CIRCLED NUMBER TWENTY',\n value: '⑳',\n codepoint: 9331,\n },\n {\n name: 'PARENTHESIZED DIGIT ONE',\n value: '⑴',\n codepoint: 9332,\n },\n {\n name: 'PARENTHESIZED DIGIT TWO',\n value: '⑵',\n codepoint: 9333,\n },\n {\n name: 'PARENTHESIZED DIGIT THREE',\n value: '⑶',\n codepoint: 9334,\n },\n {\n name: 'PARENTHESIZED DIGIT FOUR',\n value: '⑷',\n codepoint: 9335,\n },\n {\n name: 'PARENTHESIZED DIGIT FIVE',\n value: '⑸',\n codepoint: 9336,\n },\n {\n name: 'PARENTHESIZED DIGIT SIX',\n value: '⑹',\n codepoint: 9337,\n },\n {\n name: 'PARENTHESIZED DIGIT SEVEN',\n value: '⑺',\n codepoint: 9338,\n },\n {\n name: 'PARENTHESIZED DIGIT EIGHT',\n value: '⑻',\n codepoint: 9339,\n },\n {\n name: 'PARENTHESIZED DIGIT NINE',\n value: '⑼',\n codepoint: 9340,\n },\n {\n name: 'PARENTHESIZED NUMBER TEN',\n value: '⑽',\n codepoint: 9341,\n },\n {\n name: 'PARENTHESIZED NUMBER ELEVEN',\n value: '⑾',\n codepoint: 9342,\n },\n {\n name: 'PARENTHESIZED NUMBER TWELVE',\n value: '⑿',\n codepoint: 9343,\n },\n {\n name: 'PARENTHESIZED NUMBER THIRTEEN',\n value: '⒀',\n codepoint: 9344,\n },\n {\n name: 'PARENTHESIZED NUMBER FOURTEEN',\n value: '⒁',\n codepoint: 9345,\n },\n {\n name: 'PARENTHESIZED NUMBER FIFTEEN',\n value: '⒂',\n codepoint: 9346,\n },\n {\n name: 'PARENTHESIZED NUMBER SIXTEEN',\n value: '⒃',\n codepoint: 9347,\n },\n {\n name: 'PARENTHESIZED NUMBER SEVENTEEN',\n value: '⒄',\n codepoint: 9348,\n },\n {\n name: 'PARENTHESIZED NUMBER EIGHTEEN',\n value: '⒅',\n codepoint: 9349,\n },\n {\n name: 'PARENTHESIZED NUMBER NINETEEN',\n value: '⒆',\n codepoint: 9350,\n },\n {\n name: 'PARENTHESIZED NUMBER TWENTY',\n value: '⒇',\n codepoint: 9351,\n },\n {\n name: 'DIGIT ONE FULL STOP',\n value: '⒈',\n codepoint: 9352,\n },\n {\n name: 'DIGIT TWO FULL STOP',\n value: '⒉',\n codepoint: 9353,\n },\n {\n name: 'DIGIT THREE FULL STOP',\n value: '⒊',\n codepoint: 9354,\n },\n {\n name: 'DIGIT FOUR FULL STOP',\n value: '⒋',\n codepoint: 9355,\n },\n {\n name: 'DIGIT FIVE FULL STOP',\n value: '⒌',\n codepoint: 9356,\n },\n {\n name: 'DIGIT SIX FULL STOP',\n value: '⒍',\n codepoint: 9357,\n },\n {\n name: 'DIGIT SEVEN FULL STOP',\n value: '⒎',\n codepoint: 9358,\n },\n {\n name: 'DIGIT EIGHT FULL STOP',\n value: '⒏',\n codepoint: 9359,\n },\n {\n name: 'DIGIT NINE FULL STOP',\n value: '⒐',\n codepoint: 9360,\n },\n {\n name: 'NUMBER TEN FULL STOP',\n value: '⒑',\n codepoint: 9361,\n },\n {\n name: 'NUMBER ELEVEN FULL STOP',\n value: '⒒',\n codepoint: 9362,\n },\n {\n name: 'NUMBER TWELVE FULL STOP',\n value: '⒓',\n codepoint: 9363,\n },\n {\n name: 'NUMBER THIRTEEN FULL STOP',\n value: '⒔',\n codepoint: 9364,\n },\n {\n name: 'NUMBER FOURTEEN FULL STOP',\n value: '⒕',\n codepoint: 9365,\n },\n {\n name: 'NUMBER FIFTEEN FULL STOP',\n value: '⒖',\n codepoint: 9366,\n },\n {\n name: 'NUMBER SIXTEEN FULL STOP',\n value: '⒗',\n codepoint: 9367,\n },\n {\n name: 'NUMBER SEVENTEEN FULL STOP',\n value: '⒘',\n codepoint: 9368,\n },\n {\n name: 'NUMBER EIGHTEEN FULL STOP',\n value: '⒙',\n codepoint: 9369,\n },\n {\n name: 'NUMBER NINETEEN FULL STOP',\n value: '⒚',\n codepoint: 9370,\n },\n {\n name: 'NUMBER TWENTY FULL STOP',\n value: '⒛',\n codepoint: 9371,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER A',\n value: '⒜',\n codepoint: 9372,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER B',\n value: '⒝',\n codepoint: 9373,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER C',\n value: '⒞',\n codepoint: 9374,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER D',\n value: '⒟',\n codepoint: 9375,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER E',\n value: '⒠',\n codepoint: 9376,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER F',\n value: '⒡',\n codepoint: 9377,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER G',\n value: '⒢',\n codepoint: 9378,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER H',\n value: '⒣',\n codepoint: 9379,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER I',\n value: '⒤',\n codepoint: 9380,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER J',\n value: '⒥',\n codepoint: 9381,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER K',\n value: '⒦',\n codepoint: 9382,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER L',\n value: '⒧',\n codepoint: 9383,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER M',\n value: '⒨',\n codepoint: 9384,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER N',\n value: '⒩',\n codepoint: 9385,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER O',\n value: '⒪',\n codepoint: 9386,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER P',\n value: '⒫',\n codepoint: 9387,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER Q',\n value: '⒬',\n codepoint: 9388,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER R',\n value: '⒭',\n codepoint: 9389,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER S',\n value: '⒮',\n codepoint: 9390,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER T',\n value: '⒯',\n codepoint: 9391,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER U',\n value: '⒰',\n codepoint: 9392,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER V',\n value: '⒱',\n codepoint: 9393,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER W',\n value: '⒲',\n codepoint: 9394,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER X',\n value: '⒳',\n codepoint: 9395,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER Y',\n value: '⒴',\n codepoint: 9396,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER Z',\n value: '⒵',\n codepoint: 9397,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER A',\n value: 'Ⓐ',\n codepoint: 9398,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER B',\n value: 'Ⓑ',\n codepoint: 9399,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER C',\n value: 'Ⓒ',\n codepoint: 9400,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER D',\n value: 'Ⓓ',\n codepoint: 9401,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER E',\n value: 'Ⓔ',\n codepoint: 9402,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER F',\n value: 'Ⓕ',\n codepoint: 9403,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER G',\n value: 'Ⓖ',\n codepoint: 9404,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER H',\n value: 'Ⓗ',\n codepoint: 9405,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER I',\n value: 'Ⓘ',\n codepoint: 9406,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER J',\n value: 'Ⓙ',\n codepoint: 9407,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER K',\n value: 'Ⓚ',\n codepoint: 9408,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER L',\n value: 'Ⓛ',\n codepoint: 9409,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER N',\n value: 'Ⓝ',\n codepoint: 9411,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER O',\n value: 'Ⓞ',\n codepoint: 9412,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER P',\n value: 'Ⓟ',\n codepoint: 9413,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER Q',\n value: 'Ⓠ',\n codepoint: 9414,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER R',\n value: 'Ⓡ',\n codepoint: 9415,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER S',\n value: 'Ⓢ',\n codepoint: 9416,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER T',\n value: 'Ⓣ',\n codepoint: 9417,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER U',\n value: 'Ⓤ',\n codepoint: 9418,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER V',\n value: 'Ⓥ',\n codepoint: 9419,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER W',\n value: 'Ⓦ',\n codepoint: 9420,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER X',\n value: 'Ⓧ',\n codepoint: 9421,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER Y',\n value: 'Ⓨ',\n codepoint: 9422,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER Z',\n value: 'Ⓩ',\n codepoint: 9423,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER A',\n value: 'ⓐ',\n codepoint: 9424,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER B',\n value: 'ⓑ',\n codepoint: 9425,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER C',\n value: 'ⓒ',\n codepoint: 9426,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER D',\n value: 'ⓓ',\n codepoint: 9427,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER E',\n value: 'ⓔ',\n codepoint: 9428,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER F',\n value: 'ⓕ',\n codepoint: 9429,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER G',\n value: 'ⓖ',\n codepoint: 9430,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER H',\n value: 'ⓗ',\n codepoint: 9431,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER I',\n value: 'ⓘ',\n codepoint: 9432,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER J',\n value: 'ⓙ',\n codepoint: 9433,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER K',\n value: 'ⓚ',\n codepoint: 9434,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER L',\n value: 'ⓛ',\n codepoint: 9435,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER M',\n value: 'ⓜ',\n codepoint: 9436,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER N',\n value: 'ⓝ',\n codepoint: 9437,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER O',\n value: 'ⓞ',\n codepoint: 9438,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER P',\n value: 'ⓟ',\n codepoint: 9439,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER Q',\n value: 'ⓠ',\n codepoint: 9440,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER R',\n value: 'ⓡ',\n codepoint: 9441,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER S',\n value: 'ⓢ',\n codepoint: 9442,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER T',\n value: 'ⓣ',\n codepoint: 9443,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER U',\n value: 'ⓤ',\n codepoint: 9444,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER V',\n value: 'ⓥ',\n codepoint: 9445,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER W',\n value: 'ⓦ',\n codepoint: 9446,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER X',\n value: 'ⓧ',\n codepoint: 9447,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER Y',\n value: 'ⓨ',\n codepoint: 9448,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER Z',\n value: 'ⓩ',\n codepoint: 9449,\n },\n {\n name: 'CIRCLED DIGIT ZERO',\n value: '⓪',\n codepoint: 9450,\n },\n {\n name: 'NEGATIVE CIRCLED NUMBER ELEVEN',\n value: '⓫',\n codepoint: 9451,\n },\n {\n name: 'NEGATIVE CIRCLED NUMBER TWELVE',\n value: '⓬',\n codepoint: 9452,\n },\n {\n name: 'NEGATIVE CIRCLED NUMBER THIRTEEN',\n value: '⓭',\n codepoint: 9453,\n },\n {\n name: 'NEGATIVE CIRCLED NUMBER FOURTEEN',\n value: '⓮',\n codepoint: 9454,\n },\n {\n name: 'NEGATIVE CIRCLED NUMBER FIFTEEN',\n value: '⓯',\n codepoint: 9455,\n },\n {\n name: 'NEGATIVE CIRCLED NUMBER SIXTEEN',\n value: '⓰',\n codepoint: 9456,\n },\n {\n name: 'NEGATIVE CIRCLED NUMBER SEVENTEEN',\n value: '⓱',\n codepoint: 9457,\n },\n {\n name: 'NEGATIVE CIRCLED NUMBER EIGHTEEN',\n value: '⓲',\n codepoint: 9458,\n },\n {\n name: 'NEGATIVE CIRCLED NUMBER NINETEEN',\n value: '⓳',\n codepoint: 9459,\n },\n {\n name: 'NEGATIVE CIRCLED NUMBER TWENTY',\n value: '⓴',\n codepoint: 9460,\n },\n {\n name: 'DOUBLE CIRCLED DIGIT ONE',\n value: '⓵',\n codepoint: 9461,\n },\n {\n name: 'DOUBLE CIRCLED DIGIT TWO',\n value: '⓶',\n codepoint: 9462,\n },\n {\n name: 'DOUBLE CIRCLED DIGIT THREE',\n value: '⓷',\n codepoint: 9463,\n },\n {\n name: 'DOUBLE CIRCLED DIGIT FOUR',\n value: '⓸',\n codepoint: 9464,\n },\n {\n name: 'DOUBLE CIRCLED DIGIT FIVE',\n value: '⓹',\n codepoint: 9465,\n },\n {\n name: 'DOUBLE CIRCLED DIGIT SIX',\n value: '⓺',\n codepoint: 9466,\n },\n {\n name: 'DOUBLE CIRCLED DIGIT SEVEN',\n value: '⓻',\n codepoint: 9467,\n },\n {\n name: 'DOUBLE CIRCLED DIGIT EIGHT',\n value: '⓼',\n codepoint: 9468,\n },\n {\n name: 'DOUBLE CIRCLED DIGIT NINE',\n value: '⓽',\n codepoint: 9469,\n },\n {\n name: 'DOUBLE CIRCLED NUMBER TEN',\n value: '⓾',\n codepoint: 9470,\n },\n {\n name: 'NEGATIVE CIRCLED DIGIT ZERO',\n value: '⓿',\n codepoint: 9471,\n },\n {\n name: 'BLACK STAR',\n value: '★',\n codepoint: 9733,\n },\n {\n name: 'WHITE STAR',\n value: '☆',\n codepoint: 9734,\n },\n {\n name: 'LIGHTNING',\n value: '☇',\n codepoint: 9735,\n },\n {\n name: 'THUNDERSTORM',\n value: '☈',\n codepoint: 9736,\n },\n {\n name: 'SUN',\n value: '☉',\n codepoint: 9737,\n },\n {\n name: 'ASCENDING NODE',\n value: '☊',\n codepoint: 9738,\n },\n {\n name: 'DESCENDING NODE',\n value: '☋',\n codepoint: 9739,\n },\n {\n name: 'CONJUNCTION',\n value: '☌',\n codepoint: 9740,\n },\n {\n name: 'OPPOSITION',\n value: '☍',\n codepoint: 9741,\n },\n {\n name: 'WHITE TELEPHONE',\n value: '☏',\n codepoint: 9743,\n },\n {\n name: 'BALLOT BOX',\n value: '☐',\n codepoint: 9744,\n },\n {\n name: 'BALLOT BOX WITH X',\n value: '☒',\n codepoint: 9746,\n },\n {\n name: 'SALTIRE',\n value: '☓',\n codepoint: 9747,\n },\n {\n name: 'WHITE SHOGI PIECE',\n value: '☖',\n codepoint: 9750,\n },\n {\n name: 'BLACK SHOGI PIECE',\n value: '☗',\n codepoint: 9751,\n },\n {\n name: 'REVERSED ROTATED FLORAL HEART BULLET',\n value: '☙',\n codepoint: 9753,\n },\n {\n name: 'BLACK LEFT POINTING INDEX',\n value: '☚',\n codepoint: 9754,\n },\n {\n name: 'BLACK RIGHT POINTING INDEX',\n value: '☛',\n codepoint: 9755,\n },\n {\n name: 'WHITE LEFT POINTING INDEX',\n value: '☜',\n codepoint: 9756,\n },\n {\n name: 'WHITE RIGHT POINTING INDEX',\n value: '☞',\n codepoint: 9758,\n },\n {\n name: 'WHITE DOWN POINTING INDEX',\n value: '☟',\n codepoint: 9759,\n },\n {\n name: 'CAUTION SIGN',\n value: '☡',\n codepoint: 9761,\n },\n {\n name: 'CADUCEUS',\n value: '☤',\n codepoint: 9764,\n },\n {\n name: 'ANKH',\n value: '☥',\n codepoint: 9765,\n },\n {\n name: 'CHI RHO',\n value: '☧',\n codepoint: 9767,\n },\n {\n name: 'CROSS OF LORRAINE',\n value: '☨',\n codepoint: 9768,\n },\n {\n name: 'CROSS OF JERUSALEM',\n value: '☩',\n codepoint: 9769,\n },\n {\n name: 'FARSI SYMBOL',\n value: '☫',\n codepoint: 9771,\n },\n {\n name: 'ADI SHAKTI',\n value: '☬',\n codepoint: 9772,\n },\n {\n name: 'HAMMER AND SICKLE',\n value: '☭',\n codepoint: 9773,\n },\n {\n name: 'TRIGRAM FOR HEAVEN',\n value: '☰',\n codepoint: 9776,\n },\n {\n name: 'TRIGRAM FOR LAKE',\n value: '☱',\n codepoint: 9777,\n },\n {\n name: 'TRIGRAM FOR FIRE',\n value: '☲',\n codepoint: 9778,\n },\n {\n name: 'TRIGRAM FOR THUNDER',\n value: '☳',\n codepoint: 9779,\n },\n {\n name: 'TRIGRAM FOR WIND',\n value: '☴',\n codepoint: 9780,\n },\n {\n name: 'TRIGRAM FOR WATER',\n value: '☵',\n codepoint: 9781,\n },\n {\n name: 'TRIGRAM FOR MOUNTAIN',\n value: '☶',\n codepoint: 9782,\n },\n {\n name: 'TRIGRAM FOR EARTH',\n value: '☷',\n codepoint: 9783,\n },\n {\n name: 'BLACK SMILING FACE',\n value: '☻',\n codepoint: 9787,\n },\n {\n name: 'WHITE SUN WITH RAYS',\n value: '☼',\n codepoint: 9788,\n },\n {\n name: 'FIRST QUARTER MOON',\n value: '☽',\n codepoint: 9789,\n },\n {\n name: 'LAST QUARTER MOON',\n value: '☾',\n codepoint: 9790,\n },\n {\n name: 'MERCURY',\n value: '☿',\n codepoint: 9791,\n },\n {\n name: 'EARTH',\n value: '♁',\n codepoint: 9793,\n },\n {\n name: 'JUPITER',\n value: '♃',\n codepoint: 9795,\n },\n {\n name: 'SATURN',\n value: '♄',\n codepoint: 9796,\n },\n {\n name: 'URANUS',\n value: '♅',\n codepoint: 9797,\n },\n {\n name: 'NEPTUNE',\n value: '♆',\n codepoint: 9798,\n },\n {\n name: 'PLUTO',\n value: '♇',\n codepoint: 9799,\n },\n {\n name: 'WHITE CHESS KING',\n value: '♔',\n codepoint: 9812,\n },\n {\n name: 'WHITE CHESS QUEEN',\n value: '♕',\n codepoint: 9813,\n },\n {\n name: 'WHITE CHESS ROOK',\n value: '♖',\n codepoint: 9814,\n },\n {\n name: 'WHITE CHESS BISHOP',\n value: '♗',\n codepoint: 9815,\n },\n {\n name: 'WHITE CHESS KNIGHT',\n value: '♘',\n codepoint: 9816,\n },\n {\n name: 'WHITE CHESS PAWN',\n value: '♙',\n codepoint: 9817,\n },\n {\n name: 'BLACK CHESS KING',\n value: '♚',\n codepoint: 9818,\n },\n {\n name: 'BLACK CHESS QUEEN',\n value: '♛',\n codepoint: 9819,\n },\n {\n name: 'BLACK CHESS ROOK',\n value: '♜',\n codepoint: 9820,\n },\n {\n name: 'BLACK CHESS BISHOP',\n value: '♝',\n codepoint: 9821,\n },\n {\n name: 'BLACK CHESS KNIGHT',\n value: '♞',\n codepoint: 9822,\n },\n {\n name: 'WHITE HEART SUIT',\n value: '♡',\n codepoint: 9825,\n },\n {\n name: 'WHITE DIAMOND SUIT',\n value: '♢',\n codepoint: 9826,\n },\n {\n name: 'WHITE SPADE SUIT',\n value: '♤',\n codepoint: 9828,\n },\n {\n name: 'WHITE CLUB SUIT',\n value: '♧',\n codepoint: 9831,\n },\n {\n name: 'QUARTER NOTE',\n value: '♩',\n codepoint: 9833,\n },\n {\n name: 'EIGHTH NOTE',\n value: '♪',\n codepoint: 9834,\n },\n {\n name: 'BEAMED EIGHTH NOTES',\n value: '♫',\n codepoint: 9835,\n },\n {\n name: 'BEAMED SIXTEENTH NOTES',\n value: '♬',\n codepoint: 9836,\n },\n {\n name: 'MUSIC FLAT SIGN',\n value: '♭',\n codepoint: 9837,\n },\n {\n name: 'MUSIC NATURAL SIGN',\n value: '♮',\n codepoint: 9838,\n },\n {\n name: 'MUSIC SHARP SIGN',\n value: '♯',\n codepoint: 9839,\n },\n {\n name: 'WEST SYRIAC CROSS',\n value: '♰',\n codepoint: 9840,\n },\n {\n name: 'EAST SYRIAC CROSS',\n value: '♱',\n codepoint: 9841,\n },\n {\n name: 'UNIVERSAL RECYCLING SYMBOL',\n value: '♲',\n codepoint: 9842,\n },\n {\n name: 'RECYCLING SYMBOL FOR TYPE-1 PLASTICS',\n value: '♳',\n codepoint: 9843,\n },\n {\n name: 'RECYCLING SYMBOL FOR TYPE-2 PLASTICS',\n value: '♴',\n codepoint: 9844,\n },\n {\n name: 'RECYCLING SYMBOL FOR TYPE-3 PLASTICS',\n value: '♵',\n codepoint: 9845,\n },\n {\n name: 'RECYCLING SYMBOL FOR TYPE-4 PLASTICS',\n value: '♶',\n codepoint: 9846,\n },\n {\n name: 'RECYCLING SYMBOL FOR TYPE-5 PLASTICS',\n value: '♷',\n codepoint: 9847,\n },\n {\n name: 'RECYCLING SYMBOL FOR TYPE-6 PLASTICS',\n value: '♸',\n codepoint: 9848,\n },\n {\n name: 'RECYCLING SYMBOL FOR TYPE-7 PLASTICS',\n value: '♹',\n codepoint: 9849,\n },\n {\n name: 'RECYCLING SYMBOL FOR GENERIC MATERIALS',\n value: '♺',\n codepoint: 9850,\n },\n {\n name: 'RECYCLED PAPER SYMBOL',\n value: '♼',\n codepoint: 9852,\n },\n {\n name: 'PARTIALLY-RECYCLED PAPER SYMBOL',\n value: '♽',\n codepoint: 9853,\n },\n {\n name: 'DIE FACE-1',\n value: '⚀',\n codepoint: 9856,\n },\n {\n name: 'DIE FACE-2',\n value: '⚁',\n codepoint: 9857,\n },\n {\n name: 'DIE FACE-3',\n value: '⚂',\n codepoint: 9858,\n },\n {\n name: 'DIE FACE-4',\n value: '⚃',\n codepoint: 9859,\n },\n {\n name: 'DIE FACE-5',\n value: '⚄',\n codepoint: 9860,\n },\n {\n name: 'DIE FACE-6',\n value: '⚅',\n codepoint: 9861,\n },\n {\n name: 'WHITE CIRCLE WITH DOT RIGHT',\n value: '⚆',\n codepoint: 9862,\n },\n {\n name: 'WHITE CIRCLE WITH TWO DOTS',\n value: '⚇',\n codepoint: 9863,\n },\n {\n name: 'BLACK CIRCLE WITH WHITE DOT RIGHT',\n value: '⚈',\n codepoint: 9864,\n },\n {\n name: 'BLACK CIRCLE WITH TWO WHITE DOTS',\n value: '⚉',\n codepoint: 9865,\n },\n {\n name: 'MONOGRAM FOR YANG',\n value: '⚊',\n codepoint: 9866,\n },\n {\n name: 'MONOGRAM FOR YIN',\n value: '⚋',\n codepoint: 9867,\n },\n {\n name: 'DIGRAM FOR GREATER YANG',\n value: '⚌',\n codepoint: 9868,\n },\n {\n name: 'DIGRAM FOR LESSER YIN',\n value: '⚍',\n codepoint: 9869,\n },\n {\n name: 'DIGRAM FOR LESSER YANG',\n value: '⚎',\n codepoint: 9870,\n },\n {\n name: 'DIGRAM FOR GREATER YIN',\n value: '⚏',\n codepoint: 9871,\n },\n {\n name: 'WHITE FLAG',\n value: '⚐',\n codepoint: 9872,\n },\n {\n name: 'BLACK FLAG',\n value: '⚑',\n codepoint: 9873,\n },\n {\n name: 'FLOWER',\n value: '⚘',\n codepoint: 9880,\n },\n {\n name: 'STAFF OF HERMES',\n value: '⚚',\n codepoint: 9882,\n },\n {\n name: 'DOUBLED FEMALE SIGN',\n value: '⚢',\n codepoint: 9890,\n },\n {\n name: 'DOUBLED MALE SIGN',\n value: '⚣',\n codepoint: 9891,\n },\n {\n name: 'INTERLOCKED FEMALE AND MALE SIGN',\n value: '⚤',\n codepoint: 9892,\n },\n {\n name: 'MALE AND FEMALE SIGN',\n value: '⚥',\n codepoint: 9893,\n },\n {\n name: 'MALE WITH STROKE SIGN',\n value: '⚦',\n codepoint: 9894,\n },\n {\n name: 'VERTICAL MALE WITH STROKE SIGN',\n value: '⚨',\n codepoint: 9896,\n },\n {\n name: 'HORIZONTAL MALE WITH STROKE SIGN',\n value: '⚩',\n codepoint: 9897,\n },\n {\n name: 'MEDIUM SMALL WHITE CIRCLE',\n value: '⚬',\n codepoint: 9900,\n },\n {\n name: 'MARRIAGE SYMBOL',\n value: '⚭',\n codepoint: 9901,\n },\n {\n name: 'DIVORCE SYMBOL',\n value: '⚮',\n codepoint: 9902,\n },\n {\n name: 'UNMARRIED PARTNERSHIP SYMBOL',\n value: '⚯',\n codepoint: 9903,\n },\n {\n name: 'NEUTER',\n value: '⚲',\n codepoint: 9906,\n },\n {\n name: 'WHITE DIAMOND IN SQUARE',\n value: '⛋',\n codepoint: 9931,\n },\n {\n name: 'ASTRONOMICAL SYMBOL FOR URANUS',\n value: '⛢',\n codepoint: 9954,\n },\n {\n name: 'UPPER BLADE SCISSORS',\n value: '✁',\n codepoint: 9985,\n },\n {\n name: 'LOWER BLADE SCISSORS',\n value: '✃',\n codepoint: 9987,\n },\n {\n name: 'WHITE SCISSORS',\n value: '✄',\n codepoint: 9988,\n },\n {\n name: 'TELEPHONE LOCATION SIGN',\n value: '✆',\n codepoint: 9990,\n },\n {\n name: 'TAPE DRIVE',\n value: '✇',\n codepoint: 9991,\n },\n {\n name: 'LOWER RIGHT PENCIL',\n value: '✎',\n codepoint: 9998,\n },\n {\n name: 'UPPER RIGHT PENCIL',\n value: '✐',\n codepoint: 10000,\n },\n {\n name: 'WHITE NIB',\n value: '✑',\n codepoint: 10001,\n },\n {\n name: 'CHECK MARK',\n value: '✓',\n codepoint: 10003,\n },\n {\n name: 'MULTIPLICATION X',\n value: '✕',\n codepoint: 10005,\n },\n {\n name: 'BALLOT X',\n value: '✗',\n codepoint: 10007,\n },\n {\n name: 'HEAVY BALLOT X',\n value: '✘',\n codepoint: 10008,\n },\n {\n name: 'OUTLINED GREEK CROSS',\n value: '✙',\n codepoint: 10009,\n },\n {\n name: 'HEAVY GREEK CROSS',\n value: '✚',\n codepoint: 10010,\n },\n {\n name: 'OPEN CENTRE CROSS',\n value: '✛',\n codepoint: 10011,\n },\n {\n name: 'HEAVY OPEN CENTRE CROSS',\n value: '✜',\n codepoint: 10012,\n },\n {\n name: 'SHADOWED WHITE LATIN CROSS',\n value: '✞',\n codepoint: 10014,\n },\n {\n name: 'OUTLINED LATIN CROSS',\n value: '✟',\n codepoint: 10015,\n },\n {\n name: 'MALTESE CROSS',\n value: '✠',\n codepoint: 10016,\n },\n {\n name: 'FOUR TEARDROP-SPOKED ASTERISK',\n value: '✢',\n codepoint: 10018,\n },\n {\n name: 'FOUR BALLOON-SPOKED ASTERISK',\n value: '✣',\n codepoint: 10019,\n },\n {\n name: 'HEAVY FOUR BALLOON-SPOKED ASTERISK',\n value: '✤',\n codepoint: 10020,\n },\n {\n name: 'FOUR CLUB-SPOKED ASTERISK',\n value: '✥',\n codepoint: 10021,\n },\n {\n name: 'BLACK FOUR POINTED STAR',\n value: '✦',\n codepoint: 10022,\n },\n {\n name: 'WHITE FOUR POINTED STAR',\n value: '✧',\n codepoint: 10023,\n },\n {\n name: 'STRESS OUTLINED WHITE STAR',\n value: '✩',\n codepoint: 10025,\n },\n {\n name: 'CIRCLED WHITE STAR',\n value: '✪',\n codepoint: 10026,\n },\n {\n name: 'OPEN CENTRE BLACK STAR',\n value: '✫',\n codepoint: 10027,\n },\n {\n name: 'BLACK CENTRE WHITE STAR',\n value: '✬',\n codepoint: 10028,\n },\n {\n name: 'OUTLINED BLACK STAR',\n value: '✭',\n codepoint: 10029,\n },\n {\n name: 'HEAVY OUTLINED BLACK STAR',\n value: '✮',\n codepoint: 10030,\n },\n {\n name: 'PINWHEEL STAR',\n value: '✯',\n codepoint: 10031,\n },\n {\n name: 'SHADOWED WHITE STAR',\n value: '✰',\n codepoint: 10032,\n },\n {\n name: 'HEAVY ASTERISK',\n value: '✱',\n codepoint: 10033,\n },\n {\n name: 'OPEN CENTRE ASTERISK',\n value: '✲',\n codepoint: 10034,\n },\n {\n name: 'EIGHT POINTED PINWHEEL STAR',\n value: '✵',\n codepoint: 10037,\n },\n {\n name: 'SIX POINTED BLACK STAR',\n value: '✶',\n codepoint: 10038,\n },\n {\n name: 'EIGHT POINTED RECTILINEAR BLACK STAR',\n value: '✷',\n codepoint: 10039,\n },\n {\n name: 'HEAVY EIGHT POINTED RECTILINEAR BLACK STAR',\n value: '✸',\n codepoint: 10040,\n },\n {\n name: 'TWELVE POINTED BLACK STAR',\n value: '✹',\n codepoint: 10041,\n },\n {\n name: 'SIXTEEN POINTED ASTERISK',\n value: '✺',\n codepoint: 10042,\n },\n {\n name: 'TEARDROP-SPOKED ASTERISK',\n value: '✻',\n codepoint: 10043,\n },\n {\n name: 'OPEN CENTRE TEARDROP-SPOKED ASTERISK',\n value: '✼',\n codepoint: 10044,\n },\n {\n name: 'HEAVY TEARDROP-SPOKED ASTERISK',\n value: '✽',\n codepoint: 10045,\n },\n {\n name: 'SIX PETALLED BLACK AND WHITE FLORETTE',\n value: '✾',\n codepoint: 10046,\n },\n {\n name: 'BLACK FLORETTE',\n value: '✿',\n codepoint: 10047,\n },\n {\n name: 'WHITE FLORETTE',\n value: '❀',\n codepoint: 10048,\n },\n {\n name: 'EIGHT PETALLED OUTLINED BLACK FLORETTE',\n value: '❁',\n codepoint: 10049,\n },\n {\n name: 'CIRCLED OPEN CENTRE EIGHT POINTED STAR',\n value: '❂',\n codepoint: 10050,\n },\n {\n name: 'HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK',\n value: '❃',\n codepoint: 10051,\n },\n {\n name: 'TIGHT TRIFOLIATE SNOWFLAKE',\n value: '❅',\n codepoint: 10053,\n },\n {\n name: 'HEAVY CHEVRON SNOWFLAKE',\n value: '❆',\n codepoint: 10054,\n },\n {\n name: 'HEAVY SPARKLE',\n value: '❈',\n codepoint: 10056,\n },\n {\n name: 'BALLOON-SPOKED ASTERISK',\n value: '❉',\n codepoint: 10057,\n },\n {\n name: 'EIGHT TEARDROP-SPOKED PROPELLER ASTERISK',\n value: '❊',\n codepoint: 10058,\n },\n {\n name: 'HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK',\n value: '❋',\n codepoint: 10059,\n },\n {\n name: 'SHADOWED WHITE CIRCLE',\n value: '❍',\n codepoint: 10061,\n },\n {\n name: 'LOWER RIGHT DROP-SHADOWED WHITE SQUARE',\n value: '❏',\n codepoint: 10063,\n },\n {\n name: 'UPPER RIGHT DROP-SHADOWED WHITE SQUARE',\n value: '❐',\n codepoint: 10064,\n },\n {\n name: 'LOWER RIGHT SHADOWED WHITE SQUARE',\n value: '❑',\n codepoint: 10065,\n },\n {\n name: 'UPPER RIGHT SHADOWED WHITE SQUARE',\n value: '❒',\n codepoint: 10066,\n },\n {\n name: 'BLACK DIAMOND MINUS WHITE X',\n value: '❖',\n codepoint: 10070,\n },\n {\n name: 'LIGHT VERTICAL BAR',\n value: '❘',\n codepoint: 10072,\n },\n {\n name: 'MEDIUM VERTICAL BAR',\n value: '❙',\n codepoint: 10073,\n },\n {\n name: 'HEAVY VERTICAL BAR',\n value: '❚',\n codepoint: 10074,\n },\n {\n name: 'HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT',\n value: '❛',\n codepoint: 10075,\n },\n {\n name: 'HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT',\n value: '❜',\n codepoint: 10076,\n },\n {\n name: 'HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT',\n value: '❝',\n codepoint: 10077,\n },\n {\n name: 'HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT',\n value: '❞',\n codepoint: 10078,\n },\n {\n name: 'CURVED STEM PARAGRAPH SIGN ORNAMENT',\n value: '❡',\n codepoint: 10081,\n },\n {\n name: 'HEAVY EXCLAMATION MARK ORNAMENT',\n value: '❢',\n codepoint: 10082,\n },\n {\n name: 'ROTATED HEAVY BLACK HEART BULLET',\n value: '❥',\n codepoint: 10085,\n },\n {\n name: 'FLORAL HEART',\n value: '❦',\n codepoint: 10086,\n },\n {\n name: 'ROTATED FLORAL HEART BULLET',\n value: '❧',\n codepoint: 10087,\n },\n {\n name: 'MEDIUM LEFT PARENTHESIS ORNAMENT',\n value: '❨',\n codepoint: 10088,\n },\n {\n name: 'MEDIUM RIGHT PARENTHESIS ORNAMENT',\n value: '❩',\n codepoint: 10089,\n },\n {\n name: 'MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT',\n value: '❪',\n codepoint: 10090,\n },\n {\n name: 'MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT',\n value: '❫',\n codepoint: 10091,\n },\n {\n name: 'MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT',\n value: '❬',\n codepoint: 10092,\n },\n {\n name: 'MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT',\n value: '❭',\n codepoint: 10093,\n },\n {\n name: 'HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT',\n value: '❮',\n codepoint: 10094,\n },\n {\n name: 'HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT',\n value: '❯',\n codepoint: 10095,\n },\n {\n name: 'HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT',\n value: '❰',\n codepoint: 10096,\n },\n {\n name: 'HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT',\n value: '❱',\n codepoint: 10097,\n },\n {\n name: 'LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT',\n value: '❲',\n codepoint: 10098,\n },\n {\n name: 'LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT',\n value: '❳',\n codepoint: 10099,\n },\n {\n name: 'MEDIUM LEFT CURLY BRACKET ORNAMENT',\n value: '❴',\n codepoint: 10100,\n },\n {\n name: 'MEDIUM RIGHT CURLY BRACKET ORNAMENT',\n value: '❵',\n codepoint: 10101,\n },\n {\n name: 'DINGBAT NEGATIVE CIRCLED DIGIT ONE',\n value: '❶',\n codepoint: 10102,\n },\n {\n name: 'DINGBAT NEGATIVE CIRCLED DIGIT TWO',\n value: '❷',\n codepoint: 10103,\n },\n {\n name: 'DINGBAT NEGATIVE CIRCLED DIGIT THREE',\n value: '❸',\n codepoint: 10104,\n },\n {\n name: 'DINGBAT NEGATIVE CIRCLED DIGIT FOUR',\n value: '❹',\n codepoint: 10105,\n },\n {\n name: 'DINGBAT NEGATIVE CIRCLED DIGIT FIVE',\n value: '❺',\n codepoint: 10106,\n },\n {\n name: 'DINGBAT NEGATIVE CIRCLED DIGIT SIX',\n value: '❻',\n codepoint: 10107,\n },\n {\n name: 'DINGBAT NEGATIVE CIRCLED DIGIT SEVEN',\n value: '❼',\n codepoint: 10108,\n },\n {\n name: 'DINGBAT NEGATIVE CIRCLED DIGIT EIGHT',\n value: '❽',\n codepoint: 10109,\n },\n {\n name: 'DINGBAT NEGATIVE CIRCLED DIGIT NINE',\n value: '❾',\n codepoint: 10110,\n },\n {\n name: 'DINGBAT NEGATIVE CIRCLED NUMBER TEN',\n value: '❿',\n codepoint: 10111,\n },\n {\n name: 'DINGBAT CIRCLED SANS-SERIF DIGIT ONE',\n value: '➀',\n codepoint: 10112,\n },\n {\n name: 'DINGBAT CIRCLED SANS-SERIF DIGIT TWO',\n value: '➁',\n codepoint: 10113,\n },\n {\n name: 'DINGBAT CIRCLED SANS-SERIF DIGIT THREE',\n value: '➂',\n codepoint: 10114,\n },\n {\n name: 'DINGBAT CIRCLED SANS-SERIF DIGIT FOUR',\n value: '➃',\n codepoint: 10115,\n },\n {\n name: 'DINGBAT CIRCLED SANS-SERIF DIGIT FIVE',\n value: '➄',\n codepoint: 10116,\n },\n {\n name: 'DINGBAT CIRCLED SANS-SERIF DIGIT SIX',\n value: '➅',\n codepoint: 10117,\n },\n {\n name: 'DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN',\n value: '➆',\n codepoint: 10118,\n },\n {\n name: 'DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT',\n value: '➇',\n codepoint: 10119,\n },\n {\n name: 'DINGBAT CIRCLED SANS-SERIF DIGIT NINE',\n value: '➈',\n codepoint: 10120,\n },\n {\n name: 'DINGBAT CIRCLED SANS-SERIF NUMBER TEN',\n value: '➉',\n codepoint: 10121,\n },\n {\n name: 'DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE',\n value: '➊',\n codepoint: 10122,\n },\n {\n name: 'DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO',\n value: '➋',\n codepoint: 10123,\n },\n {\n name: 'DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE',\n value: '➌',\n codepoint: 10124,\n },\n {\n name: 'DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR',\n value: '➍',\n codepoint: 10125,\n },\n {\n name: 'DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE',\n value: '➎',\n codepoint: 10126,\n },\n {\n name: 'DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX',\n value: '➏',\n codepoint: 10127,\n },\n {\n name: 'DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN',\n value: '➐',\n codepoint: 10128,\n },\n {\n name: 'DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT',\n value: '➑',\n codepoint: 10129,\n },\n {\n name: 'DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE',\n value: '➒',\n codepoint: 10130,\n },\n {\n name: 'DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN',\n value: '➓',\n codepoint: 10131,\n },\n {\n name: 'HEAVY WIDE-HEADED RIGHTWARDS ARROW',\n value: '➔',\n codepoint: 10132,\n },\n {\n name: 'HEAVY SOUTH EAST ARROW',\n value: '➘',\n codepoint: 10136,\n },\n {\n name: 'HEAVY RIGHTWARDS ARROW',\n value: '➙',\n codepoint: 10137,\n },\n {\n name: 'HEAVY NORTH EAST ARROW',\n value: '➚',\n codepoint: 10138,\n },\n {\n name: 'DRAFTING POINT RIGHTWARDS ARROW',\n value: '➛',\n codepoint: 10139,\n },\n {\n name: 'HEAVY ROUND-TIPPED RIGHTWARDS ARROW',\n value: '➜',\n codepoint: 10140,\n },\n {\n name: 'TRIANGLE-HEADED RIGHTWARDS ARROW',\n value: '➝',\n codepoint: 10141,\n },\n {\n name: 'HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW',\n value: '➞',\n codepoint: 10142,\n },\n {\n name: 'DASHED TRIANGLE-HEADED RIGHTWARDS ARROW',\n value: '➟',\n codepoint: 10143,\n },\n {\n name: 'HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW',\n value: '➠',\n codepoint: 10144,\n },\n {\n name: 'THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD',\n value: '➢',\n codepoint: 10146,\n },\n {\n name: 'THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD',\n value: '➣',\n codepoint: 10147,\n },\n {\n name: 'BLACK RIGHTWARDS ARROWHEAD',\n value: '➤',\n codepoint: 10148,\n },\n {\n name: 'HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW',\n value: '➥',\n codepoint: 10149,\n },\n {\n name: 'HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW',\n value: '➦',\n codepoint: 10150,\n },\n {\n name: 'SQUAT BLACK RIGHTWARDS ARROW',\n value: '➧',\n codepoint: 10151,\n },\n {\n name: 'HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW',\n value: '➨',\n codepoint: 10152,\n },\n {\n name: 'RIGHT-SHADED WHITE RIGHTWARDS ARROW',\n value: '➩',\n codepoint: 10153,\n },\n {\n name: 'LEFT-SHADED WHITE RIGHTWARDS ARROW',\n value: '➪',\n codepoint: 10154,\n },\n {\n name: 'BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW',\n value: '➫',\n codepoint: 10155,\n },\n {\n name: 'FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW',\n value: '➬',\n codepoint: 10156,\n },\n {\n name: 'HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW',\n value: '➭',\n codepoint: 10157,\n },\n {\n name: 'HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW',\n value: '➮',\n codepoint: 10158,\n },\n {\n name: 'NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW',\n value: '➯',\n codepoint: 10159,\n },\n {\n name: 'NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW',\n value: '➱',\n codepoint: 10161,\n },\n {\n name: 'CIRCLED HEAVY WHITE RIGHTWARDS ARROW',\n value: '➲',\n codepoint: 10162,\n },\n {\n name: 'WHITE-FEATHERED RIGHTWARDS ARROW',\n value: '➳',\n codepoint: 10163,\n },\n {\n name: 'BLACK-FEATHERED SOUTH EAST ARROW',\n value: '➴',\n codepoint: 10164,\n },\n {\n name: 'BLACK-FEATHERED RIGHTWARDS ARROW',\n value: '➵',\n codepoint: 10165,\n },\n {\n name: 'BLACK-FEATHERED NORTH EAST ARROW',\n value: '➶',\n codepoint: 10166,\n },\n {\n name: 'HEAVY BLACK-FEATHERED SOUTH EAST ARROW',\n value: '➷',\n codepoint: 10167,\n },\n {\n name: 'HEAVY BLACK-FEATHERED RIGHTWARDS ARROW',\n value: '➸',\n codepoint: 10168,\n },\n {\n name: 'HEAVY BLACK-FEATHERED NORTH EAST ARROW',\n value: '➹',\n codepoint: 10169,\n },\n {\n name: 'TEARDROP-BARBED RIGHTWARDS ARROW',\n value: '➺',\n codepoint: 10170,\n },\n {\n name: 'HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW',\n value: '➻',\n codepoint: 10171,\n },\n {\n name: 'WEDGE-TAILED RIGHTWARDS ARROW',\n value: '➼',\n codepoint: 10172,\n },\n {\n name: 'HEAVY WEDGE-TAILED RIGHTWARDS ARROW',\n value: '➽',\n codepoint: 10173,\n },\n {\n name: 'OPEN-OUTLINED RIGHTWARDS ARROW',\n value: '➾',\n codepoint: 10174,\n },\n ],\n },\n {\n name: 'Mathematical',\n symbols: [\n {\n name: 'FOR ALL',\n value: '∀',\n codepoint: 8704,\n },\n {\n name: 'COMPLEMENT',\n value: '∁',\n codepoint: 8705,\n },\n {\n name: 'PARTIAL DIFFERENTIAL',\n value: '∂',\n codepoint: 8706,\n },\n {\n name: 'THERE EXISTS',\n value: '∃',\n codepoint: 8707,\n },\n {\n name: 'THERE DOES NOT EXIST',\n value: '∄',\n codepoint: 8708,\n },\n {\n name: 'EMPTY SET',\n value: '∅',\n codepoint: 8709,\n },\n {\n name: 'INCREMENT',\n value: '∆',\n codepoint: 8710,\n },\n {\n name: 'NABLA',\n value: '∇',\n codepoint: 8711,\n },\n {\n name: 'ELEMENT OF',\n value: '∈',\n codepoint: 8712,\n },\n {\n name: 'NOT AN ELEMENT OF',\n value: '∉',\n codepoint: 8713,\n },\n {\n name: 'SMALL ELEMENT OF',\n value: '∊',\n codepoint: 8714,\n },\n {\n name: 'CONTAINS AS MEMBER',\n value: '∋',\n codepoint: 8715,\n },\n {\n name: 'DOES NOT CONTAIN AS MEMBER',\n value: '∌',\n codepoint: 8716,\n },\n {\n name: 'SMALL CONTAINS AS MEMBER',\n value: '∍',\n codepoint: 8717,\n },\n {\n name: 'END OF PROOF',\n value: '∎',\n codepoint: 8718,\n },\n {\n name: 'N-ARY PRODUCT',\n value: '∏',\n codepoint: 8719,\n },\n {\n name: 'N-ARY COPRODUCT',\n value: '∐',\n codepoint: 8720,\n },\n {\n name: 'N-ARY SUMMATION',\n value: '∑',\n codepoint: 8721,\n },\n {\n name: 'MINUS SIGN',\n value: '−',\n codepoint: 8722,\n },\n {\n name: 'MINUS-OR-PLUS SIGN',\n value: '∓',\n codepoint: 8723,\n },\n {\n name: 'DOT PLUS',\n value: '∔',\n codepoint: 8724,\n },\n {\n name: 'DIVISION SLASH',\n value: '∕',\n codepoint: 8725,\n },\n {\n name: 'SET MINUS',\n value: '∖',\n codepoint: 8726,\n },\n {\n name: 'ASTERISK OPERATOR',\n value: '∗',\n codepoint: 8727,\n },\n {\n name: 'RING OPERATOR',\n value: '∘',\n codepoint: 8728,\n },\n {\n name: 'BULLET OPERATOR',\n value: '∙',\n codepoint: 8729,\n },\n {\n name: 'SQUARE ROOT',\n value: '√',\n codepoint: 8730,\n },\n {\n name: 'CUBE ROOT',\n value: '∛',\n codepoint: 8731,\n },\n {\n name: 'FOURTH ROOT',\n value: '∜',\n codepoint: 8732,\n },\n {\n name: 'PROPORTIONAL TO',\n value: '∝',\n codepoint: 8733,\n },\n {\n name: 'INFINITY',\n value: '∞',\n codepoint: 8734,\n },\n {\n name: 'RIGHT ANGLE',\n value: '∟',\n codepoint: 8735,\n },\n {\n name: 'ANGLE',\n value: '∠',\n codepoint: 8736,\n },\n {\n name: 'MEASURED ANGLE',\n value: '∡',\n codepoint: 8737,\n },\n {\n name: 'SPHERICAL ANGLE',\n value: '∢',\n codepoint: 8738,\n },\n {\n name: 'DIVIDES',\n value: '∣',\n codepoint: 8739,\n },\n {\n name: 'DOES NOT DIVIDE',\n value: '∤',\n codepoint: 8740,\n },\n {\n name: 'PARALLEL TO',\n value: '∥',\n codepoint: 8741,\n },\n {\n name: 'NOT PARALLEL TO',\n value: '∦',\n codepoint: 8742,\n },\n {\n name: 'LOGICAL AND',\n value: '∧',\n codepoint: 8743,\n },\n {\n name: 'LOGICAL OR',\n value: '∨',\n codepoint: 8744,\n },\n {\n name: 'INTERSECTION',\n value: '∩',\n codepoint: 8745,\n },\n {\n name: 'UNION',\n value: '∪',\n codepoint: 8746,\n },\n {\n name: 'INTEGRAL',\n value: '∫',\n codepoint: 8747,\n },\n {\n name: 'DOUBLE INTEGRAL',\n value: '∬',\n codepoint: 8748,\n },\n {\n name: 'TRIPLE INTEGRAL',\n value: '∭',\n codepoint: 8749,\n },\n {\n name: 'CONTOUR INTEGRAL',\n value: '∮',\n codepoint: 8750,\n },\n {\n name: 'SURFACE INTEGRAL',\n value: '∯',\n codepoint: 8751,\n },\n {\n name: 'VOLUME INTEGRAL',\n value: '∰',\n codepoint: 8752,\n },\n {\n name: 'CLOCKWISE INTEGRAL',\n value: '∱',\n codepoint: 8753,\n },\n {\n name: 'CLOCKWISE CONTOUR INTEGRAL',\n value: '∲',\n codepoint: 8754,\n },\n {\n name: 'ANTICLOCKWISE CONTOUR INTEGRAL',\n value: '∳',\n codepoint: 8755,\n },\n {\n name: 'THEREFORE',\n value: '∴',\n codepoint: 8756,\n },\n {\n name: 'BECAUSE',\n value: '∵',\n codepoint: 8757,\n },\n {\n name: 'RATIO',\n value: '∶',\n codepoint: 8758,\n },\n {\n name: 'PROPORTION',\n value: '∷',\n codepoint: 8759,\n },\n {\n name: 'DOT MINUS',\n value: '∸',\n codepoint: 8760,\n },\n {\n name: 'EXCESS',\n value: '∹',\n codepoint: 8761,\n },\n {\n name: 'GEOMETRIC PROPORTION',\n value: '∺',\n codepoint: 8762,\n },\n {\n name: 'HOMOTHETIC',\n value: '∻',\n codepoint: 8763,\n },\n {\n name: 'TILDE OPERATOR',\n value: '∼',\n codepoint: 8764,\n },\n {\n name: 'REVERSED TILDE',\n value: '∽',\n codepoint: 8765,\n },\n {\n name: 'INVERTED LAZY S',\n value: '∾',\n codepoint: 8766,\n },\n {\n name: 'SINE WAVE',\n value: '∿',\n codepoint: 8767,\n },\n {\n name: 'WREATH PRODUCT',\n value: '≀',\n codepoint: 8768,\n },\n {\n name: 'NOT TILDE',\n value: '≁',\n codepoint: 8769,\n },\n {\n name: 'MINUS TILDE',\n value: '≂',\n codepoint: 8770,\n },\n {\n name: 'ASYMPTOTICALLY EQUAL TO',\n value: '≃',\n codepoint: 8771,\n },\n {\n name: 'NOT ASYMPTOTICALLY EQUAL TO',\n value: '≄',\n codepoint: 8772,\n },\n {\n name: 'APPROXIMATELY EQUAL TO',\n value: '≅',\n codepoint: 8773,\n },\n {\n name: 'APPROXIMATELY BUT NOT ACTUALLY EQUAL TO',\n value: '≆',\n codepoint: 8774,\n },\n {\n name: 'NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO',\n value: '≇',\n codepoint: 8775,\n },\n {\n name: 'ALMOST EQUAL TO',\n value: '≈',\n codepoint: 8776,\n },\n {\n name: 'NOT ALMOST EQUAL TO',\n value: '≉',\n codepoint: 8777,\n },\n {\n name: 'ALMOST EQUAL OR EQUAL TO',\n value: '≊',\n codepoint: 8778,\n },\n {\n name: 'TRIPLE TILDE',\n value: '≋',\n codepoint: 8779,\n },\n {\n name: 'ALL EQUAL TO',\n value: '≌',\n codepoint: 8780,\n },\n {\n name: 'EQUIVALENT TO',\n value: '≍',\n codepoint: 8781,\n },\n {\n name: 'GEOMETRICALLY EQUIVALENT TO',\n value: '≎',\n codepoint: 8782,\n },\n {\n name: 'DIFFERENCE BETWEEN',\n value: '≏',\n codepoint: 8783,\n },\n {\n name: 'APPROACHES THE LIMIT',\n value: '≐',\n codepoint: 8784,\n },\n {\n name: 'GEOMETRICALLY EQUAL TO',\n value: '≑',\n codepoint: 8785,\n },\n {\n name: 'APPROXIMATELY EQUAL TO OR THE IMAGE OF',\n value: '≒',\n codepoint: 8786,\n },\n {\n name: 'IMAGE OF OR APPROXIMATELY EQUAL TO',\n value: '≓',\n codepoint: 8787,\n },\n {\n name: 'COLON EQUALS',\n value: '≔',\n codepoint: 8788,\n },\n {\n name: 'EQUALS COLON',\n value: '≕',\n codepoint: 8789,\n },\n {\n name: 'RING IN EQUAL TO',\n value: '≖',\n codepoint: 8790,\n },\n {\n name: 'RING EQUAL TO',\n value: '≗',\n codepoint: 8791,\n },\n {\n name: 'CORRESPONDS TO',\n value: '≘',\n codepoint: 8792,\n },\n {\n name: 'ESTIMATES',\n value: '≙',\n codepoint: 8793,\n },\n {\n name: 'EQUIANGULAR TO',\n value: '≚',\n codepoint: 8794,\n },\n {\n name: 'STAR EQUALS',\n value: '≛',\n codepoint: 8795,\n },\n {\n name: 'DELTA EQUAL TO',\n value: '≜',\n codepoint: 8796,\n },\n {\n name: 'EQUAL TO BY DEFINITION',\n value: '≝',\n codepoint: 8797,\n },\n {\n name: 'MEASURED BY',\n value: '≞',\n codepoint: 8798,\n },\n {\n name: 'QUESTIONED EQUAL TO',\n value: '≟',\n codepoint: 8799,\n },\n {\n name: 'NOT EQUAL TO',\n value: '≠',\n codepoint: 8800,\n },\n {\n name: 'IDENTICAL TO',\n value: '≡',\n codepoint: 8801,\n },\n {\n name: 'NOT IDENTICAL TO',\n value: '≢',\n codepoint: 8802,\n },\n {\n name: 'STRICTLY EQUIVALENT TO',\n value: '≣',\n codepoint: 8803,\n },\n {\n name: 'LESS-THAN OR EQUAL TO',\n value: '≤',\n codepoint: 8804,\n },\n {\n name: 'GREATER-THAN OR EQUAL TO',\n value: '≥',\n codepoint: 8805,\n },\n {\n name: 'LESS-THAN OVER EQUAL TO',\n value: '≦',\n codepoint: 8806,\n },\n {\n name: 'GREATER-THAN OVER EQUAL TO',\n value: '≧',\n codepoint: 8807,\n },\n {\n name: 'LESS-THAN BUT NOT EQUAL TO',\n value: '≨',\n codepoint: 8808,\n },\n {\n name: 'GREATER-THAN BUT NOT EQUAL TO',\n value: '≩',\n codepoint: 8809,\n },\n {\n name: 'MUCH LESS-THAN',\n value: '≪',\n codepoint: 8810,\n },\n {\n name: 'MUCH GREATER-THAN',\n value: '≫',\n codepoint: 8811,\n },\n {\n name: 'BETWEEN',\n value: '≬',\n codepoint: 8812,\n },\n {\n name: 'NOT EQUIVALENT TO',\n value: '≭',\n codepoint: 8813,\n },\n {\n name: 'NOT LESS-THAN',\n value: '≮',\n codepoint: 8814,\n },\n {\n name: 'NOT GREATER-THAN',\n value: '≯',\n codepoint: 8815,\n },\n {\n name: 'NEITHER LESS-THAN NOR EQUAL TO',\n value: '≰',\n codepoint: 8816,\n },\n {\n name: 'NEITHER GREATER-THAN NOR EQUAL TO',\n value: '≱',\n codepoint: 8817,\n },\n {\n name: 'LESS-THAN OR EQUIVALENT TO',\n value: '≲',\n codepoint: 8818,\n },\n {\n name: 'GREATER-THAN OR EQUIVALENT TO',\n value: '≳',\n codepoint: 8819,\n },\n {\n name: 'NEITHER LESS-THAN NOR EQUIVALENT TO',\n value: '≴',\n codepoint: 8820,\n },\n {\n name: 'NEITHER GREATER-THAN NOR EQUIVALENT TO',\n value: '≵',\n codepoint: 8821,\n },\n {\n name: 'LESS-THAN OR GREATER-THAN',\n value: '≶',\n codepoint: 8822,\n },\n {\n name: 'GREATER-THAN OR LESS-THAN',\n value: '≷',\n codepoint: 8823,\n },\n {\n name: 'NEITHER LESS-THAN NOR GREATER-THAN',\n value: '≸',\n codepoint: 8824,\n },\n {\n name: 'NEITHER GREATER-THAN NOR LESS-THAN',\n value: '≹',\n codepoint: 8825,\n },\n {\n name: 'PRECEDES',\n value: '≺',\n codepoint: 8826,\n },\n {\n name: 'SUCCEEDS',\n value: '≻',\n codepoint: 8827,\n },\n {\n name: 'PRECEDES OR EQUAL TO',\n value: '≼',\n codepoint: 8828,\n },\n {\n name: 'SUCCEEDS OR EQUAL TO',\n value: '≽',\n codepoint: 8829,\n },\n {\n name: 'PRECEDES OR EQUIVALENT TO',\n value: '≾',\n codepoint: 8830,\n },\n {\n name: 'SUCCEEDS OR EQUIVALENT TO',\n value: '≿',\n codepoint: 8831,\n },\n {\n name: 'DOES NOT PRECEDE',\n value: '⊀',\n codepoint: 8832,\n },\n {\n name: 'DOES NOT SUCCEED',\n value: '⊁',\n codepoint: 8833,\n },\n {\n name: 'SUBSET OF',\n value: '⊂',\n codepoint: 8834,\n },\n {\n name: 'SUPERSET OF',\n value: '⊃',\n codepoint: 8835,\n },\n {\n name: 'NOT A SUBSET OF',\n value: '⊄',\n codepoint: 8836,\n },\n {\n name: 'NOT A SUPERSET OF',\n value: '⊅',\n codepoint: 8837,\n },\n {\n name: 'SUBSET OF OR EQUAL TO',\n value: '⊆',\n codepoint: 8838,\n },\n {\n name: 'SUPERSET OF OR EQUAL TO',\n value: '⊇',\n codepoint: 8839,\n },\n {\n name: 'NEITHER A SUBSET OF NOR EQUAL TO',\n value: '⊈',\n codepoint: 8840,\n },\n {\n name: 'NEITHER A SUPERSET OF NOR EQUAL TO',\n value: '⊉',\n codepoint: 8841,\n },\n {\n name: 'SUBSET OF WITH NOT EQUAL TO',\n value: '⊊',\n codepoint: 8842,\n },\n {\n name: 'SUPERSET OF WITH NOT EQUAL TO',\n value: '⊋',\n codepoint: 8843,\n },\n {\n name: 'MULTISET',\n value: '⊌',\n codepoint: 8844,\n },\n {\n name: 'MULTISET MULTIPLICATION',\n value: '⊍',\n codepoint: 8845,\n },\n {\n name: 'MULTISET UNION',\n value: '⊎',\n codepoint: 8846,\n },\n {\n name: 'SQUARE IMAGE OF',\n value: '⊏',\n codepoint: 8847,\n },\n {\n name: 'SQUARE ORIGINAL OF',\n value: '⊐',\n codepoint: 8848,\n },\n {\n name: 'SQUARE IMAGE OF OR EQUAL TO',\n value: '⊑',\n codepoint: 8849,\n },\n {\n name: 'SQUARE ORIGINAL OF OR EQUAL TO',\n value: '⊒',\n codepoint: 8850,\n },\n {\n name: 'SQUARE CAP',\n value: '⊓',\n codepoint: 8851,\n },\n {\n name: 'SQUARE CUP',\n value: '⊔',\n codepoint: 8852,\n },\n {\n name: 'CIRCLED PLUS',\n value: '⊕',\n codepoint: 8853,\n },\n {\n name: 'CIRCLED MINUS',\n value: '⊖',\n codepoint: 8854,\n },\n {\n name: 'CIRCLED TIMES',\n value: '⊗',\n codepoint: 8855,\n },\n {\n name: 'CIRCLED DIVISION SLASH',\n value: '⊘',\n codepoint: 8856,\n },\n {\n name: 'CIRCLED DOT OPERATOR',\n value: '⊙',\n codepoint: 8857,\n },\n {\n name: 'CIRCLED RING OPERATOR',\n value: '⊚',\n codepoint: 8858,\n },\n {\n name: 'CIRCLED ASTERISK OPERATOR',\n value: '⊛',\n codepoint: 8859,\n },\n {\n name: 'CIRCLED EQUALS',\n value: '⊜',\n codepoint: 8860,\n },\n {\n name: 'CIRCLED DASH',\n value: '⊝',\n codepoint: 8861,\n },\n {\n name: 'SQUARED PLUS',\n value: '⊞',\n codepoint: 8862,\n },\n {\n name: 'SQUARED MINUS',\n value: '⊟',\n codepoint: 8863,\n },\n {\n name: 'SQUARED TIMES',\n value: '⊠',\n codepoint: 8864,\n },\n {\n name: 'SQUARED DOT OPERATOR',\n value: '⊡',\n codepoint: 8865,\n },\n {\n name: 'RIGHT TACK',\n value: '⊢',\n codepoint: 8866,\n },\n {\n name: 'LEFT TACK',\n value: '⊣',\n codepoint: 8867,\n },\n {\n name: 'DOWN TACK',\n value: '⊤',\n codepoint: 8868,\n },\n {\n name: 'UP TACK',\n value: '⊥',\n codepoint: 8869,\n },\n {\n name: 'ASSERTION',\n value: '⊦',\n codepoint: 8870,\n },\n {\n name: 'MODELS',\n value: '⊧',\n codepoint: 8871,\n },\n {\n name: 'TRUE',\n value: '⊨',\n codepoint: 8872,\n },\n {\n name: 'FORCES',\n value: '⊩',\n codepoint: 8873,\n },\n {\n name: 'TRIPLE VERTICAL BAR RIGHT TURNSTILE',\n value: '⊪',\n codepoint: 8874,\n },\n {\n name: 'DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE',\n value: '⊫',\n codepoint: 8875,\n },\n {\n name: 'DOES NOT PROVE',\n value: '⊬',\n codepoint: 8876,\n },\n {\n name: 'NOT TRUE',\n value: '⊭',\n codepoint: 8877,\n },\n {\n name: 'DOES NOT FORCE',\n value: '⊮',\n codepoint: 8878,\n },\n {\n name: 'NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE',\n value: '⊯',\n codepoint: 8879,\n },\n {\n name: 'PRECEDES UNDER RELATION',\n value: '⊰',\n codepoint: 8880,\n },\n {\n name: 'SUCCEEDS UNDER RELATION',\n value: '⊱',\n codepoint: 8881,\n },\n {\n name: 'NORMAL SUBGROUP OF',\n value: '⊲',\n codepoint: 8882,\n },\n {\n name: 'CONTAINS AS NORMAL SUBGROUP',\n value: '⊳',\n codepoint: 8883,\n },\n {\n name: 'NORMAL SUBGROUP OF OR EQUAL TO',\n value: '⊴',\n codepoint: 8884,\n },\n {\n name: 'CONTAINS AS NORMAL SUBGROUP OR EQUAL TO',\n value: '⊵',\n codepoint: 8885,\n },\n {\n name: 'ORIGINAL OF',\n value: '⊶',\n codepoint: 8886,\n },\n {\n name: 'IMAGE OF',\n value: '⊷',\n codepoint: 8887,\n },\n {\n name: 'MULTIMAP',\n value: '⊸',\n codepoint: 8888,\n },\n {\n name: 'HERMITIAN CONJUGATE MATRIX',\n value: '⊹',\n codepoint: 8889,\n },\n {\n name: 'INTERCALATE',\n value: '⊺',\n codepoint: 8890,\n },\n {\n name: 'XOR',\n value: '⊻',\n codepoint: 8891,\n },\n {\n name: 'NAND',\n value: '⊼',\n codepoint: 8892,\n },\n {\n name: 'NOR',\n value: '⊽',\n codepoint: 8893,\n },\n {\n name: 'RIGHT ANGLE WITH ARC',\n value: '⊾',\n codepoint: 8894,\n },\n {\n name: 'RIGHT TRIANGLE',\n value: '⊿',\n codepoint: 8895,\n },\n {\n name: 'N-ARY LOGICAL AND',\n value: '⋀',\n codepoint: 8896,\n },\n {\n name: 'N-ARY LOGICAL OR',\n value: '⋁',\n codepoint: 8897,\n },\n {\n name: 'N-ARY INTERSECTION',\n value: '⋂',\n codepoint: 8898,\n },\n {\n name: 'N-ARY UNION',\n value: '⋃',\n codepoint: 8899,\n },\n {\n name: 'DIAMOND OPERATOR',\n value: '⋄',\n codepoint: 8900,\n },\n {\n name: 'DOT OPERATOR',\n value: '⋅',\n codepoint: 8901,\n },\n {\n name: 'STAR OPERATOR',\n value: '⋆',\n codepoint: 8902,\n },\n {\n name: 'DIVISION TIMES',\n value: '⋇',\n codepoint: 8903,\n },\n {\n name: 'BOWTIE',\n value: '⋈',\n codepoint: 8904,\n },\n {\n name: 'LEFT NORMAL FACTOR SEMIDIRECT PRODUCT',\n value: '⋉',\n codepoint: 8905,\n },\n {\n name: 'RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT',\n value: '⋊',\n codepoint: 8906,\n },\n {\n name: 'LEFT SEMIDIRECT PRODUCT',\n value: '⋋',\n codepoint: 8907,\n },\n {\n name: 'RIGHT SEMIDIRECT PRODUCT',\n value: '⋌',\n codepoint: 8908,\n },\n {\n name: 'REVERSED TILDE EQUALS',\n value: '⋍',\n codepoint: 8909,\n },\n {\n name: 'CURLY LOGICAL OR',\n value: '⋎',\n codepoint: 8910,\n },\n {\n name: 'CURLY LOGICAL AND',\n value: '⋏',\n codepoint: 8911,\n },\n {\n name: 'DOUBLE SUBSET',\n value: '⋐',\n codepoint: 8912,\n },\n {\n name: 'DOUBLE SUPERSET',\n value: '⋑',\n codepoint: 8913,\n },\n {\n name: 'DOUBLE INTERSECTION',\n value: '⋒',\n codepoint: 8914,\n },\n {\n name: 'DOUBLE UNION',\n value: '⋓',\n codepoint: 8915,\n },\n {\n name: 'PITCHFORK',\n value: '⋔',\n codepoint: 8916,\n },\n {\n name: 'EQUAL AND PARALLEL TO',\n value: '⋕',\n codepoint: 8917,\n },\n {\n name: 'LESS-THAN WITH DOT',\n value: '⋖',\n codepoint: 8918,\n },\n {\n name: 'GREATER-THAN WITH DOT',\n value: '⋗',\n codepoint: 8919,\n },\n {\n name: 'VERY MUCH LESS-THAN',\n value: '⋘',\n codepoint: 8920,\n },\n {\n name: 'VERY MUCH GREATER-THAN',\n value: '⋙',\n codepoint: 8921,\n },\n {\n name: 'LESS-THAN EQUAL TO OR GREATER-THAN',\n value: '⋚',\n codepoint: 8922,\n },\n {\n name: 'GREATER-THAN EQUAL TO OR LESS-THAN',\n value: '⋛',\n codepoint: 8923,\n },\n {\n name: 'EQUAL TO OR LESS-THAN',\n value: '⋜',\n codepoint: 8924,\n },\n {\n name: 'EQUAL TO OR GREATER-THAN',\n value: '⋝',\n codepoint: 8925,\n },\n {\n name: 'EQUAL TO OR PRECEDES',\n value: '⋞',\n codepoint: 8926,\n },\n {\n name: 'EQUAL TO OR SUCCEEDS',\n value: '⋟',\n codepoint: 8927,\n },\n {\n name: 'DOES NOT PRECEDE OR EQUAL',\n value: '⋠',\n codepoint: 8928,\n },\n {\n name: 'DOES NOT SUCCEED OR EQUAL',\n value: '⋡',\n codepoint: 8929,\n },\n {\n name: 'NOT SQUARE IMAGE OF OR EQUAL TO',\n value: '⋢',\n codepoint: 8930,\n },\n {\n name: 'NOT SQUARE ORIGINAL OF OR EQUAL TO',\n value: '⋣',\n codepoint: 8931,\n },\n {\n name: 'SQUARE IMAGE OF OR NOT EQUAL TO',\n value: '⋤',\n codepoint: 8932,\n },\n {\n name: 'SQUARE ORIGINAL OF OR NOT EQUAL TO',\n value: '⋥',\n codepoint: 8933,\n },\n {\n name: 'LESS-THAN BUT NOT EQUIVALENT TO',\n value: '⋦',\n codepoint: 8934,\n },\n {\n name: 'GREATER-THAN BUT NOT EQUIVALENT TO',\n value: '⋧',\n codepoint: 8935,\n },\n {\n name: 'PRECEDES BUT NOT EQUIVALENT TO',\n value: '⋨',\n codepoint: 8936,\n },\n {\n name: 'SUCCEEDS BUT NOT EQUIVALENT TO',\n value: '⋩',\n codepoint: 8937,\n },\n {\n name: 'NOT NORMAL SUBGROUP OF',\n value: '⋪',\n codepoint: 8938,\n },\n {\n name: 'DOES NOT CONTAIN AS NORMAL SUBGROUP',\n value: '⋫',\n codepoint: 8939,\n },\n {\n name: 'NOT NORMAL SUBGROUP OF OR EQUAL TO',\n value: '⋬',\n codepoint: 8940,\n },\n {\n name: 'DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL',\n value: '⋭',\n codepoint: 8941,\n },\n {\n name: 'VERTICAL ELLIPSIS',\n value: '⋮',\n codepoint: 8942,\n },\n {\n name: 'MIDLINE HORIZONTAL ELLIPSIS',\n value: '⋯',\n codepoint: 8943,\n },\n {\n name: 'UP RIGHT DIAGONAL ELLIPSIS',\n value: '⋰',\n codepoint: 8944,\n },\n {\n name: 'DOWN RIGHT DIAGONAL ELLIPSIS',\n value: '⋱',\n codepoint: 8945,\n },\n {\n name: 'ELEMENT OF WITH LONG HORIZONTAL STROKE',\n value: '⋲',\n codepoint: 8946,\n },\n {\n name: 'ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE',\n value: '⋳',\n codepoint: 8947,\n },\n {\n name: 'SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE',\n value: '⋴',\n codepoint: 8948,\n },\n {\n name: 'ELEMENT OF WITH DOT ABOVE',\n value: '⋵',\n codepoint: 8949,\n },\n {\n name: 'ELEMENT OF WITH OVERBAR',\n value: '⋶',\n codepoint: 8950,\n },\n {\n name: 'SMALL ELEMENT OF WITH OVERBAR',\n value: '⋷',\n codepoint: 8951,\n },\n {\n name: 'ELEMENT OF WITH UNDERBAR',\n value: '⋸',\n codepoint: 8952,\n },\n {\n name: 'ELEMENT OF WITH TWO HORIZONTAL STROKES',\n value: '⋹',\n codepoint: 8953,\n },\n {\n name: 'CONTAINS WITH LONG HORIZONTAL STROKE',\n value: '⋺',\n codepoint: 8954,\n },\n {\n name: 'CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE',\n value: '⋻',\n codepoint: 8955,\n },\n {\n name: 'SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE',\n value: '⋼',\n codepoint: 8956,\n },\n {\n name: 'CONTAINS WITH OVERBAR',\n value: '⋽',\n codepoint: 8957,\n },\n {\n name: 'SMALL CONTAINS WITH OVERBAR',\n value: '⋾',\n codepoint: 8958,\n },\n {\n name: 'Z NOTATION BAG MEMBERSHIP',\n value: '⋿',\n codepoint: 8959,\n },\n {\n name: 'THREE DIMENSIONAL ANGLE',\n value: '⟀',\n codepoint: 10176,\n },\n {\n name: 'WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE',\n value: '⟁',\n codepoint: 10177,\n },\n {\n name: 'PERPENDICULAR',\n value: '⟂',\n codepoint: 10178,\n },\n {\n name: 'OPEN SUBSET',\n value: '⟃',\n codepoint: 10179,\n },\n {\n name: 'OPEN SUPERSET',\n value: '⟄',\n codepoint: 10180,\n },\n {\n name: 'LEFT S-SHAPED BAG DELIMITER',\n value: '⟅',\n codepoint: 10181,\n },\n {\n name: 'RIGHT S-SHAPED BAG DELIMITER',\n value: '⟆',\n codepoint: 10182,\n },\n {\n name: 'OR WITH DOT INSIDE',\n value: '⟇',\n codepoint: 10183,\n },\n {\n name: 'REVERSE SOLIDUS PRECEDING SUBSET',\n value: '⟈',\n codepoint: 10184,\n },\n {\n name: 'SUPERSET PRECEDING SOLIDUS',\n value: '⟉',\n codepoint: 10185,\n },\n {\n name: 'VERTICAL BAR WITH HORIZONTAL STROKE',\n value: '⟊',\n codepoint: 10186,\n },\n {\n name: 'LONG DIVISION',\n value: '⟌',\n codepoint: 10188,\n },\n {\n name: 'WHITE DIAMOND WITH CENTRED DOT',\n value: '⟐',\n codepoint: 10192,\n },\n {\n name: 'AND WITH DOT',\n value: '⟑',\n codepoint: 10193,\n },\n {\n name: 'ELEMENT OF OPENING UPWARDS',\n value: '⟒',\n codepoint: 10194,\n },\n {\n name: 'LOWER RIGHT CORNER WITH DOT',\n value: '⟓',\n codepoint: 10195,\n },\n {\n name: 'UPPER LEFT CORNER WITH DOT',\n value: '⟔',\n codepoint: 10196,\n },\n {\n name: 'LEFT OUTER JOIN',\n value: '⟕',\n codepoint: 10197,\n },\n {\n name: 'RIGHT OUTER JOIN',\n value: '⟖',\n codepoint: 10198,\n },\n {\n name: 'FULL OUTER JOIN',\n value: '⟗',\n codepoint: 10199,\n },\n {\n name: 'LARGE UP TACK',\n value: '⟘',\n codepoint: 10200,\n },\n {\n name: 'LARGE DOWN TACK',\n value: '⟙',\n codepoint: 10201,\n },\n {\n name: 'LEFT AND RIGHT DOUBLE TURNSTILE',\n value: '⟚',\n codepoint: 10202,\n },\n {\n name: 'LEFT AND RIGHT TACK',\n value: '⟛',\n codepoint: 10203,\n },\n {\n name: 'LEFT MULTIMAP',\n value: '⟜',\n codepoint: 10204,\n },\n {\n name: 'LONG RIGHT TACK',\n value: '⟝',\n codepoint: 10205,\n },\n {\n name: 'LONG LEFT TACK',\n value: '⟞',\n codepoint: 10206,\n },\n {\n name: 'UP TACK WITH CIRCLE ABOVE',\n value: '⟟',\n codepoint: 10207,\n },\n {\n name: 'LOZENGE DIVIDED BY HORIZONTAL RULE',\n value: '⟠',\n codepoint: 10208,\n },\n {\n name: 'WHITE CONCAVE-SIDED DIAMOND',\n value: '⟡',\n codepoint: 10209,\n },\n {\n name: 'WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK',\n value: '⟢',\n codepoint: 10210,\n },\n {\n name: 'WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK',\n value: '⟣',\n codepoint: 10211,\n },\n {\n name: 'WHITE SQUARE WITH LEFTWARDS TICK',\n value: '⟤',\n codepoint: 10212,\n },\n {\n name: 'WHITE SQUARE WITH RIGHTWARDS TICK',\n value: '⟥',\n codepoint: 10213,\n },\n {\n name: 'MATHEMATICAL LEFT WHITE SQUARE BRACKET',\n value: '⟦',\n codepoint: 10214,\n },\n {\n name: 'MATHEMATICAL RIGHT WHITE SQUARE BRACKET',\n value: '⟧',\n codepoint: 10215,\n },\n {\n name: 'MATHEMATICAL LEFT ANGLE BRACKET',\n value: '⟨',\n codepoint: 10216,\n },\n {\n name: 'MATHEMATICAL RIGHT ANGLE BRACKET',\n value: '⟩',\n codepoint: 10217,\n },\n {\n name: 'MATHEMATICAL LEFT DOUBLE ANGLE BRACKET',\n value: '⟪',\n codepoint: 10218,\n },\n {\n name: 'MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET',\n value: '⟫',\n codepoint: 10219,\n },\n {\n name: 'MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET',\n value: '⟬',\n codepoint: 10220,\n },\n {\n name: 'MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET',\n value: '⟭',\n codepoint: 10221,\n },\n {\n name: 'MATHEMATICAL LEFT FLATTENED PARENTHESIS',\n value: '⟮',\n codepoint: 10222,\n },\n {\n name: 'MATHEMATICAL RIGHT FLATTENED PARENTHESIS',\n value: '⟯',\n codepoint: 10223,\n },\n {\n name: 'TRIPLE VERTICAL BAR DELIMITER',\n value: '⦀',\n codepoint: 10624,\n },\n {\n name: 'Z NOTATION SPOT',\n value: '⦁',\n codepoint: 10625,\n },\n {\n name: 'Z NOTATION TYPE COLON',\n value: '⦂',\n codepoint: 10626,\n },\n {\n name: 'LEFT WHITE CURLY BRACKET',\n value: '⦃',\n codepoint: 10627,\n },\n {\n name: 'RIGHT WHITE CURLY BRACKET',\n value: '⦄',\n codepoint: 10628,\n },\n {\n name: 'LEFT WHITE PARENTHESIS',\n value: '⦅',\n codepoint: 10629,\n },\n {\n name: 'RIGHT WHITE PARENTHESIS',\n value: '⦆',\n codepoint: 10630,\n },\n {\n name: 'Z NOTATION LEFT IMAGE BRACKET',\n value: '⦇',\n codepoint: 10631,\n },\n {\n name: 'Z NOTATION RIGHT IMAGE BRACKET',\n value: '⦈',\n codepoint: 10632,\n },\n {\n name: 'Z NOTATION LEFT BINDING BRACKET',\n value: '⦉',\n codepoint: 10633,\n },\n {\n name: 'Z NOTATION RIGHT BINDING BRACKET',\n value: '⦊',\n codepoint: 10634,\n },\n {\n name: 'LEFT SQUARE BRACKET WITH UNDERBAR',\n value: '⦋',\n codepoint: 10635,\n },\n {\n name: 'RIGHT SQUARE BRACKET WITH UNDERBAR',\n value: '⦌',\n codepoint: 10636,\n },\n {\n name: 'LEFT SQUARE BRACKET WITH TICK IN TOP CORNER',\n value: '⦍',\n codepoint: 10637,\n },\n {\n name: 'RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER',\n value: '⦎',\n codepoint: 10638,\n },\n {\n name: 'LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER',\n value: '⦏',\n codepoint: 10639,\n },\n {\n name: 'RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER',\n value: '⦐',\n codepoint: 10640,\n },\n {\n name: 'LEFT ANGLE BRACKET WITH DOT',\n value: '⦑',\n codepoint: 10641,\n },\n {\n name: 'RIGHT ANGLE BRACKET WITH DOT',\n value: '⦒',\n codepoint: 10642,\n },\n {\n name: 'LEFT ARC LESS-THAN BRACKET',\n value: '⦓',\n codepoint: 10643,\n },\n {\n name: 'RIGHT ARC GREATER-THAN BRACKET',\n value: '⦔',\n codepoint: 10644,\n },\n {\n name: 'DOUBLE LEFT ARC GREATER-THAN BRACKET',\n value: '⦕',\n codepoint: 10645,\n },\n {\n name: 'DOUBLE RIGHT ARC LESS-THAN BRACKET',\n value: '⦖',\n codepoint: 10646,\n },\n {\n name: 'LEFT BLACK TORTOISE SHELL BRACKET',\n value: '⦗',\n codepoint: 10647,\n },\n {\n name: 'RIGHT BLACK TORTOISE SHELL BRACKET',\n value: '⦘',\n codepoint: 10648,\n },\n {\n name: 'DOTTED FENCE',\n value: '⦙',\n codepoint: 10649,\n },\n {\n name: 'VERTICAL ZIGZAG LINE',\n value: '⦚',\n codepoint: 10650,\n },\n {\n name: 'MEASURED ANGLE OPENING LEFT',\n value: '⦛',\n codepoint: 10651,\n },\n {\n name: 'RIGHT ANGLE VARIANT WITH SQUARE',\n value: '⦜',\n codepoint: 10652,\n },\n {\n name: 'MEASURED RIGHT ANGLE WITH DOT',\n value: '⦝',\n codepoint: 10653,\n },\n {\n name: 'ANGLE WITH S INSIDE',\n value: '⦞',\n codepoint: 10654,\n },\n {\n name: 'ACUTE ANGLE',\n value: '⦟',\n codepoint: 10655,\n },\n {\n name: 'SPHERICAL ANGLE OPENING LEFT',\n value: '⦠',\n codepoint: 10656,\n },\n {\n name: 'SPHERICAL ANGLE OPENING UP',\n value: '⦡',\n codepoint: 10657,\n },\n {\n name: 'TURNED ANGLE',\n value: '⦢',\n codepoint: 10658,\n },\n {\n name: 'REVERSED ANGLE',\n value: '⦣',\n codepoint: 10659,\n },\n {\n name: 'ANGLE WITH UNDERBAR',\n value: '⦤',\n codepoint: 10660,\n },\n {\n name: 'REVERSED ANGLE WITH UNDERBAR',\n value: '⦥',\n codepoint: 10661,\n },\n {\n name: 'OBLIQUE ANGLE OPENING UP',\n value: '⦦',\n codepoint: 10662,\n },\n {\n name: 'OBLIQUE ANGLE OPENING DOWN',\n value: '⦧',\n codepoint: 10663,\n },\n {\n name: 'MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT',\n value: '⦨',\n codepoint: 10664,\n },\n {\n name: 'MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT',\n value: '⦩',\n codepoint: 10665,\n },\n {\n name: 'MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT',\n value: '⦪',\n codepoint: 10666,\n },\n {\n name: 'MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT',\n value: '⦫',\n codepoint: 10667,\n },\n {\n name: 'MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP',\n value: '⦬',\n codepoint: 10668,\n },\n {\n name: 'MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP',\n value: '⦭',\n codepoint: 10669,\n },\n {\n name: 'MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN',\n value: '⦮',\n codepoint: 10670,\n },\n {\n name: 'MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN',\n value: '⦯',\n codepoint: 10671,\n },\n {\n name: 'REVERSED EMPTY SET',\n value: '⦰',\n codepoint: 10672,\n },\n {\n name: 'EMPTY SET WITH OVERBAR',\n value: '⦱',\n codepoint: 10673,\n },\n {\n name: 'EMPTY SET WITH SMALL CIRCLE ABOVE',\n value: '⦲',\n codepoint: 10674,\n },\n {\n name: 'EMPTY SET WITH RIGHT ARROW ABOVE',\n value: '⦳',\n codepoint: 10675,\n },\n {\n name: 'EMPTY SET WITH LEFT ARROW ABOVE',\n value: '⦴',\n codepoint: 10676,\n },\n {\n name: 'CIRCLE WITH HORIZONTAL BAR',\n value: '⦵',\n codepoint: 10677,\n },\n {\n name: 'CIRCLED VERTICAL BAR',\n value: '⦶',\n codepoint: 10678,\n },\n {\n name: 'CIRCLED PARALLEL',\n value: '⦷',\n codepoint: 10679,\n },\n {\n name: 'CIRCLED REVERSE SOLIDUS',\n value: '⦸',\n codepoint: 10680,\n },\n {\n name: 'CIRCLED PERPENDICULAR',\n value: '⦹',\n codepoint: 10681,\n },\n {\n name: 'CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR',\n value: '⦺',\n codepoint: 10682,\n },\n {\n name: 'CIRCLE WITH SUPERIMPOSED X',\n value: '⦻',\n codepoint: 10683,\n },\n {\n name: 'CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN',\n value: '⦼',\n codepoint: 10684,\n },\n {\n name: 'UP ARROW THROUGH CIRCLE',\n value: '⦽',\n codepoint: 10685,\n },\n {\n name: 'CIRCLED WHITE BULLET',\n value: '⦾',\n codepoint: 10686,\n },\n {\n name: 'CIRCLED BULLET',\n value: '⦿',\n codepoint: 10687,\n },\n {\n name: 'CIRCLED LESS-THAN',\n value: '⧀',\n codepoint: 10688,\n },\n {\n name: 'CIRCLED GREATER-THAN',\n value: '⧁',\n codepoint: 10689,\n },\n {\n name: 'CIRCLE WITH SMALL CIRCLE TO THE RIGHT',\n value: '⧂',\n codepoint: 10690,\n },\n {\n name: 'CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT',\n value: '⧃',\n codepoint: 10691,\n },\n {\n name: 'SQUARED RISING DIAGONAL SLASH',\n value: '⧄',\n codepoint: 10692,\n },\n {\n name: 'SQUARED FALLING DIAGONAL SLASH',\n value: '⧅',\n codepoint: 10693,\n },\n {\n name: 'SQUARED ASTERISK',\n value: '⧆',\n codepoint: 10694,\n },\n {\n name: 'SQUARED SMALL CIRCLE',\n value: '⧇',\n codepoint: 10695,\n },\n {\n name: 'SQUARED SQUARE',\n value: '⧈',\n codepoint: 10696,\n },\n {\n name: 'TWO JOINED SQUARES',\n value: '⧉',\n codepoint: 10697,\n },\n {\n name: 'TRIANGLE WITH DOT ABOVE',\n value: '⧊',\n codepoint: 10698,\n },\n {\n name: 'TRIANGLE WITH UNDERBAR',\n value: '⧋',\n codepoint: 10699,\n },\n {\n name: 'S IN TRIANGLE',\n value: '⧌',\n codepoint: 10700,\n },\n {\n name: 'TRIANGLE WITH SERIFS AT BOTTOM',\n value: '⧍',\n codepoint: 10701,\n },\n {\n name: 'RIGHT TRIANGLE ABOVE LEFT TRIANGLE',\n value: '⧎',\n codepoint: 10702,\n },\n {\n name: 'LEFT TRIANGLE BESIDE VERTICAL BAR',\n value: '⧏',\n codepoint: 10703,\n },\n {\n name: 'VERTICAL BAR BESIDE RIGHT TRIANGLE',\n value: '⧐',\n codepoint: 10704,\n },\n {\n name: 'BOWTIE WITH LEFT HALF BLACK',\n value: '⧑',\n codepoint: 10705,\n },\n {\n name: 'BOWTIE WITH RIGHT HALF BLACK',\n value: '⧒',\n codepoint: 10706,\n },\n {\n name: 'BLACK BOWTIE',\n value: '⧓',\n codepoint: 10707,\n },\n {\n name: 'TIMES WITH LEFT HALF BLACK',\n value: '⧔',\n codepoint: 10708,\n },\n {\n name: 'TIMES WITH RIGHT HALF BLACK',\n value: '⧕',\n codepoint: 10709,\n },\n {\n name: 'WHITE HOURGLASS',\n value: '⧖',\n codepoint: 10710,\n },\n {\n name: 'BLACK HOURGLASS',\n value: '⧗',\n codepoint: 10711,\n },\n {\n name: 'LEFT WIGGLY FENCE',\n value: '⧘',\n codepoint: 10712,\n },\n {\n name: 'RIGHT WIGGLY FENCE',\n value: '⧙',\n codepoint: 10713,\n },\n {\n name: 'LEFT DOUBLE WIGGLY FENCE',\n value: '⧚',\n codepoint: 10714,\n },\n {\n name: 'RIGHT DOUBLE WIGGLY FENCE',\n value: '⧛',\n codepoint: 10715,\n },\n {\n name: 'INCOMPLETE INFINITY',\n value: '⧜',\n codepoint: 10716,\n },\n {\n name: 'TIE OVER INFINITY',\n value: '⧝',\n codepoint: 10717,\n },\n {\n name: 'INFINITY NEGATED WITH VERTICAL BAR',\n value: '⧞',\n codepoint: 10718,\n },\n {\n name: 'DOUBLE-ENDED MULTIMAP',\n value: '⧟',\n codepoint: 10719,\n },\n {\n name: 'SQUARE WITH CONTOURED OUTLINE',\n value: '⧠',\n codepoint: 10720,\n },\n {\n name: 'INCREASES AS',\n value: '⧡',\n codepoint: 10721,\n },\n {\n name: 'SHUFFLE PRODUCT',\n value: '⧢',\n codepoint: 10722,\n },\n {\n name: 'EQUALS SIGN AND SLANTED PARALLEL',\n value: '⧣',\n codepoint: 10723,\n },\n {\n name: 'EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE',\n value: '⧤',\n codepoint: 10724,\n },\n {\n name: 'IDENTICAL TO AND SLANTED PARALLEL',\n value: '⧥',\n codepoint: 10725,\n },\n {\n name: 'GLEICH STARK',\n value: '⧦',\n codepoint: 10726,\n },\n {\n name: 'THERMODYNAMIC',\n value: '⧧',\n codepoint: 10727,\n },\n {\n name: 'DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK',\n value: '⧨',\n codepoint: 10728,\n },\n {\n name: 'DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK',\n value: '⧩',\n codepoint: 10729,\n },\n {\n name: 'BLACK DIAMOND WITH DOWN ARROW',\n value: '⧪',\n codepoint: 10730,\n },\n {\n name: 'BLACK LOZENGE',\n value: '⧫',\n codepoint: 10731,\n },\n {\n name: 'WHITE CIRCLE WITH DOWN ARROW',\n value: '⧬',\n codepoint: 10732,\n },\n {\n name: 'BLACK CIRCLE WITH DOWN ARROW',\n value: '⧭',\n codepoint: 10733,\n },\n {\n name: 'ERROR-BARRED WHITE SQUARE',\n value: '⧮',\n codepoint: 10734,\n },\n {\n name: 'ERROR-BARRED BLACK SQUARE',\n value: '⧯',\n codepoint: 10735,\n },\n {\n name: 'ERROR-BARRED WHITE DIAMOND',\n value: '⧰',\n codepoint: 10736,\n },\n {\n name: 'ERROR-BARRED BLACK DIAMOND',\n value: '⧱',\n codepoint: 10737,\n },\n {\n name: 'ERROR-BARRED WHITE CIRCLE',\n value: '⧲',\n codepoint: 10738,\n },\n {\n name: 'ERROR-BARRED BLACK CIRCLE',\n value: '⧳',\n codepoint: 10739,\n },\n {\n name: 'RULE-DELAYED',\n value: '⧴',\n codepoint: 10740,\n },\n {\n name: 'REVERSE SOLIDUS OPERATOR',\n value: '⧵',\n codepoint: 10741,\n },\n {\n name: 'SOLIDUS WITH OVERBAR',\n value: '⧶',\n codepoint: 10742,\n },\n {\n name: 'REVERSE SOLIDUS WITH HORIZONTAL STROKE',\n value: '⧷',\n codepoint: 10743,\n },\n {\n name: 'BIG SOLIDUS',\n value: '⧸',\n codepoint: 10744,\n },\n {\n name: 'BIG REVERSE SOLIDUS',\n value: '⧹',\n codepoint: 10745,\n },\n {\n name: 'DOUBLE PLUS',\n value: '⧺',\n codepoint: 10746,\n },\n {\n name: 'TRIPLE PLUS',\n value: '⧻',\n codepoint: 10747,\n },\n {\n name: 'LEFT-POINTING CURVED ANGLE BRACKET',\n value: '⧼',\n codepoint: 10748,\n },\n {\n name: 'RIGHT-POINTING CURVED ANGLE BRACKET',\n value: '⧽',\n codepoint: 10749,\n },\n {\n name: 'TINY',\n value: '⧾',\n codepoint: 10750,\n },\n {\n name: 'MINY',\n value: '⧿',\n codepoint: 10751,\n },\n {\n name: 'N-ARY CIRCLED DOT OPERATOR',\n value: '⨀',\n codepoint: 10752,\n },\n {\n name: 'N-ARY CIRCLED PLUS OPERATOR',\n value: '⨁',\n codepoint: 10753,\n },\n {\n name: 'N-ARY CIRCLED TIMES OPERATOR',\n value: '⨂',\n codepoint: 10754,\n },\n {\n name: 'N-ARY UNION OPERATOR WITH DOT',\n value: '⨃',\n codepoint: 10755,\n },\n {\n name: 'N-ARY UNION OPERATOR WITH PLUS',\n value: '⨄',\n codepoint: 10756,\n },\n {\n name: 'N-ARY SQUARE INTERSECTION OPERATOR',\n value: '⨅',\n codepoint: 10757,\n },\n {\n name: 'N-ARY SQUARE UNION OPERATOR',\n value: '⨆',\n codepoint: 10758,\n },\n {\n name: 'TWO LOGICAL AND OPERATOR',\n value: '⨇',\n codepoint: 10759,\n },\n {\n name: 'TWO LOGICAL OR OPERATOR',\n value: '⨈',\n codepoint: 10760,\n },\n {\n name: 'N-ARY TIMES OPERATOR',\n value: '⨉',\n codepoint: 10761,\n },\n {\n name: 'MODULO TWO SUM',\n value: '⨊',\n codepoint: 10762,\n },\n {\n name: 'SUMMATION WITH INTEGRAL',\n value: '⨋',\n codepoint: 10763,\n },\n {\n name: 'QUADRUPLE INTEGRAL OPERATOR',\n value: '⨌',\n codepoint: 10764,\n },\n {\n name: 'FINITE PART INTEGRAL',\n value: '⨍',\n codepoint: 10765,\n },\n {\n name: 'INTEGRAL WITH DOUBLE STROKE',\n value: '⨎',\n codepoint: 10766,\n },\n {\n name: 'INTEGRAL AVERAGE WITH SLASH',\n value: '⨏',\n codepoint: 10767,\n },\n {\n name: 'CIRCULATION FUNCTION',\n value: '⨐',\n codepoint: 10768,\n },\n {\n name: 'ANTICLOCKWISE INTEGRATION',\n value: '⨑',\n codepoint: 10769,\n },\n {\n name: 'LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE',\n value: '⨒',\n codepoint: 10770,\n },\n {\n name: 'LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE',\n value: '⨓',\n codepoint: 10771,\n },\n {\n name: 'LINE INTEGRATION NOT INCLUDING THE POLE',\n value: '⨔',\n codepoint: 10772,\n },\n {\n name: 'INTEGRAL AROUND A POINT OPERATOR',\n value: '⨕',\n codepoint: 10773,\n },\n {\n name: 'QUATERNION INTEGRAL OPERATOR',\n value: '⨖',\n codepoint: 10774,\n },\n {\n name: 'INTEGRAL WITH LEFTWARDS ARROW WITH HOOK',\n value: '⨗',\n codepoint: 10775,\n },\n {\n name: 'INTEGRAL WITH TIMES SIGN',\n value: '⨘',\n codepoint: 10776,\n },\n {\n name: 'INTEGRAL WITH INTERSECTION',\n value: '⨙',\n codepoint: 10777,\n },\n {\n name: 'INTEGRAL WITH UNION',\n value: '⨚',\n codepoint: 10778,\n },\n {\n name: 'INTEGRAL WITH OVERBAR',\n value: '⨛',\n codepoint: 10779,\n },\n {\n name: 'INTEGRAL WITH UNDERBAR',\n value: '⨜',\n codepoint: 10780,\n },\n {\n name: 'JOIN',\n value: '⨝',\n codepoint: 10781,\n },\n {\n name: 'LARGE LEFT TRIANGLE OPERATOR',\n value: '⨞',\n codepoint: 10782,\n },\n {\n name: 'Z NOTATION SCHEMA COMPOSITION',\n value: '⨟',\n codepoint: 10783,\n },\n {\n name: 'Z NOTATION SCHEMA PIPING',\n value: '⨠',\n codepoint: 10784,\n },\n {\n name: 'Z NOTATION SCHEMA PROJECTION',\n value: '⨡',\n codepoint: 10785,\n },\n {\n name: 'PLUS SIGN WITH SMALL CIRCLE ABOVE',\n value: '⨢',\n codepoint: 10786,\n },\n {\n name: 'PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE',\n value: '⨣',\n codepoint: 10787,\n },\n {\n name: 'PLUS SIGN WITH TILDE ABOVE',\n value: '⨤',\n codepoint: 10788,\n },\n {\n name: 'PLUS SIGN WITH DOT BELOW',\n value: '⨥',\n codepoint: 10789,\n },\n {\n name: 'PLUS SIGN WITH TILDE BELOW',\n value: '⨦',\n codepoint: 10790,\n },\n {\n name: 'PLUS SIGN WITH SUBSCRIPT TWO',\n value: '⨧',\n codepoint: 10791,\n },\n {\n name: 'PLUS SIGN WITH BLACK TRIANGLE',\n value: '⨨',\n codepoint: 10792,\n },\n {\n name: 'MINUS SIGN WITH COMMA ABOVE',\n value: '⨩',\n codepoint: 10793,\n },\n {\n name: 'MINUS SIGN WITH DOT BELOW',\n value: '⨪',\n codepoint: 10794,\n },\n {\n name: 'MINUS SIGN WITH FALLING DOTS',\n value: '⨫',\n codepoint: 10795,\n },\n {\n name: 'MINUS SIGN WITH RISING DOTS',\n value: '⨬',\n codepoint: 10796,\n },\n {\n name: 'PLUS SIGN IN LEFT HALF CIRCLE',\n value: '⨭',\n codepoint: 10797,\n },\n {\n name: 'PLUS SIGN IN RIGHT HALF CIRCLE',\n value: '⨮',\n codepoint: 10798,\n },\n {\n name: 'VECTOR OR CROSS PRODUCT',\n value: '⨯',\n codepoint: 10799,\n },\n {\n name: 'MULTIPLICATION SIGN WITH DOT ABOVE',\n value: '⨰',\n codepoint: 10800,\n },\n {\n name: 'MULTIPLICATION SIGN WITH UNDERBAR',\n value: '⨱',\n codepoint: 10801,\n },\n {\n name: 'SEMIDIRECT PRODUCT WITH BOTTOM CLOSED',\n value: '⨲',\n codepoint: 10802,\n },\n {\n name: 'SMASH PRODUCT',\n value: '⨳',\n codepoint: 10803,\n },\n {\n name: 'MULTIPLICATION SIGN IN LEFT HALF CIRCLE',\n value: '⨴',\n codepoint: 10804,\n },\n {\n name: 'MULTIPLICATION SIGN IN RIGHT HALF CIRCLE',\n value: '⨵',\n codepoint: 10805,\n },\n {\n name: 'CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT',\n value: '⨶',\n codepoint: 10806,\n },\n {\n name: 'MULTIPLICATION SIGN IN DOUBLE CIRCLE',\n value: '⨷',\n codepoint: 10807,\n },\n {\n name: 'CIRCLED DIVISION SIGN',\n value: '⨸',\n codepoint: 10808,\n },\n {\n name: 'PLUS SIGN IN TRIANGLE',\n value: '⨹',\n codepoint: 10809,\n },\n {\n name: 'MINUS SIGN IN TRIANGLE',\n value: '⨺',\n codepoint: 10810,\n },\n {\n name: 'MULTIPLICATION SIGN IN TRIANGLE',\n value: '⨻',\n codepoint: 10811,\n },\n {\n name: 'INTERIOR PRODUCT',\n value: '⨼',\n codepoint: 10812,\n },\n {\n name: 'RIGHTHAND INTERIOR PRODUCT',\n value: '⨽',\n codepoint: 10813,\n },\n {\n name: 'Z NOTATION RELATIONAL COMPOSITION',\n value: '⨾',\n codepoint: 10814,\n },\n {\n name: 'AMALGAMATION OR COPRODUCT',\n value: '⨿',\n codepoint: 10815,\n },\n {\n name: 'INTERSECTION WITH DOT',\n value: '⩀',\n codepoint: 10816,\n },\n {\n name: 'UNION WITH MINUS SIGN',\n value: '⩁',\n codepoint: 10817,\n },\n {\n name: 'UNION WITH OVERBAR',\n value: '⩂',\n codepoint: 10818,\n },\n {\n name: 'INTERSECTION WITH OVERBAR',\n value: '⩃',\n codepoint: 10819,\n },\n {\n name: 'INTERSECTION WITH LOGICAL AND',\n value: '⩄',\n codepoint: 10820,\n },\n {\n name: 'UNION WITH LOGICAL OR',\n value: '⩅',\n codepoint: 10821,\n },\n {\n name: 'UNION ABOVE INTERSECTION',\n value: '⩆',\n codepoint: 10822,\n },\n {\n name: 'INTERSECTION ABOVE UNION',\n value: '⩇',\n codepoint: 10823,\n },\n {\n name: 'UNION ABOVE BAR ABOVE INTERSECTION',\n value: '⩈',\n codepoint: 10824,\n },\n {\n name: 'INTERSECTION ABOVE BAR ABOVE UNION',\n value: '⩉',\n codepoint: 10825,\n },\n {\n name: 'UNION BESIDE AND JOINED WITH UNION',\n value: '⩊',\n codepoint: 10826,\n },\n {\n name: 'INTERSECTION BESIDE AND JOINED WITH INTERSECTION',\n value: '⩋',\n codepoint: 10827,\n },\n {\n name: 'CLOSED UNION WITH SERIFS',\n value: '⩌',\n codepoint: 10828,\n },\n {\n name: 'CLOSED INTERSECTION WITH SERIFS',\n value: '⩍',\n codepoint: 10829,\n },\n {\n name: 'DOUBLE SQUARE INTERSECTION',\n value: '⩎',\n codepoint: 10830,\n },\n {\n name: 'DOUBLE SQUARE UNION',\n value: '⩏',\n codepoint: 10831,\n },\n {\n name: 'CLOSED UNION WITH SERIFS AND SMASH PRODUCT',\n value: '⩐',\n codepoint: 10832,\n },\n {\n name: 'LOGICAL AND WITH DOT ABOVE',\n value: '⩑',\n codepoint: 10833,\n },\n {\n name: 'LOGICAL OR WITH DOT ABOVE',\n value: '⩒',\n codepoint: 10834,\n },\n {\n name: 'DOUBLE LOGICAL AND',\n value: '⩓',\n codepoint: 10835,\n },\n {\n name: 'DOUBLE LOGICAL OR',\n value: '⩔',\n codepoint: 10836,\n },\n {\n name: 'TWO INTERSECTING LOGICAL AND',\n value: '⩕',\n codepoint: 10837,\n },\n {\n name: 'TWO INTERSECTING LOGICAL OR',\n value: '⩖',\n codepoint: 10838,\n },\n {\n name: 'SLOPING LARGE OR',\n value: '⩗',\n codepoint: 10839,\n },\n {\n name: 'SLOPING LARGE AND',\n value: '⩘',\n codepoint: 10840,\n },\n {\n name: 'LOGICAL OR OVERLAPPING LOGICAL AND',\n value: '⩙',\n codepoint: 10841,\n },\n {\n name: 'LOGICAL AND WITH MIDDLE STEM',\n value: '⩚',\n codepoint: 10842,\n },\n {\n name: 'LOGICAL OR WITH MIDDLE STEM',\n value: '⩛',\n codepoint: 10843,\n },\n {\n name: 'LOGICAL AND WITH HORIZONTAL DASH',\n value: '⩜',\n codepoint: 10844,\n },\n {\n name: 'LOGICAL OR WITH HORIZONTAL DASH',\n value: '⩝',\n codepoint: 10845,\n },\n {\n name: 'LOGICAL AND WITH DOUBLE OVERBAR',\n value: '⩞',\n codepoint: 10846,\n },\n {\n name: 'LOGICAL AND WITH UNDERBAR',\n value: '⩟',\n codepoint: 10847,\n },\n {\n name: 'LOGICAL AND WITH DOUBLE UNDERBAR',\n value: '⩠',\n codepoint: 10848,\n },\n {\n name: 'SMALL VEE WITH UNDERBAR',\n value: '⩡',\n codepoint: 10849,\n },\n {\n name: 'LOGICAL OR WITH DOUBLE OVERBAR',\n value: '⩢',\n codepoint: 10850,\n },\n {\n name: 'LOGICAL OR WITH DOUBLE UNDERBAR',\n value: '⩣',\n codepoint: 10851,\n },\n {\n name: 'Z NOTATION DOMAIN ANTIRESTRICTION',\n value: '⩤',\n codepoint: 10852,\n },\n {\n name: 'Z NOTATION RANGE ANTIRESTRICTION',\n value: '⩥',\n codepoint: 10853,\n },\n {\n name: 'EQUALS SIGN WITH DOT BELOW',\n value: '⩦',\n codepoint: 10854,\n },\n {\n name: 'IDENTICAL WITH DOT ABOVE',\n value: '⩧',\n codepoint: 10855,\n },\n {\n name: 'TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE',\n value: '⩨',\n codepoint: 10856,\n },\n {\n name: 'TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE',\n value: '⩩',\n codepoint: 10857,\n },\n {\n name: 'TILDE OPERATOR WITH DOT ABOVE',\n value: '⩪',\n codepoint: 10858,\n },\n {\n name: 'TILDE OPERATOR WITH RISING DOTS',\n value: '⩫',\n codepoint: 10859,\n },\n {\n name: 'SIMILAR MINUS SIMILAR',\n value: '⩬',\n codepoint: 10860,\n },\n {\n name: 'CONGRUENT WITH DOT ABOVE',\n value: '⩭',\n codepoint: 10861,\n },\n {\n name: 'EQUALS WITH ASTERISK',\n value: '⩮',\n codepoint: 10862,\n },\n {\n name: 'ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT',\n value: '⩯',\n codepoint: 10863,\n },\n {\n name: 'APPROXIMATELY EQUAL OR EQUAL TO',\n value: '⩰',\n codepoint: 10864,\n },\n {\n name: 'EQUALS SIGN ABOVE PLUS SIGN',\n value: '⩱',\n codepoint: 10865,\n },\n {\n name: 'PLUS SIGN ABOVE EQUALS SIGN',\n value: '⩲',\n codepoint: 10866,\n },\n {\n name: 'EQUALS SIGN ABOVE TILDE OPERATOR',\n value: '⩳',\n codepoint: 10867,\n },\n {\n name: 'DOUBLE COLON EQUAL',\n value: '⩴',\n codepoint: 10868,\n },\n {\n name: 'TWO CONSECUTIVE EQUALS SIGNS',\n value: '⩵',\n codepoint: 10869,\n },\n {\n name: 'THREE CONSECUTIVE EQUALS SIGNS',\n value: '⩶',\n codepoint: 10870,\n },\n {\n name: 'EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW',\n value: '⩷',\n codepoint: 10871,\n },\n {\n name: 'EQUIVALENT WITH FOUR DOTS ABOVE',\n value: '⩸',\n codepoint: 10872,\n },\n {\n name: 'LESS-THAN WITH CIRCLE INSIDE',\n value: '⩹',\n codepoint: 10873,\n },\n {\n name: 'GREATER-THAN WITH CIRCLE INSIDE',\n value: '⩺',\n codepoint: 10874,\n },\n {\n name: 'LESS-THAN WITH QUESTION MARK ABOVE',\n value: '⩻',\n codepoint: 10875,\n },\n {\n name: 'GREATER-THAN WITH QUESTION MARK ABOVE',\n value: '⩼',\n codepoint: 10876,\n },\n {\n name: 'LESS-THAN OR SLANTED EQUAL TO',\n value: '⩽',\n codepoint: 10877,\n },\n {\n name: 'GREATER-THAN OR SLANTED EQUAL TO',\n value: '⩾',\n codepoint: 10878,\n },\n {\n name: 'LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE',\n value: '⩿',\n codepoint: 10879,\n },\n {\n name: 'GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE',\n value: '⪀',\n codepoint: 10880,\n },\n {\n name: 'LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE',\n value: '⪁',\n codepoint: 10881,\n },\n {\n name: 'GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE',\n value: '⪂',\n codepoint: 10882,\n },\n {\n name: 'LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT',\n value: '⪃',\n codepoint: 10883,\n },\n {\n name: 'GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT',\n value: '⪄',\n codepoint: 10884,\n },\n {\n name: 'LESS-THAN OR APPROXIMATE',\n value: '⪅',\n codepoint: 10885,\n },\n {\n name: 'GREATER-THAN OR APPROXIMATE',\n value: '⪆',\n codepoint: 10886,\n },\n {\n name: 'LESS-THAN AND SINGLE-LINE NOT EQUAL TO',\n value: '⪇',\n codepoint: 10887,\n },\n {\n name: 'GREATER-THAN AND SINGLE-LINE NOT EQUAL TO',\n value: '⪈',\n codepoint: 10888,\n },\n {\n name: 'LESS-THAN AND NOT APPROXIMATE',\n value: '⪉',\n codepoint: 10889,\n },\n {\n name: 'GREATER-THAN AND NOT APPROXIMATE',\n value: '⪊',\n codepoint: 10890,\n },\n {\n name: 'LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN',\n value: '⪋',\n codepoint: 10891,\n },\n {\n name: 'GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN',\n value: '⪌',\n codepoint: 10892,\n },\n {\n name: 'LESS-THAN ABOVE SIMILAR OR EQUAL',\n value: '⪍',\n codepoint: 10893,\n },\n {\n name: 'GREATER-THAN ABOVE SIMILAR OR EQUAL',\n value: '⪎',\n codepoint: 10894,\n },\n {\n name: 'LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN',\n value: '⪏',\n codepoint: 10895,\n },\n {\n name: 'GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN',\n value: '⪐',\n codepoint: 10896,\n },\n {\n name: 'LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL',\n value: '⪑',\n codepoint: 10897,\n },\n {\n name: 'GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL',\n value: '⪒',\n codepoint: 10898,\n },\n {\n name: 'LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL',\n value: '⪓',\n codepoint: 10899,\n },\n {\n name: 'GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL',\n value: '⪔',\n codepoint: 10900,\n },\n {\n name: 'SLANTED EQUAL TO OR LESS-THAN',\n value: '⪕',\n codepoint: 10901,\n },\n {\n name: 'SLANTED EQUAL TO OR GREATER-THAN',\n value: '⪖',\n codepoint: 10902,\n },\n {\n name: 'SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE',\n value: '⪗',\n codepoint: 10903,\n },\n {\n name: 'SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE',\n value: '⪘',\n codepoint: 10904,\n },\n {\n name: 'DOUBLE-LINE EQUAL TO OR LESS-THAN',\n value: '⪙',\n codepoint: 10905,\n },\n {\n name: 'DOUBLE-LINE EQUAL TO OR GREATER-THAN',\n value: '⪚',\n codepoint: 10906,\n },\n {\n name: 'DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN',\n value: '⪛',\n codepoint: 10907,\n },\n {\n name: 'DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN',\n value: '⪜',\n codepoint: 10908,\n },\n {\n name: 'SIMILAR OR LESS-THAN',\n value: '⪝',\n codepoint: 10909,\n },\n {\n name: 'SIMILAR OR GREATER-THAN',\n value: '⪞',\n codepoint: 10910,\n },\n {\n name: 'SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN',\n value: '⪟',\n codepoint: 10911,\n },\n {\n name: 'SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN',\n value: '⪠',\n codepoint: 10912,\n },\n {\n name: 'DOUBLE NESTED LESS-THAN',\n value: '⪡',\n codepoint: 10913,\n },\n {\n name: 'DOUBLE NESTED GREATER-THAN',\n value: '⪢',\n codepoint: 10914,\n },\n {\n name: 'DOUBLE NESTED LESS-THAN WITH UNDERBAR',\n value: '⪣',\n codepoint: 10915,\n },\n {\n name: 'GREATER-THAN OVERLAPPING LESS-THAN',\n value: '⪤',\n codepoint: 10916,\n },\n {\n name: 'GREATER-THAN BESIDE LESS-THAN',\n value: '⪥',\n codepoint: 10917,\n },\n {\n name: 'LESS-THAN CLOSED BY CURVE',\n value: '⪦',\n codepoint: 10918,\n },\n {\n name: 'GREATER-THAN CLOSED BY CURVE',\n value: '⪧',\n codepoint: 10919,\n },\n {\n name: 'LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL',\n value: '⪨',\n codepoint: 10920,\n },\n {\n name: 'GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL',\n value: '⪩',\n codepoint: 10921,\n },\n {\n name: 'SMALLER THAN',\n value: '⪪',\n codepoint: 10922,\n },\n {\n name: 'LARGER THAN',\n value: '⪫',\n codepoint: 10923,\n },\n {\n name: 'SMALLER THAN OR EQUAL TO',\n value: '⪬',\n codepoint: 10924,\n },\n {\n name: 'LARGER THAN OR EQUAL TO',\n value: '⪭',\n codepoint: 10925,\n },\n {\n name: 'EQUALS SIGN WITH BUMPY ABOVE',\n value: '⪮',\n codepoint: 10926,\n },\n {\n name: 'PRECEDES ABOVE SINGLE-LINE EQUALS SIGN',\n value: '⪯',\n codepoint: 10927,\n },\n {\n name: 'SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN',\n value: '⪰',\n codepoint: 10928,\n },\n {\n name: 'PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO',\n value: '⪱',\n codepoint: 10929,\n },\n {\n name: 'SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO',\n value: '⪲',\n codepoint: 10930,\n },\n {\n name: 'PRECEDES ABOVE EQUALS SIGN',\n value: '⪳',\n codepoint: 10931,\n },\n {\n name: 'SUCCEEDS ABOVE EQUALS SIGN',\n value: '⪴',\n codepoint: 10932,\n },\n {\n name: 'PRECEDES ABOVE NOT EQUAL TO',\n value: '⪵',\n codepoint: 10933,\n },\n {\n name: 'SUCCEEDS ABOVE NOT EQUAL TO',\n value: '⪶',\n codepoint: 10934,\n },\n {\n name: 'PRECEDES ABOVE ALMOST EQUAL TO',\n value: '⪷',\n codepoint: 10935,\n },\n {\n name: 'SUCCEEDS ABOVE ALMOST EQUAL TO',\n value: '⪸',\n codepoint: 10936,\n },\n {\n name: 'PRECEDES ABOVE NOT ALMOST EQUAL TO',\n value: '⪹',\n codepoint: 10937,\n },\n {\n name: 'SUCCEEDS ABOVE NOT ALMOST EQUAL TO',\n value: '⪺',\n codepoint: 10938,\n },\n {\n name: 'DOUBLE PRECEDES',\n value: '⪻',\n codepoint: 10939,\n },\n {\n name: 'DOUBLE SUCCEEDS',\n value: '⪼',\n codepoint: 10940,\n },\n {\n name: 'SUBSET WITH DOT',\n value: '⪽',\n codepoint: 10941,\n },\n {\n name: 'SUPERSET WITH DOT',\n value: '⪾',\n codepoint: 10942,\n },\n {\n name: 'SUBSET WITH PLUS SIGN BELOW',\n value: '⪿',\n codepoint: 10943,\n },\n {\n name: 'SUPERSET WITH PLUS SIGN BELOW',\n value: '⫀',\n codepoint: 10944,\n },\n {\n name: 'SUBSET WITH MULTIPLICATION SIGN BELOW',\n value: '⫁',\n codepoint: 10945,\n },\n {\n name: 'SUPERSET WITH MULTIPLICATION SIGN BELOW',\n value: '⫂',\n codepoint: 10946,\n },\n {\n name: 'SUBSET OF OR EQUAL TO WITH DOT ABOVE',\n value: '⫃',\n codepoint: 10947,\n },\n {\n name: 'SUPERSET OF OR EQUAL TO WITH DOT ABOVE',\n value: '⫄',\n codepoint: 10948,\n },\n {\n name: 'SUBSET OF ABOVE EQUALS SIGN',\n value: '⫅',\n codepoint: 10949,\n },\n {\n name: 'SUPERSET OF ABOVE EQUALS SIGN',\n value: '⫆',\n codepoint: 10950,\n },\n {\n name: 'SUBSET OF ABOVE TILDE OPERATOR',\n value: '⫇',\n codepoint: 10951,\n },\n {\n name: 'SUPERSET OF ABOVE TILDE OPERATOR',\n value: '⫈',\n codepoint: 10952,\n },\n {\n name: 'SUBSET OF ABOVE ALMOST EQUAL TO',\n value: '⫉',\n codepoint: 10953,\n },\n {\n name: 'SUPERSET OF ABOVE ALMOST EQUAL TO',\n value: '⫊',\n codepoint: 10954,\n },\n {\n name: 'SUBSET OF ABOVE NOT EQUAL TO',\n value: '⫋',\n codepoint: 10955,\n },\n {\n name: 'SUPERSET OF ABOVE NOT EQUAL TO',\n value: '⫌',\n codepoint: 10956,\n },\n {\n name: 'SQUARE LEFT OPEN BOX OPERATOR',\n value: '⫍',\n codepoint: 10957,\n },\n {\n name: 'SQUARE RIGHT OPEN BOX OPERATOR',\n value: '⫎',\n codepoint: 10958,\n },\n {\n name: 'CLOSED SUBSET',\n value: '⫏',\n codepoint: 10959,\n },\n {\n name: 'CLOSED SUPERSET',\n value: '⫐',\n codepoint: 10960,\n },\n {\n name: 'CLOSED SUBSET OR EQUAL TO',\n value: '⫑',\n codepoint: 10961,\n },\n {\n name: 'CLOSED SUPERSET OR EQUAL TO',\n value: '⫒',\n codepoint: 10962,\n },\n {\n name: 'SUBSET ABOVE SUPERSET',\n value: '⫓',\n codepoint: 10963,\n },\n {\n name: 'SUPERSET ABOVE SUBSET',\n value: '⫔',\n codepoint: 10964,\n },\n {\n name: 'SUBSET ABOVE SUBSET',\n value: '⫕',\n codepoint: 10965,\n },\n {\n name: 'SUPERSET ABOVE SUPERSET',\n value: '⫖',\n codepoint: 10966,\n },\n {\n name: 'SUPERSET BESIDE SUBSET',\n value: '⫗',\n codepoint: 10967,\n },\n {\n name: 'SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET',\n value: '⫘',\n codepoint: 10968,\n },\n {\n name: 'ELEMENT OF OPENING DOWNWARDS',\n value: '⫙',\n codepoint: 10969,\n },\n {\n name: 'PITCHFORK WITH TEE TOP',\n value: '⫚',\n codepoint: 10970,\n },\n {\n name: 'TRANSVERSAL INTERSECTION',\n value: '⫛',\n codepoint: 10971,\n },\n {\n name: 'FORKING',\n value: '⫝̸',\n codepoint: 10972,\n },\n {\n name: 'NONFORKING',\n value: '⫝',\n codepoint: 10973,\n },\n {\n name: 'SHORT LEFT TACK',\n value: '⫞',\n codepoint: 10974,\n },\n {\n name: 'SHORT DOWN TACK',\n value: '⫟',\n codepoint: 10975,\n },\n {\n name: 'SHORT UP TACK',\n value: '⫠',\n codepoint: 10976,\n },\n {\n name: 'PERPENDICULAR WITH S',\n value: '⫡',\n codepoint: 10977,\n },\n {\n name: 'VERTICAL BAR TRIPLE RIGHT TURNSTILE',\n value: '⫢',\n codepoint: 10978,\n },\n {\n name: 'DOUBLE VERTICAL BAR LEFT TURNSTILE',\n value: '⫣',\n codepoint: 10979,\n },\n {\n name: 'VERTICAL BAR DOUBLE LEFT TURNSTILE',\n value: '⫤',\n codepoint: 10980,\n },\n {\n name: 'DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE',\n value: '⫥',\n codepoint: 10981,\n },\n {\n name: 'LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL',\n value: '⫦',\n codepoint: 10982,\n },\n {\n name: 'SHORT DOWN TACK WITH OVERBAR',\n value: '⫧',\n codepoint: 10983,\n },\n {\n name: 'SHORT UP TACK WITH UNDERBAR',\n value: '⫨',\n codepoint: 10984,\n },\n {\n name: 'SHORT UP TACK ABOVE SHORT DOWN TACK',\n value: '⫩',\n codepoint: 10985,\n },\n {\n name: 'DOUBLE DOWN TACK',\n value: '⫪',\n codepoint: 10986,\n },\n {\n name: 'DOUBLE UP TACK',\n value: '⫫',\n codepoint: 10987,\n },\n {\n name: 'DOUBLE STROKE NOT SIGN',\n value: '⫬',\n codepoint: 10988,\n },\n {\n name: 'REVERSED DOUBLE STROKE NOT SIGN',\n value: '⫭',\n codepoint: 10989,\n },\n {\n name: 'DOES NOT DIVIDE WITH REVERSED NEGATION SLASH',\n value: '⫮',\n codepoint: 10990,\n },\n {\n name: 'VERTICAL LINE WITH CIRCLE ABOVE',\n value: '⫯',\n codepoint: 10991,\n },\n {\n name: 'VERTICAL LINE WITH CIRCLE BELOW',\n value: '⫰',\n codepoint: 10992,\n },\n {\n name: 'DOWN TACK WITH CIRCLE BELOW',\n value: '⫱',\n codepoint: 10993,\n },\n {\n name: 'PARALLEL WITH HORIZONTAL STROKE',\n value: '⫲',\n codepoint: 10994,\n },\n {\n name: 'PARALLEL WITH TILDE OPERATOR',\n value: '⫳',\n codepoint: 10995,\n },\n {\n name: 'TRIPLE VERTICAL BAR BINARY RELATION',\n value: '⫴',\n codepoint: 10996,\n },\n {\n name: 'TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE',\n value: '⫵',\n codepoint: 10997,\n },\n {\n name: 'TRIPLE COLON OPERATOR',\n value: '⫶',\n codepoint: 10998,\n },\n {\n name: 'TRIPLE NESTED LESS-THAN',\n value: '⫷',\n codepoint: 10999,\n },\n {\n name: 'TRIPLE NESTED GREATER-THAN',\n value: '⫸',\n codepoint: 11000,\n },\n {\n name: 'DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO',\n value: '⫹',\n codepoint: 11001,\n },\n {\n name: 'DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO',\n value: '⫺',\n codepoint: 11002,\n },\n {\n name: 'TRIPLE SOLIDUS BINARY RELATION',\n value: '⫻',\n codepoint: 11003,\n },\n {\n name: 'LARGE TRIPLE VERTICAL BAR OPERATOR',\n value: '⫼',\n codepoint: 11004,\n },\n {\n name: 'DOUBLE SOLIDUS OPERATOR',\n value: '⫽',\n codepoint: 11005,\n },\n {\n name: 'WHITE VERTICAL BAR',\n value: '⫾',\n codepoint: 11006,\n },\n {\n name: 'N-ARY WHITE VERTICAL BAR',\n value: '⫿',\n codepoint: 11007,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL A',\n value: '𝐀',\n codepoint: 119808,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL B',\n value: '𝐁',\n codepoint: 119809,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL C',\n value: '𝐂',\n codepoint: 119810,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL D',\n value: '𝐃',\n codepoint: 119811,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL E',\n value: '𝐄',\n codepoint: 119812,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL F',\n value: '𝐅',\n codepoint: 119813,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL G',\n value: '𝐆',\n codepoint: 119814,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL H',\n value: '𝐇',\n codepoint: 119815,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL I',\n value: '𝐈',\n codepoint: 119816,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL J',\n value: '𝐉',\n codepoint: 119817,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL K',\n value: '𝐊',\n codepoint: 119818,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL L',\n value: '𝐋',\n codepoint: 119819,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL M',\n value: '𝐌',\n codepoint: 119820,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL N',\n value: '𝐍',\n codepoint: 119821,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL O',\n value: '𝐎',\n codepoint: 119822,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL P',\n value: '𝐏',\n codepoint: 119823,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL Q',\n value: '𝐐',\n codepoint: 119824,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL R',\n value: '𝐑',\n codepoint: 119825,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL S',\n value: '𝐒',\n codepoint: 119826,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL T',\n value: '𝐓',\n codepoint: 119827,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL U',\n value: '𝐔',\n codepoint: 119828,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL V',\n value: '𝐕',\n codepoint: 119829,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL W',\n value: '𝐖',\n codepoint: 119830,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL X',\n value: '𝐗',\n codepoint: 119831,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL Y',\n value: '𝐘',\n codepoint: 119832,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL Z',\n value: '𝐙',\n codepoint: 119833,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL A',\n value: '𝐚',\n codepoint: 119834,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL B',\n value: '𝐛',\n codepoint: 119835,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL C',\n value: '𝐜',\n codepoint: 119836,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL D',\n value: '𝐝',\n codepoint: 119837,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL E',\n value: '𝐞',\n codepoint: 119838,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL F',\n value: '𝐟',\n codepoint: 119839,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL G',\n value: '𝐠',\n codepoint: 119840,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL H',\n value: '𝐡',\n codepoint: 119841,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL I',\n value: '𝐢',\n codepoint: 119842,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL J',\n value: '𝐣',\n codepoint: 119843,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL K',\n value: '𝐤',\n codepoint: 119844,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL L',\n value: '𝐥',\n codepoint: 119845,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL M',\n value: '𝐦',\n codepoint: 119846,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL N',\n value: '𝐧',\n codepoint: 119847,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL O',\n value: '𝐨',\n codepoint: 119848,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL P',\n value: '𝐩',\n codepoint: 119849,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL Q',\n value: '𝐪',\n codepoint: 119850,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL R',\n value: '𝐫',\n codepoint: 119851,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL S',\n value: '𝐬',\n codepoint: 119852,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL T',\n value: '𝐭',\n codepoint: 119853,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL U',\n value: '𝐮',\n codepoint: 119854,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL V',\n value: '𝐯',\n codepoint: 119855,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL W',\n value: '𝐰',\n codepoint: 119856,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL X',\n value: '𝐱',\n codepoint: 119857,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL Y',\n value: '𝐲',\n codepoint: 119858,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL Z',\n value: '𝐳',\n codepoint: 119859,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL A',\n value: '𝐴',\n codepoint: 119860,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL B',\n value: '𝐵',\n codepoint: 119861,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL C',\n value: '𝐶',\n codepoint: 119862,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL D',\n value: '𝐷',\n codepoint: 119863,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL E',\n value: '𝐸',\n codepoint: 119864,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL F',\n value: '𝐹',\n codepoint: 119865,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL G',\n value: '𝐺',\n codepoint: 119866,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL H',\n value: '𝐻',\n codepoint: 119867,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL I',\n value: '𝐼',\n codepoint: 119868,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL J',\n value: '𝐽',\n codepoint: 119869,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL K',\n value: '𝐾',\n codepoint: 119870,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL L',\n value: '𝐿',\n codepoint: 119871,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL M',\n value: '𝑀',\n codepoint: 119872,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL N',\n value: '𝑁',\n codepoint: 119873,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL O',\n value: '𝑂',\n codepoint: 119874,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL P',\n value: '𝑃',\n codepoint: 119875,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL Q',\n value: '𝑄',\n codepoint: 119876,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL R',\n value: '𝑅',\n codepoint: 119877,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL S',\n value: '𝑆',\n codepoint: 119878,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL T',\n value: '𝑇',\n codepoint: 119879,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL U',\n value: '𝑈',\n codepoint: 119880,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL V',\n value: '𝑉',\n codepoint: 119881,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL W',\n value: '𝑊',\n codepoint: 119882,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL X',\n value: '𝑋',\n codepoint: 119883,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL Y',\n value: '𝑌',\n codepoint: 119884,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL Z',\n value: '𝑍',\n codepoint: 119885,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL A',\n value: '𝑎',\n codepoint: 119886,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL B',\n value: '𝑏',\n codepoint: 119887,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL C',\n value: '𝑐',\n codepoint: 119888,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL D',\n value: '𝑑',\n codepoint: 119889,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL E',\n value: '𝑒',\n codepoint: 119890,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL F',\n value: '𝑓',\n codepoint: 119891,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL G',\n value: '𝑔',\n codepoint: 119892,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL I',\n value: '𝑖',\n codepoint: 119894,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL J',\n value: '𝑗',\n codepoint: 119895,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL K',\n value: '𝑘',\n codepoint: 119896,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL L',\n value: '𝑙',\n codepoint: 119897,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL M',\n value: '𝑚',\n codepoint: 119898,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL N',\n value: '𝑛',\n codepoint: 119899,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL O',\n value: '𝑜',\n codepoint: 119900,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL P',\n value: '𝑝',\n codepoint: 119901,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL Q',\n value: '𝑞',\n codepoint: 119902,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL R',\n value: '𝑟',\n codepoint: 119903,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL S',\n value: '𝑠',\n codepoint: 119904,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL T',\n value: '𝑡',\n codepoint: 119905,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL U',\n value: '𝑢',\n codepoint: 119906,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL V',\n value: '𝑣',\n codepoint: 119907,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL W',\n value: '𝑤',\n codepoint: 119908,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL X',\n value: '𝑥',\n codepoint: 119909,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL Y',\n value: '𝑦',\n codepoint: 119910,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL Z',\n value: '𝑧',\n codepoint: 119911,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL A',\n value: '𝑨',\n codepoint: 119912,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL B',\n value: '𝑩',\n codepoint: 119913,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL C',\n value: '𝑪',\n codepoint: 119914,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL D',\n value: '𝑫',\n codepoint: 119915,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL E',\n value: '𝑬',\n codepoint: 119916,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL F',\n value: '𝑭',\n codepoint: 119917,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL G',\n value: '𝑮',\n codepoint: 119918,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL H',\n value: '𝑯',\n codepoint: 119919,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL I',\n value: '𝑰',\n codepoint: 119920,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL J',\n value: '𝑱',\n codepoint: 119921,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL K',\n value: '𝑲',\n codepoint: 119922,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL L',\n value: '𝑳',\n codepoint: 119923,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL M',\n value: '𝑴',\n codepoint: 119924,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL N',\n value: '𝑵',\n codepoint: 119925,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL O',\n value: '𝑶',\n codepoint: 119926,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL P',\n value: '𝑷',\n codepoint: 119927,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL Q',\n value: '𝑸',\n codepoint: 119928,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL R',\n value: '𝑹',\n codepoint: 119929,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL S',\n value: '𝑺',\n codepoint: 119930,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL T',\n value: '𝑻',\n codepoint: 119931,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL U',\n value: '𝑼',\n codepoint: 119932,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL V',\n value: '𝑽',\n codepoint: 119933,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL W',\n value: '𝑾',\n codepoint: 119934,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL X',\n value: '𝑿',\n codepoint: 119935,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL Y',\n value: '𝒀',\n codepoint: 119936,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL Z',\n value: '𝒁',\n codepoint: 119937,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL A',\n value: '𝒂',\n codepoint: 119938,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL B',\n value: '𝒃',\n codepoint: 119939,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL C',\n value: '𝒄',\n codepoint: 119940,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL D',\n value: '𝒅',\n codepoint: 119941,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL E',\n value: '𝒆',\n codepoint: 119942,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL F',\n value: '𝒇',\n codepoint: 119943,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL G',\n value: '𝒈',\n codepoint: 119944,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL H',\n value: '𝒉',\n codepoint: 119945,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL I',\n value: '𝒊',\n codepoint: 119946,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL J',\n value: '𝒋',\n codepoint: 119947,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL K',\n value: '𝒌',\n codepoint: 119948,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL L',\n value: '𝒍',\n codepoint: 119949,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL M',\n value: '𝒎',\n codepoint: 119950,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL N',\n value: '𝒏',\n codepoint: 119951,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL O',\n value: '𝒐',\n codepoint: 119952,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL P',\n value: '𝒑',\n codepoint: 119953,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL Q',\n value: '𝒒',\n codepoint: 119954,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL R',\n value: '𝒓',\n codepoint: 119955,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL S',\n value: '𝒔',\n codepoint: 119956,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL T',\n value: '𝒕',\n codepoint: 119957,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL U',\n value: '𝒖',\n codepoint: 119958,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL V',\n value: '𝒗',\n codepoint: 119959,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL W',\n value: '𝒘',\n codepoint: 119960,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL X',\n value: '𝒙',\n codepoint: 119961,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL Y',\n value: '𝒚',\n codepoint: 119962,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL Z',\n value: '𝒛',\n codepoint: 119963,\n },\n {\n name: 'MATHEMATICAL SCRIPT CAPITAL A',\n value: '𝒜',\n codepoint: 119964,\n },\n {\n name: 'MATHEMATICAL SCRIPT CAPITAL C',\n value: '𝒞',\n codepoint: 119966,\n },\n {\n name: 'MATHEMATICAL SCRIPT CAPITAL D',\n value: '𝒟',\n codepoint: 119967,\n },\n {\n name: 'MATHEMATICAL SCRIPT CAPITAL G',\n value: '𝒢',\n codepoint: 119970,\n },\n {\n name: 'MATHEMATICAL SCRIPT CAPITAL J',\n value: '𝒥',\n codepoint: 119973,\n },\n {\n name: 'MATHEMATICAL SCRIPT CAPITAL K',\n value: '𝒦',\n codepoint: 119974,\n },\n {\n name: 'MATHEMATICAL SCRIPT CAPITAL N',\n value: '𝒩',\n codepoint: 119977,\n },\n {\n name: 'MATHEMATICAL SCRIPT CAPITAL O',\n value: '𝒪',\n codepoint: 119978,\n },\n {\n name: 'MATHEMATICAL SCRIPT CAPITAL P',\n value: '𝒫',\n codepoint: 119979,\n },\n {\n name: 'MATHEMATICAL SCRIPT CAPITAL Q',\n value: '𝒬',\n codepoint: 119980,\n },\n {\n name: 'MATHEMATICAL SCRIPT CAPITAL S',\n value: '𝒮',\n codepoint: 119982,\n },\n {\n name: 'MATHEMATICAL SCRIPT CAPITAL T',\n value: '𝒯',\n codepoint: 119983,\n },\n {\n name: 'MATHEMATICAL SCRIPT CAPITAL U',\n value: '𝒰',\n codepoint: 119984,\n },\n {\n name: 'MATHEMATICAL SCRIPT CAPITAL V',\n value: '𝒱',\n codepoint: 119985,\n },\n {\n name: 'MATHEMATICAL SCRIPT CAPITAL W',\n value: '𝒲',\n codepoint: 119986,\n },\n {\n name: 'MATHEMATICAL SCRIPT CAPITAL X',\n value: '𝒳',\n codepoint: 119987,\n },\n {\n name: 'MATHEMATICAL SCRIPT CAPITAL Y',\n value: '𝒴',\n codepoint: 119988,\n },\n {\n name: 'MATHEMATICAL SCRIPT CAPITAL Z',\n value: '𝒵',\n codepoint: 119989,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL A',\n value: '𝒶',\n codepoint: 119990,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL B',\n value: '𝒷',\n codepoint: 119991,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL C',\n value: '𝒸',\n codepoint: 119992,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL D',\n value: '𝒹',\n codepoint: 119993,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL F',\n value: '𝒻',\n codepoint: 119995,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL H',\n value: '𝒽',\n codepoint: 119997,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL I',\n value: '𝒾',\n codepoint: 119998,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL J',\n value: '𝒿',\n codepoint: 119999,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL K',\n value: '𝓀',\n codepoint: 120000,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL L',\n value: '𝓁',\n codepoint: 120001,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL M',\n value: '𝓂',\n codepoint: 120002,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL N',\n value: '𝓃',\n codepoint: 120003,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL P',\n value: '𝓅',\n codepoint: 120005,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL Q',\n value: '𝓆',\n codepoint: 120006,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL R',\n value: '𝓇',\n codepoint: 120007,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL S',\n value: '𝓈',\n codepoint: 120008,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL T',\n value: '𝓉',\n codepoint: 120009,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL U',\n value: '𝓊',\n codepoint: 120010,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL V',\n value: '𝓋',\n codepoint: 120011,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL W',\n value: '𝓌',\n codepoint: 120012,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL X',\n value: '𝓍',\n codepoint: 120013,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL Y',\n value: '𝓎',\n codepoint: 120014,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL Z',\n value: '𝓏',\n codepoint: 120015,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL A',\n value: '𝓐',\n codepoint: 120016,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL B',\n value: '𝓑',\n codepoint: 120017,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL C',\n value: '𝓒',\n codepoint: 120018,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL D',\n value: '𝓓',\n codepoint: 120019,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL E',\n value: '𝓔',\n codepoint: 120020,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL F',\n value: '𝓕',\n codepoint: 120021,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL G',\n value: '𝓖',\n codepoint: 120022,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL H',\n value: '𝓗',\n codepoint: 120023,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL I',\n value: '𝓘',\n codepoint: 120024,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL J',\n value: '𝓙',\n codepoint: 120025,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL K',\n value: '𝓚',\n codepoint: 120026,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL L',\n value: '𝓛',\n codepoint: 120027,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL M',\n value: '𝓜',\n codepoint: 120028,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL N',\n value: '𝓝',\n codepoint: 120029,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL O',\n value: '𝓞',\n codepoint: 120030,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL P',\n value: '𝓟',\n codepoint: 120031,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL Q',\n value: '𝓠',\n codepoint: 120032,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL R',\n value: '𝓡',\n codepoint: 120033,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL S',\n value: '𝓢',\n codepoint: 120034,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL T',\n value: '𝓣',\n codepoint: 120035,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL U',\n value: '𝓤',\n codepoint: 120036,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL V',\n value: '𝓥',\n codepoint: 120037,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL W',\n value: '𝓦',\n codepoint: 120038,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL X',\n value: '𝓧',\n codepoint: 120039,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL Y',\n value: '𝓨',\n codepoint: 120040,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL Z',\n value: '𝓩',\n codepoint: 120041,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL A',\n value: '𝓪',\n codepoint: 120042,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL B',\n value: '𝓫',\n codepoint: 120043,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL C',\n value: '𝓬',\n codepoint: 120044,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL D',\n value: '𝓭',\n codepoint: 120045,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL E',\n value: '𝓮',\n codepoint: 120046,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL F',\n value: '𝓯',\n codepoint: 120047,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL G',\n value: '𝓰',\n codepoint: 120048,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL H',\n value: '𝓱',\n codepoint: 120049,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL I',\n value: '𝓲',\n codepoint: 120050,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL J',\n value: '𝓳',\n codepoint: 120051,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL K',\n value: '𝓴',\n codepoint: 120052,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL L',\n value: '𝓵',\n codepoint: 120053,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL M',\n value: '𝓶',\n codepoint: 120054,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL N',\n value: '𝓷',\n codepoint: 120055,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL O',\n value: '𝓸',\n codepoint: 120056,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL P',\n value: '𝓹',\n codepoint: 120057,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL Q',\n value: '𝓺',\n codepoint: 120058,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL R',\n value: '𝓻',\n codepoint: 120059,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL S',\n value: '𝓼',\n codepoint: 120060,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL T',\n value: '𝓽',\n codepoint: 120061,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL U',\n value: '𝓾',\n codepoint: 120062,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL V',\n value: '𝓿',\n codepoint: 120063,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL W',\n value: '𝔀',\n codepoint: 120064,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL X',\n value: '𝔁',\n codepoint: 120065,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL Y',\n value: '𝔂',\n codepoint: 120066,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL Z',\n value: '𝔃',\n codepoint: 120067,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL A',\n value: '𝔄',\n codepoint: 120068,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL B',\n value: '𝔅',\n codepoint: 120069,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL D',\n value: '𝔇',\n codepoint: 120071,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL E',\n value: '𝔈',\n codepoint: 120072,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL F',\n value: '𝔉',\n codepoint: 120073,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL G',\n value: '𝔊',\n codepoint: 120074,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL J',\n value: '𝔍',\n codepoint: 120077,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL K',\n value: '𝔎',\n codepoint: 120078,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL L',\n value: '𝔏',\n codepoint: 120079,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL M',\n value: '𝔐',\n codepoint: 120080,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL N',\n value: '𝔑',\n codepoint: 120081,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL O',\n value: '𝔒',\n codepoint: 120082,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL P',\n value: '𝔓',\n codepoint: 120083,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL Q',\n value: '𝔔',\n codepoint: 120084,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL S',\n value: '𝔖',\n codepoint: 120086,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL T',\n value: '𝔗',\n codepoint: 120087,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL U',\n value: '𝔘',\n codepoint: 120088,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL V',\n value: '𝔙',\n codepoint: 120089,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL W',\n value: '𝔚',\n codepoint: 120090,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL X',\n value: '𝔛',\n codepoint: 120091,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL Y',\n value: '𝔜',\n codepoint: 120092,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL A',\n value: '𝔞',\n codepoint: 120094,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL B',\n value: '𝔟',\n codepoint: 120095,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL C',\n value: '𝔠',\n codepoint: 120096,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL D',\n value: '𝔡',\n codepoint: 120097,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL E',\n value: '𝔢',\n codepoint: 120098,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL F',\n value: '𝔣',\n codepoint: 120099,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL G',\n value: '𝔤',\n codepoint: 120100,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL H',\n value: '𝔥',\n codepoint: 120101,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL I',\n value: '𝔦',\n codepoint: 120102,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL J',\n value: '𝔧',\n codepoint: 120103,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL K',\n value: '𝔨',\n codepoint: 120104,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL L',\n value: '𝔩',\n codepoint: 120105,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL M',\n value: '𝔪',\n codepoint: 120106,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL N',\n value: '𝔫',\n codepoint: 120107,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL O',\n value: '𝔬',\n codepoint: 120108,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL P',\n value: '𝔭',\n codepoint: 120109,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL Q',\n value: '𝔮',\n codepoint: 120110,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL R',\n value: '𝔯',\n codepoint: 120111,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL S',\n value: '𝔰',\n codepoint: 120112,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL T',\n value: '𝔱',\n codepoint: 120113,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL U',\n value: '𝔲',\n codepoint: 120114,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL V',\n value: '𝔳',\n codepoint: 120115,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL W',\n value: '𝔴',\n codepoint: 120116,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL X',\n value: '𝔵',\n codepoint: 120117,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL Y',\n value: '𝔶',\n codepoint: 120118,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL Z',\n value: '𝔷',\n codepoint: 120119,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL A',\n value: '𝔸',\n codepoint: 120120,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL B',\n value: '𝔹',\n codepoint: 120121,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL D',\n value: '𝔻',\n codepoint: 120123,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL E',\n value: '𝔼',\n codepoint: 120124,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL F',\n value: '𝔽',\n codepoint: 120125,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL G',\n value: '𝔾',\n codepoint: 120126,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL I',\n value: '𝕀',\n codepoint: 120128,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL J',\n value: '𝕁',\n codepoint: 120129,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL K',\n value: '𝕂',\n codepoint: 120130,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL L',\n value: '𝕃',\n codepoint: 120131,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL M',\n value: '𝕄',\n codepoint: 120132,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL O',\n value: '𝕆',\n codepoint: 120134,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL S',\n value: '𝕊',\n codepoint: 120138,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL T',\n value: '𝕋',\n codepoint: 120139,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL U',\n value: '𝕌',\n codepoint: 120140,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL V',\n value: '𝕍',\n codepoint: 120141,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL W',\n value: '𝕎',\n codepoint: 120142,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL X',\n value: '𝕏',\n codepoint: 120143,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL Y',\n value: '𝕐',\n codepoint: 120144,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL A',\n value: '𝕒',\n codepoint: 120146,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL B',\n value: '𝕓',\n codepoint: 120147,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL C',\n value: '𝕔',\n codepoint: 120148,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL D',\n value: '𝕕',\n codepoint: 120149,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL E',\n value: '𝕖',\n codepoint: 120150,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL F',\n value: '𝕗',\n codepoint: 120151,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL G',\n value: '𝕘',\n codepoint: 120152,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL H',\n value: '𝕙',\n codepoint: 120153,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL I',\n value: '𝕚',\n codepoint: 120154,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL J',\n value: '𝕛',\n codepoint: 120155,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL K',\n value: '𝕜',\n codepoint: 120156,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL L',\n value: '𝕝',\n codepoint: 120157,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL M',\n value: '𝕞',\n codepoint: 120158,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL N',\n value: '𝕟',\n codepoint: 120159,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL O',\n value: '𝕠',\n codepoint: 120160,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL P',\n value: '𝕡',\n codepoint: 120161,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL Q',\n value: '𝕢',\n codepoint: 120162,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL R',\n value: '𝕣',\n codepoint: 120163,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL S',\n value: '𝕤',\n codepoint: 120164,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL T',\n value: '𝕥',\n codepoint: 120165,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL U',\n value: '𝕦',\n codepoint: 120166,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL V',\n value: '𝕧',\n codepoint: 120167,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL W',\n value: '𝕨',\n codepoint: 120168,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL X',\n value: '𝕩',\n codepoint: 120169,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL Y',\n value: '𝕪',\n codepoint: 120170,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL Z',\n value: '𝕫',\n codepoint: 120171,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL A',\n value: '𝕬',\n codepoint: 120172,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL B',\n value: '𝕭',\n codepoint: 120173,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL C',\n value: '𝕮',\n codepoint: 120174,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL D',\n value: '𝕯',\n codepoint: 120175,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL E',\n value: '𝕰',\n codepoint: 120176,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL F',\n value: '𝕱',\n codepoint: 120177,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL G',\n value: '𝕲',\n codepoint: 120178,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL H',\n value: '𝕳',\n codepoint: 120179,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL I',\n value: '𝕴',\n codepoint: 120180,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL J',\n value: '𝕵',\n codepoint: 120181,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL K',\n value: '𝕶',\n codepoint: 120182,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL L',\n value: '𝕷',\n codepoint: 120183,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL M',\n value: '𝕸',\n codepoint: 120184,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL N',\n value: '𝕹',\n codepoint: 120185,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL O',\n value: '𝕺',\n codepoint: 120186,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL P',\n value: '𝕻',\n codepoint: 120187,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL Q',\n value: '𝕼',\n codepoint: 120188,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL R',\n value: '𝕽',\n codepoint: 120189,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL S',\n value: '𝕾',\n codepoint: 120190,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL T',\n value: '𝕿',\n codepoint: 120191,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL U',\n value: '𝖀',\n codepoint: 120192,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL V',\n value: '𝖁',\n codepoint: 120193,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL W',\n value: '𝖂',\n codepoint: 120194,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL X',\n value: '𝖃',\n codepoint: 120195,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL Y',\n value: '𝖄',\n codepoint: 120196,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL Z',\n value: '𝖅',\n codepoint: 120197,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL A',\n value: '𝖆',\n codepoint: 120198,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL B',\n value: '𝖇',\n codepoint: 120199,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL C',\n value: '𝖈',\n codepoint: 120200,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL D',\n value: '𝖉',\n codepoint: 120201,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL E',\n value: '𝖊',\n codepoint: 120202,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL F',\n value: '𝖋',\n codepoint: 120203,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL G',\n value: '𝖌',\n codepoint: 120204,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL H',\n value: '𝖍',\n codepoint: 120205,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL I',\n value: '𝖎',\n codepoint: 120206,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL J',\n value: '𝖏',\n codepoint: 120207,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL K',\n value: '𝖐',\n codepoint: 120208,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL L',\n value: '𝖑',\n codepoint: 120209,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL M',\n value: '𝖒',\n codepoint: 120210,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL N',\n value: '𝖓',\n codepoint: 120211,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL O',\n value: '𝖔',\n codepoint: 120212,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL P',\n value: '𝖕',\n codepoint: 120213,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL Q',\n value: '𝖖',\n codepoint: 120214,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL R',\n value: '𝖗',\n codepoint: 120215,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL S',\n value: '𝖘',\n codepoint: 120216,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL T',\n value: '𝖙',\n codepoint: 120217,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL U',\n value: '𝖚',\n codepoint: 120218,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL V',\n value: '𝖛',\n codepoint: 120219,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL W',\n value: '𝖜',\n codepoint: 120220,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL X',\n value: '𝖝',\n codepoint: 120221,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL Y',\n value: '𝖞',\n codepoint: 120222,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL Z',\n value: '𝖟',\n codepoint: 120223,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL A',\n value: '𝖠',\n codepoint: 120224,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL B',\n value: '𝖡',\n codepoint: 120225,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL C',\n value: '𝖢',\n codepoint: 120226,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL D',\n value: '𝖣',\n codepoint: 120227,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL E',\n value: '𝖤',\n codepoint: 120228,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL F',\n value: '𝖥',\n codepoint: 120229,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL G',\n value: '𝖦',\n codepoint: 120230,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL H',\n value: '𝖧',\n codepoint: 120231,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL I',\n value: '𝖨',\n codepoint: 120232,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL J',\n value: '𝖩',\n codepoint: 120233,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL K',\n value: '𝖪',\n codepoint: 120234,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL L',\n value: '𝖫',\n codepoint: 120235,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL M',\n value: '𝖬',\n codepoint: 120236,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL N',\n value: '𝖭',\n codepoint: 120237,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL O',\n value: '𝖮',\n codepoint: 120238,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL P',\n value: '𝖯',\n codepoint: 120239,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL Q',\n value: '𝖰',\n codepoint: 120240,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL R',\n value: '𝖱',\n codepoint: 120241,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL S',\n value: '𝖲',\n codepoint: 120242,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL T',\n value: '𝖳',\n codepoint: 120243,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL U',\n value: '𝖴',\n codepoint: 120244,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL V',\n value: '𝖵',\n codepoint: 120245,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL W',\n value: '𝖶',\n codepoint: 120246,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL X',\n value: '𝖷',\n codepoint: 120247,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL Y',\n value: '𝖸',\n codepoint: 120248,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL Z',\n value: '𝖹',\n codepoint: 120249,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL A',\n value: '𝖺',\n codepoint: 120250,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL B',\n value: '𝖻',\n codepoint: 120251,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL C',\n value: '𝖼',\n codepoint: 120252,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL D',\n value: '𝖽',\n codepoint: 120253,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL E',\n value: '𝖾',\n codepoint: 120254,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL F',\n value: '𝖿',\n codepoint: 120255,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL G',\n value: '𝗀',\n codepoint: 120256,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL H',\n value: '𝗁',\n codepoint: 120257,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL I',\n value: '𝗂',\n codepoint: 120258,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL J',\n value: '𝗃',\n codepoint: 120259,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL K',\n value: '𝗄',\n codepoint: 120260,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL L',\n value: '𝗅',\n codepoint: 120261,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL M',\n value: '𝗆',\n codepoint: 120262,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL N',\n value: '𝗇',\n codepoint: 120263,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL O',\n value: '𝗈',\n codepoint: 120264,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL P',\n value: '𝗉',\n codepoint: 120265,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL Q',\n value: '𝗊',\n codepoint: 120266,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL R',\n value: '𝗋',\n codepoint: 120267,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL S',\n value: '𝗌',\n codepoint: 120268,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL T',\n value: '𝗍',\n codepoint: 120269,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL U',\n value: '𝗎',\n codepoint: 120270,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL V',\n value: '𝗏',\n codepoint: 120271,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL W',\n value: '𝗐',\n codepoint: 120272,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL X',\n value: '𝗑',\n codepoint: 120273,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL Y',\n value: '𝗒',\n codepoint: 120274,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL Z',\n value: '𝗓',\n codepoint: 120275,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL A',\n value: '𝗔',\n codepoint: 120276,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL B',\n value: '𝗕',\n codepoint: 120277,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL C',\n value: '𝗖',\n codepoint: 120278,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL D',\n value: '𝗗',\n codepoint: 120279,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL E',\n value: '𝗘',\n codepoint: 120280,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL F',\n value: '𝗙',\n codepoint: 120281,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL G',\n value: '𝗚',\n codepoint: 120282,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL H',\n value: '𝗛',\n codepoint: 120283,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL I',\n value: '𝗜',\n codepoint: 120284,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL J',\n value: '𝗝',\n codepoint: 120285,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL K',\n value: '𝗞',\n codepoint: 120286,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL L',\n value: '𝗟',\n codepoint: 120287,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL M',\n value: '𝗠',\n codepoint: 120288,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL N',\n value: '𝗡',\n codepoint: 120289,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL O',\n value: '𝗢',\n codepoint: 120290,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL P',\n value: '𝗣',\n codepoint: 120291,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL Q',\n value: '𝗤',\n codepoint: 120292,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL R',\n value: '𝗥',\n codepoint: 120293,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL S',\n value: '𝗦',\n codepoint: 120294,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL T',\n value: '𝗧',\n codepoint: 120295,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL U',\n value: '𝗨',\n codepoint: 120296,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL V',\n value: '𝗩',\n codepoint: 120297,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL W',\n value: '𝗪',\n codepoint: 120298,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL X',\n value: '𝗫',\n codepoint: 120299,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL Y',\n value: '𝗬',\n codepoint: 120300,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL Z',\n value: '𝗭',\n codepoint: 120301,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL A',\n value: '𝗮',\n codepoint: 120302,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL B',\n value: '𝗯',\n codepoint: 120303,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL C',\n value: '𝗰',\n codepoint: 120304,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL D',\n value: '𝗱',\n codepoint: 120305,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL E',\n value: '𝗲',\n codepoint: 120306,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL F',\n value: '𝗳',\n codepoint: 120307,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL G',\n value: '𝗴',\n codepoint: 120308,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL H',\n value: '𝗵',\n codepoint: 120309,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL I',\n value: '𝗶',\n codepoint: 120310,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL J',\n value: '𝗷',\n codepoint: 120311,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL K',\n value: '𝗸',\n codepoint: 120312,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL L',\n value: '𝗹',\n codepoint: 120313,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL M',\n value: '𝗺',\n codepoint: 120314,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL N',\n value: '𝗻',\n codepoint: 120315,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL O',\n value: '𝗼',\n codepoint: 120316,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL P',\n value: '𝗽',\n codepoint: 120317,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL Q',\n value: '𝗾',\n codepoint: 120318,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL R',\n value: '𝗿',\n codepoint: 120319,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL S',\n value: '𝘀',\n codepoint: 120320,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL T',\n value: '𝘁',\n codepoint: 120321,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL U',\n value: '𝘂',\n codepoint: 120322,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL V',\n value: '𝘃',\n codepoint: 120323,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL W',\n value: '𝘄',\n codepoint: 120324,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL X',\n value: '𝘅',\n codepoint: 120325,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL Y',\n value: '𝘆',\n codepoint: 120326,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL Z',\n value: '𝘇',\n codepoint: 120327,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL A',\n value: '𝘈',\n codepoint: 120328,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL B',\n value: '𝘉',\n codepoint: 120329,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL C',\n value: '𝘊',\n codepoint: 120330,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL D',\n value: '𝘋',\n codepoint: 120331,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL E',\n value: '𝘌',\n codepoint: 120332,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL F',\n value: '𝘍',\n codepoint: 120333,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL G',\n value: '𝘎',\n codepoint: 120334,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL H',\n value: '𝘏',\n codepoint: 120335,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL I',\n value: '𝘐',\n codepoint: 120336,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL J',\n value: '𝘑',\n codepoint: 120337,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL K',\n value: '𝘒',\n codepoint: 120338,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL L',\n value: '𝘓',\n codepoint: 120339,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL M',\n value: '𝘔',\n codepoint: 120340,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL N',\n value: '𝘕',\n codepoint: 120341,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL O',\n value: '𝘖',\n codepoint: 120342,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL P',\n value: '𝘗',\n codepoint: 120343,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q',\n value: '𝘘',\n codepoint: 120344,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL R',\n value: '𝘙',\n codepoint: 120345,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL S',\n value: '𝘚',\n codepoint: 120346,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL T',\n value: '𝘛',\n codepoint: 120347,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL U',\n value: '𝘜',\n codepoint: 120348,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL V',\n value: '𝘝',\n codepoint: 120349,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL W',\n value: '𝘞',\n codepoint: 120350,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL X',\n value: '𝘟',\n codepoint: 120351,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y',\n value: '𝘠',\n codepoint: 120352,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z',\n value: '𝘡',\n codepoint: 120353,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL A',\n value: '𝘢',\n codepoint: 120354,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL B',\n value: '𝘣',\n codepoint: 120355,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL C',\n value: '𝘤',\n codepoint: 120356,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL D',\n value: '𝘥',\n codepoint: 120357,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL E',\n value: '𝘦',\n codepoint: 120358,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL F',\n value: '𝘧',\n codepoint: 120359,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL G',\n value: '𝘨',\n codepoint: 120360,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL H',\n value: '𝘩',\n codepoint: 120361,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL I',\n value: '𝘪',\n codepoint: 120362,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL J',\n value: '𝘫',\n codepoint: 120363,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL K',\n value: '𝘬',\n codepoint: 120364,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL L',\n value: '𝘭',\n codepoint: 120365,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL M',\n value: '𝘮',\n codepoint: 120366,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL N',\n value: '𝘯',\n codepoint: 120367,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL O',\n value: '𝘰',\n codepoint: 120368,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL P',\n value: '𝘱',\n codepoint: 120369,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL Q',\n value: '𝘲',\n codepoint: 120370,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL R',\n value: '𝘳',\n codepoint: 120371,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL S',\n value: '𝘴',\n codepoint: 120372,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL T',\n value: '𝘵',\n codepoint: 120373,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL U',\n value: '𝘶',\n codepoint: 120374,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL V',\n value: '𝘷',\n codepoint: 120375,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL W',\n value: '𝘸',\n codepoint: 120376,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL X',\n value: '𝘹',\n codepoint: 120377,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL Y',\n value: '𝘺',\n codepoint: 120378,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL Z',\n value: '𝘻',\n codepoint: 120379,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A',\n value: '𝘼',\n codepoint: 120380,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B',\n value: '𝘽',\n codepoint: 120381,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C',\n value: '𝘾',\n codepoint: 120382,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D',\n value: '𝘿',\n codepoint: 120383,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E',\n value: '𝙀',\n codepoint: 120384,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F',\n value: '𝙁',\n codepoint: 120385,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G',\n value: '𝙂',\n codepoint: 120386,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H',\n value: '𝙃',\n codepoint: 120387,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I',\n value: '𝙄',\n codepoint: 120388,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J',\n value: '𝙅',\n codepoint: 120389,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K',\n value: '𝙆',\n codepoint: 120390,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L',\n value: '𝙇',\n codepoint: 120391,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M',\n value: '𝙈',\n codepoint: 120392,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N',\n value: '𝙉',\n codepoint: 120393,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O',\n value: '𝙊',\n codepoint: 120394,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P',\n value: '𝙋',\n codepoint: 120395,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q',\n value: '𝙌',\n codepoint: 120396,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R',\n value: '𝙍',\n codepoint: 120397,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S',\n value: '𝙎',\n codepoint: 120398,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T',\n value: '𝙏',\n codepoint: 120399,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U',\n value: '𝙐',\n codepoint: 120400,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V',\n value: '𝙑',\n codepoint: 120401,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W',\n value: '𝙒',\n codepoint: 120402,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X',\n value: '𝙓',\n codepoint: 120403,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y',\n value: '𝙔',\n codepoint: 120404,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z',\n value: '𝙕',\n codepoint: 120405,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A',\n value: '𝙖',\n codepoint: 120406,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B',\n value: '𝙗',\n codepoint: 120407,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C',\n value: '𝙘',\n codepoint: 120408,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D',\n value: '𝙙',\n codepoint: 120409,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E',\n value: '𝙚',\n codepoint: 120410,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F',\n value: '𝙛',\n codepoint: 120411,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G',\n value: '𝙜',\n codepoint: 120412,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H',\n value: '𝙝',\n codepoint: 120413,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I',\n value: '𝙞',\n codepoint: 120414,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J',\n value: '𝙟',\n codepoint: 120415,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K',\n value: '𝙠',\n codepoint: 120416,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L',\n value: '𝙡',\n codepoint: 120417,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M',\n value: '𝙢',\n codepoint: 120418,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N',\n value: '𝙣',\n codepoint: 120419,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O',\n value: '𝙤',\n codepoint: 120420,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P',\n value: '𝙥',\n codepoint: 120421,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q',\n value: '𝙦',\n codepoint: 120422,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R',\n value: '𝙧',\n codepoint: 120423,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S',\n value: '𝙨',\n codepoint: 120424,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T',\n value: '𝙩',\n codepoint: 120425,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U',\n value: '𝙪',\n codepoint: 120426,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V',\n value: '𝙫',\n codepoint: 120427,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W',\n value: '𝙬',\n codepoint: 120428,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X',\n value: '𝙭',\n codepoint: 120429,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y',\n value: '𝙮',\n codepoint: 120430,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z',\n value: '𝙯',\n codepoint: 120431,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL A',\n value: '𝙰',\n codepoint: 120432,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL B',\n value: '𝙱',\n codepoint: 120433,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL C',\n value: '𝙲',\n codepoint: 120434,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL D',\n value: '𝙳',\n codepoint: 120435,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL E',\n value: '𝙴',\n codepoint: 120436,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL F',\n value: '𝙵',\n codepoint: 120437,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL G',\n value: '𝙶',\n codepoint: 120438,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL H',\n value: '𝙷',\n codepoint: 120439,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL I',\n value: '𝙸',\n codepoint: 120440,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL J',\n value: '𝙹',\n codepoint: 120441,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL K',\n value: '𝙺',\n codepoint: 120442,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL L',\n value: '𝙻',\n codepoint: 120443,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL M',\n value: '𝙼',\n codepoint: 120444,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL N',\n value: '𝙽',\n codepoint: 120445,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL O',\n value: '𝙾',\n codepoint: 120446,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL P',\n value: '𝙿',\n codepoint: 120447,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL Q',\n value: '𝚀',\n codepoint: 120448,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL R',\n value: '𝚁',\n codepoint: 120449,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL S',\n value: '𝚂',\n codepoint: 120450,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL T',\n value: '𝚃',\n codepoint: 120451,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL U',\n value: '𝚄',\n codepoint: 120452,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL V',\n value: '𝚅',\n codepoint: 120453,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL W',\n value: '𝚆',\n codepoint: 120454,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL X',\n value: '𝚇',\n codepoint: 120455,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL Y',\n value: '𝚈',\n codepoint: 120456,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL Z',\n value: '𝚉',\n codepoint: 120457,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL A',\n value: '𝚊',\n codepoint: 120458,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL B',\n value: '𝚋',\n codepoint: 120459,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL C',\n value: '𝚌',\n codepoint: 120460,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL D',\n value: '𝚍',\n codepoint: 120461,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL E',\n value: '𝚎',\n codepoint: 120462,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL F',\n value: '𝚏',\n codepoint: 120463,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL G',\n value: '𝚐',\n codepoint: 120464,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL H',\n value: '𝚑',\n codepoint: 120465,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL I',\n value: '𝚒',\n codepoint: 120466,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL J',\n value: '𝚓',\n codepoint: 120467,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL K',\n value: '𝚔',\n codepoint: 120468,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL L',\n value: '𝚕',\n codepoint: 120469,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL M',\n value: '𝚖',\n codepoint: 120470,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL N',\n value: '𝚗',\n codepoint: 120471,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL O',\n value: '𝚘',\n codepoint: 120472,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL P',\n value: '𝚙',\n codepoint: 120473,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL Q',\n value: '𝚚',\n codepoint: 120474,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL R',\n value: '𝚛',\n codepoint: 120475,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL S',\n value: '𝚜',\n codepoint: 120476,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL T',\n value: '𝚝',\n codepoint: 120477,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL U',\n value: '𝚞',\n codepoint: 120478,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL V',\n value: '𝚟',\n codepoint: 120479,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL W',\n value: '𝚠',\n codepoint: 120480,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL X',\n value: '𝚡',\n codepoint: 120481,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL Y',\n value: '𝚢',\n codepoint: 120482,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL Z',\n value: '𝚣',\n codepoint: 120483,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL DOTLESS I',\n value: '𝚤',\n codepoint: 120484,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL DOTLESS J',\n value: '𝚥',\n codepoint: 120485,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL ALPHA',\n value: '𝚨',\n codepoint: 120488,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL BETA',\n value: '𝚩',\n codepoint: 120489,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL GAMMA',\n value: '𝚪',\n codepoint: 120490,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL DELTA',\n value: '𝚫',\n codepoint: 120491,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL EPSILON',\n value: '𝚬',\n codepoint: 120492,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL ZETA',\n value: '𝚭',\n codepoint: 120493,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL ETA',\n value: '𝚮',\n codepoint: 120494,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL THETA',\n value: '𝚯',\n codepoint: 120495,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL IOTA',\n value: '𝚰',\n codepoint: 120496,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL KAPPA',\n value: '𝚱',\n codepoint: 120497,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL LAMDA',\n value: '𝚲',\n codepoint: 120498,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL MU',\n value: '𝚳',\n codepoint: 120499,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL NU',\n value: '𝚴',\n codepoint: 120500,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL XI',\n value: '𝚵',\n codepoint: 120501,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL OMICRON',\n value: '𝚶',\n codepoint: 120502,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL PI',\n value: '𝚷',\n codepoint: 120503,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL RHO',\n value: '𝚸',\n codepoint: 120504,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL THETA SYMBOL',\n value: '𝚹',\n codepoint: 120505,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL SIGMA',\n value: '𝚺',\n codepoint: 120506,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL TAU',\n value: '𝚻',\n codepoint: 120507,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL UPSILON',\n value: '𝚼',\n codepoint: 120508,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL PHI',\n value: '𝚽',\n codepoint: 120509,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL CHI',\n value: '𝚾',\n codepoint: 120510,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL PSI',\n value: '𝚿',\n codepoint: 120511,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL OMEGA',\n value: '𝛀',\n codepoint: 120512,\n },\n {\n name: 'MATHEMATICAL BOLD NABLA',\n value: '𝛁',\n codepoint: 120513,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL ALPHA',\n value: '𝛂',\n codepoint: 120514,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL BETA',\n value: '𝛃',\n codepoint: 120515,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL GAMMA',\n value: '𝛄',\n codepoint: 120516,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL DELTA',\n value: '𝛅',\n codepoint: 120517,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL EPSILON',\n value: '𝛆',\n codepoint: 120518,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL ZETA',\n value: '𝛇',\n codepoint: 120519,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL ETA',\n value: '𝛈',\n codepoint: 120520,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL THETA',\n value: '𝛉',\n codepoint: 120521,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL IOTA',\n value: '𝛊',\n codepoint: 120522,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL KAPPA',\n value: '𝛋',\n codepoint: 120523,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL LAMDA',\n value: '𝛌',\n codepoint: 120524,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL MU',\n value: '𝛍',\n codepoint: 120525,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL NU',\n value: '𝛎',\n codepoint: 120526,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL XI',\n value: '𝛏',\n codepoint: 120527,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL OMICRON',\n value: '𝛐',\n codepoint: 120528,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL PI',\n value: '𝛑',\n codepoint: 120529,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL RHO',\n value: '𝛒',\n codepoint: 120530,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL FINAL SIGMA',\n value: '𝛓',\n codepoint: 120531,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL SIGMA',\n value: '𝛔',\n codepoint: 120532,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL TAU',\n value: '𝛕',\n codepoint: 120533,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL UPSILON',\n value: '𝛖',\n codepoint: 120534,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL PHI',\n value: '𝛗',\n codepoint: 120535,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL CHI',\n value: '𝛘',\n codepoint: 120536,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL PSI',\n value: '𝛙',\n codepoint: 120537,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL OMEGA',\n value: '𝛚',\n codepoint: 120538,\n },\n {\n name: 'MATHEMATICAL BOLD PARTIAL DIFFERENTIAL',\n value: '𝛛',\n codepoint: 120539,\n },\n {\n name: 'MATHEMATICAL BOLD EPSILON SYMBOL',\n value: '𝛜',\n codepoint: 120540,\n },\n {\n name: 'MATHEMATICAL BOLD THETA SYMBOL',\n value: '𝛝',\n codepoint: 120541,\n },\n {\n name: 'MATHEMATICAL BOLD KAPPA SYMBOL',\n value: '𝛞',\n codepoint: 120542,\n },\n {\n name: 'MATHEMATICAL BOLD PHI SYMBOL',\n value: '𝛟',\n codepoint: 120543,\n },\n {\n name: 'MATHEMATICAL BOLD RHO SYMBOL',\n value: '𝛠',\n codepoint: 120544,\n },\n {\n name: 'MATHEMATICAL BOLD PI SYMBOL',\n value: '𝛡',\n codepoint: 120545,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL ALPHA',\n value: '𝛢',\n codepoint: 120546,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL BETA',\n value: '𝛣',\n codepoint: 120547,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL GAMMA',\n value: '𝛤',\n codepoint: 120548,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL DELTA',\n value: '𝛥',\n codepoint: 120549,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL EPSILON',\n value: '𝛦',\n codepoint: 120550,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL ZETA',\n value: '𝛧',\n codepoint: 120551,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL ETA',\n value: '𝛨',\n codepoint: 120552,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL THETA',\n value: '𝛩',\n codepoint: 120553,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL IOTA',\n value: '𝛪',\n codepoint: 120554,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL KAPPA',\n value: '𝛫',\n codepoint: 120555,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL LAMDA',\n value: '𝛬',\n codepoint: 120556,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL MU',\n value: '𝛭',\n codepoint: 120557,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL NU',\n value: '𝛮',\n codepoint: 120558,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL XI',\n value: '𝛯',\n codepoint: 120559,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL OMICRON',\n value: '𝛰',\n codepoint: 120560,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL PI',\n value: '𝛱',\n codepoint: 120561,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL RHO',\n value: '𝛲',\n codepoint: 120562,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL THETA SYMBOL',\n value: '𝛳',\n codepoint: 120563,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL SIGMA',\n value: '𝛴',\n codepoint: 120564,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL TAU',\n value: '𝛵',\n codepoint: 120565,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL UPSILON',\n value: '𝛶',\n codepoint: 120566,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL PHI',\n value: '𝛷',\n codepoint: 120567,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL CHI',\n value: '𝛸',\n codepoint: 120568,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL PSI',\n value: '𝛹',\n codepoint: 120569,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL OMEGA',\n value: '𝛺',\n codepoint: 120570,\n },\n {\n name: 'MATHEMATICAL ITALIC NABLA',\n value: '𝛻',\n codepoint: 120571,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL ALPHA',\n value: '𝛼',\n codepoint: 120572,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL BETA',\n value: '𝛽',\n codepoint: 120573,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL GAMMA',\n value: '𝛾',\n codepoint: 120574,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL DELTA',\n value: '𝛿',\n codepoint: 120575,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL EPSILON',\n value: '𝜀',\n codepoint: 120576,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL ZETA',\n value: '𝜁',\n codepoint: 120577,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL ETA',\n value: '𝜂',\n codepoint: 120578,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL THETA',\n value: '𝜃',\n codepoint: 120579,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL IOTA',\n value: '𝜄',\n codepoint: 120580,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL KAPPA',\n value: '𝜅',\n codepoint: 120581,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL LAMDA',\n value: '𝜆',\n codepoint: 120582,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL MU',\n value: '𝜇',\n codepoint: 120583,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL NU',\n value: '𝜈',\n codepoint: 120584,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL XI',\n value: '𝜉',\n codepoint: 120585,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL OMICRON',\n value: '𝜊',\n codepoint: 120586,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL PI',\n value: '𝜋',\n codepoint: 120587,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL RHO',\n value: '𝜌',\n codepoint: 120588,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL FINAL SIGMA',\n value: '𝜍',\n codepoint: 120589,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL SIGMA',\n value: '𝜎',\n codepoint: 120590,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL TAU',\n value: '𝜏',\n codepoint: 120591,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL UPSILON',\n value: '𝜐',\n codepoint: 120592,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL PHI',\n value: '𝜑',\n codepoint: 120593,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL CHI',\n value: '𝜒',\n codepoint: 120594,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL PSI',\n value: '𝜓',\n codepoint: 120595,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL OMEGA',\n value: '𝜔',\n codepoint: 120596,\n },\n {\n name: 'MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL',\n value: '𝜕',\n codepoint: 120597,\n },\n {\n name: 'MATHEMATICAL ITALIC EPSILON SYMBOL',\n value: '𝜖',\n codepoint: 120598,\n },\n {\n name: 'MATHEMATICAL ITALIC THETA SYMBOL',\n value: '𝜗',\n codepoint: 120599,\n },\n {\n name: 'MATHEMATICAL ITALIC KAPPA SYMBOL',\n value: '𝜘',\n codepoint: 120600,\n },\n {\n name: 'MATHEMATICAL ITALIC PHI SYMBOL',\n value: '𝜙',\n codepoint: 120601,\n },\n {\n name: 'MATHEMATICAL ITALIC RHO SYMBOL',\n value: '𝜚',\n codepoint: 120602,\n },\n {\n name: 'MATHEMATICAL ITALIC PI SYMBOL',\n value: '𝜛',\n codepoint: 120603,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL ALPHA',\n value: '𝜜',\n codepoint: 120604,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL BETA',\n value: '𝜝',\n codepoint: 120605,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL GAMMA',\n value: '𝜞',\n codepoint: 120606,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL DELTA',\n value: '𝜟',\n codepoint: 120607,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL EPSILON',\n value: '𝜠',\n codepoint: 120608,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL ZETA',\n value: '𝜡',\n codepoint: 120609,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL ETA',\n value: '𝜢',\n codepoint: 120610,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL THETA',\n value: '𝜣',\n codepoint: 120611,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL IOTA',\n value: '𝜤',\n codepoint: 120612,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL KAPPA',\n value: '𝜥',\n codepoint: 120613,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL LAMDA',\n value: '𝜦',\n codepoint: 120614,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL MU',\n value: '𝜧',\n codepoint: 120615,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL NU',\n value: '𝜨',\n codepoint: 120616,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL XI',\n value: '𝜩',\n codepoint: 120617,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL OMICRON',\n value: '𝜪',\n codepoint: 120618,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL PI',\n value: '𝜫',\n codepoint: 120619,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL RHO',\n value: '𝜬',\n codepoint: 120620,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL',\n value: '𝜭',\n codepoint: 120621,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL SIGMA',\n value: '𝜮',\n codepoint: 120622,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL TAU',\n value: '𝜯',\n codepoint: 120623,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL UPSILON',\n value: '𝜰',\n codepoint: 120624,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL PHI',\n value: '𝜱',\n codepoint: 120625,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL CHI',\n value: '𝜲',\n codepoint: 120626,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL PSI',\n value: '𝜳',\n codepoint: 120627,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL OMEGA',\n value: '𝜴',\n codepoint: 120628,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC NABLA',\n value: '𝜵',\n codepoint: 120629,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL ALPHA',\n value: '𝜶',\n codepoint: 120630,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL BETA',\n value: '𝜷',\n codepoint: 120631,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL GAMMA',\n value: '𝜸',\n codepoint: 120632,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL DELTA',\n value: '𝜹',\n codepoint: 120633,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL EPSILON',\n value: '𝜺',\n codepoint: 120634,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL ZETA',\n value: '𝜻',\n codepoint: 120635,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL ETA',\n value: '𝜼',\n codepoint: 120636,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL THETA',\n value: '𝜽',\n codepoint: 120637,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL IOTA',\n value: '𝜾',\n codepoint: 120638,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL KAPPA',\n value: '𝜿',\n codepoint: 120639,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL LAMDA',\n value: '𝝀',\n codepoint: 120640,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL MU',\n value: '𝝁',\n codepoint: 120641,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL NU',\n value: '𝝂',\n codepoint: 120642,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL XI',\n value: '𝝃',\n codepoint: 120643,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL OMICRON',\n value: '𝝄',\n codepoint: 120644,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL PI',\n value: '𝝅',\n codepoint: 120645,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL RHO',\n value: '𝝆',\n codepoint: 120646,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA',\n value: '𝝇',\n codepoint: 120647,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL SIGMA',\n value: '𝝈',\n codepoint: 120648,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL TAU',\n value: '𝝉',\n codepoint: 120649,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL UPSILON',\n value: '𝝊',\n codepoint: 120650,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL PHI',\n value: '𝝋',\n codepoint: 120651,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL CHI',\n value: '𝝌',\n codepoint: 120652,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL PSI',\n value: '𝝍',\n codepoint: 120653,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL OMEGA',\n value: '𝝎',\n codepoint: 120654,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL',\n value: '𝝏',\n codepoint: 120655,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC EPSILON SYMBOL',\n value: '𝝐',\n codepoint: 120656,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC THETA SYMBOL',\n value: '𝝑',\n codepoint: 120657,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC KAPPA SYMBOL',\n value: '𝝒',\n codepoint: 120658,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC PHI SYMBOL',\n value: '𝝓',\n codepoint: 120659,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC RHO SYMBOL',\n value: '𝝔',\n codepoint: 120660,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC PI SYMBOL',\n value: '𝝕',\n codepoint: 120661,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA',\n value: '𝝖',\n codepoint: 120662,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA',\n value: '𝝗',\n codepoint: 120663,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA',\n value: '𝝘',\n codepoint: 120664,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA',\n value: '𝝙',\n codepoint: 120665,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON',\n value: '𝝚',\n codepoint: 120666,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA',\n value: '𝝛',\n codepoint: 120667,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA',\n value: '𝝜',\n codepoint: 120668,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA',\n value: '𝝝',\n codepoint: 120669,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA',\n value: '𝝞',\n codepoint: 120670,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA',\n value: '𝝟',\n codepoint: 120671,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA',\n value: '𝝠',\n codepoint: 120672,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL MU',\n value: '𝝡',\n codepoint: 120673,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL NU',\n value: '𝝢',\n codepoint: 120674,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL XI',\n value: '𝝣',\n codepoint: 120675,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON',\n value: '𝝤',\n codepoint: 120676,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL PI',\n value: '𝝥',\n codepoint: 120677,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO',\n value: '𝝦',\n codepoint: 120678,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL',\n value: '𝝧',\n codepoint: 120679,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA',\n value: '𝝨',\n codepoint: 120680,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU',\n value: '𝝩',\n codepoint: 120681,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON',\n value: '𝝪',\n codepoint: 120682,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI',\n value: '𝝫',\n codepoint: 120683,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI',\n value: '𝝬',\n codepoint: 120684,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI',\n value: '𝝭',\n codepoint: 120685,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA',\n value: '𝝮',\n codepoint: 120686,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD NABLA',\n value: '𝝯',\n codepoint: 120687,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA',\n value: '𝝰',\n codepoint: 120688,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL BETA',\n value: '𝝱',\n codepoint: 120689,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA',\n value: '𝝲',\n codepoint: 120690,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL DELTA',\n value: '𝝳',\n codepoint: 120691,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON',\n value: '𝝴',\n codepoint: 120692,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL ZETA',\n value: '𝝵',\n codepoint: 120693,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL ETA',\n value: '𝝶',\n codepoint: 120694,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL THETA',\n value: '𝝷',\n codepoint: 120695,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL IOTA',\n value: '𝝸',\n codepoint: 120696,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA',\n value: '𝝹',\n codepoint: 120697,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA',\n value: '𝝺',\n codepoint: 120698,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL MU',\n value: '𝝻',\n codepoint: 120699,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL NU',\n value: '𝝼',\n codepoint: 120700,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL XI',\n value: '𝝽',\n codepoint: 120701,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON',\n value: '𝝾',\n codepoint: 120702,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL PI',\n value: '𝝿',\n codepoint: 120703,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL RHO',\n value: '𝞀',\n codepoint: 120704,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA',\n value: '𝞁',\n codepoint: 120705,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA',\n value: '𝞂',\n codepoint: 120706,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL TAU',\n value: '𝞃',\n codepoint: 120707,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON',\n value: '𝞄',\n codepoint: 120708,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL PHI',\n value: '𝞅',\n codepoint: 120709,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL CHI',\n value: '𝞆',\n codepoint: 120710,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL PSI',\n value: '𝞇',\n codepoint: 120711,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA',\n value: '𝞈',\n codepoint: 120712,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL',\n value: '𝞉',\n codepoint: 120713,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL',\n value: '𝞊',\n codepoint: 120714,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL',\n value: '𝞋',\n codepoint: 120715,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL',\n value: '𝞌',\n codepoint: 120716,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL',\n value: '𝞍',\n codepoint: 120717,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL',\n value: '𝞎',\n codepoint: 120718,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD PI SYMBOL',\n value: '𝞏',\n codepoint: 120719,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA',\n value: '𝞐',\n codepoint: 120720,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA',\n value: '𝞑',\n codepoint: 120721,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA',\n value: '𝞒',\n codepoint: 120722,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA',\n value: '𝞓',\n codepoint: 120723,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON',\n value: '𝞔',\n codepoint: 120724,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA',\n value: '𝞕',\n codepoint: 120725,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA',\n value: '𝞖',\n codepoint: 120726,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA',\n value: '𝞗',\n codepoint: 120727,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA',\n value: '𝞘',\n codepoint: 120728,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA',\n value: '𝞙',\n codepoint: 120729,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA',\n value: '𝞚',\n codepoint: 120730,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU',\n value: '𝞛',\n codepoint: 120731,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU',\n value: '𝞜',\n codepoint: 120732,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI',\n value: '𝞝',\n codepoint: 120733,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON',\n value: '𝞞',\n codepoint: 120734,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI',\n value: '𝞟',\n codepoint: 120735,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO',\n value: '𝞠',\n codepoint: 120736,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL',\n value: '𝞡',\n codepoint: 120737,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA',\n value: '𝞢',\n codepoint: 120738,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU',\n value: '𝞣',\n codepoint: 120739,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON',\n value: '𝞤',\n codepoint: 120740,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI',\n value: '𝞥',\n codepoint: 120741,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI',\n value: '𝞦',\n codepoint: 120742,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI',\n value: '𝞧',\n codepoint: 120743,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA',\n value: '𝞨',\n codepoint: 120744,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA',\n value: '𝞩',\n codepoint: 120745,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA',\n value: '𝞪',\n codepoint: 120746,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA',\n value: '𝞫',\n codepoint: 120747,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA',\n value: '𝞬',\n codepoint: 120748,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA',\n value: '𝞭',\n codepoint: 120749,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON',\n value: '𝞮',\n codepoint: 120750,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA',\n value: '𝞯',\n codepoint: 120751,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA',\n value: '𝞰',\n codepoint: 120752,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA',\n value: '𝞱',\n codepoint: 120753,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA',\n value: '𝞲',\n codepoint: 120754,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA',\n value: '𝞳',\n codepoint: 120755,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA',\n value: '𝞴',\n codepoint: 120756,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU',\n value: '𝞵',\n codepoint: 120757,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU',\n value: '𝞶',\n codepoint: 120758,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI',\n value: '𝞷',\n codepoint: 120759,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON',\n value: '𝞸',\n codepoint: 120760,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI',\n value: '𝞹',\n codepoint: 120761,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO',\n value: '𝞺',\n codepoint: 120762,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA',\n value: '𝞻',\n codepoint: 120763,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA',\n value: '𝞼',\n codepoint: 120764,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU',\n value: '𝞽',\n codepoint: 120765,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON',\n value: '𝞾',\n codepoint: 120766,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI',\n value: '𝞿',\n codepoint: 120767,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI',\n value: '𝟀',\n codepoint: 120768,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI',\n value: '𝟁',\n codepoint: 120769,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA',\n value: '𝟂',\n codepoint: 120770,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL',\n value: '𝟃',\n codepoint: 120771,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL',\n value: '𝟄',\n codepoint: 120772,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL',\n value: '𝟅',\n codepoint: 120773,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL',\n value: '𝟆',\n codepoint: 120774,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL',\n value: '𝟇',\n codepoint: 120775,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL',\n value: '𝟈',\n codepoint: 120776,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL',\n value: '𝟉',\n codepoint: 120777,\n },\n {\n name: 'MATHEMATICAL BOLD DIGIT ZERO',\n value: '𝟎',\n codepoint: 120782,\n },\n {\n name: 'MATHEMATICAL BOLD DIGIT ONE',\n value: '𝟏',\n codepoint: 120783,\n },\n {\n name: 'MATHEMATICAL BOLD DIGIT TWO',\n value: '𝟐',\n codepoint: 120784,\n },\n {\n name: 'MATHEMATICAL BOLD DIGIT THREE',\n value: '𝟑',\n codepoint: 120785,\n },\n {\n name: 'MATHEMATICAL BOLD DIGIT FOUR',\n value: '𝟒',\n codepoint: 120786,\n },\n {\n name: 'MATHEMATICAL BOLD DIGIT FIVE',\n value: '𝟓',\n codepoint: 120787,\n },\n {\n name: 'MATHEMATICAL BOLD DIGIT SIX',\n value: '𝟔',\n codepoint: 120788,\n },\n {\n name: 'MATHEMATICAL BOLD DIGIT SEVEN',\n value: '𝟕',\n codepoint: 120789,\n },\n {\n name: 'MATHEMATICAL BOLD DIGIT EIGHT',\n value: '𝟖',\n codepoint: 120790,\n },\n {\n name: 'MATHEMATICAL BOLD DIGIT NINE',\n value: '𝟗',\n codepoint: 120791,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO',\n value: '𝟘',\n codepoint: 120792,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK DIGIT ONE',\n value: '𝟙',\n codepoint: 120793,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK DIGIT TWO',\n value: '𝟚',\n codepoint: 120794,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK DIGIT THREE',\n value: '𝟛',\n codepoint: 120795,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR',\n value: '𝟜',\n codepoint: 120796,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE',\n value: '𝟝',\n codepoint: 120797,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK DIGIT SIX',\n value: '𝟞',\n codepoint: 120798,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN',\n value: '𝟟',\n codepoint: 120799,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT',\n value: '𝟠',\n codepoint: 120800,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK DIGIT NINE',\n value: '𝟡',\n codepoint: 120801,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF DIGIT ZERO',\n value: '𝟢',\n codepoint: 120802,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF DIGIT ONE',\n value: '𝟣',\n codepoint: 120803,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF DIGIT TWO',\n value: '𝟤',\n codepoint: 120804,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF DIGIT THREE',\n value: '𝟥',\n codepoint: 120805,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF DIGIT FOUR',\n value: '𝟦',\n codepoint: 120806,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF DIGIT FIVE',\n value: '𝟧',\n codepoint: 120807,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF DIGIT SIX',\n value: '𝟨',\n codepoint: 120808,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF DIGIT SEVEN',\n value: '𝟩',\n codepoint: 120809,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF DIGIT EIGHT',\n value: '𝟪',\n codepoint: 120810,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF DIGIT NINE',\n value: '𝟫',\n codepoint: 120811,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO',\n value: '𝟬',\n codepoint: 120812,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD DIGIT ONE',\n value: '𝟭',\n codepoint: 120813,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD DIGIT TWO',\n value: '𝟮',\n codepoint: 120814,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD DIGIT THREE',\n value: '𝟯',\n codepoint: 120815,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR',\n value: '𝟰',\n codepoint: 120816,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE',\n value: '𝟱',\n codepoint: 120817,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD DIGIT SIX',\n value: '𝟲',\n codepoint: 120818,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN',\n value: '𝟳',\n codepoint: 120819,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT',\n value: '𝟴',\n codepoint: 120820,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD DIGIT NINE',\n value: '𝟵',\n codepoint: 120821,\n },\n {\n name: 'MATHEMATICAL MONOSPACE DIGIT ZERO',\n value: '𝟶',\n codepoint: 120822,\n },\n {\n name: 'MATHEMATICAL MONOSPACE DIGIT ONE',\n value: '𝟷',\n codepoint: 120823,\n },\n {\n name: 'MATHEMATICAL MONOSPACE DIGIT TWO',\n value: '𝟸',\n codepoint: 120824,\n },\n {\n name: 'MATHEMATICAL MONOSPACE DIGIT THREE',\n value: '𝟹',\n codepoint: 120825,\n },\n {\n name: 'MATHEMATICAL MONOSPACE DIGIT FOUR',\n value: '𝟺',\n codepoint: 120826,\n },\n {\n name: 'MATHEMATICAL MONOSPACE DIGIT FIVE',\n value: '𝟻',\n codepoint: 120827,\n },\n {\n name: 'MATHEMATICAL MONOSPACE DIGIT SIX',\n value: '𝟼',\n codepoint: 120828,\n },\n {\n name: 'MATHEMATICAL MONOSPACE DIGIT SEVEN',\n value: '𝟽',\n codepoint: 120829,\n },\n {\n name: 'MATHEMATICAL MONOSPACE DIGIT EIGHT',\n value: '𝟾',\n codepoint: 120830,\n },\n {\n name: 'MATHEMATICAL MONOSPACE DIGIT NINE',\n value: '𝟿',\n codepoint: 120831,\n },\n ],\n },\n {\n name: 'Punctuation',\n symbols: [\n {\n name: 'HYPHEN',\n value: '‐',\n codepoint: 8208,\n },\n {\n name: 'NON-BREAKING HYPHEN',\n value: '‑',\n codepoint: 8209,\n },\n {\n name: 'FIGURE DASH',\n value: '‒',\n codepoint: 8210,\n },\n {\n name: 'EN DASH',\n value: '–',\n codepoint: 8211,\n },\n {\n name: 'EM DASH',\n value: '—',\n codepoint: 8212,\n },\n {\n name: 'HORIZONTAL BAR',\n value: '―',\n codepoint: 8213,\n },\n {\n name: 'DOUBLE VERTICAL LINE',\n value: '‖',\n codepoint: 8214,\n },\n {\n name: 'DOUBLE LOW LINE',\n value: '‗',\n codepoint: 8215,\n },\n {\n name: 'LEFT SINGLE QUOTATION MARK',\n value: '‘',\n codepoint: 8216,\n },\n {\n name: 'RIGHT SINGLE QUOTATION MARK',\n value: '’',\n codepoint: 8217,\n },\n {\n name: 'SINGLE LOW-9 QUOTATION MARK',\n value: '‚',\n codepoint: 8218,\n },\n {\n name: 'SINGLE HIGH-REVERSED-9 QUOTATION MARK',\n value: '‛',\n codepoint: 8219,\n },\n {\n name: 'LEFT DOUBLE QUOTATION MARK',\n value: '“',\n codepoint: 8220,\n },\n {\n name: 'RIGHT DOUBLE QUOTATION MARK',\n value: '”',\n codepoint: 8221,\n },\n {\n name: 'DOUBLE LOW-9 QUOTATION MARK',\n value: '„',\n codepoint: 8222,\n },\n {\n name: 'DOUBLE HIGH-REVERSED-9 QUOTATION MARK',\n value: '‟',\n codepoint: 8223,\n },\n {\n name: 'DAGGER',\n value: '†',\n codepoint: 8224,\n },\n {\n name: 'DOUBLE DAGGER',\n value: '‡',\n codepoint: 8225,\n },\n {\n name: 'BULLET',\n value: '•',\n codepoint: 8226,\n },\n {\n name: 'TRIANGULAR BULLET',\n value: '‣',\n codepoint: 8227,\n },\n {\n name: 'ONE DOT LEADER',\n value: '․',\n codepoint: 8228,\n },\n {\n name: 'TWO DOT LEADER',\n value: '‥',\n codepoint: 8229,\n },\n {\n name: 'HORIZONTAL ELLIPSIS',\n value: '…',\n codepoint: 8230,\n },\n {\n name: 'HYPHENATION POINT',\n value: '‧',\n codepoint: 8231,\n },\n {\n name: 'NARROW NO-BREAK SPACE',\n value: ' ',\n codepoint: 8239,\n },\n {\n name: 'PER MILLE SIGN',\n value: '‰',\n codepoint: 8240,\n },\n {\n name: 'PER TEN THOUSAND SIGN',\n value: '‱',\n codepoint: 8241,\n },\n {\n name: 'PRIME',\n value: '′',\n codepoint: 8242,\n },\n {\n name: 'DOUBLE PRIME',\n value: '″',\n codepoint: 8243,\n },\n {\n name: 'TRIPLE PRIME',\n value: '‴',\n codepoint: 8244,\n },\n {\n name: 'REVERSED PRIME',\n value: '‵',\n codepoint: 8245,\n },\n {\n name: 'REVERSED DOUBLE PRIME',\n value: '‶',\n codepoint: 8246,\n },\n {\n name: 'REVERSED TRIPLE PRIME',\n value: '‷',\n codepoint: 8247,\n },\n {\n name: 'CARET',\n value: '‸',\n codepoint: 8248,\n },\n {\n name: 'SINGLE LEFT-POINTING ANGLE QUOTATION MARK',\n value: '‹',\n codepoint: 8249,\n },\n {\n name: 'SINGLE RIGHT-POINTING ANGLE QUOTATION MARK',\n value: '›',\n codepoint: 8250,\n },\n {\n name: 'REFERENCE MARK',\n value: '※',\n codepoint: 8251,\n },\n {\n name: 'INTERROBANG',\n value: '‽',\n codepoint: 8253,\n },\n {\n name: 'OVERLINE',\n value: '‾',\n codepoint: 8254,\n },\n {\n name: 'UNDERTIE',\n value: '‿',\n codepoint: 8255,\n },\n {\n name: 'CHARACTER TIE',\n value: '⁀',\n codepoint: 8256,\n },\n {\n name: 'CARET INSERTION POINT',\n value: '⁁',\n codepoint: 8257,\n },\n {\n name: 'ASTERISM',\n value: '⁂',\n codepoint: 8258,\n },\n {\n name: 'HYPHEN BULLET',\n value: '⁃',\n codepoint: 8259,\n },\n {\n name: 'FRACTION SLASH',\n value: '⁄',\n codepoint: 8260,\n },\n {\n name: 'LEFT SQUARE BRACKET WITH QUILL',\n value: '⁅',\n codepoint: 8261,\n },\n {\n name: 'RIGHT SQUARE BRACKET WITH QUILL',\n value: '⁆',\n codepoint: 8262,\n },\n {\n name: 'DOUBLE QUESTION MARK',\n value: '⁇',\n codepoint: 8263,\n },\n {\n name: 'QUESTION EXCLAMATION MARK',\n value: '⁈',\n codepoint: 8264,\n },\n {\n name: 'TIRONIAN SIGN ET',\n value: '⁊',\n codepoint: 8266,\n },\n {\n name: 'REVERSED PILCROW SIGN',\n value: '⁋',\n codepoint: 8267,\n },\n {\n name: 'BLACK LEFTWARDS BULLET',\n value: '⁌',\n codepoint: 8268,\n },\n {\n name: 'BLACK RIGHTWARDS BULLET',\n value: '⁍',\n codepoint: 8269,\n },\n {\n name: 'LOW ASTERISK',\n value: '⁎',\n codepoint: 8270,\n },\n {\n name: 'REVERSED SEMICOLON',\n value: '⁏',\n codepoint: 8271,\n },\n {\n name: 'CLOSE UP',\n value: '⁐',\n codepoint: 8272,\n },\n {\n name: 'TWO ASTERISKS ALIGNED VERTICALLY',\n value: '⁑',\n codepoint: 8273,\n },\n {\n name: 'COMMERCIAL MINUS SIGN',\n value: '⁒',\n codepoint: 8274,\n },\n {\n name: 'SWUNG DASH',\n value: '⁓',\n codepoint: 8275,\n },\n {\n name: 'INVERTED UNDERTIE',\n value: '⁔',\n codepoint: 8276,\n },\n {\n name: 'FLOWER PUNCTUATION MARK',\n value: '⁕',\n codepoint: 8277,\n },\n {\n name: 'THREE DOT PUNCTUATION',\n value: '⁖',\n codepoint: 8278,\n },\n {\n name: 'QUADRUPLE PRIME',\n value: '⁗',\n codepoint: 8279,\n },\n {\n name: 'FOUR DOT PUNCTUATION',\n value: '⁘',\n codepoint: 8280,\n },\n {\n name: 'FIVE DOT PUNCTUATION',\n value: '⁙',\n codepoint: 8281,\n },\n {\n name: 'TWO DOT PUNCTUATION',\n value: '⁚',\n codepoint: 8282,\n },\n {\n name: 'FOUR DOT MARK',\n value: '⁛',\n codepoint: 8283,\n },\n {\n name: 'DOTTED CROSS',\n value: '⁜',\n codepoint: 8284,\n },\n {\n name: 'TRICOLON',\n value: '⁝',\n codepoint: 8285,\n },\n {\n name: 'VERTICAL FOUR DOTS',\n value: '⁞',\n codepoint: 8286,\n },\n {\n name: 'MEDIUM MATHEMATICAL SPACE',\n value: ' ',\n codepoint: 8287,\n },\n {\n name: 'RIGHT ANGLE SUBSTITUTION MARKER',\n value: '⸀',\n codepoint: 11776,\n },\n {\n name: 'RIGHT ANGLE DOTTED SUBSTITUTION MARKER',\n value: '⸁',\n codepoint: 11777,\n },\n {\n name: 'LEFT SUBSTITUTION BRACKET',\n value: '⸂',\n codepoint: 11778,\n },\n {\n name: 'RIGHT SUBSTITUTION BRACKET',\n value: '⸃',\n codepoint: 11779,\n },\n {\n name: 'LEFT DOTTED SUBSTITUTION BRACKET',\n value: '⸄',\n codepoint: 11780,\n },\n {\n name: 'RIGHT DOTTED SUBSTITUTION BRACKET',\n value: '⸅',\n codepoint: 11781,\n },\n {\n name: 'RAISED INTERPOLATION MARKER',\n value: '⸆',\n codepoint: 11782,\n },\n {\n name: 'RAISED DOTTED INTERPOLATION MARKER',\n value: '⸇',\n codepoint: 11783,\n },\n {\n name: 'DOTTED TRANSPOSITION MARKER',\n value: '⸈',\n codepoint: 11784,\n },\n {\n name: 'LEFT TRANSPOSITION BRACKET',\n value: '⸉',\n codepoint: 11785,\n },\n {\n name: 'RIGHT TRANSPOSITION BRACKET',\n value: '⸊',\n codepoint: 11786,\n },\n {\n name: 'RAISED SQUARE',\n value: '⸋',\n codepoint: 11787,\n },\n {\n name: 'LEFT RAISED OMISSION BRACKET',\n value: '⸌',\n codepoint: 11788,\n },\n {\n name: 'RIGHT RAISED OMISSION BRACKET',\n value: '⸍',\n codepoint: 11789,\n },\n {\n name: 'EDITORIAL CORONIS',\n value: '⸎',\n codepoint: 11790,\n },\n {\n name: 'PARAGRAPHOS',\n value: '⸏',\n codepoint: 11791,\n },\n {\n name: 'FORKED PARAGRAPHOS',\n value: '⸐',\n codepoint: 11792,\n },\n {\n name: 'REVERSED FORKED PARAGRAPHOS',\n value: '⸑',\n codepoint: 11793,\n },\n {\n name: 'HYPODIASTOLE',\n value: '⸒',\n codepoint: 11794,\n },\n {\n name: 'DOTTED OBELOS',\n value: '⸓',\n codepoint: 11795,\n },\n {\n name: 'DOWNWARDS ANCORA',\n value: '⸔',\n codepoint: 11796,\n },\n {\n name: 'UPWARDS ANCORA',\n value: '⸕',\n codepoint: 11797,\n },\n {\n name: 'DOTTED RIGHT-POINTING ANGLE',\n value: '⸖',\n codepoint: 11798,\n },\n {\n name: 'DOUBLE OBLIQUE HYPHEN',\n value: '⸗',\n codepoint: 11799,\n },\n {\n name: 'INVERTED INTERROBANG',\n value: '⸘',\n codepoint: 11800,\n },\n {\n name: 'HYPHEN WITH DIAERESIS',\n value: '⸚',\n codepoint: 11802,\n },\n {\n name: 'TILDE WITH RING ABOVE',\n value: '⸛',\n codepoint: 11803,\n },\n {\n name: 'LEFT LOW PARAPHRASE BRACKET',\n value: '⸜',\n codepoint: 11804,\n },\n {\n name: 'RIGHT LOW PARAPHRASE BRACKET',\n value: '⸝',\n codepoint: 11805,\n },\n {\n name: 'TILDE WITH DOT ABOVE',\n value: '⸞',\n codepoint: 11806,\n },\n {\n name: 'TILDE WITH DOT BELOW',\n value: '⸟',\n codepoint: 11807,\n },\n {\n name: 'LEFT VERTICAL BAR WITH QUILL',\n value: '⸠',\n codepoint: 11808,\n },\n {\n name: 'RIGHT VERTICAL BAR WITH QUILL',\n value: '⸡',\n codepoint: 11809,\n },\n {\n name: 'TOP LEFT HALF BRACKET',\n value: '⸢',\n codepoint: 11810,\n },\n {\n name: 'TOP RIGHT HALF BRACKET',\n value: '⸣',\n codepoint: 11811,\n },\n {\n name: 'BOTTOM LEFT HALF BRACKET',\n value: '⸤',\n codepoint: 11812,\n },\n {\n name: 'BOTTOM RIGHT HALF BRACKET',\n value: '⸥',\n codepoint: 11813,\n },\n {\n name: 'LEFT SIDEWAYS U BRACKET',\n value: '⸦',\n codepoint: 11814,\n },\n {\n name: 'RIGHT SIDEWAYS U BRACKET',\n value: '⸧',\n codepoint: 11815,\n },\n {\n name: 'LEFT DOUBLE PARENTHESIS',\n value: '⸨',\n codepoint: 11816,\n },\n {\n name: 'RIGHT DOUBLE PARENTHESIS',\n value: '⸩',\n codepoint: 11817,\n },\n {\n name: 'TWO DOTS OVER ONE DOT PUNCTUATION',\n value: '⸪',\n codepoint: 11818,\n },\n {\n name: 'ONE DOT OVER TWO DOTS PUNCTUATION',\n value: '⸫',\n codepoint: 11819,\n },\n {\n name: 'SQUARED FOUR DOT PUNCTUATION',\n value: '⸬',\n codepoint: 11820,\n },\n {\n name: 'FIVE DOT MARK',\n value: '⸭',\n codepoint: 11821,\n },\n {\n name: 'REVERSED QUESTION MARK',\n value: '⸮',\n codepoint: 11822,\n },\n {\n name: 'VERTICAL TILDE',\n value: 'ⸯ',\n codepoint: 11823,\n },\n {\n name: 'RING POINT',\n value: '⸰',\n codepoint: 11824,\n },\n {\n name: 'WORD SEPARATOR MIDDLE DOT',\n value: '⸱',\n codepoint: 11825,\n },\n ],\n },\n {\n name: 'Technical',\n symbols: [\n {\n name: 'DIAMETER SIGN',\n value: '⌀',\n codepoint: 8960,\n },\n {\n name: 'ELECTRIC ARROW',\n value: '⌁',\n codepoint: 8961,\n },\n {\n name: 'HOUSE',\n value: '⌂',\n codepoint: 8962,\n },\n {\n name: 'UP ARROWHEAD',\n value: '⌃',\n codepoint: 8963,\n },\n {\n name: 'DOWN ARROWHEAD',\n value: '⌄',\n codepoint: 8964,\n },\n {\n name: 'PROJECTIVE',\n value: '⌅',\n codepoint: 8965,\n },\n {\n name: 'PERSPECTIVE',\n value: '⌆',\n codepoint: 8966,\n },\n {\n name: 'WAVY LINE',\n value: '⌇',\n codepoint: 8967,\n },\n {\n name: 'LEFT CEILING',\n value: '⌈',\n codepoint: 8968,\n },\n {\n name: 'RIGHT CEILING',\n value: '⌉',\n codepoint: 8969,\n },\n {\n name: 'LEFT FLOOR',\n value: '⌊',\n codepoint: 8970,\n },\n {\n name: 'RIGHT FLOOR',\n value: '⌋',\n codepoint: 8971,\n },\n {\n name: 'BOTTOM RIGHT CROP',\n value: '⌌',\n codepoint: 8972,\n },\n {\n name: 'BOTTOM LEFT CROP',\n value: '⌍',\n codepoint: 8973,\n },\n {\n name: 'TOP RIGHT CROP',\n value: '⌎',\n codepoint: 8974,\n },\n {\n name: 'TOP LEFT CROP',\n value: '⌏',\n codepoint: 8975,\n },\n {\n name: 'REVERSED NOT SIGN',\n value: '⌐',\n codepoint: 8976,\n },\n {\n name: 'SQUARE LOZENGE',\n value: '⌑',\n codepoint: 8977,\n },\n {\n name: 'ARC',\n value: '⌒',\n codepoint: 8978,\n },\n {\n name: 'SEGMENT',\n value: '⌓',\n codepoint: 8979,\n },\n {\n name: 'SECTOR',\n value: '⌔',\n codepoint: 8980,\n },\n {\n name: 'TELEPHONE RECORDER',\n value: '⌕',\n codepoint: 8981,\n },\n {\n name: 'POSITION INDICATOR',\n value: '⌖',\n codepoint: 8982,\n },\n {\n name: 'VIEWDATA SQUARE',\n value: '⌗',\n codepoint: 8983,\n },\n {\n name: 'PLACE OF INTEREST SIGN',\n value: '⌘',\n codepoint: 8984,\n },\n {\n name: 'TURNED NOT SIGN',\n value: '⌙',\n codepoint: 8985,\n },\n {\n name: 'TOP LEFT CORNER',\n value: '⌜',\n codepoint: 8988,\n },\n {\n name: 'TOP RIGHT CORNER',\n value: '⌝',\n codepoint: 8989,\n },\n {\n name: 'BOTTOM LEFT CORNER',\n value: '⌞',\n codepoint: 8990,\n },\n {\n name: 'BOTTOM RIGHT CORNER',\n value: '⌟',\n codepoint: 8991,\n },\n {\n name: 'TOP HALF INTEGRAL',\n value: '⌠',\n codepoint: 8992,\n },\n {\n name: 'BOTTOM HALF INTEGRAL',\n value: '⌡',\n codepoint: 8993,\n },\n {\n name: 'FROWN',\n value: '⌢',\n codepoint: 8994,\n },\n {\n name: 'SMILE',\n value: '⌣',\n codepoint: 8995,\n },\n {\n name: 'UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS',\n value: '⌤',\n codepoint: 8996,\n },\n {\n name: 'OPTION KEY',\n value: '⌥',\n codepoint: 8997,\n },\n {\n name: 'ERASE TO THE RIGHT',\n value: '⌦',\n codepoint: 8998,\n },\n {\n name: 'X IN A RECTANGLE BOX',\n value: '⌧',\n codepoint: 8999,\n },\n {\n name: 'LEFT-POINTING ANGLE BRACKET',\n value: '〈',\n codepoint: 9001,\n },\n {\n name: 'RIGHT-POINTING ANGLE BRACKET',\n value: '〉',\n codepoint: 9002,\n },\n {\n name: 'ERASE TO THE LEFT',\n value: '⌫',\n codepoint: 9003,\n },\n {\n name: 'BENZENE RING',\n value: '⌬',\n codepoint: 9004,\n },\n {\n name: 'CYLINDRICITY',\n value: '⌭',\n codepoint: 9005,\n },\n {\n name: 'ALL AROUND-PROFILE',\n value: '⌮',\n codepoint: 9006,\n },\n {\n name: 'SYMMETRY',\n value: '⌯',\n codepoint: 9007,\n },\n {\n name: 'TOTAL RUNOUT',\n value: '⌰',\n codepoint: 9008,\n },\n {\n name: 'DIMENSION ORIGIN',\n value: '⌱',\n codepoint: 9009,\n },\n {\n name: 'CONICAL TAPER',\n value: '⌲',\n codepoint: 9010,\n },\n {\n name: 'SLOPE',\n value: '⌳',\n codepoint: 9011,\n },\n {\n name: 'COUNTERBORE',\n value: '⌴',\n codepoint: 9012,\n },\n {\n name: 'COUNTERSINK',\n value: '⌵',\n codepoint: 9013,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL I-BEAM',\n value: '⌶',\n codepoint: 9014,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL SQUISH QUAD',\n value: '⌷',\n codepoint: 9015,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD EQUAL',\n value: '⌸',\n codepoint: 9016,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD DIVIDE',\n value: '⌹',\n codepoint: 9017,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD DIAMOND',\n value: '⌺',\n codepoint: 9018,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD JOT',\n value: '⌻',\n codepoint: 9019,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD CIRCLE',\n value: '⌼',\n codepoint: 9020,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL CIRCLE STILE',\n value: '⌽',\n codepoint: 9021,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL CIRCLE JOT',\n value: '⌾',\n codepoint: 9022,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL SLASH BAR',\n value: '⌿',\n codepoint: 9023,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL BACKSLASH BAR',\n value: '⍀',\n codepoint: 9024,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD SLASH',\n value: '⍁',\n codepoint: 9025,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD BACKSLASH',\n value: '⍂',\n codepoint: 9026,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD LESS-THAN',\n value: '⍃',\n codepoint: 9027,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD GREATER-THAN',\n value: '⍄',\n codepoint: 9028,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL LEFTWARDS VANE',\n value: '⍅',\n codepoint: 9029,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL RIGHTWARDS VANE',\n value: '⍆',\n codepoint: 9030,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW',\n value: '⍇',\n codepoint: 9031,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW',\n value: '⍈',\n codepoint: 9032,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH',\n value: '⍉',\n codepoint: 9033,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR',\n value: '⍊',\n codepoint: 9034,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL DELTA STILE',\n value: '⍋',\n codepoint: 9035,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD DOWN CARET',\n value: '⍌',\n codepoint: 9036,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD DELTA',\n value: '⍍',\n codepoint: 9037,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL DOWN TACK JOT',\n value: '⍎',\n codepoint: 9038,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL UPWARDS VANE',\n value: '⍏',\n codepoint: 9039,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW',\n value: '⍐',\n codepoint: 9040,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL UP TACK OVERBAR',\n value: '⍑',\n codepoint: 9041,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL DEL STILE',\n value: '⍒',\n codepoint: 9042,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD UP CARET',\n value: '⍓',\n codepoint: 9043,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD DEL',\n value: '⍔',\n codepoint: 9044,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL UP TACK JOT',\n value: '⍕',\n codepoint: 9045,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL DOWNWARDS VANE',\n value: '⍖',\n codepoint: 9046,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW',\n value: '⍗',\n codepoint: 9047,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUOTE UNDERBAR',\n value: '⍘',\n codepoint: 9048,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL DELTA UNDERBAR',\n value: '⍙',\n codepoint: 9049,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR',\n value: '⍚',\n codepoint: 9050,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL JOT UNDERBAR',\n value: '⍛',\n codepoint: 9051,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR',\n value: '⍜',\n codepoint: 9052,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL UP SHOE JOT',\n value: '⍝',\n codepoint: 9053,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUOTE QUAD',\n value: '⍞',\n codepoint: 9054,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL CIRCLE STAR',\n value: '⍟',\n codepoint: 9055,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD COLON',\n value: '⍠',\n codepoint: 9056,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL UP TACK DIAERESIS',\n value: '⍡',\n codepoint: 9057,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL DEL DIAERESIS',\n value: '⍢',\n codepoint: 9058,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL STAR DIAERESIS',\n value: '⍣',\n codepoint: 9059,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL JOT DIAERESIS',\n value: '⍤',\n codepoint: 9060,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS',\n value: '⍥',\n codepoint: 9061,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL DOWN SHOE STILE',\n value: '⍦',\n codepoint: 9062,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL LEFT SHOE STILE',\n value: '⍧',\n codepoint: 9063,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL TILDE DIAERESIS',\n value: '⍨',\n codepoint: 9064,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS',\n value: '⍩',\n codepoint: 9065,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL COMMA BAR',\n value: '⍪',\n codepoint: 9066,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL DEL TILDE',\n value: '⍫',\n codepoint: 9067,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL ZILDE',\n value: '⍬',\n codepoint: 9068,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL STILE TILDE',\n value: '⍭',\n codepoint: 9069,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR',\n value: '⍮',\n codepoint: 9070,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD NOT EQUAL',\n value: '⍯',\n codepoint: 9071,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD QUESTION',\n value: '⍰',\n codepoint: 9072,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL DOWN CARET TILDE',\n value: '⍱',\n codepoint: 9073,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL UP CARET TILDE',\n value: '⍲',\n codepoint: 9074,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL IOTA',\n value: '⍳',\n codepoint: 9075,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL RHO',\n value: '⍴',\n codepoint: 9076,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL OMEGA',\n value: '⍵',\n codepoint: 9077,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL ALPHA UNDERBAR',\n value: '⍶',\n codepoint: 9078,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL EPSILON UNDERBAR',\n value: '⍷',\n codepoint: 9079,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL IOTA UNDERBAR',\n value: '⍸',\n codepoint: 9080,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL OMEGA UNDERBAR',\n value: '⍹',\n codepoint: 9081,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL ALPHA',\n value: '⍺',\n codepoint: 9082,\n },\n {\n name: 'NOT CHECK MARK',\n value: '⍻',\n codepoint: 9083,\n },\n {\n name: 'RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW',\n value: '⍼',\n codepoint: 9084,\n },\n {\n name: 'SHOULDERED OPEN BOX',\n value: '⍽',\n codepoint: 9085,\n },\n {\n name: 'BELL SYMBOL',\n value: '⍾',\n codepoint: 9086,\n },\n {\n name: 'VERTICAL LINE WITH MIDDLE DOT',\n value: '⍿',\n codepoint: 9087,\n },\n {\n name: 'INSERTION SYMBOL',\n value: '⎀',\n codepoint: 9088,\n },\n {\n name: 'CONTINUOUS UNDERLINE SYMBOL',\n value: '⎁',\n codepoint: 9089,\n },\n {\n name: 'DISCONTINUOUS UNDERLINE SYMBOL',\n value: '⎂',\n codepoint: 9090,\n },\n {\n name: 'EMPHASIS SYMBOL',\n value: '⎃',\n codepoint: 9091,\n },\n {\n name: 'COMPOSITION SYMBOL',\n value: '⎄',\n codepoint: 9092,\n },\n {\n name: 'WHITE SQUARE WITH CENTRE VERTICAL LINE',\n value: '⎅',\n codepoint: 9093,\n },\n {\n name: 'ENTER SYMBOL',\n value: '⎆',\n codepoint: 9094,\n },\n {\n name: 'ALTERNATIVE KEY SYMBOL',\n value: '⎇',\n codepoint: 9095,\n },\n {\n name: 'HELM SYMBOL',\n value: '⎈',\n codepoint: 9096,\n },\n {\n name: 'CIRCLED HORIZONTAL BAR WITH NOTCH',\n value: '⎉',\n codepoint: 9097,\n },\n {\n name: 'CIRCLED TRIANGLE DOWN',\n value: '⎊',\n codepoint: 9098,\n },\n {\n name: 'BROKEN CIRCLE WITH NORTHWEST ARROW',\n value: '⎋',\n codepoint: 9099,\n },\n {\n name: 'UNDO SYMBOL',\n value: '⎌',\n codepoint: 9100,\n },\n {\n name: 'MONOSTABLE SYMBOL',\n value: '⎍',\n codepoint: 9101,\n },\n {\n name: 'HYSTERESIS SYMBOL',\n value: '⎎',\n codepoint: 9102,\n },\n {\n name: 'OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL',\n value: '⎏',\n codepoint: 9103,\n },\n {\n name: 'OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL',\n value: '⎐',\n codepoint: 9104,\n },\n {\n name: 'PASSIVE-PULL-DOWN-OUTPUT SYMBOL',\n value: '⎑',\n codepoint: 9105,\n },\n {\n name: 'PASSIVE-PULL-UP-OUTPUT SYMBOL',\n value: '⎒',\n codepoint: 9106,\n },\n {\n name: 'DIRECT CURRENT SYMBOL FORM TWO',\n value: '⎓',\n codepoint: 9107,\n },\n {\n name: 'SOFTWARE-FUNCTION SYMBOL',\n value: '⎔',\n codepoint: 9108,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD',\n value: '⎕',\n codepoint: 9109,\n },\n {\n name: 'DECIMAL SEPARATOR KEY SYMBOL',\n value: '⎖',\n codepoint: 9110,\n },\n {\n name: 'PREVIOUS PAGE',\n value: '⎗',\n codepoint: 9111,\n },\n {\n name: 'NEXT PAGE',\n value: '⎘',\n codepoint: 9112,\n },\n {\n name: 'PRINT SCREEN SYMBOL',\n value: '⎙',\n codepoint: 9113,\n },\n {\n name: 'CLEAR SCREEN SYMBOL',\n value: '⎚',\n codepoint: 9114,\n },\n {\n name: 'LEFT PARENTHESIS UPPER HOOK',\n value: '⎛',\n codepoint: 9115,\n },\n {\n name: 'LEFT PARENTHESIS EXTENSION',\n value: '⎜',\n codepoint: 9116,\n },\n {\n name: 'LEFT PARENTHESIS LOWER HOOK',\n value: '⎝',\n codepoint: 9117,\n },\n {\n name: 'RIGHT PARENTHESIS UPPER HOOK',\n value: '⎞',\n codepoint: 9118,\n },\n {\n name: 'RIGHT PARENTHESIS EXTENSION',\n value: '⎟',\n codepoint: 9119,\n },\n {\n name: 'RIGHT PARENTHESIS LOWER HOOK',\n value: '⎠',\n codepoint: 9120,\n },\n {\n name: 'LEFT SQUARE BRACKET UPPER CORNER',\n value: '⎡',\n codepoint: 9121,\n },\n {\n name: 'LEFT SQUARE BRACKET EXTENSION',\n value: '⎢',\n codepoint: 9122,\n },\n {\n name: 'LEFT SQUARE BRACKET LOWER CORNER',\n value: '⎣',\n codepoint: 9123,\n },\n {\n name: 'RIGHT SQUARE BRACKET UPPER CORNER',\n value: '⎤',\n codepoint: 9124,\n },\n {\n name: 'RIGHT SQUARE BRACKET EXTENSION',\n value: '⎥',\n codepoint: 9125,\n },\n {\n name: 'RIGHT SQUARE BRACKET LOWER CORNER',\n value: '⎦',\n codepoint: 9126,\n },\n {\n name: 'LEFT CURLY BRACKET UPPER HOOK',\n value: '⎧',\n codepoint: 9127,\n },\n {\n name: 'LEFT CURLY BRACKET MIDDLE PIECE',\n value: '⎨',\n codepoint: 9128,\n },\n {\n name: 'LEFT CURLY BRACKET LOWER HOOK',\n value: '⎩',\n codepoint: 9129,\n },\n {\n name: 'CURLY BRACKET EXTENSION',\n value: '⎪',\n codepoint: 9130,\n },\n {\n name: 'RIGHT CURLY BRACKET UPPER HOOK',\n value: '⎫',\n codepoint: 9131,\n },\n {\n name: 'RIGHT CURLY BRACKET MIDDLE PIECE',\n value: '⎬',\n codepoint: 9132,\n },\n {\n name: 'RIGHT CURLY BRACKET LOWER HOOK',\n value: '⎭',\n codepoint: 9133,\n },\n {\n name: 'INTEGRAL EXTENSION',\n value: '⎮',\n codepoint: 9134,\n },\n {\n name: 'HORIZONTAL LINE EXTENSION',\n value: '⎯',\n codepoint: 9135,\n },\n {\n name: 'UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION',\n value: '⎰',\n codepoint: 9136,\n },\n {\n name: 'UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION',\n value: '⎱',\n codepoint: 9137,\n },\n {\n name: 'SUMMATION TOP',\n value: '⎲',\n codepoint: 9138,\n },\n {\n name: 'SUMMATION BOTTOM',\n value: '⎳',\n codepoint: 9139,\n },\n {\n name: 'TOP SQUARE BRACKET',\n value: '⎴',\n codepoint: 9140,\n },\n {\n name: 'BOTTOM SQUARE BRACKET',\n value: '⎵',\n codepoint: 9141,\n },\n {\n name: 'BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET',\n value: '⎶',\n codepoint: 9142,\n },\n {\n name: 'RADICAL SYMBOL BOTTOM',\n value: '⎷',\n codepoint: 9143,\n },\n {\n name: 'LEFT VERTICAL BOX LINE',\n value: '⎸',\n codepoint: 9144,\n },\n {\n name: 'RIGHT VERTICAL BOX LINE',\n value: '⎹',\n codepoint: 9145,\n },\n {\n name: 'HORIZONTAL SCAN LINE-1',\n value: '⎺',\n codepoint: 9146,\n },\n {\n name: 'HORIZONTAL SCAN LINE-3',\n value: '⎻',\n codepoint: 9147,\n },\n {\n name: 'HORIZONTAL SCAN LINE-7',\n value: '⎼',\n codepoint: 9148,\n },\n {\n name: 'HORIZONTAL SCAN LINE-9',\n value: '⎽',\n codepoint: 9149,\n },\n {\n name: 'DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT',\n value: '⎾',\n codepoint: 9150,\n },\n {\n name: 'DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT',\n value: '⎿',\n codepoint: 9151,\n },\n {\n name: 'DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE',\n value: '⏀',\n codepoint: 9152,\n },\n {\n name: 'DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE',\n value: '⏁',\n codepoint: 9153,\n },\n {\n name: 'DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE',\n value: '⏂',\n codepoint: 9154,\n },\n {\n name: 'DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE',\n value: '⏃',\n codepoint: 9155,\n },\n {\n name: 'DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE',\n value: '⏄',\n codepoint: 9156,\n },\n {\n name: 'DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE',\n value: '⏅',\n codepoint: 9157,\n },\n {\n name: 'DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE',\n value: '⏆',\n codepoint: 9158,\n },\n {\n name: 'DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE',\n value: '⏇',\n codepoint: 9159,\n },\n {\n name: 'DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE',\n value: '⏈',\n codepoint: 9160,\n },\n {\n name: 'DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL',\n value: '⏉',\n codepoint: 9161,\n },\n {\n name: 'DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL',\n value: '⏊',\n codepoint: 9162,\n },\n {\n name: 'DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT',\n value: '⏋',\n codepoint: 9163,\n },\n {\n name: 'DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT',\n value: '⏌',\n codepoint: 9164,\n },\n {\n name: 'SQUARE FOOT',\n value: '⏍',\n codepoint: 9165,\n },\n {\n name: 'RETURN SYMBOL',\n value: '⏎',\n codepoint: 9166,\n },\n {\n name: 'VERTICAL LINE EXTENSION',\n value: '⏐',\n codepoint: 9168,\n },\n {\n name: 'METRICAL BREVE',\n value: '⏑',\n codepoint: 9169,\n },\n {\n name: 'METRICAL LONG OVER SHORT',\n value: '⏒',\n codepoint: 9170,\n },\n {\n name: 'METRICAL SHORT OVER LONG',\n value: '⏓',\n codepoint: 9171,\n },\n {\n name: 'METRICAL LONG OVER TWO SHORTS',\n value: '⏔',\n codepoint: 9172,\n },\n {\n name: 'METRICAL TWO SHORTS OVER LONG',\n value: '⏕',\n codepoint: 9173,\n },\n {\n name: 'METRICAL TWO SHORTS JOINED',\n value: '⏖',\n codepoint: 9174,\n },\n {\n name: 'METRICAL TRISEME',\n value: '⏗',\n codepoint: 9175,\n },\n {\n name: 'METRICAL TETRASEME',\n value: '⏘',\n codepoint: 9176,\n },\n {\n name: 'METRICAL PENTASEME',\n value: '⏙',\n codepoint: 9177,\n },\n {\n name: 'EARTH GROUND',\n value: '⏚',\n codepoint: 9178,\n },\n {\n name: 'FUSE',\n value: '⏛',\n codepoint: 9179,\n },\n {\n name: 'TOP PARENTHESIS',\n value: '⏜',\n codepoint: 9180,\n },\n {\n name: 'BOTTOM PARENTHESIS',\n value: '⏝',\n codepoint: 9181,\n },\n {\n name: 'TOP CURLY BRACKET',\n value: '⏞',\n codepoint: 9182,\n },\n {\n name: 'BOTTOM CURLY BRACKET',\n value: '⏟',\n codepoint: 9183,\n },\n {\n name: 'TOP TORTOISE SHELL BRACKET',\n value: '⏠',\n codepoint: 9184,\n },\n {\n name: 'BOTTOM TORTOISE SHELL BRACKET',\n value: '⏡',\n codepoint: 9185,\n },\n {\n name: 'WHITE TRAPEZIUM',\n value: '⏢',\n codepoint: 9186,\n },\n {\n name: 'BENZENE RING WITH CIRCLE',\n value: '⏣',\n codepoint: 9187,\n },\n {\n name: 'STRAIGHTNESS',\n value: '⏤',\n codepoint: 9188,\n },\n {\n name: 'FLATNESS',\n value: '⏥',\n codepoint: 9189,\n },\n {\n name: 'AC CURRENT',\n value: '⏦',\n codepoint: 9190,\n },\n {\n name: 'ELECTRICAL INTERSECTION',\n value: '⏧',\n codepoint: 9191,\n },\n ],\n },\n {\n name: 'Arrows',\n symbols: [\n {\n name: 'UPWARDS QUADRUPLE ARROW',\n value: '⟰',\n codepoint: 10224,\n },\n {\n name: 'DOWNWARDS QUADRUPLE ARROW',\n value: '⟱',\n codepoint: 10225,\n },\n {\n name: 'ANTICLOCKWISE GAPPED CIRCLE ARROW',\n value: '⟲',\n codepoint: 10226,\n },\n {\n name: 'CLOCKWISE GAPPED CIRCLE ARROW',\n value: '⟳',\n codepoint: 10227,\n },\n {\n name: 'RIGHT ARROW WITH CIRCLED PLUS',\n value: '⟴',\n codepoint: 10228,\n },\n {\n name: 'LONG LEFTWARDS ARROW',\n value: '⟵',\n codepoint: 10229,\n },\n {\n name: 'LONG RIGHTWARDS ARROW',\n value: '⟶',\n codepoint: 10230,\n },\n {\n name: 'LONG LEFT RIGHT ARROW',\n value: '⟷',\n codepoint: 10231,\n },\n {\n name: 'LONG LEFTWARDS DOUBLE ARROW',\n value: '⟸',\n codepoint: 10232,\n },\n {\n name: 'LONG RIGHTWARDS DOUBLE ARROW',\n value: '⟹',\n codepoint: 10233,\n },\n {\n name: 'LONG LEFT RIGHT DOUBLE ARROW',\n value: '⟺',\n codepoint: 10234,\n },\n {\n name: 'LONG LEFTWARDS ARROW FROM BAR',\n value: '⟻',\n codepoint: 10235,\n },\n {\n name: 'LONG RIGHTWARDS ARROW FROM BAR',\n value: '⟼',\n codepoint: 10236,\n },\n {\n name: 'LONG LEFTWARDS DOUBLE ARROW FROM BAR',\n value: '⟽',\n codepoint: 10237,\n },\n {\n name: 'LONG RIGHTWARDS DOUBLE ARROW FROM BAR',\n value: '⟾',\n codepoint: 10238,\n },\n {\n name: 'LONG RIGHTWARDS SQUIGGLE ARROW',\n value: '⟿',\n codepoint: 10239,\n },\n {\n name: 'RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE',\n value: '⤀',\n codepoint: 10496,\n },\n {\n name: 'RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE',\n value: '⤁',\n codepoint: 10497,\n },\n {\n name: 'LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE',\n value: '⤂',\n codepoint: 10498,\n },\n {\n name: 'RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE',\n value: '⤃',\n codepoint: 10499,\n },\n {\n name: 'LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE',\n value: '⤄',\n codepoint: 10500,\n },\n {\n name: 'RIGHTWARDS TWO-HEADED ARROW FROM BAR',\n value: '⤅',\n codepoint: 10501,\n },\n {\n name: 'LEFTWARDS DOUBLE ARROW FROM BAR',\n value: '⤆',\n codepoint: 10502,\n },\n {\n name: 'RIGHTWARDS DOUBLE ARROW FROM BAR',\n value: '⤇',\n codepoint: 10503,\n },\n {\n name: 'DOWNWARDS ARROW WITH HORIZONTAL STROKE',\n value: '⤈',\n codepoint: 10504,\n },\n {\n name: 'UPWARDS ARROW WITH HORIZONTAL STROKE',\n value: '⤉',\n codepoint: 10505,\n },\n {\n name: 'UPWARDS TRIPLE ARROW',\n value: '⤊',\n codepoint: 10506,\n },\n {\n name: 'DOWNWARDS TRIPLE ARROW',\n value: '⤋',\n codepoint: 10507,\n },\n {\n name: 'LEFTWARDS DOUBLE DASH ARROW',\n value: '⤌',\n codepoint: 10508,\n },\n {\n name: 'RIGHTWARDS DOUBLE DASH ARROW',\n value: '⤍',\n codepoint: 10509,\n },\n {\n name: 'LEFTWARDS TRIPLE DASH ARROW',\n value: '⤎',\n codepoint: 10510,\n },\n {\n name: 'RIGHTWARDS TRIPLE DASH ARROW',\n value: '⤏',\n codepoint: 10511,\n },\n {\n name: 'RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW',\n value: '⤐',\n codepoint: 10512,\n },\n {\n name: 'RIGHTWARDS ARROW WITH DOTTED STEM',\n value: '⤑',\n codepoint: 10513,\n },\n {\n name: 'UPWARDS ARROW TO BAR',\n value: '⤒',\n codepoint: 10514,\n },\n {\n name: 'DOWNWARDS ARROW TO BAR',\n value: '⤓',\n codepoint: 10515,\n },\n {\n name: 'RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE',\n value: '⤔',\n codepoint: 10516,\n },\n {\n name: 'RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE',\n value: '⤕',\n codepoint: 10517,\n },\n {\n name: 'RIGHTWARDS TWO-HEADED ARROW WITH TAIL',\n value: '⤖',\n codepoint: 10518,\n },\n {\n name: 'RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE',\n value: '⤗',\n codepoint: 10519,\n },\n {\n name: 'RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE',\n value: '⤘',\n codepoint: 10520,\n },\n {\n name: 'LEFTWARDS ARROW-TAIL',\n value: '⤙',\n codepoint: 10521,\n },\n {\n name: 'RIGHTWARDS ARROW-TAIL',\n value: '⤚',\n codepoint: 10522,\n },\n {\n name: 'LEFTWARDS DOUBLE ARROW-TAIL',\n value: '⤛',\n codepoint: 10523,\n },\n {\n name: 'RIGHTWARDS DOUBLE ARROW-TAIL',\n value: '⤜',\n codepoint: 10524,\n },\n {\n name: 'LEFTWARDS ARROW TO BLACK DIAMOND',\n value: '⤝',\n codepoint: 10525,\n },\n {\n name: 'RIGHTWARDS ARROW TO BLACK DIAMOND',\n value: '⤞',\n codepoint: 10526,\n },\n {\n name: 'LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND',\n value: '⤟',\n codepoint: 10527,\n },\n {\n name: 'RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND',\n value: '⤠',\n codepoint: 10528,\n },\n {\n name: 'NORTH WEST AND SOUTH EAST ARROW',\n value: '⤡',\n codepoint: 10529,\n },\n {\n name: 'NORTH EAST AND SOUTH WEST ARROW',\n value: '⤢',\n codepoint: 10530,\n },\n {\n name: 'NORTH WEST ARROW WITH HOOK',\n value: '⤣',\n codepoint: 10531,\n },\n {\n name: 'NORTH EAST ARROW WITH HOOK',\n value: '⤤',\n codepoint: 10532,\n },\n {\n name: 'SOUTH EAST ARROW WITH HOOK',\n value: '⤥',\n codepoint: 10533,\n },\n {\n name: 'SOUTH WEST ARROW WITH HOOK',\n value: '⤦',\n codepoint: 10534,\n },\n {\n name: 'NORTH WEST ARROW AND NORTH EAST ARROW',\n value: '⤧',\n codepoint: 10535,\n },\n {\n name: 'NORTH EAST ARROW AND SOUTH EAST ARROW',\n value: '⤨',\n codepoint: 10536,\n },\n {\n name: 'SOUTH EAST ARROW AND SOUTH WEST ARROW',\n value: '⤩',\n codepoint: 10537,\n },\n {\n name: 'SOUTH WEST ARROW AND NORTH WEST ARROW',\n value: '⤪',\n codepoint: 10538,\n },\n {\n name: 'RISING DIAGONAL CROSSING FALLING DIAGONAL',\n value: '⤫',\n codepoint: 10539,\n },\n {\n name: 'FALLING DIAGONAL CROSSING RISING DIAGONAL',\n value: '⤬',\n codepoint: 10540,\n },\n {\n name: 'SOUTH EAST ARROW CROSSING NORTH EAST ARROW',\n value: '⤭',\n codepoint: 10541,\n },\n {\n name: 'NORTH EAST ARROW CROSSING SOUTH EAST ARROW',\n value: '⤮',\n codepoint: 10542,\n },\n {\n name: 'FALLING DIAGONAL CROSSING NORTH EAST ARROW',\n value: '⤯',\n codepoint: 10543,\n },\n {\n name: 'RISING DIAGONAL CROSSING SOUTH EAST ARROW',\n value: '⤰',\n codepoint: 10544,\n },\n {\n name: 'NORTH EAST ARROW CROSSING NORTH WEST ARROW',\n value: '⤱',\n codepoint: 10545,\n },\n {\n name: 'NORTH WEST ARROW CROSSING NORTH EAST ARROW',\n value: '⤲',\n codepoint: 10546,\n },\n {\n name: 'WAVE ARROW POINTING DIRECTLY RIGHT',\n value: '⤳',\n codepoint: 10547,\n },\n {\n name: 'ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS',\n value: '⤶',\n codepoint: 10550,\n },\n {\n name: 'ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS',\n value: '⤷',\n codepoint: 10551,\n },\n {\n name: 'RIGHT-SIDE ARC CLOCKWISE ARROW',\n value: '⤸',\n codepoint: 10552,\n },\n {\n name: 'LEFT-SIDE ARC ANTICLOCKWISE ARROW',\n value: '⤹',\n codepoint: 10553,\n },\n {\n name: 'TOP ARC ANTICLOCKWISE ARROW',\n value: '⤺',\n codepoint: 10554,\n },\n {\n name: 'BOTTOM ARC ANTICLOCKWISE ARROW',\n value: '⤻',\n codepoint: 10555,\n },\n {\n name: 'TOP ARC CLOCKWISE ARROW WITH MINUS',\n value: '⤼',\n codepoint: 10556,\n },\n {\n name: 'TOP ARC ANTICLOCKWISE ARROW WITH PLUS',\n value: '⤽',\n codepoint: 10557,\n },\n {\n name: 'LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW',\n value: '⤾',\n codepoint: 10558,\n },\n {\n name: 'LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW',\n value: '⤿',\n codepoint: 10559,\n },\n {\n name: 'ANTICLOCKWISE CLOSED CIRCLE ARROW',\n value: '⥀',\n codepoint: 10560,\n },\n {\n name: 'CLOCKWISE CLOSED CIRCLE ARROW',\n value: '⥁',\n codepoint: 10561,\n },\n {\n name: 'RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW',\n value: '⥂',\n codepoint: 10562,\n },\n {\n name: 'LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW',\n value: '⥃',\n codepoint: 10563,\n },\n {\n name: 'SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW',\n value: '⥄',\n codepoint: 10564,\n },\n {\n name: 'RIGHTWARDS ARROW WITH PLUS BELOW',\n value: '⥅',\n codepoint: 10565,\n },\n {\n name: 'LEFTWARDS ARROW WITH PLUS BELOW',\n value: '⥆',\n codepoint: 10566,\n },\n {\n name: 'RIGHTWARDS ARROW THROUGH X',\n value: '⥇',\n codepoint: 10567,\n },\n {\n name: 'LEFT RIGHT ARROW THROUGH SMALL CIRCLE',\n value: '⥈',\n codepoint: 10568,\n },\n {\n name: 'UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE',\n value: '⥉',\n codepoint: 10569,\n },\n {\n name: 'LEFT BARB UP RIGHT BARB DOWN HARPOON',\n value: '⥊',\n codepoint: 10570,\n },\n {\n name: 'LEFT BARB DOWN RIGHT BARB UP HARPOON',\n value: '⥋',\n codepoint: 10571,\n },\n {\n name: 'UP BARB RIGHT DOWN BARB LEFT HARPOON',\n value: '⥌',\n codepoint: 10572,\n },\n {\n name: 'UP BARB LEFT DOWN BARB RIGHT HARPOON',\n value: '⥍',\n codepoint: 10573,\n },\n {\n name: 'LEFT BARB UP RIGHT BARB UP HARPOON',\n value: '⥎',\n codepoint: 10574,\n },\n {\n name: 'UP BARB RIGHT DOWN BARB RIGHT HARPOON',\n value: '⥏',\n codepoint: 10575,\n },\n {\n name: 'LEFT BARB DOWN RIGHT BARB DOWN HARPOON',\n value: '⥐',\n codepoint: 10576,\n },\n {\n name: 'UP BARB LEFT DOWN BARB LEFT HARPOON',\n value: '⥑',\n codepoint: 10577,\n },\n {\n name: 'LEFTWARDS HARPOON WITH BARB UP TO BAR',\n value: '⥒',\n codepoint: 10578,\n },\n {\n name: 'RIGHTWARDS HARPOON WITH BARB UP TO BAR',\n value: '⥓',\n codepoint: 10579,\n },\n {\n name: 'UPWARDS HARPOON WITH BARB RIGHT TO BAR',\n value: '⥔',\n codepoint: 10580,\n },\n {\n name: 'DOWNWARDS HARPOON WITH BARB RIGHT TO BAR',\n value: '⥕',\n codepoint: 10581,\n },\n {\n name: 'LEFTWARDS HARPOON WITH BARB DOWN TO BAR',\n value: '⥖',\n codepoint: 10582,\n },\n {\n name: 'RIGHTWARDS HARPOON WITH BARB DOWN TO BAR',\n value: '⥗',\n codepoint: 10583,\n },\n {\n name: 'UPWARDS HARPOON WITH BARB LEFT TO BAR',\n value: '⥘',\n codepoint: 10584,\n },\n {\n name: 'DOWNWARDS HARPOON WITH BARB LEFT TO BAR',\n value: '⥙',\n codepoint: 10585,\n },\n {\n name: 'LEFTWARDS HARPOON WITH BARB UP FROM BAR',\n value: '⥚',\n codepoint: 10586,\n },\n {\n name: 'RIGHTWARDS HARPOON WITH BARB UP FROM BAR',\n value: '⥛',\n codepoint: 10587,\n },\n {\n name: 'UPWARDS HARPOON WITH BARB RIGHT FROM BAR',\n value: '⥜',\n codepoint: 10588,\n },\n {\n name: 'DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR',\n value: '⥝',\n codepoint: 10589,\n },\n {\n name: 'LEFTWARDS HARPOON WITH BARB DOWN FROM BAR',\n value: '⥞',\n codepoint: 10590,\n },\n {\n name: 'RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR',\n value: '⥟',\n codepoint: 10591,\n },\n {\n name: 'UPWARDS HARPOON WITH BARB LEFT FROM BAR',\n value: '⥠',\n codepoint: 10592,\n },\n {\n name: 'DOWNWARDS HARPOON WITH BARB LEFT FROM BAR',\n value: '⥡',\n codepoint: 10593,\n },\n {\n name: 'LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN',\n value: '⥢',\n codepoint: 10594,\n },\n {\n name: 'UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT',\n value: '⥣',\n codepoint: 10595,\n },\n {\n name: 'RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN',\n value: '⥤',\n codepoint: 10596,\n },\n {\n name: 'DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT',\n value: '⥥',\n codepoint: 10597,\n },\n {\n name: 'LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP',\n value: '⥦',\n codepoint: 10598,\n },\n {\n name: 'LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN',\n value: '⥧',\n codepoint: 10599,\n },\n {\n name: 'RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP',\n value: '⥨',\n codepoint: 10600,\n },\n {\n name: 'RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN',\n value: '⥩',\n codepoint: 10601,\n },\n {\n name: 'LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH',\n value: '⥪',\n codepoint: 10602,\n },\n {\n name: 'LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH',\n value: '⥫',\n codepoint: 10603,\n },\n {\n name: 'RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH',\n value: '⥬',\n codepoint: 10604,\n },\n {\n name: 'RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH',\n value: '⥭',\n codepoint: 10605,\n },\n {\n name: 'UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT',\n value: '⥮',\n codepoint: 10606,\n },\n {\n name: 'DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT',\n value: '⥯',\n codepoint: 10607,\n },\n {\n name: 'RIGHT DOUBLE ARROW WITH ROUNDED HEAD',\n value: '⥰',\n codepoint: 10608,\n },\n {\n name: 'EQUALS SIGN ABOVE RIGHTWARDS ARROW',\n value: '⥱',\n codepoint: 10609,\n },\n {\n name: 'TILDE OPERATOR ABOVE RIGHTWARDS ARROW',\n value: '⥲',\n codepoint: 10610,\n },\n {\n name: 'LEFTWARDS ARROW ABOVE TILDE OPERATOR',\n value: '⥳',\n codepoint: 10611,\n },\n {\n name: 'RIGHTWARDS ARROW ABOVE TILDE OPERATOR',\n value: '⥴',\n codepoint: 10612,\n },\n {\n name: 'RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO',\n value: '⥵',\n codepoint: 10613,\n },\n {\n name: 'LESS-THAN ABOVE LEFTWARDS ARROW',\n value: '⥶',\n codepoint: 10614,\n },\n {\n name: 'LEFTWARDS ARROW THROUGH LESS-THAN',\n value: '⥷',\n codepoint: 10615,\n },\n {\n name: 'GREATER-THAN ABOVE RIGHTWARDS ARROW',\n value: '⥸',\n codepoint: 10616,\n },\n {\n name: 'SUBSET ABOVE RIGHTWARDS ARROW',\n value: '⥹',\n codepoint: 10617,\n },\n {\n name: 'LEFTWARDS ARROW THROUGH SUBSET',\n value: '⥺',\n codepoint: 10618,\n },\n {\n name: 'SUPERSET ABOVE LEFTWARDS ARROW',\n value: '⥻',\n codepoint: 10619,\n },\n {\n name: 'LEFT FISH TAIL',\n value: '⥼',\n codepoint: 10620,\n },\n {\n name: 'RIGHT FISH TAIL',\n value: '⥽',\n codepoint: 10621,\n },\n {\n name: 'UP FISH TAIL',\n value: '⥾',\n codepoint: 10622,\n },\n {\n name: 'DOWN FISH TAIL',\n value: '⥿',\n codepoint: 10623,\n },\n {\n name: 'NORTH EAST WHITE ARROW',\n value: '⬀',\n codepoint: 11008,\n },\n {\n name: 'NORTH WEST WHITE ARROW',\n value: '⬁',\n codepoint: 11009,\n },\n {\n name: 'SOUTH EAST WHITE ARROW',\n value: '⬂',\n codepoint: 11010,\n },\n {\n name: 'SOUTH WEST WHITE ARROW',\n value: '⬃',\n codepoint: 11011,\n },\n {\n name: 'LEFT RIGHT WHITE ARROW',\n value: '⬄',\n codepoint: 11012,\n },\n {\n name: 'NORTH EAST BLACK ARROW',\n value: '⬈',\n codepoint: 11016,\n },\n {\n name: 'NORTH WEST BLACK ARROW',\n value: '⬉',\n codepoint: 11017,\n },\n {\n name: 'SOUTH EAST BLACK ARROW',\n value: '⬊',\n codepoint: 11018,\n },\n {\n name: 'SOUTH WEST BLACK ARROW',\n value: '⬋',\n codepoint: 11019,\n },\n {\n name: 'LEFT RIGHT BLACK ARROW',\n value: '⬌',\n codepoint: 11020,\n },\n {\n name: 'UP DOWN BLACK ARROW',\n value: '⬍',\n codepoint: 11021,\n },\n {\n name: 'RIGHTWARDS ARROW WITH TIP DOWNWARDS',\n value: '⬎',\n codepoint: 11022,\n },\n {\n name: 'RIGHTWARDS ARROW WITH TIP UPWARDS',\n value: '⬏',\n codepoint: 11023,\n },\n {\n name: 'LEFTWARDS ARROW WITH TIP DOWNWARDS',\n value: '⬐',\n codepoint: 11024,\n },\n {\n name: 'LEFTWARDS ARROW WITH TIP UPWARDS',\n value: '⬑',\n codepoint: 11025,\n },\n {\n name: 'SQUARE WITH TOP HALF BLACK',\n value: '⬒',\n codepoint: 11026,\n },\n {\n name: 'SQUARE WITH BOTTOM HALF BLACK',\n value: '⬓',\n codepoint: 11027,\n },\n {\n name: 'SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK',\n value: '⬔',\n codepoint: 11028,\n },\n {\n name: 'SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK',\n value: '⬕',\n codepoint: 11029,\n },\n {\n name: 'DIAMOND WITH LEFT HALF BLACK',\n value: '⬖',\n codepoint: 11030,\n },\n {\n name: 'DIAMOND WITH RIGHT HALF BLACK',\n value: '⬗',\n codepoint: 11031,\n },\n {\n name: 'DIAMOND WITH TOP HALF BLACK',\n value: '⬘',\n codepoint: 11032,\n },\n {\n name: 'DIAMOND WITH BOTTOM HALF BLACK',\n value: '⬙',\n codepoint: 11033,\n },\n {\n name: 'DOTTED SQUARE',\n value: '⬚',\n codepoint: 11034,\n },\n {\n name: 'BLACK VERY SMALL SQUARE',\n value: '⬝',\n codepoint: 11037,\n },\n {\n name: 'WHITE VERY SMALL SQUARE',\n value: '⬞',\n codepoint: 11038,\n },\n {\n name: 'BLACK PENTAGON',\n value: '⬟',\n codepoint: 11039,\n },\n {\n name: 'WHITE PENTAGON',\n value: '⬠',\n codepoint: 11040,\n },\n {\n name: 'WHITE HEXAGON',\n value: '⬡',\n codepoint: 11041,\n },\n {\n name: 'BLACK HEXAGON',\n value: '⬢',\n codepoint: 11042,\n },\n {\n name: 'HORIZONTAL BLACK HEXAGON',\n value: '⬣',\n codepoint: 11043,\n },\n {\n name: 'BLACK LARGE CIRCLE',\n value: '⬤',\n codepoint: 11044,\n },\n {\n name: 'BLACK MEDIUM DIAMOND',\n value: '⬥',\n codepoint: 11045,\n },\n {\n name: 'WHITE MEDIUM DIAMOND',\n value: '⬦',\n codepoint: 11046,\n },\n {\n name: 'BLACK MEDIUM LOZENGE',\n value: '⬧',\n codepoint: 11047,\n },\n {\n name: 'WHITE MEDIUM LOZENGE',\n value: '⬨',\n codepoint: 11048,\n },\n {\n name: 'BLACK SMALL DIAMOND',\n value: '⬩',\n codepoint: 11049,\n },\n {\n name: 'BLACK SMALL LOZENGE',\n value: '⬪',\n codepoint: 11050,\n },\n {\n name: 'WHITE SMALL LOZENGE',\n value: '⬫',\n codepoint: 11051,\n },\n {\n name: 'BLACK HORIZONTAL ELLIPSE',\n value: '⬬',\n codepoint: 11052,\n },\n {\n name: 'WHITE HORIZONTAL ELLIPSE',\n value: '⬭',\n codepoint: 11053,\n },\n {\n name: 'BLACK VERTICAL ELLIPSE',\n value: '⬮',\n codepoint: 11054,\n },\n {\n name: 'WHITE VERTICAL ELLIPSE',\n value: '⬯',\n codepoint: 11055,\n },\n {\n name: 'LEFT ARROW WITH SMALL CIRCLE',\n value: '⬰',\n codepoint: 11056,\n },\n {\n name: 'THREE LEFTWARDS ARROWS',\n value: '⬱',\n codepoint: 11057,\n },\n {\n name: 'LEFT ARROW WITH CIRCLED PLUS',\n value: '⬲',\n codepoint: 11058,\n },\n {\n name: 'LONG LEFTWARDS SQUIGGLE ARROW',\n value: '⬳',\n codepoint: 11059,\n },\n {\n name: 'LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE',\n value: '⬴',\n codepoint: 11060,\n },\n {\n name: 'LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE',\n value: '⬵',\n codepoint: 11061,\n },\n {\n name: 'LEFTWARDS TWO-HEADED ARROW FROM BAR',\n value: '⬶',\n codepoint: 11062,\n },\n {\n name: 'LEFTWARDS TWO-HEADED TRIPLE DASH ARROW',\n value: '⬷',\n codepoint: 11063,\n },\n {\n name: 'LEFTWARDS ARROW WITH DOTTED STEM',\n value: '⬸',\n codepoint: 11064,\n },\n {\n name: 'LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE',\n value: '⬹',\n codepoint: 11065,\n },\n {\n name: 'LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE',\n value: '⬺',\n codepoint: 11066,\n },\n {\n name: 'LEFTWARDS TWO-HEADED ARROW WITH TAIL',\n value: '⬻',\n codepoint: 11067,\n },\n {\n name: 'LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE',\n value: '⬼',\n codepoint: 11068,\n },\n {\n name: 'LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE',\n value: '⬽',\n codepoint: 11069,\n },\n {\n name: 'LEFTWARDS ARROW THROUGH X',\n value: '⬾',\n codepoint: 11070,\n },\n {\n name: 'WAVE ARROW POINTING DIRECTLY LEFT',\n value: '⬿',\n codepoint: 11071,\n },\n {\n name: 'EQUALS SIGN ABOVE LEFTWARDS ARROW',\n value: '⭀',\n codepoint: 11072,\n },\n {\n name: 'REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW',\n value: '⭁',\n codepoint: 11073,\n },\n {\n name: 'LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO',\n value: '⭂',\n codepoint: 11074,\n },\n {\n name: 'RIGHTWARDS ARROW THROUGH GREATER-THAN',\n value: '⭃',\n codepoint: 11075,\n },\n {\n name: 'RIGHTWARDS ARROW THROUGH SUPERSET',\n value: '⭄',\n codepoint: 11076,\n },\n {\n name: 'LEFTWARDS QUADRUPLE ARROW',\n value: '⭅',\n codepoint: 11077,\n },\n {\n name: 'RIGHTWARDS QUADRUPLE ARROW',\n value: '⭆',\n codepoint: 11078,\n },\n {\n name: 'REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW',\n value: '⭇',\n codepoint: 11079,\n },\n {\n name: 'RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO',\n value: '⭈',\n codepoint: 11080,\n },\n {\n name: 'TILDE OPERATOR ABOVE LEFTWARDS ARROW',\n value: '⭉',\n codepoint: 11081,\n },\n {\n name: 'LEFTWARDS ARROW ABOVE ALMOST EQUAL TO',\n value: '⭊',\n codepoint: 11082,\n },\n {\n name: 'LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR',\n value: '⭋',\n codepoint: 11083,\n },\n {\n name: 'RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR',\n value: '⭌',\n codepoint: 11084,\n },\n {\n name: 'BLACK SMALL STAR',\n value: '⭑',\n codepoint: 11089,\n },\n {\n name: 'WHITE SMALL STAR',\n value: '⭒',\n codepoint: 11090,\n },\n {\n name: 'BLACK RIGHT-POINTING PENTAGON',\n value: '⭓',\n codepoint: 11091,\n },\n {\n name: 'WHITE RIGHT-POINTING PENTAGON',\n value: '⭔',\n codepoint: 11092,\n },\n ],\n },\n {\n name: 'Ancient',\n symbols: [\n {\n name: 'GREEK ACROPHONIC ATTIC ONE QUARTER',\n value: '𐅀',\n codepoint: 65856,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC ONE HALF',\n value: '𐅁',\n codepoint: 65857,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC ONE DRACHMA',\n value: '𐅂',\n codepoint: 65858,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC FIVE',\n value: '𐅃',\n codepoint: 65859,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC FIVE THOUSAND',\n value: '𐅆',\n codepoint: 65862,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC FIFTY THOUSAND',\n value: '𐅇',\n codepoint: 65863,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC FIVE TALENTS',\n value: '𐅈',\n codepoint: 65864,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC TEN TALENTS',\n value: '𐅉',\n codepoint: 65865,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC FIFTY TALENTS',\n value: '𐅊',\n codepoint: 65866,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS',\n value: '𐅋',\n codepoint: 65867,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS',\n value: '𐅌',\n codepoint: 65868,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS',\n value: '𐅍',\n codepoint: 65869,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS',\n value: '𐅎',\n codepoint: 65870,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC FIVE STATERS',\n value: '𐅏',\n codepoint: 65871,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC TEN STATERS',\n value: '𐅐',\n codepoint: 65872,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC FIFTY STATERS',\n value: '𐅑',\n codepoint: 65873,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS',\n value: '𐅒',\n codepoint: 65874,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS',\n value: '𐅓',\n codepoint: 65875,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS',\n value: '𐅔',\n codepoint: 65876,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS',\n value: '𐅕',\n codepoint: 65877,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS',\n value: '𐅖',\n codepoint: 65878,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC TEN MNAS',\n value: '𐅗',\n codepoint: 65879,\n },\n {\n name: 'GREEK ACROPHONIC HERAEUM ONE PLETHRON',\n value: '𐅘',\n codepoint: 65880,\n },\n {\n name: 'GREEK ACROPHONIC THESPIAN ONE',\n value: '𐅙',\n codepoint: 65881,\n },\n {\n name: 'GREEK ACROPHONIC HERMIONIAN ONE',\n value: '𐅚',\n codepoint: 65882,\n },\n {\n name: 'GREEK ACROPHONIC EPIDAUREAN TWO',\n value: '𐅛',\n codepoint: 65883,\n },\n {\n name: 'GREEK ACROPHONIC THESPIAN TWO',\n value: '𐅜',\n codepoint: 65884,\n },\n {\n name: 'GREEK ACROPHONIC CYRENAIC TWO DRACHMAS',\n value: '𐅝',\n codepoint: 65885,\n },\n {\n name: 'GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS',\n value: '𐅞',\n codepoint: 65886,\n },\n {\n name: 'GREEK ACROPHONIC TROEZENIAN FIVE',\n value: '𐅟',\n codepoint: 65887,\n },\n {\n name: 'GREEK ACROPHONIC TROEZENIAN TEN',\n value: '𐅠',\n codepoint: 65888,\n },\n {\n name: 'GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM',\n value: '𐅡',\n codepoint: 65889,\n },\n {\n name: 'GREEK ACROPHONIC HERMIONIAN TEN',\n value: '𐅢',\n codepoint: 65890,\n },\n {\n name: 'GREEK ACROPHONIC MESSENIAN TEN',\n value: '𐅣',\n codepoint: 65891,\n },\n {\n name: 'GREEK ACROPHONIC THESPIAN TEN',\n value: '𐅤',\n codepoint: 65892,\n },\n {\n name: 'GREEK ACROPHONIC THESPIAN THIRTY',\n value: '𐅥',\n codepoint: 65893,\n },\n {\n name: 'GREEK ACROPHONIC TROEZENIAN FIFTY',\n value: '𐅦',\n codepoint: 65894,\n },\n {\n name: 'GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM',\n value: '𐅧',\n codepoint: 65895,\n },\n {\n name: 'GREEK ACROPHONIC HERMIONIAN FIFTY',\n value: '𐅨',\n codepoint: 65896,\n },\n {\n name: 'GREEK ACROPHONIC THESPIAN FIFTY',\n value: '𐅩',\n codepoint: 65897,\n },\n {\n name: 'GREEK ACROPHONIC THESPIAN ONE HUNDRED',\n value: '𐅪',\n codepoint: 65898,\n },\n {\n name: 'GREEK ACROPHONIC THESPIAN THREE HUNDRED',\n value: '𐅫',\n codepoint: 65899,\n },\n {\n name: 'GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED',\n value: '𐅬',\n codepoint: 65900,\n },\n {\n name: 'GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED',\n value: '𐅭',\n codepoint: 65901,\n },\n {\n name: 'GREEK ACROPHONIC THESPIAN FIVE HUNDRED',\n value: '𐅮',\n codepoint: 65902,\n },\n {\n name: 'GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED',\n value: '𐅯',\n codepoint: 65903,\n },\n {\n name: 'GREEK ACROPHONIC NAXIAN FIVE HUNDRED',\n value: '𐅰',\n codepoint: 65904,\n },\n {\n name: 'GREEK ACROPHONIC THESPIAN ONE THOUSAND',\n value: '𐅱',\n codepoint: 65905,\n },\n {\n name: 'GREEK ACROPHONIC THESPIAN FIVE THOUSAND',\n value: '𐅲',\n codepoint: 65906,\n },\n {\n name: 'GREEK ACROPHONIC DELPHIC FIVE MNAS',\n value: '𐅳',\n codepoint: 65907,\n },\n {\n name: 'GREEK ACROPHONIC STRATIAN FIFTY MNAS',\n value: '𐅴',\n codepoint: 65908,\n },\n {\n name: 'GREEK ONE HALF SIGN',\n value: '𐅵',\n codepoint: 65909,\n },\n {\n name: 'GREEK YEAR SIGN',\n value: '𐅹',\n codepoint: 65913,\n },\n {\n name: 'GREEK TALENT SIGN',\n value: '𐅺',\n codepoint: 65914,\n },\n {\n name: 'GREEK DRACHMA SIGN',\n value: '𐅻',\n codepoint: 65915,\n },\n {\n name: 'GREEK OBOL SIGN',\n value: '𐅼',\n codepoint: 65916,\n },\n {\n name: 'GREEK TWO OBOLS SIGN',\n value: '𐅽',\n codepoint: 65917,\n },\n {\n name: 'GREEK THREE OBOLS SIGN',\n value: '𐅾',\n codepoint: 65918,\n },\n {\n name: 'GREEK FOUR OBOLS SIGN',\n value: '𐅿',\n codepoint: 65919,\n },\n {\n name: 'GREEK FIVE OBOLS SIGN',\n value: '𐆀',\n codepoint: 65920,\n },\n {\n name: 'GREEK METRETES SIGN',\n value: '𐆁',\n codepoint: 65921,\n },\n {\n name: 'GREEK KYATHOS BASE SIGN',\n value: '𐆂',\n codepoint: 65922,\n },\n {\n name: 'GREEK OUNKIA SIGN',\n value: '𐆄',\n codepoint: 65924,\n },\n {\n name: 'GREEK XESTES SIGN',\n value: '𐆅',\n codepoint: 65925,\n },\n {\n name: 'GREEK ARTABE SIGN',\n value: '𐆆',\n codepoint: 65926,\n },\n {\n name: 'GREEK ZERO SIGN',\n value: '𐆊',\n codepoint: 65930,\n },\n {\n name: 'ROMAN SEXTANS SIGN',\n value: '𐆐',\n codepoint: 65936,\n },\n {\n name: 'ROMAN UNCIA SIGN',\n value: '𐆑',\n codepoint: 65937,\n },\n {\n name: 'ROMAN SEMUNCIA SIGN',\n value: '𐆒',\n codepoint: 65938,\n },\n {\n name: 'ROMAN SEXTULA SIGN',\n value: '𐆓',\n codepoint: 65939,\n },\n {\n name: 'ROMAN DIMIDIA SEXTULA SIGN',\n value: '𐆔',\n codepoint: 65940,\n },\n {\n name: 'ROMAN SILIQUA SIGN',\n value: '𐆕',\n codepoint: 65941,\n },\n {\n name: 'ROMAN DENARIUS SIGN',\n value: '𐆖',\n codepoint: 65942,\n },\n {\n name: 'ROMAN QUINARIUS SIGN',\n value: '𐆗',\n codepoint: 65943,\n },\n {\n name: 'ROMAN SESTERTIUS SIGN',\n value: '𐆘',\n codepoint: 65944,\n },\n {\n name: 'ROMAN DUPONDIUS SIGN',\n value: '𐆙',\n codepoint: 65945,\n },\n {\n name: 'ROMAN AS SIGN',\n value: '𐆚',\n codepoint: 65946,\n },\n {\n name: 'ROMAN CENTURIAL SIGN',\n value: '𐆛',\n codepoint: 65947,\n },\n ],\n },\n {\n name: 'Braille',\n symbols: [\n {\n name: 'BRAILLE PATTERN BLANK',\n value: '⠀',\n codepoint: 10240,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1',\n value: '⠁',\n codepoint: 10241,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2',\n value: '⠂',\n codepoint: 10242,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12',\n value: '⠃',\n codepoint: 10243,\n },\n {\n name: 'BRAILLE PATTERN DOTS-3',\n value: '⠄',\n codepoint: 10244,\n },\n {\n name: 'BRAILLE PATTERN DOTS-13',\n value: '⠅',\n codepoint: 10245,\n },\n {\n name: 'BRAILLE PATTERN DOTS-23',\n value: '⠆',\n codepoint: 10246,\n },\n {\n name: 'BRAILLE PATTERN DOTS-123',\n value: '⠇',\n codepoint: 10247,\n },\n {\n name: 'BRAILLE PATTERN DOTS-4',\n value: '⠈',\n codepoint: 10248,\n },\n {\n name: 'BRAILLE PATTERN DOTS-14',\n value: '⠉',\n codepoint: 10249,\n },\n {\n name: 'BRAILLE PATTERN DOTS-24',\n value: '⠊',\n codepoint: 10250,\n },\n {\n name: 'BRAILLE PATTERN DOTS-124',\n value: '⠋',\n codepoint: 10251,\n },\n {\n name: 'BRAILLE PATTERN DOTS-34',\n value: '⠌',\n codepoint: 10252,\n },\n {\n name: 'BRAILLE PATTERN DOTS-134',\n value: '⠍',\n codepoint: 10253,\n },\n {\n name: 'BRAILLE PATTERN DOTS-234',\n value: '⠎',\n codepoint: 10254,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1234',\n value: '⠏',\n codepoint: 10255,\n },\n {\n name: 'BRAILLE PATTERN DOTS-5',\n value: '⠐',\n codepoint: 10256,\n },\n {\n name: 'BRAILLE PATTERN DOTS-15',\n value: '⠑',\n codepoint: 10257,\n },\n {\n name: 'BRAILLE PATTERN DOTS-25',\n value: '⠒',\n codepoint: 10258,\n },\n {\n name: 'BRAILLE PATTERN DOTS-125',\n value: '⠓',\n codepoint: 10259,\n },\n {\n name: 'BRAILLE PATTERN DOTS-35',\n value: '⠔',\n codepoint: 10260,\n },\n {\n name: 'BRAILLE PATTERN DOTS-135',\n value: '⠕',\n codepoint: 10261,\n },\n {\n name: 'BRAILLE PATTERN DOTS-235',\n value: '⠖',\n codepoint: 10262,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1235',\n value: '⠗',\n codepoint: 10263,\n },\n {\n name: 'BRAILLE PATTERN DOTS-45',\n value: '⠘',\n codepoint: 10264,\n },\n {\n name: 'BRAILLE PATTERN DOTS-145',\n value: '⠙',\n codepoint: 10265,\n },\n {\n name: 'BRAILLE PATTERN DOTS-245',\n value: '⠚',\n codepoint: 10266,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1245',\n value: '⠛',\n codepoint: 10267,\n },\n {\n name: 'BRAILLE PATTERN DOTS-345',\n value: '⠜',\n codepoint: 10268,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1345',\n value: '⠝',\n codepoint: 10269,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2345',\n value: '⠞',\n codepoint: 10270,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12345',\n value: '⠟',\n codepoint: 10271,\n },\n {\n name: 'BRAILLE PATTERN DOTS-6',\n value: '⠠',\n codepoint: 10272,\n },\n {\n name: 'BRAILLE PATTERN DOTS-16',\n value: '⠡',\n codepoint: 10273,\n },\n {\n name: 'BRAILLE PATTERN DOTS-26',\n value: '⠢',\n codepoint: 10274,\n },\n {\n name: 'BRAILLE PATTERN DOTS-126',\n value: '⠣',\n codepoint: 10275,\n },\n {\n name: 'BRAILLE PATTERN DOTS-36',\n value: '⠤',\n codepoint: 10276,\n },\n {\n name: 'BRAILLE PATTERN DOTS-136',\n value: '⠥',\n codepoint: 10277,\n },\n {\n name: 'BRAILLE PATTERN DOTS-236',\n value: '⠦',\n codepoint: 10278,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1236',\n value: '⠧',\n codepoint: 10279,\n },\n {\n name: 'BRAILLE PATTERN DOTS-46',\n value: '⠨',\n codepoint: 10280,\n },\n {\n name: 'BRAILLE PATTERN DOTS-146',\n value: '⠩',\n codepoint: 10281,\n },\n {\n name: 'BRAILLE PATTERN DOTS-246',\n value: '⠪',\n codepoint: 10282,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1246',\n value: '⠫',\n codepoint: 10283,\n },\n {\n name: 'BRAILLE PATTERN DOTS-346',\n value: '⠬',\n codepoint: 10284,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1346',\n value: '⠭',\n codepoint: 10285,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2346',\n value: '⠮',\n codepoint: 10286,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12346',\n value: '⠯',\n codepoint: 10287,\n },\n {\n name: 'BRAILLE PATTERN DOTS-56',\n value: '⠰',\n codepoint: 10288,\n },\n {\n name: 'BRAILLE PATTERN DOTS-156',\n value: '⠱',\n codepoint: 10289,\n },\n {\n name: 'BRAILLE PATTERN DOTS-256',\n value: '⠲',\n codepoint: 10290,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1256',\n value: '⠳',\n codepoint: 10291,\n },\n {\n name: 'BRAILLE PATTERN DOTS-356',\n value: '⠴',\n codepoint: 10292,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1356',\n value: '⠵',\n codepoint: 10293,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2356',\n value: '⠶',\n codepoint: 10294,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12356',\n value: '⠷',\n codepoint: 10295,\n },\n {\n name: 'BRAILLE PATTERN DOTS-456',\n value: '⠸',\n codepoint: 10296,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1456',\n value: '⠹',\n codepoint: 10297,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2456',\n value: '⠺',\n codepoint: 10298,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12456',\n value: '⠻',\n codepoint: 10299,\n },\n {\n name: 'BRAILLE PATTERN DOTS-3456',\n value: '⠼',\n codepoint: 10300,\n },\n {\n name: 'BRAILLE PATTERN DOTS-13456',\n value: '⠽',\n codepoint: 10301,\n },\n {\n name: 'BRAILLE PATTERN DOTS-23456',\n value: '⠾',\n codepoint: 10302,\n },\n {\n name: 'BRAILLE PATTERN DOTS-123456',\n value: '⠿',\n codepoint: 10303,\n },\n {\n name: 'BRAILLE PATTERN DOTS-7',\n value: '⡀',\n codepoint: 10304,\n },\n {\n name: 'BRAILLE PATTERN DOTS-17',\n value: '⡁',\n codepoint: 10305,\n },\n {\n name: 'BRAILLE PATTERN DOTS-27',\n value: '⡂',\n codepoint: 10306,\n },\n {\n name: 'BRAILLE PATTERN DOTS-127',\n value: '⡃',\n codepoint: 10307,\n },\n {\n name: 'BRAILLE PATTERN DOTS-37',\n value: '⡄',\n codepoint: 10308,\n },\n {\n name: 'BRAILLE PATTERN DOTS-137',\n value: '⡅',\n codepoint: 10309,\n },\n {\n name: 'BRAILLE PATTERN DOTS-237',\n value: '⡆',\n codepoint: 10310,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1237',\n value: '⡇',\n codepoint: 10311,\n },\n {\n name: 'BRAILLE PATTERN DOTS-47',\n value: '⡈',\n codepoint: 10312,\n },\n {\n name: 'BRAILLE PATTERN DOTS-147',\n value: '⡉',\n codepoint: 10313,\n },\n {\n name: 'BRAILLE PATTERN DOTS-247',\n value: '⡊',\n codepoint: 10314,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1247',\n value: '⡋',\n codepoint: 10315,\n },\n {\n name: 'BRAILLE PATTERN DOTS-347',\n value: '⡌',\n codepoint: 10316,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1347',\n value: '⡍',\n codepoint: 10317,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2347',\n value: '⡎',\n codepoint: 10318,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12347',\n value: '⡏',\n codepoint: 10319,\n },\n {\n name: 'BRAILLE PATTERN DOTS-57',\n value: '⡐',\n codepoint: 10320,\n },\n {\n name: 'BRAILLE PATTERN DOTS-157',\n value: '⡑',\n codepoint: 10321,\n },\n {\n name: 'BRAILLE PATTERN DOTS-257',\n value: '⡒',\n codepoint: 10322,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1257',\n value: '⡓',\n codepoint: 10323,\n },\n {\n name: 'BRAILLE PATTERN DOTS-357',\n value: '⡔',\n codepoint: 10324,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1357',\n value: '⡕',\n codepoint: 10325,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2357',\n value: '⡖',\n codepoint: 10326,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12357',\n value: '⡗',\n codepoint: 10327,\n },\n {\n name: 'BRAILLE PATTERN DOTS-457',\n value: '⡘',\n codepoint: 10328,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1457',\n value: '⡙',\n codepoint: 10329,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2457',\n value: '⡚',\n codepoint: 10330,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12457',\n value: '⡛',\n codepoint: 10331,\n },\n {\n name: 'BRAILLE PATTERN DOTS-3457',\n value: '⡜',\n codepoint: 10332,\n },\n {\n name: 'BRAILLE PATTERN DOTS-13457',\n value: '⡝',\n codepoint: 10333,\n },\n {\n name: 'BRAILLE PATTERN DOTS-23457',\n value: '⡞',\n codepoint: 10334,\n },\n {\n name: 'BRAILLE PATTERN DOTS-123457',\n value: '⡟',\n codepoint: 10335,\n },\n {\n name: 'BRAILLE PATTERN DOTS-67',\n value: '⡠',\n codepoint: 10336,\n },\n {\n name: 'BRAILLE PATTERN DOTS-167',\n value: '⡡',\n codepoint: 10337,\n },\n {\n name: 'BRAILLE PATTERN DOTS-267',\n value: '⡢',\n codepoint: 10338,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1267',\n value: '⡣',\n codepoint: 10339,\n },\n {\n name: 'BRAILLE PATTERN DOTS-367',\n value: '⡤',\n codepoint: 10340,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1367',\n value: '⡥',\n codepoint: 10341,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2367',\n value: '⡦',\n codepoint: 10342,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12367',\n value: '⡧',\n codepoint: 10343,\n },\n {\n name: 'BRAILLE PATTERN DOTS-467',\n value: '⡨',\n codepoint: 10344,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1467',\n value: '⡩',\n codepoint: 10345,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2467',\n value: '⡪',\n codepoint: 10346,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12467',\n value: '⡫',\n codepoint: 10347,\n },\n {\n name: 'BRAILLE PATTERN DOTS-3467',\n value: '⡬',\n codepoint: 10348,\n },\n {\n name: 'BRAILLE PATTERN DOTS-13467',\n value: '⡭',\n codepoint: 10349,\n },\n {\n name: 'BRAILLE PATTERN DOTS-23467',\n value: '⡮',\n codepoint: 10350,\n },\n {\n name: 'BRAILLE PATTERN DOTS-123467',\n value: '⡯',\n codepoint: 10351,\n },\n {\n name: 'BRAILLE PATTERN DOTS-567',\n value: '⡰',\n codepoint: 10352,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1567',\n value: '⡱',\n codepoint: 10353,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2567',\n value: '⡲',\n codepoint: 10354,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12567',\n value: '⡳',\n codepoint: 10355,\n },\n {\n name: 'BRAILLE PATTERN DOTS-3567',\n value: '⡴',\n codepoint: 10356,\n },\n {\n name: 'BRAILLE PATTERN DOTS-13567',\n value: '⡵',\n codepoint: 10357,\n },\n {\n name: 'BRAILLE PATTERN DOTS-23567',\n value: '⡶',\n codepoint: 10358,\n },\n {\n name: 'BRAILLE PATTERN DOTS-123567',\n value: '⡷',\n codepoint: 10359,\n },\n {\n name: 'BRAILLE PATTERN DOTS-4567',\n value: '⡸',\n codepoint: 10360,\n },\n {\n name: 'BRAILLE PATTERN DOTS-14567',\n value: '⡹',\n codepoint: 10361,\n },\n {\n name: 'BRAILLE PATTERN DOTS-24567',\n value: '⡺',\n codepoint: 10362,\n },\n {\n name: 'BRAILLE PATTERN DOTS-124567',\n value: '⡻',\n codepoint: 10363,\n },\n {\n name: 'BRAILLE PATTERN DOTS-34567',\n value: '⡼',\n codepoint: 10364,\n },\n {\n name: 'BRAILLE PATTERN DOTS-134567',\n value: '⡽',\n codepoint: 10365,\n },\n {\n name: 'BRAILLE PATTERN DOTS-234567',\n value: '⡾',\n codepoint: 10366,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1234567',\n value: '⡿',\n codepoint: 10367,\n },\n {\n name: 'BRAILLE PATTERN DOTS-8',\n value: '⢀',\n codepoint: 10368,\n },\n {\n name: 'BRAILLE PATTERN DOTS-18',\n value: '⢁',\n codepoint: 10369,\n },\n {\n name: 'BRAILLE PATTERN DOTS-28',\n value: '⢂',\n codepoint: 10370,\n },\n {\n name: 'BRAILLE PATTERN DOTS-128',\n value: '⢃',\n codepoint: 10371,\n },\n {\n name: 'BRAILLE PATTERN DOTS-38',\n value: '⢄',\n codepoint: 10372,\n },\n {\n name: 'BRAILLE PATTERN DOTS-138',\n value: '⢅',\n codepoint: 10373,\n },\n {\n name: 'BRAILLE PATTERN DOTS-238',\n value: '⢆',\n codepoint: 10374,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1238',\n value: '⢇',\n codepoint: 10375,\n },\n {\n name: 'BRAILLE PATTERN DOTS-48',\n value: '⢈',\n codepoint: 10376,\n },\n {\n name: 'BRAILLE PATTERN DOTS-148',\n value: '⢉',\n codepoint: 10377,\n },\n {\n name: 'BRAILLE PATTERN DOTS-248',\n value: '⢊',\n codepoint: 10378,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1248',\n value: '⢋',\n codepoint: 10379,\n },\n {\n name: 'BRAILLE PATTERN DOTS-348',\n value: '⢌',\n codepoint: 10380,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1348',\n value: '⢍',\n codepoint: 10381,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2348',\n value: '⢎',\n codepoint: 10382,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12348',\n value: '⢏',\n codepoint: 10383,\n },\n {\n name: 'BRAILLE PATTERN DOTS-58',\n value: '⢐',\n codepoint: 10384,\n },\n {\n name: 'BRAILLE PATTERN DOTS-158',\n value: '⢑',\n codepoint: 10385,\n },\n {\n name: 'BRAILLE PATTERN DOTS-258',\n value: '⢒',\n codepoint: 10386,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1258',\n value: '⢓',\n codepoint: 10387,\n },\n {\n name: 'BRAILLE PATTERN DOTS-358',\n value: '⢔',\n codepoint: 10388,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1358',\n value: '⢕',\n codepoint: 10389,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2358',\n value: '⢖',\n codepoint: 10390,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12358',\n value: '⢗',\n codepoint: 10391,\n },\n {\n name: 'BRAILLE PATTERN DOTS-458',\n value: '⢘',\n codepoint: 10392,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1458',\n value: '⢙',\n codepoint: 10393,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2458',\n value: '⢚',\n codepoint: 10394,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12458',\n value: '⢛',\n codepoint: 10395,\n },\n {\n name: 'BRAILLE PATTERN DOTS-3458',\n value: '⢜',\n codepoint: 10396,\n },\n {\n name: 'BRAILLE PATTERN DOTS-13458',\n value: '⢝',\n codepoint: 10397,\n },\n {\n name: 'BRAILLE PATTERN DOTS-23458',\n value: '⢞',\n codepoint: 10398,\n },\n {\n name: 'BRAILLE PATTERN DOTS-123458',\n value: '⢟',\n codepoint: 10399,\n },\n {\n name: 'BRAILLE PATTERN DOTS-68',\n value: '⢠',\n codepoint: 10400,\n },\n {\n name: 'BRAILLE PATTERN DOTS-168',\n value: '⢡',\n codepoint: 10401,\n },\n {\n name: 'BRAILLE PATTERN DOTS-268',\n value: '⢢',\n codepoint: 10402,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1268',\n value: '⢣',\n codepoint: 10403,\n },\n {\n name: 'BRAILLE PATTERN DOTS-368',\n value: '⢤',\n codepoint: 10404,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1368',\n value: '⢥',\n codepoint: 10405,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2368',\n value: '⢦',\n codepoint: 10406,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12368',\n value: '⢧',\n codepoint: 10407,\n },\n {\n name: 'BRAILLE PATTERN DOTS-468',\n value: '⢨',\n codepoint: 10408,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1468',\n value: '⢩',\n codepoint: 10409,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2468',\n value: '⢪',\n codepoint: 10410,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12468',\n value: '⢫',\n codepoint: 10411,\n },\n {\n name: 'BRAILLE PATTERN DOTS-3468',\n value: '⢬',\n codepoint: 10412,\n },\n {\n name: 'BRAILLE PATTERN DOTS-13468',\n value: '⢭',\n codepoint: 10413,\n },\n {\n name: 'BRAILLE PATTERN DOTS-23468',\n value: '⢮',\n codepoint: 10414,\n },\n {\n name: 'BRAILLE PATTERN DOTS-123468',\n value: '⢯',\n codepoint: 10415,\n },\n {\n name: 'BRAILLE PATTERN DOTS-568',\n value: '⢰',\n codepoint: 10416,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1568',\n value: '⢱',\n codepoint: 10417,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2568',\n value: '⢲',\n codepoint: 10418,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12568',\n value: '⢳',\n codepoint: 10419,\n },\n {\n name: 'BRAILLE PATTERN DOTS-3568',\n value: '⢴',\n codepoint: 10420,\n },\n {\n name: 'BRAILLE PATTERN DOTS-13568',\n value: '⢵',\n codepoint: 10421,\n },\n {\n name: 'BRAILLE PATTERN DOTS-23568',\n value: '⢶',\n codepoint: 10422,\n },\n {\n name: 'BRAILLE PATTERN DOTS-123568',\n value: '⢷',\n codepoint: 10423,\n },\n {\n name: 'BRAILLE PATTERN DOTS-4568',\n value: '⢸',\n codepoint: 10424,\n },\n {\n name: 'BRAILLE PATTERN DOTS-14568',\n value: '⢹',\n codepoint: 10425,\n },\n {\n name: 'BRAILLE PATTERN DOTS-24568',\n value: '⢺',\n codepoint: 10426,\n },\n {\n name: 'BRAILLE PATTERN DOTS-124568',\n value: '⢻',\n codepoint: 10427,\n },\n {\n name: 'BRAILLE PATTERN DOTS-34568',\n value: '⢼',\n codepoint: 10428,\n },\n {\n name: 'BRAILLE PATTERN DOTS-134568',\n value: '⢽',\n codepoint: 10429,\n },\n {\n name: 'BRAILLE PATTERN DOTS-234568',\n value: '⢾',\n codepoint: 10430,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1234568',\n value: '⢿',\n codepoint: 10431,\n },\n {\n name: 'BRAILLE PATTERN DOTS-78',\n value: '⣀',\n codepoint: 10432,\n },\n {\n name: 'BRAILLE PATTERN DOTS-178',\n value: '⣁',\n codepoint: 10433,\n },\n {\n name: 'BRAILLE PATTERN DOTS-278',\n value: '⣂',\n codepoint: 10434,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1278',\n value: '⣃',\n codepoint: 10435,\n },\n {\n name: 'BRAILLE PATTERN DOTS-378',\n value: '⣄',\n codepoint: 10436,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1378',\n value: '⣅',\n codepoint: 10437,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2378',\n value: '⣆',\n codepoint: 10438,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12378',\n value: '⣇',\n codepoint: 10439,\n },\n {\n name: 'BRAILLE PATTERN DOTS-478',\n value: '⣈',\n codepoint: 10440,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1478',\n value: '⣉',\n codepoint: 10441,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2478',\n value: '⣊',\n codepoint: 10442,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12478',\n value: '⣋',\n codepoint: 10443,\n },\n {\n name: 'BRAILLE PATTERN DOTS-3478',\n value: '⣌',\n codepoint: 10444,\n },\n {\n name: 'BRAILLE PATTERN DOTS-13478',\n value: '⣍',\n codepoint: 10445,\n },\n {\n name: 'BRAILLE PATTERN DOTS-23478',\n value: '⣎',\n codepoint: 10446,\n },\n {\n name: 'BRAILLE PATTERN DOTS-123478',\n value: '⣏',\n codepoint: 10447,\n },\n {\n name: 'BRAILLE PATTERN DOTS-578',\n value: '⣐',\n codepoint: 10448,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1578',\n value: '⣑',\n codepoint: 10449,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2578',\n value: '⣒',\n codepoint: 10450,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12578',\n value: '⣓',\n codepoint: 10451,\n },\n {\n name: 'BRAILLE PATTERN DOTS-3578',\n value: '⣔',\n codepoint: 10452,\n },\n {\n name: 'BRAILLE PATTERN DOTS-13578',\n value: '⣕',\n codepoint: 10453,\n },\n {\n name: 'BRAILLE PATTERN DOTS-23578',\n value: '⣖',\n codepoint: 10454,\n },\n {\n name: 'BRAILLE PATTERN DOTS-123578',\n value: '⣗',\n codepoint: 10455,\n },\n {\n name: 'BRAILLE PATTERN DOTS-4578',\n value: '⣘',\n codepoint: 10456,\n },\n {\n name: 'BRAILLE PATTERN DOTS-14578',\n value: '⣙',\n codepoint: 10457,\n },\n {\n name: 'BRAILLE PATTERN DOTS-24578',\n value: '⣚',\n codepoint: 10458,\n },\n {\n name: 'BRAILLE PATTERN DOTS-124578',\n value: '⣛',\n codepoint: 10459,\n },\n {\n name: 'BRAILLE PATTERN DOTS-34578',\n value: '⣜',\n codepoint: 10460,\n },\n {\n name: 'BRAILLE PATTERN DOTS-134578',\n value: '⣝',\n codepoint: 10461,\n },\n {\n name: 'BRAILLE PATTERN DOTS-234578',\n value: '⣞',\n codepoint: 10462,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1234578',\n value: '⣟',\n codepoint: 10463,\n },\n {\n name: 'BRAILLE PATTERN DOTS-678',\n value: '⣠',\n codepoint: 10464,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1678',\n value: '⣡',\n codepoint: 10465,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2678',\n value: '⣢',\n codepoint: 10466,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12678',\n value: '⣣',\n codepoint: 10467,\n },\n {\n name: 'BRAILLE PATTERN DOTS-3678',\n value: '⣤',\n codepoint: 10468,\n },\n {\n name: 'BRAILLE PATTERN DOTS-13678',\n value: '⣥',\n codepoint: 10469,\n },\n {\n name: 'BRAILLE PATTERN DOTS-23678',\n value: '⣦',\n codepoint: 10470,\n },\n {\n name: 'BRAILLE PATTERN DOTS-123678',\n value: '⣧',\n codepoint: 10471,\n },\n {\n name: 'BRAILLE PATTERN DOTS-4678',\n value: '⣨',\n codepoint: 10472,\n },\n {\n name: 'BRAILLE PATTERN DOTS-14678',\n value: '⣩',\n codepoint: 10473,\n },\n {\n name: 'BRAILLE PATTERN DOTS-24678',\n value: '⣪',\n codepoint: 10474,\n },\n {\n name: 'BRAILLE PATTERN DOTS-124678',\n value: '⣫',\n codepoint: 10475,\n },\n {\n name: 'BRAILLE PATTERN DOTS-34678',\n value: '⣬',\n codepoint: 10476,\n },\n {\n name: 'BRAILLE PATTERN DOTS-134678',\n value: '⣭',\n codepoint: 10477,\n },\n {\n name: 'BRAILLE PATTERN DOTS-234678',\n value: '⣮',\n codepoint: 10478,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1234678',\n value: '⣯',\n codepoint: 10479,\n },\n {\n name: 'BRAILLE PATTERN DOTS-5678',\n value: '⣰',\n codepoint: 10480,\n },\n {\n name: 'BRAILLE PATTERN DOTS-15678',\n value: '⣱',\n codepoint: 10481,\n },\n {\n name: 'BRAILLE PATTERN DOTS-25678',\n value: '⣲',\n codepoint: 10482,\n },\n {\n name: 'BRAILLE PATTERN DOTS-125678',\n value: '⣳',\n codepoint: 10483,\n },\n {\n name: 'BRAILLE PATTERN DOTS-35678',\n value: '⣴',\n codepoint: 10484,\n },\n {\n name: 'BRAILLE PATTERN DOTS-135678',\n value: '⣵',\n codepoint: 10485,\n },\n {\n name: 'BRAILLE PATTERN DOTS-235678',\n value: '⣶',\n codepoint: 10486,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1235678',\n value: '⣷',\n codepoint: 10487,\n },\n {\n name: 'BRAILLE PATTERN DOTS-45678',\n value: '⣸',\n codepoint: 10488,\n },\n {\n name: 'BRAILLE PATTERN DOTS-145678',\n value: '⣹',\n codepoint: 10489,\n },\n {\n name: 'BRAILLE PATTERN DOTS-245678',\n value: '⣺',\n codepoint: 10490,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1245678',\n value: '⣻',\n codepoint: 10491,\n },\n {\n name: 'BRAILLE PATTERN DOTS-345678',\n value: '⣼',\n codepoint: 10492,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1345678',\n value: '⣽',\n codepoint: 10493,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2345678',\n value: '⣾',\n codepoint: 10494,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12345678',\n value: '⣿',\n codepoint: 10495,\n },\n ],\n },\n {\n name: 'Currency',\n symbols: [\n {\n name: 'EURO-CURRENCY SIGN',\n value: '₠',\n codepoint: 8352,\n },\n {\n name: 'COLON SIGN',\n value: '₡',\n codepoint: 8353,\n },\n {\n name: 'CRUZEIRO SIGN',\n value: '₢',\n codepoint: 8354,\n },\n {\n name: 'FRENCH FRANC SIGN',\n value: '₣',\n codepoint: 8355,\n },\n {\n name: 'LIRA SIGN',\n value: '₤',\n codepoint: 8356,\n },\n {\n name: 'MILL SIGN',\n value: '₥',\n codepoint: 8357,\n },\n {\n name: 'NAIRA SIGN',\n value: '₦',\n codepoint: 8358,\n },\n {\n name: 'PESETA SIGN',\n value: '₧',\n codepoint: 8359,\n },\n {\n name: 'RUPEE SIGN',\n value: '₨',\n codepoint: 8360,\n },\n {\n name: 'WON SIGN',\n value: '₩',\n codepoint: 8361,\n },\n {\n name: 'NEW SHEQEL SIGN',\n value: '₪',\n codepoint: 8362,\n },\n {\n name: 'DONG SIGN',\n value: '₫',\n codepoint: 8363,\n },\n {\n name: 'EURO SIGN',\n value: '€',\n codepoint: 8364,\n },\n {\n name: 'KIP SIGN',\n value: '₭',\n codepoint: 8365,\n },\n {\n name: 'TUGRIK SIGN',\n value: '₮',\n codepoint: 8366,\n },\n {\n name: 'DRACHMA SIGN',\n value: '₯',\n codepoint: 8367,\n },\n {\n name: 'GERMAN PENNY SIGN',\n value: '₰',\n codepoint: 8368,\n },\n {\n name: 'PESO SIGN',\n value: '₱',\n codepoint: 8369,\n },\n {\n name: 'GUARANI SIGN',\n value: '₲',\n codepoint: 8370,\n },\n {\n name: 'AUSTRAL SIGN',\n value: '₳',\n codepoint: 8371,\n },\n {\n name: 'HRYVNIA SIGN',\n value: '₴',\n codepoint: 8372,\n },\n {\n name: 'CEDI SIGN',\n value: '₵',\n codepoint: 8373,\n },\n {\n name: 'LIVRE TOURNOIS SIGN',\n value: '₶',\n codepoint: 8374,\n },\n {\n name: 'SPESMILO SIGN',\n value: '₷',\n codepoint: 8375,\n },\n {\n name: 'TENGE SIGN',\n value: '₸',\n codepoint: 8376,\n },\n {\n name: 'INDIAN RUPEE SIGN',\n value: '₹',\n codepoint: 8377,\n },\n ],\n },\n {\n name: 'Game Symbols',\n symbols: [\n {\n name: 'MAHJONG TILE EAST WIND',\n value: '🀀',\n codepoint: 126976,\n },\n {\n name: 'MAHJONG TILE SOUTH WIND',\n value: '🀁',\n codepoint: 126977,\n },\n {\n name: 'MAHJONG TILE WEST WIND',\n value: '🀂',\n codepoint: 126978,\n },\n {\n name: 'MAHJONG TILE NORTH WIND',\n value: '🀃',\n codepoint: 126979,\n },\n {\n name: 'MAHJONG TILE GREEN DRAGON',\n value: '🀅',\n codepoint: 126981,\n },\n {\n name: 'MAHJONG TILE WHITE DRAGON',\n value: '🀆',\n codepoint: 126982,\n },\n {\n name: 'MAHJONG TILE ONE OF CHARACTERS',\n value: '🀇',\n codepoint: 126983,\n },\n {\n name: 'MAHJONG TILE TWO OF CHARACTERS',\n value: '🀈',\n codepoint: 126984,\n },\n {\n name: 'MAHJONG TILE THREE OF CHARACTERS',\n value: '🀉',\n codepoint: 126985,\n },\n {\n name: 'MAHJONG TILE FOUR OF CHARACTERS',\n value: '🀊',\n codepoint: 126986,\n },\n {\n name: 'MAHJONG TILE FIVE OF CHARACTERS',\n value: '🀋',\n codepoint: 126987,\n },\n {\n name: 'MAHJONG TILE SIX OF CHARACTERS',\n value: '🀌',\n codepoint: 126988,\n },\n {\n name: 'MAHJONG TILE SEVEN OF CHARACTERS',\n value: '🀍',\n codepoint: 126989,\n },\n {\n name: 'MAHJONG TILE EIGHT OF CHARACTERS',\n value: '🀎',\n codepoint: 126990,\n },\n {\n name: 'MAHJONG TILE NINE OF CHARACTERS',\n value: '🀏',\n codepoint: 126991,\n },\n {\n name: 'MAHJONG TILE ONE OF BAMBOOS',\n value: '🀐',\n codepoint: 126992,\n },\n {\n name: 'MAHJONG TILE TWO OF BAMBOOS',\n value: '🀑',\n codepoint: 126993,\n },\n {\n name: 'MAHJONG TILE THREE OF BAMBOOS',\n value: '🀒',\n codepoint: 126994,\n },\n {\n name: 'MAHJONG TILE FOUR OF BAMBOOS',\n value: '🀓',\n codepoint: 126995,\n },\n {\n name: 'MAHJONG TILE FIVE OF BAMBOOS',\n value: '🀔',\n codepoint: 126996,\n },\n {\n name: 'MAHJONG TILE SIX OF BAMBOOS',\n value: '🀕',\n codepoint: 126997,\n },\n {\n name: 'MAHJONG TILE SEVEN OF BAMBOOS',\n value: '🀖',\n codepoint: 126998,\n },\n {\n name: 'MAHJONG TILE EIGHT OF BAMBOOS',\n value: '🀗',\n codepoint: 126999,\n },\n {\n name: 'MAHJONG TILE NINE OF BAMBOOS',\n value: '🀘',\n codepoint: 127000,\n },\n {\n name: 'MAHJONG TILE ONE OF CIRCLES',\n value: '🀙',\n codepoint: 127001,\n },\n {\n name: 'MAHJONG TILE TWO OF CIRCLES',\n value: '🀚',\n codepoint: 127002,\n },\n {\n name: 'MAHJONG TILE THREE OF CIRCLES',\n value: '🀛',\n codepoint: 127003,\n },\n {\n name: 'MAHJONG TILE FOUR OF CIRCLES',\n value: '🀜',\n codepoint: 127004,\n },\n {\n name: 'MAHJONG TILE FIVE OF CIRCLES',\n value: '🀝',\n codepoint: 127005,\n },\n {\n name: 'MAHJONG TILE SIX OF CIRCLES',\n value: '🀞',\n codepoint: 127006,\n },\n {\n name: 'MAHJONG TILE SEVEN OF CIRCLES',\n value: '🀟',\n codepoint: 127007,\n },\n {\n name: 'MAHJONG TILE EIGHT OF CIRCLES',\n value: '🀠',\n codepoint: 127008,\n },\n {\n name: 'MAHJONG TILE NINE OF CIRCLES',\n value: '🀡',\n codepoint: 127009,\n },\n {\n name: 'MAHJONG TILE PLUM',\n value: '🀢',\n codepoint: 127010,\n },\n {\n name: 'MAHJONG TILE ORCHID',\n value: '🀣',\n codepoint: 127011,\n },\n {\n name: 'MAHJONG TILE BAMBOO',\n value: '🀤',\n codepoint: 127012,\n },\n {\n name: 'MAHJONG TILE CHRYSANTHEMUM',\n value: '🀥',\n codepoint: 127013,\n },\n {\n name: 'MAHJONG TILE SPRING',\n value: '🀦',\n codepoint: 127014,\n },\n {\n name: 'MAHJONG TILE SUMMER',\n value: '🀧',\n codepoint: 127015,\n },\n {\n name: 'MAHJONG TILE AUTUMN',\n value: '🀨',\n codepoint: 127016,\n },\n {\n name: 'MAHJONG TILE WINTER',\n value: '🀩',\n codepoint: 127017,\n },\n {\n name: 'MAHJONG TILE JOKER',\n value: '🀪',\n codepoint: 127018,\n },\n {\n name: 'MAHJONG TILE BACK',\n value: '🀫',\n codepoint: 127019,\n },\n {\n name: 'DOMINO TILE HORIZONTAL BACK',\n value: '🀰',\n codepoint: 127024,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-00-00',\n value: '🀱',\n codepoint: 127025,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-00-01',\n value: '🀲',\n codepoint: 127026,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-00-02',\n value: '🀳',\n codepoint: 127027,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-00-03',\n value: '🀴',\n codepoint: 127028,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-00-04',\n value: '🀵',\n codepoint: 127029,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-00-05',\n value: '🀶',\n codepoint: 127030,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-00-06',\n value: '🀷',\n codepoint: 127031,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-01-00',\n value: '🀸',\n codepoint: 127032,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-01-01',\n value: '🀹',\n codepoint: 127033,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-01-02',\n value: '🀺',\n codepoint: 127034,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-01-03',\n value: '🀻',\n codepoint: 127035,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-01-04',\n value: '🀼',\n codepoint: 127036,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-01-05',\n value: '🀽',\n codepoint: 127037,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-01-06',\n value: '🀾',\n codepoint: 127038,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-02-00',\n value: '🀿',\n codepoint: 127039,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-02-01',\n value: '🁀',\n codepoint: 127040,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-02-02',\n value: '🁁',\n codepoint: 127041,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-02-03',\n value: '🁂',\n codepoint: 127042,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-02-04',\n value: '🁃',\n codepoint: 127043,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-02-05',\n value: '🁄',\n codepoint: 127044,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-02-06',\n value: '🁅',\n codepoint: 127045,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-03-00',\n value: '🁆',\n codepoint: 127046,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-03-01',\n value: '🁇',\n codepoint: 127047,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-03-02',\n value: '🁈',\n codepoint: 127048,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-03-03',\n value: '🁉',\n codepoint: 127049,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-03-04',\n value: '🁊',\n codepoint: 127050,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-03-05',\n value: '🁋',\n codepoint: 127051,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-03-06',\n value: '🁌',\n codepoint: 127052,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-04-00',\n value: '🁍',\n codepoint: 127053,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-04-01',\n value: '🁎',\n codepoint: 127054,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-04-02',\n value: '🁏',\n codepoint: 127055,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-04-03',\n value: '🁐',\n codepoint: 127056,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-04-04',\n value: '🁑',\n codepoint: 127057,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-04-05',\n value: '🁒',\n codepoint: 127058,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-04-06',\n value: '🁓',\n codepoint: 127059,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-05-00',\n value: '🁔',\n codepoint: 127060,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-05-01',\n value: '🁕',\n codepoint: 127061,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-05-02',\n value: '🁖',\n codepoint: 127062,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-05-03',\n value: '🁗',\n codepoint: 127063,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-05-04',\n value: '🁘',\n codepoint: 127064,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-05-05',\n value: '🁙',\n codepoint: 127065,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-05-06',\n value: '🁚',\n codepoint: 127066,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-06-00',\n value: '🁛',\n codepoint: 127067,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-06-01',\n value: '🁜',\n codepoint: 127068,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-06-02',\n value: '🁝',\n codepoint: 127069,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-06-03',\n value: '🁞',\n codepoint: 127070,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-06-04',\n value: '🁟',\n codepoint: 127071,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-06-05',\n value: '🁠',\n codepoint: 127072,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-06-06',\n value: '🁡',\n codepoint: 127073,\n },\n {\n name: 'DOMINO TILE VERTICAL BACK',\n value: '🁢',\n codepoint: 127074,\n },\n {\n name: 'DOMINO TILE VERTICAL-00-00',\n value: '🁣',\n codepoint: 127075,\n },\n {\n name: 'DOMINO TILE VERTICAL-00-01',\n value: '🁤',\n codepoint: 127076,\n },\n {\n name: 'DOMINO TILE VERTICAL-00-02',\n value: '🁥',\n codepoint: 127077,\n },\n {\n name: 'DOMINO TILE VERTICAL-00-03',\n value: '🁦',\n codepoint: 127078,\n },\n {\n name: 'DOMINO TILE VERTICAL-00-04',\n value: '🁧',\n codepoint: 127079,\n },\n {\n name: 'DOMINO TILE VERTICAL-00-05',\n value: '🁨',\n codepoint: 127080,\n },\n {\n name: 'DOMINO TILE VERTICAL-00-06',\n value: '🁩',\n codepoint: 127081,\n },\n {\n name: 'DOMINO TILE VERTICAL-01-00',\n value: '🁪',\n codepoint: 127082,\n },\n {\n name: 'DOMINO TILE VERTICAL-01-01',\n value: '🁫',\n codepoint: 127083,\n },\n {\n name: 'DOMINO TILE VERTICAL-01-02',\n value: '🁬',\n codepoint: 127084,\n },\n {\n name: 'DOMINO TILE VERTICAL-01-03',\n value: '🁭',\n codepoint: 127085,\n },\n {\n name: 'DOMINO TILE VERTICAL-01-04',\n value: '🁮',\n codepoint: 127086,\n },\n {\n name: 'DOMINO TILE VERTICAL-01-05',\n value: '🁯',\n codepoint: 127087,\n },\n {\n name: 'DOMINO TILE VERTICAL-01-06',\n value: '🁰',\n codepoint: 127088,\n },\n {\n name: 'DOMINO TILE VERTICAL-02-00',\n value: '🁱',\n codepoint: 127089,\n },\n {\n name: 'DOMINO TILE VERTICAL-02-01',\n value: '🁲',\n codepoint: 127090,\n },\n {\n name: 'DOMINO TILE VERTICAL-02-02',\n value: '🁳',\n codepoint: 127091,\n },\n {\n name: 'DOMINO TILE VERTICAL-02-03',\n value: '🁴',\n codepoint: 127092,\n },\n {\n name: 'DOMINO TILE VERTICAL-02-04',\n value: '🁵',\n codepoint: 127093,\n },\n {\n name: 'DOMINO TILE VERTICAL-02-05',\n value: '🁶',\n codepoint: 127094,\n },\n {\n name: 'DOMINO TILE VERTICAL-02-06',\n value: '🁷',\n codepoint: 127095,\n },\n {\n name: 'DOMINO TILE VERTICAL-03-00',\n value: '🁸',\n codepoint: 127096,\n },\n {\n name: 'DOMINO TILE VERTICAL-03-01',\n value: '🁹',\n codepoint: 127097,\n },\n {\n name: 'DOMINO TILE VERTICAL-03-02',\n value: '🁺',\n codepoint: 127098,\n },\n {\n name: 'DOMINO TILE VERTICAL-03-03',\n value: '🁻',\n codepoint: 127099,\n },\n {\n name: 'DOMINO TILE VERTICAL-03-04',\n value: '🁼',\n codepoint: 127100,\n },\n {\n name: 'DOMINO TILE VERTICAL-03-05',\n value: '🁽',\n codepoint: 127101,\n },\n {\n name: 'DOMINO TILE VERTICAL-03-06',\n value: '🁾',\n codepoint: 127102,\n },\n {\n name: 'DOMINO TILE VERTICAL-04-00',\n value: '🁿',\n codepoint: 127103,\n },\n {\n name: 'DOMINO TILE VERTICAL-04-01',\n value: '🂀',\n codepoint: 127104,\n },\n {\n name: 'DOMINO TILE VERTICAL-04-02',\n value: '🂁',\n codepoint: 127105,\n },\n {\n name: 'DOMINO TILE VERTICAL-04-03',\n value: '🂂',\n codepoint: 127106,\n },\n {\n name: 'DOMINO TILE VERTICAL-04-04',\n value: '🂃',\n codepoint: 127107,\n },\n {\n name: 'DOMINO TILE VERTICAL-04-05',\n value: '🂄',\n codepoint: 127108,\n },\n {\n name: 'DOMINO TILE VERTICAL-04-06',\n value: '🂅',\n codepoint: 127109,\n },\n {\n name: 'DOMINO TILE VERTICAL-05-00',\n value: '🂆',\n codepoint: 127110,\n },\n {\n name: 'DOMINO TILE VERTICAL-05-01',\n value: '🂇',\n codepoint: 127111,\n },\n {\n name: 'DOMINO TILE VERTICAL-05-02',\n value: '🂈',\n codepoint: 127112,\n },\n {\n name: 'DOMINO TILE VERTICAL-05-03',\n value: '🂉',\n codepoint: 127113,\n },\n {\n name: 'DOMINO TILE VERTICAL-05-04',\n value: '🂊',\n codepoint: 127114,\n },\n {\n name: 'DOMINO TILE VERTICAL-05-05',\n value: '🂋',\n codepoint: 127115,\n },\n {\n name: 'DOMINO TILE VERTICAL-05-06',\n value: '🂌',\n codepoint: 127116,\n },\n {\n name: 'DOMINO TILE VERTICAL-06-00',\n value: '🂍',\n codepoint: 127117,\n },\n {\n name: 'DOMINO TILE VERTICAL-06-01',\n value: '🂎',\n codepoint: 127118,\n },\n {\n name: 'DOMINO TILE VERTICAL-06-02',\n value: '🂏',\n codepoint: 127119,\n },\n {\n name: 'DOMINO TILE VERTICAL-06-03',\n value: '🂐',\n codepoint: 127120,\n },\n {\n name: 'DOMINO TILE VERTICAL-06-04',\n value: '🂑',\n codepoint: 127121,\n },\n {\n name: 'DOMINO TILE VERTICAL-06-05',\n value: '🂒',\n codepoint: 127122,\n },\n {\n name: 'DOMINO TILE VERTICAL-06-06',\n value: '🂓',\n codepoint: 127123,\n },\n {\n name: 'PLAYING CARD BACK',\n value: '🂠',\n codepoint: 127136,\n },\n {\n name: 'PLAYING CARD ACE OF SPADES',\n value: '🂡',\n codepoint: 127137,\n },\n {\n name: 'PLAYING CARD TWO OF SPADES',\n value: '🂢',\n codepoint: 127138,\n },\n {\n name: 'PLAYING CARD THREE OF SPADES',\n value: '🂣',\n codepoint: 127139,\n },\n {\n name: 'PLAYING CARD FOUR OF SPADES',\n value: '🂤',\n codepoint: 127140,\n },\n {\n name: 'PLAYING CARD FIVE OF SPADES',\n value: '🂥',\n codepoint: 127141,\n },\n {\n name: 'PLAYING CARD SIX OF SPADES',\n value: '🂦',\n codepoint: 127142,\n },\n {\n name: 'PLAYING CARD SEVEN OF SPADES',\n value: '🂧',\n codepoint: 127143,\n },\n {\n name: 'PLAYING CARD EIGHT OF SPADES',\n value: '🂨',\n codepoint: 127144,\n },\n {\n name: 'PLAYING CARD NINE OF SPADES',\n value: '🂩',\n codepoint: 127145,\n },\n {\n name: 'PLAYING CARD TEN OF SPADES',\n value: '🂪',\n codepoint: 127146,\n },\n {\n name: 'PLAYING CARD JACK OF SPADES',\n value: '🂫',\n codepoint: 127147,\n },\n {\n name: 'PLAYING CARD KNIGHT OF SPADES',\n value: '🂬',\n codepoint: 127148,\n },\n {\n name: 'PLAYING CARD QUEEN OF SPADES',\n value: '🂭',\n codepoint: 127149,\n },\n {\n name: 'PLAYING CARD KING OF SPADES',\n value: '🂮',\n codepoint: 127150,\n },\n {\n name: 'PLAYING CARD ACE OF HEARTS',\n value: '🂱',\n codepoint: 127153,\n },\n {\n name: 'PLAYING CARD TWO OF HEARTS',\n value: '🂲',\n codepoint: 127154,\n },\n {\n name: 'PLAYING CARD THREE OF HEARTS',\n value: '🂳',\n codepoint: 127155,\n },\n {\n name: 'PLAYING CARD FOUR OF HEARTS',\n value: '🂴',\n codepoint: 127156,\n },\n {\n name: 'PLAYING CARD FIVE OF HEARTS',\n value: '🂵',\n codepoint: 127157,\n },\n {\n name: 'PLAYING CARD SIX OF HEARTS',\n value: '🂶',\n codepoint: 127158,\n },\n {\n name: 'PLAYING CARD SEVEN OF HEARTS',\n value: '🂷',\n codepoint: 127159,\n },\n {\n name: 'PLAYING CARD EIGHT OF HEARTS',\n value: '🂸',\n codepoint: 127160,\n },\n {\n name: 'PLAYING CARD NINE OF HEARTS',\n value: '🂹',\n codepoint: 127161,\n },\n {\n name: 'PLAYING CARD TEN OF HEARTS',\n value: '🂺',\n codepoint: 127162,\n },\n {\n name: 'PLAYING CARD JACK OF HEARTS',\n value: '🂻',\n codepoint: 127163,\n },\n {\n name: 'PLAYING CARD KNIGHT OF HEARTS',\n value: '🂼',\n codepoint: 127164,\n },\n {\n name: 'PLAYING CARD QUEEN OF HEARTS',\n value: '🂽',\n codepoint: 127165,\n },\n {\n name: 'PLAYING CARD KING OF HEARTS',\n value: '🂾',\n codepoint: 127166,\n },\n {\n name: 'PLAYING CARD ACE OF DIAMONDS',\n value: '🃁',\n codepoint: 127169,\n },\n {\n name: 'PLAYING CARD TWO OF DIAMONDS',\n value: '🃂',\n codepoint: 127170,\n },\n {\n name: 'PLAYING CARD THREE OF DIAMONDS',\n value: '🃃',\n codepoint: 127171,\n },\n {\n name: 'PLAYING CARD FOUR OF DIAMONDS',\n value: '🃄',\n codepoint: 127172,\n },\n {\n name: 'PLAYING CARD FIVE OF DIAMONDS',\n value: '🃅',\n codepoint: 127173,\n },\n {\n name: 'PLAYING CARD SIX OF DIAMONDS',\n value: '🃆',\n codepoint: 127174,\n },\n {\n name: 'PLAYING CARD SEVEN OF DIAMONDS',\n value: '🃇',\n codepoint: 127175,\n },\n {\n name: 'PLAYING CARD EIGHT OF DIAMONDS',\n value: '🃈',\n codepoint: 127176,\n },\n {\n name: 'PLAYING CARD NINE OF DIAMONDS',\n value: '🃉',\n codepoint: 127177,\n },\n {\n name: 'PLAYING CARD TEN OF DIAMONDS',\n value: '🃊',\n codepoint: 127178,\n },\n {\n name: 'PLAYING CARD JACK OF DIAMONDS',\n value: '🃋',\n codepoint: 127179,\n },\n {\n name: 'PLAYING CARD KNIGHT OF DIAMONDS',\n value: '🃌',\n codepoint: 127180,\n },\n {\n name: 'PLAYING CARD QUEEN OF DIAMONDS',\n value: '🃍',\n codepoint: 127181,\n },\n {\n name: 'PLAYING CARD KING OF DIAMONDS',\n value: '🃎',\n codepoint: 127182,\n },\n {\n name: 'PLAYING CARD ACE OF CLUBS',\n value: '🃑',\n codepoint: 127185,\n },\n {\n name: 'PLAYING CARD TWO OF CLUBS',\n value: '🃒',\n codepoint: 127186,\n },\n {\n name: 'PLAYING CARD THREE OF CLUBS',\n value: '🃓',\n codepoint: 127187,\n },\n {\n name: 'PLAYING CARD FOUR OF CLUBS',\n value: '🃔',\n codepoint: 127188,\n },\n {\n name: 'PLAYING CARD FIVE OF CLUBS',\n value: '🃕',\n codepoint: 127189,\n },\n {\n name: 'PLAYING CARD SIX OF CLUBS',\n value: '🃖',\n codepoint: 127190,\n },\n {\n name: 'PLAYING CARD SEVEN OF CLUBS',\n value: '🃗',\n codepoint: 127191,\n },\n {\n name: 'PLAYING CARD EIGHT OF CLUBS',\n value: '🃘',\n codepoint: 127192,\n },\n {\n name: 'PLAYING CARD NINE OF CLUBS',\n value: '🃙',\n codepoint: 127193,\n },\n {\n name: 'PLAYING CARD TEN OF CLUBS',\n value: '🃚',\n codepoint: 127194,\n },\n {\n name: 'PLAYING CARD JACK OF CLUBS',\n value: '🃛',\n codepoint: 127195,\n },\n {\n name: 'PLAYING CARD KNIGHT OF CLUBS',\n value: '🃜',\n codepoint: 127196,\n },\n {\n name: 'PLAYING CARD QUEEN OF CLUBS',\n value: '🃝',\n codepoint: 127197,\n },\n {\n name: 'PLAYING CARD KING OF CLUBS',\n value: '🃞',\n codepoint: 127198,\n },\n {\n name: 'PLAYING CARD WHITE JOKER',\n value: '🃟',\n codepoint: 127199,\n },\n ],\n },\n {\n name: 'Music',\n symbols: [\n {\n name: 'MUSICAL SYMBOL SINGLE BARLINE',\n value: '𝄀',\n codepoint: 119040,\n },\n {\n name: 'MUSICAL SYMBOL DOUBLE BARLINE',\n value: '𝄁',\n codepoint: 119041,\n },\n {\n name: 'MUSICAL SYMBOL FINAL BARLINE',\n value: '𝄂',\n codepoint: 119042,\n },\n {\n name: 'MUSICAL SYMBOL REVERSE FINAL BARLINE',\n value: '𝄃',\n codepoint: 119043,\n },\n {\n name: 'MUSICAL SYMBOL DASHED BARLINE',\n value: '𝄄',\n codepoint: 119044,\n },\n {\n name: 'MUSICAL SYMBOL SHORT BARLINE',\n value: '𝄅',\n codepoint: 119045,\n },\n {\n name: 'MUSICAL SYMBOL LEFT REPEAT SIGN',\n value: '𝄆',\n codepoint: 119046,\n },\n {\n name: 'MUSICAL SYMBOL RIGHT REPEAT SIGN',\n value: '𝄇',\n codepoint: 119047,\n },\n {\n name: 'MUSICAL SYMBOL REPEAT DOTS',\n value: '𝄈',\n codepoint: 119048,\n },\n {\n name: 'MUSICAL SYMBOL FERMATA',\n value: '𝄐',\n codepoint: 119056,\n },\n {\n name: 'MUSICAL SYMBOL FERMATA BELOW',\n value: '𝄑',\n codepoint: 119057,\n },\n {\n name: 'MUSICAL SYMBOL BREATH MARK',\n value: '𝄒',\n codepoint: 119058,\n },\n {\n name: 'MUSICAL SYMBOL G CLEF',\n value: '𝄞',\n codepoint: 119070,\n },\n {\n name: 'MUSICAL SYMBOL C CLEF',\n value: '𝄡',\n codepoint: 119073,\n },\n {\n name: 'MUSICAL SYMBOL F CLEF',\n value: '𝄢',\n codepoint: 119074,\n },\n {\n name: 'MUSICAL SYMBOL DOUBLE SHARP',\n value: '𝄪',\n codepoint: 119082,\n },\n {\n name: 'MUSICAL SYMBOL DOUBLE FLAT',\n value: '𝄫',\n codepoint: 119083,\n },\n {\n name: 'MUSICAL SYMBOL CRESCENDO',\n value: '𝆒',\n codepoint: 119186,\n },\n {\n name: 'MUSICAL SYMBOL DECRESCENDO',\n value: '𝆓',\n codepoint: 119187,\n },\n {\n name: 'MUSICAL SYMBOL HAUPTSTIMME',\n value: '𝆦',\n codepoint: 119206,\n },\n {\n name: 'MUSICAL SYMBOL NEBENSTIMME',\n value: '𝆧',\n codepoint: 119207,\n },\n {\n name: 'MUSICAL SYMBOL END OF STIMME',\n value: '𝆨',\n codepoint: 119208,\n },\n {\n name: 'MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA',\n value: '𝇇',\n codepoint: 119239,\n },\n {\n name: 'MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA',\n value: '𝇈',\n codepoint: 119240,\n },\n {\n name: 'MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1',\n value: '𝇉',\n codepoint: 119241,\n },\n {\n name: 'MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA',\n value: '𝇊',\n codepoint: 119242,\n },\n {\n name: 'MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA',\n value: '𝇋',\n codepoint: 119243,\n },\n {\n name: 'MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1',\n value: '𝇌',\n codepoint: 119244,\n },\n {\n name: 'MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2',\n value: '𝇍',\n codepoint: 119245,\n },\n {\n name: 'MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3',\n value: '𝇎',\n codepoint: 119246,\n },\n ],\n },\n {\n name: 'Geometric Shapes',\n symbols: [\n {\n name: 'BLACK SQUARE',\n value: '■',\n codepoint: 9632,\n },\n {\n name: 'WHITE SQUARE',\n value: '□',\n codepoint: 9633,\n },\n {\n name: 'WHITE SQUARE WITH ROUNDED CORNERS',\n value: '▢',\n codepoint: 9634,\n },\n {\n name: 'WHITE SQUARE CONTAINING BLACK SMALL SQUARE',\n value: '▣',\n codepoint: 9635,\n },\n {\n name: 'SQUARE WITH HORIZONTAL FILL',\n value: '▤',\n codepoint: 9636,\n },\n {\n name: 'SQUARE WITH VERTICAL FILL',\n value: '▥',\n codepoint: 9637,\n },\n {\n name: 'SQUARE WITH ORTHOGONAL CROSSHATCH FILL',\n value: '▦',\n codepoint: 9638,\n },\n {\n name: 'SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL',\n value: '▧',\n codepoint: 9639,\n },\n {\n name: 'SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL',\n value: '▨',\n codepoint: 9640,\n },\n {\n name: 'SQUARE WITH DIAGONAL CROSSHATCH FILL',\n value: '▩',\n codepoint: 9641,\n },\n {\n name: 'BLACK RECTANGLE',\n value: '▬',\n codepoint: 9644,\n },\n {\n name: 'WHITE RECTANGLE',\n value: '▭',\n codepoint: 9645,\n },\n {\n name: 'BLACK VERTICAL RECTANGLE',\n value: '▮',\n codepoint: 9646,\n },\n {\n name: 'WHITE VERTICAL RECTANGLE',\n value: '▯',\n codepoint: 9647,\n },\n {\n name: 'BLACK PARALLELOGRAM',\n value: '▰',\n codepoint: 9648,\n },\n {\n name: 'WHITE PARALLELOGRAM',\n value: '▱',\n codepoint: 9649,\n },\n {\n name: 'BLACK UP-POINTING TRIANGLE',\n value: '▲',\n codepoint: 9650,\n },\n {\n name: 'WHITE UP-POINTING TRIANGLE',\n value: '△',\n codepoint: 9651,\n },\n {\n name: 'BLACK UP-POINTING SMALL TRIANGLE',\n value: '▴',\n codepoint: 9652,\n },\n {\n name: 'WHITE UP-POINTING SMALL TRIANGLE',\n value: '▵',\n codepoint: 9653,\n },\n {\n name: 'WHITE RIGHT-POINTING TRIANGLE',\n value: '▷',\n codepoint: 9655,\n },\n {\n name: 'BLACK RIGHT-POINTING SMALL TRIANGLE',\n value: '▸',\n codepoint: 9656,\n },\n {\n name: 'WHITE RIGHT-POINTING SMALL TRIANGLE',\n value: '▹',\n codepoint: 9657,\n },\n {\n name: 'BLACK RIGHT-POINTING POINTER',\n value: '►',\n codepoint: 9658,\n },\n {\n name: 'WHITE RIGHT-POINTING POINTER',\n value: '▻',\n codepoint: 9659,\n },\n {\n name: 'BLACK DOWN-POINTING TRIANGLE',\n value: '▼',\n codepoint: 9660,\n },\n {\n name: 'WHITE DOWN-POINTING TRIANGLE',\n value: '▽',\n codepoint: 9661,\n },\n {\n name: 'BLACK DOWN-POINTING SMALL TRIANGLE',\n value: '▾',\n codepoint: 9662,\n },\n {\n name: 'WHITE DOWN-POINTING SMALL TRIANGLE',\n value: '▿',\n codepoint: 9663,\n },\n {\n name: 'WHITE LEFT-POINTING TRIANGLE',\n value: '◁',\n codepoint: 9665,\n },\n {\n name: 'BLACK LEFT-POINTING SMALL TRIANGLE',\n value: '◂',\n codepoint: 9666,\n },\n {\n name: 'WHITE LEFT-POINTING SMALL TRIANGLE',\n value: '◃',\n codepoint: 9667,\n },\n {\n name: 'BLACK LEFT-POINTING POINTER',\n value: '◄',\n codepoint: 9668,\n },\n {\n name: 'WHITE LEFT-POINTING POINTER',\n value: '◅',\n codepoint: 9669,\n },\n {\n name: 'BLACK DIAMOND',\n value: '◆',\n codepoint: 9670,\n },\n {\n name: 'WHITE DIAMOND',\n value: '◇',\n codepoint: 9671,\n },\n {\n name: 'WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND',\n value: '◈',\n codepoint: 9672,\n },\n {\n name: 'FISHEYE',\n value: '◉',\n codepoint: 9673,\n },\n {\n name: 'LOZENGE',\n value: '◊',\n codepoint: 9674,\n },\n {\n name: 'WHITE CIRCLE',\n value: '○',\n codepoint: 9675,\n },\n {\n name: 'DOTTED CIRCLE',\n value: '◌',\n codepoint: 9676,\n },\n {\n name: 'CIRCLE WITH VERTICAL FILL',\n value: '◍',\n codepoint: 9677,\n },\n {\n name: 'BULLSEYE',\n value: '◎',\n codepoint: 9678,\n },\n {\n name: 'BLACK CIRCLE',\n value: '●',\n codepoint: 9679,\n },\n {\n name: 'CIRCLE WITH LEFT HALF BLACK',\n value: '◐',\n codepoint: 9680,\n },\n {\n name: 'CIRCLE WITH RIGHT HALF BLACK',\n value: '◑',\n codepoint: 9681,\n },\n {\n name: 'CIRCLE WITH LOWER HALF BLACK',\n value: '◒',\n codepoint: 9682,\n },\n {\n name: 'CIRCLE WITH UPPER HALF BLACK',\n value: '◓',\n codepoint: 9683,\n },\n {\n name: 'CIRCLE WITH UPPER RIGHT QUADRANT BLACK',\n value: '◔',\n codepoint: 9684,\n },\n {\n name: 'CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK',\n value: '◕',\n codepoint: 9685,\n },\n {\n name: 'LEFT HALF BLACK CIRCLE',\n value: '◖',\n codepoint: 9686,\n },\n {\n name: 'RIGHT HALF BLACK CIRCLE',\n value: '◗',\n codepoint: 9687,\n },\n {\n name: 'INVERSE BULLET',\n value: '◘',\n codepoint: 9688,\n },\n {\n name: 'INVERSE WHITE CIRCLE',\n value: '◙',\n codepoint: 9689,\n },\n {\n name: 'UPPER HALF INVERSE WHITE CIRCLE',\n value: '◚',\n codepoint: 9690,\n },\n {\n name: 'LOWER HALF INVERSE WHITE CIRCLE',\n value: '◛',\n codepoint: 9691,\n },\n {\n name: 'UPPER LEFT QUADRANT CIRCULAR ARC',\n value: '◜',\n codepoint: 9692,\n },\n {\n name: 'UPPER RIGHT QUADRANT CIRCULAR ARC',\n value: '◝',\n codepoint: 9693,\n },\n {\n name: 'LOWER RIGHT QUADRANT CIRCULAR ARC',\n value: '◞',\n codepoint: 9694,\n },\n {\n name: 'LOWER LEFT QUADRANT CIRCULAR ARC',\n value: '◟',\n codepoint: 9695,\n },\n {\n name: 'UPPER HALF CIRCLE',\n value: '◠',\n codepoint: 9696,\n },\n {\n name: 'LOWER HALF CIRCLE',\n value: '◡',\n codepoint: 9697,\n },\n {\n name: 'BLACK LOWER RIGHT TRIANGLE',\n value: '◢',\n codepoint: 9698,\n },\n {\n name: 'BLACK LOWER LEFT TRIANGLE',\n value: '◣',\n codepoint: 9699,\n },\n {\n name: 'BLACK UPPER LEFT TRIANGLE',\n value: '◤',\n codepoint: 9700,\n },\n {\n name: 'BLACK UPPER RIGHT TRIANGLE',\n value: '◥',\n codepoint: 9701,\n },\n {\n name: 'WHITE BULLET',\n value: '◦',\n codepoint: 9702,\n },\n {\n name: 'SQUARE WITH LEFT HALF BLACK',\n value: '◧',\n codepoint: 9703,\n },\n {\n name: 'SQUARE WITH RIGHT HALF BLACK',\n value: '◨',\n codepoint: 9704,\n },\n {\n name: 'SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK',\n value: '◩',\n codepoint: 9705,\n },\n {\n name: 'SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK',\n value: '◪',\n codepoint: 9706,\n },\n {\n name: 'WHITE SQUARE WITH VERTICAL BISECTING LINE',\n value: '◫',\n codepoint: 9707,\n },\n {\n name: 'WHITE UP-POINTING TRIANGLE WITH DOT',\n value: '◬',\n codepoint: 9708,\n },\n {\n name: 'UP-POINTING TRIANGLE WITH LEFT HALF BLACK',\n value: '◭',\n codepoint: 9709,\n },\n {\n name: 'UP-POINTING TRIANGLE WITH RIGHT HALF BLACK',\n value: '◮',\n codepoint: 9710,\n },\n {\n name: 'LARGE CIRCLE',\n value: '◯',\n codepoint: 9711,\n },\n {\n name: 'WHITE SQUARE WITH UPPER LEFT QUADRANT',\n value: '◰',\n codepoint: 9712,\n },\n {\n name: 'WHITE SQUARE WITH LOWER LEFT QUADRANT',\n value: '◱',\n codepoint: 9713,\n },\n {\n name: 'WHITE SQUARE WITH LOWER RIGHT QUADRANT',\n value: '◲',\n codepoint: 9714,\n },\n {\n name: 'WHITE SQUARE WITH UPPER RIGHT QUADRANT',\n value: '◳',\n codepoint: 9715,\n },\n {\n name: 'WHITE CIRCLE WITH UPPER LEFT QUADRANT',\n value: '◴',\n codepoint: 9716,\n },\n {\n name: 'WHITE CIRCLE WITH LOWER LEFT QUADRANT',\n value: '◵',\n codepoint: 9717,\n },\n {\n name: 'WHITE CIRCLE WITH LOWER RIGHT QUADRANT',\n value: '◶',\n codepoint: 9718,\n },\n {\n name: 'WHITE CIRCLE WITH UPPER RIGHT QUADRANT',\n value: '◷',\n codepoint: 9719,\n },\n {\n name: 'UPPER LEFT TRIANGLE',\n value: '◸',\n codepoint: 9720,\n },\n {\n name: 'UPPER RIGHT TRIANGLE',\n value: '◹',\n codepoint: 9721,\n },\n {\n name: 'LOWER LEFT TRIANGLE',\n value: '◺',\n codepoint: 9722,\n },\n {\n name: 'LOWER RIGHT TRIANGLE',\n value: '◿',\n codepoint: 9727,\n },\n ],\n },\n {\n name: 'Ideographic',\n symbols: [\n {\n name: 'IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT',\n value: '⿰',\n codepoint: 12272,\n },\n {\n name: 'IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW',\n value: '⿱',\n codepoint: 12273,\n },\n {\n name: 'IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT',\n value: '⿲',\n codepoint: 12274,\n },\n {\n name: 'IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW',\n value: '⿳',\n codepoint: 12275,\n },\n {\n name: 'IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND',\n value: '⿴',\n codepoint: 12276,\n },\n {\n name: 'IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE',\n value: '⿵',\n codepoint: 12277,\n },\n {\n name: 'IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW',\n value: '⿶',\n codepoint: 12278,\n },\n {\n name: 'IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT',\n value: '⿷',\n codepoint: 12279,\n },\n {\n name: 'IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT',\n value: '⿸',\n codepoint: 12280,\n },\n {\n name: 'IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT',\n value: '⿹',\n codepoint: 12281,\n },\n {\n name: 'IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT',\n value: '⿺',\n codepoint: 12282,\n },\n {\n name: 'IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID',\n value: '⿻',\n codepoint: 12283,\n },\n ],\n },\n];\n\nexport default symbols;\n","/*\n * insert_emoji.tsx\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { PluginKey, EditorState } from 'prosemirror-state';\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\n\nimport React from 'react';\n\nimport { EditorUI } from '../../api/ui';\nimport { emojiCategories, emojis, Emoji, emojiFromString, SkinTone } from '../../api/emoji';\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { nodeForEmoji } from '../../marks/emoji/emoji';\nimport { OmniInsertGroup } from '../../api/omni_insert';\n\nimport { performInsertSymbol, InsertSymbolPlugin } from './insert_symbol-plugin';\nimport { SymbolDataProvider, SymbolCharacter } from './insert_symbol-dataprovider';\nimport { SymbolEmojiPreferencesPanel } from './insert_symbol-emoji-skintone';\n\nconst key = new PluginKey<boolean>('insert-emoji');\n\nconst extension = (context: ExtensionContext): Extension => {\n const { ui, events } = context;\n return {\n commands: () => {\n return [new ProsemirrorCommand(EditorCommandId.Emoji, [], performInsertSymbol(key), emojiOmniInsert(ui))];\n },\n plugins: (_schema: Schema) => {\n return [new InsertSymbolPlugin(key, new EmojiSymbolDataProvider(ui), ui, events)];\n },\n };\n};\n\nfunction emojiOmniInsert(ui: EditorUI) {\n return {\n name: ui.context.translateText('Emoji...'),\n description: ui.context.translateText('Image expressing idea, emotion, etc.'),\n group: OmniInsertGroup.Content,\n priority: 6,\n image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.emoji_dark! : ui.images.omni_insert?.emoji!),\n };\n}\n\nexport class EmojiSymbolDataProvider implements SymbolDataProvider {\n public constructor(ui: EditorUI) {\n this.ui = ui;\n }\n private readonly ui: EditorUI;\n\n public readonly filterPlaceholderHint = 'emoji name';\n\n public readonly symbolPreviewStyle: React.CSSProperties = { fontSize: '36px' } as React.CSSProperties;\n\n public symbolPreferencesPanel = SymbolEmojiPreferencesPanel;\n\n public insertSymbolTransaction(symbolCharacter: SymbolCharacter, searchTerm: string, state: EditorState) {\n const emoji = emojiFromString(symbolCharacter.value, this.skinTone());\n const tr = state.tr;\n if (emoji) {\n // Try to find an alias that matches the user's search term\n const bestAlias = emoji.aliases.find(alias => alias.includes(searchTerm));\n tr.replaceSelectionWith(nodeForEmoji(state.schema, emoji, bestAlias || emoji.aliases[0], false), false);\n } else {\n // This doesn't appear to be an emoji or it doesn't have a markdown representation,\n // just insert the text\n tr.insertText(symbolCharacter.value);\n }\n return tr;\n }\n\n public symbolGroupNames(): string[] {\n return [kCategoryAll, ...emojiCategories()];\n }\n\n public getSymbols(groupName: string | undefined) {\n if (groupName === kCategoryAll || groupName === undefined) {\n return emojis(this.skinTone()).map(emoji => symbolForEmoji(emoji));\n } else {\n return emojis(this.skinTone())\n .filter(emoji => emoji.category === groupName)\n .map(emoji => symbolForEmoji(emoji));\n }\n }\n\n public filterSymbols(filterText: string, symbols: SymbolCharacter[]): SymbolCharacter[] {\n const filteredSymbols = symbols.filter(symbol => {\n // Search by name\n if (symbol.name.includes(filterText)) {\n return true;\n }\n\n // search each of the aliases\n if (symbol.aliases && symbol.aliases.find(alias => alias.includes(filterText))) {\n return true;\n }\n\n return false;\n });\n return filteredSymbols;\n }\n\n private skinTone(): SkinTone {\n return this.ui.prefs.emojiSkinTone();\n }\n}\n\nconst kCategoryAll = 'All';\nfunction symbolForEmoji(emoji: Emoji): SymbolCharacter {\n return {\n name: emoji.description,\n value: emoji.emoji,\n markdown: emoji.hasMarkdownRepresentation ? `:${emoji.aliases[0]}:` : undefined,\n aliases: emoji.aliases,\n description: emoji.description,\n };\n}\n\nexport default extension;\n","/*\n * emoji.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport kEmojis from './emojis-all';\n\nexport const kEmojiAttr = 0;\nexport const kEmojiContent = 1;\n\n// A raw emoji which doesn't include skin tone information\nexport interface EmojiRaw {\n emojiRaw: string;\n aliases: string[];\n category: string;\n description: string;\n supportsSkinTone?: boolean;\n hasMarkdownRepresentation: boolean;\n}\n\n// A complete emoji that may additional render skintone\nexport interface Emoji extends EmojiRaw {\n emoji: string;\n skinTone: SkinTone;\n}\n\n// Skin tones that are permitted for emoji\n// None = user hasn't expressed a preference\n// Default = don't apply a skin tone (use yellow emoji)\nexport enum SkinTone {\n None = -1,\n Default = 0,\n Light = 0x1f3fb,\n MediumLight = 0x1f3fc,\n Medium = 0x1f3fd,\n MediumDark = 0x1f3fe,\n Dark = 0x1f3ff,\n}\n\nfunction hasSkinTone(skinTone: SkinTone): boolean {\n return skinTone !== SkinTone.None && skinTone !== SkinTone.Default;\n}\n\nexport function emojis(skinTone: SkinTone): Emoji[] {\n return kEmojis.map(emoji => emojiWithSkinTone(emoji, skinTone));\n}\n\nexport function emojiCategories(): string[] {\n return kEmojis\n .map(emoji => emoji.category)\n .filter((catgegory, index, categories) => categories.indexOf(catgegory) === index);\n}\n\nexport function emojiFromString(emojiString: string, skinTone: SkinTone): Emoji | undefined {\n return emojis(skinTone).find(em => em.emoji === emojiString);\n}\n\nexport function emojiWithSkinTonePreference(emoji: EmojiRaw, skinTone: SkinTone): Emoji {\n return emojiWithSkinTone(emoji, skinTone);\n}\n\n// Find a matching non skin toned emoji for a given string\nexport function emojiFromChar(emojiString: string): EmojiRaw | undefined {\n return kEmojis.find(emoji => emoji.emojiRaw === emojiString);\n}\n\n// Returns a non skin tonned emoji for a given alias.\nexport function emojiFromAlias(emojiAlias: string): EmojiRaw | undefined {\n for (const emoji of kEmojis) {\n if (emoji.aliases.includes(emojiAlias)) {\n return emoji;\n }\n }\n return undefined;\n}\n\n// Returns an array of skin toned emoji including the unskintoned emoji. If the emoji\n// doesn't support skin tones, this returns the original emoji.\nexport function emojiForAllSkinTones(emoji: EmojiRaw): Emoji[] {\n if (emoji.supportsSkinTone) {\n return [\n emojiWithSkinTone(emoji, SkinTone.Default),\n emojiWithSkinTone(emoji, SkinTone.Light),\n emojiWithSkinTone(emoji, SkinTone.MediumLight),\n emojiWithSkinTone(emoji, SkinTone.Medium),\n emojiWithSkinTone(emoji, SkinTone.MediumDark),\n emojiWithSkinTone(emoji, SkinTone.Dark),\n ];\n } else {\n return [emojiWithSkinTone(emoji, SkinTone.Default)];\n }\n}\n\n// Returns a skin toned version of the emoji, or the original emoji if it\n// doesn't support skin tones\nfunction emojiWithSkinTone(emoji: EmojiRaw, skinTone: SkinTone): Emoji {\n if (!emoji.supportsSkinTone) {\n return { ...emoji, emoji: emoji.emojiRaw, skinTone: SkinTone.Default };\n }\n\n const skinToneEmoji: Emoji = {\n emojiRaw: emoji.emojiRaw,\n aliases: emoji.aliases,\n category: emoji.category,\n description: emoji.description,\n supportsSkinTone: emoji.supportsSkinTone,\n hasMarkdownRepresentation: emoji.hasMarkdownRepresentation,\n emoji: emoji.emojiRaw + characterForSkinTone(skinTone), //\n skinTone,\n };\n return skinToneEmoji;\n}\n\n// No skin tone returns an empty string, otherwise the skintone codepoint\n// is converted into a string\nfunction characterForSkinTone(skinTone: SkinTone): string {\n return hasSkinTone(skinTone) ? String.fromCodePoint(skinTone) : '';\n}\n","import { EmojiRaw } from './emoji';\n\nconst emjois: EmojiRaw[] = [\n {\n \"emojiRaw\": \"😀\",\n \"description\": \"grinning face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"grinning\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😃\",\n \"description\": \"grinning face with big eyes\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"smiley\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😄\",\n \"description\": \"grinning face with smiling eyes\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"smile\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😁\",\n \"description\": \"beaming face with smiling eyes\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"grin\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😆\",\n \"description\": \"grinning squinting face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"laughing\",\n \"satisfied\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😅\",\n \"description\": \"grinning face with sweat\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"sweat_smile\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤣\",\n \"description\": \"rolling on the floor laughing\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"rofl\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😂\",\n \"description\": \"face with tears of joy\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"joy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙂\",\n \"description\": \"slightly smiling face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"slightly_smiling_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙃\",\n \"description\": \"upside-down face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"upside_down_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😉\",\n \"description\": \"winking face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"wink\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😊\",\n \"description\": \"smiling face with smiling eyes\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"blush\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😇\",\n \"description\": \"smiling face with halo\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"innocent\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥰\",\n \"description\": \"smiling face with hearts\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"smiling_face_with_three_hearts\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😍\",\n \"description\": \"smiling face with heart-eyes\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"heart_eyes\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤩\",\n \"description\": \"star-struck\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"star_struck\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😘\",\n \"description\": \"face blowing a kiss\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"kissing_heart\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😗\",\n \"description\": \"kissing face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"kissing\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😚\",\n \"description\": \"kissing face with closed eyes\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"kissing_closed_eyes\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😙\",\n \"description\": \"kissing face with smiling eyes\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"kissing_smiling_eyes\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😋\",\n \"description\": \"face savoring food\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"yum\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😛\",\n \"description\": \"face with tongue\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"stuck_out_tongue\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😜\",\n \"description\": \"winking face with tongue\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"stuck_out_tongue_winking_eye\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤪\",\n \"description\": \"zany face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"zany_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😝\",\n \"description\": \"squinting face with tongue\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"stuck_out_tongue_closed_eyes\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤑\",\n \"description\": \"money-mouth face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"money_mouth_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤗\",\n \"description\": \"hugging face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"hugs\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤭\",\n \"description\": \"face with hand over mouth\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"hand_over_mouth\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤫\",\n \"description\": \"shushing face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"shushing_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤔\",\n \"description\": \"thinking face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"thinking\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤐\",\n \"description\": \"zipper-mouth face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"zipper_mouth_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤨\",\n \"description\": \"face with raised eyebrow\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"raised_eyebrow\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😐\",\n \"description\": \"neutral face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"neutral_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😑\",\n \"description\": \"expressionless face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"expressionless\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😶\",\n \"description\": \"face without mouth\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"no_mouth\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😏\",\n \"description\": \"smirking face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"smirk\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😒\",\n \"description\": \"unamused face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"unamused\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙄\",\n \"description\": \"face with rolling eyes\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"roll_eyes\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😬\",\n \"description\": \"grimacing face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"grimacing\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤥\",\n \"description\": \"lying face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"lying_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😌\",\n \"description\": \"relieved face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"relieved\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😔\",\n \"description\": \"pensive face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"pensive\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😪\",\n \"description\": \"sleepy face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"sleepy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤤\",\n \"description\": \"drooling face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"drooling_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😴\",\n \"description\": \"sleeping face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"sleeping\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😷\",\n \"description\": \"face with medical mask\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"mask\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤒\",\n \"description\": \"face with thermometer\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"face_with_thermometer\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤕\",\n \"description\": \"face with head-bandage\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"face_with_head_bandage\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤢\",\n \"description\": \"nauseated face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"nauseated_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤮\",\n \"description\": \"face vomiting\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"vomiting_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤧\",\n \"description\": \"sneezing face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"sneezing_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥵\",\n \"description\": \"hot face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"hot_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥶\",\n \"description\": \"cold face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"cold_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥴\",\n \"description\": \"woozy face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"woozy_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😵\",\n \"description\": \"dizzy face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"dizzy_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤯\",\n \"description\": \"exploding head\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"exploding_head\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤠\",\n \"description\": \"cowboy hat face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"cowboy_hat_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥳\",\n \"description\": \"partying face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"partying_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😎\",\n \"description\": \"smiling face with sunglasses\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"sunglasses\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤓\",\n \"description\": \"nerd face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"nerd_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧐\",\n \"description\": \"face with monocle\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"monocle_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😕\",\n \"description\": \"confused face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"confused\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😟\",\n \"description\": \"worried face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"worried\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙁\",\n \"description\": \"slightly frowning face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"slightly_frowning_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😮\",\n \"description\": \"face with open mouth\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"open_mouth\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😯\",\n \"description\": \"hushed face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"hushed\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😲\",\n \"description\": \"astonished face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"astonished\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😳\",\n \"description\": \"flushed face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"flushed\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥺\",\n \"description\": \"pleading face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"pleading_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😦\",\n \"description\": \"frowning face with open mouth\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"frowning\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😧\",\n \"description\": \"anguished face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"anguished\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😨\",\n \"description\": \"fearful face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"fearful\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😰\",\n \"description\": \"anxious face with sweat\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"cold_sweat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😥\",\n \"description\": \"sad but relieved face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"disappointed_relieved\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😢\",\n \"description\": \"crying face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"cry\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😭\",\n \"description\": \"loudly crying face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"sob\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😱\",\n \"description\": \"face screaming in fear\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"scream\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😖\",\n \"description\": \"confounded face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"confounded\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😣\",\n \"description\": \"persevering face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"persevere\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😞\",\n \"description\": \"disappointed face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"disappointed\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😓\",\n \"description\": \"downcast face with sweat\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"sweat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😩\",\n \"description\": \"weary face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"weary\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😫\",\n \"description\": \"tired face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"tired_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥱\",\n \"description\": \"yawning face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"yawning_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😤\",\n \"description\": \"face with steam from nose\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"triumph\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😡\",\n \"description\": \"pouting face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"rage\",\n \"pout\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😠\",\n \"description\": \"angry face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"angry\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤬\",\n \"description\": \"face with symbols on mouth\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"cursing_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😈\",\n \"description\": \"smiling face with horns\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"smiling_imp\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👿\",\n \"description\": \"angry face with horns\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"imp\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💀\",\n \"description\": \"skull\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"skull\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"☠️\",\n \"description\": \"skull and crossbones\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"skull_and_crossbones\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💩\",\n \"description\": \"pile of poo\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"hankey\",\n \"poop\",\n \"shit\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤡\",\n \"description\": \"clown face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"clown_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👹\",\n \"description\": \"ogre\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"japanese_ogre\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👺\",\n \"description\": \"goblin\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"japanese_goblin\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👻\",\n \"description\": \"ghost\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"ghost\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👽\",\n \"description\": \"alien\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"alien\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👾\",\n \"description\": \"alien monster\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"space_invader\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤖\",\n \"description\": \"robot\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"robot\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😺\",\n \"description\": \"grinning cat\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"smiley_cat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😸\",\n \"description\": \"grinning cat with smiling eyes\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"smile_cat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😹\",\n \"description\": \"cat with tears of joy\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"joy_cat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😻\",\n \"description\": \"smiling cat with heart-eyes\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"heart_eyes_cat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😼\",\n \"description\": \"cat with wry smile\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"smirk_cat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😽\",\n \"description\": \"kissing cat\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"kissing_cat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙀\",\n \"description\": \"weary cat\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"scream_cat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😿\",\n \"description\": \"crying cat\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"crying_cat_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😾\",\n \"description\": \"pouting cat\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"pouting_cat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙈\",\n \"description\": \"see-no-evil monkey\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"see_no_evil\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙉\",\n \"description\": \"hear-no-evil monkey\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"hear_no_evil\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙊\",\n \"description\": \"speak-no-evil monkey\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"speak_no_evil\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💋\",\n \"description\": \"kiss mark\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"kiss\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💌\",\n \"description\": \"love letter\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"love_letter\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💘\",\n \"description\": \"heart with arrow\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"cupid\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💝\",\n \"description\": \"heart with ribbon\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"gift_heart\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💖\",\n \"description\": \"sparkling heart\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"sparkling_heart\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💗\",\n \"description\": \"growing heart\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"heartpulse\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💓\",\n \"description\": \"beating heart\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"heartbeat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💞\",\n \"description\": \"revolving hearts\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"revolving_hearts\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💕\",\n \"description\": \"two hearts\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"two_hearts\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💟\",\n \"description\": \"heart decoration\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"heart_decoration\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"❣️\",\n \"description\": \"heart exclamation\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"heavy_heart_exclamation\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💔\",\n \"description\": \"broken heart\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"broken_heart\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"❤️\",\n \"description\": \"red heart\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"heart\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧡\",\n \"description\": \"orange heart\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"orange_heart\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💛\",\n \"description\": \"yellow heart\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"yellow_heart\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💚\",\n \"description\": \"green heart\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"green_heart\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💙\",\n \"description\": \"blue heart\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"blue_heart\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💜\",\n \"description\": \"purple heart\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"purple_heart\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤎\",\n \"description\": \"brown heart\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"brown_heart\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🖤\",\n \"description\": \"black heart\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"black_heart\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤍\",\n \"description\": \"white heart\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"white_heart\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💯\",\n \"description\": \"hundred points\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"100\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💢\",\n \"description\": \"anger symbol\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"anger\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💥\",\n \"description\": \"collision\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"boom\",\n \"collision\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💫\",\n \"description\": \"dizzy\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"dizzy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💦\",\n \"description\": \"sweat droplets\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"sweat_drops\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💨\",\n \"description\": \"dashing away\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"dash\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕳️\",\n \"description\": \"hole\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"hole\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💣\",\n \"description\": \"bomb\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"bomb\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💬\",\n \"description\": \"speech balloon\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"speech_balloon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👁️🗨️\",\n \"description\": \"eye in speech bubble\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"eye_speech_bubble\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🗨️\",\n \"description\": \"left speech bubble\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"left_speech_bubble\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🗯️\",\n \"description\": \"right anger bubble\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"right_anger_bubble\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💭\",\n \"description\": \"thought balloon\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"thought_balloon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💤\",\n \"description\": \"zzz\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"zzz\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👋\",\n \"description\": \"waving hand\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"wave\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤚\",\n \"description\": \"raised back of hand\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"raised_back_of_hand\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🖐️\",\n \"description\": \"hand with fingers splayed\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"raised_hand_with_fingers_splayed\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"✋\",\n \"description\": \"raised hand\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"hand\",\n \"raised_hand\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🖖\",\n \"description\": \"vulcan salute\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"vulcan_salute\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👌\",\n \"description\": \"OK hand\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"ok_hand\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤏\",\n \"description\": \"pinching hand\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"pinching_hand\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"✌️\",\n \"description\": \"victory hand\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"v\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤞\",\n \"description\": \"crossed fingers\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"crossed_fingers\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤟\",\n \"description\": \"love-you gesture\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"love_you_gesture\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤘\",\n \"description\": \"sign of the horns\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"metal\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤙\",\n \"description\": \"call me hand\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"call_me_hand\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👈\",\n \"description\": \"backhand index pointing left\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"point_left\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👉\",\n \"description\": \"backhand index pointing right\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"point_right\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👆\",\n \"description\": \"backhand index pointing up\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"point_up_2\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🖕\",\n \"description\": \"middle finger\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"middle_finger\",\n \"fu\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👇\",\n \"description\": \"backhand index pointing down\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"point_down\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"☝️\",\n \"description\": \"index pointing up\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"point_up\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👍\",\n \"description\": \"thumbs up\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"+1\",\n \"thumbsup\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👎\",\n \"description\": \"thumbs down\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"-1\",\n \"thumbsdown\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"✊\",\n \"description\": \"raised fist\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"fist_raised\",\n \"fist\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👊\",\n \"description\": \"oncoming fist\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"fist_oncoming\",\n \"facepunch\",\n \"punch\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤛\",\n \"description\": \"left-facing fist\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"fist_left\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤜\",\n \"description\": \"right-facing fist\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"fist_right\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👏\",\n \"description\": \"clapping hands\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"clap\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙌\",\n \"description\": \"raising hands\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"raised_hands\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👐\",\n \"description\": \"open hands\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"open_hands\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤲\",\n \"description\": \"palms up together\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"palms_up_together\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤝\",\n \"description\": \"handshake\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"handshake\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙏\",\n \"description\": \"folded hands\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"pray\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"✍️\",\n \"description\": \"writing hand\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"writing_hand\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💅\",\n \"description\": \"nail polish\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"nail_care\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤳\",\n \"description\": \"selfie\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"selfie\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💪\",\n \"description\": \"flexed biceps\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"muscle\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦾\",\n \"description\": \"mechanical arm\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"mechanical_arm\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦿\",\n \"description\": \"mechanical leg\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"mechanical_leg\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦵\",\n \"description\": \"leg\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"leg\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦶\",\n \"description\": \"foot\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"foot\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👂\",\n \"description\": \"ear\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"ear\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦻\",\n \"description\": \"ear with hearing aid\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"ear_with_hearing_aid\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👃\",\n \"description\": \"nose\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"nose\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧠\",\n \"description\": \"brain\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"brain\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦷\",\n \"description\": \"tooth\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"tooth\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦴\",\n \"description\": \"bone\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"bone\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👀\",\n \"description\": \"eyes\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"eyes\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👁️\",\n \"description\": \"eye\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"eye\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👅\",\n \"description\": \"tongue\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"tongue\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👄\",\n \"description\": \"mouth\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"lips\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👶\",\n \"description\": \"baby\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"baby\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧒\",\n \"description\": \"child\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"child\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👦\",\n \"description\": \"boy\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"boy\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👧\",\n \"description\": \"girl\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"girl\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑\",\n \"description\": \"person\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"adult\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👱\",\n \"description\": \"person: blond hair\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"blond_haired_person\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨\",\n \"description\": \"man\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧔\",\n \"description\": \"man: beard\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"bearded_person\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨🦰\",\n \"description\": \"man: red hair\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"red_haired_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨🦱\",\n \"description\": \"man: curly hair\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"curly_haired_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨🦳\",\n \"description\": \"man: white hair\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"white_haired_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨🦲\",\n \"description\": \"man: bald\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"bald_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩\",\n \"description\": \"woman\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩🦰\",\n \"description\": \"woman: red hair\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"red_haired_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑🦰\",\n \"description\": \"person: red hair\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"person_red_hair\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩🦱\",\n \"description\": \"woman: curly hair\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"curly_haired_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑🦱\",\n \"description\": \"person: curly hair\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"person_curly_hair\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩🦳\",\n \"description\": \"woman: white hair\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"white_haired_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑🦳\",\n \"description\": \"person: white hair\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"person_white_hair\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩🦲\",\n \"description\": \"woman: bald\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"bald_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑🦲\",\n \"description\": \"person: bald\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"person_bald\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👱♀️\",\n \"description\": \"woman: blond hair\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"blond_haired_woman\",\n \"blonde_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👱♂️\",\n \"description\": \"man: blond hair\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"blond_haired_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧓\",\n \"description\": \"older person\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"older_adult\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👴\",\n \"description\": \"old man\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"older_man\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👵\",\n \"description\": \"old woman\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"older_woman\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙍\",\n \"description\": \"person frowning\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"frowning_person\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙍♂️\",\n \"description\": \"man frowning\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"frowning_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙍♀️\",\n \"description\": \"woman frowning\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"frowning_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙎\",\n \"description\": \"person pouting\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"pouting_face\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙎♂️\",\n \"description\": \"man pouting\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"pouting_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙎♀️\",\n \"description\": \"woman pouting\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"pouting_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙅\",\n \"description\": \"person gesturing NO\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"no_good\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙅♂️\",\n \"description\": \"man gesturing NO\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"no_good_man\",\n \"ng_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙅♀️\",\n \"description\": \"woman gesturing NO\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"no_good_woman\",\n \"ng_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙆\",\n \"description\": \"person gesturing OK\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"ok_person\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙆♂️\",\n \"description\": \"man gesturing OK\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"ok_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙆♀️\",\n \"description\": \"woman gesturing OK\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"ok_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💁\",\n \"description\": \"person tipping hand\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"tipping_hand_person\",\n \"information_desk_person\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💁♂️\",\n \"description\": \"man tipping hand\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"tipping_hand_man\",\n \"sassy_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💁♀️\",\n \"description\": \"woman tipping hand\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"tipping_hand_woman\",\n \"sassy_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙋\",\n \"description\": \"person raising hand\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"raising_hand\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙋♂️\",\n \"description\": \"man raising hand\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"raising_hand_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙋♀️\",\n \"description\": \"woman raising hand\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"raising_hand_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧏\",\n \"description\": \"deaf person\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"deaf_person\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧏♂️\",\n \"description\": \"deaf man\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"deaf_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧏♀️\",\n \"description\": \"deaf woman\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"deaf_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙇\",\n \"description\": \"person bowing\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"bow\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙇♂️\",\n \"description\": \"man bowing\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"bowing_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙇♀️\",\n \"description\": \"woman bowing\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"bowing_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤦\",\n \"description\": \"person facepalming\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"facepalm\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤦♂️\",\n \"description\": \"man facepalming\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_facepalming\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤦♀️\",\n \"description\": \"woman facepalming\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_facepalming\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤷\",\n \"description\": \"person shrugging\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"shrug\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤷♂️\",\n \"description\": \"man shrugging\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_shrugging\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤷♀️\",\n \"description\": \"woman shrugging\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_shrugging\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑⚕️\",\n \"description\": \"health worker\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"health_worker\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨⚕️\",\n \"description\": \"man health worker\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_health_worker\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩⚕️\",\n \"description\": \"woman health worker\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_health_worker\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑🎓\",\n \"description\": \"student\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"student\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨🎓\",\n \"description\": \"man student\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_student\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩🎓\",\n \"description\": \"woman student\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_student\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑🏫\",\n \"description\": \"teacher\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"teacher\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨🏫\",\n \"description\": \"man teacher\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_teacher\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩🏫\",\n \"description\": \"woman teacher\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_teacher\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑⚖️\",\n \"description\": \"judge\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"judge\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨⚖️\",\n \"description\": \"man judge\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_judge\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩⚖️\",\n \"description\": \"woman judge\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_judge\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑🌾\",\n \"description\": \"farmer\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"farmer\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨🌾\",\n \"description\": \"man farmer\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_farmer\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩🌾\",\n \"description\": \"woman farmer\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_farmer\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑🍳\",\n \"description\": \"cook\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"cook\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨🍳\",\n \"description\": \"man cook\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_cook\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩🍳\",\n \"description\": \"woman cook\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_cook\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑🔧\",\n \"description\": \"mechanic\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"mechanic\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨🔧\",\n \"description\": \"man mechanic\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_mechanic\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩🔧\",\n \"description\": \"woman mechanic\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_mechanic\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑🏭\",\n \"description\": \"factory worker\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"factory_worker\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨🏭\",\n \"description\": \"man factory worker\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_factory_worker\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩🏭\",\n \"description\": \"woman factory worker\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_factory_worker\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑💼\",\n \"description\": \"office worker\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"office_worker\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨💼\",\n \"description\": \"man office worker\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_office_worker\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩💼\",\n \"description\": \"woman office worker\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_office_worker\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑🔬\",\n \"description\": \"scientist\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"scientist\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨🔬\",\n \"description\": \"man scientist\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_scientist\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩🔬\",\n \"description\": \"woman scientist\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_scientist\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑💻\",\n \"description\": \"technologist\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"technologist\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨💻\",\n \"description\": \"man technologist\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_technologist\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩💻\",\n \"description\": \"woman technologist\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_technologist\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑🎤\",\n \"description\": \"singer\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"singer\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨🎤\",\n \"description\": \"man singer\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_singer\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩🎤\",\n \"description\": \"woman singer\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_singer\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑🎨\",\n \"description\": \"artist\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"artist\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨🎨\",\n \"description\": \"man artist\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_artist\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩🎨\",\n \"description\": \"woman artist\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_artist\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑✈️\",\n \"description\": \"pilot\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"pilot\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨✈️\",\n \"description\": \"man pilot\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_pilot\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩✈️\",\n \"description\": \"woman pilot\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_pilot\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑🚀\",\n \"description\": \"astronaut\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"astronaut\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨🚀\",\n \"description\": \"man astronaut\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_astronaut\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩🚀\",\n \"description\": \"woman astronaut\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_astronaut\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑🚒\",\n \"description\": \"firefighter\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"firefighter\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨🚒\",\n \"description\": \"man firefighter\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_firefighter\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩🚒\",\n \"description\": \"woman firefighter\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_firefighter\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👮\",\n \"description\": \"police officer\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"police_officer\",\n \"cop\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👮♂️\",\n \"description\": \"man police officer\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"policeman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👮♀️\",\n \"description\": \"woman police officer\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"policewoman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕵️\",\n \"description\": \"detective\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"detective\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕵️♂️\",\n \"description\": \"man detective\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"male_detective\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕵️♀️\",\n \"description\": \"woman detective\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"female_detective\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💂\",\n \"description\": \"guard\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"guard\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💂♂️\",\n \"description\": \"man guard\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"guardsman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💂♀️\",\n \"description\": \"woman guard\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"guardswoman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👷\",\n \"description\": \"construction worker\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"construction_worker\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👷♂️\",\n \"description\": \"man construction worker\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"construction_worker_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👷♀️\",\n \"description\": \"woman construction worker\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"construction_worker_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤴\",\n \"description\": \"prince\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"prince\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👸\",\n \"description\": \"princess\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"princess\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👳\",\n \"description\": \"person wearing turban\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"person_with_turban\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👳♂️\",\n \"description\": \"man wearing turban\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_with_turban\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👳♀️\",\n \"description\": \"woman wearing turban\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_with_turban\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👲\",\n \"description\": \"person with skullcap\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_with_gua_pi_mao\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧕\",\n \"description\": \"woman with headscarf\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_with_headscarf\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤵\",\n \"description\": \"person in tuxedo\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"person_in_tuxedo\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👰\",\n \"description\": \"person with veil\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"person_with_veil\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤰\",\n \"description\": \"pregnant woman\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"pregnant_woman\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤱\",\n \"description\": \"breast-feeding\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"breast_feeding\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👼\",\n \"description\": \"baby angel\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"angel\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎅\",\n \"description\": \"Santa Claus\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"santa\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤶\",\n \"description\": \"Mrs. Claus\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"mrs_claus\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑🎄\",\n \"description\": \"mx claus\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"mx_claus\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": false\n },\n {\n \"emojiRaw\": \"🦸\",\n \"description\": \"superhero\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"superhero\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦸♂️\",\n \"description\": \"man superhero\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"superhero_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦸♀️\",\n \"description\": \"woman superhero\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"superhero_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦹\",\n \"description\": \"supervillain\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"supervillain\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦹♂️\",\n \"description\": \"man supervillain\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"supervillain_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦹♀️\",\n \"description\": \"woman supervillain\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"supervillain_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧙\",\n \"description\": \"mage\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"mage\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧙♂️\",\n \"description\": \"man mage\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"mage_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧙♀️\",\n \"description\": \"woman mage\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"mage_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧚\",\n \"description\": \"fairy\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"fairy\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧚♂️\",\n \"description\": \"man fairy\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"fairy_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧚♀️\",\n \"description\": \"woman fairy\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"fairy_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧛\",\n \"description\": \"vampire\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"vampire\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧛♂️\",\n \"description\": \"man vampire\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"vampire_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧛♀️\",\n \"description\": \"woman vampire\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"vampire_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧜\",\n \"description\": \"merperson\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"merperson\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧜♂️\",\n \"description\": \"merman\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"merman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧜♀️\",\n \"description\": \"mermaid\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"mermaid\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧝\",\n \"description\": \"elf\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"elf\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧝♂️\",\n \"description\": \"man elf\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"elf_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧝♀️\",\n \"description\": \"woman elf\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"elf_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧞\",\n \"description\": \"genie\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"genie\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧞♂️\",\n \"description\": \"man genie\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"genie_man\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧞♀️\",\n \"description\": \"woman genie\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"genie_woman\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧟\",\n \"description\": \"zombie\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"zombie\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧟♂️\",\n \"description\": \"man zombie\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"zombie_man\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧟♀️\",\n \"description\": \"woman zombie\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"zombie_woman\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💆\",\n \"description\": \"person getting massage\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"massage\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💆♂️\",\n \"description\": \"man getting massage\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"massage_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💆♀️\",\n \"description\": \"woman getting massage\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"massage_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💇\",\n \"description\": \"person getting haircut\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"haircut\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💇♂️\",\n \"description\": \"man getting haircut\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"haircut_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💇♀️\",\n \"description\": \"woman getting haircut\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"haircut_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚶\",\n \"description\": \"person walking\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"walking\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚶♂️\",\n \"description\": \"man walking\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"walking_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚶♀️\",\n \"description\": \"woman walking\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"walking_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧍\",\n \"description\": \"person standing\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"standing_person\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧍♂️\",\n \"description\": \"man standing\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"standing_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧍♀️\",\n \"description\": \"woman standing\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"standing_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧎\",\n \"description\": \"person kneeling\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"kneeling_person\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧎♂️\",\n \"description\": \"man kneeling\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"kneeling_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧎♀️\",\n \"description\": \"woman kneeling\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"kneeling_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑🦯\",\n \"description\": \"person with white cane\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"person_with_probing_cane\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨🦯\",\n \"description\": \"man with white cane\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_with_probing_cane\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩🦯\",\n \"description\": \"woman with white cane\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_with_probing_cane\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑🦼\",\n \"description\": \"person in motorized wheelchair\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"person_in_motorized_wheelchair\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨🦼\",\n \"description\": \"man in motorized wheelchair\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_in_motorized_wheelchair\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩🦼\",\n \"description\": \"woman in motorized wheelchair\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_in_motorized_wheelchair\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑🦽\",\n \"description\": \"person in manual wheelchair\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"person_in_manual_wheelchair\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨🦽\",\n \"description\": \"man in manual wheelchair\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_in_manual_wheelchair\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩🦽\",\n \"description\": \"woman in manual wheelchair\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_in_manual_wheelchair\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏃\",\n \"description\": \"person running\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"runner\",\n \"running\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏃♂️\",\n \"description\": \"man running\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"running_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏃♀️\",\n \"description\": \"woman running\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"running_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💃\",\n \"description\": \"woman dancing\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_dancing\",\n \"dancer\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕺\",\n \"description\": \"man dancing\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_dancing\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕴️\",\n \"description\": \"person in suit levitating\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"business_suit_levitating\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👯\",\n \"description\": \"people with bunny ears\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"dancers\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👯♂️\",\n \"description\": \"men with bunny ears\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"dancing_men\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👯♀️\",\n \"description\": \"women with bunny ears\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"dancing_women\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧖\",\n \"description\": \"person in steamy room\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"sauna_person\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧖♂️\",\n \"description\": \"man in steamy room\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"sauna_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧖♀️\",\n \"description\": \"woman in steamy room\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"sauna_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧗\",\n \"description\": \"person climbing\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"climbing\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧗♂️\",\n \"description\": \"man climbing\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"climbing_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧗♀️\",\n \"description\": \"woman climbing\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"climbing_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤺\",\n \"description\": \"person fencing\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"person_fencing\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏇\",\n \"description\": \"horse racing\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"horse_racing\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛷️\",\n \"description\": \"skier\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"skier\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏂\",\n \"description\": \"snowboarder\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"snowboarder\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏌️\",\n \"description\": \"person golfing\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"golfing\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏌️♂️\",\n \"description\": \"man golfing\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"golfing_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏌️♀️\",\n \"description\": \"woman golfing\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"golfing_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏄\",\n \"description\": \"person surfing\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"surfer\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏄♂️\",\n \"description\": \"man surfing\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"surfing_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏄♀️\",\n \"description\": \"woman surfing\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"surfing_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚣\",\n \"description\": \"person rowing boat\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"rowboat\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚣♂️\",\n \"description\": \"man rowing boat\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"rowing_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚣♀️\",\n \"description\": \"woman rowing boat\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"rowing_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏊\",\n \"description\": \"person swimming\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"swimmer\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏊♂️\",\n \"description\": \"man swimming\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"swimming_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏊♀️\",\n \"description\": \"woman swimming\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"swimming_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛹️\",\n \"description\": \"person bouncing ball\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"bouncing_ball_person\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛹️♂️\",\n \"description\": \"man bouncing ball\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"bouncing_ball_man\",\n \"basketball_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛹️♀️\",\n \"description\": \"woman bouncing ball\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"bouncing_ball_woman\",\n \"basketball_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏋️\",\n \"description\": \"person lifting weights\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"weight_lifting\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏋️♂️\",\n \"description\": \"man lifting weights\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"weight_lifting_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏋️♀️\",\n \"description\": \"woman lifting weights\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"weight_lifting_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚴\",\n \"description\": \"person biking\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"bicyclist\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚴♂️\",\n \"description\": \"man biking\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"biking_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚴♀️\",\n \"description\": \"woman biking\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"biking_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚵\",\n \"description\": \"person mountain biking\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"mountain_bicyclist\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚵♂️\",\n \"description\": \"man mountain biking\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"mountain_biking_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚵♀️\",\n \"description\": \"woman mountain biking\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"mountain_biking_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤸\",\n \"description\": \"person cartwheeling\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"cartwheeling\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤸♂️\",\n \"description\": \"man cartwheeling\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_cartwheeling\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤸♀️\",\n \"description\": \"woman cartwheeling\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_cartwheeling\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤼\",\n \"description\": \"people wrestling\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"wrestling\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤼♂️\",\n \"description\": \"men wrestling\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"men_wrestling\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤼♀️\",\n \"description\": \"women wrestling\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"women_wrestling\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤽\",\n \"description\": \"person playing water polo\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"water_polo\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤽♂️\",\n \"description\": \"man playing water polo\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_playing_water_polo\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤽♀️\",\n \"description\": \"woman playing water polo\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_playing_water_polo\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤾\",\n \"description\": \"person playing handball\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"handball_person\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤾♂️\",\n \"description\": \"man playing handball\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_playing_handball\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤾♀️\",\n \"description\": \"woman playing handball\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_playing_handball\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤹\",\n \"description\": \"person juggling\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"juggling_person\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤹♂️\",\n \"description\": \"man juggling\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_juggling\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤹♀️\",\n \"description\": \"woman juggling\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_juggling\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧘\",\n \"description\": \"person in lotus position\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"lotus_position\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧘♂️\",\n \"description\": \"man in lotus position\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"lotus_position_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧘♀️\",\n \"description\": \"woman in lotus position\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"lotus_position_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛀\",\n \"description\": \"person taking bath\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"bath\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛌\",\n \"description\": \"person in bed\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"sleeping_bed\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑🤝🧑\",\n \"description\": \"people holding hands\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"people_holding_hands\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👭\",\n \"description\": \"women holding hands\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"two_women_holding_hands\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👫\",\n \"description\": \"woman and man holding hands\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"couple\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👬\",\n \"description\": \"men holding hands\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"two_men_holding_hands\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💏\",\n \"description\": \"kiss\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"couplekiss\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩❤️💋👨\",\n \"description\": \"kiss: woman, man\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"couplekiss_man_woman\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨❤️💋👨\",\n \"description\": \"kiss: man, man\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"couplekiss_man_man\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩❤️💋👩\",\n \"description\": \"kiss: woman, woman\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"couplekiss_woman_woman\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💑\",\n \"description\": \"couple with heart\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"couple_with_heart\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩❤️👨\",\n \"description\": \"couple with heart: woman, man\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"couple_with_heart_woman_man\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨❤️👨\",\n \"description\": \"couple with heart: man, man\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"couple_with_heart_man_man\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩❤️👩\",\n \"description\": \"couple with heart: woman, woman\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"couple_with_heart_woman_woman\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👪\",\n \"description\": \"family\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨👩👦\",\n \"description\": \"family: man, woman, boy\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_man_woman_boy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨👩👧\",\n \"description\": \"family: man, woman, girl\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_man_woman_girl\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨👩👧👦\",\n \"description\": \"family: man, woman, girl, boy\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_man_woman_girl_boy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨👩👦👦\",\n \"description\": \"family: man, woman, boy, boy\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_man_woman_boy_boy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨👩👧👧\",\n \"description\": \"family: man, woman, girl, girl\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_man_woman_girl_girl\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨👨👦\",\n \"description\": \"family: man, man, boy\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_man_man_boy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨👨👧\",\n \"description\": \"family: man, man, girl\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_man_man_girl\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨👨👧👦\",\n \"description\": \"family: man, man, girl, boy\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_man_man_girl_boy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨👨👦👦\",\n \"description\": \"family: man, man, boy, boy\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_man_man_boy_boy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨👨👧👧\",\n \"description\": \"family: man, man, girl, girl\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_man_man_girl_girl\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩👩👦\",\n \"description\": \"family: woman, woman, boy\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_woman_woman_boy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩👩👧\",\n \"description\": \"family: woman, woman, girl\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_woman_woman_girl\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩👩👧👦\",\n \"description\": \"family: woman, woman, girl, boy\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_woman_woman_girl_boy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩👩👦👦\",\n \"description\": \"family: woman, woman, boy, boy\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_woman_woman_boy_boy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩👩👧👧\",\n \"description\": \"family: woman, woman, girl, girl\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_woman_woman_girl_girl\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨👦\",\n \"description\": \"family: man, boy\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_man_boy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨👦👦\",\n \"description\": \"family: man, boy, boy\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_man_boy_boy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨👧\",\n \"description\": \"family: man, girl\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_man_girl\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨👧👦\",\n \"description\": \"family: man, girl, boy\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_man_girl_boy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨👧👧\",\n \"description\": \"family: man, girl, girl\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_man_girl_girl\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩👦\",\n \"description\": \"family: woman, boy\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_woman_boy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩👦👦\",\n \"description\": \"family: woman, boy, boy\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_woman_boy_boy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩👧\",\n \"description\": \"family: woman, girl\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_woman_girl\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩👧👦\",\n \"description\": \"family: woman, girl, boy\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_woman_girl_boy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩👧👧\",\n \"description\": \"family: woman, girl, girl\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_woman_girl_girl\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🗣️\",\n \"description\": \"speaking head\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"speaking_head\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👤\",\n \"description\": \"bust in silhouette\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"bust_in_silhouette\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👥\",\n \"description\": \"busts in silhouette\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"busts_in_silhouette\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👣\",\n \"description\": \"footprints\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"footprints\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐵\",\n \"description\": \"monkey face\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"monkey_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐒\",\n \"description\": \"monkey\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"monkey\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦍\",\n \"description\": \"gorilla\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"gorilla\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦧\",\n \"description\": \"orangutan\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"orangutan\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐶\",\n \"description\": \"dog face\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"dog\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐕\",\n \"description\": \"dog\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"dog2\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦮\",\n \"description\": \"guide dog\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"guide_dog\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐕🦺\",\n \"description\": \"service dog\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"service_dog\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐩\",\n \"description\": \"poodle\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"poodle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐺\",\n \"description\": \"wolf\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"wolf\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦊\",\n \"description\": \"fox\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"fox_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦝\",\n \"description\": \"raccoon\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"raccoon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐱\",\n \"description\": \"cat face\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"cat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐈\",\n \"description\": \"cat\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"cat2\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦁\",\n \"description\": \"lion\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"lion\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐯\",\n \"description\": \"tiger face\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"tiger\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐅\",\n \"description\": \"tiger\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"tiger2\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐆\",\n \"description\": \"leopard\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"leopard\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐴\",\n \"description\": \"horse face\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"horse\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐎\",\n \"description\": \"horse\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"racehorse\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦄\",\n \"description\": \"unicorn\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"unicorn\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦓\",\n \"description\": \"zebra\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"zebra\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦌\",\n \"description\": \"deer\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"deer\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐮\",\n \"description\": \"cow face\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"cow\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐂\",\n \"description\": \"ox\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"ox\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐃\",\n \"description\": \"water buffalo\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"water_buffalo\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐄\",\n \"description\": \"cow\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"cow2\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐷\",\n \"description\": \"pig face\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"pig\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐖\",\n \"description\": \"pig\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"pig2\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐗\",\n \"description\": \"boar\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"boar\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐽\",\n \"description\": \"pig nose\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"pig_nose\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐏\",\n \"description\": \"ram\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"ram\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐑\",\n \"description\": \"ewe\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"sheep\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐐\",\n \"description\": \"goat\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"goat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐪\",\n \"description\": \"camel\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"dromedary_camel\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐫\",\n \"description\": \"two-hump camel\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"camel\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦙\",\n \"description\": \"llama\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"llama\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦒\",\n \"description\": \"giraffe\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"giraffe\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐘\",\n \"description\": \"elephant\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"elephant\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦏\",\n \"description\": \"rhinoceros\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"rhinoceros\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦛\",\n \"description\": \"hippopotamus\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"hippopotamus\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐭\",\n \"description\": \"mouse face\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"mouse\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐁\",\n \"description\": \"mouse\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"mouse2\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐀\",\n \"description\": \"rat\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"rat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐹\",\n \"description\": \"hamster\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"hamster\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐰\",\n \"description\": \"rabbit face\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"rabbit\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐇\",\n \"description\": \"rabbit\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"rabbit2\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐿️\",\n \"description\": \"chipmunk\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"chipmunk\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦔\",\n \"description\": \"hedgehog\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"hedgehog\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦇\",\n \"description\": \"bat\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"bat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐻\",\n \"description\": \"bear\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"bear\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐻❄️\",\n \"description\": \"polar bear\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"polar_bear\"\n ],\n \"hasMarkdownRepresentation\": false\n },\n {\n \"emojiRaw\": \"🐨\",\n \"description\": \"koala\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"koala\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐼\",\n \"description\": \"panda\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"panda_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦥\",\n \"description\": \"sloth\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"sloth\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦦\",\n \"description\": \"otter\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"otter\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦨\",\n \"description\": \"skunk\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"skunk\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦘\",\n \"description\": \"kangaroo\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"kangaroo\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦡\",\n \"description\": \"badger\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"badger\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐾\",\n \"description\": \"paw prints\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"feet\",\n \"paw_prints\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦃\",\n \"description\": \"turkey\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"turkey\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐔\",\n \"description\": \"chicken\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"chicken\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐓\",\n \"description\": \"rooster\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"rooster\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐣\",\n \"description\": \"hatching chick\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"hatching_chick\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐤\",\n \"description\": \"baby chick\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"baby_chick\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐥\",\n \"description\": \"front-facing baby chick\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"hatched_chick\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐦\",\n \"description\": \"bird\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"bird\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐧\",\n \"description\": \"penguin\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"penguin\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕊️\",\n \"description\": \"dove\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"dove\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦅\",\n \"description\": \"eagle\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"eagle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦆\",\n \"description\": \"duck\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"duck\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦢\",\n \"description\": \"swan\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"swan\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦉\",\n \"description\": \"owl\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"owl\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦩\",\n \"description\": \"flamingo\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"flamingo\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦚\",\n \"description\": \"peacock\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"peacock\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦜\",\n \"description\": \"parrot\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"parrot\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐸\",\n \"description\": \"frog\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"frog\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐊\",\n \"description\": \"crocodile\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"crocodile\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐢\",\n \"description\": \"turtle\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"turtle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦎\",\n \"description\": \"lizard\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"lizard\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐍\",\n \"description\": \"snake\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"snake\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐲\",\n \"description\": \"dragon face\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"dragon_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐉\",\n \"description\": \"dragon\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"dragon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦕\",\n \"description\": \"sauropod\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"sauropod\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦖\",\n \"description\": \"T-Rex\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"t-rex\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐳\",\n \"description\": \"spouting whale\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"whale\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐋\",\n \"description\": \"whale\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"whale2\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐬\",\n \"description\": \"dolphin\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"dolphin\",\n \"flipper\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐟\",\n \"description\": \"fish\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"fish\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐠\",\n \"description\": \"tropical fish\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"tropical_fish\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐡\",\n \"description\": \"blowfish\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"blowfish\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦈\",\n \"description\": \"shark\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"shark\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐙\",\n \"description\": \"octopus\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"octopus\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐚\",\n \"description\": \"spiral shell\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"shell\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐌\",\n \"description\": \"snail\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"snail\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦋\",\n \"description\": \"butterfly\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"butterfly\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐛\",\n \"description\": \"bug\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"bug\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐜\",\n \"description\": \"ant\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"ant\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐝\",\n \"description\": \"honeybee\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"bee\",\n \"honeybee\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐞\",\n \"description\": \"lady beetle\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"lady_beetle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦗\",\n \"description\": \"cricket\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"cricket\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕷️\",\n \"description\": \"spider\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"spider\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕸️\",\n \"description\": \"spider web\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"spider_web\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦂\",\n \"description\": \"scorpion\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"scorpion\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦟\",\n \"description\": \"mosquito\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"mosquito\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦠\",\n \"description\": \"microbe\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"microbe\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💐\",\n \"description\": \"bouquet\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"bouquet\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌸\",\n \"description\": \"cherry blossom\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"cherry_blossom\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💮\",\n \"description\": \"white flower\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"white_flower\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏵️\",\n \"description\": \"rosette\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"rosette\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌹\",\n \"description\": \"rose\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"rose\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥀\",\n \"description\": \"wilted flower\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"wilted_flower\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌺\",\n \"description\": \"hibiscus\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"hibiscus\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌻\",\n \"description\": \"sunflower\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"sunflower\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌼\",\n \"description\": \"blossom\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"blossom\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌷\",\n \"description\": \"tulip\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"tulip\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌱\",\n \"description\": \"seedling\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"seedling\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌲\",\n \"description\": \"evergreen tree\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"evergreen_tree\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌳\",\n \"description\": \"deciduous tree\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"deciduous_tree\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌴\",\n \"description\": \"palm tree\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"palm_tree\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌵\",\n \"description\": \"cactus\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"cactus\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌾\",\n \"description\": \"sheaf of rice\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"ear_of_rice\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌿\",\n \"description\": \"herb\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"herb\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"☘️\",\n \"description\": \"shamrock\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"shamrock\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍀\",\n \"description\": \"four leaf clover\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"four_leaf_clover\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍁\",\n \"description\": \"maple leaf\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"maple_leaf\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍂\",\n \"description\": \"fallen leaf\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"fallen_leaf\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍃\",\n \"description\": \"leaf fluttering in wind\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"leaves\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍇\",\n \"description\": \"grapes\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"grapes\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍈\",\n \"description\": \"melon\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"melon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍉\",\n \"description\": \"watermelon\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"watermelon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍊\",\n \"description\": \"tangerine\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"tangerine\",\n \"orange\",\n \"mandarin\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍋\",\n \"description\": \"lemon\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"lemon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍌\",\n \"description\": \"banana\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"banana\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍍\",\n \"description\": \"pineapple\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"pineapple\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥭\",\n \"description\": \"mango\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"mango\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍎\",\n \"description\": \"red apple\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"apple\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍏\",\n \"description\": \"green apple\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"green_apple\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍐\",\n \"description\": \"pear\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"pear\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍑\",\n \"description\": \"peach\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"peach\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍒\",\n \"description\": \"cherries\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"cherries\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍓\",\n \"description\": \"strawberry\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"strawberry\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥝\",\n \"description\": \"kiwi fruit\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"kiwi_fruit\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍅\",\n \"description\": \"tomato\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"tomato\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥥\",\n \"description\": \"coconut\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"coconut\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥑\",\n \"description\": \"avocado\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"avocado\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍆\",\n \"description\": \"eggplant\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"eggplant\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥔\",\n \"description\": \"potato\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"potato\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥕\",\n \"description\": \"carrot\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"carrot\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌽\",\n \"description\": \"ear of corn\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"corn\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌶️\",\n \"description\": \"hot pepper\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"hot_pepper\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥒\",\n \"description\": \"cucumber\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"cucumber\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥬\",\n \"description\": \"leafy green\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"leafy_green\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥦\",\n \"description\": \"broccoli\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"broccoli\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧄\",\n \"description\": \"garlic\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"garlic\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧅\",\n \"description\": \"onion\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"onion\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍄\",\n \"description\": \"mushroom\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"mushroom\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥜\",\n \"description\": \"peanuts\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"peanuts\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌰\",\n \"description\": \"chestnut\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"chestnut\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍞\",\n \"description\": \"bread\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"bread\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥐\",\n \"description\": \"croissant\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"croissant\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥖\",\n \"description\": \"baguette bread\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"baguette_bread\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥨\",\n \"description\": \"pretzel\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"pretzel\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥯\",\n \"description\": \"bagel\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"bagel\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥞\",\n \"description\": \"pancakes\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"pancakes\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧇\",\n \"description\": \"waffle\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"waffle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧀\",\n \"description\": \"cheese wedge\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"cheese\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍖\",\n \"description\": \"meat on bone\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"meat_on_bone\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍗\",\n \"description\": \"poultry leg\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"poultry_leg\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥩\",\n \"description\": \"cut of meat\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"cut_of_meat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥓\",\n \"description\": \"bacon\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"bacon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍔\",\n \"description\": \"hamburger\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"hamburger\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍟\",\n \"description\": \"french fries\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"fries\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍕\",\n \"description\": \"pizza\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"pizza\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌭\",\n \"description\": \"hot dog\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"hotdog\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥪\",\n \"description\": \"sandwich\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"sandwich\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌮\",\n \"description\": \"taco\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"taco\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌯\",\n \"description\": \"burrito\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"burrito\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥙\",\n \"description\": \"stuffed flatbread\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"stuffed_flatbread\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧆\",\n \"description\": \"falafel\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"falafel\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥚\",\n \"description\": \"egg\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"egg\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍳\",\n \"description\": \"cooking\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"fried_egg\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥘\",\n \"description\": \"shallow pan of food\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"shallow_pan_of_food\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍲\",\n \"description\": \"pot of food\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"stew\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥣\",\n \"description\": \"bowl with spoon\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"bowl_with_spoon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥗\",\n \"description\": \"green salad\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"green_salad\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍿\",\n \"description\": \"popcorn\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"popcorn\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧈\",\n \"description\": \"butter\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"butter\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧂\",\n \"description\": \"salt\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"salt\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥫\",\n \"description\": \"canned food\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"canned_food\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍱\",\n \"description\": \"bento box\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"bento\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍘\",\n \"description\": \"rice cracker\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"rice_cracker\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍙\",\n \"description\": \"rice ball\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"rice_ball\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍚\",\n \"description\": \"cooked rice\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"rice\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍛\",\n \"description\": \"curry rice\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"curry\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍜\",\n \"description\": \"steaming bowl\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"ramen\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍝\",\n \"description\": \"spaghetti\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"spaghetti\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍠\",\n \"description\": \"roasted sweet potato\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"sweet_potato\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍢\",\n \"description\": \"oden\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"oden\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍣\",\n \"description\": \"sushi\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"sushi\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍤\",\n \"description\": \"fried shrimp\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"fried_shrimp\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍥\",\n \"description\": \"fish cake with swirl\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"fish_cake\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥮\",\n \"description\": \"moon cake\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"moon_cake\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍡\",\n \"description\": \"dango\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"dango\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥟\",\n \"description\": \"dumpling\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"dumpling\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥠\",\n \"description\": \"fortune cookie\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"fortune_cookie\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥡\",\n \"description\": \"takeout box\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"takeout_box\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦀\",\n \"description\": \"crab\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"crab\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦞\",\n \"description\": \"lobster\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"lobster\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦐\",\n \"description\": \"shrimp\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"shrimp\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦑\",\n \"description\": \"squid\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"squid\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦪\",\n \"description\": \"oyster\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"oyster\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍦\",\n \"description\": \"soft ice cream\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"icecream\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍧\",\n \"description\": \"shaved ice\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"shaved_ice\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍨\",\n \"description\": \"ice cream\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"ice_cream\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍩\",\n \"description\": \"doughnut\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"doughnut\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍪\",\n \"description\": \"cookie\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"cookie\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎂\",\n \"description\": \"birthday cake\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"birthday\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍰\",\n \"description\": \"shortcake\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"cake\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧁\",\n \"description\": \"cupcake\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"cupcake\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥧\",\n \"description\": \"pie\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"pie\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍫\",\n \"description\": \"chocolate bar\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"chocolate_bar\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍬\",\n \"description\": \"candy\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"candy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍭\",\n \"description\": \"lollipop\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"lollipop\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍮\",\n \"description\": \"custard\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"custard\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍯\",\n \"description\": \"honey pot\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"honey_pot\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍼\",\n \"description\": \"baby bottle\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"baby_bottle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥛\",\n \"description\": \"glass of milk\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"milk_glass\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"☕\",\n \"description\": \"hot beverage\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"coffee\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍵\",\n \"description\": \"teacup without handle\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"tea\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍶\",\n \"description\": \"sake\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"sake\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍾\",\n \"description\": \"bottle with popping cork\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"champagne\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍷\",\n \"description\": \"wine glass\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"wine_glass\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍸\",\n \"description\": \"cocktail glass\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"cocktail\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍹\",\n \"description\": \"tropical drink\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"tropical_drink\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍺\",\n \"description\": \"beer mug\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"beer\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍻\",\n \"description\": \"clinking beer mugs\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"beers\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥂\",\n \"description\": \"clinking glasses\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"clinking_glasses\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥃\",\n \"description\": \"tumbler glass\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"tumbler_glass\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥤\",\n \"description\": \"cup with straw\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"cup_with_straw\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧃\",\n \"description\": \"beverage box\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"beverage_box\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧉\",\n \"description\": \"mate\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"mate\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧊\",\n \"description\": \"ice\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"ice_cube\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥢\",\n \"description\": \"chopsticks\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"chopsticks\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍽️\",\n \"description\": \"fork and knife with plate\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"plate_with_cutlery\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍴\",\n \"description\": \"fork and knife\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"fork_and_knife\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥄\",\n \"description\": \"spoon\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"spoon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔪\",\n \"description\": \"kitchen knife\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"hocho\",\n \"knife\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏺\",\n \"description\": \"amphora\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"amphora\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌍\",\n \"description\": \"globe showing Europe-Africa\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"earth_africa\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌎\",\n \"description\": \"globe showing Americas\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"earth_americas\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌏\",\n \"description\": \"globe showing Asia-Australia\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"earth_asia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌐\",\n \"description\": \"globe with meridians\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"globe_with_meridians\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🗺️\",\n \"description\": \"world map\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"world_map\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🗾\",\n \"description\": \"map of Japan\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"japan\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧭\",\n \"description\": \"compass\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"compass\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏔️\",\n \"description\": \"snow-capped mountain\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"mountain_snow\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛰️\",\n \"description\": \"mountain\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"mountain\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌋\",\n \"description\": \"volcano\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"volcano\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🗻\",\n \"description\": \"mount fuji\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"mount_fuji\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏕️\",\n \"description\": \"camping\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"camping\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏖️\",\n \"description\": \"beach with umbrella\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"beach_umbrella\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏜️\",\n \"description\": \"desert\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"desert\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏝️\",\n \"description\": \"desert island\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"desert_island\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏞️\",\n \"description\": \"national park\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"national_park\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏟️\",\n \"description\": \"stadium\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"stadium\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏛️\",\n \"description\": \"classical building\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"classical_building\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏗️\",\n \"description\": \"building construction\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"building_construction\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧱\",\n \"description\": \"brick\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"bricks\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏘️\",\n \"description\": \"houses\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"houses\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏚️\",\n \"description\": \"derelict house\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"derelict_house\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏠\",\n \"description\": \"house\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"house\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏡\",\n \"description\": \"house with garden\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"house_with_garden\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏢\",\n \"description\": \"office building\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"office\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏣\",\n \"description\": \"Japanese post office\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"post_office\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏤\",\n \"description\": \"post office\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"european_post_office\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏥\",\n \"description\": \"hospital\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"hospital\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏦\",\n \"description\": \"bank\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"bank\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏨\",\n \"description\": \"hotel\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"hotel\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏩\",\n \"description\": \"love hotel\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"love_hotel\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏪\",\n \"description\": \"convenience store\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"convenience_store\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏫\",\n \"description\": \"school\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"school\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏬\",\n \"description\": \"department store\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"department_store\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏭\",\n \"description\": \"factory\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"factory\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏯\",\n \"description\": \"Japanese castle\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"japanese_castle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏰\",\n \"description\": \"castle\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"european_castle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💒\",\n \"description\": \"wedding\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"wedding\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🗼\",\n \"description\": \"Tokyo tower\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"tokyo_tower\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🗽\",\n \"description\": \"Statue of Liberty\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"statue_of_liberty\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛪\",\n \"description\": \"church\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"church\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕌\",\n \"description\": \"mosque\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"mosque\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛕\",\n \"description\": \"hindu temple\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"hindu_temple\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕍\",\n \"description\": \"synagogue\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"synagogue\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛩️\",\n \"description\": \"shinto shrine\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"shinto_shrine\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕋\",\n \"description\": \"kaaba\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"kaaba\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛲\",\n \"description\": \"fountain\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"fountain\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛺\",\n \"description\": \"tent\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"tent\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌁\",\n \"description\": \"foggy\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"foggy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌃\",\n \"description\": \"night with stars\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"night_with_stars\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏙️\",\n \"description\": \"cityscape\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"cityscape\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌄\",\n \"description\": \"sunrise over mountains\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"sunrise_over_mountains\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌅\",\n \"description\": \"sunrise\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"sunrise\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌆\",\n \"description\": \"cityscape at dusk\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"city_sunset\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌇\",\n \"description\": \"sunset\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"city_sunrise\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌉\",\n \"description\": \"bridge at night\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"bridge_at_night\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♨️\",\n \"description\": \"hot springs\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"hotsprings\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎠\",\n \"description\": \"carousel horse\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"carousel_horse\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎡\",\n \"description\": \"ferris wheel\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"ferris_wheel\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎢\",\n \"description\": \"roller coaster\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"roller_coaster\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💈\",\n \"description\": \"barber pole\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"barber\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎪\",\n \"description\": \"circus tent\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"circus_tent\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚂\",\n \"description\": \"locomotive\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"steam_locomotive\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚃\",\n \"description\": \"railway car\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"railway_car\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚄\",\n \"description\": \"high-speed train\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"bullettrain_side\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚅\",\n \"description\": \"bullet train\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"bullettrain_front\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚆\",\n \"description\": \"train\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"train2\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚇\",\n \"description\": \"metro\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"metro\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚈\",\n \"description\": \"light rail\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"light_rail\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚉\",\n \"description\": \"station\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"station\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚊\",\n \"description\": \"tram\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"tram\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚝\",\n \"description\": \"monorail\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"monorail\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚞\",\n \"description\": \"mountain railway\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"mountain_railway\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚋\",\n \"description\": \"tram car\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"train\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚌\",\n \"description\": \"bus\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"bus\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚍\",\n \"description\": \"oncoming bus\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"oncoming_bus\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚎\",\n \"description\": \"trolleybus\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"trolleybus\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚐\",\n \"description\": \"minibus\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"minibus\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚑\",\n \"description\": \"ambulance\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"ambulance\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚒\",\n \"description\": \"fire engine\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"fire_engine\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚓\",\n \"description\": \"police car\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"police_car\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚔\",\n \"description\": \"oncoming police car\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"oncoming_police_car\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚕\",\n \"description\": \"taxi\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"taxi\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚖\",\n \"description\": \"oncoming taxi\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"oncoming_taxi\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚗\",\n \"description\": \"automobile\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"car\",\n \"red_car\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚘\",\n \"description\": \"oncoming automobile\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"oncoming_automobile\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚙\",\n \"description\": \"sport utility vehicle\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"blue_car\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚚\",\n \"description\": \"delivery truck\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"truck\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚛\",\n \"description\": \"articulated lorry\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"articulated_lorry\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚜\",\n \"description\": \"tractor\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"tractor\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏎️\",\n \"description\": \"racing car\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"racing_car\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏍️\",\n \"description\": \"motorcycle\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"motorcycle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛵\",\n \"description\": \"motor scooter\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"motor_scooter\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦽\",\n \"description\": \"manual wheelchair\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"manual_wheelchair\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦼\",\n \"description\": \"motorized wheelchair\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"motorized_wheelchair\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛺\",\n \"description\": \"auto rickshaw\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"auto_rickshaw\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚲\",\n \"description\": \"bicycle\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"bike\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛴\",\n \"description\": \"kick scooter\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"kick_scooter\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛹\",\n \"description\": \"skateboard\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"skateboard\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚏\",\n \"description\": \"bus stop\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"busstop\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛣️\",\n \"description\": \"motorway\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"motorway\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛤️\",\n \"description\": \"railway track\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"railway_track\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛢️\",\n \"description\": \"oil drum\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"oil_drum\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛽\",\n \"description\": \"fuel pump\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"fuelpump\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚨\",\n \"description\": \"police car light\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"rotating_light\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚥\",\n \"description\": \"horizontal traffic light\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"traffic_light\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚦\",\n \"description\": \"vertical traffic light\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"vertical_traffic_light\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛑\",\n \"description\": \"stop sign\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"stop_sign\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚧\",\n \"description\": \"construction\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"construction\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⚓\",\n \"description\": \"anchor\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"anchor\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛵\",\n \"description\": \"sailboat\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"boat\",\n \"sailboat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛶\",\n \"description\": \"canoe\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"canoe\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚤\",\n \"description\": \"speedboat\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"speedboat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛳️\",\n \"description\": \"passenger ship\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"passenger_ship\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛴️\",\n \"description\": \"ferry\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"ferry\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛥️\",\n \"description\": \"motor boat\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"motor_boat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚢\",\n \"description\": \"ship\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"ship\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"✈️\",\n \"description\": \"airplane\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"airplane\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛩️\",\n \"description\": \"small airplane\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"small_airplane\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛫\",\n \"description\": \"airplane departure\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"flight_departure\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛬\",\n \"description\": \"airplane arrival\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"flight_arrival\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🪂\",\n \"description\": \"parachute\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"parachute\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💺\",\n \"description\": \"seat\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"seat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚁\",\n \"description\": \"helicopter\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"helicopter\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚟\",\n \"description\": \"suspension railway\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"suspension_railway\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚠\",\n \"description\": \"mountain cableway\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"mountain_cableway\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚡\",\n \"description\": \"aerial tramway\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"aerial_tramway\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛰️\",\n \"description\": \"satellite\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"artificial_satellite\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚀\",\n \"description\": \"rocket\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"rocket\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛸\",\n \"description\": \"flying saucer\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"flying_saucer\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛎️\",\n \"description\": \"bellhop bell\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"bellhop_bell\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧳\",\n \"description\": \"luggage\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"luggage\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⌛\",\n \"description\": \"hourglass done\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"hourglass\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⏳\",\n \"description\": \"hourglass not done\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"hourglass_flowing_sand\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⌚\",\n \"description\": \"watch\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"watch\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⏰\",\n \"description\": \"alarm clock\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"alarm_clock\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⏱️\",\n \"description\": \"stopwatch\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"stopwatch\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⏲️\",\n \"description\": \"timer clock\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"timer_clock\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕰️\",\n \"description\": \"mantelpiece clock\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"mantelpiece_clock\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕛\",\n \"description\": \"twelve o’clock\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock12\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕧\",\n \"description\": \"twelve-thirty\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock1230\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕐\",\n \"description\": \"one o’clock\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock1\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕜\",\n \"description\": \"one-thirty\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock130\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕑\",\n \"description\": \"two o’clock\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock2\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕝\",\n \"description\": \"two-thirty\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock230\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕒\",\n \"description\": \"three o’clock\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock3\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕞\",\n \"description\": \"three-thirty\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock330\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕓\",\n \"description\": \"four o’clock\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock4\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕟\",\n \"description\": \"four-thirty\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock430\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕔\",\n \"description\": \"five o’clock\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock5\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕠\",\n \"description\": \"five-thirty\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock530\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕕\",\n \"description\": \"six o’clock\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock6\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕡\",\n \"description\": \"six-thirty\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock630\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕖\",\n \"description\": \"seven o’clock\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock7\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕢\",\n \"description\": \"seven-thirty\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock730\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕗\",\n \"description\": \"eight o’clock\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock8\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕣\",\n \"description\": \"eight-thirty\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock830\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕘\",\n \"description\": \"nine o’clock\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock9\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕤\",\n \"description\": \"nine-thirty\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock930\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕙\",\n \"description\": \"ten o’clock\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock10\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕥\",\n \"description\": \"ten-thirty\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock1030\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕚\",\n \"description\": \"eleven o’clock\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock11\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕦\",\n \"description\": \"eleven-thirty\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock1130\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌑\",\n \"description\": \"new moon\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"new_moon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌒\",\n \"description\": \"waxing crescent moon\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"waxing_crescent_moon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌓\",\n \"description\": \"first quarter moon\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"first_quarter_moon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌔\",\n \"description\": \"waxing gibbous moon\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"moon\",\n \"waxing_gibbous_moon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌕\",\n \"description\": \"full moon\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"full_moon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌖\",\n \"description\": \"waning gibbous moon\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"waning_gibbous_moon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌗\",\n \"description\": \"last quarter moon\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"last_quarter_moon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌘\",\n \"description\": \"waning crescent moon\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"waning_crescent_moon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌙\",\n \"description\": \"crescent moon\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"crescent_moon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌚\",\n \"description\": \"new moon face\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"new_moon_with_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌛\",\n \"description\": \"first quarter moon face\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"first_quarter_moon_with_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌜\",\n \"description\": \"last quarter moon face\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"last_quarter_moon_with_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌡️\",\n \"description\": \"thermometer\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"thermometer\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"☀️\",\n \"description\": \"sun\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"sunny\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌝\",\n \"description\": \"full moon face\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"full_moon_with_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌞\",\n \"description\": \"sun with face\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"sun_with_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🪐\",\n \"description\": \"ringed planet\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"ringed_planet\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⭐\",\n \"description\": \"star\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"star\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌟\",\n \"description\": \"glowing star\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"star2\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌠\",\n \"description\": \"shooting star\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"stars\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌌\",\n \"description\": \"milky way\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"milky_way\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"☁️\",\n \"description\": \"cloud\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"cloud\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛅\",\n \"description\": \"sun behind cloud\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"partly_sunny\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛈️\",\n \"description\": \"cloud with lightning and rain\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"cloud_with_lightning_and_rain\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌤️\",\n \"description\": \"sun behind small cloud\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"sun_behind_small_cloud\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌥️\",\n \"description\": \"sun behind large cloud\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"sun_behind_large_cloud\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌦️\",\n \"description\": \"sun behind rain cloud\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"sun_behind_rain_cloud\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌧️\",\n \"description\": \"cloud with rain\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"cloud_with_rain\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌨️\",\n \"description\": \"cloud with snow\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"cloud_with_snow\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌩️\",\n \"description\": \"cloud with lightning\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"cloud_with_lightning\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌪️\",\n \"description\": \"tornado\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"tornado\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌫️\",\n \"description\": \"fog\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"fog\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌬️\",\n \"description\": \"wind face\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"wind_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌀\",\n \"description\": \"cyclone\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"cyclone\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌈\",\n \"description\": \"rainbow\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"rainbow\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌂\",\n \"description\": \"closed umbrella\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"closed_umbrella\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"☂️\",\n \"description\": \"umbrella\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"open_umbrella\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"☔\",\n \"description\": \"umbrella with rain drops\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"umbrella\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛱️\",\n \"description\": \"umbrella on ground\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"parasol_on_ground\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⚡\",\n \"description\": \"high voltage\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"zap\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"❄️\",\n \"description\": \"snowflake\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"snowflake\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"☃️\",\n \"description\": \"snowman\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"snowman_with_snow\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛄\",\n \"description\": \"snowman without snow\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"snowman\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"☄️\",\n \"description\": \"comet\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"comet\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔥\",\n \"description\": \"fire\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"fire\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💧\",\n \"description\": \"droplet\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"droplet\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌊\",\n \"description\": \"water wave\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"ocean\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎃\",\n \"description\": \"jack-o-lantern\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"jack_o_lantern\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎄\",\n \"description\": \"Christmas tree\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"christmas_tree\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎆\",\n \"description\": \"fireworks\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"fireworks\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎇\",\n \"description\": \"sparkler\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"sparkler\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧨\",\n \"description\": \"firecracker\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"firecracker\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"✨\",\n \"description\": \"sparkles\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"sparkles\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎈\",\n \"description\": \"balloon\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"balloon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎉\",\n \"description\": \"party popper\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"tada\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎊\",\n \"description\": \"confetti ball\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"confetti_ball\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎋\",\n \"description\": \"tanabata tree\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"tanabata_tree\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎍\",\n \"description\": \"pine decoration\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"bamboo\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎎\",\n \"description\": \"Japanese dolls\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"dolls\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎏\",\n \"description\": \"carp streamer\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"flags\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎐\",\n \"description\": \"wind chime\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"wind_chime\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎑\",\n \"description\": \"moon viewing ceremony\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"rice_scene\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧧\",\n \"description\": \"red envelope\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"red_envelope\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎀\",\n \"description\": \"ribbon\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"ribbon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎁\",\n \"description\": \"wrapped gift\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"gift\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎗️\",\n \"description\": \"reminder ribbon\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"reminder_ribbon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎟️\",\n \"description\": \"admission tickets\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"tickets\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎫\",\n \"description\": \"ticket\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"ticket\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎖️\",\n \"description\": \"military medal\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"medal_military\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏆\",\n \"description\": \"trophy\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"trophy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏅\",\n \"description\": \"sports medal\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"medal_sports\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥇\",\n \"description\": \"1st place medal\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"1st_place_medal\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥈\",\n \"description\": \"2nd place medal\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"2nd_place_medal\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥉\",\n \"description\": \"3rd place medal\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"3rd_place_medal\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⚽\",\n \"description\": \"soccer ball\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"soccer\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⚾\",\n \"description\": \"baseball\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"baseball\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥎\",\n \"description\": \"softball\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"softball\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏀\",\n \"description\": \"basketball\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"basketball\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏐\",\n \"description\": \"volleyball\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"volleyball\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏈\",\n \"description\": \"american football\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"football\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏉\",\n \"description\": \"rugby football\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"rugby_football\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎾\",\n \"description\": \"tennis\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"tennis\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥏\",\n \"description\": \"flying disc\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"flying_disc\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎳\",\n \"description\": \"bowling\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"bowling\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏏\",\n \"description\": \"cricket game\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"cricket_game\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏑\",\n \"description\": \"field hockey\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"field_hockey\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏒\",\n \"description\": \"ice hockey\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"ice_hockey\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥍\",\n \"description\": \"lacrosse\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"lacrosse\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏓\",\n \"description\": \"ping pong\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"ping_pong\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏸\",\n \"description\": \"badminton\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"badminton\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥊\",\n \"description\": \"boxing glove\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"boxing_glove\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥋\",\n \"description\": \"martial arts uniform\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"martial_arts_uniform\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥅\",\n \"description\": \"goal net\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"goal_net\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛳\",\n \"description\": \"flag in hole\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"golf\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛸️\",\n \"description\": \"ice skate\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"ice_skate\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎣\",\n \"description\": \"fishing pole\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"fishing_pole_and_fish\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤿\",\n \"description\": \"diving mask\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"diving_mask\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎽\",\n \"description\": \"running shirt\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"running_shirt_with_sash\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎿\",\n \"description\": \"skis\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"ski\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛷\",\n \"description\": \"sled\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"sled\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥌\",\n \"description\": \"curling stone\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"curling_stone\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎯\",\n \"description\": \"direct hit\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"dart\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🪀\",\n \"description\": \"yo-yo\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"yo_yo\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🪁\",\n \"description\": \"kite\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"kite\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎱\",\n \"description\": \"pool 8 ball\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"8ball\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔮\",\n \"description\": \"crystal ball\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"crystal_ball\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧿\",\n \"description\": \"nazar amulet\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"nazar_amulet\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎮\",\n \"description\": \"video game\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"video_game\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕹️\",\n \"description\": \"joystick\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"joystick\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎰\",\n \"description\": \"slot machine\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"slot_machine\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎲\",\n \"description\": \"game die\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"game_die\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧩\",\n \"description\": \"puzzle piece\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"jigsaw\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧸\",\n \"description\": \"teddy bear\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"teddy_bear\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🪅\",\n \"description\": \"piñata\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"pinata\"\n ],\n \"hasMarkdownRepresentation\": false\n },\n {\n \"emojiRaw\": \"♠️\",\n \"description\": \"spade suit\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"spades\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♥️\",\n \"description\": \"heart suit\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"hearts\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♦️\",\n \"description\": \"diamond suit\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"diamonds\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♣️\",\n \"description\": \"club suit\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"clubs\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♟️\",\n \"description\": \"chess pawn\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"chess_pawn\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🃏\",\n \"description\": \"joker\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"black_joker\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🀄\",\n \"description\": \"mahjong red dragon\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"mahjong\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎴\",\n \"description\": \"flower playing cards\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"flower_playing_cards\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎭\",\n \"description\": \"performing arts\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"performing_arts\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🖼️\",\n \"description\": \"framed picture\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"framed_picture\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎨\",\n \"description\": \"artist palette\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"art\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧵\",\n \"description\": \"thread\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"thread\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧶\",\n \"description\": \"yarn\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"yarn\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👓\",\n \"description\": \"glasses\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"eyeglasses\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕶️\",\n \"description\": \"sunglasses\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"dark_sunglasses\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥽\",\n \"description\": \"goggles\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"goggles\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥼\",\n \"description\": \"lab coat\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"lab_coat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦺\",\n \"description\": \"safety vest\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"safety_vest\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👔\",\n \"description\": \"necktie\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"necktie\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👕\",\n \"description\": \"t-shirt\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"shirt\",\n \"tshirt\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👖\",\n \"description\": \"jeans\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"jeans\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧣\",\n \"description\": \"scarf\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"scarf\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧤\",\n \"description\": \"gloves\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"gloves\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧥\",\n \"description\": \"coat\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"coat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧦\",\n \"description\": \"socks\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"socks\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👗\",\n \"description\": \"dress\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"dress\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👘\",\n \"description\": \"kimono\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"kimono\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥻\",\n \"description\": \"sari\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"sari\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🩱\",\n \"description\": \"one-piece swimsuit\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"one_piece_swimsuit\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🩲\",\n \"description\": \"briefs\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"swim_brief\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🩳\",\n \"description\": \"shorts\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"shorts\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👙\",\n \"description\": \"bikini\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"bikini\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👚\",\n \"description\": \"woman’s clothes\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"womans_clothes\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👛\",\n \"description\": \"purse\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"purse\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👜\",\n \"description\": \"handbag\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"handbag\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👝\",\n \"description\": \"clutch bag\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"pouch\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛍️\",\n \"description\": \"shopping bags\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"shopping\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎒\",\n \"description\": \"backpack\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"school_satchel\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👞\",\n \"description\": \"man’s shoe\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"mans_shoe\",\n \"shoe\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👟\",\n \"description\": \"running shoe\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"athletic_shoe\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥾\",\n \"description\": \"hiking boot\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"hiking_boot\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥿\",\n \"description\": \"flat shoe\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"flat_shoe\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👠\",\n \"description\": \"high-heeled shoe\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"high_heel\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👡\",\n \"description\": \"woman’s sandal\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"sandal\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🩰\",\n \"description\": \"ballet shoes\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"ballet_shoes\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👢\",\n \"description\": \"woman’s boot\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"boot\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👑\",\n \"description\": \"crown\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"crown\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👒\",\n \"description\": \"woman’s hat\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"womans_hat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎩\",\n \"description\": \"top hat\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"tophat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎓\",\n \"description\": \"graduation cap\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"mortar_board\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧢\",\n \"description\": \"billed cap\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"billed_cap\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛑️\",\n \"description\": \"rescue worker’s helmet\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"rescue_worker_helmet\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📿\",\n \"description\": \"prayer beads\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"prayer_beads\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💄\",\n \"description\": \"lipstick\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"lipstick\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💍\",\n \"description\": \"ring\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"ring\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💎\",\n \"description\": \"gem stone\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"gem\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔇\",\n \"description\": \"muted speaker\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"mute\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔈\",\n \"description\": \"speaker low volume\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"speaker\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔉\",\n \"description\": \"speaker medium volume\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"sound\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔊\",\n \"description\": \"speaker high volume\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"loud_sound\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📢\",\n \"description\": \"loudspeaker\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"loudspeaker\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📣\",\n \"description\": \"megaphone\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"mega\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📯\",\n \"description\": \"postal horn\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"postal_horn\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔔\",\n \"description\": \"bell\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"bell\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔕\",\n \"description\": \"bell with slash\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"no_bell\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎼\",\n \"description\": \"musical score\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"musical_score\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎵\",\n \"description\": \"musical note\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"musical_note\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎶\",\n \"description\": \"musical notes\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"notes\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎙️\",\n \"description\": \"studio microphone\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"studio_microphone\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎚️\",\n \"description\": \"level slider\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"level_slider\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎛️\",\n \"description\": \"control knobs\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"control_knobs\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎤\",\n \"description\": \"microphone\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"microphone\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎧\",\n \"description\": \"headphone\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"headphones\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📻\",\n \"description\": \"radio\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"radio\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎷\",\n \"description\": \"saxophone\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"saxophone\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎸\",\n \"description\": \"guitar\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"guitar\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎹\",\n \"description\": \"musical keyboard\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"musical_keyboard\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎺\",\n \"description\": \"trumpet\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"trumpet\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎻\",\n \"description\": \"violin\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"violin\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🪕\",\n \"description\": \"banjo\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"banjo\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥁\",\n \"description\": \"drum\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"drum\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🪘\",\n \"description\": \"long drum\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"long_drum\"\n ],\n \"hasMarkdownRepresentation\": false\n },\n {\n \"emojiRaw\": \"📱\",\n \"description\": \"mobile phone\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"iphone\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📲\",\n \"description\": \"mobile phone with arrow\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"calling\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"☎️\",\n \"description\": \"telephone\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"phone\",\n \"telephone\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📞\",\n \"description\": \"telephone receiver\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"telephone_receiver\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📟\",\n \"description\": \"pager\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"pager\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📠\",\n \"description\": \"fax machine\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"fax\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔋\",\n \"description\": \"battery\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"battery\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔌\",\n \"description\": \"electric plug\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"electric_plug\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💻\",\n \"description\": \"laptop\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"computer\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🖥️\",\n \"description\": \"desktop computer\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"desktop_computer\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🖨️\",\n \"description\": \"printer\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"printer\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⌨️\",\n \"description\": \"keyboard\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"keyboard\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🖱️\",\n \"description\": \"computer mouse\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"computer_mouse\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🖲️\",\n \"description\": \"trackball\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"trackball\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💽\",\n \"description\": \"computer disk\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"minidisc\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💾\",\n \"description\": \"floppy disk\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"floppy_disk\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💿\",\n \"description\": \"optical disk\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"cd\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📀\",\n \"description\": \"dvd\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"dvd\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧮\",\n \"description\": \"abacus\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"abacus\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎥\",\n \"description\": \"movie camera\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"movie_camera\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎞️\",\n \"description\": \"film frames\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"film_strip\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📽️\",\n \"description\": \"film projector\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"film_projector\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎬\",\n \"description\": \"clapper board\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"clapper\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📺\",\n \"description\": \"television\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"tv\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📷\",\n \"description\": \"camera\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"camera\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📸\",\n \"description\": \"camera with flash\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"camera_flash\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📹\",\n \"description\": \"video camera\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"video_camera\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📼\",\n \"description\": \"videocassette\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"vhs\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔍\",\n \"description\": \"magnifying glass tilted left\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"mag\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔎\",\n \"description\": \"magnifying glass tilted right\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"mag_right\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕯️\",\n \"description\": \"candle\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"candle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💡\",\n \"description\": \"light bulb\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"bulb\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔦\",\n \"description\": \"flashlight\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"flashlight\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏮\",\n \"description\": \"red paper lantern\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"izakaya_lantern\",\n \"lantern\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🪔\",\n \"description\": \"diya lamp\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"diya_lamp\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📔\",\n \"description\": \"notebook with decorative cover\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"notebook_with_decorative_cover\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📕\",\n \"description\": \"closed book\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"closed_book\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📖\",\n \"description\": \"open book\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"book\",\n \"open_book\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📗\",\n \"description\": \"green book\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"green_book\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📘\",\n \"description\": \"blue book\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"blue_book\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📙\",\n \"description\": \"orange book\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"orange_book\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📚\",\n \"description\": \"books\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"books\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📓\",\n \"description\": \"notebook\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"notebook\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📒\",\n \"description\": \"ledger\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"ledger\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📃\",\n \"description\": \"page with curl\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"page_with_curl\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📜\",\n \"description\": \"scroll\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"scroll\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📄\",\n \"description\": \"page facing up\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"page_facing_up\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📰\",\n \"description\": \"newspaper\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"newspaper\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🗞️\",\n \"description\": \"rolled-up newspaper\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"newspaper_roll\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📑\",\n \"description\": \"bookmark tabs\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"bookmark_tabs\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔖\",\n \"description\": \"bookmark\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"bookmark\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏷️\",\n \"description\": \"label\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"label\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💰\",\n \"description\": \"money bag\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"moneybag\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💴\",\n \"description\": \"yen banknote\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"yen\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💵\",\n \"description\": \"dollar banknote\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"dollar\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💶\",\n \"description\": \"euro banknote\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"euro\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💷\",\n \"description\": \"pound banknote\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"pound\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💸\",\n \"description\": \"money with wings\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"money_with_wings\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💳\",\n \"description\": \"credit card\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"credit_card\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧾\",\n \"description\": \"receipt\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"receipt\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💹\",\n \"description\": \"chart increasing with yen\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"chart\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"✉️\",\n \"description\": \"envelope\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"envelope\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📧\",\n \"description\": \"e-mail\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"email\",\n \"e-mail\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📨\",\n \"description\": \"incoming envelope\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"incoming_envelope\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📩\",\n \"description\": \"envelope with arrow\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"envelope_with_arrow\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📤\",\n \"description\": \"outbox tray\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"outbox_tray\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📥\",\n \"description\": \"inbox tray\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"inbox_tray\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📦\",\n \"description\": \"package\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"package\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📫\",\n \"description\": \"closed mailbox with raised flag\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"mailbox\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📪\",\n \"description\": \"closed mailbox with lowered flag\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"mailbox_closed\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📬\",\n \"description\": \"open mailbox with raised flag\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"mailbox_with_mail\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📭\",\n \"description\": \"open mailbox with lowered flag\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"mailbox_with_no_mail\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📮\",\n \"description\": \"postbox\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"postbox\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🗳️\",\n \"description\": \"ballot box with ballot\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"ballot_box\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"✏️\",\n \"description\": \"pencil\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"pencil2\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"✒️\",\n \"description\": \"black nib\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"black_nib\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🖋️\",\n \"description\": \"fountain pen\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"fountain_pen\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🖊️\",\n \"description\": \"pen\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"pen\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🖌️\",\n \"description\": \"paintbrush\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"paintbrush\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🖍️\",\n \"description\": \"crayon\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"crayon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📝\",\n \"description\": \"memo\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"memo\",\n \"pencil\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💼\",\n \"description\": \"briefcase\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"briefcase\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📁\",\n \"description\": \"file folder\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"file_folder\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📂\",\n \"description\": \"open file folder\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"open_file_folder\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🗂️\",\n \"description\": \"card index dividers\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"card_index_dividers\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📅\",\n \"description\": \"calendar\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"date\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📆\",\n \"description\": \"tear-off calendar\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"calendar\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🗒️\",\n \"description\": \"spiral notepad\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"spiral_notepad\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🗓️\",\n \"description\": \"spiral calendar\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"spiral_calendar\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📇\",\n \"description\": \"card index\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"card_index\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📈\",\n \"description\": \"chart increasing\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"chart_with_upwards_trend\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📉\",\n \"description\": \"chart decreasing\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"chart_with_downwards_trend\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📊\",\n \"description\": \"bar chart\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"bar_chart\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📋\",\n \"description\": \"clipboard\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"clipboard\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📌\",\n \"description\": \"pushpin\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"pushpin\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📍\",\n \"description\": \"round pushpin\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"round_pushpin\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📎\",\n \"description\": \"paperclip\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"paperclip\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🖇️\",\n \"description\": \"linked paperclips\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"paperclips\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📏\",\n \"description\": \"straight ruler\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"straight_ruler\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📐\",\n \"description\": \"triangular ruler\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"triangular_ruler\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"✂️\",\n \"description\": \"scissors\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"scissors\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🗃️\",\n \"description\": \"card file box\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"card_file_box\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🗄️\",\n \"description\": \"file cabinet\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"file_cabinet\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🗑️\",\n \"description\": \"wastebasket\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"wastebasket\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔒\",\n \"description\": \"locked\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"lock\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔓\",\n \"description\": \"unlocked\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"unlock\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔏\",\n \"description\": \"locked with pen\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"lock_with_ink_pen\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔐\",\n \"description\": \"locked with key\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"closed_lock_with_key\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔑\",\n \"description\": \"key\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"key\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🗝️\",\n \"description\": \"old key\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"old_key\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔨\",\n \"description\": \"hammer\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"hammer\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🪓\",\n \"description\": \"axe\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"axe\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛏️\",\n \"description\": \"pick\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"pick\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⚒️\",\n \"description\": \"hammer and pick\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"hammer_and_pick\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛠️\",\n \"description\": \"hammer and wrench\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"hammer_and_wrench\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🗡️\",\n \"description\": \"dagger\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"dagger\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⚔️\",\n \"description\": \"crossed swords\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"crossed_swords\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔫\",\n \"description\": \"pistol\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"gun\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏹\",\n \"description\": \"bow and arrow\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"bow_and_arrow\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛡️\",\n \"description\": \"shield\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"shield\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔧\",\n \"description\": \"wrench\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"wrench\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔩\",\n \"description\": \"nut and bolt\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"nut_and_bolt\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⚙️\",\n \"description\": \"gear\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"gear\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🗜️\",\n \"description\": \"clamp\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"clamp\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⚖️\",\n \"description\": \"balance scale\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"balance_scale\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦯\",\n \"description\": \"white cane\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"probing_cane\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔗\",\n \"description\": \"link\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"link\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛓️\",\n \"description\": \"chains\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"chains\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧰\",\n \"description\": \"toolbox\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"toolbox\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧲\",\n \"description\": \"magnet\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"magnet\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⚗️\",\n \"description\": \"alembic\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"alembic\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧪\",\n \"description\": \"test tube\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"test_tube\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧫\",\n \"description\": \"petri dish\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"petri_dish\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧬\",\n \"description\": \"dna\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"dna\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔬\",\n \"description\": \"microscope\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"microscope\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔭\",\n \"description\": \"telescope\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"telescope\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📡\",\n \"description\": \"satellite antenna\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"satellite\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💉\",\n \"description\": \"syringe\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"syringe\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🩸\",\n \"description\": \"drop of blood\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"drop_of_blood\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💊\",\n \"description\": \"pill\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"pill\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🩹\",\n \"description\": \"adhesive bandage\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"adhesive_bandage\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🩺\",\n \"description\": \"stethoscope\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"stethoscope\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚪\",\n \"description\": \"door\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"door\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛏️\",\n \"description\": \"bed\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"bed\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛋️\",\n \"description\": \"couch and lamp\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"couch_and_lamp\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🪑\",\n \"description\": \"chair\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"chair\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚽\",\n \"description\": \"toilet\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"toilet\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚿\",\n \"description\": \"shower\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"shower\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛁\",\n \"description\": \"bathtub\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"bathtub\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🪒\",\n \"description\": \"razor\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"razor\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧴\",\n \"description\": \"lotion bottle\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"lotion_bottle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧷\",\n \"description\": \"safety pin\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"safety_pin\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧹\",\n \"description\": \"broom\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"broom\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧺\",\n \"description\": \"basket\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"basket\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧻\",\n \"description\": \"roll of paper\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"roll_of_paper\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧼\",\n \"description\": \"soap\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"soap\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧽\",\n \"description\": \"sponge\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"sponge\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧯\",\n \"description\": \"fire extinguisher\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"fire_extinguisher\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛒\",\n \"description\": \"shopping cart\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"shopping_cart\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚬\",\n \"description\": \"cigarette\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"smoking\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⚰️\",\n \"description\": \"coffin\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"coffin\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⚱️\",\n \"description\": \"funeral urn\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"funeral_urn\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🗿\",\n \"description\": \"moai\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"moyai\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏧\",\n \"description\": \"ATM sign\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"atm\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚮\",\n \"description\": \"litter in bin sign\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"put_litter_in_its_place\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚰\",\n \"description\": \"potable water\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"potable_water\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♿\",\n \"description\": \"wheelchair symbol\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"wheelchair\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚹\",\n \"description\": \"men’s room\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"mens\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚺\",\n \"description\": \"women’s room\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"womens\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚻\",\n \"description\": \"restroom\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"restroom\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚼\",\n \"description\": \"baby symbol\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"baby_symbol\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚾\",\n \"description\": \"water closet\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"wc\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛂\",\n \"description\": \"passport control\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"passport_control\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛃\",\n \"description\": \"customs\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"customs\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛄\",\n \"description\": \"baggage claim\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"baggage_claim\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛅\",\n \"description\": \"left luggage\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"left_luggage\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⚠️\",\n \"description\": \"warning\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"warning\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚸\",\n \"description\": \"children crossing\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"children_crossing\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛔\",\n \"description\": \"no entry\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"no_entry\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚫\",\n \"description\": \"prohibited\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"no_entry_sign\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚳\",\n \"description\": \"no bicycles\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"no_bicycles\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚭\",\n \"description\": \"no smoking\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"no_smoking\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚯\",\n \"description\": \"no littering\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"do_not_litter\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚱\",\n \"description\": \"non-potable water\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"non-potable_water\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚷\",\n \"description\": \"no pedestrians\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"no_pedestrians\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📵\",\n \"description\": \"no mobile phones\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"no_mobile_phones\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔞\",\n \"description\": \"no one under eighteen\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"underage\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"☢️\",\n \"description\": \"radioactive\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"radioactive\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"☣️\",\n \"description\": \"biohazard\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"biohazard\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⬆️\",\n \"description\": \"up arrow\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"arrow_up\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"↗️\",\n \"description\": \"up-right arrow\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"arrow_upper_right\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"➡️\",\n \"description\": \"right arrow\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"arrow_right\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"↘️\",\n \"description\": \"down-right arrow\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"arrow_lower_right\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⬇️\",\n \"description\": \"down arrow\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"arrow_down\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"↙️\",\n \"description\": \"down-left arrow\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"arrow_lower_left\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⬅️\",\n \"description\": \"left arrow\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"arrow_left\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"↖️\",\n \"description\": \"up-left arrow\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"arrow_upper_left\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"↕️\",\n \"description\": \"up-down arrow\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"arrow_up_down\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"↔️\",\n \"description\": \"left-right arrow\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"left_right_arrow\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"↩️\",\n \"description\": \"right arrow curving left\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"leftwards_arrow_with_hook\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"↪️\",\n \"description\": \"left arrow curving right\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"arrow_right_hook\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⤴️\",\n \"description\": \"right arrow curving up\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"arrow_heading_up\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⤵️\",\n \"description\": \"right arrow curving down\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"arrow_heading_down\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔃\",\n \"description\": \"clockwise vertical arrows\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"arrows_clockwise\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔄\",\n \"description\": \"counterclockwise arrows button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"arrows_counterclockwise\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔙\",\n \"description\": \"BACK arrow\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"back\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔚\",\n \"description\": \"END arrow\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"end\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔛\",\n \"description\": \"ON! arrow\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"on\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔜\",\n \"description\": \"SOON arrow\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"soon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔝\",\n \"description\": \"TOP arrow\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"top\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛐\",\n \"description\": \"place of worship\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"place_of_worship\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⚛️\",\n \"description\": \"atom symbol\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"atom_symbol\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕉️\",\n \"description\": \"om\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"om\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"✡️\",\n \"description\": \"star of David\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"star_of_david\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"☸️\",\n \"description\": \"wheel of dharma\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"wheel_of_dharma\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"☯️\",\n \"description\": \"yin yang\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"yin_yang\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"✝️\",\n \"description\": \"latin cross\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"latin_cross\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"☦️\",\n \"description\": \"orthodox cross\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"orthodox_cross\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"☪️\",\n \"description\": \"star and crescent\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"star_and_crescent\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"☮️\",\n \"description\": \"peace symbol\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"peace_symbol\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕎\",\n \"description\": \"menorah\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"menorah\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔯\",\n \"description\": \"dotted six-pointed star\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"six_pointed_star\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♈\",\n \"description\": \"Aries\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"aries\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♉\",\n \"description\": \"Taurus\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"taurus\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♊\",\n \"description\": \"Gemini\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"gemini\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♋\",\n \"description\": \"Cancer\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"cancer\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♌\",\n \"description\": \"Leo\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"leo\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♍\",\n \"description\": \"Virgo\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"virgo\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♎\",\n \"description\": \"Libra\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"libra\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♏\",\n \"description\": \"Scorpio\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"scorpius\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♐\",\n \"description\": \"Sagittarius\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"sagittarius\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♑\",\n \"description\": \"Capricorn\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"capricorn\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♒\",\n \"description\": \"Aquarius\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"aquarius\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♓\",\n \"description\": \"Pisces\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"pisces\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛎\",\n \"description\": \"Ophiuchus\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"ophiuchus\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔀\",\n \"description\": \"shuffle tracks button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"twisted_rightwards_arrows\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔁\",\n \"description\": \"repeat button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"repeat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔂\",\n \"description\": \"repeat single button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"repeat_one\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"▶️\",\n \"description\": \"play button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"arrow_forward\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⏩\",\n \"description\": \"fast-forward button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"fast_forward\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⏭️\",\n \"description\": \"next track button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"next_track_button\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⏯️\",\n \"description\": \"play or pause button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"play_or_pause_button\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"◀️\",\n \"description\": \"reverse button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"arrow_backward\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⏪\",\n \"description\": \"fast reverse button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"rewind\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⏮️\",\n \"description\": \"last track button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"previous_track_button\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔼\",\n \"description\": \"upwards button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"arrow_up_small\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⏫\",\n \"description\": \"fast up button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"arrow_double_up\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔽\",\n \"description\": \"downwards button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"arrow_down_small\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⏬\",\n \"description\": \"fast down button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"arrow_double_down\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⏸️\",\n \"description\": \"pause button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"pause_button\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⏹️\",\n \"description\": \"stop button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"stop_button\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⏺️\",\n \"description\": \"record button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"record_button\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⏏️\",\n \"description\": \"eject button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"eject_button\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎦\",\n \"description\": \"cinema\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"cinema\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔅\",\n \"description\": \"dim button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"low_brightness\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔆\",\n \"description\": \"bright button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"high_brightness\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📶\",\n \"description\": \"antenna bars\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"signal_strength\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📳\",\n \"description\": \"vibration mode\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"vibration_mode\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📴\",\n \"description\": \"mobile phone off\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"mobile_phone_off\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♀️\",\n \"description\": \"female sign\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"female_sign\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♂️\",\n \"description\": \"male sign\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"male_sign\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⚧️\",\n \"description\": \"transgender symbol\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"transgender_symbol\"\n ],\n \"hasMarkdownRepresentation\": false\n },\n {\n \"emojiRaw\": \"✖️\",\n \"description\": \"multiply\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"heavy_multiplication_x\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"➕\",\n \"description\": \"plus\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"heavy_plus_sign\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"➖\",\n \"description\": \"minus\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"heavy_minus_sign\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"➗\",\n \"description\": \"divide\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"heavy_division_sign\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♾️\",\n \"description\": \"infinity\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"infinity\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"‼️\",\n \"description\": \"double exclamation mark\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"bangbang\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⁉️\",\n \"description\": \"exclamation question mark\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"interrobang\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"❓\",\n \"description\": \"question mark\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"question\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"❔\",\n \"description\": \"white question mark\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"grey_question\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"❕\",\n \"description\": \"white exclamation mark\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"grey_exclamation\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"❗\",\n \"description\": \"exclamation mark\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"exclamation\",\n \"heavy_exclamation_mark\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"〰️\",\n \"description\": \"wavy dash\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"wavy_dash\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💱\",\n \"description\": \"currency exchange\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"currency_exchange\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💲\",\n \"description\": \"heavy dollar sign\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"heavy_dollar_sign\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⚕️\",\n \"description\": \"medical symbol\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"medical_symbol\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♻️\",\n \"description\": \"recycling symbol\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"recycle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⚜️\",\n \"description\": \"fleur-de-lis\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"fleur_de_lis\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔱\",\n \"description\": \"trident emblem\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"trident\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📛\",\n \"description\": \"name badge\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"name_badge\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔰\",\n \"description\": \"Japanese symbol for beginner\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"beginner\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⭕\",\n \"description\": \"hollow red circle\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"o\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"✅\",\n \"description\": \"check mark button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"white_check_mark\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"☑️\",\n \"description\": \"check box with check\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"ballot_box_with_check\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"✔️\",\n \"description\": \"check mark\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"heavy_check_mark\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"❌\",\n \"description\": \"cross mark\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"x\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"❎\",\n \"description\": \"cross mark button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"negative_squared_cross_mark\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"➰\",\n \"description\": \"curly loop\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"curly_loop\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"➿\",\n \"description\": \"double curly loop\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"loop\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"〽️\",\n \"description\": \"part alternation mark\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"part_alternation_mark\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"✳️\",\n \"description\": \"eight-spoked asterisk\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"eight_spoked_asterisk\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"✴️\",\n \"description\": \"eight-pointed star\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"eight_pointed_black_star\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"❇️\",\n \"description\": \"sparkle\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"sparkle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"©️\",\n \"description\": \"copyright\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"copyright\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"®️\",\n \"description\": \"registered\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"registered\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"™️\",\n \"description\": \"trade mark\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"tm\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"#️⃣\",\n \"description\": \"keycap: #\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"hash\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"*️⃣\",\n \"description\": \"keycap: *\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"asterisk\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"0️⃣\",\n \"description\": \"keycap: 0\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"zero\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"1️⃣\",\n \"description\": \"keycap: 1\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"one\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"2️⃣\",\n \"description\": \"keycap: 2\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"two\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"3️⃣\",\n \"description\": \"keycap: 3\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"three\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"4️⃣\",\n \"description\": \"keycap: 4\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"four\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"5️⃣\",\n \"description\": \"keycap: 5\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"five\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"6️⃣\",\n \"description\": \"keycap: 6\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"six\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"7️⃣\",\n \"description\": \"keycap: 7\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"seven\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"8️⃣\",\n \"description\": \"keycap: 8\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"eight\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"9️⃣\",\n \"description\": \"keycap: 9\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"nine\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔟\",\n \"description\": \"keycap: 10\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"keycap_ten\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔠\",\n \"description\": \"input latin uppercase\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"capital_abcd\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔡\",\n \"description\": \"input latin lowercase\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"abcd\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔢\",\n \"description\": \"input numbers\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"1234\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔣\",\n \"description\": \"input symbols\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"symbols\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔤\",\n \"description\": \"input latin letters\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"abc\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🅰️\",\n \"description\": \"A button (blood type)\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"a\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🆎\",\n \"description\": \"AB button (blood type)\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"ab\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🅱️\",\n \"description\": \"B button (blood type)\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"b\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🆑\",\n \"description\": \"CL button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"cl\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🆒\",\n \"description\": \"COOL button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"cool\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🆓\",\n \"description\": \"FREE button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"free\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"ℹ️\",\n \"description\": \"information\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"information_source\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🆔\",\n \"description\": \"ID button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"id\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"Ⓜ️\",\n \"description\": \"circled M\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"m\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🆕\",\n \"description\": \"NEW button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"new\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🆖\",\n \"description\": \"NG button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"ng\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🅾️\",\n \"description\": \"O button (blood type)\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"o2\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🆗\",\n \"description\": \"OK button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"ok\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🅿️\",\n \"description\": \"P button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"parking\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🆘\",\n \"description\": \"SOS button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"sos\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🆙\",\n \"description\": \"UP! button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"up\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🆚\",\n \"description\": \"VS button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"vs\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🈁\",\n \"description\": \"Japanese “here” button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"koko\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🈂️\",\n \"description\": \"Japanese “service charge” button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"sa\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🈷️\",\n \"description\": \"Japanese “monthly amount” button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"u6708\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🈶\",\n \"description\": \"Japanese “not free of charge” button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"u6709\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🈯\",\n \"description\": \"Japanese “reserved” button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"u6307\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🉐\",\n \"description\": \"Japanese “bargain” button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"ideograph_advantage\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🈹\",\n \"description\": \"Japanese “discount” button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"u5272\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🈚\",\n \"description\": \"Japanese “free of charge” button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"u7121\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🈲\",\n \"description\": \"Japanese “prohibited” button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"u7981\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🉑\",\n \"description\": \"Japanese “acceptable” button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"accept\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🈸\",\n \"description\": \"Japanese “application” button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"u7533\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🈴\",\n \"description\": \"Japanese “passing grade” button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"u5408\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🈳\",\n \"description\": \"Japanese “vacancy” button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"u7a7a\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"㊗️\",\n \"description\": \"Japanese “congratulations” button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"congratulations\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"㊙️\",\n \"description\": \"Japanese “secret” button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"secret\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🈺\",\n \"description\": \"Japanese “open for business” button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"u55b6\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🈵\",\n \"description\": \"Japanese “no vacancy” button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"u6e80\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔴\",\n \"description\": \"red circle\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"red_circle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🟠\",\n \"description\": \"orange circle\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"orange_circle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🟡\",\n \"description\": \"yellow circle\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"yellow_circle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🟢\",\n \"description\": \"green circle\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"green_circle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔵\",\n \"description\": \"blue circle\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"large_blue_circle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🟣\",\n \"description\": \"purple circle\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"purple_circle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🟤\",\n \"description\": \"brown circle\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"brown_circle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⚫\",\n \"description\": \"black circle\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"black_circle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⚪\",\n \"description\": \"white circle\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"white_circle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🟥\",\n \"description\": \"red square\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"red_square\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🟧\",\n \"description\": \"orange square\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"orange_square\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🟨\",\n \"description\": \"yellow square\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"yellow_square\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🟩\",\n \"description\": \"green square\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"green_square\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🟦\",\n \"description\": \"blue square\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"blue_square\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🟪\",\n \"description\": \"purple square\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"purple_square\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🟫\",\n \"description\": \"brown square\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"brown_square\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⬛\",\n \"description\": \"black large square\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"black_large_square\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⬜\",\n \"description\": \"white large square\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"white_large_square\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"◼️\",\n \"description\": \"black medium square\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"black_medium_square\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"◻️\",\n \"description\": \"white medium square\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"white_medium_square\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"◾\",\n \"description\": \"black medium-small square\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"black_medium_small_square\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"◽\",\n \"description\": \"white medium-small square\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"white_medium_small_square\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"▪️\",\n \"description\": \"black small square\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"black_small_square\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"▫️\",\n \"description\": \"white small square\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"white_small_square\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔶\",\n \"description\": \"large orange diamond\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"large_orange_diamond\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔷\",\n \"description\": \"large blue diamond\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"large_blue_diamond\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔸\",\n \"description\": \"small orange diamond\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"small_orange_diamond\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔹\",\n \"description\": \"small blue diamond\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"small_blue_diamond\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔺\",\n \"description\": \"red triangle pointed up\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"small_red_triangle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔻\",\n \"description\": \"red triangle pointed down\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"small_red_triangle_down\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💠\",\n \"description\": \"diamond with a dot\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"diamond_shape_with_a_dot_inside\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔘\",\n \"description\": \"radio button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"radio_button\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔳\",\n \"description\": \"white square button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"white_square_button\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔲\",\n \"description\": \"black square button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"black_square_button\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏁\",\n \"description\": \"chequered flag\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"checkered_flag\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚩\",\n \"description\": \"triangular flag\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"triangular_flag_on_post\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎌\",\n \"description\": \"crossed flags\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"crossed_flags\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏴\",\n \"description\": \"black flag\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"black_flag\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏳️\",\n \"description\": \"white flag\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"white_flag\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏳️🌈\",\n \"description\": \"rainbow flag\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"rainbow_flag\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏳️⚧️\",\n \"description\": \"transgender flag\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"transgender_flag\"\n ],\n \"hasMarkdownRepresentation\": false\n },\n {\n \"emojiRaw\": \"🏴☠️\",\n \"description\": \"pirate flag\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"pirate_flag\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇦🇨\",\n \"description\": \"flag: Ascension Island\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"ascension_island\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇦🇩\",\n \"description\": \"flag: Andorra\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"andorra\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇦🇪\",\n \"description\": \"flag: United Arab Emirates\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"united_arab_emirates\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇦🇫\",\n \"description\": \"flag: Afghanistan\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"afghanistan\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇦🇬\",\n \"description\": \"flag: Antigua & Barbuda\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"antigua_barbuda\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇦🇮\",\n \"description\": \"flag: Anguilla\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"anguilla\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇦🇱\",\n \"description\": \"flag: Albania\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"albania\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇦🇲\",\n \"description\": \"flag: Armenia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"armenia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇦🇴\",\n \"description\": \"flag: Angola\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"angola\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇦🇶\",\n \"description\": \"flag: Antarctica\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"antarctica\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇦🇷\",\n \"description\": \"flag: Argentina\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"argentina\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇦🇸\",\n \"description\": \"flag: American Samoa\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"american_samoa\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇦🇹\",\n \"description\": \"flag: Austria\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"austria\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇦🇺\",\n \"description\": \"flag: Australia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"australia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇦🇼\",\n \"description\": \"flag: Aruba\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"aruba\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇦🇽\",\n \"description\": \"flag: Åland Islands\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"aland_islands\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇦🇿\",\n \"description\": \"flag: Azerbaijan\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"azerbaijan\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇦\",\n \"description\": \"flag: Bosnia & Herzegovina\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"bosnia_herzegovina\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇧\",\n \"description\": \"flag: Barbados\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"barbados\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇩\",\n \"description\": \"flag: Bangladesh\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"bangladesh\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇪\",\n \"description\": \"flag: Belgium\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"belgium\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇫\",\n \"description\": \"flag: Burkina Faso\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"burkina_faso\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇬\",\n \"description\": \"flag: Bulgaria\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"bulgaria\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇭\",\n \"description\": \"flag: Bahrain\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"bahrain\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇮\",\n \"description\": \"flag: Burundi\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"burundi\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇯\",\n \"description\": \"flag: Benin\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"benin\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇱\",\n \"description\": \"flag: St. Barthélemy\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"st_barthelemy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇲\",\n \"description\": \"flag: Bermuda\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"bermuda\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇳\",\n \"description\": \"flag: Brunei\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"brunei\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇴\",\n \"description\": \"flag: Bolivia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"bolivia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇶\",\n \"description\": \"flag: Caribbean Netherlands\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"caribbean_netherlands\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇷\",\n \"description\": \"flag: Brazil\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"brazil\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇸\",\n \"description\": \"flag: Bahamas\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"bahamas\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇹\",\n \"description\": \"flag: Bhutan\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"bhutan\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇻\",\n \"description\": \"flag: Bouvet Island\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"bouvet_island\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇼\",\n \"description\": \"flag: Botswana\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"botswana\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇾\",\n \"description\": \"flag: Belarus\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"belarus\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇿\",\n \"description\": \"flag: Belize\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"belize\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇨🇦\",\n \"description\": \"flag: Canada\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"canada\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇨🇨\",\n \"description\": \"flag: Cocos (Keeling) Islands\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"cocos_islands\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇨🇩\",\n \"description\": \"flag: Congo - Kinshasa\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"congo_kinshasa\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇨🇫\",\n \"description\": \"flag: Central African Republic\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"central_african_republic\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇨🇬\",\n \"description\": \"flag: Congo - Brazzaville\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"congo_brazzaville\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇨🇭\",\n \"description\": \"flag: Switzerland\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"switzerland\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇨🇮\",\n \"description\": \"flag: Côte d’Ivoire\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"cote_divoire\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇨🇰\",\n \"description\": \"flag: Cook Islands\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"cook_islands\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇨🇱\",\n \"description\": \"flag: Chile\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"chile\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇨🇲\",\n \"description\": \"flag: Cameroon\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"cameroon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇨🇳\",\n \"description\": \"flag: China\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"cn\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇨🇴\",\n \"description\": \"flag: Colombia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"colombia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇨🇵\",\n \"description\": \"flag: Clipperton Island\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"clipperton_island\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇨🇷\",\n \"description\": \"flag: Costa Rica\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"costa_rica\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇨🇺\",\n \"description\": \"flag: Cuba\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"cuba\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇨🇻\",\n \"description\": \"flag: Cape Verde\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"cape_verde\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇨🇼\",\n \"description\": \"flag: Curaçao\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"curacao\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇨🇽\",\n \"description\": \"flag: Christmas Island\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"christmas_island\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇨🇾\",\n \"description\": \"flag: Cyprus\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"cyprus\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇨🇿\",\n \"description\": \"flag: Czechia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"czech_republic\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇩🇪\",\n \"description\": \"flag: Germany\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"de\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇩🇬\",\n \"description\": \"flag: Diego Garcia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"diego_garcia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇩🇯\",\n \"description\": \"flag: Djibouti\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"djibouti\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇩🇰\",\n \"description\": \"flag: Denmark\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"denmark\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇩🇲\",\n \"description\": \"flag: Dominica\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"dominica\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇩🇴\",\n \"description\": \"flag: Dominican Republic\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"dominican_republic\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇩🇿\",\n \"description\": \"flag: Algeria\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"algeria\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇪🇦\",\n \"description\": \"flag: Ceuta & Melilla\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"ceuta_melilla\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇪🇨\",\n \"description\": \"flag: Ecuador\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"ecuador\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇪🇪\",\n \"description\": \"flag: Estonia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"estonia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇪🇬\",\n \"description\": \"flag: Egypt\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"egypt\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇪🇭\",\n \"description\": \"flag: Western Sahara\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"western_sahara\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇪🇷\",\n \"description\": \"flag: Eritrea\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"eritrea\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇪🇸\",\n \"description\": \"flag: Spain\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"es\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇪🇹\",\n \"description\": \"flag: Ethiopia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"ethiopia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇪🇺\",\n \"description\": \"flag: European Union\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"eu\",\n \"european_union\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇫🇮\",\n \"description\": \"flag: Finland\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"finland\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇫🇯\",\n \"description\": \"flag: Fiji\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"fiji\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇫🇰\",\n \"description\": \"flag: Falkland Islands\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"falkland_islands\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇫🇲\",\n \"description\": \"flag: Micronesia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"micronesia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇫🇴\",\n \"description\": \"flag: Faroe Islands\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"faroe_islands\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇫🇷\",\n \"description\": \"flag: France\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"fr\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇬🇦\",\n \"description\": \"flag: Gabon\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"gabon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇬🇧\",\n \"description\": \"flag: United Kingdom\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"gb\",\n \"uk\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇬🇩\",\n \"description\": \"flag: Grenada\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"grenada\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇬🇪\",\n \"description\": \"flag: Georgia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"georgia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇬🇫\",\n \"description\": \"flag: French Guiana\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"french_guiana\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇬🇬\",\n \"description\": \"flag: Guernsey\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"guernsey\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇬🇭\",\n \"description\": \"flag: Ghana\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"ghana\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇬🇮\",\n \"description\": \"flag: Gibraltar\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"gibraltar\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇬🇱\",\n \"description\": \"flag: Greenland\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"greenland\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇬🇲\",\n \"description\": \"flag: Gambia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"gambia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇬🇳\",\n \"description\": \"flag: Guinea\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"guinea\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇬🇵\",\n \"description\": \"flag: Guadeloupe\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"guadeloupe\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇬🇶\",\n \"description\": \"flag: Equatorial Guinea\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"equatorial_guinea\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇬🇷\",\n \"description\": \"flag: Greece\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"greece\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇬🇸\",\n \"description\": \"flag: South Georgia & South Sandwich Islands\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"south_georgia_south_sandwich_islands\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇬🇹\",\n \"description\": \"flag: Guatemala\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"guatemala\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇬🇺\",\n \"description\": \"flag: Guam\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"guam\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇬🇼\",\n \"description\": \"flag: Guinea-Bissau\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"guinea_bissau\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇬🇾\",\n \"description\": \"flag: Guyana\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"guyana\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇭🇰\",\n \"description\": \"flag: Hong Kong SAR China\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"hong_kong\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇭🇲\",\n \"description\": \"flag: Heard & McDonald Islands\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"heard_mcdonald_islands\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇭🇳\",\n \"description\": \"flag: Honduras\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"honduras\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇭🇷\",\n \"description\": \"flag: Croatia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"croatia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇭🇹\",\n \"description\": \"flag: Haiti\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"haiti\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇭🇺\",\n \"description\": \"flag: Hungary\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"hungary\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇮🇨\",\n \"description\": \"flag: Canary Islands\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"canary_islands\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇮🇩\",\n \"description\": \"flag: Indonesia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"indonesia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇮🇪\",\n \"description\": \"flag: Ireland\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"ireland\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇮🇱\",\n \"description\": \"flag: Israel\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"israel\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇮🇲\",\n \"description\": \"flag: Isle of Man\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"isle_of_man\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇮🇳\",\n \"description\": \"flag: India\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"india\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇮🇴\",\n \"description\": \"flag: British Indian Ocean Territory\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"british_indian_ocean_territory\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇮🇶\",\n \"description\": \"flag: Iraq\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"iraq\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇮🇷\",\n \"description\": \"flag: Iran\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"iran\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇮🇸\",\n \"description\": \"flag: Iceland\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"iceland\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇮🇹\",\n \"description\": \"flag: Italy\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"it\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇯🇪\",\n \"description\": \"flag: Jersey\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"jersey\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇯🇲\",\n \"description\": \"flag: Jamaica\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"jamaica\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇯🇴\",\n \"description\": \"flag: Jordan\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"jordan\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇯🇵\",\n \"description\": \"flag: Japan\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"jp\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇰🇪\",\n \"description\": \"flag: Kenya\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"kenya\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇰🇬\",\n \"description\": \"flag: Kyrgyzstan\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"kyrgyzstan\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇰🇭\",\n \"description\": \"flag: Cambodia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"cambodia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇰🇮\",\n \"description\": \"flag: Kiribati\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"kiribati\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇰🇲\",\n \"description\": \"flag: Comoros\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"comoros\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇰🇳\",\n \"description\": \"flag: St. Kitts & Nevis\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"st_kitts_nevis\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇰🇵\",\n \"description\": \"flag: North Korea\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"north_korea\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇰🇷\",\n \"description\": \"flag: South Korea\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"kr\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇰🇼\",\n \"description\": \"flag: Kuwait\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"kuwait\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇰🇾\",\n \"description\": \"flag: Cayman Islands\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"cayman_islands\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇰🇿\",\n \"description\": \"flag: Kazakhstan\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"kazakhstan\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇱🇦\",\n \"description\": \"flag: Laos\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"laos\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇱🇧\",\n \"description\": \"flag: Lebanon\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"lebanon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇱🇨\",\n \"description\": \"flag: St. Lucia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"st_lucia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇱🇮\",\n \"description\": \"flag: Liechtenstein\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"liechtenstein\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇱🇰\",\n \"description\": \"flag: Sri Lanka\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"sri_lanka\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇱🇷\",\n \"description\": \"flag: Liberia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"liberia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇱🇸\",\n \"description\": \"flag: Lesotho\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"lesotho\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇱🇹\",\n \"description\": \"flag: Lithuania\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"lithuania\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇱🇺\",\n \"description\": \"flag: Luxembourg\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"luxembourg\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇱🇻\",\n \"description\": \"flag: Latvia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"latvia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇱🇾\",\n \"description\": \"flag: Libya\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"libya\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇦\",\n \"description\": \"flag: Morocco\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"morocco\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇨\",\n \"description\": \"flag: Monaco\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"monaco\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇩\",\n \"description\": \"flag: Moldova\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"moldova\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇪\",\n \"description\": \"flag: Montenegro\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"montenegro\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇫\",\n \"description\": \"flag: St. Martin\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"st_martin\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇬\",\n \"description\": \"flag: Madagascar\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"madagascar\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇭\",\n \"description\": \"flag: Marshall Islands\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"marshall_islands\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇰\",\n \"description\": \"flag: North Macedonia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"macedonia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇱\",\n \"description\": \"flag: Mali\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"mali\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇲\",\n \"description\": \"flag: Myanmar (Burma)\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"myanmar\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇳\",\n \"description\": \"flag: Mongolia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"mongolia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇴\",\n \"description\": \"flag: Macao SAR China\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"macau\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇵\",\n \"description\": \"flag: Northern Mariana Islands\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"northern_mariana_islands\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇶\",\n \"description\": \"flag: Martinique\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"martinique\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇷\",\n \"description\": \"flag: Mauritania\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"mauritania\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇸\",\n \"description\": \"flag: Montserrat\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"montserrat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇹\",\n \"description\": \"flag: Malta\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"malta\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇺\",\n \"description\": \"flag: Mauritius\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"mauritius\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇻\",\n \"description\": \"flag: Maldives\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"maldives\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇼\",\n \"description\": \"flag: Malawi\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"malawi\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇽\",\n \"description\": \"flag: Mexico\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"mexico\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇾\",\n \"description\": \"flag: Malaysia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"malaysia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇿\",\n \"description\": \"flag: Mozambique\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"mozambique\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇳🇦\",\n \"description\": \"flag: Namibia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"namibia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇳🇨\",\n \"description\": \"flag: New Caledonia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"new_caledonia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇳🇪\",\n \"description\": \"flag: Niger\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"niger\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇳🇫\",\n \"description\": \"flag: Norfolk Island\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"norfolk_island\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇳🇬\",\n \"description\": \"flag: Nigeria\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"nigeria\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇳🇮\",\n \"description\": \"flag: Nicaragua\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"nicaragua\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇳🇱\",\n \"description\": \"flag: Netherlands\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"netherlands\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇳🇴\",\n \"description\": \"flag: Norway\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"norway\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇳🇵\",\n \"description\": \"flag: Nepal\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"nepal\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇳🇷\",\n \"description\": \"flag: Nauru\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"nauru\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇳🇺\",\n \"description\": \"flag: Niue\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"niue\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇳🇿\",\n \"description\": \"flag: New Zealand\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"new_zealand\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇴🇲\",\n \"description\": \"flag: Oman\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"oman\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇵🇦\",\n \"description\": \"flag: Panama\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"panama\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇵🇪\",\n \"description\": \"flag: Peru\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"peru\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇵🇫\",\n \"description\": \"flag: French Polynesia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"french_polynesia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇵🇬\",\n \"description\": \"flag: Papua New Guinea\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"papua_new_guinea\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇵🇭\",\n \"description\": \"flag: Philippines\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"philippines\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇵🇰\",\n \"description\": \"flag: Pakistan\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"pakistan\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇵🇱\",\n \"description\": \"flag: Poland\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"poland\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇵🇲\",\n \"description\": \"flag: St. Pierre & Miquelon\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"st_pierre_miquelon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇵🇳\",\n \"description\": \"flag: Pitcairn Islands\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"pitcairn_islands\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇵🇷\",\n \"description\": \"flag: Puerto Rico\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"puerto_rico\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇵🇸\",\n \"description\": \"flag: Palestinian Territories\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"palestinian_territories\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇵🇹\",\n \"description\": \"flag: Portugal\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"portugal\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇵🇼\",\n \"description\": \"flag: Palau\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"palau\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇵🇾\",\n \"description\": \"flag: Paraguay\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"paraguay\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇶🇦\",\n \"description\": \"flag: Qatar\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"qatar\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇷🇪\",\n \"description\": \"flag: Réunion\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"reunion\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇷🇴\",\n \"description\": \"flag: Romania\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"romania\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇷🇸\",\n \"description\": \"flag: Serbia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"serbia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇷🇺\",\n \"description\": \"flag: Russia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"ru\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇷🇼\",\n \"description\": \"flag: Rwanda\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"rwanda\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇦\",\n \"description\": \"flag: Saudi Arabia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"saudi_arabia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇧\",\n \"description\": \"flag: Solomon Islands\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"solomon_islands\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇨\",\n \"description\": \"flag: Seychelles\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"seychelles\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇩\",\n \"description\": \"flag: Sudan\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"sudan\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇪\",\n \"description\": \"flag: Sweden\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"sweden\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇬\",\n \"description\": \"flag: Singapore\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"singapore\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇭\",\n \"description\": \"flag: St. Helena\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"st_helena\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇮\",\n \"description\": \"flag: Slovenia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"slovenia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇯\",\n \"description\": \"flag: Svalbard & Jan Mayen\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"svalbard_jan_mayen\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇰\",\n \"description\": \"flag: Slovakia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"slovakia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇱\",\n \"description\": \"flag: Sierra Leone\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"sierra_leone\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇲\",\n \"description\": \"flag: San Marino\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"san_marino\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇳\",\n \"description\": \"flag: Senegal\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"senegal\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇴\",\n \"description\": \"flag: Somalia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"somalia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇷\",\n \"description\": \"flag: Suriname\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"suriname\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇸\",\n \"description\": \"flag: South Sudan\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"south_sudan\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇹\",\n \"description\": \"flag: São Tomé & Príncipe\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"sao_tome_principe\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇻\",\n \"description\": \"flag: El Salvador\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"el_salvador\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇽\",\n \"description\": \"flag: Sint Maarten\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"sint_maarten\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇾\",\n \"description\": \"flag: Syria\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"syria\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇿\",\n \"description\": \"flag: Eswatini\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"swaziland\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇹🇦\",\n \"description\": \"flag: Tristan da Cunha\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"tristan_da_cunha\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇹🇨\",\n \"description\": \"flag: Turks & Caicos Islands\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"turks_caicos_islands\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇹🇩\",\n \"description\": \"flag: Chad\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"chad\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇹🇫\",\n \"description\": \"flag: French Southern Territories\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"french_southern_territories\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇹🇬\",\n \"description\": \"flag: Togo\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"togo\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇹🇭\",\n \"description\": \"flag: Thailand\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"thailand\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇹🇯\",\n \"description\": \"flag: Tajikistan\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"tajikistan\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇹🇰\",\n \"description\": \"flag: Tokelau\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"tokelau\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇹🇱\",\n \"description\": \"flag: Timor-Leste\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"timor_leste\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇹🇲\",\n \"description\": \"flag: Turkmenistan\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"turkmenistan\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇹🇳\",\n \"description\": \"flag: Tunisia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"tunisia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇹🇴\",\n \"description\": \"flag: Tonga\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"tonga\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇹🇷\",\n \"description\": \"flag: Turkey\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"tr\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇹🇹\",\n \"description\": \"flag: Trinidad & Tobago\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"trinidad_tobago\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇹🇻\",\n \"description\": \"flag: Tuvalu\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"tuvalu\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇹🇼\",\n \"description\": \"flag: Taiwan\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"taiwan\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇹🇿\",\n \"description\": \"flag: Tanzania\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"tanzania\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇺🇦\",\n \"description\": \"flag: Ukraine\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"ukraine\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇺🇬\",\n \"description\": \"flag: Uganda\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"uganda\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇺🇲\",\n \"description\": \"flag: U.S. Outlying Islands\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"us_outlying_islands\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇺🇳\",\n \"description\": \"flag: United Nations\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"united_nations\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇺🇸\",\n \"description\": \"flag: United States\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"us\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇺🇾\",\n \"description\": \"flag: Uruguay\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"uruguay\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇺🇿\",\n \"description\": \"flag: Uzbekistan\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"uzbekistan\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇻🇦\",\n \"description\": \"flag: Vatican City\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"vatican_city\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇻🇨\",\n \"description\": \"flag: St. Vincent & Grenadines\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"st_vincent_grenadines\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇻🇪\",\n \"description\": \"flag: Venezuela\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"venezuela\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇻🇬\",\n \"description\": \"flag: British Virgin Islands\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"british_virgin_islands\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇻🇮\",\n \"description\": \"flag: U.S. Virgin Islands\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"us_virgin_islands\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇻🇳\",\n \"description\": \"flag: Vietnam\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"vietnam\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇻🇺\",\n \"description\": \"flag: Vanuatu\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"vanuatu\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇼🇫\",\n \"description\": \"flag: Wallis & Futuna\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"wallis_futuna\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇼🇸\",\n \"description\": \"flag: Samoa\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"samoa\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇽🇰\",\n \"description\": \"flag: Kosovo\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"kosovo\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇾🇪\",\n \"description\": \"flag: Yemen\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"yemen\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇾🇹\",\n \"description\": \"flag: Mayotte\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"mayotte\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇿🇦\",\n \"description\": \"flag: South Africa\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"south_africa\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇿🇲\",\n \"description\": \"flag: Zambia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"zambia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇿🇼\",\n \"description\": \"flag: Zimbabwe\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"zimbabwe\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏴\",\n \"description\": \"flag: England\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"england\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏴\",\n \"description\": \"flag: Scotland\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"scotland\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏴\",\n \"description\": \"flag: Wales\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"wales\"\n ],\n \"hasMarkdownRepresentation\": true\n }\n];\n\nexport default emjois;\n","/*\n * emoji.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Mark, Fragment, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { InputRule } from 'prosemirror-inputrules';\nimport { EditorState, Transaction } from 'prosemirror-state';\n\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { PandocOutput, PandocToken, PandocTokenType, ProsemirrorWriter, PandocExtensions } from '../../api/pandoc';\nimport { pandocAttrReadAST } from '../../api/pandoc_attr';\nimport { fragmentText } from '../../api/fragment';\n\nimport { FixupContext } from '../../api/fixup';\nimport { MarkTransaction } from '../../api/transaction';\nimport { mergedTextNodes } from '../../api/text';\nimport {\n emojis,\n emojiFromAlias,\n emojiFromChar,\n emojiForAllSkinTones,\n Emoji,\n emojiWithSkinTonePreference,\n kEmojiAttr,\n kEmojiContent,\n} from '../../api/emoji';\nimport { emojiCompletionHandler, emojiSkintonePreferenceCompletionHandler } from './emoji-completion';\nimport { getMarkAttrs } from '../../api/mark';\n\nconst extension = (context: ExtensionContext): Extension | null => {\n const { ui } = context;\n\n return {\n marks: [\n {\n name: 'emoji',\n noSpelling: true,\n spec: {\n inclusive: false,\n noInputRules: true,\n attrs: {\n emojihint: {},\n prompt: { default: true },\n },\n parseDOM: [\n {\n tag: \"span[class*='emoji']\",\n getAttrs(dom: Node | string) {\n const el = dom as Element;\n return {\n emojihint: el.getAttribute('data-emojihint'),\n prompt: el.getAttribute('data-emojiprompt') || false,\n };\n },\n },\n ],\n toDOM(mark: Mark) {\n return [\n 'span',\n {\n class: 'emoji pm-emoji-font',\n title: ':' + mark.attrs.emojihint + ':',\n 'data-emojihint': mark.attrs.emojihint,\n 'data-emojiprompt': mark.attrs.prompt,\n },\n ];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.Span,\n match: (tok: PandocToken) => {\n const attrs = pandocAttrReadAST(tok, kEmojiAttr);\n return attrs.keyvalue.length > 0 && attrs.keyvalue[0][0] === 'data-emoji';\n },\n handler: (schema: Schema) => (writer: ProsemirrorWriter, tok: PandocToken) => {\n const attrs = pandocAttrReadAST(tok, kEmojiAttr);\n const emojihint = attrs.keyvalue[0][1];\n const emojiMark = schema.marks.emoji.create({ emojihint });\n writer.openMark(emojiMark);\n const emojiChar = tok.c[kEmojiContent][0].c;\n writer.writeText(emojiChar);\n writer.closeMark(emojiMark);\n },\n },\n ],\n writer: {\n priority: 2,\n write: (output: PandocOutput, mark: Mark, parent: Fragment) => {\n // look for a matching emoji\n const char = fragmentText(parent);\n const emoji = emojiFromChar(char);\n if (emoji) {\n output.writeToken(PandocTokenType.Span, () => {\n // resolve which alias to use\n let alias = emoji.aliases[0];\n if (emoji.aliases.length > 1) {\n if (emoji.aliases.includes(mark.attrs.emojihint)) {\n alias = mark.attrs.emojihint;\n }\n }\n output.writeAttr('', ['emoji'], [['data-emoji', alias]]);\n output.writeArray(() => {\n output.writeText(emoji.emojiRaw);\n });\n });\n } else {\n output.writeInlines(parent);\n }\n },\n },\n },\n },\n ],\n\n inputRules: () => {\n return [\n new InputRule(/(^|[^`]):(\\w+):$/, (state: EditorState, match: string[], start: number, end: number) => {\n const emojiName = match[2];\n const emoji = emojiFromAlias(emojiName.toLowerCase());\n if (emoji) {\n const emojiWithSkinTone = emojiWithSkinTonePreference(emoji, ui.prefs.emojiSkinTone());\n const schema = state.schema;\n const tr = state.tr;\n tr.delete(start + match[1].length, end);\n tr.replaceSelectionWith(nodeForEmoji(schema, emojiWithSkinTone, emojiName), false);\n return tr;\n } else {\n return null;\n }\n }),\n ];\n },\n\n completionHandlers: () => [emojiCompletionHandler(ui), emojiSkintonePreferenceCompletionHandler(ui)],\n\n fixups: (schema: Schema) => {\n return [\n (tr: Transaction, fixupContext: FixupContext) => {\n // only apply on save and load\n if (![FixupContext.Save, FixupContext.Load].includes(fixupContext)) {\n return tr;\n }\n\n // create mark transation wrapper\n const markTr = new MarkTransaction(tr);\n\n const textNodes = mergedTextNodes(\n markTr.doc,\n (_node: ProsemirrorNode, _pos: number, parentNode: ProsemirrorNode) =>\n parentNode.type.allowsMarkType(schema.marks.emoji),\n );\n\n textNodes.forEach(textNode => {\n // Since emoji can be composed of multiple characters (including\n // other emoji), we always need to prefer the longest match when inserting\n // a mark for any given starting position.\n\n // Find the possible emoji at each position in this text node\n const possibleMarks = new Map<number, Array<{ to: number; emoji: Emoji }>>();\n for (const emoji of emojis(ui.prefs.emojiSkinTone())) {\n emojiForAllSkinTones(emoji).forEach(skinToneEmoji => {\n let charLoc = textNode.text.indexOf(skinToneEmoji.emoji);\n while (charLoc !== -1) {\n const from = textNode.pos + charLoc;\n const to = from + skinToneEmoji.emoji.length;\n possibleMarks.set(from, (possibleMarks.get(from) || []).concat({ to, emoji: skinToneEmoji }));\n charLoc = textNode.text.indexOf(skinToneEmoji.emoji, charLoc + 1);\n }\n });\n }\n\n // For each position that has emoji, use the longest emoji match as the\n // emoji to be marked.\n possibleMarks.forEach((possibleEmojis, markFrom) => {\n const orderedEmojis = possibleEmojis.sort((a, b) => b.to - a.to);\n const to = orderedEmojis[0].to;\n const emoji = orderedEmojis[0].emoji;\n\n // remove any existing mark (preserving attribues if we do )\n let existingAttrs: { [key: string]: any } | null = null;\n if (markTr.doc.rangeHasMark(markFrom, to, schema.marks.emoji)) {\n existingAttrs = getMarkAttrs(markTr.doc, { from: markFrom, to }, schema.marks.emoji);\n markTr.removeMark(markFrom, to, schema.marks.emoji);\n }\n\n // create a new mark\n const mark = schema.marks.emoji.create({\n emojihint: emoji.aliases[0],\n ...existingAttrs,\n });\n\n // on load we want to cover the entire span\n if (fixupContext === FixupContext.Load) {\n markTr.addMark(markFrom, to, mark);\n // on save we just want the raw emjoi character(s)\n } else if (fixupContext === FixupContext.Save) {\n markTr.addMark(markFrom, markFrom + emoji.emoji.length, mark);\n }\n });\n });\n\n return tr;\n },\n ];\n },\n };\n};\n\nexport function nodeForEmoji(schema: Schema, emoji: Emoji, hint: string, prompt?: boolean): ProsemirrorNode {\n const mark = schema.marks.emoji.create({ emojihint: hint, prompt });\n return schema.text(emoji.emoji, [mark]);\n}\n\nexport default extension;\n","/*\n * emoji-completion.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\n\nimport React from 'react';\n\nimport { EditorUI } from '../../api/ui';\n\nimport { CompletionHandler, CompletionResult, CompletionHeaderProps } from '../../api/completion';\nimport { emojis, Emoji, SkinTone, emojiFromChar, emojiForAllSkinTones } from '../../api/emoji';\nimport { getMarkRange, getMarkAttrs } from '../../api/mark';\nimport { nodeForEmoji } from './emoji';\n\nimport './emoji-completion.css';\n\nexport function emojiCompletionHandler(ui: EditorUI): CompletionHandler<Emoji> {\n return {\n id: '95A133E1-968B-4D96-8849-4A325FF02C11',\n\n completions: emojiCompletions(ui),\n\n replacement(schema: Schema, emoji: Emoji | null): string | ProsemirrorNode | null {\n if (emoji) {\n return nodeForEmoji(schema, emoji, emoji.aliases[0]);\n } else {\n return null;\n }\n },\n\n view: {\n component: EmojiView,\n key: emoji => emoji.emoji,\n width: 200,\n hideNoResults: true,\n },\n };\n}\n\nconst kMaxEmojiCompletions = 20;\nconst kEmojiCompletionRegEx = /(^|[^`\\:]):(\\w{2,})$/;\n\nfunction emojiCompletions(ui: EditorUI) {\n return (text: string, context: EditorState | Transaction): CompletionResult<Emoji> | null => {\n // look for requisite text sequence\n const match = text.match(kEmojiCompletionRegEx);\n if (match) {\n // determine insert position and prefix to search for\n const prefix = match[2].toLowerCase();\n const pos = context.selection.head - prefix.length - 1; // -1 for the leading :\n\n // scan for completions that match the prefix (truncate as necessary)\n const completions: Emoji[] = [];\n for (const emoji of emojis(ui.prefs.emojiSkinTone())) {\n const alias = emoji.aliases.find(a => a.startsWith(prefix));\n if (alias) {\n completions.push({\n ...emoji,\n aliases: [alias],\n });\n }\n if (completions.length >= kMaxEmojiCompletions) {\n break;\n }\n }\n\n // return result\n return {\n pos,\n token: prefix,\n completions: () => Promise.resolve(completions),\n };\n\n // no match\n } else {\n return null;\n }\n };\n}\n\nconst EmojiView: React.FC<Emoji> = emoji => {\n return (\n <div className={'pm-completion-list-item-text pm-emoji-font'}>\n {emoji.emoji} :{emoji.aliases[0]}:\n </div>\n );\n};\n\nexport function emojiSkintonePreferenceCompletionHandler(ui: EditorUI): CompletionHandler<Emoji> {\n return {\n id: '15E92D42-8006-40F4-8FFD-6526F6A8A7FD',\n\n completions: emojiSkintonePreferenceCompletions(ui),\n\n replacement(schema: Schema, emoji: Emoji | null): string | ProsemirrorNode | null {\n if (emoji) {\n // Save this preference and use it in the future\n ui.prefs.setEmojiSkinTone(emoji.skinTone);\n\n // Emit the emoji of the correct skin tone\n return nodeForEmoji(schema, emoji, emoji.aliases[0]);\n } else {\n // The user didn't select a skintoned emoji (e.g. pressed 'ESC'), so\n // just store Default and use that in the future\n ui.prefs.setEmojiSkinTone(SkinTone.Default);\n\n return null;\n }\n },\n\n view: {\n header: () => ({\n component: EmojiSkintonePreferenceHeaderView,\n height: kHeaderHeight,\n }),\n component: EmojiSkintonePreferenceView,\n key: pref => pref.skinTone,\n width: kCellWidth,\n height: kCellWidth,\n horizontal: true,\n horizontalItemWidths: [55],\n },\n };\n}\n\nconst kCellWidth = 40;\nconst kHeaderHeight = 20;\n\nfunction emojiSkintonePreferenceCompletions(ui: EditorUI) {\n return (text: string, context: EditorState | Transaction): CompletionResult<Emoji> | null => {\n // The user has set a preference for skin tone\n if (ui.prefs.emojiSkinTone() !== SkinTone.None) {\n return null;\n }\n\n const range = getMarkRange(context.doc.resolve(context.selection.head - 1), context.doc.type.schema.marks.emoji);\n if (!range) {\n return null;\n }\n\n const emojiText = context.doc.textBetween(range.from, range.to);\n\n // If an attribute to suppress the prompt was explicitly set, don't prompt\n // the user for a skin tone\n const emojiAttrs = getMarkAttrs(context.doc, range, context.doc.type.schema.marks.emoji);\n if (!emojiAttrs.prompt) {\n return null;\n }\n const emoji = emojiFromChar(emojiText);\n\n // If this is an emoji that doesn't support skin tones just return\n if (!emoji?.supportsSkinTone) {\n return null;\n }\n\n return {\n pos: range.from,\n token: emojiText,\n completions: () => Promise.resolve(emojiForAllSkinTones(emoji)),\n };\n };\n}\n\nconst EmojiSkintonePreferenceHeaderView: React.FC<CompletionHeaderProps> = props => {\n return (\n <div className={'pm-completion-emoji-cell-header pm-light-text-color'}>\n {props.ui.context.translateText('Choose preferred skin tone:')}\n </div>\n );\n};\n\n// use outline to apply border as a separator\nconst EmojiSkintonePreferenceView: React.FC<Emoji> = emoji => {\n return <div className=\"pm-completion-list-item-text pm-completion-emoji-cell\">{emoji.emoji}</div>;\n};\n","/*\n * insert_symbol-emoji-skintone.ts\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\n\nimport { TextButton } from '../../api/widgets/button';\n\nimport { SkinTone, emojiFromAlias, emojiWithSkinTonePreference, emojiForAllSkinTones, Emoji } from '../../api/emoji';\nimport { SymbolPreferencesProps } from './insert_symbol-dataprovider';\n\nimport './insert_symbol-emoji-skintone.css';\n\nexport const SymbolEmojiPreferencesPanel = React.forwardRef<any, SymbolPreferencesProps>((props, ref) => {\n // The currently selected skin tone\n const [selectedSkinTone, setSelectedSkinTone] = React.useState<SkinTone>(props.prefs.emojiSkinTone());\n\n // Shows and hides the selection UI\n const [selectSkinTone, setSelectSkinTone] = React.useState<boolean>(false);\n\n const previewEmoji = React.useMemo(() => {\n const emojiRaw = emojiFromAlias('hand');\n return emojiWithSkinTonePreference(emojiRaw!, selectedSkinTone);\n }, [selectedSkinTone]);\n\n const previewEmojiWithSkinTones = React.useMemo(() => {\n return emojiForAllSkinTones(previewEmoji);\n }, [previewEmoji]);\n\n // If the user navigates or changes the symbol, close the picker\n React.useEffect(() => {\n setSelectSkinTone(false);\n }, [props.selectedSymbolIndex]);\n\n // Support navigation within the panel\n const handleKeyDown = (event: React.KeyboardEvent) => {\n switch (event.key) {\n case 'ArrowRight':\n if (selectSkinTone) {\n setSelectedSkinTone(nextSkinTone());\n }\n break;\n\n case 'ArrowLeft':\n if (selectSkinTone) {\n setSelectedSkinTone(previousSkinTone());\n }\n break;\n\n case 'Enter':\n case ' ':\n commitSkinTonePreference(selectedSkinTone);\n setSelectSkinTone(!selectSkinTone);\n event.preventDefault();\n break;\n }\n };\n\n const handleClick = (skinTone: SkinTone) => {\n return (event: React.MouseEvent<HTMLElement>) => {\n commitSkinTonePreference(skinTone);\n setSelectSkinTone(false);\n };\n };\n\n const handleButtonClick = () => {\n setSelectSkinTone(true);\n };\n\n function nextSkinTone(): SkinTone {\n const index = getCurrentSkinToneIndex();\n if (index + 1 < previewEmojiWithSkinTones.length) {\n return previewEmojiWithSkinTones[index + 1].skinTone;\n }\n return selectedSkinTone;\n }\n\n function previousSkinTone(): SkinTone {\n const index = getCurrentSkinToneIndex();\n if (index - 1 >= 0) {\n return previewEmojiWithSkinTones[index - 1].skinTone;\n }\n return selectedSkinTone;\n }\n\n function getCurrentSkinToneIndex(): number {\n const index = previewEmojiWithSkinTones.findIndex(emoji => emoji.skinTone === selectedSkinTone);\n return Math.max(Math.min(index, previewEmojiWithSkinTones.length), 0);\n }\n\n function skinToneSelectedClass(emoji: Emoji): string {\n if (\n selectedSkinTone === emoji.skinTone ||\n (selectedSkinTone === SkinTone.None && emoji.skinTone === SkinTone.Default)\n ) {\n return 'pm-emoji-skintone-picker-item-selected pm-input-button';\n }\n return '';\n }\n\n function commitSkinTonePreference(skinTone: SkinTone) {\n setSelectedSkinTone(skinTone);\n props.prefs.setEmojiSkinTone(skinTone);\n props.onPreferencesChanged();\n }\n\n const skinTonePicker = () => {\n return (\n <div>\n <div className=\"pm-emoji-skintone-picker pm-input-button\">\n {previewEmojiWithSkinTones.map(emoji => {\n return (\n <div\n key={emoji.emoji}\n className={`pm-emoji-skintone-picker-item ${skinToneSelectedClass(emoji)}`}\n onClick={handleClick(emoji.skinTone)}\n >\n {emoji.emoji}\n </div>\n );\n })}\n </div>\n <div className=\"pm-emoji-skintone-picker-label pm-light-text-color\">\n {props.context.translateText('Preferred skin tone')}\n </div>\n </div>\n );\n };\n\n const currentSkinToneButton = () => {\n return (\n <TextButton\n classes={['pm-emoji-skintone-picker-button', 'pm-light-text-color']}\n title={\n selectedSkinTone === SkinTone.None\n ? props.context.translateText(`${previewEmoji.emoji} Skin tone`)\n : previewEmoji.emoji\n }\n onClick={handleButtonClick}\n tabIndex={-1}\n />\n );\n };\n\n return (\n <div className=\"pm-emoji-skintone-picker-container pm-emoji-font\" onKeyDown={handleKeyDown} tabIndex={0} ref={ref}>\n {selectSkinTone ? skinTonePicker() : currentSkinToneButton()}\n </div>\n );\n});\n","/*\n * insert_special_characters.ts\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorCommandId, InsertCharacterCommand, ProsemirrorCommand } from '../../api/command';\nimport { hardBreakCommandFn } from '../../nodes/hard_break';\n\nconst extension = {\n commands: () => {\n return [\n new InsertCharacterCommand(EditorCommandId.EmDash, '—', []),\n new InsertCharacterCommand(EditorCommandId.EnDash, '–', []),\n new ProsemirrorCommand(EditorCommandId.HardLineBreak, ['Shift-Enter'], hardBreakCommandFn())\n ];\n },\n};\n\nexport default extension;\n","/*\n * nbsp.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { DecorationSet, Decoration } from 'prosemirror-view';\nimport { Plugin, PluginKey, EditorState, Transaction } from 'prosemirror-state';\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { EditorCommandId, InsertCharacterCommand } from '../api/command';\nimport { forChangedNodes } from '../api/transaction';\nimport { mergedTextNodes } from '../api/text';\n\nconst kNbsp = '\\u00A0';\nconst kNbspRegEx = /\\xA0/g;\n\nconst extension = {\n commands: () => {\n return [new InsertCharacterCommand(EditorCommandId.NonBreakingSpace, kNbsp, ['Ctrl-Space', 'Ctrl-Shift-Space'])];\n },\n\n plugins: () => {\n return [nonBreakingSpacePastePlugin(), nonBreakingSpaceHighlightPlugin()];\n },\n};\n\nconst pastePluginKey = new PluginKey('nbsp-paste');\n\nfunction nonBreakingSpacePastePlugin() {\n return new Plugin({\n key: pastePluginKey,\n props: {\n transformPastedHTML: (html: string) => {\n // strips spans that contain a single non-breaking space (chrome/webkit seem to\n // do this for spaces surrounding marked html)\n return html.replace(/<span> <\\/span>/g, ' ');\n },\n },\n });\n}\n\nconst highlightPluginKey = new PluginKey('nbsp-highlight');\n\nfunction nonBreakingSpaceHighlightPlugin() {\n return new Plugin<DecorationSet>({\n key: highlightPluginKey,\n state: {\n init(_config: { [key: string]: any }, instance: EditorState) {\n return DecorationSet.create(instance.doc, highlightNode(instance.doc));\n },\n apply(tr: Transaction, set: DecorationSet, oldState: EditorState, newState: EditorState) {\n // map\n set = set.map(tr.mapping, tr.doc);\n\n // find new\n if (tr.docChanged) {\n const decorations: Decoration[] = [];\n forChangedNodes(\n oldState,\n newState,\n node => node.isTextblock && node.textContent.includes(kNbsp),\n (node, pos) => {\n decorations.push(...highlightNode(node, pos + 1));\n },\n );\n set = set.add(tr.doc, decorations);\n }\n\n // return the set\n return set;\n },\n },\n props: {\n decorations(state: EditorState) {\n return highlightPluginKey.getState(state);\n },\n },\n });\n}\n\nfunction highlightNode(node: ProsemirrorNode, nodePos = 0) {\n const decorations: Decoration[] = [];\n const textNodes = mergedTextNodes(node);\n textNodes.forEach(textNode => {\n const text = textNode.text;\n let m;\n kNbspRegEx.lastIndex = 0;\n // tslint:disable-next-line no-conditional-assignment\n while ((m = kNbspRegEx.exec(text))) {\n if (m[0] === '') {\n break;\n }\n const from = nodePos + textNode.pos + m.index;\n const to = nodePos + textNode.pos + m.index + m[0].length;\n const classes = ['pm-nbsp', 'pm-invisible-text-color'];\n decorations.push(Decoration.inline(from, to, { class: classes.join(' ') }));\n }\n kNbspRegEx.lastIndex = 0;\n });\n return decorations;\n}\n\nexport default extension;\n","/*\n * remove_section.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { Transaction, EditorState, Selection, Plugin, PluginKey } from 'prosemirror-state';\nimport { ReplaceStep, ReplaceAroundStep } from 'prosemirror-transform';\n\nimport { findParentNodeOfType } from 'prosemirror-utils';\n\nimport { Extension } from '../api/extension';\nimport { isList } from '../api/list';\nimport { transactionsDocChanged } from '../api/transaction';\n\nconst extension: Extension = {\n\n plugins: (schema: Schema) => {\n return [\n new Plugin({\n key: new PluginKey('remove-section'),\n appendTransaction: (transactions: Transaction[], oldState: EditorState, newState: EditorState) => {\n \n // skip for selection-only changes\n if (!transactionsDocChanged(transactions)) {\n return;\n }\n\n if (isSectionRemoval(transactions, oldState)) {\n\n // if we had selected the entire contents of a div then prosemirror will remove\n // the div entirely -- we actually want to leave an empty div in place\n const fullySelectedDiv = fullySelectedDivSection(oldState); \n if (fullySelectedDiv) {\n const tr = newState.tr;\n tr.replaceSelectionWith(\n schema.nodes.div.create(fullySelectedDiv.node.attrs,\n schema.nodes.paragraph.create()));\n return tr;\n }\n \n \n // if we are left with an empty selection in an empty heading block this may\n // have been the removal of a section (more than 1 textBlock). in that case\n // remove the empty heading node\n else if (isEmptyHeadingSelection(newState.selection)) {\n const tr = newState.tr;\n const $head = tr.selection.$head;\n const start = $head.start();\n const end = start + 2;\n tr.deleteRange(start, end);\n return tr;\n }\n }\n\n\n }\n })\n ];\n },\n};\n\n\nfunction isSectionRemoval(transactions: Transaction[], oldState: EditorState) {\n // was this the removal of a section?\n let isRemoval = false;\n if (transactions.length === 1 && transactions[0].steps.length === 1) {\n // see if this is a delete step\n let isDeleteStep = false;\n const step = transactions[0].steps[0];\n if (step instanceof ReplaceStep) {\n isDeleteStep = (step as any).slice.content.size === 0;\n } else if (step instanceof ReplaceAroundStep) {\n const { gapFrom, gapTo } = step as any;\n isDeleteStep = gapFrom === gapTo;\n }\n\n // if it's a delete step then see if we removed multiple text blocks\n let numBlocks = 0;\n const { from, to } = step as any;\n oldState.doc.nodesBetween(from, to, node => {\n if (isRemoval) {\n return false;\n }\n if (isList(node)) {\n isRemoval = true;\n return false;\n } else if (node.isTextblock) {\n if (numBlocks++ >= 1) {\n isRemoval = true;\n return false;\n }\n }\n });\n }\n\n return isRemoval;\n}\n\n\nfunction fullySelectedDivSection(state: EditorState) {\n\n if (!state.selection.empty && state.schema.nodes.div) {\n\n const div = findParentNodeOfType(state.schema.nodes.div)(state.selection);\n if (div) {\n \n // calculate the inner selection of the div (accounting for container position offsets)\n let divSelFrom = div.start + 1; // offset to get to beginning first block text\n let divSelTo = div.pos + div.node.nodeSize - 2; // offset to end of last block text\n \n // if the div's first child is a list we need to push in 2 more\n if (isList(div.node.firstChild)) {\n divSelFrom += 2;\n }\n // if the div's last child is a list we need to push in 2 more\n if (isList(div.node.lastChild)) {\n divSelTo -=2;\n }\n\n // does the selection span the entire div?\n if (state.selection.from === divSelFrom && state.selection.to === divSelTo) {\n return div;\n } else {\n return false;\n }\n }\n }\n\n return false;\n}\n\n\nfunction isEmptyHeadingSelection(selection: Selection) {\n const parent = selection.$head.parent;\n const schema = parent.type.schema;\n return selection.empty && parent.type === schema.nodes.heading && parent.content.size === 0;\n}\n\n\nexport default extension;\n","/*\n * slides.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Transaction, EditorState } from \"prosemirror-state\";\nimport { setTextSelection, findParentNodeOfType } from \"prosemirror-utils\";\n\nimport { ExtensionContext } from \"../api/extension\";\nimport { kPresentationDocType } from \"../api/format\";\nimport { canInsertNode, editingRootNode } from \"../api/node\";\nimport { ProsemirrorCommand, EditorCommandId } from \"../api/command\";\nimport { OmniInsertGroup } from \"../api/omni_insert\";\nimport { wrapIn } from \"prosemirror-commands\";\n\nconst extension = (context: ExtensionContext) => {\n\n const { ui, format, pandocExtensions } = context;\n\n if (!format.docTypes.includes(kPresentationDocType)) {\n return null;\n }\n\n return {\n commands: () => {\n const cmds: ProsemirrorCommand[] = [\n new ProsemirrorCommand(EditorCommandId.InsertSlidePause, [], insertSlidePause, {\n name: ui.context.translateText('Slide Pause'),\n description: ui.context.translateText('Pause after content'),\n group: OmniInsertGroup.Content,\n priority: 2,\n image: () => ui.prefs.darkMode() ? ui.images.omni_insert!.slide_pause_dark! : ui.images.omni_insert!.slide_pause!\n })\n ];\n\n if (pandocExtensions.fenced_divs) {\n cmds.push(new ProsemirrorCommand(EditorCommandId.InsertSlideNotes, [], insertSlideNotes, {\n name: ui.context.translateText('Slide Notes'),\n description: ui.context.translateText('Slide speaker notes'),\n group: OmniInsertGroup.Content,\n priority: 2,\n image: () => ui.prefs.darkMode() ? ui.images.omni_insert!.slide_notes_dark! : ui.images.omni_insert!.slide_notes!\n }));\n cmds.push(new ProsemirrorCommand(EditorCommandId.InsertSlideColumns, [], insertSlideColumns, {\n name: ui.context.translateText('Slide Columns'),\n description: ui.context.translateText('Two column layout'),\n group: OmniInsertGroup.Content,\n priority: 2,\n image: () => ui.prefs.darkMode() ? ui.images.omni_insert!.slide_columns_dark! : ui.images.omni_insert!.slide_columns!\n }));\n }\n\n return cmds;\n }\n\n };\n};\n\n\nexport function insertSlideColumns(state: EditorState, dispatch?: (tr: Transaction) => void) {\n const schema = state.schema;\n if (!canInsertNode(state, schema.nodes.div)) {\n return false;\n }\n\n\n\n if (dispatch) {\n wrapIn(state.schema.nodes.div)(state, (tr: Transaction) => {\n\n const div = findParentNodeOfType(state.schema.nodes.div)(tr.selection)!;\n tr.setNodeMarkup(div.pos, div.node.type, { classes: [\"columns\"] });\n\n const columnAttrs = { classes: [\"column\"], keyvalue:[[\"width\", \"50%\"]] };\n const columnsContent = [\n state.schema.nodes.div.create(\n columnAttrs,\n state.schema.nodes.paragraph.create()\n ),\n state.schema.nodes.div.create(\n columnAttrs,\n state.schema.nodes.paragraph.create()\n )\n ];\n tr.replaceWith(div.start, div.start + 1, columnsContent);\n setTextSelection(div.start + 1)(tr);\n \n dispatch(tr);\n });\n }\n return true;\n}\n\nexport function insertSlidePause(state: EditorState, dispatch?: (tr: Transaction) => void) {\n const schema = state.schema;\n if (!canInsertNode(state, schema.nodes.paragraph)) {\n return false;\n }\n if (dispatch) {\n const tr = state.tr;\n tr.replaceSelectionWith(schema.nodes.paragraph.createAndFill({}, schema.text('. . .')));\n setTextSelection(tr.selection.from - 1, -1)(tr);\n tr.replaceSelectionWith(schema.nodes.paragraph.create());\n setTextSelection(tr.selection.from - 1, -1)(tr);\n dispatch(tr);\n }\n return true;\n}\n\nexport function insertSlideNotes(state: EditorState, dispatch?: (tr: Transaction) => void) {\n const schema = state.schema;\n if (!canInsertNode(state, schema.nodes.div)) {\n return false;\n }\n if (dispatch) {\n const tr = state.tr;\n tr.replaceSelectionWith(schema.nodes.div.createAndFill({ classes: ['notes']}, schema.nodes.paragraph.create()));\n setTextSelection(state.selection.from + 1, 1)(tr);\n dispatch(tr);\n }\n return true;\n}\n\nexport default extension;","/*\n * strikeout.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Mark, Fragment } from 'prosemirror-model';\n\nimport { MarkCommand, EditorCommandId } from '../api/command';\nimport { Extension, extensionIfEnabled } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\nimport { delimiterMarkInputRule, MarkInputRuleFilter } from '../api/input_rule';\n\nconst extension: Extension = {\n marks: [\n {\n name: 'strikeout',\n spec: {\n group: 'formatting',\n parseDOM: [\n { tag: 'del' },\n { tag: 's' },\n {\n style: 'text-decoration',\n getAttrs: (value: string | Node) => (value as string) === 'line-through' && null,\n },\n ],\n toDOM() {\n return ['del'];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.Strikeout,\n mark: 'strikeout',\n },\n ],\n writer: {\n priority: 6,\n write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n output.writeMark(PandocTokenType.Strikeout, parent);\n },\n },\n },\n },\n ],\n\n commands: (schema: Schema) => {\n return [new MarkCommand(EditorCommandId.Strikeout, [], schema.marks.strikeout)];\n },\n\n inputRules: (schema: Schema, filter: MarkInputRuleFilter) => {\n return [delimiterMarkInputRule('~~', schema.marks.strikeout, filter, '`', true)];\n },\n};\n\nexport default extensionIfEnabled(extension, 'strikeout');\n","/*\n * superscript.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Mark, Fragment } from 'prosemirror-model';\n\nimport { MarkCommand, EditorCommandId } from '../api/command';\nimport { Extension, extensionIfEnabled } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\nimport { delimiterMarkInputRule, MarkInputRuleFilter } from '../api/input_rule';\n\nconst extension: Extension = {\n marks: [\n {\n name: 'superscript',\n spec: {\n group: 'formatting',\n parseDOM: [{ tag: 'sup' }],\n toDOM() {\n return ['sup'];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.Superscript,\n mark: 'superscript',\n },\n ],\n writer: {\n priority: 15,\n write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n output.writeMark(PandocTokenType.Superscript, parent);\n },\n },\n },\n },\n ],\n\n commands: (schema: Schema) => {\n return [new MarkCommand(EditorCommandId.Superscript, [], schema.marks.superscript)];\n },\n\n inputRules: (schema: Schema, filter: MarkInputRuleFilter) => {\n return [delimiterMarkInputRule('\\\\^', schema.marks.superscript, filter, '`', true)];\n },\n};\n\nexport default extensionIfEnabled(extension, 'superscript');\n","/*\n * subscript.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Mark, Fragment } from 'prosemirror-model';\n\nimport { MarkCommand, EditorCommandId } from '../api/command';\nimport { Extension, extensionIfEnabled } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\nimport { delimiterMarkInputRule, MarkInputRuleFilter } from '../api/input_rule';\n\nconst extension: Extension = {\n marks: [\n {\n name: 'subscript',\n spec: {\n group: 'formatting',\n parseDOM: [{ tag: 'sub' }],\n toDOM() {\n return ['sub'];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.Subscript,\n mark: 'subscript',\n },\n ],\n writer: {\n priority: 15,\n write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n output.writeMark(PandocTokenType.Subscript, parent);\n },\n },\n },\n },\n ],\n\n commands: (schema: Schema) => {\n return [new MarkCommand(EditorCommandId.Subscript, [], schema.marks.subscript)];\n },\n\n inputRules: (schema: Schema, filter: MarkInputRuleFilter) => {\n return [delimiterMarkInputRule('\\\\~', schema.marks.subscript, filter, '`\\\\~-', true)];\n },\n};\n\nexport default extensionIfEnabled(extension, 'subscript');\n","/*\n * smallcaps.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Mark, Fragment } from 'prosemirror-model';\n\nimport { MarkCommand, EditorCommandId } from '../api/command';\nimport { Extension, extensionIfEnabled } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\n\nimport './smallcaps-styles.css';\n\nconst extension: Extension = {\n marks: [\n {\n name: 'smallcaps',\n spec: {\n group: 'formatting',\n parseDOM: [\n { tag: \"span[class*='smallcaps']\" },\n { style: 'font-variant', getAttrs: (value: string | Node) => (value as string) === 'small-caps' && null },\n ],\n toDOM() {\n return ['span', { class: 'smallcaps' }];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.SmallCaps,\n mark: 'smallcaps',\n },\n ],\n writer: {\n priority: 8,\n write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n output.writeMark(PandocTokenType.SmallCaps, parent);\n },\n },\n },\n },\n ],\n\n commands: (schema: Schema) => {\n return [new MarkCommand(EditorCommandId.Smallcaps, [], schema.marks.smallcaps)];\n },\n};\n\nexport default extensionIfEnabled(extension, ['bracketed_spans', 'native_spans']);\n","/*\n * underline.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Mark, Fragment } from 'prosemirror-model';\n\nimport { MarkCommand, EditorCommandId } from '../api/command';\nimport { Extension, extensionIfEnabled } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\n\nimport './underline-styles.css';\nimport { kPlatformMac } from '../api/platform';\n\nconst extension: Extension = {\n marks: [\n {\n name: 'underline',\n spec: {\n parseDOM: [\n { tag: \"span[class*='underline']\" },\n { tag: \"span[class*='ul']\" },\n { tag: \"u\" },\n { tag: \"ins\" }\n ],\n toDOM() {\n return ['span', { class: 'underline' }];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.Underline,\n mark: 'underline',\n },\n ],\n writer: {\n priority: 7,\n write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n output.writeMark(PandocTokenType.Underline, parent);\n },\n },\n },\n },\n ],\n\n commands: (schema: Schema) => {\n return [new MarkCommand(EditorCommandId.Underline, kPlatformMac ? ['Mod-u'] : [], schema.marks.underline)];\n },\n};\n\nexport default extensionIfEnabled(extension, ['bracketed_spans', 'native_spans']);\n","/*\n * raw_inline.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Mark, Fragment, MarkType } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { ProsemirrorCommand, EditorCommandId, toggleMarkType } from '../../api/command';\nimport { PandocOutput, PandocToken, PandocTokenType } from '../../api/pandoc';\nimport { getMarkRange, markIsActive, getMarkAttrs } from '../../api/mark';\nimport { EditorUI } from '../../api/ui';\nimport { RawFormatProps } from '../../api/ui-dialogs';\nimport { canInsertNode } from '../../api/node';\nimport { fragmentText } from '../../api/fragment';\nimport { OmniInsertGroup } from '../../api/omni_insert';\n\nexport const kRawInlineFormat = 0;\nexport const kRawInlineContent = 1;\n\nconst extension = (context: ExtensionContext): Extension | null => {\n const { pandocExtensions, pandocCapabilities, ui } = context;\n\n // always enabled so that extensions can make use of preprocessors + raw_attribute\n // to hoist content out of pandoc for further processing by our token handlers.\n // that means that users can always use the raw attribute in their markdown even\n // if the editing format doesn't support it (in which case it will just get echoed\n // back to the markdown just the way it was written).\n\n // return the extension\n return {\n marks: [\n {\n name: 'raw_inline',\n noInputRules: true,\n noSpelling: true,\n spec: {\n inclusive: false,\n excludes: 'formatting',\n attrs: {\n format: {},\n },\n parseDOM: [\n {\n tag: \"span[class*='raw-inline']\",\n getAttrs(dom: Node | string) {\n const el = dom as Element;\n return {\n format: el.getAttribute('data-format'),\n };\n },\n },\n ],\n toDOM(mark: Mark) {\n const attr: any = {\n class: 'raw-inline pm-fixedwidth-font pm-markup-text-color',\n 'data-format': mark.attrs.format,\n };\n return ['span', attr];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.RawInline,\n mark: 'raw_inline',\n getAttrs: (tok: PandocToken) => {\n return {\n format: tok.c[kRawInlineFormat],\n };\n },\n getText: (tok: PandocToken) => {\n return tok.c[kRawInlineContent];\n },\n },\n ],\n writer: {\n priority: 1,\n write: (output: PandocOutput, mark: Mark, parent: Fragment) => {\n // get raw content\n const raw = fragmentText(parent);\n\n // write it\n output.writeToken(PandocTokenType.RawInline, () => {\n output.write(mark.attrs.format);\n output.write(raw);\n });\n },\n },\n },\n },\n ],\n\n // insert command\n commands: (_schema: Schema) => {\n if (pandocExtensions.raw_attribute) {\n return [new RawInlineCommand(EditorCommandId.RawInline, '', ui, pandocCapabilities.output_formats)];\n } else {\n return [];\n }\n },\n };\n};\n\n// base class for inline commands that auto-insert content\nexport class RawInlineInsertCommand extends ProsemirrorCommand {\n private markType: MarkType;\n constructor(id: EditorCommandId, keymap: readonly string[], markType: MarkType, insert: (tr: Transaction) => void) {\n super(id, keymap, (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n // if we aren't active then make sure we can insert a text node here\n if (!this.isActive(state) && !canInsertNode(state, markType.schema.nodes.text)) {\n return false;\n }\n\n // ensure we can apply this mark here\n if (!toggleMarkType(this.markType)(state)) {\n return false;\n }\n\n if (dispatch) {\n const tr = state.tr;\n\n if (this.isActive(state)) {\n const range = getMarkRange(state.selection.$head, this.markType);\n if (range) {\n tr.removeMark(range.from, range.to, this.markType);\n }\n } else if (!tr.selection.empty) {\n const mark = markType.create();\n tr.addMark(tr.selection.from, tr.selection.to, mark);\n } else {\n insert(tr);\n }\n\n dispatch(tr);\n }\n\n return true;\n });\n this.markType = markType;\n }\n\n public isActive(state: EditorState) {\n return markIsActive(state, this.markType);\n }\n}\n\n// generic raw inline command (opens dialog that allows picking from among formats)\nexport class RawInlineCommand extends ProsemirrorCommand {\n constructor(id: EditorCommandId, defaultFormat: string, ui: EditorUI, outputFormats: string[]) {\n super(\n id,\n [],\n (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n const schema = state.schema;\n\n if (!canInsertNode(state, schema.nodes.text) || !toggleMarkType(schema.marks.raw_inline)(state)) {\n return false;\n }\n\n async function asyncInlineRaw() {\n if (dispatch) {\n // check if mark is active\n const isActive = markIsActive(state, schema.marks.raw_inline);\n\n // get the range of the mark\n let range = { from: state.selection.from, to: state.selection.to };\n if (isActive) {\n range = getMarkRange(state.selection.$from, schema.marks.raw_inline) as { from: number; to: number };\n }\n\n // get raw attributes if we have them\n let raw: RawFormatProps = { content: '', format: defaultFormat };\n raw.content = state.doc.textBetween(range.from, range.to);\n if (isActive) {\n raw = {\n ...raw,\n ...getMarkAttrs(state.doc, state.selection, schema.marks.raw_inline),\n };\n }\n\n const result = await ui.dialogs.editRawInline(raw, outputFormats);\n if (result) {\n const tr = state.tr;\n tr.removeMark(range.from, range.to, schema.marks.raw_inline);\n if (result.action === 'edit') {\n const mark = schema.marks.raw_inline.create({ format: result.raw.format });\n const node = schema.text(result.raw.content, [mark]);\n // if we are editing a selection then replace it, otherwise insert\n if (raw.content) {\n tr.replaceRangeWith(range.from, range.to, node);\n } else {\n tr.replaceSelectionWith(node, false);\n }\n }\n dispatch(tr);\n }\n\n if (view) {\n view.focus();\n }\n }\n }\n asyncInlineRaw();\n\n return true;\n },\n {\n name: ui.context.translateText('Raw Inline...'),\n description: ui.context.translateText('Raw inline content'),\n group: OmniInsertGroup.Content,\n priority: 0,\n image: () =>\n ui.prefs.darkMode() ? ui.images.omni_insert?.raw_inline_dark! : ui.images.omni_insert?.raw_inline!,\n },\n );\n }\n}\n\nexport default extension;\n","/*\n * raw_tex.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Mark, Fragment, Schema } from 'prosemirror-model';\nimport { DecorationSet } from 'prosemirror-view';\nimport { Plugin, PluginKey, EditorState, Transaction, TextSelection } from 'prosemirror-state';\nimport { InputRule, inputRules } from 'prosemirror-inputrules';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { PandocToken, PandocTokenType, PandocOutput } from '../../api/pandoc';\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { kTexFormat } from '../../api/raw';\nimport { markHighlightPlugin, markHighlightDecorations } from '../../api/mark-highlight';\nimport { MarkTransaction } from '../../api/transaction';\nimport { markIsActive, splitInvalidatedMarks } from '../../api/mark';\nimport { EditorCommandId, toggleMarkType } from '../../api/command';\nimport { texLength } from '../../api/tex';\nimport { MarkInputRuleFilter } from '../../api/input_rule';\n\nimport { kRawInlineFormat, kRawInlineContent, RawInlineInsertCommand } from './raw_inline';\n\nconst kTexPlaceholder = 'tex';\n\nconst extension = (context: ExtensionContext): Extension | null => {\n const { pandocExtensions } = context;\n\n if (!pandocExtensions.raw_tex) {\n return null;\n }\n\n return {\n marks: [\n {\n name: 'raw_tex',\n noInputRules: true,\n noSpelling: true,\n spec: {\n inclusive: true,\n excludes: 'formatting',\n attrs: {},\n parseDOM: [\n {\n tag: \"span[class*='raw-tex']\",\n },\n ],\n toDOM(_mark: Mark) {\n const attr: any = {\n class: 'raw-tex pm-fixedwidth-font pm-light-text-color',\n };\n return ['span', attr];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.RawInline,\n mark: 'raw_tex',\n match: (tok: PandocToken) => {\n const format = tok.c[kRawInlineFormat];\n return format === kTexFormat;\n },\n getText: (tok: PandocToken) => {\n return tok.c[kRawInlineContent];\n },\n },\n ],\n writer: {\n priority: 1,\n write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n output.writeRawMarkdown(parent);\n },\n },\n },\n },\n ],\n\n // insert command\n commands: (schema: Schema) => {\n return [new InsertInlineLatexCommand(schema)];\n },\n\n appendMarkTransaction: (schema: Schema) => {\n return [\n {\n name: 'remove-raw-tex-marks',\n filter: node => node.isTextblock && node.type.allowsMarkType(schema.marks.raw_tex),\n append: (tr: MarkTransaction, node: ProsemirrorNode, pos: number) => {\n splitInvalidatedMarks(tr, node, pos, texLength, schema.marks.raw_tex);\n },\n },\n ];\n },\n\n inputRules: (schema: Schema, filter: MarkInputRuleFilter) => {\n return [texInputRule(schema, filter)];\n },\n\n // plugin to add highlighting decorations\n plugins: (schema: Schema) => {\n // plugins to return\n const plugins: Plugin[] = [];\n\n // latex equation highlighting\n plugins.push(latexHighlightingPlugin(schema));\n\n // latex brace matching\n const braces = new Map([\n ['{', '}'],\n ['[', ']'],\n ]);\n plugins.push(\n inputRules({\n rules: [\n new InputRule(/(^|[^^\\\\])([{[])$/, (state: EditorState, match: string[], start: number, end: number) => {\n if (markIsActive(state, schema.marks.raw_tex)) {\n const tr = state.tr;\n tr.insertText(match[2] + braces.get(match[2]));\n setTextSelection(start + match[1].length + 1)(tr);\n return tr;\n } else {\n return null;\n }\n }),\n ],\n }),\n );\n\n // return\n return plugins;\n },\n };\n};\n\nfunction texInputRule(schema: Schema, filter: MarkInputRuleFilter) {\n return new InputRule(/(^| )\\\\$/, (state: EditorState, match: string[], start: number, end: number) => {\n const rawTexMark = schema.marks.raw_tex;\n\n if (state.selection.empty && toggleMarkType(rawTexMark)(state)) {\n // if there is no tex ahead of us or we don't pass the fitler (b/c marks that don't allow\n // input rules are active) then bail\n const $head = state.selection.$head;\n const texText = '\\\\' + $head.parent.textContent.slice($head.parentOffset);\n if (!texText.startsWith('\\\\ ')) {\n const texMatchLength = texLength(texText);\n if (texMatchLength === 0 || !filter(state, state.selection.from, state.selection.from + texMatchLength)) {\n return null;\n }\n }\n\n // create transaction\n const tr = state.tr;\n\n // insert tex backslash\n const mark = schema.marks.raw_tex.create();\n tr.addStoredMark(mark);\n tr.insertText('\\\\');\n\n // extend the mark to cover any valid tex that immediately follows the \\\n const { parent, parentOffset } = tr.selection.$head;\n const text = parent.textContent.slice(parentOffset - 1);\n if (text.length > 0) {\n const length = texLength(text);\n if (length > 1) {\n const startTex = tr.selection.from - 1;\n tr.addMark(startTex, startTex + length, mark);\n return tr;\n }\n }\n\n // insert placeholder if it's a standalone \\\n if (text === '\\\\' || text.startsWith('\\\\ ')) {\n tr.insertText(kTexPlaceholder);\n setTexSelectionAfterInsert(tr);\n return tr;\n }\n }\n\n // didn't find a valid context for a tex comand\n return null;\n });\n}\n\nclass InsertInlineLatexCommand extends RawInlineInsertCommand {\n constructor(schema: Schema) {\n super(EditorCommandId.TexInline, [], schema.marks.raw_tex, (tr: Transaction) => {\n const mark = schema.marks.raw_tex.create();\n const tex = '\\\\' + kTexPlaceholder;\n const node = schema.text(tex, [mark]);\n tr.replaceSelectionWith(node, false);\n setTexSelectionAfterInsert(tr);\n });\n }\n}\n\nfunction setTexSelectionAfterInsert(tr: Transaction) {\n tr.setSelection(\n new TextSelection(tr.doc.resolve(tr.selection.from - kTexPlaceholder.length), tr.doc.resolve(tr.selection.from)),\n );\n}\n\nconst key = new PluginKey<DecorationSet>('latex-highlight');\n\nexport function latexHighlightingPlugin(schema: Schema) {\n return markHighlightPlugin(key, schema.marks.raw_tex, (text, _attrs, markRange) => {\n const kIdClass = 'pm-markup-text-color';\n return markHighlightDecorations(markRange, text, /\\\\[A-Za-z]+/g, kIdClass);\n });\n}\n\nexport default extension;\n","/*\n * mark-highlight.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { PluginKey, Plugin, EditorState, Transaction } from 'prosemirror-state';\nimport { DecorationSet, Decoration } from 'prosemirror-view';\nimport { Node as ProsemirrorNode, MarkType } from 'prosemirror-model';\nimport { findChildrenByMark } from 'prosemirror-utils';\nimport { AddMarkStep, RemoveMarkStep } from 'prosemirror-transform';\n\nimport { getMarkRange, getMarkAttrs } from './mark';\nimport { forChangedNodes } from './transaction';\n\nexport type MarkHighligher = (\n text: string,\n attrs: { [key: string]: any },\n range: { from: number; to: number },\n) => Decoration[];\n\nexport function markHighlightDecorations(\n markRange: { from: number; to: number },\n text: string,\n re: RegExp,\n className: string,\n) {\n const decorations: Decoration[] = [];\n re.lastIndex = 0;\n let match = re.exec(text);\n while (match) {\n decorations.push(\n Decoration.inline(markRange.from + match.index, markRange.from + re.lastIndex, { class: className }),\n );\n match = re.exec(text);\n }\n re.lastIndex = 0;\n return decorations;\n}\n\nexport function markHighlightPlugin(key: PluginKey<DecorationSet>, markType: MarkType, highlighter: MarkHighligher) {\n function decorationsForDoc(doc: ProsemirrorNode) {\n let decorations: Decoration[] = [];\n findChildrenByMark(doc, markType, true).forEach(markedNode => {\n decorations = decorations.concat(markDecorations(doc, markType, markedNode.pos, highlighter));\n });\n return DecorationSet.create(doc, decorations);\n }\n\n return new Plugin<DecorationSet>({\n key,\n state: {\n // initialize by highlighting the entire document\n init(_config: { [key: string]: any }, instance: EditorState) {\n return decorationsForDoc(instance.doc);\n },\n\n // whenever an edit affecting this mark type occurs then update the decorations\n apply(tr: Transaction, set: DecorationSet, oldState: EditorState, newState: EditorState) {\n // ignore selection changes\n if (!tr.docChanged) {\n return set.map(tr.mapping, tr.doc);\n }\n\n // if one of the steps added or removed a mark of our type then rescan the doc.\n if (\n tr.steps.some(\n step =>\n (step instanceof AddMarkStep && (step as any).mark.type === markType) ||\n (step instanceof RemoveMarkStep && (step as any).mark.type === markType),\n )\n ) {\n // rehighlight entire doc\n return decorationsForDoc(newState.doc);\n\n // incremental rehighlighting based on presence of mark in changed regions\n } else {\n // adjust decoration positions to changes made by the transaction (decorations that apply\n // to removed chunks of content will be removed by this)\n set = set.map(tr.mapping, tr.doc);\n\n // function to rehighlight parent of specified pos\n const rehighlightParent = (pos: number) => {\n const resolvedPos = tr.doc.resolve(pos);\n const parent = resolvedPos.node();\n const from = resolvedPos.start();\n const marks = findChildrenByMark(parent, markType);\n marks.forEach(mark => {\n const markRange = getMarkRange(tr.doc.resolve(from + mark.pos), markType) as { from: number; to: number };\n const removeDecorations = set.find(markRange.from, markRange.to);\n set = set.remove(removeDecorations);\n const addDecorations = markDecorations(tr.doc, markType, markRange.from, highlighter);\n set = set.add(tr.doc, addDecorations);\n });\n };\n\n // rehighlight nodes that changed and have our mark type\n forChangedNodes(\n oldState,\n newState,\n node => node.type.allowsMarkType(markType),\n (node, pos) => {\n if (newState.doc.rangeHasMark(pos, pos + node.nodeSize, markType)) {\n rehighlightParent(pos);\n }\n },\n );\n\n return set;\n }\n },\n },\n props: {\n decorations(state: EditorState) {\n return key.getState(state);\n },\n },\n });\n}\n\nfunction markDecorations(doc: ProsemirrorNode, markType: MarkType, pos: number, highlighter: MarkHighligher) {\n const markRange = getMarkRange(doc.resolve(pos), markType);\n if (markRange) {\n const attrs = getMarkAttrs(doc, markRange, markType);\n const text = doc.textBetween(markRange.from, markRange.to);\n return highlighter(text, attrs, markRange);\n } else {\n return [];\n }\n}\n","/*\n * tex.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n// Get the length of valid tex content for the passed text. return values include:\n// -1: Invalid tex content (starts with \\ but doesn't close braces/brackets properly)\n// 0: Not tex content\n// >1: Length of valid tex string\nexport function texLength(text: string) {\n\n // if tex includes newlines it's auto-valid (could be math)\n if (text.includes('\\n')) {\n return text.length;\n }\n \n\n let braceLevel = 0;\n let bracketLevel = 0;\n\n let i;\n for (i = 0; i < text.length; i++) {\n // next character\n const ch = text[i];\n\n // must start with \\{ltr}\n if (i === 0 && ch !== '\\\\') {\n return 0;\n }\n if (i === 1 && !isLetter(ch)) {\n return 0;\n }\n\n // only letters, backslashes, and open brace/bracket allowed (unless we are in braces or brackets)\n const inBraces = braceLevel >= 1;\n const inBrackets = bracketLevel >= 1;\n if (i > 0 && !isLetter(ch) && ch !== '\\\\' && ch !== '{' && ch !== '[' && !inBraces && !inBrackets) {\n return i;\n }\n\n // manage brace and bracket levels\n if (ch === '{') {\n braceLevel++;\n } else if (ch === '}') {\n braceLevel--;\n } else if (ch === '[') {\n bracketLevel++;\n } else if (ch === ']') {\n bracketLevel--;\n }\n }\n\n if (braceLevel === 0 && bracketLevel === 0) {\n return i;\n } else {\n return -1; // invalid tex\n }\n}\n\n\nconst LetterRegex = /[A-Za-z]/;\nfunction isLetter(ch: string) {\n return LetterRegex.test(ch);\n}\n","/*\n * raw_html.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Mark, Schema, Fragment } from 'prosemirror-model';\nimport { InputRule } from 'prosemirror-inputrules';\nimport { EditorState } from 'prosemirror-state';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { PandocTokenType, PandocToken, ProsemirrorWriter, PandocOutput } from '../../api/pandoc';\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { isRawHTMLFormat } from '../../api/raw';\nimport { MarkInputRuleFilter } from '../../api/input_rule';\n\nimport { kRawInlineFormat, kRawInlineContent } from './raw_inline';\nimport { toggleMarkType } from '../../api/command';\n\nconst extension = (context: ExtensionContext): Extension | null => {\n const { pandocExtensions } = context;\n return {\n marks: [\n {\n name: 'raw_html',\n noInputRules: true,\n noSpelling: true,\n spec: {\n inclusive: false,\n excludes: 'formatting',\n parseDOM: [\n {\n tag: \"span[class*='raw-html']\",\n getAttrs(dom: Node | string) {\n return {};\n },\n },\n ],\n toDOM(mark: Mark) {\n const attr: any = {\n class: 'raw-html pm-fixedwidth-font pm-markup-text-color',\n };\n return ['span', attr];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.RawInline,\n match: (tok: PandocToken) => {\n const format = tok.c[kRawInlineFormat];\n return isRawHTMLFormat(format);\n },\n handler: (schema: Schema) => {\n return (writer: ProsemirrorWriter, tok: PandocToken) => {\n const html = tok.c[kRawInlineContent];\n if (writer.hasInlineHTMLWriter(html)) {\n writer.writeInlineHTML(html);\n } else {\n writeInlneHTML(schema, html, writer);\n }\n };\n },\n },\n ],\n\n inlineHTMLReader: (schema: Schema, html: string, writer?: ProsemirrorWriter) => {\n // read single tags as inline html\n const isSingleTag = tagStartLoc(html, html.length - 2) === 0;\n if (isSingleTag && writer) {\n writeInlneHTML(schema, html, writer);\n }\n return isSingleTag;\n },\n writer: {\n priority: 1,\n write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n output.writeRawMarkdown(parent);\n },\n },\n },\n },\n ],\n\n // input rules\n inputRules: (schema: Schema, filter: MarkInputRuleFilter) => {\n if (pandocExtensions.raw_html) {\n return [rawHtmlInputRule(schema, filter)];\n } else {\n return [];\n }\n },\n };\n};\n\nfunction writeInlneHTML(schema: Schema, html: string, writer: ProsemirrorWriter) {\n const mark = schema.marks.raw_html.create();\n writer.openMark(mark);\n writer.writeText(html);\n writer.closeMark(mark);\n}\n\nexport function rawHtmlInputRule(schema: Schema, filter: MarkInputRuleFilter) {\n return new InputRule(/>$/, (state: EditorState, match: string[], start: number, end: number) => {\n const rawhtmlMark = state.schema.marks.raw_html;\n\n // ensure we pass all conditions for html input\n if (state.selection.empty && toggleMarkType(rawhtmlMark)(state) && filter(state, start, end)) {\n // get tag info\n const { parent, parentOffset } = state.selection.$head;\n const text = parent.textContent;\n const endLoc = parentOffset - 1;\n const tag = tagInfo(text, endLoc);\n if (tag) {\n // create transaction\n const tr = state.tr;\n\n // insert >\n tr.insertText('>');\n\n // add mark\n start = tr.selection.from - (tag.end - tag.start + 1);\n tr.addMark(start, end + 1, rawhtmlMark.create());\n tr.removeStoredMark(rawhtmlMark);\n\n // if it wasn't an end tag and it isn't a void tag then also\n // insert an end tag (and leave the cursor in the middle)\n if (!tag.close && !tag.void) {\n const endTag = schema.text(`</${tag.name}>`);\n tr.replaceSelectionWith(endTag, false);\n setTextSelection(tr.selection.from - endTag.textContent.length)(tr);\n tr.addMark(tr.selection.from, tr.selection.from + endTag.textContent.length, rawhtmlMark.create());\n tr.removeStoredMark(rawhtmlMark);\n }\n\n // return transaction\n return tr;\n }\n }\n\n return null;\n });\n}\n\nfunction tagInfo(text: string, endLoc: number) {\n const startLoc = tagStartLoc(text, endLoc);\n if (startLoc !== -1) {\n // don't match if preceding character is a backtick\n // (user is attempting to write an html tag in code)\n if (text.charAt(startLoc - 1) === '`') {\n return null;\n }\n const tagText = text.substring(startLoc, endLoc + 1);\n const match = tagText.match(/<(\\/?)(\\w+)/);\n if (match) {\n const name = match[2];\n if (isHTMLTag(name)) {\n return {\n name: match[2],\n close: match[1].length > 0,\n void: isVoidTag(name),\n start: startLoc,\n end: endLoc + 1,\n };\n }\n }\n }\n return null;\n}\n\nfunction tagStartLoc(text: string, endLoc: number) {\n let inSingleQuote = false;\n let inDoubleQuote = false;\n let i;\n for (i = endLoc; i >= 0; i--) {\n // next character\n const ch = text[i];\n\n // invalid if we see another > when not in quotes\n if (ch === '>' && !inSingleQuote && !inDoubleQuote) {\n return -1;\n }\n\n // > terminate on < if we aren't in quotes\n if (ch === '<' && !inSingleQuote && !inDoubleQuote) {\n return i;\n }\n\n // handle single quote\n if (ch === \"'\") {\n if (inSingleQuote) {\n inSingleQuote = false;\n } else if (!inDoubleQuote) {\n inSingleQuote = true;\n }\n\n // handle double quote\n } else if (ch === '\"') {\n if (inDoubleQuote) {\n inDoubleQuote = false;\n } else if (!inSingleQuote) {\n inDoubleQuote = true;\n }\n }\n }\n\n return -1;\n}\n\nfunction isHTMLTag(tag: string) {\n return [\n // structural\n 'a',\n 'article',\n 'aside',\n 'body',\n 'br',\n 'details',\n 'div',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'head',\n 'header',\n 'hgroup',\n 'hr',\n 'html',\n 'footer',\n 'nav',\n 'p',\n 'section',\n 'span',\n 'summary',\n\n // metadata\n 'base',\n 'basefont',\n 'link',\n 'meta',\n 'style',\n 'title',\n\n // form\n 'button',\n 'datalist',\n 'fieldset',\n 'form',\n 'input',\n 'keygen',\n 'label',\n 'legend',\n 'meter',\n 'optgroup',\n 'option',\n 'select',\n 'textarea',\n\n // formatting\n 'abbr',\n 'acronym',\n 'address',\n 'b',\n 'bdi',\n 'bdo',\n 'big',\n 'blockquote',\n 'center',\n 'cite',\n 'code',\n 'del',\n 'dfn',\n 'em',\n 'font',\n 'i',\n 'ins',\n 'kbd',\n 'mark',\n 'output',\n 'pre',\n 'progress',\n 'q',\n 'rp',\n 'rt',\n 'ruby',\n 's',\n 'samp',\n 'small',\n 'strike',\n 'strong',\n 'sub',\n 'sup',\n 'tt',\n 'u',\n 'var',\n 'wbr',\n\n // list\n 'dd',\n 'dir',\n 'dl',\n 'dt',\n 'li',\n 'ol',\n 'menu',\n 'ul',\n\n // table\n 'caption',\n 'col',\n 'colgroup',\n 'table',\n 'tbody',\n 'td',\n 'tfoot',\n 'thead',\n 'th',\n 'tr',\n\n // scripting\n 'script',\n 'noscript',\n\n // embedded content\n 'applet',\n 'area',\n 'audio',\n 'canvas',\n 'embed',\n 'figcaption',\n 'figure',\n 'frame',\n 'frameset',\n 'iframe',\n 'img',\n 'map',\n 'noframes',\n 'object',\n 'param',\n 'source',\n 'time',\n 'video',\n ].includes(tag.toLowerCase());\n}\n\nfunction isVoidTag(tag: string) {\n return [\n 'area',\n 'base',\n 'br',\n 'col',\n 'command',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'keygen',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n ].includes(tag.toLowerCase());\n}\n\nexport default extension;\n","/*\n * math.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema, Mark, Fragment, Slice } from 'prosemirror-model';\nimport { Plugin, PluginKey, EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { InputRule } from 'prosemirror-inputrules';\n\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { PandocTokenType, PandocToken, PandocOutput } from '../../api/pandoc';\nimport { BaseKey, BaseKeyBinding } from '../../api/basekeys';\nimport { markIsActive } from '../../api/mark';\nimport { kCodeText } from '../../api/code';\nimport { kPasteTransaction } from '../../api/transaction';\nimport { kQuartoDocType } from '../../api/format';\nimport { kMathContent, kMathType, delimiterForType, MathType, kMathId } from '../../api/math';\nimport { MarkInputRuleFilter } from '../../api/input_rule';\n\nimport { InsertInlineMathCommand, InsertDisplayMathCommand, insertMath } from './math-commands';\nimport { mathAppendMarkTransaction } from './math-transaction';\nimport { mathHighlightPlugin } from './math-highlight';\nimport { MathPopupPlugin } from './math-popup';\nimport { mathViewPlugins } from './math-view';\nimport { displayMathNewline, inlineMathNav } from './math-keys';\n\nimport './math-styles.css';\n\nconst kInlineMathPattern = '\\\\$[^ ].*?[^\\\\ ]?\\\\$';\nconst kInlineMathRegex = new RegExp(kInlineMathPattern);\n\nconst kSingleLineDisplayMathPattern = '\\\\$\\\\$[^\\n]*?\\\\$\\\\$';\nconst kSingleLineDisplayMathRegex = new RegExp(kSingleLineDisplayMathPattern);\n\nconst extension = (context: ExtensionContext): Extension | null => {\n const { ui, format, math, events } = context;\n\n // note that we always enable math (harmless as worst case it is \n // simply output as ascii math by pandoc) so no check is made here\n\n // special blogdown handling for markdown renderers that don't support math\n const blogdownMathInCode = format.rmdExtensions.blogdownMathInCode;\n const singleLineDisplayMath = blogdownMathInCode;\n\n return {\n marks: [\n {\n name: 'math',\n noInputRules: true,\n noSpelling: true,\n spec: {\n attrs: {\n type: {},\n id: { default: null }\n },\n inclusive: false,\n excludes: 'formatting',\n parseDOM: [\n {\n tag: \"span[class*='math']\",\n getAttrs(dom: Node | string) {\n const el = dom as Element;\n return {\n type: el.getAttribute('data-type'),\n };\n },\n preserveWhitespace: 'full',\n },\n ],\n\n toDOM(mark: Mark) {\n return [\n 'span',\n {\n class: 'math pm-fixedwidth-font pm-light-text-color',\n 'data-type': mark.attrs.type,\n spellcheck: 'false',\n },\n ];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.Math,\n mark: 'math',\n getAttrs: (tok: PandocToken) => {\n return {\n type: tok.c[kMathType].t,\n id: tok.c[kMathId] || null\n };\n },\n getText: (tok: PandocToken) => {\n const delimter = delimiterForType(tok.c[kMathType].t);\n return delimter + tok.c[kMathContent] + delimter;\n },\n },\n // extract math from backtick code for blogdown\n ...(blogdownMathInCode\n ? [\n {\n token: PandocTokenType.Code,\n mark: 'math',\n match: (tok: PandocToken) => {\n const text = tok.c[kCodeText];\n return kSingleLineDisplayMathRegex.test(text) || kInlineMathRegex.test(text);\n },\n getAttrs: (tok: PandocToken) => {\n const text = tok.c[kCodeText];\n return {\n type: kSingleLineDisplayMathRegex.test(text) ? MathType.Display : MathType.Inline,\n };\n },\n getText: (tok: PandocToken) => {\n return tok.c[kCodeText];\n },\n },\n ]\n : []),\n ],\n writer: {\n priority: 1,\n write: (output: PandocOutput, mark: Mark, parent: Fragment) => {\n // collect math content\n let mathText = '';\n parent.forEach((node: ProsemirrorNode) => (mathText = mathText + node.textContent));\n\n // if this is blogdownMathInCode just write the content in a code mark\n if (blogdownMathInCode) {\n output.writeToken(PandocTokenType.Code, () => {\n output.writeAttr();\n output.write(mathText);\n });\n } else {\n // check for delimeter (if it's gone then write this w/o them math mark)\n const delimiter = delimiterForType(mark.attrs.type);\n if (mathText.startsWith(delimiter) && mathText.endsWith(delimiter)) {\n // remove delimiter\n mathText = mathText.substr(delimiter.length, mathText.length - 2 * delimiter.length);\n\n \n if (mark.attrs.type === MathType.Inline) {\n // trim inline math\n mathText = mathText.trim();\n } else if (mark.attrs.type === MathType.Display) {\n // remove blank lines from display math (but preserve enclosing whitespace)\n const beginMatch = mathText.match(/^\\s*/);\n const begin = beginMatch ? beginMatch[0].replace(/\\n{2,}/g, \"\\n\") : '';\n const endMatch = mathText.match(/\\s*$/);\n const end = endMatch ? endMatch[0].replace(/\\n{2,}/g, \"\\n\") : '';\n mathText = begin + mathText.trim()\n .split(\"\\n\")\n .filter(line => line.trim().length > 0)\n .join(\"\\n\") + end;\n }\n \n // if it's just whitespace then it's not actually math (we allow this state\n // in the editor because it's the natural starting place for new equations)\n if (mathText.length === 0) {\n output.writeText(delimiter + mathText + delimiter);\n } else {\n output.writeToken(PandocTokenType.Math, () => {\n // write type\n output.writeToken(\n mark.attrs.type === MathType.Inline ? PandocTokenType.InlineMath : PandocTokenType.DisplayMath,\n );\n output.write(mathText);\n });\n // write id if we have it\n if (mark.attrs.id) {\n output.writeRawMarkdown(` {#${mark.attrs.id}}`);\n }\n }\n } else {\n // user removed the delimiter so write the content literally. when it round trips\n // back into editor it will no longer be parsed by pandoc as math\n output.writeRawMarkdown(mathText);\n }\n }\n },\n },\n // filter for picking out id for quarto crossref\n tokensFilter: format.docTypes.includes(kQuartoDocType) ? (tokens: PandocToken[]) => {\n const pendingTokens: PandocToken[] = [];\n const filteredTokens: PandocToken[] = [];\n\n const clearPendingTokens = () => {\n pendingTokens.splice(0, pendingTokens.length);\n };\n\n const flushPendingTokens = () => {\n filteredTokens.push(...pendingTokens);\n clearPendingTokens();\n };\n\n for (const token of tokens) {\n switch(token.t) {\n case PandocTokenType.Math: \n flushPendingTokens();\n if (token.c[kMathType].t === PandocTokenType.DisplayMath) {\n pendingTokens.push(token);\n } else {\n filteredTokens.push(token);\n }\n break;\n case PandocTokenType.Space:\n if (pendingTokens.length > 0) {\n pendingTokens.push(token);\n } else {\n filteredTokens.push(token);\n }\n break;\n case PandocTokenType.Str:\n if (pendingTokens.length > 0) {\n const match = (token.c as string).match(/{#(eq-[^ }]+)}/);\n if (match) {\n const mathToken = pendingTokens[0];\n mathToken.c[kMathId] = match[1];\n clearPendingTokens();\n filteredTokens.push(mathToken);\n } else {\n flushPendingTokens();\n filteredTokens.push(token);\n }\n } else {\n filteredTokens.push(token);\n }\n break;\n default:\n flushPendingTokens();\n filteredTokens.push(token);\n break;\n }\n }\n flushPendingTokens();\n\n return filteredTokens;\n } : undefined\n },\n },\n ],\n\n baseKeys: (_schema: Schema) => {\n const keys: BaseKeyBinding[] = [\n { key: BaseKey.Home, command: inlineMathNav(true) },\n { key: BaseKey.End, command: inlineMathNav(false) }\n ];\n if (!singleLineDisplayMath) {\n keys.push({ key: BaseKey.Enter, command: displayMathNewline });\n } \n return keys;\n },\n\n inputRules: (schema: Schema, filter: MarkInputRuleFilter) => {\n const kInlineMathInputRulePattern = '\\\\$[^ ][^\\\\$]*?[^\\\\ ]?\\\\$';\n return [\n // inline math\n new InputRule(\n new RegExp('(^|[^`])' + kInlineMathInputRulePattern + '$'),\n (state: EditorState, match: string[], start: number, end: number) => {\n if (!markIsActive(state, schema.marks.math) && filter(state, start, end)) {\n const tr = state.tr;\n tr.insertText('$');\n const mark = schema.marks.math.create({ type: MathType.Inline });\n tr.addMark(start + match[1].length, end + 1, mark);\n return tr;\n } else {\n return null;\n }\n },\n ),\n new InputRule(/(?:^|[^`])\\$$/, (state: EditorState, match: string[], start: number, end: number) => {\n if (!markIsActive(state, schema.marks.math)) {\n const { parent, parentOffset } = state.selection.$head;\n const text = '$' + parent.textContent.slice(parentOffset);\n if (text.length > 0) {\n const length = mathLength(text);\n if (length > 1) {\n if (filter(state, start, start + length)) {\n const tr = state.tr;\n tr.insertText('$');\n const startMath = tr.selection.from - 1;\n const mark = schema.marks.math.create({ type: MathType.Inline });\n tr.addMark(startMath, startMath + length, mark);\n return tr;\n }\n }\n }\n }\n return null;\n }),\n // display math\n new InputRule(/^\\$\\$$/, (state: EditorState, match: string[], start: number, end: number) => {\n if (filter(state, start, end)) {\n const tr = state.tr;\n tr.delete(start, end);\n insertMath(tr.selection, MathType.Display, !singleLineDisplayMath, tr);\n return tr;\n } else {\n return null;\n }\n }),\n ];\n },\n\n commands: (_schema: Schema) => {\n return [new InsertInlineMathCommand(ui), new InsertDisplayMathCommand(ui, !singleLineDisplayMath)];\n },\n\n appendMarkTransaction: (_schema: Schema) => {\n return [mathAppendMarkTransaction()];\n },\n\n plugins: (schema: Schema) => {\n const plugins = [\n new Plugin({\n key: new PluginKey('math'),\n props: {\n // paste plain text into math blocks\n handlePaste: handlePasteIntoMath(),\n },\n }),\n mathHighlightPlugin(schema),\n ];\n if (math) {\n plugins.push(new MathPopupPlugin(ui, math, events, false));\n plugins.push(...mathViewPlugins(schema, format, ui, math));\n }\n return plugins;\n },\n };\n};\n\nfunction mathLength(text: string) {\n const match = text.match(kInlineMathRegex);\n if (match) {\n return match[0].length;\n } else {\n return 0;\n }\n}\n\nfunction handlePasteIntoMath() {\n return (view: EditorView, _event: Event, slice: Slice) => {\n const schema = view.state.schema;\n if (markIsActive(view.state, schema.marks.math)) {\n const tr = view.state.tr;\n tr.setMeta(kPasteTransaction, true);\n tr.setMeta('uiEvent', 'paste');\n let math = '';\n slice.content.forEach((node: ProsemirrorNode) => (math = math + node.textContent));\n tr.replaceSelectionWith(schema.text(math));\n view.dispatch(tr);\n return true;\n } else {\n return false;\n }\n };\n}\n\n\nexport default extension;\n","/*\n * math-commands.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction, Selection } from 'prosemirror-state';\nimport { setTextSelection, findParentNodeOfType } from 'prosemirror-utils';\n\nimport { ProsemirrorCommand, EditorCommandId, toggleMarkType } from '../../api/command';\nimport { canInsertNode } from '../../api/node';\nimport { EditorUI } from '../../api/ui';\nimport { OmniInsert, OmniInsertGroup } from '../../api/omni_insert';\nimport { MathType, delimiterForType } from '../../api/math';\nimport { EditorView } from 'prosemirror-view';\nimport { getMarkRange, getMarkAttrs } from '../../api/mark';\nimport { EditorFormat, kQuartoDocType } from '../../api/format';\n\nexport class InsertInlineMathCommand extends ProsemirrorCommand {\n constructor(ui: EditorUI) {\n super(EditorCommandId.InlineMath, [], insertMathCommand(MathType.Inline, false), inlineMathOmniInsert(ui));\n }\n}\n\nexport class InsertDisplayMathCommand extends ProsemirrorCommand {\n constructor(ui: EditorUI, allowNewline: boolean) {\n super(\n EditorCommandId.DisplayMath,\n [],\n insertMathCommand(MathType.Display, allowNewline),\n displayMathOmniInsert(ui),\n );\n }\n}\n\nfunction insertMathCommand(type: MathType, allowNewline: boolean) {\n return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n // enable/disable command\n const schema = state.schema;\n if (!canInsertNode(state, schema.nodes.text) || !toggleMarkType(schema.marks.math)(state)) {\n return false;\n }\n\n if (dispatch) {\n const tr = state.tr;\n insertMath(state.selection, type, allowNewline, tr);\n dispatch(tr);\n }\n return true;\n };\n}\n\nfunction inlineMathOmniInsert(ui: EditorUI): OmniInsert {\n return {\n name: ui.context.translateText('Inline Math'),\n keywords: [ui.context.translateText('equation')],\n description: ui.context.translateText('Math within a line or paragraph'),\n group: OmniInsertGroup.Math,\n priority: 2,\n image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.math_inline_dark! : ui.images.omni_insert?.math_inline!),\n };\n}\n\nfunction displayMathOmniInsert(ui: EditorUI): OmniInsert {\n return {\n name: ui.context.translateText('Display Math'),\n keywords: [ui.context.translateText('equation')],\n description: ui.context.translateText('Math set apart from the main text'),\n group: OmniInsertGroup.Math,\n priority: 1,\n image: () =>\n ui.prefs.darkMode() ? ui.images.omni_insert?.math_display_dark! : ui.images.omni_insert?.math_display!,\n };\n}\n\nexport function insertMath(selection: Selection, type: MathType, allowNewline: boolean, tr: Transaction) {\n // include a newline for display math in an empty paragraph\n const schema = tr.doc.type.schema;\n let content = '';\n if (type === MathType.Display) {\n const para = findParentNodeOfType(schema.nodes.paragraph)(selection);\n if (allowNewline && para && !para.node.textContent.length) {\n content = '\\n\\n';\n }\n }\n const delim = delimiterForType(type);\n const mathText = schema.text(delim + content + delim);\n tr.replaceSelectionWith(mathText, false);\n const mathMark = schema.marks.math.create({ type });\n const from = tr.selection.head - content.length - delim.length * 2;\n const to = from + delim.length * 2 + content.length;\n tr.addMark(from, to, mathMark);\n const pos = tr.mapping.map(selection.head) - delim.length - (content ? 1 : 0);\n return setTextSelection(pos)(tr).scrollIntoView();\n}\n\nexport function editMathAttributesEnabled(\n format: EditorFormat, \n state: EditorState, \n range?: { from: number, to: number } | false\n) {\n if (format.docTypes.includes(kQuartoDocType)) {\n if (!range) {\n range = getMarkRange(state.selection.$from, state.schema.marks.math);\n }\n if (range) {\n const mathAttrs = getMarkAttrs(state.doc, range, state.schema.marks.math);\n return mathAttrs.type === MathType.Display;\n } else {\n return false;\n }\n } else {\n return false;\n }\n}\n\nexport function editMathAttributes(ui: EditorUI) {\n \n return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n \n // look one position ahead in case this resulted from a click on the edit attributes button\n const mathRange = getMarkRange(\n state.doc.resolve(state.selection.from+1), \n state.schema.marks.math\n ) as { from: number; to: number };\n if (!mathRange) {\n // always return true so the edit button always displays\n return true;\n }\n\n async function asyncEditMath() {\n if (dispatch) {\n \n const mathAttrs = getMarkAttrs(state.doc, mathRange, state.schema.marks.math);\n const id = await ui.dialogs.editMath(mathAttrs.id || \"\");\n if (id !== null) {\n const tr = state.tr;\n const mark = state.schema.marks.math.create({ ...mathAttrs, id: id.length > 0 ? id : null });\n tr.removeMark(mathRange.from, mathRange.to, state.schema.marks.math);\n tr.addMark(mathRange.from, mathRange.to, mark);\n dispatch(tr);\n }\n if (view) {\n view.focus();\n }\n }\n }\n asyncEditMath();\n\n return true;\n };\n}\n","/*\n * math-transaction.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { findChildrenByMark } from 'prosemirror-utils';\n\nimport { getMarkRange, getMarkAttrs } from '../../api/mark';\nimport { AppendMarkTransactionHandler, MarkTransaction } from '../../api/transaction';\nimport { delimiterForType, MathType } from '../../api/math';\nimport { selectionIsWithinRange } from '../../api/selection';\n\nexport function mathAppendMarkTransaction(): AppendMarkTransactionHandler {\n return {\n name: 'math-marks',\n\n filter: node => node.isTextblock && node.type.allowsMarkType(node.type.schema.marks.math),\n\n append: (tr: MarkTransaction, node: ProsemirrorNode, pos: number) => {\n // find all math blocks and convert them to text if they no longer conform\n const schema = node.type.schema;\n const maths = findChildrenByMark(node, schema.marks.math, true);\n for (const math of maths) {\n const from = pos + 1 + math.pos;\n const mathRange = getMarkRange(tr.doc.resolve(from), schema.marks.math);\n if (mathRange) {\n const mathAttr = getMarkAttrs(tr.doc, mathRange, schema.marks.math);\n if (mathAttr.type === MathType.Inline) {\n const mathDelim = delimiterForType(mathAttr.type);\n const mathText = tr.doc.textBetween(mathRange.from, mathRange.to);\n const charAfter = tr.doc.textBetween(mathRange.to, mathRange.to + 1);\n const noDelims = !mathText.startsWith(mathDelim) || !mathText.endsWith(mathDelim);\n const selectionIsWithin = selectionIsWithinRange(tr.selection, mathRange);\n const spaceAtLeft =\n !selectionIsWithin && mathAttr.type === MathType.Inline && mathText.startsWith(mathDelim + ' ');\n const spaceAtRight =\n !selectionIsWithin && mathAttr.type === MathType.Inline && mathText.endsWith(' ' + mathDelim);\n const numberAfter = mathAttr.type === MathType.Inline && /\\d/.test(charAfter);\n if (noDelims || spaceAtLeft || spaceAtRight || numberAfter) {\n tr.removeMark(mathRange.from, mathRange.to, schema.marks.math);\n tr.removeStoredMark(schema.marks.math);\n }\n }\n }\n }\n },\n };\n}\n","/*\n * math-highlight.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { PluginKey } from 'prosemirror-state';\nimport { DecorationSet, Decoration } from 'prosemirror-view';\nimport { Schema } from 'prosemirror-model';\n\nimport { markHighlightPlugin } from '../../api/mark-highlight';\nimport { delimiterForType } from '../../api/math';\n\nconst key = new PluginKey<DecorationSet>('math-highlight');\n\nexport function mathHighlightPlugin(schema: Schema) {\n return markHighlightPlugin(key, schema.marks.math, (_text, attrs, markRange) => {\n const kDelimClass = 'pm-markup-text-color';\n const delim = delimiterForType(attrs.type);\n if (markRange.to - markRange.from === delim.length * 2) {\n return [Decoration.inline(markRange.from, markRange.to, { class: kDelimClass })];\n } else {\n return [\n Decoration.inline(markRange.from, markRange.from + delim.length, { class: kDelimClass }),\n Decoration.inline(markRange.to - delim.length, markRange.to, { class: kDelimClass }),\n ];\n }\n });\n}\n","/*\n * math-preview.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Plugin, PluginKey } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { ResolvedPos } from 'prosemirror-model';\n\nimport debounce from 'lodash.debounce';\nimport zenscroll from 'zenscroll';\n\nimport { EditorUI } from '../../api/ui';\nimport { getMarkRange } from '../../api/mark';\nimport { EditorEvents } from '../../api/events';\nimport { ScrollEvent, ResizeEvent } from '../../api/event-types';\nimport { applyStyles } from '../../api/css';\nimport { editingRootNodeClosestToPos, editingRootNode } from '../../api/node';\nimport { createPopup } from '../../api/widgets/widgets';\nimport { EditorMath } from '../../api/math';\n\nconst kMathPopupVerticalOffset = 10;\nconst kMathPopupInputDebuounceMs = 250;\n\nconst key = new PluginKey('math-preview');\n\nexport class MathPopupPlugin extends Plugin {\n private readonly ui: EditorUI;\n private readonly math: EditorMath;\n\n private view: EditorView | null = null;\n\n private popup: HTMLElement | null = null;\n private lastRenderedMath: string | null = null;\n\n private readonly updatePopupTimer: number;\n\n private scrollUnsubscribe: VoidFunction;\n private resizeUnsubscribe: VoidFunction;\n\n constructor(ui: EditorUI, math: EditorMath, events: EditorEvents, onHover: boolean) {\n super({\n key,\n view: () => {\n return {\n update: debounce(\n (view: EditorView) => {\n this.view = view;\n this.updatePopup();\n },\n kMathPopupInputDebuounceMs,\n { leading: true, trailing: true },\n ),\n destroy: () => {\n clearInterval(this.updatePopupTimer);\n this.scrollUnsubscribe();\n this.resizeUnsubscribe();\n this.closePopup();\n },\n };\n },\n props: {\n handleDOMEvents: {\n ...(onHover\n ? {\n mousemove: debounce((view: EditorView, event: Event) => {\n const ev = event as MouseEvent;\n const pos = view.posAtCoords({ top: ev.clientY, left: ev.clientX });\n if (pos && pos.inside !== -1) {\n this.updatePopup(view.state.doc.resolve(pos.pos));\n }\n return false;\n }, kMathPopupInputDebuounceMs),\n }\n : {}),\n },\n },\n });\n\n // save reference to ui and math\n this.ui = ui;\n this.math = math;\n\n // update popup for resize, scrolling, as well as every 100ms to cover reflowing\n // of the document as a result of latex math being shown/hidden (will effectively\n // be a no-op if the math text and document layout / scroll position hasn't changed)\n this.updatePopup = this.updatePopup.bind(this);\n this.updatePopupTimer = setInterval(this.updatePopup, 100);\n this.scrollUnsubscribe = events.subscribe(ScrollEvent, () => this.updatePopup());\n this.resizeUnsubscribe = events.subscribe(ResizeEvent, () => this.updatePopup());\n }\n\n private updatePopup($mousePos?: ResolvedPos) {\n // bail if we don't have a view\n if (!this.view) {\n return;\n }\n\n // capture state, etc.\n const state = this.view.state;\n const schema = state.schema;\n\n // determine math range\n let range: false | { from: number; to: number } = false;\n\n // if a $pos was passed (e.g. for a mouse hover) then check that first\n if ($mousePos) {\n range = getMarkRange($mousePos, schema.marks.math);\n }\n\n // if that didn't work try the selection\n if (!range) {\n range = getMarkRange(state.selection.$from, schema.marks.math);\n }\n\n // bail if we don't have a target\n if (!range) {\n this.closePopup();\n return;\n }\n\n // bail if the user has this disabled\n if (!this.ui.prefs.equationPreview()) {\n this.closePopup();\n return;\n }\n\n // get the math text. bail if it's empty\n const inlineMath = state.doc.textBetween(range.from, range.to);\n if (inlineMath.match(/^\\${1,2}\\s*\\${1,2}$/)) {\n this.closePopup();\n return;\n }\n\n // get the position for the range\n const styles = popupPositionStyles(this.view, range);\n\n // if the popup already exists just move it\n if (this.popup) {\n applyStyles(this.popup, [], styles);\n } else {\n this.popup = createPopup(this.view, ['pm-math-preview'], undefined, {\n ...styles,\n visibility: 'hidden',\n });\n this.view.dom.parentNode?.appendChild(this.popup);\n }\n\n // typeset the math if we haven't already\n if (inlineMath !== this.lastRenderedMath && this.popup) {\n this.math.typeset!(this.popup, inlineMath, true).then(error => {\n if (!error) {\n this.popup!.style.visibility = 'visible';\n this.lastRenderedMath = inlineMath;\n // autoscroll for non-mouse triggers\n if (!$mousePos && range) {\n this.autoscollPopup(range);\n }\n }\n });\n }\n }\n\n private closePopup() {\n this.lastRenderedMath = null;\n if (this.popup) {\n this.popup.remove();\n this.popup = null;\n }\n }\n\n private autoscollPopup(mathRange: { from: number; to: number }) {\n const editingRoot = editingRootNode(this.view!.state.selection);\n if (editingRoot) {\n const editorEl = this.view!.nodeDOM(editingRoot.pos) as HTMLElement;\n const editorBox = editorEl.getBoundingClientRect();\n const popupBox = this.popup!.getBoundingClientRect();\n if (popupBox.top + popupBox.height + kMathPopupVerticalOffset > editorBox.bottom) {\n const mathBottom = this.view!.coordsAtPos(mathRange.to);\n const mathScrollBottom = editorEl.scrollTop + mathBottom.bottom;\n const mathPopupScrollBottom = mathScrollBottom + kMathPopupVerticalOffset + popupBox.height;\n const scrollTop = mathPopupScrollBottom + kMathPopupVerticalOffset - editorBox.top - editorBox.height;\n const scroller = zenscroll.createScroller(editorEl);\n scroller.toY(scrollTop, 100);\n }\n }\n }\n}\n\nfunction popupPositionStyles(view: EditorView, range: { from: number; to: number }) {\n // get coordinates for editor view (use to offset)\n const editorBox = (view.dom.parentNode! as HTMLElement).getBoundingClientRect();\n\n // +1 to ensure beginning of line doesn't resolve as line before\n // (will subtract it back out below)\n const rangeStartCoords = view.coordsAtPos(range.from + 1);\n const rangeEndCoords = view.coordsAtPos(range.to);\n\n // default positions\n const top = Math.round(rangeEndCoords.bottom - editorBox.top) + kMathPopupVerticalOffset + 'px';\n let left = `calc(${Math.round(rangeStartCoords.left - editorBox.left)}px - 1ch)`;\n\n // if it flow across two lines then position at far left of editing root\n // (we give it the 5 pixels of wiggle room so that detection still works\n // when a mathjax preview is shown in place of math text)\n if (Math.abs(rangeStartCoords.bottom - rangeEndCoords.bottom) > 5) {\n const editingRoot = editingRootNodeClosestToPos(view.state.doc.resolve(range.from));\n if (editingRoot) {\n const editingEl = view.nodeDOM(editingRoot.pos) as HTMLElement;\n if (editingEl) {\n const editingElStyle = window.getComputedStyle(editingEl);\n left = `calc(${editingEl.getBoundingClientRect().left}px + ${editingElStyle.paddingLeft} - 1ch - 2px)`;\n }\n }\n }\n\n // return position\n return { top, left };\n}\n","/*\n * math-viewts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Plugin, PluginKey, EditorState, Transaction, Selection } from 'prosemirror-state';\nimport { Schema } from 'prosemirror-model';\nimport { DecorationSet, EditorView, Decoration } from 'prosemirror-view';\nimport { keymap } from 'prosemirror-keymap';\nimport { AddMarkStep, RemoveMarkStep } from 'prosemirror-transform';\n\nimport { findChildrenByMark, setTextSelection } from 'prosemirror-utils';\n\nimport { getMarkRange, getMarkAttrs } from '../../api/mark';\n\nimport { EditorMath, MathType } from '../../api/math';\nimport { EditorUI } from '../../api/ui';\nimport { kSetMarkdownTransaction } from '../../api/transaction';\nimport { attrEditDecorationWidget } from '../../api/attr_edit/attr_edit-decoration';\nimport { EditorFormat } from '../../api/format';\nimport { editMathAttributes, editMathAttributesEnabled } from './math-commands';\n\n// NOTE: rendered equations don't curently show selection background color when part\n// of a larger selection (in spite of a few failed attempts to get this to work)\n// it would be nice to figure out how to do this\n\nexport function mathViewPlugins(schema: Schema, format: EditorFormat, ui: EditorUI, math: EditorMath): Plugin[] {\n return [\n mathViewPlugin(schema, format, ui, math),\n keymap({\n ArrowUp: verticalArrowHandler('up'),\n ArrowDown: verticalArrowHandler('down'),\n }),\n ];\n}\n\nfunction mathViewPlugin(schema: Schema, format: EditorFormat, ui: EditorUI, math: EditorMath) {\n const key = new PluginKey<DecorationSet>('math-view');\n\n function decorationsForDoc(state: EditorState) {\n const decorations: Decoration[] = [];\n findChildrenByMark(state.doc, schema.marks.math, true).forEach(markedNode => {\n // get mark range and attributes\n const range = getMarkRange(state.doc.resolve(markedNode.pos), schema.marks.math) as { from: number; to: number };\n const attrs = getMarkAttrs(state.doc, range, schema.marks.math);\n\n // if the selection isn't in the mark, then show the preview\n const preview = state.selection.from < range.from || state.selection.from > range.to;\n if (preview) {\n // get the math text\n const mathText = state.doc.textBetween(range.from, range.to);\n\n // hide the code\n decorations.push(Decoration.inline(range.from, range.to, { style: 'display: none;' }));\n\n // show a math preview\n decorations.push(\n Decoration.widget(\n range.from,\n (view: EditorView, getPos: () => number) => {\n const mathjaxDiv = window.document.createElement('div');\n mathjaxDiv.classList.add('pm-math-mathjax');\n // text selection 'within' code for clicks on the preview image\n mathjaxDiv.onclick = () => {\n const tr = view.state.tr;\n let pos = getPos();\n if (attrs.type === MathType.Display) {\n // set position to first non $, non whitespace character\n const match = mathText.match(/^[$\\s]+/);\n if (match) {\n pos += match[0].length;\n }\n } else {\n // set position to the middle of the equation\n pos = pos + mathText.length / 2;\n }\n setTextSelection(pos)(tr);\n view.dispatch(tr);\n view.focus();\n };\n math.typeset(mathjaxDiv, mathText, ui.context.isActiveTab());\n return mathjaxDiv;\n },\n { key: mathText },\n ),\n );\n } \n\n // for display math in quarto, show an edit widget\n if (editMathAttributesEnabled(format, state, range)) {\n decorations.push(attrEditDecorationWidget({\n pos: markedNode.pos-1,\n tags: attrs.id ? [`#${attrs.id}`] : [],\n editFn: editMathAttributes(ui),\n ui,\n offset: { top: 0, right: 6 },\n }));\n }\n });\n\n return DecorationSet.create(state.doc, decorations);\n }\n\n return new Plugin<DecorationSet>({\n key,\n\n state: {\n init(_config: { [key: string]: any }, instance: EditorState) {\n return decorationsForDoc(instance);\n },\n\n apply(tr: Transaction, set: DecorationSet, oldState: EditorState, newState: EditorState) {\n // replacing the entire editor triggers decorations\n if (tr.getMeta(kSetMarkdownTransaction)) {\n return decorationsForDoc(newState);\n\n // if one of the steps added or removed a mark of our type then rescan the doc.\n } else if (\n tr.steps.some(\n step =>\n (step instanceof AddMarkStep && (step as any).mark.type === schema.marks.math) ||\n (step instanceof RemoveMarkStep && (step as any).mark.type === schema.marks.math),\n )\n ) {\n return decorationsForDoc(newState);\n\n // if the previous or current state is in or at the border of a math mark, then rescan\n } else if (\n oldState.doc.rangeHasMark(oldState.selection.from - 2, oldState.selection.from + 1, schema.marks.math) ||\n getMarkRange(newState.selection.$from, schema.marks.math)\n ) {\n return decorationsForDoc(newState);\n\n // incremental scanning based on presence of mark in changed regions\n } else {\n // adjust decoration positions to changes made by the transaction (decorations that apply\n // to removed chunks of content will be removed by this)\n return set.map(tr.mapping, tr.doc);\n }\n },\n },\n\n appendTransaction: (_transactions: Transaction[], oldState: EditorState, newState: EditorState) => {\n // not currently in math\n if (!getMarkRange(newState.selection.$from, schema.marks.math) && newState.selection.from > 0) {\n // did we end up just to the right of math? if so check for navigation from a distance\n // (would imply an up/down arrow)\n const prevMathRange = getMarkRange(newState.doc.resolve(newState.selection.from - 1), schema.marks.math);\n if (prevMathRange) {\n // if the selection came from afar then treat it as an actual selection\n const delta = oldState.selection.from - newState.selection.from;\n if (Math.abs(delta) > 3) {\n const tr = newState.tr;\n const mathText = newState.doc.textBetween(prevMathRange.from, prevMathRange.to);\n const attrs = getMarkAttrs(newState.doc, prevMathRange, schema.marks.math);\n if (attrs.type === MathType.Inline) {\n setTextSelection(prevMathRange.from + mathText.length / 2)(tr);\n }\n return tr;\n }\n }\n }\n\n return null;\n },\n\n props: {\n decorations(state: EditorState) {\n return key.getState(state);\n },\n },\n });\n}\n\nfunction verticalArrowHandler(dir: 'up' | 'down') {\n return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n if (!view) {\n return false;\n }\n\n const schema = state.schema;\n\n // see if we need to provide up/down for inline math (it doesn't work by default, likely because\n // of the display: none decorator). This implementation just moves the selection before or\n // after the mark (better than the cursor doing nothing which is what we saw w/o this) however\n // it would be cool if we could fully emulate up/down\n const range = getMarkRange(state.selection.$head, schema.marks.math);\n if (range) {\n const attrs = getMarkAttrs(state.doc, range, schema.marks.math);\n if (attrs.type === MathType.Inline) {\n if (dispatch) {\n const side = dir === 'up' ? -1 : 1;\n const $head = state.selection.$head;\n const nextPos = Selection.near(state.doc.resolve(side > 0 ? $head.after() : $head.before()), side);\n const tr = state.tr;\n tr.setSelection(nextPos);\n dispatch(tr);\n }\n return true;\n }\n }\n\n if (view.endOfTextblock(dir)) {\n const side = dir === 'up' ? -1 : 1;\n const $head = state.selection.$head;\n const nextPos = Selection.near(state.doc.resolve(side > 0 ? $head.after() : $head.before()), side);\n if (\n nextPos.$head &&\n nextPos.$head.parent.childCount === 1 &&\n schema.marks.math.isInSet(nextPos.$head.parent.firstChild!.marks)\n ) {\n if (dispatch) {\n const mathText = nextPos.$head.parent.textContent;\n const match = mathText.match(/^[$\\s]+/);\n if (match) {\n const tr = state.tr;\n const mathPos = nextPos.$head.start($head.depth);\n setTextSelection(mathPos + match[0].length)(tr);\n dispatch(tr);\n }\n }\n return true;\n }\n }\n return false;\n };\n}\n","/*\n * attr_edit-decoration.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { NodeSelection } from 'prosemirror-state';\nimport { EditorView, Decoration } from 'prosemirror-view';\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport * as React from 'react';\n\nimport { EditorUI } from '../../api/ui';\nimport { ImageButton } from '../../api/widgets/button';\nimport { CommandFn } from '../../api/command';\nimport { WidgetProps, reactRenderForEditorView } from '../../api/widgets/react';\n\nimport { selectionIsWithinRange } from '../../api/selection';\nimport './attr_edit-decoration.css';\n\nexport const kEditAttrShortcut = 'F4';\n\nexport interface AttrEditDecorationOptions {\n pos: number;\n tags: string[];\n editFn: CommandFn;\n ui: EditorUI;\n offset?: { top: number; right: number };\n preferHidden?: boolean;\n noSelectOnClick?: boolean;\n}\n\nexport function attrEditDecorationWidget(options: AttrEditDecorationOptions) {\n return Decoration.widget(\n options.pos,\n (view: EditorView, getPos: () => number) => {\n // does the offsetParent have any right padding we need to offset for?\n // we normally use right: 5px for positioning but that is relative to\n // the edge of the offsetParent. However, some offset parents (e.g. a\n // td or a nested div) have their own internal padding to account for\n // so we look for it here\n let rightPaddingOffset = 0;\n const attrsNode = view.nodeDOM(getPos());\n if (attrsNode) {\n const attrsEl = attrsNode as HTMLElement;\n if (attrsEl.offsetParent) {\n const offsetParentStyle = window.getComputedStyle(attrsEl.offsetParent);\n rightPaddingOffset = -parseInt(offsetParentStyle.paddingRight!, 10) || 0;\n }\n }\n\n // cacculate position offsets\n const baseOffset = options.offset || { top: 0, right: 0 };\n const xOffset = baseOffset.right + rightPaddingOffset;\n const yOffset = baseOffset.top + 6;\n const cssProps: React.CSSProperties = {\n transform: `translate(${xOffset}px,-${yOffset}px)`,\n };\n\n // create attr edit react component\n const attrEdit = (\n <AttrEditDecoration\n tags={options.tags}\n editFn={options.editFn}\n getPos={getPos}\n view={view}\n ui={options.ui}\n style={cssProps}\n noSelectOnClick={options.noSelectOnClick}\n />\n );\n\n // create decorator and render attr editor into it\n const decoration = window.document.createElement('div');\n reactRenderForEditorView(attrEdit, decoration, view);\n\n return decoration;\n },\n {\n ignoreSelection: true,\n stopEvent: () => {\n return true;\n },\n preferHidden: options.preferHidden\n },\n );\n}\n\ninterface AttrEditDecorationProps extends WidgetProps {\n tags: string[];\n editFn: CommandFn;\n getPos: () => number;\n view: EditorView;\n ui: EditorUI;\n noSelectOnClick?: boolean;\n}\n\nconst AttrEditDecoration: React.FC<AttrEditDecorationProps> = props => {\n const buttonTitle = `${props.ui.context.translateText('Edit Attributes')} (${kEditAttrShortcut})`;\n\n const onClick = () => {\n // set selection before invoking function\n if (props.view.dispatch && !props.noSelectOnClick) {\n const pos = props.getPos();\n const node = props.view.state.doc.nodeAt(pos);\n if (node) {\n const tr = props.view.state.tr;\n if (node.type.spec.selectable) {\n tr.setSelection(new NodeSelection(tr.doc.resolve(pos)));\n } else {\n if (!selectionIsWithinRange(tr.selection, { from: pos, to: pos + node.nodeSize })) {\n setTextSelection(pos + 1)(tr);\n }\n }\n props.view.dispatch(tr);\n }\n }\n \n // perform edit\n props.editFn(props.view.state, props.view.dispatch, props.view);\n };\n\n return (\n <div className=\"pm-attr-edit-decoration pm-surface-widget-text-color \" style={props.style}>\n {props.tags.length\n ? props.tags.map(tag => {\n return (\n <span\n key={tag}\n className=\"attr-edit-tag attr-edit-widget pm-block-border-color pm-border-background-color\"\n onClick={onClick}\n >\n {tag}\n </span>\n );\n })\n : null}\n {props.editFn(props.view.state) ? (\n <ImageButton\n classes={['attr-edit-button']}\n image={props.ui.prefs.darkMode() ? props.ui.images.properties_deco_dark! : props.ui.images.properties_deco!}\n title={buttonTitle}\n tabIndex={-1}\n onClick={onClick}\n />\n ) : null}\n </div>\n );\n};\n","/*\n * math-keys.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n\nimport { EditorState, Transaction } from \"prosemirror-state\";\nimport { setTextSelection } from \"prosemirror-utils\";\n\nimport { MathType, mathTypeIsActive } from \"../../api/math\";\nimport { getSelectionMarkRange } from \"../../api/mark\";\n\n// enable insertion of newlines\nexport function displayMathNewline(state: EditorState, dispatch?: (tr: Transaction) => void) {\n // display math mark must be active\n if (!mathTypeIsActive(state, MathType.Display)) {\n return false;\n }\n\n // insert a newline\n if (dispatch) {\n const tr = state.tr;\n tr.insertText('\\n');\n dispatch(tr);\n }\n return true;\n}\n\nexport function inlineMathNav(begin: boolean) {\n return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n // inlne math mark must be active\n if (!mathTypeIsActive(state, MathType.Inline)) {\n return false;\n }\n const range = getSelectionMarkRange(state.selection, state.schema.marks.math);\n if (!range) {\n return false;\n }\n \n // insert a newline\n if (dispatch) {\n const tr = state.tr;\n setTextSelection(begin ? (range.from+1) : (range.to-1))(tr);\n dispatch(tr);\n }\n return true;\n };\n}\n","/*\n * cite.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Mark, Schema, Fragment, Node as ProsemirrorNode, Slice, ResolvedPos } from 'prosemirror-model';\nimport { InputRule } from 'prosemirror-inputrules';\nimport { EditorState, Transaction, Plugin, PluginKey, Selection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport uniqby from 'lodash.uniqby';\n\nimport { FocusEvent } from '../../api/event-types';\nimport { PandocTokenType, PandocToken, PandocOutput, ProsemirrorWriter, PandocServer, kPreventBracketEscape } from '../../api/pandoc';\nimport { fragmentText } from '../../api/fragment';\nimport { markIsActive, splitInvalidatedMarks, getMarkRange, detectAndApplyMarks } from '../../api/mark';\nimport { MarkTransaction, kPasteTransaction } from '../../api/transaction';\nimport { BibliographyManager, BibliographyFile, BibliographySource } from '../../api/bibliography/bibliography';\nimport { EditorUI } from '../../api/ui';\nimport { joinPaths, getExtension } from '../../api/path';\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { InsertCiteProps, kAlertTypeError, kAlertTypeWarning } from '../../api/ui-dialogs';\nimport { CSL, sanitizeForCiteproc } from '../../api/csl';\nimport { suggestCiteId, formatForPreview } from '../../api/cite';\nimport { performCompletionReplacement } from '../../api/completion';\nimport { FixupContext } from '../../api/fixup';\nimport { ensureBibliographyFileForDoc } from '../../api/bibliography/bibliography-provider_local';\n\nimport { citationCompletionHandler } from './cite-completion';\nimport { citeHighlightPlugin } from './cite-highlight';\nimport { citationDoiCompletionHandler } from './cite-completion_doi';\nimport { doiFromSlice } from './cite-doi';\nimport { citePopupPlugin } from './cite-popup';\nimport { InsertCitationCommand } from './cite-commands';\nimport { setTextSelection, findChildren } from 'prosemirror-utils';\nimport { AddMarkStep } from 'prosemirror-transform';\nimport { citeXrefPopupPlugin } from './cite-popup-xref';\n\nconst kCiteCitationsIndex = 0;\n\n\n// Follow the pandoc rules for citations\n// Each citation must have a key, composed of ‘@’ + the citation identifier from the database, \n// and may optionally have a prefix, a locator, and a suffix. The citation key must begin with a letter, \n// digit, or _, and may contain alphanumerics (UNICODE), _, and internal punctuation characters (:.#$%&-+?<>~/).\n// In addition, we don't permit the citation to include a . or ? character (which are allowed in the cite identifier)\n// This is only because when writing in text citations, it will be common to follow a citation with \n// punctuation, and we should be smart enough to filter that punctuation out of the citation itself.\nconst kCiteIdPrefixPattern = '-?@';\nconst kCiteIdCharsPattern = '[^@;\\\\[\\\\]\\\\s\\\\!\\\\,]*';\nconst kCiteIdBasePattern = `${kCiteIdPrefixPattern}${kCiteIdCharsPattern}`;\n\n// Completions examine all the text inside the citation mark, so they need to only be interested\n// in a citeId that terminates at the cursor (at the end of the text)\nconst kCompletionCiteIdRegEx = new RegExp(`(${kCiteIdPrefixPattern})(${kCiteIdCharsPattern})$`);\n\n// Note that since Cite Ids can appear inline as in-text representations or can appear inside of brackets \n// in a Note style. Consequently, this is used in various places to identify them interchangeably (e.g. we use)\n// this to identify a citeId inline in text, but also to identify a citedId in a bracketed citation.\nconst kCiteId = new RegExp(`^${kCiteIdBasePattern}`);\n\n// Plain In Text: @foo2019 (this is intentionally a duplicate of the above)\n// just to make the meaning more clear (this is used to detect an in text citation)\nconst kInTextCiteRegex = new RegExp(`${kCiteIdBasePattern}$`);\n\n// Note Style: [@foo2019]\nconst kBeginCitePattern = `(.* ${kCiteIdPrefixPattern}|${kCiteIdPrefixPattern})`;\nconst kNoteCiteRegex = new RegExp(`\\\\[${kBeginCitePattern}${kCiteIdCharsPattern}.*?\\\\]`);\n\n// In Text with Suffix: @foo2019 [p 35]\nconst kInTextCiteWithSuffixPattern = `${kCiteIdPrefixPattern}${kCiteIdCharsPattern}\\\\s+\\\\[.*?\\\\]`;\nconst kInTextCiteWithSuffixRegEx = new RegExp(`^${kInTextCiteWithSuffixPattern}$`);\n\nenum CitationMode {\n NormalCitation = 'NormalCitation',\n AuthorInText = 'AuthorInText',\n SuppressAuthor = 'SuppressAuthor',\n}\n\ninterface Citation {\n citationHash: number;\n citationId: string;\n citationMode: {\n t: CitationMode;\n };\n citationNoteNum: number;\n citationPrefix: PandocToken[];\n citationSuffix: PandocToken[];\n}\n\nconst extension = (context: ExtensionContext): Extension | null => {\n const { pandocExtensions, ui } = context;\n\n // prime bibliography on initial focus\n const bibliographyManager = new BibliographyManager(context.server.pandoc, context.server.zotero);\n const focusUnsubscribe = context.events.subscribe(FocusEvent, doc => {\n bibliographyManager.prime(ui, doc!);\n focusUnsubscribe();\n });\n\n if (!pandocExtensions.citations) {\n return null;\n }\n\n return {\n marks: [\n {\n name: 'cite',\n spec: {\n attrs: {},\n inclusive: false,\n parseDOM: [\n {\n tag: \"span[class*='cite']\",\n // use priority to ensure that cite_id is parsed before cite\n // when reading the DOM for the clipboard. we need this because\n // 'cite' is first in the mark order (so that @ witin a cite\n // properly triggers the input rule)\n priority: 5\n },\n ],\n toDOM(mark: Mark) {\n return { '0': 'span', '1': { class: 'cite' } };\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.Cite,\n handler: readPandocCite,\n },\n ],\n\n writer: {\n priority: 14,\n write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n\n // extract parentText for inspection\n const parentText = fragmentText(parent);\n\n // if it's just a cite id then write it straight up\n if (fragmentText(parent).match(kInTextCiteRegex)) {\n\n output.writeInlines(parent);\n\n } else {\n\n // divide out delimiters from body\n const openCite = parent.cut(0, 1);\n const cite = parent.cut(1, parent.size - 1);\n const closeCite = parent.cut(parent.size - 1, parent.size);\n\n // check for fully enclosed in brackets\n if (\n fragmentText(openCite) === '[' &&\n fragmentText(closeCite) === ']'\n ) {\n output.writeRawMarkdown('[');\n output.withOption(kPreventBracketEscape, true, () => {\n output.writeInlines(cite);\n });\n output.writeRawMarkdown(']');\n\n\n // if it starts with a valid cite id prefix and ends with a close\n // bracket then it might be an in-text citation with a suffix\n } else if (parentText.match(kInTextCiteWithSuffixRegEx)) {\n\n // find the position of the begin bracket that matches the end bracket\n let beginBracketPos = -1;\n let bracketLevel = 0;\n for (let i = parentText.length - 2; i >= 0; i--) {\n const char = parentText.charAt(i);\n if (char === ']') {\n bracketLevel++;\n } else if (char === '[') {\n if (bracketLevel > 0) {\n bracketLevel--;\n } else {\n beginBracketPos = i;\n break;\n }\n }\n }\n\n // if we found one then cut as approrpriate\n if (beginBracketPos) {\n output.writeInlines(parent.cut(0, beginBracketPos));\n output.writeRawMarkdown('[');\n output.writeInlines(parent.cut(beginBracketPos + 1, parentText.length - 1));\n output.writeRawMarkdown(']');\n\n } else {\n output.writeInlines(parent);\n }\n } else {\n output.writeInlines(parent);\n }\n }\n },\n },\n },\n },\n {\n name: 'cite_id',\n noSpelling: true,\n spec: {\n attrs: {},\n inclusive: true,\n parseDOM: [\n {\n tag: \"span[class*='cite-id']\",\n // use priority to ensure that cite_id is parsed before cite\n // when reading the DOM for the clipboard. we need this because\n // 'cite' is first in the mark order (so that @ witin a cite\n // properly triggers the input rule)\n priority: 10\n },\n ],\n toDOM(mark: Mark) {\n return ['span', { class: 'cite-id pm-link-text-color pm-fixedwidth-font' }];\n },\n },\n pandoc: {\n readers: [],\n writer: {\n priority: 13,\n write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n const idText = fragmentText(parent);\n // only write as a citation id (i.e. don't escape @) if it is still\n // a valid citation id. note that this in principle is also taken care\n // of by the application of splitInvalidatedMarks below (as the\n // mark would have been broken by this if it wasn't valid). this\n // code predates that, and we leave it in for good measure in case that\n // code is removed or changes in another unexpected way.\n if (idText.match(kInTextCiteRegex)) {\n const prefixMatch = idText.match(/^-?@/);\n if (prefixMatch) {\n output.writeRawMarkdown(prefixMatch.input!);\n output.writeInlines(parent.cut(prefixMatch.input!.length));\n } else {\n output.writeInlines(parent);\n }\n } else {\n output.writeInlines(parent);\n }\n },\n },\n },\n },\n ],\n\n commands: (_schema: Schema) => {\n return [new InsertCitationCommand(ui, context.events, bibliographyManager, context.server)];\n },\n\n appendTransaction: (schema: Schema) => {\n return [{\n name: 'cite-id-join',\n append: (tr: Transaction) => {\n const range = getMarkRange(tr.doc.resolve(tr.selection.head - 1), schema.marks.cite_id);\n if (range) {\n const text = tr.doc.textBetween(range.from, tr.selection.$head.after());\n const citeIdLen = citeIdLength(text);\n const markLength = range.to - range.from;\n if (citeIdLen > markLength) {\n tr.addMark(range.from, range.from + citeIdLen, schema.marks.cite_id.create());\n }\n }\n return tr;\n },\n }];\n },\n\n fixups: (schema: Schema) => {\n return [\n (tr: Transaction, fixupContext: FixupContext) => {\n if (fixupContext === FixupContext.Load) {\n // apply marks\n const markType = schema.marks.cite;\n const predicate = (node: ProsemirrorNode) => {\n return node.isTextblock && \n node.type.allowsMarkType(markType) &&\n node.textContent.indexOf('@') !== -1;\n };\n const markTr = new MarkTransaction(tr);\n findChildren(tr.doc, predicate).forEach(nodeWithPos => {\n const { pos } = nodeWithPos;\n applyCiteMarks(markTr, nodeWithPos.node, pos);\n });\n }\n return tr;\n },\n ];\n },\n\n appendMarkTransaction: (schema: Schema) => {\n\n return [\n {\n // 'break' cite marks if they are no longer valid. note that this will still preserve\n // the mark up to the length that it is valid. \n name: 'cite-marks',\n filter: (node: ProsemirrorNode, transactions: Transaction[]) => {\n\n // if the transaction added any cite id marks then we need to lay off\n // (mostly so that input rules can be reversed)\n if (transactions.some(trans => trans.steps.some(step => {\n if (step instanceof AddMarkStep) {\n return (step as any).mark.type === schema.marks.cite_id;\n }\n }))) {\n return false;\n\n /// otherwise proceed if this node is a textblock that allows cites\n } else {\n\n return node.isTextblock && node.type.allowsMarkType(schema.marks.cite);\n }\n },\n append: (tr: MarkTransaction, node: ProsemirrorNode, pos: number) => {\n splitInvalidatedMarks(tr, node, pos, citeLength, schema.marks.cite, (from: number, to: number) => {\n tr.removeMark(from, to, schema.marks.cite);\n });\n // match all valid forms of mark\n if (node.textContent.indexOf('@') !== -1) {\n applyCiteMarks(tr, node, pos);\n }\n },\n },\n {\n // 'break' cite_id marks if they are no longer valid. note that this will still preserve\n // the mark up to the length that it is valid (so e.g. if a space is inserted within a\n // cite_id this will keep the mark on the part before the space and remove it from the\n // part after the space)\n name: 'remove-cite-id-marks',\n filter: (node: ProsemirrorNode) => node.isTextblock && node.type.allowsMarkType(schema.marks.cite_id),\n append: (tr: MarkTransaction, node: ProsemirrorNode, pos: number) => {\n splitInvalidatedMarks(tr, node, pos, citeIdLength, schema.marks.cite_id);\n },\n },\n ];\n },\n\n inputRules: (schema: Schema) => {\n return [\n citeIdInputRule(schema),\n citeIdDashInputRule(schema),\n ];\n },\n\n completionHandlers: () => [\n citationDoiCompletionHandler(context.ui, bibliographyManager, context.server),\n citationCompletionHandler(context.ui, context.events, bibliographyManager, context.server, context.format),\n ],\n\n plugins: (schema: Schema) => {\n return [\n new Plugin({\n key: new PluginKey('paste_cite_doi'),\n props: {\n handlePaste: handlePaste(ui, bibliographyManager, context.server.pandoc),\n },\n }),\n citeHighlightPlugin(schema),\n citeXrefPopupPlugin(schema, ui, context.server),\n citePopupPlugin(schema, ui, bibliographyManager, context.server),\n\n ];\n },\n };\n};\n\nfunction handlePaste(ui: EditorUI, bibManager: BibliographyManager, server: PandocServer) {\n return (view: EditorView, _event: Event, slice: Slice) => {\n const schema = view.state.schema;\n if (markIsActive(view.state, schema.marks.cite_id)) {\n // This is a DOI\n const parsedDOI = doiFromSlice(view.state, slice);\n if (parsedDOI) {\n // Insert the DOI text as a placeholder\n const tr = view.state.tr;\n tr.setMeta(kPasteTransaction, true);\n tr.setMeta('uiEvent', 'paste');\n\n const doiText = schema.text(parsedDOI.token);\n tr.replaceSelectionWith(doiText, true);\n view.dispatch(tr);\n\n // First check the local bibliography- if we already have this DOI\n // we can just paste the DOI\n const source = bibManager.findDoiInLocalBibliography(parsedDOI.token);\n if (!source && bibManager.allowsWrites()) {\n insertCitation(view, parsedDOI.token, bibManager, parsedDOI.pos, ui, server);\n }\n return true;\n } else {\n // This is just content, accept any text and try pasting that\n let text = '';\n slice.content.forEach((node: ProsemirrorNode) => (text = text + node.textContent));\n if (text.length > 0) {\n const tr = view.state.tr;\n tr.setMeta(kPasteTransaction, true);\n tr.setMeta('uiEvent', 'paste');\n tr.replaceSelectionWith(schema.text(text));\n view.dispatch(tr);\n return true;\n } else {\n // There wasn't any text, just allow the paste to be handled by anyone else\n return false;\n }\n }\n } else {\n // We aren't in a citation so let someone else handle the paste\n return false;\n }\n };\n}\n\n\n// create a cite_id within a citation when the @ sign is typed\nfunction citeIdInputRule(schema: Schema) {\n return new InputRule(/@$/, (state: EditorState, match: string[], start: number, end: number) => {\n if (!markIsActive(state, schema.marks.cite_id)) {\n const { parent, parentOffset } = state.selection.$head;\n const text = match[0] + parent.textContent.slice(parentOffset);\n const textBefore = parent.textContent.slice(0, parentOffset);\n\n // reject unless the right prefix is there\n if (textBefore.length && !textBefore.match(/[\\xA0 \\t\\-\\[]$/)) {\n return null;\n }\n\n // get cite id length\n const citeIdLen = citeIdLength(text);\n\n // insert the @\n const tr = state.tr;\n tr.insertText(match[0]);\n\n // insert a pairing end bracket if we started with [\n if (citeIdLen === 1 && textBefore.match(/\\[-?$/) && text[1] !== ']') {\n tr.insertText(']');\n setTextSelection(tr.selection.head - 1)(tr);\n }\n\n if (citeIdLen) {\n // offset mark for incidence of '-' prefix\n const offset = textBefore.endsWith('-') ? 1 : 0;\n const citeStart = start - offset;\n const citeEnd = citeStart + citeIdLen + offset;\n tr.addMark(citeStart, citeEnd, schema.marks.cite_id.create());\n }\n\n return tr;\n }\n return null;\n });\n}\n\n\nfunction citeIdDashInputRule(schema: Schema) {\n return new InputRule(new RegExp(`-$`), (state: EditorState, match: string[], start: number, end: number) => {\n if (state.doc.rangeHasMark(start + 1, end + 2, schema.marks.cite_id)) {\n const tr = state.tr;\n tr.insertText(match[0]);\n tr.addMark(start, start + 1, schema.marks.cite_id.create());\n return tr;\n }\n return null;\n });\n}\n\n\n// read pandoc citation, creating requisite cite and cite_id marks as we go\nfunction readPandocCite(schema: Schema) {\n return (writer: ProsemirrorWriter, tok: PandocToken) => {\n\n // create and open the mark\n const citeMark = schema.marks.cite.create();\n writer.openMark(citeMark);\n\n // helper to write a citation\n const writeCitation = (citation: Citation) => {\n // prefix\n writer.writeTokens(citation.citationPrefix);\n if (citation.citationPrefix.length) {\n writer.writeText(' ');\n }\n\n // id\n const suppress = citation.citationMode.t === CitationMode.SuppressAuthor ? '-' : '';\n const citeIdMark = schema.marks.cite_id.create();\n writer.openMark(citeIdMark);\n writer.writeText(suppress + '@' + citation.citationId);\n writer.closeMark(citeIdMark);\n\n // suffix\n const inTextSuffix = citation.citationMode.t === CitationMode.AuthorInText && citation.citationSuffix.length;\n if (inTextSuffix) {\n writer.writeText(' [');\n }\n writer.writeTokens(citation.citationSuffix);\n if (inTextSuffix) {\n writer.writeText(']');\n }\n };\n\n // get all of the citations\n const citations: Citation[] = tok.c[kCiteCitationsIndex];\n\n // look for a single in-text citation\n if (citations.length === 1 && citations[0].citationMode.t === CitationMode.AuthorInText) {\n writeCitation(citations[0]);\n // non-in text and/or multiple citations\n } else {\n writer.writeText('[');\n citations.forEach((citation: Citation, index: number) => {\n // add delimiter\n if (index !== 0) {\n writer.writeText('; ');\n }\n writeCitation(citation);\n });\n writer.writeText(']');\n }\n\n writer.closeMark(citeMark);\n };\n}\n\nconst kCitationIdRegex = new RegExp(`(^\\\\[| )(${kCiteIdBasePattern})`, 'g');\n\nfunction encloseInCiteMark(tr: Transaction, start: number, end: number) {\n const schema = tr.doc.type.schema;\n const mark = schema.marks.cite.create();\n\n tr.addMark(start, end, mark);\n\n // look for valid citation ids inside and mark them\n const citeText = tr.doc.textBetween(start, end);\n\n kCitationIdRegex.lastIndex = 0;\n let match = kCitationIdRegex.exec(citeText);\n while (match !== null) {\n const pos = start + match.index + match[1].length;\n const idMark = schema.marks.cite_id.create();\n\n tr.addMark(pos, pos + match[2].length, idMark);\n match = kCitationIdRegex.exec(citeText);\n }\n kCitationIdRegex.lastIndex = 0;\n return tr;\n}\n\nfunction citeLength(text: string) {\n if (text.match(kNoteCiteRegex) ||\n text.match(kInTextCiteRegex) ||\n text.match(kInTextCiteWithSuffixRegEx)) {\n return text.length;\n } else {\n return 0;\n }\n}\n\n// up to how many characters of the passed text constitute a valid cite_id in the editor\n// (note that the editor tolerates citations ids with just an '@')\nfunction citeIdLength(text: string) {\n const match = text.match(kCiteId);\n if (match) {\n return match[0].length;\n } else {\n return 0;\n }\n}\n\n\nconst kFindInTextCiteRegex = new RegExp(kCiteIdBasePattern, 'g');\nconst kFindInTextCiteWithSuffixRegex = new RegExp(kInTextCiteWithSuffixPattern, 'g');\nconst kFindFullCiteRegex = new RegExp(kNoteCiteRegex.source, 'g');\n\nfunction applyCiteMarks(tr: MarkTransaction, node: ProsemirrorNode, pos: number) {\n const schema = node.type.schema;\n [kFindInTextCiteRegex, kFindFullCiteRegex, kFindInTextCiteWithSuffixRegex].forEach(re => {\n detectAndApplyMarks(\n tr,\n tr.doc.nodeAt(pos)!,\n pos,\n re,\n schema.marks.cite,\n () => ({}),\n (from: number, to: number) => {\n return tr.doc.rangeHasMark(from, to, schema.marks.cite_id);\n }\n );\n });\n}\n\n\nexport interface ParsedCitation {\n token: string;\n pos: number;\n offset: number;\n}\n\nexport function parseCitation(context: EditorState | Transaction): ParsedCitation | null {\n // return completions only if we are inside a cite_id . This way\n // if the user dismisses the cite_id (e.g. decides to type @ as literal string)\n // we won't offer completions\n const markType = context.doc.type.schema.marks.cite_id;\n const range = getMarkRange(context.doc.resolve(context.selection.head - 1), markType);\n if (range) {\n // examine text up to the cursor\n const citeText = context.doc.textBetween(range.from, context.selection.head);\n\n // make sure there is no text directly ahead (except bracket, space, semicolon)\n const nextChar = context.doc.textBetween(context.selection.head, context.selection.head + 1);\n if (!nextChar || [';', ' ', ']'].includes(nextChar)) {\n // look for a cite id that terminates at the cursor (including spaces/text after the id,\n // but before any semicolon delimiter)\n const match = citeText.match(kCompletionCiteIdRegEx);\n if (match) {\n const token = match[2];\n const pos = range.from + match.index! + match[1].length;\n return { token, pos, offset: -match[1].length };\n }\n }\n }\n return null;\n}\n\n// Replaces the current selection with a resolved citation id\nexport async function insertCitation(\n view: EditorView,\n doi: string,\n bibManager: BibliographyManager,\n pos: number,\n ui: EditorUI,\n server: PandocServer,\n csl?: CSL,\n provider?: string,\n) {\n // ensure the bib manager is loaded before proceeding\n await bibManager.load(ui, view.state.doc);\n\n // We try not call this function if the entry for this DOI is already in the bibliography,\n // but it can happen. So we need to check here if it is already in the bibliography and\n // if it is, deal with it appropriately.\n const existingEntry = bibManager.findDoiInLocalBibliography(doi);\n if (existingEntry) {\n // Now that we have loaded the bibliography, there is an entry\n // Just write it. Not an ideal experience, but something that\n // should happen only in unusual experiences\n const tr = view.state.tr;\n\n // This could be called by paste handler, so stop completions\n performCiteCompletionReplacement(tr, tr.mapping.map(pos), existingEntry.id);\n view.dispatch(tr);\n } else {\n // There isn't an entry in the existing bibliography\n // Show the user UI to and ultimately create an entry in the biblography\n // (even creating a bibliography if necessary)\n\n // Read bibliographies out of the document and pass those alone\n const existingIds = bibManager.localSources().map(source => source.id);\n\n const citeProps: InsertCiteProps = {\n doi,\n existingIds,\n bibliographyFiles: bibManager\n .writableBibliographyFiles(view.state.doc, ui)\n .map(writableFile => writableFile.displayPath),\n provider,\n csl,\n citeUI: csl\n ? {\n suggestedId: csl.id || suggestCiteId(existingIds, csl),\n previewFields: formatForPreview(csl),\n }\n : undefined,\n };\n\n const result = await ui.dialogs.insertCite(citeProps);\n if (result && result.id.length) {\n if (!result?.csl.title) {\n await ui.dialogs.alert(\n ui.context.translateText(\n \"This citation can't be added to the bibliography because it is missing required fields.\",\n ),\n ui.context.translateText('Invalid Citation'),\n kAlertTypeError,\n );\n } else {\n // Figure out whether this is a project or document level bibliography\n const writableBiblios = bibManager.writableBibliographyFiles(view.state.doc, ui);\n\n // Sort out the bibliography file into which we should write the entry\n const thisWritableBiblio = writableBiblios.find(writable => writable.displayPath === result.bibliographyFile);\n const project = thisWritableBiblio?.isProject || false;\n const writableBiblioPath = thisWritableBiblio\n ? thisWritableBiblio.fullPath\n : joinPaths(ui.context.getDefaultResourceDir(), result.bibliographyFile);\n const bibliographyFile: BibliographyFile = {\n displayPath: result.bibliographyFile,\n fullPath: writableBiblioPath,\n isProject: project,\n writable: true,\n };\n\n // Create the source that holds the id, provider, etc...\n const source: BibliographySource = {\n ...result.csl,\n id: result.id,\n providerKey: provider || '',\n };\n\n // Start the transaction\n const tr = view.state.tr;\n\n // Write the source to the bibliography if needed\n const writeCiteId = await ensureSourcesInBibliography(\n tr,\n [source],\n bibliographyFile,\n bibManager,\n view,\n ui,\n server,\n );\n\n if (writeCiteId) {\n // Write the citeId\n const schema = view.state.schema;\n const idText = schema.text(source.id, [schema.marks.cite_id.create()]);\n performCiteCompletionReplacement(tr, tr.mapping.map(pos), idText);\n }\n\n // Dispath the transaction\n view.dispatch(tr);\n }\n }\n view.focus();\n }\n}\n\n// Ensures that the sources are in the specified bibliography file\n// and ensures that the bibliography file is properly referenced (either)\n// as a project bibliography or inline in the document YAML\nexport async function ensureSourcesInBibliography(\n tr: Transaction,\n sources: BibliographySource[],\n bibliographyFile: BibliographyFile,\n bibManager: BibliographyManager,\n view: EditorView,\n ui: EditorUI,\n server: PandocServer,\n): Promise<boolean> {\n // Write entry to a bibliography file if it isn't already present\n await bibManager.load(ui, view.state.doc);\n\n // See if there is a warning for the selected provider. If there is, we may need to surface\n // that to the user. If there is no provider specified, no need to care about warnings.\n const providers = uniqby(sources, (source: BibliographySource) => source.providerKey).map(\n source => source.providerKey,\n );\n\n // Find any providers that have warnings\n const providersWithWarnings = providers.filter(prov => bibManager.warningForProvider(prov));\n\n // Is this a bibtex bibliography?\n const bibliographyFileExtension = getExtension(bibliographyFile.fullPath);\n const isBibTexBibliography = bibliographyFileExtension === 'bib' || bibliographyFileExtension === 'bibtex';\n\n // If there is a warning message and we're exporting to BibTeX, show the warning\n // message to the user and confirm that they'd like to proceed. This would ideally\n // know more about the warning type and not have this filter here (e.g. it would just\n // always show the warning)\n let proceedWithInsert = true;\n if (providersWithWarnings.length > 0 && ui.prefs.zoteroUseBetterBibtex() && isBibTexBibliography) {\n const results = await Promise.all<boolean>(\n providersWithWarnings.map(async withWarning => {\n const warning = bibManager.warningForProvider(withWarning);\n if (warning) {\n return await ui.dialogs.yesNoMessage(\n warning,\n 'Warning',\n kAlertTypeWarning,\n ui.context.translateText('Insert Citation Anyway'),\n ui.context.translateText('Cancel'),\n );\n } else {\n return true;\n }\n }),\n );\n proceedWithInsert = results.every(result => result);\n }\n\n if (proceedWithInsert) {\n await Promise.all(\n sources.map(async (source, i) => {\n if (source.id) {\n // Crossref sometimes provides invalid json for some entries. Sanitize it for citeproc\n const cslToWrite = sanitizeForCiteproc(source);\n\n if (!bibManager.findIdInLocalBibliography(source.id)) {\n const sourceAsBibTex = isBibTexBibliography\n ? await bibManager.generateBibTeX(ui, source.id, cslToWrite, source.providerKey)\n : undefined;\n await server.addToBibliography(\n bibliographyFile.fullPath,\n bibliographyFile.isProject,\n source.id,\n JSON.stringify([cslToWrite]),\n sourceAsBibTex || '',\n );\n }\n\n if (!bibliographyFile.isProject) {\n ensureBibliographyFileForDoc(tr, bibliographyFile.displayPath, ui);\n }\n }\n }),\n );\n }\n return proceedWithInsert;\n}\nexport function performCiteCompletionReplacement(tr: Transaction, pos: number, replacement: ProsemirrorNode | string) {\n // perform replacement\n performCompletionReplacement(tr, pos, replacement);\n\n // find the range of the cite and fixup marks\n const range = getMarkRange(tr.selection.$head, tr.doc.type.schema.marks.cite);\n if (range) {\n encloseInCiteMark(tr, range.from, range.to);\n }\n}\n\nexport default extension;\n","/*\n * bibliography.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport Fuse from 'fuse.js';\nimport { PandocServer } from '../pandoc';\n\nimport { EditorUI } from '../ui';\nimport { ParsedYaml, parseYamlNodes } from '../yaml';\nimport { CSL } from '../csl';\nimport { ZoteroServer } from '../zotero';\nimport { BibliographyDataProviderLocal, kLocalBibliographyProviderKey } from './bibliography-provider_local';\nimport { BibliographyDataProviderZotero } from './bibliography-provider_zotero';\nimport { toBibTeX } from './bibDB';\nimport { joinPaths, isAbsolute } from '../path';\n\nexport interface BibliographyFile {\n displayPath: string;\n fullPath: string;\n isProject: boolean;\n writable: boolean;\n}\n\nexport function bibliographyFileForPath(path: string, ui: EditorUI): BibliographyFile {\n return {\n displayPath: path,\n fullPath: isAbsolute(path, ui.context.isWindowsDesktop()) ? path : joinPaths(ui.context.getDefaultResourceDir(), path),\n isProject: false,\n writable: true,\n };\n}\n\nexport interface BibliographyType {\n extension: string;\n displayName: string;\n default: boolean;\n}\n\n// The types of bibliography files and the default value\nexport function bibliographyTypes(ui: EditorUI): BibliographyType[] {\n const defaultBiblioType = ui.prefs.bibliographyDefaultType();\n return [\n {\n displayName: ui.context.translateText('BibTeX'),\n extension: 'bib',\n default: defaultBiblioType === 'bib',\n },\n {\n displayName: ui.context.translateText('CSL-YAML'),\n extension: 'yaml',\n default: defaultBiblioType === 'yaml',\n },\n {\n displayName: ui.context.translateText('CSL-JSON'),\n extension: 'json',\n default: defaultBiblioType === 'json',\n },\n ];\n}\n\nexport interface BibliographyDataProvider {\n key: string;\n name: string;\n requiresWritable: boolean;\n\n isEnabled(): boolean;\n load(\n ui: EditorUI,\n docPath: string | null,\n resourcePath: string,\n yamlBlocks: ParsedYaml[],\n refreshCollectionData?: boolean,\n ): Promise<boolean>;\n collections(): BibliographyCollection[];\n items(): BibliographySourceWithCollections[];\n itemsForCollection(collectionKey: string): BibliographySourceWithCollections[];\n bibliographyPaths(doc: ProsemirrorNode, ui: EditorUI): BibliographyFile[];\n generateBibTeX(ui: EditorUI, id: string, csl: CSL): Promise<string | undefined>;\n warningMessage(): string | undefined;\n}\n\nexport interface BibliographyCollection {\n name: string;\n key: string;\n provider: string;\n parentKey?: string;\n}\n\nexport interface Bibliography {\n sources: CSL[];\n project_biblios: string[];\n}\n\n// The individual bibliographic source\nexport interface BibliographySource extends CSL {\n id: string;\n providerKey: string;\n}\n\nexport interface BibliographySourceWithCollections extends BibliographySource {\n collectionKeys: string[];\n}\n\n// The fields and weights that will indexed and searched\n// when searching bibliographic sources\nconst kFields: Fuse.FuseOptionKeyObject[] = [\n { name: 'id', weight: 30 },\n { name: 'author.family', weight: 15 },\n { name: 'author.literal', weight: 15 },\n { name: 'issued.raw', weight: 15 },\n { name: 'title', weight: 15 },\n { name: 'author.given', weight: 10 },\n { name: 'providerKey', weight: 0.01 },\n { name: 'collectionKeys', weight: 0.01 },\n];\n\nconst kSearchOptions = {\n isCaseSensitive: false,\n shouldSort: true,\n includeMatches: false,\n includeScore: false,\n keys: kFields,\n};\n\nexport class BibliographyManager {\n private providers: BibliographyDataProvider[];\n private sources?: BibliographySourceWithCollections[];\n private writable?: boolean;\n private searchIndex?: Fuse<BibliographySourceWithCollections>;\n\n public constructor(server: PandocServer, zoteroServer: ZoteroServer) {\n this.providers = [new BibliographyDataProviderLocal(server), new BibliographyDataProviderZotero(zoteroServer)];\n }\n\n public async prime(ui: EditorUI, doc: ProsemirrorNode) {\n // Load the bibliography\n await this.load(ui, doc, true);\n }\n\n public async load(ui: EditorUI, doc: ProsemirrorNode, refreshCollectionData?: boolean): Promise<void> {\n // read the Yaml blocks from the document\n const parsedYamlNodes = parseYamlNodes(doc);\n\n // Currently edited doc\n const docPath = ui.context.getDocumentPath();\n\n // Load each provider\n const providersNeedUpdate = await Promise.all(\n this.providers.map(provider =>\n provider.load(ui, docPath, ui.context.getDefaultResourceDir(), parsedYamlNodes, refreshCollectionData),\n ),\n );\n\n // Once loaded, see if any of the providers required an index update\n const needsIndexUpdate = providersNeedUpdate.reduce((prev, curr) => prev || curr);\n\n // Update the index if anything requires that we do so\n if (needsIndexUpdate) {\n // Get the entries\n const providersEntries = this.providers.map(provider => provider.items());\n\n // These are in arbitrary order, so sort them alphabetically\n const idSort = (a: BibliographySource, b: BibliographySource) => {\n return a.id.localeCompare(b.id);\n };\n this.sources = ([] as BibliographySourceWithCollections[]).concat(...providersEntries).sort(idSort);\n\n this.searchIndex = this.getFuse(this.sources);\n }\n\n // Is this a writable bibliography\n this.writable = this.isWritable(doc, ui);\n }\n\n public hasSources() {\n return this.allSources().length > 0;\n }\n\n public allSources(): BibliographySourceWithCollections[] {\n if (this.sources && this.allowsWrites()) {\n return this.sources;\n } else {\n return this.sources?.filter(source => source.providerKey === kLocalBibliographyProviderKey) || [];\n }\n return [];\n }\n\n public sourcesForProvider(providerKey: string): BibliographySourceWithCollections[] {\n return this.allSources().filter(item => item.providerKey === providerKey);\n }\n\n public sourcesForProviderCollection(provider: string, collectionKey: string): BibliographySourceWithCollections[] {\n return this.sourcesForProvider(provider).filter(item => item.collectionKeys.includes(collectionKey));\n }\n\n public localSources(): BibliographySourceWithCollections[] {\n return this.allSources().filter(source => source.providerKey === kLocalBibliographyProviderKey);\n }\n\n public allowsWrites(): boolean {\n return this.writable || false;\n }\n\n private isWritable(doc: ProsemirrorNode, ui: EditorUI): boolean {\n const bibliographyFiles = this.bibliographyFiles(doc, ui);\n if (bibliographyFiles.length === 0) {\n // Since there are no bibliographies, we can permit writing a fresh one\n return true;\n }\n return bibliographyFiles.filter(bibFile => bibFile.writable).length > 0;\n }\n\n public writableBibliographyFiles(doc: ProsemirrorNode, ui: EditorUI) {\n return this.bibliographyFiles(doc, ui).filter(bibFile => bibFile.writable);\n }\n\n public bibliographyFiles(doc: ProsemirrorNode, ui: EditorUI): BibliographyFile[] {\n const bibliographyPaths = this.providers.map(provider => provider.bibliographyPaths(doc, ui));\n return ([] as BibliographyFile[]).concat(...bibliographyPaths);\n }\n\n public localProviders(): BibliographyDataProvider[] {\n if (this.allowsWrites()) {\n return this.providers;\n } else {\n return this.providers.filter(provider => provider.requiresWritable === false);\n }\n }\n\n public providerName(providerKey: string): string | undefined {\n const dataProvider = this.providers.find(prov => prov.key === providerKey);\n return dataProvider?.name;\n }\n\n // Allows providers to generate bibTeX, if needed. This is useful in contexts\n // like Zotero where a user may be using the Better Bibtex plugin which can generate\n // superior BibTeX using things like stable citekeys with custom rules, and more.\n //\n // If the provider doesn't provide BibTeX, we can generate it ourselves\n public async generateBibTeX(ui: EditorUI, id: string, csl: CSL, provider?: string): Promise<string | undefined> {\n const dataProvider = this.providers.find(prov => prov.key === provider);\n if (dataProvider) {\n const dataProviderBibTeX = dataProvider.generateBibTeX(ui, id, csl);\n if (dataProviderBibTeX) {\n return dataProviderBibTeX;\n }\n }\n return Promise.resolve(toBibTeX(id, csl));\n }\n\n public warning(): string | undefined {\n const warningProvider = this.providers.find(provider => provider.warningMessage());\n if (warningProvider) {\n return warningProvider.warningMessage();\n }\n }\n\n public warningForProvider(providerKey?: string): string | undefined {\n if (providerKey) {\n const warningProvider = this.providers.find(prov => prov.key === providerKey);\n if (warningProvider) {\n return warningProvider.warningMessage();\n }\n }\n }\n\n public findDoiInLocalBibliography(doi: string): BibliographySourceWithCollections | undefined {\n // NOTE: This will only search sources that have already been loaded.\n // Please be sure to use load() before calling this or\n // accept the risk that this will not properly search for a DOI if the\n // bibliography hasn't already been loaded.\n return this.localSources().find(source => source.DOI === doi);\n }\n\n public findIdInLocalBibliography(id: string): BibliographySourceWithCollections | undefined {\n // NOTE: This will only search sources that have already been loaded.\n // Please be sure to use load() before calling this or\n // accept the risk that this will not properly search for a DOI if the\n // bibliography hasn't already been loaded.\n\n return this.localSources().find(source => source.id === id);\n }\n\n // A general purpose search interface for filtered searching\n public search(query?: string, providerKey?: string, collectionKey?: string): BibliographySourceWithCollections[] {\n const limit = 100;\n if (query && query.length > 0) {\n // These are ordered by search score, so leave as is\n if (providerKey && collectionKey) {\n return this.searchProviderCollection(query, limit, providerKey, collectionKey);\n } else if (providerKey) {\n return this.searchProvider(query, limit, providerKey);\n } else {\n return this.searchAllSources(query, limit);\n }\n } else {\n if (providerKey && collectionKey) {\n return this.sourcesForProviderCollection(providerKey, collectionKey);\n } else if (providerKey) {\n return this.sourcesForProvider(providerKey);\n } else {\n return this.allSources();\n }\n }\n }\n\n public searchAllSources(query: string, limit: number): BibliographySourceWithCollections[] {\n return this.searchSources(query, limit, this.allSources());\n }\n\n public searchSources(\n query: string,\n limit: number,\n sources: BibliographySourceWithCollections[],\n ): BibliographySourceWithCollections[] {\n // NOTE: This will only search sources that have already been loaded.\n // Please be sure to use load() before calling this or\n // accept the risk that this will not properly search for a source if the\n // bibliography hasn't already been loaded.\n if (sources && this.searchIndex) {\n // NOTE: Search performance can really drop off for long strings\n // Test cases start at 20ms to search for a single character\n // grow to 270ms to search for 20 character string\n // grow to 1060ms to search for 40 character string\n const searchResults = this.searchIndex.search(query, { ...kSearchOptions, limit });\n const items = searchResults.map((result: { item: any }) => result.item);\n\n // Filter out any non local items if this isn't a writable bibliography\n const filteredItems = this.allowsWrites()\n ? items\n : items.filter(item => item.provider === kLocalBibliographyProviderKey);\n return filteredItems;\n } else {\n return [];\n }\n }\n\n // Search only a specific provider\n public searchProvider(query: string, limit: number, providerKey: string): BibliographySourceWithCollections[] {\n const orFields = kFields.flatMap(field => {\n if (Array.isArray(field)) {\n return field.map(name => ({ [name]: query }));\n } else {\n return {\n [field.name as string]: query,\n };\n }\n \n });\n const q = {\n $and: [\n { providerKey },\n {\n $or: orFields,\n },\n ],\n };\n\n if (this.searchIndex) {\n const searchResults = this.searchIndex.search(q, { limit });\n return searchResults.map((result: { item: any }) => result.item);\n } else {\n return [];\n }\n }\n\n // Search a specific provider and collection\n public searchProviderCollection(\n query: string,\n limit: number,\n providerKey: string,\n collectionKey: string,\n ): BibliographySourceWithCollections[] {\n const orFields = kFields.flatMap(field => {\n if (Array.isArray(field.name)) {\n return field.name.map(name => ( { [name]: query }));\n } else {\n return {\n [field.name as string]: query,\n };\n }\n \n });\n const q = {\n $and: [\n {\n providerKey,\n },\n {\n collectionKeys: collectionKey,\n },\n {\n $or: orFields,\n },\n ],\n };\n\n if (this.searchIndex) {\n const searchResults = this.searchIndex.search(q, { limit });\n return searchResults.map((result: { item: any }) => result.item);\n } else {\n return [];\n }\n }\n\n private getFuse(bibSources: BibliographySourceWithCollections[]) {\n // build search index\n const options = {\n ...kSearchOptions,\n keys: kFields.map(field => field.name),\n };\n const index = Fuse.createIndex<BibliographySourceWithCollections>(options.keys, bibSources);\n return new Fuse(bibSources, options, index);\n }\n}\n","/*\n * bibliography-provider_local.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\nimport { Transaction } from 'prosemirror-state';\n\nimport { PandocServer } from '../pandoc';\n\nimport { getExtension, joinPaths, isAbsolute } from '../path';\nimport { EditorUI } from '../ui';\n\nimport {\n BibliographyDataProvider,\n Bibliography,\n BibliographyFile,\n BibliographyCollection,\n BibliographySourceWithCollections,\n} from './bibliography';\nimport { ParsedYaml, parseYamlNodes, valueFromYamlText } from '../yaml';\nimport { toBibTeX } from './bibDB';\nimport { CSL } from '../csl';\n\nexport interface BibliographyResult {\n etag: string;\n bibliography: Bibliography;\n}\nexport const kLocalBibliographyProviderKey = 'E06068FE-45DA-4D88-ABDA-0DF290624950';\n\nexport class BibliographyDataProviderLocal implements BibliographyDataProvider {\n private etag: string;\n private bibliography?: Bibliography;\n private readonly server: PandocServer;\n\n public constructor(server: PandocServer) {\n this.server = server;\n this.etag = '';\n }\n public name: string = 'Bibliography';\n public key: string = kLocalBibliographyProviderKey;\n public requiresWritable: boolean = false;\n\n // Always enabled;\n public isEnabled(): boolean {\n return true;\n }\n\n public prime(): Promise<any> {\n return Promise.resolve();\n }\n\n public async load(ui: EditorUI, docPath: string | null, resourcePath: string, yamlBlocks: ParsedYaml[]): Promise<boolean> {\n // Gather the biblography files from the document\n const bibliographiesRelative = bibliographyFilesFromDoc(yamlBlocks);\n const bibliographiesAbsolute = bibliographiesRelative?.map(path => {\n if (isAbsolute(path, ui.context.isWindowsDesktop())) {\n return path;\n } else {\n return joinPaths(resourcePath, path);\n }\n }) || [];\n\n // Gather the reference block\n const refBlock = referenceBlockFromYaml(yamlBlocks);\n\n let updateIndex = false;\n if (docPath || bibliographiesAbsolute.length > 0 || refBlock) {\n // get the bibliography\n try {\n const result = await this.server.getBibliography(docPath, bibliographiesAbsolute, refBlock, this.etag);\n\n // Read bibliography data from files (via server)\n if (!this.bibliography || result.etag !== this.etag) {\n this.bibliography = result.bibliography;\n updateIndex = true;\n }\n\n // record the etag for future queries\n this.etag = result.etag;\n } catch (e) {\n // ignore error\n }\n }\n return updateIndex;\n }\n\n public collections(): BibliographyCollection[] {\n return [];\n\n // NOTE: If we can make the 'itemsForCollections' call work, we can begin emitting the various\n // bibliography files here. Right now, the server generates the CSL for all the bibligraphy runs\n // in a single call, meaning that the items lose context of which bibliography file that they\n // come from.\n /*\n if (!this.bibliography || !this.bibliography.sources) {\n return [];\n }\n\n if (this.projectBiblios().length > 0) {\n return this.projectBiblios().map(biblio => ({ name: biblio, key: biblio }));\n }\n\n const bibliographies = bibliographyFilesFromDocument(doc, ui);\n return bibliographies ? bibliographies.map(biblio => ({ name: biblio, key: biblio })) : [];\n */\n }\n\n public items(): BibliographySourceWithCollections[] {\n if (!this.bibliography || !this.bibliography.sources) {\n return [];\n }\n\n return this.bibliography.sources.map(source => ({\n ...source,\n id: source.id!, // Local CSL always has an id\n providerKey: this.key,\n collectionKeys: [],\n }));\n }\n\n public itemsForCollection(collectionKey: string): BibliographySourceWithCollections[] {\n // NOTE: IF we add support, need to filter by biblio file\n return [];\n }\n\n public projectBiblios(): string[] {\n return this.bibliography?.project_biblios || [];\n }\n\n public generateBibTeX(_ui: EditorUI, id: string, csl: CSL): Promise<string | undefined> {\n return Promise.resolve(toBibTeX(id, csl));\n }\n\n public warningMessage(): string | undefined {\n return undefined;\n }\n\n public bibliographyPaths(doc: ProsemirrorNode, ui: EditorUI): BibliographyFile[] {\n const kPermissableFileExtensions = ['bibtex', 'bib', 'yaml', 'yml', 'json'];\n if (this.bibliography?.project_biblios && this.bibliography.project_biblios.length > 0) {\n return this.bibliography?.project_biblios.map(projectBiblio => {\n return {\n displayPath: projectBiblio,\n fullPath: projectBiblio,\n isProject: true,\n writable: kPermissableFileExtensions.includes(getExtension(projectBiblio)),\n };\n });\n }\n return (\n bibliographyFilesFromDocument(doc, ui)?.map(path => {\n return {\n displayPath: path,\n fullPath: isAbsolute(path, ui.context.isWindowsDesktop()) ? path : joinPaths(ui.context.getDefaultResourceDir(), path),\n isProject: false,\n writable: kPermissableFileExtensions.includes(getExtension(path)),\n };\n }) || []\n );\n }\n}\n\nfunction bibliographyFilesFromDocument(doc: ProsemirrorNode, ui: EditorUI): string[] | undefined {\n // Gather the files from the document\n return bibliographyFilesFromDoc(parseYamlNodes(doc));\n}\n\nfunction bibliographyFilesFromDoc(parsedYamls: ParsedYaml[]): string[] | undefined {\n // Read the values of any yaml blocks that include bibliography headers\n // filter out blocks that don't include such headers\n const bibliographyValues = parsedYamls\n .map(parsedYaml => {\n return valueFromYamlText('bibliography', parsedYaml.yamlCode);\n })\n .filter(val => val !== null);\n\n if (bibliographyValues.length > 0) {\n // Pandoc will use the last biblography node when generating a bibliography.\n // So replicate this and use the last biblography node that we find\n const bibliographyFiles = bibliographyValues[bibliographyValues.length - 1];\n if (\n Array.isArray(bibliographyFiles) &&\n bibliographyFiles.every(bibliographyFile => typeof bibliographyFile === 'string')\n ) {\n return bibliographyFiles as string[];\n } else if (typeof bibliographyFiles === \"string\") {\n // A single bibliography\n return [bibliographyFiles as string];\n }\n }\n return undefined;\n}\n\nfunction referenceBlockFromYaml(parsedYamls: ParsedYaml[]): string {\n const refBlockParsedYamls = parsedYamls.filter(\n parsedYaml => parsedYaml.yaml !== null && typeof parsedYaml.yaml === 'object' && parsedYaml.yaml.references,\n );\n\n // Pandoc will use the last references node when generating a bibliography.\n // So replicate this and use the last biblography node that we find\n if (refBlockParsedYamls.length > 0) {\n const lastReferenceParsedYaml = refBlockParsedYamls[refBlockParsedYamls.length - 1];\n if (lastReferenceParsedYaml) {\n return `---\\n${lastReferenceParsedYaml.yamlCode}\\n---\\n`;\n }\n }\n\n return '';\n}\n\nconst kSpaceOrColonRegex = /[\\s:]/;\nfunction bibliographyLine(bibliographyFile: string): string {\n const sketchyCharMatch = bibliographyFile.match(kSpaceOrColonRegex);\n if (sketchyCharMatch) {\n return `bibliography: \"${bibliographyFile}\"`;\n } else {\n return `bibliography: ${bibliographyFile}`;\n }\n}\n\nexport function ensureBibliographyFileForDoc(tr: Transaction, bibliographyFile: string, ui: EditorUI) {\n // read the Yaml blocks from the document\n const parsedYamlNodes = parseYamlNodes(tr.doc);\n\n // Gather the biblography files from the document\n const bibliographiesRelative = bibliographyFilesFromDoc(parsedYamlNodes);\n if (bibliographiesRelative && bibliographiesRelative.length > 0) {\n // The user selected bibliography is already in the document OR\n // There is a bibliography entry, but it doesn't include the user\n // selected bibliography. In either case, we're not going to write\n // a bibliography entry to any YAML node.\n return bibliographiesRelative.includes(bibliographyFile);\n } else {\n // There aren't any bibliographies declared for this document yet either because\n // there are no yaml metadata blocks or the yaml metadata blocks that exist omit\n // the bibliography property\n if (parsedYamlNodes.length === 0) {\n // There aren't any yaml nodes in this document, need to create one\n const biblioNode = createBiblographyYamlNode(tr.doc.type.schema, bibliographyFile);\n tr.insert(1, biblioNode);\n } else {\n // We found at least one node in the document, add to the first node that we found\n const firstBlock = parsedYamlNodes[0];\n const updatedNode = addBibliographyToYamlNode(tr.doc.type.schema, bibliographyFile, firstBlock);\n tr.replaceRangeWith(firstBlock.node.pos, firstBlock.node.pos + firstBlock.node.node.nodeSize, updatedNode);\n }\n return true;\n }\n}\n\nfunction addBibliographyToYamlNode(schema: Schema, bibliographyFile: string, parsedYaml: ParsedYaml) {\n // Add this to the first node\n const yamlCode = parsedYaml.yamlCode;\n const yamlWithBib = `---\\n${yamlCode}\\n${bibliographyLine(bibliographyFile)}\\n---`;\n const yamlText = schema.text(yamlWithBib);\n return schema.nodes.yaml_metadata.create({}, yamlText);\n}\n\nfunction createBiblographyYamlNode(schema: Schema, bibliographyFile: string) {\n const yamlText = schema.text(`---\\n${bibliographyLine(bibliographyFile)}\\n---`);\n return schema.nodes.yaml_metadata.create({}, yamlText);\n}\n","/*\n * path.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport function expandPaths(rootPath: string, paths: string[]): string[] {\n return paths.map(path => joinPaths(rootPath, path));\n}\n\nexport function joinPaths(root: string, path: string) {\n const mergedPath = `${root}/${path}`;\n\n // Clean out duplicate paths\n return mergedPath.replace(/\\/\\//g, '/');\n}\n\n// Ported from\n// https://github.com/denoland/deno_std/tree/main/path\nexport function isAbsolute(path: string, isWindows: boolean) {\n\n if (isWindows) {\n // Win32 implementation\n const len = path.length;\n if (len === 0) {\n return false;\n }\n\n const code = path.charCodeAt(0);\n if (isWinPathSeparator(code)) {\n return true;\n } else if (isWindowsDeviceRoot(code)) {\n // Possible device root\n\n if (len > 2 && path.charCodeAt(1) === CHAR_COLON) {\n if (isWinPathSeparator(path.charCodeAt(2))) {\n return true;\n }\n }\n }\n return false;\n\n } else {\n // posix implementation\n return path.length > 0 && path.charCodeAt(0) === CHAR_FORWARD_SLASH;\n }\n}\n\nexport function getExtension(path: string) {\n // Get the file out of the path\n const fileName = path.split(/[\\\\/]/).pop();\n if (fileName) {\n const lastDot = fileName.lastIndexOf('.');\n if (lastDot > 0) {\n return fileName.slice(lastDot + 1);\n }\n }\n return '';\n}\n\nexport function changeExtension(path: string, extension: string) {\n const lastDot = path.lastIndexOf('.');\n const pathNoExtension = path.substr(0, lastDot + 1);\n return pathNoExtension + extension;\n}\n\nconst CHAR_UPPERCASE_A = 65; /* A */\nconst CHAR_LOWERCASE_A = 97; /* a */\nconst CHAR_UPPERCASE_Z = 90; /* Z */\nconst CHAR_LOWERCASE_Z = 122; /* z */\nconst CHAR_FORWARD_SLASH = 47; /* / */\nconst CHAR_BACKWARD_SLASH = 92; /* \\ */\nconst CHAR_COLON = 58; /* : */\n\nfunction isWinPathSeparator(code: number) {\n return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH;\n}\n\nfunction isWindowsDeviceRoot(code: number): boolean {\n return (\n (code >= CHAR_LOWERCASE_A && code <= CHAR_LOWERCASE_Z) ||\n (code >= CHAR_UPPERCASE_A && code <= CHAR_UPPERCASE_Z)\n );\n}","/*\n * BibDB.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport {\n BibFieldTypes,\n NameDictObject,\n NodeArray,\n RangeArray,\n BibField,\n BibLatexExporter,\n BibTypes,\n BibType,\n} from 'biblatex-csl-converter';\n\nimport { Mark, Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { CSL, CSLDate, cslDateToEDTFDate, CSLName } from '../csl';\nimport { cslTextToProsemirrorNode } from '../csl-text';\nimport { bibDbToBibTeX } from '../bibtex/bibtex';\n\nexport type BibDB = Record<string, EntryObject>;\n\nexport interface EntryObject {\n csl_type?: string;\n bib_type: string;\n entry_key: string;\n fields: Record<string, any>;\n incomplete?: boolean;\n unexpected_fields?: Record<string, any>;\n unknown_fields?: Record<string, any>;\n}\n\n// This is our wrapper of a typescript BibLaTeX exporter\n// https://github.com/fiduswriter/biblatex-csl-converter\n\n// Traditional Form Looks Like:\n// author = {{Abbas}, {Osma Ahmed} and {Ibrahim}, {Issa Ghada} and {Ismail}, {Abdel-Gawad Eman}}\n//\n// Non traditional form looks like:\n// author = {given={Osma Ahmed}, family={Abbas} and given={Issa Ghada}, family={Ibrahim} and given={Abdel-Gawad Eman}, family={Ismail}}\nconst kUseTraditionalNameForm = false;\n\n// Generates bibLaTeX for a given CSL object / id\nexport function toBibLaTeX(id: string, csl: CSL): string | undefined {\n // A BibDB is basically a map of key / EntryObject[] that is\n // used by the exporter to generate BibLaTeX\n const bibDB = cslToBibDB(id, csl);\n if (bibDB) {\n // Use the exported to parse the bibDB and generate bibLaTeX\n const exporter: BibLatexExporter = new BibLatexExporter(bibDB, false, {\n traditionalNames: kUseTraditionalNameForm,\n });\n const sourceAsBibLaTeX = exporter.parse();\n\n // Indent any , new lines\n return sourceAsBibLaTeX.replace(/,\\n/g, ',\\n\\t');\n }\n return undefined;\n}\n\nexport function toBibTeX(id: string, csl: CSL): string | undefined {\n // A BibDB is basically a map of key / EntryObject[] that is\n // used by the exporter to generate BibLaTeX\n const bibDB = cslToBibDB(id, csl);\n if (bibDB) {\n // Use the exported to parse the bibDB and generate bibLaTeX\n const sourceAsBibTeX = bibDbToBibTeX(bibDB);\n\n // Indent any , new lines\n return sourceAsBibTeX;\n }\n return undefined;\n}\n\n// Converts a single CSL item to a bibDB containing\n// a single EntryObject representing that CSL item\nfunction cslToBibDB(id: string, csl: CSL): BibDB | undefined {\n const bibType = bibTypeForCSL(csl.type);\n const bibObject: EntryObject = {\n bib_type: bibType[0],\n csl_type: bibType[1].csl,\n entry_key: id,\n fields: {},\n };\n\n const enumerableCSL = csl as any;\n sortedKeys(csl).forEach(key => {\n const value: any = enumerableCSL[key];\n\n const bibFieldDatas = bibFieldForValue(key, csl.type);\n\n bibFieldDatas?.forEach(bibFieldData => {\n if (bibFieldData) {\n const bibFieldKey = bibFieldData[0];\n const bibField = bibFieldData[1];\n const type = bibField.type;\n let nodeValue: any;\n switch (type) {\n case 'f_date':\n // f_date = // EDTF 1.0 level 0/1 compliant string. (2000-12-31)\n const cslDate = value as CSLDate;\n if (cslDate) {\n const edtfDate = cslDateToEDTFDate(cslDate);\n if (edtfDate) {\n nodeValue = edtfDate;\n }\n }\n break;\n case 'f_integer':\n case 'f_literal':\n case 'f_long_literal':\n case 'f_title':\n // f_integer, f_literal, f_long_literal, f_title = [nodeValue]\n // l_literal = [nodeValue]\n if (value && value.length > 0) {\n nodeValue = textNodes(value);\n }\n break;\n case 'l_literal':\n // l_literal = [NodeArray]\n if (value && value.length > 0) {\n nodeValue = [textNodes(value)];\n }\n break;\n case 'f_key':\n // f_key: string | NodeArray (string points to another key\n // name in BibObject whose value is used for this key)\n if (bibField.options) {\n const options = bibField.options as any;\n Object.keys(options).find(optionKey => {\n const optionValue: any = options[optionKey];\n if (optionValue.csl === value) {\n nodeValue = optionKey;\n return true;\n }\n });\n\n if (!nodeValue) {\n nodeValue = textNodes(value);\n }\n }\n\n break;\n case 'l_key':\n // l_key, list of [string | NodeArray]\n if (bibField.options) {\n const options = bibField.options as any;\n Object.keys(options).find(optionKey => {\n const optionValue: any = options[optionKey];\n if (optionValue.csl === value) {\n nodeValue = [optionKey];\n return true;\n }\n });\n\n if (!nodeValue && value && value.length > 0) {\n nodeValue = textNodes(value);\n }\n }\n break;\n case 'l_range':\n // l_range Array<RangeArray>\n const valueStr = value as string;\n const parts = valueStr.split('-');\n const range = rangeArray(parts);\n if (range) {\n nodeValue = [range];\n }\n break;\n case 'f_uri':\n case 'f_verbatim':\n // f_uri, f_verbatim: string\n nodeValue = value;\n break;\n case 'l_name':\n // l_name Array<NameDictObject>\n const names = value as CSLName[];\n nodeValue = names.map(name => {\n const nameDict: NameDictObject = {\n family: name.family ? textNodes(name.family) : undefined,\n given: name.given ? textNodes(name.given) : undefined,\n literal: name.literal ? textNodes(name.literal) : undefined,\n };\n return nameDict;\n });\n\n break;\n case 'l_tag':\n // l_tag: string[]\n nodeValue = [value];\n break;\n }\n\n if (nodeValue) {\n if (shouldIncludeField(bibFieldKey, bibType[1])) {\n bibObject.fields[bibFieldKey] = nodeValue;\n }\n }\n }\n });\n });\n\n const bibDB: BibDB = {\n item: bibObject,\n };\n return bibDB;\n}\n\n// For a given type, we filter out any fields that aren't required,\n// eitheror, or optional.\nfunction shouldIncludeField(bibDBFieldName: string, bibType: BibType) {\n // Special case:\n // For datasets, allow author \n // Fixes https://github.com/rstudio/rstudio/issues/9059\n if (bibType.csl === 'dataset' && bibDBFieldName === 'author') {\n return true;\n }\n\n return (\n bibType.required.includes(bibDBFieldName) ||\n bibType.optional.includes(bibDBFieldName) ||\n bibType.eitheror.includes(bibDBFieldName)\n );\n}\n\n// Returns text nodes for a given CSL string. This implements\n// support for the basic CSL marks that are outlined here:\n// https://citeproc-js.readthedocs.io/en/latest/csl-json/markup.html#html-like-formatting-tags\nfunction textNodes(str: string): NodeArray {\n const pmNode = cslTextToProsemirrorNode(str);\n if (pmNode) {\n const nodes: NodeArray = [];\n pmNode.forEach((node: ProsemirrorNode) => {\n nodes.push({\n type: 'text',\n text: node.textContent,\n marks: node.marks.map((mark: Mark) => ({ type: mark.type.name })),\n });\n });\n return nodes;\n } else {\n return [\n {\n type: 'text',\n text: str,\n marks: [],\n attrs: {},\n },\n ];\n }\n}\n\n// Useful for things like page ranges\nfunction rangeArray(parts: string[]): RangeArray | undefined {\n if (parts.length === 1) {\n return [textNodes(parts[0])];\n } else if (parts.length === 2) {\n return [textNodes(parts[0]), textNodes(parts[1])];\n }\n}\n\n// Returns the bibDB type for a given CSL type.\nfunction bibTypeForCSL(cslType: string): [string, BibType] {\n const key = Object.keys(BibTypes).find(bibTypeKey => {\n const bibType = BibTypes[bibTypeKey];\n if (bibType.csl === cslType) {\n return bibTypeKey;\n }\n });\n\n if (key) {\n const bibType = BibTypes[key];\n return [key, bibType];\n } else {\n const bibType = BibTypes.misc;\n return ['misc', bibType];\n }\n}\n\nfunction bibFieldForValue(cslKey: string, cslType: string): Array<[string, BibField]> | undefined {\n // Special case the following fields:\n // article-journal issue\n // patent number\n // * collection-number\n // See https://discourse.citationstyles.org/t/issue-number-and-bibtex/1072\n // https://github.com/fiduswriter/biblatex-csl-converter/blob/35d152935eba253ebadd00e285fb13c5828f167f/src/const.js#L561\n if (\n (cslType === 'article-journal' && cslKey === 'issue') ||\n (cslType === 'patent' && cslKey === 'number') ||\n cslKey === 'collection-number'\n ) {\n const bibField = {\n type: 'f_literal',\n biblatex: 'number',\n csl: cslKey,\n };\n return [['number', bibField]];\n }\n\n // Find the key that corresponds to this CSL key\n const keys = Object.keys(BibFieldTypes).filter(bibFieldKey => {\n const bibField = BibFieldTypes[bibFieldKey];\n const cslFieldName = bibField.csl;\n if (cslFieldName && cslFieldName === cslKey) {\n return bibField;\n }\n });\n\n // Get the field and return\n if (keys) {\n return keys.map(key => {\n const bibField = BibFieldTypes[key];\n return [key, bibField];\n });\n }\n}\n\nfunction sortedKeys(csl: CSL) {\n let pos = 1;\n const keySortOrder: { [id: string]: number } = {};\n keySortOrder.title = pos++;\n\n keySortOrder.author = pos++;\n keySortOrder.editor = pos++;\n keySortOrder.director = pos++;\n keySortOrder.illustrator = pos++;\n keySortOrder['collection-editor'] = pos++;\n keySortOrder.translator = pos++;\n\n keySortOrder.doi = pos++;\n\n keySortOrder.issued = pos++;\n keySortOrder['event-date'] = pos++;\n\n keySortOrder['container-title'] = pos++;\n keySortOrder['collection-title'] = pos++;\n\n keySortOrder.url = pos++;\n\n keySortOrder.page = pos++;\n keySortOrder.publisher = pos++;\n\n const enumerableCSL = csl as any;\n const keys = Object.keys(enumerableCSL);\n const sorted = keys.sort((a, b) => {\n const aOrder = keySortOrder[a.toLowerCase()];\n const bOrder = keySortOrder[b.toLowerCase()];\n if (aOrder && bOrder) {\n return aOrder - bOrder;\n } else if (aOrder !== undefined) {\n return -1;\n } else if (bOrder !== undefined) {\n return 1;\n }\n return a.localeCompare(b);\n });\n return sorted;\n}\n","/*\n * csl.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { parseYamlNodes } from './yaml';\nimport { crossRefTypeToCSLType } from './crossref';\nimport { EditorUI } from './ui';\nimport { EditorUIImages } from './ui-images';\n\nexport interface CSL {\n // The id. This is technically required, but some providers (like crossref) don't provide\n // one\n id?: string;\n\n // Enumeration, one of the type ids from https://api.crossref.org/v1/types\n type: string;\n\n // An item key that may be used to identify this item\n key?: string;\n\n // Name of work's publisher\n publisher?: string;\n\n // Title\n title?: string;\n\n // DOI of the work\n DOI?: string;\n\n // URL form of the work's DOI\n URL?: string;\n\n // Array of Contributors\n author?: CSLName[];\n\n // Earliest of published-print and published-online\n issued?: CSLDate;\n\n // Full titles of the containing work (usually a book or journal)\n 'container-title'?: string;\n\n // Short titles of the containing work (usually a book or journal)\n 'short-container-title'?: string;\n\n // Issue number of an article's journal\n issue?: string;\n\n // Volume number of an article's journal\n volume?: string;\n\n // Pages numbers of an article within its journal\n page?: string;\n\n // These properties are often not included in CSL entries and are here\n // primarily because they may need to be sanitized\n ISSN?: string;\n ISBN?: string;\n 'original-title'?: string;\n 'short-title'?: string;\n subtitle?: string;\n subject?: string;\n archive?: string;\n license?: [];\n}\n\nexport interface CSLName {\n family: string;\n given: string;\n literal?: string;\n}\n\nexport interface CSLDate {\n 'date-parts'?: Array<[number, number?, number?]>;\n raw?: string;\n}\n\n// Crossref sends some items back with invalid data types in the CSL JSON\n// This appears to tend to happen the most frequently with fields that CrossRef\n// stores as Arrays which are not properly flatted to strings as Pandoc cite-proc expects.\n// This will flatten any of these fields to the first element of the array\nexport function sanitizeForCiteproc(csl: CSL): CSL {\n // This field list was create speculatively, so may contain fields that do not require\n // sanitization (or may omit fields that require it).\n const sanitizeProperties = [\n 'ISSN',\n 'ISBN',\n 'title',\n 'subject',\n 'archive',\n 'original-title',\n 'short-title',\n 'subtitle',\n 'container-title',\n 'short-container-title',\n 'license'\n ];\n const cslAny: { [key: string]: any } = {\n ...csl,\n };\n const keys = Object.keys(cslAny);\n keys\n .filter(key => sanitizeProperties.includes(key))\n .forEach(property => {\n const value = cslAny[property];\n if (value && Array.isArray(value)) {\n if (value.length > 0) {\n cslAny[property] = value[0];\n } else {\n cslAny[property] = undefined;\n }\n }\n return cslAny;\n });\n\n // Strip any raw date representations\n if (cslAny.issued?.raw) {\n delete cslAny.issued.raw;\n }\n\n // Pubmed and others may included license information (including date ranges and more)\n // which will not be properly parsed by Pandoc (when writing to the bibliography). Remove\n if (cslAny.license) {\n delete cslAny.license;\n }\n\n // Datacite and others may include a 'contributor' field which should be an array of author types\n // however, pandoc can't properly process contributor field\n if (cslAny.contributor) {\n delete cslAny.contributor;\n }\n\n // pandoc-citeproc performance is extremely poor with large abstracts. As a result, purge this property\n delete cslAny.abstract;\n delete cslAny.id;\n\n // Ensure only valid CSL types make it through\n cslAny.type = ensureValidCSLType(cslAny.type);\n\n return cslAny as CSL;\n}\n\n// Crossref and other sources may allow invalid types to leak through\n// (for example, this DOI 10.5962/bhl.title.5326 is of a monograph)\n// and the type will leak through as monograph. This function will verify\n// that the type is a CSL type and if it not, do its best to map the type\n// to a valid CSL type\nexport function ensureValidCSLType(type: string): string {\n if (Object.values(cslTypes).includes(type)) {\n // This is a valid type\n return type;\n } else {\n return crossRefTypeToCSLType(type);\n }\n}\n\nexport function cslFromDoc(doc: ProsemirrorNode): string | undefined {\n // read the Yaml blocks from the document\n const parsedYamlNodes = parseYamlNodes(doc);\n\n const cslParsedYamls = parsedYamlNodes.filter(\n parsedYaml => parsedYaml.yaml !== null && typeof parsedYaml.yaml === 'object' && parsedYaml.yaml.csl,\n );\n\n // Look through any yaml nodes to see whether any contain csl information\n if (cslParsedYamls.length > 0) {\n // Pandoc uses the last csl block (whether or not it shares a yaml block with the\n // bibliographies element that pandoc will ultimately use) so just pick the last csl\n // block.\n const cslParsedYaml = cslParsedYamls[cslParsedYamls.length - 1];\n const cslFile = cslParsedYaml.yaml.csl;\n return cslFile;\n }\n return undefined;\n}\n\n// Converts a csl date to an EDTF date.\n// See https://www.loc.gov/standards/datetime/\n// Currently omits time component so this isn't truly level 0\nexport function cslDateToEDTFDate(date: CSLDate) {\n if (date['date-parts']) {\n const paddedParts = date['date-parts'][0].map(part => {\n const partStr = part?.toString();\n if (partStr?.length === 1) {\n return `0${partStr}`;\n }\n return partStr;\n });\n return paddedParts.join('-');\n }\n}\n\nexport function imageForType(images: EditorUIImages, type: string): [string?, string?] {\n switch (type) {\n case cslTypes.article:\n case cslTypes.articleJournal:\n case cslTypes.articleMagazine:\n case cslTypes.articleNewspaper:\n case cslTypes.paperConference:\n case cslTypes.review:\n case cslTypes.reviewBook:\n return [images.citations?.article, images.citations?.article_dark];\n case cslTypes.bill:\n case cslTypes.legislation:\n case cslTypes.legalCase:\n case cslTypes.treaty:\n return [images.citations?.legal, images.citations?.legal_dark];\n case cslTypes.book:\n case cslTypes.chapter:\n case cslTypes.manuscript:\n case cslTypes.thesis:\n return [images.citations?.book, images.citations?.book_dark];\n case cslTypes.broadcast:\n return [images.citations?.broadcast, images.citations?.broadcast_dark];\n case cslTypes.dataset:\n return [images.citations?.data, images.citations?.data_dark];\n case cslTypes.entry:\n case cslTypes.entryDictionary:\n case cslTypes.entryEncylopedia:\n return [images.citations?.entry, images.citations?.entry_dark];\n case cslTypes.figure:\n case cslTypes.graphic:\n return [images.citations?.image, images.citations?.image_dark];\n case cslTypes.map:\n return [images.citations?.map, images.citations?.map_dark];\n case cslTypes.motionPicture:\n return [images.citations?.movie, images.citations?.movie_dark];\n case cslTypes.musicalScore:\n case cslTypes.song:\n return [images.citations?.song, images.citations?.song_dark];\n case cslTypes.post:\n case cslTypes.postWeblog:\n case cslTypes.webpage:\n return [images.citations?.web, images.citations?.web_dark];\n case cslTypes.paperConference:\n case cslTypes.interview:\n case cslTypes.pamphlet:\n case cslTypes.personalCommunication:\n case cslTypes.report:\n case cslTypes.speech:\n default:\n return [images.citations?.other, images.citations?.other_dark];\n }\n}\n\nexport const cslTypes = {\n article: 'article',\n articleMagazine: 'article-magazine',\n articleNewspaper: 'article-newspaper',\n articleJournal: 'article-journal',\n bill: 'bill',\n book: 'book',\n broadcast: 'broadcast',\n chapter: 'chapter',\n dataset: 'dataset',\n entry: 'entry',\n entryDictionary: 'entry-dictionary',\n entryEncylopedia: 'entry-encyclopedia',\n figure: 'figure',\n graphic: 'graphic',\n interview: 'interview',\n legislation: 'legislation',\n legalCase: 'legal_case',\n manuscript: 'manuscript',\n map: 'map',\n motionPicture: 'motion_picture',\n musicalScore: 'musical_score',\n pamphlet: 'pamphlet',\n paperConference: 'paper-conference',\n patent: 'patent',\n post: 'post',\n postWeblog: 'post-weblog',\n personalCommunication: 'personal_communication',\n report: 'report',\n review: 'review',\n reviewBook: 'review-book',\n song: 'song',\n speech: 'speech',\n thesis: 'thesis',\n treaty: 'treaty',\n webpage: 'webpage',\n};\n","/*\n * crossref.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorUI } from './ui';\nimport { cslTypes } from './csl';\n\n// https://github.com/CrossRef/rest-api-doc\nexport interface CrossrefServer {\n works: (query: string) => Promise<CrossrefMessage<CrossrefWork>>;\n}\n\nexport const kCrossrefItemsPerPage = 'items-per-page';\nexport const kCrossrefStartIndex = 'start-index';\nexport const kCrossrefSearchTerms = 'search-terms';\nexport const kCrossrefTotalResults = 'total-results';\n\nexport interface CrossrefMessage<T> {\n items: T[];\n [kCrossrefItemsPerPage]: number;\n query: {\n [kCrossrefStartIndex]: number;\n [kCrossrefSearchTerms]: string;\n };\n [kCrossrefTotalResults]: number;\n}\n\n// https://github.com/Crossref/rest-api-doc/blob/master/api_format.md#work\nexport interface CrossrefWork {\n // Name of work's publisher\n publisher: string;\n\n // Work titles, including translated titles\n title?: string[];\n\n // DOI of the work\n DOI: string;\n\n // URL form of the work's DOI\n URL: string;\n\n // Enumeration, one of the type ids from https://api.crossref.org/v1/types\n type: string;\n\n // Array of Contributors\n author: CrossrefContributor[];\n\n // Earliest of published-print and published-online\n issued: CrossrefDate;\n\n // Full titles of the containing work (usually a book or journal)\n 'container-title'?: string;\n\n // Short titles of the containing work (usually a book or journal)\n 'short-container-title'?: string;\n\n // Issue number of an article's journal\n issue: string;\n\n // Volume number of an article's journal\n volume: string;\n\n // Pages numbers of an article within its journal\n page: string;\n}\n\nexport interface CrossrefContributor {\n family: string;\n given?: string;\n}\n\n/* (Partial Date) Contains an ordered array of year, month, day of month. Only year is required. \nNote that the field contains a nested array, e.g. [ [ 2006, 5, 19 ] ] to conform \nto citeproc JSON dates */\nexport interface CrossrefDate {\n 'date-parts': Array<[number, number?, number?]>;\n}\n\nexport function imageForCrossrefType(ui: EditorUI, type: string): [string?, string?] {\n switch (type) {\n case crossRefTypes.monograph:\n case crossRefTypes.report:\n case crossRefTypes.journalArticle:\n case crossRefTypes.journalVolume:\n case crossRefTypes.journal:\n case crossRefTypes.journalIssue:\n case crossRefTypes.proceedingsArticle:\n case crossRefTypes.dissertation:\n case crossRefTypes.reportSeries:\n return [ui.images.citations?.article, ui.images.citations?.article_dark];\n case crossRefTypes.bookSection:\n case crossRefTypes.bookPart:\n case crossRefTypes.bookSeries:\n case crossRefTypes.editedBook:\n case crossRefTypes.bookChapter:\n case crossRefTypes.book:\n case crossRefTypes.bookSet:\n case crossRefTypes.bookTrack:\n case crossRefTypes.referenceBook:\n return [ui.images.citations?.book, ui.images.citations?.book_dark];\n case crossRefTypes.dataset:\n return [ui.images.citations?.data, ui.images.citations?.data_dark];\n case crossRefTypes.referenceEntry:\n return [ui.images.citations?.entry, ui.images.citations?.entry_dark];\n case crossRefTypes.postedContent:\n return [ui.images.citations?.web, ui.images.citations?.web_dark];\n case crossRefTypes.other:\n case crossRefTypes.standard:\n case crossRefTypes.standardSeries:\n case crossRefTypes.peerReview:\n case crossRefTypes.component:\n case crossRefTypes.proceedingsSeries:\n case crossRefTypes.proceedings:\n default:\n return [ui.images.citations?.other, ui.images.citations?.other_dark];\n }\n}\n\nexport function prettyType(ui: EditorUI, type: string): string {\n switch (type) {\n case crossRefTypes.monograph:\n return ui.context.translateText('Monograph');\n case crossRefTypes.report:\n return ui.context.translateText('Report');\n case crossRefTypes.journalArticle:\n return ui.context.translateText('Journal');\n case crossRefTypes.journalVolume:\n return ui.context.translateText('Journal Volume');\n case crossRefTypes.journal:\n return ui.context.translateText('Journal');\n case crossRefTypes.journalIssue:\n return ui.context.translateText('Journal Issue');\n case crossRefTypes.proceedingsArticle:\n case crossRefTypes.proceedingsSeries:\n case crossRefTypes.proceedings:\n return ui.context.translateText('Proceedings');\n case crossRefTypes.dissertation:\n return ui.context.translateText('Dissertation');\n case crossRefTypes.reportSeries:\n return ui.context.translateText('Series');\n case crossRefTypes.bookSection:\n return ui.context.translateText('Book Section');\n case crossRefTypes.bookPart:\n return ui.context.translateText('Book Part');\n case crossRefTypes.bookSeries:\n return ui.context.translateText('Book Series');\n case crossRefTypes.bookChapter:\n return ui.context.translateText('Book Chapter');\n case crossRefTypes.editedBook:\n case crossRefTypes.bookSet:\n case crossRefTypes.bookTrack:\n case crossRefTypes.referenceBook:\n return ui.context.translateText('Book');\n case crossRefTypes.dataset:\n return ui.context.translateText('Dataset');\n case crossRefTypes.referenceEntry:\n return ui.context.translateText('Entry');\n case crossRefTypes.postedContent:\n return ui.context.translateText('Content');\n case crossRefTypes.other:\n case crossRefTypes.standard:\n case crossRefTypes.standardSeries:\n case crossRefTypes.peerReview:\n case crossRefTypes.component:\n return ui.context.translateText('Other');\n default:\n return type;\n }\n}\n\nexport function crossRefTypeToCSLType(type: string): string {\n // This isn't a valid type, try to map it to a valid type\n switch (type) {\n case crossRefTypes.bookSection:\n case crossRefTypes.bookChapter:\n case crossRefTypes.bookPart:\n return cslTypes.chapter;\n case crossRefTypes.book:\n case crossRefTypes.bookSet:\n case crossRefTypes.bookTrack:\n case crossRefTypes.referenceBook:\n case crossRefTypes.bookSeries:\n case crossRefTypes.editedBook:\n return cslTypes.book;\n case crossRefTypes.report:\n return cslTypes.report;\n case crossRefTypes.peerReview:\n return cslTypes.review;\n case crossRefTypes.journalArticle:\n case crossRefTypes.journalVolume:\n case crossRefTypes.journal:\n case crossRefTypes.journalIssue:\n return cslTypes.articleJournal;\n case crossRefTypes.referenceEntry:\n return cslTypes.entry;\n case crossRefTypes.monograph:\n case crossRefTypes.proceedingsArticle:\n case crossRefTypes.component:\n case crossRefTypes.other:\n return cslTypes.article;\n case crossRefTypes.proceedings:\n case crossRefTypes.proceedingsSeries:\n return cslTypes.paperConference;\n case crossRefTypes.reportSeries:\n return cslTypes.report;\n case crossRefTypes.standard:\n case crossRefTypes.standardSeries:\n return cslTypes.patent;\n case crossRefTypes.postedContent:\n return cslTypes.webpage;\n case crossRefTypes.dissertation:\n return cslTypes.thesis;\n case crossRefTypes.dataset:\n return cslTypes.dataset;\n default:\n return cslTypes.article;\n }\n}\n\nexport const crossRefTypes = {\n bookSection: 'book-section',\n monograph: 'monograph',\n report: 'report',\n peerReview: 'peer-review',\n bookTrack: 'book-track',\n journalArticle: 'journal-article',\n bookPart: 'book-part',\n other: 'other',\n book: 'book',\n journalVolume: 'journal-volume',\n bookSet: 'book-set',\n referenceEntry: 'reference-entry',\n proceedingsArticle: 'proceedings-article',\n journal: 'journal',\n component: 'component',\n bookChapter: 'book-chapter',\n proceedingsSeries: 'proceedings-series',\n reportSeries: 'report-series',\n proceedings: 'proceedings',\n standard: 'standard',\n referenceBook: 'reference-book',\n postedContent: 'posted-content',\n journalIssue: 'journal-issue',\n dissertation: 'dissertation',\n dataset: 'dataset',\n bookSeries: 'book-series',\n editedBook: 'edited-book',\n standardSeries: 'standard-series',\n};\n","import { Schema, NodeSpec, MarkSpec, DOMParser, Node as ProsemirrorNode } from 'prosemirror-model';\n\nconst kCslDOMParser = cslDOMParser();\n\nexport function cslTextToProsemirrorNode(text: string): ProsemirrorNode | null {\n const domParser = new window.DOMParser();\n const doc = domParser.parseFromString(text, 'text/html');\n if (doc) {\n const pmNode = kCslDOMParser.parse(doc.body, { preserveWhitespace: 'full' });\n return pmNode;\n } else {\n return null;\n }\n}\n\nexport function cslDOMParser(): DOMParser {\n return DOMParser.fromSchema(cslSchema());\n}\n\nfunction cslSchema() {\n const nodes: { [name: string]: NodeSpec } = {\n doc: {\n content: 'inline*',\n },\n text: {\n group: 'inline',\n toDOM(node: ProsemirrorNode): any {\n return node.text;\n },\n },\n };\n const marks: { [name: string]: MarkSpec } = {};\n marks.strong = tagSpec('b');\n marks.em = tagSpec('i');\n marks.sup = tagSpec('sup');\n marks.sub = tagSpec('sub');\n marks.smallcaps = spanSpec('smallcaps');\n marks.nocase = spanSpec('nocase');\n\n // return schema\n return new Schema({\n nodes,\n marks,\n });\n}\n\nfunction tagSpec(tag: string): MarkSpec {\n return {\n parseDOM: [{ tag }],\n toDOM() {\n return [tag];\n },\n };\n}\n\nfunction spanSpec(clz: string): MarkSpec {\n return {\n parseDOM: [{ tag: `span[class*='${clz}']` }],\n toDOM() {\n return ['span', { class: clz }];\n },\n };\n}\n","/*\n * bibtex.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { NodeArray, RangeArray, NameDictObject, TextNodeObject } from 'biblatex-csl-converter';\nimport { FieldMap } from './fields';\nimport { typeMapping } from './types';\nimport { FormattingTags } from './formatting';\nimport characters from './characters';\nimport { BibDB, EntryObject } from '../bibliography/bibDB';\n\nexport interface Config {\n traditionalNames?: boolean;\n exportUnexpectedFields?: boolean;\n}\n\nexport interface Entry {\n type: string;\n key: string;\n values?: { [key: string]: string };\n}\n\ninterface Warning {\n type: string;\n variable: string;\n}\n\nexport function bibDbToBibTeX(bibDB: BibDB, config: Config = {}) {\n // Keys of items to export\n const keysToExport = Object.keys(bibDB);\n\n // The final entries\n const bibtexEntries: Entry[] = [];\n\n // Go through each item and compose the entry and\n // append all the fields with BibTeX specific formatting\n keysToExport?.forEach(key => {\n const entryObject: EntryObject = bibDB[key];\n\n const cslType = entryObject.csl_type;\n const bibTexType = cslType ? typeMapping(cslType).bibtex : entryObject.bib_type;\n\n const bibtexEntry: Entry = {\n type: bibTexType,\n key: entryObject.entry_key,\n };\n\n // The formatted output fields for this entry\n const outputFields: { [key: string]: string } = {};\n\n // All the fields for this entry\n const fieldsForExport: Record<string, any> = entryObject.fields;\n Object.keys(fieldsForExport).forEach(fieldKey => {\n // Lookup the field information in the mapping\n // (maps CSL fields names to their peer BibTeX types)\n const fieldType = FieldMap[fieldKey];\n\n // This is a well understood field type\n if (fieldType) {\n const type = fieldType.type;\n\n // Read the type (either as raw value or passing the type to look it up)\n const typeReader = fieldType.bibtex;\n const bibtexKey = typeof typeReader === 'string' ? typeReader : typeReader(bibTexType);\n const bibtexValue = fieldsForExport[fieldKey];\n\n switch (type) {\n case 'f_date':\n // Output the raw date value\n outputFields[bibtexKey] = bibtexValue;\n\n // Also output the year and month, if possible\n // The value being parsed is a EDTF 1.0 level 0/1 compliant string. (2000-12-31)\n const parts: string[] = bibtexValue.split('-');\n if (parts.length > 0) {\n outputFields.year = parts[0];\n if (parts.length > 1) {\n outputFields.month = parts[1];\n }\n }\n\n break;\n case 'f_integer':\n outputFields[bibtexKey] = formatText(bibtexValue);\n break;\n case 'f_key':\n outputFields[bibtexKey] = formatKey(bibtexValue, bibtexKey);\n break;\n case 'f_literal':\n case 'f_long_literal':\n outputFields[bibtexKey] = formatText(bibtexValue);\n break;\n case 'l_range':\n outputFields[bibtexKey] = formatRange(bibtexValue);\n break;\n case 'f_title':\n outputFields[bibtexKey] = formatText(bibtexValue);\n break;\n case 'f_uri':\n case 'f_verbatim':\n // Strip any braces from verbatims\n outputFields[bibtexKey] = bibtexValue.replace(/{|}/g, '');\n break;\n case 'l_key':\n outputFields[bibtexKey] = escapeNonAscii(\n bibtexValue.map((k: string) => formatKey(k, bibtexKey)).join(' and '),\n );\n break;\n case 'l_literal':\n outputFields[bibtexKey] = bibtexValue.map((text: NodeArray) => formatText(text)).join(' and ');\n break;\n case 'l_name':\n outputFields[bibtexKey] = formatNames(bibtexValue);\n break;\n case 'l_tag':\n outputFields[bibtexKey] = escapeNonAscii(bibtexValue.join(', '));\n break;\n default:\n // This is a field type that we don't understand, skip it\n break;\n }\n }\n });\n\n bibtexEntry.values = outputFields;\n bibtexEntries.push(bibtexEntry);\n });\n return toBibtex(bibtexEntries);\n}\n\n// Writes BibTex\nconst toBibtex = (entries: Entry[]): string => {\n const length = entries.length;\n let bibTexStr = '';\n for (let i = 0; i < length; i++) {\n // The entry we're writing\n const entry = entries[i];\n\n // Write the key and open the entry\n bibTexStr = bibTexStr + `@${entry.type}{${entry.key}`;\n\n // The fields for this item\n if (entry.values && Object.keys(entry.values).length > 0) {\n sortedKeys(entry.values).forEach(key => {\n if (entry.values) {\n const rawValue = entry.values[key];\n const value = `{${rawValue}}`;\n\n // Strip empty braces\n // TODO: If we support variables, we may need to clean this\n // const cleanedValue = value.replace(/\\{\\} # /g, '').replace(/# \\{\\}/g, '');\n bibTexStr = bibTexStr + `,\\n\\t${key} = ${value}`;\n }\n });\n } else {\n // There are no values, we need to minimally place a ',' at the end of the id\n // If we omit this, pandoc cannot parse the bibliography\n bibTexStr = bibTexStr + \",\";\n }\n\n // Close the entry\n bibTexStr = bibTexStr + '\\n}';\n }\n return bibTexStr;\n};\n\nconst sortedKeys = (fields: { [key: string]: string }) => {\n let pos = 1;\n const keySortOrder: { [id: string]: number } = {};\n keySortOrder.title = pos++;\n keySortOrder.author = pos++;\n keySortOrder.editor = pos++;\n keySortOrder.year = pos++;\n keySortOrder.month = pos++;\n keySortOrder.date = pos++;\n keySortOrder.journal = pos++;\n keySortOrder.booktitle = pos++;\n keySortOrder.publisher = pos++;\n keySortOrder.howpublished = pos++;\n keySortOrder.pages = pos++;\n keySortOrder.series = pos++;\n keySortOrder.volume = pos++;\n keySortOrder.chapter = pos++;\n keySortOrder.number = pos++;\n keySortOrder.edition = pos++;\n keySortOrder.issue = pos++;\n keySortOrder.doi = pos++;\n keySortOrder.url = pos++;\n keySortOrder.abstract = pos++;\n keySortOrder.note = pos++;\n\n const keys = Object.keys(fields);\n const sorted = keys.sort((a, b) => {\n const aOrder = keySortOrder[a.toLowerCase()];\n const bOrder = keySortOrder[b.toLowerCase()];\n if (aOrder && bOrder) {\n return aOrder - bOrder;\n } else if (aOrder !== undefined) {\n return -1;\n } else if (bOrder !== undefined) {\n return 1;\n }\n return a.localeCompare(b);\n });\n return sorted;\n};\n\n// Converts any non asciii characters to their LaTeX representations\nconst escapeNonAscii = (value: string): string => {\n let result = '';\n\n // Split the string in a way that will maintain unicode characters\n const chars = Array.from(value);\n chars.forEach(c => {\n const char = c.codePointAt(0);\n // Look for a LaTeX replace in the character mapping\n if (char) {\n const characterMap = characters[char];\n if (characterMap) {\n // Found one, emit the LaTeX\n // Use the braces to group the expression, unless the character replacement explicitly\n // doesn't want to be grouped\n result = result + (characterMap.ungrouped ? characterMap.latex : `{${characterMap.latex}}`);\n } else {\n // No LaTeX replacement, just emit the character\n result = result + String.fromCodePoint(char);\n }\n } else {\n // A position which has no codepoint. what on earth is this?\n result = result + '?';\n }\n });\n return result;\n};\n\n// Formats keys\nconst formatKey = (value: string | NodeArray, fieldKey: string) => {\n if (typeof value === 'string') {\n const fieldType = FieldMap[fieldKey];\n // If the field is an array, we can just emit the value\n // Otherwise, we should treat options as a keyed object and lookup\n // the bibtex value for this value\n if (Array.isArray(fieldType.options)) {\n return escapeNonAscii(value);\n } else if (fieldType.options) {\n return escapeNonAscii(fieldType.options[value].bibtex);\n } else {\n return escapeNonAscii(value);\n }\n } else {\n return formatText(value);\n }\n};\n\n// Formats text\nconst formatText = (nodes: NodeArray): string => {\n let formattedText = '';\n let lastNodeMarks: string[] = [];\n\n // This empty node at the end will cause us to go through the loop\n // after the last 'real' node and close out any open marks.\n const textNodes = nodes.concat({ type: 'text', text: '' });\n\n textNodes.forEach(node => {\n /*\n // TODO: Do we need to deal with this (and if so, we need to re-add that escape routine)\n if (node.type === 'variable') {\n // This is an undefined variable\n // This should usually not happen, as CSL doesn't know what to\n // do with these. We'll put them into an unsupported tag.\n latex += `} # ${node.attrs.variable} # {`\n this.warnings.push({\n type: 'undefined_variable',\n variable: node.attrs.variable\n })\n return\n }\n */\n\n const thisNodeMarks: string[] = [];\n if (node.marks) {\n // Figure out the new marks for this node\n // TODO: Do we need to re-enable math mode for these low level sup/sub nodes?\n // let mathEnabled = false;\n node.marks.forEach(mark => {\n // We need to activate mathmode for the lowest level sub/sup node.\n // Don't activate math mode for the lowest level node\n /*\n if ((mark.type === 'sup' || mark.type === 'sub') && !mathEnabled) {\n thisNodeMarks.push('math');\n thisNodeMarks.push(mark.type);\n mathEnabled = true;\n } else \n */\n\n if (mark.type === 'nocase') {\n // No case should be the outer mark\n thisNodeMarks.unshift(mark.type);\n } else {\n // regular old mark\n thisNodeMarks.push(mark.type);\n }\n });\n }\n\n // Close any marks that aren't still open in this node\n let closing = false;\n const closeTags: string[] = [];\n lastNodeMarks.forEach((mark, index) => {\n if (mark !== thisNodeMarks[index]) {\n closing = true;\n }\n if (closing) {\n const closeTag =\n lastNodeMarks[0] !== 'nocase' && FormattingTags[mark].open[0] === '\\\\'\n ? `${FormattingTags[mark].close}}`\n : FormattingTags[mark].close;\n closeTags.push(closeTag);\n }\n });\n\n // Emit the close tags for the previous (last to first)\n closeTags.reverse();\n formattedText = formattedText + closeTags.join('');\n\n // Emit the open tags\n let opening = false;\n let doNotEscape = false;\n thisNodeMarks.forEach((mark, index) => {\n if (mark !== lastNodeMarks[index]) {\n opening = true;\n }\n if (opening) {\n // If not in a nocase, we can add protective brace\n if (thisNodeMarks[0] !== 'nocase' && FormattingTags[mark].open[0] === '\\\\') {\n formattedText = formattedText + '{';\n }\n formattedText = formattedText + FormattingTags[mark].open;\n if (FormattingTags[mark].verbatim) {\n doNotEscape = true;\n }\n }\n });\n\n const textNode = node as TextNodeObject;\n if (doNotEscape) {\n formattedText = formattedText + textNode.text;\n } else {\n formattedText = formattedText + escapeNonAscii(textNode.text);\n }\n lastNodeMarks = thisNodeMarks;\n });\n return formattedText;\n};\n\n// Formats ranges\nconst formatRange = (value: RangeArray[]): string => {\n // The correct symbol for a range of numbers is an en-dash, which in LaTeX is usually input as --.\n return value.map(range => range.map(text => formatText(text)).join('--')).join(',');\n};\n\n// Formats author values\nconst formatNames = (names: NameDictObject[]): string => {\n const formattedNames: string[] = [];\n names.forEach(name => {\n if (name.literal) {\n // Use the literal\n const literal = formatText(name.literal);\n if (literal.length) {\n formattedNames.push(`{${literal}}`);\n }\n } else {\n // Compose the name\n // http://www.texfaq.org/FAQ-manyauthor\n const family = name.family ? formatText(name.family) : '';\n const given = name.given ? formatText(name.given) : '';\n const suffix = name.suffix ? formatText(name.suffix) : false;\n const prefix = name.prefix ? formatText(name.prefix) : false;\n\n if (suffix && prefix) {\n formattedNames.push(`${protect(`${prefix} ${family}`)}, ${protect(suffix)}, ${protect(given)}`);\n } else if (suffix) {\n formattedNames.push(`${protect(family)}, ${protect(suffix)}, ${protect(given)}`);\n } else if (prefix) {\n formattedNames.push(`${protect(`${prefix} ${family}`)}, ${protect(given)}`);\n } else {\n formattedNames.push(`${protect(family)}, ${protect(given)}`);\n }\n }\n });\n return formattedNames.join(' and ');\n};\n\nconst kBibtexSafeRegex = /^[a-zA-Z0-9 .-]*$/;\nfunction protect(str: string) {\n if (str.match(kBibtexSafeRegex)) {\n return str;\n } else {\n return `{${str}}`;\n }\n}","/*\n * fields.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { lanagugeMappings } from './language';\n\nexport interface Field {\n type: string;\n bibtex: ((bibTexType: string) => string) | string;\n csl: string | undefined;\n options?: string[] | { [key: string]: { bibtex: string } } | undefined;\n}\n\n// CSL Field (variable) definitions from\n// https://docs.citationstyles.org/en/stable/specification.html#appendix-iv-variables\n\n// TODO: bibtex: string | (type: string) => string\n//\n\nexport const FieldMap: { [key: string]: Field } = {\n abstract: {\n type: 'f_long_literal',\n bibtex: 'abstract',\n csl: 'abstract',\n },\n author: {\n type: 'l_name',\n bibtex: 'author',\n csl: 'author',\n },\n bookauthor: {\n type: 'l_name',\n bibtex: 'author',\n csl: 'container-author',\n },\n containerTitle: {\n type: 'f_title',\n bibtex: (bibTexType: string) => {\n switch (bibTexType) {\n case 'conference':\n case 'inproceedings':\n case 'incollection':\n return 'booktitle';\n default:\n return 'journal';\n }\n },\n csl: 'container-title',\n },\n chapter: {\n type: 'f_literal',\n bibtex: 'chapter',\n csl: 'chapter-number',\n },\n date: {\n type: 'f_date',\n bibtex: 'date',\n csl: 'issued',\n },\n doi: {\n type: 'f_verbatim',\n bibtex: 'doi',\n csl: 'DOI',\n },\n edition: {\n type: 'f_integer',\n bibtex: 'edition',\n csl: 'edition',\n },\n editor: {\n type: 'l_name',\n bibtex: 'editor',\n csl: 'editor',\n },\n eventdate: {\n type: 'f_date',\n bibtex: 'date',\n csl: 'event-date',\n },\n eventtitle: {\n type: 'f_title',\n bibtex: 'title',\n csl: 'event',\n },\n howpublished: {\n type: 'f_literal',\n bibtex: 'howpublished',\n csl: 'medium',\n },\n issue: {\n type: 'f_literal',\n bibtex: 'issue',\n csl: 'issue',\n },\n journaltitle: {\n type: 'f_literal',\n bibtex: 'journal',\n csl: 'container-title',\n },\n // Special - not really in CSL or BibTeX\n langid: {\n type: 'f_key',\n bibtex: 'langid',\n csl: 'language',\n options: lanagugeMappings,\n },\n location: {\n type: 'l_literal',\n bibtex: 'address',\n csl: 'publisher-place',\n },\n note: {\n type: 'f_literal',\n bibtex: 'note',\n csl: 'note',\n },\n number: {\n type: 'f_literal',\n bibtex: 'number',\n csl: 'collection-number',\n },\n pages: {\n type: 'l_range',\n bibtex: 'pages',\n csl: 'page',\n },\n publisher: {\n type: 'l_literal',\n bibtex: 'publisher',\n csl: 'publisher',\n },\n series: {\n type: 'f_literal',\n bibtex: 'series',\n csl: 'collection-title',\n },\n title: {\n type: 'f_title',\n bibtex: 'title',\n csl: 'title',\n },\n url: {\n type: 'f_uri',\n bibtex: 'url',\n csl: 'URL',\n },\n volume: {\n type: 'f_literal',\n bibtex: 'volume',\n csl: 'volume',\n },\n};\n","/*\n * language.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n// Support emitting languages using 'babel' names\n// This isn't strictly supported by pure BibTex\n// but this seems likely to helpful to include\nexport const lanagugeMappings = {\n acadian: {\n csl: 'fr-CA',\n bibtex: 'acadian',\n },\n afrikaans: {\n csl: 'af-ZA',\n bibtex: 'afrikaans',\n },\n arabic: {\n csl: 'ar',\n bibtex: 'arabic',\n },\n basque: {\n csl: 'eu',\n bibtex: 'basque',\n },\n bulgarian: {\n csl: 'bg-BG',\n bibtex: 'bulgarian',\n },\n catalan: {\n csl: 'ca-AD',\n bibtex: 'catalan',\n },\n chinese: {\n csl: 'zh-CN',\n bibtex: 'pinyin',\n },\n croatian: {\n csl: 'hr-HR',\n bibtex: 'croatian',\n },\n czech: {\n csl: 'cs-CZ',\n bibtex: 'czech',\n },\n danish: {\n csl: 'da-DK',\n bibtex: 'danish',\n },\n dutch: {\n csl: 'nl-NL',\n bibtex: 'dutch',\n },\n auenglish: {\n csl: 'en-GB',\n bibtex: 'australian',\n },\n caenglish: {\n csl: 'en-US',\n bibtex: 'canadian',\n },\n nzenglish: {\n csl: 'en-GB',\n bibtex: 'newzealand',\n },\n ukenglish: {\n csl: 'en-GB',\n bibtex: 'ukenglish',\n },\n usenglish: {\n csl: 'en-US',\n bibtex: 'usenglish',\n },\n estonian: {\n csl: 'et-EE',\n bibtex: 'estonian',\n },\n finnish: {\n csl: 'fi-FI',\n bibtex: 'finnish',\n },\n french: {\n csl: 'fr-FR',\n bibtex: 'french',\n },\n cafrench: {\n csl: 'fr-CA',\n bibtex: 'canadien',\n },\n german: {\n csl: 'de-DE',\n bibtex: 'ngerman',\n },\n atgerman: {\n csl: 'de-AT',\n bibtex: 'naustrian',\n },\n greek: {\n csl: 'el-GR',\n bibtex: 'greek',\n },\n hebrew: {\n csl: 'he-IL',\n bibtex: 'hebrew',\n },\n hungarian: {\n csl: 'hu-HU',\n bibtex: 'hungarian',\n },\n icelandic: {\n csl: 'is-IS',\n bibtex: 'icelandic',\n },\n italian: {\n csl: 'it-IT',\n bibtex: 'italian',\n },\n japanese: {\n csl: 'ja-JP',\n bibtex: 'japanese',\n },\n latin: {\n csl: 'la',\n bibtex: 'latin',\n },\n latvian: {\n csl: 'lv-LV',\n bibtex: 'latvian',\n },\n lithuanian: {\n csl: 'lt-LT',\n bibtex: 'lithuanian',\n },\n magyar: {\n csl: 'hu-HU',\n bibtex: 'magyar',\n },\n mongolian: {\n csl: 'mn-MN',\n bibtex: 'mongolian',\n },\n norwegian: {\n csl: 'nb-NO',\n bibtex: 'norsk',\n },\n newnorwegian: {\n csl: 'nn-NO',\n bibtex: 'nynorsk',\n },\n farsi: {\n csl: 'fa-IR',\n bibtex: 'farsi',\n },\n polish: {\n csl: 'pl-PL',\n bibtex: 'polish',\n },\n portuguese: {\n csl: 'pt-PT',\n bibtex: 'portuguese',\n },\n brportuguese: {\n csl: 'pt-BR',\n bibtex: 'brazilian',\n },\n romanian: {\n csl: 'ro-RO',\n bibtex: 'romanian',\n },\n russian: {\n csl: 'ru-RU',\n bibtex: 'russian',\n },\n serbian: {\n csl: 'sr-RS',\n bibtex: 'serbian',\n },\n cyrillicserbian: {\n csl: 'sr-RS',\n bibtex: 'serbianc',\n },\n slovak: {\n csl: 'sk-SK',\n bibtex: 'slovak',\n },\n slovene: {\n csl: 'sl-SL',\n bibtex: 'slovene',\n },\n spanish: {\n csl: 'es-ES',\n bibtex: 'spanish',\n },\n swedish: {\n csl: 'sv-SE',\n bibtex: 'swedish',\n },\n thai: {\n csl: 'th-TH',\n bibtex: 'thai',\n },\n turkish: {\n csl: 'tr-TR',\n bibtex: 'turkish',\n },\n ukrainian: {\n csl: 'uk-UA',\n bibtex: 'ukrainian',\n },\n vietnamese: {\n csl: 'vi-VN',\n bibtex: 'vietnamese',\n },\n};\n","/*\n * types.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { cslTypes } from '../csl';\n\nexport interface Type {\n bibtex: string;\n fieldsRequired: string[];\n fieldsOptional: string[];\n fieldsEitherOr: string[];\n}\n\n// Maps CSL Types to the equivalent BibTeX types.\n// Mapping derived from:\n// https://github.com/citation-style-language/styles/blob/master/bibtex.csl\nexport function typeMapping(cslType: string): Type {\n switch (cslType) {\n case cslTypes.article:\n case cslTypes.articleJournal:\n case cslTypes.articleMagazine:\n case cslTypes.articleNewspaper:\n return {\n bibtex: BibTextTypes.article.type,\n ...BibTextTypes.article.fields,\n };\n\n case cslTypes.book:\n return {\n bibtex: BibTextTypes.book.type,\n ...BibTextTypes.book.fields,\n };\n\n case cslTypes.chapter:\n return {\n bibtex: BibTextTypes.inbook.type,\n ...BibTextTypes.inbook.fields,\n };\n\n case cslTypes.thesis:\n return {\n bibtex: BibTextTypes.phdthesis.type,\n ...BibTextTypes.phdthesis.fields,\n };\n\n case cslTypes.manuscript:\n return {\n bibtex: BibTextTypes.unpublished.type,\n ...BibTextTypes.unpublished.fields,\n };\n\n case cslTypes.paperConference:\n return {\n bibtex: BibTextTypes.inproceedings.type,\n ...BibTextTypes.inproceedings.fields,\n };\n\n case cslTypes.report:\n return {\n bibtex: BibTextTypes.techreport.type,\n ...BibTextTypes.techreport.fields,\n };\n\n case cslTypes.bill:\n case cslTypes.graphic:\n case cslTypes.legalCase:\n case cslTypes.legislation:\n case cslTypes.motionPicture:\n case cslTypes.report:\n case cslTypes.song:\n default:\n return {\n bibtex: BibTextTypes.misc.type,\n ...BibTextTypes.misc.fields,\n };\n }\n}\n\nexport function bibtextTypeToCSLType(bibtexType: string) {\n switch (bibtexType) {\n case BibTextTypes.article.type:\n return cslTypes.articleJournal;\n\n case BibTextTypes.proceedings.type:\n case BibTextTypes.manual.type:\n case BibTextTypes.book.type:\n return cslTypes.book;\n\n case BibTextTypes.booklet.type:\n return cslTypes.pamphlet;\n\n case BibTextTypes.inbook.type:\n case BibTextTypes.incollection.type:\n return cslTypes.chapter;\n\n case BibTextTypes.conference.type:\n case BibTextTypes.inproceedings.type:\n return cslTypes.paperConference;\n\n case BibTextTypes.mastersthesis.type:\n case BibTextTypes.phdthesis.type:\n return cslTypes.thesis;\n\n case BibTextTypes.techreport.type:\n return cslTypes.report;\n\n case BibTextTypes.unpublished.type:\n return cslTypes.manuscript;\n\n case BibTextTypes.misc.type:\n default:\n return cslTypes.article;\n }\n}\n\n// BibTeX types and their fields\n// See https://www.openoffice.org/bibliographic/bibtex-defs.html\n// (a corrected version of Appendix B.2 of the LATEX book [2], © 1986, by Addison-Wesley.)\nexport const BibTextTypes = {\n // An article from a journal or magazine.\n article: {\n type: 'article',\n fields: {\n fieldsRequired: ['author', 'title', 'journal', 'year'],\n fieldsOptional: ['volume', 'number', 'pages', 'month', 'note'],\n fieldsEitherOr: [],\n },\n },\n // A book with an explicit publisher.\n book: {\n type: 'book',\n fields: {\n fieldsRequired: ['title', 'publisher', 'year'],\n fieldsOptional: ['volume', 'number', 'series', 'address', 'edition', 'month', 'note'],\n fieldsEitherOr: ['author', 'editor'],\n },\n },\n\n // A work that is printed and bound, but without a named publisher or sponsoring institution.\n booklet: {\n type: 'booklet',\n fields: {\n fieldsRequired: ['title'],\n fieldsOptional: ['author', 'howpublished', 'address', 'month', 'year', 'note'],\n fieldsEitherOr: [],\n },\n },\n\n // The same as inproceedings, included for Scribe compatibility.\n conference: {\n type: 'conference',\n fields: {\n fieldsRequired: ['author', 'title', 'booktitle', 'year'],\n fieldsOptional: [\n 'editor',\n 'volume',\n 'number',\n 'series',\n 'pages',\n 'address',\n 'month',\n 'organization',\n 'publisher',\n 'note',\n ],\n fieldsEitherOr: [],\n },\n },\n\n // A part of a book, which may be a chapter (or section or whatever) and/or a range of pages.\n inbook: {\n type: 'inbook',\n fields: {\n fieldsRequired: ['title', 'chapter', 'pages', 'publisher', 'year'],\n fieldsOptional: ['volume', 'number', 'series', 'type', 'address', 'edition', 'month', 'note'],\n fieldsEitherOr: ['author', 'editor'],\n },\n },\n\n // A part of a book having its own title.\n incollection: {\n type: 'incollection',\n fields: {\n fieldsRequired: ['author', 'title', 'booktitle', 'publisher', 'year'],\n fieldsOptional: [\n 'editor',\n 'volume',\n 'number',\n 'series',\n 'type',\n 'chapter',\n 'pages',\n 'address',\n 'edition',\n 'month',\n 'note',\n ],\n fieldsEitherOr: [],\n },\n },\n\n // An article in a conference proceedings.\n inproceedings: {\n type: 'inproceedings',\n fields: {\n fieldsRequired: ['author', 'title', 'booktitle', 'year'],\n fieldsOptional: [\n 'editor',\n 'volume',\n 'number',\n 'series',\n 'pages',\n 'address',\n 'month',\n 'organization',\n 'publisher',\n 'note',\n ],\n fieldsEitherOr: [],\n },\n },\n\n // Technical documentation\n manual: {\n type: 'manual',\n fields: {\n fieldsRequired: ['title'],\n fieldsOptional: ['author', 'organization', 'address', 'edition', 'month', 'year', 'note'],\n fieldsEitherOr: [],\n },\n },\n\n // A Master's thesis.\n mastersthesis: {\n type: 'mastersthesis',\n fields: {\n fieldsRequired: ['author', 'title', 'school', 'year'],\n fieldsOptional: ['type', 'address', 'month', 'note'],\n fieldsEitherOr: [],\n },\n },\n\n // Use this type when nothing else fits.\n misc: {\n type: 'misc',\n fields: {\n fieldsRequired: [],\n fieldsOptional: ['author', 'title', 'howpublished', 'month', 'year', 'note'],\n fieldsEitherOr: [],\n },\n },\n\n // A PhD thesis.\n phdthesis: {\n type: 'phdthesis',\n fields: {\n fieldsRequired: ['author', 'title', 'school', 'year'],\n fieldsOptional: ['type', 'address', 'month', 'note'],\n fieldsEitherOr: [],\n },\n },\n\n // The proceedings of a conference.\n proceedings: {\n type: 'proceedings',\n fields: {\n fieldsRequired: ['title', 'year'],\n fieldsOptional: ['editor', 'volume', 'number', 'series', 'address', 'month', 'organization', 'publisher', 'note'],\n fieldsEitherOr: [],\n },\n },\n\n // A report published by a school or other institution, usually numbered within a series.\n techreport: {\n type: 'techreport',\n fields: {\n fieldsRequired: ['author', 'title', 'institution', 'year'],\n fieldsOptional: ['type', 'number', 'address', 'month', 'note'],\n fieldsEitherOr: [],\n },\n },\n\n // A document having an author and title, but not formally published.\n unpublished: {\n type: 'unpublished',\n fields: {\n fieldsRequired: ['author', 'title', 'note'],\n fieldsOptional: ['month', 'year'],\n fieldsEitherOr: [],\n },\n },\n};\n","/*\n * formatting.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport interface FormattingTag {\n open: string;\n close: string;\n verbatim: boolean;\n}\n\n// Maps formatting tags/marks to the LaTeX replacements\n// When marks are applied to text nodes, these will be emitted in place of those marks\nexport const FormattingTags: { [key: string]: FormattingTag } = {\n strong: { open: '\\\\textbf{', close: '}', verbatim: false },\n em: { open: '\\\\emph{', close: '}', verbatim: false },\n sub: { open: '\\\\textsubscript{', close: '}', verbatim: false },\n sup: { open: '\\\\textsuperscript{', close: '}', verbatim: false },\n nocase: { open: '{{', close: '}}', verbatim: false },\n smallcaps: { open: '\\\\textsc{', close: '}', verbatim: false },\n enquote: { open: '\\\\enquote{', close: '}', verbatim: false },\n math: { open: '$', close: '$', verbatim: false },\n url: { open: '\\\\url{', close: '}', verbatim: true },\n};\n","/*\n * character.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n// Maps unicode characters to their latex equivalent.\n// Generated from:\n// https://www.w3.org/2003/entities/2007xml/unicode.xml\n// and\n// http://www.w3.org/Math/characters/unicode.xml\n//\n// When both xml files contained entries for a unicode character,\n// the definition provided by entities/2007xml was preferred\nexport interface CharacterMap {\n id: string;\n decimal: number;\n character: string;\n latex: string;\n ungrouped?: boolean;\n}\n\nconst characters: { [key: number]: CharacterMap } = {\n 34: { id: 'U00022', decimal: 34, character: '\"', latex: '\"' },\n 35: { id: 'U00023', decimal: 35, character: '#', latex: '\\\\#' },\n 36: { id: 'U00024', decimal: 36, character: '$', latex: '\\\\$' },\n 94: { id: 'U0005e', decimal: 94, character: '^', latex: '\\\\textasciicircum' },\n 95: { id: 'U0005f', decimal: 95, character: '_', latex: '\\\\_' },\n 123: { id: 'U0007b', decimal: 123, character: '{', latex: '\\\\textbraceleft' },\n 125: { id: 'U0007d', decimal: 125, character: '}', latex: '\\\\textbraceright' },\n 256: {\n id: 'U00100',\n decimal: 256,\n character: 'Ā',\n latex: '\\\\={A}',\n },\n 257: {\n id: 'U00101',\n decimal: 257,\n character: 'ā',\n latex: '\\\\={a}',\n },\n 258: {\n id: 'U00102',\n decimal: 258,\n character: 'Ă',\n latex: '\\\\u{A}',\n },\n 259: {\n id: 'U00103',\n decimal: 259,\n character: 'ă',\n latex: '\\\\u{a}',\n },\n 260: {\n id: 'U00104',\n decimal: 260,\n character: 'Ą',\n latex: '\\\\k{A}',\n },\n 261: {\n id: 'U00105',\n decimal: 261,\n character: 'ą',\n latex: '\\\\k{a}',\n },\n 262: {\n id: 'U00106',\n decimal: 262,\n character: 'Ć',\n latex: \"\\\\'{C}\",\n },\n 263: {\n id: 'U00107',\n decimal: 263,\n character: 'ć',\n latex: \"\\\\'{c}\",\n },\n 264: {\n id: 'U00108',\n decimal: 264,\n character: 'Ĉ',\n latex: '\\\\^{C}',\n },\n 265: {\n id: 'U00109',\n decimal: 265,\n character: 'ĉ',\n latex: '\\\\^{c}',\n },\n 266: {\n id: 'U0010A',\n decimal: 266,\n character: 'Ċ',\n latex: '\\\\.{C}',\n },\n 267: {\n id: 'U0010B',\n decimal: 267,\n character: 'ċ',\n latex: '\\\\.{c}',\n },\n 268: {\n id: 'U0010C',\n decimal: 268,\n character: 'Č',\n latex: '\\\\v{C}',\n },\n 269: {\n id: 'U0010D',\n decimal: 269,\n character: 'č',\n latex: '\\\\v{c}',\n },\n 270: {\n id: 'U0010E',\n decimal: 270,\n character: 'Ď',\n latex: '\\\\v{D}',\n },\n 271: {\n id: 'U0010F',\n decimal: 271,\n character: 'ď',\n latex: '\\\\v{d}',\n },\n 272: {\n id: 'U00110',\n decimal: 272,\n character: 'Đ',\n latex: '\\\\DJ',\n },\n 273: {\n id: 'U00111',\n decimal: 273,\n character: 'đ',\n latex: '\\\\dj',\n },\n 274: {\n id: 'U00112',\n decimal: 274,\n character: 'Ē',\n latex: '\\\\={E}',\n },\n 275: {\n id: 'U00113',\n decimal: 275,\n character: 'ē',\n latex: '\\\\={e}',\n },\n 276: {\n id: 'U00114',\n decimal: 276,\n character: 'Ĕ',\n latex: '\\\\u{E}',\n },\n 277: {\n id: 'U00115',\n decimal: 277,\n character: 'ĕ',\n latex: '\\\\u{e}',\n },\n 278: {\n id: 'U00116',\n decimal: 278,\n character: 'Ė',\n latex: '\\\\.{E}',\n },\n 279: {\n id: 'U00117',\n decimal: 279,\n character: 'ė',\n latex: '\\\\.{e}',\n },\n 280: {\n id: 'U00118',\n decimal: 280,\n character: 'Ę',\n latex: '\\\\k{E}',\n },\n 281: {\n id: 'U00119',\n decimal: 281,\n character: 'ę',\n latex: '\\\\k{e}',\n },\n 282: {\n id: 'U0011A',\n decimal: 282,\n character: 'Ě',\n latex: '\\\\v{E}',\n },\n 283: {\n id: 'U0011B',\n decimal: 283,\n character: 'ě',\n latex: '\\\\v{e}',\n },\n 284: {\n id: 'U0011C',\n decimal: 284,\n character: 'Ĝ',\n latex: '\\\\^{G}',\n },\n 285: {\n id: 'U0011D',\n decimal: 285,\n character: 'ĝ',\n latex: '\\\\^{g}',\n },\n 286: {\n id: 'U0011E',\n decimal: 286,\n character: 'Ğ',\n latex: '\\\\u{G}',\n },\n 287: {\n id: 'U0011F',\n decimal: 287,\n character: 'ğ',\n latex: '\\\\u{g}',\n },\n 288: {\n id: 'U00120',\n decimal: 288,\n character: 'Ġ',\n latex: '\\\\.{G}',\n },\n 289: {\n id: 'U00121',\n decimal: 289,\n character: 'ġ',\n latex: '\\\\.{g}',\n },\n 290: {\n id: 'U00122',\n decimal: 290,\n character: 'Ģ',\n latex: '\\\\c{G}',\n },\n 291: {\n id: 'U00123',\n decimal: 291,\n character: 'ģ',\n latex: '\\\\c{g}',\n },\n 292: {\n id: 'U00124',\n decimal: 292,\n character: 'Ĥ',\n latex: '\\\\^{H}',\n },\n 293: {\n id: 'U00125',\n decimal: 293,\n character: 'ĥ',\n latex: '\\\\^{h}',\n },\n 296: {\n id: 'U00128',\n decimal: 296,\n character: 'Ĩ',\n latex: '\\\\~{I}',\n },\n 297: {\n id: 'U00129',\n decimal: 297,\n character: 'ĩ',\n latex: '\\\\~{\\\\i}',\n },\n 298: {\n id: 'U0012A',\n decimal: 298,\n character: 'Ī',\n latex: '\\\\={I}',\n },\n 299: {\n id: 'U0012B',\n decimal: 299,\n character: 'ī',\n latex: '\\\\={\\\\i}',\n },\n 300: {\n id: 'U0012C',\n decimal: 300,\n character: 'Ĭ',\n latex: '\\\\u{I}',\n },\n 301: {\n id: 'U0012D',\n decimal: 301,\n character: 'ĭ',\n latex: '\\\\u{\\\\i}',\n },\n 302: {\n id: 'U0012E',\n decimal: 302,\n character: 'Į',\n latex: '\\\\k{I}',\n },\n 303: {\n id: 'U0012F',\n decimal: 303,\n character: 'į',\n latex: '\\\\k{i}',\n },\n 304: {\n id: 'U00130',\n decimal: 304,\n character: 'İ',\n latex: '\\\\.{I}',\n },\n 305: {\n id: 'U00131',\n decimal: 305,\n character: 'ı',\n latex: '\\\\i',\n },\n 306: {\n id: 'U00132',\n decimal: 306,\n character: 'IJ',\n latex: 'IJ',\n },\n 307: {\n id: 'U00133',\n decimal: 307,\n character: 'ij',\n latex: 'ij',\n },\n 308: {\n id: 'U00134',\n decimal: 308,\n character: 'Ĵ',\n latex: '\\\\^{J}',\n },\n 309: {\n id: 'U00135',\n decimal: 309,\n character: 'ĵ',\n latex: '\\\\^{\\\\j}',\n },\n 310: {\n id: 'U00136',\n decimal: 310,\n character: 'Ķ',\n latex: '\\\\c{K}',\n },\n 311: {\n id: 'U00137',\n decimal: 311,\n character: 'ķ',\n latex: '\\\\c{k}',\n },\n 313: {\n id: 'U00139',\n decimal: 313,\n character: 'Ĺ',\n latex: \"\\\\'{L}\",\n },\n 314: {\n id: 'U0013A',\n decimal: 314,\n character: 'ĺ',\n latex: \"\\\\'{l}\",\n },\n 315: {\n id: 'U0013B',\n decimal: 315,\n character: 'Ļ',\n latex: '\\\\c{L}',\n },\n 316: {\n id: 'U0013C',\n decimal: 316,\n character: 'ļ',\n latex: '\\\\c{l}',\n },\n 317: {\n id: 'U0013D',\n decimal: 317,\n character: 'Ľ',\n latex: '\\\\v{L}',\n },\n 318: {\n id: 'U0013E',\n decimal: 318,\n character: 'ľ',\n latex: '\\\\v{l}',\n },\n 321: {\n id: 'U00141',\n decimal: 321,\n character: 'Ł',\n latex: '\\\\L',\n },\n 322: {\n id: 'U00142',\n decimal: 322,\n character: 'ł',\n latex: '\\\\l',\n },\n 323: {\n id: 'U00143',\n decimal: 323,\n character: 'Ń',\n latex: \"\\\\'{N}\",\n },\n 324: {\n id: 'U00144',\n decimal: 324,\n character: 'ń',\n latex: \"\\\\'{n}\",\n },\n 325: {\n id: 'U00145',\n decimal: 325,\n character: 'Ņ',\n latex: '\\\\c{N}',\n },\n 326: {\n id: 'U00146',\n decimal: 326,\n character: 'ņ',\n latex: '\\\\c{n}',\n },\n 327: {\n id: 'U00147',\n decimal: 327,\n character: 'Ň',\n latex: '\\\\v{N}',\n },\n 328: {\n id: 'U00148',\n decimal: 328,\n character: 'ň',\n latex: '\\\\v{n}',\n },\n 329: {\n id: 'U00149',\n decimal: 329,\n character: 'ʼn',\n latex: \"'n\",\n },\n 330: {\n id: 'U0014A',\n decimal: 330,\n character: 'Ŋ',\n latex: '\\\\NG',\n },\n 331: {\n id: 'U0014B',\n decimal: 331,\n character: 'ŋ',\n latex: '\\\\ng',\n },\n 332: {\n id: 'U0014C',\n decimal: 332,\n character: 'Ō',\n latex: '\\\\={O}',\n },\n 333: {\n id: 'U0014D',\n decimal: 333,\n character: 'ō',\n latex: '\\\\={o}',\n },\n 334: {\n id: 'U0014E',\n decimal: 334,\n character: 'Ŏ',\n latex: '\\\\u{O}',\n },\n 335: {\n id: 'U0014F',\n decimal: 335,\n character: 'ŏ',\n latex: '\\\\u{o}',\n },\n 336: {\n id: 'U00150',\n decimal: 336,\n character: 'Ő',\n latex: '{\\\\H O}',\n },\n 337: {\n id: 'U00151',\n decimal: 337,\n character: 'ő',\n latex: '{\\\\H o}',\n },\n 338: {\n id: 'U00152',\n decimal: 338,\n character: 'Œ',\n latex: '\\\\OE',\n },\n 339: {\n id: 'U00153',\n decimal: 339,\n character: 'œ',\n latex: '\\\\oe',\n },\n 340: {\n id: 'U00154',\n decimal: 340,\n character: 'Ŕ',\n latex: \"\\\\'{R}\",\n },\n 341: {\n id: 'U00155',\n decimal: 341,\n character: 'ŕ',\n latex: \"\\\\'{r}\",\n },\n 342: {\n id: 'U00156',\n decimal: 342,\n character: 'Ŗ',\n latex: '\\\\c{R}',\n },\n 343: {\n id: 'U00157',\n decimal: 343,\n character: 'ŗ',\n latex: '\\\\c{r}',\n },\n 344: {\n id: 'U00158',\n decimal: 344,\n character: 'Ř',\n latex: '\\\\v{R}',\n },\n 345: {\n id: 'U00159',\n decimal: 345,\n character: 'ř',\n latex: '\\\\v{r}',\n },\n 346: {\n id: 'U0015A',\n decimal: 346,\n character: 'Ś',\n latex: \"\\\\'{S}\",\n },\n 347: {\n id: 'U0015B',\n decimal: 347,\n character: 'ś',\n latex: \"\\\\'{s}\",\n },\n 348: {\n id: 'U0015C',\n decimal: 348,\n character: 'Ŝ',\n latex: '\\\\^{S}',\n },\n 349: {\n id: 'U0015D',\n decimal: 349,\n character: 'ŝ',\n latex: '\\\\^{s}',\n },\n 350: {\n id: 'U0015E',\n decimal: 350,\n character: 'Ş',\n latex: '\\\\c{S}',\n },\n 351: {\n id: 'U0015F',\n decimal: 351,\n character: 'ş',\n latex: '\\\\c{s}',\n },\n 352: {\n id: 'U00160',\n decimal: 352,\n character: 'Š',\n latex: '\\\\v{S}',\n },\n 353: {\n id: 'U00161',\n decimal: 353,\n character: 'š',\n latex: '\\\\v{s}',\n },\n 354: {\n id: 'U00162',\n decimal: 354,\n character: 'Ţ',\n latex: '\\\\c{T}',\n },\n 355: {\n id: 'U00163',\n decimal: 355,\n character: 'ţ',\n latex: '\\\\c{t}',\n },\n 356: {\n id: 'U00164',\n decimal: 356,\n character: 'Ť',\n latex: '\\\\v{T}',\n },\n 357: {\n id: 'U00165',\n decimal: 357,\n character: 'ť',\n latex: '\\\\v{t}',\n },\n 360: {\n id: 'U00168',\n decimal: 360,\n character: 'Ũ',\n latex: '\\\\~{U}',\n },\n 361: {\n id: 'U00169',\n decimal: 361,\n character: 'ũ',\n latex: '\\\\~{u}',\n },\n 362: {\n id: 'U0016A',\n decimal: 362,\n character: 'Ū',\n latex: '\\\\={U}',\n },\n 363: {\n id: 'U0016B',\n decimal: 363,\n character: 'ū',\n latex: '\\\\={u}',\n },\n 364: {\n id: 'U0016C',\n decimal: 364,\n character: 'Ŭ',\n latex: '\\\\u{U}',\n },\n 365: {\n id: 'U0016D',\n decimal: 365,\n character: 'ŭ',\n latex: '\\\\u{u}',\n },\n 366: {\n id: 'U0016E',\n decimal: 366,\n character: 'Ů',\n latex: '\\\\r{U}',\n },\n 367: {\n id: 'U0016F',\n decimal: 367,\n character: 'ů',\n latex: '\\\\r{u}',\n },\n 368: {\n id: 'U00170',\n decimal: 368,\n character: 'Ű',\n latex: '{\\\\H U}',\n },\n 369: {\n id: 'U00171',\n decimal: 369,\n character: 'ű',\n latex: '{\\\\H u}',\n },\n 370: {\n id: 'U00172',\n decimal: 370,\n character: 'Ų',\n latex: '\\\\k{U}',\n },\n 371: {\n id: 'U00173',\n decimal: 371,\n character: 'ų',\n latex: '\\\\k{u}',\n },\n 372: {\n id: 'U00174',\n decimal: 372,\n character: 'Ŵ',\n latex: '\\\\^{W}',\n },\n 373: {\n id: 'U00175',\n decimal: 373,\n character: 'ŵ',\n latex: '\\\\^{w}',\n },\n 374: {\n id: 'U00176',\n decimal: 374,\n character: 'Ŷ',\n latex: '\\\\^{Y}',\n },\n 375: {\n id: 'U00177',\n decimal: 375,\n character: 'ŷ',\n latex: '\\\\^{y}',\n },\n 376: {\n id: 'U00178',\n decimal: 376,\n character: 'Ÿ',\n latex: '\\\\\"{Y}',\n },\n 377: {\n id: 'U00179',\n decimal: 377,\n character: 'Ź',\n latex: \"\\\\'{Z}\",\n },\n 378: {\n id: 'U0017A',\n decimal: 378,\n character: 'ź',\n latex: \"\\\\'{z}\",\n },\n 379: {\n id: 'U0017B',\n decimal: 379,\n character: 'Ż',\n latex: '\\\\.{Z}',\n },\n 380: {\n id: 'U0017C',\n decimal: 380,\n character: 'ż',\n latex: '\\\\.{z}',\n },\n 381: {\n id: 'U0017D',\n decimal: 381,\n character: 'Ž',\n latex: '\\\\v{Z}',\n },\n 382: {\n id: 'U0017E',\n decimal: 382,\n character: 'ž',\n latex: '\\\\v{z}',\n },\n 402: {\n id: 'U00192',\n decimal: 402,\n character: 'ƒ',\n latex: '\\\\textflorin',\n },\n 501: {\n id: 'U001F5',\n decimal: 501,\n character: 'ǵ',\n latex: \"\\\\'{g}\",\n },\n 609: {\n id: 'U00261',\n decimal: 609,\n character: 'ɡ',\n latex: 'g',\n },\n 700: {\n id: 'U002BC',\n decimal: 700,\n character: 'ʼ',\n latex: \"'\",\n },\n 711: {\n id: 'U002C7',\n decimal: 711,\n character: 'ˇ',\n latex: '\\\\textasciicaron',\n },\n 714: {\n id: 'U002ca',\n decimal: 714,\n character: 'ˊ',\n latex: '\\\\textasciitilde',\n },\n 728: {\n id: 'U002D8',\n decimal: 728,\n character: '˘',\n latex: '\\\\textasciibreve',\n },\n 729: {\n id: 'U002D9',\n decimal: 729,\n character: '˙',\n latex: '\\\\textperiodcentered',\n },\n 730: {\n id: 'U002DA',\n decimal: 730,\n character: '˚',\n latex: '\\\\r{}',\n },\n 731: {\n id: 'U002DB',\n decimal: 731,\n character: '˛',\n latex: '\\\\k{}',\n },\n 732: {\n id: 'U002DC',\n decimal: 732,\n character: '˜',\n latex: '\\\\texttildelow',\n },\n 733: {\n id: 'U002dd',\n decimal: 733,\n character: '˝',\n latex: '\\\\textacutedbl',\n },\n 768: {\n id: 'U00300',\n decimal: 768,\n character: '̀',\n latex: '\\\\`',\n ungrouped: true,\n },\n 769: {\n id: 'U00301',\n decimal: 769,\n character: '́',\n latex: \"\\\\'\",\n ungrouped: true,\n },\n 770: {\n id: 'U00302',\n decimal: 770,\n character: '̂',\n latex: '\\\\^',\n ungrouped: true,\n },\n 771: {\n id: 'U00303',\n decimal: 771,\n character: '̃',\n latex: '\\\\~',\n ungrouped: true,\n },\n 772: {\n id: 'U00304',\n decimal: 772,\n character: '̄',\n latex: '\\\\=',\n ungrouped: true,\n },\n 774: {\n id: 'U00306',\n decimal: 774,\n character: '̆',\n latex: '\\\\u',\n ungrouped: true,\n },\n 775: {\n id: 'U00307',\n decimal: 775,\n character: '̇',\n latex: '\\\\.',\n ungrouped: true,\n },\n 776: {\n id: 'U00308',\n decimal: 776,\n character: '̈',\n latex: '\\\\\"',\n ungrouped: true,\n },\n 778: {\n id: 'U0030A',\n decimal: 778,\n character: '̊',\n latex: '\\\\r',\n ungrouped: true,\n },\n 780: {\n id: 'U0030C',\n decimal: 780,\n character: '̌',\n latex: '\\\\v',\n ungrouped: true,\n },\n 807: {\n id: 'U00327',\n decimal: 807,\n character: '̧',\n latex: '\\\\c',\n ungrouped: true,\n },\n 808: {\n id: 'U00328',\n decimal: 808,\n character: '̨',\n latex: '\\\\k',\n ungrouped: true,\n },\n 902: {\n id: 'U00386',\n decimal: 902,\n character: 'Ά',\n latex: \"\\\\'{A}\",\n },\n 904: {\n id: 'U00388',\n decimal: 904,\n character: 'Έ',\n latex: \"\\\\'{E}\",\n },\n 905: {\n id: 'U00389',\n decimal: 905,\n character: 'Ή',\n latex: \"\\\\'{H}\",\n },\n 906: {\n id: 'U0038A',\n decimal: 906,\n character: 'Ί',\n latex: \"\\\\'{}{I}\",\n },\n 908: {\n id: 'U0038C',\n decimal: 908,\n character: 'Ό',\n latex: \"\\\\'{}O\",\n },\n 910: {\n id: 'U0038E',\n decimal: 910,\n character: 'Ύ',\n latex: \"$\\\\mathrm{'Y}$\",\n },\n 911: {\n id: 'U0038F',\n decimal: 911,\n character: 'Ώ',\n latex: \"$\\\\mathrm{'\\\\Omega}$\",\n },\n 924: {\n id: 'U0039C',\n decimal: 924,\n character: 'Μ',\n latex: 'M',\n },\n 925: {\n id: 'U0039D',\n decimal: 925,\n character: 'Ν',\n latex: 'N',\n },\n 927: {\n id: 'U0039F',\n decimal: 927,\n character: 'Ο',\n latex: 'O',\n },\n 938: {\n id: 'U003AA',\n decimal: 938,\n character: 'Ϊ',\n latex: '$\\\\mathrm{\\\\ddot{I}}$',\n },\n 939: {\n id: 'U003AB',\n decimal: 939,\n character: 'Ϋ',\n latex: '$\\\\mathrm{\\\\ddot{Y}}$',\n },\n 940: {\n id: 'U003AC',\n decimal: 940,\n character: 'ά',\n latex: \"\\\\'{$\\\\alpha$}\",\n },\n 959: {\n id: 'U003BF',\n decimal: 959,\n character: 'ο',\n latex: 'o',\n },\n 972: {\n id: 'U003CC',\n decimal: 972,\n character: 'ό',\n latex: \"\\\\'{o}\",\n },\n 8194: {\n id: 'U02002',\n decimal: 8194,\n character: ' ',\n latex: '\\\\hspace{0.6em}',\n },\n 8195: {\n id: 'U02003',\n decimal: 8195,\n character: ' ',\n latex: '\\\\hspace{1em}',\n },\n 8196: {\n id: 'U02004',\n decimal: 8196,\n character: ' ',\n latex: '\\\\hspace{0.33em}',\n },\n 8197: {\n id: 'U02005',\n decimal: 8197,\n character: ' ',\n latex: '\\\\hspace{0.25em}',\n },\n 8198: {\n id: 'U02006',\n decimal: 8198,\n character: ' ',\n latex: '\\\\hspace{0.166em}',\n },\n 8199: {\n id: 'U02007',\n decimal: 8199,\n character: ' ',\n latex: '\\\\hphantom{0}',\n },\n 8200: {\n id: 'U02008',\n decimal: 8200,\n character: ' ',\n latex: '\\\\hphantom{,}',\n },\n 8201: {\n id: 'U02009',\n decimal: 8201,\n character: ' ',\n latex: '\\\\hspace{0.167em}',\n },\n 8204: {\n id: 'U00200c',\n decimal: 8204,\n character: '',\n latex: '\\\\textcompwordmark',\n },\n 8208: {\n id: 'U02010',\n decimal: 8208,\n character: '‐',\n latex: '-',\n },\n 8209: {\n id: 'U2011',\n decimal: 8209,\n character: '‑',\n latex: '\\\\nobreakdash-'\n },\n 8211: {\n id: 'U02013',\n decimal: 8211,\n character: '–',\n latex: '\\\\textendash',\n },\n 8212: {\n id: 'U02014',\n decimal: 8212,\n character: '—',\n latex: '\\\\textemdash',\n },\n 8213: {\n id: 'U02015',\n decimal: 8213,\n character: '―',\n latex: '\\\\rule{1em}{1pt}',\n },\n 8216: {\n id: 'U02018',\n decimal: 8216,\n character: '‘',\n latex: '\\\\textquoteleft',\n },\n 8217: {\n id: 'U02019',\n decimal: 8217,\n character: '’',\n latex: '\\\\textquoteright',\n },\n 8218: {\n id: 'U0201A',\n decimal: 8218,\n character: '‚',\n latex: ',',\n },\n 8220: {\n id: 'U0201C',\n decimal: 8220,\n character: '“',\n latex: '\\\\textquotedblleft',\n },\n 8221: {\n id: 'U0201D',\n decimal: 8221,\n character: '”',\n latex: '\\\\textquotedblright',\n },\n 8222: {\n id: 'U0201E',\n decimal: 8222,\n character: '„',\n latex: ',,',\n },\n 8224: {\n id: 'U02020',\n decimal: 8224,\n character: '†',\n latex: '\\\\textdagger',\n },\n 8225: {\n id: 'U02021',\n decimal: 8225,\n character: '‡',\n latex: '\\\\textdaggerdbl',\n },\n 8226: {\n id: 'U02022',\n decimal: 8226,\n character: '•',\n latex: '\\\\textbullet',\n },\n 8228: {\n id: 'U02024',\n decimal: 8228,\n character: '․',\n latex: '.',\n },\n 8229: {\n id: 'U02025',\n decimal: 8229,\n character: '‥',\n latex: '..',\n },\n 8230: {\n id: 'U02026',\n decimal: 8230,\n character: '…',\n latex: '\\\\ldots',\n },\n 8240: {\n id: 'U02030',\n decimal: 8240,\n character: '‰',\n latex: '\\\\textperthousand',\n },\n 8241: {\n id: 'U02031',\n decimal: 8241,\n character: '‱',\n latex: '\\\\textpertenthousand',\n },\n 8242: {\n id: 'U02032',\n decimal: 8242,\n character: '′',\n latex: \"{'}\",\n },\n 8243: {\n id: 'U02033',\n decimal: 8243,\n character: '″',\n latex: \"{''}\",\n },\n 8244: {\n id: 'U02034',\n decimal: 8244,\n character: '‴',\n latex: \"{'''}\",\n },\n 8249: {\n id: 'U02039',\n decimal: 8249,\n character: '‹',\n latex: '\\\\guilsinglleft',\n },\n 8250: {\n id: 'U0203A',\n decimal: 8250,\n character: '›',\n latex: '\\\\guilsinglright',\n },\n 8279: {\n id: 'U02057',\n decimal: 8279,\n character: '⁗',\n latex: \"''''\",\n },\n 8288: {\n id: 'U02060',\n decimal: 8288,\n character: '',\n latex: '\\\\nolinebreak',\n },\n 8364: {\n id: 'U020AC',\n decimal: 8364,\n character: '€',\n latex: '\\\\mbox{\\\\texteuro}',\n },\n 8450: {\n id: 'U02102',\n decimal: 8450,\n character: 'ℂ',\n latex: '$\\\\mathbb{C}$',\n },\n 8460: {\n id: 'U0210C',\n decimal: 8460,\n character: 'ℌ',\n latex: '$\\\\mathfrak{H}$',\n },\n 8461: {\n id: 'U0210D',\n decimal: 8461,\n character: 'ℍ',\n latex: '$\\\\mathbb{H}$',\n },\n 8465: {\n id: 'U02111',\n decimal: 8465,\n character: 'ℑ',\n latex: '$\\\\mathfrak{I}$',\n },\n 8469: {\n id: 'U02115',\n decimal: 8469,\n character: 'ℕ',\n latex: '$\\\\mathbb{N}$',\n },\n 8473: {\n id: 'U02119',\n decimal: 8473,\n character: 'ℙ',\n latex: '$\\\\mathbb{P}$',\n },\n 8474: {\n id: 'U0211A',\n decimal: 8474,\n character: 'ℚ',\n latex: '$\\\\mathbb{Q}$',\n },\n 8476: {\n id: 'U0211C',\n decimal: 8476,\n character: 'ℜ',\n latex: '$\\\\mathfrak{R}$',\n },\n 8477: {\n id: 'U0211D',\n decimal: 8477,\n character: 'ℝ',\n latex: '$\\\\mathbb{R}$',\n },\n 8482: {\n id: 'U02122',\n decimal: 8482,\n character: '™',\n latex: '\\\\texttrademark',\n },\n 8484: {\n id: 'U02124',\n decimal: 8484,\n character: 'ℤ',\n latex: '$\\\\mathbb{Z}$',\n },\n 8488: {\n id: 'U02128',\n decimal: 8488,\n character: 'ℨ',\n latex: '$\\\\mathfrak{Z}$',\n },\n 8491: {\n id: 'U0212B',\n decimal: 8491,\n character: 'Å',\n latex: '\\\\AA',\n },\n 8493: {\n id: 'U0212D',\n decimal: 8493,\n character: 'ℭ',\n latex: '$\\\\mathfrak{C}$',\n },\n 8722: {\n id: 'U02212',\n decimal: 8722,\n character: '−',\n latex: '-',\n },\n 8762: {\n id: 'U0223A',\n decimal: 8762,\n character: '∺',\n latex: '$\\\\mathbin{{:}\\\\!\\\\!{-}\\\\!\\\\!{:}}$',\n },\n 8788: {\n id: 'U02254',\n decimal: 8788,\n character: '≔',\n latex: ':=',\n },\n 8789: {\n id: 'U02255',\n decimal: 8789,\n character: '≕',\n latex: '=:',\n },\n 8942: {\n id: 'U022EE',\n decimal: 8942,\n character: '⋮',\n latex: '\\\\vdots',\n },\n 8982: {\n id: 'U02316',\n decimal: 8982,\n character: '⌖',\n latex: '$\\\\mathchar\"2208$',\n },\n 9251: {\n id: 'U02423',\n decimal: 9251,\n character: '␣',\n latex: '\\\\textvisiblespace',\n },\n 9645: {\n id: 'U025AD',\n decimal: 9645,\n character: '▭',\n latex: '\\\\fbox{~~}',\n },\n 11005: {\n id: 'U02AFD-020E5',\n decimal: 11005,\n character: '⫽',\n latex: '{\\\\rlap{\\\\textbackslash}{{/}\\\\!\\\\!{/}}}',\n },\n 64256: {\n id: 'U0FB00',\n decimal: 64256,\n character: 'ff',\n latex: 'ff',\n },\n 64257: {\n id: 'U0FB01',\n decimal: 64257,\n character: 'fi',\n latex: 'fi',\n },\n 64258: {\n id: 'U0FB02',\n decimal: 64258,\n character: 'fl',\n latex: 'fl',\n },\n 64259: {\n id: 'U0FB03',\n decimal: 64259,\n character: 'ffi',\n latex: 'ffi',\n },\n 64260: {\n id: 'U0FB04',\n decimal: 64260,\n character: 'ffl',\n latex: 'ffl',\n },\n 119808: {\n id: 'U1D400',\n decimal: 119808,\n character: '퐀',\n latex: '$\\\\mathbf{A}$',\n },\n 119809: {\n id: 'U1D401',\n decimal: 119809,\n character: '퐁',\n latex: '$\\\\mathbf{B}$',\n },\n 119810: {\n id: 'U1D402',\n decimal: 119810,\n character: '퐂',\n latex: '$\\\\mathbf{C}$',\n },\n 119811: {\n id: 'U1D403',\n decimal: 119811,\n character: '퐃',\n latex: '$\\\\mathbf{D}$',\n },\n 119812: {\n id: 'U1D404',\n decimal: 119812,\n character: '퐄',\n latex: '$\\\\mathbf{E}$',\n },\n 119813: {\n id: 'U1D405',\n decimal: 119813,\n character: '퐅',\n latex: '{$\\\\mathbf{F}$}',\n },\n 119814: {\n id: 'U1D406',\n decimal: 119814,\n character: '퐆',\n latex: '$\\\\mathbf{G}$',\n },\n 119815: {\n id: 'U1D407',\n decimal: 119815,\n character: '퐇',\n latex: '$\\\\mathbf{H}$',\n },\n 119816: {\n id: 'U1D408',\n decimal: 119816,\n character: '퐈',\n latex: '$\\\\mathbf{I}$',\n },\n 119817: {\n id: 'U1D409',\n decimal: 119817,\n character: '퐉',\n latex: '$\\\\mathbf{J}$',\n },\n 119818: {\n id: 'U1D40A',\n decimal: 119818,\n character: '퐊',\n latex: '$\\\\mathbf{K}$',\n },\n 119819: {\n id: 'U1D40B',\n decimal: 119819,\n character: '퐋',\n latex: '$\\\\mathbf{L}$',\n },\n 119820: {\n id: 'U1D40C',\n decimal: 119820,\n character: '퐌',\n latex: '$\\\\mathbf{M}$',\n },\n 119821: {\n id: 'U1D40D',\n decimal: 119821,\n character: '퐍',\n latex: '$\\\\mathbf{N}$',\n },\n 119822: {\n id: 'U1D40E',\n decimal: 119822,\n character: '퐎',\n latex: '$\\\\mathbf{O}$',\n },\n 119823: {\n id: 'U1D40F',\n decimal: 119823,\n character: '퐏',\n latex: '$\\\\mathbf{P}$',\n },\n 119824: {\n id: 'U1D410',\n decimal: 119824,\n character: '퐐',\n latex: '$\\\\mathbf{Q}$',\n },\n 119825: {\n id: 'U1D411',\n decimal: 119825,\n character: '퐑',\n latex: '$\\\\mathbf{R}$',\n },\n 119826: {\n id: 'U1D412',\n decimal: 119826,\n character: '퐒',\n latex: '$\\\\mathbf{S}$',\n },\n 119827: {\n id: 'U1D413',\n decimal: 119827,\n character: '퐓',\n latex: '$\\\\mathbf{T}$',\n },\n 119828: {\n id: 'U1D414',\n decimal: 119828,\n character: '퐔',\n latex: '$\\\\mathbf{U}$',\n },\n 119829: {\n id: 'U1D415',\n decimal: 119829,\n character: '퐕',\n latex: '$\\\\mathbf{V}$',\n },\n 119830: {\n id: 'U1D416',\n decimal: 119830,\n character: '퐖',\n latex: '$\\\\mathbf{W}$',\n },\n 119831: {\n id: 'U1D417',\n decimal: 119831,\n character: '퐗',\n latex: '$\\\\mathbf{X}$',\n },\n 119832: {\n id: 'U1D418',\n decimal: 119832,\n character: '퐘',\n latex: '$\\\\mathbf{Y}$',\n },\n 119833: {\n id: 'U1D419',\n decimal: 119833,\n character: '퐙',\n latex: '$\\\\mathbf{Z}$',\n },\n 119834: {\n id: 'U1D41A',\n decimal: 119834,\n character: '퐚',\n latex: '$\\\\mathbf{a}$',\n },\n 119835: {\n id: 'U1D41B',\n decimal: 119835,\n character: '퐛',\n latex: '$\\\\mathbf{b}$',\n },\n 119836: {\n id: 'U1D41C',\n decimal: 119836,\n character: '퐜',\n latex: '$\\\\mathbf{c}$',\n },\n 119837: {\n id: 'U1D41D',\n decimal: 119837,\n character: '퐝',\n latex: '$\\\\mathbf{d}$',\n },\n 119838: {\n id: 'U1D41E',\n decimal: 119838,\n character: '퐞',\n latex: '$\\\\mathbf{e}$',\n },\n 119839: {\n id: 'U1D41F',\n decimal: 119839,\n character: '퐟',\n latex: '{$\\\\mathbf{f}$}',\n },\n 119840: {\n id: 'U1D420',\n decimal: 119840,\n character: '퐠',\n latex: '$\\\\mathbf{g}$',\n },\n 119841: {\n id: 'U1D421',\n decimal: 119841,\n character: '퐡',\n latex: '$\\\\mathbf{h}$',\n },\n 119842: {\n id: 'U1D422',\n decimal: 119842,\n character: '퐢',\n latex: '$\\\\mathbf{i}$',\n },\n 119843: {\n id: 'U1D423',\n decimal: 119843,\n character: '퐣',\n latex: '$\\\\mathbf{j}$',\n },\n 119844: {\n id: 'U1D424',\n decimal: 119844,\n character: '퐤',\n latex: '$\\\\mathbf{k}$',\n },\n 119845: {\n id: 'U1D425',\n decimal: 119845,\n character: '퐥',\n latex: '$\\\\mathbf{l}$',\n },\n 119846: {\n id: 'U1D426',\n decimal: 119846,\n character: '퐦',\n latex: '$\\\\mathbf{m}$',\n },\n 119847: {\n id: 'U1D427',\n decimal: 119847,\n character: '퐧',\n latex: '$\\\\mathbf{n}$',\n },\n 119848: {\n id: 'U1D428',\n decimal: 119848,\n character: '퐨',\n latex: '$\\\\mathbf{o}$',\n },\n 119849: {\n id: 'U1D429',\n decimal: 119849,\n character: '퐩',\n latex: '$\\\\mathbf{p}$',\n },\n 119850: {\n id: 'U1D42A',\n decimal: 119850,\n character: '퐪',\n latex: '$\\\\mathbf{q}$',\n },\n 119851: {\n id: 'U1D42B',\n decimal: 119851,\n character: '퐫',\n latex: '$\\\\mathbf{r}$',\n },\n 119852: {\n id: 'U1D42C',\n decimal: 119852,\n character: '퐬',\n latex: '$\\\\mathbf{s}$',\n },\n 119853: {\n id: 'U1D42D',\n decimal: 119853,\n character: '퐭',\n latex: '$\\\\mathbf{t}$',\n },\n 119854: {\n id: 'U1D42E',\n decimal: 119854,\n character: '퐮',\n latex: '$\\\\mathbf{u}$',\n },\n 119855: {\n id: 'U1D42F',\n decimal: 119855,\n character: '퐯',\n latex: '$\\\\mathbf{v}$',\n },\n 119856: {\n id: 'U1D430',\n decimal: 119856,\n character: '퐰',\n latex: '$\\\\mathbf{w}$',\n },\n 119857: {\n id: 'U1D431',\n decimal: 119857,\n character: '퐱',\n latex: '$\\\\mathbf{x}$',\n },\n 119858: {\n id: 'U1D432',\n decimal: 119858,\n character: '퐲',\n latex: '$\\\\mathbf{y}$',\n },\n 119859: {\n id: 'U1D433',\n decimal: 119859,\n character: '퐳',\n latex: '$\\\\mathbf{z}$',\n },\n 120068: {\n id: 'U1D504',\n decimal: 120068,\n character: '프',\n latex: '$\\\\mathfrak{A}$',\n },\n 120069: {\n id: 'U1D505',\n decimal: 120069,\n character: '픅',\n latex: '$\\\\mathfrak{B}$',\n },\n 120071: {\n id: 'U1D507',\n decimal: 120071,\n character: '픇',\n latex: '$\\\\mathfrak{D}$',\n },\n 120072: {\n id: 'U1D508',\n decimal: 120072,\n character: '픈',\n latex: '$\\\\mathfrak{E}$',\n },\n 120073: {\n id: 'U1D509',\n decimal: 120073,\n character: '픉',\n latex: '$\\\\mathfrak{F}$',\n },\n 120074: {\n id: 'U1D50A',\n decimal: 120074,\n character: '픊',\n latex: '$\\\\mathfrak{G}$',\n },\n 120077: {\n id: 'U1D50D',\n decimal: 120077,\n character: '픍',\n latex: '$\\\\mathfrak{J}$',\n },\n 120078: {\n id: 'U1D50E',\n decimal: 120078,\n character: '픎',\n latex: '$\\\\mathfrak{K}$',\n },\n 120079: {\n id: 'U1D50F',\n decimal: 120079,\n character: '픏',\n latex: '$\\\\mathfrak{L}$',\n },\n 120080: {\n id: 'U1D510',\n decimal: 120080,\n character: '픐',\n latex: '$\\\\mathfrak{M}$',\n },\n 120081: {\n id: 'U1D511',\n decimal: 120081,\n character: '픑',\n latex: '$\\\\mathfrak{N}$',\n },\n 120082: {\n id: 'U1D512',\n decimal: 120082,\n character: '픒',\n latex: '$\\\\mathfrak{O}$',\n },\n 120083: {\n id: 'U1D513',\n decimal: 120083,\n character: '픓',\n latex: '$\\\\mathfrak{P}$',\n },\n 120084: {\n id: 'U1D514',\n decimal: 120084,\n character: '픔',\n latex: '$\\\\mathfrak{Q}$',\n },\n 120086: {\n id: 'U1D516',\n decimal: 120086,\n character: '픖',\n latex: '$\\\\mathfrak{S}$',\n },\n 120087: {\n id: 'U1D517',\n decimal: 120087,\n character: '픗',\n latex: '$\\\\mathfrak{T}$',\n },\n 120088: {\n id: 'U1D518',\n decimal: 120088,\n character: '픘',\n latex: '$\\\\mathfrak{U}$',\n },\n 120089: {\n id: 'U1D519',\n decimal: 120089,\n character: '픙',\n latex: '$\\\\mathfrak{V}$',\n },\n 120090: {\n id: 'U1D51A',\n decimal: 120090,\n character: '픚',\n latex: '$\\\\mathfrak{W}$',\n },\n 120091: {\n id: 'U1D51B',\n decimal: 120091,\n character: '픛',\n latex: '$\\\\mathfrak{X}$',\n },\n 120092: {\n id: 'U1D51C',\n decimal: 120092,\n character: '픜',\n latex: '$\\\\mathfrak{Y}$',\n },\n 120094: {\n id: 'U1D51E',\n decimal: 120094,\n character: '픞',\n latex: '$\\\\mathfrak{a}$',\n },\n 120095: {\n id: 'U1D51F',\n decimal: 120095,\n character: '픟',\n latex: '$\\\\mathfrak{b}$',\n },\n 120096: {\n id: 'U1D520',\n decimal: 120096,\n character: '픠',\n latex: '$\\\\mathfrak{c}$',\n },\n 120097: {\n id: 'U1D521',\n decimal: 120097,\n character: '픡',\n latex: '$\\\\mathfrak{d}$',\n },\n 120098: {\n id: 'U1D522',\n decimal: 120098,\n character: '픢',\n latex: '$\\\\mathfrak{e}$',\n },\n 120099: {\n id: 'U1D523',\n decimal: 120099,\n character: '픣',\n latex: '$\\\\mathfrak{f}$',\n },\n 120100: {\n id: 'U1D524',\n decimal: 120100,\n character: '픤',\n latex: '$\\\\mathfrak{g}$',\n },\n 120101: {\n id: 'U1D525',\n decimal: 120101,\n character: '픥',\n latex: '$\\\\mathfrak{h}$',\n },\n 120102: {\n id: 'U1D526',\n decimal: 120102,\n character: '픦',\n latex: '$\\\\mathfrak{i}$',\n },\n 120103: {\n id: 'U1D527',\n decimal: 120103,\n character: '픧',\n latex: '$\\\\mathfrak{j}$',\n },\n 120104: {\n id: 'U1D528',\n decimal: 120104,\n character: '픨',\n latex: '$\\\\mathfrak{k}$',\n },\n 120105: {\n id: 'U1D529',\n decimal: 120105,\n character: '픩',\n latex: '$\\\\mathfrak{l}$',\n },\n 120106: {\n id: 'U1D52A',\n decimal: 120106,\n character: '픪',\n latex: '$\\\\mathfrak{m}$',\n },\n 120107: {\n id: 'U1D52B',\n decimal: 120107,\n character: '픫',\n latex: '$\\\\mathfrak{n}$',\n },\n 120108: {\n id: 'U1D52C',\n decimal: 120108,\n character: '픬',\n latex: '$\\\\mathfrak{o}$',\n },\n 120109: {\n id: 'U1D52D',\n decimal: 120109,\n character: '픭',\n latex: '$\\\\mathfrak{p}$',\n },\n 120110: {\n id: 'U1D52E',\n decimal: 120110,\n character: '픮',\n latex: '$\\\\mathfrak{q}$',\n },\n 120111: {\n id: 'U1D52F',\n decimal: 120111,\n character: '픯',\n latex: '$\\\\mathfrak{r}$',\n },\n 120112: {\n id: 'U1D530',\n decimal: 120112,\n character: '픰',\n latex: '$\\\\mathfrak{s}$',\n },\n 120113: {\n id: 'U1D531',\n decimal: 120113,\n character: '픱',\n latex: '$\\\\mathfrak{t}$',\n },\n 120114: {\n id: 'U1D532',\n decimal: 120114,\n character: '픲',\n latex: '$\\\\mathfrak{u}$',\n },\n 120115: {\n id: 'U1D533',\n decimal: 120115,\n character: '픳',\n latex: '$\\\\mathfrak{v}$',\n },\n 120116: {\n id: 'U1D534',\n decimal: 120116,\n character: '픴',\n latex: '$\\\\mathfrak{w}$',\n },\n 120117: {\n id: 'U1D535',\n decimal: 120117,\n character: '픵',\n latex: '$\\\\mathfrak{x}$',\n },\n 120118: {\n id: 'U1D536',\n decimal: 120118,\n character: '픶',\n latex: '$\\\\mathfrak{y}$',\n },\n 120119: {\n id: 'U1D537',\n decimal: 120119,\n character: '픷',\n latex: '$\\\\mathfrak{z}$',\n },\n 120120: {\n id: 'U1D538',\n decimal: 120120,\n character: '픸',\n latex: '$\\\\mathbb{A}$',\n },\n 120121: {\n id: 'U1D539',\n decimal: 120121,\n character: '픹',\n latex: '$\\\\mathbb{B}$',\n },\n 120123: {\n id: 'U1D53B',\n decimal: 120123,\n character: '픻',\n latex: '$\\\\mathbb{D}$',\n },\n 120124: {\n id: 'U1D53C',\n decimal: 120124,\n character: '피',\n latex: '$\\\\mathbb{E}$',\n },\n 120125: {\n id: 'U1D53D',\n decimal: 120125,\n character: '픽',\n latex: '$\\\\mathbb{F}$',\n },\n 120126: {\n id: 'U1D53E',\n decimal: 120126,\n character: '픾',\n latex: '$\\\\mathbb{G}$',\n },\n 120128: {\n id: 'U1D540',\n decimal: 120128,\n character: '핀',\n latex: '$\\\\mathbb{I}$',\n },\n 120129: {\n id: 'U1D541',\n decimal: 120129,\n character: '핁',\n latex: '$\\\\mathbb{J}$',\n },\n 120130: {\n id: 'U1D542',\n decimal: 120130,\n character: '핂',\n latex: '$\\\\mathbb{K}$',\n },\n 120131: {\n id: 'U1D543',\n decimal: 120131,\n character: '핃',\n latex: '$\\\\mathbb{L}$',\n },\n 120132: {\n id: 'U1D544',\n decimal: 120132,\n character: '필',\n latex: '$\\\\mathbb{M}$',\n },\n 120134: {\n id: 'U1D546',\n decimal: 120134,\n character: '핆',\n latex: '$\\\\mathbb{O}$',\n },\n 120138: {\n id: 'U1D54A',\n decimal: 120138,\n character: '핊',\n latex: '$\\\\mathbb{S}$',\n },\n 120139: {\n id: 'U1D54B',\n decimal: 120139,\n character: '핋',\n latex: '$\\\\mathbb{T}$',\n },\n 120140: {\n id: 'U1D54C',\n decimal: 120140,\n character: '핌',\n latex: '$\\\\mathbb{U}$',\n },\n 120141: {\n id: 'U1D54D',\n decimal: 120141,\n character: '핍',\n latex: '$\\\\mathbb{V}$',\n },\n 120142: {\n id: 'U1D54E',\n decimal: 120142,\n character: '핎',\n latex: '$\\\\mathbb{W}$',\n },\n 120143: {\n id: 'U1D54F',\n decimal: 120143,\n character: '핏',\n latex: '$\\\\mathbb{X}$',\n },\n 120144: {\n id: 'U1D550',\n decimal: 120144,\n character: '핐',\n latex: '$\\\\mathbb{Y}$',\n },\n 120146: {\n id: 'U1D552',\n decimal: 120146,\n character: '핒',\n latex: '$\\\\mathbb{a}$',\n },\n 120147: {\n id: 'U1D553',\n decimal: 120147,\n character: '핓',\n latex: '$\\\\mathbb{b}$',\n },\n 120148: {\n id: 'U1D554',\n decimal: 120148,\n character: '핔',\n latex: '$\\\\mathbb{c}$',\n },\n 120149: {\n id: 'U1D555',\n decimal: 120149,\n character: '핕',\n latex: '$\\\\mathbb{d}$',\n },\n 120150: {\n id: 'U1D556',\n decimal: 120150,\n character: '핖',\n latex: '$\\\\mathbb{e}$',\n },\n 120151: {\n id: 'U1D557',\n decimal: 120151,\n character: '핗',\n latex: '$\\\\mathbb{f}$',\n },\n 120152: {\n id: 'U1D558',\n decimal: 120152,\n character: '하',\n latex: '$\\\\mathbb{g}$',\n },\n 120153: {\n id: 'U1D559',\n decimal: 120153,\n character: '학',\n latex: '$\\\\mathbb{h}$',\n },\n 120154: {\n id: 'U1D55A',\n decimal: 120154,\n character: '핚',\n latex: '$\\\\mathbb{i}$',\n },\n 120155: {\n id: 'U1D55B',\n decimal: 120155,\n character: '핛',\n latex: '$\\\\mathbb{j}$',\n },\n 120156: {\n id: 'U1D55C',\n decimal: 120156,\n character: '한',\n latex: '$\\\\mathbb{k}$',\n },\n 120157: {\n id: 'U1D55D',\n decimal: 120157,\n character: '핝',\n latex: '$\\\\mathbb{l}$',\n },\n 120158: {\n id: 'U1D55E',\n decimal: 120158,\n character: '핞',\n latex: '$\\\\mathbb{m}$',\n },\n 120159: {\n id: 'U1D55F',\n decimal: 120159,\n character: '핟',\n latex: '$\\\\mathbb{n}$',\n },\n 120160: {\n id: 'U1D560',\n decimal: 120160,\n character: '할',\n latex: '$\\\\mathbb{o}$',\n },\n 120161: {\n id: 'U1D561',\n decimal: 120161,\n character: '핡',\n latex: '$\\\\mathbb{p}$',\n },\n 120162: {\n id: 'U1D562',\n decimal: 120162,\n character: '핢',\n latex: '$\\\\mathbb{q}$',\n },\n 120163: {\n id: 'U1D563',\n decimal: 120163,\n character: '핣',\n latex: '$\\\\mathbb{r}$',\n },\n 120164: {\n id: 'U1D564',\n decimal: 120164,\n character: '핤',\n latex: '$\\\\mathbb{s}$',\n },\n 120165: {\n id: 'U1D565',\n decimal: 120165,\n character: '핥',\n latex: '$\\\\mathbb{t}$',\n },\n 120166: {\n id: 'U1D566',\n decimal: 120166,\n character: '핦',\n latex: '$\\\\mathbb{u}$',\n },\n 120167: {\n id: 'U1D567',\n decimal: 120167,\n character: '핧',\n latex: '$\\\\mathbb{v}$',\n },\n 120168: {\n id: 'U1D568',\n decimal: 120168,\n character: '함',\n latex: '$\\\\mathbb{w}$',\n },\n 120169: {\n id: 'U1D569',\n decimal: 120169,\n character: '합',\n latex: '$\\\\mathbb{x}$',\n },\n 120170: {\n id: 'U1D56A',\n decimal: 120170,\n character: '핪',\n latex: '$\\\\mathbb{y}$',\n },\n 120171: {\n id: 'U1D56B',\n decimal: 120171,\n character: '핫',\n latex: '$\\\\mathbb{z}$',\n },\n 120224: {\n id: 'U1D5A0',\n decimal: 120224,\n character: '햠',\n latex: '$\\\\mathsf{A}$',\n },\n 120225: {\n id: 'U1D5A1',\n decimal: 120225,\n character: '햡',\n latex: '$\\\\mathsf{B}$',\n },\n 120226: {\n id: 'U1D5A2',\n decimal: 120226,\n character: '햢',\n latex: '$\\\\mathsf{C}$',\n },\n 120227: {\n id: 'U1D5A3',\n decimal: 120227,\n character: '햣',\n latex: '$\\\\mathsf{D}$',\n },\n 120228: {\n id: 'U1D5A4',\n decimal: 120228,\n character: '햤',\n latex: '$\\\\mathsf{E}$',\n },\n 120229: {\n id: 'U1D5A5',\n decimal: 120229,\n character: '향',\n latex: '$\\\\mathsf{F}$',\n },\n 120230: {\n id: 'U1D5A6',\n decimal: 120230,\n character: '햦',\n latex: '$\\\\mathsf{G}$',\n },\n 120231: {\n id: 'U1D5A7',\n decimal: 120231,\n character: '햧',\n latex: '$\\\\mathsf{H}$',\n },\n 120232: {\n id: 'U1D5A8',\n decimal: 120232,\n character: '햨',\n latex: '$\\\\mathsf{I}$',\n },\n 120233: {\n id: 'U1D5A9',\n decimal: 120233,\n character: '햩',\n latex: '$\\\\mathsf{J}$',\n },\n 120234: {\n id: 'U1D5AA',\n decimal: 120234,\n character: '햪',\n latex: '$\\\\mathsf{K}$',\n },\n 120235: {\n id: 'U1D5AB',\n decimal: 120235,\n character: '햫',\n latex: '$\\\\mathsf{L}$',\n },\n 120236: {\n id: 'U1D5AC',\n decimal: 120236,\n character: '햬',\n latex: '$\\\\mathsf{M}$',\n },\n 120237: {\n id: 'U1D5AD',\n decimal: 120237,\n character: '햭',\n latex: '$\\\\mathsf{N}$',\n },\n 120238: {\n id: 'U1D5AE',\n decimal: 120238,\n character: '햮',\n latex: '$\\\\mathsf{O}$',\n },\n 120239: {\n id: 'U1D5AF',\n decimal: 120239,\n character: '햯',\n latex: '$\\\\mathsf{P}$',\n },\n 120240: {\n id: 'U1D5B0',\n decimal: 120240,\n character: '햰',\n latex: '$\\\\mathsf{Q}$',\n },\n 120241: {\n id: 'U1D5B1',\n decimal: 120241,\n character: '햱',\n latex: '$\\\\mathsf{R}$',\n },\n 120242: {\n id: 'U1D5B2',\n decimal: 120242,\n character: '햲',\n latex: '$\\\\mathsf{S}$',\n },\n 120243: {\n id: 'U1D5B3',\n decimal: 120243,\n character: '햳',\n latex: '$\\\\mathsf{T}$',\n },\n 120244: {\n id: 'U1D5B4',\n decimal: 120244,\n character: '햴',\n latex: '$\\\\mathsf{U}$',\n },\n 120245: {\n id: 'U1D5B5',\n decimal: 120245,\n character: '햵',\n latex: '$\\\\mathsf{V}$',\n },\n 120246: {\n id: 'U1D5B6',\n decimal: 120246,\n character: '햶',\n latex: '$\\\\mathsf{W}$',\n },\n 120247: {\n id: 'U1D5B7',\n decimal: 120247,\n character: '햷',\n latex: '$\\\\mathsf{X}$',\n },\n 120248: {\n id: 'U1D5B8',\n decimal: 120248,\n character: '햸',\n latex: '$\\\\mathsf{Y}$',\n },\n 120249: {\n id: 'U1D5B9',\n decimal: 120249,\n character: '햹',\n latex: '$\\\\mathsf{Z}$',\n },\n 120250: {\n id: 'U1D5BA',\n decimal: 120250,\n character: '햺',\n latex: '$\\\\mathsf{a}$',\n },\n 120251: {\n id: 'U1D5BB',\n decimal: 120251,\n character: '햻',\n latex: '$\\\\mathsf{b}$',\n },\n 120252: {\n id: 'U1D5BC',\n decimal: 120252,\n character: '햼',\n latex: '$\\\\mathsf{c}$',\n },\n 120253: {\n id: 'U1D5BD',\n decimal: 120253,\n character: '햽',\n latex: '$\\\\mathsf{d}$',\n },\n 120254: {\n id: 'U1D5BE',\n decimal: 120254,\n character: '햾',\n latex: '$\\\\mathsf{e}$',\n },\n 120255: {\n id: 'U1D5BF',\n decimal: 120255,\n character: '햿',\n latex: '$\\\\mathsf{f}$',\n },\n 120256: {\n id: 'U1D5C0',\n decimal: 120256,\n character: '헀',\n latex: '$\\\\mathsf{g}$',\n },\n 120257: {\n id: 'U1D5C1',\n decimal: 120257,\n character: '헁',\n latex: '$\\\\mathsf{h}$',\n },\n 120258: {\n id: 'U1D5C2',\n decimal: 120258,\n character: '헂',\n latex: '$\\\\mathsf{i}$',\n },\n 120259: {\n id: 'U1D5C3',\n decimal: 120259,\n character: '헃',\n latex: '$\\\\mathsf{j}$',\n },\n 120260: {\n id: 'U1D5C4',\n decimal: 120260,\n character: '헄',\n latex: '$\\\\mathsf{k}$',\n },\n 120261: {\n id: 'U1D5C5',\n decimal: 120261,\n character: '헅',\n latex: '$\\\\mathsf{l}$',\n },\n 120262: {\n id: 'U1D5C6',\n decimal: 120262,\n character: '헆',\n latex: '$\\\\mathsf{m}$',\n },\n 120263: {\n id: 'U1D5C7',\n decimal: 120263,\n character: '헇',\n latex: '$\\\\mathsf{n}$',\n },\n 120264: {\n id: 'U1D5C8',\n decimal: 120264,\n character: '허',\n latex: '$\\\\mathsf{o}$',\n },\n 120265: {\n id: 'U1D5C9',\n decimal: 120265,\n character: '헉',\n latex: '$\\\\mathsf{p}$',\n },\n 120266: {\n id: 'U1D5CA',\n decimal: 120266,\n character: '헊',\n latex: '$\\\\mathsf{q}$',\n },\n 120267: {\n id: 'U1D5CB',\n decimal: 120267,\n character: '헋',\n latex: '$\\\\mathsf{r}$',\n },\n 120268: {\n id: 'U1D5CC',\n decimal: 120268,\n character: '헌',\n latex: '$\\\\mathsf{s}$',\n },\n 120269: {\n id: 'U1D5CD',\n decimal: 120269,\n character: '헍',\n latex: '$\\\\mathsf{t}$',\n },\n 120270: {\n id: 'U1D5CE',\n decimal: 120270,\n character: '헎',\n latex: '$\\\\mathsf{u}$',\n },\n 120271: {\n id: 'U1D5CF',\n decimal: 120271,\n character: '헏',\n latex: '$\\\\mathsf{v}$',\n },\n 120272: {\n id: 'U1D5D0',\n decimal: 120272,\n character: '헐',\n latex: '$\\\\mathsf{w}$',\n },\n 120273: {\n id: 'U1D5D1',\n decimal: 120273,\n character: '헑',\n latex: '$\\\\mathsf{x}$',\n },\n 120274: {\n id: 'U1D5D2',\n decimal: 120274,\n character: '헒',\n latex: '$\\\\mathsf{y}$',\n },\n 120275: {\n id: 'U1D5D3',\n decimal: 120275,\n character: '헓',\n latex: '$\\\\mathsf{z}$',\n },\n 120432: {\n id: 'U1D670',\n decimal: 120432,\n character: '홰',\n latex: '$\\\\mathtt{A}$',\n },\n 120433: {\n id: 'U1D671',\n decimal: 120433,\n character: '홱',\n latex: '$\\\\mathtt{B}$',\n },\n 120434: {\n id: 'U1D672',\n decimal: 120434,\n character: '홲',\n latex: '$\\\\mathtt{C}$',\n },\n 120435: {\n id: 'U1D673',\n decimal: 120435,\n character: '홳',\n latex: '$\\\\mathtt{D}$',\n },\n 120436: {\n id: 'U1D674',\n decimal: 120436,\n character: '홴',\n latex: '$\\\\mathtt{E}$',\n },\n 120437: {\n id: 'U1D675',\n decimal: 120437,\n character: '홵',\n latex: '$\\\\mathtt{F}$',\n },\n 120438: {\n id: 'U1D676',\n decimal: 120438,\n character: '홶',\n latex: '$\\\\mathtt{G}$',\n },\n 120439: {\n id: 'U1D677',\n decimal: 120439,\n character: '홷',\n latex: '$\\\\mathtt{H}$',\n },\n 120440: {\n id: 'U1D678',\n decimal: 120440,\n character: '홸',\n latex: '$\\\\mathtt{I}$',\n },\n 120441: {\n id: 'U1D679',\n decimal: 120441,\n character: '홹',\n latex: '$\\\\mathtt{J}$',\n },\n 120442: {\n id: 'U1D67A',\n decimal: 120442,\n character: '홺',\n latex: '$\\\\mathtt{K}$',\n },\n 120443: {\n id: 'U1D67B',\n decimal: 120443,\n character: '홻',\n latex: '$\\\\mathtt{L}$',\n },\n 120444: {\n id: 'U1D67C',\n decimal: 120444,\n character: '홼',\n latex: '$\\\\mathtt{M}$',\n },\n 120445: {\n id: 'U1D67D',\n decimal: 120445,\n character: '홽',\n latex: '$\\\\mathtt{N}$',\n },\n 120446: {\n id: 'U1D67E',\n decimal: 120446,\n character: '홾',\n latex: '$\\\\mathtt{O}$',\n },\n 120447: {\n id: 'U1D67F',\n decimal: 120447,\n character: '홿',\n latex: '$\\\\mathtt{P}$',\n },\n 120448: {\n id: 'U1D680',\n decimal: 120448,\n character: '횀',\n latex: '$\\\\mathtt{Q}$',\n },\n 120449: {\n id: 'U1D681',\n decimal: 120449,\n character: '횁',\n latex: '$\\\\mathtt{R}$',\n },\n 120450: {\n id: 'U1D682',\n decimal: 120450,\n character: '횂',\n latex: '$\\\\mathtt{S}$',\n },\n 120451: {\n id: 'U1D683',\n decimal: 120451,\n character: '횃',\n latex: '$\\\\mathtt{T}$',\n },\n 120452: {\n id: 'U1D684',\n decimal: 120452,\n character: '횄',\n latex: '$\\\\mathtt{U}$',\n },\n 120453: {\n id: 'U1D685',\n decimal: 120453,\n character: '횅',\n latex: '$\\\\mathtt{V}$',\n },\n 120454: {\n id: 'U1D686',\n decimal: 120454,\n character: '횆',\n latex: '$\\\\mathtt{W}$',\n },\n 120455: {\n id: 'U1D687',\n decimal: 120455,\n character: '횇',\n latex: '$\\\\mathtt{X}$',\n },\n 120456: {\n id: 'U1D688',\n decimal: 120456,\n character: '횈',\n latex: '$\\\\mathtt{Y}$',\n },\n 120457: {\n id: 'U1D689',\n decimal: 120457,\n character: '횉',\n latex: '$\\\\mathtt{Z}$',\n },\n 120458: {\n id: 'U1D68A',\n decimal: 120458,\n character: '횊',\n latex: '$\\\\mathtt{a}$',\n },\n 120459: {\n id: 'U1D68B',\n decimal: 120459,\n character: '횋',\n latex: '$\\\\mathtt{b}$',\n },\n 120460: {\n id: 'U1D68C',\n decimal: 120460,\n character: '회',\n latex: '$\\\\mathtt{c}$',\n },\n 120461: {\n id: 'U1D68D',\n decimal: 120461,\n character: '획',\n latex: '$\\\\mathtt{d}$',\n },\n 120462: {\n id: 'U1D68E',\n decimal: 120462,\n character: '횎',\n latex: '$\\\\mathtt{e}$',\n },\n 120463: {\n id: 'U1D68F',\n decimal: 120463,\n character: '횏',\n latex: '$\\\\mathtt{f}$',\n },\n 120464: {\n id: 'U1D690',\n decimal: 120464,\n character: '횐',\n latex: '$\\\\mathtt{g}$',\n },\n 120465: {\n id: 'U1D691',\n decimal: 120465,\n character: '횑',\n latex: '$\\\\mathtt{h}$',\n },\n 120466: {\n id: 'U1D692',\n decimal: 120466,\n character: '횒',\n latex: '$\\\\mathtt{i}$',\n },\n 120467: {\n id: 'U1D693',\n decimal: 120467,\n character: '횓',\n latex: '$\\\\mathtt{j}$',\n },\n 120468: {\n id: 'U1D694',\n decimal: 120468,\n character: '횔',\n latex: '$\\\\mathtt{k}$',\n },\n 120469: {\n id: 'U1D695',\n decimal: 120469,\n character: '횕',\n latex: '$\\\\mathtt{l}$',\n },\n 120470: {\n id: 'U1D696',\n decimal: 120470,\n character: '횖',\n latex: '$\\\\mathtt{m}$',\n },\n 120471: {\n id: 'U1D697',\n decimal: 120471,\n character: '횗',\n latex: '$\\\\mathtt{n}$',\n },\n 120472: {\n id: 'U1D698',\n decimal: 120472,\n character: '횘',\n latex: '$\\\\mathtt{o}$',\n },\n 120473: {\n id: 'U1D699',\n decimal: 120473,\n character: '횙',\n latex: '$\\\\mathtt{p}$',\n },\n 120474: {\n id: 'U1D69A',\n decimal: 120474,\n character: '횚',\n latex: '$\\\\mathtt{q}$',\n },\n 120475: {\n id: 'U1D69B',\n decimal: 120475,\n character: '횛',\n latex: '$\\\\mathtt{r}$',\n },\n 120476: {\n id: 'U1D69C',\n decimal: 120476,\n character: '횜',\n latex: '$\\\\mathtt{s}$',\n },\n 120477: {\n id: 'U1D69D',\n decimal: 120477,\n character: '횝',\n latex: '$\\\\mathtt{t}$',\n },\n 120478: {\n id: 'U1D69E',\n decimal: 120478,\n character: '횞',\n latex: '$\\\\mathtt{u}$',\n },\n 120479: {\n id: 'U1D69F',\n decimal: 120479,\n character: '횟',\n latex: '$\\\\mathtt{v}$',\n },\n 120480: {\n id: 'U1D6A0',\n decimal: 120480,\n character: '횠',\n latex: '$\\\\mathtt{w}$',\n },\n 120481: {\n id: 'U1D6A1',\n decimal: 120481,\n character: '횡',\n latex: '$\\\\mathtt{x}$',\n },\n 120482: {\n id: 'U1D6A2',\n decimal: 120482,\n character: '횢',\n latex: '$\\\\mathtt{y}$',\n },\n 120483: {\n id: 'U1D6A3',\n decimal: 120483,\n character: '횣',\n latex: '$\\\\mathtt{z}$',\n },\n 120490: {\n id: 'U1D6AA',\n decimal: 120490,\n character: '횪',\n latex: '$\\\\mathbf{\\\\Gamma}$',\n },\n 120491: {\n id: 'U1D6AB',\n decimal: 120491,\n character: '횫',\n latex: '$\\\\mathbf{\\\\Delta}$',\n },\n 120495: {\n id: 'U1D6AF',\n decimal: 120495,\n character: '횯',\n latex: '$\\\\mathbf{\\\\Theta}$',\n },\n 120498: {\n id: 'U1D6B2',\n decimal: 120498,\n character: '횲',\n latex: '$\\\\mathbf{\\\\Lambda}$',\n },\n 120499: {\n id: 'U1D6B3',\n decimal: 120499,\n character: '횳',\n latex: '$\\\\mathbf{M}$',\n },\n 120500: {\n id: 'U1D6B4',\n decimal: 120500,\n character: '횴',\n latex: 'N',\n },\n 120501: {\n id: 'U1D6B5',\n decimal: 120501,\n character: '횵',\n latex: '$\\\\mathbf{\\\\Xi}$',\n },\n 120502: {\n id: 'U1D6B6',\n decimal: 120502,\n character: '횶',\n latex: 'O',\n },\n 120503: {\n id: 'U1D6B7',\n decimal: 120503,\n character: '횷',\n latex: '$\\\\mathbf{\\\\Pi}$',\n },\n 120505: {\n id: 'U1D6B9',\n decimal: 120505,\n character: '횹',\n latex: '$\\\\mathbf{\\\\vartheta}$',\n },\n 120506: {\n id: 'U1D6BA',\n decimal: 120506,\n character: '횺',\n latex: '$\\\\mathbf{\\\\Sigma}$',\n },\n 120508: {\n id: 'U1D6BC',\n decimal: 120508,\n character: '횼',\n latex: '$\\\\mathbf{\\\\Upsilon}$',\n },\n 120509: {\n id: 'U1D6BD',\n decimal: 120509,\n character: '횽',\n latex: '$\\\\mathbf{\\\\Phi}$',\n },\n 120511: {\n id: 'U1D6BF',\n decimal: 120511,\n character: '횿',\n latex: '$\\\\mathbf{\\\\Psi}$',\n },\n 120512: {\n id: 'U1D6C0',\n decimal: 120512,\n character: '훀',\n latex: '$\\\\mathbf{\\\\Omega}$',\n },\n 120513: {\n id: 'U1D6C1',\n decimal: 120513,\n character: '훁',\n latex: '$\\\\mathbf{\\\\nabla}$',\n },\n 120514: {\n id: 'U1D6C2',\n decimal: 120514,\n character: '훂',\n latex: '$\\\\mathbf{\\\\alpha}$',\n },\n 120515: {\n id: 'U1D6C3',\n decimal: 120515,\n character: '훃',\n latex: '$\\\\mathbf{\\\\beta}$',\n },\n 120516: {\n id: 'U1D6C4',\n decimal: 120516,\n character: '후',\n latex: '$\\\\mathbf{\\\\gamma}$',\n },\n 120517: {\n id: 'U1D6C5',\n decimal: 120517,\n character: '훅',\n latex: '$\\\\mathbf{\\\\delta}$',\n },\n 120518: {\n id: 'U1D6C6',\n decimal: 120518,\n character: '훆',\n latex: '$\\\\mathbf{\\\\epsilon}$',\n },\n 120519: {\n id: 'U1D6C7',\n decimal: 120519,\n character: '훇',\n latex: '$\\\\mathbf{\\\\zeta}$',\n },\n 120520: {\n id: 'U1D6C8',\n decimal: 120520,\n character: '훈',\n latex: '$\\\\mathbf{\\\\eta}$',\n },\n 120521: {\n id: 'U1D6C9',\n decimal: 120521,\n character: '훉',\n latex: '$\\\\mathbf{\\\\theta}$',\n },\n 120522: {\n id: 'U1D6CA',\n decimal: 120522,\n character: '훊',\n latex: '$\\\\mathbf{\\\\iota}$',\n },\n 120523: {\n id: 'U1D6CB',\n decimal: 120523,\n character: '훋',\n latex: '$\\\\mathbf{\\\\kappa}$',\n },\n 120524: {\n id: 'U1D6CC',\n decimal: 120524,\n character: '훌',\n latex: '$\\\\mathbf{\\\\lambda}$',\n },\n 120525: {\n id: 'U1D6CD',\n decimal: 120525,\n character: '훍',\n latex: '$\\\\mathbf{\\\\mu}$',\n },\n 120526: {\n id: 'U1D6CE',\n decimal: 120526,\n character: '훎',\n latex: '$\\\\mathbf{\\\\nu}$',\n },\n 120527: {\n id: 'U1D6CF',\n decimal: 120527,\n character: '훏',\n latex: '$\\\\mathbf{\\\\xi}$',\n },\n 120528: {\n id: 'U1D6D0',\n decimal: 120528,\n character: '훐',\n latex: '$\\\\mathbf{o}$',\n },\n 120529: {\n id: 'U1D6D1',\n decimal: 120529,\n character: '훑',\n latex: '$\\\\mathbf{\\\\pi}$',\n },\n 120530: {\n id: 'U1D6D2',\n decimal: 120530,\n character: '훒',\n latex: '$\\\\mathbf{\\\\rho}$',\n },\n 120531: {\n id: 'U1D6D3',\n decimal: 120531,\n character: '훓',\n latex: '$\\\\mathbf{\\\\varsigma}$',\n },\n 120532: {\n id: 'U1D6D4',\n decimal: 120532,\n character: '훔',\n latex: '$\\\\mathbf{\\\\sigma}$',\n },\n 120533: {\n id: 'U1D6D5',\n decimal: 120533,\n character: '훕',\n latex: '$\\\\mathbf{\\\\tau}$',\n },\n 120534: {\n id: 'U1D6D6',\n decimal: 120534,\n character: '훖',\n latex: '$\\\\mathbf{\\\\upsilon}$',\n },\n 120535: {\n id: 'U1D6D7',\n decimal: 120535,\n character: '훗',\n latex: '$\\\\mathbf{\\\\phi}$',\n },\n 120536: {\n id: 'U1D6D8',\n decimal: 120536,\n character: '훘',\n latex: '$\\\\mathbf{\\\\chi}$',\n },\n 120537: {\n id: 'U1D6D9',\n decimal: 120537,\n character: '훙',\n latex: '$\\\\mathbf{\\\\psi}$',\n },\n 120538: {\n id: 'U1D6DA',\n decimal: 120538,\n character: '훚',\n latex: '$\\\\mathbf{\\\\omega}$',\n },\n 120540: {\n id: 'U1D6DC',\n decimal: 120540,\n character: '훜',\n latex: '$\\\\mathbf{\\\\varepsilon}$',\n },\n 120541: {\n id: 'U1D6DD',\n decimal: 120541,\n character: '훝',\n latex: '$\\\\mathbf{\\\\vartheta}$',\n },\n 120542: {\n id: 'U1D6DE',\n decimal: 120542,\n character: '훞',\n latex: '$\\\\mathbf{\\\\varkappa}$',\n },\n 120543: {\n id: 'U1D6DF',\n decimal: 120543,\n character: '훟',\n latex: '$\\\\mathbf{\\\\phi}$',\n },\n 120544: {\n id: 'U1D6E0',\n decimal: 120544,\n character: '훠',\n latex: '$\\\\mathbf{\\\\varrho}$',\n },\n 120545: {\n id: 'U1D6E1',\n decimal: 120545,\n character: '훡',\n latex: '$\\\\mathbf{\\\\varpi}$',\n },\n 120558: {\n id: 'U1D6EE',\n decimal: 120558,\n character: '훮',\n latex: 'N',\n },\n 120560: {\n id: 'U1D6F0',\n decimal: 120560,\n character: '훰',\n latex: 'O',\n },\n 120618: {\n id: 'U1D72A',\n decimal: 120618,\n character: '휪',\n latex: 'O',\n },\n 120676: {\n id: 'U1D764',\n decimal: 120676,\n character: '흤',\n latex: 'O',\n },\n 120734: {\n id: 'U1D79E',\n decimal: 120734,\n character: '힞',\n latex: 'O',\n },\n 120782: {\n id: 'U1D7CE',\n decimal: 120782,\n character: 'ퟎ',\n latex: '$\\\\mathbf{0}$',\n },\n 120783: {\n id: 'U1D7CF',\n decimal: 120783,\n character: 'ퟏ',\n latex: '$\\\\mathbf{1}$',\n },\n 120784: {\n id: 'U1D7D0',\n decimal: 120784,\n character: 'ퟐ',\n latex: '$\\\\mathbf{2}$',\n },\n 120785: {\n id: 'U1D7D1',\n decimal: 120785,\n character: 'ퟑ',\n latex: '$\\\\mathbf{3}$',\n },\n 120786: {\n id: 'U1D7D2',\n decimal: 120786,\n character: 'ퟒ',\n latex: '$\\\\mathbf{4}$',\n },\n 120787: {\n id: 'U1D7D3',\n decimal: 120787,\n character: 'ퟓ',\n latex: '$\\\\mathbf{5}$',\n },\n 120788: {\n id: 'U1D7D4',\n decimal: 120788,\n character: 'ퟔ',\n latex: '$\\\\mathbf{6}$',\n },\n 120789: {\n id: 'U1D7D5',\n decimal: 120789,\n character: 'ퟕ',\n latex: '$\\\\mathbf{7}$',\n },\n 120790: {\n id: 'U1D7D6',\n decimal: 120790,\n character: 'ퟖ',\n latex: '$\\\\mathbf{8}$',\n },\n 120791: {\n id: 'U1D7D7',\n decimal: 120791,\n character: 'ퟗ',\n latex: '$\\\\mathbf{9}$',\n },\n 120792: {\n id: 'U1D7D8',\n decimal: 120792,\n character: 'ퟘ',\n latex: '$\\\\mathbb{0}$',\n },\n 120793: {\n id: 'U1D7D9',\n decimal: 120793,\n character: 'ퟙ',\n latex: '$\\\\mathbb{1}$',\n },\n 120794: {\n id: 'U1D7DA',\n decimal: 120794,\n character: 'ퟚ',\n latex: '$\\\\mathbb{2}$',\n },\n 120795: {\n id: 'U1D7DB',\n decimal: 120795,\n character: 'ퟛ',\n latex: '$\\\\mathbb{3}$',\n },\n 120796: {\n id: 'U1D7DC',\n decimal: 120796,\n character: 'ퟜ',\n latex: '$\\\\mathbb{4}$',\n },\n 120797: {\n id: 'U1D7DD',\n decimal: 120797,\n character: 'ퟝ',\n latex: '$\\\\mathbb{5}$',\n },\n 120798: {\n id: 'U1D7DE',\n decimal: 120798,\n character: 'ퟞ',\n latex: '$\\\\mathbb{6}$',\n },\n 120799: {\n id: 'U1D7DF',\n decimal: 120799,\n character: 'ퟟ',\n latex: '$\\\\mathbb{7}$',\n },\n 120800: {\n id: 'U1D7E0',\n decimal: 120800,\n character: 'ퟠ',\n latex: '$\\\\mathbb{8}$',\n },\n 120801: {\n id: 'U1D7E1',\n decimal: 120801,\n character: 'ퟡ',\n latex: '$\\\\mathbb{9}$',\n },\n 120802: {\n id: 'U1D7E2',\n decimal: 120802,\n character: 'ퟢ',\n latex: '$\\\\mathsf{0}$',\n },\n 120803: {\n id: 'U1D7E3',\n decimal: 120803,\n character: 'ퟣ',\n latex: '$\\\\mathsf{1}$',\n },\n 120804: {\n id: 'U1D7E4',\n decimal: 120804,\n character: 'ퟤ',\n latex: '$\\\\mathsf{2}$',\n },\n 120805: {\n id: 'U1D7E5',\n decimal: 120805,\n character: 'ퟥ',\n latex: '$\\\\mathsf{3}$',\n },\n 120806: {\n id: 'U1D7E6',\n decimal: 120806,\n character: 'ퟦ',\n latex: '$\\\\mathsf{4}$',\n },\n 120807: {\n id: 'U1D7E7',\n decimal: 120807,\n character: 'ퟧ',\n latex: '$\\\\mathsf{5}$',\n },\n 120808: {\n id: 'U1D7E8',\n decimal: 120808,\n character: 'ퟨ',\n latex: '$\\\\mathsf{6}$',\n },\n 120809: {\n id: 'U1D7E9',\n decimal: 120809,\n character: 'ퟩ',\n latex: '$\\\\mathsf{7}$',\n },\n 120810: {\n id: 'U1D7EA',\n decimal: 120810,\n character: 'ퟪ',\n latex: '$\\\\mathsf{8}$',\n },\n 120811: {\n id: 'U1D7EB',\n decimal: 120811,\n character: 'ퟫ',\n latex: '$\\\\mathsf{9}$',\n },\n 120822: {\n id: 'U1D7F6',\n decimal: 120822,\n character: 'ퟶ',\n latex: '$\\\\mathtt{0}$',\n },\n 120823: {\n id: 'U1D7F7',\n decimal: 120823,\n character: 'ퟷ',\n latex: '$\\\\mathtt{1}$',\n },\n 120824: {\n id: 'U1D7F8',\n decimal: 120824,\n character: 'ퟸ',\n latex: '$\\\\mathtt{2}$',\n },\n 120825: {\n id: 'U1D7F9',\n decimal: 120825,\n character: 'ퟹ',\n latex: '$\\\\mathtt{3}$',\n },\n 120826: {\n id: 'U1D7FA',\n decimal: 120826,\n character: 'ퟺ',\n latex: '$\\\\mathtt{4}$',\n },\n 120827: {\n id: 'U1D7FB',\n decimal: 120827,\n character: 'ퟻ',\n latex: '$\\\\mathtt{5}$',\n },\n 120828: {\n id: 'U1D7FC',\n decimal: 120828,\n character: '',\n latex: '$\\\\mathtt{6}$',\n },\n 120829: {\n id: 'U1D7FD',\n decimal: 120829,\n character: '',\n latex: '$\\\\mathtt{7}$',\n },\n 120830: {\n id: 'U1D7FE',\n decimal: 120830,\n character: '',\n latex: '$\\\\mathtt{8}$',\n },\n 120831: {\n id: 'U1D7FF',\n decimal: 120831,\n character: '',\n latex: '$\\\\mathtt{9}$',\n },\n};\n\nexport default characters;\n","/*\n * bibliography-provider_zotero.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { ZoteroCollection, ZoteroServer, kZoteroBibTeXTranslator, ZoteroCollectionSpec, ZoteroCSL } from '../zotero';\n\nimport { ParsedYaml, valueFromYamlText } from '../yaml';\nimport { suggestCiteId } from '../cite';\n\nimport {\n BibliographyDataProvider,\n BibliographyFile,\n BibliographySourceWithCollections,\n BibliographyCollection,\n} from './bibliography';\nimport { EditorUI } from '../ui';\nimport { CSL } from '../csl';\nimport { toBibTeX } from './bibDB';\nimport { Editor } from '../../editor/editor';\n\nexport const kZoteroProviderKey = '2509FBBE-5BB0-44C4-B119-6083A81ED673';\n\nexport class BibliographyDataProviderZotero implements BibliographyDataProvider {\n private allCollections: ZoteroCollection[] = [];\n private allCollectionSpecs: BibliographyCollection[] = [];\n private server: ZoteroServer;\n private warning: string | undefined;\n private enabled = true;\n\n private docPath: string | undefined;\n private zoteroConfig: boolean | string[] | undefined;\n\n public constructor(server: ZoteroServer) {\n this.server = server;\n }\n\n public name: string = 'Zotero';\n public key: string = kZoteroProviderKey;\n public requiresWritable: boolean = true;\n\n public async load(\n _ui: EditorUI,\n docPath: string,\n _resourcePath: string,\n yamlBlocks: ParsedYaml[],\n refreshCollectionData: boolean,\n ): Promise<boolean> {\n let hasUpdates = false;\n this.docPath = docPath;\n this.zoteroConfig = zoteroConfig(yamlBlocks);\n if (this.zoteroConfig) {\n // Enabled\n this.enabled = true;\n try {\n // Don't send the items back through to the server\n const collectionSpecs = this.allCollections.map(({ items, ...rest }) => rest);\n\n // If there is a warning, stop using the cache and force a fresh trip\n // through the whole pipeline to be sure we're trying to clear that warning\n const useCache = this.warning === undefined || this.warning.length === 0;\n\n // The collection specified in the document header\n const collections = Array.isArray(this.zoteroConfig) ? this.zoteroConfig : [];\n const result = await this.server.getCollections(docPath, collections, collectionSpecs || [], useCache);\n this.warning = result.warning;\n if (result.status === 'ok') {\n if (result.message) {\n const newCollections = (result.message as ZoteroCollection[]).map(collection => {\n const existingCollection = this.allCollections.find(col => col.name === collection.name);\n // If the version is 0 this is a local instance that isn't incrementing version numbers, do not cache\n if (useCache && existingCollection && existingCollection.version === collection.version && existingCollection.version !== 0) {\n collection.items = existingCollection.items;\n } else {\n hasUpdates = true;\n }\n return collection;\n });\n hasUpdates = hasUpdates || newCollections.length !== this.collections.length;\n this.allCollections = newCollections;\n }\n } else {\n // console.log(result.status);\n }\n } catch (err) {\n // console.log(err);\n }\n\n if (refreshCollectionData) {\n // Lookup the collection specs\n const specResult = await this.server.getActiveCollectionSpecs(\n this.docPath || null,\n Array.isArray(this.zoteroConfig) ? this.zoteroConfig : [],\n );\n if (specResult && specResult.status === 'ok') {\n this.allCollectionSpecs = specResult.message.map((spec: ZoteroCollectionSpec) =>\n this.toBibliographyCollection(spec),\n );\n } else {\n this.allCollectionSpecs = [];\n }\n }\n } else {\n // Zotero is disabled, clear any already loaded bibliography\n if (this.collections.length > 0) {\n hasUpdates = true;\n }\n // Disabled\n this.enabled = false;\n this.allCollections = [];\n this.allCollectionSpecs = [];\n }\n return hasUpdates;\n }\n\n // Respect enabled;\n public isEnabled(): boolean {\n return this.enabled && (this.allCollections.length > 0 || this.allCollectionSpecs.length > 0);\n }\n\n public collections(): BibliographyCollection[] {\n return this.allCollectionSpecs || [];\n }\n\n private toBibliographyCollection(zoteroSpec: ZoteroCollectionSpec) {\n return {\n name: zoteroSpec.name,\n key: zoteroSpec.key,\n parentKey: zoteroSpec.parentKey,\n provider: kZoteroProviderKey,\n };\n }\n\n public items(): BibliographySourceWithCollections[] {\n const entryArrays = this.allCollections?.map(collection => this.bibliographySources(collection)) || [];\n const zoteroEntries = ([] as BibliographySourceWithCollections[]).concat(...entryArrays);\n return zoteroEntries;\n }\n\n public itemsForCollection(collectionKey?: string): BibliographySourceWithCollections[] {\n if (!collectionKey) {\n return this.items();\n }\n\n return this.items().filter((item: any) => {\n if (item.collectionKeys) {\n return item.collectionKeys.includes(collectionKey);\n }\n return false;\n });\n }\n\n public bibliographyPaths(doc: ProsemirrorNode, ui: EditorUI): BibliographyFile[] {\n return [];\n }\n\n public async generateBibTeX(ui: EditorUI, id: string, csl: CSL): Promise<string | undefined> {\n if (csl.key && ui.prefs.zoteroUseBetterBibtex()) {\n const bibTeX = await this.server.betterBibtexExport(\n [csl.key],\n kZoteroBibTeXTranslator,\n parseInt((csl as ZoteroCSL).libraryID, 10),\n );\n if (bibTeX) {\n return Promise.resolve(bibTeX.message);\n }\n }\n return Promise.resolve(toBibTeX(id, csl));\n }\n\n public warningMessage(): string | undefined {\n return this.warning;\n }\n\n private bibliographySources(collection: ZoteroCollection): BibliographySourceWithCollections[] {\n const items = collection.items?.map(item => {\n return {\n ...item,\n id: item.id || suggestCiteId([], item),\n providerKey: this.key,\n collectionKeys: item.collectionKeys,\n };\n });\n return items || [];\n }\n}\n\n// The Zotero header allows the following:\n// zotero: true | false Globally enables or disables the zotero integration\n// If true, uses all collections. If false uses none.\n//\n// By default, zotero integration is enabled. Add this header to disable integration\n//\nfunction zoteroConfig(parsedYamls: ParsedYaml[]): boolean | string[] {\n // Read the values of any yaml blocks that include bibliography headers\n // filter out blocks that don't include such headers\n const zoteroValues = parsedYamls\n .map(parsedYaml => {\n return valueFromYamlText('zotero', parsedYaml.yamlCode);\n })\n .filter(val => val !== null);\n\n if (zoteroValues.length > 0) {\n // Pandoc will use the last biblography node when generating a bibliography.\n // Take the same approach to the Zotero header and use the last node\n const zoteroConfigValue = zoteroValues[zoteroValues.length - 1];\n if (typeof zoteroConfigValue === 'boolean') {\n return zoteroConfigValue;\n } else if (typeof zoteroConfigValue === 'string') {\n return [zoteroConfigValue];\n } else if (Array.isArray(zoteroConfigValue)) {\n return zoteroConfigValue.map(String);\n } else {\n return true;\n }\n }\n return true;\n}\n","/*\n * zotero.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { CSL } from './csl';\n\nexport interface ZoteroResult {\n status:\n | 'ok' // ok (results in 'message')\n | 'notfound' // invalid api key\n | 'nohost' // no internet connectivity\n | 'error'; // unexpected error (details in 'error')\n message: any | null;\n warning: string;\n error: string;\n}\n\nexport interface ZoteroCollectionSpec {\n name: string;\n version: number;\n key: string;\n parentKey: string;\n}\n\nexport interface ZoteroCollection extends ZoteroCollectionSpec {\n items: ZoteroCSL[];\n}\n\nexport interface ZoteroCSL extends CSL {\n libraryID: string;\n collectionKeys: string[];\n}\n\n// https://github.com/retorquere/zotero-better-bibtex/blob/master/translators/Better%20BibTeX.json\nexport const kZoteroBibTeXTranslator = 'ca65189f-8815-4afe-8c8b-8c7c15f0edca';\n\nexport interface ZoteroServer {\n validateWebAPIKey: (key: string) => Promise<boolean>;\n\n getCollections: (\n file: string | null,\n collections: string[],\n cached: ZoteroCollectionSpec[],\n useCache: boolean,\n ) => Promise<ZoteroResult>;\n\n getLibraryNames: () => Promise<ZoteroResult>;\n\n getActiveCollectionSpecs: (file: string | null, collections: string[]) => Promise<ZoteroResult>;\n\n // Return status: nohost w/ warning text if it fails to\n // communciate w/ Better BibTeX. Otherwise returns\n // status: ok with exported text in message.\n betterBibtexExport: (itemKeys: string[], translatorId: string, libraryId: number) => Promise<ZoteroResult>;\n}\n","/*\n * cite-completion.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\nimport { DecorationSet, EditorView } from 'prosemirror-view';\n\nimport React from 'react';\nimport uniqby from 'lodash.uniqby';\n\nimport { BibliographyManager } from '../../api/bibliography/bibliography';\nimport { CompletionHandler, CompletionResult, CompletionHeaderProps } from '../../api/completion';\nimport { hasDOI } from '../../api/doi';\nimport { searchPlaceholderDecoration } from '../../api/placeholder';\nimport { EditorUI } from '../../api/ui';\nimport { CompletionItemView } from '../../api/widgets/completion';\n\nimport { EditorServer } from '../../api/server';\nimport { EditorEvents } from '../../api/events';\n\nimport { parseCitation } from './cite';\n\nimport './cite-completion.css';\nimport { bibliographyCiteCompletionProvider } from './cite-completion-bibliography';\nimport { EditorFormat, kQuartoDocType } from '../../api/format';\nimport { quartoXrefCiteCompletionProvider, kCiteCompletionTypeXref } from './cite-completion-quarto-xref';\nimport { completionIndex, CiteCompletionSearch } from './cite-completion-search';\n\n\nconst kAuthorMaxChars = 28;\nconst kMaxCitationCompletions = 100;\nconst kHeaderHeight = 20;\n\nexport const kCiteCompletionWidth = 400;\nconst kCiteCompletionItemPadding = 10;\n\nexport const kCitationCompleteScope = 'CitationScope';\n\n// An entry which includes the source as well\n// additional metadata for displaying a bibliograph item\nexport interface CiteCompletionEntry {\n id: string;\n type: string;\n primaryText: string;\n secondaryText: (len: number) => string;\n detailText: string;\n image?: string;\n imageAdornment?: string;\n replace: (view: EditorView, pos: number, server: EditorServer) => Promise<void>;\n index?: {\n secondary?: string;\n tertiary?: string;\n };\n}\n\nexport interface CiteCompletionProvider {\n currentEntries: () => CiteCompletionEntry[] | undefined;\n streamEntries: (doc: ProsemirrorNode, onStreamReady: (entries: CiteCompletionEntry[]) => void) => void;\n awaitEntries: (doc: ProsemirrorNode) => Promise<CiteCompletionEntry[]>;\n warningMessage: () => string | undefined;\n}\n\nexport function citationCompletionHandler(\n ui: EditorUI,\n _events: EditorEvents,\n bibManager: BibliographyManager,\n server: EditorServer,\n format: EditorFormat\n): CompletionHandler<CiteCompletionEntry> {\n\n // Load the providers\n const completionProviders = [bibliographyCiteCompletionProvider(ui, bibManager)];\n if (format.docTypes.includes(kQuartoDocType)) {\n // If this is a Quarto doc, use the quartoXref provider\n completionProviders.push(quartoXrefCiteCompletionProvider(ui, server));\n }\n // create the search index\n const searchIndex = completionIndex();\n\n return {\n id: 'AB9D4F8C-DA00-403A-AB4A-05373906FD8C',\n\n scope: kCitationCompleteScope,\n\n completions: citationCompletions(ui, completionProviders, searchIndex),\n\n filter: (entries: CiteCompletionEntry[], state: EditorState, token: string) => {\n return filterCitations(token, completionProviders, searchIndex, entries, ui, state.doc);\n },\n\n replace(view: EditorView, pos: number, entry: CiteCompletionEntry | null) {\n // If there is an entry selected, insert it into the document\n if (entry) {\n entry.replace(view, pos, server);\n }\n return Promise.resolve();\n },\n\n replacement(_schema: Schema, entry: CiteCompletionEntry | null): string | ProsemirrorNode | null {\n if (entry) {\n return entry.id;\n } else {\n return null;\n }\n },\n\n view: {\n header: () => {\n const warningProvider = completionProviders.find(provider => provider.warningMessage() !== undefined);\n if (warningProvider) {\n return {\n component: CompletionWarningHeaderView,\n height: kHeaderHeight,\n message: warningProvider.warningMessage(),\n };\n }\n },\n component: CiteCompletionItemView,\n key: entry => entry.id,\n width: kCiteCompletionWidth,\n height: 54,\n maxVisible: 5,\n hideNoResults: true,\n },\n };\n}\n\nfunction filterCitations(token: string, completionProviders: CiteCompletionProvider[], citeSearch: CiteCompletionSearch, entries: CiteCompletionEntry[], ui: EditorUI, doc: ProsemirrorNode) {\n // Empty query or DOI\n if (token.trim().length === 0 || hasDOI(token)) {\n return entries;\n }\n // Filter an exact match - if its exact match to an entry in the bibliography already, skip completion\n // Ignore any punctuation at the end of the token\n const tokenWithoutEndPunctuation = token.match(/.*[^\\,\\!\\?\\.\\:]/);\n const completionId = tokenWithoutEndPunctuation ? tokenWithoutEndPunctuation[0] : token;\n if (citeSearch.exactMatch(completionId)) {\n return [];\n }\n\n // Perform a search\n const searchResults = citeSearch.search(token, kMaxCitationCompletions);\n return searchResults || [];\n}\n\nfunction dedupe(entries: CiteCompletionEntry[]): CiteCompletionEntry[] {\n // Move the xrefs to the front to ensure that they are kept\n const orderedByType = entries.sort((a, b) => {\n if (a.type === b.type) {\n return 0;\n } else if (a.type === kCiteCompletionTypeXref) {\n return -1;\n } else {\n return 1;\n }\n });\n\n return uniqby(orderedByType, (entry: CiteCompletionEntry) => entry.id);\n}\n\nfunction sortEntries(entries: CiteCompletionEntry[]): CiteCompletionEntry[] {\n const dedupedSources = dedupe(entries);\n return dedupedSources.sort((a, b) => a.id.localeCompare(b.id));\n}\n\nfunction citationCompletions(ui: EditorUI, completionProviders: CiteCompletionProvider[], citeSearch: CiteCompletionSearch) {\n return (_text: string, context: EditorState | Transaction): CompletionResult<CiteCompletionEntry> | null => {\n\n const parsed = parseCitation(context);\n if (parsed) {\n return {\n token: parsed.token,\n pos: parsed.pos,\n offset: parsed.offset,\n completions: async (_state: EditorState) => {\n\n // If all providers have entries already loaded, we can use those and stream any updates\n const hasCurrentEntries = completionProviders.every(provider => provider.currentEntries());\n if (hasCurrentEntries) {\n\n let currentEntries: CiteCompletionEntry[] = [];\n completionProviders.forEach(provider => {\n const entries = provider.currentEntries();\n if (entries) {\n currentEntries = currentEntries || [];\n currentEntries.push(...entries);\n }\n });\n\n // Index the current Entries\n currentEntries = sortEntries(currentEntries);\n citeSearch.setEntries(currentEntries);\n\n // kick off another load which we'll stream in by setting entries\n let loadedEntries: CiteCompletionEntry[] = [];\n let providerCount = 0;\n completionProviders.forEach(provider => {\n provider.streamEntries(context.doc, (entries: CiteCompletionEntry[]) => {\n providerCount = providerCount + 1;\n\n const updatedEntries = [...loadedEntries, ...entries];\n loadedEntries = sortEntries(updatedEntries);\n if (providerCount >= completionProviders.length) {\n citeSearch.setEntries(loadedEntries);\n }\n });\n });\n\n // return stream\n return {\n items: currentEntries,\n stream: () => loadedEntries,\n };\n\n } else {\n // Otherwise, we need to wait and load the entries\n const promises = completionProviders.map(provider => provider.awaitEntries(context.doc));\n return Promise.all(promises).then(values => {\n const results: CiteCompletionEntry[] = [];\n\n values.forEach(value => results.push(...value));\n\n // Index the current Entries\n const sortedEntries = sortEntries(results);\n citeSearch.setEntries(sortedEntries);\n return sortedEntries;\n });\n }\n },\n decorations:\n parsed.token.length === 0\n ? DecorationSet.create(context.doc, [\n searchPlaceholderDecoration(context.selection.head, ui, ui.context.translateText('or DOI')),\n ])\n : undefined,\n };\n }\n return null;\n };\n}\n\n// The title may contain spans to control case specifically - consequently, we need\n// to render the title as HTML rather than as a string\nexport const CiteCompletionItemView: React.FC<CiteCompletionEntry> = entry => {\n return (\n <CompletionItemView\n width={kCiteCompletionWidth - kCiteCompletionItemPadding}\n image={entry.image}\n imageAdornment={entry.imageAdornment}\n title={`@${entry.primaryText}`}\n detail={entry.secondaryText(kAuthorMaxChars - entry.primaryText.length)}\n subTitle={entry.detailText}\n htmlTitle={true}\n />\n );\n};\n\nconst CompletionWarningHeaderView: React.FC<CompletionHeaderProps> = props => {\n return (\n <div className={'pm-completion-cite-warning pm-pane-border-color'}>\n {props.ui.context.translateText(props.message || 'An unexpected warning occurred.')}\n </div>\n );\n};\n","/*\n * completion.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\n\nimport { WidgetProps } from './react';\n\nimport './completion.css';\n\nexport interface CompletionItemViewProps extends WidgetProps {\n width: number;\n image?: string;\n imageAdornment?: string;\n title: string;\n detail?: string;\n subTitle: string;\n htmlTitle?: boolean;\n}\n\nexport const CompletionItemView: React.FC<CompletionItemViewProps> = props => {\n const className = ['pm-completion-item'].concat(props.classes || []).join(' ');\n const style: React.CSSProperties = {\n width: props.width + 'px',\n ...props.style,\n };\n\n return (\n <div className={className} style={style}>\n <div className={'pm-completion-item-type'}>\n {props.imageAdornment ? (\n <img\n className={'pm-completion-image-adorn pm-block-border-color pm-background-color'}\n src={props.imageAdornment}\n draggable=\"false\"\n />\n ) : (\n undefined\n )}\n <img className={'pm-completion-item-icon pm-block-border-color'} src={props.image} draggable=\"false\"/>\n </div>\n <div className={'pm-completion-item-summary'} style={{ width: props.width - 40 - 36 + 'px' }}>\n <div className={'pm-completion-item-id'}>\n <div className={'pm-completion-item-primary pm-completion-item-title pm-fixedwidth-font'}>{props.title}</div>\n <div className={'pm-completion-item-primary pm-completion-item-detail'}>{props.detail}</div>\n </div>\n {props.htmlTitle ? (\n <div className={'pm-completion-item-subTitle'} dangerouslySetInnerHTML={{ __html: props.subTitle || '' }} />\n ) : (\n <div className={'pm-completion-item-subTitle'}>{props.subTitle}</div>\n )}\n </div>\n </div>\n );\n};\n","/*\n * cite-completion-bibliography.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\n\nimport { BibliographySource, BibliographyManager } from '../../api/bibliography/bibliography';\nimport { kZoteroProviderKey } from '../../api/bibliography/bibliography-provider_zotero';\nimport { formatAuthors, formatIssuedDate } from '../../api/cite';\nimport { imageForType, CSLName } from '../../api/csl';\nimport { EditorUI } from '../../api/ui';\n\nimport { insertCitation as insertSingleCitation, performCiteCompletionReplacement } from './cite';\nimport { CiteCompletionEntry, CiteCompletionProvider } from './cite-completion';\nimport { EditorServer } from '../../api/server';\n\nexport const kCiteCompletionTypeBibliography = \"bibl\";\n\nexport function bibliographyCiteCompletionProvider(ui: EditorUI, bibliographyManager: BibliographyManager): CiteCompletionProvider {\n\n const referenceEntryForSource = (source: BibliographySource, forceLightMode?: boolean): CiteCompletionEntry => {\n\n // Core item metadata\n const id = source.id;\n const primaryText = id;\n const detailText = source.title || source['short-title'] || source['container-title'] || source.type;\n const image = imageForType(ui.images, source.type)[ui.prefs.darkMode() && !forceLightMode ? 1 : 0];\n const imageAdornment = source.providerKey === kZoteroProviderKey ? ui.images.citations?.zoteroOverlay : undefined;\n\n // The author text (and index representation)\n const secondaryText = (len: number) => {\n const authorStr = formatAuthors(source.author, len - source.id.length);\n const date = source.issued ? formatIssuedDate(source.issued) : '';\n const detail = `${authorStr} ${date}`;\n return detail;\n };\n const authorIndexStr = (cslName: CSLName) => {\n const names: string[] = [];\n if (cslName.family) {\n names.push(cslName.family);\n }\n if (cslName.given) {\n names.push(cslName.given);\n }\n if (cslName.literal) {\n names.push(cslName.literal);\n }\n return names.join(\" \");\n }\n const secondaryIndex = source.author?.map(authorIndexStr).join(\" \");\n\n // The function to insert this entry\n const replace = (view: EditorView, pos: number, server: EditorServer) => {\n if (source && bibliographyManager.findIdInLocalBibliography(source.id)) {\n // It's already in the bibliography, just write the id\n const tr = view.state.tr;\n const schema = view.state.schema;\n const citeIdMark = schema.text(source.id, [schema.marks.cite_id.create()]);\n performCiteCompletionReplacement(tr, pos, citeIdMark);\n view.dispatch(tr);\n return Promise.resolve();\n } else if (source) {\n // It isn't in the bibliography, show the insert cite dialog\n return insertSingleCitation(\n view,\n source.DOI || '',\n bibliographyManager,\n pos,\n ui,\n server.pandoc,\n source,\n bibliographyManager.providerName(source.providerKey),\n );\n } else {\n return Promise.resolve();\n }\n };\n\n return {\n id,\n type: kCiteCompletionTypeBibliography,\n primaryText,\n secondaryText,\n detailText,\n image,\n imageAdornment,\n index: {\n secondary: secondaryIndex,\n tertiary: detailText\n },\n replace\n };\n };\n\n return {\n currentEntries: () => {\n if (bibliographyManager.hasSources()) {\n return bibliographyManager.allSources().map(source => referenceEntryForSource(source));\n } else {\n return undefined;\n }\n },\n streamEntries: (doc: ProsemirrorNode, onStreamReady: (entries: CiteCompletionEntry[]) => void) => {\n bibliographyManager.load(ui, doc).then(() => {\n onStreamReady(bibliographyManager.allSources().map(source => referenceEntryForSource(source)));\n });\n },\n awaitEntries: async (doc: ProsemirrorNode) => {\n await bibliographyManager.load(ui, doc);\n return bibliographyManager.allSources().map(source => referenceEntryForSource(source));\n },\n warningMessage: () => {\n return bibliographyManager.warning();\n }\n\n };\n}\n\n\n","/*\n * cite-completion-quarto-xref.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\n\nimport { EditorUI } from '../../api/ui';\n\nimport { performCiteCompletionReplacement } from './cite';\nimport { CiteCompletionEntry, CiteCompletionProvider } from './cite-completion';\nimport { EditorServer } from '../../api/server';\nimport { XRef, xrefKey } from '../../api/xref';\nimport { kQuartoXRefTypes } from '../xref/xref-completion';\n\nexport const kCiteCompletionTypeXref = \"xref\";\n\nexport function quartoXrefCiteCompletionProvider(ui: EditorUI, server: EditorServer): CiteCompletionProvider {\n const referenceEntryForXref = (xref: XRef, forceLightMode?: boolean): CiteCompletionEntry => {\n\n // The type (e.g. fig)\n const type = kQuartoXRefTypes[xref.type];\n\n // The id (e.g. fig-foobar)\n const id = xrefKey(xref, \"quarto\");\n\n // The display text for the entry\n const primaryText = id;\n const secondaryText = (len: number) => {\n return xref.file;\n };\n const detailText = xref.title || \"\";\n\n // The image and adornment\n const image = type?.image(ui) || ui.images.omni_insert?.generic!;\n const imageAdornment = undefined;\n\n // Insert item\n const replace = (view: EditorView, pos: number, _server: EditorServer) => {\n // It's already in the bibliography, just write the id\n const tr = view.state.tr;\n const schema = view.state.schema;\n const idMark = schema.text(id, [schema.marks.cite_id.create()]);\n performCiteCompletionReplacement(tr, pos, idMark);\n view.dispatch(tr);\n return Promise.resolve();\n };\n\n return {\n id,\n type: kCiteCompletionTypeXref,\n primaryText,\n secondaryText,\n detailText,\n image,\n imageAdornment,\n replace\n };\n };\n\n let loadedEntries: CiteCompletionEntry[] | undefined;\n return {\n currentEntries: () => {\n return loadedEntries;\n },\n streamEntries: (doc: ProsemirrorNode, onStreamReady: (entries: CiteCompletionEntry[]) => void) => {\n const docPath = ui.context.getDocumentPath();\n if (docPath) {\n ui.context.withSavedDocument().then(() => {\n server.xref.quartoIndexForFile(docPath).then(xrefs => {\n loadedEntries = xrefs.refs.map(ref => referenceEntryForXref(ref));\n onStreamReady(loadedEntries);\n });\n });\n }\n },\n awaitEntries: async (doc: ProsemirrorNode) => {\n const docPath = ui.context.getDocumentPath();\n if (docPath) {\n await ui.context.withSavedDocument();\n const index = await server.xref.quartoIndexForFile(docPath);\n loadedEntries = index.refs.map(ref => referenceEntryForXref(ref));\n return loadedEntries;\n } else {\n return Promise.resolve([]);\n }\n },\n warningMessage: () => {\n return undefined;\n }\n };\n}\n\n\n","/*\n * xref-completion.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\nimport { DecorationSet } from 'prosemirror-view';\n\nimport React from 'react';\n\nimport Fuse from 'fuse.js';\nimport uniqby from 'lodash.uniqby';\n\nimport { EditorUI } from '../../api/ui';\nimport { CompletionHandler, CompletionResult } from '../../api/completion';\nimport { XRef, XRefServer, xrefKey } from '../../api/xref';\nimport { markIsActive } from '../../api/mark';\nimport { searchPlaceholderDecoration } from '../../api/placeholder';\nimport { CompletionItemView } from '../../api/widgets/completion';\n\nimport './xref-completion.css';\n\nconst kMaxResults = 20;\n\nexport function xrefCompletionHandler(ui: EditorUI, server: XRefServer): CompletionHandler<XRef> {\n const index = new FuseIndex();\n\n return {\n id: 'BAACC160-56BE-4322-B079-54477A880623',\n\n enabled: (context: EditorState | Transaction) => {\n return markIsActive(context, context.doc.type.schema.marks.xref);\n },\n\n completions: xrefCompletions(ui, server, index),\n\n filter: (completions: XRef[], _state: EditorState, token: string) => {\n if (token.length > 0) {\n return index.search(token, kMaxResults);\n } else {\n return completions.slice(0, kMaxResults);\n }\n },\n\n replacement(schema: Schema, xref: XRef | null): string | ProsemirrorNode | null {\n if (xref) {\n return xrefKey(xref);\n } else {\n return null;\n }\n },\n\n view: {\n component: xrefView(ui),\n key: xref => xrefKey(xref),\n height: 52,\n width: 350,\n maxVisible: 5,\n hideNoResults: true,\n },\n };\n}\n\nclass FuseIndex {\n private fuse: Fuse<XRef>;\n\n private keys: Fuse.FuseOptionKeyObject[] = [\n { name: 'id', weight: 20 },\n { name: 'type', weight: 1 },\n { name: 'title', weight: 1 },\n ];\n\n constructor() {\n this.fuse = this.createIndex([]);\n }\n\n public update(xrefs: XRef[]) {\n this.fuse = this.createIndex(xrefs);\n }\n\n public search(query: string, limit: number) {\n // see if we have an explicit type\n let type: string | null = null;\n let typeQuery: string | null = null;\n const colonLoc = query.indexOf(':');\n if (colonLoc !== -1) {\n const prefix = query.slice(0, colonLoc);\n if (kXRefTypes.hasOwnProperty(prefix)) {\n type = prefix;\n if (query.length > type.length + 1) {\n typeQuery = query.slice(colonLoc + 1);\n }\n }\n }\n\n // search options\n const options = {\n isCaseSensitive: false,\n shouldSort: true,\n minMatchCharLength: 2,\n limit,\n keys: this.keys,\n };\n\n // perform query (use type if we have one)\n const results = type\n ? typeQuery\n ? this.fuse.search({ $and: [{ type }, { $or: [{ id: typeQuery }, { title: typeQuery }] }] }, options)\n : this.fuse.search({ type }, options)\n : this.fuse.search(query, options);\n\n // return results (eliminating duplicates)\n return uniqby(\n results.map((result: { item: XRef }) => result.item),\n xrefKey,\n );\n }\n\n private createIndex(xrefs: XRef[]) {\n const options = {\n keys: this.keys.map(key => key.name),\n };\n const index = Fuse.createIndex(options.keys, xrefs);\n return new Fuse(xrefs, options, index);\n }\n}\n\nfunction xrefCompletions(ui: EditorUI, server: XRefServer, index: FuseIndex) {\n const kXRefCompletionRegEx = /(@ref\\()([ A-Za-z0-9:-]*)$/;\n return (text: string, context: EditorState | Transaction): CompletionResult<XRef> | null => {\n const match = text.match(kXRefCompletionRegEx);\n if (match) {\n const pos = context.selection.head - match[2].length;\n const token = match[2];\n return {\n pos,\n offset: -match[1].length + 1,\n token,\n completions: async () => {\n const docPath = ui.context.getDocumentPath();\n if (docPath) {\n await ui.context.withSavedDocument();\n const xrefs = await server.indexForFile(docPath);\n index.update(xrefs.refs);\n return xrefs.refs;\n } else {\n index.update([]);\n return Promise.resolve([]);\n }\n },\n decorations:\n token.length === 0 ? DecorationSet.create(context.doc, [searchPlaceholderDecoration(pos, ui)]) : undefined,\n };\n } else {\n return null;\n }\n };\n}\n\nfunction xrefView(ui: EditorUI): React.FC<XRef> {\n return (xref: XRef) => {\n const type = kXRefTypes[xref.type];\n const image = type?.image(ui) || ui.images.omni_insert?.generic!;\n\n return (\n <CompletionItemView\n width={350}\n classes={['pm-xref-completion-item']}\n image={image}\n title={xrefKey(xref)}\n subTitle={xref.title || ''}\n detail={xref.file}\n />\n );\n };\n}\n\nconst kGenericType = {\n image: (ui: EditorUI) => ui.images.omni_insert?.generic!,\n};\n\nconst kEqType = {\n image: (ui: EditorUI) =>\n ui.prefs.darkMode() ? ui.images.omni_insert?.math_display_dark : ui.images.omni_insert?.math_display,\n};\n\nconst kTableType = {\n image: (ui: EditorUI) => (ui.prefs.darkMode() ? ui.images.omni_insert?.table_dark : ui.images.omni_insert?.table),\n};\n\nexport const kXRefTypes: { [key: string]: { image: (ui: EditorUI) => string | undefined } } = {\n h1: {\n image: (ui: EditorUI) =>\n ui.prefs.darkMode() ? ui.images.omni_insert?.heading1_dark : ui.images.omni_insert?.heading1,\n },\n h2: {\n image: (ui: EditorUI) =>\n ui.prefs.darkMode() ? ui.images.omni_insert?.heading2_dark : ui.images.omni_insert?.heading2,\n },\n h3: {\n image: (ui: EditorUI) =>\n ui.prefs.darkMode() ? ui.images.omni_insert?.heading3_dark : ui.images.omni_insert?.heading3,\n },\n h4: {\n image: (ui: EditorUI) =>\n ui.prefs.darkMode() ? ui.images.omni_insert?.heading4_dark : ui.images.omni_insert?.heading4,\n },\n fig: {\n image: (ui: EditorUI) => (ui.prefs.darkMode() ? ui.images.omni_insert?.image_dark : ui.images.omni_insert?.image),\n },\n tab: kTableType,\n tbl:kTableType,\n eq: kEqType,\n thm: kEqType,\n lem: kEqType,\n cor: kEqType,\n prp: kEqType,\n cnj: kEqType,\n def: kEqType,\n exm: kGenericType,\n exr: kGenericType,\n};\n\nconst kTheoremType = {\n image: (ui: EditorUI) => (ui.prefs.darkMode() ? ui.images.xrefs?.theorem_dark : ui.images.xrefs?.theorem)\n};\n\n\nexport const kQuartoXRefTypes: { [key: string]: { image: (ui: EditorUI) => string | undefined } } = {\n sec: {\n image: (ui: EditorUI) => (ui.prefs.darkMode() ? ui.images.xrefs?.section_dark : ui.images.xrefs?.section)\n },\n fig: {\n image: (ui: EditorUI) => (ui.prefs.darkMode() ? ui.images.xrefs?.figure_dark : ui.images.xrefs?.figure),\n },\n tbl: {\n image: (ui: EditorUI) => (ui.prefs.darkMode() ? ui.images.xrefs?.table_dark : ui.images.xrefs?.table),\n },\n lst: {\n image: (ui: EditorUI) => (ui.prefs.darkMode() ? ui.images.xrefs?.listing_dark : ui.images.xrefs?.listing),\n },\n eq: {\n image: (ui: EditorUI) => (ui.prefs.darkMode() ? ui.images.xrefs?.equation_dark : ui.images.xrefs?.equation)\n },\n thm: kTheoremType,\n lem: kTheoremType,\n cor: kTheoremType,\n prp: kTheoremType,\n cnj: kTheoremType,\n def: kTheoremType,\n exm: kTheoremType,\n exr: kTheoremType,\n};","\n/*\n * cite-completion-search.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport Fuse from 'fuse.js';\n\nimport { CiteCompletionEntry } from \"./cite-completion\";\n\nconst searchFields: Fuse.FuseOptionKeyObject[] = [\n { name: 'id', weight: 30 },\n { name: 'index.secondary', weight: 30 },\n { name: 'index.tertiary', weight: 5 },\n];\n\nexport interface CiteCompletionSearch {\n setEntries: (entries: CiteCompletionEntry[]) => void;\n search: (searchTerm: string, limit: number) => CiteCompletionEntry[];\n exactMatch: (searchTerm: string) => boolean;\n}\n\nexport function completionIndex(defaultEntries?: CiteCompletionEntry[]): CiteCompletionSearch {\n // build search index\n const options = {\n isCaseSensitive: false,\n shouldSort: true,\n includeMatches: false,\n includeScore: false,\n minMatchCharLength: 3,\n threshold: 0.5,\n keys: searchFields,\n };\n\n defaultEntries = defaultEntries || [];\n const index = Fuse.createIndex<CiteCompletionEntry>(searchFields, defaultEntries);\n const fuse = new Fuse(defaultEntries, options, index);\n let indexedEntries: CiteCompletionEntry[] = [];\n\n return {\n setEntries: (entries: CiteCompletionEntry[]) => {\n fuse.setCollection(entries);\n indexedEntries = entries;\n },\n search: (searchTerm: string, limit: number): CiteCompletionEntry[] => {\n const results = fuse.search('^' + searchTerm, { ...options, limit });\n return results.map(result => result.item);\n },\n exactMatch: (searchTerm: string): boolean => {\n return indexedEntries.some(entry => entry.id === searchTerm);\n }\n };\n}","/*\n * cite-highlight.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { PluginKey } from 'prosemirror-state';\nimport { DecorationSet } from 'prosemirror-view';\nimport { Schema } from 'prosemirror-model';\n\nimport { markHighlightPlugin, markHighlightDecorations } from '../../api/mark-highlight';\n\nconst key = new PluginKey<DecorationSet>('cite-highlight');\n\nexport function citeHighlightPlugin(schema: Schema) {\n return markHighlightPlugin(key, schema.marks.cite, (text, _attrs, markRange) => {\n return markHighlightDecorations(markRange, text, /([\\[\\]])/g, 'pm-link-text-color pm-fixedwidth-font');\n });\n}\n","/*\n * cite-completion_doi.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView } from 'prosemirror-view';\nimport { EditorState, Transaction } from 'prosemirror-state';\n\nimport React from 'react';\n\nimport { EditorUI } from '../../api/ui';\nimport {\n CompletionHandler,\n CompletionResult,\n performCompletionReplacement,\n CompletionContext,\n} from '../../api/completion';\nimport { formatAuthors, formatIssuedDate } from '../../api/cite';\nimport { CSL, imageForType } from '../../api/csl';\nimport { CompletionItemDetailedView } from '../../api/widgets/completion-detailed';\nimport { BibliographyManager } from '../../api/bibliography/bibliography';\nimport { EditorServer } from '../../api/server';\nimport { DOIServer } from '../../api/doi';\n\nimport { doiFromEditingContext } from './cite-doi';\nimport { insertCitation } from './cite';\nimport { kCitationCompleteScope } from './cite-completion';\n\nconst kCompletionWidth = 400;\nconst kCompletionItemPadding = 10;\n\nexport function citationDoiCompletionHandler(\n ui: EditorUI,\n bibManager: BibliographyManager,\n server: EditorServer,\n): CompletionHandler<CSLEntry> {\n return {\n id: '56DA14DD-6E3A-4481-93A9-938DC00393A5',\n\n scope: kCitationCompleteScope,\n\n completions: citationDOICompletions(ui, server.doi, bibManager),\n\n replace(view: EditorView, pos: number, cslEntry: CSLEntry | null) {\n if (cslEntry && cslEntry.inBibliography) {\n // It's already in the bibliography, just write the id\n const tr = view.state.tr;\n const schema = view.state.schema;\n const id = schema.text(cslEntry.id, [schema.marks.cite_id.create()]);\n performCompletionReplacement(tr, pos, id);\n view.dispatch(tr);\n } else if (cslEntry) {\n // It isn't in the bibliography, show the insert cite dialog\n return insertCitation(view, cslEntry.csl.DOI || '', bibManager, pos, ui, server.pandoc, cslEntry.csl);\n }\n return Promise.resolve();\n },\n\n view: {\n component: CSLSourceView,\n key: cslEntry => cslEntry.csl.DOI,\n width: kCompletionWidth,\n height: 120,\n maxVisible: 5,\n hideNoResults: true,\n },\n };\n}\n\nconst kPRogressDelay = 350;\n\nfunction citationDOICompletions(ui: EditorUI, server: DOIServer, bibliographyManager: BibliographyManager) {\n return (_text: string, context: EditorState | Transaction): CompletionResult<CSLEntry> | null => {\n const parsedDOI = doiFromEditingContext(context);\n if (parsedDOI) {\n return {\n token: parsedDOI.token,\n pos: parsedDOI.pos,\n offset: parsedDOI.offset,\n completions: async (_state: EditorState, completionContext: CompletionContext) => {\n // If we have a local source that matches this DOI, just show the\n // completion for the entry\n await bibliographyManager.load(ui, context.doc);\n const source = bibliographyManager.findDoiInLocalBibliography(parsedDOI.token);\n if (source) {\n return [\n {\n id: source.id,\n csl: source,\n inBibliography: true,\n image: imageForType(ui.images, source.type)[ui.prefs.darkMode() ? 1 : 0],\n formattedAuthor: formatAuthors(source.author, 50),\n formattedIssueDate: formatIssuedDate(source.issued),\n },\n ];\n } else {\n return [];\n }\n },\n };\n }\n return null;\n };\n}\n\ninterface CSLEntry {\n id: string;\n csl: CSL;\n inBibliography: boolean;\n image?: string;\n formattedAuthor: string;\n formattedIssueDate: string;\n}\n\nconst CSLSourceView: React.FC<CSLEntry> = cslEntry => {\n const csl = cslEntry.csl;\n return (\n <CompletionItemDetailedView\n width={kCompletionWidth - kCompletionItemPadding}\n image={cslEntry.image}\n heading={csl['short-container-title'] || csl.publisher || ''}\n title={csl.title || ''}\n subTitle={`${cslEntry.formattedAuthor} ${cslEntry.formattedIssueDate}` || ''}\n />\n );\n};\n","/*\n * completion-detailed.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\n\nimport { WidgetProps } from './react';\n\nimport './completion-detailed.css';\n\nexport interface CompletionItemDetailedViewProps extends WidgetProps {\n width: number;\n image?: string;\n heading: string;\n title: string;\n subTitle: string;\n}\n\nexport const CompletionItemDetailedView: React.FC<CompletionItemDetailedViewProps> = props => {\n const className = ['pm-completion-detailed-item'].concat(props.classes || []).join(' ');\n const style: React.CSSProperties = {\n width: props.width + 'px',\n ...props.style,\n };\n\n return (\n <div className={className} style={style}>\n <div className={'pm-completion-detailed-item-type'}>\n <img className={'pm-block-border-color'} src={props.image} draggable=\"false\"/>\n </div>\n <div className={'pm-completion-item-detailed-summary'}>\n <div className={'pm-completion-item-detailed-heading'}>{props.heading}</div>\n <div className={'pm-completion-item-detailed-title'}>{props.title}</div>\n <div className={'pm-completion-item-detailed-subTitle'}>{props.subTitle}</div>\n </div>\n </div>\n );\n};\n","/*\n * cite-doi.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { Slice } from 'prosemirror-model';\n\nimport { findDOI } from '../../api/doi';\n\nimport { parseCitation, ParsedCitation } from './cite';\n\n// Parses the transation or state to determine whether the current position\n// represents a citation containing a DOI\nexport function doiFromEditingContext(context: EditorState | Transaction): ParsedCitation | undefined {\n \n const parsedCitation = parseCitation(context);\n if (parsedCitation) {\n const doi = findDOI(parsedCitation.token);\n if (doi) {\n return parsedCitation;\n }\n return undefined;\n }\n}\n\n// Parses a slice to determine whether the slice contains\n// a single DOI\nexport function doiFromSlice(context: EditorState | Transaction, slice: Slice): ParsedCitation | undefined {\n const parsedCitation = parseCitation(context);\n if (parsedCitation) {\n // Concatenate all the text and search for a DOI\n let text = '';\n slice.content.forEach(node => (text = text + node.textContent));\n if (text.length) {\n const doi = findDOI(text.trim());\n if (doi) {\n return { ...parsedCitation, token: doi };\n }\n }\n return undefined;\n }\n}\n","/*\n * cite-popup.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { PluginKey, Selection } from 'prosemirror-state';\nimport { DecorationSet, EditorView } from 'prosemirror-view';\n\nimport React from 'react';\n\nimport { EditorUI } from '../../api/ui';\nimport { textPopupDecorationPlugin, TextPopupTarget } from '../../api/text-popup';\nimport { WidgetProps } from '../../api/widgets/react';\nimport { Popup } from '../../api/widgets/popup';\nimport { BibliographyManager } from '../../api/bibliography/bibliography';\nimport { PandocServer } from '../../api/pandoc';\n\nimport './cite-popup.css';\nimport { urlForCitation } from '../../api/cite';\nimport { cslFromDoc } from '../../api/csl';\nimport { EditorServer } from '../../api/server';\n\nconst kMaxWidth = 400; // also in cite-popup.css\n\nexport function citePopupPlugin(schema: Schema, ui: EditorUI, bibMgr: BibliographyManager, server: EditorServer) {\n return textPopupDecorationPlugin({\n key: new PluginKey<DecorationSet>('cite-popup'),\n markType: schema.marks.cite_id,\n maxWidth: kMaxWidth,\n dismissOnEdit: true,\n makeLinksAccessible: true,\n createPopup: async (view: EditorView, target: TextPopupTarget, style: React.CSSProperties) => {\n await bibMgr.load(ui, view.state.doc);\n\n const citeId = target.text.replace(/^-@|^@/, '');\n\n // See if this will be handled by Xref\n let isXRef = false;\n const docPath = ui.context.getDocumentPath();\n if (docPath) {\n const xrefs = await server.xref.quartoXrefForId(docPath, citeId);\n isXRef = xrefs.refs.length > 0;\n }\n\n if (!isXRef) {\n const csl = cslFromDoc(view.state.doc);\n const source = bibMgr.findIdInLocalBibliography(citeId);\n\n if (source) {\n const previewHtml = await server.pandoc.citationHTML(\n ui.context.getDocumentPath(),\n JSON.stringify([source]),\n csl || null,\n );\n const finalHtml = ensureSafeLinkIsPresent(previewHtml, () => {\n const url = urlForCitation(source);\n if (url) {\n return {\n text: ui.context.translateText('[Link]'),\n url,\n };\n }\n });\n\n return <CitePopup previewHtml={finalHtml} style={style} />;\n }\n }\n return null;\n },\n specKey: (target: TextPopupTarget) => {\n return `cite:${target.text}`;\n },\n });\n}\n\nconst kCiteHangingIndentClass = 'hanging-indent';\nconst kCiteLinkClassName = 'pm-cite-popup-link';\n\nfunction ensureSafeLinkIsPresent(html: string, getLinkData: () => { text: string; url: string } | undefined) {\n const parser = new window.DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n\n // remove id, class, and role from main div\n const rootDiv = doc.body.getElementsByClassName('references');\n if (rootDiv.length > 0) {\n const classNames = rootDiv[0].getAttribute('class');\n const hasHangingIndent = classNames?.match(`(^|\\\\s)${kCiteHangingIndentClass}($|\\\\s)`);\n\n rootDiv[0].removeAttribute('id');\n rootDiv[0].removeAttribute('role');\n\n if (hasHangingIndent && hasHangingIndent.length > 0) {\n rootDiv[0].setAttribute('class', kCiteHangingIndentClass);\n } else {\n rootDiv[0].removeAttribute('class');\n }\n }\n\n const linkElements = doc.body.getElementsByTagName('a');\n if (linkElements.length === 0) {\n const linkData = getLinkData();\n\n // There aren't any links, we should append one\n // (If links are present, we assume that we shouldn't add another)\n const paragraphs = doc.body.getElementsByTagName('p');\n if (paragraphs.length === 1 && linkData) {\n // The paragraph containing the formatted source\n const paragraph = paragraphs[0];\n\n // Create a link to append\n const linkElement = doc.createElement('a');\n linkElement.innerText = linkData.text;\n linkElement.setAttribute('href', linkData.url);\n linkElement.setAttribute('class', `${kCiteLinkClassName} pm-link-text-color`);\n setLinkTarget(linkElement);\n\n // Append the link to the formatted source\n paragraph.appendChild(linkElement);\n }\n } else {\n // There are links, ensure all of them have appropriate target information\n // tslint:disable-next-line: prefer-for-of\n for (let i = 0; i < linkElements.length; i++) {\n linkElements[i].setAttribute('class', `pm-link-text-color`);\n setLinkTarget(linkElements[i]);\n }\n }\n\n // Return the HTML omitting CR/LF - CR\n return doc.body.innerHTML.replace(/\\r?\\n|\\r/g, '');\n}\n\nfunction setLinkTarget(linkElement: HTMLAnchorElement) {\n linkElement.setAttribute('target', '_blank');\n linkElement.setAttribute('rel', 'noopener noreferrer');\n}\n\ninterface CitePopupProps extends WidgetProps {\n previewHtml: string;\n}\n\nconst CitePopup: React.FC<CitePopupProps> = props => {\n return (\n <Popup classes={['pm-cite-popup']} style={props.style}>\n <div className=\"pm-cite-popup-preview\">\n <div dangerouslySetInnerHTML={{ __html: props.previewHtml || '' }} />\n </div>\n </Popup>\n );\n};\n","/*\n * cite-commands.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { ProsemirrorCommand, EditorCommandId, toggleMarkType } from '../../api/command';\nimport { canInsertNode } from '../../api/node';\nimport { EditorUI } from '../../api/ui';\nimport { OmniInsertGroup } from '../../api/omni_insert';\nimport { EditorEvents } from '../../api/events';\nimport { EditorServer } from '../../api/server';\nimport { BibliographyManager } from '../../api/bibliography/bibliography';\n\nimport { ensureSourcesInBibliography } from './cite';\nimport { showInsertCitationDialog, InsertCitationDialogResult } from '../../behaviors/insert_citation/insert_citation';\nimport { markIsActive, getMarkRange } from '../../api/mark';\n\nexport class InsertCitationCommand extends ProsemirrorCommand {\n private initialSelectionKey: string | undefined;\n\n constructor(ui: EditorUI, events: EditorEvents, bibliographyManager: BibliographyManager, server: EditorServer) {\n super(\n EditorCommandId.Citation,\n ['Shift-Mod-F8'],\n (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n // enable/disable command\n const schema = state.schema;\n if (!canInsertNode(state, schema.nodes.text) || !toggleMarkType(schema.marks.cite)(state)) {\n return false;\n }\n\n if (dispatch && view) {\n showInsertCitationDialog(\n ui,\n state.doc,\n bibliographyManager,\n server,\n async (result: InsertCitationDialogResult) => {\n if (result) {\n // Remember the last tree node that was selected\n this.initialSelectionKey = result.selectionKey;\n\n // Remember whether the citation is intext for the future\n ui.prefs.setCitationDefaultInText(result.intextCitationStyle);\n\n // The citations that we should insert\n const bibliographySources = result.bibliographySources;\n\n // The bibliography that we should insert sources into (if needed)\n const bibliography = result.bibliography;\n\n // The transaction that will hold all the changes we'll make\n const tr = state.tr;\n\n // First, be sure that we add any sources to the bibliography\n // and that the bibliography is properly configured\n const writeCiteId = await ensureSourcesInBibliography(\n tr,\n bibliographySources,\n bibliography,\n bibliographyManager,\n view,\n ui,\n server.pandoc,\n );\n\n if (writeCiteId) {\n // The starting location of this transaction\n const start = tr.selection.from;\n\n // See if we are already inside an active cite mark\n const alreadyInCite = markIsActive(tr, schema.marks.cite);\n const includeWrapper = !result.intextCitationStyle || result.bibliographySources.length > 1;\n\n // Insert the wrapping [] if the user wants that style citation\n // Note that if the use is inserting more than one citation, we ignore this and just\n // always perform a 'note' style citation insert\n // If we're already inside a cite including [], don't bother inserting wrapper\n if (!alreadyInCite && includeWrapper) {\n const wrapperText = schema.text('[]');\n tr.insert(tr.selection.from, wrapperText);\n\n // move the selection into the wrapper\n setTextSelection(tr.selection.from - 1)(tr);\n }\n\n // If the previous character is a part of a cite_id, advance to the end of the mark,\n // insert a separator, and then proceed\n const preCiteIdRange = getMarkRange(tr.doc.resolve(start - 1), schema.marks.cite_id);\n if (preCiteIdRange) {\n setTextSelection(preCiteIdRange.to)(tr);\n const separator = schema.text('; ');\n tr.insert(tr.selection.from, separator);\n }\n\n // insert the CiteId marks and text\n bibliographySources.forEach((citation, i) => {\n const citeIdMark = schema.marks.cite_id.create();\n const citeIdText = schema.text(`@${citation.id}`, [citeIdMark]);\n tr.insert(tr.selection.from, citeIdText);\n if (bibliographySources.length > 1 && i !== bibliographySources.length - 1) {\n tr.insert(tr.selection.from, schema.text('; ', []));\n }\n });\n\n // If the next character is a part of a cite_id, insert a separator (that will appear after the current citeId)\n const postCiteIdRange = getMarkRange(tr.doc.resolve(tr.selection.from + 1), schema.marks.cite_id);\n if (postCiteIdRange) {\n const separator = schema.text('; ');\n tr.insert(tr.selection.from, separator);\n }\n\n // Enclose wrapper in the cite mark (if not already in a cite)\n if (!alreadyInCite) {\n const endOfWrapper = includeWrapper ? tr.selection.from + 1 : tr.selection.from;\n const citeMark = schema.marks.cite.create();\n tr.addMark(start, endOfWrapper, citeMark);\n setTextSelection(endOfWrapper)(tr);\n }\n }\n\n // commit the transaction\n dispatch(tr);\n\n return Promise.resolve();\n }\n },\n this.initialSelectionKey,\n );\n }\n return true;\n },\n {\n name: ui.context.translateText('Citation...'),\n description: ui.context.translateText('Reference to a source'),\n group: OmniInsertGroup.References,\n priority: 1,\n image: () => (ui.prefs.darkMode() ? ui.images.omni_insert!.citation_dark! : ui.images.omni_insert!.citation!),\n },\n // false\n );\n }\n}\n","/*\n * insert_citation_picker.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\nimport ReactDOM from 'react-dom';\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport {\n BibliographyFile,\n BibliographyManager,\n bibliographyTypes,\n bibliographyFileForPath,\n BibliographySource,\n} from '../../api/bibliography/bibliography';\nimport { kInvalidCiteKeyChars } from '../../api/cite';\nimport { changeExtension } from '../../api/path';\nimport { EditorServer } from '../../api/server';\nimport { EditorUI } from '../../api/ui';\nimport { WidgetProps } from '../../api/widgets/react';\nimport { TagInput, TagItem } from '../../api/widgets/tag-input';\nimport { NavigationTreeNode, containsChild, NavigationTree } from '../../api/widgets/navigation-tree';\nimport { DialogButtons } from '../../api/widgets/dialog-buttons';\n\nimport {\n CitationSourcePanelProps,\n CitationSourcePanelProvider,\n CitationListEntry,\n CitationSourceListStatus,\n BibliographySourceProvider,\n CitationSourcePanelSearchResult,\n} from './source_panels/insert_citation-source-panel';\nimport { bibliographySourcePanel } from './source_panels/insert_citation-source-panel-bibliography';\nimport { doiSourcePanel } from './source_panels/insert_citation-source-panel-doi';\nimport { crossrefSourcePanel } from './source_panels/insert_citation-source-panel-crossref';\nimport { pubmedSourcePanel } from './source_panels/insert_citation-source-panel-pubmed';\nimport { dataciteSourcePanel } from './source_panels/insert_citation-source-panel-datacite';\nimport { CitationBibliographyPicker } from './insert_citation-bibliography-picker';\nimport { packageSourcePanel } from './source_panels/insert_citation-source-panel-packages';\n\nimport './insert_citation.css';\nimport debounce from 'lodash.debounce';\nimport { CheckboxInput } from '../../api/widgets/checkbox-input';\n\n\n// When the dialog has completed, it will return this result\n// If the dialog is canceled no result will be returned\nexport interface InsertCitationDialogResult {\n bibliographySources: BibliographySource[];\n bibliography: BibliographyFile;\n intextCitationStyle: boolean;\n selectionKey?: string;\n}\n\n// Show the insert citation dialog and returns the\n// items that should be inserted, the bibliography in which to write them\n// and the last selected position in the tree\nexport async function showInsertCitationDialog(\n ui: EditorUI,\n doc: ProsemirrorNode,\n bibliographyManager: BibliographyManager,\n server: EditorServer,\n performInsertCitations: (result: InsertCitationDialogResult) => Promise<void>,\n initiallySelectedNodeKey?: string,\n): Promise<boolean> {\n // The result that will be returned to the called\n let result: InsertCitationDialogResult | undefined;\n\n // Present the dialog\n const performInsert = await ui.dialogs.htmlDialog(\n 'Insert Citation',\n 'Insert',\n (\n containerWidth: number,\n containerHeight: number,\n confirm: VoidFunction,\n cancel: VoidFunction,\n showProgress: (message: string) => void,\n hideProgress: VoidFunction,\n ) => {\n const kMaxHeight = 650;\n const kMaxWidth = 900;\n const kMaxHeightProportion = 0.9;\n const kdialogPaddingIncludingButtons = 70;\n\n const windowHeight = containerHeight;\n const windowWidth = containerWidth;\n\n const height = Math.min(kMaxHeight, windowHeight * kMaxHeightProportion - kdialogPaddingIncludingButtons);\n const width = Math.max(Math.min(kMaxWidth, windowWidth * 0.9), 550);\n\n const container = window.document.createElement('div');\n container.className = 'pm-default-theme';\n\n // Provide the providers top the dialog and then refresh the bibliography and reload\n // the items\n const providersForBibliography = (writable: boolean) => {\n return writable\n ? [\n bibliographySourcePanel(doc, ui, bibliographyManager),\n doiSourcePanel(ui, server.doi, bibliographyManager),\n crossrefSourcePanel(ui, server.crossref, server.doi, bibliographyManager),\n dataciteSourcePanel(ui, server.datacite, server.doi, bibliographyManager),\n pubmedSourcePanel(ui, server.pubmed, server.doi, bibliographyManager),\n packageSourcePanel(ui, server.environment)\n ]\n : [bibliographySourcePanel(doc, ui, bibliographyManager)];\n };\n\n // Provide a configuration stream that will update after the bibliography loads\n let updatedConfiguration: InsertCitationPanelConfiguration | undefined;\n const configurationStream: InsertCitationPanelConfigurationStream = {\n current: {\n providers: providersForBibliography(bibliographyManager.allowsWrites()),\n bibliographyFiles: bibliographyManager.bibliographyFiles(doc, ui),\n existingIds: bibliographyManager.localSources().map(source => source.id),\n },\n stream: () => {\n return updatedConfiguration || null;\n },\n };\n\n // Load the bibliography and then update the configuration\n bibliographyManager.load(ui, doc, true).then(() => {\n updatedConfiguration = {\n providers: providersForBibliography(bibliographyManager.allowsWrites()),\n bibliographyFiles: bibliographyManager.bibliographyFiles(doc, ui),\n existingIds: bibliographyManager.localSources().map(source => source.id),\n };\n });\n\n // Handles the confirmation by the user\n const onOk = async (\n bibliographySourceProviders: BibliographySourceProvider[],\n bibliography: BibliographyFile,\n selectedNode: NavigationTreeNode,\n intextCitationStyle: boolean\n ) => {\n // Because some bibliography entries will need to download their CSL (based upon the\n // DOI), we need to keep the dialog alive so we can use it to show progress. As a result\n // rather than waiting for the dialog to be dismissed and using the result, we do the work\n // here ahead of calling 'confirm'. But confirm also provides the validation message for the\n // dialog, so we still call 'confirm' even if we know it isn't valid (no citations selected)\n // so the validation message can be displayed to the user.\n if (bibliographySourceProviders.length > 0) {\n\n // Look through the items and see whether any will be slow\n // If some are slow, show progress\n const requiresProgress = bibliographySourceProviders.some(\n sourceProvider => sourceProvider.isSlowGeneratingBibliographySource,\n );\n if (requiresProgress) {\n showProgress(\n ui.context.translateText(\n bibliographySourceProviders.length === 1\n ? 'Creating bibliography entry...'\n : 'Creating bibliography entries...',\n ),\n );\n }\n\n // Generate bibliography sources for each of the entries\n const bibliographySources = await Promise.all(\n bibliographySourceProviders.map(sourceProvider => sourceProvider.toBibliographySource(sourceProvider.id)),\n );\n result = {\n bibliographySources,\n bibliography,\n intextCitationStyle,\n selectionKey: selectedNode.key,\n };\n\n // Notify the caller to perform the inseration\n await performInsertCitations(result);\n\n // Clear progress\n if (requiresProgress) {\n hideProgress();\n }\n }\n // Dismiss the dialog\n confirm();\n };\n\n container.style.width = width + 'px';\n ReactDOM.render(\n <InsertCitationPanel\n height={height}\n width={width}\n configuration={configurationStream}\n initiallySelectedNodeKey={initiallySelectedNodeKey}\n onOk={onOk}\n onCancel={cancel}\n doc={doc}\n ui={ui}\n />,\n container,\n );\n return container;\n },\n () => {\n // Focus\n // dealt with in the React Component itself\n },\n () => {\n // Validation\n // User has to select a citation, everything else we can use defaults\n if (!result || result.bibliographySources.length === 0) {\n return ui.context.translateText('Please select at least one citation to insert.');\n }\n return null;\n },\n );\n\n // return the result to the caller\n if (performInsert && result) {\n return Promise.resolve(true);\n } else {\n return Promise.resolve(false);\n }\n}\n\ninterface InsertCitationPanelConfiguration {\n providers: CitationSourcePanelProvider[];\n bibliographyFiles: BibliographyFile[];\n existingIds: string[];\n}\n\ninterface InsertCitationPanelConfigurationStream {\n current: InsertCitationPanelConfiguration;\n stream: () => InsertCitationPanelConfiguration | null;\n}\n\n// The picker is a full featured UI for finding and selecting citation data\n// to be added to a document.\ninterface InsertCitationPanelProps extends WidgetProps {\n ui: EditorUI;\n doc: ProsemirrorNode;\n height: number;\n width: number;\n configuration: InsertCitationPanelConfigurationStream;\n initiallySelectedNodeKey?: string;\n onOk: (\n bibliographySourceProviders: BibliographySourceProvider[],\n bibliography: BibliographyFile,\n selectedNode: NavigationTreeNode,\n intextCitationStyle: boolean\n ) => void;\n onCancel: () => void;\n}\n\ninterface InsertCitationPanelState {\n citations: CitationListEntry[];\n citationsToAdd: CitationListEntry[];\n selectedIndex: number;\n searchTerm: string;\n selectedNode: NavigationTreeNode;\n status: CitationSourceListStatus;\n statusMessage: string;\n existingBibliographyFile: BibliographyFile;\n createBibliographyFile: BibliographyFile;\n intextCitationStyle: boolean;\n}\n\ninterface InsertCitationPanelUpdateState {\n citations?: CitationListEntry[];\n citationsToAdd?: CitationListEntry[];\n selectedIndex?: number;\n searchTerm?: string;\n selectedNode?: NavigationTreeNode;\n status?: CitationSourceListStatus;\n statusMessage?: string;\n existingBibliographyFile?: BibliographyFile;\n createBibliographyFile?: BibliographyFile;\n intextCitationStyle?: boolean;\n}\n\nexport const InsertCitationPanel: React.FC<InsertCitationPanelProps> = props => {\n // The configuration state of this panel\n const [insertCitationConfiguration, setInsertCitationConfiguration] = React.useState<\n InsertCitationPanelConfiguration\n >(props.configuration.current);\n\n // The source data for the tree\n const treeSourceData = insertCitationConfiguration.providers.map(panel => panel.treeNode());\n\n // The selected provider / panel for the dialog\n const defaultNode = nodeForKey(treeSourceData, props.initiallySelectedNodeKey);\n const [selectedPanelProvider, setSelectedPanelProvider] = React.useState<CitationSourcePanelProvider>(\n panelForNode(insertCitationConfiguration.providers, defaultNode) || insertCitationConfiguration.providers[0],\n );\n\n // Holder of the dialog state\n const [insertCitationPanelState, setInsertCitationPanelState] = React.useState<InsertCitationPanelState>({\n citations: [],\n citationsToAdd: [],\n selectedIndex: -1,\n searchTerm: '',\n selectedNode: defaultNode || selectedPanelProvider.treeNode(),\n status: CitationSourceListStatus.default,\n statusMessage: selectedPanelProvider.placeHolderMessage || '',\n existingBibliographyFile: props.configuration.current.bibliographyFiles[0],\n createBibliographyFile: bibliographyFileForPath(\n changeExtension(\n 'references.json',\n props.ui.prefs.bibliographyDefaultType() || bibliographyTypes(props.ui)[0].extension,\n ),\n props.ui,\n ),\n intextCitationStyle: props.ui.prefs.citationDefaultInText()\n });\n\n // Core method to update dialog state\n const updateState = (updatedState: InsertCitationPanelUpdateState) => {\n const newState = {\n ...insertCitationPanelState,\n ...updatedState,\n };\n setInsertCitationPanelState(newState);\n };\n\n // The dialog intelligently manages and merges the selected item and the explicitly added items\n // This is the merged set of citations based upon the explicitly chosen and currently selected citations\n const displayedCitations = insertCitationPanelState.citations.filter(\n citation => !insertCitationPanelState.citationsToAdd.includes(citation),\n );\n const selectedCitation =\n insertCitationPanelState.selectedIndex > -1\n ? displayedCitations[insertCitationPanelState.selectedIndex]\n : undefined;\n const mergedCitationsToAdd = mergeCitations(insertCitationPanelState.citationsToAdd, selectedCitation);\n const existingCitationIds = [\n ...insertCitationConfiguration.existingIds,\n ...mergedCitationsToAdd.map(citation => citation.id),\n ];\n\n // The initial setting of focus and loading of data for the panel.\n const panelRef = React.useRef<any>(undefined);\n\n // When the stream of configuration changes is actually loaded, we need to refresh the search\n // results to reflect the new configuration. The below refs basically:\n // 1) Capture the timer itself so only timer is created and it will be properly canceled\n // 2) Captures the up to date state in the callback that will be used to refresh the search results -\n // If we don't refresh it each render, it will capture the state the time it was created\n const streamTimerId = React.useRef<NodeJS.Timeout>();\n const refreshSearchCallback = React.useRef<VoidFunction>();\n React.useEffect(() => {\n refreshSearchCallback.current = async () => {\n if (selectedPanelProvider.typeAheadSearch) {\n // Once the configurations, refresh the search\n selectedPanelProvider.typeAheadSearch(\n insertCitationPanelState.searchTerm,\n insertCitationPanelState.selectedNode,\n insertCitationConfiguration.existingIds,\n (results: CitationSourcePanelSearchResult) => {\n updateState({\n searchTerm: '',\n citations: results?.citations || [],\n status: results?.status || CitationSourceListStatus.default,\n statusMessage: results?.statusMessage || selectedPanelProvider.placeHolderMessage,\n });\n }\n );\n }\n };\n });\n\n React.useEffect(() => {\n // Set initial focus\n if (panelRef.current) {\n setTimeout(() => {\n panelRef.current.focus();\n }, 200);\n }\n\n // Poll the configuration stream for updates\n // We need to keep the Timeout to clear around as ref so\n // it survives any renders\n streamTimerId.current = setInterval(() => {\n const result = props.configuration.stream();\n if (result !== null) {\n if (streamTimerId.current) {\n clearInterval(streamTimerId.current);\n }\n\n setInsertCitationConfiguration(result);\n const panelProvider = panelForNode(result.providers, insertCitationPanelState.selectedNode);\n if (panelProvider) {\n setSelectedPanelProvider(panelProvider);\n }\n if (refreshSearchCallback.current) {\n refreshSearchCallback.current();\n }\n }\n }, 200);\n\n // Set the default state to initialize the first search\n if (selectedPanelProvider.typeAheadSearch) {\n selectedPanelProvider.typeAheadSearch(\n '',\n insertCitationPanelState.selectedNode,\n insertCitationConfiguration.existingIds,\n (result: CitationSourcePanelSearchResult) => {\n updateState({\n searchTerm: '',\n citations: result?.citations || [],\n status: result?.status || CitationSourceListStatus.default,\n statusMessage: result?.statusMessage || selectedPanelProvider.placeHolderMessage,\n });\n }\n );\n }\n }, []);\n\n // When the user presses the insert button\n const onOk = () => {\n props.onOk(\n mergedCitationsToAdd,\n insertCitationPanelState.existingBibliographyFile || insertCitationPanelState.createBibliographyFile,\n insertCitationPanelState.selectedNode,\n insertCitationPanelState.intextCitationStyle\n );\n };\n\n // Style properties\n const style: React.CSSProperties = {\n width: props.width + 'px',\n ...props.style,\n };\n\n // Figure out the panel height (the height of the main panel less padding and other elements)\n const panelHeight = props.height * 0.75;\n\n // In order to debounce typeahead search, we need to memoize the callback so the same debounce function will be\n // used even when renders happen. Be sure to pass everything that need to reflect updated state since\n // otherwise the value will be captured when the callback is memoized.\n const memoizedTypeaheadSearch = React.useCallback(\n debounce(\n (\n searchTerm: string,\n panelProvider: CitationSourcePanelProvider,\n existingIds: string[],\n existingState: InsertCitationPanelState\n ) => {\n if (panelProvider.typeAheadSearch) {\n panelProvider.typeAheadSearch(searchTerm, existingState.selectedNode, existingIds, (result: CitationSourcePanelSearchResult) => {\n setInsertCitationPanelState(\n {\n ...existingState,\n searchTerm,\n citations: result?.citations,\n status: result?.status,\n statusMessage: result?.statusMessage,\n }\n );\n });\n }\n },\n 30,\n ),\n [],\n );\n\n // The core props that will be passed to whatever the selected panel is\n // This implements the connection of the panel events and data and the\n // core dialog state\n const citationProps: CitationSourcePanelProps = {\n ui: props.ui,\n height: panelHeight,\n citations: displayedCitations,\n citationsToAdd: mergedCitationsToAdd,\n searchTerm: insertCitationPanelState.searchTerm,\n onSearchTermChanged: (term: string) => {\n const updatedState = { ...insertCitationPanelState, searchTerm: term };\n updateState(updatedState);\n memoizedTypeaheadSearch(term, selectedPanelProvider, insertCitationConfiguration.existingIds, updatedState);\n },\n onExecuteSearch: (searchTerm: string) => {\n searchCanceled.current = false;\n updateState({\n searchTerm,\n status: CitationSourceListStatus.inProgress,\n statusMessage: selectedPanelProvider.progressMessage,\n });\n if (selectedPanelProvider.search) {\n selectedPanelProvider\n .search(searchTerm, insertCitationPanelState.selectedNode, existingCitationIds)\n .then(searchResult => {\n if (!searchCanceled.current) {\n // If only a single result is returned, select that by default\n const selectedIndex = searchResult?.citations.length === 1 ? 0 : -1;\n\n updateState({\n searchTerm,\n citations: searchResult?.citations,\n status: searchResult?.status,\n statusMessage: searchResult?.statusMessage,\n selectedIndex,\n });\n }\n });\n }\n },\n onAddCitation: (citation: CitationListEntry) => {\n const newCitations = [...insertCitationPanelState.citationsToAdd, citation];\n updateState({ selectedIndex: -1, citationsToAdd: newCitations });\n },\n onRemoveCitation: (citation: CitationListEntry) => {\n deleteCitation(citation.id);\n },\n selectedIndex: insertCitationPanelState.selectedIndex,\n onSelectedIndexChanged: (index: number) => {\n updateState({ selectedIndex: index });\n },\n onConfirm: onOk,\n status: insertCitationPanelState.status,\n statusMessage: insertCitationPanelState.statusMessage,\n warningMessage: selectedPanelProvider.warningMessage || '',\n ref: panelRef,\n };\n\n // Tracks whether a long running search has been canceled\n // for example by the user navigating to another section of the dialog\n const searchCanceled = React.useRef<boolean>(false);\n\n // This implements the connection of the dialog (non-provider panel) events and data and the\n // core dialog state\n const onNodeSelected = async (node: NavigationTreeNode) => {\n const suggestedPanel = panelForNode(insertCitationConfiguration.providers, node);\n if (suggestedPanel) {\n\n // Clear the current displayed citations\n updateState({ citations: [], selectedNode: node, status: CitationSourceListStatus.default, statusMessage: \"\" });\n searchCanceled.current = true;\n if (suggestedPanel.typeAheadSearch) {\n suggestedPanel.typeAheadSearch('', node, insertCitationConfiguration.existingIds, (result: CitationSourcePanelSearchResult) => {\n updateState({\n searchTerm: '',\n citations: result?.citations || [],\n status: result?.status || CitationSourceListStatus.default,\n statusMessage: result?.statusMessage || suggestedPanel.placeHolderMessage,\n selectedNode: node,\n });\n });\n }\n\n if (suggestedPanel?.key !== selectedPanelProvider?.key) {\n setSelectedPanelProvider(suggestedPanel);\n }\n }\n };\n\n const deleteCitation = (id: string) => {\n\n // First, see if the item we're delete is the selection\n const selCite = displayedCitations[insertCitationPanelState.selectedIndex];\n if (selCite && selCite.id === id) {\n // This is the selected index, just clear the selection\n updateState({ selectedIndex: -1 });\n } else {\n // This is an explicitly added citation, remove it\n const filteredCitations = insertCitationPanelState.citationsToAdd.filter(source => source.id !== id);\n updateState({ citationsToAdd: filteredCitations });\n }\n };\n\n const onTagDeleted = (tag: TagItem) => {\n deleteCitation(tag.key);\n };\n\n const onTagChanged = (key: string, text: string) => {\n // Edit any matching entries in the citation basket\n const targetSource = insertCitationPanelState.citationsToAdd.find(source => source.id === key);\n if (targetSource) {\n targetSource.id = text;\n }\n\n // Edit the currently selected item\n if (insertCitationPanelState.selectedIndex > -1) {\n const currentlySelectedCitation = insertCitationPanelState.citations[insertCitationPanelState.selectedIndex];\n if (currentlySelectedCitation && currentlySelectedCitation.id === key) {\n currentlySelectedCitation.id = text;\n }\n }\n };\n\n const onTagValidate = (key: string, text: string) => {\n const invalidChars = text.match(kInvalidCiteKeyChars);\n if (invalidChars) {\n return props.ui.context.translateText(\n 'The citekey includes invalid characters such as a space or a special character.',\n );\n }\n return null;\n };\n\n const onBibliographyFileChanged = (biblographyFile: BibliographyFile) => {\n updateState({ existingBibliographyFile: biblographyFile });\n };\n\n const onCreateBibliographyFileNameChanged = (fileName: string) => {\n updateState({ createBibliographyFile: bibliographyFileForPath(fileName, props.ui) });\n };\n\n const onCitationStyleChanged = (e: React.ChangeEvent<HTMLInputElement>) => {\n updateState({\n intextCitationStyle: e.target.checked\n });\n };\n\n // Support keyboard shortcuts for dismissing dialog\n const onKeyPress = (event: React.KeyboardEvent) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n event.stopPropagation();\n onOk();\n }\n };\n\n // Esc can cause loss of focus so catch it early\n const onKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.stopPropagation();\n props.onCancel();\n }\n };\n\n const totalCitationCount = insertCitationPanelState.citationsToAdd.length + (insertCitationPanelState.selectedIndex > -1 ? 1 : 0);\n\n\n // Create the panel that should be displayed for the selected node of the tree\n const panelToDisplay = selectedPanelProvider\n ? React.createElement(selectedPanelProvider.panel, citationProps)\n : undefined;\n return (\n <div className=\"pm-cite-panel-container\" style={style} onKeyPress={onKeyPress} onKeyDown={onKeyDown}>\n <div className=\"pm-cite-panel-cite-selection\">\n <div className=\"pm-cite-panel-cite-selection-sources pm-block-border-color pm-background-color\">\n <NavigationTree\n height={panelHeight}\n nodes={treeSourceData}\n selectedNode={insertCitationPanelState.selectedNode}\n onSelectedNodeChanged={onNodeSelected}\n />\n </div>\n <div className=\"pm-cite-panel-cite-selection-items\">{panelToDisplay}</div>\n </div>\n <div className=\"pm-cite-panel-selected-cites pm-block-border-color pm-background-color\">\n <TagInput\n tags={mergedCitationsToAdd.map(source => ({\n key: source.id,\n displayText: source.id,\n displayPrefix: '@',\n isEditable: source.isIdEditable,\n }))}\n onTagDeleted={onTagDeleted}\n onTagChanged={onTagChanged}\n onTagValidate={onTagValidate}\n ui={props.ui}\n placeholder={props.ui.context.translateText('Selected Citation Keys')}\n maxDisplayCharacters={50}\n />\n </div>\n <div className=\"pm-cite-panel-insert-inputs\">\n <div className=\"pm-cite-panel-insert-options\">\n {// Only show the picker if there are either no bibliographies specified, or if there are writable bibliographies\n insertCitationConfiguration.bibliographyFiles.length === 0 ||\n insertCitationConfiguration.bibliographyFiles.some(bibFile => bibFile?.writable) ? (\n <CitationBibliographyPicker\n bibliographyTypes={bibliographyTypes(props.ui)}\n createBibliographyFileName={insertCitationPanelState.createBibliographyFile.displayPath}\n onCreateBibliographyFileNameChanged={onCreateBibliographyFileNameChanged}\n bibliographyFiles={insertCitationConfiguration.bibliographyFiles}\n onBiblographyFileChanged={onBibliographyFileChanged}\n ui={props.ui}\n />\n ) : (\n <div />\n )}\n {\n totalCitationCount <= 1 ? (\n <div className='pm-cite-panel-checkbox-group'>\n <CheckboxInput\n id='intextStyleCheckbox'\n checked={insertCitationPanelState.intextCitationStyle}\n className='pm-cite-panel-checkbox'\n onChange={onCitationStyleChanged} />\n <label htmlFor='intextStyleCheckbox' className='pm-cite-panel-checkbox-label'>{props.ui.context.translateText('Use in-text citation')}</label>\n </div>\n ) : (\n <div />\n )}\n\n </div>\n\n <DialogButtons\n okLabel={props.ui.context.translateText('Insert')}\n cancelLabel={props.ui.context.translateText('Cancel')}\n onOk={onOk}\n onCancel={props.onCancel}\n />\n </div>\n </div>\n );\n};\n\n// Finds the panel associated with the selected tree node\nconst panelForNode = (sourcePanels: CitationSourcePanelProvider[], node?: NavigationTreeNode) => {\n if (node) {\n const panelItem = sourcePanels.find(panel => {\n const panelTreeNode = panel.treeNode();\n return containsChild(node.key, panelTreeNode);\n });\n return panelItem;\n } else {\n return undefined;\n }\n};\n\n// Given a key, find the node associated with the key (useful for restoring a selected node from a key)\nconst nodeForKey = (nodes: NavigationTreeNode[], key?: string): NavigationTreeNode | undefined => {\n if (!key) {\n return undefined;\n }\n\n for (const node of nodes) {\n if (node.key === key) {\n return node;\n }\n const childNode = nodeForKey(node.children, key);\n if (childNode) {\n return childNode;\n }\n }\n return undefined;\n};\n\n// Merge the selected citation into the list that is displayed for add and filter it\n// out of the citation list itself\nconst mergeCitations = (toAdd: CitationListEntry[], selected?: CitationListEntry) => {\n if (!selected) {\n return toAdd;\n } else {\n if (toAdd.map(citation => citation.id).includes(selected.id)) {\n return toAdd;\n } else {\n return (toAdd || []).concat(selected);\n }\n }\n};\n","/*\n * tag-input.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\n\nimport { WidgetProps } from './react';\n\nimport { EditorUI } from '../ui';\n\nimport './tag-input.css';\nimport { TextInput } from './text';\nimport { kAlertTypeError } from '../ui-dialogs';\n\n// Item representing a tag entry\n// The key remains stable even if the tag is edited\n// The displayPrefix will be displayed to the user, but removed when editing\nexport interface TagItem {\n key: string;\n displayText: string;\n displayPrefix: string;\n isEditable?: boolean;\n}\n\ninterface TagInputProps extends WidgetProps {\n tags: TagItem[];\n onTagDeleted: (tag: TagItem) => void;\n onTagChanged: (key: string, text: string) => void;\n onTagValidate?: (key: string, text: string) => string | null;\n ui: EditorUI;\n placeholder?: string;\n maxDisplayCharacters?: number;\n}\n\nexport const TagInput = React.forwardRef<HTMLDivElement, TagInputProps>((props, ref) => {\n return (\n <div style={props.style} className=\"pm-tag-input-container\" ref={ref}>\n {props.tags.length === 0 ? (\n <div className=\"pm-tag-input-placeholder\">\n <div className=\"pm-placeholder-text-color\">{props.placeholder}</div>\n </div>\n ) : (\n undefined\n )}\n {props.tags.map(tag => (\n <Tag\n key={tag.key}\n tag={tag}\n onTagDeleted={props.onTagDeleted}\n onTagChanged={props.onTagChanged}\n onTagValidate={props.onTagValidate}\n ui={props.ui}\n maxDisplayCharacters={props.maxDisplayCharacters}\n />\n ))}\n </div>\n );\n});\n\ninterface TagProps extends WidgetProps {\n tag: TagItem;\n onTagDeleted: (tag: TagItem) => void;\n onTagChanged: (key: string, text: string) => void;\n onTagValidate?: (key: string, text: string) => string | null;\n ui: EditorUI;\n maxDisplayCharacters?: number;\n}\n\nconst Tag: React.FC<TagProps> = props => {\n const [editing, setEditing] = React.useState<boolean>(false);\n const [editingText, setEditingText] = React.useState<string>(props.tag.displayText);\n const [displayText, setDisplayText] = React.useState<string>(props.tag.displayText);\n\n const editImage = React.useRef<HTMLImageElement>(null);\n const showingValidationError = React.useRef<boolean>(false);\n const restoreFocusAfterCancel = React.useRef<boolean>(false);\n\n // Anytime we begin editing, focus the text input\n const editTextInput = React.useRef<HTMLInputElement>(null);\n React.useLayoutEffect(() => {\n if (editing) {\n editTextInput.current?.focus();\n } else if (restoreFocusAfterCancel.current) {\n // Focus the edit image\n editImage.current?.focus();\n restoreFocusAfterCancel.current = false;\n }\n }, [editing]);\n\n // Click the delete icon\n const onDeleteClick = (e: React.MouseEvent) => {\n props.onTagDeleted(props.tag);\n };\n\n // Enter or space while delete icon focused\n const onDeleteKeyPress = (e: React.KeyboardEvent) => {\n switch (e.key) {\n case 'Enter':\n case ' ':\n e.preventDefault();\n e.stopPropagation();\n props.onTagDeleted(props.tag);\n break;\n }\n };\n\n // Click on the edit icon\n const onEditClick = (e: React.MouseEvent) => {\n if (props.tag.isEditable) {\n setEditing(true);\n }\n };\n\n // Enter or space while edit icon is focused\n const onEditKeyPress = (e: React.KeyboardEvent) => {\n switch (e.key) {\n case 'Enter':\n case ' ':\n e.preventDefault();\n e.stopPropagation();\n setEditing(true);\n break;\n }\n };\n\n // Commit edits to the tag\n const commitTagEdit = () => {\n // Validate the input\n if (props.onTagValidate) {\n const validationMessage = props.onTagValidate(props.tag.key, editingText);\n if (validationMessage !== null) {\n showingValidationError.current = true;\n props.ui.dialogs\n .alert(\n props.ui.context.translateText(validationMessage),\n props.ui.context.translateText('Validation Error'),\n kAlertTypeError,\n )\n .then(() => {\n editTextInput.current?.focus();\n showingValidationError.current = false;\n });\n return;\n }\n }\n\n // Update the text\n setDisplayText(editingText);\n\n // Halt editing\n setEditing(false);\n\n // Notify of change\n props.onTagChanged(props.tag.key, editingText);\n\n // Focus the edit image\n editImage.current?.focus();\n };\n\n const cancelTagEdit = () => {\n // Halt editing\n setEditing(false);\n\n // Revert editing text\n setEditingText(displayText);\n\n // The editing control will lose focus, so we need to focus something else\n restoreFocusAfterCancel.current = true;\n };\n\n // When editing the tag, allow enter to accept the changes\n const handleEditKeyDown = (e: React.KeyboardEvent) => {\n switch (e.key) {\n case 'Enter':\n // If we're validiating, don't commit.\n if (showingValidationError.current) {\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n commitTagEdit();\n break;\n case 'Escape':\n e.preventDefault();\n e.stopPropagation();\n cancelTagEdit();\n break;\n }\n };\n\n // When editing, clicking away from the tag will accept changes\n const handleEditBlur = () => {\n // If we're validiating, don't commit.\n if (showingValidationError.current) {\n return;\n }\n commitTagEdit();\n };\n\n const handleEditChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const edittedText = e.target.value;\n setEditingText(edittedText);\n };\n\n return (\n <div key={props.tag.displayText} className=\"pm-tag-input-tag pm-block-border-color\">\n <img\n src={props.ui.images.widgets?.tag_delete}\n onClick={onDeleteClick}\n onKeyPress={onDeleteKeyPress}\n className=\"pm-tag-input-delete-image\"\n tabIndex={0}\n draggable=\"false\"\n />\n <div className={`pm-tag-input-text ${props.tag.isEditable ? 'pm-tag-input-text-edittable' : undefined}`}>\n {!editing ? (\n <div onClick={onEditClick} className=\"pm-tag-input-text-raw pm-text-color\">\n {props.tag.displayPrefix}\n {props.maxDisplayCharacters ? \n displayText.length > props.maxDisplayCharacters ? displayText.substr(0, props.maxDisplayCharacters - 1) + '…' : displayText: \n displayText}\n </div>\n ) : (\n <TextInput\n width={props.maxDisplayCharacters ? \n `${Math.min(props.maxDisplayCharacters, editingText.length)}ch` :\n `${editingText.length}ch`\n }\n ref={editTextInput}\n className=\"pm-tag-input-text-edit\"\n value={editingText}\n onChange={handleEditChange}\n onKeyDown={handleEditKeyDown}\n onBlur={handleEditBlur}\n />\n )}\n </div>\n {props.tag.isEditable ? (\n <img\n src={props.ui.images.widgets?.tag_edit}\n className=\"pm-tag-input-edit-image\"\n onClick={onEditClick}\n onKeyPress={onEditKeyPress}\n tabIndex={0}\n ref={editImage}\n draggable=\"false\"\n />\n ) : (\n undefined\n )}\n </div>\n );\n};\n","/*\n * navigation-tree.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React, { CSSProperties } from 'react';\n\nimport { WidgetProps } from './react';\nimport { FixedSizeList, ListChildComponentProps } from 'react-window';\n\nimport './navigation-tree.css';\n\n// Individual nodes and children of the Select Tree\nexport interface NavigationTreeNode {\n key: string;\n image?: string;\n name: string;\n type: string;\n children: NavigationTreeNode[];\n expanded?: boolean;\n}\n\ninterface NavigationTreeProps extends WidgetProps {\n height: number;\n nodes: NavigationTreeNode[];\n selectedNode: NavigationTreeNode;\n onSelectedNodeChanged: (node: NavigationTreeNode) => void;\n}\n\ninterface NavigationTreeItemProps extends ListChildComponentProps {\n data: {\n nodes: NavigationTreeNode[];\n selectedNode: NavigationTreeNode;\n onSelectedNodeChanged: (node: NavigationTreeNode) => void;\n showSelection: boolean;\n preventFocus: boolean;\n };\n}\n\n// Indent level for each level\nconst kNavigationTreeIndent = 8;\n\n// Select Tree is a single selection tree that is useful in\n// hierarchical navigation type contexts. It does not support\n// multiple selection and is generally not a well behaved tree\n// like you would use to navigate a hierarchical file system.\nexport const NavigationTree: React.FC<NavigationTreeProps> = props => {\n const style: CSSProperties = {\n height: props.height + 'px',\n ...props.style,\n };\n\n // The currently selected node should always be expanded\n const selectedNode = props.selectedNode;\n\n // Ensure that all the parents of the selected node are expanded\n const nodes = props.nodes;\n const currentNodePath = pathToNode(selectedNode, nodes);\n currentNodePath.forEach(node => (node.expanded = true));\n const selNode = nodes.find(n => n.key === selectedNode.key);\n if (selNode) {\n selNode.expanded = true;\n }\n const vizNodes = visibleNodes(props.nodes, props.selectedNode);\n\n // Ensure the item is scrolled into view\n const fixedList = React.useRef<FixedSizeList>(null);\n React.useEffect(() => {\n if (props.selectedNode) {\n vizNodes.find((value, index) => {\n if (value.key === selectedNode.key) {\n fixedList.current?.scrollToItem(index);\n return true;\n }\n });\n }\n });\n\n // Process keys to enable keyboard based navigation\n const processKey = (e: React.KeyboardEvent) => {\n const selected = props.selectedNode;\n switch (e.key) {\n case 'ArrowDown':\n if (selected) {\n const next = stepNode(selectedNode, props.nodes, 1);\n props.onSelectedNodeChanged(next);\n }\n break;\n\n case 'ArrowUp':\n if (selected) {\n const previous = stepNode(selectedNode, props.nodes, -1);\n props.onSelectedNodeChanged(previous);\n }\n break;\n\n case 'PageDown':\n if (selected) {\n const next = stepNode(selectedNode, props.nodes, 4);\n props.onSelectedNodeChanged(next);\n }\n break;\n\n case 'PageUp':\n if (selected) {\n const previous = stepNode(selectedNode, props.nodes, -4);\n props.onSelectedNodeChanged(previous);\n }\n break;\n }\n };\n\n return (\n <div style={style} tabIndex={0} onKeyDown={processKey}>\n <FixedSizeList\n className=\"pm-navigation-tree\"\n height={props.height}\n width=\"100%\"\n itemCount={vizNodes.length}\n itemSize={28}\n itemData={{\n nodes: vizNodes,\n selectedNode: props.selectedNode,\n onSelectedNodeChanged: props.onSelectedNodeChanged,\n showSelection: true,\n preventFocus: true,\n }}\n ref={fixedList}\n >\n {NavigationTreeItem}\n </FixedSizeList>\n </div>\n );\n};\n\n// Renders each item\nconst NavigationTreeItem = (props: NavigationTreeItemProps) => {\n const data = props.data;\n const node: NavigationTreeNode = props.data.nodes[props.index];\n const path = pathToNode(node, data.nodes);\n const depth = path.length - 1;\n\n // Select the tree node\n const onClick = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n data.onSelectedNodeChanged(node);\n };\n\n // Whether this node is selected\n const selected = data.selectedNode.key === node.key;\n\n const indentLevel = depth;\n const indentStyle = {\n paddingLeft: indentLevel * kNavigationTreeIndent + 'px',\n };\n\n const selectedClassName = `${\n selected ? 'pm-selected-navigation-tree-item' : 'pm-navigation-tree-item'\n } pm-navigation-tree-node`;\n return (\n <div key={node.key} onClick={onClick} style={props.style}>\n <div className={selectedClassName} style={indentLevel > 0 ? indentStyle : undefined}>\n {node.image ? (\n <div className=\"pm-navigation-tree-node-image-div\">\n <img src={node.image} alt={node.name} className=\"pm-navigation-tree-node-image\" draggable=\"false\"/>\n </div>\n ) : null}\n <div className=\"pm-navigation-tree-node-label-div pm-text-color\">{node.name}</div>\n </div>\n </div>\n );\n};\n\n// Indicates whether a given key is the identified node or one of its\n// children\nexport function containsChild(key: string, node: NavigationTreeNode): boolean {\n if (node.key === key) {\n return true;\n }\n\n for (const childNode of node.children) {\n const hasChild = containsChild(key, childNode);\n if (hasChild) {\n return true;\n }\n }\n return false;\n}\n\n// enumerate the nodes that lead to a selected node\nfunction pathToNode(node: NavigationTreeNode, nodes: NavigationTreeNode[]): NavigationTreeNode[] {\n const path: NavigationTreeNode[] = [];\n if (node) {\n for (const root of nodes) {\n if (root.key === node.key) {\n path.push(node);\n return path;\n }\n\n const childPath = pathToNode(node, root.children);\n if (childPath.length > 0) {\n path.push(root, ...childPath);\n return path;\n }\n }\n }\n return path;\n}\n\n// Creates an ordered flattened list of visible nodes in the\n// tree. Useful for incrementing through visible nodes :)\nfunction visibleNodes(nodes: NavigationTreeNode[], selectedNode: NavigationTreeNode) {\n const nodeList: NavigationTreeNode[][] = nodes.map(node => {\n if (node.expanded || node.key === selectedNode.key) {\n return [node].concat(visibleNodes(node.children, selectedNode));\n } else {\n return [node];\n }\n });\n return ([] as NavigationTreeNode[]).concat(...nodeList);\n}\n\n// Get the previous node for the current node\nfunction stepNode(node: NavigationTreeNode, allNodes: NavigationTreeNode[], increment: number): NavigationTreeNode {\n const nodes = visibleNodes(allNodes, node);\n const currentIndex = nodes.map(n => n.key).indexOf(node.key);\n const step = currentIndex + increment;\n if (step >= 0 && step < nodes.length - 1) {\n return nodes[step];\n } else if (step < 0) {\n return nodes[0];\n } else {\n return nodes[nodes.length - 1];\n }\n}\n","/*\n * dialog-buttons.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { WidgetProps } from './react';\n\nimport { EditorUI } from '../ui';\n\nimport { TextButton } from './button';\nimport React from 'react';\n\nimport './dialog-buttons.css';\n\nexport interface DialogButtonsProps extends WidgetProps {\n okLabel: string;\n cancelLabel: string;\n onOk: () => void;\n onCancel: () => void;\n}\n\nexport const DialogButtons: React.FC<DialogButtonsProps> = props => {\n return (\n <div className=\"pm-dialog-buttons-panel\" style={props.style}>\n <TextButton\n title={props.okLabel}\n classes={['pm-default-theme', 'pm-dialog-buttons-button', 'pm-rstudio-button']}\n onClick={props.onOk}\n style={{\n fontWeight: 600,\n }}\n />\n\n <TextButton\n title={props.cancelLabel}\n classes={['pm-default-theme', 'pm-dialog-buttons-button', 'pm-rstudio-button']}\n onClick={props.onCancel}\n />\n </div>\n );\n};\n","// Panels get a variety of information as properties to permit them to search\n\nimport { WidgetProps } from '../../../api/widgets/react';\n\nimport { EditorUI } from '../../../api/ui';\n\nimport { NavigationTreeNode } from '../../../api/widgets/navigation-tree';\nimport { BibliographySource, BibliographyManager } from '../../../api/bibliography/bibliography';\nimport { CSL, imageForType } from '../../../api/csl';\nimport { suggestCiteId, formatIssuedDate, formatAuthors } from '../../../api/cite';\n\n// citations and add them\nexport interface CitationSourcePanelProps extends WidgetProps {\n ui: EditorUI;\n height: number;\n\n searchTerm: string;\n onSearchTermChanged: (term: string) => void;\n onExecuteSearch: (term: string) => void;\n\n citations: CitationListEntry[];\n citationsToAdd: CitationListEntry[];\n\n onAddCitation: (citation: CitationListEntry) => void;\n onRemoveCitation: (citation: CitationListEntry) => void;\n onConfirm: VoidFunction;\n\n selectedIndex: number;\n onSelectedIndexChanged: (index: number) => void;\n\n status: CitationSourceListStatus;\n statusMessage: string;\n\n warningMessage: string;\n\n ref: React.Ref<any>;\n}\n\n// Citation Panels Providers are the core element of ths dialog. Each provider provides\n// the main panel UI as well as the tree to display when the panel is displayed.\nexport interface CitationSourcePanelProvider {\n key: string;\n panel: React.FC<CitationSourcePanelProps>;\n treeNode(): NavigationTreeNode;\n placeHolderMessage?: string;\n progressMessage?: string;\n warningMessage?: string;\n typeAheadSearch?: (\n term: string,\n selectedNode: NavigationTreeNode,\n existingCitationIds: string[],\n onResults: (result: CitationSourcePanelSearchResult) => void\n ) => void;\n search?: (\n term: string,\n selectedNode: NavigationTreeNode,\n existingCitationIds: string[],\n ) => Promise<CitationSourcePanelSearchResult>;\n}\n\nexport interface CitationSourcePanelSearchResult {\n citations: CitationListEntry[];\n status: CitationSourceListStatus;\n statusMessage: string;\n}\n\nexport interface CitationListEntry extends BibliographySourceProvider {\n id: string;\n isIdEditable: boolean;\n image?: string;\n imageAdornment?: string;\n type: string;\n title: string;\n authors: (width: number) => string;\n date: string;\n journal: string | undefined;\n doi?: string;\n}\n\nexport interface BibliographySourceProvider {\n id: string;\n isSlowGeneratingBibliographySource: boolean;\n toBibliographySource: (id: string) => Promise<BibliographySource>;\n}\n\nexport enum CitationSourceListStatus {\n default,\n inProgress,\n noResults,\n error,\n}\n\nexport function errorForStatus(ui: EditorUI, status: string, providerName: string) {\n return status === 'nohost'\n ? ui.context.translateText(`Unable to search ${providerName}. Please check your network connection and try again.`)\n : ui.context.translateText(`An error occurred while searching ${providerName}.`);\n}\n\n\nexport function matchExistingSourceCitationListEntry(doi: string, existingIds: string[], ui: EditorUI, bibliographyManager: BibliographyManager) {\n\n const localSources = bibliographyManager.localSources();\n const existingSource = localSources.find(source => {\n if (source.DOI?.toLowerCase() === doi.toLowerCase()) {\n return source;\n }\n });\n if (existingSource) {\n return existingSourceToCitationListEntry(existingSource, existingIds, ui);\n }\n}\n\nfunction existingSourceToCitationListEntry(csl: CSL, existingIds: string[], ui: EditorUI): CitationListEntry {\n const providerKey = 'pubmed';\n return {\n id: csl.id || suggestCiteId(existingIds, csl),\n isIdEditable: false,\n title: csl.title || '',\n doi: csl.DOI,\n type: '',\n date: formatIssuedDate(csl.issued) || '',\n journal: csl[\"container-title\"],\n authors: (length: number) => {\n return formatAuthors(csl.author || [], length);\n },\n image: imageForType(ui.images, csl.type)[0],\n toBibliographySource: async (finalId: string) => {\n // Generate CSL using the DOI\n return { ...csl, id: finalId, providerKey };\n },\n isSlowGeneratingBibliographySource: true,\n };\n}","/*\n * insert_citation-panel-bibliography.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\nimport uniqby from 'lodash.uniqby';\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { EditorUI } from '../../../api/ui';\nimport { NavigationTreeNode } from '../../../api/widgets/navigation-tree';\nimport {\n BibliographyManager,\n BibliographyCollection,\n BibliographySource,\n} from '../../../api/bibliography/bibliography';\nimport { kZoteroProviderKey } from '../../../api/bibliography/bibliography-provider_zotero';\nimport { kLocalBibliographyProviderKey } from '../../../api/bibliography/bibliography-provider_local';\nimport { formatAuthors, formatIssuedDate, createUniqueCiteId } from '../../../api/cite';\nimport {\n CitationSourcePanelProvider,\n CitationSourcePanelProps,\n CitationListEntry,\n CitationSourceListStatus,\n CitationSourcePanelSearchResult,\n} from './insert_citation-source-panel';\nimport { CitationSourceTypeheadSearchPanel } from './insert_citation-source-panel-typeahead-search';\nimport { imageForType } from '../../../api/csl';\n\nimport './insert_citation-source-panel-bibliography.css';\n\nconst kAllLocalSourcesRootNodeType = 'All Local Sources';\n\nexport function bibliographySourcePanel(\n doc: ProsemirrorNode,\n ui: EditorUI,\n bibliographyManager: BibliographyManager,\n): CitationSourcePanelProvider {\n const providers = bibliographyManager.localProviders();\n const providerNodes: { [key: string]: NavigationTreeNode } = {};\n\n // For each of the providers, discover their collections\n providers\n .filter(provider => provider.isEnabled())\n .forEach(provider => {\n const getFolder = (prov: string, hasParent: boolean) => {\n return folderImageForProvider(prov, hasParent, ui);\n };\n\n // Get the response which could be items or could be a stream\n const collectionSpecs = provider.collections();\n // Note the temporary collections\n providerNodes[provider.key] = {\n key: provider.key,\n name: ui.context.translateText(provider.name),\n type: provider.key,\n image: rootImageForProvider(provider.key, ui),\n children: toTree(provider.key, collectionSpecs, getFolder),\n expanded: true,\n };\n });\n\n return {\n key: '17373086-77FE-410F-A319-33E314482125',\n panel: BibligraphySourcePanel,\n treeNode: () => {\n return {\n key: 'My Sources',\n name: ui.context.translateText('My Sources'),\n image: ui.images.citations?.local_sources,\n type: kAllLocalSourcesRootNodeType,\n children: Object.values(providerNodes),\n expanded: true,\n };\n },\n warningMessage: bibliographyManager.warning(),\n typeAheadSearch: (searchTerm: string, selectedNode: NavigationTreeNode, existingCitationIds: string[], onResults: (result: CitationSourcePanelSearchResult) => void) => {\n const providerForNode = (node: NavigationTreeNode): string | undefined => {\n // The node could be the root node, no provider\n return node.type === kAllLocalSourcesRootNodeType ? undefined : node.type;\n };\n\n const collectionKeyForNode = (node: NavigationTreeNode): string | undefined => {\n // The node could be a provider root or a collection\n return node.type !== kAllLocalSourcesRootNodeType &&\n node.key !== kZoteroProviderKey &&\n node.key !== kLocalBibliographyProviderKey\n ? node.key\n : undefined;\n };\n const sources = bibliographyManager.search(\n searchTerm,\n providerForNode(selectedNode),\n collectionKeyForNode(selectedNode),\n );\n const uniqueSources = uniqby(sources, source => source.id);\n\n const citations = toCitationListEntries(uniqueSources, existingCitationIds, ui);\n onResults({\n citations,\n status: citations.length > 0 ? CitationSourceListStatus.default : CitationSourceListStatus.noResults,\n statusMessage: citations.length > 0 ? '' : ui.context.translateText('No items'),\n });\n },\n };\n}\n\nexport const BibligraphySourcePanel = React.forwardRef<HTMLDivElement, CitationSourcePanelProps>(\n (props: CitationSourcePanelProps, ref) => {\n return (\n <>\n {props.warningMessage ? (\n <div className=\"pm-insert-bibliography-source-panel-warning pm-block-border-color\">\n {props.warningMessage}\n </div>\n ) : (\n undefined\n )}\n <CitationSourceTypeheadSearchPanel\n height={props.height}\n citations={props.citations}\n citationsToAdd={props.citationsToAdd}\n searchTerm={props.searchTerm}\n onSearchTermChanged={props.onSearchTermChanged}\n selectedIndex={props.selectedIndex}\n onSelectedIndexChanged={props.onSelectedIndexChanged}\n onAddCitation={props.onAddCitation}\n onRemoveCitation={props.onRemoveCitation}\n onConfirm={props.onConfirm}\n status={props.status}\n statusMessage={props.statusMessage}\n ui={props.ui}\n ref={ref}\n />\n </>\n );\n },\n);\n\nfunction rootImageForProvider(providerKey: string, ui: EditorUI) {\n switch (providerKey) {\n case kZoteroProviderKey:\n return ui.images.citations?.zotero_root;\n case kLocalBibliographyProviderKey:\n return ui.images.citations?.bibligraphy;\n }\n}\n\nfunction folderImageForProvider(providerKey: string, hasParent: boolean, ui: EditorUI) {\n switch (providerKey) {\n case kZoteroProviderKey:\n if (hasParent) {\n return ui.images.citations?.zotero_collection;\n } else {\n return ui.images.citations?.zotero_library;\n }\n case kLocalBibliographyProviderKey:\n return ui.images.citations?.bibligraphy_folder;\n }\n}\n\n// Takes a flat data structure of containers and turns it into a hierarchical\n// tree structure for display as TreeNodes.\nfunction toTree(\n type: string,\n containers: BibliographyCollection[],\n folderImage?: (providerKey: string, hasParent: boolean) => string | undefined,\n): NavigationTreeNode[] {\n const treeMap: { [id: string]: NavigationTreeNode } = {};\n const rootNodes: NavigationTreeNode[] = [];\n\n // Sort the folder in alphabetical order at each level of the tree\n containers\n .sort((a, b) => {\n // For Zotero collection, sort the 'My Library to the top always'\n if (a.provider === kZoteroProviderKey && a.key === '1') {\n return -1;\n }\n return a.name.localeCompare(b.name);\n })\n .forEach(container => {\n // First see if we have an existing node for this item\n // A node could already be there if we had to insert a 'placeholder'\n // node to contain the node's children before we encountered the node.\n const currentNode = treeMap[container.key] || { key: container.key, name: container.name, children: [], type };\n\n // Always set its name to be sure we fill this in when we encounter it\n const hasParent = container.parentKey !== undefined && container.parentKey.length > 0;\n currentNode.name = container.name;\n currentNode.image = folderImage ? folderImage(container.provider, hasParent) : undefined;\n\n if (container.parentKey) {\n let parentNode = treeMap[container.parentKey];\n if (!parentNode) {\n // This is a placeholder node - we haven't yet encountered this child's parent\n // so we insert this to hold the child. Once we encounter the true parent node,\n // we will fix up the values in this placeholder node.\n parentNode = { key: container.parentKey, name: '', children: [], type };\n treeMap[container.parentKey] = parentNode;\n }\n parentNode.children?.push(currentNode);\n } else {\n rootNodes.push(currentNode);\n }\n treeMap[container.key] = currentNode;\n });\n return rootNodes;\n}\n\nfunction toCitationListEntries(\n sources: BibliographySource[],\n existingCitationIds: string[],\n ui: EditorUI,\n): CitationListEntry[] {\n const useBetterBibTex = ui.prefs.zoteroUseBetterBibtex();\n return sources.map(source => {\n return {\n id:\n source.providerKey === kLocalBibliographyProviderKey || useBetterBibTex\n ? source.id\n : createUniqueCiteId(existingCitationIds, source.id),\n isIdEditable: source.providerKey === kZoteroProviderKey && !useBetterBibTex,\n type: source.type,\n title: source.title || '',\n providerKey: source.providerKey,\n date: formatIssuedDate(source.issued),\n journal: '',\n image: imageForType(ui.images, source.type)[0],\n imageAdornment: source.providerKey === kZoteroProviderKey ? ui.images.citations?.zoteroOverlay : undefined,\n authors: (length: number) => {\n return formatAuthors(source.author, length);\n },\n toBibliographySource: (finalId: string) => {\n return Promise.resolve({ ...source, id: finalId, providerKey: source.providerKey });\n },\n isSlowGeneratingBibliographySource: false,\n };\n });\n}\n","/*\n * insert_citation-source-panel-typeahead-search.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport React from 'react';\n\nimport { EditorUI } from '../../../api/ui';\nimport { TextInput } from '../../../api/widgets/text';\nimport { WidgetProps } from '../../../api/widgets/react';\n\nimport './insert_citation-source-panel-typeahead-search.css';\nimport { CitationSourceList } from './insert_citation-source-panel-list';\nimport { CitationListEntry, CitationSourceListStatus } from './insert_citation-source-panel';\nimport { CitationSourcePanelListItem } from './insert_citation-source-panel-list-item';\n\nexport interface CitationSourceTypeaheadSearchPanelProps extends WidgetProps {\n height: number;\n citations: CitationListEntry[];\n citationsToAdd: CitationListEntry[];\n searchTerm: string;\n onSearchTermChanged: (searchTerm: string) => void;\n selectedIndex: number;\n onSelectedIndexChanged: (index: number) => void;\n onAddCitation: (citation: CitationListEntry) => void;\n onRemoveCitation: (citation: CitationListEntry) => void;\n onConfirm: VoidFunction;\n status: CitationSourceListStatus;\n statusMessage: string;\n ui: EditorUI;\n}\n\n// Height of textbox including border\nconst kTextBoxHeight = 30;\n\nexport const CitationSourceTypeheadSearchPanel = React.forwardRef<\n HTMLDivElement,\n CitationSourceTypeaheadSearchPanelProps\n>((props: CitationSourceTypeaheadSearchPanelProps, ref) => {\n const listContainer = React.useRef<HTMLDivElement>(null);\n\n // Search the user search terms\n const searchChanged = (e: React.ChangeEvent<HTMLInputElement>) => {\n const search = e.target.value;\n props.onSearchTermChanged(search);\n };\n\n // Perform first load tasks\n const searchBoxRef = React.useRef<HTMLInputElement>(null);\n\n // If the user arrows down in the search text box, advance to the list of items\n const handleTextKeyDown = (event: React.KeyboardEvent) => {\n switch (event.key) {\n case 'ArrowDown':\n listContainer.current?.focus();\n break;\n }\n };\n\n // Used to focus the search box\n const focusSearch = () => {\n searchBoxRef.current?.focus();\n };\n\n const addCitation = (citation: CitationListEntry) => {\n // Add the citation and reset selection\n props.onAddCitation(citation);\n focusSearch();\n };\n\n // On focus, select the search term for overtype\n const searchBoxFocused = (event: React.FocusEvent<HTMLInputElement>) => {\n event.target.select();\n };\n\n return (\n <div\n style={props.style}\n className=\"pm-insert-citation-panel-search pm-block-border-color pm-background-color\"\n ref={ref}\n tabIndex={-1}\n onFocus={focusSearch}\n >\n <div className=\"pm-insert-citation-search-panel-textbox-container\">\n <TextInput\n width=\"100%\"\n iconAdornment={props.ui.images.search}\n tabIndex={0}\n className=\"pm-insert-citation-panel-search-textbox pm-block-border-color\"\n placeholder={props.ui.context.translateText('Search for citation')}\n onKeyDown={handleTextKeyDown}\n onChange={searchChanged}\n onFocus={searchBoxFocused}\n value={props.searchTerm}\n ref={searchBoxRef}\n />\n </div>\n <CitationSourceList\n height={props.height - kTextBoxHeight}\n citations={props.citations}\n citationsToAdd={props.citationsToAdd}\n onConfirm={props.onConfirm}\n onAddCitation={addCitation}\n onRemoveCitation={props.onRemoveCitation}\n selectedIndex={props.selectedIndex}\n onSelectedIndexChanged={props.onSelectedIndexChanged}\n focusPrevious={focusSearch}\n status={props.status}\n statusMessage={props.statusMessage}\n itemHeight={64}\n itemProvider={CitationSourcePanelListItem}\n ui={props.ui}\n ref={listContainer}\n />\n </div>\n );\n});\n","/*\n * insert_citation-source-panel-list.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport React from 'react';\n\nimport { FixedSizeList, ListChildComponentProps } from 'react-window';\n\nimport { EditorUI } from '../../../api/ui';\nimport { WidgetProps } from '../../../api/widgets/react';\n\nimport { CitationListEntry, CitationSourceListStatus } from './insert_citation-source-panel';\n\nimport './insert_citation-source-panel-list.css';\n\nexport interface CitationSourcePanelListItemData {\n citations: CitationListEntry[];\n citationsToAdd: CitationListEntry[];\n selectedIndex: number;\n onSelectedIndexChanged: (index: number) => void;\n onAddCitation: (source: CitationListEntry) => void;\n onRemoveCitation: (source: CitationListEntry) => void;\n onConfirm: () => void;\n ui: EditorUI;\n showSeparator?: boolean;\n showSelection?: boolean;\n preventFocus?: boolean;\n}\n\nexport interface CitationSourceListProps extends WidgetProps {\n height: number;\n citations: CitationListEntry[];\n citationsToAdd: CitationListEntry[];\n selectedIndex: number;\n onSelectedIndexChanged: (index: number) => void;\n onAddCitation: (citation: CitationListEntry) => void;\n onRemoveCitation: (citation: CitationListEntry) => void;\n onConfirm: VoidFunction;\n focusPrevious?: () => void;\n\n itemProvider: (props: ListChildComponentProps) => JSX.Element;\n itemHeight: number;\n\n status: CitationSourceListStatus;\n statusMessage: string;\n ui: EditorUI;\n}\n\nexport const CitationSourceList = React.forwardRef<HTMLDivElement, CitationSourceListProps>(\n (props: CitationSourceListProps, ref) => {\n const fixedList = React.useRef<FixedSizeList>(null);\n\n // Item height and consequently page height\n const itemsPerPage = Math.floor(props.height / props.itemHeight);\n\n // Update selected item index (this will manage bounds)\n const handleIncrementIndex = (event: React.KeyboardEvent, increment: number, index: number) => {\n event.stopPropagation();\n event.preventDefault();\n if (props.citations && index > -1) {\n const maxIndex = props.citations.length - 1;\n const newIndex = Math.min(Math.max(0, index + increment), maxIndex);\n props.onSelectedIndexChanged(newIndex);\n }\n };\n\n // Toggle the currently selected item as added or removed\n const handleAddItem = (event: React.KeyboardEvent) => {\n event.stopPropagation();\n event.preventDefault();\n const currentCitation = props.selectedIndex > -1 ? props.citations[props.selectedIndex] : undefined;\n if (currentCitation) {\n props.onAddCitation(currentCitation);\n }\n };\n\n const handleListKeyDown = (event: React.KeyboardEvent) => {\n const currentIndex = props.selectedIndex;\n switch (event.key) {\n case 'ArrowUp':\n if (currentIndex === 0 && props.focusPrevious) {\n props.focusPrevious();\n } else {\n handleIncrementIndex(event, -1, currentIndex);\n }\n break;\n\n case 'ArrowDown':\n handleIncrementIndex(event, 1, currentIndex);\n break;\n\n case 'PageDown':\n handleIncrementIndex(event, itemsPerPage, currentIndex);\n break;\n\n case 'PageUp':\n handleIncrementIndex(event, -itemsPerPage, currentIndex);\n break;\n\n case 'Enter':\n handleAddItem(event);\n props.onConfirm();\n break;\n case ' ':\n handleAddItem(event);\n break;\n }\n };\n\n // Ensure the item is scrolled into view\n React.useEffect(() => {\n if (props.selectedIndex > -1) {\n fixedList.current?.scrollToItem(props.selectedIndex);\n }\n });\n\n // Focus / Blur are used to track whether to show selection highlighting\n const onFocus = (event: React.FocusEvent<HTMLDivElement>) => {\n if (props.selectedIndex < 0) {\n props.onSelectedIndexChanged(0);\n }\n event.stopPropagation();\n event.preventDefault();\n };\n\n const onBlur = (event: React.FocusEvent<HTMLDivElement>) => {\n event.stopPropagation();\n event.preventDefault();\n };\n\n const classes = ['pm-insert-citation-source-panel-list-container'].concat(props.classes || []).join(' ');\n switch (props.status) {\n case CitationSourceListStatus.default:\n if (props.citations.length > 0) {\n return (\n <div\n tabIndex={0}\n onKeyDown={handleListKeyDown}\n onFocus={onFocus}\n onBlur={onBlur}\n ref={ref}\n className={classes}\n >\n <FixedSizeList\n className=\"pm-insert-citation-source-panel-list\"\n height={props.height}\n width=\"100%\"\n itemCount={props.citations.length}\n itemSize={props.itemHeight}\n itemData={{\n selectedIndex: props.selectedIndex,\n onSelectedIndexChanged: props.onSelectedIndexChanged,\n citations: props.citations,\n citationsToAdd: props.citationsToAdd,\n onAddCitation: props.onAddCitation,\n onRemoveCitation: props.onRemoveCitation,\n onConfirm: props.onConfirm,\n showSeparator: true,\n showSelection: true,\n preventFocus: true,\n ui: props.ui,\n }}\n ref={fixedList}\n >\n {props.itemProvider}\n </FixedSizeList>\n </div>\n );\n } else {\n return (\n <div className={classes} style={{ height: props.height + 'px' }} ref={ref}>\n <div className=\"pm-insert-citation-source-panel-list-noresults-text\">{props.statusMessage}</div>\n </div>\n );\n }\n\n case CitationSourceListStatus.inProgress:\n return (\n <div className={classes} style={{ height: props.height + 'px' }} ref={ref}>\n <div className=\"pm-insert-citation-source-panel-list-noresults-text\">\n <img src={props.ui.images.search_progress} className=\"pm-insert-citation-source-panel-list-progress\" \n draggable=\"false\"/>\n {props.statusMessage}\n </div>\n </div>\n );\n\n case CitationSourceListStatus.noResults:\n return (\n <div className={classes} style={{ height: props.height + 'px' }} ref={ref}>\n <div className=\"pm-insert-citation-source-panel-list-noresults-text\">{props.statusMessage}</div>\n </div>\n );\n\n case CitationSourceListStatus.error:\n return (\n <div className={classes} style={{ height: props.height + 'px' }} ref={ref}>\n <div className=\"pm-insert-citation-source-panel-list-noresults-text\">\n {props.statusMessage || props.ui.context.translateText('An error occurred.')}\n </div>\n </div>\n );\n\n case CitationSourceListStatus.default:\n default:\n if (props.citations.length > 0) {\n return (\n <div\n tabIndex={0}\n onKeyDown={handleListKeyDown}\n onFocus={onFocus}\n onBlur={onBlur}\n ref={ref}\n className={classes}\n >\n <FixedSizeList\n className=\"pm-insert-citation-source-panel-list\"\n height={props.height}\n width=\"100%\"\n itemCount={props.citations.length}\n itemSize={props.itemHeight}\n itemData={{\n selectedIndex: props.selectedIndex,\n onSelectedIndexChanged: props.onSelectedIndexChanged,\n citations: props.citations,\n citationsToAdd: props.citationsToAdd,\n onAddCitation: props.onAddCitation,\n onRemoveCitation: props.onRemoveCitation,\n onConfirm: props.onConfirm,\n showSeparator: true,\n showSelection: true,\n preventFocus: true,\n ui: props.ui,\n }}\n ref={fixedList}\n >\n {props.itemProvider}\n </FixedSizeList>\n </div>\n );\n } else {\n return (\n <div className={classes} style={{ height: props.height + 'px' }} ref={ref}>\n <div className=\"pm-insert-citation-source-panel-list-noresults-text\">{props.statusMessage}</div>\n </div>\n );\n }\n }\n },\n);\n","/*\n * insert_citation-source-panel-list-item.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\nimport { ListChildComponentProps } from 'react-window';\n\nimport { OutlineButton } from '../../../api/widgets/button';\n\nimport { CitationSourcePanelListItemData } from './insert_citation-source-panel-list';\n\nimport './insert_citation-source-panel-list-item.css';\n\nexport const CitationSourcePanelListItem = (props: ListChildComponentProps) => {\n const citationListData: CitationSourcePanelListItemData = props.data;\n\n const citationEntry = citationListData.citations[props.index];\n\n // NOTE: Could consider making this length dynamic to account for item width\n const maxIdLength = 30;\n const id =\n citationEntry.id.length > maxIdLength ? `@${citationEntry.id.substr(0, maxIdLength - 1)}…` : `@${citationEntry.id}`;\n const authorWidth = Math.max(10, 50 - id.length);\n\n // Wheher this item is selected\n const selected = citationListData.showSelection && props.index === citationListData.selectedIndex;\n\n // Whether this item is already in the list of items to add\n // If the item is selected, it is always a candidate to be added explicitly to the list\n const alreadyAdded = citationListData.citationsToAdd.map(src => src.id).includes(citationEntry.id) && !selected;\n\n const onButtonClick = (event: React.MouseEvent) => {\n event.stopPropagation();\n event.preventDefault();\n\n if (alreadyAdded) {\n citationListData.onRemoveCitation(citationEntry);\n } else {\n citationListData.onAddCitation(citationEntry);\n }\n };\n\n const onItemClick = (e: React.MouseEvent) => {\n if (e.shiftKey) {\n citationListData.onAddCitation(citationEntry);\n } else {\n citationListData.onSelectedIndexChanged(props.index);\n }\n };\n\n const onDoubleClick = () => {\n citationListData.onAddCitation(citationEntry);\n citationListData.onConfirm();\n };\n\n let authors = \"\";\n try {\n authors = citationEntry.authors(authorWidth);\n } catch (er) {\n // Failed to format the authors, just ignore this.\n }\n\n return (\n <div\n onMouseDown={onItemClick}\n onDoubleClick={onDoubleClick}\n className=\"pm-insert-citation-source-panel-item\"\n style={props.style}\n >\n <div className={`pm-insert-citation-source-panel-item-border ${selected ? 'pm-list-item-selected' : ''}`}>\n <div className=\"pm-insert-citation-source-panel-item-container\">\n <div className=\"pm-insert-citation-source-panel-item-type\">\n {citationEntry.imageAdornment ? (\n <img\n className=\"pm-insert-citation-source-panel-item-adorn pm-block-border-color pm-background-color\"\n src={citationEntry.imageAdornment}\n draggable=\"false\"\n />\n ) : (\n undefined\n )}\n <img\n className=\"pm-insert-citation-source-panel-item-icon pm-block-border-color\"\n src={citationEntry.image}\n draggable=\"false\"\n />\n </div>\n <div className=\"pm-insert-citation-source-panel-item-summary\">\n <div className=\"pm-insert-citation-source-panel-item-id\">\n <div className=\"pm-insert-citation-source-panel-item-title pm-fixedwidth-font pm-text-color\">{id}</div>\n <div className=\"pm-insert-citation-source-panel-item-detail pm-text-color\">\n {authors} {citationEntry.date}\n </div>\n </div>\n <div className=\"pm-insert-citation-source-panel-item-subtitle-text pm-text-color\">\n {citationEntry.title}\n </div>\n </div>\n <div className=\"pm-insert-citation-source-panel-item-button\">\n <OutlineButton\n tabIndex={citationListData.preventFocus ? -1 : 0}\n style={{ width: '24px', height: '24px' }}\n title={alreadyAdded ? '-' : '+'}\n onClick={onButtonClick}\n />\n </div>\n </div>\n </div>\n </div>\n );\n};\n","/*\n * insert_citation-panel-doi.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport React from 'react';\n\nimport { EditorUI } from '../../../api/ui';\n\nimport { suggestCiteId, formatAuthors, formatIssuedDate } from '../../../api/cite';\nimport { CSL, imageForType } from '../../../api/csl';\nimport { DOIServer } from '../../../api/doi';\nimport { logException } from '../../../api/log';\nimport { NavigationTreeNode } from '../../../api/widgets/navigation-tree';\n\nimport {\n CitationSourcePanelProps,\n CitationSourcePanelProvider,\n CitationListEntry,\n CitationSourceListStatus,\n errorForStatus,\n matchExistingSourceCitationListEntry,\n} from './insert_citation-source-panel';\nimport { CitationSourceLatentSearchPanel } from './insert_citation-source-panel-latent-search';\n\nimport './insert_citation-source-panel-doi.css';\nimport { BibliographyManager } from '../../../api/bibliography/bibliography';\n\nconst kDOIType = 'DOI Search';\n\nexport function doiSourcePanel(\n ui: EditorUI,\n server: DOIServer,\n bibliographyManager: BibliographyManager\n): CitationSourcePanelProvider {\n return {\n key: '76561E2A-8FB7-4D4B-B235-9DD8B8270EA1',\n panel: DOISourcePanel,\n treeNode: () => {\n return {\n key: 'DOI',\n name: ui.context.translateText('From DOI'),\n image: ui.images.citations?.doi,\n type: kDOIType,\n children: [],\n expanded: true,\n };\n },\n progressMessage: ui.context.translateText('Looking up DOI....'),\n placeHolderMessage: ui.context.translateText('Paste or enter a DOI to find citation data.'),\n search: async (searchTerm: string, _selectedNode: NavigationTreeNode, existingCitationIds: string[]) => {\n try {\n const result = await server.fetchCSL(searchTerm, 1000);\n if (result.status === 'ok') {\n\n // Form the entry\n const doi = searchTerm;\n const csl = result.message;\n const citation = matchExistingSourceCitationListEntry(doi, existingCitationIds, ui, bibliographyManager) || toCitationListEntry(csl, existingCitationIds, ui);\n\n return Promise.resolve({\n citations: citation ? [citation] : [],\n status: CitationSourceListStatus.default,\n statusMessage: '',\n });\n } else if (result.status === 'notfound') {\n return Promise.resolve({\n citations: [],\n status: CitationSourceListStatus.noResults,\n statusMessage: ui.context.translateText('No data for this DOI could be found.'),\n });\n } else {\n return Promise.resolve({\n citations: [],\n status: CitationSourceListStatus.error,\n statusMessage: errorForStatus(ui, result.status, 'for this DOI'),\n });\n }\n } catch (e) {\n logException(e);\n return Promise.resolve({\n citations: [],\n status: CitationSourceListStatus.error,\n statusMessage: ui.context.translateText('An unknown error occurred. Please try again.'),\n });\n }\n },\n };\n}\n\nexport const DOISourcePanel = React.forwardRef<HTMLDivElement, CitationSourcePanelProps>(\n (props: CitationSourcePanelProps, ref) => {\n // Track whether we are mounted to allow a latent search that returns after the\n // component unmounts to nmot mutate state further\n return (\n <CitationSourceLatentSearchPanel\n height={props.height}\n citations={props.citations}\n citationsToAdd={props.citationsToAdd}\n searchTerm={props.searchTerm}\n onSearchTermChanged={props.onSearchTermChanged}\n executeSearch={props.onExecuteSearch}\n onAddCitation={props.onAddCitation}\n onRemoveCitation={props.onRemoveCitation}\n selectedIndex={props.selectedIndex}\n onSelectedIndexChanged={props.onSelectedIndexChanged}\n onConfirm={props.onConfirm}\n searchPlaceholderText={props.ui.context.translateText('Paste a DOI to search')}\n status={props.status}\n statusMessage={props.statusMessage}\n ui={props.ui}\n ref={ref}\n />\n );\n },\n);\n\nfunction toCitationListEntry(\n csl: CSL | undefined,\n existingCitationIds: string[],\n ui: EditorUI,\n): CitationListEntry | undefined {\n if (csl) {\n const suggestedId = suggestCiteId(existingCitationIds, csl);\n const providerKey = 'doi';\n return {\n id: suggestedId,\n isIdEditable: true,\n type: csl.type,\n title: csl.title || csl['short-title'] || csl['original-title'] || '',\n date: formatIssuedDate(csl.issued),\n journal: csl['container-title'] || csl['short-container-title'] || csl.publisher,\n doi: csl.DOI,\n image: imageForType(ui.images, csl.type)[0],\n authors: (length: number) => {\n return formatAuthors(csl.author, length);\n },\n toBibliographySource: (finalId: string) => {\n return Promise.resolve({ ...csl, id: finalId, providerKey });\n },\n isSlowGeneratingBibliographySource: false,\n };\n }\n return undefined;\n}\n","/*\n * insert_citation-source-panel-search-latent.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport React from 'react';\n\nimport { EditorUI } from '../../../api/ui';\nimport { TextInput } from '../../../api/widgets/text';\nimport { WidgetProps } from '../../../api/widgets/react';\n\nimport { CitationSourceList } from './insert_citation-source-panel-list';\nimport { TextButton } from '../../../api/widgets/button';\nimport { CitationListEntry, CitationSourceListStatus } from './insert_citation-source-panel';\n\nimport './insert_citation-source-panel-latent-search.css';\nimport { CitationSourcePanelListItemDetailed } from './insert_citation-source-panel-list-item-detailed';\n\nexport interface CitationSourceLatentSearchPanelProps extends WidgetProps {\n height: number;\n citations: CitationListEntry[];\n citationsToAdd: CitationListEntry[];\n searchTerm: string;\n onSearchTermChanged: (searchTerm: string) => void;\n executeSearch: (searchTerm: string) => void;\n selectedIndex: number;\n onSelectedIndexChanged: (index: number) => void;\n onAddCitation: (citation: CitationListEntry) => void;\n onRemoveCitation: (citation: CitationListEntry) => void;\n onConfirm: VoidFunction;\n ui: EditorUI;\n searchPlaceholderText?: string;\n status: CitationSourceListStatus;\n statusMessage: string;\n}\n\nconst kSearchBoxHeightWithMargin = 38;\n\nexport const CitationSourceLatentSearchPanel = React.forwardRef<HTMLDivElement, CitationSourceLatentSearchPanelProps>(\n (props, ref) => {\n const listContainer = React.useRef<HTMLDivElement>(null);\n const pasted = React.useRef<boolean>(false);\n const lastSearch = React.useRef<string>('');\n\n const performSearch = (searchTerm: string) => {\n props.executeSearch(searchTerm);\n lastSearch.current = searchTerm;\n pasted.current = false;\n };\n\n // Search the user search terms\n const searchChanged = (e: React.ChangeEvent<HTMLInputElement>) => {\n const search = e.target.value;\n if (pasted.current) {\n performSearch(search);\n } else {\n props.onSearchTermChanged(search);\n }\n };\n\n // If the user arrows down in the search text box, advance to the list of items\n const handleTextKeyDown = (event: React.KeyboardEvent) => {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n event.stopPropagation();\n listContainer.current?.focus();\n break;\n case 'Enter':\n if (lastSearch.current !== props.searchTerm || props.selectedIndex < 0) {\n event.preventDefault();\n event.stopPropagation();\n performSearch(props.searchTerm);\n }\n break;\n }\n };\n\n const handleButtonClick = () => {\n performSearch(props.searchTerm);\n };\n\n const onPaste = (e: React.ClipboardEvent<HTMLInputElement>) => {\n pasted.current = true;\n };\n\n // Used to focus the search box\n const searchBoxRef = React.useRef<HTMLInputElement>(null);\n\n const focusSearch = () => {\n searchBoxRef.current?.focus();\n };\n\n // Allow the search box to gain focus the first time the enclosing\n // container div receives focus.\n const initialFocusSet = React.useRef<boolean>(false);\n const parentFocused = () => {\n if (!initialFocusSet.current) {\n focusSearch();\n initialFocusSet.current = true;\n }\n };\n\n const onAddCitation = (citation: CitationListEntry) => {\n props.onAddCitation(citation);\n focusSearch();\n };\n\n return (\n <div\n style={props.style}\n className=\"pm-insert-citation-panel-latent-search\"\n ref={ref}\n tabIndex={-1}\n onFocus={parentFocused}\n >\n <div className=\"pm-insert-citation-panel-latent-search-textbox-container\">\n <TextInput\n value={props.searchTerm}\n width=\"100%\"\n iconAdornment={props.ui.images.search}\n tabIndex={0}\n className=\"pm-insert-citation-panel-latent-search-textbox pm-block-border-color\"\n placeholder={props.searchPlaceholderText}\n onKeyDown={handleTextKeyDown}\n onChange={searchChanged}\n onPaste={onPaste}\n ref={searchBoxRef}\n />\n\n <TextButton\n title={props.ui.context.translateText('Search')}\n classes={['pm-insert-citation-panel-latent-search-button']}\n onClick={handleButtonClick}\n disabled={props.status === CitationSourceListStatus.inProgress}\n />\n </div>\n\n <div className=\"pm-insert-citation-panel-latent-search-list-container\">\n <CitationSourceList\n height={props.height - kSearchBoxHeightWithMargin}\n citations={props.citations}\n citationsToAdd={props.citationsToAdd}\n onAddCitation={onAddCitation}\n onRemoveCitation={props.onRemoveCitation}\n selectedIndex={props.selectedIndex}\n onSelectedIndexChanged={props.onSelectedIndexChanged}\n focusPrevious={focusSearch}\n onConfirm={props.onConfirm}\n ui={props.ui}\n itemHeight={100}\n itemProvider={CitationSourcePanelListItemDetailed}\n status={props.status}\n statusMessage={props.statusMessage}\n classes={['pm-insert-citation-panel-latent-search-list', 'pm-block-border-color', 'pm-background-color']}\n ref={listContainer}\n />\n </div>\n </div>\n );\n },\n);\n","/*\n * insert_citation-source-panel-list-item.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\nimport { ListChildComponentProps } from 'react-window';\n\nimport { OutlineButton } from '../../../api/widgets/button';\n\nimport { CitationSourcePanelListItemData } from './insert_citation-source-panel-list';\n\nimport './insert_citation-source-panel-list-item-detailed.css';\n\nexport const CitationSourcePanelListItemDetailed = (props: ListChildComponentProps) => {\n const citationListData: CitationSourcePanelListItemData = props.data;\n\n const citationEntry = citationListData.citations[props.index];\n\n // Wheher this item is selected\n const selected = citationListData.showSelection && props.index === citationListData.selectedIndex;\n\n // Whether this item is already in the list of items to add\n // If the item is selected, it is always a candidate to be added explicitly to the list\n const alreadyAdded = citationListData.citationsToAdd.map(src => src.id).includes(citationEntry.id) && !selected;\n\n const onButtonClick = (event: React.MouseEvent) => {\n event.stopPropagation();\n event.preventDefault();\n\n if (alreadyAdded) {\n citationListData.onRemoveCitation(citationEntry);\n } else {\n citationListData.onAddCitation(citationEntry);\n }\n };\n\n const onItemClick = () => {\n citationListData.onSelectedIndexChanged(props.index);\n };\n\n const onDoubleClick = () => {\n citationListData.onAddCitation(citationEntry);\n citationListData.onConfirm();\n };\n\n const secondLine = [citationEntry.date, citationEntry.journal].filter(text => text).join(', ');\n const thirdLine = citationEntry.authors(80);\n\n return (\n <div\n onMouseDown={onItemClick}\n onDoubleClick={onDoubleClick}\n className=\"pm-insert-citation-source-panel-item-detailed\"\n style={props.style}\n >\n <div\n className={`pm-insert-citation-source-panel-item-detailed-border ${selected ? 'pm-list-item-selected' : ''}`}\n >\n <div className=\"pm-insert-citation-source-panel-item-detailed-container\">\n <div className=\"pm-insert-citation-source-panel-item-detailed-type\">\n {citationEntry.imageAdornment ? (\n <img\n className=\"pm-insert-citation-source-panel-item-detailed-adorn pm-block-border-color pm-background-color\"\n src={citationEntry.imageAdornment}\n draggable=\"false\"\n />\n ) : (\n undefined\n )}\n <img\n className=\"pm-insert-citation-source-panel-item-detailed-icon pm-block-border-color\"\n src={citationEntry.image}\n draggable=\"false\"\n />\n </div>\n <div className=\"pm-insert-citation-source-panel-item-detailed-summary\">\n <div className=\"pm-insert-citation-source-panel-item-detailed-title pm-fixedwidth-font pm-text-color\">\n {citationEntry.title}\n </div>\n <div className=\"pm-insert-citation-source-panel-item-detailed-subtitle-text pm-text-color\">\n {secondLine}\n </div>\n <div className=\"pm-insert-citation-source-panel-item-detailed-subtitle-text pm-text-color\">{thirdLine}</div>\n <div className=\"pm-insert-citation-source-panel-item-detailed-subtitle-text pm-text-color\">\n <a href={`https://doi.org/${citationEntry.doi}`} target=\"_new\">\n {citationEntry.doi}\n </a>\n </div>\n </div>\n <div className=\"pm-insert-citation-source-panel-item-detailed-button\">\n <OutlineButton\n tabIndex={citationListData.preventFocus ? -1 : 0}\n style={{ width: '24px', height: '24px' }}\n title={alreadyAdded ? '-' : '+'}\n onClick={onButtonClick}\n />\n </div>\n </div>\n </div>\n </div>\n );\n};\n","/*\n * insert_citation-source-panel-crossref.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\n\nimport { suggestCiteId, formatAuthors, formatIssuedDate } from '../../../api/cite';\nimport { CrossrefWork, imageForCrossrefType, CrossrefServer, prettyType } from '../../../api/crossref';\nimport { sanitizeForCiteproc, CSL } from '../../../api/csl';\nimport { DOIServer } from '../../../api/doi';\nimport { logException } from '../../../api/log';\nimport { NavigationTreeNode } from '../../../api/widgets/navigation-tree';\n\nimport { EditorUI } from '../../../api/ui';\n\nimport {\n CitationSourcePanelProps,\n CitationSourcePanelProvider,\n CitationListEntry,\n CitationSourceListStatus,\n matchExistingSourceCitationListEntry,\n} from './insert_citation-source-panel';\nimport { CitationSourceLatentSearchPanel } from './insert_citation-source-panel-latent-search';\nimport { BibliographyManager } from '../../../api/bibliography/bibliography';\n\nexport function crossrefSourcePanel(\n ui: EditorUI,\n server: CrossrefServer,\n doiServer: DOIServer,\n bibliographyManager: BibliographyManager\n): CitationSourcePanelProvider {\n const kCrossrefType = 'Crossref';\n return {\n key: 'E38370AA-78AE-450B-BBE8-878E1C817C04',\n panel: CrossRefSourcePanel,\n treeNode: () => {\n return {\n key: 'CrossRef',\n name: ui.context.translateText('Crossref'),\n image: ui.images.citations?.crossref,\n type: kCrossrefType,\n children: [],\n expanded: true,\n };\n },\n progressMessage: ui.context.translateText('Searching Crossref....'),\n placeHolderMessage: ui.context.translateText('Enter search terms to search Crossref'),\n search: async (searchTerm: string, _selectedNode: NavigationTreeNode, existingCitationIds: string[]) => {\n try {\n const works = await server.works(searchTerm);\n const existingSources = bibliographyManager.localSources();\n\n const dedupeCitationIds = existingCitationIds;\n const citationEntries = works.items.map(work => {\n const citationEntry = matchExistingSourceCitationListEntry(work.DOI, dedupeCitationIds, ui, bibliographyManager) || toCitationListEntry(work, dedupeCitationIds, ui, doiServer);\n if (citationEntry) {\n // Add this id to the list of existing Ids so future ids will de-duplicate against this one\n dedupeCitationIds.push(citationEntry.id);\n }\n return citationEntry;\n });\n\n return Promise.resolve({\n citations: citationEntries,\n status: citationEntries.length > 0 ? CitationSourceListStatus.default : CitationSourceListStatus.noResults,\n statusMessage:\n citationEntries.length > 0 ? '' : ui.context.translateText('No results matching these search terms.'),\n });\n } catch (e) {\n logException(e);\n return Promise.resolve({\n citations: [],\n status: CitationSourceListStatus.error,\n statusMessage: ui.context.translateText('An unknown error occurred. Please try again.'),\n });\n }\n },\n };\n}\n\nexport const CrossRefSourcePanel = React.forwardRef<HTMLDivElement, CitationSourcePanelProps>(\n (props: CitationSourcePanelProps, ref) => {\n return (\n <CitationSourceLatentSearchPanel\n height={props.height}\n citations={props.citations}\n citationsToAdd={props.citationsToAdd}\n searchTerm={props.searchTerm}\n onSearchTermChanged={props.onSearchTermChanged}\n executeSearch={props.onExecuteSearch}\n onAddCitation={props.onAddCitation}\n onRemoveCitation={props.onRemoveCitation}\n selectedIndex={props.selectedIndex}\n onSelectedIndexChanged={props.onSelectedIndexChanged}\n onConfirm={props.onConfirm}\n searchPlaceholderText={props.ui.context.translateText('Search Crossref for Citations')}\n status={props.status}\n statusMessage={props.statusMessage}\n ui={props.ui}\n ref={ref}\n />\n );\n },\n);\n\nfunction toCitationListEntry(\n crossrefWork: CrossrefWork,\n existingIds: string[],\n ui: EditorUI,\n doiServer: DOIServer,\n): CitationListEntry {\n const coercedCSL = sanitizeForCiteproc((crossrefWork as unknown) as CSL);\n const id = suggestCiteId(existingIds, coercedCSL);\n const providerKey = 'crossref';\n return {\n id,\n isIdEditable: true,\n title: crossrefWorkTitle(crossrefWork, ui),\n type: prettyType(ui, crossrefWork.type),\n date: formatIssuedDate(crossrefWork.issued),\n journal: crossrefWork['container-title'] || crossrefWork['short-container-title'] || crossrefWork.publisher,\n image: imageForCrossrefType(ui, crossrefWork.type)[0],\n doi: crossrefWork.DOI,\n authors: (length: number) => {\n return formatAuthors(coercedCSL.author, length);\n },\n toBibliographySource: async (finalId: string) => {\n // Generate CSL using the DOI\n const doiResult = await doiServer.fetchCSL(crossrefWork.DOI, -1);\n\n const csl = doiResult.message as CSL;\n return { ...csl, id: finalId, providerKey };\n },\n isSlowGeneratingBibliographySource: true,\n };\n}\n\nfunction crossrefWorkTitle(work: CrossrefWork, ui: EditorUI) {\n if (work.title) {\n return work.title[0];\n } else {\n return ui.context.translateText('(Untitled)');\n }\n}\n","/*\n * insert_citation-source-panel-pubmed.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport React from 'react';\n\nimport { BibliographyManager } from '../../../api/bibliography/bibliography';\nimport { createUniqueCiteId } from '../../../api/cite';\nimport { CSL, sanitizeForCiteproc } from '../../../api/csl';\nimport { DOIServer } from '../../../api/doi';\nimport { logException } from '../../../api/log';\nimport { NavigationTreeNode } from '../../../api/widgets/navigation-tree';\nimport { PubMedServer, PubMedDocument, suggestCiteId, imageForType } from '../../../api/pubmed';\nimport { EditorUI } from '../../../api/ui';\n\nimport {\n CitationSourcePanelProps,\n CitationSourcePanelProvider,\n CitationListEntry,\n CitationSourceListStatus,\n errorForStatus,\n matchExistingSourceCitationListEntry,\n} from './insert_citation-source-panel';\nimport { CitationSourceLatentSearchPanel } from './insert_citation-source-panel-latent-search';\n\nexport function pubmedSourcePanel(\n ui: EditorUI,\n server: PubMedServer,\n doiServer: DOIServer,\n bibliographyManager: BibliographyManager\n): CitationSourcePanelProvider {\n const kPubmedType = 'Pubmed';\n return {\n key: 'EF556233-05B0-4678-8216-38061908463F',\n panel: PubmedSourcePanel,\n treeNode: () => {\n return {\n key: 'PubMed',\n name: ui.context.translateText('PubMed'),\n image: ui.images.citations?.pubmed,\n type: kPubmedType,\n children: [],\n expanded: true,\n };\n },\n progressMessage: ui.context.translateText('Searching PubMed....'),\n placeHolderMessage: ui.context.translateText('Enter a PubMed query to search for citations.'),\n search: async (searchTerm: string, _selectedNode: NavigationTreeNode, existingCitationIds: string[]) => {\n try {\n const noResultsMessage = ui.context.translateText('No results matching these search terms.');\n\n // Do the PubMed Search\n const pubMedResult = await server.search(searchTerm);\n switch (pubMedResult.status) {\n case 'ok':\n if (pubMedResult.message !== null) {\n // There is a message\n // PubMed Results and Existing Ids\n const docs: PubMedDocument[] = pubMedResult.message;\n const dedupeCitationIds = existingCitationIds;\n\n // Create Citation List Entries for these PubMed docs\n const citationEntries = docs.map(doc => {\n const citationEntry = matchExistingSourceCitationListEntry(doc.doi, dedupeCitationIds, ui, bibliographyManager) || toCitationListEntry(doc, dedupeCitationIds, ui, doiServer);\n if (citationEntry && citationEntry.id) {\n // Add this id to the list of existing Ids so future ids will de-duplicate against this one\n dedupeCitationIds.push(citationEntry.id);\n }\n return citationEntry;\n });\n\n // Return the search result\n return Promise.resolve({\n citations: citationEntries,\n status:\n citationEntries.length > 0 ? CitationSourceListStatus.default : CitationSourceListStatus.noResults,\n statusMessage: citationEntries.length > 0 ? '' : noResultsMessage,\n });\n } else {\n // No message, no results\n return Promise.resolve({\n citations: [],\n status: CitationSourceListStatus.noResults,\n statusMessage: noResultsMessage,\n });\n }\n\n default:\n // Resolve with Error\n return Promise.resolve({\n citations: [],\n status: CitationSourceListStatus.error,\n statusMessage: ui.context.translateText(errorForStatus(ui, pubMedResult.status, 'PubMed')),\n });\n }\n } catch (e) {\n logException(e);\n return Promise.resolve({\n citations: [],\n status: CitationSourceListStatus.error,\n statusMessage: ui.context.translateText('An unknown error occurred. Please try again.'),\n });\n }\n },\n };\n}\n\nexport const PubmedSourcePanel = React.forwardRef<HTMLDivElement, CitationSourcePanelProps>(\n (props: CitationSourcePanelProps, ref) => {\n return (\n <CitationSourceLatentSearchPanel\n height={props.height}\n citations={props.citations}\n citationsToAdd={props.citationsToAdd}\n searchTerm={props.searchTerm}\n onSearchTermChanged={props.onSearchTermChanged}\n executeSearch={props.onExecuteSearch}\n onAddCitation={props.onAddCitation}\n onRemoveCitation={props.onRemoveCitation}\n selectedIndex={props.selectedIndex}\n onSelectedIndexChanged={props.onSelectedIndexChanged}\n onConfirm={props.onConfirm}\n searchPlaceholderText={props.ui.context.translateText('Search PubMed for Citations')}\n status={props.status}\n statusMessage={props.statusMessage}\n ui={props.ui}\n ref={ref}\n />\n );\n },\n);\n\nfunction toCitationListEntry(\n doc: PubMedDocument,\n existingIds: string[],\n ui: EditorUI,\n doiServer: DOIServer,\n): CitationListEntry {\n const id = createUniqueCiteId(existingIds, suggestCiteId(doc));\n const providerKey = 'pubmed';\n return {\n id,\n isIdEditable: true,\n title: doc.title || '',\n doi: doc.doi,\n type: '',\n date: doc.pubDate || '',\n journal: doc.source,\n authors: (length: number) => {\n return formatAuthors(doc.authors || [], length);\n },\n image: imageForType(ui, doc.pubTypes)[0],\n toBibliographySource: async (finalId: string) => {\n // Generate CSL using the DOI\n const doiResult = await doiServer.fetchCSL(doc.doi, -1);\n const csl = doiResult.message as CSL;\n const sanitizedCSL = sanitizeForCiteproc(csl);\n return { ...sanitizedCSL, id: finalId, providerKey };\n },\n isSlowGeneratingBibliographySource: true,\n };\n}\n\nfunction formatAuthors(authors: string[], length: number) {\n return authors.join(',');\n}\n","/*\n * pubmed.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorUI } from './ui';\n\nexport interface PubMedResult {\n status: 'ok' | 'notfound' | 'nohost' | 'error';\n message: PubMedDocument[] | null;\n error: string;\n}\n\nexport interface PubMedDocument {\n doi: string;\n pubTypes?: string[];\n authors?: string[];\n sortFirstAuthor?: string;\n title?: string;\n source?: string;\n volume?: string;\n issue?: string;\n pubDate?: string;\n}\n\nexport interface PubMedServer {\n search: (query: string) => Promise<PubMedResult>;\n}\n\nexport function suggestCiteId(doc: PubMedDocument): string {\n // Try to get the last name. Prefer the sort first author,\n // but otherwise just use the first author (if any)\n let suggestedId = '';\n if (doc.sortFirstAuthor) {\n suggestedId = doc.sortFirstAuthor.split(' ')[0];\n } else if (doc.authors && doc.authors.length > 0) {\n suggestedId = doc.authors[0].split(' ')[0];\n }\n\n // Try to read the year\n if (doc.pubDate) {\n suggestedId = suggestedId + doc.pubDate.split(' ')[0];\n }\n return suggestedId;\n}\n\nexport function imageForType(ui: EditorUI, pubTypes?: string[]): [string?, string?] {\n const type = pubTypes && pubTypes.length > 0 ? pubTypes[0] : '';\n switch (type) {\n case 'Journal Article':\n case 'Historical Article':\n case 'Classical Article':\n case 'Introductory Journal Article':\n case 'paper-conference':\n return [ui.images.citations?.article, ui.images.citations?.article_dark];\n case 'Legal Case':\n case 'Legislation':\n return [ui.images.citations?.legal, ui.images.citations?.legal_dark];\n case 'Dataset':\n return [ui.images.citations?.data, ui.images.citations?.data_dark];\n case 'Video-Audio Media':\n return [ui.images.citations?.movie, ui.images.citations?.movie_dark];\n case 'Webcasts':\n return [ui.images.citations?.web, ui.images.citations?.web_dark];\n default:\n return [ui.images.citations?.other, ui.images.citations?.other_dark];\n }\n}\n","/*\n * insert_citation-source-panel-pubmed.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\n\nimport { createUniqueCiteId } from '../../../api/cite';\nimport { CSL, imageForType } from '../../../api/csl';\nimport { DataCiteServer, DataCiteRecord, suggestCiteId, DataCiteCreator } from '../../../api/datacite';\nimport { DOIServer } from '../../../api/doi';\nimport { NavigationTreeNode } from '../../../api/widgets/navigation-tree';\nimport { logException } from '../../../api/log';\nimport { EditorUI } from '../../../api/ui';\n\nimport {\n CitationSourcePanelProps,\n CitationSourcePanelProvider,\n CitationListEntry,\n CitationSourceListStatus,\n errorForStatus,\n matchExistingSourceCitationListEntry,\n} from './insert_citation-source-panel';\nimport { CitationSourceLatentSearchPanel } from './insert_citation-source-panel-latent-search';\nimport { BibliographyManager } from '../../../api/bibliography/bibliography';\n\nexport function dataciteSourcePanel(\n ui: EditorUI,\n server: DataCiteServer,\n doiServer: DOIServer,\n bibliographyManager: BibliographyManager\n): CitationSourcePanelProvider {\n const kDataCiteType = 'Datacite';\n return {\n key: '66A6EADB-22AE-4DDD-BCD5-70BC0DEB8FB3',\n panel: DataCiteSourcePanel,\n treeNode: () => {\n return {\n key: 'DataCite',\n name: ui.context.translateText('DataCite'),\n image: ui.images.citations?.datacite,\n type: kDataCiteType,\n children: [],\n expanded: true,\n };\n },\n progressMessage: ui.context.translateText('Searching DataCite....'),\n placeHolderMessage: ui.context.translateText('Enter search terms to search DataCite'),\n search: async (searchTerm: string, _selectedNode: NavigationTreeNode, existingCitationIds: string[]) => {\n try {\n const dataciteResult = await server.search(searchTerm);\n const noResultsMessage = ui.context.translateText('No results matching these search terms.');\n switch (dataciteResult.status) {\n case 'ok':\n if (dataciteResult.message !== null) {\n const records: DataCiteRecord[] = dataciteResult.message;\n const dedupeCitationIds = existingCitationIds;\n const citationEntries = records.map(record => {\n const citationEntry = matchExistingSourceCitationListEntry(record.doi, dedupeCitationIds, ui, bibliographyManager) || toCitationListEntry(record, dedupeCitationIds, ui, doiServer);\n if (citationEntry) {\n // Add this id to the list of existing Ids so future ids will de-duplicate against this one\n dedupeCitationIds.push(citationEntry.id);\n }\n return citationEntry;\n });\n return Promise.resolve({\n citations: citationEntries,\n status:\n citationEntries.length > 0 ? CitationSourceListStatus.default : CitationSourceListStatus.noResults,\n statusMessage: citationEntries.length > 0 ? '' : noResultsMessage,\n });\n } else {\n // No results\n return Promise.resolve({\n citations: [],\n status: CitationSourceListStatus.noResults,\n statusMessage: noResultsMessage,\n });\n }\n default:\n // Resolve with Error\n return Promise.resolve({\n citations: [],\n status: CitationSourceListStatus.error,\n statusMessage: ui.context.translateText(errorForStatus(ui, dataciteResult.status, 'DataCite')),\n });\n }\n } catch (e) {\n logException(e);\n return Promise.resolve({\n citations: [],\n status: CitationSourceListStatus.error,\n statusMessage: ui.context.translateText('An unknown error occurred. Please try again.'),\n });\n }\n },\n };\n}\n\nexport const DataCiteSourcePanel = React.forwardRef<HTMLDivElement, CitationSourcePanelProps>(\n (props: CitationSourcePanelProps, ref) => {\n return (\n <CitationSourceLatentSearchPanel\n height={props.height}\n citations={props.citations}\n citationsToAdd={props.citationsToAdd}\n searchTerm={props.searchTerm}\n onSearchTermChanged={props.onSearchTermChanged}\n executeSearch={props.onExecuteSearch}\n onAddCitation={props.onAddCitation}\n onRemoveCitation={props.onRemoveCitation}\n selectedIndex={props.selectedIndex}\n onSelectedIndexChanged={props.onSelectedIndexChanged}\n onConfirm={props.onConfirm}\n searchPlaceholderText={props.ui.context.translateText('Search DataCite for Citations')}\n status={props.status}\n statusMessage={props.statusMessage}\n ui={props.ui}\n ref={ref}\n />\n );\n },\n);\n\nfunction toCitationListEntry(\n record: DataCiteRecord,\n existingIds: string[],\n ui: EditorUI,\n doiServer: DOIServer,\n): CitationListEntry {\n const id = createUniqueCiteId(existingIds, suggestCiteId(record));\n const providerKey = 'datacite';\n return {\n id,\n isIdEditable: true,\n title: record.title || '',\n type: record.type || '',\n date: record.publicationYear?.toString() || '',\n journal: record.publisher,\n image: imageForType(ui.images, record.type || '')[0],\n doi: record.doi,\n authors: (length: number) => {\n return formatAuthors(record.creators || [], length);\n },\n toBibliographySource: async (finalId: string) => {\n // Generate CSL using the DOI\n const doiResult = await doiServer.fetchCSL(record.doi, -1);\n\n const csl = doiResult.message as CSL;\n return { ...csl, id: finalId, providerKey };\n },\n isSlowGeneratingBibliographySource: true,\n };\n}\n\nfunction formatAuthors(authors: DataCiteCreator[], length: number) {\n return authors.map(creator => creator.fullName).join(',');\n}\n","/*\n * datacite.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport interface DataCiteResult {\n status: 'ok' | 'notfound' | 'nohost' | 'error';\n message: DataCiteRecord[] | null;\n error: string;\n}\n\nexport interface DataCiteRecord {\n doi: string;\n title?: string;\n publisher?: string;\n publicationYear?: number;\n creators?: DataCiteCreator[];\n type?: string; // citeproc type\n}\n\nexport interface DataCiteCreator {\n fullName: string;\n familyName?: string;\n givenName?: string;\n}\n\nexport interface DataCiteServer {\n search: (query: string) => Promise<DataCiteResult>;\n}\n\nexport function suggestCiteId(record: DataCiteRecord): string {\n // Try to use the last name (or the first name)\n let suggestedId = '';\n if (record.creators && record.creators.length > 0) {\n suggestedId = record.creators[0].familyName || record.creators[0].fullName;\n }\n\n // Try to read the year\n if (record.publicationYear) {\n suggestedId = suggestedId + record.publicationYear;\n }\n return suggestedId;\n}\n","/*\n * insert_citation-picker-bibliography.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\n\nimport { EditorUI } from '../../api/ui';\nimport { changeExtension } from '../../api/path';\nimport { WidgetProps } from '../../api/widgets/react';\nimport { TextInput } from '../../api/widgets/text';\nimport { SelectInput } from '../../api/widgets/select';\nimport { BibliographyFile, BibliographyType } from '../../api/bibliography/bibliography';\n\nimport './insert_citation-bibliography-picker.css';\n\nexport interface CitationBiblographyPickerProps extends WidgetProps {\n bibliographyTypes: BibliographyType[];\n bibliographyFiles: BibliographyFile[];\n onBiblographyFileChanged: (file: BibliographyFile) => void;\n createBibliographyFileName: string;\n onCreateBibliographyFileNameChanged: (fileName: string) => void;\n ui: EditorUI;\n}\n\nexport const CitationBibliographyPicker: React.FC<CitationBiblographyPickerProps> = props => {\n // Selection of file from list\n const onChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n const index = e.target.selectedIndex;\n props.onBiblographyFileChanged(props.bibliographyFiles[index]);\n };\n\n // Change to the file we should create\n const onTextChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const text = e.target.value;\n props.onCreateBibliographyFileNameChanged(text);\n };\n\n // File type change\n const onTypeChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n const index = e.target.selectedIndex;\n const type = props.bibliographyTypes[index];\n const newPath = changeExtension(props.createBibliographyFileName, type.extension);\n props.onCreateBibliographyFileNameChanged(newPath);\n props.ui.prefs.setBibliographyDefaultType(type.extension);\n };\n\n return (\n <div className=\"pm-citation-bibliography-picker-container\" style={props.style}>\n <div className=\"pm-citation-bibliography-picker-label pm-text-color\">\n {props.bibliographyFiles.length > 0\n ? props.ui.context.translateText('Add to bibliography:')\n : props.ui.context.translateText('Create bibliography:')}\n </div>\n {props.bibliographyFiles.length > 0 ? (\n <SelectInput onChange={onChange}>\n {props.bibliographyFiles.map(file => (\n <option key={file.fullPath} value={file.fullPath}>\n {file.displayPath}\n </option>\n ))}\n </SelectInput>\n ) : (\n <div className=\"pm-citation-bibliography-picker-create-controls\">\n <TextInput\n width=\"100\"\n tabIndex={0}\n className=\"pm-citation-bibliography-picker-textbox pm-block-border-color\"\n placeholder={props.ui.context.translateText('Bibligraphy file name')}\n value={props.createBibliographyFileName}\n onChange={onTextChange}\n />\n <div className=\"pm-citation-bibliography-format-label pm-text-color\">\n {props.ui.context.translateText('Format:')}\n </div>\n <SelectInput\n onChange={onTypeChange}\n defaultValue={props.bibliographyTypes.find(bibType => bibType.default)?.extension}\n >\n {props.bibliographyTypes.map(bibType => (\n <option key={bibType.extension} value={bibType.extension}>\n {bibType.displayName}\n </option>\n ))}\n </SelectInput>\n </div>\n )}\n </div>\n );\n};\n","/*\n * insert_citation-panel-packages.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\n\nimport { EditorUI } from '../../../api/ui';\nimport { NavigationTreeNode } from '../../../api/widgets/navigation-tree';\nimport { imageForType, CSL, cslTypes, CSLDate } from '../../../api/csl';\nimport { EnvironmentServer, RPackageInfo, RPackageCitationPerson, RPackageCitation } from '../../../api/environment';\nimport { bibtextTypeToCSLType } from '../../../api/bibtex/types';\n\nimport {\n CitationSourcePanelProvider,\n CitationSourcePanelProps,\n CitationListEntry,\n CitationSourceListStatus,\n CitationSourcePanelSearchResult,\n} from './insert_citation-source-panel';\nimport { CitationSourceTypeheadSearchPanel } from './insert_citation-source-panel-typeahead-search';\n\nimport Fuse from 'fuse.js';\nimport uniqBy from 'lodash.uniqby';\nimport orderBy from 'lodash.orderby';\n\nconst kPackageType = 'Packages';\n\nexport function packageSourcePanel(\n ui: EditorUI,\n server: EnvironmentServer,\n): CitationSourcePanelProvider {\n\n // Fetch the packages and index when needed\n let pkgInfos: RPackageInfo[];\n let pkgIndex: PackageSearch;\n const getPackageIndex = async () => {\n if (pkgIndex === undefined) {\n\n // Read the package state\n const pkgState = await server.getRPackageState();\n\n // Sorting in this way ensures that the packages are in alpha order and that in.project.library packages appear first\n // uniqby will always select the first uniq entry, so this ensures that in.project.library packages are preferred\n // (in.project.library represents a package provided as a part of packrat or renv)\n const sorted = orderBy(pkgState.package_list, [pkg => pkg.name.toLowerCase(), 'in.project.library'], ['asc', 'desc']);\n\n // Create the list of info and index\n pkgInfos = uniqBy(sorted, pkg => pkg.name);\n pkgIndex = packageIndex(pkgInfos);\n }\n return {\n packageInfos: pkgInfos,\n index: pkgIndex\n };\n };\n\n return {\n key: '97863EFF-2075-43B2-8F0F-88A250CC33BE',\n panel: PackageSourcePanel,\n treeNode: () => {\n return {\n key: 'RPackages',\n name: ui.context.translateText('R Package'),\n image: ui.images.citations?.packages,\n type: kPackageType,\n children: [],\n expanded: true,\n };\n },\n typeAheadSearch: (searchTerm: string, _selectedNode: NavigationTreeNode, existingCitationIds: string[], onResults: (result: CitationSourcePanelSearchResult) => void) => {\n\n // Get the index, then search it\n getPackageIndex().then(({ packageInfos, index }) => {\n const matchingEntries = searchTerm ? index.search(searchTerm) : packageInfos;\n const citations = matchingEntries.map(pkg => {\n return toCitationListEntry(pkg, existingCitationIds, ui, server);\n });\n const status = citations.length > 0 ? CitationSourceListStatus.default : CitationSourceListStatus.noResults;\n const statusMessage = citations.length > 0 ? \"\" : ui.context.translateText('No matching packages');\n onResults({\n citations,\n status,\n statusMessage\n });\n });\n },\n };\n}\n\nexport const PackageSourcePanel = React.forwardRef<HTMLDivElement, CitationSourcePanelProps>(\n (props: CitationSourcePanelProps, ref) => {\n return (\n <>\n <CitationSourceTypeheadSearchPanel\n height={props.height}\n citations={props.citations}\n citationsToAdd={props.citationsToAdd}\n searchTerm={props.searchTerm}\n onSearchTermChanged={props.onSearchTermChanged}\n selectedIndex={props.selectedIndex}\n onSelectedIndexChanged={props.onSelectedIndexChanged}\n onAddCitation={props.onAddCitation}\n onRemoveCitation={props.onRemoveCitation}\n onConfirm={props.onConfirm}\n status={props.status}\n statusMessage={props.statusMessage}\n ui={props.ui}\n ref={ref}\n />\n </>\n );\n },\n);\n\nfunction toCitationListEntry(\n packageInfo: RPackageInfo,\n existingCitationIds: string[],\n ui: EditorUI,\n server: EnvironmentServer\n): CitationListEntry {\n return {\n id: suggestPackageCiteId(packageInfo.name, existingCitationIds),\n isIdEditable: true,\n type: cslTypes.entry,\n title: packageInfo.desc || \"\",\n date: packageInfo.version || \"\",\n journal: \"\",\n doi: \"\",\n image: imageForType(ui.images, cslTypes.book)[0],\n authors: (_length: number) => {\n return packageInfo.name || \"\";\n },\n toBibliographySource: async (finalId: string) => {\n const csl = await packageToCSL(packageInfo, server);\n if (csl) {\n return { ...csl, id: finalId, providerKey: kPackageType };\n } else {\n // This should never happen\n return { type: cslTypes.book, id: finalId, providerKey: kPackageType };\n }\n },\n isSlowGeneratingBibliographySource: false,\n };\n}\n\nasync function packageToCSL(packageInfo: RPackageInfo, server: EnvironmentServer) {\n const citeInfos = await server.getRPackageCitations(packageInfo.name);\n if (citeInfos && citeInfos.length) {\n // RPackages can return multiple possible citations (e.g. the package, the paper in which it appeared,\n // a book documenting it), but the first one is by convention the package itself\n const citeInfo = citeInfos[0];\n return packageCitationToCSL(citeInfo);\n }\n}\n\n\nfunction packageCitationToCSL(citeInfo: RPackageCitation) {\n const toCSLNames = (people?: RPackageCitationPerson[]) => {\n if (people) {\n return people.map(person => {\n return {\n family: person.family,\n given: person.given.join(' ')\n };\n });\n } else {\n return undefined;\n }\n };\n\n const toCSLDate = (year?: string): CSLDate | undefined => {\n if (year) {\n\n return {\n 'date-parts': [[Number.parseInt(year, 10)]]\n };\n } else {\n return undefined;\n }\n };\n\n const csl: CSL = {\n type: bibtextTypeToCSLType(citeInfo.type),\n title: citeInfo.title,\n };\n\n if (citeInfo.doi !== null) {\n csl.DOI = citeInfo.doi;\n }\n if (citeInfo.url !== null) {\n csl.URL = citeInfo.url;\n }\n if (citeInfo.publisher !== null) {\n csl.publisher = citeInfo.publisher;\n }\n if (citeInfo.booktitle !== null) {\n csl['container-title'] = citeInfo.booktitle;\n }\n if (citeInfo.pages !== null) {\n csl.page = citeInfo.pages;\n }\n if (citeInfo.volume !== null) {\n csl.volume = citeInfo.volume;\n }\n if (citeInfo.author !== null) {\n csl.author = toCSLNames(citeInfo.author);\n }\n if (citeInfo.year !== null) {\n csl.issued = toCSLDate(citeInfo.year);\n }\n return csl;\n\n}\n\n// Create a citeky using the package, de-duplicating by incrementing a counter\n// until the key is unique\nfunction suggestPackageCiteId(name: string, existingCitationIds: string[]) {\n\n\n let retryCount = 0;\n const incrementName = () => {\n retryCount = retryCount + 1;\n if (retryCount === 1) {\n return name;\n } else {\n return `${name}-${retryCount}`;\n }\n };\n\n let citekey = incrementName();\n while (existingCitationIds.includes(citekey)) {\n citekey = incrementName();\n }\n return citekey;\n}\n\n\n// Search index for packages\ninterface PackageSearch {\n search(searchTerm: string): RPackageInfo[];\n}\n\nconst searchFields: Fuse.FuseOptionKeyObject[] = [\n { name: 'name', weight: 30 },\n { name: 'desc', weight: 15 },\n { name: 'version', weight: 5 },\n];\n\nfunction packageIndex(entries: RPackageInfo[]): PackageSearch {\n // build search index\n const options = {\n isCaseSensitive: false,\n shouldSort: true,\n includeMatches: false,\n includeScore: false,\n minMatchCharLength: 1,\n threshold: 0.2,\n keys: searchFields,\n limit: 10000\n };\n const index = Fuse.createIndex<RPackageInfo>(searchFields.map(searchField => searchField.name), entries);\n const fuse = new Fuse(entries, options, index);\n return {\n search: (searchTerm: string): RPackageInfo[] => {\n const results = fuse.search(searchTerm, options);\n return results.map(result => result.item);\n },\n };\n}\n\n","/*\n * text.tsx\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React, { ChangeEventHandler, KeyboardEventHandler, FocusEventHandler, ClipboardEventHandler } from 'react';\n\nimport { WidgetProps } from './react';\n\nimport './text.css';\n\nexport interface CheckboxInputProps extends WidgetProps {\n id?: string;\n tabIndex?: number;\n className?: string;\n checked?: boolean;\n onChange?: ChangeEventHandler;\n}\n\nexport const CheckboxInput= React.forwardRef<HTMLInputElement, CheckboxInputProps>((props, ref) => {\n const style: React.CSSProperties = {\n ...props.style,\n };\n\n return (\n <input\n id={props.id} \n type=\"checkbox\"\n className={`\n pm-input-checkbox\n pm-text-color \n pm-background-color \n ${props.className}`}\n checked={props.checked}\n onChange={props.onChange}\n tabIndex={props.tabIndex}\n ref={ref}\n />\n );\n});\n\n\n","/*\n * xref-popup.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { PluginKey } from 'prosemirror-state';\nimport { DecorationSet, EditorView } from 'prosemirror-view';\n\nimport React from 'react';\n\nimport { EditorUI } from '../../api/ui';\nimport { textPopupDecorationPlugin, TextPopupTarget } from '../../api/text-popup';\nimport { WidgetProps } from '../../api/widgets/react';\nimport { Popup } from '../../api/widgets/popup';\nimport { EditorServer } from '../../api/server';\nimport { XRef, xrefKey, parseQuartoXRef } from '../../api/xref';\nimport { LinkButton } from '../../api/widgets/button';\n\nimport './cite-popup-xref.css';\n\nconst kMaxWidth = 350;\n\nexport function citeXrefPopupPlugin(schema: Schema, ui: EditorUI, server: EditorServer) {\n return textPopupDecorationPlugin({\n key: new PluginKey<DecorationSet>('cite-xref-popup'),\n markType: schema.marks.cite_id,\n maxWidth: kMaxWidth,\n dismissOnEdit: false,\n createPopup: async (view: EditorView, target: TextPopupTarget, style: React.CSSProperties) => {\n\n // lookup xref on server\n const docPath = ui.context.getDocumentPath();\n if (docPath) {\n\n const citeId = target.text.replace(/^-@|^@/, '');\n const parsed = parseQuartoXRef(citeId);\n if (parsed) {\n const { id, type } = parsed;\n\n const xrefs = await server.xref.quartoXrefForId(docPath, `${type.toLowerCase()}-${id}`);\n if (xrefs.refs.length > 0) {\n if (xrefs.refs.length) {\n const xref = xrefs.refs[0];\n\n // click handler\n const onClick = () => {\n const file = xrefs.baseDir + '/' + xref.file;\n ui.display.navigateToXRef(file, xref);\n };\n\n return <XrefCitefPopup xref={xref} onClick={onClick} style={style} />;\n }\n }\n }\n }\n return null;\n }\n });\n}\n\ninterface XRefCitePopupProps extends WidgetProps {\n xref: XRef;\n onClick: VoidFunction;\n style: React.CSSProperties;\n}\n\nconst XrefCitefPopup: React.FC<XRefCitePopupProps> = props => {\n return (\n <Popup classes={['pm-cite-xref-popup']} style={props.style} >\n <div>\n <LinkButton\n text={xrefKey(props.xref, \"quarto\")}\n onClick={props.onClick}\n maxWidth={kMaxWidth - 20\n }\n classes={['pm-cite-xref-popup-key pm-fixedwidth-font']}\n />\n </div>\n {props.xref.title ? (\n <div className=\"pm-cite-xref-popup-text\" >{props.xref.title} </div>\n ) : null}\n <div className=\"pm-cite-xref-popup-file\" >{props.xref.file} </div>\n </Popup>\n );\n};\n","/*\n * span.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Mark, Fragment, Schema, DOMOutputSpec } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { ExtensionContext } from '../api/extension';\nimport { ProsemirrorCommand, EditorCommandId } from '../api/command';\nimport { EditorUI } from '../api/ui';\nimport { markIsActive, getMarkAttrs, getSelectionMarkRange } from '../api/mark';\nimport { PandocOutput, PandocTokenType, PandocToken } from '../api/pandoc';\nimport {\n pandocAttrSpec,\n pandocAttrReadAST,\n pandocAttrParseDom,\n pandocAttrToDomAttr,\n kSpanAttr,\n kSpanChildren,\n} from '../api/pandoc_attr';\n\nconst extension = (context: ExtensionContext) => {\n const { pandocExtensions, ui } = context;\n\n if (!pandocExtensions.bracketed_spans && !pandocExtensions.native_spans) {\n return null;\n }\n\n return {\n marks: [\n {\n name: 'span',\n spec: {\n attrs: pandocAttrSpec,\n inclusive: false,\n parseDOM: [\n {\n tag: 'span[data-span=\"1\"]',\n getAttrs(dom: Node | string) {\n const attrs: {} = { 'data-span': 1 };\n return {\n ...attrs,\n ...pandocAttrParseDom(dom as Element, attrs),\n };\n },\n },\n ],\n toDOM(mark: Mark): DOMOutputSpec {\n const attr = {\n 'data-span': '1',\n ...pandocAttrToDomAttr({\n ...mark.attrs,\n classes: [...mark.attrs.classes, 'pm-span pm-span-background-color'],\n }),\n };\n return ['span', attr];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.Span,\n mark: 'span',\n getAttrs: (tok: PandocToken) => {\n return pandocAttrReadAST(tok, kSpanAttr);\n },\n getChildren: (tok: PandocToken) => tok.c[kSpanChildren],\n },\n ],\n writer: {\n priority: 11,\n write: (output: PandocOutput, mark: Mark, parent: Fragment) => {\n output.writeToken(PandocTokenType.Span, () => {\n output.writeAttr(mark.attrs.id, mark.attrs.classes, mark.attrs.keyvalue);\n output.writeArray(() => {\n output.writeInlines(parent);\n });\n });\n },\n },\n },\n },\n ],\n\n commands: (_schema: Schema) => {\n return [new SpanCommand(ui)];\n },\n };\n};\n\nclass SpanCommand extends ProsemirrorCommand {\n constructor(ui: EditorUI) {\n super(EditorCommandId.Span, [], (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n const schema = state.schema;\n\n // if there is no contiguous selection and no existing span mark active\n // then the command should be disabled (unknown what the span target is)\n if (!markIsActive(state, schema.marks.span) && state.selection.empty) {\n return false;\n }\n\n // if the current node doesn't allow this mark return false\n if (!state.selection.$from.node().type.allowsMarkType(schema.marks.span)) {\n return false;\n }\n\n async function asyncEditSpan() {\n if (dispatch) {\n let attr: { [key: string]: any } = { id: null, classes: [], keyvalue: [] };\n if (markIsActive(state, schema.marks.span)) {\n attr = getMarkAttrs(state.doc, state.selection, schema.marks.span);\n }\n const result = await ui.dialogs.editSpan(attr);\n if (result) {\n const tr = state.tr;\n const range = getSelectionMarkRange(state.selection, schema.marks.span);\n tr.removeMark(range.from, range.to, schema.marks.span);\n if (result.action === 'edit') {\n const mark = schema.marks.span.create(result.attr);\n tr.addMark(range.from, range.to, mark);\n }\n dispatch(tr);\n }\n }\n if (view) {\n view.focus();\n }\n }\n asyncEditSpan();\n\n return true;\n });\n }\n}\n\nexport default extension;\n","/*\n * xref.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Node as ProsemirrorNode, Mark, Fragment } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { InputRule } from 'prosemirror-inputrules';\nimport { Transform } from 'prosemirror-transform';\n\nimport { setTextSelection, findChildren, findChildrenByMark } from 'prosemirror-utils';\n\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { detectAndApplyMarks, removeInvalidatedMarks, getMarkRange } from '../../api/mark';\nimport { MarkTransaction, trTransform } from '../../api/transaction';\nimport { FixupContext } from '../../api/fixup';\nimport { ProsemirrorCommand, EditorCommandId, toggleMarkType } from '../../api/command';\nimport { canInsertNode } from '../../api/node';\nimport { fragmentText } from '../../api/fragment';\nimport { PandocOutput } from '../../api/pandoc';\nimport { OmniInsertGroup } from '../../api/omni_insert';\nimport { xrefCompletionHandler } from './xref-completion';\nimport { xrefPopupPlugin } from './xref-popup';\nimport { kQuartoDocType } from '../../api/format';\nimport { insertXref } from '../../behaviors/insert_xref/insert_xref';\n\nconst kRefRegExDetectAndApply = /(?:^|[^`])(\\\\?@ref\\([ A-Za-z0-9:-]*\\))/g;\n\nconst extension = (context: ExtensionContext): Extension | null => {\n const { pandocExtensions, format, ui, server } = context;\n\n if (!format.rmdExtensions.bookdownXRef) {\n return null;\n }\n\n return {\n marks: [\n {\n name: 'xref',\n noInputRules: true,\n noSpelling: true,\n spec: {\n inclusive: false,\n excludes: 'formatting',\n attrs: {},\n parseDOM: [\n {\n tag: \"span[class*='xref']\",\n },\n ],\n toDOM(_mark: Mark) {\n return ['span', { class: 'xref pm-link-text-color pm-fixedwidth-font' }];\n },\n },\n pandoc: {\n readers: [],\n writer: {\n priority: 1,\n write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n // alias xref (may need to transform it to deal with \\ prefix)\n let xref = parent;\n\n // if it starts with a \\ then don't write the slash (pandoc will\n // either create one automatically or we'll write one explicitly\n // if pandoc won't b/c it doesn't have all_symbols_escapable)\n if (fragmentText(xref).startsWith('\\\\')) {\n xref = xref.cut(1, xref.size);\n }\n\n // if all symbols aren't escapable then we need an explicit \\\n // (because pandoc won't automatically escape the \\)\n if (!pandocExtensions.all_symbols_escapable) {\n output.writeRawMarkdown('\\\\');\n }\n\n // write xref\n output.writeInlines(xref);\n },\n },\n },\n },\n ],\n\n fixups: (schema: Schema) => {\n return [\n (tr: Transaction, fixupContext: FixupContext) => {\n if (fixupContext === FixupContext.Load) {\n // apply marks\n const markType = schema.marks.xref;\n const predicate = (node: ProsemirrorNode) => {\n return node.isTextblock && node.type.allowsMarkType(markType);\n };\n const markTr = new MarkTransaction(tr);\n findChildren(tr.doc, predicate).forEach(nodeWithPos => {\n const { pos } = nodeWithPos;\n detectAndApplyMarks(\n markTr,\n tr.doc.nodeAt(pos)!,\n pos,\n kRefRegExDetectAndApply,\n markType,\n () => ({}),\n () => true,\n match => match[1],\n );\n });\n\n // remove leading \\ as necessary (this would occur if the underlying format includes\n // a \\@ref and doesn't have all_symbols_escapable, e.g. blackfriday)\n trTransform(tr, stripRefBackslashTransform);\n }\n return tr;\n },\n ];\n },\n\n appendMarkTransaction: (schema: Schema) => {\n return [\n {\n name: 'xref-marks',\n filter: (node: ProsemirrorNode) => node.isTextblock && node.type.allowsMarkType(node.type.schema.marks.xref),\n append: (tr: MarkTransaction, node: ProsemirrorNode, pos: number) => {\n removeInvalidatedMarks(tr, node, pos, kRefRegExDetectAndApply, node.type.schema.marks.xref);\n detectAndApplyMarks(\n tr,\n tr.doc.nodeAt(pos)!,\n pos,\n kRefRegExDetectAndApply,\n node.type.schema.marks.xref,\n () => ({}),\n () => true,\n match => match[1],\n );\n },\n },\n ];\n },\n\n inputRules: (_schema: Schema) => {\n return [atRefInputRule(), ...(format.rmdExtensions.bookdownXRefUI ? [refPrefixInputRule()] : [])];\n },\n\n plugins: (schema: Schema) => [xrefPopupPlugin(schema, ui, server)],\n\n completionHandlers: () => [xrefCompletionHandler(ui, server.xref)],\n\n commands: (schema: Schema) => {\n if (format.rmdExtensions.bookdownXRefUI) {\n return [\n new ProsemirrorCommand(\n EditorCommandId.CrossReference,\n [],\n (state: EditorState, dispatch?: (tr: Transaction<any>) => void) => {\n // enable/disable command\n if (!canInsertNode(state, schema.nodes.text) || !toggleMarkType(schema.marks.xref)(state)) {\n return false;\n }\n if (dispatch) {\n const tr = state.tr;\n insertRef(tr);\n dispatch(tr);\n }\n return true;\n },\n {\n name: ui.context.translateText('Cross Reference'),\n description: ui.context.translateText('Reference to related content'),\n group: OmniInsertGroup.References,\n priority: 0,\n image: () =>\n ui.prefs.darkMode()\n ? ui.images.omni_insert!.cross_reference_dark!\n : ui.images.omni_insert!.cross_reference!,\n },\n ),\n ];\n } else if (format.docTypes.includes(kQuartoDocType) && pandocExtensions.citations) {\n return [\n new ProsemirrorCommand(\n EditorCommandId.CrossReference,\n ['Shift-Mod-F10'],\n (state: EditorState, dispatch?: (tr: Transaction<any>) => void) => {\n // enable/disable command\n if (!canInsertNode(state, schema.nodes.text) || !toggleMarkType(schema.marks.cite_id)(state)) {\n return false;\n }\n\n // Show the insert Xref dialog\n if (dispatch) {\n insertXref(ui, state.doc, server, (key: string, prefix?: string) => {\n // An xref was selected, insert it\n const tr = state.tr;\n const xref = schema.text(key, [schema.marks.cite_id.create()]);\n\n // If there is a custom prefix, create a full cite\n if (prefix !== undefined || key.startsWith('-')) {\n const start = tr.selection.from;\n const wrapperText = schema.text('[]');\n tr.replaceSelectionWith(wrapperText);\n\n // move the selection into the wrapper\n setTextSelection(tr.selection.from - 1)(tr);\n\n // Insert the prefix\n if (prefix !== undefined) {\n tr.insertText(`${prefix} `, tr.selection.from);\n }\n\n // Insert the xref\n tr.insert(tr.selection.from, xref);\n\n // Add the cite mark\n const citeMark = schema.marks.cite.create();\n tr.addMark(start, tr.selection.from + 1, citeMark);\n\n setTextSelection(tr.selection.from + 1)(tr);\n dispatch(tr);\n\n } else {\n // otherwise, create simple cite_id\n tr.replaceSelectionWith(xref, false);\n setTextSelection(tr.selection.from)(tr);\n dispatch(tr);\n }\n });\n }\n return true;\n },\n {\n name: ui.context.translateText('Cross Reference'),\n description: ui.context.translateText('Reference to related content'),\n group: OmniInsertGroup.References,\n priority: 0,\n image: () =>\n ui.prefs.darkMode()\n ? ui.images.omni_insert!.cross_reference_dark!\n : ui.images.omni_insert!.cross_reference!,\n },\n ),\n ];\n\n\n } else {\n return [];\n }\n },\n };\n};\n\nfunction atRefInputRule() {\n return new InputRule(/(^|[^`])(\\\\?@ref\\()$/, (state: EditorState, match: string[], start: number, end: number) => {\n // if this completes an xref at this position then stand down\n const kRefLen = 4;\n const { parent, parentOffset } = state.selection.$head;\n const before = parent.textContent.slice(parentOffset - kRefLen, parentOffset);\n const after = parent.textContent.slice(parentOffset);\n const potentialXRef = before + '(' + after;\n if (/^@ref\\([A-Za-z0-9:-]*\\).*$/.test(potentialXRef)) {\n return null;\n }\n\n // insert the xref\n const tr = state.tr;\n tr.delete(start + match[1].length, end);\n insertRef(tr);\n return tr;\n });\n}\n\nfunction refPrefixInputRule() {\n return new InputRule(\n /(^|[^`])(Chapter|Chapters|Appendix|Section|Figure|Table|Equation) $/,\n (state: EditorState, match: string[], start: number, end: number) => {\n const tr = state.tr;\n tr.insertText(' ');\n let prefix = '';\n if (match[2] === 'Figure') {\n prefix = 'fig:';\n } else if (match[2] === 'Table') {\n prefix = 'tab:';\n } else if (match[2] === 'Equation') {\n prefix = 'eq:';\n }\n insertRef(tr, prefix);\n setTextSelection(tr.selection.head - 1)(tr);\n return tr;\n },\n );\n}\n\nfunction insertRef(tr: Transaction, prefix = '') {\n const schema = tr.doc.type.schema;\n const selection = tr.selection;\n const refText = `@ref(${prefix})`;\n tr.replaceSelectionWith(schema.text(refText, schema.marks.xref.create()), false);\n setTextSelection(tr.mapping.map(selection.head) - 1)(tr);\n}\n\nfunction stripRefBackslashTransform(tr: Transform) {\n const markType = tr.doc.type.schema.marks.xref;\n findChildrenByMark(tr.doc, markType).forEach(markedNode => {\n const pos = tr.mapping.map(markedNode.pos);\n if (markType.isInSet(markedNode.node.marks)) {\n const markRange = getMarkRange(tr.doc.resolve(pos), markType);\n if (markRange) {\n const text = tr.doc.textBetween(markRange.from, markRange.to);\n if (text.startsWith('\\\\')) {\n tr.deleteRange(markRange.from, markRange.from + 1);\n }\n }\n }\n });\n}\n\nexport default extension;\n","/*\n * xref-popup.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { PluginKey } from 'prosemirror-state';\nimport { DecorationSet, EditorView } from 'prosemirror-view';\n\nimport React from 'react';\n\nimport { EditorUI } from '../../api/ui';\nimport { textPopupDecorationPlugin, TextPopupTarget } from '../../api/text-popup';\nimport { WidgetProps } from '../../api/widgets/react';\nimport { Popup } from '../../api/widgets/popup';\nimport { EditorServer } from '../../api/server';\nimport { XRef, xrefKey } from '../../api/xref';\nimport { LinkButton } from '../../api/widgets/button';\n\nimport './xref-popup.css';\n\nconst kMaxWidth = 350; // also in xref-popup.css\n\nexport function xrefPopupPlugin(schema: Schema, ui: EditorUI, server: EditorServer) {\n return textPopupDecorationPlugin({\n key: new PluginKey<DecorationSet>('xref-popup'),\n markType: schema.marks.xref,\n maxWidth: kMaxWidth,\n dismissOnEdit: true,\n createPopup: async (view: EditorView, target: TextPopupTarget, style: React.CSSProperties) => {\n // lookup xref on server\n const docPath = ui.context.getDocumentPath();\n if (docPath) {\n const kXRefRegEx = /^@ref\\(([A-Za-z0-9:-]*)\\)$/;\n const match = target.text.match(kXRefRegEx);\n if (match && match[1].length) {\n await ui.context.withSavedDocument();\n const xrefs = await server.xref.xrefForId(docPath, match[1]);\n if (xrefs.refs.length) {\n const xref = xrefs.refs[0];\n\n // click handler\n const onClick = () => {\n const file = xrefs.baseDir + '/' + xref.file;\n ui.display.navigateToXRef(file, xref);\n };\n\n return <XRefPopup xref={xref} onClick={onClick} style={style} />;\n }\n }\n }\n return null;\n },\n specKey: (target: TextPopupTarget) => {\n return `xref:${target.text}`;\n },\n });\n}\n\ninterface XRefPopupProps extends WidgetProps {\n xref: XRef;\n onClick: VoidFunction;\n style: React.CSSProperties;\n}\n\nconst XRefPopup: React.FC<XRefPopupProps> = props => {\n return (\n <Popup classes={['pm-xref-popup']} style={props.style}>\n <div>\n <LinkButton\n text={xrefKey(props.xref)}\n onClick={props.onClick}\n maxWidth={kMaxWidth - 20}\n classes={['pm-xref-popup-key pm-fixedwidth-font']}\n />\n </div>\n <div className=\"pm-xref-popup-file\">{props.xref.file}</div>\n </Popup>\n );\n};\n","/*\n * insert_xref.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport React, { ChangeEvent } from 'react';\nimport ReactDOM from 'react-dom';\nimport { FixedSizeList, ListChildComponentProps } from 'react-window';\nimport uniqBy from 'lodash.uniqby';\nimport debounce from 'lodash.debounce';\n\nimport { EditorUI } from \"../../api/ui\";\nimport { EditorServer } from \"../../api/server\";\nimport { WidgetProps } from '../../api/widgets/react';\nimport { DialogButtons } from '../../api/widgets/dialog-buttons';\nimport { XRef, xrefKey } from '../../api/xref';\nimport { TextInput } from '../../api/widgets/text';\nimport { SelectInput } from '../../api/widgets/select';\nimport { NavigationTree, NavigationTreeNode } from '../../api/widgets/navigation-tree';\nimport { kQuartoXRefTypes } from '../../marks/xref/xref-completion';\n\nimport { xrefIndex } from './insert_xref_index';\nimport './insert_xref-styles.css';\nimport { kAlertTypeError } from '../../api/ui-dialogs';\n\n// Keep the most recently used selected style around\nlet lastSelectedStyleIndex = 0;\n\n// Height of textbox including border\nconst kXrefSearchBoxHeight = 30;\n\n// constants\nconst kStyleDefault = \"Default\";\nconst kStyleCustom = \"Custom\";\nconst kStyleCapital = \"Capitalize\";\nconst kStyleNone = \"(None)\";\n\n// Styles used for xrefs\nconst kXRefStyles: XRefStyle[] = [\n {\n key: kStyleDefault,\n fn: (key: string) => {\n return `@${key}`;\n }\n },\n {\n key: kStyleCapital,\n fn: (key: string) => {\n return `@${key.charAt(0).toUpperCase() + key.slice(1)}`;\n }\n },\n {\n key: kStyleCustom,\n fn: (key: string) => {\n return `@${key}`;\n }\n },\n {\n key: kStyleNone,\n fn: (key: string) => {\n return `-@${key}`;\n }\n },\n];\n\ninterface XRefStyle {\n key: string;\n fn: (key: string) => string;\n}\n\ninterface XRefType {\n type: string;\n prefix: string[];\n}\n\n// Types (prefixes + display) for xrefs\nconst kTheoremTypes = [\"thm\", \"lem\", \"cor\", \"prp\", \"cnj\", \"def\", \"exm\", \"exr\"];\nconst kSecType = \"sec\";\nconst kFigType = \"fig\";\nconst kTableType = \"tbl\";\nconst kEquationType = \"eq\";\nconst kListingtype = \"lst\";\n\nconst xRefTypes = [\n {\n type: \"All Types\",\n prefix: [kSecType, kFigType, kTableType, kEquationType, kListingtype, ...kTheoremTypes],\n image: (ui: EditorUI) => {\n return ui.images.xrefs?.type_all;\n }\n },\n {\n type: \"Sections\",\n prefix: [kSecType],\n image: (ui: EditorUI) => {\n return ui.images.xrefs?.type_section;\n }\n },\n {\n type: \"Figures\",\n prefix: [kFigType],\n image: (ui: EditorUI) => {\n return ui.images.xrefs?.type_figure;\n }\n },\n {\n type: \"Tables\",\n prefix: [kTableType],\n image: (ui: EditorUI) => {\n return ui.images.xrefs?.type_table;\n }\n },\n {\n type: \"Equations\",\n prefix: [kEquationType],\n image: (ui: EditorUI) => {\n return ui.images.xrefs?.type_equation;\n }\n },\n {\n type: \"Listings\",\n prefix: [kListingtype],\n image: (ui: EditorUI) => {\n return ui.images.xrefs?.type_listing;\n }\n },\n {\n type: \"Theorems\",\n prefix: kTheoremTypes,\n image: (ui: EditorUI) => {\n return ui.images.xrefs?.type_theorem;\n }\n },\n];\n\n\nexport async function insertXref(\n ui: EditorUI,\n doc: ProsemirrorNode,\n server: EditorServer,\n onInsertXref: (key: string, prefix?: string) => void\n) {\n await ui.dialogs.htmlDialog(\n 'Insert Cross Reference',\n 'Insert',\n (\n containerWidth: number,\n containerHeight: number,\n confirm: VoidFunction,\n cancel: VoidFunction,\n _showProgress: (message: string) => void,\n _hideProgress: VoidFunction,\n ) => {\n const kMaxHeight = 400;\n const kMaxWidth = 650;\n const kMaxHeightProportion = 0.9;\n const kdialogPaddingIncludingButtons = 70;\n\n const windowHeight = containerHeight;\n const windowWidth = containerWidth;\n\n const height = Math.min(kMaxHeight, windowHeight * kMaxHeightProportion - kdialogPaddingIncludingButtons);\n const width = Math.max(Math.min(kMaxWidth, windowWidth * 0.9), 550);\n\n const container = window.document.createElement('div');\n container.className = 'pm-default-theme';\n container.style.width = width + 'px';\n\n // Look up the document and initialize the state\n const docPath = ui.context.getDocumentPath() || \"\";\n\n // Read the xrefs\n const loadXRefs = async () => {\n await ui.context.withSavedDocument();\n return (await server.xref.quartoIndexForFile(docPath)).refs;\n };\n\n const onInsert = (xref: XRef, style: XRefStyle, prefix?: string) => {\n onInsertXref(style.fn(xrefKey(xref, \"quarto\")), prefix);\n confirm();\n };\n\n // REnder the panel\n ReactDOM.render(\n <InsertXrefPanel\n height={height}\n width={width}\n styleIndex={lastSelectedStyleIndex}\n onOk={onInsert}\n onCancel={cancel}\n doc={doc}\n ui={ui}\n loadXRefs={loadXRefs}\n />,\n container,\n );\n return container;\n },\n () => {\n // Focus\n // dealt with in the React Component itself\n },\n () => {\n // Validation\n return null;\n },\n );\n}\n\ninterface InsertXrefPanelProps extends WidgetProps {\n ui: EditorUI;\n doc: ProsemirrorNode;\n height: number;\n width: number;\n styleIndex: number;\n loadXRefs: () => Promise<XRef[]>;\n onOk: (xref: XRef, style: XRefStyle, prefix?: string) => void;\n onCancel: () => void;\n}\n\nconst InsertXrefPanel: React.FC<InsertXrefPanelProps> = props => {\n\n // State\n const [xrefs, setXrefs] = React.useState<XRef[]>();\n const [selectedXRefIndex, setSelectedXRefIndex] = React.useState<number>(0);\n const [selectedTypeIndex, setSelectedTypeIndex] = React.useState<number>(0);\n const [selectedStyleIndex, setSelectedStyleIndex] = React.useState<number>(props.styleIndex);\n const [filterText, setFilterText] = React.useState<string>(\"\");\n\n // References to key controls\n const textRef = React.useRef<HTMLInputElement>(null);\n const fixedList = React.useRef<FixedSizeList>(null);\n const styleSelectRef = React.useRef<HTMLSelectElement>(null);\n const prefixRef = React.useRef<HTMLInputElement>(null);\n\n // Focus the custom prefix textbox when the user selects custom\n React.useEffect(() => {\n const option = styleSelectRef.current?.options[selectedStyleIndex];\n const key = option?.value || \"\";\n if (key === kStyleCustom) {\n prefixRef.current?.focus();\n }\n }, [selectedStyleIndex]);\n\n // Load the cross ref data when the dialog loads\n React.useEffect(() => {\n props.loadXRefs().then(values => {\n\n // Sort the data\n const sorted = values.sort((a, b) => {\n const typeOrder = a.type.localeCompare(b.type);\n if (typeOrder !== 0) {\n return typeOrder;\n } else {\n return a.id.localeCompare(b.id);\n }\n });\n\n // Ensure that the items are unique\n const unique = uniqBy(sorted, (xref => {\n return `${xref.type}-${xref.id}${xref.suffix}`;\n }));\n\n setXrefs(unique);\n });\n\n setTimeout(() => {\n textRef.current?.focus();\n if (styleSelectRef.current) {\n styleSelectRef.current.selectedIndex = lastSelectedStyleIndex;\n }\n });\n }, []);\n\n // The styles\n const styleOptions = kXRefStyles.map(style => (\n <option key={style.key} value={style.key}>\n {props.ui.context.translateText(style.key)}\n </option>\n ));\n\n\n // Filter the xrefs (by type or matching user typed text)\n const filterXrefs = () => {\n if (!xrefs) {\n return [];\n }\n\n let filtered = xrefs;\n if (selectedTypeIndex !== 0) {\n filtered = filtered.filter(xref => xRefTypes[selectedTypeIndex].prefix.includes(xref.type));\n }\n\n if (filterText) {\n const search = xrefIndex(filtered);\n filtered = search.search(filterText, 1000);\n }\n return filtered;\n };\n const filteredXrefs = filterXrefs();\n\n // The Types\n const typeNodes = xRefTypes.map(type => {\n return {\n key: type.type,\n image: type.image(props.ui),\n name: type.type,\n type: type.type,\n children: [],\n expanded: true,\n };\n });\n const selectedNode = typeNodes[selectedTypeIndex];\n\n\n // The current index (adjusted to ensure it is in bounds)\n const currentIndex = Math.min(selectedXRefIndex, filteredXrefs.length - 1);\n\n // Increments or decrements the index\n const incrementIndex = (increment: number) => {\n let newIndex = currentIndex;\n if (increment > 0) {\n newIndex = Math.min(currentIndex + increment, filteredXrefs.length - 1);\n } else {\n newIndex = Math.max(currentIndex + increment, 0);\n }\n if (newIndex !== currentIndex) {\n setSelectedXRefIndex(newIndex);\n fixedList.current?.scrollToItem(newIndex);\n }\n };\n\n const currentStyle = () => {\n const option = styleSelectRef.current?.options[selectedStyleIndex];\n const key = option?.value || \"\";\n return kXRefStyles.find(style => style.key === key) || kXRefStyles[0];\n };\n\n const currentPrefix = () => {\n return prefixRef.current?.value || undefined;\n };\n\n const placeholderText = () => {\n if (xrefs === undefined) {\n return props.ui.context.translateText(\"Loading Cross References\");\n }\n return props.ui.context.translateText(\"No Matching Cross References Found.\");\n };\n\n // Insert the item\n const insertItem = (index: number) => {\n const xref = filteredXrefs[index];\n const style = currentStyle();\n const prefix = style.key === kStyleCustom ? currentPrefix() : undefined;\n\n if (xref === undefined) {\n // There is no item selected\n props.ui.dialogs\n .alert(\n props.ui.context.translateText(\"Please select a cross reference to insert.\"),\n props.ui.context.translateText('Validation Error'),\n kAlertTypeError,\n );\n } else if (style.key === kStyleCustom && !prefix) {\n // Custom was selected, but no prefix provided\n props.ui.dialogs\n .alert(\n props.ui.context.translateText(\"Please enter a custom prefix for this reference.\"),\n props.ui.context.translateText('Validation Error'),\n kAlertTypeError,\n )\n .then(() => {\n prefixRef.current?.focus();\n });\n } else {\n lastSelectedStyleIndex = styleSelectRef.current?.selectedIndex || 0;\n props.onOk(xref, style, prefix);\n }\n };\n\n // debounce the text filtering\n const memoizedTextFilter = React.useCallback(\n debounce(\n (txt: string) => {\n setFilterText(txt);\n },\n 30,\n ),\n [],\n );\n\n const kPageSize = 5;\n const handleKeyboardEvent = (event: React.KeyboardEvent<HTMLElement>) => {\n // Global Key Handling\n switch (event.key) {\n case 'ArrowUp':\n incrementIndex(-1);\n event.preventDefault();\n break;\n case 'ArrowDown':\n incrementIndex(1);\n event.preventDefault();\n break;\n case 'PageUp':\n incrementIndex(-kPageSize);\n event.preventDefault();\n break;\n case 'PageDown':\n incrementIndex(kPageSize);\n event.preventDefault();\n break;\n case 'Enter':\n acceptSelected();\n event.preventDefault();\n case 'Escape':\n props.onCancel();\n event.preventDefault();\n break;\n default:\n break;\n }\n };\n\n // Select the item\n const handleItemClicked = (index: number) => {\n setSelectedXRefIndex(index);\n };\n\n\n const handleItemDoubleClicked = (index: number) => {\n insertItem(index);\n };\n\n const acceptSelected = () => {\n insertItem(currentIndex);\n };\n\n // The user typed some text\n const handleTextChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n memoizedTextFilter(event?.target.value);\n };\n\n // Handle the updating type selection\n const handleStyleChanged = (event: ChangeEvent<Element>) => {\n const index = (event.target as HTMLSelectElement).selectedOptions[0].index;\n setSelectedStyleIndex(index);\n };\n\n const handleNodeSelected = (node: NavigationTreeNode) => {\n setSelectedTypeIndex(xRefTypes.findIndex(type => type.type === node.key));\n };\n\n return (\n <div className=\"pm-insert-xref\">\n <div className=\"pm-insert-xref-container\">\n <div className=\"pm-insert-xref-type-container pm-block-border-color pm-background-color\">\n <NavigationTree\n height={props.height + kXrefSearchBoxHeight}\n nodes={typeNodes}\n selectedNode={selectedNode}\n onSelectedNodeChanged={handleNodeSelected}\n />\n </div>\n\n <div className=\"pm-insert-xref-list-container\">\n <TextInput\n onKeyDown={handleKeyboardEvent}\n width={20 + 'ch'}\n iconAdornment={props.ui.images.search}\n tabIndex={0}\n className=\"pm-insert-xref-search-textbox\"\n placeholder={props.ui.context.translateText(\"Search for Cross Reference\")}\n onChange={handleTextChange}\n ref={textRef}\n />\n\n\n {filteredXrefs && filteredXrefs.length > 0 ? (\n <div\n onKeyDown={handleKeyboardEvent}\n tabIndex={0}\n >\n <FixedSizeList\n className=\"pm-insert-xref-list pm-block-border-color pm-background-color\"\n height={props.height}\n width=\"100%\"\n itemCount={filteredXrefs.length}\n itemSize={66}\n itemData={{\n xrefs: filteredXrefs,\n selectedIndex: currentIndex,\n ui: props.ui,\n onclick: handleItemClicked,\n ondoubleclick: handleItemDoubleClicked\n }}\n ref={fixedList}\n >\n {XRefItem}\n </FixedSizeList>\n </div>\n\n ) : (\n <div\n className=\"pm-insert-xref-list-placeholder pm-block-border-color pm-background-color\"\n style={{ height: props.height + \"px\" }}\n >\n <div>{placeholderText()}</div>\n </div>\n )}\n\n </div>\n </div>\n <div className='pm-insert-xref-insert-options'>\n\n <div className='pm-insert-xref-prefix'>\n <div>{[props.ui.context.translateText(\"Prefix\")]}</div>\n <SelectInput\n tabIndex={0}\n ref={styleSelectRef}\n className=\"pm-insert-xref-select-style\"\n onChange={handleStyleChanged}\n >\n {styleOptions}\n </SelectInput>\n {kXRefStyles[selectedStyleIndex].key === kStyleCustom ? (\n <TextInput\n width={20 + 'ch'}\n tabIndex={0}\n className=\"pm-insert-xref-custom-prefix\"\n placeholder={props.ui.context.translateText(\"Enter Prefix\")}\n ref={prefixRef}\n />) : (\n null\n )}\n </div>\n <div>\n <DialogButtons\n okLabel={props.ui.context.translateText('Insert')}\n cancelLabel={props.ui.context.translateText('Cancel')}\n onOk={acceptSelected}\n onCancel={props.onCancel}\n />\n </div>\n </div>\n </div>\n );\n};\n\ninterface XRefItemProps extends ListChildComponentProps {\n data: {\n xrefs: XRef[],\n selectedIndex: number\n ui: EditorUI,\n onclick: (index: number) => void,\n ondoubleclick: (index: number) => void\n };\n}\n\nconst XRefItem = (props: XRefItemProps) => {\n const thisXref: XRef = props.data.xrefs[props.index];\n\n // The type (e.g. fig)\n const type = kQuartoXRefTypes[thisXref.type];\n\n // The id (e.g. fig-foobar)\n const id = xrefKey(thisXref, \"quarto\");\n\n // The display text for the entry\n const primaryText = `@${id}`;\n const secondaryText = thisXref.file;\n const detailText = thisXref.title || \"\";\n\n // The image and adornment\n const image = type?.image(props.data.ui) || props.data.ui.images.omni_insert?.generic!;\n\n // Click handlers\n const onItemClick = () => {\n props.data.onclick(props.index);\n };\n\n const onItemDoubleClick = () => {\n props.data.ondoubleclick(props.index);\n };\n\n // Whether this node is selected\n const selected = props.data.selectedIndex === props.index;\n const selectedClassName = `pm-xref-item${selected ? ' pm-list-item-selected' : ''}`;\n return (\n <div key={thisXref.id} style={props.style} className={selectedClassName} onClick={onItemClick} onDoubleClick={onItemDoubleClick}>\n <div className={`pm-xref-item-image-container ${thisXref.type}`}>\n <img src={image} className={'pm-xref-item-image pm-border-color'} draggable=\"false\"/>\n </div>\n <div className={'pm-xref-item-body pm-text-color'}>\n <div className=\"pm-xref-item-title\">\n <div className=\"pm-xref-item-primary pm-fixedwidth-font\">{primaryText}</div>\n <div className=\"pm-xref-item-secondary\">{secondaryText}</div>\n </div>\n <div>\n <div className=\"pm-xref-item-detail\">{detailText}</div>\n </div>\n </div>\n </div>\n );\n};\n","\n/*\n * insert_xref-index.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport Fuse from 'fuse.js';\nimport { XRef, xrefKey } from '../../api/xref';\n\n\nconst searchFields: Fuse.FuseOptionKeyObject[] = [\n { name: 'key', weight: 50 },\n { name: 'title', weight: 30 },\n];\n\nexport interface XRefSearch {\n search: (searchTerm: string, limit: number) => XRef[];\n}\n\ninterface QuartoXRef extends XRef {\n key: string;\n}\n\nexport function xrefIndex(entries: XRef[]): XRefSearch {\n // build search index\n const options = {\n isCaseSensitive: false,\n shouldSort: true,\n includeMatches: false,\n includeScore: false,\n minMatchCharLength: 2,\n threshold: 0.3,\n keys: searchFields,\n };\n\n const index = Fuse.createIndex<QuartoXRef>(searchFields.map(searchField => searchField.name), entries.map(entry => {\n return {\n key: xrefKey(entry, \"quarto\"),\n ...entry\n };\n }));\n const fuse = new Fuse(entries, options, index);\n return {\n search: (searchTerm: string, limit: number): XRef[] => {\n const results = fuse.search(searchTerm, { ...options, limit });\n return results.map(result => result.item);\n },\n };\n}","/*\n * raw_html-comment.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Mark, Fragment, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { Transaction, TextSelection, EditorState } from 'prosemirror-state';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { EditorCommandId, ProsemirrorCommand, toggleMarkType } from '../../api/command';\nimport { canInsertNode } from '../../api/node';\nimport { ProsemirrorWriter, PandocOutput } from '../../api/pandoc';\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { EditorUI } from '../../api/ui';\nimport { MarkTransaction } from '../../api/transaction';\nimport { removeInvalidatedMarks, detectAndApplyMarks } from '../../api/mark';\nimport { matchPandocFormatComment } from '../../api/pandoc_format';\nimport { kHTMLCommentRegEx, isHTMLComment } from '../../api/html';\nimport { OmniInsertGroup } from '../../api/omni_insert';\n\nimport './raw_html_comment-styles.css';\n\nconst kHTMLEditingCommentRegEx = /^<!--# ([\\s\\S]*?)-->$/;\n\nconst extension = (context: ExtensionContext): Extension | null => {\n const { options, ui } = context;\n\n return {\n marks: [\n {\n name: 'raw_html_comment',\n noInputRules: true,\n noSpelling: true,\n spec: {\n attrs: {\n editing: { default: false },\n format: { default: false },\n },\n inclusive: false,\n excludes: 'formatting',\n parseDOM: [\n {\n tag: \"span[class*='raw-html-comment']\",\n getAttrs(dom: Node | string) {\n const el = dom as Element;\n return {\n editing: el.getAttribute('data-editing') === '1',\n format: el.getAttribute('data-format') === '1',\n };\n },\n },\n ],\n toDOM(mark: Mark) {\n const attr: any = {\n class:\n 'raw-html-comment pm-fixedwidth-font ' +\n (mark.attrs.editing ? 'pm-comment-color pm-comment-background-color' : 'pm-light-text-color') +\n (mark.attrs.format && options.hideFormatComment ? ' pm-comment-hidden' : ''),\n 'data-editing': mark.attrs.editing ? '1' : '0',\n 'data-format': mark.attrs.format ? '1' : '0',\n };\n return ['span', attr];\n },\n },\n pandoc: {\n readers: [],\n inlineHTMLReader: (schema: Schema, html: string, writer?: ProsemirrorWriter) => {\n const isComment = isHTMLComment(html);\n if (!isComment) {\n return false;\n }\n\n if (writer) {\n const mark = schema.marks.raw_html_comment.create(commentMarkAttribs(html));\n writer.openMark(mark);\n writer.writeText(html);\n writer.closeMark(mark);\n }\n\n return isComment;\n },\n writer: {\n priority: 1,\n write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n output.writeRawMarkdown(parent);\n },\n },\n },\n },\n ],\n\n appendMarkTransaction: (schema: Schema) => {\n const markType = schema.marks.raw_html_comment;\n const kHTMLCommentMarkRegEx = new RegExp(kHTMLCommentRegEx.source, 'g');\n return [\n {\n name: 'html-editing-comment-marks',\n filter: (node: ProsemirrorNode) => node.isTextblock && node.type.allowsMarkType(markType),\n append: (tr: MarkTransaction, node: ProsemirrorNode, pos: number) => {\n removeInvalidatedMarks(tr, node, pos, kHTMLCommentRegEx, markType);\n detectAndApplyMarks(\n tr,\n tr.doc.nodeAt(pos)!,\n pos,\n kHTMLCommentMarkRegEx,\n markType,\n match => commentMarkAttribs(match[1]),\n () => true,\n match => match[1],\n );\n },\n },\n ];\n },\n\n // insert command\n commands: (schema: Schema) => {\n return [new InsertHTMLCommentCommand(schema, ui)];\n },\n };\n};\n\nexport class InsertHTMLCommentCommand extends ProsemirrorCommand {\n constructor(schema: Schema, ui: EditorUI) {\n super(\n EditorCommandId.HTMLComment,\n ['Shift-Mod-c'],\n (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n // make sure we can insert a text node here\n if (!canInsertNode(state, schema.nodes.text)) {\n return false;\n }\n\n // make sure we can apply this mark here\n if (!toggleMarkType(schema.marks.raw_html)(state)) {\n return false;\n }\n\n // make sure the end of the selection (where we will insert the comment)\n // isn't already in a mark of this type\n if (state.doc.rangeHasMark(state.selection.to, state.selection.to + 1, schema.marks.raw_html)) {\n return false;\n }\n\n if (dispatch) {\n const tr = state.tr;\n\n // set the selection to the end of the current selection (comment 'on' the selection)\n setTextSelection(tr.selection.to)(tr);\n\n // if we have a character right before us then insert a space\n const { parent, parentOffset } = tr.selection.$to;\n const charBefore = parent.textContent.slice(parentOffset - 1, parentOffset);\n if (charBefore.length && charBefore !== ' ') {\n tr.insertText(' ');\n }\n\n // insert the comment\n const comment = '<!--# -->';\n const mark = schema.marks.raw_html_comment.create({ editing: true });\n tr.insert(tr.selection.to, schema.text(comment, [mark]));\n\n // set the selection to the middle of the comment\n tr.setSelection(new TextSelection(tr.doc.resolve(tr.selection.to - (comment.length / 2 - 1))));\n\n // dispatch\n dispatch(tr);\n }\n\n return true;\n },\n {\n name: ui.context.translateText('Comment'),\n description: ui.context.translateText('Editing comment'),\n group: OmniInsertGroup.Content,\n priority: 3,\n image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.comment_dark! : ui.images.omni_insert?.comment!),\n },\n );\n }\n}\n\nfunction commentMarkAttribs(comment: string) {\n return {\n editing: !!comment.match(kHTMLEditingCommentRegEx),\n format: !!matchPandocFormatComment(comment),\n };\n}\n\nexport default extension;\n","/*\n * shortcode.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Node as ProsemirrorNode, Mark, Fragment } from 'prosemirror-model';\nimport { Transaction } from 'prosemirror-state';\n\nimport { findChildren } from 'prosemirror-utils';\n\nimport { Extension, ExtensionContext } from '../api/extension';\nimport { detectAndApplyMarks, removeInvalidatedMarks } from '../api/mark';\nimport { MarkTransaction } from '../api/transaction';\nimport { FixupContext } from '../api/fixup';\nimport { kShortcodeRegEx } from '../api/shortcode';\nimport { PandocOutput } from '../api/pandoc';\n\nconst extension = (context: ExtensionContext): Extension | null => {\n const { format } = context;\n\n if (!format.hugoExtensions.shortcodes) {\n return null;\n }\n\n return {\n marks: [\n {\n name: 'shortcode',\n noInputRules: true,\n noSpelling: true,\n spec: {\n inclusive: false,\n excludes: 'formatting',\n attrs: {},\n parseDOM: [\n {\n tag: \"span[class*='shortcode']\",\n },\n ],\n toDOM(_mark: Mark) {\n return ['span', { class: 'shortcode pm-markup-text-color pm-fixedwidth-font' }];\n },\n },\n pandoc: {\n readers: [],\n writer: {\n priority: 1,\n write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n output.writeRawMarkdown(parent);\n },\n },\n },\n },\n ],\n\n fixups: (schema: Schema) => {\n return [\n (tr: Transaction, fixupContext: FixupContext) => {\n if (fixupContext === FixupContext.Load) {\n // apply marks\n const markType = schema.marks.shortcode;\n const predicate = (node: ProsemirrorNode) => {\n return node.isTextblock && node.type.allowsMarkType(markType);\n };\n const markTr = new MarkTransaction(tr);\n findChildren(tr.doc, predicate).forEach(nodeWithPos => {\n const { pos } = nodeWithPos;\n detectAndCreateShortcodes(schema, markTr, pos);\n });\n }\n return tr;\n },\n ];\n },\n\n appendMarkTransaction: (schema: Schema) => {\n return [\n {\n name: 'shortcode-marks',\n filter: (node: ProsemirrorNode) =>\n node.isTextblock && node.type.allowsMarkType(node.type.schema.marks.shortcode),\n append: (tr: MarkTransaction, node: ProsemirrorNode, pos: number) => {\n removeInvalidatedMarks(tr, node, pos, kShortcodeRegEx, node.type.schema.marks.shortcode);\n detectAndCreateShortcodes(node.type.schema, tr, pos);\n },\n },\n ];\n },\n };\n};\n\nfunction detectAndCreateShortcodes(schema: Schema, tr: MarkTransaction, pos: number) {\n // apply marks wherever they belong\n detectAndApplyMarks(\n tr,\n tr.doc.nodeAt(pos)!,\n pos,\n kShortcodeRegEx,\n schema.marks.shortcode,\n () => ({}),\n () => true,\n match => match[1],\n );\n}\n\nexport default extension;\n","/*\n * footnote.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema, Fragment, NodeType, DOMOutputSpec } from 'prosemirror-model';\nimport { Plugin, PluginKey, EditorState, Transaction, TextSelection, Selection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport {\n findChildrenByType,\n findParentNodeOfType,\n findSelectedNodeOfType,\n NodeWithPos,\n findChildren,\n} from 'prosemirror-utils';\n\nimport { ExtensionContext } from '../../api/extension';\nimport { uuidv4 } from '../../api/util';\nimport { PandocOutput, PandocTokenType, ProsemirrorWriter, PandocToken } from '../../api/pandoc';\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { canInsertNode } from '../../api/node';\nimport { EditorUI } from '../../api/ui';\nimport { OmniInsertGroup } from '../../api/omni_insert';\n\nimport {\n footnoteEditorKeyDownHandler,\n footnoteEditorActivationPlugin,\n footnoteEditorNodeViews,\n} from './footnote-editor';\nimport {\n footnoteAppendTransaction,\n footnoteFilterTransaction,\n footnoteSelectNoteAppendTransaction,\n} from './footnote-transaction';\n\nimport './footnote-styles.css';\n\nconst plugin = new PluginKey('footnote');\n\nconst extension = (context: ExtensionContext) => {\n const { pandocExtensions, ui } = context;\n\n if (!pandocExtensions.footnotes) {\n return null;\n }\n\n return {\n nodes: [\n {\n name: 'footnote',\n spec: {\n inline: true,\n attrs: {\n number: { default: 1 },\n ref: {},\n content: { default: '' },\n },\n group: 'inline',\n // atom: true,\n parseDOM: [\n {\n tag: \"span[class*='footnote']\",\n getAttrs(dom: Node | string) {\n const el = dom as Element;\n return {\n ref: el.getAttribute('data-ref'),\n content: el.getAttribute('data-content'),\n };\n },\n },\n ],\n toDOM(node: ProsemirrorNode): DOMOutputSpec {\n return [\n 'span',\n { class: 'footnote pm-footnote', 'data-ref': node.attrs.ref, 'data-content': node.attrs.content },\n node.attrs.number.toString(),\n ];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.Note,\n handler: writePandocNote,\n },\n ],\n writer: (output: PandocOutput, node: ProsemirrorNode) => {\n output.writeNote(node);\n },\n },\n },\n ],\n\n appendTransaction: (_schema: Schema) => {\n return [footnoteAppendTransaction()];\n },\n\n plugins: (_schema: Schema) => {\n return [\n footnoteEditorActivationPlugin(),\n\n new Plugin({\n key: plugin,\n\n // footnote editor\n props: {\n handleKeyDown: footnoteEditorKeyDownHandler(),\n nodeViews: footnoteEditorNodeViews(),\n },\n\n // footnote transactions (fixups, etc.)\n filterTransaction: footnoteFilterTransaction(),\n appendTransaction: footnoteSelectNoteAppendTransaction(),\n }),\n ];\n },\n\n commands: () => {\n return [\n new ProsemirrorCommand(EditorCommandId.Footnote, ['Shift-Mod-F7'], footnoteCommandFn(), footnoteOmniInsert(ui)),\n ];\n },\n };\n};\n\nfunction writePandocNote(schema: Schema) {\n return (writer: ProsemirrorWriter, tok: PandocToken) => {\n // generate unique id\n const ref = uuidv4();\n\n // add note to notes collection (will be handled specially by closeNode b/c it\n // has schema.nodes.node type)\n writer.openNoteNode(ref);\n writer.writeTokens(tok.c);\n const noteNode = writer.closeNode();\n\n // store json version of node in an attribute of the footnote (we can copy/paste)\n // between different documents\n const content = JSON.stringify(noteNode.content.toJSON());\n\n // add inline node to the body\n writer.addNode(schema.nodes.footnote, { ref, number: noteNode.attrs.number, content }, []);\n };\n}\n\nfunction footnoteCommandFn() {\n return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n if (!canInsertFootnote(state)) {\n return false;\n }\n if (dispatch) {\n const tr = state.tr;\n insertFootnote(tr);\n dispatch(tr);\n }\n return true;\n };\n}\n\nfunction footnoteOmniInsert(ui: EditorUI) {\n return {\n name: ui.context.translateText('Footnote'),\n description: ui.context.translateText('Note placed at the bottom of the page'),\n group: OmniInsertGroup.References,\n priority: 2,\n image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.footnote_dark! : ui.images.omni_insert?.footnote!),\n };\n}\n\nfunction canInsertFootnote(state: EditorState) {\n return (\n canInsertNode(state, state.schema.nodes.footnote) && !findParentNodeOfType(state.schema.nodes.note)(state.selection)\n );\n}\n\nfunction insertFootnote(\n tr: Transaction,\n edit = true,\n content?: Fragment | ProsemirrorNode | ProsemirrorNode[] | undefined,\n): string {\n // resolve content\n const schema = tr.doc.type.schema;\n if (!content) {\n content = schema.nodes.paragraph.create();\n }\n\n // generate note id\n const ref = uuidv4();\n\n // insert empty note\n const notes = findChildrenByType(tr.doc, schema.nodes.notes, true)[0];\n const note = schema.nodes.note.createAndFill({ ref }, content);\n tr.insert(notes.pos + 1, note as ProsemirrorNode);\n\n // insert footnote linked to note\n const footnote = schema.nodes.footnote.create({ ref });\n tr.replaceSelectionWith(footnote, false);\n\n // open note editor\n if (edit) {\n const noteNode = findNoteNode(tr.doc, ref);\n if (noteNode) {\n tr.setSelection(TextSelection.create(tr.doc, noteNode.pos + 1));\n }\n }\n\n // return ref\n return ref;\n}\n\nexport function selectedFootnote(selection: Selection): NodeWithPos | undefined {\n const schema = selection.$head.node().type.schema;\n return findSelectedNodeOfType(schema.nodes.footnote)(selection);\n}\n\nexport function selectedNote(selection: Selection): NodeWithPos | undefined {\n const schema = selection.$head.node().type.schema;\n return findParentNodeOfType(schema.nodes.note)(selection);\n}\n\nexport function findNoteNode(doc: ProsemirrorNode, ref: string): NodeWithPos | undefined {\n return findNodeOfTypeWithRef(doc, doc.type.schema.nodes.note, ref);\n}\n\nexport function findFootnoteNode(doc: ProsemirrorNode, ref: string): NodeWithPos | undefined {\n return findNodeOfTypeWithRef(doc, doc.type.schema.nodes.footnote, ref);\n}\n\nfunction findNodeOfTypeWithRef(doc: ProsemirrorNode, type: NodeType, ref: string): NodeWithPos | undefined {\n const foundNode = findChildren(doc, node => node.type === type && node.attrs.ref === ref, true);\n if (foundNode.length) {\n return foundNode[0];\n } else {\n return undefined;\n }\n}\n\nexport default extension;\n","/*\n * shortcode.ts\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport const kShortcodePattern = '(?:^|[^`])({{([%<])\\\\s+.*?[%>]}})';\nexport const kShortcodeRegEx = new RegExp(kShortcodePattern, 'g');\n","/*\n * footnote-editor.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorView, DecorationSet, NodeView } from 'prosemirror-view';\nimport { findParentNodeOfType, NodeWithPos, findChildrenByType, findChildren } from 'prosemirror-utils';\nimport { EditorState, TextSelection, Plugin, PluginKey, Transaction } from 'prosemirror-state';\n\nimport { nodeDecoration } from '../../api/decoration';\nimport { firstNode, lastNode } from '../../api/node';\nimport { selectionIsWithin } from '../../api/selection';\nimport { scrollIntoView } from '../../api/scroll';\n\nimport { findFootnoteNode, selectedFootnote, selectedNote } from './footnote';\n\nconst key = new PluginKey<DecorationSet>('footnote-editor-activate');\n\nexport function footnoteEditorActivationPlugin() {\n return new Plugin<DecorationSet>({\n key,\n state: {\n init(_config: { [key: string]: any }, instance: EditorState) {\n return DecorationSet.empty;\n },\n\n // whenever an edit affecting this mark type occurs then update the decorations\n apply(tr: Transaction, set: DecorationSet, oldState: EditorState, newState: EditorState) {\n if (selectedFootnote(newState.selection) || selectedNote(newState.selection)) {\n // if we are in the same note selection as before just return the set\n if (oldState.selection.$head.node() === newState.selection.$head.node()) {\n return set.map(tr.mapping, tr.doc);\n } else {\n return footnoteEditorDecorations(newState);\n }\n } else {\n return DecorationSet.empty;\n }\n },\n },\n props: {\n decorations(state: EditorState) {\n return key.getState(state);\n },\n },\n\n view: () => ({\n // scroll footnote into view (if necessary) when note editor is active\n update: (view: EditorView) => {\n const note = selectedNote(view.state.selection);\n if (note) {\n const footnote = findFootnoteNode(view.state.doc, note.node.attrs.ref);\n if (footnote) {\n scrollIntoView(view, footnote.pos, false, 0, 30);\n }\n }\n },\n }),\n });\n}\n\n// selection-driven decorations (mostly css classes) required to activate the footnote editor\nfunction footnoteEditorDecorations(state: EditorState) {\n const schema = state.schema;\n\n // see if either a footnote node or note (footnote editor) node has the selection\n let footnoteNode = selectedFootnote(state.selection);\n let noteNode = selectedNote(state.selection);\n\n // if they do then we need to enable footnote editing/behavior by\n // using decorators to inject appropriate css classes\n if (footnoteNode || noteNode) {\n // get body and notes nodes\n const bodyNode = findChildrenByType(state.doc, schema.nodes.body)[0];\n const notesNode = findChildrenByType(state.doc, schema.nodes.notes)[0];\n\n // resolve the specific footnote node or specific note node\n if (footnoteNode) {\n const ref = footnoteNode.node.attrs.ref;\n const matching = findChildren(notesNode.node, node => node.attrs.ref === ref);\n if (matching.length) {\n noteNode = matching[0];\n noteNode.pos = notesNode.pos + 1 + noteNode.pos;\n }\n } else if (noteNode) {\n const ref = noteNode.node.attrs.ref;\n const matching = findChildren(\n state.doc,\n node => node.type === schema.nodes.footnote && node.attrs.ref === ref,\n true,\n );\n if (matching.length) {\n footnoteNode = matching[0];\n }\n }\n\n if (footnoteNode && noteNode) {\n return DecorationSet.create(state.doc, [\n // make notes node visible\n nodeDecoration(noteNode, { class: 'active' }),\n\n // paint outline over footnote\n nodeDecoration(footnoteNode, { class: 'active pm-selected-node-outline-color' }),\n\n // position body and notes nodes for footnote editing\n nodeDecoration(bodyNode, { class: 'editing-footnote pm-pane-border-color' }),\n nodeDecoration(notesNode, { class: 'editing-footnote pm-pane-border-color' }),\n ]);\n } else {\n return DecorationSet.empty;\n }\n } else {\n return DecorationSet.empty;\n }\n}\n\n// node view that display the note number alongside the note content\nexport function footnoteEditorNodeViews() {\n return {\n note(node: ProsemirrorNode, view: EditorView, getPos: boolean | (() => number)) {\n return new NoteEditorView(node, view, getPos as () => number);\n },\n };\n}\n\nclass NoteEditorView implements NodeView {\n public readonly dom: HTMLElement;\n public readonly contentDOM: HTMLElement;\n\n private readonly node: ProsemirrorNode;\n private readonly view: EditorView;\n private readonly getPos: () => number;\n\n constructor(node: ProsemirrorNode, view: EditorView, getPos: () => number) {\n this.node = node;\n this.view = view;\n this.getPos = getPos;\n\n this.dom = window.document.createElement('div');\n this.dom.setAttribute('data-ref', this.node.attrs.ref);\n this.dom.classList.add('note');\n\n const label = window.document.createElement('div');\n label.classList.add('note-label');\n label.contentEditable = 'false';\n label.innerHTML = `<p>${this.node.attrs.number}:</p>`;\n this.dom.appendChild(label);\n\n const content = window.document.createElement('div');\n content.classList.add('note-content');\n this.contentDOM = content;\n this.dom.appendChild(content);\n }\n}\n\n// custom handling for arrow keys that cause selection to escape the editor\nexport function footnoteEditorKeyDownHandler() {\n return (view: EditorView, event: KeyboardEvent) => {\n // alias schema & selection\n const schema = view.state.schema;\n const selection = view.state.selection;\n\n // pass if the selection isn't in a note\n const noteNode: NodeWithPos | undefined = findParentNodeOfType(schema.nodes.note)(selection);\n if (!noteNode) {\n return false;\n }\n\n // function to find and move selection to associated footnote\n // will call this from Escape, ArrowLeft, and ArrowUp handlers below\n const selectFootnote = (before = true) => {\n const footnoteNode = findFootnoteNode(view.state.doc, noteNode.node.attrs.ref);\n if (footnoteNode) {\n const tr = view.state.tr;\n tr.setSelection(TextSelection.near(tr.doc.resolve(footnoteNode.pos + (before ? 0 : 1))));\n view.dispatch(tr);\n }\n };\n\n // if this is the Escape key then close the editor\n if (event.key === 'Escape') {\n selectFootnote();\n return true;\n }\n\n // ...otherwise check to see if the user is attempting to arrow out of the footnote\n\n // get first and last text block nodes (bail if we aren't in either)\n const firstTextBlock = firstNode(noteNode, node => node.isTextblock);\n const lastTextBlock = lastNode(noteNode, node => node.isTextblock);\n if (!firstTextBlock && !lastTextBlock) {\n return false;\n }\n\n // exiting from first text block w/ left or up arrow?\n if (firstTextBlock) {\n if (selectionIsWithin(selection, firstTextBlock)) {\n switch (event.key) {\n case 'ArrowLeft':\n if (selection.anchor === firstTextBlock.pos + 1) {\n selectFootnote(true);\n return true;\n }\n break;\n case 'ArrowUp': {\n if (view.endOfTextblock('up')) {\n selectFootnote(true);\n return true;\n }\n break;\n }\n }\n }\n }\n\n // exiting from last text block with right or down arrow?\n if (lastTextBlock) {\n if (selectionIsWithin(selection, lastTextBlock)) {\n switch (event.key) {\n case 'ArrowRight':\n if (selection.anchor === lastTextBlock.pos + lastTextBlock.node.nodeSize - 1) {\n selectFootnote(false);\n return true;\n }\n break;\n case 'ArrowDown': {\n if (view.endOfTextblock('down')) {\n selectFootnote(false);\n return true;\n }\n break;\n }\n }\n }\n }\n\n return false;\n };\n}\n","/*\n * footnote-transaction.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Fragment, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { Transaction, EditorState, TextSelection } from 'prosemirror-state';\nimport {\n findChildrenByType,\n NodeWithPos,\n findSelectedNodeOfType,\n ContentNodeWithPos,\n findParentNodeOfType,\n} from 'prosemirror-utils';\nimport { Transform } from 'prosemirror-transform';\n\nimport { uuidv4 } from '../../api/util';\n\nimport { findNoteNode, selectedNote } from './footnote';\nimport { trTransform } from '../../api/transaction';\n\n// examine transactions and filter out attempts to place foonotes within note bodies\n// (this is not allowed by pandoc markdown)\nexport function footnoteFilterTransaction() {\n return (tr: Transaction, state: EditorState) => {\n const noteWithPos = selectedNote(tr.selection);\n if (noteWithPos && findChildrenByType(noteWithPos.node, state.schema.nodes.footnote).length) {\n return false;\n }\n return true;\n };\n}\n\n// examine editor transactions and append a transaction that handles fixup of footnote numbers,\n// importing of pasted footnotes, selection propagation to the footnote editor, etc.\nexport function footnoteAppendTransaction() {\n const footnoteChange = (node: ProsemirrorNode) => {\n const schema = node.type.schema;\n return node.type === schema.nodes.footnote || node.type === schema.nodes.note;\n };\n\n return {\n name: 'footnote-renumber',\n nodeFilter: footnoteChange,\n append: (tr: Transaction) => {\n const schema = tr.doc.type.schema;\n const activeNote = findParentNodeOfType(schema.nodes.note)(tr.selection);\n trTransform(tr, footnoteFixupTransform(activeNote));\n },\n };\n}\n\nfunction footnoteFixupTransform(activeNote: ContentNodeWithPos | undefined) {\n return (tr: Transform) => {\n // query for notes and footnotes. note that since these are computed at the beginning\n // before any steps are applied, we always need to map their positions before using them\n const schema = tr.doc.type.schema;\n const footnotes = findAllFootnotes(tr.doc);\n const allNotes = findAllNotes(tr.doc);\n\n // iterate through footnotes in the newState\n const refs = new Set<string>();\n footnotes.forEach((footnote, index) => {\n // map position\n footnote.pos = tr.mapping.map(footnote.pos);\n\n // footnote number\n const number = index + 1;\n\n // alias ref and content (either or both may be updated)\n let { ref, content } = footnote.node.attrs;\n\n // we may be creating a new note to append\n let newNote: any;\n\n // get reference to note (if any)\n const note = allNotes.find(noteWithPos => noteWithPos.node.attrs.ref === ref);\n\n // matching note found\n if (note) {\n // map position since we scanned for all of the notes at the top and we may\n // have called tr.insert for a new note below which would have invalidated\n // the positions\n note.pos = tr.mapping.map(note.pos);\n\n // update content if this is a note edit (used to propagate user edits back to data-content)\n if (activeNote && activeNote.node.attrs.ref === ref) {\n content = JSON.stringify(note.node.content.toJSON());\n }\n\n // if we've already processed this ref then it's a duplicate, make a copy w/ a new ref/id\n if (refs.has(ref)) {\n // create a new unique id and change the ref to it\n ref = uuidv4();\n\n // create and insert new note with this id\n newNote = schema.nodes.note.createAndFill({ ref, number }, note.node.content);\n\n // otherwise update the note with the correct number (if necessary)\n } else {\n if (note.node.attrs.number !== number) {\n tr.setNodeMarkup(note.pos, schema.nodes.note, {\n ...note.node.attrs,\n number,\n });\n }\n }\n\n // if there is no note then create one using the content attr\n // (this can happen for a copy/paste operation from another document)\n } else if (content) {\n newNote = schema.nodes.note.createAndFill({ ref, number }, Fragment.fromJSON(schema, JSON.parse(content)));\n }\n\n // insert newNote if necessary\n if (newNote) {\n const notesContainer = findNotesContainer(tr.doc);\n tr.insert(notesContainer.pos + 1, newNote as ProsemirrorNode);\n }\n\n // indicate that we've seen this ref\n refs.add(ref);\n\n // set new footnote markup if necessary\n const attrs = footnote.node.attrs;\n if (ref !== attrs.ref || content !== attrs.content || number !== attrs.number) {\n tr.setNodeMarkup(footnote.pos, schema.nodes.footnote, {\n ...footnote.node.attrs,\n ref,\n content,\n number,\n });\n }\n });\n\n // remove ophraned notes\n for (let i = allNotes.length - 1; i >= 0; i--) {\n const note = allNotes[i];\n note.pos = tr.mapping.map(note.pos);\n const footnote = footnotes.find(fn => fn.node.attrs.ref === note.node.attrs.ref);\n if (!footnote) {\n tr.delete(note.pos, note.pos + note.node.nodeSize);\n }\n }\n };\n}\n\nexport function footnoteSelectNoteAppendTransaction() {\n return (_transactions: Transaction[], _oldState: EditorState, newState: EditorState) => {\n const schema = newState.schema;\n const footnoteNode: NodeWithPos | undefined = findSelectedNodeOfType(schema.nodes.footnote)(newState.selection);\n if (footnoteNode) {\n const tr = newState.tr;\n const ref = footnoteNode.node.attrs.ref;\n const noteNode = findNoteNode(tr.doc, ref);\n if (noteNode) {\n tr.setSelection(TextSelection.near(tr.doc.resolve(noteNode.pos)));\n }\n return tr;\n }\n };\n}\n\nfunction findAllFootnotes(doc: ProsemirrorNode) {\n const schema = doc.type.schema;\n return findChildrenByType(doc, schema.nodes.footnote, true);\n}\n\nfunction findAllNotes(doc: ProsemirrorNode) {\n const schema = doc.type.schema;\n const notesContainer = findNotesContainer(doc);\n const offset = notesContainer.pos + 1;\n const notes = findChildrenByType(notesContainer.node, schema.nodes.note, false);\n return notes.map(note => ({ ...note, pos: note.pos + offset }));\n}\n\nfunction findNotesContainer(doc: ProsemirrorNode) {\n return findChildrenByType(doc, doc.type.schema.nodes.notes, false)[0];\n}\n","/*\n * raw_block.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema, NodeType } from 'prosemirror-model';\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { setBlockType } from 'prosemirror-commands';\n\nimport { findParentNode } from 'prosemirror-utils';\n\nimport { Extension, ExtensionContext } from '../api/extension';\n\nimport {\n PandocOutput,\n PandocToken,\n PandocTokenType,\n ProsemirrorWriter,\n kRawBlockContent,\n kRawBlockFormat,\n} from '../api/pandoc';\nimport { ProsemirrorCommand, EditorCommandId } from '../api/command';\n\nimport { EditorUI } from '../api/ui';\nimport { isSingleLineHTML } from '../api/html';\nimport { kHTMLFormat, kTexFormat, editRawBlockCommand, isRawHTMLFormat } from '../api/raw';\nimport { OmniInsert, OmniInsertGroup } from '../api/omni_insert';\nimport { kRawInlineFormat, kRawInlineContent } from '../marks/raw_inline/raw_inline';\n\nconst extension = (context: ExtensionContext): Extension | null => {\n const { pandocExtensions, pandocCapabilities, ui } = context;\n\n const rawAttribute = pandocExtensions.raw_attribute;\n\n return {\n nodes: [\n {\n name: 'raw_block',\n spec: {\n content: 'text*',\n group: 'block',\n marks: '',\n code: true,\n defining: true,\n isolating: true,\n attrs: {\n format: {},\n },\n parseDOM: [\n {\n tag: \"div[class*='raw-block']\",\n preserveWhitespace: 'full',\n getAttrs: (node: Node | string) => {\n const el = node as Element;\n return {\n format: el.getAttribute('data-format'),\n };\n },\n },\n ],\n toDOM(node: ProsemirrorNode) {\n return [\n 'div',\n {\n class: 'raw-block pm-fixedwidth-font pm-code-block pm-markup-text-color',\n 'data-format': node.attrs.format,\n },\n 0,\n ];\n },\n },\n\n code_view: {\n lang: (node: ProsemirrorNode) => {\n return node.attrs.format;\n },\n attrEditFn: rawAttribute ? editRawBlockCommand(ui, pandocCapabilities.output_formats) : undefined,\n borderColorClass: 'pm-raw-block-border',\n },\n\n attr_edit: () => ({\n type: (schema: Schema) => schema.nodes.raw_block,\n tags: (node: ProsemirrorNode) => [node.attrs.format],\n editFn: rawAttribute\n ? () => editRawBlockCommand(ui, pandocCapabilities.output_formats)\n : () => (state: EditorState) => false,\n }),\n\n pandoc: {\n readers: [\n {\n token: PandocTokenType.RawBlock,\n block: 'raw_block',\n },\n ],\n\n // ensure that usethis badges comment ends up in it's own block\n preprocessor: (markdown: string) => {\n return markdown.replace(/([^\\n])(\\n^<!-- badges: end -->$)/gm, (_match, p1, p2) => {\n return p1 + '\\n' + p2;\n });\n },\n\n // we define a custom blockReader here so that we can convert html and tex blocks with\n // a single line of code into paragraph with a raw inline\n blockReader: (schema: Schema, tok: PandocToken, writer: ProsemirrorWriter) => {\n if (tok.t === PandocTokenType.RawBlock) {\n readPandocRawBlock(schema, tok, writer);\n return true;\n } else if (isParagraphWrappingMultilineRaw(tok)) {\n const rawTok = tok.c[0];\n const format = rawTok.c[kRawBlockFormat];\n const content = rawTok.c[kRawBlockContent];\n writer.addNode(schema.nodes.raw_block, { format }, [schema.text(content)]);\n return true;\n } else if (isParagraphWrappingLatexBeginOrEnd(tok)) {\n writer.addNode(schema.nodes.raw_block, { format: kTexFormat }, [schema.text(tok.c[0].c)]);\n return true;\n } else if (isParagraphWrappingRawLatexBeginOrEnd(tok)) {\n writer.addNode(schema.nodes.raw_block, { format: kTexFormat }, [schema.text(tok.c[0].c[kRawInlineContent])]);\n return true;\n } else {\n return false;\n }\n },\n writer: (output: PandocOutput, node: ProsemirrorNode) => {\n if (!pandocExtensions.raw_attribute || node.textContent.trim() === '<!-- -->') {\n output.writeToken(PandocTokenType.Para, () => {\n output.writeRawMarkdown(node.textContent);\n });\n\n // raw block with embedded ``` (e.g. a commented out Rmd code chunk) needs\n // extra backticks on the outside to prevent the rmd chunk end backticks\n // from being considered the end of the raw html block.\n } else if (node.textContent.includes(\"\\n```\")) {\n // find the ``` standing by itself on a line\n const matches: RegExpExecArray[] = [];\n const embeddedTickRegEx = /\\n(`{3,})\\s*?\\n/g;\n embeddedTickRegEx.lastIndex = 0;\n let match: RegExpExecArray | null = null;\n // tslint:disable-next-line no-conditional-assignment\n while (match = embeddedTickRegEx.exec(node.textContent)) {\n matches.push(match);\n }\n embeddedTickRegEx.lastIndex = 0;\n const matchRev = matches.reverse();\n const ticks = (matchRev.length > 0 ? matchRev[0][1] : \"```\") + \"`\";\n output.writeToken(PandocTokenType.Para, () => {\n output.writeRawMarkdown(`${ticks}{=${node.attrs.format}}\\n${node.textContent}\\n${ticks}\\n`);\n });\n } else {\n output.writeToken(PandocTokenType.RawBlock, () => {\n output.write(node.attrs.format);\n output.write(node.textContent);\n });\n }\n },\n },\n },\n ],\n\n commands: (schema: Schema) => {\n const commands: ProsemirrorCommand[] = [];\n\n commands.push(\n new FormatRawBlockCommand(EditorCommandId.HTMLBlock, kHTMLFormat, schema.nodes.raw_block, {\n name: ui.context.translateText('HTML Block'),\n description: ui.context.translateText('Raw HTML content'),\n group: OmniInsertGroup.Blocks,\n priority: 6,\n image: () =>\n ui.prefs.darkMode() ? ui.images.omni_insert?.html_block_dark! : ui.images.omni_insert?.html_block!,\n }),\n );\n\n if (pandocExtensions.raw_tex) {\n commands.push(\n new FormatRawBlockCommand(EditorCommandId.TexBlock, kTexFormat, schema.nodes.raw_block, {\n name: ui.context.translateText('TeX Block'),\n description: ui.context.translateText('Raw TeX content'),\n group: OmniInsertGroup.Blocks,\n priority: 5,\n image: () =>\n ui.prefs.darkMode() ? ui.images.omni_insert?.tex_block_dark! : ui.images.omni_insert?.tex_block!,\n }),\n );\n }\n\n if (rawAttribute) {\n commands.push(new RawBlockCommand(ui, pandocCapabilities.output_formats));\n }\n\n return commands;\n },\n };\n};\n\nfunction readPandocRawBlock(schema: Schema, tok: PandocToken, writer: ProsemirrorWriter) {\n // single lines of html should be read as inline html (allows for\n // highlighting and more seamless editing experience)\n const format = tok.c[kRawBlockFormat];\n const text = tok.c[kRawBlockContent] as string;\n const textTrimmed = text.trimRight();\n if (isRawHTMLFormat(format) && isSingleLineHTML(textTrimmed) && writer.hasInlineHTMLWriter(textTrimmed)) {\n writer.openNode(schema.nodes.paragraph, {});\n writer.writeInlineHTML(textTrimmed);\n writer.closeNode();\n\n // similarly, single lines of tex (that aren't begin or end) should be read as inline tex\n } else if (format === kTexFormat && readAsInlineTex(textTrimmed)) {\n writer.openNode(schema.nodes.paragraph, {});\n const rawTexMark = schema.marks.raw_tex.create();\n writer.openMark(rawTexMark);\n writer.writeText(textTrimmed);\n writer.closeMark(rawTexMark);\n writer.closeNode();\n } else {\n writer.openNode(schema.nodes.raw_block, { format });\n writer.writeText(text);\n writer.closeNode();\n }\n}\n\n\nexport function readAsInlineTex(tex: string) {\n tex = tex.trimRight();\n if (tex.split('\\n').length === 1){\n return !isLatexBeginOrEnd(tex);\n } else {\n return false;\n }\n}\n\nfunction isParagraphWrappingMultilineRaw(tok: PandocToken) {\n return isSingleChildParagraph(tok) && \n tok.c[0].t === PandocTokenType.RawInline &&\n isMultilineString(tok.c[0].c[kRawBlockContent]);\n}\n\nfunction isParagraphWrappingLatexBeginOrEnd(tok: PandocToken) {\n return isSingleChildParagraph(tok) &&\n tok.c[0].t === PandocTokenType.Str &&\n isLatexBeginOrEnd(tok.c[0].c);\n}\n\nfunction isParagraphWrappingRawLatexBeginOrEnd(tok: PandocToken) {\n return isSingleChildParagraph(tok) &&\n (tok.c[0].t === PandocTokenType.RawInline &&\n tok.c[0].c[kRawInlineFormat] === kTexFormat &&\n isLatexBeginOrEnd(tok.c[0].c[kRawInlineContent]));\n}\n\nfunction isLatexBeginOrEnd(str: string) {\n return str && str.trimLeft().match(/\\\\(begin|end)/);\n}\n\nfunction isSingleChildParagraph(tok: PandocToken) {\n return tok.t === PandocTokenType.Para && tok.c && tok.c.length === 1;\n}\n\nfunction isMultilineString(str: string) {\n return str.indexOf('\\n') !== -1;\n}\n\n// base class for format specific raw block commands (e.g. html/tex)\nclass FormatRawBlockCommand extends ProsemirrorCommand {\n private format: string;\n private nodeType: NodeType;\n\n constructor(id: EditorCommandId, format: string, nodeType: NodeType, omniInsert?: OmniInsert) {\n super(\n id,\n [],\n (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n if (!this.isActive(state) && !setBlockType(this.nodeType, { format })(state)) {\n return false;\n }\n\n if (dispatch) {\n const schema = state.schema;\n if (this.isActive(state)) {\n setBlockType(schema.nodes.paragraph)(state, dispatch);\n } else {\n setBlockType(this.nodeType, { format })(state, dispatch);\n }\n }\n\n return true;\n },\n omniInsert,\n );\n this.format = format;\n this.nodeType = nodeType;\n }\n\n public isActive(state: EditorState) {\n return !!findParentNode(node => node.type === this.nodeType && node.attrs.format === this.format)(state.selection);\n }\n}\n\n// generic raw block command (shows dialog to allow choosing from among raw formats)\nclass RawBlockCommand extends ProsemirrorCommand {\n constructor(ui: EditorUI, outputFormats: string[]) {\n super(EditorCommandId.RawBlock, [], editRawBlockCommand(ui, outputFormats), {\n name: ui.context.translateText('Raw Block...'),\n description: ui.context.translateText('Raw content block'),\n group: OmniInsertGroup.Blocks,\n priority: 4,\n image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.raw_block_dark! : ui.images.omni_insert?.raw_block!),\n });\n }\n}\n\nexport default extension;\n","/*\n * yaml_metadata.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, DOMOutputSpec, ParseRule } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { ExtensionContext, Extension } from '../../api/extension';\nimport { PandocOutput, PandocTokenType } from '../../api/pandoc';\nimport { EditorUI } from '../../api/ui';\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { canInsertNode } from '../../api/node';\nimport { codeNodeSpec } from '../../api/code';\nimport { selectionIsBodyTopLevel } from '../../api/selection';\nimport { yamlMetadataTitlePlugin } from './yaml_metadata-title';\nimport { yamlMetadataBlockCapsuleFilter } from './yaml_metadata-capsule';\nimport { OmniInsertGroup } from '../../api/omni_insert';\nimport { fragmentText } from '../../api/fragment';\nimport { stripYamlDelimeters } from '../../api/yaml';\n\nconst extension = (context: ExtensionContext): Extension => {\n const { ui } = context;\n\n return {\n nodes: [\n {\n name: 'yaml_metadata',\n\n spec: {\n ...codeNodeSpec(),\n attrs: {\n navigation_id: { default: null },\n },\n parseDOM: [\n {\n tag: \"div[class*='yaml-block']\",\n preserveWhitespace: 'full',\n } as ParseRule,\n ],\n toDOM(node: ProsemirrorNode): DOMOutputSpec {\n return ['div', { class: 'yaml-block pm-code-block' }, 0];\n },\n },\n\n code_view: {\n lang: () => 'yaml-frontmatter',\n classes: ['pm-metadata-background-color', 'pm-yaml-metadata-block'],\n },\n\n pandoc: {\n blockCapsuleFilter: yamlMetadataBlockCapsuleFilter(),\n\n writer: (output: PandocOutput, node: ProsemirrorNode) => {\n output.writeToken(PandocTokenType.Para, () => {\n const yaml = '---\\n' + stripYamlDelimeters(fragmentText(node.content)) + '\\n---';\n output.writeRawMarkdown(yaml);\n });\n },\n },\n },\n ],\n\n commands: () => {\n return [new YamlMetadataCommand(ui)];\n },\n\n plugins: () => [yamlMetadataTitlePlugin()],\n };\n};\n\nclass YamlMetadataCommand extends ProsemirrorCommand {\n constructor(ui: EditorUI) {\n super(\n EditorCommandId.YamlMetadata,\n [],\n (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n const schema = state.schema;\n\n if (!canInsertNode(state, schema.nodes.yaml_metadata)) {\n return false;\n }\n\n // only allow inserting at the top level\n if (!selectionIsBodyTopLevel(state.selection)) {\n return false;\n }\n\n // create yaml metadata text\n if (dispatch) {\n const tr = state.tr;\n const kYamlLeading = '---\\n';\n const kYamlTrailing = '\\n---';\n const yamlText = schema.text(kYamlLeading + kYamlTrailing);\n const yamlNode = schema.nodes.yaml_metadata.create({}, yamlText);\n tr.replaceSelectionWith(yamlNode);\n setTextSelection(tr.mapping.map(state.selection.from) - kYamlTrailing.length - 1)(tr);\n dispatch(tr);\n }\n\n return true;\n },\n {\n name: ui.context.translateText('YAML'),\n description: ui.context.translateText('YAML metadata block'),\n group: OmniInsertGroup.Blocks,\n priority: 3,\n selectionOffset: -4,\n image: () =>\n ui.prefs.darkMode() ? ui.images.omni_insert?.yaml_block_dark! : ui.images.omni_insert?.yaml_block!,\n },\n );\n }\n}\n\nexport default extension;\n","/*\n * yaml_metadata-capsule.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\n\nimport { ProsemirrorWriter } from '../../api/pandoc';\nimport { uuidv4 } from '../../api/util';\nimport {\n encodedBlockCapsuleRegex,\n blockCapsuleSourceWithoutPrefix,\n PandocBlockCapsule,\n blockCapsuleParagraphTokenHandler,\n blockCapsuleTextHandler,\n} from '../../api/pandoc_capsule';\n\nconst kYamlBlocksRegex = /(^)(---[ \\t]*\\n(?![ \\t]*\\n)[\\W\\w]*?\\n(?:---|\\.\\.\\.))([ \\t]*)$/gm;\n\nconst kYamlDiscardRegex = /^([\\t >]*)`{3,}/m;\n\nexport function yamlMetadataBlockCapsuleFilter() {\n const kYamlMetadataCapsuleType = 'E1819605-0ACD-4FAE-8B99-9C1B7BD7C0F1'.toLowerCase();\n\n return {\n type: kYamlMetadataCapsuleType,\n\n match: kYamlBlocksRegex,\n\n // if there was an unterminated yaml block inside a code block (followed by more yaml,\n // perhaps in yet another code block) then the main regex eats the code block boundary.\n // provide a discard expression that excludes any yaml block that has what appears\n // to be a fenced code block boundary\n discard: kYamlDiscardRegex,\n\n // add a newline to ensure that if the metadata block has text right\n // below it we still end up in our own pandoc paragarph block\n enclose: (capsuleText: string) => capsuleText + '\\n',\n // globally replace any instances of our block capsule found in text\n handleText: blockCapsuleTextHandler(\n kYamlMetadataCapsuleType,\n encodedBlockCapsuleRegex(undefined, '\\\\n', 'gm'),\n (text: string) => text.substring(0, text.length - 1), // trim off newline\n ),\n\n // we are looking for a paragraph token consisting entirely of a\n // block capsule of our type. if find that then return the block\n // capsule text\n handleToken: blockCapsuleParagraphTokenHandler(kYamlMetadataCapsuleType),\n\n // write as yaml_metadata\n writeNode: (schema: Schema, writer: ProsemirrorWriter, capsule: PandocBlockCapsule) => {\n writer.openNode(schema.nodes.yaml_metadata, {\n navigation_id: uuidv4(),\n md_index: capsule.position,\n });\n // write the lines w/o the source-level prefix\n writer.writeText(blockCapsuleSourceWithoutPrefix(capsule.source, capsule.prefix));\n writer.closeNode();\n },\n };\n}\n","/*\n * rmd_chunk.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\n\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { PandocOutput, PandocTokenType } from '../../api/pandoc';\n\nimport { codeNodeSpec } from '../../api/code';\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\n\nimport { EditorUI } from '../../api/ui';\nimport { kBookdownDocType } from '../../api/format';\nimport { rmdChunk, insertRmdChunk } from '../../api/rmd';\nimport { OmniInsertGroup } from '../../api/omni_insert';\n\nimport { RmdChunkImagePreviewPlugin } from './rmd_chunk-image';\nimport { rmdChunkBlockCapsuleFilter } from './rmd_chunk-capsule';\n\nimport './rmd_chunk-styles.css';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nconst extension = (context: ExtensionContext): Extension | null => {\n const { ui, options, format } = context;\n\n if (!format.rmdExtensions.codeChunks) {\n return null;\n }\n\n return {\n nodes: [\n {\n name: 'rmd_chunk',\n spec: {\n ...codeNodeSpec(),\n attrs: {\n navigation_id: { default: null },\n md_index: { default: 0 },\n },\n parseDOM: [\n {\n tag: \"div[class*='rmd-chunk']\",\n preserveWhitespace: 'full',\n },\n ],\n toDOM(node: ProsemirrorNode) {\n return ['div', { class: 'rmd-chunk pm-code-block' }, 0];\n },\n },\n\n code_view: {\n firstLineMeta: true,\n lineNumbers: true,\n lineNumberFormatter: (lineNumber: number, lineCount?: number, line?: string) => {\n if (lineNumber === 1) {\n return '';\n } else {\n return lineNumber - 1 + '';\n }\n },\n bookdownTheorems: format.docTypes.includes(kBookdownDocType),\n classes: ['pm-chunk-background-color'],\n lang: (_node: ProsemirrorNode, content: string) => {\n const match = content.match(/^\\{([a-zA-Z0-9_]+)/);\n if (match) {\n return match[1];\n } else {\n return null;\n }\n },\n createFromPastePattern: /^\\{([a-zA-Z0-9_]+).*}.*?\\n/m,\n },\n\n pandoc: {\n blockCapsuleFilter: rmdChunkBlockCapsuleFilter(),\n\n writer: (output: PandocOutput, node: ProsemirrorNode) => {\n output.writeToken(PandocTokenType.Para, () => {\n const parts = rmdChunk(node.textContent);\n if (parts) {\n output.writeRawMarkdown(parts.delimiter + '{' + parts.meta + '}\\n' + parts.code + parts.delimiter + '\\n');\n }\n });\n },\n },\n },\n ],\n\n commands: (_schema: Schema) => {\n const commands = [\n new RChunkCommand(ui),\n new PythonChunkCommand(ui),\n new BashChunkCommand(ui),\n new RcppChunkCommand(ui),\n new SQLChunkCommand(ui),\n new D3ChunkCommand(ui),\n new StanChunkCommand(ui),\n new ExpandAllChunksCommand(ui),\n new CollapseAllChunksCommand(ui)\n ];\n return commands;\n },\n\n plugins: (_schema: Schema) => {\n if (options.rmdImagePreview) {\n return [new RmdChunkImagePreviewPlugin(ui.context)];\n } else {\n return [];\n }\n },\n };\n};\n\nclass RmdChunkCommand extends ProsemirrorCommand {\n constructor(\n ui: EditorUI,\n id: EditorCommandId,\n keymap: string[],\n priority: number,\n lang: string,\n placeholder: string,\n image: () => string,\n group = OmniInsertGroup.Chunks\n ) {\n super(id, keymap, insertRmdChunk(placeholder), {\n name: `${lang} ${ui.context.translateText('Code Chunk')}`,\n description: `${ui.context.translateText('Executable')} ${lang} ${ui.context.translateText('chunk')}`,\n group,\n priority,\n image\n });\n }\n}\n\nclass RChunkCommand extends RmdChunkCommand {\n constructor(ui: EditorUI) {\n super(ui, EditorCommandId.RCodeChunk, ['Mod-Alt-i'], 10, 'R', '{r}\\n', () =>\n ui.prefs.darkMode() ? ui.images.omni_insert!.r_chunk_dark! : ui.images.omni_insert!.r_chunk!,\n OmniInsertGroup.Common\n );\n }\n}\n\nclass PythonChunkCommand extends RmdChunkCommand {\n constructor(ui: EditorUI) {\n super(\n ui,\n EditorCommandId.PythonCodeChunk,\n [],\n 8,\n 'Python',\n '{python}\\n',\n () => ui.images.omni_insert!.python_chunk!,\n OmniInsertGroup.Common\n );\n }\n}\n\nclass BashChunkCommand extends RmdChunkCommand {\n constructor(ui: EditorUI) {\n super(ui, EditorCommandId.BashCodeChunk, [], 7, 'Bash', '{bash}\\n', () =>\n ui.prefs.darkMode() ? ui.images.omni_insert!.bash_chunk_dark! : ui.images.omni_insert!.bash_chunk!,\n );\n }\n}\n\nclass RcppChunkCommand extends RmdChunkCommand {\n constructor(ui: EditorUI) {\n super(ui, EditorCommandId.RcppCodeChunk, [], 6, 'Rcpp', '{Rcpp}\\n', () =>\n ui.prefs.darkMode() ? ui.images.omni_insert!.rcpp_chunk_dark! : ui.images.omni_insert!.rcpp_chunk!,\n );\n }\n}\n\nclass SQLChunkCommand extends RmdChunkCommand {\n constructor(ui: EditorUI) {\n super(\n ui,\n EditorCommandId.SQLCodeChunk,\n [],\n 5,\n 'SQL',\n '{sql connection=}\\n',\n () => ui.images.omni_insert!.sql_chunk!,\n OmniInsertGroup.Chunks\n );\n }\n}\n\nclass D3ChunkCommand extends RmdChunkCommand {\n constructor(ui: EditorUI) {\n super(ui, EditorCommandId.D3CodeChunk, [], 4, 'D3', '{d3 data=}\\n', () => ui.images.omni_insert!.d3_chunk!, OmniInsertGroup.Chunks);\n }\n}\n\nclass StanChunkCommand extends RmdChunkCommand {\n constructor(ui: EditorUI) {\n super(\n ui,\n EditorCommandId.StanCodeChunk,\n [],\n 7,\n 'Stan',\n '{stan output.var=}\\n',\n () => ui.images.omni_insert!.stan_chunk!,\n OmniInsertGroup.Chunks\n );\n }\n}\n\nclass ChunkExpansionCommand extends ProsemirrorCommand {\n constructor(\n ui: EditorUI,\n id: EditorCommandId,\n keymap: string[],\n expand: boolean\n ) {\n super(id, keymap, (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => \n {\n if (dispatch) {\n ui.chunks.setChunksExpanded(expand);\n }\n return true;\n });\n }\n}\n\nclass ExpandAllChunksCommand extends ChunkExpansionCommand {\n constructor(ui: EditorUI) {\n super(ui, EditorCommandId.ExpandAllChunks, [], true);\n }\n}\n\nclass CollapseAllChunksCommand extends ChunkExpansionCommand {\n constructor(ui: EditorUI) {\n super(ui, EditorCommandId.CollapseAllChunks, [], false);\n }\n}\n\nexport default extension;\n","/*\n * rmd_chunk-image.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { Plugin, PluginKey, Transaction, EditorState } from 'prosemirror-state';\nimport { DecorationSet, Decoration, EditorView } from 'prosemirror-view';\n\nimport { findChildrenByType, setTextSelection } from 'prosemirror-utils';\n\nimport { transactionsAreTypingChange, transactionsHaveChange } from '../../api/transaction';\nimport { EditorUIContext } from '../../api/ui';\nimport { stripQuotes } from '../../api/text';\nimport { onElementRemoved } from '../../api/dom';\n\nconst key = new PluginKey<DecorationSet>('rmd-chunk-image-preview');\n\nexport class RmdChunkImagePreviewPlugin extends Plugin<DecorationSet> {\n constructor(uiContext: EditorUIContext) {\n super({\n key,\n state: {\n init: (_config: { [key: string]: any }, state: EditorState) => {\n return imagePreviewDecorations(state, uiContext);\n },\n apply: (tr: Transaction, old: DecorationSet, oldState: EditorState, newState: EditorState) => {\n const transactions = [tr];\n\n // doc didn't change, return existing decorations\n if (!tr.docChanged) {\n return old.map(tr.mapping, tr.doc);\n\n // non-typing change, do a full rescan\n } else if (!transactionsAreTypingChange(transactions)) {\n return imagePreviewDecorations(newState, uiContext);\n\n // change that affects a rmd chunk block, do a full rescan\n } else if (transactionsHaveChange(transactions, oldState, newState, isRmdChunkNode)) {\n return imagePreviewDecorations(newState, uiContext);\n }\n\n // otherwise return the existing set (mapped)\n else {\n return old.map(tr.mapping, tr.doc);\n }\n },\n },\n props: {\n decorations: (state: EditorState) => {\n return key.getState(state);\n },\n },\n });\n }\n}\n\nfunction imagePreviewDecorations(state: EditorState, uiContext: EditorUIContext) {\n // find all rmd code chunks with knitr::include_graphics\n const decorations: Decoration[] = [];\n findChildrenByType(state.doc, state.schema.nodes.rmd_chunk).forEach(rmdChunk => {\n // look for a line with knitr::include_graphics\n const match = rmdChunk.node.textContent.match(/^(knitr::)?include_graphics\\((['\"])([^\\2]+)\\2/m);\n if (match) {\n // see if we can also find an out.width on the first line\n let width = '';\n const firstLine = rmdChunk.node.textContent.split(/\\r?\\n/)[0];\n const widthMatch = firstLine.match(/^\\s*\\{[r|R][, ].*out\\.width\\s*=\\s*([^ ,$]+).*}/);\n if (widthMatch) {\n width = stripQuotes(widthMatch[1].trim());\n // revert if they are using out.width = NULL\n if (width === 'NULL') {\n width = '';\n }\n }\n\n // see if we can find fig.align='center'\n const alignCenter = !!firstLine.match(/^\\s*\\{[r|R][, ].*fig\\.align\\s*=\\s*['\"]?center['\"]?/);\n\n const imagePath = match[3];\n const decoration = Decoration.widget(\n rmdChunk.pos + rmdChunk.node.nodeSize,\n (view: EditorView, getPos: () => number) => {\n const container = window.document.createElement('div');\n container.style.marginTop = '-1.5em'; // to bridge back to the codemirror block\n // which has a margin-block-end of 1em\n container.classList.add('pm-image-preview');\n container.classList.add('pm-block-border-color');\n const img = window.document.createElement('img');\n if (alignCenter) {\n img.classList.add('pm-image-centered');\n }\n\n img.src = uiContext.mapResourceToURL(imagePath);\n img.setAttribute('draggable', 'false');\n\n // watch for changes to the file\n const unsubscribe = uiContext.watchResource(imagePath, () => {\n img.src = uiContext.mapResourceToURL(imagePath);\n });\n onElementRemoved(view.dom, container, unsubscribe);\n\n if (width) {\n img.setAttribute('width', width);\n }\n img.draggable = false;\n img.onload = () => {\n img.alt = '';\n };\n img.onerror = () => {\n img.alt = ` ${uiContext.translateText('Image not found')}: ${imagePath}`;\n };\n // select rmd_chunk for clicks on the preview image\n img.onclick = () => {\n const tr = view.state.tr;\n setTextSelection(getPos() - 1)(tr);\n view.dispatch(tr);\n };\n container.append(img);\n return container;\n },\n { key: imagePath + 'width:' + width + 'center:' + alignCenter },\n );\n decorations.push(decoration);\n }\n });\n\n // return decorations\n return DecorationSet.create(state.doc, decorations);\n}\n\nfunction isRmdChunkNode(node: ProsemirrorNode) {\n return node.type === node.type.schema.nodes.rmd_chunk;\n}\n","/*\n * rmd_chunk-capsule.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\n\nimport { PandocBlockCapsule, parsePandocBlockCapsule, blockCapsuleSourceWithoutPrefix } from '../../api/pandoc_capsule';\nimport { PandocToken, PandocTokenType, ProsemirrorWriter } from '../../api/pandoc';\nimport { pandocAttrReadAST, kCodeBlockAttr, PandocAttr, kCodeBlockText } from '../../api/pandoc_attr';\nimport { uuidv4 } from '../../api/util';\n\nexport function rmdChunkBlockCapsuleFilter() {\n // (note that this constant is also defined in VisualMode.java)\n const kBlockCapsuleType = 'F3175F2A-E8A0-4436-BE12-B33925B6D220'.toLowerCase();\n const kBlockCapsuleTextRegEx = new RegExp('```' + kBlockCapsuleType + '\\\\n[ \\\\t>]*([^`]+)\\\\n[ \\\\t>]*```', 'g');\n\n return {\n type: kBlockCapsuleType,\n\n match: /^([\\t >]*)((```+)\\s*\\{[a-zA-Z0-9_]+(?: *[ ,].*?)?\\}[ \\t]*\\n(?:[\\t >]*\\3|[\\W\\w]*?\\n[\\t >]*\\3))([ \\t]*)$/gm,\n\n extract: (match: string, p1: string, p2: string, p3: string, p4: string) => {\n return {\n prefix: p1,\n source: p2,\n suffix: p4,\n };\n },\n\n // textually enclose the capsule so that pandoc parses it as the type of block we want it to\n // (in this case a code block). we use the capsule prefix here to make sure that the code block's\n // content and end backticks match the indentation level of the first line correctly\n enclose: (capsuleText: string, capsule: PandocBlockCapsule) =>\n '```' + kBlockCapsuleType + '\\n' + capsule.prefix + capsuleText + '\\n' + capsule.prefix + '```',\n // look for one of our block capsules within pandoc ast text (e.g. a code or raw block)\n // and if we find it, parse and return the original source code\n handleText: (text: string, tok: PandocToken) => {\n // if this is a code block then we need to strip the prefix\n const stripPrefix = tok.t === PandocTokenType.CodeBlock;\n\n return text.replace(kBlockCapsuleTextRegEx, (_match, p1) => {\n const capsuleText = p1;\n const capsule = parsePandocBlockCapsule(capsuleText);\n if (stripPrefix) {\n return blockCapsuleSourceWithoutPrefix(capsule.source, capsule.prefix);\n } else {\n return capsule.source;\n }\n });\n },\n\n // look for a block capsule of our type within a code block (indicated by the\n // presence of a special css class)\n handleToken: (tok: PandocToken) => {\n if (tok.t === PandocTokenType.CodeBlock) {\n const attr = pandocAttrReadAST(tok, kCodeBlockAttr) as PandocAttr;\n if (attr.classes.includes(kBlockCapsuleType)) {\n return tok.c[kCodeBlockText];\n }\n }\n return null;\n },\n\n // write the node as an rmd_chunk, being careful to remove the backticks\n // preserved as part of the source, and striping out the base indentation\n // level implied by the prefix\n writeNode: (schema: Schema, writer: ProsemirrorWriter, capsule: PandocBlockCapsule) => {\n // open node\n writer.openNode(schema.nodes.rmd_chunk, {\n navigation_id: uuidv4(),\n md_index: capsule.position,\n });\n\n // source still has leading and trailing backticks, remove them\n const source = capsule.source.replace(/^```+/, '').replace(/\\n[\\t >]*```+$/, '');\n\n // write the lines w/o the source-level prefix\n writer.writeText(blockCapsuleSourceWithoutPrefix(source, capsule.prefix));\n\n // all done\n writer.closeNode();\n },\n };\n}\n","/*\n * line_block.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema, DOMOutputSpec } from 'prosemirror-model';\n\nimport { ExtensionContext } from '../api/extension';\nimport { PandocOutput, PandocTokenType, PandocToken, kWriteSpaces } from '../api/pandoc';\n\nimport { EditorCommandId, WrapCommand } from '../api/command';\nimport { OmniInsertGroup } from '../api/omni_insert';\n\nimport './line_block-styles.css';\n\nconst extension = (context: ExtensionContext) => {\n const { pandocExtensions, ui } = context;\n\n if (!pandocExtensions.line_blocks) {\n return null;\n }\n\n return {\n nodes: [\n {\n name: 'line_block',\n spec: {\n content: 'paragraph+',\n group: 'block',\n defining: true,\n parseDOM: [\n {\n tag: \"div[class*='line-block']\",\n },\n ],\n toDOM(): DOMOutputSpec {\n return ['div', { class: 'line-block pm-line-block pm-block-border-color pm-margin-bordered' }, 0];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.LineBlock,\n block: 'line_block',\n getChildren: (tok: PandocToken) => {\n return tok.c.map((line: PandocToken[]) => ({ t: PandocTokenType.Para, c: line }));\n },\n },\n ],\n writer: (output: PandocOutput, node: ProsemirrorNode) => {\n output.withOption(kWriteSpaces, false, () => {\n output.writeToken(PandocTokenType.LineBlock, () => {\n node.forEach(line => {\n output.writeArray(() => {\n output.writeInlines(line.content);\n });\n });\n });\n });\n },\n },\n },\n ],\n commands: (schema: Schema) => {\n return [\n new WrapCommand(\n EditorCommandId.LineBlock,\n [],\n schema.nodes.line_block,\n {},\n {\n name: ui.context.translateText('Line Block'),\n description: ui.context.translateText('Preserve leading spaces and line breaks'),\n group: OmniInsertGroup.Blocks,\n priority: 2,\n image: () =>\n ui.prefs.darkMode() ? ui.images.omni_insert?.line_block_dark! : ui.images.omni_insert?.line_block!,\n },\n ),\n ];\n },\n };\n};\n\nexport default extension;\n","/*\n * table.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\nimport { Transaction, EditorState } from 'prosemirror-state';\nimport { Transform } from 'prosemirror-transform';\nimport { tableEditing, columnResizing, goToNextCell, deleteColumn, deleteRow } from 'prosemirror-tables';\nimport { sinkListItem, liftListItem } from 'prosemirror-schema-list';\n\nimport { findChildrenByType } from 'prosemirror-utils';\n\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { BaseKey } from '../../api/basekeys';\nimport { ProsemirrorCommand, EditorCommandId, exitNode } from '../../api/command';\nimport { TableCapabilities } from '../../api/table';\nimport { trTransform } from '../../api/transaction';\n\nimport {\n insertTable,\n deleteTable,\n deleteTableCaption,\n addRows,\n addColumns,\n TableColumnAlignmentCommand,\n TableRowCommand,\n TableColumnCommand,\n TableToggleHeaderCommand,\n TableToggleCaptionCommand,\n CssAlignment,\n insertTableOmniInsert,\n} from './table-commands';\n\nimport {\n tableContainerNode,\n tableNode,\n tableCaptionNode,\n tableCellNode,\n tableHeaderNode,\n tableRowNode,\n} from './table-nodes';\n\nimport { fixupTableWidths } from './table-columns';\nimport { TableContextMenuPlugin } from './table-contextmenu';\nimport { tablePaste } from './table-paste';\n\nimport 'prosemirror-tables/style/tables.css';\nimport './table-styles.css';\n\nconst extension = (context: ExtensionContext): Extension | null => {\n const { pandocExtensions, ui } = context;\n\n // not enabled if there are no tables enabled\n if (\n !pandocExtensions.grid_tables &&\n !pandocExtensions.pipe_tables &&\n !pandocExtensions.simple_tables &&\n !pandocExtensions.multiline_tables &&\n !pandocExtensions.raw_html\n ) {\n return null;\n }\n\n // define table capabilities\n const capabilities: TableCapabilities = {\n captions: pandocExtensions.table_captions,\n headerOptional: pandocExtensions.grid_tables,\n multiline: pandocExtensions.multiline_tables || pandocExtensions.grid_tables,\n };\n\n return {\n nodes: [\n tableContainerNode,\n tableNode,\n tableCaptionNode,\n tableCellNode(pandocExtensions.grid_tables),\n tableHeaderNode,\n tableRowNode,\n ],\n\n commands: (_schema: Schema) => {\n const commands = [\n new ProsemirrorCommand(\n EditorCommandId.Table,\n ['Alt-Mod-t'],\n insertTable(capabilities, ui),\n insertTableOmniInsert(ui),\n ),\n new ProsemirrorCommand(\n EditorCommandId.TableInsertTable,\n [],\n insertTable(capabilities, ui),\n ),\n new ProsemirrorCommand(EditorCommandId.TableNextCell, ['Tab'], goToNextCell(1)),\n new ProsemirrorCommand(EditorCommandId.TablePreviousCell, ['Shift-Tab'], goToNextCell(-1)),\n new TableColumnCommand(EditorCommandId.TableAddColumnAfter, [], addColumns(true)),\n new TableColumnCommand(EditorCommandId.TableAddColumnBefore, [], addColumns(false)),\n new TableColumnCommand(EditorCommandId.TableDeleteColumn, [], deleteColumn),\n new TableRowCommand(EditorCommandId.TableAddRowAfter, [], addRows(true)),\n new TableRowCommand(EditorCommandId.TableAddRowBefore, [], addRows(false)),\n new TableRowCommand(EditorCommandId.TableDeleteRow, [], deleteRow),\n new ProsemirrorCommand(EditorCommandId.TableDeleteTable, [], deleteTable()),\n new TableColumnAlignmentCommand(EditorCommandId.TableAlignColumnLeft, CssAlignment.Left),\n new TableColumnAlignmentCommand(EditorCommandId.TableAlignColumnRight, CssAlignment.Right),\n new TableColumnAlignmentCommand(EditorCommandId.TableAlignColumnCenter, CssAlignment.Center),\n new TableColumnAlignmentCommand(EditorCommandId.TableAlignColumnDefault, null),\n ];\n if (capabilities.captions) {\n commands.push(new TableToggleCaptionCommand());\n }\n if (capabilities.headerOptional) {\n commands.push(new TableToggleHeaderCommand());\n }\n return commands;\n },\n\n plugins: (schema: Schema) => {\n return [\n columnResizing({\n handleWidth: 5,\n }),\n tableEditing(),\n tablePaste(),\n new TableContextMenuPlugin(schema, ui),\n ];\n },\n\n baseKeys: (schema: Schema) => {\n // core keys\n const keys = [\n { key: BaseKey.Backspace, command: deleteTableCaption() },\n { key: BaseKey.Enter, command: exitNode(schema.nodes.table_caption, -2, false) },\n { key: BaseKey.Tab, command: tableTabKey },\n { key: BaseKey.ShiftTab, command: tableShiftTabKey },\n ];\n\n // turn enter key variations into tab if we don't support multi-line\n if (!capabilities.multiline) {\n keys.push({ key: BaseKey.Enter, command: goToNextCell(1) });\n keys.push({ key: BaseKey.ShiftEnter, command: goToNextCell(-11) });\n keys.push({ key: BaseKey.ModEnter, command: goToNextCell(1) });\n }\n\n return keys;\n },\n\n fixups: (_schema: Schema, view: EditorView) => {\n return [fixupTableWidths(view)];\n },\n\n appendTransaction: (_schema: Schema) => {\n return [\n {\n name: 'table-repair',\n nodeFilter: node => node.type === node.type.schema.nodes.table,\n append: (tr: Transaction) => {\n trTransform(tr, tableRepairTransform);\n },\n },\n ];\n },\n };\n};\n\nexport function tableTabKey(state: EditorState, dispatch?: (tr: Transaction) => void): boolean {\n if (sinkListItem(state.schema.nodes.list_item)(state)) {\n return false;\n } else {\n return goToNextCell(1)(state, dispatch);\n }\n}\n\nexport function tableShiftTabKey(state: EditorState, dispatch?: (tr: Transaction) => void): boolean {\n if (liftListItem(state.schema.nodes.list_item)(state)) {\n return false;\n } else {\n return goToNextCell(-1)(state, dispatch);\n }\n}\n\nfunction tableRepairTransform(tr: Transform) {\n const schema = tr.doc.type.schema;\n const tables = findChildrenByType(tr.doc, schema.nodes.table);\n tables.forEach(table => {\n // map the position\n const pos = tr.mapping.map(table.pos);\n\n // get containing node (pos is right before the table)\n const containingNode = tr.doc.resolve(pos).node();\n\n // table with no container\n if (containingNode.type !== schema.nodes.table_container) {\n // add the container\n const caption = schema.nodes.table_caption.createAndFill({ inactive: true }, undefined)!;\n const container = schema.nodes.table_container.createAndFill({}, [table.node, caption])!;\n tr.replaceWith(pos, pos + table.node.nodeSize, container);\n }\n\n // table with no content (possible w/ half caption leftover)\n else if (table.node.firstChild && table.node.firstChild.childCount === 0) {\n // delete the table (and container if necessary)\n const hasContainer = containingNode.type === schema.nodes.table_container;\n if (hasContainer) {\n tr.deleteRange(pos - 1, pos - 1 + containingNode.nodeSize);\n } else {\n tr.deleteRange(pos, table.node.nodeSize);\n }\n }\n });\n}\n\nexport default extension;\n","/*\n * table-commands.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView } from 'prosemirror-view';\nimport { Node as ProsemirrorNode, Fragment } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { findParentNodeOfType, setTextSelection, findChildrenByType } from 'prosemirror-utils';\nimport {\n isInTable,\n Rect,\n TableMap,\n selectionCell,\n CellSelection,\n toggleHeader,\n addRow,\n addColumn,\n} from 'prosemirror-tables';\n\nimport { EditorUI } from '../../api/ui';\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { canInsertNode } from '../../api/node';\nimport { TableCapabilities } from '../../api/table';\nimport { OmniInsertGroup } from '../../api/omni_insert';\n\nexport function insertTable(capabilities: TableCapabilities, ui: EditorUI) {\n return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n const schema = state.schema;\n\n // can we insert?\n if (!canInsertNode(state, schema.nodes.table_container)) {\n return false;\n }\n\n // is the selection inside a table caption? if it is then we can't insert\n // as it will \"split\" the table_container in such a way that an invalid\n // table will be created\n if (findParentNodeOfType(schema.nodes.table_caption)(state.selection)) {\n return false;\n }\n\n async function asyncInsertTable() {\n if (dispatch) {\n const result = await ui.dialogs.insertTable(capabilities);\n if (result) {\n // create cells\n const numRows = result.rows + (result.header ? 1 : 0);\n const rows: ProsemirrorNode[] = [];\n for (let r = 0; r < numRows; r++) {\n const cells: ProsemirrorNode[] = [];\n const cellType = r === 0 && result.header ? schema.nodes.table_header : schema.nodes.table_cell;\n for (let c = 0; c < result.cols; c++) {\n const content =\n cellType === schema.nodes.table_header\n ? schema.text(`${ui.context.translateText('Col')}${c + 1}`)\n : Fragment.empty;\n cells.push(cellType.createAndFill({}, schema.nodes.paragraph.createAndFill({}, content)!)!);\n }\n rows.push(schema.nodes.table_row.createAndFill({}, cells)!);\n }\n\n // create table\n const table = schema.nodes.table.createAndFill({}, rows)!;\n const tableCaption = schema.nodes.table_caption.createAndFill(\n { inactive: !result.caption },\n result.caption ? schema.text(result.caption) : undefined,\n )!;\n const tableContainer = schema.nodes.table_container.createAndFill({}, [table, tableCaption])!;\n\n // insert\n const tr = state.tr;\n tr.replaceSelectionWith(tableContainer);\n\n // select first cell\n const selectionPos = tr.mapping.map(state.selection.from, -1);\n setTextSelection(selectionPos)(tr).scrollIntoView();\n\n // dispatch & focus\n dispatch(tr);\n }\n if (view) {\n view.focus();\n }\n }\n }\n asyncInsertTable();\n\n return true;\n };\n}\n\nexport function insertTableOmniInsert(ui: EditorUI) {\n return {\n name: ui.context.translateText('Table'),\n description: ui.context.translateText('Content in rows and columns'),\n group: OmniInsertGroup.Lists,\n priority: 1,\n image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.table_dark! : ui.images.omni_insert?.table!),\n };\n}\n\nexport function deleteTable() {\n return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n const schema = state.schema;\n const container = findParentNodeOfType(schema.nodes.table_container)(state.selection);\n if (container) {\n if (dispatch) {\n const tr = state.tr;\n tr.delete(container.pos, container.pos + container.node.nodeSize);\n dispatch(tr.scrollIntoView());\n }\n return true;\n }\n return false;\n };\n}\n\nexport function deleteTableCaption() {\n return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n // must be a selection within an empty table caption\n const schema = state.schema;\n const { $head } = state.selection;\n if ($head.parent.type !== schema.nodes.table_caption || $head.parent.childCount !== 0) {\n return false;\n }\n\n if (dispatch) {\n // set the caption to inactive\n const tr = state.tr;\n const caption = $head.parent;\n tr.setNodeMarkup($head.pos - 1, schema.nodes.table_caption, {\n ...caption.attrs,\n inactive: true,\n });\n setTextSelection($head.pos - 1, -1)(tr);\n dispatch(tr);\n }\n\n return true;\n };\n}\n\nexport function addColumns(after: boolean) {\n return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n if (!isInTable(state)) {\n return false;\n }\n if (dispatch) {\n let tr = state.tr;\n const rect = selectedRect(state);\n const columns = rect.right - rect.left;\n for (let i = 0; i < columns; i++) {\n tr = addColumn(tr, rect, after ? rect.right : rect.left);\n }\n dispatch(tr);\n }\n return true;\n };\n}\n\nexport function addRows(after: boolean) {\n return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n if (!isInTable(state)) {\n return false;\n }\n if (dispatch) {\n // add the rows\n let tr = state.tr;\n const rect = selectedRect(state);\n const rows = rect.bottom - rect.top;\n for (let i = 0; i < rows; i++) {\n tr = addRow(tr, rect, after ? rect.bottom : rect.top);\n }\n\n // sync column alignments for table\n const table = findParentNodeOfType(state.schema.nodes.table)(tr.selection);\n if (table) {\n const alignments = new Array<CssAlignment | null>(rect.map.width);\n table.node.forEach((rowNode, rowOffset, rowIndex) => {\n rowNode.forEach((cellNode, cellOffset, colIndex) => {\n const cellPos = table.pos + 1 + rowOffset + 1 + cellOffset;\n if (rowIndex === 0) {\n const cell = tr.doc.nodeAt(cellPos);\n alignments[colIndex] = cell?.attrs.align || null;\n } else {\n tr.setNodeMarkup(cellPos, cellNode.type, {\n ...cellNode.attrs,\n align: alignments[colIndex] || null,\n });\n }\n });\n });\n }\n\n dispatch(tr);\n }\n return true;\n };\n}\n\nexport class TableToggleHeaderCommand extends ProsemirrorCommand {\n constructor() {\n super(EditorCommandId.TableToggleHeader, [], toggleHeader('row'));\n }\n\n public isActive(state: EditorState): boolean {\n if (!isInTable(state)) {\n return false;\n }\n const { table } = selectedRect(state);\n const firstCell = table.firstChild!.firstChild!;\n return firstCell.type === state.schema.nodes.table_header;\n }\n}\n\nexport class TableToggleCaptionCommand extends ProsemirrorCommand {\n constructor() {\n super(\n EditorCommandId.TableToggleCaption,\n [],\n (state: EditorState, dispatch?: (tr: Transaction<any>, view?: EditorView) => void) => {\n if (!isInTable(state)) {\n return false;\n }\n const caption = this.tableCaptionNode(state);\n if (!caption) {\n return false;\n }\n\n if (dispatch) {\n const focus = caption.node.attrs.inactive;\n const tr = state.tr;\n tr.setNodeMarkup(caption.pos + 1, state.schema.nodes.table_caption, {\n ...caption.node.attrs,\n inactive: !caption.node.attrs.inactive,\n });\n if (focus) {\n setTextSelection(caption.pos + 1)(tr).scrollIntoView();\n }\n dispatch(tr);\n }\n\n return true;\n },\n );\n }\n\n public isActive(state: EditorState): boolean {\n if (!isInTable(state)) {\n return false;\n }\n\n const caption = this.tableCaptionNode(state);\n if (!caption) {\n return false;\n }\n\n return !caption.node.attrs.inactive;\n }\n\n private tableCaptionNode(state: EditorState) {\n const container = findParentNodeOfType(state.schema.nodes.table_container)(state.selection);\n if (container) {\n const caption = findChildrenByType(container.node, state.schema.nodes.table_caption);\n return {\n node: caption[0].node,\n pos: container.pos + caption[0].pos,\n };\n } else {\n return undefined;\n }\n }\n}\n\nexport enum CssAlignment {\n Left = 'left',\n Right = 'right',\n Center = 'center',\n}\n\nexport class TableRowCommand extends ProsemirrorCommand {\n public plural(state: EditorState) {\n if (!isInTable(state)) {\n return 1;\n }\n\n const rect = selectedRect(state);\n return rect.bottom - rect.top;\n }\n}\n\nexport class TableColumnCommand extends ProsemirrorCommand {\n public plural(state: EditorState) {\n if (!isInTable(state)) {\n return 1;\n }\n\n const rect = selectedRect(state);\n return rect.right - rect.left;\n }\n}\n\nexport class TableColumnAlignmentCommand extends ProsemirrorCommand {\n private readonly align: CssAlignment | null;\n\n constructor(id: EditorCommandId, align: CssAlignment | null) {\n super(id, [], (state: EditorState, dispatch?: (tr: Transaction<any>) => void) => {\n if (!isInTable(state)) {\n return false;\n }\n\n if (dispatch) {\n const { table, tableStart, left, right } = selectedRect(state);\n const tr = state.tr;\n table.forEach((rowNode, rowOffset) => {\n rowNode.forEach((cellNode, cellOffset, i) => {\n if (i >= left && i < right) {\n const cellPos = tableStart + 1 + rowOffset + cellOffset;\n tr.setNodeMarkup(cellPos, cellNode.type, {\n ...cellNode.attrs,\n align,\n });\n }\n });\n });\n dispatch(tr);\n }\n\n return true;\n });\n this.align = align;\n }\n\n public isActive(state: EditorState): boolean {\n if (!isInTable(state)) {\n return false;\n }\n const { table, top, left } = selectedRect(state);\n const cell = table.child(top).child(left);\n return cell.attrs.align === this.align;\n }\n}\n\n// from: https://github.com/ProseMirror/prosemirror-tables/blob/master/src/commands.js\n\ninterface SelectedRect extends Rect {\n tableStart: number;\n map: TableMap;\n table: ProsemirrorNode;\n}\n\nfunction selectedRect(state: EditorState): SelectedRect {\n const sel = state.selection;\n const $pos = selectionCell(state)!;\n const table = $pos.node(-1);\n const tableStart = $pos.start(-1);\n const map = TableMap.get(table);\n let rect: Rect;\n if (sel instanceof CellSelection) {\n rect = map.rectBetween(sel.$anchorCell.pos - tableStart, sel.$headCell.pos - tableStart);\n } else {\n rect = map.findCell($pos.pos - tableStart);\n }\n return {\n ...rect,\n tableStart,\n map,\n table,\n };\n}\n","/*\n * table-nodes.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { tableNodes } from 'prosemirror-tables';\nimport { Node as ProsemirrorNode, DOMOutputSpec } from 'prosemirror-model';\n\nimport { PandocTokenType } from '../../api/pandoc';\n\nimport {\n readPandocTable,\n writePandocTableContainer,\n writePandocTable,\n writePandocTableCaption,\n writePandocTableNodes,\n writePandocTableHeaderNodes,\n} from './table-pandoc';\nimport { tableColumnWidths } from './table-columns';\nimport { tableBlockCapsuleFilter } from './table-capsule';\n\nexport const kDefaultCellClasses = 'pm-table-cell pm-block-border-color';\n\nconst nodes = tableNodes({\n tableGroup: 'block',\n cellContent: 'block+',\n cellAttributes: {\n align: {\n default: null,\n getFromDOM(dom: Element) {\n return (dom as HTMLElement).style.textAlign || null;\n },\n setDOMAttr(value, attrs) {\n if (value) {\n attrs.style = (attrs.style || '') + `text-align: ${value};`;\n }\n },\n },\n className: {\n default: kDefaultCellClasses,\n getFromDOM(dom: Element) {\n return (dom as HTMLElement).className;\n },\n setDOMAttr(value, attrs) {\n attrs.class = kDefaultCellClasses;\n },\n },\n },\n});\n\nexport const tableContainerNode = {\n name: 'table_container',\n spec: {\n content: 'table table_caption',\n group: 'block',\n parseDOM: [{ tag: \"div[class*='table-container']\" }],\n toDOM(node: ProsemirrorNode): DOMOutputSpec {\n return ['div', { class: 'table-container pm-table-container' }, 0];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.Table,\n handler: readPandocTable,\n },\n ],\n writer: writePandocTableContainer,\n blockCapsuleFilter: tableBlockCapsuleFilter(),\n },\n};\n\nexport const tableNode = {\n name: 'table',\n spec: {\n ...nodes.table,\n attrs: {\n ...nodes.table.attrs,\n width: { default: null },\n colpercents: { default: null },\n },\n parseDOM: [\n {\n tag: 'table',\n getAttrs: (dom: Node | string) => {\n const el = dom as HTMLElement;\n\n // shared colpercents\n let colpercents: number[] | null = null;\n\n // if we have a colgroup w/ widths then read percents from there\n // <colgroup><col style=\"width: 44%\" /><col style=\"width: 11%\" /></colgroup>\n const colgroup = el.getElementsByTagName('colgroup');\n if (colgroup.length) {\n const cols = colgroup[0].childElementCount;\n colpercents = new Array<number>(cols).fill(0);\n for (let i = 0; i < cols; i++) {\n const col = colgroup[0].children.item(i) as HTMLElement;\n if (col.style.width) {\n colpercents[i] = (parseInt(col.style.width, 10) || 0) / 100;\n }\n }\n if (colpercents.every(value => !!value)) {\n return {\n colpercents,\n };\n }\n }\n\n // otherwise read from data-colwidth\n let width: number | null = null;\n const rows = el.getElementsByTagName('tr');\n if (rows.length) {\n const firstRow = rows.item(0)!;\n const numCells = firstRow.cells.length;\n const colWidths = new Array<number>(numCells).fill(0);\n for (let i = 0; i < numCells; i++) {\n const cell = firstRow.cells.item(i)!;\n const colWidth = cell.getAttribute('data-colwidth');\n if (colWidth) {\n colWidths[i] = Number(colWidth);\n }\n }\n if (colWidths.every(colWidth => colWidth > 0)) {\n width = colWidths.reduce((total, value) => total + value, 0);\n colpercents = colWidths.map(colWidth => colWidth / width!);\n }\n }\n\n return {\n width,\n colpercents,\n };\n },\n },\n ],\n toDOM(node: ProsemirrorNode): DOMOutputSpec {\n const attrs: any = {};\n if (node.attrs.width) {\n attrs['data-width'] = node.attrs.width.toString();\n }\n attrs['data-colpercents'] = tableColumnWidths(node).join(',');\n return ['table', attrs, ['tbody', 0]];\n },\n },\n pandoc: {\n writer: writePandocTable,\n },\n};\n\nexport const tableCaptionNode = {\n name: 'table_caption',\n spec: {\n attrs: {\n inactive: { default: false },\n },\n content: 'inline*',\n parseDOM: [\n {\n tag: \"p[class*='table-caption']\",\n getAttrs(dom: Node | string) {\n return {\n inactive: (dom as HTMLElement).classList.contains('table-caption-inactive'),\n };\n },\n },\n ],\n toDOM(node: ProsemirrorNode): DOMOutputSpec {\n const classes = ['table-caption', 'pm-node-caption'];\n if (node.attrs.inactive) {\n classes.push('table-caption-inactive');\n }\n return ['p', { class: classes.join(' ') }, 0];\n },\n },\n pandoc: {\n writer: writePandocTableCaption,\n },\n};\n\nexport const tableRowNode = {\n name: 'table_row',\n spec: nodes.table_row,\n pandoc: {\n writer: writePandocTableNodes,\n },\n};\n\nexport const tableCellNode = (blocks: boolean) => ({\n name: 'table_cell',\n spec: {\n ...nodes.table_cell,\n content: blocks ? 'block+' : 'paragraph',\n },\n pandoc: {\n writer: writePandocTableNodes,\n },\n});\n\nexport const tableHeaderNode = {\n name: 'table_header',\n spec: nodes.table_header,\n pandoc: {\n writer: writePandocTableHeaderNodes,\n },\n};\n","/*\n * table-pandoc.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, NodeType, Node as ProsemirrorNode, Fragment } from 'prosemirror-model';\n\nimport { ProsemirrorWriter, PandocToken, PandocTokenType, PandocOutput } from '../../api/pandoc';\n\nimport { CssAlignment } from './table-commands';\nimport { tableColumnAlignments, tableColumnWidths } from './table-columns';\n\n// attributes\nconst kTableAttr = 0;\n\n// caption\nconst kTableCaption = 1;\nconst kTableCaptionShort = 0; // [Inline]\nconst kTableCaptionFull = 1; // [Block]\n\n// columdefs\nconst kTableColSpec = 2;\nconst kTableColSpecAlign = 0;\nconst kTableColSpecWidth = 1;\n\n// table head\nconst kTableHead = 3;\nconst kTableHeadAttr = 0;\nconst kTableHeadRows = 1; // [Row]\n\n// table body\nconst kTableBody = 4;\nconst kTableBodyAttr = 0;\nconst kTableBodyRowHeadNumColumns = 1;\nconst kTableBodyRowHead = 2;\nconst kTableBodyRows = 3; // [Row]\n\n// table foot\nconst kTableFoot = 5;\nconst kTableFootAttr = 0;\nconst kTableFootRows = 1; // [Row]\n\n// table row\nconst kTableRowAttr = 0;\nconst kTableRowCells = 1; // [Cell]\n\n// table cell\nconst kTableCellAttr = 0;\nconst kTableCellAlignments = 1;\nconst kTableCellRowSpan = 2;\nconst kTableCellColSpan = 3;\nconst KTableCellContents = 4; // [Block]\n\n\nexport function readPandocTable(schema: Schema) {\n return (writer: ProsemirrorWriter, tok: PandocToken) => {\n // get alignments and columns widths\n const alignments = columnCssAlignments(tok);\n const colpercents = columnPercents(tok);\n\n // helper function to parse a table row\n const parseRow = (row: any[], cellType: NodeType) => {\n const cells: any[] = row[kTableRowCells];\n if (cells.length) {\n writer.openNode(schema.nodes.table_row, {});\n cells.forEach((cell: any[], i) => {\n writer.openNode(cellType, { align: alignments[i] });\n writer.writeTokens(cell[KTableCellContents]);\n writer.closeNode();\n });\n writer.closeNode();\n }\n };\n\n // open table container node\n writer.openNode(schema.nodes.table_container, {});\n\n // open table node\n writer.openNode(schema.nodes.table, { colpercents });\n\n // parse column headers\n const head = tok.c[kTableHead] as any[];\n const firstRow = head[kTableHeadRows][0];\n if (firstRow && firstRow[kTableRowCells].some((cell: any[]) => cell[KTableCellContents].length > 0)) {\n parseRow(firstRow, schema.nodes.table_header);\n }\n\n // parse table rows\n const body = tok.c[kTableBody][0] as any[];\n body[kTableBodyRows].forEach((row: any[]) => {\n parseRow(row, schema.nodes.table_cell);\n });\n\n // close table node\n writer.closeNode();\n\n // read caption\n const caption = tok.c[kTableCaption][kTableCaptionFull];\n const captionBlock: PandocToken[] = caption.length ? caption[0].c : [];\n writer.openNode(schema.nodes.table_caption, { inactive: captionBlock.length === 0 });\n writer.writeTokens(captionBlock);\n writer.closeNode();\n\n // close table container node\n writer.closeNode();\n };\n}\n\nexport function writePandocTableContainer(output: PandocOutput, node: ProsemirrorNode) {\n const caption = node.lastChild!;\n const table = node.firstChild!;\n\n output.writeToken(PandocTokenType.Table, () => {\n\n // write empty attributes\n output.writeAttr();\n\n // write caption\n output.writeNode(caption);\n\n // write table\n output.writeNode(table);\n });\n}\n\nexport function writePandocTable(output: PandocOutput, node: ProsemirrorNode) {\n const firstRow = node.firstChild!;\n\n // get alignments and column widths\n const alignments = tableColumnAlignments(node);\n const widths = tableColumnWidths(node);\n\n // write colspcs\n // TODO: Columns are coming out ColWidthDefault\n output.writeArray(() => {\n alignments.forEach((align, i) => {\n output.writeArray(() => {\n output.writeToken(align);\n if (widths[i] === 0) {\n output.writeToken(PandocTokenType.ColWidthDefault);\n } else {\n output.writeToken(PandocTokenType.ColWidth, widths[i]);\n }\n });\n });\n });\n\n\n // write header row if necessary\n const headerCut = firstRow.firstChild!.type === node.type.schema.nodes.table_header ? 1 : 0;\n output.writeArray(() => {\n output.writeAttr();\n output.writeArray(() => {\n writePandocTableRow(output, firstRow, headerCut === 0);\n });\n });\n\n // write table body\n output.writeArray(() => {\n output.writeArray(() => {\n output.writeAttr();\n output.write(0);\n output.writeArray(() => { /* */ });\n // write rows\n output.writeArray(() => {\n for (let i = headerCut; i < node.childCount; i++) {\n writePandocTableRow(output, node.content.child(i));\n }\n });\n });\n });\n\n // write table footer\n output.writeArray(() => {\n output.writeAttr();\n output.writeArray(() => { /* */ });\n });\n\n\n}\n\nexport function writePandocTableCaption(output: PandocOutput, node: ProsemirrorNode) {\n output.writeArray(() => {\n output.write(null);\n output.writeArray(() => {\n if (!node.attrs.inactive && node.childCount > 0) {\n output.writeToken(PandocTokenType.Plain, () => {\n output.writeInlines(node.content);\n });\n }\n });\n });\n}\n\nexport function writePandocTableNodes(output: PandocOutput, node: ProsemirrorNode) {\n output.writeArray(() => {\n output.writeNodes(node);\n });\n}\n\nexport function writePandocTableHeaderNodes(output: PandocOutput, node: ProsemirrorNode) {\n output.writeArray(() => {\n if (node.textContent.length > 0) {\n output.writeNodes(node);\n } else {\n // write a paragraph containing a space (this is an attempt to fix an issue where\n // empty headers don't get correct round-tripping)\n output.writeToken(PandocTokenType.Para, () => {\n output.writeRawMarkdown(' ');\n });\n }\n });\n}\n\nfunction writePandocTableRow(output: PandocOutput, node: ProsemirrorNode, empty = false) {\n output.writeArray(() => {\n output.writeAttr();\n output.writeArray(() => {\n node.forEach((cellNode) => {\n output.writeArray(() => {\n output.writeAttr();\n output.writeToken(PandocTokenType.AlignDefault);\n output.write(1);\n output.write(1);\n if (!empty) {\n output.writeNode(cellNode);\n } else {\n output.writeArray(() => {\n output.writeInlines(Fragment.empty);\n });\n }\n });\n });\n });\n });\n}\n\n\nfunction columnCssAlignments(tableToken: PandocToken) {\n return tableToken.c[kTableColSpec].map((spec: any) => {\n const alignment = spec[kTableColSpecAlign];\n switch (alignment.t) {\n case PandocTokenType.AlignLeft:\n return CssAlignment.Left;\n case PandocTokenType.AlignRight:\n return CssAlignment.Right;\n case PandocTokenType.AlignCenter:\n return CssAlignment.Center;\n case PandocTokenType.AlignDefault:\n default:\n return null;\n }\n });\n}\n\nfunction columnPercents(tableToken: PandocToken): number[] {\n return tableToken.c[kTableColSpec].map((spec: any) => {\n const width = spec[kTableColSpecWidth];\n return width.t === PandocTokenType.ColWidth ? width.c : 0;\n });\n}\n","/*\n * table-columns.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\nimport { Transaction } from 'prosemirror-state';\nimport { findChildrenByType } from 'prosemirror-utils';\n\nimport { PandocTokenType } from '../../api/pandoc';\n\nimport { CssAlignment } from './table-commands';\n\nexport function tableColumnAlignments(node: ProsemirrorNode) {\n // get the first row (schema requires at least 1 row)\n const firstRow = node.firstChild!;\n\n // determine # of columns\n const cols = firstRow.childCount;\n\n // return alignments\n const alignments = new Array<PandocTokenType>(cols);\n for (let i = 0; i < cols; i++) {\n const cell = firstRow.child(i);\n const align: CssAlignment = cell.attrs.align;\n switch (align) {\n case CssAlignment.Left:\n alignments[i] = PandocTokenType.AlignLeft;\n break;\n case CssAlignment.Right:\n alignments[i] = PandocTokenType.AlignRight;\n break;\n case CssAlignment.Center:\n alignments[i] = PandocTokenType.AlignCenter;\n break;\n case null:\n default:\n alignments[i] = PandocTokenType.AlignDefault;\n break;\n }\n }\n return alignments;\n}\n\nexport function tableColumnWidths(node: ProsemirrorNode) {\n // get the first row (schema requires at least 1 row)\n const firstRow = node.firstChild!;\n\n // determine # of columns\n const cols = firstRow.childCount;\n\n // width percentages\n let widths = new Array<number>(cols).fill(0);\n\n // take note of explicitly sized columns\n const totalWidth = node.attrs.width;\n let availableWidth = totalWidth;\n let colsWithWidth = 0;\n for (let i = 0; i < cols; i++) {\n const col = firstRow.child(i);\n if (col.attrs.colwidth && col.attrs.colwidth[0]) {\n widths[i] = col.attrs.colwidth[0];\n colsWithWidth++;\n availableWidth -= widths[i];\n }\n }\n\n // allocate remaining widths if we have at least 1 sized columns (otherwise\n // we leave all of the widths at 0 which results in no sizing)\n if (colsWithWidth > 0) {\n if (availableWidth > 0) {\n const defaultWidth = availableWidth / (cols - colsWithWidth);\n for (let i = 0; i < cols; i++) {\n const col = firstRow.child(i);\n if (!col.attrs.colwidth || !col.attrs.colwidth[0]) {\n widths[i] = defaultWidth;\n }\n }\n }\n\n // convert widths to percentages\n widths = widths.map(width => width / totalWidth);\n }\n\n return widths;\n}\n\nexport function fixupTableWidths(view: EditorView) {\n return (tr: Transaction) => {\n const schema = tr.doc.type.schema;\n\n // don't do fixup if we aren't connected to the DOM\n if (!view.dom || !view.dom.isConnected) {\n return tr;\n }\n\n const tables = findChildrenByType(tr.doc, schema.nodes.table);\n for (const table of tables) {\n // get table width\n const el = view.domAtPos(table.pos).node as HTMLElement;\n const containerWidth = table.node.attrs.width || el.clientWidth;\n if (containerWidth === 0) {\n continue;\n }\n\n // resolve colpercents (read by tokenzier)\n let colpercents: number[] = table.node.attrs.colpercents;\n\n if (colpercents) {\n\n // enforce a minimum column width of 25% (otherwise hard to edit)\n // note some of this will get taken back when we adjust all columns\n // for the extra bonus given to small columns\n const kMinPercent = 0.25;\n const totalPercent = colpercents.reduce((total: number, pct: number) => {\n return total + pct;\n }, 0);\n colpercents = colpercents.map(pct => Math.max(pct, kMinPercent));\n const adjustedPercent = colpercents.reduce((total: number, pct: number) => {\n return total + pct;\n }, 0);\n const extraPercent = adjustedPercent - totalPercent;\n colpercents = colpercents.map(pct => pct - (extraPercent/colpercents.length));\n const colWidths = colpercents.map(pct => Math.floor(pct * containerWidth));\n\n // for each row\n table.node.forEach((rowNode, rowOffset, r) => {\n // for each cell\n rowNode.forEach((cellNode, cellOffset, c) => {\n const cellPos = table.pos + 1 + rowOffset + 1 + cellOffset;\n const colWidth = [colWidths[c]];\n if (colWidth !== cellNode.attrs.colwidth) {\n tr.setNodeMarkup(cellPos, cellNode.type, {\n ...cellNode.attrs,\n colwidth: colWidth,\n });\n }\n });\n });\n }\n\n if (containerWidth !== table.node.attrs.width || colpercents) {\n tr.setNodeMarkup(table.pos, schema.nodes.table, {\n ...table.node.attrs,\n width: containerWidth,\n colpercents: null,\n });\n }\n }\n return tr;\n };\n}\n","/*\n * table-capsule.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, DOMParser } from 'prosemirror-model';\n\nimport {\n PandocBlockCapsuleFilter,\n PandocBlockCapsule,\n blockCapsuleParagraphTokenHandler,\n encodedBlockCapsuleRegex,\n blockCapsuleTextHandler,\n blockCapsuleSourceWithoutPrefix,\n parsePandocBlockCapsule,\n} from '../../api/pandoc_capsule';\nimport { ProsemirrorWriter, PandocToken, PandocTokenType } from '../../api/pandoc';\nimport { kHTMLFormat } from '../../api/raw';\n\nexport function tableBlockCapsuleFilter(): PandocBlockCapsuleFilter {\n const kTableBlockCapsuleType = '8EF5A772-DD63-4622-84BF-AF1995A1B2B9'.toLowerCase();\n const pagraphTokenCapsuleHandler = blockCapsuleParagraphTokenHandler(kTableBlockCapsuleType);\n const tokenRegex = encodedBlockCapsuleRegex('^', '$');\n\n return {\n type: kTableBlockCapsuleType,\n\n match: /^([\\t >]*)(<table[\\W\\w]*?<\\/table>)([ \\t]*)$/gm,\n\n // textually enclose the capsule so that pandoc parses it as the type of block we want it to\n // (in this case we don't do anything because pandoc would have written this table as a\n // semantically standalone block)\n enclose: (capsuleText: string, capsule: PandocBlockCapsule) => {\n return capsuleText;\n },\n\n // look for one of our block capsules within pandoc ast text (e.g. a code or raw block)\n // and if we find it, parse and return the original source code\n handleText: blockCapsuleTextHandler(kTableBlockCapsuleType, encodedBlockCapsuleRegex(undefined, undefined, 'gm')),\n\n // we are looking for a paragraph token consisting entirely of a block capsule of our type.\n // if find that then return the block capsule text\n handleToken: (tok: PandocToken) => {\n // first check for a paragraph\n const capsuleText = pagraphTokenCapsuleHandler(tok);\n if (capsuleText) {\n return capsuleText;\n }\n\n // now look for a definition list (which is what a table with a caption parses as)\n if (tok.t === PandocTokenType.DefinitionList) {\n if (tok.c.length === 1) {\n const definition = tok.c[0];\n if (definition[0][0].t === PandocTokenType.Str) {\n const term = definition[0][0].c as string;\n const match = term.match(tokenRegex);\n if (match) {\n const capsuleRecord = parsePandocBlockCapsule(term);\n if (capsuleRecord.type === kTableBlockCapsuleType) {\n return term;\n }\n }\n }\n }\n }\n\n return null;\n },\n\n // write the node as a table (parse the html)\n writeNode: (schema: Schema, writer: ProsemirrorWriter, capsule: PandocBlockCapsule) => {\n // remove the source prefix\n const source = blockCapsuleSourceWithoutPrefix(capsule.source, capsule.prefix);\n\n // fallback to write as raw html\n const writeAsRawHTML = () => {\n writer.openNode(schema.nodes.raw_block, { format: kHTMLFormat });\n writer.writeText(source);\n writer.closeNode();\n };\n\n // parse the table from the string\n const parser = new window.DOMParser();\n const doc = parser.parseFromString(capsule.source, 'text/html');\n if (doc.body && doc.body.firstChild instanceof HTMLTableElement) {\n // get prosemirror dom parser\n const prosemirrorDomParser = DOMParser.fromSchema(schema);\n\n // get unparsed (by prosemirror) table\n const unparsedTable = doc.body.firstChild;\n\n // ensure that table cells all have content\n const ensureCellContent = (tag: string) => {\n const cells = unparsedTable.getElementsByTagName(tag);\n for (let i = 0; i < cells.length; i++) {\n const cell = cells.item(i)!;\n if (cell.children.length === 0) {\n cell.append(window.document.createElement('p'));\n }\n }\n };\n ensureCellContent('td');\n ensureCellContent('th');\n\n // extract caption element\n let captionElement: HTMLTableCaptionElement | null = null;\n const captionCollection = unparsedTable.getElementsByTagName('caption');\n if (captionCollection.length) {\n captionElement = captionCollection.item(0);\n if (captionElement) {\n captionElement.remove();\n }\n }\n\n // determine caption (either empty or parsed from element)\n let caption = schema.nodes.table_caption.create({ inactive: true });\n if (captionElement) {\n const captionSlice = prosemirrorDomParser.parseSlice(captionElement);\n caption = schema.nodes.table_caption.createAndFill({ inactive: false }, captionSlice.content)!;\n }\n\n // parse the prosemirror table element\n const slice = prosemirrorDomParser.parseSlice(doc.body);\n if (slice.content.firstChild && slice.content.firstChild.type === schema.nodes.table) {\n const table = slice.content.firstChild;\n writer.addNode(schema.nodes.table_container, {}, [table, caption]);\n } else {\n writeAsRawHTML();\n }\n\n // fallback to writing as raw_html (round-trip unmodified)\n } else {\n writeAsRawHTML();\n }\n },\n };\n}\n","/*\n * table-contextmenu.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Plugin, PluginKey, Transaction, EditorState } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { Schema } from 'prosemirror-model';\nimport { isInTable } from 'prosemirror-tables';\n\nimport { EditorUI } from '../../api/ui';\nimport { EditorCommandId } from '../../api/command';\n\nexport class TableContextMenuPlugin extends Plugin {\n private menuVisible = false;\n\n constructor(_schema: Schema, ui: EditorUI) {\n super({\n key: new PluginKey('table-contextmenu'),\n\n props: {\n handleDOMEvents: {\n contextmenu: (view: EditorView, event: Event) => {\n // only trigger when in table\n if (!isInTable(view.state)) {\n return false;\n }\n\n const asyncShowTableContextMenu = async () => {\n const menu = [\n { command: EditorCommandId.TableAddRowBefore },\n { command: EditorCommandId.TableAddRowAfter },\n { separator: true },\n { command: EditorCommandId.TableAddColumnBefore },\n { command: EditorCommandId.TableAddColumnAfter },\n { separator: true },\n { command: EditorCommandId.TableDeleteRow },\n { command: EditorCommandId.TableDeleteColumn },\n { separator: true },\n { command: EditorCommandId.TableDeleteTable },\n { separator: true },\n {\n text: ui.context.translateText('Align Column'),\n subMenu: {\n items: [\n { command: EditorCommandId.TableAlignColumnLeft },\n { command: EditorCommandId.TableAlignColumnCenter },\n { command: EditorCommandId.TableAlignColumnRight },\n { separator: true },\n { command: EditorCommandId.TableAlignColumnDefault },\n ],\n },\n },\n { separator: true },\n { command: EditorCommandId.TableToggleHeader },\n { command: EditorCommandId.TableToggleCaption },\n ];\n\n const { clientX, clientY } = event as MouseEvent;\n await ui.display.showContextMenu!(menu, clientX, clientY);\n this.menuVisible = false;\n };\n\n if (ui.display.showContextMenu) {\n this.menuVisible = true;\n asyncShowTableContextMenu();\n event.stopPropagation();\n event.preventDefault();\n return true;\n } else {\n return false;\n }\n },\n },\n },\n\n // prevent selection while the context menu is visible (the right-click\n // that invokes the context menu ends up resetting the selection, which\n // makes the selection-based commands behave incorrectly when multiple\n // rows or columns are selected)\n filterTransaction: (tr: Transaction, state: EditorState) => {\n if (this.menuVisible && isInTable(state)) {\n return !(tr.selectionSet && !tr.docChanged && !tr.storedMarksSet);\n } else {\n return true;\n }\n },\n });\n }\n}\n","/*\n * table-paste.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Plugin, PluginKey, Transaction, EditorState } from 'prosemirror-state';\nimport { Slice, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\n\nimport { sliceHasNode } from '../../api/slice';\n\nimport { fixupTableWidths } from './table-columns';\nimport { forChangedNodes } from '../../api/transaction';\n\nimport { kDefaultCellClasses } from './table-nodes';\n\nexport function tablePaste() {\n return new Plugin({\n key: new PluginKey('table-paste'),\n props: {\n handlePaste: (view: EditorView, _event: Event, slice: Slice) => {\n // if the slice contains a table then we handle it\n if (sliceHasNode(slice, node => node.type === node.type.schema.nodes.table)) {\n // based on https://github.com/ProseMirror/prosemirror-view/blob/fb799aae4e9dd5cfc256708a6845d76aaaf145bf/src/input.js#L503-L510\n const tr = view.state.tr.replaceSelection(slice);\n view.dispatch(\n tr\n .scrollIntoView()\n .setMeta('paste', true)\n .setMeta('tablePaste', true)\n .setMeta('uiEvent', 'paste'),\n );\n view.dispatch(fixupTableWidths(view)(view.state.tr));\n return true;\n } else {\n return false;\n }\n },\n },\n appendTransaction: (transactions: Transaction[], oldState: EditorState, newState: EditorState) => {\n // alias schema\n const schema = newState.schema;\n\n // only process table paste transactions\n if (!transactions.some(transaction => transaction.getMeta('tablePaste'))) {\n return null;\n }\n\n // cleanup table by converting the first row to header cells, ensuring that column alignments\n // are derived from the alignment of the first row, and applying the standard cell class names\n const tr = newState.tr;\n forChangedNodes(\n oldState,\n newState,\n node => node.type === node.type.schema.nodes.table,\n (node, pos) => {\n let firstRow: ProsemirrorNode;\n let currentColumn = 0;\n const columnAlignments: string[] = [];\n\n node.descendants((childNode, childPos, parent) => {\n // if this is a row then reset the current column to 0\n if (childNode.type === schema.nodes.table_row) {\n currentColumn = 0;\n }\n\n // first thing we will encounter in traveral is the first row, note that and move along to cells\n if (!firstRow) {\n // note first row\n firstRow = childNode;\n\n // children of the first row are the headers\n } else if (parent === firstRow) {\n // collect alignment (will be applied below to cells in this column)\n columnAlignments.push(childNode.attrs.align);\n\n // convert to a table header w/ default class\n const headerPos = pos + 1 + childPos;\n tr.setNodeMarkup(headerPos, schema.nodes.table_header, {\n ...childNode.attrs,\n className: kDefaultCellClasses,\n });\n\n // normal cell - apply the requisite alignment and give it the default class\n } else if (childNode.type === schema.nodes.table_cell) {\n // determine alignment\n const align = columnAlignments[currentColumn] || null;\n\n // apply markup\n const cellPos = pos + 1 + childPos;\n tr.setNodeMarkup(cellPos, schema.nodes.table_cell, {\n ...childNode.attrs,\n align,\n className: kDefaultCellClasses,\n });\n }\n\n // if this is a cell then advance the current column\n if (childNode.type === schema.nodes.table_header || childNode.type === schema.nodes.table_cell) {\n currentColumn++;\n }\n });\n },\n );\n\n if (tr.docChanged) {\n return tr;\n }\n },\n });\n}\n","/*\n * definition_list.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, DOMOutputSpec } from 'prosemirror-model';\n\nimport { PandocTokenType } from '../../api/pandoc';\nimport { ExtensionContext } from '../../api/extension';\nimport { BaseKey } from '../../api/basekeys';\n\nimport { InsertDefinitionList, InsertDefinitionDescription, InsertDefinitionTerm } from './definition_list-commands';\n\nimport {\n definitionListEnter,\n definitionListBackspace,\n definitionListTab,\n definitionListShiftTab,\n} from './definition-list-keys';\n\nimport { definitionInputRule } from './definition_list-inputrule';\n\nimport { insertDefinitionListAppendTransaction } from './definition_list-insert';\nimport {\n readPandocDefinitionList,\n writePandocDefinitionList,\n writePandocDefinitionListTerm,\n writePandocDefinitionListDescription,\n} from './definition_list-pandoc';\n\nimport './definition_list-styles.css';\nimport { emptyNodePlaceholderPlugin } from '../../api/placeholder';\n\nconst extension = (context: ExtensionContext) => {\n const { pandocExtensions, ui } = context;\n\n if (!pandocExtensions.definition_lists) {\n return null;\n }\n\n return {\n nodes: [\n {\n name: 'definition_list_term',\n spec: {\n content: 'inline*',\n isolating: true,\n parseDOM: [{ tag: 'dt' }],\n toDOM(): DOMOutputSpec {\n return ['dt', { class: 'pm-definition-term' }, 0];\n },\n },\n pandoc: {\n writer: writePandocDefinitionListTerm,\n },\n },\n {\n name: 'definition_list_description',\n spec: {\n content: 'block+',\n parseDOM: [{ tag: 'dd' }],\n toDOM(): DOMOutputSpec {\n return ['dd', { class: 'pm-definition-description pm-block-border-color pm-margin-bordered' }, 0];\n },\n },\n pandoc: {\n writer: writePandocDefinitionListDescription,\n },\n },\n {\n name: 'definition_list',\n spec: {\n content: '(definition_list_term definition_list_description*)+',\n group: 'block',\n defining: true,\n parseDOM: [{ tag: 'dl' }],\n toDOM(): DOMOutputSpec {\n return ['dl', { class: 'pm-definition-list' }, 0];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.DefinitionList,\n handler: readPandocDefinitionList,\n },\n ],\n\n writer: writePandocDefinitionList,\n },\n },\n ],\n\n commands: (schema: Schema) => {\n return [\n new InsertDefinitionList(ui),\n new InsertDefinitionTerm(schema, ui),\n new InsertDefinitionDescription(schema),\n ];\n },\n\n baseKeys: (_schema: Schema) => {\n return [\n { key: BaseKey.Enter, command: definitionListEnter() },\n { key: BaseKey.Backspace, command: definitionListBackspace() },\n { key: BaseKey.Tab, command: definitionListTab() },\n { key: BaseKey.ShiftTab, command: definitionListShiftTab() },\n ];\n },\n\n inputRules: (_schema: Schema) => {\n return [definitionInputRule()];\n },\n\n appendTransaction: (_schema: Schema) => {\n return [insertDefinitionListAppendTransaction()];\n },\n\n plugins: (schema: Schema) => {\n return [emptyNodePlaceholderPlugin(schema.nodes.definition_list_term, () => ui.context.translateText('Term'))];\n },\n };\n};\n\nexport default extension;\n","/*\n * definition_list-commands.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { Schema, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorState, Transaction, TextSelection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { findParentNodeOfType, setTextSelection } from 'prosemirror-utils';\n\nimport { canInsertNode } from '../../api/node';\nimport { insertDefinitionList } from './definition_list-insert';\nimport { EditorUI } from '../../api/ui';\nimport { OmniInsertGroup } from '../../api/omni_insert';\n\nexport class InsertDefinitionList extends ProsemirrorCommand {\n constructor(ui: EditorUI) {\n super(\n EditorCommandId.DefinitionList,\n [],\n (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n const schema = state.schema;\n\n if (\n findParentNodeOfType(schema.nodes.definition_list)(state.selection) ||\n !canInsertNode(state, schema.nodes.definition_list)\n ) {\n return false;\n }\n\n // new definition list\n if (dispatch) {\n const tr = state.tr;\n\n // create new list\n const termText = insertTermText(ui);\n const term = schema.text(termText);\n insertDefinitionList(tr, [\n schema.nodes.definition_list_term.createAndFill({}, term),\n createDefinitionDescription(schema),\n ]);\n const start = state.selection.from;\n tr.setSelection(TextSelection.create(tr.doc, start, start + termText.length + 1)).scrollIntoView();\n dispatch(tr);\n }\n return true;\n },\n // omni insert\n {\n name: ui.context.translateText('Definition List'),\n description: ui.context.translateText('List with a definition for each item'),\n group: OmniInsertGroup.Lists,\n priority: 3,\n image: () =>\n ui.prefs.darkMode() ? ui.images.omni_insert?.definition_list_dark! : ui.images.omni_insert?.definition_list!,\n },\n );\n }\n}\n\nclass InsertDefinitionListItemCommand extends ProsemirrorCommand {\n constructor(id: EditorCommandId, createFn: () => ProsemirrorNode) {\n super(id, [], (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n const schema = state.schema;\n\n if (!findParentNodeOfType(schema.nodes.definition_list)(state.selection)) {\n return false;\n }\n\n if (dispatch) {\n const tr = state.tr;\n const dlTypes = [schema.nodes.definition_list_term, schema.nodes.definition_list_description];\n const parent = findParentNodeOfType(dlTypes)(state.selection)!;\n const insertPos = parent.pos + parent.node.nodeSize;\n const insertNode = createFn();\n tr.insert(insertPos, insertNode);\n if (insertNode.textContent.length > 1) {\n tr.setSelection(TextSelection.create(tr.doc, insertPos, insertPos + insertNode.textContent.length + 1));\n } else {\n setTextSelection(insertPos, 1)(tr);\n }\n tr.scrollIntoView();\n\n dispatch(tr);\n }\n\n return true;\n });\n }\n}\n\nexport class InsertDefinitionTerm extends InsertDefinitionListItemCommand {\n constructor(schema: Schema, ui: EditorUI) {\n super(EditorCommandId.DefinitionTerm, () => {\n const term = schema.text(insertTermText(ui));\n return schema.nodes.definition_list_term.createAndFill({}, term)!;\n });\n }\n}\n\nexport class InsertDefinitionDescription extends InsertDefinitionListItemCommand {\n constructor(schema: Schema) {\n super(EditorCommandId.DefinitionDescription, () => {\n return createDefinitionDescription(schema);\n });\n }\n}\n\nfunction insertTermText(ui: EditorUI) {\n return ui.context.translateText('term');\n}\n\nfunction createDefinitionDescription(schema: Schema) {\n return schema.nodes.definition_list_description.createAndFill({}, schema.nodes.paragraph.create())!;\n}\n","/*\n * definition_list-insert.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { Transaction } from 'prosemirror-state';\nimport { setTextSelection } from 'prosemirror-utils';\nimport { findChildrenByType } from 'prosemirror-utils';\nimport { trTransform } from '../../api/transaction';\nimport { Transform } from 'prosemirror-transform';\n\nexport function insertDefinitionList(tr: Transaction, items: ProsemirrorNode[]) {\n const schema = items[0].type.schema;\n const definitionList = schema.nodes.definition_list.createAndFill({}, items)!;\n const prevCursor = tr.selection.to;\n tr.replaceSelectionWith(definitionList);\n setTextSelection(tr.mapping.map(prevCursor) - 1, -1)(tr).scrollIntoView();\n return tr;\n}\n\nexport function insertDefinitionListAppendTransaction() {\n return {\n name: 'definition-list-join',\n nodeFilter: (node: ProsemirrorNode) => node.type === node.type.schema.nodes.definition_list,\n append: (tr: Transaction) => {\n // if a transaction creates 2 adjacent definition lists then join them\n trTransform(tr, joinDefinitionListsTransform);\n },\n };\n}\n\nfunction joinDefinitionListsTransform(tr: Transform) {\n const nodeType = tr.doc.type.schema.nodes.definition_list;\n const lists = findChildrenByType(tr.doc, nodeType, true);\n for (const list of lists) {\n // NOTE: no mapping (checking for deletion + getting the updated\n // position) is required here because we only ever do one transform\n // (see return after tr.join below)\n const listPos = tr.doc.resolve(list.pos + 1);\n const listIndex = listPos.index(listPos.depth - 1);\n const listParent = listPos.node(listPos.depth - 1);\n if (listIndex + 1 < listParent.childCount) {\n const nextNode = listParent.child(listIndex + 1);\n if (nextNode.type === nodeType) {\n tr.join(list.pos + list.node.nodeSize);\n return;\n }\n }\n }\n}\n","/*\n * definition_list-keys.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction, TextSelection } from 'prosemirror-state';\nimport {\n findParentNodeOfType,\n findParentNodeOfTypeClosestToPos,\n setTextSelection,\n hasParentNodeOfType,\n ContentNodeWithPos,\n} from 'prosemirror-utils';\n\nimport { isLastChild, isOnlyChild } from '../../api/position';\n\nexport function definitionListEnter() {\n return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n // process if we are within a definition list\n const schema = state.schema;\n const parentDL = findParentNodeOfType(schema.nodes.definition_list)(state.selection);\n if (!parentDL) {\n return false;\n }\n\n // handle only empty selections\n if (!state.selection.empty) {\n return false;\n }\n\n // handle enter in either a term or definition\n const parentTerm = findParentNodeOfType(schema.nodes.definition_list_term)(state.selection);\n if (parentTerm) {\n return termEnter(parentTerm, state, dispatch);\n\n // enter in trailing empty description paragraph (append a term)\n } else if (isTrailingEmptyParagraph(state)) {\n if (dispatch) {\n endOfDescriptionEnter(state, dispatch);\n }\n return true;\n } else {\n return false;\n }\n };\n}\n\nexport function definitionListBackspace() {\n return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n // process if we are within a definition item\n const schema = state.schema;\n const dlTypes = [schema.nodes.definition_list_term, schema.nodes.definition_list_description];\n const parentTerm = findParentNodeOfType(dlTypes)(state.selection);\n if (!parentTerm) {\n return false;\n }\n\n if (parentTerm.node.type === schema.nodes.definition_list_term) {\n // if it's empty\n if (parentTerm.node.childCount === 0) {\n if (dispatch) {\n emptyTermBackspace(state, dispatch);\n }\n return true;\n }\n } else {\n // if the enclosing description is empty then delete it\n if (parentTerm.node.textContent.length === 0) {\n if (dispatch) {\n emptyDescriptionBackspace(parentTerm, state, dispatch);\n }\n\n return true;\n }\n }\n\n return false;\n };\n}\n\nexport function definitionListTab() {\n return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n // process if we are within a definition_term\n const schema = state.schema;\n const dlTypes = [schema.nodes.definition_list_term, schema.nodes.definition_list_description];\n const parentTerm = findParentNodeOfType(dlTypes)(state.selection);\n if (!parentTerm) {\n return false;\n }\n\n // advance past node\n if (dispatch) {\n const tr = state.tr;\n const advancePos = parentTerm.pos + parentTerm.node.nodeSize;\n setTextSelection(advancePos, 1)(tr).scrollIntoView();\n dispatch(tr);\n }\n\n return true;\n };\n}\n\nexport function definitionListShiftTab() {\n return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n // process if we are within a definition_term\n const schema = state.schema;\n const dlTypes = [schema.nodes.definition_list_term, schema.nodes.definition_list_description];\n const parentTerm = findParentNodeOfType(dlTypes)(state.selection);\n if (!parentTerm) {\n return false;\n }\n\n if (dispatch) {\n const tr = state.tr;\n const backwardPos = state.doc.resolve(parentTerm.pos - 1);\n const prevNode = findParentNodeOfTypeClosestToPos(backwardPos, dlTypes);\n if (prevNode) {\n setTextSelection(prevNode.start, 1)(tr).scrollIntoView();\n } else {\n const listNode = findParentNodeOfType(schema.nodes.definition_list)(tr.selection)!;\n setTextSelection(listNode.pos, -1)(tr).scrollIntoView();\n }\n\n dispatch(tr);\n }\n\n return true;\n };\n}\n\nfunction termEnter(term: ContentNodeWithPos, state: EditorState, dispatch?: (tr: Transaction) => void) {\n const schema = state.schema;\n const $head = state.selection.$head;\n\n // only handle empty selections\n if (!state.selection.empty) {\n return false;\n }\n\n // if we are empty then it's an exit (delete the term)\n const isEmpty = term.node.textContent.length === 0;\n if (isEmpty) {\n if (dispatch) {\n const tr = state.tr;\n tr.deleteRange(term.pos, term.pos + term.node.nodeSize);\n tr.replaceSelectionWith(schema.nodes.paragraph.create());\n setTextSelection(tr.mapping.map(state.selection.from), 1)(tr);\n dispatch(tr);\n }\n return true;\n\n // variable handling for non-empty\n } else {\n // selection at the beginning means insert another term above\n if ($head.parentOffset === 0) {\n if (dispatch) {\n const tr = state.tr;\n const insertPos = tr.selection.$head.before($head.depth);\n tr.insert(insertPos, schema.nodes.definition_list_term.create());\n dispatch(tr);\n }\n return true;\n\n // selection at the end means insert a description below\n } else if ($head.parentOffset === term.node.textContent.length) {\n if (dispatch) {\n const tr = state.tr;\n const insertPos = tr.selection.$head.after($head.depth);\n tr.insert(\n insertPos,\n schema.nodes.definition_list_description.createAndFill({}, schema.nodes.paragraph.create())!,\n );\n setTextSelection(insertPos, 1)(tr).scrollIntoView();\n dispatch(tr);\n }\n return true;\n }\n }\n\n return false;\n}\n\nfunction emptyTermBackspace(state: EditorState, dispatch: (tr: Transaction) => void) {\n const { $head } = state.selection;\n const tr = state.tr;\n // if it's the only child then delete the entire list\n if (isOnlyChild($head)) {\n const start = $head.start($head.depth - 1) - 1;\n tr.deleteRange(start, start + $head.node($head.depth - 1).nodeSize);\n } else {\n const start = $head.start($head.depth) - 1;\n tr.deleteRange(start, start + $head.node($head.depth).nodeSize);\n }\n dispatch(tr);\n}\n\nfunction endOfDescriptionEnter(state: EditorState, dispatch: (tr: Transaction) => void) {\n const schema = state.schema;\n const { $head } = state.selection;\n const selectionNode = $head.node($head.depth);\n\n const tr = state.tr;\n\n // if the parent description is empty then delete it\n let start = null;\n const descriptionNode = $head.node($head.depth - 1);\n if (descriptionNode.textContent.trim().length === 0) {\n start = $head.start($head.depth - 1) - 1;\n tr.deleteRange(start, start + descriptionNode.nodeSize);\n\n // only if at very end\n if (isLastChild($head, 2)) {\n const insertPos = tr.mapping.map($head.after($head.depth - 2));\n tr.insert(insertPos, schema.nodes.paragraph.create());\n setTextSelection(insertPos, 1)(tr).scrollIntoView();\n }\n\n // otherwise just delete the paragraph and insert a term\n } else {\n start = $head.start($head.depth) - 1;\n tr.deleteRange(start, start + selectionNode.nodeSize);\n start = tr.mapping.map(start);\n tr.insert(start + 1, schema.nodes.definition_list_term.create());\n setTextSelection(start, 1)(tr).scrollIntoView();\n }\n\n dispatch(tr);\n}\n\nfunction emptyDescriptionBackspace(\n description: ContentNodeWithPos,\n state: EditorState,\n dispatch: (tr: Transaction) => void,\n) {\n const tr = state.tr;\n tr.deleteRange(description.pos, description.pos + description.node.nodeSize);\n dispatch(tr);\n}\n\nfunction isTrailingEmptyParagraph(state: EditorState) {\n const { $head } = state.selection;\n const selectionNode = $head.node($head.depth);\n const isParagraph = selectionNode.type === state.schema.nodes.paragraph;\n const isEmpty = selectionNode.textContent.trim().length === 0;\n return isParagraph && isEmpty && isLastChild($head);\n}\n\n// eslint-disable-next-line\nfunction selectionCrossesListBoundary(state: EditorState) {\n const { $head, $anchor } = state.selection;\n const headInDL = hasParentNodeOfType(state.schema.nodes.definition_list)(TextSelection.near($head));\n const anchorInDL = hasParentNodeOfType(state.schema.nodes.definition_list)(TextSelection.near($anchor));\n return headInDL !== anchorInDL;\n}\n","/*\n * definition_list-inputrule.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { InputRule } from 'prosemirror-inputrules';\nimport { EditorState } from 'prosemirror-state';\nimport { setTextSelection, findParentNodeOfTypeClosestToPos } from 'prosemirror-utils';\n\nimport { insertDefinitionList } from './definition_list-insert';\n\nexport function definitionInputRule() {\n return new InputRule(/^:[ ]+$/, (state: EditorState, match: string[], start: number, end: number) => {\n const schema = state.schema;\n\n // if we are inside a definiition list description this means start a new description\n const { $head } = state.selection;\n const container = $head.node($head.depth - 1);\n const parent = $head.node($head.depth);\n\n // must be just ': '\n if (parent.textContent.trim() !== ':') {\n return null;\n }\n\n // check for : within a definition list description\n if (container.type === schema.nodes.definition_list_description && parent.type === schema.nodes.paragraph) {\n const tr = state.tr;\n const startPos = $head.start($head.depth) - 1;\n tr.deleteRange(startPos, startPos + $head.node($head.depth).nodeSize);\n const insertPos = tr.mapping.map(startPos) + 1;\n tr.insert(\n insertPos,\n schema.nodes.definition_list_description.createAndFill({}, schema.nodes.paragraph.create())!,\n );\n setTextSelection(insertPos, 1)(tr).scrollIntoView();\n return tr;\n\n // check for : in a paragraph immediately after another paragraph\n } else if (container.type !== schema.nodes.definition_list_description && isParagraphAfterParagraph(state)) {\n const prevPara = findParentNodeOfTypeClosestToPos(state.doc.resolve(start - 2), schema.nodes.paragraph);\n if (prevPara) {\n const tr = state.tr;\n tr.deleteRange(prevPara.start, end);\n insertDefinitionList(tr, [\n schema.nodes.definition_list_term.createAndFill({}, prevPara.node.content)!,\n schema.nodes.definition_list_description.createAndFill({}, schema.nodes.paragraph.create())!,\n ]);\n return tr;\n } else {\n return null;\n }\n } else {\n return null;\n }\n });\n}\n\nfunction isParagraphAfterParagraph(state: EditorState) {\n const schema = state.schema;\n const { $head } = state.selection;\n\n // check if the selection is in a paragraph\n const selectionInParagraph = $head.node($head.depth).type === schema.nodes.paragraph;\n if (!selectionInParagraph) {\n return false;\n }\n\n // check if the previous node is a paragraph\n const parent = $head.node($head.depth - 1);\n const parentIndex = $head.index($head.depth - 1);\n return parentIndex > 0 && parent.child(parentIndex - 1).type === schema.nodes.paragraph;\n}\n","/*\n * position.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { ResolvedPos } from 'prosemirror-model';\n\nexport function isOnlyChild(pos: ResolvedPos, depthOffset = 1) {\n return pos.node(pos.depth - depthOffset).childCount === 1;\n}\n\nexport function isLastChild(pos: ResolvedPos, depthOffset = 1) {\n return pos.index(pos.depth - depthOffset) === pos.node(pos.depth - depthOffset).childCount - 1;\n}\n","/*\n * definition_list-pandoc.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { ProsemirrorWriter, PandocToken, PandocOutput, PandocTokenType } from '../../api/pandoc';\n\nexport function readPandocDefinitionList(schema: Schema) {\n return (writer: ProsemirrorWriter, tok: PandocToken) => {\n writer.openNode(schema.nodes.definition_list, {});\n\n const definitions = tok.c;\n definitions.forEach((definition: [PandocToken[], PandocToken[][]]) => {\n const term = definition[0];\n writer.openNode(schema.nodes.definition_list_term, {});\n writer.writeTokens(term);\n writer.closeNode();\n\n const descriptions = definition[1];\n descriptions.forEach(description => {\n writer.openNode(schema.nodes.definition_list_description, {});\n writer.writeTokens(description);\n writer.closeNode();\n });\n });\n writer.closeNode();\n };\n}\n\nexport function writePandocDefinitionList(output: PandocOutput, node: ProsemirrorNode) {\n output.writeToken(PandocTokenType.DefinitionList, () => {\n // collect terms and descriptions\n const currentDefinition: {\n term?: ProsemirrorNode;\n descriptions: ProsemirrorNode[];\n } = { descriptions: new Array<ProsemirrorNode>() };\n\n // functions to manipulate current definition\n function writeCurrent() {\n if (currentDefinition.term) {\n output.writeArray(() => {\n output.writeNode(currentDefinition.term!);\n output.writeArray(() => {\n currentDefinition.descriptions.forEach(description => {\n output.writeNode(description);\n });\n });\n });\n }\n }\n\n // write the list\n node.forEach(child => {\n if (child.type === child.type.schema.nodes.definition_list_term) {\n writeCurrent();\n currentDefinition.term = child;\n currentDefinition.descriptions = [];\n } else {\n currentDefinition.descriptions.push(child);\n }\n });\n writeCurrent();\n });\n}\n\nexport function writePandocDefinitionListTerm(output: PandocOutput, node: ProsemirrorNode) {\n output.writeArray(() => {\n output.writeInlines(node.content);\n });\n}\n\nexport function writePandocDefinitionListDescription(output: PandocOutput, node: ProsemirrorNode) {\n output.writeArray(() => {\n output.writeNodes(node);\n });\n}\n","/*\n * shortcode_block.ts\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { PandocOutput, PandocTokenType, PandocToken, stringifyTokens, ProsemirrorWriter } from '../api/pandoc';\n\nimport { kHugoDocType, kQuartoDocType } from '../api/format';\n\nimport { Extension, ExtensionContext } from '../api/extension';\nimport { codeNodeSpec } from '../api/code';\nimport { ProsemirrorCommand, EditorCommandId } from '../api/command';\nimport { canInsertNode } from '../api/node';\nimport { kShortcodeRegEx } from '../api/shortcode';\nimport {\n PandocBlockCapsuleFilter,\n blockCapsuleParagraphTokenHandler,\n encodedBlockCapsuleRegex,\n PandocBlockCapsule,\n blockCapsuleTextHandler,\n blockCapsuleSourceWithoutPrefix,\n} from '../api/pandoc_capsule';\n\nconst extension = (context: ExtensionContext): Extension | null => {\n const { format } = context;\n\n // return null if no shortcodes\n if (!format.hugoExtensions.shortcodes) {\n return null;\n }\n\n return {\n nodes: [\n {\n name: 'shortcode_block',\n\n spec: {\n ...codeNodeSpec(),\n attrs: {},\n parseDOM: [\n {\n tag: \"div[class*='shortcode-block']\",\n preserveWhitespace: 'full',\n },\n ],\n toDOM(node: ProsemirrorNode) {\n return ['div', { class: 'shortcode-block pm-fixedwidth-font pm-code-block pm-markup-text-color' }, 0];\n },\n },\n\n code_view: {\n lang: () => 'text',\n borderColorClass: 'pm-raw-block-border',\n },\n\n attr_edit: () => ({\n type: (schema: Schema) => schema.nodes.shortcode_block,\n tags: () => ['shortcode'],\n editFn: () => () => false,\n }),\n\n pandoc: {\n // unroll shortcode from paragraph with single shortcode\n blockReader: (schema: Schema, tok: PandocToken, writer: ProsemirrorWriter) => {\n if (isParaWrappingShortcode(tok)) {\n const text = stringifyTokens(tok.c);\n writer.addNode(schema.nodes.shortcode_block, {}, [schema.text(text)]);\n return true;\n } else {\n return false;\n }\n },\n\n // capture shortcuts w/ begin/end tags\n blockCapsuleFilter: shortcodeBlockCapsuleFilter(),\n\n writer: (output: PandocOutput, node: ProsemirrorNode) => {\n output.writeToken(PandocTokenType.Para, () => {\n output.writeRawMarkdown(node.content);\n });\n },\n },\n },\n ],\n\n commands: (schema: Schema) => {\n // only create command for hugo anq quarto doc types\n if (!format.docTypes.includes(kHugoDocType) && \n !format.docTypes.includes(kQuartoDocType)) {\n return [];\n }\n\n return [\n new ProsemirrorCommand(\n EditorCommandId.Shortcode,\n [],\n (state: EditorState, dispatch?: (tr: Transaction<any>) => void) => {\n // enable/disable command\n if (!canInsertNode(state, schema.nodes.shortcode_block)) {\n return false;\n }\n if (dispatch) {\n const tr = state.tr;\n const shortcode = '{{< >}}';\n const shortcodeNode = schema.nodes.shortcode_block.create({}, schema.text(shortcode));\n tr.replaceSelectionWith(shortcodeNode);\n setTextSelection(tr.mapping.map(state.selection.from) - shortcode.length / 2 - 1)(tr);\n dispatch(tr);\n }\n return true;\n },\n ),\n ];\n },\n };\n};\n\nfunction isParaWrappingShortcode(tok: PandocToken) {\n if (tok.t === PandocTokenType.Para) {\n // qualify that this paragraph has text that begins with {{< (so that\n // we don't end up scanning every token of every paragraph )\n const children: PandocToken[] = tok.c;\n if (tok.c.length > 1) {\n const [first, second] = tok.c;\n const firstText = first.t === PandocTokenType.Str ? first.c : second.c;\n if (typeof firstText === 'string' && firstText.startsWith('{{<')) {\n const text = stringifyTokens(children);\n return !!text.match(kShortcodeRegEx);\n }\n }\n }\n return false;\n}\n\nexport function shortcodeBlockCapsuleFilter(): PandocBlockCapsuleFilter {\n const kShortcodeBlockCapsuleType = 'B65B58FD-D707-4C30-8C97-3D99ACF9A157'.toLowerCase();\n\n return {\n type: kShortcodeBlockCapsuleType,\n\n // eslint-disable-next-line no-useless-escape\n match: /^([\\t >]*)(\\{\\{<\\s+([^\\/][^\\t ]+).*?>\\}\\}[ \\t]*\\n(?![ \\t]*\\n)[\\W\\w]*?\\n[\\t >]*\\{\\{<\\s+\\/\\3\\s+>\\}\\})([ \\t]*)$/gm,\n\n extract: (_match: string, p1: string, p2: string, _p3: string, p4: string) => {\n return {\n prefix: p1,\n source: p2,\n suffix: p4,\n };\n },\n\n // textually enclose the capsule so that pandoc parses it as the type of block we want it to\n // (in this case we don't do anything because pandoc would have written this table as a\n // semantically standalone block)\n enclose: (capsuleText: string, capsule: PandocBlockCapsule) => {\n return capsuleText;\n },\n\n // look for one of our block capsules within pandoc ast text (e.g. a code or raw block)\n // and if we find it, parse and return the original source code\n handleText: blockCapsuleTextHandler(\n kShortcodeBlockCapsuleType,\n encodedBlockCapsuleRegex(undefined, undefined, 'gm'),\n ),\n\n // we are looking for a paragraph token consisting entirely of a block capsule of our type.\n // if find that then return the block capsule text\n handleToken: blockCapsuleParagraphTokenHandler(kShortcodeBlockCapsuleType),\n\n // write the node\n writeNode: (schema: Schema, writer: ProsemirrorWriter, capsule: PandocBlockCapsule) => {\n // remove the source prefix\n const source = blockCapsuleSourceWithoutPrefix(capsule.source, capsule.prefix);\n\n // write the node\n writer.addNode(schema.nodes.shortcode_block, {}, [schema.text(source)]);\n },\n };\n}\n\nexport default extension;\n","/*\n * html_preserve.ts\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\n\nimport { PandocOutput, PandocTokenType, ProsemirrorWriter } from '../api/pandoc';\nimport { Extension, ExtensionContext } from '../api/extension';\nimport { codeNodeSpec } from '../api/code';\n\nimport {\n PandocBlockCapsuleFilter,\n blockCapsuleParagraphTokenHandler,\n encodedBlockCapsuleRegex,\n PandocBlockCapsule,\n blockCapsuleTextHandler,\n blockCapsuleSourceWithoutPrefix,\n} from '../api/pandoc_capsule';\n\nconst extension = (context: ExtensionContext): Extension | null => {\n const { format } = context;\n\n return {\n nodes: [\n {\n name: 'html_preserve',\n\n spec: {\n ...codeNodeSpec(),\n attrs: {},\n parseDOM: [\n {\n tag: \"div[class*='pm-html-preserve']\",\n preserveWhitespace: 'full',\n },\n ],\n toDOM(node: ProsemirrorNode) {\n return ['div', { class: 'pm-html-preserve pm-fixedwidth-font pm-code-block pm-markup-text-color' }, 0];\n },\n },\n\n code_view: {\n lang: () => 'html',\n borderColorClass: 'pm-raw-block-border',\n },\n\n attr_edit: () => ({\n type: (schema: Schema) => schema.nodes.html_preserve,\n tags: () => ['html_preserve'],\n editFn: () => () => false,\n }),\n\n pandoc: {\n // capture shortcuts w/ begin/end tags\n blockCapsuleFilter: htmlPreserveBlockCapsuleFilter(),\n\n writer: (output: PandocOutput, node: ProsemirrorNode) => {\n output.writeToken(PandocTokenType.Para, () => {\n output.writeRawMarkdown(node.content);\n });\n },\n },\n },\n ],\n };\n};\n\nexport function htmlPreserveBlockCapsuleFilter(): PandocBlockCapsuleFilter {\n const kHtmlPreserveBlockCapsuleType = '83CFCBF3-0429-4822-AAC6-D6F31591AEA8'.toLowerCase();\n\n return {\n type: kHtmlPreserveBlockCapsuleType,\n\n // eslint-disable-next-line no-useless-escape\n match: /^([\\t >]*)(<!--html_preserve-->[\\W\\w]*?<!--\\/html_preserve-->)([ \\t]*)$/gm,\n\n extract: (_match: string, p1: string, p2: string, p3: string) => {\n return {\n prefix: p1,\n source: p2,\n suffix: p3,\n };\n },\n\n // textually enclose the capsule so that pandoc parses it as the type of block we want it to\n // (in this case we don't do anything because pandoc would have written this as a\n // semantically standalone block)\n enclose: (capsuleText: string, capsule: PandocBlockCapsule) => {\n return capsuleText;\n },\n\n // look for one of our block capsules within pandoc ast text (e.g. a code or raw block)\n // and if we find it, parse and return the original source code\n handleText: blockCapsuleTextHandler(\n kHtmlPreserveBlockCapsuleType,\n encodedBlockCapsuleRegex(undefined, undefined, 'gm'),\n ),\n\n // we are looking for a paragraph token consisting entirely of a block capsule of our type.\n // if find that then return the block capsule text\n handleToken: blockCapsuleParagraphTokenHandler(kHtmlPreserveBlockCapsuleType),\n\n // write the node\n writeNode: (schema: Schema, writer: ProsemirrorWriter, capsule: PandocBlockCapsule) => {\n // remove the source prefix\n const source = blockCapsuleSourceWithoutPrefix(capsule.source, capsule.prefix);\n\n // write the node\n writer.addNode(schema.nodes.html_preserve, {}, [schema.text(source)]);\n },\n };\n}\n\nexport default extension;\n","/*\n * ace.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport {\n Plugin,\n PluginKey,\n TextSelection,\n EditorState,\n Transaction,\n Selection,\n NodeSelection,\n} from 'prosemirror-state';\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorView, NodeView, Decoration } from 'prosemirror-view';\nimport { undo, redo } from 'prosemirror-history';\nimport { exitCode } from 'prosemirror-commands';\nimport { keymap } from 'prosemirror-keymap';\nimport { undoInputRule } from 'prosemirror-inputrules';\nimport { GapCursor } from 'prosemirror-gapcursor';\n\nimport { CodeViewOptions, editingRootNode } from '../../api/node';\nimport { insertParagraph } from '../../api/paragraph';\nimport { EditorUI, ChunkEditor } from '../../api/ui';\nimport { EditorOptions } from '../../api/options';\nimport { EditorEvents } from '../../api/events';\nimport { ExtensionContext, ExtensionFn } from '../../api/extension';\nimport { DispatchEvent, ResizeEvent, ScrollEvent } from '../../api/event-types';\nimport { verticalArrowCanAdvanceWithinTextBlock } from '../../api/basekeys';\nimport { handleArrowToAdjacentNode } from '../../api/cursor';\n\nimport { selectAll } from '../../behaviors/select_all';\nimport { findPluginState } from '../../behaviors/find';\n\nimport { AceRenderQueue } from './ace-render-queue';\nimport { AcePlaceholder } from './ace-placeholder';\nimport { AceNodeViews } from './ace-node-views';\n\nimport zenscroll from 'zenscroll';\n\nimport './ace.css';\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { setTextSelection } from 'prosemirror-utils';\n\nconst plugin = new PluginKey('ace');\n\nexport function aceExtension(codeViews: { [key: string]: CodeViewOptions }): ExtensionFn {\n\n return (context: ExtensionContext) => {\n // shared services\n const aceRenderQueue = new AceRenderQueue(context.events);\n const aceNodeViews = new AceNodeViews();\n\n // build nodeViews\n const nodeTypes = Object.keys(codeViews);\n const nodeViews: {\n [name: string]: (node: ProsemirrorNode<any>, view: EditorView<any>, getPos: boolean | (() => number)) => NodeView;\n } = {};\n nodeTypes.forEach(name => {\n nodeViews[name] = (node: ProsemirrorNode, view: EditorView, getPos: boolean | (() => number)) => {\n return new AceNodeView(\n node,\n view,\n getPos as () => number,\n context,\n codeViews[name],\n aceRenderQueue,\n aceNodeViews,\n );\n };\n });\n\n const activeAceNodeViewCommand = (fn: (view: AceNodeView) => void) => {\n return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n const activeView = aceNodeViews.activeNodeView();\n if (!activeView) {\n return false;\n }\n if (dispatch) {\n fn(activeView);\n }\n return true;\n };\n };\n\n return {\n plugins: () => [\n new Plugin({\n key: plugin,\n props: {\n nodeViews,\n handleDOMEvents: {\n click: aceNodeViews.handleClick.bind(aceNodeViews),\n },\n },\n }),\n // arrow in and out of editor\n keymap({\n ArrowLeft: arrowHandler('left', nodeTypes),\n ArrowRight: arrowHandler('right', nodeTypes),\n ArrowUp: arrowHandler('up', nodeTypes),\n ArrowDown: arrowHandler('down', nodeTypes),\n }),\n ],\n commands: () => [\n new ProsemirrorCommand(EditorCommandId.ExpandChunk, [], activeAceNodeViewCommand(nodeView => {\n nodeView.setExpanded(true); \n })),\n new ProsemirrorCommand(EditorCommandId.CollapseChunk, [], activeAceNodeViewCommand(nodeView => {\n nodeView.setExpanded(false);\n })),\n ]\n };\n };\n}\n\n/**\n * Represents a selection that was applied prior to the editor rendering (needs\n * to be applied when the editor rendering completes)\n */\nclass QueuedSelection {\n constructor(public readonly anchor: number, public readonly head: number) {}\n}\n\nexport class AceNodeView implements NodeView {\n public readonly getPos: () => number;\n public node: ProsemirrorNode;\n public readonly dom: HTMLElement;\n\n private readonly view: EditorView;\n private readonly ui: EditorUI;\n private readonly nodeViews: AceNodeViews;\n private readonly renderQueue: AceRenderQueue;\n private chunk?: ChunkEditor;\n private aceEditor?: AceAjax.Editor;\n private editSession?: AceAjax.IEditSession;\n private readonly editorOptions: EditorOptions;\n private readonly options: CodeViewOptions;\n private readonly events: EditorEvents;\n\n private updating: boolean;\n private escaping: boolean;\n private gapCursorPending: boolean;\n private mouseDown: boolean;\n private mode: string;\n private findMarkers: number[];\n private selectionMarker: number | null;\n private queuedSelection: QueuedSelection | null;\n private resizeTimer: number;\n private renderedWidth: number;\n private scrollRow: number;\n private cursorDirty: boolean;\n\n private readonly subscriptions: VoidFunction[];\n\n constructor(\n node: ProsemirrorNode,\n view: EditorView,\n getPos: () => number,\n context: ExtensionContext,\n options: CodeViewOptions,\n renderQueue: AceRenderQueue,\n nodeViews: AceNodeViews,\n ) {\n // context\n const ui = context.ui;\n const editorOptions = context.options;\n\n // Store for later\n this.node = node;\n this.view = view;\n this.ui = context.ui;\n this.events = context.events;\n this.getPos = getPos;\n\n // Initialize values\n this.mode = '';\n this.escaping = false;\n this.gapCursorPending = false;\n this.findMarkers = [];\n this.selectionMarker = null;\n this.renderQueue = renderQueue;\n this.nodeViews = nodeViews;\n this.queuedSelection = null;\n this.subscriptions = [];\n this.resizeTimer = 0;\n this.renderedWidth = 0;\n this.scrollRow = -1;\n this.cursorDirty = false;\n this.mouseDown = false;\n\n // options\n this.editorOptions = editorOptions;\n this.options = options;\n\n // The editor's outer node is our DOM representation\n this.dom = document.createElement('div');\n this.dom.classList.add('pm-code-editor');\n this.dom.classList.add('pm-ace-editor');\n this.dom.classList.add('pm-ace-editor-inactive');\n this.dom.classList.add(options.borderColorClass || 'pm-block-border-color');\n if (this.options.classes) {\n this.options.classes.forEach(className => this.dom.classList.add(className));\n }\n\n // Create a preview of the text (will be shown until editor is fully initialized)\n const preview = new AcePlaceholder(node.textContent);\n this.dom.appendChild(preview.getElement());\n\n // Style the first line differently if requested\n if (options.firstLineMeta) {\n this.dom.classList.add('pm-ace-first-line-meta');\n }\n\n // update mode\n this.updateMode();\n\n // observe all editor dispatches\n this.subscriptions.push(\n this.events.subscribe(DispatchEvent, (tr: Transaction | undefined) => {\n if (tr) {\n this.onEditorDispatch(tr);\n }\n }),\n );\n\n // This flag is used to avoid an update loop between the outer and\n // inner editor\n this.updating = false;\n\n if (renderQueue.isRenderCompleted()) {\n // All editors have been rendered and the queue is empty; initialize\n // directly (this happens when e.g., inserting code chunks interactively\n // after the document is fully rendered)\n this.initEditor();\n } else {\n // Rendering is not complete; add to the queue\n renderQueue.add(this);\n }\n\n // add ourselves to the list of all ace node views\n this.nodeViews.add(this);\n }\n\n public destroy() {\n // Unsubscribe from events\n this.subscriptions.forEach(unsub => unsub());\n\n // Clean up attached editor instance when it's removed from the DOM\n if (this.chunk) {\n this.chunk.destroy();\n }\n\n // remove ourselves from the list of all ace node views\n this.nodeViews.remove(this);\n }\n\n public update(node: ProsemirrorNode, _decos: Decoration[]) {\n if (node.type !== this.node.type) {\n return false;\n }\n if (!this.editSession) {\n return false;\n }\n this.node = node;\n this.updateMode();\n\n const AceRange = window.require('ace/range').Range;\n const doc = this.editSession.getDocument();\n\n const change = computeChange(this.editSession.getValue(), node.textContent);\n if (change) {\n this.updating = true;\n const range = AceRange.fromPoints(doc.indexToPosition(change.from, 0), doc.indexToPosition(change.to, 0));\n this.editSession.replace(range, change.text);\n this.updating = false;\n }\n\n // Clear any previously rendered find markers\n this.findMarkers.forEach(id => {\n if (this.editSession) {\n this.editSession.removeMarker(id);\n }\n });\n this.findMarkers = [];\n\n // Get all of the find results inside this node\n const decorations = findPluginState(this.view.state);\n if (decorations) {\n const decos = decorations?.find(this.getPos(), this.getPos() + node.nodeSize - 1);\n\n // If we got results, render them\n if (decos) {\n decos.forEach((deco: any) => {\n if (!this.editSession) {\n return;\n }\n\n // Calculate from/to position for result marker (adjust for zero based column)\n const markerFrom = doc.indexToPosition(deco.from - this.getPos(), 0);\n markerFrom.column--;\n const markerTo = doc.indexToPosition(deco.to - this.getPos(), 0);\n markerTo.column--;\n const range = AceRange.fromPoints(markerFrom, markerTo);\n\n // Create the search result marker and add it to the rendered set\n const markerId = this.editSession.addMarker(range, deco.type.attrs.class, 'result', true);\n this.findMarkers.push(markerId);\n });\n }\n }\n\n // Ensure that the chunk is expanded if it contains find markers (so user can see search results)\n if (this.chunk && this.findMarkers.length > 0) {\n this.chunk.setExpanded(true);\n }\n\n return true;\n }\n\n public setSelection(anchor: number, head: number) {\n // We haven't drawn the editor yet, so queue the selection until we can\n // apply it.\n if (!this.aceEditor || !this.editSession) {\n this.queuedSelection = new QueuedSelection(anchor, head);\n return;\n }\n if (!this.escaping && !this.gapCursorPending) {\n this.aceEditor.focus();\n }\n this.updating = true;\n const doc = this.editSession.getDocument();\n const AceRange = window.require('ace/range').Range;\n const range = AceRange.fromPoints(doc.indexToPosition(anchor, 0), doc.indexToPosition(head, 0));\n this.editSession.getSelection().setSelectionRange(range);\n this.updating = false;\n }\n\n public setGapCursorPending(pending: boolean) {\n this.gapCursorPending = pending;\n }\n\n public isFocused() {\n return this.aceEditor && this.aceEditor.isFocused();\n }\n\n public setExpanded(expanded: boolean) {\n if (this.chunk) {\n this.chunk.setExpanded(expanded);\n }\n }\n\n public getExpanded() {\n if (this.chunk) {\n return this.chunk.getExpanded();\n } else {\n return false;\n }\n }\n\n public selectNode() {\n if (this.aceEditor) {\n this.aceEditor.focus();\n }\n }\n\n public stopEvent() {\n return true;\n }\n\n public ignoreMutation(_mutation: MutationRecord | { type: 'selection'; target: Element }) {\n return true;\n }\n\n private onEditorDispatch(tr: Transaction) {\n if (!tr.docChanged && tr.selectionSet) {\n this.highlightSelectionAcross(tr.selection); \n }\n }\n\n private forwardSelection() {\n // ignore if we don't have focus\n if (!this.chunk || !this.chunk.element.contains(window.document.activeElement)) {\n return;\n }\n\n const state = this.view.state;\n const selection = this.asProseMirrorSelection(state.doc);\n if (selection && !selection.eq(state.selection)) {\n this.view.dispatch(state.tr.setSelection(selection));\n }\n }\n\n private asProseMirrorSelection(doc: ProsemirrorNode) {\n if (!this.editSession) {\n return null;\n }\n const offset = this.getPos() + 1;\n const session = this.editSession;\n const range = session.getSelection().getRange();\n const anchor = session.getDocument().positionToIndex(range.start, 0) + offset;\n const head = session.getDocument().positionToIndex(range.end, 0) + offset;\n return TextSelection.create(doc, anchor, head);\n }\n\n // detect the entire editor being selected across, in which case we add an ace marker\n // visually indicating that the text is selected\n private highlightSelectionAcross(selection: Selection) {\n if (!this.aceEditor || !this.editSession) {\n return;\n }\n\n // clear any existing selection marker\n if (this.selectionMarker !== null) {\n this.editSession.removeMarker(this.selectionMarker);\n this.selectionMarker = null;\n }\n\n // check for selection spanning us\n const pos = this.getPos();\n if (selection.from < pos && selection.to > pos + this.node.nodeSize) {\n const doc = this.editSession.getDocument();\n const AceRange = window.require('ace/range').Range;\n const range = AceRange.fromPoints(doc.indexToPosition(0, 0), doc.indexToPosition(this.node.nodeSize - 1, 0));\n this.selectionMarker = this.editSession.addMarker(range, 'pm-selected-text', 'selection', true);\n }\n }\n\n private valueChanged() {\n const change = computeChange(this.node.textContent, this.getContents());\n if (change) {\n // update content\n const start = this.getPos() + 1;\n if (!isNaN(start)) {\n const tr = this.view.state.tr.replaceWith(\n start + change.from,\n start + change.to,\n change.text ? this.node.type.schema.text(change.text) : null,\n );\n this.view.dispatch(tr);\n }\n }\n this.updateMode();\n }\n\n /**\n * Scrolls a child of the editor chunk into view.\n *\n * @param ele The child to scroll.\n */\n private scrollIntoView(ele: HTMLElement) {\n const editingRoot = editingRootNode(this.view.state.selection);\n if (editingRoot) {\n const container = this.view.nodeDOM(editingRoot.pos) as HTMLElement;\n const scroller = zenscroll.createScroller(container);\n\n let top = 0;\n\n // The DOM node representing this editor chunk (this.dom) may not be a\n // direct child of the scrollable container. If it isn't, walk up the DOM\n // tree until we find the main content node (pm-content), which is the\n // offset parent against which we need to compute scroll position.\n let scrollParent = this.dom;\n while (scrollParent.offsetParent != null &&\n !scrollParent.offsetParent.classList.contains(\"pm-content\"))\n {\n top += scrollParent.offsetTop;\n scrollParent = scrollParent.offsetParent as HTMLElement;\n }\n\n // Since the element we want to scroll into view is not a direct child of\n // the scrollable container, do a little math to figure out the\n // destination scroll position.\n top += ele.offsetTop + scrollParent.offsetTop;\n const bottom = top + ele.offsetHeight;\n const viewTop = container.scrollTop;\n const viewBottom = container.scrollTop + container.offsetHeight;\n\n // Scroll based on element's current position and size\n if (top > viewTop && bottom < viewBottom) {\n // Element is already fully contained in the viewport\n return;\n } else if (ele.offsetHeight > container.offsetHeight) {\n // Element is taller than the viewport, so show the first part of it\n scroller.toY(top);\n } else if (top < viewTop) {\n // Element is above viewport, so scroll it into view\n scroller.toY(top);\n } else if (bottom > viewBottom) {\n // Part of the element is beneath the viewport, so scroll just enough to\n // bring it into view\n scroller.toY(container.scrollTop - (viewBottom - bottom));\n }\n }\n }\n\n /**\n * Initializes the editing surface by creating and injecting an Ace editor\n * instance from the host.\n */\n public initEditor() {\n // skip if we're already initialized\n if (this.aceEditor) {\n return;\n }\n\n // call host factory to instantiate editor\n this.chunk = this.ui.chunks.createChunkEditor('ace', this.dom, this.node.attrs.md_index, this.node.attrs.classes, {\n getPos: () => this.getPos(),\n scrollIntoView: ele => this.scrollIntoView(ele),\n scrollCursorIntoView: () => this.scrollCursorIntoView(),\n getTextContent: () => this.node.textContent\n });\n\n // populate initial contents\n this.aceEditor = this.chunk.editor as AceAjax.Editor;\n this.updating = true;\n this.aceEditor.setValue(this.node.textContent);\n this.updating = false;\n\n this.aceEditor.clearSelection();\n\n // cache edit session for convenience; most operations happen on the session\n this.editSession = this.aceEditor.getSession();\n\n // remove the preview and recreate chunk toolbar\n this.dom.innerHTML = '';\n this.dom.appendChild(this.chunk.element);\n\n // Propagate updates from the code editor to ProseMirror\n this.aceEditor.on('changeSelection', () => {\n if (!this.updating) {\n this.forwardSelection();\n }\n });\n this.aceEditor.on('change', () => {\n if (!this.updating) {\n this.valueChanged();\n }\n });\n\n // Forward selection we we receive it\n this.aceEditor.on('focus', () => {\n this.dom.classList.remove('pm-ace-editor-inactive');\n this.forwardSelection();\n });\n\n this.aceEditor.on('blur', () => {\n // Add a class to editor; this class contains CSS rules that hide editor\n // components that Ace cannot hide natively (such as the cursor,\n // matching bracket indicator, and active selection)\n this.dom.classList.add('pm-ace-editor-inactive');\n });\n\n // If the cursor moves and we're in focus, ensure that the cursor is\n // visible. Ace's own cursor visiblity mechanisms don't work in embedded\n // editors.\n this.aceEditor.getSelection().on('changeCursor', () => {\n if (this.dom.contains(document.activeElement) && !this.mouseDown) {\n this.cursorDirty = true;\n }\n });\n\n this.aceEditor.renderer.on('afterRender', () => {\n // If the cursor position is dirty and the mouse is not down, scroll the\n // cursor into view. Don't scroll while the mouse is down, as it will be\n // treated as a click-and-drag by Ace.\n if (this.cursorDirty && !this.mouseDown) {\n this.scrollCursorIntoView();\n this.cursorDirty = false;\n }\n });\n\n // Add custom escape commands for movement keys (left/right/up/down); these\n // will check to see whether the movement should leave the editor, and if\n // so will do so instead of moving the cursor.\n this.aceEditor.commands.addCommand({\n name: 'leftEscape',\n bindKey: 'Left',\n exec: () => {\n this.arrowMaybeEscape('char', -1, 'gotoleft');\n },\n readOnly: true\n });\n this.aceEditor.commands.addCommand({\n name: 'rightEscape',\n bindKey: 'Right',\n exec: () => {\n // if the chunk is currently collapsed, the right arrow should open it up\n if (this.chunk && !this.chunk.getExpanded()) {\n this.chunk.setExpanded(true);\n return;\n }\n this.arrowMaybeEscape('char', 1, 'gotoright');\n },\n readOnly: true\n });\n this.aceEditor.commands.addCommand({\n name: 'upEscape',\n bindKey: 'Up',\n exec: () => {\n this.arrowMaybeEscape('line', -1, 'golineup');\n },\n readOnly: true\n });\n this.aceEditor.commands.addCommand({\n name: 'downEscape',\n bindKey: 'Down',\n exec: () => {\n this.arrowMaybeEscape('line', 1, 'golinedown');\n },\n readOnly: true\n });\n\n // Pressing Backspace in the editor when it's empty should delete it.\n this.aceEditor.commands.addCommand({\n name: 'backspaceDeleteNode',\n bindKey: 'Backspace',\n exec: () => {\n this.backspaceMaybeDeleteNode();\n },\n });\n\n // Handle undo/redo in ProseMirror\n this.aceEditor.commands.addCommand({\n name: 'undoProsemirror',\n bindKey: {\n win: 'Ctrl-Z',\n mac: 'Command-Z',\n },\n exec: () => {\n if (undo(this.view.state, this.view.dispatch)) {\n this.view.focus();\n }\n },\n });\n this.aceEditor.commands.addCommand({\n name: 'redoProsemirror',\n bindKey: {\n win: 'Ctrl-Shift-Z|Ctrl-Y',\n mac: 'Command-Shift-Z|Command-Y',\n },\n exec: () => {\n if (redo(this.view.state, this.view.dispatch)) {\n this.view.focus();\n }\n },\n });\n\n // Handle Select All in ProseMirror\n this.aceEditor.commands.addCommand({\n name: 'selectAllProsemirror',\n bindKey: {\n win: 'Ctrl-A',\n mac: 'Command-A',\n },\n exec: () => {\n if (selectAll(this.view.state, this.view.dispatch, this.view)) {\n this.view.focus();\n }\n },\n });\n\n // Handle shortcuts for moving focus out of the code editor and into\n // ProseMirror\n this.aceEditor.commands.addCommand({\n name: 'exitCodeBlock',\n bindKey: 'Shift-Enter',\n exec: () => {\n if (exitCode(this.view.state, this.view.dispatch)) {\n this.view.focus();\n }\n },\n });\n\n // Create a command for inserting paragraphs from the code editor\n this.aceEditor.commands.addCommand({\n name: 'insertParagraph',\n bindKey: {\n win: 'Ctrl-\\\\',\n mac: 'Command-\\\\',\n },\n exec: () => {\n if (insertParagraph(this.view.state, this.view.dispatch)) {\n this.view.focus();\n }\n },\n });\n\n // Line-by-line execution\n this.aceEditor.commands.addCommand({\n name: 'executeSelection',\n bindKey: {\n win: 'Ctrl-Enter',\n mac: 'Ctrl-Enter|Command-Enter',\n },\n exec: () => {\n if (this.chunk && this.aceEditor) {\n // Record the position prior to execution\n const pos = this.aceEditor.getCursorPosition();\n\n // Execute the selection\n this.chunk.executeSelection();\n\n // If the cursor stayed on the last line, step out of the code block\n // if we're not at the end of the doc (this is a no-op when not on the\n // last line, and mirrors the behavior when stepping past the end of\n // chunks in the code editor)\n if (pos.row === this.aceEditor.getCursorPosition().row) {\n this.arrowMaybeEscape('line', 1);\n }\n }\n },\n });\n\n // If an attribute editor function was supplied, bind it to F4\n if (this.options.attrEditFn) {\n this.aceEditor.commands.addCommand({\n name: 'editAttributes',\n bindKey: 'F4',\n exec: () => {\n this.options.attrEditFn!(this.view.state, this.view.dispatch, this.view);\n },\n });\n }\n\n // Apply editor mode\n if (this.mode) {\n this.chunk.setMode(this.mode);\n }\n\n // Disconnect font metrics system after render loop\n (this.aceEditor.renderer as any).on('afterRender', () => {\n // Update known rendered width\n if (this.chunk) {\n this.renderedWidth = this.chunk.element.offsetWidth;\n }\n\n window.setTimeout(() => {\n if (this.aceEditor) {\n const metrics = (this.aceEditor.renderer as any).$fontMetrics;\n if (metrics && metrics.$observer) {\n metrics.$observer.disconnect();\n }\n }\n }, 0);\n });\n\n // Hook up the container to the render queue\n const editingRoot = editingRootNode(this.view.state.selection)!;\n const container = this.view.nodeDOM(editingRoot.pos) as HTMLElement;\n if (container.parentElement) {\n this.renderQueue.setContainer(container);\n }\n\n // Forward selection, if we have one (this can be set while the editor is\n // waiting to render)\n if (this.queuedSelection) {\n this.setSelection(this.queuedSelection.anchor, this.queuedSelection.head);\n this.queuedSelection = null;\n }\n\n // Subscribe to resize event; will reflow the editor to wrap properly at the\n // new width\n this.subscriptions.push(\n this.events.subscribe(ResizeEvent, () => {\n this.debounceResize();\n }),\n );\n\n // Subscribe to scroll event; invalidates the row we're scrolled to so\n // scrollback will be triggered if necessary (after e.g., typing after\n // scrolling offscreen)\n this.subscriptions.push(\n this.events.subscribe(ScrollEvent, () => {\n this.scrollRow = -1;\n }),\n );\n\n // Keep track of mouse state so we can avoid e.g., autoscrolling while the\n // mouse is down\n this.dom.addEventListener(\"mousedown\", (evt) => {\n this.mouseDown = true;\n });\n this.dom.addEventListener(\"mouseup\", (evt) => {\n this.mouseDown = false;\n });\n this.dom.addEventListener(\"mouseleave\", (evt) => {\n // Treat mouse exit as an up since it will cause us to miss the up event\n this.mouseDown = false;\n });\n }\n\n /**\n * Debounced version of editor resize; ensures we don't aggressively resize\n * while size is still changing.\n */\n private debounceResize() {\n // Clear any previously running resize timer\n if (this.resizeTimer !== 0) {\n window.clearTimeout(this.resizeTimer);\n }\n\n // Create a new resize timer\n this.resizeTimer = window.setTimeout(() => {\n if (this.chunk && this.aceEditor) {\n // If the width we last rendered is different than our current width,\n // trigger an Ace resize event (causes editor to reflow wrapped text)\n if (this.renderedWidth !== this.chunk.element.offsetWidth) {\n this.aceEditor.resize();\n }\n }\n this.resizeTimer = 0;\n }, 500);\n }\n\n private updateMode() {\n // get lang\n const lang = this.options.lang(this.node, this.getContents());\n\n if (lang !== null && this.mode !== lang) {\n if (this.chunk) {\n this.chunk.setMode(lang);\n }\n this.mode = lang;\n }\n }\n\n private backspaceMaybeDeleteNode() {\n // if the node is empty and we execute a backspace then delete the node\n if (this.node.childCount === 0) {\n // if there is an input rule we just executed then use this to undo it\n if (undoInputRule(this.view.state)) {\n undoInputRule(this.view.state, this.view.dispatch);\n this.view.focus();\n } else {\n const tr = this.view.state.tr;\n tr.delete(this.getPos(), this.getPos() + this.node.nodeSize);\n tr.setSelection(TextSelection.near(tr.doc.resolve(this.getPos()), -1));\n this.view.dispatch(tr);\n this.view.focus();\n }\n } else if (this.aceEditor) {\n this.aceEditor.execCommand('backspace');\n }\n }\n\n // Checks to see whether an arrow key should escape the editor or not. If so,\n // sends the focus to the right node; if not, executes the given Ace command\n // (to perform the arrow key's usual action)\n private arrowMaybeEscape(unit: string, dir: number, command?: string) {\n if (!this.aceEditor || !this.editSession) {\n return;\n }\n\n const pos = this.aceEditor.getCursorPosition();\n const lastrow = this.editSession.getLength() - 1;\n if (this.getExpanded() && // special handing of keys for collapsed\n (!this.aceEditor.getSelection().isEmpty() ||\n pos.row !== (dir < 0 ? 0 : lastrow) ||\n (unit === 'char' && pos.column !== (dir < 0 ? 0 : this.editSession.getDocument().getLine(pos.row).length)))\n ) {\n // this movement is happening inside the editor itself. don't escape\n // the editor; just execute the underlying command\n if (command) {\n this.aceEditor.execCommand(command);\n }\n return;\n }\n\n // the cursor is about to leave the editor region; flag this to avoid side\n // effects\n this.escaping = true;\n\n // ensure we are focused\n this.view.focus();\n\n // handle arrow key\n handleArrowToAdjacentNode(this.getPos(), dir, this.view.state, this.view.dispatch);\n\n // set focus\n this.view.focus();\n this.escaping = false;\n }\n\n private getContents(): string {\n if (this.editSession) {\n return this.editSession.getValue();\n } else {\n return this.dom.innerText;\n }\n }\n\n /**\n * Ensures that the Ace cursor is visible in the scrollable region of the document.\n */\n private scrollCursorIntoView(): void {\n // No need to try to enforce cursor position if we're already scrolled to\n // this row\n if (this.editSession && this.editSession.getSelection().getCursor().row === this.scrollRow) {\n return;\n }\n\n // Ensure we still have focus before proceeding\n if (this.dom.contains(document.activeElement)) {\n\n // Find the element containing the rendered virtual cursor \n const cursor = this.dom.querySelector(\".ace_cursor\");\n if (cursor === null) {\n return;\n }\n\n // Ace doesn't actually move the cursor but uses CSS translations to\n // make it appear in the right place, so we need to use the somewhat\n // expensive getBoundingClientRect call to get a resolved position.\n // (The alternative would be parse the translate: transform(10px 20px))\n // call from the style property.)\n const editingRoot = editingRootNode(this.view.state.selection)!;\n const container = this.view.nodeDOM(editingRoot.pos) as HTMLElement;\n const containerRect = container.getBoundingClientRect();\n const cursorRect = cursor.getBoundingClientRect();\n\n // Scrolling down?\n const down = cursorRect.bottom + 10 - containerRect.bottom;\n if (down > 0) {\n container.scrollTop += down;\n } else {\n // Scrolling up?\n const up = containerRect.top + 10 - cursorRect.top;\n if (up > 0) {\n container.scrollTop -= up;\n }\n }\n\n // Update cached scroll row so we don't unnecessarily redo these\n // computations\n if (this.editSession) {\n this.scrollRow = this.editSession.getSelection().getCursor().row;\n }\n }\n }\n}\n\nfunction computeChange(oldVal: string, newVal: string) {\n if (oldVal === newVal) {\n return null;\n }\n let start = 0;\n let oldEnd = oldVal.length;\n let newEnd = newVal.length;\n while (start < oldEnd && oldVal.charCodeAt(start) === newVal.charCodeAt(start)) {\n ++start;\n }\n while (oldEnd > start && newEnd > start && oldVal.charCodeAt(oldEnd - 1) === newVal.charCodeAt(newEnd - 1)) {\n oldEnd--;\n newEnd--;\n }\n return {\n from: start,\n to: oldEnd,\n text: newVal.slice(start, newEnd),\n };\n}\n\nfunction arrowHandler(dir: 'up' | 'down' | 'left' | 'right', nodeTypes: string[]) {\n return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n if (state.selection.empty && !(state.selection instanceof GapCursor) && view && view.endOfTextblock(dir)) {\n const side = dir === 'left' || dir === 'up' ? -1 : 1;\n const $head = state.selection.$head;\n const nextPos = Selection.near(state.doc.resolve(side > 0 ? $head.after() : $head.before()), side);\n if (nextPos.$head && nodeTypes.includes(nextPos.$head.parent.type.name)) {\n // check for e.g. math where you can advance across embedded newlines\n if ((dir === 'up' || dir === 'down') && verticalArrowCanAdvanceWithinTextBlock(state.selection, dir)) {\n return false;\n }\n if (dispatch) {\n dispatch(state.tr.setSelection(nextPos));\n }\n return true;\n }\n }\n return false;\n };\n}\n","/*\n * cursor.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction, NodeSelection, Selection } from 'prosemirror-state';\nimport { GapCursor } from 'prosemirror-gapcursor';\n\nexport function handleArrowToAdjacentNode(\n nodePos: number,\n dir: number,\n state: EditorState,\n dispatch?: (tr: Transaction<any>) => void,\n): boolean {\n // resolve the node and position\n const node = state.doc.nodeAt(nodePos);\n if (!node) {\n return false;\n }\n const $pos = state.doc.resolve(nodePos);\n\n // helpers to figure out the nature of prev/next nodes\n const prevNodeSelectable = () => {\n return $pos.nodeBefore && $pos.nodeBefore.type.spec.selectable;\n };\n const nextNodeSelectable = () => {\n const nextNode = state.doc.nodeAt(nodePos + node.nodeSize);\n return nextNode?.type.spec.selectable;\n };\n const prevNodeTextBlock = () => {\n return $pos.nodeBefore && $pos.nodeBefore.isTextblock;\n };\n const nextNodeTextBlock = () => {\n const nextNode = state.doc.nodeAt(nodePos + node.nodeSize);\n return nextNode?.isTextblock;\n };\n const prevNodeCode = () => {\n return $pos.nodeBefore && !!$pos.nodeBefore.type.spec.code;\n };\n const nextNodeCode = () => {\n const nextNode = state.doc.nodeAt(nodePos + node.nodeSize);\n return !!nextNode?.type.spec.code;\n };\n\n // see if we can get a new selection\n const tr = state.tr;\n let selection: Selection | undefined;\n\n // if we are going backwards and there is no previous position, then return a gap cursor\n if (dir < 0 && !$pos.nodeBefore) {\n selection = new GapCursor(tr.doc.resolve(nodePos), tr.doc.resolve(nodePos));\n\n // if we are going forwards and there is no next position, then return a gap cursor\n } else if (dir > 0 && !$pos.nodeAfter) {\n const cursorPos = nodePos + node.nodeSize;\n selection = new GapCursor(tr.doc.resolve(cursorPos), tr.doc.resolve(cursorPos));\n\n // if we are going backwards and the previous node can take node selections then select it\n } else if (dir < 0 && prevNodeSelectable()) {\n const prevNodePos = nodePos - $pos.nodeBefore!.nodeSize;\n selection = NodeSelection.create(tr.doc, prevNodePos);\n\n // if we are going forwards and the next node can take node selections then select it\n } else if (dir >= 0 && nextNodeSelectable()) {\n const nextNodePos = nodePos + node.nodeSize;\n selection = NodeSelection.create(tr.doc, nextNodePos);\n\n // if we are going backwards and the previous node is not a text block then create a gap cursor\n } else if (dir < 0 && (!prevNodeTextBlock() || prevNodeCode())) {\n selection = new GapCursor(tr.doc.resolve(nodePos), tr.doc.resolve(nodePos));\n\n // if we are going forwards and the next node is not a text block then create a gap cursor\n } else if (dir >= 0 && (!nextNodeTextBlock() || nextNodeCode())) {\n const endPos = nodePos + node.nodeSize;\n selection = new GapCursor(tr.doc.resolve(endPos), tr.doc.resolve(endPos));\n\n // otherwise use text selection handling (handles forward/backward text selections)\n } else {\n const targetPos = nodePos + (dir < 0 ? 0 : node.nodeSize);\n const targetNode = tr.doc.nodeAt(targetPos);\n if (targetNode) {\n selection = Selection.near(tr.doc.resolve(targetPos), dir);\n }\n }\n\n if (selection) {\n if (dispatch) {\n tr.setSelection(selection);\n dispatch(tr);\n }\n return true;\n } else {\n return false;\n }\n}\n","/*\n * ace-render-queue.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { AceNodeView } from './ace';\nimport { EditorEvents } from '../../api/events';\nimport { ScrollEvent, UpdateEvent } from '../../api/event-types';\n\n/**\n * Represents a queue of Ace editor instances that are rendered asynchronously.\n */\nexport class AceRenderQueue {\n private readonly renderQueue: AceNodeView[] = [];\n\n private renderCompleted: boolean = false;\n private renderTimer: number = 0;\n private updateTimer: number = 0;\n private container?: HTMLElement;\n private needsSort: boolean = true;\n private bypass: number = 5;\n private observer?: IntersectionObserver;\n private visible: boolean = true;\n private readonly subscriptions: VoidFunction[] = [];\n\n constructor(private events: EditorEvents) {\n // Begin listening for scroll and update events so we can manage the queue\n // accordingly\n this.subscriptions.push(\n events.subscribe(ScrollEvent, () => {\n this.onScroll();\n }),\n );\n this.subscriptions.push(\n events.subscribe(UpdateEvent, () => {\n this.onUpdate();\n }),\n );\n }\n\n /**\n * Sets (or replaces) the scroll container hosting the render queue. The\n * scroll container is used to prioritize the queue (i.e. objects in the\n * viewport or close to it are to be given more priority).\n *\n * @param container The HTML element of the scroll container\n */\n public setContainer(container: HTMLElement) {\n // Skip if we're already looking at this container\n if (this.container === container) {\n return;\n }\n\n // Clean up observer on any previous container\n if (this.observer) {\n this.observer.disconnect();\n }\n\n // Save reference to container\n this.container = container;\n\n // Create intersection observer to ensure that we don't needlessly churn\n // through renders while offscreen.\n this.observer = new IntersectionObserver(\n (entries: IntersectionObserverEntry[]) => {\n for (const entry of entries) {\n if (entry.isIntersecting && !this.visible) {\n // We just became visible; process the render queue now.\n this.visible = true;\n this.processRenderQueue();\n }\n if (!entry.isIntersecting && this.visible) {\n // We just lost visibility; end processing of the render queue. (Note\n // that we only do this when connected to the DOM as another reason\n // the element can become invisible is ProseMirror swapping it out\n // internally.)\n if (this.container?.parentElement) {\n this.visible = false;\n this.cancelTimer();\n }\n }\n }\n },\n {\n root: null,\n },\n );\n\n // Begin observing intersection events in container\n this.observer.observe(container);\n }\n\n /**\n * Invoke when the editor surface is scrolled\n */\n private onScroll() {\n // Whenever a scroll event occurs, we need to re-sort the queue so that\n // objects in or closest to the viewport are given priority.\n this.needsSort = true;\n\n // If we don't think we're visible but we're scrolling and have height,\n // then we are in fact visible. (This catches a case where the\n // intsersection observer created below doesn't fire for visiblity\n // changes.)\n if (!this.visible && this.container && this.container.offsetHeight > 0) {\n this.visible = true;\n this.processRenderQueue();\n }\n }\n\n /**\n * Invoke when the document has changed\n */\n private onUpdate() {\n // Debounce update timer. This timer is used to prevent the CPU intensive\n // editor rendering from happening while the user is actively updating the\n // document.\n if (this.updateTimer !== 0) {\n window.clearTimeout(this.updateTimer);\n }\n this.updateTimer = window.setTimeout(() => {\n this.updateTimer = 0;\n // Process queue immediately if we have one\n this.scheduleRender(0);\n }, 1000);\n }\n\n /**\n * Indicates whether the render queue has a scroll container defined\n */\n public hasContainer(): boolean {\n if (this.container) {\n return true;\n }\n return false;\n }\n\n /**\n * Indicates whether the rendering is finished.\n */\n public isRenderCompleted(): boolean {\n return this.renderCompleted;\n }\n\n /**\n * Adds a node view to the render queue\n */\n public add(view: AceNodeView) {\n // We allow the first few code blocks to render synchronously instead of\n // being dumped into the queue for later processing. This slightly increases\n // startup time but prevents the flicker that would otherwise occur as\n // editors render one by one.\n if (this.bypass > 0) {\n this.bypass--;\n view.initEditor();\n return;\n }\n\n this.renderQueue.push(view);\n\n // Defer/debounce rendering of editors until event loop finishes\n if (this.renderTimer === 0) {\n this.scheduleRender(0);\n }\n }\n\n /**\n * Processes the queue of editor instances that need to be rendered.\n */\n private processRenderQueue() {\n // No work to do if queue is empty\n if (this.renderQueue.length === 0) {\n return;\n }\n\n // Don't render while hidden; it wastes resources plus can result in\n // incorrect sizing calculations\n if (!this.visible) {\n return;\n }\n\n // Don't render while the user is actively updating the document (it makes\n // the interface sluggish)\n if (this.updateTimer !== 0) {\n return;\n }\n\n // Compute offset for sorting (based on scroll position)\n let offset = 0;\n if (this.container) {\n offset = this.container.scrollTop;\n }\n\n // Sort the queue if required\n if (this.needsSort) {\n // Sort the render queue based on distance from the top of the viewport\n this.renderQueue.sort((a, b) => {\n return Math.abs(a.dom.offsetTop - offset) - Math.abs(b.dom.offsetTop - offset);\n });\n\n // Clear flag so we don't sort the queue on every render\n this.needsSort = false;\n }\n\n // Pop the next view (editor instance) to be rendered off the stack.\n // Fast-forward past instances that no longer have a position; these can\n // accumulate when NodeViews are added to the render queue but replaced\n // (by a document rebuild) before they have a chance to render.\n let view: AceNodeView | undefined;\n while ((view === null || view === undefined || view.getPos() === undefined) &&\n this.renderQueue.length > 0) {\n view = this.renderQueue.shift();\n }\n\n // Render this view\n if (view) {\n view.initEditor();\n }\n\n if (this.renderQueue.length > 0) {\n // There are still remaining editors to be rendered, so process again on\n // the next event loop.\n //\n // If these editors are near the viewport, render them as soon as\n // possible; otherwise, let the render proceed at a slower pace to\n // increase responsiveness.\n let delayMs = 1000;\n if (this.container) {\n const distance = Math.abs(this.renderQueue[0].dom.offsetTop - offset);\n if (distance < this.container.offsetHeight * 2) {\n // Container is near the viewport, so render it ASAP\n delayMs = 0;\n }\n }\n this.scheduleRender(delayMs);\n } else {\n // No remaining editors; we're done.\n this.renderCompleted = true;\n this.destroy();\n }\n }\n\n /**\n * Cancels the timer that is responsible for triggering the processing of the\n * next unit in the render queue.\n */\n private cancelTimer() {\n if (this.renderTimer !== 0) {\n window.clearTimeout(this.renderTimer);\n this.renderTimer = 0;\n }\n }\n\n /**\n * Reschedules a pending render, or schedules a new one.\n */\n private scheduleRender(delayMs: number) {\n this.cancelTimer();\n this.renderTimer = window.setTimeout(() => {\n this.processRenderQueue();\n this.renderTimer = 0;\n }, delayMs);\n }\n\n /**\n * Cleans up the render queue instance\n */\n private destroy() {\n // Cancel any pending renders\n this.cancelTimer();\n\n // Clear any pending update timer\n if (this.updateTimer !== 0) {\n window.clearTimeout(this.updateTimer);\n }\n\n // Remove event subscriptions\n this.subscriptions.forEach(unsub => unsub());\n\n // Clean up resize observer\n if (this.observer) {\n this.observer.disconnect();\n }\n }\n}\n","/*\n * ace-placeholder.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n/**\n * Represents a placeholder (preview) rendering of an Ace editor. Since Ace\n * editors are somewhat expensive to draw, this placeholder is used in place\n * of a real editor instance to make code visible and allow for correct height\n * computations.\n */\nexport class AcePlaceholder {\n private readonly element: HTMLElement;\n\n constructor(content: string) {\n const ele = document.createElement('pre');\n ele.innerText = content;\n ele.className = 'ace_editor';\n this.element = ele;\n }\n\n public getElement() {\n return this.element;\n }\n}\n","/*\n * ace-node-views.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { GapCursor } from 'prosemirror-gapcursor';\nimport { AceNodeView } from './ace';\nimport { EditorView } from 'prosemirror-view';\n\n/**\n * Track all Ace node view instances to implement additional behavior\n * (e.g. gap cursor for clicks between editor instances)\n */\n\nexport class AceNodeViews {\n private nodeViews: AceNodeView[];\n\n constructor() {\n this.nodeViews = [];\n }\n public add(nodeView: AceNodeView) {\n this.nodeViews.push(nodeView);\n }\n\n public remove(nodeView: AceNodeView) {\n const index = this.nodeViews.indexOf(nodeView);\n if (index >= 0) {\n this.nodeViews.splice(index, 1);\n }\n }\n\n public activeNodeView() : AceNodeView | undefined {\n return this.nodeViews.find(view => view.isFocused());\n }\n\n public handleClick(view: EditorView, event: Event): boolean {\n // alias to mouseEvent\n const mouseEvent = event as MouseEvent;\n\n // see if the click is between 2 contiguously located node views\n for (const nodeView of this.nodeViews) {\n // gap cursor we might detect\n let gapCursor: GapCursor | null = null;\n\n // get the position\n const pos = nodeView.getPos();\n const $pos = view.state.doc.resolve(pos);\n\n // if the previous node is code, see if the click is between the 2 nodes\n if ($pos.nodeBefore && $pos.nodeBefore.type.spec.code) {\n // get our bounding rect\n const dom = nodeView.dom;\n const nodeViewRect = dom.getBoundingClientRect();\n\n // get the previous node's bounding rect\n const prevNodePos = pos - $pos.nodeBefore!.nodeSize;\n const prevNodeView = this.nodeViews.find(nv => nv.getPos() === prevNodePos);\n if (prevNodeView) {\n const prevNodeRect = prevNodeView.dom.getBoundingClientRect();\n\n // check for a click between the two nodes\n const mouseY = mouseEvent.clientY;\n if (mouseY > prevNodeRect.top + prevNodeRect.height && mouseY < nodeViewRect.top) {\n gapCursor = new GapCursor($pos, $pos);\n }\n }\n\n // if there is no previous node and the click is above us then gap cursor above\n // (only do this if the cursor is within 150 pixels of the left edge)\n } else if (\n !$pos.nodeBefore &&\n $pos.depth === 1 &&\n mouseEvent.clientY < nodeView.dom.getBoundingClientRect().top &&\n Math.abs(mouseEvent.clientX - nodeView.dom.getBoundingClientRect().left) < 150\n ) {\n gapCursor = new GapCursor($pos, $pos);\n }\n\n // return gapCursor if we found one\n if (gapCursor) {\n const tr = view.state.tr;\n\n // notify the node views that we are setting a gap cursor\n this.nodeViews.forEach(ndView => ndView.setGapCursorPending(true));\n\n // ensure the view is focused\n view.focus();\n\n // set the selection\n tr.setSelection(gapCursor);\n view.dispatch(tr);\n\n // notify the node views that we are done setting the gap cursor\n this.nodeViews.forEach(ndView => ndView.setGapCursorPending(false));\n\n // prevent default event handling\n event.preventDefault();\n event.stopImmediatePropagation();\n return true;\n }\n }\n\n return false;\n }\n}\n","/*\n * attr_edit.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { findChildren } from 'prosemirror-utils';\nimport { Plugin, PluginKey, Transaction, EditorState, Selection } from 'prosemirror-state';\nimport { DecorationSet, Decoration, WidgetDecorationSpec } from 'prosemirror-view';\n\nimport { EditorUI } from '../../api/ui';\nimport { pandocAttrEnabled, pandocAttrAvailable } from '../../api/pandoc_attr';\nimport { kSetMarkdownTransaction, transactionsAreTypingChange, forChangedNodes } from '../../api/transaction';\n\nimport { PandocExtensions } from '../../api/pandoc';\nimport { Extension } from '../../api/extension';\nimport { hasFencedCodeBlocks } from '../../api/pandoc_format';\nimport { selectionIsWithinRange } from '../../api/selection';\n\nimport { AttrEditOptions } from '../../api/attr_edit';\nimport { attrEditDecorationWidget } from '../../api/attr_edit/attr_edit-decoration';\n\nimport { AttrEditCommand, attrEditNodeCommandFn } from './attr_edit-command';\nimport { EditorFormat } from '../../api/format';\n\nexport function attrEditExtension(\n pandocExtensions: PandocExtensions,\n ui: EditorUI,\n format: EditorFormat,\n editors: AttrEditOptions[],\n): Extension {\n const hasAttr = pandocAttrEnabled(pandocExtensions) || hasFencedCodeBlocks(pandocExtensions);\n\n return {\n commands: (_schema: Schema) => {\n if (hasAttr) {\n return [new AttrEditCommand(ui, format, pandocExtensions, editors)];\n } else {\n return [];\n }\n },\n\n plugins: (_schema: Schema) => {\n if (hasAttr) {\n return [new AttrEditDecorationPlugin(ui, pandocExtensions, editors)];\n } else {\n return [];\n }\n },\n };\n}\n\nconst key = new PluginKey<DecorationSet>('attr_edit_decoration');\n\nclass AttrEditDecorationPlugin extends Plugin<DecorationSet> {\n constructor(ui: EditorUI, pandocExtensions: PandocExtensions, editors: AttrEditOptions[]) {\n\n const decoratorForNode = (editor: AttrEditOptions, \n selection: Selection, \n node: ProsemirrorNode, \n pos: number) => {\n\n // if we prefer hidden and have no attributes then bail\n const range = { from: pos, to: pos + node.nodeSize };\n if (editor.preferHidden && \n !pandocAttrAvailable(node.attrs, !editor.noKeyvalueTags) && \n !selectionIsWithinRange(selection, range)) {\n return undefined;\n }\n\n // provide some editor defaults\n editor.tags = editor.tags ||\n (editorNode => {\n const attrTags = [];\n if (editorNode.attrs.id) {\n attrTags.push(`#${editorNode.attrs.id}`);\n }\n if (editorNode.attrs.classes && editorNode.attrs.classes.length) {\n attrTags.push(`${editorNode.attrs.classes.map((clz: string) => '.' + clz).join(' ')}`);\n }\n if (!editor.noKeyvalueTags && editorNode.attrs.keyvalue && editorNode.attrs.keyvalue.length) {\n attrTags.push(`${editorNode.attrs.keyvalue.map(\n (kv: [string,string]) => kv[0] + '=\"' + (kv[1] || '1') + '\"').join(' ')}\n `);\n }\n return attrTags;\n });\n editor.offset = editor.offset || { top: 0, right: 0 };\n\n // get editFn\n const editFn = attrEditNodeCommandFn(\n { node, pos }, \n ui, \n pandocExtensions, \n editors\n );\n\n // attr_edit controls\n return attrEditDecorationWidget({\n pos,\n tags: editor.tags(node),\n editFn,\n ui,\n offset: editor.offset,\n preferHidden: editor.preferHidden\n });\n \n };\n\n function decoratorsForDoc(state: EditorState) {\n const decorations: Decoration[] = [];\n const nodeTypes = editors.map(ed => ed.type(state.schema));\n findChildren(state.doc, node => nodeTypes.includes(node.type), true).forEach(attrNode => {\n const editor = editors.find(ed => ed.type(state.schema) === attrNode.node.type)!;\n if (!editor.noDecorator) {\n const decorator = decoratorForNode(editor, state.selection, attrNode.node, attrNode.pos);\n if (decorator) {\n decorations.push(decorator);\n }\n \n }\n });\n return DecorationSet.create(state.doc, decorations);\n }\n \n super({\n key,\n state: {\n init: (_config: { [key: string]: any }, state: EditorState) => {\n return decoratorsForDoc(state);\n },\n apply: (tr: Transaction, set: DecorationSet, oldState: EditorState, newState: EditorState) => {\n\n // replacing the entire editor triggers decorations\n if (tr.getMeta(kSetMarkdownTransaction)) {\n return decoratorsForDoc(newState);\n }\n\n // get schema and nodetypes\n const schema = newState.schema;\n const nodeTypes = editors.map(ed => ed.type(schema));\n\n // map \n set = set.map(tr.mapping, tr.doc);\n\n // typing change, return existing decorations\n if (transactionsAreTypingChange([tr])) {\n return set;\n }\n\n // selection change, might need to toggle some decorations on/off\n if (tr.selectionSet) {\n \n // look through each decorator, if it has preferHidden, it's node has no attributes,\n // and it's no longer in the selection then remove it\n const preferHiddenDecorators = set.find(undefined, undefined, spec => !!spec.preferHidden);\n for (const dec of preferHiddenDecorators) {\n const node = newState.doc.nodeAt(dec.from);\n if (node && !pandocAttrAvailable(node.attrs)) {\n if (!selectionIsWithinRange(tr.selection, \n { from: dec.from, to: dec.from + node.nodeSize })) {\n set = set.remove([dec]);\n }\n }\n }\n \n // now look for nodes above us with preferHidden and add decorators for them\n const $head = tr.selection.$head;\n for (let i=1; i<=$head.depth; i++) {\n const parentWithAttrs = { node: $head.node(i), pos: $head.before(i) };\n if (!nodeTypes.includes(parentWithAttrs.node.type)) {\n continue;\n }\n const { pos, node } = parentWithAttrs;\n const editor = editors.find(ed => ed.type(schema) === parentWithAttrs.node.type)!;\n if (editor?.preferHidden && set.find(pos, pos).length === 0) {\n const decorator = decoratorForNode(editor, tr.selection, node, pos);\n if (decorator) {\n set = set.add(tr.doc, [decorator]);\n }\n }\n }\n }\n\n // doc didn't change, return existing decorations\n if (!tr.docChanged && !tr.storedMarksSet) {\n return set;\n }\n \n // scan for added/modified nodes that have attr_edit decorations\n forChangedNodes(\n oldState,\n newState,\n node => nodeTypes.includes(node.type),\n (node, pos) => {\n // remove existing decorations for changed nodes\n const removeDecorations = set.find(pos, pos, (spec: WidgetDecorationSpec) => {\n return !!spec.key && spec.key.startsWith(\"tags:\");\n });\n if (removeDecorations.length > 0) {\n set = set.remove(removeDecorations);\n }\n\n // get editor and screen on noDecorator\n const editor = editors.find(ed => ed.type(schema) === node.type)!;\n if (!editor.noDecorator) {\n const decorator = decoratorForNode(editor, newState.selection, node, pos);\n if (decorator) {\n set = set.add(tr.doc, [decorator]);\n }\n }\n },\n );\n \n // return the updated set\n return set;\n }\n },\n props: {\n decorations: (state: EditorState) => {\n return key.getState(state);\n },\n },\n });\n }\n}\n\n\n","/*\n * attr_edit-command.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction, NodeSelection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { Mark, Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { findParentNodeOfType, NodeWithPos } from 'prosemirror-utils';\n\nimport { EditorUI } from '../../api/ui';\nimport { pandocAttrInSpec } from '../../api/pandoc_attr';\nimport { getSelectionMarkRange } from '../../api/mark';\nimport { EditorCommandId, ProsemirrorCommand } from '../../api/command';\n\nimport { AttrEditOptions } from '../../api/attr_edit';\nimport { pandocAutoIdentifier, gfmAutoIdentifier } from '../../api/pandoc_id';\nimport { PandocExtensions } from '../../api/pandoc';\nimport { fragmentText } from '../../api/fragment';\nimport { kEditAttrShortcut } from '../../api/attr_edit/attr_edit-decoration';\nimport { EditorFormat } from '../../api/format';\nimport { editMathAttributesEnabled, editMathAttributes } from '../../marks/math/math-commands';\n\nexport class AttrEditCommand extends ProsemirrorCommand {\n constructor(ui: EditorUI, format: EditorFormat, pandocExtensions: PandocExtensions, editors: AttrEditOptions[]) {\n super(EditorCommandId.AttrEdit, [kEditAttrShortcut], attrEditCommandFn(ui, format, pandocExtensions, editors));\n }\n}\n\nexport function attrEditCommandFn(\n ui: EditorUI, \n format: EditorFormat,\n pandocExtensions: PandocExtensions, \n editors: AttrEditOptions[]\n) {\n return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n \n // give math attributes first crack (in case it's inside a node with attributes)\n if (editMathAttributesEnabled(format, state)) {\n return editMathAttributes(ui)(state, dispatch, view);\n }\n \n // see if there is an active mark with attrs or a parent node with attrs\n const marks = state.storedMarks || state.selection.$head.marks();\n const mark = marks.find((m: Mark) => pandocAttrInSpec(m.type.spec));\n\n let node: ProsemirrorNode | null = null;\n let pos: number = 0;\n // node selection of node with attributes\n if (state.selection instanceof NodeSelection && pandocAttrInSpec(state.selection.node.type.spec)) {\n node = state.selection.node;\n pos = state.selection.$anchor.pos;\n } else {\n // selection inside node with editable attributes\n const nodeTypes = editors.map(editor => editor.type(state.schema));\n const parentWithAttrs = findParentNodeOfType(nodeTypes)(state.selection);\n if (parentWithAttrs) {\n node = parentWithAttrs.node;\n pos = parentWithAttrs.pos;\n }\n }\n\n // return false (disabled) for no targets\n if (!mark && !node) {\n return false;\n }\n\n // if this is a node and we have a custom attribute editor then just delegate to that\n if (node) {\n const editor = editors.find(ed => ed.type(state.schema) === node!.type)!;\n if (editor && editor.editFn) {\n return editor.editFn()(state, dispatch, view);\n }\n }\n\n // edit attributes\n async function asyncEditAttrs() {\n if (dispatch) {\n if (mark) {\n await editMarkAttrs(mark, state, dispatch, ui);\n } else {\n await editNodeAttrs(pos, state, dispatch, ui, pandocExtensions);\n }\n if (view) {\n view.focus();\n }\n }\n }\n asyncEditAttrs();\n\n // return true\n return true;\n };\n}\n\nexport function attrEditNodeCommandFn(nodeWithPos: NodeWithPos, \n ui: EditorUI, \n pandocExtensions: PandocExtensions, \n editors: AttrEditOptions[]) {\n \n return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n\n // alias\n const { node, pos } = nodeWithPos;\n\n // registered editor\n const editor = editors.find(ed => ed.type(state.schema) === node!.type)!;\n if (editor && editor.editFn) {\n return editor.editFn()(state, dispatch, view);\n }\n\n // generic editor\n async function asyncEditAttrs() {\n if (dispatch) {\n await editNodeAttrs(pos, state, dispatch, ui, pandocExtensions);\n if (view) {\n view.focus();\n }\n }\n }\n asyncEditAttrs();\n\n // return true\n return true;\n };\n}\n\nasync function editMarkAttrs(\n mark: Mark,\n state: EditorState,\n dispatch: (tr: Transaction<any>) => void,\n ui: EditorUI,\n): Promise<void> {\n const attrs = mark.attrs;\n const markType = mark.type;\n const result = await ui.dialogs.editAttr({ ...attrs });\n if (result) {\n const tr = state.tr;\n const range = getSelectionMarkRange(state.selection, markType);\n tr.removeMark(range.from, range.to, markType);\n tr.addMark(\n range.from,\n range.to,\n markType.create({\n ...attrs,\n ...result.attr,\n }),\n );\n dispatch(tr);\n }\n}\n\nasync function editNodeAttrs(\n pos: number,\n state: EditorState,\n dispatch: (tr: Transaction<any>) => void,\n ui: EditorUI,\n pandocExtensions: PandocExtensions,\n): Promise<void> {\n const node = state.doc.nodeAt(pos);\n if (node) {\n const attrs = node.attrs;\n const result = await ui.dialogs.editAttr({ ...attrs }, idHint(node, pandocExtensions));\n if (result) {\n const tr = state.tr;\n const targetNode = tr.doc.nodeAt(pos);\n if (targetNode) {\n tr.setNodeMarkup(pos, targetNode.type, {\n ...attrs,\n ...result.attr,\n }),\n dispatch(tr);\n }\n }\n }\n}\n\nfunction idHint(node: ProsemirrorNode, pandocExtensions: PandocExtensions) {\n if (node.type === node.type.schema.nodes.heading) {\n const unemoji = pandocExtensions.gfm_auto_identifiers;\n const text = fragmentText(node.content, unemoji);\n\n if (pandocExtensions.gfm_auto_identifiers) {\n return gfmAutoIdentifier(text, pandocExtensions.ascii_identifiers);\n } else {\n return pandocAutoIdentifier(text, pandocExtensions.ascii_identifiers);\n }\n } else {\n return undefined;\n }\n}\n","/*\n * editor-theme.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport interface EditorTheme {\n darkMode: boolean;\n solarizedMode: boolean;\n cursorColor: string;\n selectionColor: string;\n nodeSelectionColor: string;\n backgroundColor: string;\n metadataBackgroundColor: string;\n chunkBackgroundColor: string;\n spanBackgroundColor: string;\n divBackgroundColor: string;\n commentColor: string;\n commentBackgroundColor: string;\n gutterBackgroundColor: string;\n gutterTextColor: string;\n textColor: string;\n lightTextColor: string;\n placeholderTextColor: string;\n invisibleTextColor: string;\n linkTextColor: string;\n surfaceWidgetTextColor: string;\n markupTextColor: string;\n findTextBackgroundColor: string;\n findTextBorderColor: string;\n borderBackgroundColor: string;\n blockBorderColor: string;\n focusOutlineColor: string;\n paneBorderColor: string;\n fixedWidthFont: string;\n fixedWidthFontSizePt: number;\n proportionalFont: string;\n proportionalFontSizePt: number;\n code: CodeTheme;\n}\n\nexport interface CodeTheme {\n keywordColor: string;\n atomColor: string;\n numberColor: string;\n variableColor: string;\n defColor: string;\n operatorColor: string;\n commentColor: string;\n stringColor: string;\n metaColor: string;\n builtinColor: string;\n bracketColor: string;\n tagColor: string;\n attributeColor: string;\n hrColor: string;\n linkColor: string;\n errorColor: string;\n}\n\nexport function defaultTheme(): EditorTheme {\n return {\n darkMode: false,\n solarizedMode: false,\n cursorColor: 'black',\n selectionColor: '#8cf',\n nodeSelectionColor: 'rgb(102,155,243)',\n backgroundColor: 'white',\n metadataBackgroundColor: 'rgb(255, 255, 255)',\n chunkBackgroundColor: 'rgb(251,251,251)',\n spanBackgroundColor: '#fff8dc',\n divBackgroundColor: 'rgb(243, 243, 243)',\n commentColor: '#3c4c72',\n commentBackgroundColor: '#FFECCB',\n gutterBackgroundColor: '#f0f0f0',\n gutterTextColor: '#333',\n textColor: 'black',\n surfaceWidgetTextColor: 'rgba(0,0,0,0.5)',\n lightTextColor: 'rgb(60, 76, 114)',\n linkTextColor: '#106ba3',\n placeholderTextColor: 'gray',\n invisibleTextColor: 'rgb(191, 191, 191)',\n markupTextColor: 'rgb(185, 6, 144)',\n findTextBackgroundColor: 'rgb(250, 250, 255)',\n findTextBorderColor: 'rgb(200, 200, 250)',\n borderBackgroundColor: '#ddd',\n blockBorderColor: '#ddd',\n focusOutlineColor: '#5d84cd',\n paneBorderColor: 'silver',\n fixedWidthFont: 'monospace, monospace',\n fixedWidthFontSizePt: 9,\n proportionalFont: '\"Lucida Sans\", \"DejaVu Sans\", \"Lucida Grande\", \"Segoe UI\", Verdana, Helvetica, sans-serif',\n proportionalFontSizePt: 10,\n code: {\n keywordColor: 'rgb(0, 0, 255)',\n atomColor: 'rgb(88, 92, 246)',\n numberColor: 'rgb(0, 0, 205)',\n variableColor: 'rgb(0, 0, 0)',\n defColor: 'rgb(0, 0, 0)',\n operatorColor: 'rgb(104, 118, 135)',\n commentColor: 'rgb(76, 136, 107)',\n stringColor: 'rgb(3, 106, 7)',\n metaColor: 'rgb(0, 0, 0)',\n builtinColor: 'rgb(0, 0, 0)',\n bracketColor: 'rgb(104, 118, 135)',\n tagColor: 'rgb(0, 22, 142)',\n attributeColor: 'rgb(0, 0, 0)',\n hrColor: 'rgb(0, 0, 0)',\n linkColor: 'rgb(0, 0, 255)',\n errorColor: 'rgb(197, 6, 11)',\n },\n };\n}\n\nexport function applyTheme(theme: EditorTheme) {\n // merge w/ defaults\n const defaults = defaultTheme();\n theme = {\n ...defaults,\n ...theme,\n code: {\n ...defaults.code,\n ...theme.code,\n },\n };\n\n // generate theme css\n const themeCss = `\n .pm-default-theme .pm-background-color {\n background-color: ${defaults.backgroundColor} !important;\n }\n .pm-default-theme .pm-text-color {\n color: ${defaults.textColor} !important;\n }\n .pm-default-theme .pm-border-background-color {\n background-color: ${defaults.borderBackgroundColor} !important;\n }\n .pm-default-theme .pm-input-text {\n border-color: ${defaults.paneBorderColor} !important\n }\n .pm-default-theme .pm-block-border-color {\n border-color: ${defaults.blockBorderColor} !important;\n }\n .pm-default-theme .pm-input-outline-button {\n color: ${defaults.textColor};\n border-color: ${defaults.textColor};\n background-color: ${defaults.backgroundColor};\n }\n .pm-default-theme .pm-selected-navigation-tree-item {\n background-color: ${defaults.findTextBackgroundColor} !important;\n border-color: ${defaults.findTextBorderColor} !important;\n }\n .pm-default-theme .pm-navigation-tree-item {\n border-color: ${defaults.backgroundColor} !important;\n }\n .pm-default-theme .pm-block-border-color {\n border-color: ${defaults.blockBorderColor} !important;\n }\n .pm-default-theme .pm-focus-outline-color {\n border-color: ${defaults.focusOutlineColor} !important;\n }\n .pm-default-theme .pm-input-button {\n border-color: ${defaults.borderBackgroundColor};\n background-color: ${defaults.backgroundColor};\n }\n .pm-default-theme .pm-placeholder-text-color {\n color: ${defaults.placeholderTextColor} !important;\n }\n .pm-default-theme .pm-background-color *::selection {\n background-color: ${defaults.selectionColor} !important;\n }\n .pm-default-theme .pm-find-text,\n .pm-default-theme .pm-list-item-selected,\n .pm-default-theme .pm-grid-item-selected {\n background-color: ${defaults.findTextBackgroundColor} !important;\n box-shadow: 0 0 0 1px ${defaults.findTextBorderColor}; \n border-radius: 3px;\n }\n .pm-default-theme .pm-rstudio-button {\n border-color: DarkGray !important;\n }\n .pm-cursor-color {\n caret-color: ${theme.cursorColor}\n }\n .pm-background-color {\n background-color: ${theme.backgroundColor} !important;\n }\n .pm-metadata-background-color {\n background-color: ${theme.metadataBackgroundColor} !important;\n }\n .pm-chunk-background-color {\n background-color: ${theme.chunkBackgroundColor} !important;\n }\n .pm-span-background-color {\n background-color: ${theme.spanBackgroundColor} !important;\n }\n .pm-div-background-color {\n background-color: ${theme.divBackgroundColor} !important;\n }\n .pm-nbsp-background-color {\n background-color: ${theme.spanBackgroundColor} !important;\n }\n .pm-comment-color {\n color: ${theme.commentColor} !important;\n }\n .pm-comment-background-color {\n background-color: ${theme.commentBackgroundColor} !important;\n }\n .pm-text-color {\n color: ${theme.textColor} !important;\n }\n .pm-surface-widget-text-color {\n color: ${theme.surfaceWidgetTextColor} !important;\n }\n .pm-light-text-color {\n color: ${theme.lightTextColor} !important;\n }\n .pm-placeholder-text-color {\n color: ${theme.placeholderTextColor} !important;\n }\n .pm-invisible-text-color {\n color: ${theme.invisibleTextColor} !important;\n }\n .pm-link-text-color {\n color: ${theme.linkTextColor} !important;\n }\n .pm-markup-text-color {\n color: ${theme.markupTextColor} !important;\n }\n .pm-find-text,\n .pm-list-item-selected,\n .pm-grid-item-selected {\n background-color: ${theme.findTextBackgroundColor} !important;\n box-shadow: 0 0 0 1px ${theme.findTextBorderColor}; \n border-radius: 3px;\n }\n .pm-selected-text {\n background-color: ${theme.selectionColor} !important;\n }\n .pm-selected-list-item {\n background-color: ${theme.findTextBackgroundColor} !important;\n border: 1px solid ${theme.findTextBorderColor} !important;\n border-radius: 3px;\n }\n .pm-dark-mode .pm-selected-list-item {\n background-color: ${theme.chunkBackgroundColor} !important;\n border: 1px solid transparent !important;\n }\n .pm-navigation-tree-item {\n border: 1px solid ${theme.backgroundColor} !important;\n border-radius: 3px;\n margin-left: 2px;\n margin-right: 2px;\n }\n .pm-selected-navigation-tree-item {\n background-color: ${theme.findTextBackgroundColor} !important;\n border: 1px solid ${theme.findTextBorderColor} !important;\n border-radius: 3px;\n margin-left: 2px;\n margin-right: 2px;\n }\n .pm-border-background-color {\n background-color: ${theme.borderBackgroundColor}!important;\n }\n .pm-block-border-color {\n border-color: ${theme.blockBorderColor} !important;\n }\n .pm-focus-outline-color {\n border-color: ${theme.focusOutlineColor} !important;\n }\n .pm-pane-border-color {\n border-color: ${theme.paneBorderColor} !important;\n }\n .pm-div .pm-div {\n border-color: ${theme.focusOutlineColor} !important;\n }\n .pm-raw-block-border {\n border-color: ${theme.markupTextColor} !important;\n }\n .pm-popup {\n box-shadow: 0 1px 3px ${theme.blockBorderColor} !important;\n }\n .pm-selected-node-outline-color,\n .ProseMirror-selectednode {\n outline-color: ${theme.nodeSelectionColor} !important;\n }\n .pm-selected-node-border-color {\n border-color: ${theme.nodeSelectionColor} !important;\n }\n .pm-dark-mode .pm-selected-node-outline-color,\n .pm-dark-mode .ProseMirror-selectednode {\n outline-color: ${theme.nodeSelectionColor} !important;\n }\n .pm-dark-mode .pm-selected-node-border-color {\n border-color: ${theme.nodeSelectionColor} !important;\n }\n .pm-background-color *::selection {\n background-color: ${theme.selectionColor} !important;\n }\n .pm-background-color *::-moz-selection {\n background-color: ${theme.selectionColor} !important;\n }\n .pm-fixedwidth-font {\n font-family: ${theme.fixedWidthFont} !important;\n font-size: ${theme.fixedWidthFontSizePt}pt !important;\n }\n .pm-proportional-font {\n font-family: ${theme.proportionalFont} !important;\n font-size: ${theme.proportionalFontSizePt}pt !important;\n }\n .pm-emoji-font {\n font-family: ${theme.fixedWidthFont} !important;\n }\n .pm-input-text {\n border-color: ${theme.paneBorderColor};\n }\n .pm-input-button {\n border-color: ${theme.borderBackgroundColor};\n background-color: ${theme.backgroundColor};\n }\n .pm-input-outline-button {\n color: ${theme.textColor};\n border-color: ${theme.textColor};\n background-color: ${theme.backgroundColor};\n }\n .pm-ace-first-line-meta .ace_text-layer .ace_line_group:first-child,\n .pm-ace-first-line-meta .ace_text-layer .ace_line_group:first-child span {\n color: ${theme.lightTextColor} !important;\n }\n .pm-ace-collapsed.pm-ace-focused {\n border-color: ${theme.paneBorderColor} !important;\n }\n .ProseMirror-gapcursor:after {\n border-top: 1px solid ${theme.textColor};\n }\n `;\n\n // set style\n setStyleElement('pm-editor-theme-styles-id', themeCss);\n}\n\nexport function applyPadding(padding: string) {\n const paddingCss = `\n .pm-editing-root-node {\n padding-left: ${padding} !important;\n padding-right: ${padding} !important;\n }\n `;\n setStyleElement('pm-editor-padding-styles-id', paddingCss);\n}\n\nfunction setStyleElement(id: string, css: string) {\n // get access to style element (create if necessary)\n let styleEl = window.document.getElementById(id);\n if (styleEl === null) {\n styleEl = window.document.createElement('style');\n styleEl.setAttribute('id', id);\n styleEl.setAttribute('type', 'text/css');\n window.document.head.appendChild(styleEl);\n }\n\n // set css\n styleEl.innerHTML = css;\n}\n","/*\n * editor-images.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorUIImages } from '../api/ui-images';\n\nimport copyImage from './images/copy.png';\nimport propertiesImage from './images/properties.png';\nimport propertiesDecoImage from './images/properties_deco.png';\nimport propertiesDecoDarkImage from './images/properties_deco_dark.png';\nimport removelinkImage from './images/removelink.png';\nimport runchunkImage from './images/runchunk.png';\nimport runprevchunksImage from './images/runprevchunks.png';\nimport searchImage from './images/search.png';\nimport searchProgressImage from './images/search_progress.gif';\n\nimport omniInsertGenericImage from './images/omni_insert/generic.png';\nimport heading1Image from './images/omni_insert/heading1.png';\nimport heading1DarkImage from './images/omni_insert/heading1_dark.png';\nimport heading2Image from './images/omni_insert/heading2.png';\nimport heading2DarkImage from './images/omni_insert/heading2_dark.png';\nimport heading3Image from './images/omni_insert/heading3.png';\nimport heading3DarkImage from './images/omni_insert/heading3_dark.png';\nimport heading4Image from './images/omni_insert/heading4.png';\nimport heading4DarkImage from './images/omni_insert/heading4_dark.png';\nimport bulletListImage from './images/omni_insert/bullet_list.png';\nimport bulletListDarkImage from './images/omni_insert/bullet_list_dark.png';\nimport orderedListImage from './images/omni_insert/ordered_list.png';\nimport orderedListDarkImage from './images/omni_insert/ordered_list_dark.png';\nimport blockquoteImage from './images/omni_insert/blockquote.png';\nimport blockquoteDarkImage from './images/omni_insert/blockquote_dark.png';\nimport mathInlineImage from './images/omni_insert/math_inline.png';\nimport mathInlineDarkImage from './images/omni_insert/math_inline_dark.png';\nimport mathDisplayImage from './images/omni_insert/math_display.png';\nimport mathDisplayDarkImage from './images/omni_insert/math_display_dark.png';\nimport htmlBlockImage from './images/omni_insert/html_block.png';\nimport htmlBlockDarkImage from './images/omni_insert/html_block_dark.png';\nimport lineBlockImage from './images/omni_insert/line_block.png';\nimport lineBlockDarkImage from './images/omni_insert/line_block_dark.png';\nimport emojiImage from './images/omni_insert/emoji.png';\nimport emojiDarkImage from './images/omni_insert/emoji_dark.png';\nimport commentImage from './images/omni_insert/comment.png';\nimport commentDarkImage from './images/omni_insert/comment_dark.png';\nimport divImage from './images/omni_insert/div.png';\nimport divDarkImage from './images/omni_insert/div_dark.png';\nimport codeBlockImage from './images/omni_insert/code_block.png';\nimport codeBlockDarkImage from './images/omni_insert/code_block_dark.png';\nimport footnoteImage from './images/omni_insert/footnote.png';\nimport footnoteDarkImage from './images/omni_insert/footnote_dark.png';\nimport citationImage from './images/omni_insert/citation.png';\nimport citationDarkImage from './images/omni_insert/citation_dark.png';\nimport crossReferenceImage from './images/omni_insert/cross_reference.png';\nimport crossReferenceDarkImage from './images/omni_insert/cross_reference_dark.png';\nimport symbolImage from './images/omni_insert/symbol.png';\nimport symbolDarkImage from './images/omni_insert/symbol_dark.png';\nimport tableImage from './images/omni_insert/table.png';\nimport tableDarkImage from './images/omni_insert/table_dark.png';\nimport definitionListImage from './images/omni_insert/definition_list.png';\nimport definitionListDarkImage from './images/omni_insert/definition_list_dark.png';\nimport horizontalRuleImage from './images/omni_insert/horizontal_rule.png';\nimport horizontalRuleDarkImage from './images/omni_insert/horizontal_rule_dark.png';\nimport imgImage from './images/omni_insert/image.png';\nimport imgDarkImage from './images/omni_insert/image_dark.png';\nimport linkImage from './images/omni_insert/link.png';\nimport linkDarkImage from './images/omni_insert/link_dark.png';\nimport paragraphImage from './images/omni_insert/paragraph.png';\nimport paragraphDarkImage from './images/omni_insert/paragraph_dark.png';\nimport rawBlockImage from './images/omni_insert/raw_block.png';\nimport rawBlockDarkImage from './images/omni_insert/raw_block_dark.png';\nimport rawInlineImage from './images/omni_insert/raw_inline.png';\nimport rawInlineDarkImage from './images/omni_insert/raw_inline_dark.png';\nimport texBlockImage from './images/omni_insert/tex_block.png';\nimport texBlockDarkImage from './images/omni_insert/tex_block_dark.png';\nimport yamlBlockImage from './images/omni_insert/yaml_block.png';\nimport yamlBlockDarkImage from './images/omni_insert/yaml_block_dark.png';\nimport pythonChunkImage from './images/omni_insert/python_chunk.png';\nimport sqlChunkImage from './images/omni_insert/sql_chunk.png';\nimport d3ChunkImage from './images/omni_insert/d3_chunk.png';\nimport stanChunkImage from './images/omni_insert/stan_chunk.png';\nimport bashChunkImage from './images/omni_insert/bash_chunk.png';\nimport bashChunkDarkImage from './images/omni_insert/bash_chunk_dark.png';\nimport rChunkImage from './images/omni_insert/r_chunk.png';\nimport rChunkDarkImage from './images/omni_insert/r_chunk_dark.png';\nimport rcppChunkImage from './images/omni_insert/rcpp_chunk.png';\nimport rcppChunkDarkImage from './images/omni_insert/rcpp_chunk_dark.png';\nimport tabsetImage from './images/omni_insert/tabset.png';\nimport tabsetDarkImage from './images/omni_insert/tabset_dark.png';\nimport slideColumns from './images/omni_insert/slide_columns.png';\nimport slideColumnsDark from './images/omni_insert/slide_columns_dark.png';\nimport slidePause from './images/omni_insert/slide_pause.png';\nimport slidePauseDark from './images/omni_insert/slide_pause_dark.png';\nimport slideNotes from './images/omni_insert/slide_notes.png';\nimport slideNotesDark from './images/omni_insert/slide_notes_dark.png';\n\nimport articleImage from './images/citations/article.png';\nimport articleDarkImage from './images/citations/article_dark.png';\nimport bookImage from './images/citations/book.png';\nimport bookDarkImage from './images/citations/book_dark.png';\nimport broadcastImage from './images/citations/broadcast.png';\nimport broadcastDarkImage from './images/citations/broadcast_dark.png';\nimport dataImage from './images/citations/data.png';\nimport dataDarkImage from './images/citations/data_dark.png';\nimport entryImage from './images/citations/entry.png';\nimport entryDarkImage from './images/citations/entry_dark.png';\nimport imageImage from './images/citations/image.png';\nimport imageDarkImage from './images/citations/image_dark.png';\nimport legalImage from './images/citations/legal.png';\nimport legalDarkImage from './images/citations/legal_dark.png';\nimport mapImage from './images/citations/map.png';\nimport mapDarkImage from './images/citations/map_dark.png';\nimport movieImage from './images/citations/movie.png';\nimport movieDarkImage from './images/citations/movie_dark.png';\nimport otherImage from './images/citations/other.png';\nimport otherDarkImage from './images/citations/other_dark.png';\nimport songImage from './images/citations/song.png';\nimport songDarkImage from './images/citations/song_dark.png';\nimport webImage from './images/citations/web.png';\nimport webDarkImage from './images/citations/web_dark.png';\nimport zoteroOverlayImage from './images/citations/zotero-overlay.png';\nimport localSourcesImage from './images/citations/insert/local-sources.png';\nimport packageImage from './images/citations/insert/packages.png';\nimport bibliographyImage from './images/citations/insert/bibliography.png';\nimport bibliographyFolderImage from './images/citations/insert/bibliography-folder.png';\nimport zoteroRootImage from './images/citations/insert/zotero-root.png';\nimport zoteroLibraryImage from './images/citations/insert/zotero-library.png';\nimport zoteroCollectionImage from './images/citations/insert/zotero-collection.png';\nimport doiImage from './images/citations/insert/doi.png';\nimport crossRefImage from './images/citations/insert/crossref.png';\nimport pubmedImage from './images/citations/insert/pubmed.png';\nimport dataciteImage from './images/citations/insert/datacite.png';\n\nimport equationXRefImage from './images/xref/equation.png';\nimport equationXRefDarkImage from './images/xref/equation_dark.png';\nimport sectionXRefImage from './images/xref/section.png';\nimport sectionXRefDarkImage from './images/xref/section_dark.png';\nimport listingXRefImage from './images/xref/listing.png';\nimport listingXRefDarkImage from './images/xref/listing.png';\nimport tableXRefImage from './images/xref/table.png';\nimport tableXRefDarkImage from './images/xref/table_dark.png';\nimport figureXRefImage from './images/xref/figure.png';\nimport figureXRefDarkImage from './images/xref/figure_dark.png';\nimport theoremXRefImage from './images/xref/theorem.png';\nimport theoremXRefDarkImage from './images/xref/theorem_dark.png';\n\nimport allXRefInsertImage from './images/xref/insert/all.png';\nimport equationXRefInsertImage from './images/xref/insert/equation.png';\nimport sectionXRefInsertImage from './images/xref/insert/section.png';\nimport listingXRefInsertImage from './images/xref/insert/listing.png';\nimport tableXRefInsertImage from './images/xref/insert/table.png';\nimport figureXRefInsertImage from './images/xref/insert/figure.png';\nimport theoremXRefInsertImage from './images/xref/insert/theorem.png';\n\nimport tagDelete from './images/widgets/tag-delete.png';\nimport tagEdit from './images/widgets/tag-edit.png';\n\nexport function defaultEditorUIImages(): EditorUIImages {\n return {\n copy: copyImage,\n properties: propertiesImage,\n properties_deco: propertiesDecoImage,\n properties_deco_dark: propertiesDecoDarkImage,\n removelink: removelinkImage,\n runchunk: runchunkImage,\n runprevchunks: runprevchunksImage,\n search: searchImage,\n search_progress: searchProgressImage,\n omni_insert: {\n generic: omniInsertGenericImage,\n heading1: heading1Image,\n heading1_dark: heading1DarkImage,\n heading2: heading2Image,\n heading2_dark: heading2DarkImage,\n heading3: heading3Image,\n heading3_dark: heading3DarkImage,\n heading4: heading4Image,\n heading4_dark: heading4DarkImage,\n bullet_list: bulletListImage,\n bullet_list_dark: bulletListDarkImage,\n ordered_list: orderedListImage,\n ordered_list_dark: orderedListDarkImage,\n blockquote: blockquoteImage,\n blockquote_dark: blockquoteDarkImage,\n math_inline: mathInlineImage,\n math_inline_dark: mathInlineDarkImage,\n math_display: mathDisplayImage,\n math_display_dark: mathDisplayDarkImage,\n html_block: htmlBlockImage,\n html_block_dark: htmlBlockDarkImage,\n line_block: lineBlockImage,\n line_block_dark: lineBlockDarkImage,\n emoji: emojiImage,\n emoji_dark: emojiDarkImage,\n comment: commentImage,\n comment_dark: commentDarkImage,\n div: divImage,\n div_dark: divDarkImage,\n code_block: codeBlockImage,\n code_block_dark: codeBlockDarkImage,\n footnote: footnoteImage,\n footnote_dark: footnoteDarkImage,\n citation: citationImage,\n citation_dark: citationDarkImage,\n cross_reference: crossReferenceImage,\n cross_reference_dark: crossReferenceDarkImage,\n symbol: symbolImage,\n symbol_dark: symbolDarkImage,\n table: tableImage,\n table_dark: tableDarkImage,\n definition_list: definitionListImage,\n definition_list_dark: definitionListDarkImage,\n horizontal_rule: horizontalRuleImage,\n horizontal_rule_dark: horizontalRuleDarkImage,\n image: imgImage,\n image_dark: imgDarkImage,\n link: linkImage,\n link_dark: linkDarkImage,\n paragraph: paragraphImage,\n paragraph_dark: paragraphDarkImage,\n raw_block: rawBlockImage,\n raw_block_dark: rawBlockDarkImage,\n raw_inline: rawInlineImage,\n raw_inline_dark: rawInlineDarkImage,\n tex_block: texBlockImage,\n tex_block_dark: texBlockDarkImage,\n yaml_block: yamlBlockImage,\n yaml_block_dark: yamlBlockDarkImage,\n python_chunk: pythonChunkImage,\n sql_chunk: sqlChunkImage,\n d3_chunk: d3ChunkImage,\n stan_chunk: stanChunkImage,\n bash_chunk: bashChunkImage,\n bash_chunk_dark: bashChunkDarkImage,\n r_chunk: rChunkImage,\n r_chunk_dark: rChunkDarkImage,\n rcpp_chunk: rcppChunkImage,\n rcpp_chunk_dark: rcppChunkDarkImage,\n tabset: tabsetImage,\n tabset_dark: tabsetDarkImage,\n slide_columns: slideColumns,\n slide_columns_dark: slideColumnsDark,\n slide_notes: slideNotes,\n slide_notes_dark: slideNotesDark,\n slide_pause: slidePause,\n slide_pause_dark: slidePauseDark\n },\n citations: {\n article: articleImage,\n article_dark: articleDarkImage,\n book: bookImage,\n book_dark: bookDarkImage,\n broadcast: broadcastImage,\n broadcast_dark: broadcastDarkImage,\n data: dataImage,\n data_dark: dataDarkImage,\n entry: entryImage,\n entry_dark: entryDarkImage,\n image: imageImage,\n image_dark: imageDarkImage,\n legal: legalImage,\n legal_dark: legalDarkImage,\n map: mapImage,\n map_dark: mapDarkImage,\n movie: movieImage,\n movie_dark: movieDarkImage,\n other: otherImage,\n other_dark: otherDarkImage,\n song: songImage,\n song_dark: songDarkImage,\n web: webImage,\n web_dark: webDarkImage,\n zoteroOverlay: zoteroOverlayImage,\n local_sources: localSourcesImage,\n packages: packageImage,\n bibligraphy: bibliographyImage,\n bibligraphy_folder: bibliographyFolderImage,\n zotero_library: zoteroLibraryImage,\n zotero_collection: zoteroCollectionImage,\n zotero_root: zoteroRootImage,\n doi: doiImage,\n crossref: crossRefImage,\n pubmed: pubmedImage,\n datacite: dataciteImage,\n },\n xrefs: {\n section: sectionXRefImage,\n section_dark: sectionXRefDarkImage,\n figure: figureXRefImage,\n figure_dark: figureXRefDarkImage,\n table: tableXRefImage,\n table_dark: tableXRefDarkImage,\n listing: listingXRefImage,\n listing_dark: listingXRefDarkImage,\n equation: equationXRefImage,\n equation_dark: equationXRefDarkImage,\n theorem: theoremXRefImage,\n theorem_dark: theoremXRefDarkImage,\n type_all: allXRefInsertImage,\n type_section: sectionXRefInsertImage,\n type_equation: equationXRefInsertImage,\n type_figure: figureXRefInsertImage,\n type_table: tableXRefInsertImage,\n type_listing: listingXRefInsertImage,\n type_theorem: theoremXRefInsertImage\n },\n widgets: {\n tag_delete: tagDelete,\n tag_edit: tagEdit,\n },\n };\n}\n","/*\n * editor-menus.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorMenuItem, EditorUI } from '../api/ui';\nimport { tableMenu } from '../api/table';\nimport { EditorCommandId, EditorCommand } from '../api/command';\n\nexport interface EditorMenus {\n format: EditorMenuItem[];\n insert: EditorMenuItem[];\n table: EditorMenuItem[];\n}\n\nexport function editorMenus(ui: EditorUI, commands: EditorCommand[]) {\n return {\n format: formatMenu(ui, commands),\n insert: insertMenu(ui, commands),\n table: tableMenu(true, ui),\n };\n}\n\nfunction formatMenu(ui: EditorUI, commands: EditorCommand[]) {\n return [\n { command: EditorCommandId.Strong },\n { command: EditorCommandId.Em },\n { command: EditorCommandId.Underline },\n { command: EditorCommandId.Code },\n {\n text: ui.context.translateText('Text'),\n subMenu: {\n items: [\n { command: EditorCommandId.Strikeout },\n { command: EditorCommandId.Superscript },\n { command: EditorCommandId.Subscript },\n { command: EditorCommandId.Smallcaps },\n ],\n },\n },\n { separator: true },\n {\n text: ui.context.translateText('Bullets & Numbering'),\n subMenu: {\n items: [\n { command: EditorCommandId.BulletList },\n { command: EditorCommandId.OrderedList },\n { separator: true },\n { command: EditorCommandId.TightList },\n { separator: true },\n { command: EditorCommandId.ListItemCheck },\n { command: EditorCommandId.ListItemCheckToggle },\n { separator: true },\n { command: EditorCommandId.ListItemSink },\n { command: EditorCommandId.ListItemLift },\n { separator: true },\n { command: EditorCommandId.EditListProperties },\n ],\n },\n },\n { separator: true },\n { command: codeBlockCommand(commands) },\n { command: EditorCommandId.Blockquote },\n { command: EditorCommandId.LineBlock },\n { separator: haveAnyOf(commands, EditorCommandId.Div, EditorCommandId.Span) },\n { command: EditorCommandId.Div },\n { command: EditorCommandId.Span },\n { separator: true },\n {\n text: ui.context.translateText('Raw'),\n subMenu: {\n items: [\n { command: EditorCommandId.HTMLInline },\n { command: EditorCommandId.HTMLBlock },\n { separator: true },\n { command: EditorCommandId.TexInline },\n { command: EditorCommandId.TexBlock },\n { separator: true },\n { command: EditorCommandId.RawInline },\n { command: EditorCommandId.RawBlock },\n ],\n },\n },\n { separator: true },\n { command: EditorCommandId.ClearFormatting },\n { separator: true },\n { command: EditorCommandId.AttrEdit },\n ];\n}\n\nfunction insertMenu(ui: EditorUI, commands: EditorCommand[]) {\n return [\n { command: EditorCommandId.OmniInsert },\n ...(haveAnyOf(commands, EditorCommandId.RCodeChunk, EditorCommandId.PythonCodeChunk)\n ? [\n { separator: true },\n {\n text: ui.context.translateText('Code Chunk'),\n subMenu: {\n items: [\n { command: EditorCommandId.RCodeChunk },\n { separator: true },\n { command: EditorCommandId.PythonCodeChunk },\n { command: EditorCommandId.BashCodeChunk },\n { command: EditorCommandId.RcppCodeChunk },\n { command: EditorCommandId.SQLCodeChunk },\n { command: EditorCommandId.D3CodeChunk },\n { command: EditorCommandId.StanCodeChunk },\n ],\n },\n },\n ]\n : []),\n { separator: true },\n { command: EditorCommandId.Table },\n { command: EditorCommandId.Image },\n { command: EditorCommandId.Link },\n { command: EditorCommandId.Shortcode },\n ...(haveAnyOf(commands, EditorCommandId.Citation, EditorCommandId.CrossReference, EditorCommandId.Footnote)\n ? [\n { separator: true },\n { command: EditorCommandId.Citation },\n { command: EditorCommandId.CrossReference },\n { command: EditorCommandId.Footnote },\n ] : []),\n ...(haveAnyOf(commands, EditorCommandId.InsertSlideNotes, EditorCommandId.InsertSlidePause, EditorCommandId.InsertSlideColumns)\n ? [\n { separator: true },\n { command: EditorCommandId.InsertSlideColumns },\n { command: EditorCommandId.InsertSlidePause },\n { command: EditorCommandId.InsertSlideNotes }\n ] : []),\n { separator: true },\n ...(haveAnyOf(commands, EditorCommandId.InlineMath, EditorCommandId.DisplayMath)\n ? [\n {\n text: ui.context.translateText('LaTeX Math'),\n subMenu: {\n items: [\n { command: EditorCommandId.InlineMath },\n { command: EditorCommandId.DisplayMath },\n ],\n },\n },\n ]\n : []),\n ...(haveAnyOf(commands, EditorCommandId.DefinitionList)\n ? [\n {\n text: ui.context.translateText('Definition'),\n subMenu: {\n items: [\n { command: EditorCommandId.DefinitionList },\n { separator: true },\n { command: EditorCommandId.DefinitionTerm },\n { command: EditorCommandId.DefinitionDescription },\n ],\n },\n },\n ]\n : []),\n {\n text: ui.context.translateText('Special Characters'),\n subMenu: {\n items: [\n { command: EditorCommandId.Emoji },\n { command: EditorCommandId.Symbol },\n { separator: true },\n { command: EditorCommandId.EnDash },\n { command: EditorCommandId.EmDash },\n { separator: true },\n { command: EditorCommandId.NonBreakingSpace },\n { separator: true },\n { command: EditorCommandId.HardLineBreak },\n ],\n },\n },\n { separator: true },\n { command: EditorCommandId.ParagraphInsert },\n { command: EditorCommandId.InsertDiv },\n { command: EditorCommandId.HorizontalRule },\n ...(haveAnyOf(commands, EditorCommandId.Tabset)\n ? [\n { separator: true },\n { command: EditorCommandId.Tabset },\n { command: EditorCommandId.Callout },\n ] : []),\n { separator: true },\n { command: EditorCommandId.CodeBlockFormat },\n { command: EditorCommandId.YamlMetadata },\n { separator: true },\n { command: EditorCommandId.HTMLComment },\n ];\n}\n\n\nfunction haveReferenceMenu(commands: EditorCommand[]) {\n return haveAnyOf(commands, \n EditorCommandId.Citation,\n EditorCommandId.CrossReference,\n EditorCommandId.Footnote\n );\n}\n\nfunction haveAnyOf(commands: EditorCommand[], ...ids: EditorCommandId[]) {\n for (const command of commands) {\n if (ids.includes(command.id)) {\n return true;\n }\n }\n return false;\n}\n\nfunction codeBlockCommand(commands: EditorCommand[]) {\n return haveAnyOf(commands, EditorCommandId.CodeBlockFormat)\n ? EditorCommandId.CodeBlockFormat\n : EditorCommandId.CodeBlock;\n}\n","/*\n * table.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorCommandId } from './command';\nimport { EditorUI } from './ui';\n\nexport interface TableCapabilities {\n captions: boolean;\n headerOptional: boolean;\n multiline: boolean;\n}\n\nexport function tableMenu(insert: boolean, ui: EditorUI) {\n return [\n ...(insert \n ? [{ command: EditorCommandId.TableInsertTable }, \n { separator: true }\n ] \n : []\n ),\n { command: EditorCommandId.TableAddRowBefore },\n { command: EditorCommandId.TableAddRowAfter },\n { separator: true },\n { command: EditorCommandId.TableAddColumnBefore },\n { command: EditorCommandId.TableAddColumnAfter },\n { separator: true },\n { command: EditorCommandId.TableDeleteRow },\n { command: EditorCommandId.TableDeleteColumn },\n { separator: true },\n { command: EditorCommandId.TableDeleteTable },\n { separator: true },\n {\n text: ui.context.translateText('Align Column'),\n subMenu: {\n items: [\n { command: EditorCommandId.TableAlignColumnLeft },\n { command: EditorCommandId.TableAlignColumnCenter },\n { command: EditorCommandId.TableAlignColumnRight },\n { separator: true },\n { command: EditorCommandId.TableAlignColumnDefault },\n ],\n },\n },\n { separator: true },\n { command: EditorCommandId.TableToggleHeader },\n { command: EditorCommandId.TableToggleCaption },\n ];\n}\n","/*\n * editor-schema.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, NodeSpec, MarkSpec, Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { ExtensionManager } from './editor-extensions';\nimport { PandocNode } from '../api/node';\nimport { PandocMark } from '../api/mark';\n\nexport function editorSchema(extensions: ExtensionManager): Schema {\n // build in doc node + nodes from extensions\n const nodes: { [name: string]: NodeSpec } = {\n doc: {\n attrs: {\n initial: { default: false },\n },\n content: 'body notes',\n },\n\n body: {\n content: 'block+',\n isolating: true,\n parseDOM: [{ tag: 'div[class*=\"body\"]' }],\n toDOM() {\n return [\n 'div',\n { class: 'body pm-cursor-color pm-text-color pm-background-color pm-editing-root-node' },\n ['div', { class: 'pm-content' }, 0],\n ];\n },\n },\n\n notes: {\n content: 'note*',\n parseDOM: [{ tag: 'div[class*=\"notes\"]' }],\n toDOM() {\n return [\n 'div',\n { class: 'notes pm-cursor-color pm-text-color pm-background-color pm-editing-root-node' },\n ['div', { class: 'pm-content' }, 0],\n ];\n },\n },\n\n note: {\n content: 'block+',\n attrs: {\n ref: {},\n number: { default: 1 },\n },\n isolating: true,\n parseDOM: [\n {\n tag: 'div[class*=\"note\"]',\n getAttrs(dom: Node | string) {\n const el = dom as Element;\n return {\n ref: el.getAttribute('data-ref'),\n };\n },\n },\n ],\n toDOM(node: ProsemirrorNode) {\n return [\n 'div',\n { 'data-ref': node.attrs.ref, class: 'note pm-footnote-body', 'data-number': node.attrs.number },\n 0,\n ];\n },\n },\n };\n extensions.pandocNodes().forEach((node: PandocNode) => {\n nodes[node.name] = node.spec;\n });\n\n // marks from extensions\n const marks: { [name: string]: MarkSpec } = {};\n extensions.pandocMarks().forEach((mark: PandocMark) => {\n marks[mark.name] = mark.spec;\n });\n\n // allow code to exclude marks that don't support input rules\n // (e.g. marks that denote a special escape sequences from markdown,\n // like raw_tex, raw_html, shortcodes, xrefs, math, etc.)\n if (marks.code) {\n const excludeInCode = extensions\n .pandocMarks()\n .filter(mark => mark.noInputRules && mark.name !== 'code')\n .map(mark => mark.name)\n .join(' ');\n marks.code.excludes = excludeInCode;\n }\n\n // return schema\n return new Schema({\n nodes,\n marks,\n });\n}\n","/*\n * presentation.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState } from 'prosemirror-state';\n\nimport { findTopLevelBodyNodes } from './node';\nimport { titleFromState } from './yaml';\n\nexport interface PresentationEditorLocation {\n items: PresentationEditorLocationItem[];\n auto_slide_level: number;\n}\n\nexport const kPresentationEditorLocationTitle = \"title\";\nexport const kPresentationEditorLocationHeading = \"heading\";\nexport const kPresentationEditorLocationHr = \"hr\";\nexport const kPresentationEditorLocationCursor = \"cursor\";\n\nexport interface PresentationEditorLocationItem {\n type: string;\n level: number;\n // extra field we use internally for navigation\n pos: number;\n}\n\nexport function getPresentationEditorLocation(state: EditorState) : PresentationEditorLocation {\n \n // not the cursor position\n const cursorPos = state.selection.from;\n\n // build list of items\n let autoSlideLevel = Number.MAX_VALUE;\n const items: PresentationEditorLocationItem[] = [];\n\n // get top level headings and horizontal rules\n const schema = state.schema;\n const bodyNodes = findTopLevelBodyNodes(state.doc, node => true);\n\n // bail if empty\n if (bodyNodes.length === 0) {\n return { items, auto_slide_level: 0 };\n }\n\n // start with title if we have one. note that pandoc will make the title slide\n // first no matter where it appears in the document, so we do the same here\n const title = titleFromState(state);\n if (title) {\n items.push({ \n type: kPresentationEditorLocationTitle, \n level: 0,\n pos: bodyNodes[0].pos\n });\n }\n\n // get top level headings and horizontal rules\n \n let pendingAutoSlideLevel = 0;\n let foundCursor = false;\n for (const nodeWithPos of bodyNodes) {\n // if node is past the selection then add the cursor token\n if (!foundCursor && (nodeWithPos.pos > cursorPos)) {\n foundCursor = true;\n items.push({\n type: kPresentationEditorLocationCursor,\n level: 0,\n pos: nodeWithPos.pos\n });\n }\n // add the node with the requisite type\n const node = nodeWithPos.node;\n if (node.type === schema.nodes.heading) {\n const level = node.attrs.level || 0;\n // track pending auto slide level\n if (level < autoSlideLevel) {\n pendingAutoSlideLevel = level;\n } else{\n pendingAutoSlideLevel= 0;\n }\n items.push({\n type: kPresentationEditorLocationHeading,\n level,\n pos: nodeWithPos.pos\n });\n } else if (node.type === schema.nodes.horizontal_rule) {\n items.push({\n type: kPresentationEditorLocationHr,\n level: 0,\n pos: nodeWithPos.pos\n });\n pendingAutoSlideLevel= 0;\n } else if (pendingAutoSlideLevel > 0) {\n autoSlideLevel = pendingAutoSlideLevel;\n pendingAutoSlideLevel = 0;\n }\n }\n\n // last chance to collect pending auto slide level\n if (pendingAutoSlideLevel > 0){\n autoSlideLevel = pendingAutoSlideLevel;\n }\n \n // didn't find an auto slide level\n if (autoSlideLevel === Number.MAX_VALUE) {\n autoSlideLevel = 0;\n }\n \n // return the items\n return { items, auto_slide_level: autoSlideLevel };\n}\n\nexport function positionForPresentationEditorLocation(\n state: EditorState, \n location: PresentationEditorLocation\n) : number {\n // get the positions of the editor's current state (filter out cursor)\n const editorItems = getPresentationEditorLocation(state).items\n .filter(item => item.type !== kPresentationEditorLocationCursor);\n \n // get the index of the cursor passed in the location\n const cursorIdx = location.items.findIndex(\n item => item.type === kPresentationEditorLocationCursor)\n ;\n\n // go one slide before the cursor\n if (cursorIdx >= 0) {\n const locationItem = editorItems[cursorIdx];\n return locationItem.pos;\n }\n\n // default if we can't find a location\n return -1;\n}\n"]} \ No newline at end of file +{"version":3,"sources":["src/polyfill/index.ts","src/polyfill/isconnected.ts","src/index.ts","src/polyfill/custom-event.ts","src/editor/editor.ts","src/api/cite.ts","src/api/doi.ts","src/api/ui-dialogs.ts","src/api/pandoc_attr.ts","src/api/extension.ts","src/api/pandoc_capabilities.ts","src/api/pandoc.ts","src/api/quote.ts","src/api/math.ts","src/api/mark.ts","src/api/text.ts","src/api/code.ts","src/api/node.ts","src/api/link.ts","src/api/html.ts","src/api/events.ts","src/api/event-types.ts","src/api/pandoc_format.ts","src/api/yaml.ts","src/api/format.ts","src/api/object.ts","src/api/log.ts","src/api/basekeys.ts","src/api/selection.ts","src/api/transaction.ts","src/api/slice.ts","src/api/platform.ts","src/api/outline.ts","src/api/rmd.ts","src/api/list.ts","src/api/command.ts","src/api/ui.ts","src/api/trailing_p.ts","src/api/paragraph.ts","src/api/util.ts","src/api/location.ts","src/api/dom.ts","src/api/scroll.ts","src/api/navigation.ts","src/api/xref.ts","src/api/pandoc_id.ts","src/api/raw.ts","src/api/image.ts","src/api/fixup.ts","src/api/css.ts","src/api/change.ts","src/api/input_rule.ts","src/api/wrap.ts","src/nodes/yaml_metadata/yaml_metadata-title.ts","src/behaviors/outline.ts","src/behaviors/find.ts","src/behaviors/omni_insert/omni_insert.ts","src/api/completion.ts","src/behaviors/omni_insert/omni_insert-completion.tsx","src/api/omni_insert.ts","src/api/placeholder.ts","src/behaviors/completion/completion.ts","src/behaviors/completion/completion-popup.tsx","src/api/widgets/popup.tsx","src/api/promise.ts","src/behaviors/spelling/spelling-interactive.ts","src/behaviors/spelling/spelling.ts","src/api/spelling.ts","src/behaviors/spelling/spelling-realtime.ts","src/pandoc/pandoc_converter.ts","src/api/pandoc_capsule.ts","src/api/base64.ts","src/pandoc/pandoc_to_prosemirror.ts","src/pandoc/pandoc_from_prosemirror.ts","src/api/fragment.ts","src/editor/editor-extensions.ts","src/nodes/text.ts","src/nodes/paragraph.ts","src/nodes/heading.ts","src/nodes/blockquote.ts","src/nodes/code_block.ts","src/nodes/list/list.ts","src/nodes/list/list-commands.ts","src/nodes/div/div.ts","src/nodes/div/div-callout.ts","src/nodes/div/div-tabset.ts","src/nodes/list/list-checked.ts","src/nodes/list/list-pandoc.ts","src/nodes/image/image.ts","src/nodes/image/image-dialog.ts","src/nodes/image/image-util.ts","src/nodes/image/image-textsel.ts","src/nodes/image/figure.ts","src/api/decoration.ts","src/nodes/image/image-view.ts","src/nodes/image/image-resize.ts","src/api/widgets/widgets.ts","src/nodes/image/figure-keys.ts","src/nodes/image/image-events.ts","src/nodes/hr.ts","src/nodes/hard_break.ts","src/nodes/null.ts","src/marks/em.ts","src/marks/strong.ts","src/marks/code.ts","src/marks/link/link.ts","src/marks/link/link-command.ts","src/marks/link/link-auto.ts","src/api/clipboard.ts","src/marks/link/link-headings.ts","src/marks/link/link-popup.tsx","src/api/widgets/tooltip.ts","src/api/widgets/button.tsx","src/api/text-popup.ts","src/api/widgets/react.ts","src/api/widgets/decoration.ts","src/behaviors/select_all.ts","src/behaviors/history.ts","src/behaviors/cursor.ts","src/behaviors/clear_formatting.ts","src/behaviors/smarty.ts","src/behaviors/attr_duplicate_id.ts","src/behaviors/trailing_p.ts","src/behaviors/empty_mark.ts","src/behaviors/escape_mark.ts","src/behaviors/code_block_input.ts","src/behaviors/paste_text.ts","src/behaviors/bottom_padding.ts","src/behaviors/insert_symbol/insert_symbol-plugin-symbol.tsx","src/api/unicode.ts","src/behaviors/insert_symbol/insert_symbol-plugin.tsx","src/behaviors/insert_symbol/insert_symbol-popup.tsx","src/api/focus.ts","src/api/widgets/select.tsx","src/api/widgets/text.tsx","src/behaviors/insert_symbol/insert_symbol-grid.tsx","src/behaviors/insert_symbol/insert_symbol-grid-cell.tsx","src/behaviors/insert_symbol/insert_symbol-grid-preview.tsx","src/behaviors/insert_symbol/symbols.ts","src/behaviors/insert_symbol/insert_symbol-plugin-emoji.tsx","src/api/emoji.ts","src/api/emojis-all.ts","src/marks/emoji/emoji.ts","src/marks/emoji/emoji-completion.tsx","src/behaviors/insert_symbol/insert_symbol-emoji-skintone.tsx","src/behaviors/insert_symbol/insert_special_characters.ts","src/behaviors/nbsp.ts","src/behaviors/remove_section.ts","src/behaviors/slides.ts","src/marks/strikeout.ts","src/marks/superscript.ts","src/marks/subscript.ts","src/marks/smallcaps.ts","src/marks/underline.ts","src/marks/raw_inline/raw_inline.ts","src/marks/raw_inline/raw_tex.ts","src/api/mark-highlight.ts","src/api/tex.ts","src/marks/raw_inline/raw_html.ts","src/marks/math/math.ts","src/marks/math/math-commands.ts","src/marks/math/math-transaction.ts","src/marks/math/math-highlight.ts","src/marks/math/math-popup.ts","src/marks/math/math-view.ts","src/api/attr_edit/attr_edit-decoration.tsx","src/marks/math/math-keys.ts","src/marks/cite/cite.ts","src/api/bibliography/bibliography.ts","src/api/bibliography/bibliography-provider_local.ts","src/api/path.ts","src/api/bibliography/bibDB.ts","src/api/csl.ts","src/api/crossref.ts","src/api/csl-text.ts","src/api/bibtex/bibtex.ts","src/api/bibtex/fields.ts","src/api/bibtex/language.ts","src/api/bibtex/types.ts","src/api/bibtex/formatting.ts","src/api/bibtex/characters.ts","src/api/bibliography/bibliography-provider_zotero.ts","src/api/zotero.ts","src/marks/cite/cite-completion.tsx","src/api/widgets/completion.tsx","src/marks/cite/cite-completion-bibliography.ts","src/marks/cite/cite-completion-quarto-xref.ts","src/marks/xref/xref-completion.tsx","src/marks/cite/cite-completion-search.ts","src/marks/cite/cite-highlight.ts","src/marks/cite/cite-completion_doi.tsx","src/api/widgets/completion-detailed.tsx","src/marks/cite/cite-doi.ts","src/marks/cite/cite-popup.tsx","src/marks/cite/cite-commands.ts","src/behaviors/insert_citation/insert_citation.tsx","src/api/widgets/tag-input.tsx","src/api/widgets/navigation-tree.tsx","src/api/widgets/dialog-buttons.tsx","src/behaviors/insert_citation/source_panels/insert_citation-source-panel.ts","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-bibliography.tsx","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-typeahead-search.tsx","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-list.tsx","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-list-item.tsx","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-doi.tsx","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-latent-search.tsx","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-list-item-detailed.tsx","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-crossref.tsx","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-pubmed.tsx","src/api/pubmed.ts","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-datacite.tsx","src/api/datacite.ts","src/behaviors/insert_citation/insert_citation-bibliography-picker.tsx","src/behaviors/insert_citation/source_panels/insert_citation-source-panel-packages.tsx","src/api/widgets/checkbox-input.tsx","src/marks/cite/cite-popup-xref.tsx","src/marks/span.ts","src/marks/xref/xref.ts","src/marks/xref/xref-popup.tsx","src/behaviors/insert_xref/insert_xref.tsx","src/behaviors/insert_xref/insert_xref_index.ts","src/marks/raw_inline/raw_html_comment.ts","src/marks/shortcode.ts","src/nodes/footnote/footnote.ts","src/api/shortcode.ts","src/nodes/footnote/footnote-editor.ts","src/nodes/footnote/footnote-transaction.ts","src/nodes/raw_block.ts","src/nodes/yaml_metadata/yaml_metadata.ts","src/nodes/yaml_metadata/yaml_metadata-capsule.ts","src/nodes/rmd_chunk/rmd_chunk.ts","src/nodes/rmd_chunk/rmd_chunk-image.ts","src/nodes/rmd_chunk/rmd_chunk-capsule.ts","src/nodes/line_block.ts","src/nodes/table/table.ts","src/nodes/table/table-commands.ts","src/nodes/table/table-nodes.ts","src/nodes/table/table-pandoc.ts","src/nodes/table/table-columns.ts","src/nodes/table/table-capsule.ts","src/nodes/table/table-contextmenu.ts","src/nodes/table/table-paste.ts","src/nodes/definition_list/definition_list.ts","src/nodes/definition_list/definition_list-commands.ts","src/nodes/definition_list/definition_list-insert.ts","src/nodes/definition_list/definition-list-keys.ts","src/nodes/definition_list/definition_list-inputrule.ts","src/api/position.ts","src/nodes/definition_list/definition_list-pandoc.ts","src/nodes/shortcode_block.ts","src/nodes/html_preserve.ts","src/optional/ace/ace.ts","src/api/cursor.ts","src/optional/ace/ace-render-queue.ts","src/optional/ace/ace-placeholder.ts","src/optional/ace/ace-node-views.ts","src/behaviors/attr_edit/attr_edit.ts","src/behaviors/attr_edit/attr_edit-command.ts","src/editor/editor-theme.ts","src/editor/editor-images.ts","src/editor/editor-menus.ts","src/api/table.ts","src/editor/editor-schema.ts","src/api/presentation.ts"],"names":["_fdf8","f","r","id","cached","m","exports","Object","isFrozen","input","default","module","editor_1","Editor","UITools","mod","__esModule","value","custom_event_1","__importDefault","isconnected_1","t","_","label","ops","push","op","pop","trys","body","call","thisArg","e","y","done","__spreadArrays","this","s","i","il","arguments","length","Array","k","a","j","jl","defineProperty","prosemirror_inputrules_1","prosemirror_keymap_1","prosemirror_model_1","prosemirror_state_1","prosemirror_view_1","prosemirror_utils_1","cite_1","ui_dialogs_1","pandoc_capabilities_1","omni_insert_1","spelling_interactive_1","spelling_realtime_1","pandoc_converter_1","editor_extensions_1","EditorCommands","command_1","EditorCommandId","attr","propsToInput","attrPropsToInput","inputToProps","attrInputToProps","pandocAutoIdentifier","text","pandoc_id_1","image","validUnits","percentUnit","css_1","kPercentUnit","unitToPixels","image_1","pixelsToUnit","roundUnit","format","parseFormatConfig","pandoc_format_1","pandocFormatConfigFromCode","citation","citeUI","PluginKey","parent","context","options","pandocFormat","pandocCapabilities","_this","maxContentWidth","events","events_1","DOMEditorEvents","keybindings","initExtensions","editorSchema","extensions","EditorState","create","initialDoc","attributes","dispatchTransaction","bind","EditorDOMParser","schema","view","dom","add","editor_theme_1","defaultTheme","PandocConverter","server","pandoc","setAttribute","addEventListener","event_types_1","ScrollEvent","pandocFmt","editor","_a","spellCheck","codeEditor","rmdImagePreview","hideFormatComment","className","codeChunks","bookdownXRef","bookdownPart","blogdownMathInCode","rmdExtensions","hugoExtensions","__assign","shortcodes","docTypes","ui","images","defaultImages","omni_insert","sent","resolve","event","handler","subscribe","eventName","title","setTitle","state","setMarkdown","markdown","emitUpdate","Promise","doc","line_wrapping","unrecognized","example_lists","unparsed_meta","loc","tr_1","i_1","getMarkdownTr","canonical","location","pandocConverter","toProsemirror","result","isInitialDoc","plugins","updateState","getEditingLocation","tr","setTextSelection","pos","applyFixups","fixup_1","FixupContext","Load","emitEvent","UpdateEvent","getMarkdownCode","prototype","attrs","initial","getMarkdown","__generator","code","outline_1","getEditingOutlineLocation","getHTML","getTitle","getSelection","navigation_id","navigationIdForSelection","setEditingLocation","outlineLocation","previousLocation","getOutline","getFindReplace","selectCurrent","find_1","selectFirst","selectNext","selectPrevious","replace","getSpellingDoc","pandocMarks","spelling","spellingInvalidateAllWords","invalidateAllWords","spellingInvalidateWord","word","invalidateWord","extensionFixups","getSelectedText","replaceSelection","selection","from","empty","marks","$from","dispatch","sel","TextSelection","trSetSel","getYamlFrontMatter","nodes","yaml_metadata","yaml_1","yamlFrontMatter","presentation_1","getPresentationEditorLocation","navigateToPresentationEditorLocation","positionForPresentationEditorLocation","navigate","navigation_1","NavigationType","Pos","String","applyYamlFrontMatter","yaml","focus","blur","insertChunk","chunkPlaceholder","type","recordCurrent","animate","NavigateEvent","nav","resize","applyFixupsOnResize","ResizeEvent","initFn","getMenus","commands","commandKeys","map","command","keymap","isActive","isEnabled","plural","execute","keepFocus","applyTheme","theme","classList","toggle","darkMode","setMaxContentWidth","maxWidth","minPadding","minContentPadding","syncContentWidth","setKeybindings","keyBindings","reconfigure","createPlugins","getEditorFormat","getPandocFormat","getPandocFormatConfig","isRmd","pandocFormatConfigFromDoc","lastTrSelectionOnly","selectionSet","docChanged","apply","StateChangeEvent","storedMarksSet","getMeta","transaction_1","kFixupTransaction","outline_2","previousOutline","OutlineChangeEvent","DispatchEvent","eventType","detail","emit","pandocExtensions","navigation","registerCompletionExtension","register","omniInsertExtension","omniInserters","markFilter","registerRealtimeSpelling","registerPlugins","realtimeSpellingPlugin","baseKeysPlugin","baseKeys","appendTransactionsPlugin","appendTransactions","hooks","Plugin","inputRulesPlugin","input_rule_1","markInputRuleFilter","plugin","inputRules","rules","handleTextInput","props","to","domEventsPlugin","key","handleDOMEvents","FocusEvent","keydown","prefs","tabKeyMoveFocus","pluginKeys","forEach","keys","ctrlKeyCodes","keyCombo","match","keyCode","toUpperCase","prosemirrorKeydownHandler","keydownHandler","keybindingsPlugin","keyEvent","ctrlKey","keyCommand","defaultKeys","clientWidth","applyPadding","LayoutEvent","fixups","fixup","nodeFromJSON","content","__awaiter","outlineNode","getOutlineNodes","reverse","find","node","_super","DOMParser","fromSchema","parse","preserveWhitespace","parseSlice","doi_1","pinyin_1","transliteration_1","kInvalidCiteKeyChars","existingIds","baseId","char","charCodeAt","fromCharCode","isHanzi","asciiOnlyBaseId","includes","proposedId","count","safeBaseId","suggestCiteId","csl","citeIdLeading","author","family","literal","shortTitle","substr","Math","min","issued","yearIssued","datePart","formatForPreview","pairs","name","undefined","dateParts","formatIssuedDate","containerTitle","volume","page","cslAny","charAt","slice","createUniqueCiteId","URL","DOI","urlForDOI","formatAuthors","authors","maxLength","_b","_c","_d","previous","endsWith","index","current","substring","array","addAuthorOrEtAl","previousAuthorStr","newAuthorStr","authorStr","etAlStr","lastSpace","lastIndexOf","etAl","date","singleDatePart","citeProps","suggestedId","previewFields","kCrossrefMatches","findDOI","token","regex","hasDOI","doi","asPandocClass","clz","asHtmlId","startsWith","asHtmlClass","kAlertTypeInfo","kAlertTypeWarning","keyvalue","classes","split","style","pandoc_attr_1","pandocAttrKeyvalueFromText","kv","join","extension_1","kPandocAttrClasses","kPandocAttrKeyvalue","separator","convertedText","inQuotes","ch","trim","line","parts","kWidthAttrib","kAlignAttrib","kFigAltAttrib","kFigAlignAttrib","kFigEnvAttrib","kCodeBlockAttr","kCodeBlockText","pandocAttrAvailable","pandocAttrFrom","pandocAttr","pandocAttrRemoveClass","isArray","_i","predicate","foundClass","pandocAttrGetKeyvalue","keyval","entry","keyvalue_1","pandocAttrRemoveKeyvalue","filter","pandocAttrInSpec","spec","tok","c","kPandocAttrId","pandocAttrToDomAttr","marker","domAttr","el","forceAttrs","excludedNames","includedNames","hasAttribute","getAttribute","val","resolveCurrent","remainder","partitioned","partition","base","extensionIfEnabled","extension","kPandocAttrExtensions","extensionEnabled","getPandocCapabilities","getCapabilities","version","api_version","output_formats","pandoc_1","parsePandocListOutput","highlight_languages","PandocTokenType","quote_1","math_1","code_1","link_1","tokens","hasOwnProperty","mapValue","mapToken","mappedTok","tokenHasChildren","imageAttributesAvailable","link_attributes","raw_html","output","kRawBlockFormat","kRawBlockContent","kWriteSpaces","stringifyTokens","unemoji","elem","Str","Space","SoftBreak","LineBreak","kLinkChildren","Span","kSpanChildren","Quoted","kQuoteType","stringifyMath","Code","kCodeText","forEachToken","mapTokens","tokenTextEscaped","marksByPriority","markWriters","aPriority","priority","QuoteType","DoubleQuote","kSingleQuoteRegEx","RegExp","kSingleQuotes","begin","end","kDoubleQuotes","quotesForType","kDoubleQuoteRegEx","MathType","Inline","kMathType","kMathContent","kMathId","editorMath","delimter","delimiterForType","mathTypeIsActive","text_1","$pos","start","link","mark","offset","startIndex","startPos","child","nodeSize","endIndex","childCount","isInSet","endPos","markIsActive","storedMarks","range","nodesBetween","markItem","getMarkRange","markType","$head","removeInvalidatedMarks","re","findChildrenByMark","markedNode","removeStoredMark","validLength","removeMark","nd","markRange","trimmedText","trimStart","countSpace","mergedTextNodes","_node","_pos","parentNode","allowsMarkType","textNode","exec","refText","rangeHasMark","anchor","lastIndex","nodeIndex","textNodes","str1","str2","sensitivity","clipboardTextParser","$context","codeViews","codeViewType","codeView","createFromPastePattern","test","codeNode","nodeType","createAndFill","Slice","Fragment","n","p","canInsertNode","canInsertNodeAtPos","asSelection","d","depth","canReplaceWith","findTopLevelBodyNodes","findNodeOfTypeInSelection","foundNode","lastNode","last","nodeIsActive","findSelectedNodeOfType","findParentNode","kLinkTarget","LinkType","ids","headings","findChildren","findChildrenByType","heading","level","textContent","escapeHTMLAttribute","div","appendChild","innerHTML","kHTMLCommentRegEx","isHTMLComment","html","noEmptyAttribs","tag","attribs","selfClosing","DOMSerializer","serializeNode","generateHTML","firstYamlBlock","mdExtensions","object_1","findValue","yamlMarkdownOptions","yamlFormatConfig","readPandocFormatConfig","formatConfig","pandocFormatConfigFromCommentInCode","keyValueRegEx","matchPandocFormatComment","field","fields","keyValueMatch","variables_1","source","obj","toString","mode","asString","rmd_extensions","doctype","str","references","references_location","references_prefix","prefix","toLowerCase","asBoolean","parseExtensions","enabled","splitPandocFormatString","optionsPos","indexOf","commonmarkExtensions","rawHTML","includeTexMathDollars","format_1","kHugoDocType","kMarkdownGithubFormat","yamlMetadataNodes","foundFirstRawInline","config","pandocFormatConfigFromYamlInCode","warnings","baseName","formatOptions","variant","validOptionNames","fullName","invalidFormat","invalidOptions","pandocMode","kMarkdownMmdFormat","kMarkdownStrictFormat","kGfmFormat","kCommonmarkFormat","kCommonmarkXFormat","kMarkdownVariants","listExtensions","option","pandocFormatWith","hasFencedCodeBlocks","backtick_code_blocks","fenced_code_blocks","kBookdownDocType","kPresentationDocType","node_1","isYamlMetadataNode","titleMatch","kYamlMetadataTitleRegex","firstYaml","firstYamlNode","stripYamlDelimeters","yamlText","updatedYaml","replaceRangeWith","updatedYamlNode","insert","yamlNodes_1","titleFromYamlMetadataNode","yamlMetadataNameValueRegex","valueMatch","parseYaml","kFirstYamlBlockRegex","yamlCode","js_yaml_1","load","onWarning","log_1","logException","yamlParsed","dump","object","some","ignoreKey","homeKey","editingNode","head","coordsAtPos","beginDocPos","isOnPreviousLine","endKey","editingRootNode","endDocPos","top","bottom","arrowBodyNodeBoundary","dir","endOfTextblock","selection_1","selectionIsBodyTopLevel","side","nextPos","Selection","near","after","before","currentRootNode","nextRootNode","endTopLevelBodyNodeBoundary","scrollIntoView","BaseKey","Enter","prosemirror_commands_1","splitBlock","liftEmptyBlock","createParagraphNear","Backspace","selectNodeBackward","joinBackward","deleteSelection","Tab","ShiftTab","Delete","selectNodeForward","joinForward","platform_1","kPlatformMac","Home","End","ArrowLeft","ArrowUp","ArrowDown","ModArrowDown","undoInputRule","x","commandMap","baseKey","unshift","values","_e","isTextblock","cursorOffset","parentOffset","nodeText","prosemirror_gapcursor_1","selectionIsWithinRange","selectionIsWithin","nodeWithPos","selectionHasRange","selectionIsImageNode","NodeSelection","figure","selectionIsEmptyParagraph","paragraph","selectionWithinLastBodyParagraph","editingRoot","lastChild","slice_1","kPasteTransaction","kSetMarkdownTransaction","kNavigationTransaction","kInsertSymbolTransaction","kInsertCompletionTransaction","MarkTransaction","addMark","insertText","transactionsDocChanged","transactions","transaction","transactionsChangeSet","oldState","newState","transactions_1","changeSet","addSteps","mapping","maps","complete","oldSize","old","curSize","cur","outer","scan","sameMarkup","size","step","sliceContentLength","handlers","handlers_1","nodeAt","nodeFilter","haveChange","changes","change","fromA","toA","checkForChange","append","_loop_1","handlers_2","trTransform","prosemirror_transform_1","Transform","transactionsAreTypingChange","hasNode","descendants","navigator","platform","rmd_chunk","bullet_list","outlineNodes","bodyNode","childNode","kYamlMetadataOutlineItemType","itemsWithPos","getDocumentOutline","item","active","position","chunk","rmd_1","rmdChunkEngineAndLabel","kHeadingOutlineItemType","isOutlineNode","canInsertRmdChunk","within","findParentNodeOfType","table","list_item","blockquote","activeRmdChunk","rmdNode","rmdChunk","rmdChunkNodes_1","rmdChunkNode","chunks","lines","trimLeft","meta","matchLang","isContainerChunk","lang","delimiter","reduce","ticks","idx","insertRmdChunk","GapCursor","toggleBlockType","list_1","precedingListItemInsertPos","rmdText","util_1","uuidv4","prevListItemPos","precedingListItemInsert","previousRmdChunks","localeCompare","kEvalFalseRegEx","table_cell","table_header","cell","markedRange","mark_1","textBetween","ListType","extendStatics","__extends","b","setPrototypeOf","__proto__","__","constructor","assign","prosemirror_schema_list_1","ui_1","trailing_p_1","ProsemirrorCommand","omniInsert","MarkCommand","toggleMarkType","NodeCommand","BlockCommand","blockType","toggleType","WrapCommand","wrapType","toggleWrap","InsertCharacterCommand","codeRange","defaultToggleMark","toggletype","setBlockType","$anchor","lift","wrapIn","listType","itemType","blockRange","$to","isList","parentList","tight","setNodeMarkup","listSpacing","kListSpacingTight","replaceSelectionWith","selectAfter","requiresTrailingP","insertTrailingP","sameParent","allowKey","endCaptionPos","above","indexAfter","contentMatchAt","defaultType","abs","paragraph_1","insertTrailingPTransform","dom_1","outlineItemSimillarToNode","outlineItem","docOutlneNode","nodeA","nodeB","scrollTop","docOutlineLocationNode","items","documentOutline","docOutlineNode","locationIsBetweenDocOutlineNodes","restoreSelection","scroll_1","scrollToPos","cs","getComputedStyle","asNumber","parseFloat","paddingX","paddingLeft","paddingRight","paddingY","paddingTop","paddingBottom","borderY","borderTopWidth","borderBottomWidth","width","offsetWidth","borderX","height","offsetHeight","onElementRemoved","container","onRemoved","mutationsList","mutation","removedNodes","center","ordered_list","parentDiv","findParentNodeOfTypeClosestToPos","resultPos","resultNode","nodeDOM","scroller","zenscroll_1","createScroller","containerEl","duration","onDone","intoView","HTMLElement","xref_1","navigateToId","navigateToHref","href","editorFormat","xref","xrefPosition","xrefType","xrefPos","prevPos","max","dest","parentElement","navigateToPos","Id","Href","navigateToHeading","XRef","navigateToXRef","locators","colonPos","xrefInfo","id_1","locator_1","markType_1","hasXRef","nodeTypes","suffix","dashPos","xrefPositionLocate","quartoXrefPositionLocators","bookdownXrefPositionLocators","captions","prosemirror_utils_2","table_caption","mathType","math","prevNodeMath","thm","quartoDivLocator","lem","h2","headingLocator","h3","h4","h5","h6","fig","rmdChunkHasXRef","tab","raw_1","kTexFormat","cnj","thereomLocator","def","engine","pattern","pandocAsciify","newch","chars","len","asciify","gfmAutoIdentifier","editRawBlockCommand","raw_block","action","rawBlock","raw","prevSel","createRawNode","asyncEditRawBlock","containerWidth","kPixelUnit","ImageType","isValidImageSizeUnit","unit","kValidUnits","imageSizePropWithUnit","prop","isNaturalAspectRatio","dims","defaultValue","naturalWidth","naturalHeight","pixels","round","attrib","_match","p1","p2","removeStyleAttrib","extractSizeStyles","keyvalues","newKeyvalues","getValue","pair","kHeightAttrib","kStyleAttrib","_attrib","setProperty","replaceClassWithStyle","contains","remove","removeAttribute","children_1","children","EditorChangeType","diff_match_patch_1","timeout","dmp","diff_match_patch","Diff_Timeout","diff","diff_main","diff_cleanupSemantic","DIFF_INSERT","Insert","DIFF_DELETE","Error","regexp","getAttrs","InputRule","textIndex","delimStart","delete","Function","markStart","markInputRule","delimiterMarkInputRule","prefixMask","delim","contentPattern","textStart","textEnd","maskOffset","disabledMarks","marksWithNoInputRules","marksInRange_1","maskedMarkTypes","maskedMarkTypes_1","wrappingRule","wrappingInputRule","joinPredicate","paraContent","isText","sentence","hardBreak","hardBreakPos","init","_config","titleFromState","titleLine","foundTitle","updatedMetadata","updatedNode","yamlNode","hasOutlineIdsTransaction","usedIds","Set","outlineId","setMeta","GoToNextSection","goToOutlineCommand","GoToPreviousChunk","editorOutline","transactionsHaveChange","transactionsAffectOutline","targetType","outline","target","sequence","Map","rootOutlineItem","defaultLevel","typename","sequenceLast","getState","FindPlugin","instance","DecorationSet","updating","update","prevState","clearResultObserver","isResultSelected","scrollToSelectedResult","decorations","resultElement","resultObserverTimer","term","escape","updateResults","selectResult","afterSelection","matchesTerm","selectedText","wrap","searchTo","decorationSet","withResultUpdates","searchFrom","decoration","lastDecoration","nextDecoration","tr_3","tr_4","selectionMarks","marksAcross","replaceAll","replaced","hasTerm","tr_5","clear","kAddToHistoryTransaction","resultDecorations","search","findRegEx","Decoration","inline","class","setSelection","watchForSelectedResult","MutationObserver","records","observer","ele","isResultNode","observe","childList","window","setTimeout","resultObserver","disconnect","clearTimeout","querySelector","scrollElement","nextParent","offsetParent","caseSensitive","findPlugin","inclusive","parseDOM","toDOM","readers","writer","writeInlines","OmniInsertCommand","inputRuleFilter","completionHandlers","omni_insert_completion_1","omniInsertCompletionHandler","OmniInsert","completion_1","selectionAllowsCompletions","kCompletionDefaultMaxVisible","prevHandler","scope","Node","replacement","omniInsertCompletions","inserter","keywords","keyword","sort","thenby_1","firstBy","omniInsertGroupCompare","thenBy","omniInsertPriorityCompare","direction","completion","deleteRange","selectionOffset","removeCommandText","component","OmniInserterView","kOmniInsertRegex","query","placeholder_1","placeholderDecoration","translateText","completions","OmniInsertGroup","placeholder","pluginKey","set","emptyNode","textBefore","completionTextBeforeCursor","prevToken","isPaste","scrollUnsubscribe","removeEventListener","clearCompletions","pluginState","handled","horizontal","completionsActive","kbEvent","insertCompletion","selectedIndex","renderCompletions","forwardKey","completionPageSize","preventDefault","stopPropagation","promise_1","PromiseQueue","resetSelection","setAllCompletions","updatedCompletions","requestVersion_1","setDisplayedCompletions","displayedCompletions","updateCompletions","completionStream_1","stream","filteredCompletions","allCompletions","requestAllCompletions_1","hideNoResults","completionPopup","completion_popup_1","createCompletionPopup","renderCompletionPopup","performCompletionReplacement","CompletionPlugin","__importStar","document","createElement","zIndex","popup","completionPopupSize","positionStyles","selectionCoords","left","innerHeight","innerWidth","cursorCoords","completionPopupPositionStyles","applyStyles","render","react_1","CompletionPopup","destroyCompletionPopup","unmountComponentAtNode","concat","popup_1","Popup","CompletionList","kCompletionDefaultItemHeight","useRef","containerRef","scrollToRow","getElementsByClassName","ref","completionCount","header","completionHeader","headerProps","message","lineHeight","colSpan","completionsHeader","itemHeight","kNoResultsHeight","noResults","completionsNoResults","verticalCompletions","itemEventHandler","completionItemCell","onClick","onMouseMove","onHover","cellWidths","maxVisible","kCompletionDefaultWidth","headerHeight","horizontalCellWidths","total","contentEditable","queue","catch","err","running","reject","dequeue","spelling_1","excludedMarks","onCheckBegin","getWords","excluded","spellingDocPlugin","createAnchor","getText","wordRange","fromCoords","toCoords","spellingDocKey","get","SpellingDocPlugin","checking","anchors","setPosition","getPosition","SpellingAnchor","onCheckEnd","isBlock","classifier","findBeginWord","findEndWord","beginPos","classifyCharacter","currentPos","advanceToWord","endWordPos","excludeWord","words","shift","spellcheckerWord","kCharClassWord","kCharClassBoundary","kCharClassNonWord","spelling_2","hasFocus","realtimeEnabled","hasBeenFocused","word_1","wordDecos","decos","prosemirror_changeset_1","ChangeSet","steps","AddMarkStep","RemoveMarkStep","markStep","markRanges","removeRanges_1","fromPos","toPos","fromB","toB","addRanges_1","spellingDecorations","cursorDecos","realtimeSpellingKey","contextmenu","spellingSuggestionContextMenuHandler","focusUnsubscribe","updateSpelling","v_1","isConnected","excludeCursor","ranges","rangeMap","wordText","incorrectWords_1","checkWords","wordsToCheck","incorrectWord","ranges_1","cursor","menuItems","showContextMenu","clientX","clientY","schema_1","posAtDOM","deco","from_1","to_1","word_2","suggestionList","suggestions","suggestion","menuAction","ignoreWord","pandocPreprocessors","pandocTokensFilters","pandocBlockReaders","pandocInlineHTMLReaders","pandocBlockCapsuleFilters","pandocMarkWriters","autoIds","preprocessor","blockCapsuleFilters","pandoc_capsule_1","pandocMarkdownWithBlockCapsules","original","pandoc_to_prosemirror_1","pandocToProsemirror","ast","tokensFilters","blockReaders","inlineHTMLReaders","postprocessor","fromProsemirror","pandocOptions","referenceLocation","isParagraphNode","firstChild","paraNode","hard_break","disabledTableTypes","disabledFormatOptions","atxHeaders","dpi","column","parseInt","wrapOptions","astToMarkdown","adjustedFormat","disabled","newFormat","ext","kBlockCapsuleSentinel","handleText","encodedBlockCapsuleRegex","flags","envelopeLen","base64_1","base64Decode","record","fieldValue","blockCapsuleSourceWithoutPrefix","capsuleFilter","p3","p4","originalPos","positions","discard","extract","defaultExtractor","capsule","base64Encode","enclose","encodedRecord","decodeBlockCapsuleText","filters","blockCapsuleTextHandler","textFilter","stripPrefix","CodeBlock","RawBlock","parsePandocBlockCapsule","blockCapsuleParagraphTokenHandler","tokenRegex","Para","codeUnits","Uint16Array","Uint8Array","buffer","bytes","binary","Parser","createHandlers","ParserState","openNode","addNode","closeMark","writeText","hasInlineHTMLWriter","parser","writeInlineHTML","logUnrecognized","logExampleList","isNodeOpen","blocks","resolvePandocBlockCapsuleText","Null","prevTok","lineBreaks","columnBreaks","sentenceBreaks","gfm_auto_identifiers","heading_ids","hasShortcutHeadingLinks","equalsIgnoreCase","autoIdentifier","ascii_identifiers","headingIds","has","toLocaleLowerCase","Link","heading_1","kHeadingLevel","kHeadingAttr","kHeadingChildren","astBlocks","writeTokens","targetAst","lineWrapping","targetTokens","writeToken","blockCapsule","writeNode","reader","getChildren","this_1","block","blockReaders_1","blockReader","nodeType_2","closeNode","code_block","pandocAttrReadAST","readers_1","stack","Mark","none","notes","topNodeType","hasExampleLists","exampleLists","merged","info","isInline","openMark","addToSet","removeFromSet","openNoteNode","note","footnoteNumber","unrecognizedTokens","maybeMerge","sameSet","pandocFromProsemirror","apiVersion","nodeWriters","notesNode","PandocWriter","writeNodes","initEscapeCharacters","write","writeSpaces","spaceAfter","output_1","spaceBefore","outputText","trimRight","writeArray","writeAttr","preventEscapeCharacters","kPreventBracketEscape","flushTextRun","textRun_1","smart","manualEscapeCharacters","writeNote","Note","noteBody","fragment","nextNode","childIndex","currentChild","nodeMarks","next","markedNodes","activeMarks","md","fragment_1","fragmentText","escapeSymbols","escaped","escapeCharacters","RawInline","withOption","fill","tex_math_single_backslash","allEscapeCharacters","emjojiMark","emoji","emojihint","blockquote_1","code_block_1","figure_1","hr_1","hard_break_1","null_1","em_1","strong_1","history_1","select_all_1","cursor_1","clear_formatting_1","smarty_1","attr_duplicate_id_1","empty_mark_1","escape_mark_1","code_block_input_1","paste_text_1","footnote_1","manager","ExtensionManager","slides_1","bottom_padding_1","insert_symbol_plugin_symbol_1","insert_special_characters_1","nbsp_1","remove_section_1","yaml_metadata_1","rmd_chunk_1","table_1","definition_list_1","raw_block_1","shortcode_block_1","html_preserve_1","superscript_1","code_2","codeViewClipboardPlugin","collect","pandocNodes","collectFrom","pandocPostprocessors","pandocReaders","flatMap","tokensFilter","inlineHTMLReader","blockCapsuleFilter","pandocNodeWriters","code_view","views","attrEditors","appendMarkTransactions","appendMarkTransaction","collector","results","visitor","quote","Plain","InsertParagraphCommand","HeadingCommand","headingCommandFn","heading1","heading1_dark","heading2OmniInsert","heading2","heading2_dark","headingOmniInsert","heading4OmniInsert","heading4","heading4_dark","description","group","Headings","headingName","pandocAttrSupported","pandocAttrParseDom","header_attributes","mmd_header_identifiers","headingAttrs","headingAttr","data-link","preferHidden","partMatch","cut","writeBookdownH1","Heading1","heading1OmniInsert","Heading5","Heading6","textblockTypeInputRule","kHeadingLevels","pandocAttrParseText","emptyHeadingPlaceholderPlugin","CodeBlockFormat","codeBlockFormatCommandFn","languages","code_block_dark","fenced_code_attributes","potentialLang","codeBlockProps","dialogs","editCodeBlock","applyProps","propsWithLangClass","codeBlock","tags","right","editFn","codeNodeSpec","hasAttr","pandocAttrSpec","codeBlockLang","attrEditFn","codeBlockAttrEdit","CodeBlockFormatCommand","exitCode","ListNumberStyle","listAttrEdit","capabilities","list_commands_1","editListPropertiesCommandFn","task_lists","fancy_lists","startnum","tasks","checked","list_pandoc_1","readPandocList","number_delim","ListNumberDelim","DefaultDelim","order","number_style","typeToNumberStyle","numberDelim","fancy","DefaultStyle","Decimal","UpperAlpha","LowerRoman","UpperRoman","Example","OrderedList","writePandocOrderedList","nodeViews","ListCommand","BulletList","bulletListOmniInsert","orderedListOmniInsert","ListItemSink","sinkListItem","ListItemLift","liftListItem","ListItemSplit","splitListItem","list_checked_1","CheckedListItemCommand","CheckedListItemToggleCommand","basekeys_1","isNotInHeading","conditionalWrappingInputRule","tightFn","div_1","listItemType","autoJoin","toggleList","TightListCommand","editList","EditListPropertiesCommand","incrementalDiv","divAttrs","$endPos","wrapping","incremental","Ordered","liftTarget","nodeRange","targetLiftDepth","isFullDivSelection","pandocAttrHasClass","editDiv","createDiv","removeDiv","defining","data-div","divCommand","Div","canApplyDivInputRule","attribMatch","cmds","DivCommand","Common","div_dark","appendTransaction","_transactions","_oldState","createCalloutDiv","Content","generic","calloutType","calloutAppearance","calloutIcon","calloutCaption","resultAttr","_l","callout","pandocAttrSetKeyvalue","appearance","icon","caption","_h","Tabset","insertTabsetCommandFn","tabset_dark","tabset","CheckedListItemNodeView","getPos","editable","ev","contentDOM","checkedListItemCommandFn","itemNode","setItemChecked","checkedListItemToggleCommandFn","check","baseInputRule","fragmentWithCheck","raw_inline","mappedTokens","lastWasChecked","writeListItemInlines","example","readNumberStyle","childAttrs","childWithChecked","listNodeOptions","writePandocListItem","writePandocBulletList","imageAttributes","src","decodeURI","readPandocTitle","requireHTML","writeRawMarkdown","linkTo","writeFigure","writeLink","imageInlineHTMLReader","isImage","image_util_1","inlineHTMLIsImage","imageAttrsFromHTML","imageDOMOutputSpec","imageDOMAttributes","alt","parseFromString","imageCommand","editorUI","img","imgDimensions","pandocImageHandler","imagePandocOutputWriter","imageNodeAttrsSpec","imageAttr","imageAttrsFromDOM","Image","attr_edit","noDecorator","_schema","imageTextSelectionPlugin","imageEventsPlugin","imagePropsWithSizes","linkMark","Figure","kQuartoDocType","align","env","editImage","units","isNaturalHeight","newImage","imageProps","insertAndSelectNode","partitionedKeyvalue","sizeWithUnit","ensureContainerWidth","imagePos","findParentNodeClosestToPos","domAtPos","resizeContainer","elementInnerDimensions","resizeEl","definition_list","convertImagesToFigure","imagesToFiguresTransform","linkAttrs","getMarkAttrs","mappedImagePos","writerHasProhibitedFigureParent","contentElement","isParaWrappingFigure","html_1","isSingleLineHTML","isHTMLImageBlock","fixupContext","figureKeys","image_view_1","imageNodeViewPlugins","ImageNodeView","editorEvents","unregisterWatchImg","implicitFigures","implicit_figures","resizeUI","selectOnClick","imgBroken","onerror","onclick","ondblclick","image_dialog_1","imageDialog","imageDimensionsFromImg","updateImg","figcaption","noPropagateClick","manageFigcaption","ondragstart","initResizeContainer","updateImageSize","destroy","clearSizeOnVisibleTimer","detachResizeUI","selectNode","draggable","image_resize_1","isResizeUICompatible","detach","attachResizeUI","ignoreMutation","mapResourceToURL","updateImageViewSize","isFigure","sizeOnVisibleTimer","setInterval","clearInterval","imageContainerWidth","noImplicitFigures","emptyFigcaption","selectionInFigcaption","hide","display","minHeight","margin","widthWithUnit","heightWithUnit","setMarginsForAlignment","marginWidth","marginRight","marginLeft","overflow","incompatibleWidth","incompatibleHeight","imageNode","imgContainerWidth","updateImageNodeFromShelf","hasPercentWidth","updateImageNodeSize","shelf","onInit","onWidthChanged","onHeightChanged","onUnitsChanged","onEditImage","uiImages","widgets_1","createPopup","editorContainer","updatePosition","editorBox","getBoundingClientRect","imageBox","editingScrollContainerEl","editingRootScrollContainerElement","positionTimer","panel","createHorizontalPanel","addToPanel","widget","addHorizontalPanelCell","paddingSpan","createInputLabel","wLabel","createTextInput","inputClasses","hLabel","hInput","onchange","hAutoLabel","unitsSelect","checkboxWrapper","lockCheckbox","lockLabel","createImageButton","properties","onload","manageUnitsUI","percentSizing","isNaN","getDim","wInput","shelfSizeFromImage","setWidth","setHeight","lock","resizeShelf","sync","lockRatio","prevUnits","widthPixels","widthInUnits","handle","onSizing","onSizingComplete","onPointerDown","startWidth","pageX","pageY","movedX","startX","movedY","startHeight","onPointerUp","havePointerEvents","releasePointerCapture","pointerId","onPointerMove","setPointerCapture","resizeHandle","cssFloat","liftStyle","liftImgStyle","widthProp","heightProp","verticalAlign","onDestroyed","observer_1","subtree","button","imageEl","optionEl","widthChars","atEnd","selectFigureCaption","selectFigure","verticalArrowCanAdvanceWithinTextBlock","exitNode","isWithinEmptyCaption","parentIndex","previousNode","parentTextBlock","figureSelection","nodePos","arrowHandler","ArrowRight","clipboardEvent","clipboardData","types","clipboardUris","then","uris","handleImageUris","getData","dragEvent","dataTransfer","coordinates","posAtCoords","uriList","droppedUris","imageUris","uri","drop","imageDrop","handlePaste","imagePaste","horizontal_rule_dark","horizontal_rule","HorizontalRule","insertNode","hrOmniInsert","selectable","ModEnter","ShiftEnter","atom","Emph","_mark","writeMark","Em","em","Strong","strong","inline_code_attributes","codeAttrs","autolink_bare_uris","citations","linkAttr","data-heading","extraAttr","kLinkTargetUrl","kLinkTargetTitle","linkCommand","onEditLink","result_1","Heading","asyncEditLink","link_dark","remainStart","linkEnd","matchText","copy","fromArray","linkText_1","attrs_1","matchedHeading_1","headingLink","headingText","headingPos","linkPos","clipboard_1","tooltip_1","button_1","linkCmd","removeLinkCmd","kMaxLinkWidth","React","LinkPopup","maxLinkWidth","openURL","clipboard","linkText","isSupported","LinkButton","showCopyButton","ImageButton","on","grav","show","onKeyDown","forwardRef","tabIndex","specKey","dismissOnEdit","makeLinksAccessible","onCmdClick","kRestoreLocationTransaction","target_1","decorationPosition_1","decoration_1","textRangePopupDecorationPosition","editorView","ignoreSelection","stopEvent","textPopupDecorator","decorationEl","visibility","reactRenderForEditorView","links","getElementsByTagName","onkeydown","click","ReactDOM","element","editingBox","editingEl","editingBoxStyle","topPadding","popupStyle","rangeCoords","rightPos","prosemirror_history_1","history","SelectAll","selectAll","findBlockNodes","childBlocksSelection","gapArrowHandler","prosemirror_dropcursor_1","dropCursor","gapClickHandler","createGapCursor","$divPos","nodeBefore","mouseEvent","clickPos","inside","divNode","blockRequiresGap","$clickPos_1","nodeAfter","kFormattingMarks","markName","setStoredMarks","definition_list_term","definition_list_description","clearFormatting","enDash","ellipsis","emDash","fancyQuotesToSimple","hasAttrId","attrNode","mk","markRange_1","scannedRanges","extensionIfPandocAttrEnabled","fencedAttributes","langAttrib","codeBlockInputRuleEnter","canApplyCodeBlockInputRule","paragraphNode","paragraphRect","editorRect","bodyEl","bodyElement","insert_symbol_plugin_1","symbol_dark","symbol","filterPlaceholderHint","symbolGroups","symbols_1","insertSymbolTransaction","symbolCharacter","searchTerm","UnicodeSymbolDataProvider","symbolGroupNames","symbolGroup","flat","codepoint","groupName","symbols","unicode_1","parseCodepoint","filterText","filteredSymbols","fromCodePoint","Symbol","performInsertSymbol","symbolOmniInsert","InsertSymbolPlugin","isValidCodepoint","hexOnlyText","hexValue","Number","valueOf","showPopup","closePopup","focusChanged","panelPositionStylesForCurrentSelection","react_dom_1","insertSymbolPopup","maximumTopPosition","minimumTopPosition","popupTopPosition","maximumLeftPosition","minimumLeftPosition","searchImage","searchPlaceholder","dataProvider","insert_symbol_grid_preview_1","InsertSymbolPopup","popupHeight","popupWidth","useState","setFilterText","selectedSymbolGroup","setSelectedSymbolGroup","selectedSymbolIndex","setSelectedSymbolIndex","preferenceChanged","setPreferenceChanged","symbolDataProvider","getSymbols","useMemo","filterSymbols","useEffect","focusElement","textRef","handleSelectedSymbolCommitted","onInsertSymbol","preferencesProps","onPreferencesChanged","preferenceRef","lastElement","onClose","shiftKey","focus_1","isElementFocused","gridRef","altKey","newIndex","insert_symbol_grid_1","newIndexForKeyboardEvent","gridWidth","TextInput","iconAdornment","onChange","selectRef","selectedOptions","selectedGroupName","symbolIndex","activeElement","SelectInput","characterWidth","onKeyUp","onKeyPress","onFocus","onPaste","SymbolCharacterGrid","columnWidth","floor","numberOfColumns","characterCellData","onSelectionChanged","selectedItemClassName","scrollToItem","rowIndex","symbolCharacters","react_window_1","FixedSizeGrid","columnCount","rowCount","ceil","rowHeight","itemData","SymbolCharacterCell","numberOfCells","prevRow","currentIndex","nextRow","nextPage","prevPage","itemIndex","characterGridCellItemData","onSelectionCommitted","symbolPreviewStyle","fontSize","insert_symbol_emoji_skintone_1","SymbolEmojiPreferencesPanel","bestAlias","aliases","alias","emoji_2","nodeForEmoji","kCategoryAll","emoji_1","emojiCategories","EmojiSymbolDataProvider","skinTone","emojiSkinTone","symbolForEmoji","hasMarkdownRepresentation","Emoji","emojiOmniInsert","emojis_all_1","emojis","emojiWithSkinTone","supportsSkinTone","emojiRaw","category","characterForSkinTone","SkinTone","Default","None","hasSkinTone","kEmojiAttr","kEmojiContent","catgegory","categories","emojiString","emojiWithSkinTonePreference","emojiFromChar","emojiAlias","kEmojis_1","emojiForAllSkinTones","Light","MediumLight","Medium","MediumDark","Dark","hint","prompt","emojiMark","emojiChar","emojiFromAlias","emojiName","emojiCompletionHandler","emojiSkintonePreferenceCompletionHandler","charLoc","skinToneEmoji","Save","markTr","markFrom","EmojiView","kEmojiCompletionRegEx","prefix_1","completions_1","setEmojiSkinTone","EmojiSkintonePreferenceHeaderView","kHeaderHeight","pref","kCellWidth","emojiText","selectedSkinTone","setSelectedSkinTone","previewEmoji","setSelectSkinTone","getCurrentSkinToneIndex","previewEmojiWithSkinTones","findIndex","nextSkinTone","selectSkinTone","commitSkinTonePreference","skinToneSelectedClass","handleButtonClick","EmDash","pastePluginKey","transformPastedHTML","highlightNode","forChangedNodes","highlightPluginKey","ReplaceStep","isRemoval","isSectionRemoval","fullySelectedDiv","divSelFrom","divSelTo","fullySelectedDivSection","insertSlideColumns","columnsContent","columnAttrs","insertSlidePause","InsertSlidePause","slide_pause_dark","slide_pause","InsertSlideNotes","insertSlideNotes","slide_notes_dark","slide_notes","InsertSlideColumns","slide_columns_dark","slide_columns","Strikeout","strikeout","Superscript","superscript","Subscript","subscript","SmallCaps","Smallcaps","smallcaps","RawInlineInsertCommand","defaultFormat","outputFormats","editRawInline","raw_inline_dark","RawInlineCommand","kRawInlineFormat","kRawInlineContent","raw_attribute","rawTexMark","raw_tex","texText","texMatchLength","tex_1","texLength","addStoredMark","setTexSelectionAfterInsert","InsertInlineLatexCommand","TexInline","latexHighlightingPlugin","mark_highlight_1","markHighlightPlugin","_attrs","markHighlightDecorations","noInputRules","splitInvalidatedMarks","texInputRule","braces","highlighter","decorationsForDoc","removeDecorations","addDecorations","markDecorations","rehighlightParent_1","isLetter","inBraces","braceLevel","inBrackets","bracketLevel","rawhtmlMark","endLoc","startLoc","isHTMLTag","close","void","isVoidTag","endTag","tagStartLoc","inSingleQuote","inDoubleQuote","rawHtmlInputRule","raw_inline_1","isRawHTMLFormat","writeInlneHTML","isSingleTag","data-type","spellcheck","kInlineMathRegex","mathText","Display","beginMatch","endMatch","splice","pendingTokens","filteredTokens","tokens_1","mathToken","flushPendingTokens","inlineMathNav","math_keys_1","displayMathNewline","mathLength","startMath","math_commands_1","InsertInlineMathCommand","InsertDisplayMathCommand","singleLineDisplayMath","math_transaction_1","mathAppendMarkTransaction","math_inline_dark","math_inline","allowNewline","DisplayMath","insertMathCommand","math_display_dark","math_display","displayMathOmniInsert","insertMath","mathMark","mathRange","mathAttrs","editMath","maths_1","mathAttr","MathPopupPlugin","lodash_debounce_1","updatePopup","updatePopupTimer","resizeUnsubscribe","mousemove","lastRenderedMath","$mousePos","equationPreview","rangeStartCoords","rangeEndCoords","editingRootNodeClosestToPos","editingElStyle","styles","inlineMath","typeset","error","autoscollPopup","popupBox","mathBottom","editorEl","toY","mathText_1","mathjaxDiv","isActiveTab","editMathAttributesEnabled","attr_edit_decoration_1","attrEditDecorationWidget","editMathAttributes","prevMathRange","delta","verticalArrowHandler","mathPos","kEditAttrShortcut","rightPaddingOffset","attrsNode","attrsEl","offsetParentStyle","AttrEditDecoration","cssProps","noSelectOnClick","attrEdit","buttonTitle","lodash_uniqby_1","kCiteIdBasePattern","bibManager","_event","cite_id","parsedDOI","cite_doi_1","doiFromSlice","doiText","findDoiInLocalBibliography","allowsWrites","citeIdInputRule","citeIdLen","citeIdLength","citeStart","citeEnd","readPandocCite","citeMark","cite","writeCitation","citationPrefix","suppress","citationMode","CitationMode","SuppressAuthor","citeIdMark","citationId","inTextSuffix","AuthorInText","citationSuffix","kNoteCiteRegex","kInTextCiteRegex","kInTextCiteWithSuffixRegEx","kCiteId","kFindInTextCiteWithSuffixRegex","applyCiteMarks","provider","performCiteCompletionReplacement","existingEntry","bibliographyFiles","writableBibliographyFiles","writableFile","insertCite","writableBiblios","thisWritableBiblio","writable","displayPath","bibliographyFile","fullPath","writableBiblioPath","isProject","project","providerKey","ensureSourcesInBibliography","idText","sources","providersWithWarnings","zoteroUseBetterBibtex","isBibTexBibliography","all","withWarning","warning","warningForProvider","yesNoMessage","every","idMark","kCitationIdRegex","citeText","bibliography_1","BibliographyManager","zotero","Cite","closeCite","openCite","cite_2","parentText","beginBracketPos","prefixMatch","cite_commands_1","InsertCitationCommand","bibliographyManager","trans","citeLength","cite_completion_doi_1","citationDoiCompletionHandler","citationCompletionHandler","cite_popup_xref_1","citeXrefPopupPlugin","cite_popup_1","citePopupPlugin","bibliography_provider_local_1","bibliographyFileForPath","path","bibliographyTypes","defaultBiblioType","bibliographyDefaultType","displayName","kFields","weight","zoteroServer","BibliographyDataProviderZotero","refreshCollectionData","parsedYamlNodes","docPath","providersNeedUpdate","providersEntries","idSort","parseYamlNodes","providers","getDefaultResourceDir","prev","curr","isWritable","hasSources","allSources","kLocalBibliographyProviderKey","sourcesForProvider","sourcesForProviderCollection","collectionKey","localSources","bibFile","localProviders","providerName","prov","dataProviderBibTeX","generateBibTeX","bibDB_1","toBibTeX","warningMessage","warningProvider","findIdInLocalBibliography","searchProviderCollection","searchProvider","searchSources","limit","searchIndex","kSearchOptions","$and","q","prime","resourcePath","yamlBlocks","parsedYamls","refBlockParsedYamls","parsedYaml","lastReferenceParsedYaml","referenceBlockFromYaml","getBibliography","bibliographiesAbsolute","refBlock","etag","bibliography","updateIndex","collections","collectionKeys","itemsForCollection","project_biblios","kPermissableFileExtensions","projectBiblio","path_1","getExtension","bibliographyFilesFromDocument","BibliographyDataProviderLocal","bibliographyFilesFromDoc","bibliographyValues","valueFromYamlText","bibliographiesRelative","biblioNode","createBiblographyYamlNode","yamlWithBib","addBibliographyToYamlNode","firstBlock","joinPaths","root","expandPaths","rootPath","isAbsolute","isWindows","isWinPathSeparator","CHAR_COLON","CHAR_FORWARD_SLASH","fileName","lastDot","biblatex_csl_converter_1","BibTypes","bibTypeKey","cslType","bibType","misc","keySortOrder","publisher","enumerableCSL","aOrder","bOrder","cslKey","biblatex","BibFieldTypes","bibFieldKey","bibField","cslFieldName","bibFieldDatas","bibFieldData","nodeValue_1","cslDate","edtfDate","csl_1","cslDateToEDTFDate","options_1","optionKey","options_2","rangeArray","bibDBFieldName","required","optional","eitheror","shouldIncludeField","bibObject","pmNode","csl_text_1","cslTextToProsemirrorNode","nodes_1","BibLatexExporter","bibDB","traditionalNames","cslToBibDB","bibtex_1","bibDbToBibTeX","ensureValidCSLType","cslTypes","crossref_1","crossRefTypeToCSLType","sanitizeForCiteproc","sanitizeProperties","property","license","contributor","abstract","cslFromDoc","cslParsedYamls","part","partStr","_f","_g","_j","_k","_m","_o","_p","_q","_r","_s","_t","_u","_v","_w","_x","_y","_z","article","articleJournal","articleMagazine","articleNewspaper","review","reviewBook","article_dark","bill","legislation","legalCase","treaty","legal","legal_dark","book","manuscript","thesis","book_dark","broadcast","broadcast_dark","dataset","data","data_dark","entryDictionary","entryEncylopedia","entry_dark","image_dark","map_dark","motionPicture","movie","movie_dark","musicalScore","song","song_dark","post","postWeblog","webpage","web","web_dark","paperConference","interview","pamphlet","personalCommunication","report","speech","other","other_dark","chapter","graphic","patent","kCrossrefItemsPerPage","imageForCrossrefType","crossRefTypes","monograph","journalArticle","journalVolume","journal","journalIssue","proceedingsArticle","dissertation","reportSeries","editedBook","bookChapter","bookSet","bookTrack","referenceBook","referenceEntry","postedContent","standard","standardSeries","peerReview","proceedingsSeries","proceedings","prettyType","bookSection","bookPart","bookSeries","kCslDOMParser","cslDOMParser","tagSpec","sup","sub","spanSpec","nocase","keysToExport","entryObject","csl_type","types_1","typeMapping","bibtex","bib_type","bibTexType","entry_key","fieldsForExport","fieldKey","fields_1","FieldMap","fieldType","typeReader","bibtexKey_1","outputFields","bibtexValue","year","month","formatText","formatRange","formatKey","escapeNonAscii","bibtexEntry","bibtexEntries","toBibtex","entries","bibTexStr","sortedKeys","rawValue","booktitle","howpublished","pages","edition","issue","url","codePointAt","characters_1","thisNodeMarks","closing","closeTags","lastNodeMarks","closeTag","formatting_1","FormattingTags","open","opening","formattedText","verbatim","doNotEscape","formatNames","names","formattedNames","given","protect","bookauthor","language_1","lanagugeMappings","series","swedish","thai","BibTextTypes","inbook","phdthesis","unpublished","inproceedings","bibtexType","manual","incollection","conference","mastersthesis","techreport","fieldsRequired","fieldsOptional","booklet","fieldsEitherOr","character","latex","decimal","731","ungrouped","780","__rest","kZoteroProviderKey","_ui","_resourcePath","useCache_1","newCollections","specResult","zoteroConfig","getCollections","collectionSpecs","status","collection","existingCollection","allCollections","col","allCollectionSpecs","toBibliographyCollection","hasUpdates","zoteroSpec","parentKey","bibliographyPaths","bibTeX","betterBibtexExport","zotero_1","kZoteroBibTeXTranslator","libraryID","orderedByType","completionProviders","citeSearch","_state","currentEntries_1","loadedEntries_1","providerCount_1","promises","currentEntries","streamEntries","sortEntries","updatedEntries","_events","cite_completion_bibliography_1","bibliographyCiteCompletionProvider","cite_completion_search_1","completionIndex","completionId","filterCitations","CiteCompletionItemView","CompletionItemView","kCiteCompletionWidth","imageAdornment","primaryText","secondaryText","detailText","htmlTitle","imageForType","forceLightMode","bibliography_provider_zotero_1","zoteroOverlay","cslName","referenceEntryForSource","kQuartoXRefTypes","kCiteCompletionTypeXref","getDocumentPath","referenceEntryForXref","loadedEntries","FuseIndex","xrefCompletions","xrefKey","xrefView","xrefs","fuse","createIndex","typeQuery","colonLoc","isCaseSensitive","shouldSort","withSavedDocument","refs","kXRefTypes","subTitle","kTableType","table_dark","h1","kEqType","exr","kGenericType","kTheoremType","theorem_dark","theorem","equation_dark","equation","defaultEntries","includeMatches","threshold","completion_detailed_1","cslEntry","CompletionItemDetailedView","kCompletionWidth","bibMgr","isXRef","source_1","previewHtml","finalHtml","citationHTML","JSON","stringify","rootDiv","classNames","ensureSafeLinkIsPresent","urlForCitation","CitePopup","Citation","alreadyInCite","includeWrapper","wrapperText","preCiteIdRange","endOfWrapper","initialSelectionKey","selectionKey","setCitationDefaultInText","intextCitationStyle","bibliographySources","bibliographySources_1","citeIdText","performInsertCitations","initiallySelectedNodeKey","containerHeight","confirm","cancel","showProgress","hideProgress","windowHeight","crossrefSourcePanel","crossref","dataciteSourcePanel","datacite","packageSourcePanel","environment","bibliographySourcePanel","InsertCitationPanel","onOk","requiresProgress","bibliographySourceProviders","sourceProvider","isSlowGeneratingBibliographySource","toBibliographySource","onCancel","configuration","insertCitationConfiguration","setInsertCitationConfiguration","treeSourceData","statusMessage","selectedPanelProvider","placeHolderMessage","existingBibliographyFile","createBibliographyFile","changeExtension","citationDefaultInText","setInsertCitationPanelState","insertCitationPanelState","updatedState","citationsToAdd","displayedCitations","mergeCitations","selectedCitation","mergedCitationsToAdd","typeAheadSearch","selectedNode","panelRef","streamTimerId","panelProvider","panelForNode","setSelectedPanelProvider","refreshSearchCallback","insert_citation_source_panel_1","CitationSourceListStatus","useCallback","existingState","panelHeight","memoizedTypeaheadSearch","onExecuteSearch","searchCanceled","inProgress","progressMessage","existingCitationIds","searchResult","onConfirm","deleteCitation","selCite","filteredCitations","totalCitationCount","panelToDisplay","citationProps","navigation_tree_1","NavigationTree","suggestedPanel","tag_input_1","TagInput","displayText","isEditable","isIdEditable","targetSource","currentlySelectedCitation","onTagValidate","insert_citation_bibliography_picker_1","CitationBibliographyPicker","onCreateBibliographyFileNameChanged","biblographyFile","dialog_buttons_1","DialogButtons","nodeForKey","selected","toAdd","Tag","onTagDeleted","onTagChanged","editing","setEditing","editingText","setEditingText","setDisplayText","restoreFocusAfterCancel","useLayoutEffect","editTextInput","onEditClick","validationMessage","alert","kAlertTypeError","showingValidationError","commitTagEdit","pathToNode","expanded","visibleNodes","vizNodes","fixedList","stepNode","onSelectedNodeChanged","FixedSizeList","itemSize","showSelection","preventFocus","NavigationTreeItem","indentLevel","selectedClassName","nodeList","allNodes","increment","containsChild","existingSource","finalId","rootImageForProvider","zotero_root","bibligraphy","toTree","containers","folderImage","treeMap","currentNode","hasParent","rootNodes","zotero_collection","bibligraphy_folder","folderImageForProvider","BibligraphySourcePanel","treeNode","local_sources","providerNodes","onResults","useBetterBibTex","toCitationListEntries","insert_citation_source_panel_typeahead_search_1","CitationSourceTypeheadSearchPanel","onSearchTermChanged","onSelectedIndexChanged","onAddCitation","listContainer","searchBoxRef","focusSearch","insert_citation_source_panel_list_1","CitationSourceList","focusPrevious","insert_citation_source_panel_list_item_1","CitationSourcePanelListItem","currentCitation","handleListKeyDown","handleIncrementIndex","itemsPerPage","onBlur","itemCount","onRemoveCitation","showSeparator","itemProvider","search_progress","citationListData","citationEntry","maxIdLength","alreadyAdded","_selectedNode","e_1","matchExistingSourceCitationListEntry","toCitationListEntry","errorForStatus","insert_citation_source_panel_list_item_detailed_1","pasted","performSearch","lastSearch","initialFocusSet","CitationSourcePanelListItemDetailed","doiServer","dedupeCitationIds_1","citationEntries","works","work","coercedCSL","crossrefWork","crossrefWorkTitle","pubmed","pubMedResult","docs","pubmed_1","pubTypes","doiResult","sanitizedCSL","noResultsMessage","sortFirstAuthor","pubDate","creators","creator","fetchCSL","dataciteResult","familyName","publicationYear","packageInfo","citeInfos","packageCitationToCSL","citeInfo","people","bibtextTypeToCSLType","person","date-parts","suggestPackageCiteId","incrementName","retryCount","pkgIndex","getRPackageState","pkg","pkgInfos","sorted","fuse_js_1","searchFields","searchField","PackageSourcePanel","packages","getPackageIndex","packageInfos","parsed","quartoXrefForId","xrefs_1","span","getSelectionMarkRange","asyncEditSpan","native_spans","data-span","all_symbols_escapable","stripRefBackslashTransform","potentialXRef","bookdownXRefUI","CrossReference","References","cross_reference_dark","cross_reference","insert_xref_1","insertXref","xref_2","xrefForId","select_1","xref_completion_1","insert_xref_index_1","lastSelectedStyleIndex","kXRefStyles","fn","xRefTypes","kTheoremTypes","type_table","type_equation","type_listing","htmlDialog","_showProgress","_hideProgress","windowWidth","InsertXrefPanel","styleIndex","onInsertXref","loadXRefs","quartoIndexForFile","setXrefs","selectedXRefIndex","setSelectedXRefIndex","selectedTypeIndex","setSelectedTypeIndex","selectedStyleIndex","setSelectedStyleIndex","styleSelectRef","prefixRef","typeOrder","unique","filteredXrefs","filtered","xrefIndex","filterXrefs","typeNodes","insertItem","currentStyle","currentPrefix","memoizedTextFilter","txt","handleKeyboardEvent","incrementIndex","acceptSelected","ondoubleclick","thisXref","onDoubleClick","InsertHTMLCommentCommand","HTMLComment","raw_html_comment","comment_dark","comment","data-format","isComment","kHTMLCommentMarkRegEx","detectAndApplyMarks","commentMarkAttribs","detectAndCreateShortcodes","shortcode_1","kShortcodeRegEx","shortcode","noSpelling","excludes","markTr_1","kShortcodePattern","writePandocNote","noteNode","footnote","number","footnoteOmniInsert","footnote_dark","selectedFootnote","findNoteNode","data-ref","data-content","footnote_editor_1","footnoteEditorActivationPlugin","footnoteEditorNodeViews","filterTransaction","footnote_transaction_1","footnoteFilterTransaction","footnoteSelectNoteAppendTransaction","Footnote","canInsertFootnote","edit","selectedNote","footnoteNode","ref_1","matching","ref_2","nodeDecoration","findFootnoteNode","NoteEditorView","footnoteEditorKeyDownHandler","firstNode","lastTextBlock","selectFootnote","findNotesContainer","noteWithPos","footnotes","findAllFootnotes","notesContainer","findAllNotes","toJSON","newNote","fromJSON","allNotes","footnoteFixupTransform","activeNote","tex","isLatexBeginOrEnd","RawBlockCommand","rawAttribute","textTrimmed","isSingleChildParagraph","isParagraphWrappingLatexBeginOrEnd","isParagraphWrappingRawLatexBeginOrEnd","matches","embeddedTickRegEx","matchRev","FormatRawBlockCommand","HTMLBlock","kHTMLFormat","Blocks","html_block_dark","html_block","TexBlock","YamlMetadata","yaml_block_dark","yaml_block","yaml_metadata_capsule_1","yamlMetadataBlockCapsuleFilter","YamlMetadataCommand","yaml_metadata_title_1","yamlMetadataTitlePlugin","RmdChunkCommand","Chunks","RChunkCommand","r_chunk_dark","r_chunk","PythonChunkCommand","python_chunk","BashChunkCommand","bash_chunk_dark","bash_chunk","rcpp_chunk_dark","rcpp_chunk","RcppChunkCommand","SQLChunkCommand","SQLCodeChunk","D3ChunkCommand","D3CodeChunk","d3_chunk","ExpandAllChunksCommand","ExpandAllChunks","ChunkExpansionCommand","CollapseAllChunksCommand","CollapseAllChunks","md_index","firstLineMeta","lineNumbers","lineNumberFormatter","lineNumber","lineCount","bookdownTheorems","StanChunkCommand","rmd_chunk_image_1","RmdChunkImagePreviewPlugin","uiContext","imagePreviewDecorations","isRmdChunkNode","widthMatch","firstLine","width_1","stripQuotes","imagePath_1","unsubscribe","watchResource","alignCenter_1","kBlockCapsuleType","capsuleText","LineBlock","line_block","tableTabKey","grid_tables","pipe_tables","simple_tables","multiline_tables","table_captions","table_nodes_1","tableCaptionNode","tableCellNode","tableHeaderNode","tableRowNode","Table","table_commands_1","insertTable","insertTableOmniInsert","TableInsertTable","TablePreviousCell","prosemirror_tables_1","goToNextCell","TableColumnCommand","TableAddColumnAfter","addColumns","TableAddColumnBefore","TableRowCommand","TableAddRowAfter","addRows","TableAddRowBefore","TableDeleteRow","deleteRow","TableColumnAlignmentCommand","TableAlignColumnRight","CssAlignment","Right","TableAlignColumnCenter","Center","TableAlignColumnDefault","TableToggleCaptionCommand","headerOptional","columnResizing","handleWidth","table_paste_1","tablePaste","table_contextmenu_1","TableContextMenuPlugin","tableShiftTabKey","multiline","table_columns_1","fixupTableWidths","tableRepairTransform","table_container","numRows","rows","cells","cellType","tableCaption","tableContainer","selectionPos","cols","inactive","Lists","deleteTable","columns","rect","selectedRect","addRow","alignments_1","rowNode","rowOffset","cellPos","cellOffset","cellNode","colIndex","TableToggleHeaderCommand","TableToggleHeader","toggleHeader","isInTable","TableToggleCaption","tr_2","left_1","right_1","selectionCell","tableStart","TableMap","CellSelection","rectBetween","$anchorCell","$headCell","tableGroup","getFromDOM","textAlign","kDefaultCellClasses","table_pandoc_1","readPandocTable","writePandocTableContainer","table_capsule_1","tableBlockCapsuleFilter","colgroup","childElementCount","colpercents","firstRow","colWidth","colWidths","tableColumnWidths","writePandocTable","writePandocTableCaption","table_row","writePandocTableNodes","writePandocTableHeaderNodes","alignments","AlignLeft","Left","AlignRight","AlignCenter","AlignDefault","tableToken","ColWidth","columnPercents","parseRow","row","captionBlock","widths","ColWidthDefault","headerCut","tableColumnAlignments","colwidth","availableWidth","colsWithWidth","totalWidth","pct","extraPercent_1","totalPercent","colWidths_1","tables_1","kTableBlockCapsuleType","DefinitionList","definition","unparsedTable_1","TableDeleteColumn","subMenu","TableAlignColumnLeft","menuVisible","sliceHasNode","currentColumn","columnAlignments","headerPos","childPos","definition_lists","definition_list_pandoc_1","writePandocDefinitionListDescription","readPandocDefinitionList","writePandocDefinitionList","definition_list_inputrule_1","definitionInputRule","definition_list_insert_1","insertDefinitionListAppendTransaction","emptyNodePlaceholderPlugin","termText","insertTermText","insertDefinitionList","createDefinitionDescription","definition_list_dark","InsertDefinitionList","InsertDefinitionListItemCommand","createFn","dlTypes","insertPos","InsertDefinitionTerm","InsertDefinitionDescription","lists_1","listPos","list","listParent","listIndex","definitionList","prevCursor","definitionListEnter","parentTerm","selectionNode","isParagraph","isEmpty","position_1","isLastChild","descriptionNode","endOfDescriptionEnter","isOnlyChild","emptyTermBackspace","emptyDescriptionBackspace","advancePos","definitionListShiftTab","backwardPos","prevNode","listNode","depthOffset","isParagraphAfterParagraph","prevPara","writeCurrent","writePandocDefinitionListTerm","kShortcodeBlockCapsuleType","_p3","shortcode_block","borderColorClass","isParaWrappingShortcode","Shortcode","shortcodeNode","htmlPreserveBlockCapsuleFilter","kHtmlPreserveBlockCapsuleType","handleToken","html_preserve","aceExtension","aceRenderQueue","ace_render_queue_1","AceRenderQueue","ace_node_views_1","AceNodeViews","AceNodeView","aceNodeViews","activeView","handleClick","ExpandChunk","activeAceNodeViewCommand","nodeView","setExpanded","CollapseChunk","editorOptions","gapCursorPending","selectionMarker","queuedSelection","subscriptions","renderedWidth","scrollRow","mouseDown","preview","ace_placeholder_1","AcePlaceholder","getElement","updateMode","onEditorDispatch","initEditor","renderQueue","unsub","_decos","editSession","AceRange","require","Range","getDocument","computeChange","fromPoints","indexToPosition","findMarkers","removeMarker","findPluginState","markerTo","markerFrom","markerId","addMarker","escaping","aceEditor","setSelectionRange","QueuedSelection","setGapCursorPending","pending","getExpanded","_mutation","forwardSelection","asProseMirrorSelection","session","getRange","positionToIndex","highlightSelectionAcross","valueChanged","getContents","replaceWith","scrollParent","offsetTop","viewTop","viewBottom","createChunkEditor","scrollCursorIntoView","getSession","cursorDirty","addCommand","arrowMaybeEscape","readOnly","bindKey","backspaceMaybeDeleteNode","undo","redo","win","insertParagraph","mac","getCursorPosition","executeSelection","renderer","metrics","$fontMetrics","$observer","setContainer","debounceResize","evt","resizeTimer","setMode","execCommand","getLength","innerText","getCursor","containerRect","cursorRect","down","up","oldEnd","oldVal","newEnd","newVal","cursorPos","prevNodePos","nextNodePos","nextNodeTextBlock","nextNodeCode","targetPos","renderCompleted","updateTimer","needsSort","bypass","visible","onUpdate","IntersectionObserver","entries_1","processRenderQueue","isIntersecting","cancelTimer","onScroll","scheduleRender","isRenderCompleted","renderTimer","delayMs","activeNodeView","prevNodePos_1","nv","state_1","editors","pandocAttrEnabled","attr_edit_command_1","AttrEditCommand","AttrEditDecorationPlugin","noKeyvalueTags","editorNode","attrTags","attrEditNodeCommandFn","ed","decoratorsForDoc","preferHiddenDecorators_1","dec","parentWithAttrs","decorator","editMarkAttrs","editAttr","idHint","gutterBackgroundColor","gutterTextColor","textColor","surfaceWidgetTextColor","lightTextColor","linkTextColor","invisibleTextColor","markupTextColor","findTextBackgroundColor","findTextBorderColor","blockBorderColor","focusOutlineColor","paneBorderColor","fixedWidthFont","fixedWidthFontSizePt","proportionalFont","proportionalFontSizePt","atomColor","tagColor","attributeColor","hrColor","linkColor","errorColor","setStyleElement","css","styleEl","getElementById","defaults","backgroundColor","borderBackgroundColor","placeholderTextColor","selectionColor","cursorColor","metadataBackgroundColor","chunkBackgroundColor","spanBackgroundColor","divBackgroundColor","commentColor","commentBackgroundColor","nodeSelectionColor","padding","copy_png_1","properties_png_1","properties_deco_png_1","properties_deco_dark_png_1","removelink_png_1","runchunk_png_1","runprevchunks_png_1","search_png_1","search_progress_gif_1","generic_png_1","heading1_png_1","heading1_dark_png_1","heading2_png_1","heading2_dark_png_1","heading3_png_1","heading3_dark_png_1","heading4_png_1","heading4_dark_png_1","bullet_list_png_1","bullet_list_dark_png_1","ordered_list_png_1","ordered_list_dark_png_1","blockquote_png_1","blockquote_dark_png_1","math_inline_png_1","math_inline_dark_png_1","math_display_png_1","math_display_dark_png_1","html_block_png_1","html_block_dark_png_1","line_block_png_1","line_block_dark_png_1","emoji_png_1","emoji_dark_png_1","comment_png_1","comment_dark_png_1","div_png_1","div_dark_png_1","code_block_png_1","code_block_dark_png_1","footnote_png_1","footnote_dark_png_1","citation_png_1","citation_dark_png_1","cross_reference_png_1","cross_reference_dark_png_1","symbol_png_1","symbol_dark_png_1","table_png_1","table_dark_png_1","definition_list_png_1","definition_list_dark_png_1","horizontal_rule_png_1","horizontal_rule_dark_png_1","image_png_1","image_dark_png_1","link_png_1","link_dark_png_1","paragraph_png_1","paragraph_dark_png_1","raw_block_png_1","raw_block_dark_png_1","raw_inline_png_1","raw_inline_dark_png_1","tex_block_png_1","tex_block_dark_png_1","yaml_block_png_1","yaml_block_dark_png_1","python_chunk_png_1","sql_chunk_png_1","d3_chunk_png_1","stan_chunk_png_1","bash_chunk_png_1","bash_chunk_dark_png_1","r_chunk_png_1","r_chunk_dark_png_1","rcpp_chunk_png_1","rcpp_chunk_dark_png_1","tabset_png_1","tabset_dark_png_1","slide_columns_png_1","slide_columns_dark_png_1","slide_pause_png_1","slide_pause_dark_png_1","slide_notes_png_1","slide_notes_dark_png_1","article_png_1","article_dark_png_1","book_png_1","book_dark_png_1","broadcast_png_1","broadcast_dark_png_1","data_png_1","data_dark_png_1","entry_png_1","entry_dark_png_1","image_png_2","image_dark_png_2","legal_png_1","legal_dark_png_1","map_png_1","map_dark_png_1","movie_png_1","movie_dark_png_1","other_png_1","other_dark_png_1","heading3","heading3_dark","bullet_list_dark","ordered_list_dark","blockquote_dark","line_block_dark","emoji_dark","citation_dark","paragraph_dark","raw_block_dark","tex_block","tex_block_dark","sql_chunk","stan_chunk","song_png_1","song_dark_png_1","local_sources_png_1","formatMenu","Underline","ListItemCheck","ListItemCheckToggle","EditListProperties","Blockquote","haveAnyOf","HTMLInline","ClearFormatting","AttrEdit","RCodeChunk","PythonCodeChunk","BashCodeChunk","StanCodeChunk","InlineMath","DefinitionDescription","EnDash","NonBreakingSpace","commands_1","editorMenus","TableDeleteTable","excludeInCode","kPresentationEditorLocationTitle","foundCursor","bodyNodes_1","bodyNodes","autoSlideLevel","kPresentationEditorLocationHeading"],"mappings":"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WAAAnV,GAEF,OAAK4a,GACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,UACH,KACAspB,EAAA,IAEF,WACE,UACA,KAEF,KAAK,KACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,SACH,IACAA,EAAA,IAEF,MACA,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACHA,EAAQ,IACR,MAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,UACH,KACAA,EAAA,IAEF,WACE,KACAA,EAAA,IAEF,MACA,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,SACH,SACA,KAEFA,EAAK,IACL,MACA,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,UACH,UACA,KAEF,KAAK,KACLA,EAAK,IACL,WACE,SACA,IAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,SACH,SACA,KAEF,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,IACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,SACH,SACA,IAEF,KAAK,KACL,KAAK,UACH,KACAA,EAAA,IAEF,MACA,KAAK,KACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,SACH,SACA,IAEF,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,WACE,SACA,IAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,SACH,SACA,IAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACHA,EAAQ,IACR,MAEF,KAAK,IACL,KAAK,SACH,SACA,IAEF,KAAK,IACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,SACH,SACA,IAEF,KAAK,KACL,KAAK,UACH,UACA,KAEFA,EAAK,IACL,MACA,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,SACH,SACA,IAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,UACH,UACA,KAEF,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,UACH,KACAA,EAAA,IAEF,MACA,KAAK,IACL,KAAK,SACH,SACA,IAEF,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACHA,EAAQ,IACR,MAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACHA,EAAQ,IACR,MAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,UACH,KACAA,EAAA,IAEF,WACE,UACA,KAEF,KAAK,KACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,SACH,IACAA,EAAA,IAEF,MACA,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACLA,EAAK,IACH,WACA,IAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACHA,EAAQ,IACR,MAEF,KAAK,KACLA,EAAK,IACH,WACA,IAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,SACH,KACAA,EAAA,IAEF,MACA,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,UACH,UACA,KAEF,KAAK,KACLA,EAAK,IACL,WACE,SACA,IAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,SACH,SACA,KAEF,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,IACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,SACH,SACA,KAEF,KAAK,KACL,KAAK,KACHA,EAAQ,IACR,MAEF,KAAK,KACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,IACL,KAAK,SACH,SACA,IAEF,KAAK,KACL,KAAK,KACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,SACH,SACA,IAEF,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,SACH,SACA,IAEF,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,KACL,KAAK,KACLA,EAAK,IACL,MACA,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,IACL,KAAK,KACL,KAAK,KACL,KAAK,KACHA,EAAQ,IACR,MAEF,KAAK,IACL,KAAK,SACH,SACA,IAEF,KAAK,IA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E/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,iCACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,KAAA,+BACE/X,MAAM,IACNyzE,UAAO,OAGT17D,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CE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,OAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,qCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,sCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,oCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,kCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,uCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,2CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,yCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,gDACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8CACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,mCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,iCACE/X,MAAM,KACNy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AM,KACNyzE,UAAO,SAGT17D,KAAA,oBACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,8BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,+BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,4BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,UAAO,SAGT17D,KAAA,6BACE/X,MAAM,KACNyzE,U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AI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,YAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,YAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACH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lG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,eAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,eAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qBAEFilG,UAAK,IACHC,MAAI,cAEJ,CACAllG,GAAA,qB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AI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,0BAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAA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J,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GAAA,wBAEFilG,UAAQ,IACNC,MAAI,wBAEJ,CACAllG,GA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","sourcesContent":["/*\n * index.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport polyfillIsConnected from './isconnected';\nimport polyfillCustomEvent from './custom-event';\n\nfunction polyfill() {\n polyfillIsConnected();\n polyfillCustomEvent();\n}\n\nexport default polyfill;\n","/*\n * Node.isConnected polyfill for IE and EdgeHTML\n * 2020-02-04\n *\n * By Eli Grey, https://eligrey.com\n * Public domain.\n * NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.\n */\n\nfunction polyfill() {\n if (!('isConnected' in Node.prototype)) {\n Object.defineProperty(Node.prototype, 'isConnected', {\n get() {\n return (\n !this.ownerDocument ||\n !(\n // tslint:disable-next-line: no-bitwise\n (this.ownerDocument.compareDocumentPosition(this) & this.DOCUMENT_POSITION_DISCONNECTED)\n )\n );\n },\n });\n }\n}\n\nexport default polyfill;\n","// apply polyfills\nimport polyfill from './polyfill/index';\npolyfill();\n\n// objects instantiated by the IDE\nexport { Editor, UITools } from './editor/editor';\n","/**\n * https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent\n *\n * From https://developer.mozilla.org/en-US/docs/MDN/About:\n * \"Any copyright is dedicated to the Public Domain. http://creativecommons.org/publicdomain/zero/1.0/\"\n */\nexport default function() {\n if (typeof window.CustomEvent === 'function') return false;\n\n function CustomEvent(event: any, params: any) {\n params = params || { bubbles: false, cancelable: false, detail: null };\n var evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n return evt;\n }\n\n window.CustomEvent = CustomEvent as any;\n}\n","/*\n * editor.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { inputRules } from 'prosemirror-inputrules';\nimport { keydownHandler } from 'prosemirror-keymap';\nimport { Node as ProsemirrorNode, Schema, DOMParser, ParseOptions } from 'prosemirror-model';\nimport { EditorState, Plugin, PluginKey, TextSelection, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport 'prosemirror-view/style/prosemirror.css';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { citeUI } from '../api/cite';\nimport { EditorOptions } from '../api/options';\nimport { ProsemirrorCommand, CommandFn, EditorCommand } from '../api/command';\nimport { EditorUI } from '../api/ui';\nimport {\n attrPropsToInput,\n attrInputToProps,\n AttrProps,\n AttrEditInput,\n InsertCiteProps,\n InsertCiteUI,\n} from '../api/ui-dialogs';\n\nimport { Extension } from '../api/extension';\nimport { PandocWriterOptions } from '../api/pandoc';\nimport { PandocCapabilities, getPandocCapabilities } from '../api/pandoc_capabilities';\nimport { fragmentToHTML } from '../api/html';\nimport { DOMEditorEvents, EventType, EventHandler } from '../api/events';\nimport {\n ScrollEvent,\n UpdateEvent,\n OutlineChangeEvent,\n StateChangeEvent,\n ResizeEvent,\n LayoutEvent,\n FocusEvent,\n DispatchEvent,\n NavigateEvent,\n BlurEvent,\n} from '../api/event-types';\nimport {\n PandocFormat,\n resolvePandocFormat,\n PandocFormatConfig,\n pandocFormatConfigFromCode,\n pandocFormatConfigFromDoc,\n} from '../api/pandoc_format';\nimport { baseKeysPlugin } from '../api/basekeys';\nimport {\n appendTransactionsPlugin,\n appendMarkTransactionsPlugin,\n kFixupTransaction,\n kAddToHistoryTransaction,\n kSetMarkdownTransaction,\n} from '../api/transaction';\nimport { EditorOutline, getOutlineNodes, EditingOutlineLocation, getEditingOutlineLocation } from '../api/outline';\nimport { EditingLocation, getEditingLocation, setEditingLocation } from '../api/location';\nimport { navigateTo, NavigationType } from '../api/navigation';\nimport { FixupContext } from '../api/fixup';\nimport { unitToPixels, pixelsToUnit, roundUnit, kValidUnits } from '../api/image';\nimport { kPercentUnit } from '../api/css';\nimport { EditorFormat } from '../api/format';\nimport { diffChars, EditorChange } from '../api/change';\nimport { markInputRuleFilter } from '../api/input_rule';\nimport { editorMath } from '../api/math';\nimport { EditorEvents } from '../api/events';\nimport { insertRmdChunk } from '../api/rmd';\nimport { EditorServer } from '../api/server';\nimport { pandocAutoIdentifier } from '../api/pandoc_id';\nimport { wrapSentences } from '../api/wrap';\nimport { yamlFrontMatter, applyYamlFrontMatter } from '../api/yaml';\nimport { EditorSpellingDoc } from '../api/spelling';\n\nimport { getTitle, setTitle } from '../nodes/yaml_metadata/yaml_metadata-title';\nimport { getOutline } from '../behaviors/outline';\nimport {\n FindOptions,\n find,\n matchCount,\n selectFirst,\n selectNext,\n selectPrevious,\n replace,\n replaceAll,\n clear,\n selectCurrent,\n} from '../behaviors/find';\n\nimport { omniInsertExtension } from '../behaviors/omni_insert/omni_insert';\nimport { completionExtension } from '../behaviors/completion/completion';\n\nimport { getSpellingDoc } from '../behaviors/spelling/spelling-interactive';\nimport { realtimeSpellingPlugin, invalidateAllWords, invalidateWord } from '../behaviors/spelling/spelling-realtime';\n\nimport { PandocConverter, PandocLineWrapping } from '../pandoc/pandoc_converter';\n\nimport { ExtensionManager, initExtensions } from './editor-extensions';\nimport { defaultTheme, EditorTheme, applyTheme, applyPadding } from './editor-theme';\nimport { defaultEditorUIImages } from './editor-images';\nimport { editorMenus, EditorMenus } from './editor-menus';\nimport { editorSchema } from './editor-schema';\n\n// import styles before extensions so they can be overriden by extensions\nimport './styles/frame.css';\nimport './styles/styles.css';\nimport { getPresentationEditorLocation, PresentationEditorLocation, positionForPresentationEditorLocation } from '../api/presentation';\n\nexport interface EditorCode {\n code: string;\n selection_only: boolean;\n location: EditingOutlineLocation;\n}\n\nexport interface EditorSetMarkdownResult {\n // editor view of markdown (as it will be persisted)\n canonical: string;\n\n // line wrapping\n line_wrapping: PandocLineWrapping;\n\n // unrecoginized pandoc tokens\n unrecognized: string[];\n\n // example lists?\n example_lists: boolean;\n\n // unparsed meta\n unparsed_meta: { [key: string]: any };\n\n // updated outline \n location: EditingOutlineLocation;\n}\n\nexport interface EditorContext {\n readonly server: EditorServer;\n readonly ui: EditorUI;\n readonly hooks?: EditorHooks;\n readonly extensions?: readonly Extension[];\n}\n\nexport interface EditorHooks {\n isEditable?: () => boolean;\n}\n\nexport interface EditorKeybindings {\n [id: string]: string[];\n}\n\nexport interface EditorSelection {\n from: number;\n to: number;\n navigation_id: string | null;\n}\n\nexport interface EditorFindReplace {\n find: (term: string, options: FindOptions) => boolean;\n matches: () => number;\n selectFirst: () => boolean;\n selectCurrent: () => boolean;\n selectNext: () => boolean;\n selectPrevious: () => boolean;\n replace: (text: string) => boolean;\n replaceAll: (text: string) => number;\n clear: () => boolean;\n}\n\nexport { EditorCommandId as EditorCommands } from '../api/command';\n\nexport interface UIToolsAttr {\n propsToInput(attr: AttrProps): AttrEditInput;\n inputToProps(input: AttrEditInput): AttrProps;\n pandocAutoIdentifier(text: string): string;\n}\n\nexport interface UIToolsImage {\n validUnits(): string[];\n percentUnit(): string;\n unitToPixels(value: number, unit: string, containerWidth: number): number;\n pixelsToUnit(pixels: number, unit: string, containerWidth: number): number;\n roundUnit(value: number, unit: string): string;\n}\n\nexport interface UIToolsFormat {\n parseFormatConfig(markdown: string, isRmd: boolean): PandocFormatConfig;\n}\n\nexport interface UIToolsSource {\n diffChars(from: string, to: string, timeout: number): EditorChange[];\n}\n\nexport interface UIToolsCitation {\n citeUI(citeProps: InsertCiteProps): InsertCiteUI;\n}\n\nexport class UITools {\n public readonly attr: UIToolsAttr;\n public readonly image: UIToolsImage;\n public readonly format: UIToolsFormat;\n public readonly source: UIToolsSource;\n public readonly citation: UIToolsCitation;\n\n constructor() {\n this.attr = {\n propsToInput: attrPropsToInput,\n inputToProps: attrInputToProps,\n pandocAutoIdentifier: (text: string) => pandocAutoIdentifier(text, false),\n };\n\n this.image = {\n validUnits: () => kValidUnits,\n percentUnit: () => kPercentUnit,\n unitToPixels,\n pixelsToUnit,\n roundUnit,\n };\n\n this.format = {\n parseFormatConfig: pandocFormatConfigFromCode,\n };\n\n this.source = {\n diffChars,\n };\n\n this.citation = {\n citeUI,\n };\n }\n}\n\nconst keybindingsPlugin = new PluginKey('keybindings');\n\nexport class Editor {\n // core context passed from client\n private readonly parent: HTMLElement;\n private readonly context: EditorContext;\n private readonly events: EditorEvents;\n\n // options (derived from defaults + config)\n private readonly options: EditorOptions;\n\n // format (pandocFormat includes additional diagnostics based on the validity of\n // provided mode + extensions)\n private readonly format: EditorFormat;\n private readonly pandocFormat: PandocFormat;\n\n // pandoc capabilities\n private pandocCapabilities: PandocCapabilities;\n\n // core prosemirror state/behaviors\n private readonly extensions: ExtensionManager;\n private readonly schema: Schema;\n private state: EditorState;\n private readonly view: EditorView;\n private readonly pandocConverter: PandocConverter;\n\n // setting via setKeybindings forces reconfiguration of EditorState\n // with plugins recreated\n private keybindings: EditorKeybindings;\n\n // content width constraints (if unset uses default editor CSS)\n private maxContentWidth = 0;\n private minContentPadding = 0;\n\n // keep track of whether the last transaction was selection-only\n private lastTrSelectionOnly = false;\n\n // create the editor -- note that the markdown argument does not substitute for calling\n // setMarkdown, rather it's used to read the format comment to determine how to\n // initialize the various editor features\n public static async create(\n parent: HTMLElement,\n context: EditorContext,\n format: EditorFormat,\n options: EditorOptions,\n ): Promise<Editor> {\n // provide option defaults\n options = {\n autoFocus: false,\n spellCheck: false,\n codeEditor: 'codemirror',\n rmdImagePreview: false,\n hideFormatComment: false,\n className: '',\n ...options,\n };\n\n // provide format defaults\n format = {\n pandocMode: format.pandocMode || 'markdown',\n pandocExtensions: format.pandocExtensions || '',\n rmdExtensions: {\n codeChunks: false,\n bookdownXRef: false,\n bookdownXRefUI: false,\n bookdownPart: false,\n blogdownMathInCode: false,\n ...format.rmdExtensions,\n },\n hugoExtensions: {\n shortcodes: false,\n ...format.hugoExtensions,\n },\n docTypes: format.docTypes || [],\n };\n\n // provide context defaults\n const defaultImages = defaultEditorUIImages();\n context = {\n ...context,\n ui: {\n ...context.ui,\n images: {\n ...defaultImages,\n ...context.ui.images,\n omni_insert: {\n ...defaultImages.omni_insert,\n ...context.ui.images,\n },\n citations: {\n ...defaultImages.citations,\n ...context.ui.images,\n },\n },\n },\n };\n\n // resolve the format\n const pandocFmt = await resolvePandocFormat(context.server.pandoc, format);\n\n // get pandoc capabilities\n const pandocCapabilities = await getPandocCapabilities(context.server.pandoc);\n\n // create editor\n const editor = new Editor(parent, context, options, format, pandocFmt, pandocCapabilities);\n\n // return editor\n return Promise.resolve(editor);\n }\n\n private constructor(\n parent: HTMLElement,\n context: EditorContext,\n options: EditorOptions,\n format: EditorFormat,\n pandocFormat: PandocFormat,\n pandocCapabilities: PandocCapabilities,\n ) {\n // initialize references\n this.parent = parent;\n this.events = new DOMEditorEvents(parent);\n this.context = context;\n this.options = options;\n this.format = format;\n this.keybindings = {};\n this.pandocFormat = pandocFormat;\n this.pandocCapabilities = pandocCapabilities;\n\n // create core extensions\n this.extensions = this.initExtensions();\n\n // create schema\n this.schema = editorSchema(this.extensions);\n\n // register completion handlers (done in a separate step b/c omni insert\n // completion handlers require access to the initializezd commands that\n // carry omni insert info)\n this.registerCompletionExtension();\n\n // register realtime spellchecking (done in a separate step b/c it\n // requires access to PandocMark definitions to determine which\n // marks to exclude from spellchecking)\n this.registerRealtimeSpelling();\n\n // create state\n this.state = EditorState.create({\n schema: this.schema,\n doc: this.initialDoc(),\n plugins: this.createPlugins(),\n });\n\n // additional dom attributes for editor node\n const attributes: { [name: string]: string } = {};\n if (options.className) {\n attributes.class = options.className;\n }\n\n // create view\n this.view = new EditorView(this.parent, {\n state: this.state,\n dispatchTransaction: this.dispatchTransaction.bind(this),\n domParser: new EditorDOMParser(this.schema),\n attributes,\n });\n\n // add custom restoreFocus handler to the view -- this provides a custom\n // handler for RStudio's FocusContext, necessary because the default\n // ProseMirror dom mutation handler picks up the focus and changes the\n // selection.\n Object.defineProperty(this.view.dom, 'restoreFocus', {\n value: () => {\n this.focus();\n },\n });\n\n // add proportinal font class to parent\n this.parent.classList.add('pm-proportional-font');\n\n // apply default theme\n this.applyTheme(defaultTheme());\n\n // create pandoc translator\n this.pandocConverter = new PandocConverter(\n this.schema,\n this.extensions,\n context.server.pandoc,\n this.pandocCapabilities,\n );\n\n // focus editor immediately if requested\n if (this.options.autoFocus) {\n setTimeout(() => {\n this.focus();\n }, 10);\n }\n\n // disale spellcheck if requested\n if (!this.options.spellCheck) {\n this.parent.setAttribute('spellcheck', 'false');\n }\n\n {\n // scroll event optimization, as recommended by\n // https://developer.mozilla.org/en-US/docs/Web/API/Document/scroll_event\n let ticking = false;\n this.parent.addEventListener(\n 'scroll',\n () => {\n if (!ticking) {\n window.requestAnimationFrame(() => {\n this.emitEvent(ScrollEvent);\n ticking = false;\n });\n ticking = true;\n }\n },\n { capture: true },\n );\n }\n }\n\n public destroy() {\n this.view.destroy();\n }\n\n public subscribe<TDetail>(event: EventType<TDetail> | string, handler: EventHandler<TDetail>): VoidFunction {\n if (typeof event === 'string') {\n return this.events.subscribe({ eventName: event }, handler);\n } else {\n return this.events.subscribe(event, handler);\n }\n }\n\n public setTitle(title: string) {\n const tr = setTitle(this.state, title);\n if (tr) {\n this.view.dispatch(tr);\n }\n }\n\n public async setMarkdown(\n markdown: string,\n options: PandocWriterOptions,\n emitUpdate: boolean,\n ): Promise<EditorSetMarkdownResult> {\n // get the result\n const result = await this.pandocConverter.toProsemirror(markdown, this.pandocFormat);\n const { doc, line_wrapping, unrecognized, example_lists, unparsed_meta } = result;\n\n // if we are preserving history but the existing doc is empty then create a new state\n // (resets the undo stack so that the initial setting of the document can't be undone)\n if (this.isInitialDoc()) {\n this.state = EditorState.create({\n schema: this.state.schema,\n doc,\n plugins: this.state.plugins,\n });\n this.view.updateState(this.state);\n } else {\n // note current editing location\n const loc = this.getEditingLocation();\n\n // replace the top level nodes in the doc\n const tr = this.state.tr;\n tr.setMeta(kSetMarkdownTransaction, true);\n let i = 0;\n tr.doc.descendants((node, pos) => {\n const mappedPos = tr.mapping.map(pos);\n tr.replaceRangeWith(mappedPos, mappedPos + node.nodeSize, doc.child(i));\n i++;\n return false;\n });\n // set selection to previous location if it's still valid\n if (loc.pos < tr.doc.nodeSize) {\n // eat exceptions that might result from an invalid position\n try {\n setTextSelection(loc.pos)(tr);\n } catch (e) {\n // do-nothing, this error can happen and shouldn't result in \n // a failure to setMarkdown\n }\n }\n // dispatch\n this.view.dispatch(tr);\n }\n\n // apply fixups\n this.applyFixups(FixupContext.Load);\n\n // notify listeners if requested\n if (emitUpdate) {\n this.emitEvent(UpdateEvent);\n this.emitEvent(OutlineChangeEvent);\n this.emitEvent(StateChangeEvent);\n }\n\n // return our current markdown representation (so the caller know what our\n // current 'view' of the doc as markdown looks like\n const getMarkdownTr = this.state.tr;\n const canonical = await this.getMarkdownCode(getMarkdownTr, options);\n const location = getEditingOutlineLocation(this.state);\n\n // return\n return {\n canonical,\n line_wrapping,\n unrecognized,\n example_lists,\n unparsed_meta,\n location\n };\n }\n\n // flag indicating whether we've ever had setMarkdown (currently we need this\n // because getMarkdown can only be called after setMarkdown b/c it needs\n // the API version retreived in setMarkdown -- we should remedy this)\n public isInitialDoc() {\n return this.state.doc.attrs.initial;\n }\n\n public async getMarkdown(options: PandocWriterOptions): Promise<EditorCode> {\n // get the code\n const tr = this.state.tr;\n const code = await this.getMarkdownCode(tr, options);\n\n // return code + perhaps outline location\n return {\n code,\n selection_only: this.lastTrSelectionOnly,\n location: getEditingOutlineLocation(this.state),\n };\n }\n\n public getEditingOutlineLocation(): EditingOutlineLocation {\n return getEditingOutlineLocation(this.state);\n }\n\n public getHTML(): string {\n return fragmentToHTML(this.state.schema, this.state.doc.content);\n }\n\n public getTitle() {\n return getTitle(this.state);\n }\n\n public getSelection(): EditorSelection {\n const { from, to } = this.state.selection;\n return {\n from,\n to,\n navigation_id: navigationIdForSelection(this.state),\n };\n }\n\n public getEditingLocation(): EditingLocation {\n return getEditingLocation(this.view);\n }\n\n public setEditingLocation(outlineLocation?: EditingOutlineLocation, previousLocation?: EditingLocation) {\n setEditingLocation(this.view, outlineLocation, previousLocation);\n }\n\n public getOutline(): EditorOutline {\n return getOutline(this.state) || [];\n }\n\n public getFindReplace(): EditorFindReplace {\n return {\n find: (term: string, options: FindOptions) => find(this.view, term, options),\n matches: () => matchCount(this.view),\n selectCurrent: () => selectCurrent(this.view),\n selectFirst: () => selectFirst(this.view),\n selectNext: () => selectNext(this.view),\n selectPrevious: () => selectPrevious(this.view),\n replace: (text: string) => replace(this.view, text),\n replaceAll: (text: string) => replaceAll(this.view, text),\n clear: () => clear(this.view),\n };\n }\n\n public getSpellingDoc(): EditorSpellingDoc {\n return getSpellingDoc(this.view, this.extensions.pandocMarks(), this.context.ui.spelling);\n }\n\n public spellingInvalidateAllWords() {\n invalidateAllWords(this.view);\n }\n\n public spellingInvalidateWord(word: string) {\n invalidateWord(this.view, word);\n }\n\n // get a canonical version of the passed markdown. this method doesn't mutate the\n // visual editor's state/view (it's provided as a performance optimiation for when\n // source mode is configured to save a canonical version of markdown)\n public async getCanonical(markdown: string, options: PandocWriterOptions): Promise<string> {\n // convert to prosemirror doc\n const result = await this.pandocConverter.toProsemirror(markdown, this.pandocFormat);\n\n // create a state for this doc\n const state = EditorState.create({\n schema: this.schema,\n doc: result.doc,\n plugins: this.state.plugins,\n });\n\n // apply load fixups (eumlating what a full round trip will do)\n const tr = state.tr;\n this.extensionFixups(tr, FixupContext.Load);\n\n // return markdown (will apply save fixups)\n return this.getMarkdownCode(tr, options);\n }\n\n public getSelectedText(): string {\n return this.state.doc.textBetween(this.state.selection.from, this.state.selection.to);\n }\n\n public replaceSelection(value: string): void {\n // retrieve properties we need from selection\n const { from, empty } = this.view.state.selection;\n\n // retrieve selection marks\n const marks = this.view.state.selection.$from.marks();\n\n // insert text\n const tr = this.view.state.tr.replaceSelectionWith(this.view.state.schema.text(value, marks), false);\n this.view.dispatch(tr);\n\n // update selection if necessary\n if (!empty) {\n const sel = TextSelection.create(this.view.state.doc, from, from + value.length);\n const trSetSel = this.view.state.tr.setSelection(sel);\n this.view.dispatch(trSetSel);\n }\n }\n\n public getYamlFrontMatter() {\n if (this.schema.nodes.yaml_metadata) {\n return yamlFrontMatter(this.view.state.doc);\n } else {\n return '';\n }\n }\n\n public getPresentationEditorLocation() {\n return getPresentationEditorLocation(this.state);\n }\n\n public navigateToPresentationEditorLocation(location: PresentationEditorLocation) {\n const pos = positionForPresentationEditorLocation(this.state, location);\n if (pos !== -1) {\n this.navigate(NavigationType.Pos, String(pos));\n }\n }\n\n public applyYamlFrontMatter(yaml: string) {\n if (this.schema.nodes.yaml_metadata) {\n applyYamlFrontMatter(this.view, yaml);\n }\n }\n\n public focus() {\n this.view.focus();\n }\n\n public blur() {\n (this.view.dom as HTMLElement).blur();\n }\n\n public insertChunk(chunkPlaceholder: string) {\n const insertCmd = insertRmdChunk(chunkPlaceholder);\n insertCmd(this.view.state, this.view.dispatch, this.view);\n this.focus();\n }\n\n public navigate(type: NavigationType, location: string, recordCurrent = true, animate = false) {\n // perform navigation\n const nav = navigateTo(this.view, this.format, type, location, animate);\n\n // emit event\n if (nav !== null) {\n if (!recordCurrent) {\n nav.prevPos = -1;\n }\n this.emitEvent(NavigateEvent, nav);\n }\n }\n\n public resize() {\n this.syncContentWidth();\n this.applyFixupsOnResize();\n this.emitEvent(ResizeEvent);\n }\n\n public enableDevTools(initFn: (view: EditorView, stateClass: any) => void) {\n initFn(this.view, { EditorState });\n }\n\n public getMenus(): EditorMenus {\n return editorMenus(this.context.ui, this.commands());\n }\n\n public commands(): EditorCommand[] {\n // get keybindings (merge user + default)\n const commandKeys = this.commandKeys();\n\n return this.extensions.commands(this.schema).map((command: ProsemirrorCommand) => {\n return {\n id: command.id,\n keymap: commandKeys[command.id],\n isActive: () => command.isActive(this.state),\n isEnabled: () => command.isEnabled(this.state),\n plural: () => command.plural(this.state),\n execute: () => {\n command.execute(this.state, this.view.dispatch, this.view);\n if (command.keepFocus) {\n this.focus();\n }\n },\n };\n });\n }\n\n public applyTheme(theme: EditorTheme) {\n // set global mode classes\n this.parent.classList.toggle('pm-dark-mode', !!theme.darkMode);\n this.parent.classList.toggle('pm-solarized-mode', !!theme.solarizedMode);\n // apply the rest of the theme\n applyTheme(theme);\n }\n\n public setMaxContentWidth(maxWidth: number, minPadding = 10) {\n this.maxContentWidth = maxWidth;\n this.minContentPadding = minPadding;\n this.syncContentWidth();\n }\n\n public setKeybindings(keyBindings: EditorKeybindings) {\n // validate that all of these keys can be rebound\n\n this.keybindings = keyBindings;\n this.state = this.state.reconfigure({\n schema: this.state.schema,\n plugins: this.createPlugins(),\n });\n }\n\n public getEditorFormat() {\n return this.format;\n }\n\n public getPandocFormat() {\n return this.pandocFormat;\n }\n\n public getPandocFormatConfig(isRmd: boolean): PandocFormatConfig {\n return pandocFormatConfigFromDoc(this.state.doc, isRmd);\n }\n\n private dispatchTransaction(tr: Transaction) {\n // track previous outline\n const previousOutline = getOutline(this.state);\n\n // track whether this was a selection-only transaction\n this.lastTrSelectionOnly = tr.selectionSet && !tr.docChanged;\n\n // apply the transaction\n this.state = this.state.apply(tr);\n this.view.updateState(this.state);\n\n // notify listeners of state change\n this.emitEvent(StateChangeEvent);\n\n // notify listeners of updates\n if (tr.docChanged || tr.storedMarksSet) {\n // fire updated (unless this was a fixup)\n if (!tr.getMeta(kFixupTransaction)) {\n this.emitEvent(UpdateEvent);\n }\n\n // fire outline changed if necessary\n if (getOutline(this.state) !== previousOutline) {\n this.emitEvent(OutlineChangeEvent);\n }\n }\n\n this.emitEvent(DispatchEvent, tr);\n\n this.emitEvent(LayoutEvent);\n }\n\n private emitEvent<TDetail>(eventType: EventType<TDetail>, detail?: TDetail) {\n this.events.emit(eventType, detail);\n }\n\n private initExtensions() {\n return initExtensions(\n {\n format: this.format,\n options: this.options,\n ui: this.context.ui,\n math: this.context.ui.math.typeset ? editorMath(this.context.ui) : undefined,\n events: {\n subscribe: this.subscribe.bind(this),\n emit: this.emitEvent.bind(this),\n },\n pandocExtensions: this.pandocFormat.extensions,\n pandocCapabilities: this.pandocCapabilities,\n server: this.context.server,\n navigation: {\n navigate: this.navigate.bind(this),\n },\n },\n this.context.extensions,\n );\n }\n\n private registerCompletionExtension() {\n // mark filter used to screen completions from noInputRules marks\n const markFilter = markInputRuleFilter(this.schema, this.extensions.pandocMarks());\n\n // register omni insert extension\n this.extensions.register([\n omniInsertExtension(this.extensions.omniInserters(this.schema), markFilter, this.context.ui),\n ]);\n\n // register completion extension\n this.extensions.register([\n completionExtension(this.extensions.completionHandlers(), markFilter, this.context.ui, this.events),\n ]);\n }\n\n private registerRealtimeSpelling() {\n this.extensions.registerPlugins(\n [realtimeSpellingPlugin(this.schema, this.extensions.pandocMarks(), this.context.ui, this.events)],\n true,\n );\n }\n\n private createPlugins(): Plugin[] {\n return [\n baseKeysPlugin(this.extensions.baseKeys(this.schema)),\n this.keybindingsPlugin(),\n appendTransactionsPlugin(this.extensions.appendTransactions(this.schema)),\n appendMarkTransactionsPlugin(this.extensions.appendMarkTransactions(this.schema)),\n ...this.extensions.plugins(this.schema),\n this.inputRulesPlugin(),\n this.editablePlugin(),\n this.domEventsPlugin(),\n ];\n }\n\n private editablePlugin() {\n const hooks = this.context.hooks || {};\n return new Plugin({\n key: new PluginKey('editable'),\n props: {\n editable: hooks.isEditable || (() => true),\n },\n });\n }\n\n private inputRulesPlugin() {\n // filter for disabling input rules for selected marks\n const markFilter = markInputRuleFilter(this.schema, this.extensions.pandocMarks());\n\n // create the defautl inputRules plugin\n const plugin = inputRules({ rules: this.extensions.inputRules(this.schema) });\n const handleTextInput = plugin.props.handleTextInput!;\n\n // override to disable input rules as requested\n // https://github.com/ProseMirror/prosemirror-inputrules/commit/b4bf67623aa4c4c1e096c20aa649c0e63751f337\n plugin.props.handleTextInput = (view: EditorView, from: number, to: number, text: string) => {\n if (!markFilter(view.state)) {\n return false;\n }\n return handleTextInput(view, from, to, text);\n };\n return plugin;\n }\n\n private domEventsPlugin(): Plugin {\n return new Plugin({\n key: new PluginKey('domevents'),\n props: {\n handleDOMEvents: {\n blur: (view: EditorView, event: Event) => {\n this.emitEvent(BlurEvent);\n return false;\n },\n focus: (view: EditorView, event: Event) => {\n this.emitEvent(FocusEvent, view.state.doc);\n return false;\n },\n keydown: (view: EditorView, event: Event) => {\n const kbEvent = event as KeyboardEvent;\n if (kbEvent.key === 'Tab' && this.context.ui.prefs.tabKeyMoveFocus()) {\n return true;\n } else {\n return false;\n }\n },\n },\n },\n });\n }\n\n private keybindingsPlugin(): Plugin {\n // get keybindings (merge user + default)\n const commandKeys = this.commandKeys();\n\n // command keys from extensions\n const pluginKeys: { [key: string]: CommandFn } = {};\n const commands = this.extensions.commands(this.schema);\n commands.forEach((command: ProsemirrorCommand) => {\n const keys = commandKeys[command.id];\n if (keys) {\n keys.forEach((key: string) => {\n pluginKeys[key] = command.execute;\n });\n }\n });\n\n // for windows desktop, build a list of control key handlers b/c qtwebengine\n // ends up corrupting ctrl+ keys so they don't hit the ace keybinding\n // (see: https://github.com/rstudio/rstudio/issues/7142)\n const ctrlKeyCodes: { [key: string]: CommandFn } = {};\n Object.keys(pluginKeys).forEach(keyCombo => {\n const match = keyCombo.match(/^Mod-([a-z\\\\])$/);\n if (match) {\n const key = match[1];\n const keyCode = key === '\\\\' ? 'Backslash' : `Key${key.toUpperCase()}`;\n ctrlKeyCodes[keyCode] = pluginKeys[keyCombo];\n }\n });\n\n // create default prosemirror handler\n const prosemirrorKeydownHandler = keydownHandler(pluginKeys);\n\n // return plugin\n return new Plugin({\n key: keybindingsPlugin,\n props: {\n handleKeyDown: (view: EditorView, event: KeyboardEvent) => {\n // workaround for Ctrl+ keys on windows desktop\n if (this.context.ui.context.isWindowsDesktop()) {\n const keyEvent = event as KeyboardEvent;\n if (keyEvent.ctrlKey) {\n const keyCommand = ctrlKeyCodes[keyEvent.code];\n if (keyCommand && keyCommand(this.view.state)) {\n keyCommand(this.view.state, this.view.dispatch, this.view);\n return true;\n }\n }\n }\n // default handling\n return prosemirrorKeydownHandler(view, event);\n },\n },\n });\n }\n\n private commandKeys(): { [key: string]: readonly string[] } {\n // start with keys provided within command definitions\n const commands = this.extensions.commands(this.schema);\n const defaultKeys = commands.reduce((keys: { [key: string]: readonly string[] }, command: ProsemirrorCommand) => {\n keys[command.id] = command.keymap;\n return keys;\n }, {});\n\n // merge with user keybindings\n return {\n ...defaultKeys,\n ...this.keybindings,\n };\n }\n\n // update parent padding based on content width settings (if specified)\n private syncContentWidth() {\n if (this.maxContentWidth && this.parent.clientWidth) {\n const minContentPadding = this.minContentPadding || 10;\n const parentWidth = this.parent.clientWidth;\n if (parentWidth > this.maxContentWidth + 2 * minContentPadding) {\n applyPadding(`calc((100% - ${this.maxContentWidth}px)/2)`);\n } else {\n applyPadding(this.minContentPadding + 'px');\n }\n }\n }\n\n private applyFixupsOnResize() {\n const docChanged = this.applyFixups(FixupContext.Resize);\n if (!docChanged) {\n // If applyFixupsOnResize returns true, then layout has already\n // been fired; if it hasn't, we must do so now\n this.emitEvent(LayoutEvent);\n }\n }\n\n private applyFixups(context: FixupContext) {\n let tr = this.state.tr;\n tr = this.extensionFixups(tr, context);\n if (tr.docChanged) {\n tr.setMeta(kAddToHistoryTransaction, false);\n tr.setMeta(kFixupTransaction, true);\n this.view.dispatch(tr);\n return true;\n }\n return false;\n }\n\n private extensionFixups(tr: Transaction, context: FixupContext) {\n this.extensions.fixups(this.schema, this.view).forEach(fixup => {\n tr = fixup(tr, context);\n });\n return tr;\n }\n\n private initialDoc(): ProsemirrorNode {\n return this.schema.nodeFromJSON({\n type: 'doc',\n attrs: {\n initial: true,\n },\n content: [\n { type: 'body', content: [{ type: 'paragraph' }] },\n { type: 'notes', content: [] },\n ],\n });\n }\n\n private async getMarkdownCode(tr: Transaction, options: PandocWriterOptions) {\n // apply save fixups\n this.extensionFixups(tr, FixupContext.Save);\n\n // apply sentence wrapping if requested\n if (options.wrap === 'sentence') {\n wrapSentences(tr);\n }\n\n // get code\n return this.pandocConverter.fromProsemirror(tr.doc, this.pandocFormat, options);\n }\n}\n\nfunction navigationIdForSelection(state: EditorState): string | null {\n const outline = getOutlineNodes(state.doc);\n const outlineNode = outline.reverse().find(node => node.pos < state.selection.from);\n if (outlineNode) {\n return outlineNode.node.attrs.navigation_id;\n } else {\n return null;\n }\n}\n\n// custom DOMParser that preserves all whitespace (required by display math marks)\nclass EditorDOMParser extends DOMParser {\n constructor(schema: Schema) {\n super(schema, DOMParser.fromSchema(schema).rules);\n }\n public parse(dom: Node, options?: ParseOptions) {\n return super.parse(dom, { ...options, preserveWhitespace: 'full' });\n }\n\n public parseSlice(dom: Node, options?: ParseOptions) {\n return super.parseSlice(dom, { ...options, preserveWhitespace: 'full' });\n }\n}\n","/*\n * cite.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { CSLName, CSLDate, CSL } from './csl';\nimport { InsertCiteProps, InsertCiteUI } from './ui-dialogs';\nimport { urlForDOI } from './doi';\n\nimport pinyin from 'pinyin';\nimport { transliterate } from 'transliteration';\n\nexport const kInvalidCiteKeyChars = /[\\]\\[\\s@',\\\\\\#}{~%&\\$\\^_]/g;\nconst kCiteIdLeadingLength = 8;\n\nexport function createUniqueCiteId(existingIds: string[], baseId: string): string {\n let count = 0;\n\n // Remove any non-8bit ascii characters, if possible\n // convert Hanzi characters to ascii\n let asciiOnlyBaseId = '';\n\n const isHanzi = (char: number) => {\n return char >= 13312 && char <= 40895;\n };\n\n for (let i = 0; i < baseId.length; i++) {\n const char = baseId.charCodeAt(i);\n if (char <= 255) {\n asciiOnlyBaseId = asciiOnlyBaseId + String.fromCharCode(char);\n } else if (isHanzi(char)) {\n asciiOnlyBaseId = asciiOnlyBaseId + pinyin(String.fromCharCode(char));\n } else {\n // Transliterate other non ascii characters to the citekey\n asciiOnlyBaseId = asciiOnlyBaseId + transliterate(String.fromCharCode(char));\n }\n }\n\n // If there are no characters left, just used a placeholder\n if (asciiOnlyBaseId.length === 0) {\n asciiOnlyBaseId = 'cite';\n }\n\n // The base ID but with invalid characters replaced\n let safeBaseId = asciiOnlyBaseId.replace(kInvalidCiteKeyChars, '');\n\n // Ensure that this is a valid citation, stripping any invalid characters\n let proposedId = safeBaseId;\n\n // If there is a conflict with an existing id, we will append\n // the following character and try again. If the conflict continues with\n // the postfix character added, we'll increment and keep going through the\n // alphabet\n const disambiguationStartCharacter = 97; // a\n\n while (existingIds.includes(proposedId)) {\n // If we've wrapped around to a and we haven't found a unique entry\n // Add an 'a' to the end and try again. Will ultimately create an entry like\n // Teague2012aaaf\n if (count !== 0 && count % 26 === 0) {\n safeBaseId = safeBaseId + String.fromCharCode(disambiguationStartCharacter);\n }\n\n const postfix = String.fromCharCode(disambiguationStartCharacter + (count % 26));\n proposedId = safeBaseId + postfix;\n count++;\n }\n return proposedId;\n}\n\n// Suggests a bibliographic identifier based upon the source\nexport function suggestCiteId(existingIds: string[], csl: CSL) {\n const author = csl.author;\n const issued = csl.issued;\n\n // Try to get the last name\n let citeIdLeading = '';\n if (author && author.length > 0) {\n if (author[0].family) {\n citeIdLeading = author[0].family;\n } else if (author[0].literal) {\n citeIdLeading = author[0].literal;\n }\n }\n\n // If we can't use author information, try using short title,\n // the title, or perhaps the type to construct a leading part of the\n // citeId.\n if (citeIdLeading.length === 0) {\n const shortTitle = csl['short-title'];\n if (shortTitle && shortTitle?.length > 0) {\n citeIdLeading = shortTitle.substr(0, Math.min(kCiteIdLeadingLength, shortTitle.length));\n } else if (csl.title) {\n citeIdLeading = csl.title.substr(0, Math.min(kCiteIdLeadingLength, csl.title.length));\n } else {\n citeIdLeading = csl.type;\n }\n }\n\n // Try to get the publication year\n let datePart = '';\n if (issued && issued['date-parts'] && issued['date-parts'].length > 0) {\n const yearIssued = issued['date-parts'][0][0];\n // Sometimes, data arrives with a null value, ignore null\n if (yearIssued) {\n datePart = yearIssued + '';\n }\n }\n\n // Create a deduplicated string against the existing entries\n let baseId = `${citeIdLeading.toLowerCase()}${datePart}`;\n if (baseId.length === 0) {\n baseId = 'untitled';\n }\n\n return createUniqueCiteId(existingIds, baseId);\n}\n\nexport interface CiteField {\n name: string;\n value: string;\n}\n\nexport function urlForCitation(csl: CSL): string | undefined {\n if (csl.URL) {\n return csl.URL;\n } else if (csl.DOI) {\n return urlForDOI(csl.DOI);\n }\n}\n\nexport function formatForPreview(csl: CSL): CiteField[] {\n const pairs = new Array<CiteField>();\n if (csl.title) {\n pairs.push({ name: 'Title', value: csl.title });\n }\n pairs.push({ name: 'Authors', value: formatAuthors(csl.author, 255) });\n if (csl.issued && isValidDate(csl.issued)) {\n pairs.push({ name: 'Issue Date', value: formatIssuedDate(csl.issued) });\n }\n\n const containerTitle = csl['container-title'];\n if (containerTitle) {\n pairs.push({ name: 'Publication', value: containerTitle });\n }\n\n const volume = csl.volume;\n if (volume) {\n pairs.push({ name: 'Volume', value: volume });\n }\n\n const page = csl.page;\n if (page) {\n pairs.push({ name: 'Page(s)', value: page });\n }\n\n const cslAny = csl as { [key: string]: any };\n Object.keys(csl).forEach(key => {\n if (!kFilteredFields.includes(key)) {\n const value = cslAny[key];\n // Don't display complex fields or fields that aren't strings\n if (typeof value === 'string') {\n // Capitalize preview names\n const name = key.charAt(0).toUpperCase() + key.slice(1);\n pairs.push({ name, value });\n }\n }\n });\n\n return pairs;\n}\n\nconst kFilteredFields = [\n 'id',\n 'title',\n 'author',\n 'issued',\n 'container-title',\n 'volume',\n 'page',\n 'abstract',\n 'provider',\n];\n\n// Sometimes, data arrives with a null value\n// This function will validate that the year (required) doesn't\n// contain null\nfunction isValidDate(date: CSLDate): boolean {\n const dateParts = date['date-parts'];\n if (dateParts) {\n const invalidElement = dateParts.find(datePart => datePart[0] === null);\n return invalidElement === undefined;\n }\n return true;\n}\n\n// TODO: Needs to support localization of the templated strings\nconst kEtAl = 'et al.';\nexport function formatAuthors(authors?: CSLName[], maxLength?: number): string {\n // No author(s) specified\n if (!authors || authors.length === 0) {\n return '';\n }\n\n return authors\n .map(author => {\n if (author.literal?.length) {\n return author.literal;\n } else if (author.given?.length && author.family?.length) {\n // Family and Given name\n return `${author.family}, ${author.given.substring(0, 1)}`;\n } else if (author.family?.length) {\n // Family name only\n return `${author.family}`;\n } else {\n return '';\n }\n })\n .reduce((previous, current, index, array) => {\n // Ignore any additional authors if the string\n // exceeds the maximum length\n if ((maxLength && previous.length >= maxLength) || previous.endsWith(kEtAl)) {\n return previous;\n }\n\n if (index === 0) {\n // Too long, truncate\n if (maxLength && current.length > maxLength) {\n return `${current.substring(0, maxLength - 1)}…`;\n }\n // The first author\n return current;\n } else if (index > 0 && index === array.length - 1) {\n // The last author\n return addAuthorOrEtAl(previous, `${previous}, and ${current}`, maxLength);\n } else {\n // Middle authors\n return addAuthorOrEtAl(previous, `${previous}, ${current}`, maxLength);\n }\n });\n}\n\nfunction addAuthorOrEtAl(previousAuthorStr: string, newAuthorStr: string, maxLength?: number) {\n // if adding the string would make it too long, truncate\n if (maxLength && newAuthorStr.length > maxLength) {\n return etAl(previousAuthorStr, maxLength);\n }\n return newAuthorStr;\n}\n\nfunction etAl(authorStr: string, maxLength: number) {\n // First try just using et al., then shorten existing\n // author to accomodate\n const etAlStr = `${authorStr} ${kEtAl}`;\n if (maxLength && etAlStr.length > maxLength) {\n // First try to truncate to a space\n const lastSpace = authorStr.lastIndexOf(' ');\n if (lastSpace) {\n return `${authorStr.substr(0, lastSpace)} ${kEtAl}`;\n } else {\n // As a last resort, truncate with ellipsis\n const excessLength = etAlStr.length - maxLength - 1;\n return `${authorStr.substr(0, authorStr.length - excessLength)}… ${kEtAl}`;\n }\n }\n return etAlStr;\n}\n\n// TODO: Needs to support localization of the templated strings\nexport function formatIssuedDate(date: CSLDate | undefined): string {\n // No issue date for this\n if (!date) {\n return '';\n }\n\n const dateParts = date['date-parts'];\n if (dateParts) {\n switch (dateParts.length) {\n // There is a date range\n case 2:\n return `${dateParts[0][0]}-${dateParts[1][0]}`;\n // Only a single date\n case 1:\n // Note that it is possible to receive an entry with a single null entry\n // For examples:\n // 10.1163/1874-6772_seg_a44_588\n const singleDatePart = dateParts[0][0];\n return `${singleDatePart ? singleDatePart : ''}`;\n\n // Seems like a malformed date :(\n case 0:\n default:\n return '';\n }\n }\n return '';\n}\n\nexport function citeUI(citeProps: InsertCiteProps): InsertCiteUI {\n if (citeProps.csl) {\n const suggestedId = suggestCiteId(citeProps.existingIds, citeProps.csl);\n const previewFields = formatForPreview(citeProps.csl);\n return {\n suggestedId,\n previewFields,\n };\n } else {\n // This should never happen - this function should always be called with a work\n return {\n suggestedId: '',\n previewFields: [],\n };\n }\n}\n","/*\n * doi.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport interface DOIResult {\n status: 'ok' | 'notfound' | 'nohost' | 'error';\n message: any | null;\n error: string;\n}\n\nexport interface DOIServer {\n fetchCSL: (doi: string, progressDelay: number) => Promise<DOIResult>;\n}\n\n// ^10.\\d{4,9}/[-._;()/:A-Z0-9]+$\n// Core regexes come from https://www.crossref.org/blog/dois-and-matching-regular-expressions/\nconst kModernCrossrefDOIRegex = /10.\\d{4,9}\\/[-._;()/:A-Z0-9]+$/i;\nconst kEarlyWileyCrossrefDOIRegex = /10.1002\\/[^\\s]+$/i;\nconst kOtherCrossrefDOIRegex1 = /10.\\\\d{4}\\/\\d+-\\d+X?(\\d+)\\d+<[\\d\\w]+:[\\d\\w]*>\\d+.\\d+.\\w+;\\d$/i;\nconst kOtherCrossrefDOIRegex2 = /10.1021\\/\\w\\w\\d+$/i;\nconst kOtherCrossrefDOIRegex3 = /10.1207\\/[\\w\\d]+\\&\\d+_\\d+$/i;\n\nconst kCrossrefMatches = [\n kModernCrossrefDOIRegex,\n kEarlyWileyCrossrefDOIRegex,\n kOtherCrossrefDOIRegex1,\n kOtherCrossrefDOIRegex2,\n kOtherCrossrefDOIRegex3,\n];\n\n// Determines whether a a given string may be a DOI\n// Note that this will validate the form of the string, but not\n// whether it is actually a registered DOI\nexport function hasDOI(token: string): boolean {\n return findDOI(token) !== undefined;\n}\n\nexport function findDOI(token: string): string | undefined {\n let match = null;\n kCrossrefMatches.find(regex => {\n match = token.match(regex);\n return match && match[0].length > 0;\n });\n\n if (match === null) {\n return undefined;\n } else {\n return match[0];\n }\n}\n\nexport function urlForDOI(doi: string): string {\n return `https://doi.org/${doi}`;\n}\n","/*\n * ui-dialogs.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { LinkTargets, LinkCapabilities, LinkType } from './link';\nimport { ImageDimensions } from './image';\nimport { ListCapabilities, ListType } from './list';\nimport { TableCapabilities } from './table';\nimport { CSL } from './csl';\nimport { CiteField } from './cite';\nimport { kStyleAttrib, attrPartitionKeyvalue, pandocAttrKeyvalueFromText } from './pandoc_attr';\n\nexport interface EditorDialogs {\n alert: AlertFn;\n yesNoMessage: YesNoMessageFn;\n editLink: LinkEditorFn;\n editImage: ImageEditorFn;\n editCodeBlock: CodeBlockEditorFn;\n editList: ListEditorFn;\n editAttr: AttrEditorFn;\n editSpan: AttrEditorFn;\n editDiv: DivAttrEditorFn;\n editCallout: CalloutEditorFn;\n editRawInline: RawFormatEditorFn;\n editRawBlock: RawFormatEditorFn;\n editMath: MathEditorFn;\n insertTable: InsertTableFn;\n insertTabset: InsertTabsetFn;\n insertCite: InsertCiteFn;\n htmlDialog: EditorHTMLDialogFn;\n}\n\nexport type EditorHTMLDialogFn = (\n title: string,\n okText: string | null,\n create: EditorHTMLDialogCreateFn,\n focus: VoidFunction,\n validate: EditorHTMLDialogValidateFn,\n) => Promise<boolean>;\n\nexport type EditorHTMLDialogCreateFn = (\n containerWidth: number,\n containerHeight: number,\n confirm: VoidFunction,\n cancel: VoidFunction,\n showProgress: (message: string) => void,\n hideProgress: VoidFunction,\n) => HTMLElement;\n\nexport type EditorHTMLDialogValidateFn = () => string | null;\n\nexport const kAlertTypeInfo = 1;\nexport const kAlertTypeWarning = 2;\nexport const kAlertTypeError = 3;\n\nexport type AlertFn = (message: string, title: string, type: number) => Promise<boolean>;\n\nexport type YesNoMessageFn = (\n message: string,\n title: string,\n type: number,\n yesLabel: string,\n noLabel: string,\n) => Promise<boolean>;\n\nexport type AttrEditorFn = (attr: AttrProps, idHint?: string) => Promise<AttrEditResult | null>;\n\nexport type DivAttrEditorFn = (attr: AttrProps, removeEnabled: boolean) => Promise<AttrEditResult | null>;\n\nexport type CalloutEditorFn = (props: CalloutEditProps, removeEnabled: boolean) => Promise<CalloutEditResult | null>;\n\nexport type LinkEditorFn = (\n link: LinkProps,\n targets: LinkTargets,\n capabilities: LinkCapabilities,\n) => Promise<LinkEditResult | null>;\n\nexport type ImageEditorFn = (\n image: ImageProps,\n dims: ImageDimensions | null,\n figure: boolean,\n editAttributes: boolean,\n) => Promise<ImageEditResult | null>;\n\nexport type CodeBlockEditorFn = (\n codeBlock: CodeBlockProps,\n attributes: boolean,\n languages: string[],\n) => Promise<CodeBlockEditResult | null>;\n\nexport type ListEditorFn = (list: ListProps, capabilities: ListCapabilities) => Promise<ListEditResult | null>;\n\nexport type MathEditorFn = (id: string) => Promise<string | null>;\n\nexport type RawFormatEditorFn = (raw: RawFormatProps, outputFormats: string[]) => Promise<RawFormatResult | null>;\n\nexport type InsertTableFn = (capabilities: TableCapabilities) => Promise<InsertTableResult | null>;\n\nexport type InsertCiteFn = (props: InsertCiteProps) => Promise<InsertCiteResult | null>;\n\nexport type InsertTabsetFn = () => Promise<InsertTabsetResult | null>;\n\nexport interface AttrProps {\n readonly id?: string;\n readonly classes?: string[];\n readonly keyvalue?: Array<[string, string]>;\n}\n\nexport interface AttrEditResult {\n readonly action: 'edit' | 'remove';\n readonly attr: AttrProps;\n}\n\nexport interface CalloutEditProps {\n attr: AttrProps;\n callout: CalloutProps;\n}\n\nexport interface CalloutEditResult extends CalloutEditProps {\n readonly action: \"edit\" | \"remove\";\n}\n\nexport interface CalloutProps {\n type: string;\n appearance: string;\n icon: boolean;\n caption: string;\n}\n\nexport interface LinkProps extends AttrProps {\n readonly type: LinkType;\n readonly text: string;\n readonly href: string;\n readonly heading?: string;\n readonly title?: string;\n}\n\nexport interface LinkEditResult {\n readonly action: 'edit' | 'remove';\n readonly link: LinkProps;\n}\n\nexport interface ImageProps extends AttrProps {\n src: string | null;\n title?: string;\n caption?: string;\n alt?: string;\n align?: string;\n env?: string;\n linkTo?: string;\n width?: number;\n height?: number;\n units?: string;\n lockRatio?: boolean;\n}\n\nexport type ImageEditResult = ImageProps;\n\nexport interface CodeBlockProps extends AttrProps {\n lang: string;\n}\n\nexport type CodeBlockEditResult = CodeBlockProps;\n\nexport interface ListProps {\n type: ListType;\n tight: boolean;\n order: number;\n number_style: string;\n number_delim: string;\n incremental: \"default\" | \"incremental\" | \"nonincremental\";\n}\n\nexport type ListEditResult = ListProps;\n\nexport interface InsertTableResult {\n rows: number;\n cols: number;\n header: boolean;\n caption?: string;\n}\n\nexport interface InsertTabsetResult {\n tabs: string[];\n attr: AttrProps;\n}\n\nexport interface InsertCiteProps {\n doi: string;\n existingIds: string[];\n bibliographyFiles: string[];\n provider?: string;\n csl?: CSL;\n citeUI?: InsertCiteUI;\n}\n\nexport interface InsertCiteUI {\n suggestedId: string;\n previewFields: CiteField[];\n}\n\nexport interface InsertCiteResult {\n id: string;\n bibliographyFile: string;\n csl: CSL;\n}\n\nexport interface RawFormatProps {\n content: string;\n format: string;\n}\n\nexport interface RawFormatResult {\n readonly action: 'edit' | 'remove';\n readonly raw: RawFormatProps;\n}\n\nexport interface AttrEditInput {\n id?: string;\n classes?: string;\n style?: string;\n keyvalue?: string;\n}\n\nexport function attrInputToProps(attr: AttrEditInput): AttrProps {\n const classes = attr.classes ? attr.classes.split(/\\s+/) : [];\n let keyvalue: Array<[string, string]> | undefined;\n if (attr.keyvalue || attr.style) {\n let text = attr.keyvalue || '';\n if (attr.style) {\n text += `\\nstyle=${attr.style}\\n`;\n }\n keyvalue = pandocAttrKeyvalueFromText(text, '\\n');\n }\n return {\n id: asPandocId(attr.id || ''),\n classes: classes.map(asPandocClass),\n keyvalue,\n };\n}\n\nfunction asPandocId(id: string) {\n return id.replace(/^#/, '');\n}\n\nfunction asPandocClass(clz: string) {\n return clz.replace(/^\\./, '');\n}\n\nexport function attrPropsToInput(attr: AttrProps): AttrEditInput {\n let style: string | undefined;\n let keyvalue: string | undefined;\n if (attr.keyvalue) {\n const partitionedKeyvalue = attrPartitionKeyvalue([kStyleAttrib], attr.keyvalue);\n if (partitionedKeyvalue.partitioned.length > 0) {\n style = partitionedKeyvalue.partitioned[0][1];\n }\n keyvalue = attrTextFromKeyvalue(partitionedKeyvalue.base);\n }\n\n return {\n id: asHtmlId(attr.id) || undefined,\n classes: attr.classes ? attr.classes.map(asHtmlClass).join(' ') : undefined,\n style,\n keyvalue,\n };\n}\n\nfunction attrTextFromKeyvalue(keyvalue: Array<[string, string]>) {\n return keyvalue.map(kv => `${kv[0]}=${kv[1]}`).join('\\n');\n}\n\nfunction asHtmlId(id: string | undefined) {\n if (id) {\n if (id.startsWith('#')) {\n return id;\n } else {\n return '#' + id;\n }\n } else {\n return id;\n }\n}\n\nfunction asHtmlClass(clz: string | undefined) {\n if (clz) {\n if (clz.startsWith('.')) {\n return clz;\n } else {\n return '.' + clz;\n }\n } else {\n return clz;\n }\n}\n","/*\n * pandoc_attr.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { NodeSpec, MarkSpec } from 'prosemirror-model';\n\nimport { PandocToken, PandocExtensions } from './pandoc';\nimport { extensionEnabled, extensionIfEnabled, Extension } from './extension';\n\nexport const kPandocAttrId = 0;\nexport const kPandocAttrClasses = 1;\nexport const kPandocAttrKeyvalue = 2;\n\nconst kDataPmPandocAttr = 'data-pm-pandoc-attr';\n\nexport const kWidthAttrib = 'width';\nexport const kHeightAttrib = 'height';\nexport const kStyleAttrib = 'style';\nexport const kAlignAttrib = 'align';\nexport const kFigAltAttrib = 'fig-alt';\nexport const kFigAlignAttrib = 'fig-align';\nexport const kFigEnvAttrib = 'fig-env';\n\nexport const kCodeBlockAttr = 0;\nexport const kCodeBlockText = 1;\n\nexport const kSpanAttr = 0;\nexport const kSpanChildren = 1;\n\nexport interface PandocAttr {\n id: string;\n classes: string[];\n keyvalue: Array<[string, string]>;\n}\n\nexport const pandocAttrSpec = {\n id: { default: null },\n classes: { default: [] },\n keyvalue: { default: [] },\n};\n\nexport function pandocAttrAvailable(attrs: any, keyvalue = true) {\n return !!attrs.id || \n (attrs.classes && attrs.classes.length > 0) || \n (keyvalue && attrs.keyvalue && attrs.keyvalue.length > 0);\n}\n\nexport function pandocAttrFrom(attrs: any) {\n const pandocAttr: any = {};\n if (attrs.id) {\n pandocAttr.id = attrs.id;\n }\n if (attrs.classes) {\n pandocAttr.classes = attrs.classes;\n }\n if (attrs.keyvalue) {\n pandocAttr.keyvalue = attrs.keyvalue;\n }\n\n return pandocAttr;\n}\n\nexport function pandocAttrEnsureClass(attr: any, name: string) {\n attr.classes = [name].concat((attr.classes || []).filter((clz: string) => clz !== name));\n}\n\nexport function pandocAttrRemoveClass(attr: any, predicate: (str: string) => boolean) : string | undefined {\n let foundClass: string | undefined;\n if (Array.isArray(attr.classes)) {\n const classes: string[] = [];\n for (const clz of attr.classes) {\n if (predicate(clz)) {\n foundClass = clz;\n } else {\n classes.push(clz);\n }\n }\n attr.classes = classes;\n return foundClass;\n \n } else {\n return undefined;\n }\n}\n\nexport function pandocAttrHasClass(attrs: any, predicate: (str: string) => boolean) {\n if (Array.isArray(attrs.classes)) {\n const classes = attrs.classes as string[];\n return classes.some(clz => predicate(clz));\n } else {\n return false;\n }\n}\n\nexport function pandocAttrGetKeyvalue(attr: any, key: string) {\n if (attr.keyvalue) {\n const entry = attr.keyvalue.find((keyval: string[]) => keyval[0] === key);\n if (entry) {\n return entry[1];\n } else {\n return undefined;\n }\n } else {\n return undefined;\n }\n}\n\nexport function pandocAttrSetKeyvalue(attr: any, key: string, value: string) {\n const keyvalue = [...(attr.keyvalue || [])] as string[][];\n let add = true;\n for (const entry of keyvalue) {\n if (entry[0] === key) {\n entry[1] = value;\n add = false;\n break;\n }\n }\n if (add) {\n keyvalue.push([key, value]);\n }\n attr.keyvalue = keyvalue;\n}\n\nexport function pandocAttrRemoveKeyvalue(attr: any, key: string) {\n if (attr.keyvalue) {\n attr.keyvalue = attr.keyvalue.filter((entry: string[]) => entry[0] !== key);\n }\n}\n\nexport function pandocAttrInSpec(spec: NodeSpec | MarkSpec) {\n const keys = Object.keys((spec.attrs as object) || {});\n return keys.includes('id') && keys.includes('classes') && keys.includes('keyvalue');\n}\n\nexport function pandocAttrReadAST(tok: PandocToken, index: number) {\n const pandocAttr = tok.c[index];\n return {\n id: pandocAttr[kPandocAttrId] || undefined,\n classes: pandocAttr[kPandocAttrClasses],\n keyvalue: pandocAttr[kPandocAttrKeyvalue],\n };\n}\n\nexport function pandocAttrToDomAttr(attrs: any, marker = true) {\n // id and class\n const domAttr: any = {};\n if (attrs.id) {\n domAttr.id = attrs.id;\n }\n if (attrs.classes && attrs.classes.length > 0) {\n domAttr.class = attrs.classes.join(' ');\n }\n\n // keyvalue pairs\n attrs.keyvalue.forEach((keyvalue: [string, string]) => {\n domAttr[keyvalue[0]] = keyvalue[1];\n });\n\n // marker\n if (marker) {\n domAttr[kDataPmPandocAttr] = '1';\n }\n\n return domAttr;\n}\n\nexport function pandocAttrParseDom(el: Element, attrs: { [key: string]: string | null }, forceAttrs = false) {\n // exclude any keys passed to us\n const excludedNames = Object.keys(attrs);\n\n // if this isn't from a prosemirror pandoc node then include only src and alt\n const includedNames: string[] = [];\n if (!forceAttrs && !el.hasAttribute(kDataPmPandocAttr)) {\n includedNames.push('src', 'alt');\n }\n\n // read attributes\n const attr: any = {};\n attr.classes = [];\n attr.keyvalue = [];\n el.getAttributeNames().forEach(name => {\n const value: string = el.getAttribute(name) as string;\n // exclude attributes already parsed and prosemirror internal attributes\n if (excludedNames.indexOf(name) === -1 && !name.startsWith('data-pm')) {\n // if we have an include filter then use it\n if (!includedNames.length || includedNames.includes(name)) {\n if (name === 'id') {\n attr.id = value;\n } else if (name === 'class') {\n attr.classes = value\n .split(/\\s+/)\n .filter(val => !!val.length)\n .filter(val => !val.startsWith('pm-'));\n } else {\n attr.keyvalue.push([name, value]);\n }\n }\n }\n });\n return attr;\n}\n\nexport function pandocAttrParseText(attr: string): PandocAttr | null {\n attr = attr.trim();\n\n let id = '';\n const classes: string[] = [];\n let remainder = '';\n\n let current = '';\n const resolveCurrent = () => {\n const resolve = current;\n current = '';\n\n if (resolve.length === 0) {\n return true;\n } else if (resolve.startsWith('#')) {\n if (id.length === 0 && resolve.length > 1) {\n id = resolve.substr(1);\n return true;\n } else {\n return false;\n }\n } else if (resolve.startsWith('.')) {\n if (resolve.length > 1) {\n classes.push(resolve.substr(1));\n return true;\n } else {\n return false;\n }\n } else {\n remainder = resolve;\n return true;\n }\n };\n\n for (let i = 0; i < attr.length; i++) {\n let inQuotes = false;\n const ch = attr[i];\n inQuotes = ch === '\"' ? !inQuotes : inQuotes;\n if (ch !== ' ' && !inQuotes) {\n current += ch;\n } else if (resolveCurrent()) {\n // if we have a remainder then the rest of the string is the remainder\n if (remainder.length > 0) {\n remainder = remainder + attr.substr(i);\n break;\n }\n } else {\n return null;\n }\n }\n\n if (resolveCurrent()) {\n if (id.length === 0 && classes.length === 0) {\n remainder = attr;\n }\n return {\n id,\n classes,\n keyvalue: remainder.length > 0 ? pandocAttrKeyvalueFromText(remainder, ' ') : [],\n };\n } else {\n return null;\n }\n}\n\nexport function pandocAttrKeyvalueFromText(text: string, separator: ' ' | '\\n'): Array<[string, string]> {\n // if the separator is a space then convert unquoted spaces to newline\n if (separator === ' ') {\n let convertedText = '';\n let inQuotes = false;\n for (let i = 0; i < text.length; i++) {\n let ch = text.charAt(i);\n if (ch === '\"') {\n inQuotes = !inQuotes;\n } else if (ch === ' ' && !inQuotes) {\n ch = '\\n';\n }\n convertedText += ch;\n }\n text = convertedText;\n }\n\n const lines = text.trim().split('\\n');\n return lines.map(line => {\n const parts = line.trim().split('=');\n return [parts[0], (parts[1] || '').replace(/^\"/, '').replace(/\"$/, '')];\n });\n}\n\nexport interface AttrKeyvaluePartitioned {\n base: Array<[string, string]>;\n partitioned: Array<[string, string]>;\n}\n\nexport function attrPartitionKeyvalue(partition: string[], keyvalue: Array<[string, string]>): AttrKeyvaluePartitioned {\n const base = new Array<[string, string]>();\n const partitioned = new Array<[string, string]>();\n\n keyvalue.forEach(kv => {\n if (partition.includes(kv[0])) {\n partitioned.push(kv);\n } else {\n base.push(kv);\n }\n });\n\n return {\n base,\n partitioned,\n };\n}\n\nexport function extensionIfPandocAttrEnabled(extension: Extension) {\n return extensionIfEnabled(extension, kPandocAttrExtensions);\n}\n\nexport function pandocAttrEnabled(pandocExtensions: PandocExtensions) {\n return extensionEnabled(pandocExtensions, kPandocAttrExtensions);\n}\n\nconst kPandocAttrExtensions = [\n 'link_attributes',\n 'mmd_link_attributes',\n 'mmd_header_identifiers',\n 'header_attributes',\n 'fenced_code_attributes',\n 'inline_code_attributes',\n 'bracketed_spans',\n 'native_spans',\n 'fenced_divs',\n 'native_divs',\n];\n","/*\n * extension.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { InputRule } from 'prosemirror-inputrules';\nimport { Schema } from 'prosemirror-model';\nimport { Plugin } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { ProsemirrorCommand } from './command';\nimport { PandocMark } from './mark';\nimport { PandocNode } from './node';\nimport { EditorUI } from './ui';\nimport { BaseKeyBinding } from './basekeys';\nimport { AppendTransactionHandler, AppendMarkTransactionHandler } from './transaction';\nimport { EditorOptions } from './options';\nimport { PandocExtensions } from './pandoc';\nimport { FixupFn } from './fixup';\nimport { EditorEvents } from './events';\nimport { PandocCapabilities } from './pandoc_capabilities';\nimport { EditorFormat } from './format';\nimport { MarkInputRuleFilter } from './input_rule';\nimport { CompletionHandler } from './completion';\nimport { EditorNavigation } from './navigation';\nimport { EditorMath } from './math';\nimport { EditorServer } from './server';\n\nexport interface Extension {\n marks?: PandocMark[];\n nodes?: PandocNode[];\n baseKeys?: (schema: Schema) => readonly BaseKeyBinding[];\n inputRules?: (schema: Schema, markFilter: MarkInputRuleFilter) => readonly InputRule[];\n commands?: (schema: Schema) => readonly ProsemirrorCommand[];\n plugins?: (schema: Schema) => readonly Plugin[];\n appendTransaction?: (schema: Schema) => readonly AppendTransactionHandler[];\n appendMarkTransaction?: (schema: Schema) => readonly AppendMarkTransactionHandler[];\n fixups?: (schema: Schema, view: EditorView) => Readonly<FixupFn[]>;\n completionHandlers?: () => readonly CompletionHandler[];\n}\n\nexport interface ExtensionContext {\n pandocExtensions: PandocExtensions;\n pandocCapabilities: PandocCapabilities;\n server: EditorServer;\n ui: EditorUI;\n math?: EditorMath;\n format: EditorFormat;\n options: EditorOptions;\n events: EditorEvents;\n navigation: EditorNavigation;\n}\n\nexport type ExtensionFn = (context: ExtensionContext) => Extension | null;\n\n// create an ExtensionFn for a given extension and format option that must be enabled\nexport function extensionIfEnabled(extension: Extension, name: string | string[]) {\n return (context: ExtensionContext) => {\n if (extensionEnabled(context.pandocExtensions, name)) {\n return extension;\n } else {\n return null;\n }\n };\n}\n\nexport function extensionEnabled(pandocExtensions: PandocExtensions, name: string | string[]) {\n // match single extension name\n if (typeof name === 'string') {\n if (pandocExtensions[name]) {\n return true;\n }\n\n // match any one of several names\n } else if (Array.isArray(name)) {\n for (const nm of name) {\n if (pandocExtensions[nm]) {\n return true;\n }\n }\n }\n\n return false;\n}\n","/*\n * pandoc_capabilities.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { PandocServer, parsePandocListOutput, PandocApiVersion } from './pandoc';\n\nexport interface PandocCapabilitiesResult {\n version: string;\n api_version: PandocApiVersion;\n output_formats: string;\n highlight_languages: string;\n}\n\nexport interface PandocCapabilities {\n version: string;\n api_version: PandocApiVersion;\n output_formats: string[];\n highlight_languages: string[];\n}\n\nexport async function getPandocCapabilities(server: PandocServer) {\n const result = await server.getCapabilities();\n return {\n version: result.version,\n api_version: result.api_version,\n output_formats: parsePandocListOutput(result.output_formats),\n highlight_languages: parsePandocListOutput(result.highlight_languages),\n };\n}\n","/*\n * pandoc.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Fragment, Mark, Node as ProsemirrorNode, Schema, NodeType } from 'prosemirror-model';\n\nimport { PandocAttr, pandocAttrReadAST, kSpanChildren, kSpanAttr } from './pandoc_attr';\nimport { PandocCapabilitiesResult } from './pandoc_capabilities';\nimport { kQuoteType, kQuoteChildren, QuoteType } from './quote';\nimport { BibliographyResult } from './bibliography/bibliography-provider_local';\n\nimport { stringifyMath } from './math';\nimport { kCodeText } from './code';\nimport { kLinkChildren } from './link';\n\nexport interface PandocServer {\n getCapabilities(): Promise<PandocCapabilitiesResult>;\n markdownToAst(markdown: string, format: string, options: string[]): Promise<PandocAst>;\n astToMarkdown(ast: PandocAst, format: string, options: string[]): Promise<string>;\n listExtensions(format: string): Promise<string>;\n getBibliography(\n file: string | null,\n bibliography: string[],\n refBlock: string | null,\n etag: string | null,\n ): Promise<BibliographyResult>;\n addToBibliography(\n bibliography: string,\n project: boolean,\n id: string,\n sourceAsJson: string,\n sourceAsBibTeX: string,\n ): Promise<boolean>;\n citationHTML(file: string | null, sourceAsJson: string, csl: string | null): Promise<string>;\n}\n\nexport interface PandocWriterReferencesOptions {\n location?: string; // block | section | document\n prefix?: string;\n}\n\nexport interface PandocWriterOptions {\n atxHeaders?: boolean;\n references?: PandocWriterReferencesOptions;\n wrap?: string;\n dpi?: number;\n}\n\nexport interface PandocExtensions {\n abbreviations: boolean;\n all_symbols_escapable: boolean;\n amuse: boolean;\n angle_brackets_escapable: boolean;\n ascii_identifiers: boolean;\n auto_identifiers: boolean;\n autolink_bare_uris: boolean;\n backtick_code_blocks: boolean;\n blank_before_blockquote: boolean;\n blank_before_header: boolean;\n bracketed_spans: boolean;\n citations: boolean;\n compact_definition_lists: boolean;\n definition_lists: boolean;\n east_asian_line_breaks: boolean;\n emoji: boolean;\n empty_paragraphs: boolean;\n epub_html_exts: boolean;\n escaped_line_breaks: boolean;\n example_lists: boolean;\n fancy_lists: boolean;\n fenced_code_attributes: boolean;\n fenced_code_blocks: boolean;\n fenced_divs: boolean;\n footnotes: boolean;\n four_space_rule: boolean;\n gfm_auto_identifiers: boolean;\n grid_tables: boolean;\n hard_line_breaks: boolean;\n header_attributes: boolean;\n ignore_line_breaks: boolean;\n implicit_figures: boolean;\n implicit_header_references: boolean;\n inline_code_attributes: boolean;\n inline_notes: boolean;\n intraword_underscores: boolean;\n latex_macros: boolean;\n line_blocks: boolean;\n link_attributes: boolean;\n lists_without_preceding_blankline: boolean;\n literate_haskell: boolean;\n markdown_attribute: boolean;\n markdown_in_html_blocks: boolean;\n mmd_header_identifiers: boolean;\n mmd_link_attributes: boolean;\n mmd_title_block: boolean;\n multiline_tables: boolean;\n native_divs: boolean;\n native_spans: boolean;\n native_numbering: boolean;\n ntb: boolean;\n old_dashes: boolean;\n pandoc_title_block: boolean;\n pipe_tables: boolean;\n raw_attribute: boolean;\n raw_html: boolean;\n raw_tex: boolean;\n shortcut_reference_links: boolean;\n simple_tables: boolean;\n smart: boolean;\n space_in_atx_header: boolean;\n spaced_reference_links: boolean;\n startnum: boolean;\n strikeout: boolean;\n subscript: boolean;\n superscript: boolean;\n styles: boolean;\n task_lists: boolean;\n table_captions: boolean;\n tex_math_dollars: boolean;\n tex_math_double_backslash: boolean;\n tex_math_single_backslash: boolean;\n yaml_metadata_block: boolean;\n gutenberg: boolean;\n // attributes: boolean; (not yet)\n [key: string]: boolean;\n}\n\nexport function imageAttributesAvailable(pandocExtensions: PandocExtensions) {\n return pandocExtensions.link_attributes || pandocExtensions.raw_html;\n}\n\nexport function parsePandocListOutput(output: string) {\n return output.split(/\\r?\\n/).filter(entry => entry.length);\n}\n\nexport interface PandocAst {\n blocks: PandocToken[];\n 'pandoc-api-version': PandocApiVersion;\n meta: any;\n heading_ids?: string[]; // used only for reading not writing\n}\n\nexport type PandocApiVersion = number[];\n\nexport interface PandocToken {\n t: string;\n c?: any;\n}\n\n// https://github.com/jgm/pandoc-types/blob/master/Text/Pandoc/Definition.hs\nexport enum PandocTokenType {\n Str = 'Str',\n Space = 'Space',\n Strong = 'Strong',\n Emph = 'Emph',\n Code = 'Code',\n Superscript = 'Superscript',\n Subscript = 'Subscript',\n Strikeout = 'Strikeout',\n SmallCaps = 'SmallCaps',\n Underline = 'Underline',\n Quoted = 'Quoted',\n RawInline = 'RawInline',\n RawBlock = 'RawBlock',\n LineBlock = 'LineBlock',\n Para = 'Para',\n Plain = 'Plain',\n Header = 'Header',\n CodeBlock = 'CodeBlock',\n BlockQuote = 'BlockQuote',\n BulletList = 'BulletList',\n OrderedList = 'OrderedList',\n DefinitionList = 'DefinitionList',\n Image = 'Image',\n Link = 'Link',\n Note = 'Note',\n Cite = 'Cite',\n Table = 'Table',\n AlignRight = 'AlignRight',\n AlignLeft = 'AlignLeft',\n AlignDefault = 'AlignDefault',\n AlignCenter = 'AlignCenter',\n ColWidth = 'ColWidth',\n ColWidthDefault = 'ColWidthDefault',\n HorizontalRule = 'HorizontalRule',\n LineBreak = 'LineBreak',\n SoftBreak = 'SoftBreak',\n Math = 'Math',\n InlineMath = 'InlineMath',\n DisplayMath = 'DisplayMath',\n Div = 'Div',\n Span = 'Span',\n Null = 'Null',\n}\n\nexport interface PandocTokenReader {\n // pandoc token name (e.g. \"Str\", \"Emph\", etc.)\n readonly token: PandocTokenType;\n\n // If present, gives a chance for the reader to decide whether it actually\n // wants to handle the token, based on factors other than the PandocTokenType\n readonly match?: (tok: PandocToken) => boolean;\n\n // one and only one of these values must also be set\n readonly text?: boolean;\n readonly node?: string;\n readonly block?: string;\n readonly mark?: string;\n readonly code_block?: boolean;\n\n // functions for getting attributes and children\n getAttrs?: (tok: PandocToken) => any;\n getChildren?: (tok: PandocToken) => any[];\n getText?: (tok: PandocToken) => string;\n\n // lower-level handler function that overrides the above handler attributes\n // (they are ignored when handler is specified)\n handler?: (schema: Schema) => (writer: ProsemirrorWriter, tok: PandocToken) => void;\n\n // post-processor for performing fixups that rely on seeing the entire\n // document (e.g. recognizing implicit header references)\n postprocessor?: PandocPostprocessorFn;\n}\n\n// constants used to read the contents of raw blocks\nexport const kRawBlockFormat = 0;\nexport const kRawBlockContent = 1;\n\n// filter sequences of tokens (e.g. for reducing some adjacent tokens to a single token)\nexport type PandocTokensFilterFn = (tokens: PandocToken[], writer: ProsemirrorWriter) => PandocToken[];\n\n// special reader that gets a first shot at blocks (i.e. to convert a para w/ a single image into a figure)\nexport type PandocBlockReaderFn = (schema: Schema, tok: PandocToken, writer: ProsemirrorWriter) => boolean;\n\n// reader that gets a first shot at inline html (e.g. image node parsing an <img> tag)\nexport type PandocInlineHTMLReaderFn = (schema: Schema, html: string, writer?: ProsemirrorWriter) => boolean;\n\nexport interface ProsemirrorWriter {\n // open (then close) a node container\n openNode(type: NodeType, attrs: {}): void;\n closeNode(): ProsemirrorNode;\n\n // special open call for note node containers\n openNoteNode(ref: string): void;\n\n // add a node to the current container\n addNode(type: NodeType, attrs: {}, content: ProsemirrorNode[]): ProsemirrorNode | null;\n\n // open and close marks\n openMark(mark: Mark): void;\n closeMark(mark: Mark): void;\n\n // add text to the current node using the current mark set\n writeText(text: string): void;\n\n // write tokens into the current node\n writeTokens(tokens: PandocToken[]): void;\n\n // see if any inline HTML readers want to handle this html\n hasInlineHTMLWriter(html: string): boolean;\n writeInlineHTML(html: string): void;\n\n // log an unrecoginzed token type\n logUnrecognized(token: string): void;\n\n // log the presence of example lists\n logExampleList(): void;\n\n // query whether a given node type is open\n // (useful for e.g. conditional behavior when in a list or table)\n isNodeOpen(type: NodeType): boolean;\n}\n\nexport interface PandocNodeWriter {\n readonly name: string;\n readonly write: PandocNodeWriterFn;\n}\n\nexport type PandocNodeWriterFn = (output: PandocOutput, node: ProsemirrorNode) => void;\n\nexport type PandocPreprocessorFn = (markdown: string) => string;\n\nexport type PandocPostprocessorFn = (doc: ProsemirrorNode) => ProsemirrorNode;\n\nexport interface PandocMarkWriter {\n // pandoc mark name\n readonly name: string;\n\n // The 'priority' property allows us to dicate the order of nesting\n // for marks (this is required b/c Prosemirror uses a flat structure\n // whereby multiple marks are attached to text nodes). This allows us\n // to e.g. ensure that strong and em always occur outside code.\n readonly priority: number;\n\n // writer function\n readonly write: PandocMarkWriterFn;\n}\n\nexport type PandocMarkWriterFn = (output: PandocOutput, mark: Mark, parent: Fragment) => void;\n\nexport const kWriteSpaces = 'writeSpaces';\nexport const kPreventBracketEscape = 'preventBracketEscape';\n\nexport type PandocOutputOption = typeof kWriteSpaces | typeof kPreventBracketEscape;\n\n\n\nexport interface PandocOutput {\n extensions: PandocExtensions;\n write(value: any): void;\n writeToken(type: PandocTokenType, content?: (() => void) | any): void;\n writeMark(type: PandocTokenType, parent: Fragment, expelEnclosingWhitespace?: boolean): void;\n writeArray(content: () => void): void;\n writeAttr(id?: string, classes?: string[], keyvalue?: [[string, string]]): void;\n writeText(text: string | null): void;\n writeLink(href: string, title: string, attr: PandocAttr | null, f: () => void): void;\n writeNode(node: ProsemirrorNode): void;\n writeNodes(parent: ProsemirrorNode): void;\n writeNote(note: ProsemirrorNode): void;\n writeInlines(fragment: Fragment): void;\n writeRawMarkdown(markdown: Fragment | string, escapeSymbols?: boolean): void;\n withOption(option: PandocOutputOption, value: boolean, f: () => void): void;\n}\n\n// collect the text from a collection of pandoc ast\n// elements (ignores marks, useful for ast elements\n// that support marks but whose prosemirror equivalent\n// does not, e.g. image alt text)\n// https://github.com/jgm/pandoc/blob/83880b0dbc318703babfbb6905b1046fa48f1216/src/Text/Pandoc/Shared.hs#L439\nexport function stringifyTokens(c: PandocToken[], unemoji = false): string {\n return c\n .map(elem => {\n if (elem.t === PandocTokenType.Str) {\n return elem.c;\n } else if (\n elem.t === PandocTokenType.Space ||\n elem.t === PandocTokenType.SoftBreak ||\n elem.t === PandocTokenType.LineBreak\n ) {\n return ' ';\n } else if (elem.t === PandocTokenType.Link) {\n return stringifyTokens(elem.c[kLinkChildren]);\n } else if (elem.t === PandocTokenType.Span) {\n const attr = pandocAttrReadAST(elem, kSpanAttr);\n if (unemoji && attr.classes && attr.classes[0] === 'emoji') {\n return attr.keyvalue[0][1];\n } else {\n return stringifyTokens(elem.c[kSpanChildren]);\n }\n } else if (elem.t === PandocTokenType.Quoted) {\n const type = elem.c[kQuoteType].t;\n const quote = type === QuoteType.SingleQuote ? \"'\" : '\"';\n return quote + stringifyTokens(elem.c[kQuoteChildren]) + quote;\n } else if (elem.t === PandocTokenType.Math) {\n return stringifyMath(elem);\n } else if (elem.t === PandocTokenType.Code) {\n return elem.c[kCodeText];\n } else if (elem.c) {\n return stringifyTokens(elem.c);\n } else {\n return '';\n }\n })\n .join('');\n}\n\nexport function forEachToken(tokens: PandocToken[], f: (tok: PandocToken) => void) {\n mapTokens(tokens, (tok: PandocToken) => {\n f(tok);\n return tok;\n });\n}\n\nexport function mapTokens(tokens: PandocToken[], f: (tok: PandocToken) => PandocToken) {\n function isToken(val: any) {\n if (val !== null && typeof val === 'object') {\n return val.hasOwnProperty('t');\n } else {\n return false;\n }\n }\n\n function tokenHasChildren(tok: PandocToken) {\n return tok !== null && typeof tok === 'object' && Array.isArray(tok.c);\n }\n\n function mapValue(val: any): any {\n if (isToken(val)) {\n return mapToken(val);\n } else if (Array.isArray(val)) {\n return val.map(mapValue);\n } else {\n return val;\n }\n }\n\n function mapToken(tok: PandocToken): PandocToken {\n const mappedTok = f(tok);\n if (tokenHasChildren(mappedTok)) {\n mappedTok.c = mappedTok.c.map(mapValue);\n }\n return mappedTok;\n }\n\n return tokens.map(mapToken);\n}\n\nexport function tokenTextEscaped(t: PandocToken) {\n return t.c.replace(/\\\\/g, `\\\\\\\\`);\n}\n\n// sort marks by priority (in descending order)\nexport function marksByPriority(marks: Mark[], markWriters: { [key: string]: PandocMarkWriter }) {\n return marks.sort((a: Mark, b: Mark) => {\n const aPriority = markWriters[a.type.name].priority;\n const bPriority = markWriters[b.type.name].priority;\n if (aPriority < bPriority) {\n return 1;\n } else if (bPriority < aPriority) {\n return -1;\n } else {\n return 0;\n }\n });\n}\n","/*\n * quote.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport const kQuoteType = 0;\nexport const kQuoteChildren = 1;\n\nexport enum QuoteType {\n SingleQuote = 'SingleQuote',\n DoubleQuote = 'DoubleQuote',\n}\n\nexport function quotesForType(type: QuoteType) {\n const dblQuote = type === QuoteType.DoubleQuote;\n return {\n begin: dblQuote ? '“' : '‘',\n end: dblQuote ? '”' : '’',\n };\n}\n\n// create regexs for removing quotes\nconst kSingleQuotes = quotesForType(QuoteType.SingleQuote);\nconst kSingleQuoteRegEx = new RegExp(`[${kSingleQuotes.begin}${kSingleQuotes.end}]`, 'g');\nconst kDoubleQuotes = quotesForType(QuoteType.DoubleQuote);\nconst kDoubleQuoteRegEx = new RegExp(`[${kDoubleQuotes.begin}${kDoubleQuotes.end}]`, 'g');\n\nexport function fancyQuotesToSimple(text: string) {\n return text.replace(kSingleQuoteRegEx, \"'\").replace(kDoubleQuoteRegEx, '\"');\n}\n","/*\n * math.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState } from 'prosemirror-state';\n\nimport { EditorUI } from './ui';\nimport { PandocToken } from './pandoc';\nimport { markIsActive, getMarkAttrs } from './mark';\n\nexport const kMathType = 0;\nexport const kMathContent = 1;\n\n// additional field we stick into the AST for quarto crossref ids\nexport const kMathId = 2;\n\nexport enum MathType {\n Inline = 'InlineMath',\n Display = 'DisplayMath',\n}\n\nexport interface EditorMath {\n typeset: (el: HTMLElement, math: string, priority: boolean) => Promise<boolean>;\n}\n\nexport function editorMath(ui: EditorUI): EditorMath {\n // return a promise that will typeset this node's math (including retrying as long as is\n // required if the element is not yet connected to the DOM)\n return {\n typeset: (el: HTMLElement, math: string, priority: boolean): Promise<boolean> => {\n return new Promise(resolve => {\n // regular typeset if we are already connected\n if (el.isConnected) {\n ui.math.typeset!(el, math, priority).then(resolve);\n } else {\n // otherwise wait 100ms then retry\n const timerId = setInterval(() => {\n if (el.isConnected) {\n clearInterval(timerId);\n ui.math.typeset!(el, math, priority).then(resolve);\n }\n }, 100);\n }\n });\n },\n };\n}\n\nexport function delimiterForType(type: string) {\n if (type === MathType.Inline) {\n return '$';\n } else {\n return '$$';\n }\n}\n\nexport function stringifyMath(tok: PandocToken) {\n const delimter = delimiterForType(tok.c[kMathType].t);\n return delimter + tok.c[kMathContent] + delimter;\n}\n\nexport function mathTypeIsActive(state: EditorState, type: MathType) {\n const schema = state.schema;\n return (\n markIsActive(state, schema.marks.math) &&\n getMarkAttrs(state.doc, state.selection, schema.marks.math).type === type\n );\n}\n\n","/*\n * mark.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Mark, MarkSpec, MarkType, ResolvedPos, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorState, Selection, Transaction } from 'prosemirror-state';\n\nimport { PandocTokenReader, PandocMarkWriterFn, PandocInlineHTMLReaderFn, PandocTokensFilterFn } from './pandoc';\nimport { mergedTextNodes } from './text';\nimport { findChildrenByMark } from 'prosemirror-utils';\nimport { MarkTransaction } from './transaction';\n\nexport interface PandocMark {\n readonly name: string;\n readonly spec: MarkSpec;\n readonly noInputRules?: boolean;\n readonly noSpelling?: boolean;\n readonly pandoc: {\n readonly readers: readonly PandocTokenReader[];\n readonly inlineHTMLReader?: PandocInlineHTMLReaderFn;\n readonly tokensFilter?: PandocTokensFilterFn;\n readonly writer: {\n priority: number;\n write: PandocMarkWriterFn;\n };\n };\n}\n\nexport function markIsActive(context: EditorState | Transaction, type: MarkType) {\n const { from, $from, to, empty } = context.selection;\n\n if (empty) {\n return type && !!type.isInSet(context.storedMarks || $from.marks());\n }\n\n return !!context.doc.rangeHasMark(from, to, type);\n}\n\nexport function getMarkAttrs(doc: ProsemirrorNode, range: { from: number; to: number }, type: MarkType) {\n const { from, to } = range;\n let marks: Mark[] = [];\n\n doc.nodesBetween(from, to, node => {\n marks = [...marks, ...node.marks];\n });\n\n const mark = marks.find(markItem => markItem.type.name === type.name);\n\n if (mark) {\n return mark.attrs;\n }\n\n return {};\n}\n\nexport function getMarkRange($pos?: ResolvedPos, type?: MarkType) {\n if (!$pos || !type) {\n return false;\n }\n\n const start = $pos.parent.childAfter($pos.parentOffset);\n\n if (!start.node) {\n return false;\n }\n\n const link = start.node.marks.find((mark: Mark) => mark.type === type);\n if (!link) {\n return false;\n }\n\n let startIndex = $pos.index();\n let startPos = $pos.start() + start.offset;\n let endIndex = startIndex + 1;\n let endPos = startPos + start.node.nodeSize;\n\n while (startIndex > 0 && link.isInSet($pos.parent.child(startIndex - 1).marks)) {\n startIndex -= 1;\n startPos -= $pos.parent.child(startIndex).nodeSize;\n }\n\n while (endIndex < $pos.parent.childCount && link.isInSet($pos.parent.child(endIndex).marks)) {\n endPos += $pos.parent.child(endIndex).nodeSize;\n endIndex += 1;\n }\n\n return { from: startPos, to: endPos };\n}\n\nexport function getSelectionMarkRange(selection: Selection, markType: MarkType): { from: number; to: number } {\n let range: { from: number; to: number };\n if (selection.empty) {\n range = getMarkRange(selection.$head, markType) as { from: number; to: number };\n } else {\n range = { from: selection.from, to: selection.to };\n }\n return range;\n}\n\nexport function removeInvalidatedMarks(\n tr: MarkTransaction,\n node: ProsemirrorNode,\n pos: number,\n re: RegExp,\n markType: MarkType,\n) {\n re.lastIndex = 0;\n const markedNodes = findChildrenByMark(node, markType, true);\n markedNodes.forEach(markedNode => {\n const from = pos + 1 + markedNode.pos;\n const markedRange = getMarkRange(tr.doc.resolve(from), markType);\n if (markedRange) {\n const text = tr.doc.textBetween(markedRange.from, markedRange.to);\n if (!text.match(re)) {\n tr.removeMark(markedRange.from, markedRange.to, markType);\n tr.removeStoredMark(markType);\n }\n }\n });\n re.lastIndex = 0;\n}\n\nexport function splitInvalidatedMarks(\n tr: MarkTransaction,\n node: ProsemirrorNode,\n pos: number,\n validLength: (text: string) => number,\n markType: MarkType,\n removeMark?: (from: number, to: number) => void,\n) {\n const hasMarkType = (nd: ProsemirrorNode) => markType.isInSet(nd.marks);\n const markedNodes = findChildrenByMark(node, markType, true);\n\n const remove = (from: number, to: number, type: MarkType) => {\n if (removeMark) {\n removeMark(from, to);\n } else {\n tr.removeMark(from, to, type);\n }\n };\n\n markedNodes.forEach(markedNode => {\n const mark = hasMarkType(markedNode.node);\n if (mark) {\n const from = pos + 1 + markedNode.pos;\n const markRange = getMarkRange(tr.doc.resolve(from), markType);\n if (markRange) {\n const text = tr.doc.textBetween(markRange.from, markRange.to);\n\n // Trim any leading space and count how much we trimmed\n const trimmedText = text.trimStart();\n const countSpace = text.length - trimmedText.length;\n\n // Remove the mark from any trimmed space at the start\n if (countSpace > 0) {\n remove(markRange.from, markRange.from + countSpace, markType);\n }\n\n // find the valid length of the text and remove the mark from \n // anything after the end of the valid length\n const length = validLength(trimmedText);\n if (length > -1 && length !== text.length) {\n remove(markRange.from + length + countSpace, markRange.to, markType);\n }\n }\n }\n });\n}\n\nexport function detectAndApplyMarks(\n tr: MarkTransaction,\n node: ProsemirrorNode,\n pos: number,\n re: RegExp,\n markType: MarkType,\n attrs: (match: RegExpMatchArray) => {},\n filter?: (from: number, to: number) => boolean,\n text?: (match: RegExpMatchArray) => string,\n) {\n re.lastIndex = 0;\n const textNodes = mergedTextNodes(node, (_node: ProsemirrorNode, _pos: number, parentNode: ProsemirrorNode) =>\n parentNode.type.allowsMarkType(markType),\n );\n textNodes.forEach(textNode => {\n re.lastIndex = 0;\n let match = re.exec(textNode.text);\n while (match !== null) {\n const refText = text ? text(match) : match[0];\n const from = pos + 1 + textNode.pos + match.index + (match[0].length - refText.length);\n const to = from + refText.length;\n const range = getMarkRange(tr.doc.resolve(to), markType);\n if (\n (!range || range.from !== from || range.to !== to) &&\n !tr.doc.rangeHasMark(from, to, markType.schema.marks.code)\n ) {\n if (!filter || filter(from, to)) {\n const mark = markType.create(attrs instanceof Function ? attrs(match) : attrs);\n tr.addMark(from, to, mark);\n if (tr.selection.anchor === to) {\n tr.removeStoredMark(mark.type);\n }\n }\n }\n match = re.lastIndex !== 0 ? re.exec(textNode.text) : null;\n }\n });\n re.lastIndex = 0;\n}\n","/*\n * text.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nexport interface TextWithPos {\n readonly text: string;\n readonly pos: number;\n}\n\nexport function mergedTextNodes(\n doc: ProsemirrorNode,\n filter?: (node: ProsemirrorNode, pos: number, parentNode: ProsemirrorNode) => boolean,\n): TextWithPos[] {\n const textNodes: TextWithPos[] = [];\n let nodeIndex = 0;\n doc.descendants((node, pos, parentNode) => {\n if (node.isText) {\n // apply filter\n if (filter && !filter(node, pos, parentNode)) {\n return false;\n }\n\n // join existing contiguous range of text nodes or create a new one\n if (textNodes[nodeIndex]) {\n textNodes[nodeIndex] = {\n text: textNodes[nodeIndex].text + node.text,\n pos: textNodes[nodeIndex].pos,\n };\n } else {\n textNodes[nodeIndex] = {\n text: node.text || '',\n pos,\n };\n }\n } else {\n nodeIndex += 1;\n }\n });\n return textNodes;\n}\n\nexport function stripQuotes(text: string) {\n return text.replace(/[\"']/g, '');\n}\n\nexport function equalsIgnoreCase(str1: string, str2: string) {\n if (!str1 && !!str2) {\n return false;\n } else if (!!str1 && !str2) {\n return false;\n } else if (str1 === str2) {\n return true;\n } else {\n return str1.localeCompare(str2, undefined, { sensitivity: 'accent' }) === 0;\n }\n}\n","/*\n * code.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Plugin, PluginKey } from 'prosemirror-state';\n\nimport { CodeViewOptions, canInsertNodeAtPos } from './node';\nimport { ResolvedPos, Slice, Fragment } from 'prosemirror-model';\n\nexport const kCodeAttr = 0;\nexport const kCodeText = 1;\n\nexport function codeNodeSpec() {\n return {\n content: 'text*',\n group: 'block',\n marks: '',\n code: true,\n defining: true,\n isolating: true,\n };\n}\n\nexport function codeViewClipboardPlugin(codeViews: { [key: string]: CodeViewOptions }) {\n return new Plugin({\n key: new PluginKey('code-view-clipboard'),\n props: {\n clipboardTextParser: (text: string, $context: ResolvedPos): any => {\n // see if any of the code views want to handle this text\n for (const codeViewType of Object.keys(codeViews)) {\n const codeView = codeViews[codeViewType];\n if (codeView.createFromPastePattern && codeView.createFromPastePattern.test(text)) {\n const schema = $context.node().type.schema;\n const nodeType = schema.nodes[codeViewType];\n if (canInsertNodeAtPos($context, nodeType)) {\n const textNode = schema.text(text);\n const codeNode = nodeType.createAndFill({}, textNode);\n return new Slice(Fragment.from(codeNode), 0, 0);\n }\n }\n }\n return null;\n },\n },\n });\n}\n","/*\n * node.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, NodeSpec, NodeType, ResolvedPos } from 'prosemirror-model';\nimport { EditorState, Selection, NodeSelection } from 'prosemirror-state';\nimport {\n findParentNode,\n findSelectedNodeOfType,\n ContentNodeWithPos,\n NodeWithPos,\n findParentNodeOfType,\n findChildrenByType,\n findChildren,\n findParentNodeOfTypeClosestToPos,\n} from 'prosemirror-utils';\n\nimport { EditorView } from 'prosemirror-view';\n\nimport {\n PandocTokenReader,\n PandocNodeWriterFn,\n PandocPreprocessorFn,\n PandocBlockReaderFn,\n PandocInlineHTMLReaderFn,\n PandocTokensFilterFn,\n} from './pandoc';\nimport { PandocBlockCapsuleFilter } from './pandoc_capsule';\n\nimport { AttrEditOptions } from './attr_edit';\nimport { CommandFn } from './command';\n\nexport interface PandocNode {\n readonly name: string;\n readonly spec: NodeSpec;\n readonly code_view?: CodeViewOptions;\n readonly attr_edit?: () => AttrEditOptions | null;\n readonly pandoc: {\n readonly readers?: readonly PandocTokenReader[];\n readonly writer?: PandocNodeWriterFn;\n readonly preprocessor?: PandocPreprocessorFn;\n readonly tokensFilter?: PandocTokensFilterFn;\n readonly blockReader?: PandocBlockReaderFn;\n readonly inlineHTMLReader?: PandocInlineHTMLReaderFn;\n readonly blockCapsuleFilter?: PandocBlockCapsuleFilter;\n };\n}\n\nexport interface CodeViewOptions {\n lang: (node: ProsemirrorNode, content: string) => string | null;\n attrEditFn?: CommandFn;\n createFromPastePattern?: RegExp;\n classes?: string[];\n borderColorClass?: string;\n firstLineMeta?: boolean;\n lineNumbers?: boolean;\n bookdownTheorems?: boolean;\n lineNumberFormatter?: (lineNumber: number, lineCount?: number, line?: string) => string;\n}\n\nexport type NodeTraversalFn = (\n node: Node,\n pos: number,\n parent: Node,\n index: number,\n) => boolean | void | null | undefined;\n\nexport function findTopLevelBodyNodes(doc: ProsemirrorNode, predicate: (node: ProsemirrorNode) => boolean) {\n const body = findChildrenByType(doc, doc.type.schema.nodes.body, false)[0];\n const offset = body.pos + 1;\n const nodes = findChildren(body.node, predicate, false);\n return nodes.map(value => ({ ...value, pos: value.pos + offset }));\n}\n\nexport function findNodeOfTypeInSelection(selection: Selection, type: NodeType): ContentNodeWithPos | undefined {\n return findSelectedNodeOfType(type)(selection) || findParentNode((n: ProsemirrorNode) => n.type === type)(selection);\n}\n\nexport function firstNode(parent: NodeWithPos, predicate: (node: ProsemirrorNode) => boolean) {\n let foundNode: NodeWithPos | undefined;\n parent.node.descendants((node, pos) => {\n if (!foundNode) {\n if (predicate(node)) {\n foundNode = {\n node,\n pos: parent.pos + 1 + pos,\n };\n return false;\n }\n } else {\n return false;\n }\n });\n return foundNode;\n}\n\nexport function lastNode(parent: NodeWithPos, predicate: (node: ProsemirrorNode) => boolean) {\n let last: NodeWithPos | undefined;\n parent.node.descendants((node, pos) => {\n if (predicate(node)) {\n last = {\n node,\n pos: parent.pos + 1 + pos,\n };\n }\n });\n return last;\n}\n\nexport function nodeIsActive(state: EditorState, type: NodeType, attrs = {}) {\n const predicate = (n: ProsemirrorNode) => n.type === type;\n const node = findSelectedNodeOfType(type)(state.selection) || findParentNode(predicate)(state.selection);\n\n if (!Object.keys(attrs).length || !node) {\n return !!node;\n }\n\n return node.node.hasMarkup(type, attrs);\n}\n\nexport function canInsertNode(context: EditorState | Selection, nodeType: NodeType) {\n const selection = asSelection(context);\n const $from = selection.$from;\n return canInsertNodeAtPos($from, nodeType);\n}\n\nexport function canInsertNodeAtPos($pos: ResolvedPos, nodeType: NodeType) {\n for (let d = $pos.depth; d >= 0; d--) {\n const index = $pos.index(d);\n if ($pos.node(d).canReplaceWith(index, index, nodeType)) {\n return true;\n }\n }\n return false;\n}\n\nexport function canInsertTextNode(context: EditorState | Selection) {\n const selection = asSelection(context);\n return canInsertNode(selection, selection.$head.parent.type.schema.nodes.text);\n}\n\nexport function insertAndSelectNode(view: EditorView, node: ProsemirrorNode) {\n // create new transaction\n const tr = view.state.tr;\n\n // insert the node over the existing selection\n tr.ensureMarks(node.marks);\n tr.replaceSelectionWith(node);\n\n // set selection to inserted node (or don't if our selection calculate was off,\n // as can happen when we insert into a list bullet)\n const selectionPos = tr.doc.resolve(tr.mapping.map(view.state.selection.from, -1));\n const selectionNode = tr.doc.nodeAt(selectionPos.pos);\n if (selectionNode && selectionNode.type === node.type) {\n tr.setSelection(new NodeSelection(selectionPos));\n }\n\n // dispatch transaction\n view.dispatch(tr);\n}\n\nexport function editingRootNode(selection: Selection) {\n const schema = selection.$head.node().type.schema;\n return findParentNodeOfType(schema.nodes.body)(selection) || findParentNodeOfType(schema.nodes.note)(selection);\n}\n\nexport function editingRootNodeClosestToPos($pos: ResolvedPos) {\n const schema = $pos.node().type.schema;\n return (\n findParentNodeOfTypeClosestToPos($pos, schema.nodes.body) ||\n findParentNodeOfTypeClosestToPos($pos, schema.nodes.note)\n );\n}\n\nexport function editingRootScrollContainerElement(view: EditorView) {\n const editingNode = editingRootNode(view.state.selection);\n if (editingNode) {\n const editingEl = view.domAtPos(editingNode.pos + 1).node;\n return editingEl.parentElement;\n } else {\n return undefined;\n }\n}\n\nfunction asSelection(context: EditorState | Selection) {\n return context instanceof EditorState ? context.selection : context;\n}\n","/*\n * link.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { findChildren, findChildrenByType } from 'prosemirror-utils';\n\nexport const kLinkTargetUrl = 0;\nexport const kLinkTargetTitle = 1;\n\nexport const kLinkAttr = 0;\nexport const kLinkChildren = 1;\nexport const kLinkTarget = 2;\n\nexport enum LinkType {\n URL = 0,\n Heading = 1,\n ID = 2,\n}\n\nexport interface LinkCapabilities {\n headings: boolean;\n attributes: boolean;\n text: boolean;\n}\n\nexport interface LinkTargets {\n readonly ids: string[];\n readonly headings: LinkHeadingTarget[];\n}\n\nexport interface LinkHeadingTarget {\n readonly level: number;\n readonly text: string;\n}\n\nexport async function linkTargets(doc: ProsemirrorNode) {\n const ids = findChildren(doc, node => !!node.attrs.id).map(value => value.node.attrs.id);\n\n const headings = findChildrenByType(doc, doc.type.schema.nodes.heading).map(heading => ({\n level: heading.node.attrs.level,\n text: heading.node.textContent,\n }));\n\n return {\n ids,\n headings,\n };\n}\n","/*\n * html.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema, DOMSerializer, Fragment } from 'prosemirror-model';\n\nexport const kHTMLCommentRegEx = /(?:^|[^`])(<!--([\\s\\S]*?)-->)/;\n\nexport function isHTMLComment(html: string) {\n return !!html.match(kHTMLCommentRegEx);\n}\n\nexport function isSingleLineHTML(html: string) {\n return html.trimRight().split('\\n').length === 1;\n}\n\nexport function asHTMLTag(\n tag: string,\n attribs: { [key: string]: string },\n selfClosing = false,\n noEmptyAttribs = false,\n) {\n const attribsHTML = Object.keys(attribs)\n .filter(name => !noEmptyAttribs || attribs[name])\n .map(name => `${name}=\"${escapeHTMLAttribute(attribs[name])}\"`)\n .join(' ');\n return `<${tag} ${attribsHTML}${selfClosing ? '/' : ''}>`;\n}\n\nexport function escapeHTMLAttribute(value: string) {\n return value\n .replace(/&/g, '&') // must be first replacement\n .replace(/'/g, ''')\n .replace(/\"/g, '"')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n}\n\nexport function nodeToHTML(schema: Schema, node: ProsemirrorNode) {\n return generateHTML(() => DOMSerializer.fromSchema(schema).serializeNode(node));\n}\n\nexport function fragmentToHTML(schema: Schema, fragment: Fragment) {\n return generateHTML(() => DOMSerializer.fromSchema(schema).serializeFragment(fragment));\n}\n\nfunction generateHTML(generator: () => Node | DocumentFragment) {\n const div = document.createElement('div');\n const output = generator();\n div.appendChild(output);\n return div.innerHTML;\n}\n","/*\n * events.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n/**\n * Represents an event type; only a single instance of this should exist per\n * event type (akin to PluginKey) and it should be visible to everyone who wants\n * to subscribe to or emit events of that type. Do not create one of these\n * directly, instead use makeEventType().\n */\nexport interface EventType<TDetail> {\n readonly eventName: string;\n // This field is needed only to prevent TDetail from being ignored by the type\n // checker; if TDetail isn't used, tsc acts as if EventType isn't generic.\n readonly dummy?: TDetail;\n}\n\n/**\n * Type signature of event-handler functions; the TDetail must match with the\n * EventType<TDetail> being subscribed to.\n *\n * (Note that the detail is always optional. I couldn't figure out how to make\n * it mandatory for some event types, forbidden for others, and optional for\n * still others, so it's just optional for everyone.)\n */\nexport type EventHandler<TDetail> = (detail?: TDetail) => void;\n\n/**\n * Generic interface for objects that support eventing.\n *\n * TODO: I don't see a reason why this interface should support both\n * subscription *and* emitting, the latter seems like something private.\n */\nexport interface EditorEvents {\n subscribe<TDetail>(event: EventType<TDetail>, handler: EventHandler<TDetail>): VoidFunction;\n emit<TDetail>(event: EventType<TDetail>, detail?: TDetail): void;\n}\n\n/**\n * Creates a new type of event. Use the TDetail type parameter to indicate the\n * type of data, if any, that event handlers can expect.\n */\nexport function makeEventType<TDetail = void>(eventName: string) {\n return { eventName: `panmirror${eventName}` } as EventType<TDetail>;\n}\n\n/**\n * An implementation of EditorEvents, using the DOM event system.\n */\nexport class DOMEditorEvents implements EditorEvents {\n private readonly el: HTMLElement;\n\n constructor(el: HTMLElement) {\n this.el = el;\n }\n\n public emit<TDetail>(eventType: EventType<TDetail>, detail?: TDetail) {\n // Note: CustomEvent requires polyfill for IE, see\n // https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent\n const event = new CustomEvent(eventType.eventName, { detail });\n return this.el.dispatchEvent(event);\n }\n\n public subscribe<TDetail>(eventType: EventType<TDetail>, handler: EventHandler<TDetail>) {\n const listener = function(this: any, evt: Event) {\n const detail: TDetail | undefined = (evt as CustomEvent).detail;\n handler.call(this, detail);\n };\n this.el.addEventListener(eventType.eventName, listener);\n return () => {\n this.el.removeEventListener(eventType.eventName, listener);\n };\n }\n}\n","/*\n * event-types.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Transaction } from 'prosemirror-state';\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { makeEventType } from './events';\nimport { Navigation } from './navigation';\n\nexport const UpdateEvent = makeEventType('Update');\nexport const OutlineChangeEvent = makeEventType('OutlineChange');\nexport const StateChangeEvent = makeEventType('StateChange');\nexport const ResizeEvent = makeEventType('Resize');\nexport const LayoutEvent = makeEventType('Layout');\nexport const ScrollEvent = makeEventType('Scroll');\nexport const BlurEvent = makeEventType('Blur');\nexport const FocusEvent = makeEventType<ProsemirrorNode>('Focus');\nexport const DispatchEvent = makeEventType<Transaction>('Dispatch');\nexport const NavigateEvent = makeEventType<Navigation>('Navigate');\n","/*\n * pandoc_format.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { PandocServer, PandocExtensions } from './pandoc';\nimport { EditorFormat, kHugoDocType } from './format';\nimport { firstYamlBlock, yamlMetadataNodes } from './yaml';\nimport { findValue } from './object';\n\nexport const kMarkdownFormat = 'markdown';\nexport const kMarkdownPhpextraFormat = 'markdown_phpextra';\nexport const kMarkdownGithubFormat = 'markdown_github';\nexport const kMarkdownMmdFormat = 'markdown_mmd';\nexport const kMarkdownStrictFormat = 'markdown_strict';\nexport const kGfmFormat = 'gfm';\nexport const kCommonmarkFormat = 'commonmark';\nexport const kCommonmarkXFormat = 'commonmark_x';\n\nexport interface PandocFormat {\n mode: string;\n baseName: string;\n fullName: string;\n extensions: PandocExtensions;\n warnings: PandocFormatWarnings;\n}\n\nexport interface PandocFormatWarnings {\n invalidFormat: string;\n invalidOptions: string[];\n}\n\nexport interface PandocFormatConfig {\n mode?: string;\n extensions?: string;\n rmdExtensions?: string;\n wrap?: string;\n doctypes?: string[];\n references_location?: string;\n references_prefix?: string;\n canonical?: boolean;\n}\n\nexport function matchPandocFormatComment(code: string) {\n const magicCommentRegEx = /^<!--\\s+-\\*-([\\s\\S]*?)-\\*-\\s+-->\\s*$/m;\n return code.match(magicCommentRegEx);\n}\n\nexport function pandocFormatConfigFromDoc(doc: ProsemirrorNode, isRmd: boolean) {\n return pandocFormatConfigFromYamlInDoc(doc, isRmd) || pandocFormatConfigFromCommentInDoc(doc) || {};\n}\n\nexport function pandocFormatConfigFromCode(code: string, isRmd: boolean): PandocFormatConfig {\n return pandocFormatConfigFromYamlInCode(code, isRmd) || pandocFormatConfigFromCommentInCode(code) || {};\n}\n\nfunction pandocFormatConfigFromYamlInCode(code: string, isRmd: boolean): PandocFormatConfig | null {\n // get the first yaml block in the file\n const yaml = firstYamlBlock(code);\n\n // did we find yaml?\n if (yaml) {\n // see if we have any md_extensions defined\n let mdExtensions : string | undefined = isRmd ? findValue('md_extensions', yaml?.output) : undefined;\n if (!mdExtensions) {\n // look for quarto 'from'\n const from = findValue('from', yaml);\n if (from) {\n const fromStr = String(from);\n const extensions = fromStr.match(/^\\w+([+-][\\w+-]+)$/);\n if (extensions) {\n mdExtensions = extensions[1];\n }\n }\n }\n\n // see if we have any markdown options defined\n let yamlFormatConfig: PandocFormatConfig | undefined;\n const yamlMarkdownOptions = yaml?.editor_options?.markdown;\n if (yamlMarkdownOptions instanceof Object) {\n yamlFormatConfig = readPandocFormatConfig(yamlMarkdownOptions);\n }\n\n // combine and return\n if (mdExtensions || yamlFormatConfig) {\n const formatConfig: PandocFormatConfig = yamlFormatConfig ? yamlFormatConfig : {};\n if (mdExtensions) {\n formatConfig.extensions = mdExtensions + (formatConfig.extensions || '');\n }\n return formatConfig;\n } else {\n return null;\n }\n } else {\n return null;\n }\n}\n\nfunction pandocFormatConfigFromYamlInDoc(doc: ProsemirrorNode, isRmd: boolean): PandocFormatConfig | null {\n const yamlNodes = yamlMetadataNodes(doc);\n if (yamlNodes.length > 0) {\n return pandocFormatConfigFromYamlInCode(yamlNodes[0].node.textContent, isRmd);\n } else {\n return null;\n }\n}\n\nfunction pandocFormatConfigFromCommentInCode(code: string): PandocFormatConfig | null {\n const keyValueRegEx = /^([^:]+):\\s*(.*)$/;\n const match = matchPandocFormatComment(code);\n if (match) {\n const comment = match[1];\n // split into semicolons\n const fields = comment.split(/\\s*;\\s/).map(field => field.trim());\n const variables: { [key: string]: string } = {};\n fields.forEach(field => {\n const keyValueMatch = field.match(keyValueRegEx);\n if (keyValueMatch) {\n variables[keyValueMatch[1].trim()] = keyValueMatch[2].trim();\n }\n });\n return readPandocFormatConfig(variables);\n } else {\n return null;\n }\n}\n\nfunction pandocFormatConfigFromCommentInDoc(doc: ProsemirrorNode): PandocFormatConfig | null {\n let config: PandocFormatConfig | null = null;\n let foundFirstRawInline = false;\n doc.descendants((node, pos) => {\n // don't search once we've found our target\n if (foundFirstRawInline) {\n return false;\n }\n\n // if it's a text node with a raw-html then scan it for the format comment\n const schema = doc.type.schema;\n if (\n node.isText &&\n schema.marks.raw_html_comment &&\n schema.marks.raw_html_comment.isInSet(node.marks) &&\n node.attrs.format\n ) {\n foundFirstRawInline = true;\n config = pandocFormatConfigFromCommentInCode(node.textContent);\n return false;\n } else {\n return true;\n }\n });\n return config;\n}\n\nfunction readPandocFormatConfig(source: { [key: string]: any }) {\n const asString = (obj: any): string => {\n if (typeof obj === 'string') {\n return obj;\n } else if (obj) {\n return obj.toString();\n } else {\n return '';\n }\n };\n\n const asBoolean = (obj: any) => {\n if (typeof obj === 'boolean') {\n return obj;\n } else {\n const str = asString(obj).toLowerCase();\n return str === 'true' || str === '1';\n }\n };\n\n const readWrap = () => {\n const wrap = source.wrap || source.wrap_column || source['fill-column'];\n if (wrap) {\n return asString(wrap);\n } else {\n return undefined;\n }\n };\n\n const formatConfig: PandocFormatConfig = {};\n if (source.mode) {\n formatConfig.mode = asString(source.mode);\n }\n if (source.extensions) {\n formatConfig.extensions = asString(source.extensions);\n }\n if (source.rmd_extensions) {\n formatConfig.rmdExtensions = asString(source.rmd_extensions);\n }\n formatConfig.wrap = readWrap();\n if (source.doctype) {\n formatConfig.doctypes = asString(source.doctype)\n .split(',')\n .map(str => str.trim());\n }\n if (source.references) {\n if (typeof source.references === 'string') {\n formatConfig.references_location = source.references;\n } else {\n formatConfig.references_location = source.references.location;\n formatConfig.references_prefix = source.references.prefix;\n }\n }\n if (source.canonical) {\n formatConfig.canonical = asBoolean(source.canonical);\n }\n return formatConfig;\n}\n\nexport async function resolvePandocFormat(pandoc: PandocServer, format: EditorFormat): Promise<PandocFormat> {\n // additional markdown variants we support\n const kMarkdownVariants: { [key: string]: string[] } = {\n [kCommonmarkFormat]: commonmarkExtensions(),\n [kCommonmarkXFormat]: commonmarkXExtensions(),\n [kGfmFormat]: gfmExtensions(),\n goldmark: goldmarkExtensions(format),\n blackfriday: blackfridayExtensions(format),\n };\n\n // setup warnings\n const warnings: PandocFormatWarnings = { invalidFormat: '', invalidOptions: [] };\n\n // alias options and basename\n let options = format.pandocExtensions;\n let baseName = format.pandocMode;\n\n // validate the base format (fall back to markdown if it's not known)\n if (\n ![\n kMarkdownFormat,\n kMarkdownPhpextraFormat,\n kMarkdownGithubFormat,\n kMarkdownMmdFormat,\n kMarkdownStrictFormat,\n kGfmFormat,\n kCommonmarkFormat,\n kCommonmarkXFormat\n ]\n .concat(Object.keys(kMarkdownVariants))\n .includes(baseName)\n ) {\n warnings.invalidFormat = baseName;\n baseName = 'markdown';\n }\n\n // format options we will be building\n let formatOptions: string;\n\n // if we are using a variant then get it's base options and merge with user options\n if (kMarkdownVariants[baseName]) {\n const variant = kMarkdownVariants[baseName];\n options = variant.map(option => `${option}`).join('') + options;\n baseName = 'markdown_strict';\n }\n\n // query for format options\n formatOptions = await pandoc.listExtensions(baseName);\n\n // active pandoc extensions\n const pandocExtensions: { [key: string]: boolean } = {};\n\n // first parse extensions for format\n parseExtensions(formatOptions).forEach(option => {\n pandocExtensions[option.name] = option.enabled;\n });\n\n // now parse extensions for user options (validate and build format name)\n const validOptionNames = parseExtensions(formatOptions).map(option => option.name);\n\n let fullName = baseName;\n parseExtensions(options).forEach(option => {\n // validate that the option is valid\n if (validOptionNames.includes(option.name)) {\n // add option\n fullName += (option.enabled ? '+' : '-') + option.name;\n pandocExtensions[option.name] = option.enabled;\n } else {\n warnings.invalidOptions.push(option.name);\n }\n });\n\n // return format name, enabled extensiosn, and warnings\n return {\n mode: format.pandocMode,\n baseName,\n fullName,\n extensions: (pandocExtensions as unknown) as PandocExtensions,\n warnings,\n };\n}\n\nfunction parseExtensions(options: string) {\n // remove any linebreaks\n options = options.split('\\n').join();\n\n // parse into separate entries\n const extensions: Array<{ name: string; enabled: boolean }> = [];\n const re = /([+-])([a-z_]+)/g;\n let match = re.exec(options);\n while (match) {\n extensions.push({ name: match[2], enabled: match[1] === '+' });\n match = re.exec(options);\n }\n\n return extensions;\n}\n\nexport function pandocFormatWith(format: string, prepend: string, append: string) {\n const split = splitPandocFormatString(format);\n return `${split.format}${prepend}${split.options}${append}`;\n}\n\nexport function splitPandocFormatString(format: string) {\n // split out base format from options\n let optionsPos = format.indexOf('-');\n if (optionsPos === -1) {\n optionsPos = format.indexOf('+');\n }\n const base = optionsPos === -1 ? format : format.substr(0, optionsPos);\n const options = optionsPos === -1 ? '' : format.substr(optionsPos);\n return {\n format: base,\n options,\n };\n}\n\nexport function hasFencedCodeBlocks(pandocExtensions: PandocExtensions) {\n return pandocExtensions.backtick_code_blocks || pandocExtensions.fenced_code_blocks;\n}\n\n// e.g. [My Heading] to link to ## My Heading\nexport function hasShortcutHeadingLinks(pandocExtensions: PandocExtensions) {\n return pandocExtensions.implicit_header_references && pandocExtensions.shortcut_reference_links;\n}\n\nfunction commonmarkExtensions(rawHTML = true) {\n const extensions = [\n rawHTML ? '+raw_html' : '-raw_html',\n '+all_symbols_escapable',\n '+backtick_code_blocks',\n '+fenced_code_blocks',\n '+space_in_atx_header',\n '+intraword_underscores',\n '+lists_without_preceding_blankline',\n '+shortcut_reference_links',\n ];\n return extensions;\n}\n\n// https://github.com/jgm/pandoc/commit/0aed9dd589189a9bbe5cae99e0e024e2d4a92c36\nfunction commonmarkXExtensions() {\n const extensions = [\n '+pipe_tables',\n '+raw_html',\n '+auto_identifiers',\n '+strikeout',\n '+task_lists',\n '+emoji',\n '+raw_tex',\n '+smart',\n '+tex_math_dollars',\n '+superscript',\n '+subscript',\n '+definition_lists',\n '+footnotes',\n '+fancy_lists',\n '+fenced_divs',\n '+bracketed_spans',\n '+raw_attribute',\n '+implicit_header_references',\n // '+attributes' (not yet)\n ];\n return extensions;\n}\n\nfunction gfmExtensions() {\n const extensions = [\n ...commonmarkExtensions(),\n '+auto_identifiers',\n '+autolink_bare_uris',\n '+emoji',\n '+gfm_auto_identifiers',\n '+pipe_tables',\n '+strikeout',\n '+task_lists',\n '+tex_math_dollars',\n '+footnotes'\n ];\n return extensions;\n}\n\n// https://gohugo.io/getting-started/configuration-markup/#goldmark\n// https://github.com/yuin/goldmark/#html-renderer-options\nfunction goldmarkExtensions(format: EditorFormat) {\n const extensions = [\n // start with commonmark\n ...commonmarkExtensions(false),\n\n // adds most of gfm\n '+pipe_tables',\n '+strikeout',\n '+autolink_bare_uris',\n '+task_lists',\n '+backtick_code_blocks',\n\n // plus some extras\n '+definition_lists',\n '+footnotes',\n '+smart',\n\n // hugo preprocessor supports yaml metadata\n '+yaml_metadata_block',\n ];\n\n if (includeTexMathDollars(format)) {\n extensions.push('+tex_math_dollars');\n }\n\n return extensions;\n}\n\n// https://github.com/russross/blackfriday/tree/v2#extensions\nfunction blackfridayExtensions(format: EditorFormat) {\n const extensions = [\n '+intraword_underscores',\n '+pipe_tables',\n '+backtick_code_blocks',\n '+definition_lists',\n '+footnotes',\n '+autolink_bare_uris',\n '+strikeout',\n '+smart',\n '+yaml_metadata_block',\n ];\n\n if (includeTexMathDollars(format)) {\n extensions.push('+tex_math_dollars');\n }\n\n return extensions;\n}\n\nfunction includeTexMathDollars(format: EditorFormat) {\n // hugo users often sort out some way to include math so we enable it for hugo\n return format.docTypes.includes(kHugoDocType) || format.rmdExtensions.blogdownMathInCode;\n}\n","/*\n * yaml.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { NodeWithPos } from 'prosemirror-utils';\nimport { EditorView } from 'prosemirror-view';\nimport { EditorState } from 'prosemirror-state';\n\nimport yaml from 'js-yaml';\n\nimport { findTopLevelBodyNodes } from './node';\nimport { logException } from './log';\n\nexport const kYamlMetadataTitleRegex = /\\ntitle:(.*)\\n/;\n\n// return yaml front matter (w/o enclosing --)\nexport function yamlFrontMatter(doc: ProsemirrorNode) {\n const firstYaml = firstYamlNode(doc);\n if (firstYaml) {\n return stripYamlDelimeters(firstYaml.node.textContent);\n } else {\n return '';\n }\n}\n\n// set yaml front matter (w/o enclosing ---)\nexport function applyYamlFrontMatter(view: EditorView, yamlText: string) {\n const schema = view.state.schema;\n const updatedYaml = `---\\n${yamlText}---`;\n const updatedYamlNode = schema.nodes.yaml_metadata.createAndFill({}, schema.text(updatedYaml));\n const tr = view.state.tr;\n const firstYaml = firstYamlNode(view.state.doc);\n if (firstYaml) {\n tr.replaceRangeWith(firstYaml.pos, firstYaml.pos + firstYaml.node.nodeSize, updatedYamlNode);\n } else {\n tr.insert(1, updatedYamlNode);\n }\n view.dispatch(tr);\n}\n\nexport function yamlMetadataNodes(doc: ProsemirrorNode) {\n return findTopLevelBodyNodes(doc, isYamlMetadataNode);\n}\n\nexport function isYamlMetadataNode(node: ProsemirrorNode) {\n return node.type === node.type.schema.nodes.yaml_metadata;\n}\n\nexport function titleFromState(state: EditorState) {\n const yamlNodes = yamlMetadataNodes(state.doc);\n for (const yamlNode of yamlNodes) {\n const title = titleFromYamlMetadataNode(yamlNode.node);\n if (title) {\n return title;\n }\n }\n return '';\n}\n\nexport function titleFromYamlMetadataNode(node: ProsemirrorNode) {\n const titleMatch = node.textContent.match(kYamlMetadataTitleRegex);\n if (titleMatch) {\n let title = titleMatch[1].trim();\n title = title.replace(/^[\"']|[\"']$/g, '');\n title = title.replace(/\\\\\"/g, '\"');\n title = title.replace(/''/g, \"'\");\n return title;\n } else {\n return null;\n }\n}\n\nexport function valueFromYamlText(name: string, yamlText: string) {\n // Must start and end with either a new line or the start/end of line\n const yamlMetadataNameValueRegex = new RegExp(`(?:\\\\n|^)${name}:(.*)(?:\\\\n|$)`);\n\n // Find the name and value\n const valueMatch = yamlText.match(yamlMetadataNameValueRegex);\n if (valueMatch) {\n // Read the matched value\n const valueStr = valueMatch[1].trim();\n\n // Parse the value (could be string, array, etc...)\n const value = parseYaml(valueStr);\n return value;\n } else {\n return null;\n }\n}\n\nconst kFirstYamlBlockRegex = /\\s*---[ \\t]*\\n(?![ \\t]*\\n)([\\W\\w]*?)\\n[\\t >]*(?:---|\\.\\.\\.)[ \\t]*/m;\n\nexport function firstYamlBlock(code: string): { [key: string]: any } | null {\n const match = code.match(kFirstYamlBlockRegex);\n if (match && match.index === 0) {\n const yamlCode = match[1];\n const yamlParsed = parseYaml(yamlCode);\n if (typeof yamlParsed === 'object') {\n return yamlParsed;\n } else {\n return null;\n }\n } else {\n return null;\n }\n}\n\nexport function parseYaml(yamlCode: string) : unknown {\n try {\n \n const yamlParsed = yaml.load(yamlCode, {\n onWarning: logException,\n });\n return yamlParsed;\n } catch (e) {\n logException(e);\n return null;\n }\n}\n\nexport function toYamlCode(obj: any): string | null {\n try {\n const yamlCode = yaml.dump(obj);\n return yamlCode;\n } catch (e) {\n logException(e);\n return null;\n }\n}\n\nexport function stripYamlDelimeters(yamlCode: string) {\n return yamlCode.replace(/^[ \\t-]+\\n/, '').replace(/\\n[ \\t-\\.]+$/, '');\n}\n\nexport interface ParsedYaml {\n yamlCode: string;\n yaml: any;\n node: NodeWithPos;\n}\n\nexport function parseYamlNodes(doc: ProsemirrorNode): ParsedYaml[] {\n const yamlNodes = yamlMetadataNodes(doc);\n\n const parsedYamlNodes = yamlNodes.map<ParsedYaml>(node => {\n const yamlText = node.node.textContent;\n const yamlCode = stripYamlDelimeters(yamlText);\n return { yamlCode, yaml: parseYaml(yamlCode), node };\n });\n return parsedYamlNodes;\n}\n\nfunction firstYamlNode(doc: ProsemirrorNode) {\n const yamlNodes = yamlMetadataNodes(doc);\n if (yamlNodes && yamlNodes.length > 0) {\n return yamlNodes[0];\n } else {\n return '';\n }\n}\n","/*\n * format.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport interface EditorFormat {\n readonly pandocMode: string;\n readonly pandocExtensions: string;\n readonly rmdExtensions: EditorRmdExtensions;\n readonly hugoExtensions: EditorHugoExtensions;\n readonly docTypes: EditorExtendedDocType[];\n}\n\nexport interface EditorRmdExtensions {\n readonly codeChunks?: boolean;\n readonly bookdownXRef?: boolean;\n readonly bookdownXRefUI?: boolean;\n readonly bookdownPart?: boolean;\n readonly blogdownMathInCode?: boolean;\n}\n\nexport interface EditorHugoExtensions {\n readonly shortcodes?: boolean;\n}\n\nexport const kBookdownDocType = 'bookdown';\nexport const kHugoDocType = 'hugo';\nexport const kQuartoDocType = 'quarto';\nexport const kPresentationDocType = 'presentation';\n\nexport type EditorExtendedDocType = 'bookdown' | 'hugo' | 'quarto' | 'presentation';\n","/*\n * object.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport function findValue(key: string, object?: { [key: string]: any }) {\n if (!object) {\n return undefined;\n }\n\n let value;\n\n Object.keys(object).some(k => {\n if (k === key) {\n value = object[k];\n return true;\n }\n if (object[k] && typeof object[k] === 'object') {\n value = findValue(key, object[k]);\n return value !== undefined;\n }\n return false;\n });\n\n return value;\n}\n","/*\n * log.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport function logException(e: Error) {\n // TODO: log exceptions (we don't want to use console.log in production code, so this would\n // utilize some sort of external logging facility)\n // console.log(e);\n}\n","/*\n * basekeys.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport {\n splitBlock,\n liftEmptyBlock,\n createParagraphNear,\n selectNodeBackward,\n joinBackward,\n deleteSelection,\n selectNodeForward,\n joinForward,\n chainCommands,\n} from 'prosemirror-commands';\nimport { undoInputRule } from 'prosemirror-inputrules';\nimport { keymap } from 'prosemirror-keymap';\nimport { EditorState, Transaction, Plugin, Selection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { CommandFn } from './command';\nimport { editingRootNodeClosestToPos, editingRootNode } from './node';\nimport { selectionIsBodyTopLevel } from './selection';\nimport { kPlatformMac } from './platform';\n\nexport enum BaseKey {\n Home = 'Home',\n End = 'End',\n Enter = 'Enter',\n ModEnter = 'Mod-Enter',\n ShiftEnter = 'Shift-Enter',\n Backspace = 'Backspace',\n Delete = 'Delete|Mod-Delete', // Use pipes to register multiple commands\n Tab = 'Tab',\n ShiftTab = 'Shift-Tab',\n ArrowUp = 'Up|ArrowUp',\n ArrowDown = 'Down|ArrowDown',\n ArrowLeft = 'Left|ArrowLeft',\n ArrowRight = 'Right|ArrowRight',\n ModArrowUp = 'Mod-Up|Mod-ArrowUp',\n ModArrowDown = 'Mod-Down|Mod-ArrowDown',\n CtrlHome = 'Ctrl-Home',\n CtrlEnd = 'Ctrl-End',\n ShiftArrowLeft = 'Shift-Left|Shift-ArrowLeft',\n ShiftArrowRight = 'Shift-Right|Shift-ArrowRight',\n AltArrowLeft = 'Alt-Left|Alt-ArrowLeft',\n AltArrowRight = 'Alt-Right|Alt-ArrowRight',\n CtrlArrowLeft = 'Ctrl-Left|Ctrl-ArrowLeft',\n CtrlArrowRight = 'Ctrl-Right|Ctrl-ArrowRight',\n CtrlShiftArrowLeft = 'Ctrl-Shift-Left|Ctrl-Shift-ArrowLeft',\n CtrlShiftArrowRight = 'Ctrl-Shift-Right|Ctrl-Shift-ArrowRight',\n}\n\nexport interface BaseKeyBinding {\n key: BaseKey;\n command: CommandFn;\n}\n\nexport function baseKeysPlugin(keys: readonly BaseKeyBinding[]): Plugin {\n // collect all keys\n const pluginKeys = [\n // base enter key behaviors\n { key: BaseKey.Enter, command: splitBlock },\n { key: BaseKey.Enter, command: liftEmptyBlock },\n { key: BaseKey.Enter, command: createParagraphNear },\n\n // base backspace key behaviors\n { key: BaseKey.Backspace, command: selectNodeBackward },\n { key: BaseKey.Backspace, command: joinBackward },\n { key: BaseKey.Backspace, command: deleteSelection },\n\n // base tab key behavior (ignore)\n { key: BaseKey.Tab, command: ignoreKey },\n { key: BaseKey.ShiftTab, command: ignoreKey },\n\n // base delete key behaviors\n { key: BaseKey.Delete, command: selectNodeForward },\n { key: BaseKey.Delete, command: joinForward },\n { key: BaseKey.Delete, command: deleteSelection },\n\n // base home/end key behaviors (Mac desktop default behavior advances to beginning/end of\n // document, so we provide our own implementation rather than relying on contentEditable)\n kPlatformMac ? { key: BaseKey.Home, command: homeKey } : null,\n kPlatformMac ? { key: BaseKey.End, command: endKey } : null,\n\n // base arrow key behavior (prevent traversing top-level body notes)\n { key: BaseKey.ArrowLeft, command: arrowBodyNodeBoundary('left') },\n { key: BaseKey.ArrowUp, command: arrowBodyNodeBoundary('up') },\n { key: BaseKey.ArrowRight, command: arrowBodyNodeBoundary('right') },\n { key: BaseKey.ArrowDown, command: arrowBodyNodeBoundary('down') },\n { key: BaseKey.ModArrowDown, command: endTopLevelBodyNodeBoundary() },\n { key: BaseKey.CtrlEnd, command: endTopLevelBodyNodeBoundary() },\n\n // merge keys provided by extensions\n ...keys,\n\n // undoInputRule is always the highest priority backspace key\n { key: BaseKey.Backspace, command: undoInputRule },\n ].filter(x => !!x);\n\n // build arrays for each BaseKey type\n const commandMap: { [key: string]: CommandFn[] } = {};\n for (const baseKey of Object.values(BaseKey)) {\n commandMap[baseKey] = [];\n }\n pluginKeys.forEach(key => {\n if (key) {\n commandMap[key.key].unshift(key.command);\n }\n });\n\n const bindings: { [key: string]: CommandFn } = {};\n for (const baseKey of Object.values(BaseKey)) {\n const commands = commandMap[baseKey];\n // baseKey may contain multiple keys, separated by |\n for (const subkey of baseKey.split(/\\|/)) {\n bindings[subkey] = chainCommands(...commands);\n }\n }\n\n // return keymap\n return keymap(bindings);\n}\n\nexport function verticalArrowCanAdvanceWithinTextBlock(selection: Selection, dir: 'up' | 'down') {\n const $head = selection.$head;\n const node = $head.node();\n if (node.isTextblock) {\n const cursorOffset = $head.parentOffset;\n const nodeText = node.textContent;\n if (dir === 'down' && nodeText.substr(cursorOffset).includes('\\n')) {\n return true;\n }\n if (dir === 'up' && nodeText.substr(0, cursorOffset).includes('\\n')) {\n return true;\n }\n }\n return false;\n}\n\ninterface Coords {\n left: number;\n right: number;\n top: number;\n bottom: number;\n}\n\nfunction ignoreKey(state: EditorState, dispatch?: (tr: Transaction) => void) {\n return true;\n}\n\nfunction homeKey(state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) {\n const selection = state.selection;\n const editingNode = editingRootNode(selection);\n if (editingNode && dispatch && view) {\n const head = view.coordsAtPos(selection.head);\n const beginDocPos = editingNode.start;\n for (let pos = selection.from - 1; pos >= beginDocPos; pos--) {\n const coords = view.coordsAtPos(pos);\n if (isOnPreviousLine(head, coords) || pos === beginDocPos) {\n const tr = state.tr;\n setTextSelection(pos + 1)(tr);\n dispatch(tr);\n break;\n }\n }\n }\n return true;\n}\n\nfunction endKey(state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) {\n const selection = state.selection;\n const editingNode = editingRootNode(selection);\n if (editingNode && dispatch && view) {\n const head = view.coordsAtPos(selection.head);\n const endDocPos = editingNode.start + editingNode.node.nodeSize;\n for (let pos = selection.from + 1; pos < endDocPos; pos++) {\n const coords = view.coordsAtPos(pos);\n if (isOnNextLine(head, coords) || pos === endDocPos) {\n const tr = state.tr;\n setTextSelection(pos - 1)(tr);\n dispatch(tr);\n break;\n }\n }\n }\n return true;\n}\n\n// helpers to check for a y coordinate on a diffent line that the selection\n\n// y coorinates are sometimes off by 1 or 2 due to margin/padding (e.g. for\n// inline code spans or spelling marks) so the comparision only succeeds if\n// the vertical extents of the two coords don't overlap. If this proves to\n// still have false positives, we could lookahead to the next a few dozen\n// positions to check if we ever \"return to\" the head's baseline--only a\n// permanent change would indicate that the line has truly changed.\n\nfunction isOnNextLine(head: Coords, pos: Coords) {\n return head.bottom < pos.top;\n}\n\nfunction isOnPreviousLine(head: Coords, pos: Coords) {\n return head.top > pos.bottom;\n}\n\nfunction arrowBodyNodeBoundary(dir: 'up' | 'down' | 'left' | 'right') {\n return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n if (view && view.endOfTextblock(dir) && selectionIsBodyTopLevel(state.selection)) {\n const side = dir === 'left' || dir === 'up' ? -1 : 1;\n const $head = state.selection.$head;\n const nextPos = Selection.near(state.doc.resolve(side > 0 ? $head.after() : $head.before()), side);\n const currentRootNode = editingRootNodeClosestToPos($head);\n const nextRootNode = editingRootNodeClosestToPos(nextPos.$head);\n return currentRootNode?.node?.type !== nextRootNode?.node?.type;\n } else {\n return false;\n }\n };\n}\n\nfunction endTopLevelBodyNodeBoundary() {\n return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n const editingNode = editingRootNode(state.selection);\n if (editingNode && selectionIsBodyTopLevel(state.selection)) {\n if (dispatch) {\n const tr = state.tr;\n setTextSelection(editingNode.pos + editingNode.node.nodeSize - 2)(tr).scrollIntoView();\n dispatch(tr);\n }\n return true;\n } else {\n return false;\n }\n };\n}\n","/*\n * selection.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Selection, NodeSelection } from 'prosemirror-state';\nimport { Schema } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\nimport { GapCursor } from 'prosemirror-gapcursor';\n\nimport { NodeWithPos, setTextSelection } from 'prosemirror-utils';\n\nimport { kAddToHistoryTransaction, kRestoreLocationTransaction } from './transaction';\nimport { editingRootNode } from './node';\n\nexport function selectionIsWithin(selection: Selection, nodeWithPos: NodeWithPos) {\n const from = nodeWithPos.pos + 1;\n const to = from + nodeWithPos.node.nodeSize;\n return selectionIsWithinRange(selection, { from, to });\n}\n\nexport function selectionHasRange(selection: Selection, range: { from: number; to: number }) {\n return selection.from === range.from && selection.to === range.to;\n}\n\nexport function selectionIsWithinRange(selection: Selection, range: { from: number; to: number }) {\n return selection.anchor >= range.from && selection.anchor <= range.to;\n}\n\nexport function selectionIsBodyTopLevel(selection: Selection) {\n const { $head } = selection;\n const parentNode = $head.node($head.depth - 1);\n return parentNode && \n (parentNode.type === parentNode.type.schema.nodes.body ||\n (selection instanceof GapCursor && parentNode.type === parentNode.type.schema.nodes.doc));\n}\n\nexport function selectionIsImageNode(schema: Schema, selection: Selection) {\n return selection instanceof NodeSelection && [schema.nodes.image, schema.nodes.figure].includes(selection.node.type);\n}\n\nexport function selectionIsEmptyParagraph(schema: Schema, selection: Selection) {\n const { $head } = selection;\n return $head.parent.type === schema.nodes.paragraph && $head.parent.childCount === 0;\n}\n\nexport function selectionWithinLastBodyParagraph(selection: Selection) {\n if (selectionIsBodyTopLevel(selection)) {\n const editingRoot = editingRootNode(selection);\n if (editingRoot) {\n const node = selection.$head.node();\n return node === editingRoot.node.lastChild && node.type === node.type.schema.nodes.paragraph;\n }\n }\n return false;\n}\n\nexport function restoreSelection(view: EditorView, pos: number) {\n const tr = view.state.tr;\n if (pos < view.state.doc.nodeSize) {\n setTextSelection(pos)(tr);\n tr.setMeta(kAddToHistoryTransaction, false);\n tr.setMeta(kRestoreLocationTransaction, true);\n view.dispatch(tr);\n }\n}\n","/*\n * transaction.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Transaction, EditorState, Plugin, PluginKey, Selection } from 'prosemirror-state';\nimport { Node as ProsemirrorNode, Mark, MarkType, Slice } from 'prosemirror-model';\nimport { ChangeSet } from 'prosemirror-changeset';\nimport { ReplaceStep, Step, Transform } from 'prosemirror-transform';\n\nimport { sliceContentLength } from './slice';\n\nexport const kPasteTransaction = 'paste';\nexport const kSetMarkdownTransaction = 'setMarkdown';\nexport const kAddToHistoryTransaction = 'addToHistory';\nexport const kFixupTransaction = 'docFixup';\nexport const kRestoreLocationTransaction = 'restoreLocation';\nexport const kNavigationTransaction = 'navigationTransaction';\nexport const kInsertSymbolTransaction = 'insertSymbol';\nexport const kInsertCompletionTransaction = 'insertCompletion';\n\nexport type TransactionsFilter = (transactions: Transaction[], oldState: EditorState, newState: EditorState) => boolean;\n\nexport type TransactionNodeFilter = (\n node: ProsemirrorNode<any>,\n pos: number,\n parent: ProsemirrorNode<any>,\n index: number,\n) => boolean;\n\nexport interface AppendTransactionHandler {\n name: string;\n filter?: TransactionsFilter;\n nodeFilter?: TransactionNodeFilter;\n append: (tr: Transaction, transactions: Transaction[], oldState: EditorState, newState: EditorState) => void;\n}\n\n// wrapper for transaction that is guaranteed not to modify the position of any\n// nodes in the document (useful for grouping many disparate handlers that arne't\n// aware of each other's actions onto the same trasaction)\nexport class MarkTransaction {\n private tr: Transaction;\n\n constructor(tr: Transaction) {\n this.tr = tr;\n }\n get doc(): ProsemirrorNode {\n return this.tr.doc;\n }\n get selection(): Selection {\n return this.tr.selection;\n }\n public addMark(from: number, to: number, mark: Mark): this {\n this.tr.addMark(from, to, mark);\n return this;\n }\n public removeMark(from: number, to: number, mark?: Mark | MarkType): this {\n this.tr.removeMark(from, to, mark);\n return this;\n }\n public removeStoredMark(mark: Mark | MarkType): this {\n this.tr.removeStoredMark(mark);\n return this;\n }\n public insertText(text: string, from: number): this {\n this.tr.insertText(text, from, from + text.length);\n return this;\n }\n}\n\nexport interface AppendMarkTransactionHandler {\n name: string;\n filter: (node: ProsemirrorNode, transactions: Transaction[]) => boolean;\n append: (tr: MarkTransaction, node: ProsemirrorNode, pos: number, state: EditorState) => void;\n}\n\nexport function appendMarkTransactionsPlugin(handlers: readonly AppendMarkTransactionHandler[]): Plugin {\n return new Plugin({\n key: new PluginKey('appendMarkTransactions'),\n\n appendTransaction: (transactions: Transaction[], oldState: EditorState, newState: EditorState) => {\n // skip for selection-only changes\n if (!transactionsDocChanged(transactions)) {\n return;\n }\n\n // create transaction\n const tr = newState.tr;\n\n // create markTransaction wrapper\n const markTr = new MarkTransaction(tr);\n\n forChangedNodes(\n oldState,\n newState,\n node => true,\n (node: ProsemirrorNode, pos: number) => {\n for (const handler of handlers) {\n // get a fresh view of the node\n node = tr.doc.nodeAt(pos)!;\n\n // call the handler\n if (handler.filter(node, transactions)) {\n handler.append(markTr, node, pos, newState);\n }\n }\n },\n );\n\n // return transaction\n if (tr.docChanged || tr.selectionSet || tr.storedMarksSet) {\n return tr;\n }\n },\n });\n}\n\nexport function appendTransactionsPlugin(handlers: readonly AppendTransactionHandler[]): Plugin {\n return new Plugin({\n key: new PluginKey('appendTransactions'),\n\n appendTransaction: (transactions: Transaction[], oldState: EditorState, newState: EditorState) => {\n // skip for selection-only changes\n if (!transactionsDocChanged(transactions)) {\n return;\n }\n\n // create transaction\n const tr = newState.tr;\n\n // compute the changeSet\n if (transactionsAreTypingChange(transactions)) {\n const changeSet = transactionsChangeSet(transactions, oldState, newState);\n\n // call each handler\n for (const handler of handlers) {\n // track whether there is a change\n let haveChange = false;\n\n // call filters if we have them\n if (handler.filter || handler.nodeFilter) {\n // first the low-level transaction filter\n if (handler.filter) {\n haveChange = handler.filter(transactions, oldState, newState);\n }\n\n // if that doesn't detect a change then try the nodeFilter if we have one\n if (!haveChange && handler.nodeFilter) {\n const checkForChange = (\n node: ProsemirrorNode<any>,\n pos: number,\n parent: ProsemirrorNode<any>,\n index: number,\n ) => {\n if (handler.nodeFilter!(node, pos, parent, index)) {\n haveChange = true;\n return false;\n }\n };\n\n for (const change of changeSet.changes) {\n oldState.doc.nodesBetween(change.fromA, change.toA, checkForChange);\n newState.doc.nodesBetween(change.fromB, change.toB, checkForChange);\n }\n }\n\n // no filters means we should always run (force haveChange to true)\n } else {\n haveChange = true;\n }\n\n // run the handler if applicable\n if (haveChange) {\n handler.append(tr, transactions, oldState, newState);\n }\n }\n\n // run them all if this is a larger change\n } else {\n handlers.forEach(handler => handler.append(tr, transactions, oldState, newState));\n }\n\n // return transaction\n if (tr.docChanged || tr.selectionSet || tr.storedMarksSet) {\n return tr;\n }\n },\n });\n}\n\nexport function transactionsDocChanged(transactions: Transaction[]) {\n return transactions.some(transaction => transaction.docChanged);\n}\n\nexport function transactionsChangeSet(transactions: Transaction[], oldState: EditorState, newState: EditorState) {\n let changeSet = ChangeSet.create(oldState.doc);\n for (const transaction of transactions) {\n changeSet = changeSet.addSteps(newState.doc, transaction.mapping.maps);\n }\n return changeSet;\n}\n\nexport function trTransform(tr: Transaction, f: (transform: Transform) => void): Transaction {\n // create a new transform so we can do position mapping relative\n // to the actions taken here (b/c the transaction might already\n // have other steps so we can't do tr.mapping.map)\n const newActions = new Transform(tr.doc);\n\n // call the function (passing it a mapping function that uses our newActions)\n f(newActions);\n\n // copy the contents of newActions to the actual transaction\n for (const step of newActions.steps) {\n tr.step(step);\n }\n\n // return the transaction for chaining\n return tr;\n}\n\nexport function transactionsHaveChange(\n transactions: Transaction[],\n oldState: EditorState,\n newState: EditorState,\n predicate: (node: ProsemirrorNode<any>, pos: number, parent: ProsemirrorNode<any>, index: number) => boolean,\n) {\n // screen out transactions with no doc changes\n if (!transactionsDocChanged(transactions)) {\n return false;\n }\n\n // function to check for whether we have a change and set a flag if we do\n let haveChange = false;\n const checkForChange = (node: ProsemirrorNode<any>, pos: number, parent: ProsemirrorNode<any>, index: number) => {\n if (predicate(node, pos, parent, index)) {\n haveChange = true;\n return false;\n }\n };\n\n // for each change in each transaction, check for a node that matches the predicate in either the old or new doc\n const changeSet = transactionsChangeSet(transactions, oldState, newState);\n\n for (const change of changeSet.changes) {\n oldState.doc.nodesBetween(change.fromA, change.toA, checkForChange);\n newState.doc.nodesBetween(change.fromB, change.toB, checkForChange);\n if (haveChange) {\n break;\n }\n }\n\n return haveChange;\n}\n\nexport function forChangedNodes(\n oldState: EditorState | null,\n newState: EditorState,\n predicate: (node: ProsemirrorNode) => boolean,\n f: (node: ProsemirrorNode, pos: number) => boolean | void,\n) {\n let complete = false;\n const handler = (node: ProsemirrorNode, pos: number) => {\n if (complete) {\n return;\n }\n\n if (!predicate || predicate(node)) {\n if (f(node, pos) === false) {\n complete = true;\n }\n }\n };\n\n if (!oldState) {\n newState.doc.descendants(handler);\n } else if (oldState.doc !== newState.doc) {\n changedDescendants(oldState.doc, newState.doc, 0, handler);\n }\n}\n\n// Helper for iterating through the nodes in a document that changed\n// compared to the given previous document. Useful for avoiding\n// duplicate work on each transaction.\n// from: https://github.com/ProseMirror/prosemirror-tables/blob/master/src/fixtables.js\nfunction changedDescendants(\n old: ProsemirrorNode,\n cur: ProsemirrorNode,\n offset: number,\n f: (node: ProsemirrorNode, pos: number) => void,\n) {\n const oldSize = old.childCount;\n const curSize = cur.childCount;\n outer: for (let i = 0, j = 0; i < curSize; i++) {\n const child = cur.child(i);\n for (let scan = j, e = Math.min(oldSize, i + 3); scan < e; scan++) {\n if (old.child(scan) === child) {\n j = scan + 1;\n offset += child.nodeSize;\n continue outer;\n }\n }\n f(child, offset);\n if (j < oldSize && old.child(j).sameMarkup(child)) {\n changedDescendants(old.child(j), child, offset + 1, f);\n } else {\n child.nodesBetween(0, child.content.size, f, offset + 1);\n }\n offset += child.nodeSize;\n }\n}\n\nexport function transactionsAreTypingChange(transactions: Transaction[]) {\n if (\n transactions.length === 1 &&\n transactions[0].steps.length === 1 &&\n transactions[0].steps[0] instanceof ReplaceStep\n ) {\n // step to examine\n const step: any = transactions[0].steps[0];\n\n // insert single chraracter or new empty slice (e.g. from enter after a paragraph)\n if (step.from === step.to && sliceContentLength(step.slice) <= 1) {\n return true;\n }\n\n // remove single character\n if (Math.abs(step.from - step.to) === 1 && step.slice.content.size === 0) {\n return true;\n }\n }\n\n return false;\n}\n\nexport interface RangeStep extends Step {\n from: number;\n to: number;\n}\n\nexport interface SliceStep extends RangeStep {\n slice: Slice;\n}\n","/*\n * slice.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Slice, Node as ProsemirrorNode } from 'prosemirror-model';\n\nexport function sliceContentLength(slice: Slice) {\n let length = 0;\n for (let i = 0; i < slice.content.childCount; i++) {\n length += slice.content.child(i).textContent.length;\n }\n return length;\n}\n\nexport function sliceHasNode(slice: Slice, predicate: (node: ProsemirrorNode) => boolean) {\n let hasNode = false;\n slice.content.descendants(node => {\n if (predicate(node)) {\n hasNode = true;\n return false;\n }\n });\n return hasNode;\n}\n","/*\n * platform.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport const kPlatformMac = typeof navigator !== 'undefined' ? /Mac/.test(navigator.platform) : false;\n","/*\n * outline.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorState } from 'prosemirror-state';\n\nimport { NodeWithPos, findChildrenByType, findChildren } from 'prosemirror-utils';\n\nimport { findTopLevelBodyNodes } from './node';\nimport { titleFromYamlMetadataNode } from './yaml';\nimport { rmdChunkEngineAndLabel } from './rmd';\n\nexport interface EditorOutlineItem {\n navigation_id: string;\n type: EditorOutlineItemType;\n level: number;\n sequence: number;\n title: string;\n children: EditorOutlineItem[];\n}\n\nexport const kHeadingOutlineItemType = 'heading';\nexport const kRmdchunkOutlineItemType = 'rmd_chunk';\nexport const kYamlMetadataOutlineItemType = 'yaml_metadata';\n\nexport type EditorOutlineItemType = 'heading' | 'rmd_chunk' | 'yaml_metadata';\n\nexport type EditorOutline = EditorOutlineItem[];\n\nexport interface EditingOutlineLocationItem {\n type: EditorOutlineItemType;\n level: number;\n title: string;\n active: boolean;\n position: number;\n}\n\nexport interface EditingOutlineLocation {\n items: EditingOutlineLocationItem[];\n}\n\nexport function getEditingOutlineLocation(state: EditorState): EditingOutlineLocation {\n // traverse document outline to get base location info\n const itemsWithPos = getDocumentOutline(state).map(nodeWithPos => {\n const schema = state.schema;\n const node = nodeWithPos.node;\n const item: EditingOutlineLocationItem = {\n type: kYamlMetadataOutlineItemType,\n level: 0,\n title: '',\n active: false,\n position: nodeWithPos.pos,\n };\n if (node.type === schema.nodes.yaml_metadata) {\n item.type = kYamlMetadataOutlineItemType;\n item.title = titleFromYamlMetadataNode(node) || '';\n } else if (node.type === schema.nodes.rmd_chunk) {\n item.type = kRmdchunkOutlineItemType;\n const chunk = rmdChunkEngineAndLabel(node.textContent);\n if (chunk) {\n item.title = chunk.label;\n }\n } else if (node.type === schema.nodes.heading) {\n item.type = kHeadingOutlineItemType;\n item.level = node.attrs.level;\n item.title = node.textContent;\n }\n return {\n item,\n pos: nodeWithPos.pos,\n };\n });\n\n // return the location, set the active item by scanning backwards until\n // we find an item with a position before the cursor\n let foundActive = false;\n const items: EditingOutlineLocationItem[] = [];\n for (let i = itemsWithPos.length - 1; i >= 0; i--) {\n const item = itemsWithPos[i].item;\n if (!foundActive && itemsWithPos[i].pos < state.selection.from) {\n item.active = true;\n foundActive = true;\n }\n items.unshift(item);\n }\n\n // return the outline\n return { items };\n}\n\n// get a document outline that matches the scheme provided in EditingOutlineLocation:\n// - yaml metadata blocks\n// - top-level headings\n// - rmd chunks at the top level or within a top-level list or div,\nexport function getDocumentOutline(state: EditorState): NodeWithPos[] {\n // get top level body nodes\n const schema = state.schema;\n const bodyNodes = findTopLevelBodyNodes(state.doc, node => {\n return [\n schema.nodes.yaml_metadata,\n schema.nodes.rmd_chunk,\n schema.nodes.heading,\n schema.nodes.bullet_list,\n schema.nodes.ordered_list,\n schema.nodes.div\n ].includes(node.type);\n });\n\n // reduce (explode lists into contained rmd chunks)\n const outlineNodes: NodeWithPos[] = [];\n bodyNodes.forEach(bodyNode => {\n // explode lists\n if ([schema.nodes.bullet_list, schema.nodes.ordered_list].includes(bodyNode.node.type)) {\n // look for rmd chunks within list items (non-recursive, only want top level)\n findChildrenByType(bodyNode.node, schema.nodes.list_item, false).forEach(listItemNode => {\n findChildrenByType(listItemNode.node, schema.nodes.rmd_chunk, false).forEach(rmdChunkNode => {\n outlineNodes.push({\n node: rmdChunkNode.node,\n pos: bodyNode.pos + 1 + listItemNode.pos + 1 + rmdChunkNode.pos,\n });\n });\n });\n\n // find headings and rmd chunks within divs\n } else if (schema.nodes.div === bodyNode.node.type) {\n findChildren(bodyNode.node, \n node => [schema.nodes.rmd_chunk, schema.nodes.heading].includes(node.type),\n true)\n .forEach(childNode => {\n outlineNodes.push({\n node: childNode.node,\n pos: bodyNode.pos + 1 + childNode.pos\n });\n }\n );\n \n // other nodes go straight through\n } else {\n outlineNodes.push(bodyNode);\n }\n });\n\n // return outline nodes\n return outlineNodes;\n}\n\nexport function getOutlineNodes(doc: ProsemirrorNode) {\n return findTopLevelBodyNodes(doc, isOutlineNode);\n}\n\nexport function isOutlineNode(node: ProsemirrorNode) {\n if (node.type.spec.attrs) {\n return node.type.spec.attrs.hasOwnProperty('navigation_id');\n } else {\n return false;\n }\n}\n","/*\n * rmd.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, NodeType } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { GapCursor } from 'prosemirror-gapcursor';\n\nimport {\n findParentNodeOfType,\n findChildrenByType,\n findChildren,\n findChildrenByMark,\n setTextSelection,\n} from 'prosemirror-utils';\n\nimport { getMarkRange } from './mark';\nimport { precedingListItemInsertPos, precedingListItemInsert } from './list';\nimport { toggleBlockType } from './command';\nimport { selectionIsBodyTopLevel } from './selection';\nimport { uuidv4 } from './util';\n\nexport interface EditorRmdChunk {\n lang: string;\n meta: string;\n code: string;\n delimiter: string;\n}\n\nexport type ExecuteRmdChunkFn = (chunk: EditorRmdChunk) => void;\n\nexport function canInsertRmdChunk(state: EditorState) {\n // must either be at the body top level, within a list item, within a div, or within a\n // blockquote (and never within a table)\n const schema = state.schema;\n const within = (nodeType: NodeType) => !!findParentNodeOfType(nodeType)(state.selection);\n if (within(schema.nodes.table)) {\n return false;\n }\n if (\n !selectionIsBodyTopLevel(state.selection) &&\n !within(schema.nodes.list_item) &&\n !within(schema.nodes.blockquote) &&\n schema.nodes.div && !within(schema.nodes.div)\n ) {\n return false;\n }\n\n return true;\n}\n\nexport function insertRmdChunk(chunkPlaceholder: string) {\n return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n const schema = state.schema;\n\n if (\n !(state.selection instanceof GapCursor) &&\n !toggleBlockType(schema.nodes.rmd_chunk, schema.nodes.paragraph)(state) &&\n !precedingListItemInsertPos(state.doc, state.selection)\n ) {\n return false;\n }\n\n // must either be at the body top level, within a list item, within a div, or within a\n // blockquote (and never within a table)\n if (!canInsertRmdChunk(state)) {\n return false;\n }\n\n if (dispatch) {\n // perform insert\n const tr = state.tr;\n const rmdText = schema.text(chunkPlaceholder);\n const rmdNode = schema.nodes.rmd_chunk.create({ navigation_id: uuidv4() }, rmdText);\n const prevListItemPos = precedingListItemInsertPos(tr.doc, tr.selection);\n if (prevListItemPos) {\n precedingListItemInsert(tr, prevListItemPos, rmdNode);\n } else {\n tr.replaceSelectionWith(rmdNode);\n setTextSelection(tr.selection.from - 2)(tr);\n }\n\n dispatch(tr);\n }\n\n return true;\n };\n}\n\nexport function activeRmdChunk(state: EditorState): EditorRmdChunk | null {\n if (state.schema.nodes.rmd_chunk) {\n const rmdNode = findParentNodeOfType(state.schema.nodes.rmd_chunk)(state.selection);\n if (rmdNode) {\n return rmdChunk(rmdNode.node.textContent);\n }\n }\n return null;\n}\n\nexport function previousExecutableRmdChunks(state: EditorState, pos = state.selection.from): EditorRmdChunk[] {\n const activeChunk = activeRmdChunk(state);\n const lang = activeChunk ? activeChunk.lang : 'r';\n const kEvalFalseRegEx = /eval\\s*=\\s*F(?:ALSE)?/;\n return previousRmdChunks(state, pos, chunk => {\n return (\n chunk.lang.localeCompare(lang, undefined, { sensitivity: 'accent' }) === 0 && !kEvalFalseRegEx.test(chunk.meta)\n );\n });\n}\n\nexport function previousRmdChunks(state: EditorState, pos: number, filter?: (chunk: EditorRmdChunk) => boolean) {\n // chunks to return\n const chunks: EditorRmdChunk[] = [];\n\n // find all chunks in the document and return ones before the position that pass the specified filter\n const schema = state.schema;\n const rmdChunkNodes = findChildrenByType(state.doc, schema.nodes.rmd_chunk);\n for (const rmdChunkNode of rmdChunkNodes) {\n if (rmdChunkNode.pos + rmdChunkNode.node.nodeSize > pos) {\n break;\n }\n const chunk = rmdChunk(rmdChunkNode.node.textContent);\n if (chunk && (!filter || filter(chunk))) {\n chunks.push(chunk);\n }\n }\n\n // return chunks\n return chunks;\n}\n\nexport function rmdChunk(code: string): EditorRmdChunk | null {\n let lines = code.trimLeft().split('\\n');\n if (lines.length > 0) {\n const meta = lines[0].replace(/^[\\s`\\{]*(.*?)\\}?\\s*$/, '$1');\n const matchLang = meta.match(/\\w+/);\n const lang = matchLang ? matchLang[0] : '';\n\n const isContainerChunk = [\"verbatim\", \"asis\", \"comment\"].includes(lang);\n\n // for container chunks, delimiter is one backtick greater than the most \n // ticks we've found starting a line (otherwise is ```)\n const delimiter = isContainerChunk ? lines.reduce((ticks: string, line: string) => {\n const match = line.match(/^```+/);\n if (match && (match[0].length >= ticks.length)) {\n ticks = match[0] + \"`\";\n }\n return ticks;\n }, \"```\") : \"```\";\n\n // filter out stray ``` if this isn't a container chunk\n if (!isContainerChunk) {\n // remove lines, other than the first, which are chunk delimiters (start\n // with ```). these are generally unintended but can be accidentally\n // introduced by e.g., pasting a chunk with its delimiters into visual mode,\n // where delimiters are implicit. if these lines aren't removed, they create\n // nested chunks that break parsing and can corrupt the document (see case\n // 8452)\n lines = lines.filter((line, idx) => {\n if (idx === 0) {\n return true;\n }\n return !line.startsWith(\"```\");\n });\n }\n \n\n // a completely empty chunk (no second line) should be returned\n // as such. if it's not completely empty then append a newline\n // to the result of split (so that the chunk ends w/ a newline)\n const chunkCode = lines.length > 1 ? lines.slice(1).join('\\n') + '\\n' : '';\n\n return {\n lang,\n meta,\n code: chunkCode,\n delimiter\n };\n } else {\n return null;\n }\n}\n\nexport function mergeRmdChunks(chunks: EditorRmdChunk[]) {\n if (chunks.length) {\n const merged = {\n lang: chunks[0].lang,\n meta: '',\n code: '',\n };\n chunks.forEach(chunk => (merged.code += chunk.code + '\\n'));\n return merged;\n } else {\n return null;\n }\n}\n\n/**\n * Attempts to extract the engine name and label from a chunk header.\n * \n * @param text The chunk header, e.g. {r foo}\n * @returns An object with `engine` and `label` properties, or null.\n */\nexport function rmdChunkEngineAndLabel(text: string) {\n // Match the engine and label with a regex\n const match = text.match(/^\\{([a-zA-Z0-9_]+)[\\s,]+([a-zA-Z0-9/._='\"-]+)/);\n if (match) {\n // The second capturing group in the regex matches the first string after\n // the engine. This might be a label (e.g., {r label}), but could also be\n // a chunk option (e.g., {r echo=FALSE}). If it has an =, presume that it's\n // an option.\n if (match[2].indexOf(\"=\") !== -1) {\n return null;\n }\n return {\n engine: match[1],\n label: match[2],\n };\n } else {\n return null;\n }\n}\n\nexport function haveTableCellsWithInlineRcode(doc: ProsemirrorNode) {\n const schema = doc.type.schema;\n const haveRCode = !!doc.type.schema.nodes.rmd_chunk;\n if (haveRCode) {\n const isTableCell = (node: ProsemirrorNode) =>\n node.type === schema.nodes.table_cell || node.type === schema.nodes.table_header;\n return findChildren(doc, isTableCell).some(cell => {\n if (doc.rangeHasMark(cell.pos, cell.pos + cell.node.nodeSize, schema.marks.code)) {\n const markedNodes = findChildrenByMark(cell.node, schema.marks.code, true);\n return markedNodes.some(markedNode => {\n const from = cell.pos + 1 + markedNode.pos;\n const markedRange = getMarkRange(doc.resolve(from), schema.marks.code);\n if (markedRange) {\n const text = doc.textBetween(markedRange.from, markedRange.to);\n return /^r[ #].+$/.test(text);\n } else {\n return false;\n }\n });\n } else {\n return false;\n }\n });\n } else {\n return false;\n }\n}\n","/*\n * list.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { Transaction, Selection } from 'prosemirror-state';\n\nimport { findParentNodeOfType, setTextSelection } from 'prosemirror-utils';\n\nexport enum ListType {\n Ordered = 'OrderedList',\n Bullet = 'BulletList',\n}\n\nexport interface ListCapabilities {\n tasks: boolean;\n fancy: boolean;\n example: boolean;\n order: boolean;\n incremental: boolean;\n}\n\nexport function isList(node: ProsemirrorNode | null | undefined) {\n if (node) {\n const schema = node.type.schema;\n return node.type === schema.nodes.bullet_list || node.type === schema.nodes.ordered_list;\n } else {\n return false;\n }\n}\n\nexport function precedingListItemInsertPos(doc: ProsemirrorNode, selection: Selection) {\n // selection just be empty\n if (!selection.empty) {\n return null;\n }\n\n // check for insert position in preceding list item (only trigger when\n // the user is at the very beginning of a new bullet)\n const schema = doc.type.schema;\n const $head = selection.$head;\n const parentListItem = findParentNodeOfType(schema.nodes.list_item)(selection);\n if (parentListItem) {\n const $liPos = doc.resolve(parentListItem.pos);\n const listIndex = $liPos.index();\n const parentIndex = $head.index($head.depth - 1);\n const parentOffset = $head.parentOffset;\n if (listIndex > 0 && parentIndex === 0 && parentOffset === 0) {\n const pos = $liPos.pos - 1;\n return pos;\n } else {\n return null;\n }\n } else {\n return null;\n }\n}\n\nexport function precedingListItemInsert(tr: Transaction, pos: number, node: ProsemirrorNode) {\n tr.deleteRange(tr.selection.from, tr.selection.from + 1);\n tr.insert(pos, node);\n setTextSelection(tr.mapping.map(pos), -1)(tr);\n return tr;\n}\n","/*\n * command.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { lift, setBlockType, toggleMark, wrapIn } from 'prosemirror-commands';\nimport { MarkType, Node as ProsemirrorNode, NodeType } from 'prosemirror-model';\nimport { wrapInList, liftListItem } from 'prosemirror-schema-list';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { findParentNode, findParentNodeOfType, setTextSelection } from 'prosemirror-utils';\nimport { EditorView } from 'prosemirror-view';\n\nimport { markIsActive, getMarkRange } from './mark';\nimport { canInsertNode, nodeIsActive } from './node';\nimport { pandocAttrInSpec, pandocAttrAvailable, pandocAttrFrom } from './pandoc_attr';\nimport { isList } from './list';\nimport { OmniInsert } from './omni_insert';\nimport { EditorUIPrefs, kListSpacingTight } from './ui';\nimport { selectionIsWithinRange, selectionHasRange } from './selection';\nimport { requiresTrailingP, insertTrailingP } from './trailing_p';\n\nexport enum EditorCommandId {\n // text editing\n Undo = '201CA961-829E-4708-8FBC-8896FDE85A10',\n Redo = 'B6272475-04E0-48C0-86E3-DAFA763BDF7B',\n SelectAll = 'E42BF0DA-8A02-4FCE-A202-7EA8A4833FC5',\n ClearFormatting = 'C22D8CC4-0A9F-41D5-B540-7DAAAB80F344',\n\n // formatting\n Strong = '83B04020-1195-4A65-8A8E-7C173C87F439',\n Em = '9E1B73E4-8140-43C3-92E4-A5E2583F40E6',\n Code = '32621150-F829-4B8F-B5BD-627FABBBCF53',\n Strikeout = 'D5F0225B-EC73-4600-A1F3-01F418EE8CB4',\n Superscript = '0200D2FC-B5AF-423B-8B7A-4A7FC3DAA6AF',\n Subscript = '3150428F-E468-4E6E-BF53-A2713E59B4A0',\n Smallcaps = '41D8030F-5E8B-48F2-B1EE-6BC40FD502E4',\n Underline = '7F0E6AE2-08F4-4594-9BA2-E6B8B27FA8F7',\n Paragraph = '20EC2695-75CE-4DCD-A644-266E9F5F5913',\n Heading1 = '5B77642B-923D-4440-B85D-1A27C9CF9D77',\n Heading2 = '42985A4B-6BF2-4EEF-AA30-3E84A8B9111C',\n Heading3 = '3F84D9DF-5EF6-484C-8615-BAAE2AC9ECE2',\n Heading4 = 'DA76731D-1D84-4DBA-9BEF-A6F73536F0B9',\n Heading5 = '59E24247-A140-466A-BC96-3C8ADABB57A5',\n Heading6 = 'DB495DF5-8501-43C7-AE07-59CE9D9C373D',\n CodeBlock = '3BA12A49-3E29-4ABC-9A49-436A3B49B880',\n CodeBlockFormat = '07A6F2AA-01DC-41D7-9F01-AA91EAD856EE',\n Blockquote = 'AF0717E7-E4BA-4909-9F10-17EB757CDD0F',\n LineBlock = 'F401687C-B995-49AF-B2B0-59C158174FD5',\n AttrEdit = '0F8A254D-9272-46BF-904D-3A9D68B91032',\n Span = '852CF3E3-8A2B-420D-BD95-F79C54118E7E',\n Div = '15EDB8F1-6015-4DA9-AE50-5987B24C1D96',\n InsertDiv = 'ACA1521B-8875-4113-9D43-B47F0038B19F',\n\n // lists\n BulletList = 'D897FD2B-D6A4-44A7-A404-57B5251FBF64',\n OrderedList = '3B8B82D5-7B6C-4480-B7DD-CF79C6817980',\n TightList = 'A32B668F-74F3-43D7-8759-6576DDE1D603',\n ListItemSink = '7B503FA6-6576-4397-89EF-37887A1B2EED',\n ListItemLift = '53F89F57-22E2-4FCC-AF71-3E382EC10FC8',\n ListItemSplit = '19BBD87F-96D6-4276-B7B8-470652CF4106',\n ListItemCheck = '2F6DA9D8-EE57-418C-9459-50B6FD84137F',\n ListItemCheckToggle = '34D30F3D-8441-44AD-B75A-415DA8AC740B',\n EditListProperties = 'E006A68C-EA39-4954-91B9-DDB07D1CBDA2',\n\n // tables\n TableInsertTable = 'FBE39613-2DAA-445D-9E92-E1EABFB33E2C',\n TableToggleHeader = 'A5EDA226-A3CA-4C1B-8D4D-C2675EF51AFF',\n TableToggleCaption = 'C598D85C-E15C-4E10-9850-95882AEC7E60',\n TableNextCell = '14299819-3E19-4A27-8D0B-8035315CF0B4',\n TablePreviousCell = '0F041FB5-0203-4FF1-9D13-B16606A80F3E',\n TableAddColumnBefore = '2447B81F-E07A-4C7D-8026-F2B148D5FF4A',\n TableAddColumnAfter = 'ED86CFAF-D0B3-4B1F-9BB8-89987A939C8C',\n TableDeleteColumn = 'B3D077BC-DD51-4E3A-8AD4-DE5DE686F7C4',\n TableAddRowBefore = 'E97FB318-4052-41E5-A2F5-55B64E9826A5',\n TableAddRowAfter = '3F28FA24-4BDD-4C13-84FF-9C5E1D4B04D6',\n TableDeleteRow = '5F3B4DCD-5006-43A5-A069-405A946CAC68',\n TableDeleteTable = '116D1E68-9315-4FEB-B6A0-AD25B3B9C881',\n TableAlignColumnLeft = '0CD6A2A4-06F9-435D-B8C9-070B22B19D8',\n TableAlignColumnRight = '86D90C12-BB12-4A9D-802F-D00EB7CEF2C5',\n TableAlignColumnCenter = '63333996-2F65-4586-8494-EA9CAB5A7751',\n TableAlignColumnDefault = '7860A9C1-60AF-40AD-9EB8-A10F6ADF25C5',\n\n // insert\n OmniInsert = '12F96C13-38C1-4266-A0A1-E871D8C709FB',\n Table = 'CBD3ACC6-B2A3-457D-885C-EDA600F6FC67',\n Link = '842FCB9A-CA61-4C5F-A0A0-43507B4B3FA9',\n RemoveLink = '072D2084-218D-4A34-AF1F-7E196AF684B2',\n Image = '808220A3-2B83-4CB6-BCC1-46565D54FA47',\n Footnote = '1D1A73C0-F0E1-4A0F-BEBC-08398DE14A4D',\n ParagraphInsert = '4E68830A-3E68-450A-B3F3-2591F4EB6B9A',\n HorizontalRule = 'EAA7115B-181C-49EC-BDB1-F0FF10369278',\n YamlMetadata = '431B5A45-1B25-4A55-9BAF-C0FE95D9B2B6',\n Shortcode = '0FDDA7E8-419D-4A5D-A1F5-74061466655D',\n InlineMath = 'A35C562A-0BD6-4B14-93D5-6FF3BE1A0C8A',\n DisplayMath = '3E36BA99-2AE9-47C3-8C85-7CC5314A88DF',\n Citation = 'EFFCFC81-F2E7-441E-B7FA-C693146B4185',\n CrossReference = '48CEED4F-1D18-4AF9-8686-9FEB5DF6BCC8',\n DefinitionList = 'CFAB8F4D-3350-4398-9754-8DE0FB95167B',\n DefinitionTerm = '204D1A8F-8EE6-424A-8E69-99768C85B39E',\n DefinitionDescription = 'F0738D83-8E11-4CB5-B958-390190A2D7DD',\n Symbol = '1419765F-6E4A-4A4C-8670-D9E8578EA996',\n Emoji = 'F73896A2-02CC-4E5D-A596-78444A1D2A37',\n EmDash = '5B0DD33B-6209-4713-B8BB-60B5CA0BC3B3',\n EnDash = 'C32AFE32-0E57-4A16-9C39-88EB1D82B8B4',\n NonBreakingSpace = 'CF6428AB-F36E-446C-8661-2781B2CD1169',\n HardLineBreak = '3606FF87-866C-4729-8F3F-D065388FC339',\n Tabset = '7327AF95-3EA7-42C8-8C42-D4CB0D15CAE4',\n Callout = 'DC86C28A-0140-4EB5-A745-2C1EFA55C94D',\n\n // raw\n TexInline = 'CFE8E9E5-93BA-4FFA-9A77-BA7EFC373864',\n TexBlock = 'BD11A6A7-E528-40A2-8139-3F8F5F556ED2',\n HTMLComment = 'F973CBA4-2882-4AC5-A642-47F4733EBDD4',\n HTMLInline = 'C682C6B5-E58D-498C-A38F-FB07BEC3A82D',\n HTMLBlock = '6F9F64AF-711F-4F91-8642-B51C41717F31',\n RawInline = '984167C8-8582-469C-97D8-42CB12773657',\n RawBlock = 'F5757992-4D33-45E6-86DC-F7D7B174B1EC',\n\n // chunk\n RCodeChunk = 'EBFD21FF-4A6E-4D88-A2E0-B38470B00BB9',\n BashCodeChunk = '5FBB7283-E8AB-450C-9359-A4658CBCD136',\n D3CodeChunk = 'C73CA46C-B56F-40B6-AEFA-DDBB30CA8C08',\n PythonCodeChunk = '42A7A138-421A-4DCF-8A88-FE2F8EC5B8F6',\n RcppCodeChunk = '6BD2810B-6B20-4358-8AA4-74BBFFC92AC3',\n SQLCodeChunk = '41D61FD2-B56B-48A7-99BC-2F60BC0D9F78',\n StanCodeChunk = '65D33344-CBE9-438C-B337-A538F8D7FCE5',\n ExecuteCurentRmdChunk = '31C799F3-EF18-4F3A-92E6-51F7A3193A1B',\n ExecuteCurrentPreviousRmdChunks = 'D3FDE96-0264-4364-ADFF-E87A75405B0B',\n ExpandChunk = '0226518C-559A-4BFC-A5BD-244BEE8175AA',\n CollapseChunk = '4AFBBC0C-A6DA-4019-B85F-374636E349C3',\n ExpandAllChunks = 'B217913B-67C9-457F-B766-7FCCB502F611',\n CollapseAllChunks = '9907A864-D707-4410-93A4-07871A8C43A6',\n\n // outline\n GoToNextSection = 'AE827BDA-96F8-4E84-8030-298D98386765',\n GoToPreviousSection = 'E6AA728C-2B75-4939-9123-0F082837ACDF',\n GoToNextChunk = '50DD6E51-13B5-4F1E-A46B-6A33EB1609D9',\n GoToPreviousChunk = '8D105D33-78FE-4A98-8195-6B71361424C5',\n\n // slides\n InsertSlidePause = 'FCA8BF2E-2668-4919-92FC-02083EB48246',\n InsertSlideNotes = '9C709915-02BE-4F4F-9CEB-50E17973C9BE',\n InsertSlideColumns = 'AE62D05F-1415-4E1F-84AE-753EE2393002'\n}\n\nexport interface EditorCommand {\n readonly id: EditorCommandId;\n readonly keymap: readonly string[];\n readonly isEnabled: () => boolean;\n readonly isActive: () => boolean;\n readonly plural: () => number;\n readonly execute: () => void;\n}\n\nexport class ProsemirrorCommand {\n public readonly id: EditorCommandId;\n public readonly keymap: readonly string[];\n public readonly execute: CommandFn;\n public readonly omniInsert?: OmniInsert;\n public readonly keepFocus: boolean;\n\n constructor(\n id: EditorCommandId,\n keymap: readonly string[],\n execute: CommandFn,\n omniInsert?: OmniInsert,\n keepFocus?: boolean,\n ) {\n this.id = id;\n this.keymap = keymap;\n this.execute = execute;\n this.omniInsert = omniInsert;\n this.keepFocus = !(keepFocus === false);\n }\n\n public isEnabled(state: EditorState): boolean {\n return this.execute(state);\n }\n\n public isActive(state: EditorState): boolean {\n return false;\n }\n\n public plural(state: EditorState): number {\n return 1;\n }\n}\n\nexport class MarkCommand extends ProsemirrorCommand {\n public readonly markType: MarkType;\n public readonly attrs: object;\n\n constructor(id: EditorCommandId, keymap: string[], markType: MarkType, attrs = {}) {\n super(id, keymap, toggleMarkType(markType, attrs) as CommandFn);\n this.markType = markType;\n this.attrs = attrs;\n }\n\n public isActive(state: EditorState) {\n return markIsActive(state, this.markType);\n }\n}\n\nexport class NodeCommand extends ProsemirrorCommand {\n public readonly nodeType: NodeType;\n public readonly attrs: object;\n\n constructor(\n id: EditorCommandId,\n keymap: string[],\n nodeType: NodeType,\n attrs: object,\n execute: CommandFn,\n omniInsert?: OmniInsert,\n ) {\n super(id, keymap, execute, omniInsert);\n this.nodeType = nodeType;\n this.attrs = attrs;\n }\n\n public isActive(state: EditorState) {\n return nodeIsActive(state, this.nodeType, this.attrs);\n }\n}\n\nexport class BlockCommand extends NodeCommand {\n constructor(\n id: EditorCommandId,\n keymap: string[],\n blockType: NodeType,\n toggleType: NodeType,\n attrs = {},\n omniInsert?: OmniInsert,\n ) {\n super(id, keymap, blockType, attrs, toggleBlockType(blockType, toggleType, attrs), omniInsert);\n }\n}\n\nexport class WrapCommand extends NodeCommand {\n constructor(id: EditorCommandId, keymap: string[], wrapType: NodeType, attrs = {}, omniInsert?: OmniInsert) {\n super(id, keymap, wrapType, attrs, toggleWrap(wrapType, attrs), omniInsert);\n }\n}\n\nexport class InsertCharacterCommand extends ProsemirrorCommand {\n constructor(id: EditorCommandId, ch: string, keymap: string[]) {\n super(id, keymap, (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n // enable/disable command\n const schema = state.schema;\n if (!canInsertNode(state, schema.nodes.text)) {\n return false;\n }\n if (dispatch) {\n const tr = state.tr;\n tr.replaceSelectionWith(schema.text(ch), true).scrollIntoView();\n dispatch(tr);\n }\n\n return true;\n });\n }\n}\n\nexport type CommandFn = (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => boolean;\n\nexport function toggleMarkType(markType: MarkType, attrs?: { [key: string]: any }) {\n const defaultToggleMark = toggleMark(markType, attrs);\n\n return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n // disallow non-code marks when the selection is contained within a code mark\n // (this is a pandoc constraint). note that we can allow them if the selection\n // contains the code mark range entirely (as in that case the code mark will\n // nest within the other mark)\n if (markType !== state.schema.marks.code) {\n if (markIsActive(state, state.schema.marks.code)) {\n const codeRange = getMarkRange(state.selection.$anchor, state.schema.marks.code);\n if (\n codeRange &&\n selectionIsWithinRange(state.selection, codeRange) &&\n !selectionHasRange(state.selection, codeRange)\n ) {\n return false;\n }\n }\n }\n\n // default implementation\n return defaultToggleMark(state, dispatch);\n };\n}\n\nexport function toggleList(listType: NodeType, itemType: NodeType, prefs: EditorUIPrefs): CommandFn {\n return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n const { selection } = state;\n const { $from, $to } = selection;\n const range = $from.blockRange($to);\n\n if (!range) {\n return false;\n }\n\n const parentList = findParentNode(isList)(selection);\n\n if (range.depth >= 1 && parentList && range.depth - parentList.depth <= 1) {\n if (isList(parentList.node) && listType.validContent(parentList.node.content)) {\n if (parentList.node.type !== listType) {\n if (dispatch) {\n const tr: Transaction = state.tr;\n const attrs: { [key: string]: any } = {};\n if (parentList.node.attrs.tight) {\n attrs.tight = true;\n }\n tr.setNodeMarkup(parentList.pos, listType, attrs);\n dispatch(tr);\n }\n return true;\n } else {\n return liftListItem(itemType)(state, dispatch);\n }\n }\n }\n\n // if we are in a heading then this isn't valid\n if (findParentNodeOfType(state.schema.nodes.heading)(state.selection)) {\n return false;\n }\n\n // reflect tight preference\n const tight = prefs.listSpacing() === kListSpacingTight;\n\n return wrapInList(listType, { tight })(state, dispatch);\n };\n}\n\nexport function toggleBlockType(type: NodeType, toggletype: NodeType, attrs = {}): CommandFn {\n return (state: EditorState, dispatch?: (tr: Transaction<any>) => void) => {\n if (!dispatch) {\n return type === toggletype || setBlockType(type, { ...attrs })(state, dispatch);\n }\n\n // if the type has pandoc attrs then see if we can transfer from the existing node\n let pandocAttr: any = {};\n if (pandocAttrInSpec(type.spec)) {\n const parentNode = state.selection.$anchor.node();\n if (parentNode && pandocAttrAvailable(parentNode.attrs)) {\n pandocAttr = pandocAttrFrom(parentNode.attrs);\n }\n }\n\n return setBlockType(type, { ...attrs, ...pandocAttr })(state, dispatch);\n };\n}\n\nexport function toggleWrap(type: NodeType, attrs?: { [key: string]: any }): CommandFn {\n return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n const isActive = nodeIsActive(state, type, attrs);\n\n if (isActive) {\n return lift(state, dispatch);\n }\n\n return wrapIn(type, attrs)(state, dispatch);\n };\n}\n\nexport function insertNode(nodeType: NodeType, attrs = {}, selectAfter = false): CommandFn {\n return (state: EditorState, dispatch?: (tr: Transaction<any>) => void) => {\n if (!canInsertNode(state, nodeType)) {\n return false;\n }\n\n if (dispatch) {\n const tr = state.tr;\n tr.replaceSelectionWith(nodeType.create(attrs));\n if (selectAfter) {\n if (requiresTrailingP(tr.selection)) {\n insertTrailingP(tr);\n setTextSelection(tr.selection.to + 1, 1)(tr);\n }\n }\n dispatch(tr);\n }\n\n return true;\n };\n}\n\nexport function exitNode(\n nodeType: NodeType,\n depth: number,\n allowKey: boolean,\n filter = (_node: ProsemirrorNode) => true,\n) {\n return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n // must be within the node type and pass the filter\n const { $head, $anchor } = state.selection;\n if ($head.parent.type !== nodeType || !filter($head.parent)) {\n return false;\n }\n\n // must be empty and entirely contained by the node\n if (!$head.sameParent($anchor) || !state.selection.empty) {\n return !allowKey;\n }\n\n // must be at the end of the node\n const node = findParentNodeOfType(nodeType)(state.selection)!;\n const endCaptionPos = node.pos + node.node.nodeSize - 1;\n if (state.selection.from !== endCaptionPos) {\n return !allowKey;\n }\n\n // insert must be valid in container above\n const above = $head.node(depth);\n const after = $head.indexAfter(depth);\n const type = above.contentMatchAt(after).defaultType!;\n if (!above.canReplaceWith(after, after, type)) {\n return !allowKey;\n }\n\n // perform insert\n if (dispatch) {\n const tr = state.tr;\n const pos = node.pos + node.node.nodeSize + (Math.abs(depth) - 1);\n tr.insert(pos, type.create());\n setTextSelection(pos, 1)(tr);\n dispatch(tr.scrollIntoView());\n }\n\n return true;\n };\n}\n","/*\n * ui.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { SkinTone } from './emoji';\nimport { XRef } from './xref';\n\nimport { EditorUIImages } from './ui-images';\nimport { EditorDialogs } from './ui-dialogs';\nimport { EditorUISpelling } from './spelling';\n\nexport interface EditorUI {\n dialogs: EditorDialogs;\n display: EditorDisplay;\n math: EditorUIMath;\n context: EditorUIContext;\n prefs: EditorUIPrefs;\n images: EditorUIImages;\n chunks: EditorUIChunks;\n spelling: EditorUISpelling;\n}\n\n/**\n * Callbacks supplied to the host to interact with a code chunk and its output.\n */\nexport interface EditorUIChunkCallbacks {\n getPos: () => number;\n scrollIntoView: (ele: HTMLElement) => void;\n scrollCursorIntoView: () => void;\n getTextContent: () => string;\n}\n\nexport interface EditorUIChunks {\n // create a code chunk editor\n createChunkEditor: (type: string, element: Element, index: number, classes: string[], callbacks: EditorUIChunkCallbacks) => ChunkEditor;\n\n // expand or collapse all chunk editors\n setChunksExpanded: (expanded: boolean) => void;\n}\n\nexport interface ChunkEditor {\n editor: unknown;\n setMode(mode: string): void;\n executeSelection(): void;\n element: HTMLElement;\n destroy(): void;\n setExpanded(expanded: boolean): void;\n getExpanded(): boolean;\n}\n\nexport interface EditorUIContext {\n // check if we are the active tab\n isActiveTab: () => boolean;\n\n // get the path to the current document\n getDocumentPath: () => string | null;\n\n // ensure the edited document is saved on the server before proceeding\n // (note this just means that the server has a copy of it for e.g.\n // indexing xrefs, from the user's standpoint the doc is still dirty)\n withSavedDocument: () => Promise<boolean>;\n\n // get the default directory for resources (e.g. where relative links point to)\n getDefaultResourceDir: () => string;\n\n // map from a filesystem path to a resource reference\n mapPathToResource: (path: string) => string;\n\n // map from a resource reference (e.g. images/foo.png) to a URL we can use in the document\n mapResourceToURL: (path: string) => string;\n\n // watch a resource for changes (returns an unsubscribe function)\n watchResource: (path: string, notify: VoidFunction) => VoidFunction;\n\n // translate a string\n translateText: (text: string) => string;\n\n // are there dropped uris available?\n droppedUris: () => string[] | null;\n\n // uris from the clipboard\n clipboardUris: () => Promise<string[] | null>;\n\n // image from the clipboard (returned as file path)\n clipboardImage: () => Promise<string | null>;\n\n // resolve image uris (make relative, copy to doc local 'images' dir, etc)\n resolveImageUris: (uris: string[]) => Promise<string[]>;\n\n // are we running in windows desktop mode?\n isWindowsDesktop: () => boolean;\n}\n\nexport interface EditorMenuItem {\n text?: string;\n exec?: VoidFunction;\n command?: string;\n separator?: boolean;\n subMenu?: {\n items: EditorMenuItem[];\n };\n}\n\nexport interface EditorUIMath {\n typeset?: (el: HTMLElement, text: string, priority: boolean) => Promise<boolean>;\n}\n\nexport interface EditorDisplay {\n openURL: (url: string) => void;\n navigateToXRef: (file: string, xref: XRef) => void;\n showContextMenu?: (items: EditorMenuItem[], clientX: number, clientY: number) => Promise<boolean>;\n}\n\nexport const kListSpacingTight = 'tight';\nexport const kListSpacingSpaced = 'spaced';\nexport type ListSpacing = 'tight' | 'spaced';\n\nexport interface EditorUIPrefs {\n darkMode: () => boolean;\n listSpacing: () => ListSpacing;\n equationPreview: () => boolean;\n packageListingEnabled: () => boolean;\n tabKeyMoveFocus: () => boolean;\n emojiSkinTone: () => SkinTone;\n setEmojiSkinTone: (skinTone: SkinTone) => void;\n zoteroUseBetterBibtex: () => boolean;\n setBibliographyDefaultType: (type: string) => void;\n bibliographyDefaultType: () => string;\n citationDefaultInText: () => boolean;\n setCitationDefaultInText: (value: boolean) => void;\n}\n","/*\n * trailing_p.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Transaction, Selection } from 'prosemirror-state';\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { Transform } from 'prosemirror-transform';\nimport { ContentNodeWithPos } from 'prosemirror-utils';\n\nimport { editingRootNode } from '../api/node';\nimport { trTransform } from '../api/transaction';\nimport { isParagraphNode } from '../api/paragraph';\n\n\nexport function insertTrailingP(tr: Transaction) {\n const editingNode = editingRootNode(tr.selection);\n if (editingNode) {\n trTransform(tr, insertTrailingPTransform(editingNode));\n }\n}\n\n\nexport function requiresTrailingP(selection: Selection) {\n const editingRoot = editingRootNode(selection);\n if (editingRoot) {\n return !isParagraphNode(editingRoot.node.lastChild) || isDisplayMathNode(editingRoot.node.lastChild);\n } else {\n return false;\n }\n}\n\nfunction insertTrailingPTransform(editingNode: ContentNodeWithPos) {\n return (tr: Transform) => {\n const schema = editingNode.node.type.schema;\n tr.insert(editingNode.pos + editingNode.node.nodeSize - 1, schema.nodes.paragraph.create());\n };\n}\n\nfunction isDisplayMathNode(node: ProsemirrorNode | null | undefined) {\n if (node && node.firstChild) {\n return node.childCount === 1 && node.type.schema.marks.math?.isInSet(node.firstChild.marks);\n } else {\n return false;\n }\n}\n","/*\n * paragraph.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { canInsertNode } from './node';\n\nexport function insertParagraph(state: EditorState, dispatch?: (tr: Transaction) => void) {\n const schema = state.schema;\n\n if (!canInsertNode(state, schema.nodes.paragraph)) {\n return false;\n }\n\n if (dispatch) {\n const tr = state.tr;\n tr.replaceSelectionWith(schema.nodes.paragraph.create());\n setTextSelection(state.selection.from + 1, 1)(tr);\n dispatch(tr);\n }\n\n return true;\n}\n\nexport function isParagraphNode(node: ProsemirrorNode | null | undefined) {\n if (node) {\n const schema = node.type.schema;\n return node.type === schema.nodes.paragraph;\n } else {\n return false;\n }\n}\n","/*\n * util.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n// tslint:disable:no-bitwise\nexport function uuidv4() {\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, c => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n","import { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\nimport { NodeWithPos } from 'prosemirror-utils';\n\nimport { bodyElement } from './dom';\nimport {\n kYamlMetadataOutlineItemType,\n kHeadingOutlineItemType,\n kRmdchunkOutlineItemType,\n EditingOutlineLocation,\n getDocumentOutline,\n EditingOutlineLocationItem,\n} from './outline';\nimport { restoreSelection } from './selection';\nimport { scrollToPos } from './scroll';\n\nexport interface EditingLocation {\n pos: number;\n scrollTop: number;\n}\n\nexport function getEditingLocation(view: EditorView): EditingLocation {\n const pos = view.state.selection.from;\n const bodyEl = bodyElement(view);\n const scrollTop = bodyEl.scrollTop;\n return { pos, scrollTop };\n}\n\nexport function setEditingLocation(\n view: EditorView,\n outlineLocation?: EditingOutlineLocation,\n previousLocation?: EditingLocation,\n) {\n // get the current document outline\n const documentOutline = getDocumentOutline(view.state);\n\n // if all of the types and levels match up to the active outline item,\n // then we have a candidate match\n let docOutlineLocationNode: NodeWithPos | undefined;\n\n if (outlineLocation) {\n for (let i = 0; i < outlineLocation.items.length && i < documentOutline.length; i++) {\n // get the item and it's peer\n const item = outlineLocation.items[i];\n const docOutlineNode = documentOutline[i];\n\n // if they don't match then bail (can't resolve different interpretations of the outline)\n if (!outlineItemSimillarToNode(item, docOutlineNode.node)) {\n break;\n }\n\n // if this is the active item\n if (item.active) {\n // see if the previous location is actually a better target (because it's between this location and\n // the next outline node). in that case we don't set the target node and we leave the restorePos\n // at the previous location\n if (!locationIsBetweenDocOutlineNodes(docOutlineNode, documentOutline[i + 1], previousLocation)) {\n // set the target\n docOutlineLocationNode = docOutlineNode;\n\n // if this is an rmd chunk then advance to the second line\n if (docOutlineNode.node.type === view.state.schema.nodes.rmd_chunk) {\n const chunkText = docOutlineNode.node.textContent;\n const newlineIdx = chunkText.indexOf('\\n');\n if (newlineIdx !== -1) {\n docOutlineLocationNode.pos += newlineIdx + 2;\n }\n }\n }\n\n break;\n }\n }\n }\n\n // do the restore\n if (docOutlineLocationNode) {\n restoreSelection(view, docOutlineLocationNode.pos);\n scrollToPos(view, docOutlineLocationNode.pos);\n } else if (previousLocation) {\n restoreSelection(view, previousLocation.pos);\n bodyElement(view).scrollTop = previousLocation.scrollTop;\n }\n}\n\nfunction outlineItemSimillarToNode(outlineItem: EditingOutlineLocationItem, docOutlneNode: ProsemirrorNode) {\n const schema = docOutlneNode.type.schema;\n if (outlineItem.type === kYamlMetadataOutlineItemType) {\n return docOutlneNode.type === schema.nodes.yaml_metadata;\n } else if (outlineItem.type === kRmdchunkOutlineItemType) {\n return docOutlneNode.type === schema.nodes.rmd_chunk;\n } else if (outlineItem.type === kHeadingOutlineItemType) {\n return docOutlneNode.type === schema.nodes.heading && docOutlneNode.attrs.level === outlineItem.level;\n } else {\n return false;\n }\n}\n\nfunction locationIsBetweenDocOutlineNodes(nodeA: NodeWithPos, nodeB?: NodeWithPos, location?: EditingLocation) {\n // bail if we don't have all the arguments\n if (!nodeB || !location) {\n return false;\n }\n return nodeA.pos < location.pos && nodeB.pos > location.pos;\n}\n","/*\n * dom.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView } from 'prosemirror-view';\n\nexport function bodyElement(view: EditorView): HTMLElement {\n return view.dom.firstChild as HTMLElement;\n}\n\nexport function isElementVisible(el: HTMLElement) {\n return !!(el.offsetWidth || el.offsetHeight || el.getClientRects().length);\n}\n\nexport function elementInnerDimensions(el: HTMLElement) {\n const cs = getComputedStyle(el);\n\n const asNumber = (x: string | null) => (x ? parseFloat(x) : 0);\n const paddingX = asNumber(cs.paddingLeft) + asNumber(cs.paddingRight);\n const paddingY = asNumber(cs.paddingTop) + asNumber(cs.paddingBottom);\n const borderX = asNumber(cs.borderLeftWidth) + asNumber(cs.borderRightWidth);\n const borderY = asNumber(cs.borderTopWidth) + asNumber(cs.borderBottomWidth);\n\n return {\n width: el.offsetWidth - paddingX - borderX,\n height: el.offsetHeight - paddingY - borderY,\n };\n}\n\nexport function onElementRemoved(container: Node, el: HTMLElement, onRemoved: VoidFunction) {\n const observer = new MutationObserver(mutationsList => {\n mutationsList.forEach(mutation => {\n mutation.removedNodes.forEach(node => {\n if (node === el) {\n onRemoved();\n }\n });\n });\n });\n observer.observe(container, { attributes: false, childList: true, subtree: true });\n}\n","/*\n * scroll.ts\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView } from 'prosemirror-view';\nimport { findParentNodeOfTypeClosestToPos } from 'prosemirror-utils';\n\nimport zenscroll from 'zenscroll';\n\nimport { editingRootNodeClosestToPos, editingRootNode } from './node';\n\nexport function scrollIntoView(\n view: EditorView,\n pos: number,\n center = true,\n duration?: number,\n offset?: number,\n onDone?: VoidFunction,\n) {\n // resolve position and determine container\n const $pos = view.state.doc.resolve(pos);\n const container = editingRootNodeClosestToPos($pos);\n\n // if we have a container then do the scroll\n if (container) {\n const schema = view.state.schema;\n const containerEl = view.nodeDOM(container.pos) as HTMLElement;\n const parentList = findParentNodeOfTypeClosestToPos($pos, [schema.nodes.ordered_list, schema.nodes.bullet_list]);\n const parentDiv = schema.nodes.div ? findParentNodeOfTypeClosestToPos($pos, schema.nodes.div) : undefined;\n const resultPos = parentList || parentDiv ? $pos.before(2) : $pos.before();\n const resultNode = view.nodeDOM(resultPos) as HTMLElement;\n if (container && resultNode) {\n const scroller = zenscroll.createScroller(containerEl, duration, offset);\n if (center) {\n scroller.center(resultNode, duration, offset, onDone);\n } else {\n scroller.intoView(resultNode, duration, onDone);\n }\n }\n }\n}\n\nexport function scrollToPos(view: EditorView, pos: number, duration?: number, offset?: number, onDone?: VoidFunction) {\n const node = view.nodeDOM(pos);\n if (node instanceof HTMLElement) {\n const editingRoot = editingRootNode(view.state.selection)!;\n const container = view.nodeDOM(editingRoot.pos) as HTMLElement;\n const scroller = zenscroll.createScroller(container, duration, offset);\n if (duration) {\n scroller.to(node, duration, onDone);\n } else {\n scroller.to(node, 0, onDone);\n }\n }\n}\n","/*\n * navigation.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView } from 'prosemirror-view';\n\nimport { setTextSelection, Predicate, findChildren, findDomRefAtPos } from 'prosemirror-utils';\n\nimport zenscroll from 'zenscroll';\n\nimport { editingRootNode } from './node';\nimport { kNavigationTransaction } from './transaction';\nimport { xrefPosition } from './xref';\nimport { EditorFormat, kQuartoDocType } from './format';\n\nexport interface EditorNavigation {\n navigate: (type: NavigationType, location: string, animate?: boolean) => void;\n}\n\nexport enum NavigationType {\n Pos = 'pos',\n Id = 'id',\n Href = 'href',\n Heading = 'heading',\n XRef = 'xref',\n}\n\nexport interface Navigation {\n pos: number;\n prevPos: number;\n}\n\nexport function navigateTo(\n view: EditorView,\n format: EditorFormat,\n type: NavigationType,\n location: string,\n animate = true,\n): Navigation | null {\n switch (type) {\n case NavigationType.Pos:\n return navigateToPos(view, parseInt(location, 10), animate);\n case NavigationType.Id:\n return navigateToId(view, location, animate);\n case NavigationType.Href:\n return navigateToHref(view, location, animate);\n case NavigationType.Heading:\n return navigateToHeading(view, location, animate);\n case NavigationType.XRef:\n return navigateToXRef(view, format, location, animate);\n default:\n return null;\n }\n}\n\nexport function navigateToId(view: EditorView, id: string, animate = true): Navigation | null {\n return navigate(view, node => id === node.attrs.navigation_id, animate);\n}\n\nexport function navigateToHref(view: EditorView, href: string, animate = true): Navigation | null {\n return navigate(view, node => node.attrs.id === href, animate);\n}\n\nexport function navigateToHeading(view: EditorView, heading: string, animate = true): Navigation | null {\n return navigate(\n view,\n node => {\n return (\n node.type === view.state.schema.nodes.heading &&\n node.textContent.localeCompare(heading, undefined, { sensitivity: 'accent' }) === 0\n );\n },\n animate,\n );\n}\n\nexport function navigateToXRef(view: EditorView, editorFormat: EditorFormat, xref: string, animate = true): Navigation | null {\n const xrefType = editorFormat.docTypes.includes(kQuartoDocType) ? \"quarto\" : \"bookdown\";\n const xrefPos = xrefPosition(view.state.doc, xref, xrefType);\n if (xrefPos !== -1) {\n return navigateToPos(view, xrefPos, animate);\n } else {\n return null;\n }\n}\n\nexport function navigateToPos(view: EditorView, pos: number, animate = true): Navigation | null {\n // get previous position\n const prevPos = view.state.selection.from;\n\n // need to target at least the body\n pos = Math.max(pos, 2);\n\n // set selection\n const tr = view.state.tr;\n setTextSelection(pos)(tr);\n tr.setMeta(kNavigationTransaction, true);\n view.dispatch(tr);\n\n // find a targetable dom node at the position\n const node = findDomRefAtPos(pos, view.domAtPos.bind(view));\n if (node instanceof HTMLElement) {\n // auto-scroll to position (delay so we can grab the focus, as autoscrolling\n // doesn't seem to work unless you have the focus)\n setTimeout(() => {\n view.focus();\n const editingRoot = editingRootNode(view.state.selection)!;\n const container = view.nodeDOM(editingRoot.pos) as HTMLElement;\n const scroller = zenscroll.createScroller(container, 700, 20);\n // some nodes' DOM elements are grandchildren rather than direct children\n // of the scroll container; move up a level if this is the case\n let dest = node;\n if (node.parentElement &&\n node.parentElement.parentElement &&\n node.parentElement.parentElement.parentElement === container) {\n dest = node.parentElement;\n }\n if (animate) {\n scroller.to(dest);\n } else {\n scroller.to(dest, 0);\n }\n }, 200);\n\n return { pos, prevPos };\n } else {\n return null;\n }\n}\n\nfunction navigate(view: EditorView, predicate: Predicate, animate = true): Navigation | null {\n const result = findChildren(view.state.doc, predicate);\n if (result.length) {\n // pos points immediately before the node so add 1 to it\n const pos = result[0].pos + 1;\n return navigateToPos(view, pos, animate);\n } else {\n return null;\n }\n}\n","/*\n * xref.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, MarkType } from 'prosemirror-model';\n\nimport { findChildrenByMark } from 'prosemirror-utils';\n\nimport { pandocAutoIdentifier } from './pandoc_id';\nimport { rmdChunkEngineAndLabel } from './rmd';\nimport { kTexFormat } from './raw';\nimport { findChildrenByType } from 'prosemirror-utils';\n\nexport interface XRefServer {\n indexForFile: (file: string) => Promise<XRefs>;\n xrefForId: (file: string, id: string) => Promise<XRefs>;\n quartoIndexForFile: (file: string) => Promise<XRefs>;\n quartoXrefForId: (file: string, id: string) => Promise<XRefs>;\n}\n\nexport interface XRefs {\n baseDir: string;\n refs: XRef[];\n}\n\nexport interface XRef {\n file: string;\n type: string;\n id: string;\n suffix: string;\n title?: string;\n}\n\nexport type XRefType = \"quarto\" | \"bookdown\";\n\nexport function xrefKey(xref: XRef, xrefType?: XRefType) {\n if (xrefType === \"quarto\") {\n // Quarto keys are merely type-id\n if (xref.suffix) {\n return `${xref.type}-${xref.id}${xref.suffix}`;\n } else {\n return `${xref.type}-${xref.id}`;\n }\n } else {\n // headings don't include their type in the key\n const key = /^h\\d$/.test(xref.type)\n ? xref.id\n : // no colon if there is no type\n xref.type.length > 0\n ? `${xref.type}:${xref.id}`\n : xref.id;\n\n // return key with suffix\n return key + xref.suffix;\n }\n}\n\nexport function parseQuartoXRef(xref: string) {\n const dashPos = xref.indexOf('-');\n if (dashPos !== -1) {\n return {\n type: xref.substring(0, dashPos),\n id: xref.substring(dashPos + 1),\n };\n } else {\n return null;\n }\n}\n\nexport function xrefPosition(doc: ProsemirrorNode, xref: string, xrefType: XRefType): number {\n\n if (xrefType === 'quarto') {\n return xrefPositionLocate(doc, xref, quartoXrefPositionLocators);\n } else {\n return xrefPositionLocate(doc, xref, bookdownXrefPositionLocators);\n }\n}\n\nfunction xrefPositionLocate(doc: ProsemirrorNode, xref: string, locators: Record<string, XRefPositionLocator>) {\n // -1 if not found\n let xrefPos = -1;\n\n // get type and id\n const xrefInfo = parseBookdownXRef(xref);\n if (xrefInfo) {\n const { type, id } = xrefInfo;\n const locator = locators[type];\n if (locator) {\n // if this locator finds by mark then look at doc for marks\n if (locator.markType) {\n const schema = doc.type.schema;\n const markType = schema.marks[locator.markType];\n const markedNodes = findChildrenByMark(doc, markType, true);\n markedNodes.forEach(markedNode => {\n // bail if we already found it\n if (xrefPos !== -1) {\n return false;\n }\n // see if we can locate the xref\n if (locator.hasXRef(markedNode.node, id, markType)) {\n xrefPos = markedNode.pos;\n }\n });\n }\n if (xrefPos === -1 && locator.nodeTypes) {\n // otherwise recursively examine nodes to find the xref\n doc.descendants((node, pos) => {\n // bail if we already found it\n if (xrefPos !== -1) {\n return false;\n }\n // see if we can locate the xref\n if (locator.nodeTypes!.includes(node.type.name) && locator.hasXRef(node, id)) {\n xrefPos = pos;\n return false;\n }\n });\n }\n }\n }\n\n // return the position\n return xrefPos;\n}\n\nfunction parseBookdownXRef(xref: string) {\n const colonPos = xref.indexOf(':');\n if (colonPos !== -1) {\n return {\n type: xref.substring(0, colonPos),\n id: xref.substring(colonPos + 1),\n };\n } else {\n return null;\n }\n}\n\ninterface XRefPositionLocator {\n markType?: string;\n nodeTypes?: string[];\n hasXRef: (node: ProsemirrorNode, id: string, markType?: MarkType) => boolean;\n}\n\nconst quartoXrefPositionLocators: { [key: string]: XRefPositionLocator } = {\n sec: quartoHeadingLocator(),\n fig: quartoFigureLocator(),\n tbl: quartoTableLocator(),\n eq: quartoMathLocator(),\n lst: quartoListingLocator(),\n thm: quartoDivLocator(\"thm\"),\n lem: quartoDivLocator(\"lem\"),\n cor: quartoDivLocator(\"cor\"),\n prp: quartoDivLocator(\"prp\"),\n cnj: quartoDivLocator(\"cnj\"),\n def: quartoDivLocator(\"def\"),\n exm: quartoDivLocator(\"exm\"),\n exr: quartoDivLocator(\"exr\"),\n};\n\n\nfunction quartoMathLocator() {\n return {\n nodeTypes: ['paragraph'],\n hasXRef: (node: ProsemirrorNode, id: string) => {\n const mathType = node.type.schema.marks.math;\n let prevNodeMath = false;\n for (let i = 0; i < node.childCount; i++) {\n const childNode = node.child(i);\n if (prevNodeMath) {\n const text = childNode.textContent;\n if (!!text.match(/^\\s*\\{\\#eq\\-.*\\}/)) {\n return true;\n }\n }\n prevNodeMath = !!childNode.marks.find(\n mark => mark.type === mathType && mark.attrs.type === \"DisplayMath\"\n );\n }\n return false;\n },\n };\n}\n\nfunction quartoFigureLocator() {\n return {\n nodeTypes: ['figure'],\n hasXRef: (node: ProsemirrorNode, id: string) => {\n return node.attrs.id === `fig-${id}`;\n },\n };\n}\n\nfunction quartoHeadingLocator() {\n return {\n nodeTypes: ['heading'],\n hasXRef: (node: ProsemirrorNode, id: string) => {\n return node.attrs.id === `sec-${id}`;\n },\n };\n}\n\nfunction quartoTableLocator() {\n return {\n nodeTypes: ['table_container'],\n hasXRef: (node: ProsemirrorNode, id: string) => {\n // Look for a table which has a table caption that contains the id\n const captions = findChildrenByType(node, node.type.schema.nodes.table_caption);\n if (captions.length) {\n return !!captions[0].node.textContent.match(/\\{\\#tbl\\-.*\\}/);\n }\n return false;\n },\n };\n}\n\nfunction quartoDivLocator(type: string) {\n return {\n nodeTypes: ['div'],\n hasXRef: (node: ProsemirrorNode, id: string) => {\n return node.attrs.id === `${type}-${id}`;\n },\n };\n}\n\nfunction quartoListingLocator() {\n return {\n nodeTypes: ['code_block'],\n hasXRef: (node: ProsemirrorNode, id: string) => {\n const attrs = node.attrs;\n return attrs.id === `lst-${id}`;\n },\n };\n}\n\nconst bookdownXrefPositionLocators: { [key: string]: XRefPositionLocator } = {\n h1: headingLocator(),\n h2: headingLocator(),\n h3: headingLocator(),\n h4: headingLocator(),\n h5: headingLocator(),\n h6: headingLocator(),\n fig: {\n nodeTypes: ['rmd_chunk'],\n hasXRef: (node: ProsemirrorNode, id: string) => rmdChunkHasXRef(node, 'r', id, /^\\{.*[ ,].*fig\\.cap\\s*=.*\\}\\s*\\n/m),\n },\n tab: {\n nodeTypes: ['rmd_chunk', 'table_container'],\n hasXRef: (node: ProsemirrorNode, id: string) => {\n if (node.type.name === 'rmd_chunk') {\n return rmdChunkHasXRef(node, 'r', id, /kable\\s*\\([\\s\\S]*caption/);\n } else if (node.type.name === 'table_container') {\n const caption = node.child(1);\n const match = caption.textContent.match(/^\\s*\\(#tab\\:([a-zA-Z0-9\\/-]+)\\)\\s*(.*)$/);\n return !!match && match[1].localeCompare(id, undefined, { sensitivity: 'accent' }) === 0;\n } else {\n return false;\n }\n },\n },\n eq: {\n nodeTypes: ['raw_block'],\n markType: 'math',\n hasXRef: (node: ProsemirrorNode, id: string, markType?: MarkType) => {\n // if it's not a mark then ensure it is tex format before proceeding\n if (!markType && (node.attrs.format !== kTexFormat)) {\n return false;\n }\n const match = node.textContent.match(/^.*\\(\\\\#eq:([a-zA-Z0-9\\/-]+)\\).*$/m);\n return !!match && match[1].localeCompare(id, undefined, { sensitivity: 'accent' }) === 0;\n },\n },\n thm: thereomLocator('theorem'),\n lem: thereomLocator('lemma'),\n cor: thereomLocator('corollary'),\n prp: thereomLocator('proposition'),\n cnj: thereomLocator('conjecture'),\n def: thereomLocator('definition'),\n exr: thereomLocator('exercise'),\n};\n\nfunction rmdChunkHasXRef(node: ProsemirrorNode, engine: string, label: string, pattern?: RegExp) {\n const chunk = rmdChunkEngineAndLabel(node.textContent);\n const match = node.textContent.match(/^\\{([a-zA-Z0-9_]+)[\\s,]+([a-zA-Z0-9/-]+)/);\n if (chunk) {\n return (\n chunk.engine.localeCompare(engine, undefined, { sensitivity: 'accent' }) === 0 &&\n chunk.label === label &&\n (!pattern || !!node.textContent.match(pattern))\n );\n } else {\n return false;\n }\n}\n\nfunction headingLocator() {\n return {\n nodeTypes: ['heading'],\n hasXRef: (node: ProsemirrorNode, id: string) => {\n // note we use default pandoc auto id semantics here no matter what the documnet\n // happens to use b/c our xref indexing code also does this (so only ids generated\n // using the 'standard' rules will be in the index)\n return node.attrs.id === id || pandocAutoIdentifier(node.textContent, false) === id;\n },\n };\n}\n\nfunction thereomLocator(engine: string) {\n return {\n nodeTypes: ['rmd_chunk'],\n hasXRef: (node: ProsemirrorNode, id: string) => {\n // look for conventional engine/label\n if (rmdChunkHasXRef(node, engine, id)) {\n return true;\n } else {\n // look for explicit label= syntax\n const match = node.textContent.match(/^\\{([a-zA-Z0-9_]+)[\\s,]+label\\s*=\\s*['\"]([^\"']+)['\"].*\\}/);\n return !!match && match[1].localeCompare(engine, undefined, { sensitivity: 'accent' }) === 0 && match[2] === id;\n }\n },\n };\n}\n","/*\n * pandoc_id.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n// emulate pandoc behavior (https://pandoc.org/MANUAL.html#headings-and-sections)\nexport function pandocAutoIdentifier(text: string, asciify: boolean) {\n if (asciify) {\n text = pandocAsciify(text);\n }\n\n return (\n text\n // Remove all non-alphanumeric characters, except underscores, hyphens, and periods.\n .replace(/[!\"#$%&')*+,\\/:;<=>?@\\[\\\\\\]^`{|}~]/g, '') // filterPunct\n\n // Replace all spaces with hyphens\n .replace(/\\s/g, '-')\n\n // Convert all alphabetic characters to lowercase\n .toLowerCase()\n\n // Remove everything up to the first letter\n .replace(/^[^A-Za-z]+/, '')\n );\n}\n\n// emulate github behavior (note that unemoji should be done prior to calling this)\n// https://pandoc.org/MANUAL.html#extension-gfm_auto_identifiers\n// https://github.com/jgm/pandoc/blob/83880b0dbc318703babfbb6905b1046fa48f1216/src/Text/Pandoc/Shared.hs#L539\nexport function gfmAutoIdentifier(text: string, asciify: boolean) {\n if (asciify) {\n text = pandocAsciify(text);\n }\n\n return text\n .replace(/[!\"#$%&')*+,\\.\\/:;<=>?@\\[\\\\\\]^`{|}~]/g, '') // filterPunct (all but underscore and hyphen)\n .replace(/\\s/g, '-') // spaceToDash\n .toLowerCase(); // toLower\n}\n\n// https://github.com/jgm/pandoc/blob/a5fa55969f1b4afc0ca3e38be50b69c65d43a460/src/Text/Pandoc/Asciify.hs\nexport function pandocAsciify(text: string) {\n const chars: number[] = [];\n const len = text.length;\n let newch;\n for (let i = 0; i < len; i++) {\n newch = '';\n const ch = text.charCodeAt(i);\n switch (ch) {\n case 192:\n case 193:\n case 194:\n case 195:\n case 196:\n case 197:\n case 256:\n case 258:\n case 260:\n case 461:\n case 512:\n case 514:\n case 550:\n case 7680:\n case 7840:\n case 7842:\n newch = 'A';\n break;\n\n case 7682:\n case 7684:\n case 7686:\n newch = 'B';\n break;\n\n case 199:\n case 262:\n case 264:\n case 266:\n case 268:\n newch = 'C';\n break;\n\n case 270:\n case 7690:\n case 7692:\n case 7694:\n case 7696:\n case 7698:\n newch = 'D';\n break;\n\n case 200:\n case 201:\n case 203:\n case 274:\n case 276:\n case 278:\n case 280:\n case 282:\n case 516:\n case 518:\n case 552:\n case 7704:\n case 7706:\n case 7864:\n case 7866:\n case 7868:\n newch = 'E';\n break;\n\n case 7710:\n newch = 'F';\n break;\n\n case 284:\n case 286:\n case 288:\n case 290:\n case 486:\n case 500:\n case 7712:\n newch = 'G';\n break;\n\n case 292:\n case 542:\n case 7714:\n case 7716:\n case 7718:\n case 7720:\n case 7722:\n newch = 'H';\n break;\n\n case 204:\n case 205:\n case 206:\n case 207:\n case 296:\n case 298:\n case 300:\n case 302:\n case 304:\n case 463:\n case 520:\n case 522:\n case 7724:\n case 7880:\n case 7882:\n newch = 'I';\n break;\n\n case 308:\n newch = 'J';\n break;\n\n case 310:\n case 488:\n case 7728:\n case 7730:\n case 7732:\n case 8490:\n newch = 'K';\n break;\n\n case 313:\n case 315:\n case 317:\n case 7734:\n case 7738:\n case 7740:\n newch = 'L';\n break;\n\n case 7742:\n case 7744:\n case 7746:\n newch = 'M';\n break;\n\n case 209:\n case 323:\n case 325:\n case 327:\n case 504:\n case 7748:\n case 7750:\n case 7752:\n case 7754:\n newch = 'N';\n break;\n\n case 210:\n case 211:\n case 212:\n case 213:\n case 214:\n case 332:\n case 334:\n case 336:\n case 416:\n case 465:\n case 490:\n case 524:\n case 526:\n case 558:\n case 7884:\n case 7886:\n newch = 'O';\n break;\n\n case 7764:\n case 7766:\n newch = 'P';\n break;\n\n case 340:\n case 342:\n case 344:\n case 528:\n case 530:\n case 7768:\n case 7770:\n case 7774:\n newch = 'R';\n break;\n\n case 346:\n case 348:\n case 350:\n case 352:\n case 536:\n case 7776:\n case 7778:\n newch = 'S';\n break;\n\n case 354:\n case 356:\n case 538:\n case 7786:\n case 7788:\n case 7790:\n case 7792:\n newch = 'T';\n break;\n\n case 217:\n case 218:\n case 219:\n case 220:\n case 360:\n case 362:\n case 364:\n case 366:\n case 368:\n case 370:\n case 431:\n case 467:\n case 532:\n case 534:\n case 7794:\n case 7796:\n case 7798:\n case 7908:\n case 7910:\n newch = 'U';\n break;\n\n case 7804:\n case 7806:\n newch = 'V';\n break;\n\n case 372:\n case 7808:\n case 7810:\n case 7812:\n case 7814:\n case 7816:\n newch = 'W';\n break;\n\n case 7818:\n case 7820:\n newch = 'X';\n break;\n\n case 221:\n case 374:\n case 376:\n case 562:\n case 7822:\n case 7922:\n case 7924:\n case 7926:\n case 7928:\n newch = 'Y';\n break;\n\n case 377:\n case 379:\n case 381:\n case 7824:\n case 7826:\n case 7828:\n newch = 'Z';\n break;\n\n case 224:\n case 225:\n case 226:\n case 227:\n case 228:\n case 229:\n case 257:\n case 259:\n case 261:\n case 462:\n case 513:\n case 515:\n case 551:\n case 553:\n case 7681:\n case 7841:\n case 7843:\n newch = 'a';\n break;\n\n case 7683:\n case 7685:\n case 7687:\n newch = 'b';\n break;\n\n case 231:\n case 263:\n case 265:\n case 267:\n case 269:\n newch = 'c';\n break;\n\n case 271:\n case 7691:\n case 7693:\n case 7695:\n case 7697:\n case 7699:\n newch = 'd';\n break;\n\n case 232:\n case 233:\n case 234:\n case 235:\n case 275:\n case 277:\n case 279:\n case 281:\n case 283:\n case 517:\n case 519:\n case 7705:\n case 7707:\n case 7865:\n case 7867:\n case 7869:\n newch = 'e';\n break;\n\n case 7711:\n newch = 'f';\n break;\n\n case 285:\n case 287:\n case 289:\n case 291:\n case 487:\n case 501:\n case 7713:\n newch = 'g';\n break;\n\n case 293:\n case 543:\n case 7715:\n case 7717:\n case 7719:\n case 7721:\n case 7723:\n case 7830:\n newch = 'h';\n break;\n\n case 236:\n case 237:\n case 238:\n case 239:\n case 297:\n case 299:\n case 301:\n case 303:\n case 305:\n case 464:\n case 521:\n case 523:\n case 7725:\n case 7881:\n case 7883:\n newch = 'i';\n break;\n\n case 309:\n case 496:\n newch = 'j';\n break;\n\n case 311:\n case 489:\n case 7729:\n case 7731:\n case 7733:\n newch = 'k';\n break;\n\n case 314:\n case 316:\n case 318:\n case 7735:\n case 7739:\n case 7741:\n newch = 'l';\n break;\n\n case 7743:\n case 7745:\n case 7747:\n newch = 'm';\n break;\n\n case 241:\n case 324:\n case 326:\n case 328:\n case 505:\n case 7749:\n case 7751:\n case 7753:\n case 7755:\n newch = 'n';\n break;\n\n case 242:\n case 243:\n case 244:\n case 245:\n case 246:\n case 333:\n case 335:\n case 337:\n case 417:\n case 432:\n case 466:\n case 491:\n case 525:\n case 527:\n case 559:\n case 7885:\n case 7887:\n newch = 'o';\n break;\n\n case 7765:\n case 7767:\n newch = 'p';\n break;\n\n case 341:\n case 343:\n case 345:\n case 529:\n case 531:\n case 7769:\n case 7771:\n case 7775:\n newch = 'r';\n break;\n\n case 347:\n case 349:\n case 351:\n case 353:\n case 537:\n case 7777:\n case 7779:\n newch = 's';\n break;\n\n case 355:\n case 357:\n case 539:\n case 7787:\n case 7789:\n case 7791:\n case 7793:\n case 7831:\n newch = 't';\n break;\n\n case 249:\n case 250:\n case 251:\n case 252:\n case 361:\n case 363:\n case 365:\n case 367:\n case 369:\n case 371:\n case 468:\n case 533:\n case 535:\n case 7795:\n case 7797:\n case 7799:\n case 7909:\n case 7911:\n newch = 'u';\n break;\n\n case 7805:\n case 7807:\n newch = 'v';\n break;\n\n case 373:\n case 7809:\n case 7811:\n case 7813:\n case 7815:\n case 7817:\n case 7832:\n newch = 'w';\n break;\n\n case 7819:\n case 7821:\n newch = 'x';\n break;\n\n case 253:\n case 255:\n case 375:\n case 563:\n case 7833:\n case 7923:\n case 7925:\n case 7927:\n case 7929:\n newch = 'y';\n break;\n\n case 378:\n case 380:\n case 382:\n case 7825:\n case 7827:\n case 7829:\n newch = 'z';\n break;\n\n case 894:\n newch = ';';\n break;\n\n case 8175:\n newch = '`';\n break;\n\n case 8800:\n newch = '=';\n break;\n\n case 8814:\n newch = '<';\n break;\n\n case 8815:\n newch = '>';\n break;\n }\n if (newch) {\n chars.push(newch.charCodeAt(0));\n } else if (ch < 128) {\n chars.push(ch);\n }\n }\n\n // return string\n return String.fromCharCode(...chars);\n}\n","/*\n * raw.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { Schema } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\n\nimport { findParentNodeOfType, setTextSelection } from 'prosemirror-utils';\n\nimport { EditorUI } from './ui';\nimport { setBlockType } from 'prosemirror-commands';\n\nexport const kTexFormat = 'tex';\nexport const kHTMLFormat = 'html';\nexport const kHTML4Format = 'html4';\nexport const kHTML5Format = 'html5';\n\nexport function isRawHTMLFormat(format: string) {\n return [kHTMLFormat, kHTML4Format, kHTML5Format].includes(format);\n}\n\nexport function editRawBlockCommand(ui: EditorUI, outputFormats: string[]) {\n return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n const schema = state.schema;\n\n // enable if we are either inside a raw block or we can insert a raw block\n const rawBlock = findParentNodeOfType(schema.nodes.raw_block)(state.selection);\n\n if (!rawBlock && !setBlockType(schema.nodes.raw_block, { format: 'html' })(state)) {\n return false;\n }\n\n async function asyncEditRawBlock() {\n if (dispatch) {\n // get existing attributes (if any)\n const raw = {\n format: '',\n content: '',\n };\n if (rawBlock) {\n raw.format = rawBlock.node.attrs.format;\n }\n\n // show dialog\n const result = await ui.dialogs.editRawBlock(raw, outputFormats);\n if (result) {\n const tr = state.tr;\n\n // remove means convert the block to text\n if (rawBlock) {\n const range = { from: rawBlock.pos, to: rawBlock.pos + rawBlock.node.nodeSize };\n if (result.action === 'remove') {\n tr.setBlockType(range.from, range.to, schema.nodes.paragraph);\n } else if (result.action === 'edit') {\n tr.setNodeMarkup(range.from, rawBlock.node.type, { format: result.raw.format });\n setTextSelection(tr.selection.from - 1, -1)(tr);\n }\n } else {\n insertRawNode(tr, result.raw.format);\n }\n\n dispatch(tr);\n }\n }\n\n if (view) {\n view.focus();\n }\n }\n asyncEditRawBlock();\n\n return true;\n };\n}\n\n// function to create a raw node\nfunction createRawNode(schema: Schema, format: string) {\n return schema.nodes.raw_block.create({ format })!;\n}\n\n// function to create and insert a raw node, then set selection inside of it\nfunction insertRawNode(tr: Transaction, format: string) {\n const schema = tr.doc.type.schema;\n const prevSel = tr.selection;\n tr.replaceSelectionWith(createRawNode(schema, format), false);\n setTextSelection(tr.mapping.map(prevSel.from), -1)(tr);\n}\n","/*\n * image.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { kPixelUnit, kPercentUnit } from './css';\n\nconst kDpi = 96;\n\n// https://github.com/jgm/pandoc/blob/master/src/Text/Pandoc/ImageSize.hs\nexport const kValidUnits = [kPixelUnit, 'in', 'cm', 'mm', kPercentUnit];\n\nexport enum ImageType {\n Image,\n Figure,\n}\n\nexport interface ImageDimensions {\n naturalWidth: number | null;\n naturalHeight: number | null;\n containerWidth: number;\n}\n\nexport function isValidImageSizeUnit(unit: string) {\n return kValidUnits.includes(unit);\n}\n\nexport function imageSizePropWithUnit(prop: string | null) {\n if (prop) {\n const match = prop.match(/(^\\d*\\.?\\d*)(.*)$/);\n if (match) {\n return {\n size: parseFloat(match[1]),\n unit: match[2],\n };\n } else {\n return null;\n }\n } else {\n return null;\n }\n}\n\nexport function isNaturalAspectRatio(width: number, height: number, dims: ImageDimensions, defaultValue: boolean) {\n if (dims.naturalWidth && dims.naturalHeight) {\n const diff = Math.abs(width / height - dims.naturalWidth / dims.naturalHeight);\n return diff <= 0.01 * (width / height);\n } else {\n // no naturalWidth or naturalHeight, return default\n return defaultValue;\n }\n}\n\nexport function unitToPixels(value: number, unit: string, containerWidth: number) {\n let pixels;\n switch (unit) {\n case 'in':\n pixels = value * kDpi;\n break;\n case 'mm':\n pixels = value * (kDpi / 25.4);\n break;\n case 'cm':\n pixels = value * (kDpi / 2.54);\n break;\n case kPercentUnit:\n pixels = (value / 100) * ensureContainerWidth(containerWidth);\n break;\n case kPixelUnit:\n default:\n pixels = value;\n break;\n }\n return Math.round(pixels);\n}\n\nexport function pixelsToUnit(pixels: number, unit: string, containerWidth: number) {\n switch (unit) {\n case 'in':\n return pixels / kDpi;\n case 'mm':\n return (pixels / kDpi) * 25.4;\n case 'cm':\n return (pixels / kDpi) * 2.54;\n case kPercentUnit:\n return (pixels / ensureContainerWidth(containerWidth)) * 100;\n case kPixelUnit:\n default:\n return pixels;\n }\n}\n\nexport function roundUnit(value: number, unit: string) {\n switch (unit) {\n case 'in':\n return value.toFixed(2);\n case 'cm':\n return value.toFixed(1);\n default:\n return Math.round(value).toString();\n }\n}\n\n// sometime when we are called before the DOM renders the containerWidth\n// is 0, in this case provide a default of 1000\nexport function ensureContainerWidth(containerWidth: number) {\n return containerWidth || 1000;\n}\n","/*\n * extension.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Transaction } from 'prosemirror-state';\n\nexport enum FixupContext {\n Load,\n Save,\n Resize,\n}\n\nexport type FixupFn = (tr: Transaction, fixupContext: FixupContext) => Transaction;\n","/*\n * css.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { kWidthAttrib, kHeightAttrib, kStyleAttrib } from './pandoc_attr';\n\nexport const kPercentUnit = '%';\nexport const kPixelUnit = 'px';\nexport function removeStyleAttrib(style: string, attrib: string, handler?: (attrib: string, value: string) => void) {\n const pattern = '(' + attrib + ')\\\\:\\\\s*([^;]+);?';\n const regex = new RegExp(pattern, 'g');\n return style.replace(regex, (_match, p1, p2) => {\n if (handler) {\n handler(p1, p2);\n }\n return '';\n });\n}\n\nexport function extractSizeStyles(keyvalues: Array<[string, string]> | undefined) {\n if (!keyvalues) {\n return keyvalues;\n }\n\n let newKeyvalues = keyvalues;\n\n const getValue = (key: string) => {\n const pair = newKeyvalues.find(keyvalue => keyvalue[0] === key);\n return pair ? pair[1] : null;\n };\n\n const setValue = (key: string, value: string | null) => {\n newKeyvalues = newKeyvalues.filter(keyvalue => keyvalue[0] !== key);\n if (value) {\n newKeyvalues.push([key, value]);\n }\n };\n\n let width = getValue(kWidthAttrib);\n let height = getValue(kHeightAttrib);\n let style = getValue(kStyleAttrib);\n\n if (style) {\n style = removeStyleAttrib(style, kWidthAttrib, (_attrib, value) => {\n if (!width) {\n width = value;\n }\n });\n style = removeStyleAttrib(style, kHeightAttrib, (_attrib, value) => {\n if (!height) {\n height = value;\n }\n });\n\n // remove leading ; from style\n style = style.replace(/^\\s*;+\\s*/, '').trimLeft();\n }\n\n setValue(kWidthAttrib, width);\n setValue(kHeightAttrib, height);\n setValue(kStyleAttrib, style);\n\n return newKeyvalues;\n}\n\nexport function applyStyles(el: HTMLElement, classes?: string[], style?: { [key: string]: string }) {\n if (classes) {\n if (classes) {\n classes.forEach(clz => el.classList.add(clz));\n }\n }\n if (style) {\n Object.keys(style).forEach(name => {\n el.style.setProperty(name, style[name]);\n });\n }\n}\n\nexport function replaceClassWithStyle(el: HTMLElement, className: string, style: { [key: string]: string }) {\n if (el.classList.contains(className)) {\n el.classList.remove(className);\n if (el.classList.length === 0) {\n el.removeAttribute('class');\n }\n\n Object.keys(style).forEach(name => {\n el.style.setProperty(name, style[name]);\n });\n }\n const children: any = el.children;\n for (const child of children) {\n replaceClassWithStyle(child, className, style);\n }\n}\n","/*\n * diff.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { diff_match_patch, DIFF_DELETE, DIFF_EQUAL, DIFF_INSERT } from 'diff-match-patch';\n\nexport enum EditorChangeType {\n Insert = 1,\n Equal = 0,\n Delete = -1,\n}\n\nexport interface EditorChange {\n type: EditorChangeType;\n value: string;\n}\n\nexport function diffChars(from: string, to: string, timeout: number): EditorChange[] {\n const dmp = new diff_match_patch();\n dmp.Diff_Timeout = timeout;\n const diff = dmp.diff_main(from, to);\n dmp.diff_cleanupSemantic(diff);\n return diff.map(d => {\n let type: EditorChangeType;\n switch (d[0]) {\n case DIFF_INSERT:\n type = EditorChangeType.Insert;\n break;\n case DIFF_EQUAL:\n type = EditorChangeType.Equal;\n break;\n case DIFF_DELETE:\n type = EditorChangeType.Delete;\n break;\n default:\n throw new Error('Unexpected diff type: ' + d[0]);\n }\n return {\n type,\n value: d[1],\n };\n });\n}\n","/*\n * input_rule.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { Schema, MarkType, NodeType, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { InputRule, wrappingInputRule } from 'prosemirror-inputrules';\n\nimport { PandocMark, markIsActive } from './mark';\n\nexport function markInputRule(\n regexp: RegExp,\n markType: MarkType,\n filter: MarkInputRuleFilter,\n getAttrs?: ((match: string[]) => object) | object,\n) {\n return new InputRule(regexp, (state: EditorState, match: string[], start: number, end: number) => {\n if (!filter(state, start, end)) {\n return null;\n }\n\n // remove any leading delimter (modulo spaces)\n const textIndex = match[0].indexOf(match[1]);\n const prefix = match[0].substring(0, textIndex).replace(/^\\s/, \"\");\n const delimStart = start + textIndex - prefix.length;\n const tr = state.tr;\n tr.delete(delimStart, delimStart + prefix.length);\n\n // create mark\n const attrs = getAttrs instanceof Function ? getAttrs(match) : getAttrs;\n const mark = markType.create(attrs);\n\n // apply it to the matching core text\n const markStart = start + textIndex - prefix.length;\n tr.addMark(markStart, markStart + match[1].length, mark);\n tr.removeStoredMark(mark); // Do not continue with mark.\n return tr;\n });\n}\n\nexport function delimiterMarkInputRule(\n delim: string,\n markType: MarkType,\n filter: MarkInputRuleFilter,\n prefixMask?: string,\n noEnclosingWhitespace?: boolean,\n) {\n // create distinct patterns depending on whether we allow enclosing whitespace\n const contentPattern = noEnclosingWhitespace\n ? `[^\\\\s${delim}][^${delim}]+[^\\\\s${delim}]|[^\\\\s${delim}]{1,2}`\n : `[^${delim}]+`;\n\n // if there is no prefix mask then this is simple regex we can pass to markInputRule\n if (!prefixMask) {\n const regexp = `(?:${delim})(${contentPattern})(?:${delim})$`;\n return markInputRule(new RegExp(regexp), markType, filter);\n\n // otherwise we need custom logic to get mark placement/eliding right\n } else {\n // build regex\n const regexp = `(^|[^${prefixMask}])(?:${delim})(${contentPattern})(?:${delim})$`;\n\n // return rule\n return new InputRule(new RegExp(regexp), (state: EditorState, match: string[], start: number, end: number) => {\n if (!filter(state, start, end)) {\n return null;\n }\n\n // init transaction\n const tr = state.tr;\n\n // compute offset for mask (should be zero if this was the beginning of a line,\n // in all other cases it would be the length of the any mask found).\n const maskOffset = match[1].length;\n\n // position of text to be formatted\n const textStart = start + match[0].indexOf(match[2]);\n const textEnd = textStart + match[2].length;\n\n // remove trailing markdown\n tr.delete(textEnd, end);\n\n // update start/end to reflect the leading mask which we want to leave alone\n start = start + maskOffset;\n end = start + match[2].length;\n\n // remove leading markdown\n tr.delete(start, textStart);\n\n // add mark\n const mark = markType.create();\n tr.addMark(start, end, mark);\n\n // remove stored mark so typing continues w/o the mark\n tr.removeStoredMark(mark);\n\n // return transaction\n return tr;\n });\n }\n}\n\nexport type MarkInputRuleFilter = (context: EditorState | Transaction, from?: number, to?: number) => boolean;\n\nexport function markInputRuleFilter(schema: Schema, marks: readonly PandocMark[]): MarkInputRuleFilter {\n const maskedMarkTypes = marksWithNoInputRules(schema, marks);\n\n return (context: EditorState | Transaction, from?: number, to?: number) => {\n if (from !== undefined && to !== undefined && from !== to) {\n const marksInRange: MarkType[] = [];\n context.doc.nodesBetween(from, to, node => {\n node.marks.forEach(mark => marksInRange.push(mark.type));\n });\n return !marksInRange.some(markType => maskedMarkTypes.includes(markType));\n }\n if (from === undefined) {\n for (const markType of maskedMarkTypes) {\n if (markIsActive(context, markType)) {\n return false;\n }\n }\n }\n return true;\n };\n}\n\nexport function conditionalWrappingInputRule(\n regexp: RegExp,\n nodeType: NodeType,\n predicate: (state: EditorState) => boolean,\n getAttrs?: { [key: string]: any } | ((p: string[]) => { [key: string]: any } | null | undefined),\n joinPredicate?: (p1: string[], p2: ProsemirrorNode) => boolean,\n): InputRule {\n const wrappingRule: any = wrappingInputRule(regexp, nodeType, getAttrs, joinPredicate);\n return new InputRule(regexp, (state: EditorState, match: string[], start: number, end: number) => {\n if (!predicate(state)) {\n return null;\n }\n return wrappingRule.handler(state, match, start, end);\n });\n}\n\nfunction marksWithNoInputRules(schema: Schema, marks: readonly PandocMark[]): MarkType[] {\n const disabledMarks: MarkType[] = [];\n marks.forEach((mark: PandocMark) => {\n if (mark.noInputRules) {\n disabledMarks.push(schema.marks[mark.name]);\n }\n });\n return disabledMarks;\n}\n","/*\n * wrap.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Transaction } from 'prosemirror-state';\nimport { Transform } from 'prosemirror-transform';\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\n\nimport { split } from 'sentence-splitter';\n\nimport { trTransform } from './transaction';\nimport { findChildrenByType, findParentNodeOfTypeClosestToPos } from 'prosemirror-utils';\n\nexport function wrapSentences(tr: Transaction) {\n trTransform(tr, wrapSentencesTransform);\n}\n\nfunction wrapSentencesTransform(tr: Transform) {\n // find all paragraphs in doc\n const schema = tr.doc.type.schema;\n const paragraphs = findChildrenByType(tr.doc, schema.nodes.paragraph);\n\n // insert linebreaks in paragraphs (go backwards to preserve positions)\n paragraphs.reverse().forEach(paragraph => {\n // don't break sentences inside tight list items\n const $pos = tr.doc.resolve(paragraph.pos);\n const parent = $pos.node($pos.depth);\n if (parent.type === schema.nodes.list_item && $pos.node($pos.depth - 1).attrs.tight) {\n return;\n }\n\n // don't break sentences inside tables\n if (schema.nodes.table && findParentNodeOfTypeClosestToPos($pos, schema.nodes.table)) {\n return;\n }\n\n // extract text (use \\n for hard_break)\n // based on https://github.com/ProseMirror/prosemirror-model/blob/eef20c8c6dbf841b1d70859df5d59c21b5108a4f/src/fragment.js#L46\n // (but do no handling for leafs b/c we don't have any in our schema and nothing for blocks\n // b/c this is a paragraph so won't have nested blocks. We use our own implementation so that\n // we can correctly count node types that imply text but don't actually have any text\n // (e.g. hard_break)\n \n let textContent = \"\";\n const paraContent = paragraph.node.content;\n const from = 0;\n const to = paraContent.size;\n paraContent.nodesBetween(from, to, (node: ProsemirrorNode, pos: number) => {\n if (node.isText) {\n textContent += node.text!.slice(Math.max(from, pos) - pos, to - pos);\n } else if (node.type.name === \"hard_break\") {\n textContent += \"\\n\";\n }\n }, 0);\n\n // don't break bookdown text references\n if (/^\\(ref\\:[^\\s]+\\)\\s+[^\\s]/.test(textContent)) {\n return;\n }\n\n // break sentences in text\n const parts = split(textContent);\n parts\n .reverse()\n .filter(part => part.type === 'Sentence')\n .forEach(sentence => {\n // don't break sentence if at least one mark is active\n if (tr.doc.resolve(paragraph.pos + sentence.range[1] + 1).marks().length === 0) {\n const hardBreak = schema.text('\\n');\n const hardBreakPos = paragraph.pos + sentence.range[1] + 2;\n tr.insert(hardBreakPos, hardBreak);\n }\n });\n });\n}\n","/*\n * yaml_metadata-title.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Plugin, PluginKey, Transaction, EditorState } from 'prosemirror-state';\n\nimport { transactionsAreTypingChange, transactionsHaveChange } from '../../api/transaction';\nimport {\n isYamlMetadataNode,\n yamlMetadataNodes,\n kYamlMetadataTitleRegex,\n titleFromState,\n} from '../../api/yaml';\n\nconst plugin = new PluginKey<string>('yaml-metadata-title');\n\nexport function yamlMetadataTitlePlugin() {\n return new Plugin<string>({\n key: plugin,\n state: {\n init(_config, state: EditorState) {\n return titleFromState(state);\n },\n\n apply(tr: Transaction, title: string, oldState: EditorState, newState: EditorState) {\n const transactions = [tr];\n\n // doc didn't change, return existing title\n if (!tr.docChanged) {\n return title;\n\n // non-typing change, do a full rescan\n } else if (!transactionsAreTypingChange(transactions)) {\n return titleFromState(newState);\n\n // change that affects a yaml metadata block, do a full rescan\n } else if (transactionsHaveChange(transactions, oldState, newState, isYamlMetadataNode)) {\n return titleFromState(newState);\n }\n\n // otherwise return the existing title\n else {\n return title;\n }\n },\n },\n });\n}\n\nexport function getTitle(state: EditorState) {\n return plugin.getState(state);\n}\n\nexport function setTitle(state: EditorState, title: string) {\n // alias schema\n const schema = state.schema;\n\n // no-op if yaml_metadata isn't available\n if (!schema.nodes.yaml_metadata) {\n return;\n }\n\n // create transaction\n const tr = state.tr;\n\n // escape quotes in title then build the title line\n const escapedTitle = title.replace(/\"/g, `\\\\\"`);\n const titleLine = `\\ntitle: \"${escapedTitle}\"\\n`;\n\n // attempt to update existing title\n const yamlNodes = yamlMetadataNodes(tr.doc);\n let foundTitle = false;\n for (const yaml of yamlNodes) {\n const titleMatch = yaml.node.textContent.match(kYamlMetadataTitleRegex);\n if (titleMatch) {\n const updatedMetadata = yaml.node.textContent.replace(kYamlMetadataTitleRegex, titleLine);\n const updatedNode = schema.nodes.yaml_metadata.createAndFill({}, schema.text(updatedMetadata));\n tr.replaceRangeWith(yaml.pos, yaml.pos + yaml.node.nodeSize, updatedNode);\n foundTitle = true;\n break;\n }\n }\n\n // if we didn't find a title then inject one at the top\n if (!foundTitle) {\n const yamlText = schema.text(`---${titleLine}---`);\n const yamlNode = schema.nodes.yaml_metadata.create({}, yamlText);\n tr.insert(1, yamlNode);\n }\n\n // return transaction\n return tr;\n}\n\n","/*\n * oultine.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Plugin, PluginKey, EditorState, Transaction } from 'prosemirror-state';\nimport { Schema, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\n\nimport { NodeWithPos } from 'prosemirror-utils';\n\nimport { Extension } from '../api/extension';\nimport { transactionsHaveChange, kSetMarkdownTransaction } from '../api/transaction';\nimport { findTopLevelBodyNodes } from '../api/node';\nimport { uuidv4 } from '../api/util';\nimport {\n EditorOutlineItem,\n EditorOutlineItemType,\n EditorOutline,\n isOutlineNode,\n getEditingOutlineLocation,\n getDocumentOutline,\n} from '../api/outline';\nimport { navigateToPos } from '../api/navigation';\nimport { ProsemirrorCommand, EditorCommandId } from '../api/command';\nimport { rmdChunkEngineAndLabel } from '../api/rmd';\n\nconst kOutlineIdsTransaction = 'OutlineIds';\n\nconst plugin = new PluginKey<EditorOutline>('outline');\n\nconst extension: Extension = {\n appendTransaction: (schema: Schema) => {\n return [\n {\n name: 'outline',\n filter: hasOutlineIdsTransaction,\n nodeFilter: isOutlineNode,\n append: (tr: Transaction) => {\n const usedIds = new Set<string>();\n const needsOutlineId = (node: ProsemirrorNode) => {\n if (isOutlineNode(node)) {\n if (node.attrs.navigation_id === null) {\n return true;\n } else if (usedIds.has(node.attrs.navigation_id)) {\n return true;\n } else {\n usedIds.add(node.attrs.navigation_id);\n return false;\n }\n } else {\n return false;\n }\n };\n const needsOutlineIdNodes = findTopLevelBodyNodes(tr.doc, needsOutlineId);\n needsOutlineIdNodes.forEach(outlineId => {\n tr.setNodeMarkup(outlineId.pos, outlineId.node.type, {\n ...outlineId.node.attrs,\n navigation_id: uuidv4(),\n });\n tr.setMeta(kOutlineIdsTransaction, true);\n });\n },\n },\n ];\n },\n\n commands: () => {\n return [\n new ProsemirrorCommand(EditorCommandId.GoToNextSection, ['Mod-PageDown'], goToOutlineCommand('next', 'section')),\n new ProsemirrorCommand(EditorCommandId.GoToPreviousSection, ['Mod-PageUp'], goToOutlineCommand('previous', 'section')),\n new ProsemirrorCommand(EditorCommandId.GoToNextChunk, [], goToOutlineCommand('next', 'chunk')),\n new ProsemirrorCommand(EditorCommandId.GoToPreviousChunk, [], goToOutlineCommand('previous', 'chunk')),\n ];\n },\n\n plugins: (schema: Schema) => {\n return [\n new Plugin<EditorOutline>({\n key: plugin,\n\n // track editor outline as state changes\n state: {\n init: (_config, state: EditorState) => {\n return editorOutline(state);\n },\n apply: (tr: Transaction, value: EditorOutline, oldState: EditorState, newState: EditorState) => {\n if (transactionsAffectOutline([tr], oldState, newState)) {\n return editorOutline(newState);\n } else {\n return value; // don't need to map b/c there are no positions in the data structure\n }\n },\n },\n }),\n ];\n },\n};\n\nexport function goToOutlineCommand(dir: 'next' | 'previous', targetType: 'chunk' | 'section') {\n return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n if (dispatch && view) {\n let outline = getDocumentOutline(state);\n if (dir === 'previous') {\n outline = outline.reverse();\n }\n const target = outline.find(nodeWithPos => {\n // if we are only targeting chunks, do not navigate to other types, and vice versa\n const isChunk = nodeWithPos.node.type === state.schema.nodes.rmd_chunk;\n if (isChunk !== (targetType === 'chunk')) {\n return false;\n }\n\n if (dir === 'next') {\n return nodeWithPos.pos > state.selection.head;\n } else {\n return nodeWithPos.pos < state.selection.head - 1;\n }\n });\n if (target) {\n navigateToPos(view, target.pos, false);\n }\n }\n return true;\n };\n}\n\nfunction editorOutline(state: EditorState): EditorOutline {\n // get all of the headings (bail if there are none)\n const doc = state.doc;\n const outlineNodes = findTopLevelBodyNodes(doc, isOutlineNode);\n if (!outlineNodes.length) {\n return [];\n }\n\n // create mapping of node type names to their current sequence\n const sequence = new Map<string, number>();\n\n // function to create an outline item from a node\n const editorOutlineItem = (nodeWithPos: NodeWithPos, defaultLevel: number) => {\n const typename = nodeWithPos.node.type.name;\n\n // build sequence (ordinal of entry within node type)\n let sequenceLast = sequence.get(typename);\n if (sequenceLast === undefined) {\n sequenceLast = 0;\n }\n const sequenceNext = sequenceLast + 1;\n sequence.set(typename, sequenceNext);\n\n const item = {\n navigation_id: nodeWithPos.node.attrs.navigation_id,\n type: nodeWithPos.node.type.name as EditorOutlineItemType,\n level: nodeWithPos.node.attrs.level || defaultLevel,\n title: nodeWithPos.node.type.spec.code ? nodeWithPos.node.type.name : nodeWithPos.node.textContent,\n sequence: sequenceNext,\n children: [],\n };\n \n // if this is an R Markdown chunk, extract the title from the chunk\n if (nodeWithPos.node.type.name === 'rmd_chunk') {\n const chunk = rmdChunkEngineAndLabel(nodeWithPos.node.textContent);\n if (chunk) {\n item.title = chunk.label;\n }\n }\n return item; \n };\n\n // extract the outline\n const rootOutlineItem: EditorOutlineItem = {\n navigation_id: '',\n type: '' as EditorOutlineItemType,\n level: 0,\n sequence: 0,\n title: '',\n children: [],\n };\n const containers: EditorOutlineItem[] = [];\n containers.push(rootOutlineItem);\n const top = () => containers[containers.length - 1];\n outlineNodes.forEach(nodeWithPos => {\n // get outline item from document node\n const outlineItem = editorOutlineItem(nodeWithPos, top().level + 1);\n\n // pop containers until we reach <= our level\n while (outlineItem.level <= top().level) {\n containers.pop();\n }\n\n // add the outline node\n top().children.push(outlineItem);\n\n // make it the the active container if it's a heading\n if (outlineItem.type === 'heading') {\n containers.push(outlineItem);\n }\n });\n\n // return children of root\n return rootOutlineItem.children;\n}\n\nfunction hasOutlineIdsTransaction(transactions: Transaction[]) {\n return transactions.some(tr => tr.getMeta(kOutlineIdsTransaction));\n}\n\nfunction transactionsAffectOutline(transactions: Transaction[], oldState: EditorState, newState: EditorState) {\n return (\n transactions.some(tr => tr.getMeta(kSetMarkdownTransaction)) ||\n hasOutlineIdsTransaction(transactions) ||\n transactionsHaveChange(transactions, oldState, newState, isOutlineNode)\n );\n}\n\nexport function getOutline(state: EditorState): EditorOutline {\n return plugin.getState(state)!;\n}\n\nexport default extension;\n","/*\n * find.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Extension } from '../api/extension';\nimport { Plugin, PluginKey, EditorState, Transaction, TextSelection } from 'prosemirror-state';\nimport { DecorationSet, Decoration, EditorView } from 'prosemirror-view';\n\nimport { mergedTextNodes } from '../api/text';\nimport { kAddToHistoryTransaction } from '../api/transaction';\nimport { editingRootNode } from '../api/node';\nimport zenscroll from 'zenscroll';\n\nconst key = new PluginKey<DecorationSet>('find-plugin');\n\nclass FindPlugin extends Plugin<DecorationSet> {\n private term: string = '';\n private options: FindOptions = {};\n private updating: boolean = false;\n\n // The HTML element containing the last known selected search result\n private resultElement: HTMLElement|null = null;\n\n // A DOM mutation observer that watches for search results to be rendered\n private resultObserver: MutationObserver|null = null;\n\n // The ID for a timer that ensures the resultObserver completes quickly\n private resultObserverTimer: number = 0;\n\n constructor() {\n super({\n key,\n state: {\n init: (_config: { [key: string]: any }, instance: EditorState) => {\n return DecorationSet.empty;\n },\n apply: (tr: Transaction, old: DecorationSet, oldState: EditorState, newState: EditorState) => {\n if (this.updating) {\n return this.resultDecorations(tr);\n } else {\n return DecorationSet.empty;\n }\n },\n },\n view: () => ({\n update: (view: EditorView, prevState: EditorState) => {\n // Clear any previous search result observer\n this.clearResultObserver();\n\n // If there is a search result selected, navigate to it\n if (this.isResultSelected(view.state)) {\n this.scrollToSelectedResult(view, null);\n }\n },\n }),\n props: {\n decorations: (state: EditorState) => {\n return key.getState(state);\n },\n },\n });\n }\n\n public find(term: string, options: FindOptions) {\n return (state: EditorState<any>, dispatch?: (tr: Transaction<any>) => void) => {\n if (dispatch) {\n this.term = !options.regex ? term.replace(/[-/\\\\^$*+?.()|[\\]{}]/g, (escape: string) => {\n return '\\\\u' + ('0000' + escape.charCodeAt(0).toString(16)).slice(-4);\n }) : term;\n this.options = options;\n this.updateResults(state, dispatch);\n }\n return true;\n };\n }\n\n public matchCount(state: EditorState) {\n return key.getState(state)!.find().length;\n }\n\n public selectFirst() {\n return (state: EditorState<any>, dispatch?: (tr: Transaction<any>) => void) => {\n const decorations: Decoration[] = key.getState(state)!.find(0);\n if (decorations.length === 0) {\n return false;\n }\n\n if (dispatch) {\n const tr = state.tr;\n this.selectResult(tr, decorations[0]);\n this.withResultUpdates(() => {\n dispatch(tr);\n });\n }\n\n return true;\n };\n }\n\n public selectCurrent() {\n return this.selectNext(false);\n }\n\n public selectNext(afterSelection = true) {\n return (state: EditorState<any>, dispatch?: (tr: Transaction<any>) => void) => {\n const selectedText = state.doc.textBetween(state.selection.from, state.selection.to);\n const searchFrom = afterSelection\n ? this.matchesTerm(selectedText)\n ? state.selection.to + 1\n : state.selection.to\n : state.selection.from;\n\n const decorationSet = key.getState(state)!;\n let decorations: Decoration[] = decorationSet.find(searchFrom);\n if (decorations.length === 0) {\n // check for wrapping\n if (this.options.wrap) {\n const searchTo = this.matchesTerm(selectedText) ? state.selection.from - 1 : state.selection.from;\n decorations = decorationSet.find(0, searchTo);\n if (decorations.length === 0) {\n return false;\n }\n // no wrapping\n } else {\n return false;\n }\n }\n\n if (dispatch) {\n const tr = state.tr;\n this.selectResult(tr, decorations[0]);\n this.withResultUpdates(() => {\n dispatch(tr);\n });\n }\n return true;\n };\n }\n\n public selectPrevious() {\n return (state: EditorState<any>, dispatch?: (tr: Transaction<any>) => void) => {\n // sort out where we are searching up to\n const selectedText = state.doc.textBetween(state.selection.from, state.selection.to);\n const searchTo = this.matchesTerm(selectedText) ? state.selection.from - 1 : state.selection.from;\n\n // get all decorations up to the current selection\n const decorationSet = key.getState(state)!;\n let decorations: Decoration[] = decorationSet.find(0, searchTo);\n if (decorations.length === 0) {\n // handle wrapping\n if (this.options.wrap) {\n const searchFrom = this.matchesTerm(selectedText) ? state.selection.to + 1 : state.selection.to;\n decorations = decorationSet.find(searchFrom);\n if (decorations.length === 0) {\n return false;\n }\n // no wrapping\n } else {\n return false;\n }\n }\n\n // find the one closest to the beginning of the current selection\n if (dispatch) {\n // now we need to find the decoration with the largest from value\n const decoration = decorations.reduce((lastDecoration, nextDecoration) => {\n if (nextDecoration.from > lastDecoration.from) {\n return nextDecoration;\n } else {\n return lastDecoration;\n }\n });\n\n const tr = state.tr;\n this.selectResult(tr, decoration);\n this.withResultUpdates(() => {\n dispatch(tr);\n });\n }\n return true;\n };\n }\n\n public replace(text: string) {\n return (state: EditorState<any>, dispatch?: (tr: Transaction<any>) => void) => {\n if (!this.isResultSelected(state)) {\n return false;\n }\n\n if (dispatch) {\n const tr = state.tr;\n const selectionMarks = tr.selection.$from.marksAcross(tr.selection.$to);\n if (text.length > 0) {\n tr.replaceSelectionWith(state.schema.text(text, selectionMarks), false);\n } else {\n tr.deleteSelection();\n }\n \n this.withResultUpdates(() => {\n dispatch(tr);\n });\n }\n\n return true;\n };\n }\n\n public replaceAll(text: string) {\n return (state: EditorState<any>, dispatch?: (tr: Transaction<any>) => void) => {\n \n let replaced = 0;\n\n if (!this.hasTerm()) {\n return replaced;\n }\n\n if (dispatch) {\n const tr = state.tr;\n\n const decorationSet = key.getState(state)!;\n\n const decorations: Decoration[] = decorationSet.find(0);\n decorations.forEach(decoration => {\n const from = tr.mapping.map(decoration.from);\n const to = tr.mapping.map(decoration.to);\n tr.insertText(text, from, to);\n replaced += 1;\n });\n this.withResultUpdates(() => {\n dispatch(tr);\n });\n }\n\n return replaced;\n };\n }\n\n public clear() {\n return (state: EditorState<any>, dispatch?: (tr: Transaction<any>) => void) => {\n if (dispatch) {\n this.term = '';\n this.options = {};\n this.updateResults(state, dispatch);\n }\n return true;\n };\n }\n\n private updateResults(state: EditorState, dispatch: (tr: Transaction<any>) => void) {\n this.withResultUpdates(() => {\n const tr = state.tr;\n tr.setMeta(kAddToHistoryTransaction, false);\n dispatch(tr);\n });\n }\n\n private resultDecorations(tr: Transaction): DecorationSet {\n // bail if no search term\n if (!this.hasTerm()) {\n return DecorationSet.empty;\n }\n\n // decorations to return\n const decorations: Decoration[] = [];\n\n // merge text nodes\n const textNodes = mergedTextNodes(tr.doc);\n\n textNodes.forEach(textNode => {\n const search = this.findRegEx();\n if (!search) {\n return;\n }\n\n let m;\n // tslint:disable-next-line no-conditional-assignment\n while ((m = search.exec(textNode.text))) {\n if (m[0] === '') {\n break;\n }\n const from = textNode.pos + m.index;\n const to = textNode.pos + m.index + m[0].length;\n const classes = ['pm-find-text'];\n if (from === tr.selection.from && to === tr.selection.to) {\n classes.push('pm-selected-text');\n }\n decorations.push(Decoration.inline(from, to, { class: classes.join(' ') }));\n }\n });\n\n // return as decoration set\n return decorations.length ? DecorationSet.create(tr.doc, decorations) : DecorationSet.empty;\n }\n\n private withResultUpdates(f: () => void) {\n this.updating = true;\n f();\n this.updating = false;\n }\n\n private selectResult(tr: Transaction, decoration: Decoration) {\n const selection = new TextSelection(tr.doc.resolve(decoration.from), tr.doc.resolve(decoration.to));\n return tr.setSelection(selection).scrollIntoView();\n }\n\n private isResultSelected(state: EditorState) {\n if (this.hasTerm()) {\n const selectedText = state.doc.textBetween(state.selection.from, state.selection.to);\n return this.matchesTerm(selectedText);\n } else {\n return false;\n }\n }\n\n /**\n * Watch for a search result to appear in the DOM. When it does, scroll it\n * into view.\n * \n * @param view The current EditorView \n */\n private watchForSelectedResult(view: EditorView) {\n // Clear any previous result observer\n this.clearResultObserver();\n\n // Create a new result observer to watch for results to be rendered\n this.resultObserver = new MutationObserver((records: MutationRecord[], observer: MutationObserver) => {\n let resultElement:HTMLElement|null = null;\n\n // Predicate for testing a node to see if it looks like the active search result\n const isResultNode = (node: Node): boolean => {\n if (node.nodeType !== node.ELEMENT_NODE) {\n return false;\n }\n const ele = node as HTMLElement;\n return ele.classList.contains('pm-find-text') && \n ele.classList.contains('pm-selected-text');\n };\n\n // Examine each mutation record to see if it's the one we're looking for\n records.forEach((mutation) => {\n switch(mutation.type) {\n case 'childList':\n // Case 1: a new search result node was added to the DOM\n mutation.addedNodes.forEach((node) => {\n if (isResultNode(node)) {\n resultElement = node as HTMLElement;\n }\n });\n break;\n case 'attributes':\n // Case 2: an existing node gained a \"class\" attribute and is now an\n // active search result\n if (isResultNode(mutation.target)) {\n resultElement = mutation.target as HTMLElement;\n }\n break;\n }\n });\n\n // If we found a result element, scroll it into view and turn off the DOM\n // observer. (If we didn't find one, it may be an irrelevant DOM mutation,\n // so ignore it.)\n if (resultElement) {\n this.scrollToSelectedResult(view, resultElement);\n this.clearResultObserver();\n }\n });\n\n const editingRoot = editingRootNode(view.state.selection);\n if (editingRoot) {\n const container = view.nodeDOM(editingRoot.pos) as HTMLElement;\n\n // Begin observing the editing surface for DOM mutations\n this.resultObserver.observe(container, {\n subtree: true,\n childList: true,\n attributeFilter: ['class'] // Only interested in changes to the \"class\" attribute\n });\n\n // The search results should appear quickly (we're really just waiting for\n // a render loop). If the observer runs for longer than 1s, just cancel\n // it, as it consumes resources and anything observed is likely to be\n // spurious.\n this.resultObserverTimer = window.setTimeout(() => {\n this.clearResultObserver();\n }, 1000);\n }\n }\n\n /**\n * Cleans all state related to the search result DOM observer\n */\n private clearResultObserver() {\n // Disconnect the result observer if running\n if (this.resultObserver !== null) {\n this.resultObserver.disconnect();\n this.resultObserver = null;\n }\n\n // Remove the result observer timer if running\n if (this.resultObserverTimer !== 0) {\n window.clearTimeout(this.resultObserverTimer);\n this.resultObserverTimer = 0;\n }\n }\n\n /**\n * Scrolls the selected search result into view.\n * \n * @param view The EditorView on which to act\n * @param resultElement The HTML element containing the search result, if known\n */\n private scrollToSelectedResult(view: EditorView, resultElement: HTMLElement|null) {\n const editingRoot = editingRootNode(view.state.selection);\n if (editingRoot) {\n const container = view.nodeDOM(editingRoot.pos) as HTMLElement;\n\n if (resultElement === null) {\n // Attempt to find a result element to scroll to if we weren't given one\n resultElement = container.querySelector(\".pm-find-text.pm-selected-text\");\n }\n\n if (resultElement === null || resultElement === this.resultElement) {\n // If we didn't find a result element, or if we found a stale one\n // (hasn't changed), defer scrolling until it has been rendered. This is\n // most common when the search result is inside an Ace editor chunk,\n // which puts the result in the DOM on a deferred render loop.\n this.watchForSelectedResult(view);\n return;\n } \n\n this.resultElement = resultElement;\n\n // Starting offset for scroll position \n let offset = 100;\n\n // Zenscroll can only scroll to a direct child element of the scroll\n // container, but the element containing the search result may be deeply\n // nested in the container. Walk up the DOM tree, summing the offsets,\n // until we get to an element that's actually a child of the scroll\n // container. \n let scrollElement = resultElement;\n while (scrollElement.offsetParent?.parentElement !== container) {\n offset += scrollElement.offsetTop;\n const nextParent = scrollElement.offsetParent;\n if (nextParent === null) {\n break;\n } \n scrollElement = nextParent as HTMLElement;\n }\n\n // Perform the scroll to the element's container plus its offset inside\n // the container.\n const scroller = zenscroll.createScroller(container);\n scroller.center(scrollElement, 350, offset);\n }\n }\n\n private hasTerm() {\n return this.term.length > 0;\n }\n\n private matchesTerm(text: string) {\n if (this.hasTerm()) {\n const regex = this.findRegEx();\n if (regex) {\n return regex.test(text);\n } else {\n return false;\n }\n } else {\n return false;\n }\n }\n\n private findRegEx() {\n try {\n return new RegExp(this.term, !this.options.caseSensitive ? 'gui' : 'gu');\n } catch {\n return null;\n }\n }\n}\n\nconst extension: Extension = {\n plugins: () => {\n return [new FindPlugin()];\n },\n};\n\nexport interface FindOptions {\n regex?: boolean;\n caseSensitive?: boolean;\n wrap?: boolean;\n}\n\nexport function find(view: EditorView, term: string, options: FindOptions): boolean {\n return findPlugin(view).find(term, options)(view.state, view.dispatch);\n}\n\nexport function matchCount(view: EditorView): number {\n return findPlugin(view).matchCount(view.state);\n}\n\nexport function selectFirst(view: EditorView): boolean {\n return findPlugin(view).selectFirst()(view.state, view.dispatch);\n}\n\nexport function selectCurrent(view: EditorView): boolean {\n return findPlugin(view).selectCurrent()(view.state, view.dispatch);\n}\n\nexport function selectNext(view: EditorView): boolean {\n return findPlugin(view).selectNext()(view.state, view.dispatch);\n}\n\nexport function selectPrevious(view: EditorView): boolean {\n return findPlugin(view).selectPrevious()(view.state, view.dispatch);\n}\n\nexport function replace(view: EditorView, text: string): boolean {\n return findPlugin(view).replace(text)(view.state, view.dispatch);\n}\n\nexport function replaceAll(view: EditorView, text: string) {\n return findPlugin(view).replaceAll(text)(view.state, view.dispatch);\n}\n\nexport function clear(view: EditorView): boolean {\n return findPlugin(view).clear()(view.state, view.dispatch);\n}\n\nexport function findPluginState(state: EditorState): DecorationSet | null | undefined {\n return key.getState(state);\n}\n\nfunction findPlugin(view: EditorView): FindPlugin {\n return key.get(view.state) as FindPlugin;\n}\n\nexport default extension;\n","/*\n * omni_insert.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport { DOMOutputSpecArray, Mark, Fragment } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { PandocOutput } from '../../api/pandoc';\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { selectionAllowsCompletions } from '../../api/completion';\nimport { OmniInserter } from '../../api/omni_insert';\nimport { MarkInputRuleFilter } from '../../api/input_rule';\nimport { EditorUI } from '../../api/ui';\n\nimport { omniInsertCompletionHandler } from './omni_insert-completion';\nimport { Extension } from '../../api/extension';\nimport { markIsActive } from '../../api/mark';\n\nexport function markOmniInsert() {\n return {\n marks: [\n {\n name: 'omni_insert',\n spec: {\n inclusive: true,\n noInputRules: true,\n parseDOM: [{ tag: \"span[class*='omni_insert']\" }],\n toDOM(): DOMOutputSpecArray {\n return ['span', { class: 'omni_insert' }];\n },\n },\n pandoc: {\n readers: [],\n writer: {\n priority: 30,\n write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n output.writeInlines(parent);\n },\n },\n },\n },\n ],\n };\n}\n\nexport function omniInsertExtension(\n omniInserters: OmniInserter[],\n inputRuleFilter: MarkInputRuleFilter,\n ui: EditorUI,\n): Extension {\n return {\n commands: () => [new OmniInsertCommand(inputRuleFilter)],\n completionHandlers: () => [omniInsertCompletionHandler(omniInserters, ui)],\n };\n}\n\nclass OmniInsertCommand extends ProsemirrorCommand {\n constructor(markFilter: MarkInputRuleFilter) {\n super(\n EditorCommandId.OmniInsert,\n ['Mod-/'],\n (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n // check whether selection allows completions\n if (!selectionAllowsCompletions(state.selection)) {\n return false;\n }\n\n // if the marks is already active then bail\n if (markIsActive(state, state.schema.marks.omni_insert)) {\n return false;\n }\n\n // check the mark filter\n if (!markFilter(state)) {\n return false;\n }\n\n if (dispatch) {\n const mark = state.schema.marks.omni_insert.create();\n const node = state.schema.text('/', [mark]);\n const tr = state.tr;\n tr.replaceSelectionWith(node, false);\n dispatch(tr);\n }\n\n return true;\n },\n );\n }\n}\n","/*\n * completion.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Selection, EditorState, Transaction, TextSelection } from 'prosemirror-state';\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\nimport { EditorView, DecorationSet } from 'prosemirror-view';\n\nimport { canInsertNode } from './node';\nimport { EditorUI } from './ui';\nimport { kInsertCompletionTransaction } from './transaction';\n\nexport const kCompletionDefaultItemHeight = 22;\nexport const kCompletionDefaultMaxVisible = 10;\nexport const kCompletionDefaultWidth = 180;\n\nexport interface CompletionContext {\n isPaste: boolean;\n}\n\nexport interface CompletionsStream<T = any> {\n items: T[];\n stream: () => T[] | null;\n}\n\nexport type Completions<T = any> = T[] | CompletionsStream<T>;\n\nexport interface CompletionResult<T = any> {\n pos: number;\n offset?: number;\n token: string;\n completions: (state: EditorState, context: CompletionContext) => Promise<Completions>;\n decorations?: DecorationSet;\n}\n\nexport interface CompletionHeaderProps {\n ui: EditorUI;\n message?: string;\n}\n\nexport interface CompletionHandler<T = any> {\n // unique id\n id: string;\n\n // An optional scope for this completion handler. Completions\n // triggered by a transaction will filter completion handlers\n // that share a scope with the completion handler that originated\n // a transaction.\n scope?: string;\n\n // filter for determing whether we can call this handler from a given context (default is to\n // never offer completions if a mark with noInputRules is active). set to null to\n // allow completion anywhere\n enabled?: ((context: EditorState | Transaction) => boolean) | null;\n\n // return a set of completions for the given context. text is the text before\n // before the cursor in the current node (but no more than 500 characters)\n completions(text: string, context: EditorState | Transaction): CompletionResult | null;\n\n // filter a previously returned set of completions\n filter?: (completions: T[], state: EditorState, token: string, prevToken?: string) => T[] | null;\n\n // provide a completion replacement as a string or node (can be passed null if the popup was dismissed)\n replacement?(schema: Schema, completion: T | null): string | ProsemirrorNode | null;\n\n // lower level replacement handler (can be passed null if the popup was dismissed)\n replace?(view: EditorView, pos: number, completion: T | null): Promise<any>;\n\n // completion view\n view: {\n // optional header component (will go inside a <th>)\n header?: () =>\n | {\n component: React.FC<CompletionHeaderProps> | React.ComponentClass<CompletionHeaderProps>;\n height: number;\n message?: string;\n }\n | undefined;\n\n // react compontent type for viewing the item\n component: React.FC<T> | React.ComponentClass<T>;\n\n key: (completion: T) => any;\n\n // width of completion item (defaults to 180).\n width?: number;\n\n // height of completion item (defaults to 22px)\n height?: number;\n\n // use horizontal orientation (defaults to false)\n // (optionally provide a set of item widths)\n horizontal?: boolean;\n horizontalItemWidths?: number[];\n\n // maximum number of visible items (defaults to 10). note that\n // this only applies to completion poupups w/ vertical orientation\n // (scrolling is not supported for horizontal orientation)\n maxVisible?: number;\n\n // hide 'no results' (default false)\n hideNoResults?: boolean;\n };\n}\n\nexport function selectionAllowsCompletions(selection: Selection) {\n const schema = selection.$head.parent.type.schema;\n\n // non empty selections don't have completions\n if (!selection.empty) {\n return false;\n }\n\n // must be able to insert text\n if (!canInsertNode(selection, schema.nodes.text)) {\n return false;\n }\n\n // must not be in a code mark\n if (schema.marks.code && !!schema.marks.code.isInSet(selection.$from.marks())) {\n return false;\n }\n\n // must not be in a code node\n if (selection.$head.parent.type.spec.code) {\n return false;\n }\n\n return true;\n}\n\n// Determine whether two completionHandlers share the same scope. By default\n// completion handlers will share scope only if they share an id, but handlers\n// can provide a scope if they'd like to coordinate.\nexport function completionsShareScope(handler: CompletionHandler, prevHandler?: CompletionHandler) {\n // There is no previous handler, not shared\n if (!prevHandler) {\n return false;\n }\n\n // Previous handler with the same scope as the current handler\n if (prevHandler.scope && prevHandler.scope === handler.scope) {\n return true;\n } else {\n // Previous handler has the same id as the current handler\n return prevHandler.id === handler.id;\n }\n}\n\nexport function performCompletionReplacement(tr: Transaction, pos: number, replacement: ProsemirrorNode | string) {\n // set selection to area we will be replacing\n tr.setSelection(new TextSelection(tr.doc.resolve(pos), tr.selection.$head));\n\n // ensure we have a node\n if (replacement instanceof ProsemirrorNode) {\n // combine it's marks w/ whatever is active at the selection\n const marks = tr.selection.$head.marks();\n\n // set selection and replace it\n tr.replaceSelectionWith(replacement, false);\n\n // propapate marks\n marks.forEach(mark => tr.addMark(pos, tr.selection.to, mark));\n } else {\n tr.insertText(replacement);\n }\n\n // mark the transaction as an completion insertion\n tr.setMeta(kInsertCompletionTransaction, true);\n}\n","/*\n * omni_insert.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Selection, Transaction } from 'prosemirror-state';\nimport { EditorView, DecorationSet } from 'prosemirror-view';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport React from 'react';\nimport { firstBy } from 'thenby';\n\nimport { OmniInserter, omniInsertGroupCompare, omniInsertPriorityCompare } from '../../api/omni_insert';\nimport { CompletionHandler, CompletionResult } from '../../api/completion';\n\nimport { EditorUI } from '../../api/ui';\nimport { placeholderDecoration } from '../../api/placeholder';\nimport { kAddToHistoryTransaction } from '../../api/transaction';\n\nimport './omni_insert-completion.css';\n\nexport function omniInsertCompletionHandler(\n omniInserters: OmniInserter[],\n ui: EditorUI,\n): CompletionHandler<OmniInserter> {\n return {\n id: 'E305158D-20D6-474D-84E6-06607CA58578',\n\n completions: omniInsertCompletions(omniInserters, ui),\n\n filter: (completions: OmniInserter[], state: EditorState, token: string) => {\n // match contents of name or keywords (and verify the command is enabled)\n return completions\n .filter(inserter => {\n return (\n token.length === 0 ||\n inserter.name.toLowerCase().indexOf(token) !== -1 ||\n inserter.keywords?.some(keyword => keyword.indexOf(token) !== -1)\n );\n })\n .filter(inserter => {\n return inserter.command(state);\n })\n .sort(\n firstBy(omniInsertGroupCompare)\n .thenBy(omniInsertPriorityCompare, { direction: 'desc' })\n .thenBy('name'),\n );\n },\n\n replace(view: EditorView, pos: number, completion: OmniInserter | null) {\n // helper to remove command text\n const removeCommandText = () => {\n const tr = view.state.tr;\n tr.deleteRange(pos, view.state.selection.head);\n tr.setMeta(kAddToHistoryTransaction, false);\n view.dispatch(tr);\n };\n\n // execute command if provided\n if (completion) {\n // remove existing text\n removeCommandText();\n\n // execute the command\n completion.command(view.state, view.dispatch, view);\n\n // perform any requested selection offset\n if (completion.selectionOffset) {\n const tr = view.state.tr;\n setTextSelection(tr.selection.from + completion.selectionOffset)(tr);\n tr.setMeta(kAddToHistoryTransaction, false);\n view.dispatch(tr);\n }\n\n // the activation of omni_insert wasn't part of 'natural' typing\n // in the document so remove it\n } else {\n removeCommandText();\n }\n return Promise.resolve();\n },\n\n view: {\n component: OmniInserterView,\n key: command => command.id,\n width: 320,\n height: 46,\n maxVisible: 6,\n },\n };\n}\n\nconst kOmniInsertRegex = /\\/([\\w]*)$/;\n\nfunction omniInsertCompletions(omniInserters: OmniInserter[], ui: EditorUI) {\n return (text: string, context: EditorState | Transaction): CompletionResult<OmniInserter> | null => {\n const match = text.match(kOmniInsertRegex);\n if (match) {\n // we need to either be at the beginning of our parent, OR the omni_insert mark needs\n // to be active (that indicates that we entered omni insert mode via a user command)\n if (match.index !== 0 && !isOmniInsertCommandActive(context.selection)) {\n return null;\n }\n\n // capture query (note that no query returns all).\n const query = match[1].toLowerCase();\n\n // include a decoration if the query is empty\n const decorations =\n query.length === 0\n ? DecorationSet.create(context.doc, [\n placeholderDecoration(context.selection.head, ui.context.translateText(' type to search...')),\n ])\n : undefined;\n\n // return the completion result\n return {\n // match at the /\n pos: context.selection.head - match[0].length,\n\n // unique identifier for this request\n token: query,\n\n // return all omniInserters (will refine via filter)\n completions: (state: EditorState) => {\n return Promise.resolve(omniInserters);\n },\n\n // search placehodler decorator if there is no query\n decorations,\n };\n } else {\n return null;\n }\n };\n}\n\nconst OmniInserterView: React.FC<OmniInserter> = inserter => {\n return (\n <table className={'pm-omni-insert-completion'}>\n <tbody>\n <tr>\n <td className={'pm-omni-insert-icon'}>\n <img className={'pm-block-border-color'} src={inserter.image()} alt=\"\" draggable=\"false\"/>\n </td>\n <td>\n <div className={'pm-omni-insert-name pm-completion-list-item-text'}>{inserter.name}</div>\n <div className={'pm-omni-insert-description pm-completion-list-item-text'}>{inserter.description}</div>\n </td>\n </tr>\n </tbody>\n </table>\n );\n};\n\nfunction isOmniInsertCommandActive(selection: Selection) {\n const schema = selection.$head.parent.type.schema;\n return schema.marks.omni_insert.isInSet(selection.$head.marks());\n}\n","/*\n * omni_insert.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { CommandFn } from './command';\n\n// descriptive info for omni insert\nexport interface OmniInsert {\n name: string;\n keywords?: string[];\n description: string;\n group: OmniInsertGroup;\n priority?: number;\n selectionOffset?: number;\n image: () => string;\n}\n\n// descriptive info + ability to identify/execute\nexport interface OmniInserter extends OmniInsert {\n id: string;\n command: CommandFn;\n}\n\nexport enum OmniInsertGroup {\n Common = 'Common',\n Headings = 'Headings',\n Lists = 'Lists',\n Math = 'Math',\n References = 'References',\n Content = 'Content',\n Blocks = 'Blocks',\n Chunks = 'Chunks',\n}\n\nconst omniInsertGroupOrder = new Map<string, number>(Object.keys(OmniInsertGroup).map((key, index) => [key, index]));\n\nexport function omniInsertGroupCompare(a: OmniInsert, b: OmniInsert) {\n return omniInsertGroupOrder.get(a.group)! - omniInsertGroupOrder.get(b.group)!;\n}\n\nexport function omniInsertPriorityCompare(a: OmniInsert, b: OmniInsert) {\n return (a.priority || 0) - (b.priority || 0);\n}\n","/*\n * placeholder.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, NodeType } from 'prosemirror-model';\nimport { EditorState, Transaction, Plugin, PluginKey } from 'prosemirror-state';\nimport { DecorationSet, Decoration, EditorView } from 'prosemirror-view';\n\nimport { findParentNode } from 'prosemirror-utils';\n\nimport { EditorUI } from './ui';\n\nexport function emptyNodePlaceholderPlugin(nodeType: NodeType, placeholder: (node: ProsemirrorNode) => string, filter?: (tr: Transaction) => boolean) {\n const pluginKey = new PluginKey(nodeType.name + '-empty-placeholder');\n\n return new Plugin<DecorationSet>({\n key: pluginKey,\n state: {\n init(_config: { [key: string]: any }, instance: EditorState) {\n return DecorationSet.empty;\n },\n apply(tr: Transaction, set: DecorationSet, oldState: EditorState, newState: EditorState) {\n // check for empty parent of our type\n const emptyNode = findParentNode(node => node.type === nodeType && node.childCount === 0)(tr.selection);\n if (emptyNode && (!filter || filter(tr))) {\n const decoration = placeholderDecoration(emptyNode.pos + 1, placeholder(emptyNode.node));\n return DecorationSet.create(tr.doc, [decoration]);\n } else {\n return DecorationSet.empty;\n }\n },\n },\n props: {\n decorations(state: EditorState) {\n return pluginKey.getState(state);\n },\n },\n });\n}\n\nexport function placeholderDecoration(pos: number, text: string) {\n return Decoration.widget(pos, (_view: EditorView, _getPos: () => number) => {\n const placeholder = window.document.createElement('span');\n placeholder.classList.add('pm-placeholder-text-color');\n placeholder.innerText = text;\n return placeholder;\n });\n}\n\nexport function iconAndTextPlaceholderDecoration(pos: number, icon: string, text: string) {\n return Decoration.widget(pos, (_view: EditorView, _getPos: () => number) => {\n const container = window.document.createElement('span');\n\n const iconImg = window.document.createElement('img');\n iconImg.classList.add('pm-placeholder-icon');\n iconImg.setAttribute('src', icon);\n iconImg.setAttribute('draggable', 'false');\n\n const message = window.document.createElement('span');\n message.classList.add('pm-placeholder-text-color');\n message.classList.add('pm-placeholder-text');\n message.innerText = text;\n\n container.appendChild(iconImg);\n container.appendChild(message);\n return container;\n });\n}\n\nexport function searchPlaceholderDecoration(pos: number, ui: EditorUI, text?: string) {\n return iconAndTextPlaceholderDecoration(pos, ui.images.search!, text || '');\n}\n","/*\n * completion.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n// TODO: it may be that we need to not do full re-requests from the filter\n// when we have streamed results (as they can cause reset of the allCompletions)\n\nimport { Plugin, PluginKey, Transaction, Selection, EditorState } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport {\n CompletionHandler,\n selectionAllowsCompletions,\n kCompletionDefaultMaxVisible,\n completionsShareScope,\n performCompletionReplacement,\n CompletionResult,\n Completions,\n CompletionsStream,\n} from '../../api/completion';\nimport { EditorEvents } from '../../api/events';\nimport { ScrollEvent } from '../../api/event-types';\n\nimport { createCompletionPopup, renderCompletionPopup, destroyCompletionPopup } from './completion-popup';\nimport { EditorUI } from '../../api/ui';\nimport { PromiseQueue } from '../../api/promise';\nimport { MarkInputRuleFilter } from '../../api/input_rule';\nimport { kInsertCompletionTransaction, kPasteTransaction } from '../../api/transaction';\n\ninterface CompletionState {\n handler?: CompletionHandler;\n result?: CompletionResult;\n prevToken?: string;\n isPaste?: boolean;\n}\n\nexport function completionExtension(\n handlers: readonly CompletionHandler[],\n inputRuleFilter: MarkInputRuleFilter,\n ui: EditorUI,\n events: EditorEvents,\n) {\n return {\n plugins: () => [new CompletionPlugin(handlers, inputRuleFilter, ui, events)],\n };\n}\n\nconst key = new PluginKey<CompletionState>('completion');\n\nclass CompletionPlugin extends Plugin<CompletionState> {\n // editor ui\n private readonly ui: EditorUI;\n\n // editor view\n private view: EditorView | null = null;\n\n // popup elemeent\n private completionPopup: HTMLElement | null = null;\n\n // currently selected index and last set of completions are held as transient\n // state because they can't be derived from the document state (selectedIndex\n // is derived from out of band user keyboard gestures and completions may\n // have required fulfilling an external promise). also use a version counter\n // used to invalidate async completion requests that are fulfilled after\n // an update has occurred\n private version = 0;\n private allCompletions: any[] = [];\n private completions: any[] = [];\n private horizontal = false;\n private selectedIndex = 0;\n\n // serialize async completion requests\n private completionQueue = new PromiseQueue();\n\n // events we need to unsubscribe from\n private readonly scrollUnsubscribe: VoidFunction;\n\n constructor(\n handlers: readonly CompletionHandler[],\n inputRuleFilter: MarkInputRuleFilter,\n ui: EditorUI,\n events: EditorEvents,\n ) {\n super({\n key,\n state: {\n init: () => ({}),\n apply: (tr: Transaction, prevState: CompletionState) => {\n // if we don't have a view then bail\n if (!this.view) {\n return {};\n }\n\n // selection only changes dismiss any active completion\n if (!tr.docChanged && !tr.storedMarksSet && tr.selectionSet) {\n return {};\n }\n\n // check whether completions are valid here\n if (!selectionAllowsCompletions(tr.selection)) {\n return {};\n }\n\n // calcluate text before cursor\n const textBefore = completionTextBeforeCursor(tr.selection);\n\n // if there is no text then don't handle it\n if (textBefore.length === 0) {\n return {};\n }\n\n const isPaste = tr.getMeta(kPasteTransaction) === true;\n\n // check for a handler that can provide completions at the current selection\n for (const handler of handlers) {\n // first check if the handler is enabled (null means use inputRuleFilter)\n if (handler.enabled === null || (handler.enabled ? handler.enabled(tr) : inputRuleFilter(tr))) {\n const result = handler.completions(textBefore, tr);\n if (result) {\n // check if the previous state had a completion from the same handler\n let prevToken: string | undefined;\n\n // If this completion shares scope with the previous completion\n // and this is a completion transaction, skip\n if (tr.getMeta(kInsertCompletionTransaction) && completionsShareScope(handler, prevState.handler)) {\n continue;\n }\n\n if (handler.id === prevState.handler?.id) {\n // pass the prevToken on if the completion was for the same position\n if (result.pos === prevState.result?.pos) {\n prevToken = prevState.result.token;\n }\n }\n\n // return state\n return { handler, result, prevToken, isPaste };\n }\n }\n }\n\n // no handler found\n return {};\n },\n },\n\n view: () => ({\n update: (view: EditorView) => {\n // increment version\n this.version++;\n\n // set view\n this.view = view;\n\n // update completions\n this.updateCompletions(view, true);\n },\n\n destroy: () => {\n // unsubscribe from events\n this.scrollUnsubscribe();\n window.document.removeEventListener('focusin', this.clearCompletions);\n\n // tear down the popup\n this.clearCompletions();\n },\n }),\n\n props: {\n decorations: (state: EditorState) => {\n const pluginState = key.getState(state);\n return pluginState?.result?.decorations;\n },\n\n handleDOMEvents: {\n keydown: (view: EditorView, event: Event) => {\n const kbEvent = event as KeyboardEvent;\n\n let handled = false;\n\n // determine meaning of keys based on orientation\n const forwardKey = this.horizontal ? 'ArrowRight' : 'ArrowDown';\n const backwardKey = this.horizontal ? 'ArrowLeft' : 'ArrowUp';\n\n if (this.completionsActive()) {\n switch (kbEvent.key) {\n case 'Escape':\n this.dismissCompletions();\n handled = true;\n break;\n case 'Enter':\n case 'Tab':\n this.insertCompletion(view, this.selectedIndex);\n handled = true;\n break;\n case backwardKey:\n this.selectedIndex = Math.max(this.selectedIndex - 1, 0);\n this.renderCompletions(view);\n handled = true;\n break;\n case forwardKey:\n this.selectedIndex = Math.min(this.selectedIndex + 1, this.completions.length - 1);\n this.renderCompletions(view);\n handled = true;\n break;\n case 'PageUp':\n this.selectedIndex = Math.max(this.selectedIndex - this.completionPageSize(), 0);\n this.renderCompletions(view);\n handled = true;\n break;\n case 'PageDown':\n this.selectedIndex = Math.min(\n this.selectedIndex + this.completionPageSize(),\n this.completions.length - 1,\n );\n this.renderCompletions(view);\n handled = true;\n break;\n case 'End':\n this.selectedIndex = this.completions.length - 1;\n this.renderCompletions(view);\n handled = true;\n break;\n case 'Home':\n this.selectedIndex = 0;\n this.renderCompletions(view);\n handled = true;\n break;\n }\n }\n\n // supress event if we handled it\n if (handled) {\n event.preventDefault();\n event.stopPropagation();\n }\n\n // return status\n return handled;\n },\n },\n },\n });\n\n // capture reference to ui\n this.ui = ui;\n\n // hide completions when we scroll or the focus changes\n this.clearCompletions = this.clearCompletions.bind(this);\n this.scrollUnsubscribe = events.subscribe(ScrollEvent, this.clearCompletions);\n window.document.addEventListener('focusin', this.clearCompletions);\n }\n\n private updateCompletions(view: EditorView, resetSelection: boolean) {\n const state = key.getState(view.state);\n\n if (state?.handler && state?.result) {\n // track the request version to invalidate the result if an\n // update happens after it goes into flight\n const requestVersion = this.version;\n\n // make an async request for the completions, update allCompletions,\n // and then apply any filter we have (allows the completer to just return\n // everything from the aysnc query and fall back to the filter for refinement)\n const requestAllCompletions = async () => {\n // fetch completions\n const completions = await state.result!.completions(view.state, { isPaste: state.isPaste === true });\n\n // if we don't have a handler or result then return\n if (!state.handler || !state.result) {\n return;\n }\n\n // function to update completions\n const updateCompletions = (updatedCompletions: any[]) => {\n // save completions\n this.setAllCompletions(updatedCompletions, !!state.handler?.view.horizontal, resetSelection);\n\n // display if the request still maps to the current state\n if (state.handler && state.result && this.version === requestVersion) {\n // if there is a filter then call it and update displayed completions\n const displayedCompletions = state.handler.filter\n ? state.handler.filter(this.allCompletions, view.state, state.result.token)\n : null;\n if (displayedCompletions) {\n this.setDisplayedCompletions(displayedCompletions, !!state.handler.view.horizontal, resetSelection);\n }\n\n this.renderCompletions(view);\n }\n };\n\n // if we got an array, just set it. if we got a stream then poll it for it's update\n if (Array.isArray(completions)) {\n updateCompletions(completions);\n } else {\n const completionStream = completions as CompletionsStream;\n updateCompletions(completionStream.items);\n const pollingInterval = setInterval(() => {\n // if the document has been updated then invalidate\n if (this.version !== requestVersion) {\n clearInterval(pollingInterval);\n } else {\n // otherwise check the stream\n const result = completionStream.stream();\n if (result) {\n clearInterval(pollingInterval);\n updateCompletions(result);\n }\n }\n }, 300);\n }\n };\n\n // first see if we can do this exclusively via filter\n if (state.prevToken && state.handler.filter) {\n this.completionQueue.enqueue(async () => {\n // display if the request still maps to the current state\n if (state.handler && state.result && this.version === requestVersion) {\n const filteredCompletions = state.handler.filter!(\n this.allCompletions,\n view.state,\n state.result.token,\n state.prevToken,\n );\n\n // got a hit from the filter!\n if (filteredCompletions) {\n this.setDisplayedCompletions(filteredCompletions, !!state.handler.view.horizontal, resetSelection);\n this.renderCompletions(view);\n\n // couldn't use the filter, do a full request for all completions (so long as we aren't\n // already waiting on a strea,)\n } else {\n await requestAllCompletions();\n }\n }\n });\n } else {\n // no prevToken or no filter for this handler, request everything\n this.completionQueue.enqueue(requestAllCompletions);\n }\n } else {\n // no handler/result for this document state\n this.clearCompletions();\n }\n }\n\n private renderCompletions(view: EditorView) {\n const state = key.getState(view.state);\n\n if (state && state.handler && (this.completions.length > 0 || !state.handler.view.hideNoResults)) {\n const props = {\n handler: state.handler!,\n pos: state.result!.pos + (state.result!.offset || 0),\n completions: this.completions,\n selectedIndex: this.selectedIndex,\n noResults: this.ui.context.translateText('No Results'),\n onClick: (index: number) => {\n this.insertCompletion(view, index);\n },\n onHover: (index: number) => {\n this.selectedIndex = index;\n this.renderCompletions(view);\n },\n ui: this.ui,\n };\n\n // create the completion popup if we need to\n if (this.completionPopup === null) {\n this.completionPopup = createCompletionPopup();\n window.document.body.appendChild(this.completionPopup);\n }\n\n // render\n renderCompletionPopup(view, props, this.completionPopup);\n } else {\n // hide\n this.hideCompletionPopup();\n }\n }\n\n private async insertCompletion(view: EditorView, index: number) {\n // default index if not specified\n index = index || this.selectedIndex;\n\n const state = key.getState(view.state);\n if (state && state.handler) {\n // perform replacement\n const result = state.result!;\n\n // check low level handler first\n if (state.handler.replace) {\n // execute replace\n await state.handler.replace(view, result.pos, this.completions[index]);\n\n // use higher level handler\n } else if (state.handler.replacement) {\n // get replacement from handler\n const replacement = state.handler.replacement(view.state.schema, this.completions[index]);\n if (replacement) {\n const tr = view.state.tr;\n performCompletionReplacement(tr, result.pos, replacement);\n view.dispatch(tr);\n }\n }\n // set focus\n view.focus();\n }\n this.clearCompletions();\n }\n\n // explicit user dismiss of completion (e.g. Esc key)\n private async dismissCompletions() {\n // call lower-level replace on any active handler (w/ null). this gives\n // them a chance to dismiss any artifacts that were explicitly inserted\n // to trigger the handler (e.g. a cmd+/ for omni-insert)\n if (this.view) {\n const state = key.getState(this.view.state);\n if (state?.result && state.handler) {\n if (state.handler.replace) {\n await state.handler.replace(this.view, state.result.pos, null);\n } else if (state.handler.replacement) {\n state.handler.replacement(this.view.state.schema, null);\n }\n }\n }\n\n this.clearCompletions();\n }\n\n private clearCompletions() {\n this.setAllCompletions([], false, true);\n this.hideCompletionPopup();\n }\n\n private hideCompletionPopup() {\n if (this.completionPopup) {\n destroyCompletionPopup(this.completionPopup);\n this.completionPopup = null;\n }\n }\n\n private completionsActive() {\n return !!this.completionPopup;\n }\n\n private setAllCompletions(completions: any[], horizontal: boolean, resetSelection: boolean) {\n this.allCompletions = completions;\n this.setDisplayedCompletions(completions, horizontal, resetSelection);\n }\n\n private setDisplayedCompletions(completions: any[], horizontal: boolean, resetSelection: boolean) {\n this.completions = completions;\n this.horizontal = !!horizontal;\n\n // reset selection if requested or if the current index exceeds the # of completions\n if (resetSelection || this.selectedIndex > this.completions.length - 1) {\n this.selectedIndex = 0;\n }\n }\n\n private completionPageSize() {\n if (this.view) {\n const state = key.getState(this.view.state);\n return state?.handler?.view.maxVisible || kCompletionDefaultMaxVisible;\n } else {\n return kCompletionDefaultMaxVisible;\n }\n }\n}\n\n// extract the text before the cursor, dealing with block separators and\n// non-text leaf chracters (this is based on code in prosemirror-inputrules)\nfunction completionTextBeforeCursor(selection: Selection, maxLength = 500) {\n const { $head } = selection;\n return $head.parent.textBetween(\n Math.max(0, $head.parentOffset - maxLength), // start\n $head.parentOffset, // end\n undefined, // block separator\n '\\ufffc', // leaf char\n );\n}\n","/*\n * completion-popup.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView } from 'prosemirror-view';\n\nimport React, { useEffect } from 'react';\nimport ReactDOM from 'react-dom';\n\nimport zenscroll from 'zenscroll';\n\nimport { applyStyles } from '../../api/css';\nimport {\n CompletionHandler,\n kCompletionDefaultItemHeight,\n kCompletionDefaultMaxVisible,\n kCompletionDefaultWidth,\n} from '../../api/completion';\nimport { Popup } from '../../api/widgets/popup';\n\nimport './completion-popup.css';\nimport { EditorUI } from '../../api/ui';\n\nconst kNoResultsHeight = 22;\n\nexport interface CompletionListProps {\n handler: CompletionHandler;\n pos: number;\n completions: any[];\n selectedIndex: number;\n noResults: string;\n onHover: (index: number) => void;\n onClick: (index: number) => void;\n ui: EditorUI;\n}\n\nexport function createCompletionPopup(): HTMLElement {\n const popup = window.document.createElement('div');\n popup.style.position = 'absolute';\n popup.style.zIndex = '900';\n return popup;\n}\n\nexport function renderCompletionPopup(view: EditorView, props: CompletionListProps, popup: HTMLElement) {\n // position popup\n const size = completionPopupSize(props);\n const positionStyles = completionPopupPositionStyles(view, props.pos, size.width, size.height);\n applyStyles(popup, [], positionStyles);\n\n // render popup\n ReactDOM.render(<CompletionPopup {...props} />, popup);\n}\n\nexport function destroyCompletionPopup(popup: HTMLElement) {\n ReactDOM.unmountComponentAtNode(popup);\n popup.remove();\n}\n\nconst CompletionPopup: React.FC<CompletionListProps> = props => {\n // main completion popup + class + dark mode if appropriate\n const classes = ['pm-completion-popup'].concat(props.ui.prefs.darkMode() ? ['pm-dark-mode'] : []);\n return (\n <Popup classes={classes}>\n <CompletionList {...props} />\n </Popup>\n );\n};\n\nconst CompletionList: React.FC<CompletionListProps> = props => {\n const size = completionPopupSize(props);\n const itemHeight = props.handler.view.height || kCompletionDefaultItemHeight;\n\n // keep selected index in view\n const containerRef = React.useRef<HTMLDivElement>(null);\n useEffect(() => {\n const containerEl = containerRef.current;\n if (containerEl) {\n const rows = containerEl.getElementsByClassName('pm-completion-list-item-row');\n const scrollToRow = rows.item(props.selectedIndex);\n if (scrollToRow) {\n const scroller = zenscroll.createScroller(containerEl);\n scroller.intoView(scrollToRow as HTMLElement);\n }\n }\n }, [props.selectedIndex]);\n\n // item event handler\n const itemEventHandler = (index: number, handler: (index: number) => void) => {\n return (event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n handler(index);\n };\n };\n\n // completion source based on orientation\n const completions = props.handler.view.horizontal ? horizontalCompletions : verticalCompletions;\n\n const classes = ['pm-completion-list'].concat(props.handler.view.horizontal ? ['pm-completion-list-horizontal'] : []);\n\n return (\n <div\n ref={containerRef}\n className={classes.join(' ')}\n style={{ width: size.width + 'px', height: size.height + 'px' }}\n >\n <table>\n {completionsHeader(props.handler, props.completions.length, props)}\n <tbody>\n {completions(props, itemHeight, itemEventHandler)}\n {props.completions.length === 0 ? completionsNoResults(props) : null}\n </tbody>\n </table>\n </div>\n );\n};\n\nfunction completionsHeader(handler: CompletionHandler, completionCount: number, props: CompletionListProps) {\n if (handler.view.header) {\n const completionHeader = handler.view.header ? handler.view.header() : undefined;\n const headerProps = { message: completionHeader?.message, ...props };\n\n if (completionHeader) {\n const header = React.createElement(completionHeader.component, headerProps);\n return (\n <thead>\n <tr>\n <th\n style={{ lineHeight: completionHeader.height + 'px' }}\n colSpan={props.handler.view.horizontal ? completionCount : undefined}\n >\n {header}\n </th>\n </tr>\n </thead>\n );\n } else {\n return null;\n }\n } else {\n return null;\n }\n}\n\ntype ItemEventHandler = (index: number, handler: (index: number) => void) => (event: React.MouseEvent) => void;\n\nfunction verticalCompletions(props: CompletionListProps, itemHeight: number, itemEventHandler: ItemEventHandler) {\n return props.completions.map((completion, index) => {\n const { key, cell } = completionItemCell(props, completion, index);\n return (\n <tr\n key={key}\n style={{ lineHeight: itemHeight + 'px' }}\n className={'pm-completion-list-item-row'}\n onClick={itemEventHandler(index, props.onClick)}\n onMouseMove={itemEventHandler(index, props.onHover)}\n >\n {cell}\n </tr>\n );\n });\n}\n\nfunction horizontalCompletions(props: CompletionListProps, itemHeight: number, itemEventHandler: ItemEventHandler) {\n const cellWidths = horizontalCellWidths(props);\n return (\n <tr style={{ lineHeight: itemHeight + 'px' }}>\n {props.completions.map((completion, index) => {\n const { cell } = completionItemCell(props, completion, index, cellWidths[index], itemEventHandler);\n return cell;\n })}\n </tr>\n );\n}\n\nfunction completionItemCell(\n props: CompletionListProps,\n completion: any,\n index: number,\n width?: number,\n itemEventHandler?: ItemEventHandler,\n) {\n // need to provide key for both wrapper and item\n // https://stackoverflow.com/questions/28329382/understanding-unique-keys-for-array-children-in-react-js#answer-28329550\n const key = props.handler.view.key(completion);\n const item = React.createElement(props.handler.view.component, { ...completion, key });\n const className = 'pm-completion-list-item' + (index === props.selectedIndex ? ' pm-selected-list-item' : '');\n const cell = (\n <td\n key={key}\n style={width ? { width: width + 'px' } : undefined}\n className={className}\n onClick={itemEventHandler ? itemEventHandler(index, props.onClick) : undefined}\n onMouseMove={itemEventHandler ? itemEventHandler(index, props.onHover) : undefined}\n >\n {item}\n </td>\n );\n return { key, cell };\n}\n\nfunction completionsNoResults(props: CompletionListProps) {\n return (\n <tr\n className={'pm-completion-no-results pm-placeholder-text-color'}\n style={{ lineHeight: kNoResultsHeight + 'px' }}\n >\n <td>{props.noResults}</td>\n </tr>\n );\n}\n\nfunction completionPopupSize(props: CompletionListProps) {\n // kicker for list margins/border/etc\n const kCompletionsChrome = 8;\n\n // get view props (apply defaults)\n let { height: itemHeight = kCompletionDefaultItemHeight } = props.handler.view;\n const { maxVisible = kCompletionDefaultMaxVisible, width = kCompletionDefaultWidth } = props.handler.view;\n\n // add 2px for the border to item heights\n const kBorderPad = 2;\n itemHeight += kBorderPad;\n\n // compute header height\n let headerHeight = 0;\n if (props.handler.view.header) {\n const completionHeader = props.handler.view.header();\n if (completionHeader) {\n headerHeight = completionHeader.height + kBorderPad;\n }\n }\n\n // complete based on horizontal vs. vertical\n if (props.handler.view.horizontal) {\n // horizontal mode can provide explicit item widths\n const kTablePadding = 8;\n const kCellPadding = 8;\n const kCellBorders = 2;\n const totalWidth =\n horizontalCellWidths(props).reduce((total, current) => {\n return total + (current + kCellPadding + kCellBorders);\n }, 0) + kTablePadding;\n\n return {\n width: totalWidth,\n height: headerHeight + itemHeight + kCompletionsChrome,\n };\n } else {\n // compute height (subject it to a minimum require to display 'no results')\n const height =\n headerHeight +\n kCompletionsChrome +\n Math.max(itemHeight * Math.min(maxVisible, props.completions.length), kNoResultsHeight);\n\n // return\n return { width, height };\n }\n}\n\nfunction horizontalCellWidths(props: CompletionListProps) {\n const { width = kCompletionDefaultWidth } = props.handler.view;\n return props.completions.map((_completion, index) => {\n if (props.handler.view.horizontalItemWidths) {\n return props.handler.view.horizontalItemWidths[index] || width;\n } else {\n return width;\n }\n });\n}\n\nfunction completionPopupPositionStyles(view: EditorView, pos: number, width: number, height: number) {\n // some constants\n const kMinimumPaddingToEdge = 5;\n const kCompletionsVerticalPadding = 5;\n\n // default position\n const selectionCoords = view.coordsAtPos(pos);\n\n let top = selectionCoords.bottom + kCompletionsVerticalPadding;\n let left = selectionCoords.left;\n\n // see if we need to be above\n if (top + height + kMinimumPaddingToEdge >= window.innerHeight) {\n top = selectionCoords.top - height - kCompletionsVerticalPadding;\n }\n\n // see if we need to be to the left (use cursor as pos in this case)\n if (left + width + kMinimumPaddingToEdge >= window.innerWidth) {\n const cursorCoords = view.coordsAtPos(view.state.selection.head);\n left = cursorCoords.right - width;\n }\n\n return {\n left: left + 'px',\n top: top + 'px',\n };\n}\n","/*\n * popup.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\n\nimport { WidgetProps } from './react';\n\nexport type PopupProps = WidgetProps;\n\nexport const Popup: React.FC<PopupProps> = props => {\n const className = ['pm-popup', 'pm-text-color', 'pm-proportional-font', 'pm-pane-border-color', 'pm-background-color']\n .concat(props.classes || [])\n .join(' ');\n\n const style: React.CSSProperties = {\n ...props.style,\n position: 'absolute',\n zIndex: 10,\n };\n\n return (\n <div className={className} style={style} contentEditable={false} suppressContentEditableWarning={true}>\n {props.children}\n </div>\n );\n};\n","/*\n * promise.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\ninterface PendingPromise<T> {\n promise: () => Promise<T>;\n resolve: (result: T) => void;\n reject: (reason: any) => void;\n}\n\nexport class PromiseQueue<T = unknown> {\n private queue = new Array<PendingPromise<T>>();\n private running = false;\n\n public enqueue(promise: () => Promise<T>) {\n return new Promise<T>((resolve, reject) => {\n this.queue.push({\n promise,\n resolve,\n reject,\n });\n this.dequeue();\n });\n }\n\n private dequeue() {\n if (this.running) {\n return false;\n }\n const item = this.queue.shift();\n if (!item) {\n return false;\n }\n try {\n this.running = true;\n item\n .promise()\n .then(value => {\n this.running = false;\n item.resolve(value);\n this.dequeue();\n })\n .catch(err => {\n this.running = false;\n item.reject(err);\n this.dequeue();\n });\n } catch (err) {\n this.running = false;\n item.reject(err);\n this.dequeue();\n }\n return true;\n }\n}\n","/*\n * spelling-doc.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView, DecorationSet, Decoration } from 'prosemirror-view';\nimport { TextSelection, Plugin, PluginKey, EditorState, Transaction } from 'prosemirror-state';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { PandocMark } from '../../api/mark';\nimport {\n EditorWordRange,\n EditorSpellingDoc,\n EditorWordSource,\n EditorAnchor,\n EditorRect,\n EditorUISpelling,\n} from '../../api/spelling';\nimport { scrollIntoView } from '../../api/scroll';\n\nimport { excludedMarks, getWords, spellcheckerWord } from './spelling';\n\n// get the document interface required by interactive spellchecking\n\nexport function getSpellingDoc(\n view: EditorView,\n marks: readonly PandocMark[],\n spelling: EditorUISpelling,\n): EditorSpellingDoc {\n // alias schema\n const schema = view.state.schema;\n\n // intialize marks we don't want to check\n const excluded = excludedMarks(schema, marks);\n\n // check begin\n spellingDocPlugin(view.state).onCheckBegin();\n\n return {\n getWords: (start: number, end: number): EditorWordSource => {\n return getWords(view.state, start, end, spelling, excluded);\n },\n\n createAnchor: (pos: number): EditorAnchor => {\n return spellingDocPlugin(view.state).createAnchor(pos);\n },\n\n shouldCheck: (_wordRange: EditorWordRange): boolean => {\n return true;\n },\n\n setSelection: (wordRange: EditorWordRange) => {\n const tr = view.state.tr;\n tr.setSelection(TextSelection.create(tr.doc, wordRange.start, wordRange.end));\n view.dispatch(tr);\n },\n\n getText: (wordRange: EditorWordRange): string => {\n const word = view.state.doc.textBetween(wordRange.start, wordRange.end);\n return spellcheckerWord(word);\n },\n\n replaceSelection: (text: string) => {\n const tr = view.state.tr;\n const selectionMarks = tr.selection.$from.marks();\n tr.replaceSelectionWith(view.state.schema.text(text, selectionMarks), false);\n view.dispatch(tr);\n },\n\n getCursorPosition: (): number => {\n return view.state.selection.to;\n },\n\n getSelectionStart: (): number => {\n return view.state.selection.from;\n },\n\n getSelectionEnd: (): number => {\n return view.state.selection.to;\n },\n\n getCursorBounds: (): EditorRect => {\n const fromCoords = view.coordsAtPos(view.state.selection.from);\n const toCoords = view.coordsAtPos(view.state.selection.to);\n\n return {\n x: Math.min(fromCoords.left, toCoords.left),\n y: fromCoords.top,\n width: Math.abs(fromCoords.left - toCoords.left),\n height: toCoords.bottom - fromCoords.top,\n };\n },\n\n moveCursorNearTop: () => {\n scrollIntoView(view, view.state.selection.from, false, undefined, 100);\n },\n\n dispose: () => {\n spellingDocPlugin(view.state).onCheckEnd(view);\n },\n };\n}\n\n// companion plugin for SpellingDoc provided above (shows 'fake' selection during\n// interactive spell check dialog and maintains anchor position(s) across\n// transactions that occur while the dialog/doc is active)\n\nconst spellingDocKey = new PluginKey<DecorationSet>('spelling-doc-plugin');\n\nfunction spellingDocPlugin(state: EditorState) {\n return spellingDocKey.get(state) as SpellingDocPlugin;\n}\n\nexport class SpellingDocPlugin extends Plugin<DecorationSet> {\n private checking = false;\n private anchors: SpellingAnchor[] = [];\n\n constructor() {\n super({\n key: spellingDocKey,\n state: {\n init: () => {\n return DecorationSet.empty;\n },\n apply: (tr: Transaction, old: DecorationSet, oldState: EditorState, newState: EditorState) => {\n if (this.checking) {\n // map anchors\n this.anchors.forEach(anchor => {\n anchor.setPosition(tr.mapping.map(anchor.getPosition()));\n });\n\n // show selection\n if (!tr.selection.empty) {\n return DecorationSet.create(tr.doc, [\n Decoration.inline(tr.selection.from, tr.selection.to, { class: 'pm-selected-text' }),\n ]);\n }\n }\n\n return DecorationSet.empty;\n },\n },\n props: {\n decorations: (state: EditorState) => {\n return spellingDocKey.getState(state);\n },\n },\n });\n }\n\n public createAnchor(pos: number) {\n const anchor = new SpellingAnchor(pos);\n this.anchors.push(anchor);\n return anchor;\n }\n\n public onCheckBegin() {\n this.checking = true;\n }\n\n public onCheckEnd(view: EditorView) {\n this.checking = false;\n this.anchors = [];\n\n if (!view.state.selection.empty) {\n const tr = view.state.tr;\n setTextSelection(tr.selection.to)(tr);\n view.dispatch(tr);\n }\n }\n}\n\nclass SpellingAnchor implements EditorAnchor {\n private pos = 0;\n constructor(pos: number) {\n this.pos = pos;\n }\n public getPosition() {\n return this.pos;\n }\n public setPosition(pos: number) {\n this.pos = pos;\n }\n}\n\nconst extension = () => {\n return {\n plugins: () => {\n return [new SpellingDocPlugin()];\n },\n };\n};\n\nexport default extension;\n","/*\n * spelling.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { MarkType, Schema, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorState } from 'prosemirror-state';\n\nimport { EditorWordSource, EditorWordRange, EditorUISpelling, kCharClassNonWord } from '../../api/spelling';\nimport { PandocMark, getMarkRange } from '../../api/mark';\n\nexport const beginDocPos = () => 1;\nexport const endDocPos = (doc: ProsemirrorNode) => doc.nodeSize - 2;\n\nexport function getWords(\n state: EditorState,\n start: number,\n end: number,\n spelling: EditorUISpelling,\n excluded: MarkType[],\n): EditorWordSource {\n // provide defaults\n if (start === -1) {\n start = beginDocPos();\n }\n if (end === -1) {\n end = endDocPos(state.doc);\n }\n\n // enlarge range to begin/end\n const beginPos = findBeginWord(state, start, spelling.classifyCharacter);\n const endPos = findEndWord(state, end, spelling.classifyCharacter);\n\n const words: EditorWordRange[] = [];\n let currentPos = beginPos;\n while (currentPos <= endPos) {\n // advance until we find a word\n currentPos = advanceToWord(state, currentPos, spelling.classifyCharacter);\n if (currentPos >= endPos) {\n break;\n }\n\n // find end of word\n const endWordPos = findEndWord(state, currentPos, spelling.classifyCharacter);\n if (endWordPos === currentPos) {\n break;\n }\n\n // add word if it doesn't have an excluded type\n if (!excludeWord(state.doc, currentPos, endWordPos, excluded)) {\n const wordText = state.doc.textBetween(currentPos, endWordPos);\n words.push(\n ...spelling.breakWords(wordText).map(wordRange => {\n return {\n start: currentPos + wordRange.start,\n end: currentPos + wordRange.end,\n };\n }),\n );\n }\n\n // next word\n currentPos = endWordPos;\n }\n\n // return iterator over word range\n return {\n hasNext: () => {\n return words.length > 0;\n },\n next: () => {\n if (words.length > 0) {\n return words.shift()!;\n } else {\n return null;\n }\n },\n };\n}\n\nfunction excludeWord(doc: ProsemirrorNode, from: number, to: number, excluded: MarkType[]) {\n // does it have one of our excluded mark types?\n if (excluded.some(markType => doc.rangeHasMark(from, to, markType))) {\n return true;\n }\n\n // is it in a code block\n const $from = doc.resolve(from);\n if ($from.parent.isBlock && $from.parent.type.spec.code) {\n return true;\n }\n\n // it is in a link mark where the link text is a url?\n const schema = doc.type.schema;\n if (schema.marks.link && doc.rangeHasMark(from, to, schema.marks.link)) {\n const range = getMarkRange(doc.resolve(from), schema.marks.link);\n if (range && /^[a-z]+:\\/\\/.*$/.test(doc.textBetween(range.from, range.to))) {\n return true;\n }\n }\n\n // don't exclude\n return false;\n}\n\nexport function advanceToWord(state: EditorState, pos: number, classifier: (ch: number) => number) {\n while (pos < endDocPos(state.doc)) {\n const nextChar = charAt(state.doc, pos);\n if (classifier(nextChar) !== kCharClassNonWord) {\n break;\n } else {\n pos++;\n }\n }\n return pos;\n}\n\nexport function findBeginWord(state: EditorState, pos: number, classifier: (ch: number) => number) {\n // scan backwards until a non-word character is encountered\n while (pos >= beginDocPos()) {\n const prevChar = charAt(state.doc, pos - 1);\n if (classifier(prevChar) === kCharClassNonWord) {\n break;\n } else {\n pos--;\n }\n }\n // return the position\n return pos;\n}\n\nexport function findEndWord(state: EditorState, pos: number, classifier: (ch: number) => number) {\n // scan forwards until a non-word character is encountered\n while (pos < endDocPos(state.doc)) {\n const nextChar = charAt(state.doc, pos);\n if (classifier(nextChar) === kCharClassNonWord) {\n break;\n } else {\n pos++;\n }\n }\n\n // return the position\n return pos;\n}\n\n// get the chracter code at the specified position, returning character code 32 (a space)\n// for begin/end of document, block boundaries, and non-text leaf nodes\nexport function charAt(doc: ProsemirrorNode, pos: number) {\n if (pos < beginDocPos() || pos >= endDocPos(doc)) {\n return 32; // space for doc boundary\n } else {\n return (doc.textBetween(pos, pos + 1, ' ', ' ') || ' ').charCodeAt(0);\n }\n}\n\nexport function excludedMarks(schema: Schema, marks: readonly PandocMark[]): MarkType[] {\n return marks.filter(mark => mark.noSpelling).map(mark => schema.marks[mark.name]);\n}\n\nexport function spellcheckerWord(word: string) {\n return word.replace(/’/g, \"'\");\n}\n","/*\n * spelling.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport const kCharClassWord = 0;\nexport const kCharClassBoundary = 1;\nexport const kCharClassNonWord = 2;\n\nexport interface EditorUISpelling {\n // realtime interface\n realtimeEnabled: () => boolean;\n checkWords: (words: string[]) => string[];\n suggestionList: (word: string, callback: (suggestions: string[]) => void) => void;\n\n // dictionary\n isWordIgnored: (word: string) => boolean;\n ignoreWord: (word: string) => void;\n unignoreWord: (word: string) => void;\n addToDictionary: (word: string) => void;\n\n // word breaking\n breakWords: (text: string) => EditorWordRange[];\n classifyCharacter: (ch: number) => number;\n}\n\nexport interface EditorAnchor {\n getPosition: () => number;\n}\n\nexport interface EditorRect {\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\nexport interface EditorWordRange {\n start: number;\n end: number;\n}\n\nexport interface EditorWordSource {\n hasNext: () => boolean;\n next: () => EditorWordRange | null;\n}\n\nexport interface EditorSpellingDoc {\n getWords: (start: number, end: number) => EditorWordSource;\n\n createAnchor: (pos: number) => EditorAnchor;\n\n shouldCheck: (wordRange: EditorWordRange) => boolean;\n setSelection: (wordRange: EditorWordRange) => void;\n getText: (wordRange: EditorWordRange) => string;\n\n getCursorPosition: () => number;\n replaceSelection: (text: string) => void;\n getSelectionStart: () => number;\n getSelectionEnd: () => number;\n\n getCursorBounds: () => EditorRect;\n moveCursorNearTop: () => void;\n\n dispose: () => void;\n}\n","/*\n * spelling-realtime.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, MarkType } from 'prosemirror-model';\nimport { Plugin, PluginKey, EditorState, Transaction, TextSelection } from 'prosemirror-state';\nimport { DecorationSet, EditorView, Decoration, DecorationAttrs } from 'prosemirror-view';\nimport { AddMarkStep, RemoveMarkStep } from 'prosemirror-transform';\nimport { ChangeSet } from 'prosemirror-changeset';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { FocusEvent } from '../../api/event-types';\nimport { PandocMark } from '../../api/mark';\nimport {\n EditorUISpelling,\n EditorWordRange,\n kCharClassWord\n} from '../../api/spelling';\nimport { EditorEvents } from '../../api/events';\nimport { kAddToHistoryTransaction } from '../../api/transaction';\nimport { EditorUI, EditorMenuItem } from '../../api/ui';\n\nimport { excludedMarks, getWords, spellcheckerWord, findBeginWord, findEndWord, charAt } from './spelling';\n\nconst kUpdateSpellingTransaction = 'updateSpelling';\nconst kInvalidateSpellingWordTransaction = 'invalidateSpellingWord';\nconst kSpellingErrorClass = 'pm-spelling-error';\n\nconst realtimeSpellingKey = new PluginKey<DecorationSet>('spelling-realtime-plugin');\n\nexport function realtimeSpellingPlugin(\n schema: Schema,\n marks: readonly PandocMark[],\n ui: EditorUI,\n events: EditorEvents,\n) {\n return new RealtimeSpellingPlugin(excludedMarks(schema, marks), ui, events);\n}\n\nexport function invalidateAllWords(view: EditorView) {\n updateSpelling(view);\n}\n\nexport function invalidateWord(view: EditorView, word: string) {\n const tr = view.state.tr;\n tr.setMeta(kInvalidateSpellingWordTransaction, word);\n tr.setMeta(kAddToHistoryTransaction, false);\n view.dispatch(tr);\n}\n\nclass RealtimeSpellingPlugin extends Plugin<DecorationSet> {\n // track whether we've ever had the focus (don't do any spelling operations until then)\n private hasBeenFocused = true;\n\n private view: EditorView | null = null;\n private readonly ui: EditorUI;\n\n constructor(excluded: MarkType[], ui: EditorUI, events: EditorEvents) {\n super({\n key: realtimeSpellingKey,\n view: (view: EditorView) => {\n this.view = view;\n return {};\n },\n state: {\n init: (_config, state: EditorState) => {\n return DecorationSet.empty;\n },\n apply: (tr: Transaction, old: DecorationSet, oldState: EditorState, newState: EditorState) => {\n // if we somehow manage to get focus w/o our FocusEvent (below) being called then also\n // flip the hasBeenFocused bit here\n if (this.view?.hasFocus()) {\n this.hasBeenFocused = true;\n }\n\n // don't continue if either realtime spelling is disabled or we have never been focused\n if (!this.ui.spelling.realtimeEnabled() || !this.hasBeenFocused) {\n return DecorationSet.empty;\n }\n\n if (tr.getMeta(kUpdateSpellingTransaction)) {\n // explicit update request invalidates any existing decorations (this can happen when\n // we get focus for the very first time or when the main or secondary dictionaries change)\n return DecorationSet.create(newState.doc, spellingDecorations(newState, ui.spelling, excluded));\n } else if (tr.getMeta(kInvalidateSpellingWordTransaction)) {\n // for word invalidations we search through the decorations and remove words that match\n const word = tr.getMeta(kInvalidateSpellingWordTransaction) as string;\n\n // find decorations that have this word and remove them\n const wordDecos = old.find(undefined, undefined, spec => spec.word === word);\n\n // return decorators w/ those words removed\n return old.remove(wordDecos);\n } else if (tr.docChanged) {\n // perform an incremental update of spelling decorations (invalidate and re-scan\n // for decorations in changed ranges)\n\n // start w/ previous state\n let decos = old;\n\n // create change set from transaction\n let changeSet = ChangeSet.create(oldState.doc);\n changeSet = changeSet.addSteps(newState.doc, tr.mapping.maps);\n\n // collect ranges that had mark changes\n const markRanges: Array<{ from: number; to: number }> = [];\n for (const step of tr.steps) {\n if (step instanceof AddMarkStep || step instanceof RemoveMarkStep) {\n const markStep = step as any;\n markRanges.push({ from: markStep.from, to: markStep.to });\n }\n }\n\n // remove ranges = mark ranges + deleted ranges\n const removeRanges = markRanges.concat(\n changeSet.changes.map(change => ({ from: change.fromA, to: change.toA })),\n );\n\n // remove decorations from deleted ranges (expanding ranges to word boundaries)\n for (const range of removeRanges) {\n const fromPos = findBeginWord(oldState, range.from, ui.spelling.classifyCharacter);\n const toPos = findEndWord(oldState, range.to, ui.spelling.classifyCharacter);\n decos = decos.remove(decos.find(fromPos, toPos));\n }\n\n // map decoration positions to new document\n decos = decos.map(tr.mapping, tr.doc);\n\n // add ranges = mark ranges + inserted ranges\n const addRanges = markRanges.concat(\n changeSet.changes.map(change => ({ from: change.fromB, to: change.toB })),\n );\n\n // scan inserted ranges for spelling decorations (don't need to find word boundaries\n // b/c spellingDecorations already does that)\n for (const range of addRanges) {\n decos = decos.add(\n tr.doc,\n spellingDecorations(newState, ui.spelling, excluded, false, range.from - 1, range.to)\n );\n }\n\n // return decorators\n return decos;\n } else if (tr.selectionSet) {\n // if we had previously suppressed a decoration due to typing at the cursor, restore it\n // whenever the selection changes w/o the doc changing\n\n // start with previous state\n let decos = old;\n\n // find any special 'at cursor' errors\n const cursorDecos = decos.find(undefined, undefined, spec => !!spec.cursor);\n if (cursorDecos.length) {\n // there will only be one cursor, capture it's position then remove it\n const word = cursorDecos[0].spec.word as string;\n const { from, to } = cursorDecos[0];\n decos = decos.remove(cursorDecos);\n\n // add it back in as a real spelling error\n decos = decos.add(tr.doc, [Decoration.inline(from, to, { class: kSpellingErrorClass }, { word })]);\n }\n\n // return decorators\n return decos;\n } else {\n // no content or selection change, return old w/o mapping\n return old;\n }\n },\n },\n props: {\n decorations: (state: EditorState) => {\n return realtimeSpellingKey.getState(state);\n },\n handleDOMEvents: {\n contextmenu: spellingSuggestionContextMenuHandler(ui),\n },\n },\n });\n\n // save reference to ui\n this.ui = ui;\n\n // trigger update on first focus\n const focusUnsubscribe = events.subscribe(FocusEvent, () => {\n if (this.view) {\n focusUnsubscribe();\n this.hasBeenFocused = true;\n updateSpelling(this.view);\n\n // call a second time as no words will be cached initially, this simplifies the\n // need for threading a callback through the entire plugin system\n const v = this.view;\n setTimeout(() => {\n if (v.dom?.isConnected) {\n updateSpelling(v);\n }\n }, 5000); \n }\n });\n }\n}\n\nfunction spellingDecorations(\n state: EditorState,\n spelling: EditorUISpelling,\n excluded: MarkType[],\n excludeCursor = false,\n from = -1,\n to = -1,\n): Decoration[] {\n\n // a map of wordText -> [wordRange...]\n const rangeMap = new Map<string, EditorWordRange[]>();\n\n // break words\n const words = getWords(state, from, to, spelling, excluded);\n\n // spell check and return decorations for misspellings\n const decorations: Decoration[] = [];\n\n // words to pass to the spellchecker\n const wordsToCheck: string[] = [];\n\n while (words.hasNext()) {\n const word = words.next()!;\n const wordText = state.doc.textBetween(word.start, word.end);\n\n const ranges = rangeMap.get(wordText) || [];\n ranges.push(word);\n rangeMap.set(wordText, ranges);\n\n wordsToCheck.push(spellcheckerWord(wordText));\n }\n\n const incorrectWords: string[] = spelling.checkWords(wordsToCheck);\n\n for (const incorrectWord of incorrectWords) {\n const ranges: EditorWordRange[] | undefined = rangeMap.get(incorrectWord);\n\n if (!!ranges) {\n for (const range of ranges) {\n const attrs: DecorationAttrs = {};\n const spec: { [key: string]: any } = {\n word: incorrectWord,\n };\n if (excludeCursor && state.selection.head > range.start && state.selection.head <= range.end) {\n spec.cursor = true;\n } else {\n attrs.class = kSpellingErrorClass;\n }\n decorations.push(Decoration.inline(range.start, range.end, attrs, spec));\n }\n }\n }\n\n return decorations;\n}\n\nfunction spellingSuggestionContextMenuHandler(ui: EditorUI) {\n return (view: EditorView, event: Event) => {\n if (!ui.display.showContextMenu) {\n return false;\n }\n\n // helper to create a menu action\n const menuAction = (text: string, action: VoidFunction) => {\n return {\n text,\n exec: () => {\n action();\n view.focus();\n },\n };\n };\n\n // helper to show a context menu and prevent further event handling\n const showContextMenu = (menuItems: EditorMenuItem[]) => {\n // show the menu\n const { clientX, clientY } = event as MouseEvent;\n ui.display.showContextMenu!(menuItems, clientX, clientY);\n };\n\n if (event.target && event.target instanceof Node) {\n // alias schema\n const schema = view.state.schema;\n\n // find the spelling decoration at this position (if any)\n const pos = view.posAtDOM(event.target, 0);\n const deco = realtimeSpellingKey.getState(view.state)!.find(pos, pos);\n if (deco.length) {\n // prevent default handling\n event.stopPropagation();\n event.preventDefault();\n\n // get word\n const { from, to } = deco[0];\n const word = spellcheckerWord(view.state.doc.textBetween(from, to));\n\n const kMaxSuggetions = 5;\n ui.spelling.suggestionList(word, (suggestions: string[]): void => {\n // create menu w/ suggestions\n const menuItems: EditorMenuItem[] = suggestions.slice(0, kMaxSuggetions).map(suggestion => {\n return {\n text: suggestion,\n exec: () => {\n const tr = view.state.tr;\n tr.setSelection(TextSelection.create(tr.doc, from, to));\n const marks = tr.selection.$from.marks();\n tr.replaceSelectionWith(schema.text(suggestion, marks), false);\n setTextSelection(from + suggestion.length)(tr);\n view.dispatch(tr);\n view.focus();\n },\n };\n });\n if (menuItems.length) {\n menuItems.push({ separator: true });\n }\n\n menuItems.push(menuAction(ui.context.translateText('Ignore All'), () => ui.spelling.ignoreWord(word)));\n menuItems.push({ separator: true });\n menuItems.push(\n menuAction(ui.context.translateText('Add to Dictionary'), () => ui.spelling.addToDictionary(word)),\n );\n\n // show context menu\n showContextMenu(menuItems);\n });\n\n return true;\n }\n\n // find the word at this position and see if it's ignored. if so provide an unignore context menu\n const classify = ui.spelling.classifyCharacter;\n const mouseEvent = event as MouseEvent;\n const clickPos = view.posAtCoords({ left: mouseEvent.clientX, top: mouseEvent.clientY });\n if (clickPos) {\n const ch = charAt(view.state.doc, clickPos.pos);\n if (classify(ch) === kCharClassWord) {\n const from = findBeginWord(view.state, clickPos.pos, classify);\n const to = findEndWord(view.state, clickPos.pos, classify);\n const word = spellcheckerWord(view.state.doc.textBetween(from, to));\n\n if (ui.spelling.isWordIgnored(word)) {\n // prevent default handling\n event.stopPropagation();\n event.preventDefault();\n\n showContextMenu([\n menuAction(`${ui.context.translateText('Unignore')} \\'${word}\\'`, () => ui.spelling.unignoreWord(word)),\n ]);\n return true;\n }\n }\n }\n }\n\n return false;\n };\n}\n\nfunction updateSpelling(view: EditorView) {\n const tr = view.state.tr;\n tr.setMeta(kUpdateSpellingTransaction, true);\n tr.setMeta(kAddToHistoryTransaction, false);\n view.dispatch(tr);\n}\n","/*\n * pandoc_converter.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { findChildren } from 'prosemirror-utils';\n\nimport {\n PandocServer,\n PandocTokenReader,\n PandocNodeWriter,\n PandocMarkWriter,\n PandocPreprocessorFn,\n PandocBlockReaderFn,\n PandocPostprocessorFn,\n PandocInlineHTMLReaderFn,\n PandocWriterOptions,\n PandocTokensFilterFn,\n} from '../api/pandoc';\n\nimport { haveTableCellsWithInlineRcode } from '../api/rmd';\n\nimport { pandocFormatWith, PandocFormat, kGfmFormat, kCommonmarkFormat } from '../api/pandoc_format';\nimport { PandocCapabilities } from '../api/pandoc_capabilities';\nimport { PandocBlockCapsuleFilter, pandocMarkdownWithBlockCapsules } from '../api/pandoc_capsule';\n\nimport { ExtensionManager } from '../editor/editor-extensions';\n\nimport { pandocToProsemirror } from './pandoc_to_prosemirror';\nimport { pandocFromProsemirror } from './pandoc_from_prosemirror';\nimport { isParagraphNode } from '../api/paragraph';\n\nexport type PandocLineWrapping = 'none' | 'column' | 'sentence';\n\nexport interface PandocToProsemirrorResult {\n doc: ProsemirrorNode;\n line_wrapping: PandocLineWrapping;\n unrecognized: string[];\n example_lists: boolean;\n unparsed_meta: { [key: string]: any };\n}\n\nexport class PandocConverter {\n private readonly schema: Schema;\n private readonly preprocessors: readonly PandocPreprocessorFn[];\n private readonly postprocessors: readonly PandocPostprocessorFn[];\n private readonly readers: readonly PandocTokenReader[];\n private readonly tokensFilters: readonly PandocTokensFilterFn[];\n private readonly blockReaders: readonly PandocBlockReaderFn[];\n private readonly inlineHTMLReaders: readonly PandocInlineHTMLReaderFn[];\n private readonly blockCapsuleFilters: readonly PandocBlockCapsuleFilter[];\n private readonly nodeWriters: readonly PandocNodeWriter[];\n private readonly markWriters: readonly PandocMarkWriter[];\n private readonly pandoc: PandocServer;\n private readonly pandocCapabilities: PandocCapabilities;\n\n constructor(\n schema: Schema,\n extensions: ExtensionManager,\n pandoc: PandocServer,\n pandocCapabilities: PandocCapabilities,\n ) {\n this.schema = schema;\n\n this.preprocessors = extensions.pandocPreprocessors();\n this.postprocessors = extensions.pandocPostprocessors();\n this.readers = extensions.pandocReaders();\n this.tokensFilters = extensions.pandocTokensFilters();\n this.blockReaders = extensions.pandocBlockReaders();\n this.inlineHTMLReaders = extensions.pandocInlineHTMLReaders();\n this.blockCapsuleFilters = extensions.pandocBlockCapsuleFilters();\n this.nodeWriters = extensions.pandocNodeWriters();\n this.markWriters = extensions.pandocMarkWriters();\n\n this.pandoc = pandoc;\n this.pandocCapabilities = pandocCapabilities;\n }\n\n public async toProsemirror(markdown: string, format: PandocFormat): Promise<PandocToProsemirrorResult> {\n // save original markdown (for aligning capsule positions)\n const original = markdown;\n\n // adjust format. we always need to *read* raw_html, raw_attribute, and backtick_code_blocks b/c\n // that's how preprocessors hoist content through pandoc into our prosemirror token parser.\n // we always need to read with auto_identifiers so we can catch any auto-generated ids\n // required to fulfill links inside the document (we will strip out heading ids that\n // aren't explicit or a link target using the heading_ids returned with the ast). \n //\n // we always read all forms of tables (since they can always be written back out as raw_html)\n //\n // we also always read math (since it can always be output as 'asciimath')\n //\n // we disable 'smart' b/c that causes pandoc to insert non-breaking spaces before selected\n // abbreviations like e.g. rather, we do our own implementation of 'smart' when we read\n // PandocTokenType.Str from the ast\n\n // determine type of auto_ids\n const autoIds = format.extensions.gfm_auto_identifiers ? 'gfm_auto_identifiers' : 'auto_identifiers';\n const targetFormat = adjustedFormat(\n format.fullName,\n ['raw_html', 'raw_attribute', 'backtick_code_blocks', autoIds, \n 'grid_tables', 'pipe_tables', 'multiline_tables', 'simple_tables',\n 'tex_math_dollars'],\n ['smart'],\n );\n\n // run preprocessors\n this.preprocessors.forEach(preprocessor => {\n markdown = preprocessor(markdown);\n });\n\n // create source capsules\n this.blockCapsuleFilters.forEach(filter => {\n markdown = pandocMarkdownWithBlockCapsules(original, markdown, filter);\n });\n\n const ast = await this.pandoc.markdownToAst(markdown, targetFormat, []);\n const result = pandocToProsemirror(\n ast,\n this.schema,\n format.extensions,\n this.readers,\n this.tokensFilters,\n this.blockReaders,\n this.inlineHTMLReaders,\n this.blockCapsuleFilters,\n );\n\n // run post-processors\n this.postprocessors.forEach(postprocessor => {\n result.doc = postprocessor(result.doc);\n });\n\n // return the doc\n return result;\n }\n\n // NOTE: For a plain markdown file, this is the closest we can come to cannonicalizing w/ just pandoc:\n //\n // pandoc MANUAL.md --to markdown-auto_identifiers-smart -o MANUAL.md --self-contained --atx-headers --wrap=none\n //\n // For R Mardown files, we would need to pull out the Rmd chunks before sending to pandoc.\n //\n\n public async fromProsemirror(\n doc: ProsemirrorNode,\n pandocFormat: PandocFormat,\n options: PandocWriterOptions,\n ): Promise<string> {\n // generate pandoc ast\n const output = pandocFromProsemirror(\n doc,\n this.pandocCapabilities.api_version,\n pandocFormat,\n this.nodeWriters,\n this.markWriters,\n );\n\n // adjust format. we always need to be able to write raw_attribute b/c that's how preprocessors\n // hoist content through pandoc into our prosemirror token parser. since we open this door when\n // reading, users could end up writing raw inlines, and in that case we want them to echo back\n // to the source document just the way they came in. for writing markdown from pm we don't\n // ever want to generate auto identifiers so we disable them here. we also disable smart b/c\n // we do this manually above in pandocFromProsemirror (so we can avoid pandoc's insertion of\n // nbsp's after abbreviations, which is more approriate for final output than editing)\n let format = adjustedFormat(\n pandocFormat.fullName,\n ['raw_html', 'raw_attribute'], // always enable\n ['auto_identifiers', 'gfm_auto_identifiers', 'smart'],\n ); // always disable\n\n // disable selected format options\n format = pandocFormatWith(format, disabledFormatOptions(format, pandocFormat, doc), '');\n\n // prepare pandoc options\n let pandocOptions: string[] = [];\n if (!options.atxHeaders) {\n pandocOptions.push('--markdown-headings=setext');\n }\n if (options.dpi) {\n pandocOptions.push('--dpi');\n }\n // default to block level references (validate known types)\n let referenceLocation = 'block';\n if (options.references?.location) {\n referenceLocation = ['block', 'section', 'document'].includes(options.references.location)\n ? options.references.location\n : 'block';\n }\n pandocOptions.push(`--reference-location=${referenceLocation}`);\n\n // references prefix (if any)\n if (options.references?.prefix) {\n pandocOptions.push('--id-prefix', options.references.prefix);\n }\n\n // provide wrap options\n pandocOptions = pandocOptions.concat(wrapOptions(options));\n\n // render to markdown\n const markdown = await this.pandoc.astToMarkdown(output.ast, format, pandocOptions);\n\n // normalize newlines (don't know if pandoc uses \\r\\n on windows)\n return markdown.replace(/\\r\\n|\\n\\r|\\r/g, '\\n');\n }\n}\n\n// adjust the specified format\nfunction adjustedFormat(format: string, extensions: string[], disabled: string[]) {\n let newFormat = pandocFormatWith(\n format,\n '',\n extensions.map(ext => `+${ext}`).join('') + disabled.map(ext => `-${ext}`).join(''),\n );\n\n // any extension specified needs to not have a - anywhere in the format\n extensions.forEach(ext => {\n newFormat = newFormat.replace('-' + ext, '');\n });\n\n return newFormat;\n}\n\nfunction disabledFormatOptions(format: string, pandocFormat: PandocFormat, doc: ProsemirrorNode) {\n // (prefer pipe and grid tables). users can still force the availability of these by\n // adding those format flags but all known markdown variants that support tables also\n // support pipe tables so this seems unlikely to ever be required.\n let disabledTableTypes = '-simple_tables-multiline_tables';\n\n // if there are tables with inline R code then disable grid tables (as the inline\n // R code will mess up the column boundaries)\n if (haveTableCellsWithInlineRcode(doc) || \n (!gridTablesRequired(doc) && pandocFormat.extensions.pipe_tables)) {\n disabledTableTypes += '-grid_tables';\n }\n\n // gfm and commonmark variants don't allow simple/multiline/grid tables (just pipe tables)\n // and it's an error to even include these in the markdown format specifier -- so for\n // these modes we just nix the disabling\n if (format.startsWith(kGfmFormat) || format.startsWith(kCommonmarkFormat)) {\n disabledTableTypes = '';\n }\n\n // return\n return disabledTableTypes;\n}\n\nfunction gridTablesRequired(doc: ProsemirrorNode) {\n const schema = doc.type.schema;\n const isTableCell = (node: ProsemirrorNode) => node.type === schema.nodes.table_cell || node.type === schema.nodes.table_header;\n return findChildren(doc, isTableCell).some(cell => {\n // various things require grid tables (basically anyting that requires embedded newlines)\n\n // multiple blocks\n if (cell.node.childCount > 1) {\n return true;\n }\n\n // non paragraph block\n if (!isParagraphNode(cell.node.firstChild)) {\n return true;\n }\n\n // paragraph with hard break\n const paraNode = cell.node.firstChild!;\n return findChildren(paraNode, node => node.type === schema.nodes.hard_break).length > 0;\n }); \n}\n\nfunction wrapOptions(options: PandocWriterOptions) {\n const pandocOptions: string[] = [];\n if (options.wrap) {\n if (options.wrap === 'none' || options.wrap === 'sentence') {\n pandocOptions.push('--wrap=none');\n } else {\n const column = parseInt(options.wrap, 10);\n if (column) {\n pandocOptions.push('--wrap=auto');\n pandocOptions.push(`--columns=${column}`);\n } else {\n pandocOptions.push('--wrap=none');\n }\n }\n } else {\n pandocOptions.push('--wrap=none');\n }\n return pandocOptions;\n}\n","/*\n * pandoc_capsule.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\n\nimport { base64Encode, base64Decode } from './base64';\n\nimport { PandocToken, ProsemirrorWriter, mapTokens, PandocTokenType } from './pandoc';\n\n// constants used for creating/consuming capsules\nconst kFieldDelimiter = '\\n';\nconst kValueDelimiter = ':';\nconst kTypeField = 'type';\nconst kPositionField = 'position';\nconst kPrefixField = 'prefix';\nconst kSourceField = 'source';\nconst kSuffixField = 'suffix';\nconst kBlockCapsuleSentinel = '31B8E172-B470-440E-83D8-E6B185028602'.toLowerCase();\n\n// block capsule\nexport interface PandocBlockCapsule {\n type: string;\n position: number;\n prefix: string;\n source: string;\n suffix: string;\n}\n\n// preserve block source code through markdown parsing (e.g. for yaml metadata or rmd chunks).\n// block capsules remove markdown from the document before pandoc parses it (placing it into\n// a base64 encoded 'capsule'), then unwraps the capsule from the AST. All of this is done\n// by the function in this interface.\nexport interface PandocBlockCapsuleFilter {\n // unique type id for this capsule\n type: string;\n\n // regex that matches a prefix (match[1]), the source to preserve (match[2]), and a suffix (match[3])\n // we need the prefix/suffix for the cases where the preserved source needs to be put back exactly\n // where it came from (e.g. in a multi-line html comment). we also need it to fixup indentation in\n // cases where capsules are unwrapped within a code block or raw block. the prefix and suffix\n // must begin and end (respectively) with newlines, and consist entirely of whitespace (e.g. leading\n // space for indented block or incidental whitespace after block delimiter)\n match: RegExp;\n\n // optional seconary filter expression (applied to a successful match to ensure\n // that matching wasn't overly greedy)\n discard?: RegExp;\n\n // custom function for pulling out the 3 parts from a match (defaults to p1,p2,p3)\n extract?: (\n match: string,\n p1: string,\n p2: string,\n p3: string,\n p4: string,\n ) => { prefix: string; source: string; suffix: string };\n\n // provide a (text) envelope around the capsule, e.g.\n // - newlines to ensure that yaml is parsed as a standalone paragraph;\n // - backticks to ensure an Rmd is structurally parsed by pandoc as a codeblock\n enclose: (capsuleText: string, capsule: PandocBlockCapsule) => string;\n\n // examine a piece of text from within the pandoc ast and, if approproate, substitute any\n // capsules of my type for the original text (otherwise just return the passed string).\n // this method will generally use encodedBlockCapsuleRegex to create a regex to search\n // with, then upon finding a capsule, will unpack it with parsePandocBlockCapsule, compare\n // the type against our own type, and in the case they match do the substitution.\n handleText: (text: string, tok: PandocToken) => string;\n\n // do you want to handle this token as a capsule object? if so return the capsule text\n // (only the filter will know how to extract it from a pandoc token b/c it knows\n // where it was parsed from and what happened in the 'enclose' method)\n handleToken: (tok: PandocToken) => string | null;\n\n // write a capsule as a pandoc node\n writeNode: (schema: Schema, writer: ProsemirrorWriter, capsule: PandocBlockCapsule) => void;\n}\n\n// transform the passed markdown to include base64 encoded block capsules as specified by the\n// provided capsule filter. capsules are used to hoist block types that we don't want pandoc\n// to see (e.g. yaml metadata or Rmd chunks) out of the markdown, only to be re-inserted\n// after pandoc has yielded an ast. block capsules are a single base64 encoded pieced of\n// text that include the original content, the matched prefix and suffix, and a type\n// identifier for orchestrating the unpacking.\nexport function pandocMarkdownWithBlockCapsules(\n original: string,\n markdown: string,\n capsuleFilter: PandocBlockCapsuleFilter,\n) {\n // default extractor\n const defaultExtractor = (match: string, p1: string, p2: string, p3: string) => {\n return {\n prefix: p1,\n source: p2,\n suffix: p3,\n };\n };\n\n // find the original position of all the matches\n const positions: number[] = [];\n let match = capsuleFilter.match.exec(original);\n while (match != null) {\n positions.push(match.index);\n match = capsuleFilter.match.exec(original);\n }\n\n // reset capsule filter match index\n capsuleFilter.match.lastIndex = 0;\n\n // replace all w/ source preservation capsules\n return markdown.replace(capsuleFilter.match, (match: string, p1: string, p2: string, p3: string, p4: string) => {\n // read the original position of the match\n let position = 0;\n const originalPos = positions.shift();\n if (originalPos) {\n position = originalPos;\n }\n\n // if the capsuleFilter has a discard expression then check it\n if (capsuleFilter.discard && !!match.match(capsuleFilter.discard)) {\n return match;\n }\n\n // extract matches\n const extract = capsuleFilter.extract || defaultExtractor;\n const { prefix, source, suffix } = extract(match, p1, p2, p3, p4);\n\n // make the capsule\n const capsule: PandocBlockCapsule = {\n [kTypeField]: capsuleFilter.type,\n [kPositionField]: position,\n [kPrefixField]: prefix,\n [kSourceField]: source,\n [kSuffixField]: suffix,\n };\n\n // construct a field\n const field = (name: string, value: string) => `${name}${kValueDelimiter}${base64Encode(value)}`;\n\n // construct a record\n const record =\n field(kTypeField, capsule.type) +\n kFieldDelimiter +\n field(kPositionField, capsule.position.toString()) +\n kFieldDelimiter +\n field(kPrefixField, capsule.prefix) +\n kFieldDelimiter +\n field(kSourceField, capsule.source) +\n kFieldDelimiter +\n field(kSuffixField, capsule.suffix);\n\n // now base64 encode the entire record (so it can masquerade as a paragraph)\n const encodedRecord = base64Encode(record);\n\n // return capsule, which is:\n // - a base64 encoded record surrounded with a sentinel value\n // - enclosed in a filter specific envelope (used to influence pandoc parsing),\n // - surrounded by the original prefix and suffix\n return (\n prefix +\n capsuleFilter.enclose(\n `${kBlockCapsuleSentinel}${kValueDelimiter}${encodedRecord}${kValueDelimiter}${kBlockCapsuleSentinel}`,\n capsule,\n ) +\n suffix\n );\n });\n}\n\n// block capsules can also end up not as block tokens, but rather as text within another\n// token (e.g. within a backtick code block or raw_block). this function takes a set\n// of pandoc tokens and recursively converts block capsules that aren't of type\n// PandocTokenType.Str (which is what we'd see in a paragraph) into their original form\nexport function resolvePandocBlockCapsuleText(\n tokens: PandocToken[],\n filters: readonly PandocBlockCapsuleFilter[],\n): PandocToken[] {\n // process all tokens\n return mapTokens(tokens, token => {\n // look for non-string pandoc tokens\n if (token.t !== PandocTokenType.Str && token.c) {\n if (typeof token.c === 'string') {\n token.c = decodeBlockCapsuleText(token.c, token, filters);\n } else if (Array.isArray(token.c)) {\n const children = token.c.length;\n for (let i = 0; i < children; i++) {\n if (typeof token.c[i] === 'string') {\n token.c[i] = decodeBlockCapsuleText(token.c[i], token, filters);\n }\n }\n }\n }\n\n return token;\n });\n}\n\n// decode the text capsule by running all of the filters (as there could be nesting)\nexport function decodeBlockCapsuleText(text: string, tok: PandocToken, filters: readonly PandocBlockCapsuleFilter[]) {\n filters.forEach(filter => {\n text = filter.handleText(text, tok);\n });\n return text;\n}\n\nexport function blockCapsuleTextHandler(type: string, pattern: RegExp, textFilter?: (text: string) => string) {\n return (text: string, tok: PandocToken): string => {\n // if this is a code block or raw block then we need to strip the prefix\n // (b/c it could in a blockquote or indented in a list)\n const stripPrefix = tok.t === PandocTokenType.CodeBlock || tok.t === PandocTokenType.RawBlock;\n\n // replace text\n return text.replace(pattern, match => {\n const capsuleText = textFilter ? textFilter(match) : match;\n const capsule = parsePandocBlockCapsule(capsuleText);\n if (capsule.type === type) {\n if (stripPrefix) {\n return blockCapsuleSourceWithoutPrefix(capsule.source, capsule.prefix);\n } else {\n return capsule.source;\n }\n } else {\n return match;\n }\n });\n };\n}\n\n// token handler that looks for a paragraph token consisting entirely of a block capsule of our type.\n// if we find that then return the block capsule text\nexport function blockCapsuleParagraphTokenHandler(type: string) {\n const tokenRegex = encodedBlockCapsuleRegex('^', '$');\n return (tok: PandocToken) => {\n if (tok.t === PandocTokenType.Para) {\n if (tok.c.length === 1 && tok.c[0].t === PandocTokenType.Str) {\n const text = tok.c[0].c as string;\n const match = text.match(tokenRegex);\n if (match) {\n const capsuleRecord = parsePandocBlockCapsule(match[0]);\n if (capsuleRecord.type === type) {\n return match[0];\n }\n }\n }\n }\n return null;\n };\n}\n\n// create a regex that can be used to match a block capsule\nexport function encodedBlockCapsuleRegex(prefix?: string, suffix?: string, flags?: string) {\n return new RegExp(\n (prefix || '') +\n kBlockCapsuleSentinel +\n kValueDelimiter +\n '((?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?)' +\n kValueDelimiter +\n kBlockCapsuleSentinel +\n (suffix || ''),\n flags,\n );\n}\n\n// remove encoding envelope then parse the remaining text into a block capsule\nexport function parsePandocBlockCapsule(text: string): PandocBlockCapsule {\n const envelopeLen = kBlockCapsuleSentinel.length + kFieldDelimiter.length;\n const record = text.substring(envelopeLen, text.length - envelopeLen);\n const decodedRecord = base64Decode(record);\n const fields = decodedRecord.split(kFieldDelimiter);\n const fieldValue = (i: number) => base64Decode(fields[i].split(kValueDelimiter)[1]);\n return {\n [kTypeField]: fieldValue(0),\n [kPositionField]: parseInt(fieldValue(1), 10),\n [kPrefixField]: fieldValue(2),\n [kSourceField]: fieldValue(3),\n [kSuffixField]: fieldValue(4),\n };\n}\n\n// provide a version of the block capsule source with the prefix removed\n// from all but the very first line. this allows us to restore the text\n// to the level of indentation implied by the markdown (as opposed to the\n// level found literally in the source file)\nexport function blockCapsuleSourceWithoutPrefix(source: string, prefix: string) {\n // prefix represents the indentation level of the block's source code, strip that\n // same prefix from all the lines of code save for the first one\n const prefixStripRegEx = new RegExp('^' + prefix);\n const lines = source.split('\\n').map((line, index) => {\n return index > 0 ? line.replace(prefixStripRegEx, '') : line;\n });\n return lines.join('\\n');\n}\n","/*\n * base_64.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n// btoa and atob don't handle unicode strings, see\n// https://developer.mozilla.org/en-US/docs/Web/API/WindowOrWorkerGlobalScope/btoa#Unicode_strings\n\n// these functions implement the suggested workaround ()\n\nexport function base64Encode(text: string) {\n const binary = toBinary(text);\n return window.btoa(binary);\n}\n\nexport function base64Decode(encoded: string) {\n const decoded = atob(encoded);\n return fromBinary(decoded);\n}\n\n// convert a Unicode string to a string in which each 16-bit unit occupies only one byte\nfunction toBinary(text: string) {\n const codeUnits = new Uint16Array(text.length);\n for (let i = 0; i < codeUnits.length; i++) {\n codeUnits[i] = text.charCodeAt(i);\n }\n const charCodes = Array.from(new Uint8Array(codeUnits.buffer)).map(code => String.fromCharCode(code));\n return charCodes.join('');\n}\n\n// reverse the conversion\nfunction fromBinary(binary: string) {\n const bytes = new Uint8Array(binary.length);\n for (let i = 0; i < bytes.length; i++) {\n bytes[i] = binary.charCodeAt(i);\n }\n const charCodes = Array.from(new Uint16Array(bytes.buffer)).map(code => String.fromCharCode(code));\n return charCodes.join('');\n}\n","/*\n * pandoc_to_prosemirror.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Mark, Node as ProsemirrorNode, NodeType, Schema } from 'prosemirror-model';\n\nimport {\n PandocTokenReader,\n PandocToken,\n PandocAst,\n ProsemirrorWriter,\n PandocBlockReaderFn,\n PandocInlineHTMLReaderFn,\n PandocTokensFilterFn,\n PandocTokenType,\n mapTokens,\n stringifyTokens,\n PandocExtensions,\n forEachToken,\n} from '../api/pandoc';\nimport {\n pandocAttrReadAST,\n kCodeBlockAttr,\n kCodeBlockText,\n kPandocAttrClasses,\n kPandocAttrKeyvalue,\n} from '../api/pandoc_attr';\nimport {\n PandocBlockCapsuleFilter,\n parsePandocBlockCapsule,\n resolvePandocBlockCapsuleText,\n decodeBlockCapsuleText,\n} from '../api/pandoc_capsule';\n\nimport { PandocToProsemirrorResult, PandocLineWrapping } from './pandoc_converter';\nimport { kLinkTarget, kLinkTargetUrl, kLinkChildren, kLinkAttr, kLinkTargetTitle } from '../api/link';\nimport { kHeadingAttr, kHeadingLevel, kHeadingChildren } from '../api/heading';\nimport { pandocAutoIdentifier, gfmAutoIdentifier } from '../api/pandoc_id';\nimport { equalsIgnoreCase } from '../api/text';\nimport { hasShortcutHeadingLinks } from '../api/pandoc_format';\n\nexport function pandocToProsemirror(\n ast: PandocAst,\n schema: Schema,\n extensions: PandocExtensions,\n readers: readonly PandocTokenReader[],\n tokensFilters: readonly PandocTokensFilterFn[],\n blockReaders: readonly PandocBlockReaderFn[],\n inlineHTMLReaders: readonly PandocInlineHTMLReaderFn[],\n blockCapsuleFilters: readonly PandocBlockCapsuleFilter[],\n): PandocToProsemirrorResult {\n const parser = new Parser(\n schema,\n extensions,\n readers,\n tokensFilters,\n blockReaders,\n inlineHTMLReaders,\n blockCapsuleFilters,\n );\n return parser.parse(ast);\n}\n\nclass Parser {\n private readonly schema: Schema;\n private readonly extensions: PandocExtensions;\n private readonly tokensFilters: readonly PandocTokensFilterFn[];\n private readonly inlineHTMLReaders: readonly PandocInlineHTMLReaderFn[];\n private readonly blockCapsuleFilters: readonly PandocBlockCapsuleFilter[];\n private readonly handlers: { [token: string]: ParserTokenHandlerCandidate[] };\n\n constructor(\n schema: Schema,\n extensions: PandocExtensions,\n readers: readonly PandocTokenReader[],\n tokensFilters: readonly PandocTokensFilterFn[],\n blockReaders: readonly PandocBlockReaderFn[],\n inlineHTMLReaders: readonly PandocInlineHTMLReaderFn[],\n blockCapsuleFilters: readonly PandocBlockCapsuleFilter[],\n ) {\n this.schema = schema;\n this.extensions = extensions;\n this.tokensFilters = tokensFilters;\n this.inlineHTMLReaders = inlineHTMLReaders;\n // apply block capsule filters in reverse order\n this.blockCapsuleFilters = blockCapsuleFilters.slice().reverse();\n this.handlers = this.createHandlers(readers, blockReaders);\n }\n\n public parse(ast: PandocAst) {\n // create state\n const state: ParserState = new ParserState(this.schema);\n // create writer (compose state w/ writeTokens function)\n const parser = this;\n const writer: ProsemirrorWriter = {\n openNode: state.openNode.bind(state),\n closeNode: state.closeNode.bind(state),\n openNoteNode: state.openNoteNode.bind(state),\n addNode: state.addNode.bind(state),\n openMark: state.openMark.bind(state),\n closeMark: state.closeMark.bind(state),\n writeText: state.writeText.bind(state),\n hasInlineHTMLWriter(html: string) {\n return parser.hasInlineHTMLWriter(html);\n },\n writeInlineHTML(html: string) {\n return parser.writeInlineHTML(this, html);\n },\n writeTokens(tokens: PandocToken[]) {\n parser.writeTokens(this, tokens);\n },\n logUnrecognized: state.logUnrecognized.bind(state),\n logExampleList: state.logExampleList.bind(state),\n isNodeOpen: state.isNodeOpen.bind(state),\n };\n\n // process raw text capsules\n let targetAst = {\n ...ast,\n blocks: resolvePandocBlockCapsuleText(ast.blocks, this.blockCapsuleFilters),\n };\n\n // detect line wrapping\n const lineWrapping = detectLineWrapping(targetAst);\n\n // resolve heading ids\n targetAst = resolveHeadingIds(targetAst, this.extensions);\n\n // write all tokens\n writer.writeTokens(targetAst.blocks);\n\n // return\n return {\n doc: state.doc(),\n line_wrapping: lineWrapping,\n unrecognized: state.unrecognized(),\n example_lists: state.hasExampleLists(),\n unparsed_meta: ast.meta,\n };\n }\n\n private writeTokens(writer: ProsemirrorWriter, tokens: PandocToken[]) {\n // pass through tokens filters\n let targetTokens = tokens;\n this.tokensFilters.forEach(filter => {\n targetTokens = filter(targetTokens, writer);\n });\n\n // process tokens\n targetTokens.forEach(tok => this.writeToken(writer, tok));\n }\n\n private writeToken(writer: ProsemirrorWriter, tok: PandocToken) {\n // process block-level capsules\n for (const filter of this.blockCapsuleFilters) {\n const capsuleText = filter.handleToken?.(tok);\n if (capsuleText) {\n const blockCapsule = parsePandocBlockCapsule(capsuleText);\n // run all of the text filters in case there was nesting\n blockCapsule.source = decodeBlockCapsuleText(blockCapsule.source, tok, this.blockCapsuleFilters);\n filter.writeNode(this.schema, writer, blockCapsule);\n return;\n }\n }\n\n // look for a handler.match function that wants to handle this token\n const handlers = this.handlers[tok.t] || [];\n for (const handler of handlers) {\n // It's not enough for a pandoc reader's preferred token to match the\n // current token; it's possible based on the `match` method for the\n // reader to decline to handle it.\n if (handler.match && handler.match(tok)) {\n handler.handler(writer, tok);\n return;\n }\n }\n\n // if we didn't find one, look for the default handler\n for (const handler of handlers) {\n if (!handler.match) {\n handler.handler(writer, tok);\n return;\n }\n }\n\n // log unrecognized token\n writer.logUnrecognized(tok.t);\n }\n\n private hasInlineHTMLWriter(html: string) {\n for (const reader of this.inlineHTMLReaders) {\n if (reader(this.schema, html)) {\n return true;\n }\n }\n return false;\n }\n\n private writeInlineHTML(writer: ProsemirrorWriter, html: string) {\n for (const reader of this.inlineHTMLReaders) {\n if (reader(this.schema, html, writer)) {\n return;\n }\n }\n }\n\n // create parser token handler functions based on the passed readers\n private createHandlers(readers: readonly PandocTokenReader[], blockReaders: readonly PandocBlockReaderFn[]) {\n const handlers: { [token: string]: ParserTokenHandlerCandidate[] } = {};\n\n for (const reader of readers) {\n // resolve children (provide default impl)\n const getChildren = reader.getChildren || ((tok: PandocToken) => tok.c);\n\n // resolve getAttrs (provide default imple)\n const getAttrs = reader.getAttrs ? reader.getAttrs : (tok: PandocToken) => ({});\n\n let handler: ParserTokenHandler;\n\n // see if there is a low-level handler\n if (reader.handler) {\n handler = reader.handler(this.schema);\n }\n\n // text\n else if (reader.text) {\n handler = (writer: ProsemirrorWriter, tok: PandocToken) => {\n if (reader.getText) {\n const text = reader.getText(tok);\n writer.writeText(text);\n }\n };\n\n // marks\n } else if (reader.mark) {\n handler = (writer: ProsemirrorWriter, tok: PandocToken) => {\n const markType = this.schema.marks[reader.mark as string];\n const mark = markType.create(getAttrs(tok));\n writer.openMark(mark);\n if (reader.getText) {\n writer.writeText(reader.getText(tok));\n } else {\n writer.writeTokens(getChildren(tok));\n }\n writer.closeMark(mark);\n };\n\n // blocks\n } else if (reader.block) {\n const nodeType = this.schema.nodes[reader.block];\n handler = (writer: ProsemirrorWriter, tok: PandocToken) => {\n // give the block readers first crack (e.g. handle a paragraph node with\n // a single image as a figure node)\n for (const blockReader of blockReaders) {\n if (blockReader(this.schema, tok, writer)) {\n return;\n }\n }\n\n writer.openNode(nodeType, getAttrs(tok));\n if (reader.getText) {\n writer.writeText(reader.getText(tok));\n } else {\n writer.writeTokens(getChildren(tok));\n }\n writer.closeNode();\n };\n\n // nodes\n } else if (reader.node) {\n const nodeType = this.schema.nodes[reader.node];\n handler = (writer: ProsemirrorWriter, tok: PandocToken) => {\n if (reader.getChildren) {\n writer.openNode(nodeType, getAttrs(tok));\n writer.writeTokens(getChildren(tok));\n writer.closeNode();\n } else {\n let content: ProsemirrorNode[] = [];\n if (reader.getText) {\n content = [this.schema.text(reader.getText(tok))];\n }\n writer.addNode(nodeType, getAttrs(tok), content);\n }\n };\n\n // code blocks\n } else if (reader.code_block) {\n handler = (writer: ProsemirrorWriter, tok: PandocToken) => {\n // type/attr/text\n const nodeType = this.schema.nodes.code_block;\n const attr: {} = pandocAttrReadAST(tok, kCodeBlockAttr);\n const text = tok.c[kCodeBlockText] as string;\n\n // write node\n writer.openNode(nodeType, attr);\n writer.writeText(text);\n writer.closeNode();\n };\n } else {\n throw new Error('pandoc reader was malformed or unrecognized');\n }\n\n // Ensure an array exists\n handlers[reader.token] = handlers[reader.token] || [];\n\n handlers[reader.token].push({\n match: reader.match,\n handler,\n });\n }\n return handlers;\n }\n}\n\nclass ParserState {\n private readonly schema: Schema;\n private readonly stack: ParserStackElement[];\n private readonly notes: ProsemirrorNode[];\n private marks: Mark[];\n private footnoteNumber: number;\n private unrecognizedTokens: string[];\n private exampleLists: boolean;\n\n constructor(schema: Schema) {\n this.schema = schema;\n this.stack = [{ type: this.schema.nodes.body, attrs: {}, content: [] }];\n this.notes = [];\n this.marks = Mark.none;\n this.footnoteNumber = 1;\n this.unrecognizedTokens = [];\n this.exampleLists = false;\n }\n\n public doc(): ProsemirrorNode {\n const content: ProsemirrorNode[] = [];\n content.push(this.top().type.createAndFill(null, this.top().content) as ProsemirrorNode);\n content.push(this.schema.nodes.notes.createAndFill(null, this.notes) as ProsemirrorNode);\n return this.schema.topNodeType.createAndFill({}, content) as ProsemirrorNode;\n }\n\n public unrecognized(): string[] {\n return this.unrecognizedTokens;\n }\n\n public hasExampleLists(): boolean {\n return this.exampleLists;\n }\n\n public writeText(text: string) {\n if (!text) {\n return;\n }\n const nodes: ProsemirrorNode[] = this.top().content;\n const last: ProsemirrorNode = nodes[nodes.length - 1];\n const node: ProsemirrorNode = this.schema.text(text, this.marks);\n const merged: ProsemirrorNode | undefined = this.maybeMerge(last, node);\n if (last && merged) {\n nodes[nodes.length - 1] = merged;\n } else {\n nodes.push(node);\n }\n }\n\n public addNode(type: NodeType, attrs: {}, content: ProsemirrorNode[]) {\n const node: ProsemirrorNode | null | undefined = type.createAndFill(attrs, content, this.marks);\n if (!node) {\n return null;\n }\n if (this.stack.length) {\n if (type === this.schema.nodes.note) {\n this.notes.push(node);\n } else {\n this.top().content.push(node);\n }\n }\n return node;\n }\n\n public openNode(type: NodeType, attrs: {}) {\n this.stack.push({ type, attrs, content: [] });\n }\n\n public closeNode(): ProsemirrorNode {\n // get node info\n const info: ParserStackElement = this.stack.pop() as ParserStackElement;\n\n // clear marks if the node type isn't inline\n if (!info.type.isInline) {\n if (this.marks.length) {\n this.marks = Mark.none;\n }\n }\n\n return this.addNode(info.type, info.attrs, info.content) as ProsemirrorNode;\n }\n\n public openMark(mark: Mark) {\n this.marks = mark.addToSet(this.marks);\n }\n\n public closeMark(mark: Mark) {\n this.marks = mark.removeFromSet(this.marks);\n }\n\n public openNoteNode(ref: string) {\n this.openNode(this.schema.nodes.note, { ref, number: this.footnoteNumber++ });\n }\n\n public logUnrecognized(type: string) {\n if (!this.unrecognizedTokens.includes(type)) {\n this.unrecognizedTokens.push(type);\n }\n }\n\n public logExampleList() {\n this.exampleLists = true;\n }\n\n public isNodeOpen(type: NodeType) {\n return this.stack.some(value => value.type === type);\n }\n\n private top(): ParserStackElement {\n return this.stack[this.stack.length - 1];\n }\n\n private maybeMerge(a: ProsemirrorNode, b: ProsemirrorNode): ProsemirrorNode | undefined {\n if (a && a.isText && b.isText && Mark.sameSet(a.marks, b.marks)) {\n return this.schema.text(((a.text as string) + b.text) as string, a.marks);\n } else {\n return undefined;\n }\n }\n}\n\n// determine what sort of line wrapping is used within the file\nfunction detectLineWrapping(ast: PandocAst): PandocLineWrapping {\n // look for soft breaks and classify them as column or sentence breaks\n let columnBreaks = 0;\n let sentenceBreaks = 0;\n let prevTok: PandocToken = { t: PandocTokenType.Null };\n forEachToken(ast.blocks, tok => {\n if (tok.t === PandocTokenType.SoftBreak) {\n if (\n prevTok.t === PandocTokenType.Str &&\n typeof prevTok.c === 'string' &&\n ['.', '?', '!'].includes(prevTok.c.charAt(prevTok.c.length - 1))\n ) {\n sentenceBreaks++;\n } else {\n columnBreaks++;\n }\n }\n prevTok = tok;\n });\n\n // need to have > 5 line breaks or more line breaks than blocks to trigger detection\n // (prevents 'over-detection' if there are stray few soft breaks)\n const lineBreaks = columnBreaks + sentenceBreaks;\n if (lineBreaks > 5 || lineBreaks > ast.blocks.length) {\n if (sentenceBreaks > columnBreaks) {\n return 'sentence';\n } else {\n return 'column';\n }\n } else {\n return 'none';\n }\n}\n\n// determine which heading ids are valid based on explicit headings contained in the\n// document and any headings targeted by links. remove any heading ids not so identified\nfunction resolveHeadingIds(ast: PandocAst, extensions: PandocExtensions) {\n // determine function we will use to create auto-identifiers\n const autoIdentifier = extensions.gfm_auto_identifiers ? gfmAutoIdentifier : pandocAutoIdentifier;\n\n // start with ids we know are valid (i.e. ones the user added to the doc)\n const headingIds = new Set<string>((ast.heading_ids || []).map(id => id.toLocaleLowerCase()));\n\n // find ids referenced in links\n let astBlocks = mapTokens(ast.blocks, tok => {\n if (tok.t === PandocTokenType.Link) {\n const target = tok.c[kLinkTarget];\n const href = target[kLinkTargetUrl] as string;\n if (href.startsWith('#')) {\n // if we have support for implicit header references and shortcut reference links,\n // also check to see whether the link text resolves to the target (in that case\n // we don't need the explicit id). note that if that heading has an explicit\n // id defined then we also leave it alone.\n const text = stringifyTokens(tok.c[kLinkChildren], extensions.gfm_auto_identifiers);\n if (\n hasShortcutHeadingLinks(extensions) &&\n equalsIgnoreCase('#' + autoIdentifier(text, extensions.ascii_identifiers), href) &&\n !headingIds.has(href.toLocaleLowerCase())\n ) {\n // return a version of the link w/o the target\n return {\n t: PandocTokenType.Link,\n c: [tok.c[kLinkAttr], tok.c[kLinkChildren], ['#', tok.c[kLinkTarget][kLinkTargetTitle]]],\n };\n\n // otherwise note that it's a valid id\n } else {\n headingIds.add(href.toLocaleLowerCase());\n }\n }\n }\n // default to return token unmodified\n return tok;\n });\n\n // remove any heading ids not created by the user or required by a link\n astBlocks = mapTokens(ast.blocks, tok => {\n if (tok.t === PandocTokenType.Header) {\n const attr = pandocAttrReadAST(tok, kHeadingAttr);\n if (attr.id && !headingIds.has('#' + attr.id.toLocaleLowerCase())) {\n return {\n t: PandocTokenType.Header,\n c: [\n tok.c[kHeadingLevel],\n ['', tok.c[kHeadingAttr][kPandocAttrClasses], tok.c[kHeadingAttr][kPandocAttrKeyvalue]],\n tok.c[kHeadingChildren],\n ],\n };\n }\n }\n // default to just reflecting back the token\n return tok;\n });\n\n // return the ast\n return {\n ...ast,\n blocks: astBlocks,\n heading_ids: undefined,\n };\n}\n\ninterface ParserStackElement {\n type: NodeType;\n attrs: {};\n content: ProsemirrorNode[];\n}\n\ntype ParserTokenHandler = (writer: ProsemirrorWriter, tok: PandocToken) => void;\n\ninterface ParserTokenHandlerCandidate {\n match?: (tok: PandocToken) => boolean;\n handler: ParserTokenHandler;\n}\n","/*\n * pandoc_from_prosemirror.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Fragment, MarkType, Mark } from 'prosemirror-model';\n\nimport {\n PandocAst,\n PandocToken,\n PandocOutput,\n PandocNodeWriterFn,\n PandocNodeWriter,\n PandocMarkWriter,\n PandocApiVersion,\n PandocTokenType,\n PandocOutputOption,\n PandocExtensions,\n marksByPriority,\n kPreventBracketEscape,\n} from '../api/pandoc';\n\nimport { PandocFormat, kGfmFormat } from '../api/pandoc_format';\nimport { PandocAttr } from '../api/pandoc_attr';\nimport { fragmentText } from '../api/fragment';\nimport { fancyQuotesToSimple } from '../api/quote';\n\nexport function pandocFromProsemirror(\n doc: ProsemirrorNode,\n apiVersion: PandocApiVersion,\n format: PandocFormat,\n nodeWriters: readonly PandocNodeWriter[],\n markWriters: readonly PandocMarkWriter[],\n) {\n const bodyNode = doc.child(0);\n const notesNode = doc.child(1);\n const writer = new PandocWriter(apiVersion, format, nodeWriters, markWriters, notesNode);\n writer.writeNodes(bodyNode);\n return writer.output();\n}\n\nclass PandocWriter implements PandocOutput {\n private readonly ast: PandocAst;\n private readonly format: PandocFormat;\n private readonly nodeWriters: { [key: string]: PandocNodeWriterFn };\n private readonly markWriters: { [key: string]: PandocMarkWriter };\n private readonly notes: { [key: string]: ProsemirrorNode };\n private readonly containers: any[][];\n private readonly activeMarks: MarkType[];\n private options: { [key: string]: boolean };\n\n public readonly extensions: PandocExtensions;\n\n private readonly escapeCharacters: string[] = [];\n private readonly manualEscapeCharacters: Map<string, string> = new Map<string, string>();\n private readonly preventEscapeCharacters: string[] = [];\n\n constructor(\n apiVersion: PandocApiVersion,\n format: PandocFormat,\n nodeWriters: readonly PandocNodeWriter[],\n markWriters: readonly PandocMarkWriter[],\n notes: ProsemirrorNode,\n ) {\n // save format and extensions\n this.format = format;\n this.extensions = format.extensions;\n // compute escape characters based on format\n this.initEscapeCharacters();\n // create maps of node and mark writers\n this.nodeWriters = {};\n nodeWriters.forEach((writer: PandocNodeWriter) => {\n this.nodeWriters[writer.name] = writer.write;\n });\n this.markWriters = {};\n markWriters.forEach((writer: PandocMarkWriter) => {\n this.markWriters[writer.name] = writer;\n });\n // create map of notes\n this.notes = {};\n notes.forEach((note: ProsemirrorNode) => {\n this.notes[note.attrs.ref] = note;\n });\n\n this.ast = {\n blocks: [],\n 'pandoc-api-version': apiVersion,\n meta: {},\n };\n this.containers = [this.ast.blocks];\n this.activeMarks = [];\n this.options = {\n writeSpaces: true,\n };\n }\n\n public output() {\n return {\n ast: this.ast,\n };\n }\n\n public write(value: any) {\n const container = this.containers[this.containers.length - 1];\n container.push(value);\n }\n\n public writeToken(type: PandocTokenType, content?: (() => void) | any) {\n const token: PandocToken = {\n t: type,\n };\n if (content !== undefined) {\n if (typeof content === 'function') {\n token.c = [];\n this.fill(token.c, content);\n } else {\n token.c = content;\n }\n }\n this.write(token);\n }\n\n public writeMark(type: PandocTokenType, parent: Fragment, expelEnclosingWhitespace = true) {\n // expel enclosing whitepsace if requested and if the fragment isn't 100% spaces\n if (expelEnclosingWhitespace) {\n // build output spec\n const output = {\n spaceBefore: false,\n nodes: new Array<ProsemirrorNode>(),\n spaceAfter: false,\n };\n\n // if we see leading or trailing spaces we need to output them as tokens\n // and substitute text nodes\n parent.forEach((node: ProsemirrorNode, offset: number, index: number) => {\n // check for leading/trailing space in first/last nodes\n if (node.isText) {\n let outputText = node.textContent;\n\n // checking for leading space in first node\n if (output.nodes.length === 0 && node.textContent.match(/^\\s+/)) {\n output.spaceBefore = true;\n outputText = outputText.trimLeft();\n }\n\n // check for trailing space in last node\n if (index === parent.childCount - 1 && node.textContent.match(/\\s+$/)) {\n output.spaceAfter = true;\n outputText = outputText.trimRight();\n }\n\n // check for an entirely blank node\n if (outputText.match(/^\\s*$/)) {\n outputText = '';\n }\n\n // skip the node if it has nothing in it\n if (outputText.length > 0) {\n // if we modified the node's text then create a new node\n if (outputText !== node.textContent) {\n output.nodes.push(node.type.schema.text(outputText, node.marks));\n } else {\n output.nodes.push(node);\n }\n }\n } else {\n output.nodes.push(node);\n }\n });\n\n // output space tokens before/after mark as necessary\n if (output.nodes.length > 0) {\n if (output.spaceBefore) {\n this.writeToken(PandocTokenType.Space);\n }\n this.writeToken(type, () => {\n this.writeInlines(Fragment.from(output.nodes));\n });\n if (output.spaceAfter) {\n this.writeToken(PandocTokenType.Space);\n }\n }\n\n // normal codepath (not expelling existing whitespace)\n } else {\n this.writeToken(type, () => {\n this.writeInlines(parent);\n });\n }\n }\n\n public writeArray(content: () => void) {\n const arr: any[] = [];\n this.fill(arr, content);\n this.write(arr);\n }\n\n public writeAttr(id?: string, classes?: string[], keyvalue?: Array<[string, string]>) {\n this.write([id || '', classes || [], keyvalue || []]);\n }\n\n public writeText(text: string | null) {\n // determine which characters we shouldn't escape\n const preventEscapeCharacters = [ ...this.preventEscapeCharacters ];\n if (this.options[kPreventBracketEscape]) {\n preventEscapeCharacters.push('[', ']');\n }\n\n if (text) {\n let textRun = '';\n const flushTextRun = () => {\n if (textRun) {\n // if this is a line block, convert leading nbsp to regular space,\n if (!this.options.writeSpaces) {\n textRun = textRun.replace(/(^|\\n)+(\\u00A0+)/g, (_match, p1, p2) => {\n return p1 + Array(p2.length + 1).join(' ');\n });\n }\n\n // reverse smart punctuation. pandoc does this autmoatically for markdown\n // writing w/ +smart, however this also results in nbsp's being inserted\n // after selected abbreviations like e.g. and Mr., and we don't want that\n // to happen for editing (b/c the nbsp's weren't put there by the user\n // and are not obviously visible)\n if (this.extensions.smart) {\n textRun = textRun\n .replace(/—/g, '---')\n .replace(/–/g, '--')\n .replace(/…/g, '...');\n textRun = fancyQuotesToSimple(textRun);\n }\n \n this.writeToken(PandocTokenType.Str, textRun);\n textRun = '';\n }\n };\n for (let i = 0; i < text.length; i++) {\n const ch = text.charAt(i);\n if (this.options.writeSpaces && ch === ' ') {\n flushTextRun();\n this.writeToken(PandocTokenType.Space);\n } else if (preventEscapeCharacters.includes(ch)) {\n flushTextRun();\n this.writeRawMarkdown(ch);\n } else if (this.manualEscapeCharacters.has(ch)) {\n flushTextRun();\n this.writeRawMarkdown(this.manualEscapeCharacters.get(ch)!);\n } else {\n textRun += ch;\n }\n }\n flushTextRun();\n }\n }\n\n public writeLink(href: string, title: string, attr: PandocAttr | null, content: VoidFunction) {\n this.writeToken(PandocTokenType.Link, () => {\n // write attr if provided\n if (attr) {\n this.writeAttr(attr.id, attr.classes, attr.keyvalue);\n } else {\n this.writeAttr();\n }\n // write content\n this.writeArray(() => {\n content();\n });\n\n // write href\n this.write([href || '', title || '']);\n });\n }\n\n public writeNote(note: ProsemirrorNode) {\n // get corresponding note body\n const noteBody = this.notes[note.attrs.ref];\n\n // don't write empty footnotes (otherwise in block or section mode they gobble up the section below them)\n if (noteBody.textContent.trim().length > 0) {\n this.writeToken(PandocTokenType.Note, () => {\n this.writeNodes(noteBody);\n });\n }\n }\n\n public writeNode(node: ProsemirrorNode) {\n this.nodeWriters[node.type.name](this, node);\n }\n\n public writeNodes(parent: ProsemirrorNode) {\n parent.forEach(this.writeNode.bind(this));\n }\n\n public writeInlines(fragment: Fragment) {\n // get the marks from a node that are not already on the stack of active marks\n const nodeMarks = (node: ProsemirrorNode) => {\n // get marks ordered by writer priority\n let marks = marksByPriority(node.marks, this.markWriters);\n\n // remove active marks\n for (const activeMark of this.activeMarks) {\n marks = activeMark.removeFromSet(marks);\n }\n\n // return marks\n return marks;\n };\n\n // helpers to iterate through the nodes (sans any marks already on the stack)\n let currentChild = 0;\n const nextNode = () => {\n const childIndex = currentChild;\n currentChild++;\n return {\n node: fragment.child(childIndex),\n marks: nodeMarks(fragment.child(childIndex)),\n };\n };\n const putBackNode = () => {\n currentChild--;\n };\n\n // iterate through the nodes\n while (currentChild < fragment.childCount) {\n // get the next node\n let next = nextNode();\n\n // if there are active marks then collect them up and call the mark handler\n // with all nodes that it contains, otherwise just process it as a plain\n // unmarked node\n if (next.marks.length > 0) {\n // get the mark and start building a list of marked nodes\n const mark = next.marks[0];\n const markedNodes: ProsemirrorNode[] = [next.node];\n\n // inner iteration to find nodes that have this mark\n while (currentChild < fragment.childCount) {\n next = nextNode();\n // If the next node shares the same mark with the current node\n // then add this next node node as a child of the current node\n if (next.marks.some(nextMark => nextMark.eq(mark))) {\n markedNodes.push(next.node);\n } else {\n // no mark found, \"put back\" the node\n putBackNode();\n break;\n }\n }\n\n // call the mark writer after noting that this mark is active (which\n // will cause subsequent recursive invocations of this function to\n // not re-process this mark)\n this.activeMarks.push(mark.type);\n this.markWriters[mark.type.name].write(this, mark, Fragment.from(markedNodes));\n this.activeMarks.pop();\n } else {\n // ordinary unmarked node, call the node writer\n this.nodeWriters[next.node.type.name](this, next.node);\n }\n }\n }\n\n public writeRawMarkdown(markdown: Fragment | string, escapeSymbols?: boolean) {\n // collect markdown text if necessary\n let md = markdown instanceof Fragment ? fragmentText(markdown) : markdown;\n\n // escape symbols if requested\n if (escapeSymbols) {\n const escaped: string[] = [];\n for (let i = 0; i < md.length; i++) {\n const ch = md.charAt(i);\n if (this.escapeCharacters.includes(ch)) {\n escaped.push('\\\\' + ch);\n } else {\n escaped.push(ch);\n }\n }\n md = escaped.join('');\n }\n\n this.writeToken(PandocTokenType.RawInline, () => {\n this.write('markdown');\n this.write(md);\n });\n }\n\n public withOption(option: PandocOutputOption, value: boolean, f: () => void) {\n const previousValue = this.options[option];\n this.options[option] = value;\n f();\n this.options[option] = previousValue;\n }\n\n private fill(container: any[], content: () => void) {\n this.containers.push(container);\n content();\n this.containers.pop();\n }\n\n private initEscapeCharacters() {\n // gfm disallows [] escaping so that MediaWiki style page links (e.g. [[MyPage]]) work as expected\n // tex_math_single_backslash does not allow escaping of [] or () (as that conflicts with the math syntax)\n if (this.format.mode === kGfmFormat || this.format.extensions.tex_math_single_backslash) {\n this.preventEscapeCharacters.push('[', ']');\n }\n\n // tex_math_single_backslash does not allow escaping of [] or () (as that conflicts with the math syntax)\n if (this.format.extensions.tex_math_single_backslash) {\n this.preventEscapeCharacters.push('(', ')');\n }\n\n // filter standard escape characters w/ preventEscapeCharacters\n const allEscapeCharacters = ['\\\\', '`', '*', '_', '{', '}', '[', ']', '(', ')', '>', '#', '+', '-', '.', '!'];\n if (this.format.extensions.angle_brackets_escapable) {\n allEscapeCharacters.push('<');\n }\n this.escapeCharacters.push(...allEscapeCharacters.filter(ch => !this.preventEscapeCharacters.includes(ch)));\n\n // Manual escape characters are ones we can't rely on pandoc to automatically escape (b/c\n // they represent valid syntax for a markdown extension, e.g. '@' for citations).\n // For '@', since we already do special writing for spans we know are citation ids, we can\n // globally prescribe escaping behavior and never stomp over a citation. We also check\n // that '@' can be escaped in the current markdown format, and if not use an html escape.\n const atEscape = this.extensions.all_symbols_escapable ? '\\\\@' : '@';\n this.manualEscapeCharacters.set('@', atEscape);\n }\n}\n","/*\n * fragment.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Fragment } from 'prosemirror-model';\n\nexport function fragmentText(fragment: Fragment, unemoji = false) {\n let text = '';\n fragment.forEach(node => {\n const emjojiMark = node.marks.find(mark => mark.type === node.type.schema.marks.emoji);\n if (unemoji && emjojiMark) {\n return (text = text + (emjojiMark.attrs.emojihint || node.textContent));\n } else {\n return (text = text + node.textContent);\n }\n });\n return text;\n}\n","/*\n * editor-extensions.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { InputRule } from 'prosemirror-inputrules';\nimport { Schema } from 'prosemirror-model';\nimport { Plugin } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { ProsemirrorCommand } from '../api/command';\nimport { PandocMark } from '../api/mark';\nimport { PandocNode, CodeViewOptions } from '../api/node';\nimport { Extension, ExtensionFn, ExtensionContext } from '../api/extension';\nimport { BaseKeyBinding } from '../api/basekeys';\nimport { OmniInserter } from '../api/omni_insert';\nimport { AppendTransactionHandler, AppendMarkTransactionHandler } from '../api/transaction';\nimport { FixupFn } from '../api/fixup';\nimport {\n PandocTokenReader,\n PandocMarkWriter,\n PandocNodeWriter,\n PandocPreprocessorFn,\n PandocPostprocessorFn,\n PandocBlockReaderFn,\n PandocInlineHTMLReaderFn,\n PandocTokensFilterFn,\n} from '../api/pandoc';\nimport { PandocBlockCapsuleFilter } from '../api/pandoc_capsule';\nimport { markInputRuleFilter } from '../api/input_rule';\nimport { CompletionHandler } from '../api/completion';\n\n// required extensions (base non-customiziable pandoc nodes/marks + core behaviors)\nimport nodeText from '../nodes/text';\nimport nodeParagraph from '../nodes/paragraph';\nimport nodeHeading from '../nodes/heading';\nimport nodeBlockquote from '../nodes/blockquote';\nimport nodeCodeBlock from '../nodes/code_block';\nimport nodeLists from '../nodes/list/list';\nimport nodeImage from '../nodes/image/image';\nimport nodeFigure from '../nodes/image/figure';\nimport nodeHr from '../nodes/hr';\nimport nodeHardBreak from '../nodes/hard_break';\nimport nodeNull from '../nodes/null';\nimport markEm from '../marks/em';\nimport markStrong from '../marks/strong';\nimport markCode from '../marks/code';\nimport markLink from '../marks/link/link';\nimport behaviorHistory from '../behaviors/history';\nimport behaviorSelectAll from '../behaviors/select_all';\nimport behaviorCursor from '../behaviors/cursor';\nimport behaviorFind from '../behaviors/find';\nimport behaviorSpellingInteractive from '../behaviors/spelling/spelling-interactive';\nimport behaviorClearFormatting from '../behaviors/clear_formatting';\n\n// behaviors\nimport behaviorSmarty from '../behaviors/smarty';\nimport behaviorAttrDuplicateId from '../behaviors/attr_duplicate_id';\nimport behaviorTrailingP from '../behaviors/trailing_p';\nimport behaviorEmptyMark from '../behaviors/empty_mark';\nimport behaviorEscapeMark from '../behaviors/escape_mark';\nimport behaviorOutline from '../behaviors/outline';\nimport beahviorCodeBlockInput from '../behaviors/code_block_input';\nimport behaviorPasteText from '../behaviors/paste_text';\nimport behaviorBottomPadding from '../behaviors/bottom_padding';\nimport behaviorInsertSymbol from '../behaviors/insert_symbol/insert_symbol-plugin-symbol';\nimport behaviorInsertSymbolEmoji from '../behaviors/insert_symbol/insert_symbol-plugin-emoji';\nimport beahviorInsertSpecialCharacters from '../behaviors/insert_symbol/insert_special_characters';\nimport behaviorNbsp from '../behaviors/nbsp';\nimport behaviorRemoveSection from '../behaviors/remove_section';\nimport behaviorSlides from '../behaviors/slides';\n\n// marks\nimport markStrikeout from '../marks/strikeout';\nimport markSuperscript from '../marks/superscript';\nimport markSubscript from '../marks/subscript';\nimport markSmallcaps from '../marks/smallcaps';\nimport markUnderline from '../marks/underline';\nimport markRawInline from '../marks/raw_inline/raw_inline';\nimport markRawTex from '../marks/raw_inline/raw_tex';\nimport markRawHTML from '../marks/raw_inline/raw_html';\nimport markMath from '../marks/math/math';\nimport markCite from '../marks/cite/cite';\nimport markSpan from '../marks/span';\nimport markXRef from '../marks/xref/xref';\nimport markHTMLComment from '../marks/raw_inline/raw_html_comment';\nimport markShortcode from '../marks/shortcode';\nimport markEmoji from '../marks/emoji/emoji';\nimport { markOmniInsert } from '../behaviors/omni_insert/omni_insert';\n\n// nodes\nimport nodeFootnote from '../nodes/footnote/footnote';\nimport nodeRawBlock from '../nodes/raw_block';\nimport nodeYamlMetadata from '../nodes/yaml_metadata/yaml_metadata';\nimport nodeRmdCodeChunk from '../nodes/rmd_chunk/rmd_chunk';\nimport nodeDiv from '../nodes/div/div';\nimport nodeLineBlock from '../nodes/line_block';\nimport nodeTable from '../nodes/table/table';\nimport nodeDefinitionList from '../nodes/definition_list/definition_list';\nimport nodeShortcodeBlock from '../nodes/shortcode_block';\nimport nodeHtmlPreserve from '../nodes/html_preserve';\n\n// extension/plugin factories\nimport { aceExtension } from '../optional/ace/ace';\nimport { attrEditExtension } from '../behaviors/attr_edit/attr_edit';\nimport { codeViewClipboardPlugin } from '../api/code';\n\nexport function initExtensions(context: ExtensionContext, extensions?: readonly Extension[]): ExtensionManager {\n // create extension manager\n const manager = new ExtensionManager(context);\n\n // required extensions\n manager.register([\n nodeText,\n nodeParagraph,\n nodeHeading,\n nodeBlockquote,\n nodeLists,\n nodeCodeBlock,\n nodeImage,\n nodeFigure,\n nodeHr,\n nodeHardBreak,\n nodeNull,\n markEm,\n markStrong,\n markCode,\n markLink,\n behaviorHistory,\n behaviorSelectAll,\n behaviorCursor,\n behaviorFind,\n behaviorSpellingInteractive,\n behaviorClearFormatting,\n behaviorSlides\n ]);\n\n // optional extensions\n manager.register([\n // behaviors\n behaviorSmarty,\n behaviorAttrDuplicateId,\n behaviorTrailingP,\n behaviorEmptyMark,\n behaviorEscapeMark,\n behaviorOutline,\n beahviorCodeBlockInput,\n behaviorPasteText,\n behaviorBottomPadding,\n behaviorInsertSymbol,\n behaviorInsertSymbolEmoji,\n beahviorInsertSpecialCharacters,\n behaviorNbsp,\n behaviorRemoveSection,\n\n // nodes\n nodeDiv,\n nodeFootnote,\n nodeYamlMetadata,\n nodeRmdCodeChunk,\n nodeTable,\n nodeDefinitionList,\n nodeLineBlock,\n nodeRawBlock,\n nodeShortcodeBlock,\n nodeHtmlPreserve,\n\n // marks\n markUnderline,\n markStrikeout,\n markSuperscript,\n markSubscript,\n markSmallcaps,\n markHTMLComment,\n markRawTex,\n markRawHTML,\n markRawInline,\n markMath,\n markCite,\n markSpan,\n markXRef,\n markShortcode,\n markEmoji,\n markOmniInsert,\n ]);\n\n // register external extensions\n if (extensions) {\n manager.register(extensions);\n }\n\n // additional extensions dervied from other extensions (e.g. extensions that have registered attr editors)\n // note that all of these take a callback to access the manager -- this is so that if an extension earlier\n // in the chain registers something the later extensions are able to see it\n manager.register([\n // bindings to 'Edit Attribute' command and UI adornment\n attrEditExtension(context.pandocExtensions, context.ui, context.format, manager.attrEditors()),\n ]);\n\n // additional plugins derived from extensions\n const codeViews = manager.codeViews();\n const plugins: Plugin[] = [];\n if (context.options.codeEditor === 'ace') {\n manager.register([\n aceExtension(codeViews)\n ]);\n }\n plugins.push(codeViewClipboardPlugin(codeViews));\n\n // register plugins\n manager.registerPlugins(plugins);\n\n // return manager\n return manager;\n}\n\nexport class ExtensionManager {\n private context: ExtensionContext;\n private extensions: Extension[];\n\n public constructor(context: ExtensionContext) {\n this.context = context;\n this.extensions = [];\n }\n\n public register(extensions: ReadonlyArray<Extension | ExtensionFn>, priority = false): void {\n extensions.forEach(extension => {\n if (typeof extension === 'function') {\n const ext = extension(this.context);\n if (ext) {\n if (priority) {\n this.extensions.unshift(ext);\n } else {\n this.extensions.push(ext);\n }\n }\n } else {\n if (priority) {\n this.extensions.unshift(extension);\n } else {\n this.extensions.push(extension);\n }\n }\n });\n }\n\n public registerPlugins(plugins: Plugin[], priority = false) {\n this.register([{ plugins: () => plugins }], priority);\n }\n\n public pandocMarks(): readonly PandocMark[] {\n return this.collect(extension => extension.marks);\n }\n\n public pandocNodes(): readonly PandocNode[] {\n return this.collect(extension => extension.nodes);\n }\n\n public pandocPreprocessors(): readonly PandocPreprocessorFn[] {\n return this.collectFrom({\n node: node => [node.pandoc.preprocessor],\n });\n }\n\n public pandocPostprocessors(): readonly PandocPostprocessorFn[] {\n return this.pandocReaders().flatMap(reader => (reader.postprocessor ? [reader.postprocessor] : []));\n }\n\n public pandocTokensFilters(): readonly PandocTokensFilterFn[] {\n return this.collectFrom({\n mark: mark => [mark.pandoc.tokensFilter],\n node: node => [node.pandoc.tokensFilter],\n });\n }\n\n public pandocBlockReaders(): readonly PandocBlockReaderFn[] {\n return this.collectFrom({\n node: node => [node.pandoc.blockReader],\n });\n }\n\n public pandocInlineHTMLReaders(): readonly PandocInlineHTMLReaderFn[] {\n return this.collectFrom({\n mark: mark => [mark.pandoc.inlineHTMLReader],\n node: node => [node.pandoc.inlineHTMLReader],\n });\n }\n\n public pandocBlockCapsuleFilters(): readonly PandocBlockCapsuleFilter[] {\n return this.collectFrom({\n node: node => [node.pandoc.blockCapsuleFilter],\n });\n }\n\n public pandocReaders(): readonly PandocTokenReader[] {\n return this.collectFrom({\n mark: mark => mark.pandoc.readers,\n node: node => node.pandoc.readers ?? [],\n });\n }\n\n public pandocMarkWriters(): readonly PandocMarkWriter[] {\n return this.collectFrom({\n mark: mark => [{ name: mark.name, ...mark.pandoc.writer }],\n });\n }\n\n public pandocNodeWriters(): readonly PandocNodeWriter[] {\n return this.collectFrom({\n node: node => {\n return node.pandoc.writer ? [{ name: node.name, write: node.pandoc.writer! }] : [];\n },\n });\n }\n\n public commands(schema: Schema): readonly ProsemirrorCommand[] {\n return this.collect<ProsemirrorCommand>(extension => extension.commands?.(schema));\n }\n\n public omniInserters(schema: Schema): OmniInserter[] {\n const omniInserters: OmniInserter[] = [];\n const commands = this.commands(schema);\n commands.forEach(command => {\n if (command.omniInsert) {\n omniInserters.push({\n ...command.omniInsert,\n id: command.id,\n command: command.execute,\n });\n }\n });\n return omniInserters;\n }\n\n public codeViews() {\n const views: { [key: string]: CodeViewOptions } = {};\n this.pandocNodes().forEach((node: PandocNode) => {\n if (node.code_view) {\n views[node.name] = node.code_view;\n }\n });\n return views;\n }\n\n public attrEditors() {\n return this.collectFrom({\n node: node => [node.attr_edit?.()],\n });\n }\n\n public baseKeys(schema: Schema): readonly BaseKeyBinding[] {\n return this.collect(extension => extension.baseKeys?.(schema));\n }\n\n public appendTransactions(schema: Schema): readonly AppendTransactionHandler[] {\n return this.collect(extension => extension.appendTransaction?.(schema));\n }\n\n public appendMarkTransactions(schema: Schema): readonly AppendMarkTransactionHandler[] {\n return this.collect(extension => extension.appendMarkTransaction?.(schema));\n }\n\n public plugins(schema: Schema): readonly Plugin[] {\n return this.collect(extension => extension.plugins?.(schema));\n }\n\n public fixups(schema: Schema, view: EditorView): readonly FixupFn[] {\n return this.collect(extension => extension.fixups?.(schema, view));\n }\n\n public completionHandlers(): readonly CompletionHandler[] {\n return this.collect(extension => extension.completionHandlers?.());\n }\n\n // NOTE: return value not readonly b/c it will be fed directly to a\n // Prosemirror interface that doesn't take readonly\n public inputRules(schema: Schema): InputRule[] {\n const markFilter = markInputRuleFilter(schema, this.pandocMarks());\n return this.collect<InputRule>(extension => extension.inputRules?.(schema, markFilter));\n }\n\n private collect<T>(collector: (extension: Extension) => readonly T[] | undefined) {\n return this.collectFrom({\n extension: extension => collector(extension) ?? [],\n });\n }\n\n /**\n * Visits extensions in order of registration, providing optional callbacks\n * for extension, mark, and node. The return value of callbacks should be\n * arrays of (T | undefined | null); these will all be concatenated together,\n * with the undefined and nulls filtered out.\n *\n * @param visitor Object containing callback methods for the different\n * extension parts.\n */\n private collectFrom<T>(visitor: {\n extension?: (extension: Extension) => ReadonlyArray<T | undefined | null>;\n mark?: (mark: PandocMark) => ReadonlyArray<T | undefined | null>;\n node?: (node: PandocNode) => ReadonlyArray<T | undefined | null>;\n }): T[] {\n const results: Array<T | undefined | null> = [];\n\n this.extensions.forEach(extension => {\n if (visitor.extension) {\n results.push(...visitor.extension(extension));\n }\n if (visitor.mark && extension.marks) {\n results.push(...extension.marks.flatMap(visitor.mark));\n }\n if (visitor.node && extension.nodes) {\n results.push(...extension.nodes.flatMap(visitor.node));\n }\n });\n\n return results.filter(value => typeof value !== 'undefined' && value !== null) as T[];\n }\n}\n","/*\n * text.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { PandocOutput, PandocToken, PandocTokenType, ProsemirrorWriter } from '../api/pandoc';\nimport { ExtensionContext } from '../api/extension';\nimport { kQuoteType, QuoteType, kQuoteChildren, fancyQuotesToSimple } from '../api/quote';\n\nconst extension = (context: ExtensionContext) => {\n const readText = (text: string) => {\n // we explicitly don't want fancy quotes in the editor\n if (context.pandocExtensions.smart) {\n text = fancyQuotesToSimple(text);\n }\n \n if (context.pandocExtensions.smart) {\n return text\n .replace(/---/g, '—')\n .replace(/--/g, '–')\n .replace(/\\.\\.\\./g, '…');\n } else {\n return text;\n }\n };\n\n return {\n nodes: [\n {\n name: 'text',\n spec: {\n group: 'inline',\n toDOM(node: ProsemirrorNode): any {\n return node.text;\n },\n },\n pandoc: {\n readers: [\n { token: PandocTokenType.Str, text: true, getText: (t: PandocToken) => readText(t.c) },\n { token: PandocTokenType.Space, text: true, getText: () => ' ' },\n { token: PandocTokenType.SoftBreak, text: true, getText: () => ' ' },\n {\n token: PandocTokenType.Quoted,\n handler: () => (writer: ProsemirrorWriter, tok: PandocToken) => {\n const type = tok.c[kQuoteType].t;\n const quote = type === QuoteType.SingleQuote ? \"'\" : '\"';\n writer.writeTokens([{ t: 'Str', c: quote }, ...tok.c[kQuoteChildren], { t: 'Str', c: quote }]);\n },\n },\n ],\n writer: (output: PandocOutput, node: ProsemirrorNode) => {\n const text = node.textContent;\n output.writeText(text);\n },\n },\n },\n ],\n };\n};\n\nexport default extension;\n","/*\n * paragraph.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\n\nimport { BlockCommand, EditorCommandId, ProsemirrorCommand } from '../api/command';\nimport { Extension } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\nimport { insertParagraph } from '../api/paragraph';\nimport { emptyNodePlaceholderPlugin } from '../api/placeholder';\nimport { selectionWithinLastBodyParagraph } from '../api/selection';\nimport { kAddToHistoryTransaction } from '../api/transaction';\n\nconst extension: Extension = {\n nodes: [\n {\n name: 'paragraph',\n spec: {\n content: 'inline*',\n group: 'block list_item_block',\n parseDOM: [{ tag: 'p' }],\n toDOM() {\n return ['p', 0];\n },\n },\n pandoc: {\n readers: [\n { token: PandocTokenType.Para, block: 'paragraph' },\n { token: PandocTokenType.Plain, block: 'paragraph' },\n ],\n writer: (output: PandocOutput, node: ProsemirrorNode) => {\n output.writeToken(PandocTokenType.Para, () => {\n output.writeInlines(node.content);\n });\n },\n },\n },\n ],\n\n commands: (schema: Schema) => {\n return [\n new BlockCommand(EditorCommandId.Paragraph, ['Mod-Alt-0'], schema.nodes.paragraph, schema.nodes.paragraph),\n new InsertParagraphCommand(),\n ];\n },\n\n plugins: (schema: Schema) => {\n let showHint = true;\n return [emptyNodePlaceholderPlugin(schema.nodes.paragraph, node => \" type / to insert a block (code, math, figure, div, etc.)\", tr => {\n if (showHint !== false) {\n if (selectionWithinLastBodyParagraph(tr.selection)) {\n if (tr.docChanged) {\n showHint = false;\n return false;\n } else {\n return true;\n }\n } else {\n return false;\n }\n } else {\n return false;\n }\n })];\n },\n};\n\nclass InsertParagraphCommand extends ProsemirrorCommand {\n constructor() {\n super(EditorCommandId.ParagraphInsert, [], insertParagraph);\n }\n}\n\nexport default extension;\n","/*\n * heading.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { textblockTypeInputRule, InputRule } from 'prosemirror-inputrules';\nimport { Node as ProsemirrorNode, Schema, NodeType, Fragment } from 'prosemirror-model';\nimport { EditorState } from 'prosemirror-state';\nimport { findParentNode, findParentNodeOfType } from 'prosemirror-utils';\n\nimport { PandocOutput, PandocToken, PandocTokenType } from '../api/pandoc';\nimport { EditorCommandId, toggleBlockType, ProsemirrorCommand } from '../api/command';\nimport { Extension, ExtensionContext } from '../api/extension';\nimport {\n pandocAttrSpec,\n pandocAttrParseDom,\n pandocAttrToDomAttr,\n pandocAttrReadAST,\n pandocAttrParseText,\n} from '../api/pandoc_attr';\nimport { uuidv4 } from '../api/util';\nimport { EditorUI } from '../api/ui';\nimport { OmniInsert, OmniInsertGroup } from '../api/omni_insert';\nimport { emptyNodePlaceholderPlugin } from '../api/placeholder';\nimport { kHeadingLevel, kHeadingAttr, kHeadingChildren } from '../api/heading';\n\nconst kHeadingLevels = [1, 2, 3, 4, 5, 6];\n\nconst extension = (context: ExtensionContext): Extension => {\n const { pandocExtensions, format, ui } = context;\n\n const headingAttr = pandocExtensions.header_attributes || pandocExtensions.mmd_header_identifiers;\n\n return {\n nodes: [\n {\n name: 'heading',\n spec: {\n attrs: {\n level: { default: 1 },\n link: { default: null },\n navigation_id: { default: null },\n ...(headingAttr ? pandocAttrSpec : {}),\n },\n content: 'inline*',\n group: 'block',\n defining: true,\n parseDOM: [\n { tag: 'h1', getAttrs: headingAttrs(1, headingAttr) },\n { tag: 'h2', getAttrs: headingAttrs(2, headingAttr) },\n { tag: 'h3', getAttrs: headingAttrs(3, headingAttr) },\n { tag: 'h4', getAttrs: headingAttrs(4, headingAttr) },\n { tag: 'h5', getAttrs: headingAttrs(5, headingAttr) },\n { tag: 'h6', getAttrs: headingAttrs(6, headingAttr) },\n ],\n toDOM(node) {\n const attr = headingAttr ? pandocAttrToDomAttr(node.attrs) : {};\n attr.class = (attr.class || '').concat(' pm-heading');\n return [\n 'h' + node.attrs.level,\n {\n 'data-link': node.attrs.link,\n ...attr,\n },\n\n 0,\n ];\n },\n },\n\n attr_edit: () => {\n if (headingAttr) {\n return {\n type: (schema: Schema) => schema.nodes.heading,\n offset: {\n top: 2,\n right: 6,\n },\n preferHidden: true\n };\n } else {\n return null;\n }\n },\n\n pandoc: {\n readers: [\n {\n token: PandocTokenType.Header,\n block: 'heading',\n getAttrs: (tok: PandocToken) => ({\n level: tok.c[kHeadingLevel],\n navigation_id: uuidv4(),\n ...(headingAttr ? pandocAttrReadAST(tok, kHeadingAttr) : {}),\n }),\n getChildren: (tok: PandocToken) => tok.c[kHeadingChildren],\n },\n ],\n writer: (output: PandocOutput, node: ProsemirrorNode) => {\n output.writeToken(PandocTokenType.Header, () => {\n output.write(node.attrs.level);\n if (headingAttr) {\n output.writeAttr(node.attrs.id, node.attrs.classes, node.attrs.keyvalue);\n } else {\n output.writeAttr();\n }\n output.writeArray(() => {\n if (node.attrs.level === 1 && format.rmdExtensions.bookdownPart) {\n writeBookdownH1(output, node);\n } else {\n output.writeInlines(node.content);\n }\n });\n });\n },\n },\n },\n ],\n\n commands: (schema: Schema) => {\n return [\n new HeadingCommand(schema, EditorCommandId.Heading1, 1, heading1OmniInsert(ui)),\n new HeadingCommand(schema, EditorCommandId.Heading2, 2, heading2OmniInsert(ui)),\n new HeadingCommand(schema, EditorCommandId.Heading3, 3, heading3OmniInsert(ui)),\n new HeadingCommand(schema, EditorCommandId.Heading4, 4, heading4OmniInsert(ui)),\n new HeadingCommand(schema, EditorCommandId.Heading5, 5),\n new HeadingCommand(schema, EditorCommandId.Heading6, 6),\n ];\n },\n\n inputRules: (schema: Schema) => {\n const rules = [\n textblockTypeInputRule(\n new RegExp('^(#{1,' + kHeadingLevels.length + '})\\\\s$'),\n schema.nodes.heading,\n match => ({\n level: match[1].length,\n navigation_id: uuidv4(),\n }),\n ),\n ];\n\n if (headingAttr) {\n rules.push(headingAttributeInputRule(schema));\n }\n\n return rules;\n },\n\n plugins: (schema: Schema) => {\n return [emptyHeadingPlaceholderPlugin(schema.nodes.heading, ui)];\n },\n };\n};\n\nfunction headingAttributeInputRule(schema: Schema) {\n return new InputRule(/ {([^}]+)}$/, (state: EditorState, match: string[], start: number, end: number) => {\n // only fire in headings\n const heading = findParentNodeOfType(schema.nodes.heading)(state.selection);\n if (heading) {\n // try to parse the attributes\n const attrs = pandocAttrParseText(match[1]);\n if (attrs) {\n const tr = state.tr;\n tr.setNodeMarkup(heading.pos, undefined, {\n ...heading.node.attrs,\n ...attrs,\n });\n tr.deleteRange(start + 1, end);\n return tr;\n } else {\n return null;\n }\n } else {\n return null;\n }\n });\n}\n\nclass HeadingCommand extends ProsemirrorCommand {\n public readonly nodeType: NodeType;\n public readonly level: number;\n\n constructor(schema: Schema, id: EditorCommandId, level: number, omniInsert?: OmniInsert) {\n super(id, ['Mod-Alt-' + level], headingCommandFn(schema, level), omniInsert);\n this.nodeType = schema.nodes.heading;\n this.level = level;\n }\n\n public isActive(state: EditorState) {\n const predicate = (n: ProsemirrorNode) => n.type === this.nodeType && n.attrs.level === this.level;\n const node = findParentNode(predicate)(state.selection);\n return !!node;\n }\n}\n\nfunction heading1OmniInsert(ui: EditorUI) {\n return headingOmniInsert(ui, 1, ui.context.translateText('Part heading'), [\n ui.images.omni_insert?.heading1!,\n ui.images.omni_insert?.heading1_dark!,\n ]);\n}\n\nfunction heading2OmniInsert(ui: EditorUI) {\n return headingOmniInsert(ui, 2, ui.context.translateText('Section heading'), [\n ui.images.omni_insert?.heading2!,\n ui.images.omni_insert?.heading2_dark!,\n ]);\n}\nfunction heading3OmniInsert(ui: EditorUI) {\n return headingOmniInsert(ui, 3, ui.context.translateText('Sub-section heading'), [\n ui.images.omni_insert?.heading3!,\n ui.images.omni_insert?.heading3_dark!,\n ]);\n}\n\nfunction heading4OmniInsert(ui: EditorUI) {\n return headingOmniInsert(ui, 4, ui.context.translateText('Small heading'), [\n ui.images.omni_insert?.heading4!,\n ui.images.omni_insert?.heading4_dark!,\n ]);\n}\n\nfunction headingOmniInsert(ui: EditorUI, level: number, description: string, images: [string, string], group = OmniInsertGroup.Headings): OmniInsert {\n return {\n name: headingName(ui, level),\n keywords: [\"h\" + level],\n description,\n group,\n image: () => (ui.prefs.darkMode() ? images[1] : images[0]),\n };\n}\n\nfunction headingName(ui: EditorUI, level: number) {\n const kHeadingPrefix = ui.context.translateText('Heading');\n return `${kHeadingPrefix} ${level}`;\n}\n\nfunction headingCommandFn(schema: Schema, level: number) {\n return toggleBlockType(schema.nodes.heading, schema.nodes.paragraph, { level });\n}\n\n// function for getting attrs\nfunction headingAttrs(level: number, pandocAttrSupported: boolean) {\n return (dom: Node | string) => {\n const el = dom as Element;\n return {\n level,\n 'data-link': el.getAttribute('data-link'),\n ...(pandocAttrSupported ? pandocAttrParseDom(el, {}) : {}),\n };\n };\n}\n\nfunction emptyHeadingPlaceholderPlugin(nodeType: NodeType, ui: EditorUI) {\n return emptyNodePlaceholderPlugin(nodeType, node => headingName(ui, node.attrs.level));\n}\n\n// write a bookdown (PART) H1 w/o spurious \\\nfunction writeBookdownH1(output: PandocOutput, node: ProsemirrorNode) {\n // see if this is a (PART\\*). note we also match and replay any text\n // before the first ( in case the cursor sentinel ended up there\n const partMatch = node.textContent.match(/^([^()]*)\\(PART\\\\\\*\\)/);\n if (partMatch) {\n const schema = node.type.schema;\n output.writeInlines(Fragment.from(schema.text(partMatch[1] + '(PART*)')));\n output.writeInlines(node.content.cut(partMatch[0].length));\n } else {\n output.writeInlines(node.content);\n }\n}\n\nexport default extension;\n","/*\n * blockquote.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { wrappingInputRule } from 'prosemirror-inputrules';\nimport { Node as ProsemirrorNode, Schema, DOMOutputSpec } from 'prosemirror-model';\n\nimport { WrapCommand, EditorCommandId } from '../api/command';\nimport { ExtensionContext } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\nimport { EditorUI } from '../api/ui';\nimport { OmniInsertGroup } from '../api/omni_insert';\n\nconst extension = (context: ExtensionContext) => {\n const { ui } = context;\n\n return {\n nodes: [\n {\n name: 'blockquote',\n spec: {\n content: 'block+',\n group: 'block',\n defining: true,\n parseDOM: [{ tag: 'blockquote' }],\n toDOM(): DOMOutputSpec {\n return ['blockquote', { class: 'pm-blockquote pm-block-border-color' }, 0];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.BlockQuote,\n block: 'blockquote',\n },\n ],\n writer: (output: PandocOutput, node: ProsemirrorNode) => {\n output.writeToken(PandocTokenType.BlockQuote, () => {\n output.writeNodes(node);\n });\n },\n },\n },\n ],\n\n commands: (schema: Schema) => {\n return [new WrapCommand(EditorCommandId.Blockquote, [], schema.nodes.blockquote, {}, blockquoteOmniInsert(ui))];\n },\n\n inputRules: (schema: Schema) => {\n return [wrappingInputRule(/^\\s*>\\s$/, schema.nodes.blockquote)];\n },\n };\n};\n\nfunction blockquoteOmniInsert(ui: EditorUI) {\n return {\n name: ui.context.translateText('Blockquote'),\n description: ui.context.translateText('Section quoted from another source'),\n group: OmniInsertGroup.Blocks,\n priority: 8,\n image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.blockquote_dark! : ui.images.omni_insert?.blockquote!),\n };\n}\n\nexport default extension;\n","/*\n * code_block.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\nimport { newlineInCode, exitCode } from 'prosemirror-commands';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { findParentNodeOfType } from 'prosemirror-utils';\n\nimport { BlockCommand, EditorCommandId, ProsemirrorCommand, toggleBlockType } from '../api/command';\nimport { Extension, ExtensionContext } from '../api/extension';\nimport { BaseKey } from '../api/basekeys';\nimport { codeNodeSpec } from '../api/code';\nimport { PandocOutput, PandocTokenType, PandocExtensions } from '../api/pandoc';\nimport { pandocAttrSpec, pandocAttrParseDom, pandocAttrToDomAttr } from '../api/pandoc_attr';\nimport { PandocCapabilities } from '../api/pandoc_capabilities';\nimport { EditorUI } from '../api/ui';\nimport { CodeBlockProps } from '../api/ui-dialogs';\nimport { hasFencedCodeBlocks } from '../api/pandoc_format';\nimport { precedingListItemInsertPos, precedingListItemInsert } from '../api/list';\nimport { EditorOptions } from '../api/options';\nimport { OmniInsertGroup } from '../api/omni_insert';\n\nconst extension = (context: ExtensionContext): Extension => {\n const { pandocExtensions, pandocCapabilities, ui, options } = context;\n\n const hasAttr = hasFencedCodeBlocks(pandocExtensions);\n\n return {\n nodes: [\n {\n name: 'code_block',\n\n spec: {\n ...codeNodeSpec(),\n attrs: { ...(hasAttr ? pandocAttrSpec : {}) },\n parseDOM: [\n {\n tag: 'pre',\n preserveWhitespace: 'full',\n getAttrs: (node: Node | string) => {\n if (hasAttr) {\n const el = node as Element;\n return pandocAttrParseDom(el, {});\n } else {\n return {};\n }\n },\n },\n ],\n toDOM(node: ProsemirrorNode) {\n const fontClass = 'pm-fixedwidth-font';\n const attrs = hasAttr\n ? pandocAttrToDomAttr({\n ...node.attrs,\n classes: [...node.attrs.classes, fontClass],\n })\n : {\n class: fontClass,\n };\n return ['pre', attrs, ['code', 0]];\n },\n },\n\n code_view: {\n lang: (node: ProsemirrorNode) => {\n return codeBlockLang(node, options);\n },\n attrEditFn: codeBlockFormatCommandFn(pandocExtensions, ui, pandocCapabilities.highlight_languages),\n },\n\n attr_edit: codeBlockAttrEdit(pandocExtensions, pandocCapabilities, ui),\n\n pandoc: {\n readers: [\n {\n token: PandocTokenType.CodeBlock,\n code_block: true,\n },\n ],\n writer: (output: PandocOutput, node: ProsemirrorNode) => {\n output.writeToken(PandocTokenType.CodeBlock, () => {\n if (hasAttr) {\n const id = pandocExtensions.fenced_code_attributes ? node.attrs.id : '';\n const keyvalue = pandocExtensions.fenced_code_attributes ? node.attrs.keyvalue : [];\n output.writeAttr(id, node.attrs.classes, keyvalue);\n } else {\n output.writeAttr();\n }\n output.write(node.textContent);\n });\n },\n },\n },\n ],\n\n commands: (schema: Schema) => {\n const commands: ProsemirrorCommand[] = [\n new BlockCommand(EditorCommandId.CodeBlock, [], schema.nodes.code_block, schema.nodes.paragraph, {}),\n ];\n if (hasAttr) {\n commands.push(new CodeBlockFormatCommand(pandocExtensions, ui, pandocCapabilities.highlight_languages));\n }\n return commands;\n },\n\n baseKeys: () => {\n return [\n { key: BaseKey.Enter, command: newlineInCode },\n { key: BaseKey.ModEnter, command: exitCode },\n { key: BaseKey.ShiftEnter, command: exitCode },\n ];\n },\n };\n};\n\nclass CodeBlockFormatCommand extends ProsemirrorCommand {\n constructor(pandocExtensions: PandocExtensions, ui: EditorUI, languages: string[]) {\n super(\n EditorCommandId.CodeBlockFormat,\n ['Shift-Mod-\\\\'],\n codeBlockFormatCommandFn(pandocExtensions, ui, languages),\n {\n name: ui.context.translateText('Code Block...'),\n description: ui.context.translateText('Source code display'),\n group: OmniInsertGroup.Blocks,\n priority: 7,\n image: () =>\n ui.prefs.darkMode() ? ui.images.omni_insert?.code_block_dark! : ui.images.omni_insert?.code_block!,\n },\n );\n }\n}\n\nfunction codeBlockFormatCommandFn(pandocExtensions: PandocExtensions, ui: EditorUI, languages: string[]) {\n return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n // enable if we are either inside a code block or we can toggle to a code block\n const schema = state.schema;\n const codeBlock = findParentNodeOfType(schema.nodes.code_block)(state.selection);\n if (\n !codeBlock &&\n !toggleBlockType(schema.nodes.code_block, schema.nodes.paragraph)(state) &&\n !precedingListItemInsertPos(state.doc, state.selection)\n ) {\n return false;\n }\n\n async function asyncEditCodeBlock() {\n if (dispatch) {\n // get props to edit\n const codeBlockProps = codeBlock\n ? { ...(codeBlock.node.attrs as CodeBlockProps), lang: '' }\n : defaultCodeBlockProps();\n\n // set lang if the first class is from available languages\n // (alternatively if we don't support attributes then it's\n // automatically considered the language)\n if (codeBlockProps.classes && codeBlockProps.classes.length) {\n const potentialLang = codeBlockProps.classes[0];\n if (!pandocExtensions.fenced_code_attributes || languages.includes(potentialLang)) {\n codeBlockProps.lang = potentialLang;\n codeBlockProps.classes = codeBlockProps.classes.slice(1);\n }\n }\n\n // show dialog\n const result = await ui.dialogs.editCodeBlock(\n codeBlockProps,\n pandocExtensions.fenced_code_attributes,\n languages,\n );\n if (result) {\n // extract lang\n const applyProps = propsWithLangClass(result);\n\n // edit or toggle as appropriate\n if (codeBlock) {\n const tr = state.tr;\n tr.setNodeMarkup(codeBlock.pos, schema.nodes.code_block, applyProps);\n dispatch(tr);\n } else {\n const prevListItemPos = precedingListItemInsertPos(state.doc, state.selection);\n if (prevListItemPos) {\n const tr = state.tr;\n const block = schema.nodes.code_block.create(applyProps);\n precedingListItemInsert(tr, prevListItemPos, block);\n dispatch(tr);\n } else {\n toggleBlockType(schema.nodes.code_block, schema.nodes.paragraph, applyProps)(state, dispatch, view);\n }\n }\n }\n }\n\n if (view) {\n view.focus();\n }\n }\n\n asyncEditCodeBlock();\n\n return true;\n };\n}\n\nfunction defaultCodeBlockProps() {\n return { id: '', classes: [], keyvalue: [], lang: '' };\n}\n\nfunction propsWithLangClass(props: CodeBlockProps) {\n const newProps = { ...props };\n if (newProps.classes && newProps.lang) {\n newProps.classes.unshift(props.lang);\n }\n return newProps;\n}\n\n// determine the code block language. if it's an Rmd example (i.e. with `r ''`) and\n// we have rmdExampleHighlight enabled then use the Rmd chunk language for highlighting\nfunction codeBlockLang(node: ProsemirrorNode, options: EditorOptions) {\n if (node.attrs.classes && node.attrs.classes.length) {\n const lang = node.attrs.classes[0];\n if (options.rmdExampleHighlight && lang === 'md') {\n const match = node.textContent.match(/^```+\\s*\\{([a-zA-Z0-9_]+)( *[ ,].*)?\\}`r ''`/);\n if (match) {\n return match[1];\n }\n }\n return lang;\n } else {\n return null;\n }\n}\n\nfunction codeBlockAttrEdit(pandocExtensions: PandocExtensions, pandocCapabilities: PandocCapabilities, ui: EditorUI) {\n return () => {\n if (hasFencedCodeBlocks(pandocExtensions)) {\n return {\n type: (schema: Schema) => schema.nodes.code_block,\n tags: (node: ProsemirrorNode) => {\n const tags: string[] = [];\n if (node.attrs.id) {\n tags.push(`#${node.attrs.id}`);\n }\n if (node.attrs.classes) {\n for (let i=1; i<node.attrs.classes.length; i++) {\n tags.push(`.${node.attrs.classes[i]}`);\n } \n if (node.attrs.classes.length > 0) {\n const lang = node.attrs.classes[0];\n if (pandocCapabilities.highlight_languages.includes(lang) || lang === 'tex') {\n tags.push(lang);\n } else {\n tags.push(`.${lang}`);\n }\n }\n }\n if (node.attrs.keyvalue && node.attrs.keyvalue.length) {\n tags.push(`${node.attrs.keyvalue.map(\n (kv: [string,string]) => kv[0] + '=\"' + (kv[1] || '1') + '\"').join(' ')}\n `);\n }\n return tags;\n },\n offset: {\n top: 3,\n right: 0,\n },\n editFn: () => codeBlockFormatCommandFn(pandocExtensions, ui, pandocCapabilities.highlight_languages),\n };\n } else {\n return null;\n }\n };\n}\n\nexport default extension;\n","/*\n * list.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\nimport { liftListItem, sinkListItem, splitListItem } from 'prosemirror-schema-list';\nimport { Plugin, PluginKey, EditorState } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { findParentNodeOfType } from 'prosemirror-utils';\n\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { BaseKey } from '../../api/basekeys';\nimport { EditorUI, kListSpacingTight } from '../../api/ui';\nimport { ListCapabilities } from '../../api/list';\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { PandocTokenType } from '../../api/pandoc';\nimport { OmniInsertGroup } from '../../api/omni_insert';\nimport { conditionalWrappingInputRule } from '../../api/input_rule';\nimport { kPresentationDocType } from '../../api/format';\n\nimport { ListCommand, TightListCommand, EditListPropertiesCommand, editListPropertiesCommandFn } from './list-commands';\n\nimport {\n CheckedListItemNodeView,\n checkedListItemInputRule,\n checkedListInputRule,\n CheckedListItemCommand,\n CheckedListItemToggleCommand,\n} from './list-checked';\n\nimport { writePandocBulletList, writePandocOrderedList, readPandocList } from './list-pandoc';\n\nimport './list-styles.css';\n\nexport enum ListNumberStyle {\n DefaultStyle = 'DefaultStyle',\n Decimal = 'Decimal',\n LowerRoman = 'LowerRoman',\n UpperRoman = 'UpperRoman',\n LowerAlpha = 'LowerAlpha',\n UpperAlpha = 'UpperAlpha',\n Example = 'Example',\n}\n\n// NOTE: HTML output doesn't currently respect this and it's difficult to\n// do with CSS (especially for nested lists). So we allow the user to edit\n// it but it isn't reflected in the editor.\nexport enum ListNumberDelim {\n DefaultDelim = 'DefaultDelim',\n Period = 'Period',\n OneParen = 'OneParen',\n TwoParens = 'TwoParens',\n}\n\nconst plugin = new PluginKey('list');\n\nconst extension = (context: ExtensionContext): Extension => {\n const { pandocExtensions, ui, format } = context;\n\n // determine list capabilities based on active format options\n const capabilities: ListCapabilities = {\n tasks: pandocExtensions.task_lists,\n fancy: pandocExtensions.fancy_lists,\n /*\n Always disable example lists b/c they don't round trip through the AST:\n - (@good) referenced elsewhere via (@good) just becomes a generic example (@) with \n a literal numeric reference.\n - The writer doesn't preserve the (@) or the (@good) when writing\n */\n // example: pandocExtensions.fancy_lists && pandocExtensions.example_lists,\n example: false,\n order: pandocExtensions.startnum,\n incremental: format.docTypes.includes(kPresentationDocType)\n };\n\n return {\n nodes: [\n {\n name: 'list_item',\n spec: {\n content: 'list_item_block block*',\n attrs: {\n checked: { default: null },\n },\n defining: true,\n parseDOM: [\n {\n tag: 'li',\n getAttrs: (dom: Node | string) => {\n const el = dom as Element;\n const attrs: any = {};\n if (capabilities.tasks && el.hasAttribute('data-checked')) {\n attrs.checked = el.getAttribute('data-checked') === 'true';\n }\n return attrs;\n },\n },\n ],\n toDOM(node) {\n const attrs: any = {\n class: 'pm-list-item',\n };\n if (capabilities.tasks && node.attrs.checked !== null) {\n attrs['data-checked'] = node.attrs.checked ? 'true' : 'false';\n }\n return ['li', attrs, 0];\n },\n },\n pandoc: {},\n },\n {\n name: 'bullet_list',\n spec: {\n content: 'list_item+',\n group: 'block',\n attrs: {\n tight: { default: false },\n },\n parseDOM: [\n {\n tag: 'ul',\n getAttrs: (dom: Node | string) => {\n const el = dom as Element;\n const attrs: any = {};\n if (el.hasAttribute('data-tight')) {\n attrs.tight = true;\n }\n return attrs;\n },\n },\n ],\n toDOM(node) {\n const attrs: { [key: string]: string } = {};\n attrs.class = 'pm-list pm-bullet-list';\n if (node.attrs.tight) {\n attrs['data-tight'] = 'true';\n }\n return ['ul', attrs, 0];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.BulletList,\n handler: (schema: Schema) => readPandocList(schema.nodes.bullet_list, capabilities),\n },\n ],\n writer: writePandocBulletList(capabilities),\n },\n\n attr_edit: listAttrEdit('bullet_list', capabilities, ui),\n },\n {\n name: 'ordered_list',\n spec: {\n content: 'list_item+',\n group: 'block',\n attrs: {\n tight: { default: false },\n order: { default: 1 },\n number_style: { default: ListNumberStyle.DefaultStyle },\n number_delim: { default: ListNumberDelim.DefaultDelim },\n },\n parseDOM: [\n {\n tag: 'ol',\n getAttrs(dom: Node | string) {\n const el = dom as Element;\n\n const attrs: any = {};\n attrs.tight = el.hasAttribute('data-tight');\n\n if (capabilities.order) {\n const order: string | null = el.getAttribute('start');\n if (!order) {\n attrs.order = 1;\n } else {\n attrs.order = parseInt(order, 10) || 1;\n }\n }\n\n if (capabilities.fancy) {\n if (capabilities.example && el.getAttribute('data-example')) {\n attrs.number_style = ListNumberStyle.Example;\n } else {\n attrs.number_style = typeToNumberStyle(el.getAttribute('type'));\n }\n const numberDelim = el.getAttribute('data-number-delim');\n if (numberDelim) {\n attrs.number_delim = numberDelim;\n }\n }\n\n return attrs;\n },\n },\n ],\n toDOM(node) {\n const attrs: { [key: string]: string } = {};\n attrs.class = 'pm-list pm-ordered-list';\n if (node.attrs.tight) {\n attrs['data-tight'] = 'true';\n }\n if (capabilities.order && node.attrs.order !== 1) {\n attrs.start = node.attrs.order;\n }\n if (capabilities.fancy) {\n const type = numberStyleToType(node.attrs.number_style);\n if (type) {\n attrs.type = type;\n }\n if (capabilities.example) {\n if (node.attrs.number_style === ListNumberStyle.Example) {\n attrs['data-example'] = '1';\n }\n }\n attrs['data-number-delim'] = node.attrs.number_delim;\n }\n return ['ol', attrs, 0];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.OrderedList,\n handler: (schema: Schema) => readPandocList(schema.nodes.ordered_list, capabilities),\n },\n ],\n writer: writePandocOrderedList(capabilities),\n },\n\n attr_edit: listAttrEdit('ordered_list', capabilities, ui),\n },\n ],\n\n plugins: (schema: Schema) => {\n const plugins: Plugin[] = [];\n if (capabilities.tasks) {\n plugins.push(\n new Plugin({\n key: plugin,\n props: {\n nodeViews: {\n list_item(node: ProsemirrorNode, view: EditorView, getPos: boolean | (() => number)) {\n return new CheckedListItemNodeView(node, view, getPos as () => number);\n },\n },\n },\n }),\n );\n }\n return plugins;\n },\n\n commands: (schema: Schema) => {\n const commands = [\n new ListCommand(\n EditorCommandId.BulletList,\n [],\n schema.nodes.bullet_list,\n schema.nodes.list_item,\n bulletListOmniInsert(ui),\n ui.prefs,\n ),\n new ListCommand(\n EditorCommandId.OrderedList,\n [],\n schema.nodes.ordered_list,\n schema.nodes.list_item,\n orderedListOmniInsert(ui),\n ui.prefs,\n ),\n new ProsemirrorCommand(EditorCommandId.ListItemSink, ['Tab'], sinkListItem(schema.nodes.list_item)),\n new ProsemirrorCommand(EditorCommandId.ListItemLift, ['Shift-Tab'], liftListItem(schema.nodes.list_item)),\n new ProsemirrorCommand(EditorCommandId.ListItemSplit, ['Enter'], splitListItem(schema.nodes.list_item)),\n new TightListCommand(),\n ];\n if (capabilities.fancy) {\n commands.push(new EditListPropertiesCommand(ui, capabilities));\n }\n if (capabilities.tasks) {\n commands.push(\n new CheckedListItemCommand(schema.nodes.list_item),\n new CheckedListItemToggleCommand(schema.nodes.list_item),\n );\n }\n return commands;\n },\n\n baseKeys: (schema: Schema) => {\n return [\n { key: BaseKey.Enter, command: splitListItem(schema.nodes.list_item) },\n { key: BaseKey.Tab, command: sinkListItem(schema.nodes.list_item) },\n { key: BaseKey.ShiftTab, command: liftListItem(schema.nodes.list_item) },\n ];\n },\n\n inputRules: (schema: Schema) => {\n // reflect tight pref\n const tightFn = () => {\n return {\n tight: ui.prefs.listSpacing() === kListSpacingTight,\n };\n };\n\n const isNotInHeading = (state: EditorState) => {\n return !findParentNodeOfType(schema.nodes.heading)(state.selection);\n };\n\n const rules = [\n conditionalWrappingInputRule(/^\\s*([-+*])\\s$/, schema.nodes.bullet_list, isNotInHeading, tightFn),\n conditionalWrappingInputRule(\n /^(\\d+)\\.\\s$/,\n schema.nodes.ordered_list,\n isNotInHeading,\n match => ({ order: +match[1], tight: tightFn() }),\n (match, node) => node.childCount + node.attrs.order === +match[1],\n ),\n ];\n if (capabilities.tasks) {\n rules.push(checkedListItemInputRule(), checkedListInputRule(schema));\n }\n return rules;\n },\n };\n};\n\nfunction listAttrEdit(type: string, capabilities: ListCapabilities, ui: EditorUI) {\n return () => {\n return {\n type: (schema: Schema) => schema.nodes[type],\n editFn: () => editListPropertiesCommandFn(ui, capabilities),\n offset: {\n top: 5,\n right: 5,\n },\n preferHidden: true\n };\n };\n}\n\nfunction numberStyleToType(style: ListNumberStyle): string | null {\n switch (style) {\n case ListNumberStyle.DefaultStyle:\n case ListNumberStyle.Decimal:\n case ListNumberStyle.Example:\n return 'l';\n case ListNumberStyle.LowerAlpha:\n return 'a';\n case ListNumberStyle.UpperAlpha:\n return 'A';\n case ListNumberStyle.LowerRoman:\n return 'i';\n case ListNumberStyle.UpperRoman:\n return 'I';\n default:\n return null;\n }\n}\n\nfunction typeToNumberStyle(type: string | null): ListNumberStyle {\n switch (type) {\n case 'l':\n return ListNumberStyle.Decimal;\n case 'a':\n return ListNumberStyle.LowerAlpha;\n case 'A':\n return ListNumberStyle.UpperAlpha;\n case 'i':\n return ListNumberStyle.LowerRoman;\n case 'I':\n return ListNumberStyle.UpperRoman;\n default:\n return ListNumberStyle.Decimal;\n }\n}\n\nfunction bulletListOmniInsert(ui: EditorUI) {\n return {\n name: ui.context.translateText('Bullet List'),\n description: ui.context.translateText('List using bullets for items'),\n group: OmniInsertGroup.Common,\n priority: 4,\n image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.bullet_list_dark! : ui.images.omni_insert?.bullet_list!),\n };\n}\n\nfunction orderedListOmniInsert(ui: EditorUI) {\n return {\n name: ui.context.translateText('Numbered List'),\n description: ui.context.translateText('List using numbers for items'),\n group: OmniInsertGroup.Common,\n priority: 3,\n image: () =>\n ui.prefs.darkMode() ? ui.images.omni_insert?.ordered_list_dark! : ui.images.omni_insert?.ordered_list!,\n };\n}\n\nexport default extension;\n","/*\n * list-commands.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { NodeType, Node as ProsemirrorNode, NodeRange, Schema } from 'prosemirror-model';\nimport { EditorState, Transaction, Selection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { autoJoin } from 'prosemirror-commands';\nimport { NodeWithPos, findParentNode } from 'prosemirror-utils';\n\nimport { NodeCommand, toggleList, ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { EditorUI, EditorUIPrefs } from '../../api/ui';\nimport { ListProps } from '../../api/ui-dialogs';\nimport { ListType, ListCapabilities, isList } from '../../api/list';\nimport { OmniInsert } from '../../api/omni_insert';\nimport { findWrapping } from 'prosemirror-transform';\nimport { trRemoveDiv } from '../div/div';\nimport { pandocAttrHasClass, pandocAttrRemoveClass, pandocAttrEnsureClass } from '../../api/pandoc_attr';\n\nexport class ListCommand extends NodeCommand {\n constructor(\n id: EditorCommandId,\n keymap: string[],\n listType: NodeType,\n listItemType: NodeType,\n omniInsert: OmniInsert,\n prefs: EditorUIPrefs,\n ) {\n super(id, keymap, listType, {}, autoJoin(toggleList(listType, listItemType, prefs), [listType.name]), omniInsert);\n }\n}\n\nexport class TightListCommand extends ProsemirrorCommand {\n constructor() {\n super(\n EditorCommandId.TightList,\n ['Mod-Alt-9'],\n (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n const parentList = findParentNode(isList)(state.selection);\n if (!parentList) {\n return false;\n }\n\n if (dispatch) {\n const tr = state.tr;\n const node = parentList.node;\n tr.setNodeMarkup(parentList.pos, node.type, {\n ...node.attrs,\n tight: !node.attrs.tight,\n });\n dispatch(tr);\n }\n\n return true;\n },\n );\n }\n\n public isActive(state: EditorState): boolean {\n if (this.isEnabled(state)) {\n const itemNode = findParentNode(isList)(state.selection) as NodeWithPos;\n return itemNode.node.attrs.tight;\n } else {\n return false;\n }\n }\n}\n\nexport function editListPropertiesCommandFn(ui: EditorUI, capabilities: ListCapabilities) {\n return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n // see if a parent node is a list\n let node: ProsemirrorNode | null = null;\n let pos: number = 0;\n const nodeWithPos = findParentNode(isList)(state.selection);\n if (nodeWithPos) {\n node = nodeWithPos.node;\n pos = nodeWithPos.pos;\n }\n\n // return false (disabled) for no targets\n if (!node) {\n return false;\n }\n\n // execute command when requested\n async function asyncEditList() {\n if (dispatch) {\n await editList(node as ProsemirrorNode, pos, state, dispatch, ui, capabilities);\n if (view) {\n view.focus();\n }\n }\n }\n asyncEditList();\n\n return true;\n };\n}\n\nexport class EditListPropertiesCommand extends ProsemirrorCommand {\n constructor(ui: EditorUI, capabilities: ListCapabilities) {\n super(EditorCommandId.EditListProperties, [], editListPropertiesCommandFn(ui, capabilities));\n }\n}\n\nconst kListIncrementalDefault = \"default\";\nconst kListIncremental = \"incremental\";\nconst kListNonIncremental = \"nonincremental\";\n\nasync function editList(\n node: ProsemirrorNode,\n pos: number,\n state: EditorState,\n dispatch: (tr: Transaction<any>) => void,\n ui: EditorUI,\n capabilities: ListCapabilities,\n): Promise<void> {\n // get list properties\n const schema = node.type.schema;\n const attrs = node.attrs;\n const props = {\n ...attrs,\n type: node.type === schema.nodes.ordered_list ? ListType.Ordered : ListType.Bullet,\n } as ListProps;\n\n // if we support incremental lists then determine that value\n const incrementalDiv = wrappingIncrementalDiv(state.selection, schema);\n if (incrementalDiv && capabilities.incremental) {\n props.incremental = pandocAttrHasClass(incrementalDiv.node.attrs, clz => clz === kListIncremental) \n ? kListIncremental \n : kListNonIncremental;\n } else {\n props.incremental = kListIncrementalDefault;\n }\n\n // edit list\n const result = await ui.dialogs.editList(props, capabilities);\n\n // apply result\n if (result) {\n const tr = state.tr;\n const listType = result.type === ListType.Ordered ? schema.nodes.ordered_list : schema.nodes.bullet_list;\n tr.setNodeMarkup(pos, listType, {\n ...attrs,\n ...result,\n });\n\n \n if (capabilities.incremental) {\n\n // remove any existing wrapping\n if (result.incremental === kListIncrementalDefault) {\n if (incrementalDiv) {\n trRemoveDiv(tr, incrementalDiv);\n }\n // edit existing wrapping\n } else if (incrementalDiv) {\n const divAttrs = { ...incrementalDiv.node.attrs };\n pandocAttrRemoveClass(divAttrs, isIncrementalClass);\n pandocAttrEnsureClass(divAttrs, result.incremental);\n tr.setNodeMarkup(incrementalDiv.pos, schema.nodes.div, divAttrs);\n // create new wrapping\n } else {\n const $pos = tr.doc.resolve(pos);\n const $endPos = tr.doc.resolve(pos + node.nodeSize);\n const range = $pos.blockRange($endPos); \n if (range) {\n const wrapping = findWrapping(range, schema.nodes.div, { classes: [result.incremental]});\n if (wrapping) {\n tr.wrap(range, wrapping);\n }\n }\n }\n }\n \n dispatch(tr);\n }\n}\n\nfunction wrappingIncrementalDiv(selection: Selection, schema: Schema) {\n return findParentNode(nd => {\n return nd.type === schema.nodes.div && \n pandocAttrHasClass(nd.attrs, isIncrementalClass);\n })(selection);\n\n}\n\nfunction isIncrementalClass(clz: string) {\n return [kListIncremental, kListNonIncremental].includes(clz);\n}","/*\n * div.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema, DOMOutputSpec, ResolvedPos } from 'prosemirror-model';\nimport { EditorState, Transaction, Plugin, PluginKey, TextSelection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { findParentNodeOfType, ContentNodeWithPos } from 'prosemirror-utils';\nimport { wrapIn } from 'prosemirror-commands';\nimport { liftTarget } from 'prosemirror-transform';\n\nimport { ExtensionContext, Extension } from '../../api/extension';\nimport {\n pandocAttrSpec,\n pandocAttrToDomAttr,\n pandocAttrParseDom,\n pandocAttrReadAST,\n pandocAttrFrom,\n pandocAttrAvailable,\n PandocAttr,\n pandocAttrHasClass,\n} from '../../api/pandoc_attr';\nimport { PandocOutput, PandocTokenType, PandocToken } from '../../api/pandoc';\nimport { ProsemirrorCommand, EditorCommandId, toggleWrap } from '../../api/command';\nimport { EditorUI } from '../../api/ui';\nimport { OmniInsertGroup, OmniInsert } from '../../api/omni_insert';\nimport { markIsActive } from '../../api/mark';\nimport { BaseKey } from '../../api/basekeys';\nimport { attrInputToProps } from '../../api/ui-dialogs';\nimport { kQuartoDocType } from '../../api/format';\n\nimport { insertCalloutCommand, editCalloutDiv } from './div-callout';\nimport { insertTabsetCommand } from './div-tabset';\n\nimport './div-styles.css';\n\nconst DIV_ATTR = 0;\nconst DIV_CHILDREN = 1;\n\nconst extension = (context: ExtensionContext) : Extension | null => {\n const { pandocExtensions, format, ui } = context;\n\n if (!pandocExtensions.fenced_divs && !pandocExtensions.native_divs) {\n return null;\n }\n\n return {\n nodes: [\n {\n name: 'div',\n spec: {\n attrs: {\n ...pandocAttrSpec,\n },\n defining: true,\n content: 'block+',\n group: 'block list_item_block',\n parseDOM: [\n {\n tag: 'div[data-div=\"1\"]',\n getAttrs(dom: Node | string) {\n const attrs: {} = { 'data-div': 1 };\n return {\n ...attrs,\n ...pandocAttrParseDom(dom as Element, attrs),\n };\n },\n },\n ],\n toDOM(node: ProsemirrorNode): DOMOutputSpec {\n const attr = {\n 'data-div': '1',\n ...pandocAttrToDomAttr({\n ...node.attrs,\n classes: [...node.attrs.classes, 'pm-div', 'pm-div-background-color'],\n }),\n };\n return ['div', attr, 0];\n },\n },\n\n attr_edit: () => ({\n type: (schema: Schema) => schema.nodes.div,\n editFn: () => divCommand(ui, true),\n offset: {\n top: 3,\n right: 0\n }\n }),\n\n pandoc: {\n readers: [\n {\n token: PandocTokenType.Div,\n block: 'div',\n getAttrs: (tok: PandocToken) => ({\n ...pandocAttrReadAST(tok, DIV_ATTR),\n }),\n getChildren: (tok: PandocToken) => tok.c[DIV_CHILDREN],\n },\n ],\n writer: (output: PandocOutput, node: ProsemirrorNode) => {\n output.writeToken(PandocTokenType.Div, () => {\n output.writeAttr(node.attrs.id, node.attrs.classes, node.attrs.keyvalue);\n output.writeArray(() => {\n output.writeNodes(node);\n });\n });\n },\n },\n },\n ],\n\n baseKeys: () => {\n return [\n { key: BaseKey.Enter, command: divInputRuleEnter() },\n ];\n },\n\n commands: () => {\n const cmds = [\n // turn current block into a div\n new DivCommand(EditorCommandId.Div, ui, true),\n\n // insert a div\n new DivCommand(EditorCommandId.InsertDiv, ui, false, {\n name: ui.context.translateText('Div...'),\n description: ui.context.translateText('Block containing other content'),\n group: OmniInsertGroup.Common,\n priority: 6,\n image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.div_dark! : ui.images.omni_insert?.div!),\n }),\n ];\n\n // quarto div commands\n if (format.docTypes.includes(kQuartoDocType)) {\n cmds.push(\n insertCalloutCommand(ui),\n insertTabsetCommand(ui)\n );\n }\n\n return cmds;\n },\n\n plugins: (schema: Schema) => {\n return [\n new Plugin({\n key: new PluginKey(\"div-selection\"),\n appendTransaction: (_transactions: Transaction[], _oldState: EditorState, newState: EditorState) => {\n if (newState.selection.empty) {\n return;\n }\n const divNode = findParentNodeOfType(schema.nodes.div)(newState.selection);\n if (divNode && \n (newState.selection.anchor === divNode.start + 1) &&\n newState.selection.head === divNode.pos + divNode.node.nodeSize - 2) {\n const tr = newState.tr;\n const sel = TextSelection.create(tr.doc, divNode.start, divNode.start + divNode.node.nodeSize - 1);\n tr.setSelection(sel);\n return tr;\n }\n }\n }),\n ];\n },\n };\n};\n\nexport function removeDiv(state: EditorState, dispatch: (tr: Transaction) => void, div: ContentNodeWithPos) {\n const tr = state.tr;\n trRemoveDiv(tr, div);\n dispatch(tr);\n}\n\nexport function trRemoveDiv(tr: Transaction, div: ContentNodeWithPos) {\n const fromPos = tr.doc.resolve(div.pos + 1);\n const toPos = tr.doc.resolve(div.pos + div.node.nodeSize - 1);\n const nodeRange = fromPos.blockRange(toPos);\n if (nodeRange) {\n const targetLiftDepth = liftTarget(nodeRange);\n if (targetLiftDepth || targetLiftDepth === 0) {\n tr.lift(nodeRange, targetLiftDepth);\n }\n }\n}\n\nfunction divCommand(ui: EditorUI, allowEdit: boolean) {\n return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n // two different modes:\n // - editing attributes of an existing div\n // - wrapping (a la blockquote)\n const schema = state.schema;\n const div = allowEdit ? findParentNodeOfType(schema.nodes.div)(state.selection) : undefined;\n if (!div && !toggleWrap(schema.nodes.div)(state)) {\n return false;\n }\n\n async function asyncEditDiv() {\n if (dispatch) {\n // selecting nothing or entire div means edit, selecting text outside of a\n // div or a subset of an existing div means create new one\n const editMode = div && (state.selection.empty || isFullDivSelection(div, state));\n if (editMode) {\n const attr = pandocAttrFrom(div!.node.attrs);\n if (pandocAttrHasClass(attr, (clz) => clz.startsWith(\"callout-\"))) {\n await editCalloutDiv(ui, state, dispatch, div!);\n } else {\n await editDiv(ui, state, dispatch, div!);\n }\n } else {\n await createDiv(ui, state, dispatch);\n }\n if (view) {\n view.focus();\n }\n }\n }\n asyncEditDiv();\n\n return true;\n };\n}\n\nclass DivCommand extends ProsemirrorCommand {\n constructor(id: EditorCommandId, ui: EditorUI, allowEdit: boolean, omniInsert?: OmniInsert) {\n super(id, [], divCommand(ui, allowEdit), omniInsert);\n }\n}\n\nasync function createDiv(ui: EditorUI, state: EditorState, dispatch: (tr: Transaction) => void) {\n const result = await ui.dialogs.editDiv({}, false);\n if (result) {\n wrapIn(state.schema.nodes.div)(state, (tr: Transaction) => {\n const div = findParentNodeOfType(state.schema.nodes.div)(tr.selection)!;\n tr.setNodeMarkup(div.pos, div.node.type, result.attr);\n dispatch(tr);\n });\n }\n}\n\nasync function editDiv(ui: EditorUI, state: EditorState, dispatch: (tr: Transaction) => void, div: ContentNodeWithPos) {\n const attr = pandocAttrFrom(div.node.attrs);\n const result = await ui.dialogs.editDiv(attr, pandocAttrAvailable(attr));\n if (result) {\n if (result.action === 'edit') {\n const tr = state.tr;\n tr.setNodeMarkup(div.pos, div.node.type, result.attr);\n dispatch(tr);\n } else if (result.action === 'remove') {\n removeDiv(state, dispatch, div);\n }\n }\n}\n\n\nfunction isFullDivSelection(div: ContentNodeWithPos, state: EditorState) {\n const divStart = div.pos;\n const divEnd = div.pos + div.node.nodeSize;\n return state.selection.from - 2 === divStart && state.selection.to + 2 === divEnd;\n}\n\nfunction divInputRuleEnter() {\n return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n // see if the parent consist of a pending code block input rule\n const schema = state.schema;\n\n // selection must be empty\n if (!state.selection.empty) {\n return false;\n }\n\n // full text of parent must meet the pattern\n // eslint-disable-next-line no-useless-escape\n const match = state.selection.$head.parent.textContent.match(/^:{3,}(\\s+({.*?}|\\S+)?[\\s:]*)?$/);\n if (!match) {\n return false;\n }\n\n // no inline code marks\n if (markIsActive(state, schema.marks.code)) {\n return false;\n }\n\n // must be able to perform the replacement\n if (!canApplyDivInputRule(state)) {\n return false;\n }\n\n // execute\n if (dispatch) {\n // if it's just followed by whitespace then don't do it\n if (match[1] && match[1].trim().length === 0) {\n return false;\n }\n\n // parse attributes\n const attrs: PandocAttr = pandocAttrFrom({});\n const attribMatch = match[2];\n if (attribMatch) {\n const bracesMatch = attribMatch.match(/^{(.*?)}$/);\n if (bracesMatch) {\n const pandocAttrsText = bracesMatch[1];\n const pandocAttrsMatch = pandocAttrsText.match(/^\\s*(#\\S+)?\\s*((?:\\.\\S+\\s*)*)?(.*)?$/);\n if (pandocAttrsMatch) {\n const attrProps = attrInputToProps({ id: pandocAttrsMatch[1], classes: pandocAttrsMatch[2] });\n attrs.id = attrProps.id || '';\n attrs.classes = attrProps.classes || [];\n }\n } else {\n attrs.classes = [attribMatch];\n }\n }\n\n wrapIn(state.schema.nodes.div)(state, (tr: Transaction) => {\n const div = findParentNodeOfType(state.schema.nodes.div)(tr.selection)!;\n tr.setNodeMarkup(div.pos, div.node.type, attrs);\n const $head = tr.selection.$head;\n const start = $head.start();\n const end = start + $head.parent.textContent.length;\n tr.deleteRange(start, end);\n dispatch(tr);\n });\n }\n\n return true;\n };\n}\n\nfunction canReplaceNodeWithDiv(schema: Schema, $pos: ResolvedPos) {\n return $pos.node(-1).canReplaceWith($pos.index(-1), $pos.indexAfter(-1), schema.nodes.div);\n}\n\nfunction canApplyDivInputRule(state: EditorState) {\n const schema = state.schema;\n const { $head } = state.selection;\n return canReplaceNodeWithDiv(schema, $head);\n}\n\nexport default extension;\n","/*\n * div-callout.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from \"prosemirror-state\";\nimport { EditorView } from \"prosemirror-view\";\nimport { setTextSelection, ContentNodeWithPos, findParentNodeOfType } from \"prosemirror-utils\";\nimport { wrapIn } from \"prosemirror-commands\";\n\n\nimport { EditorCommandId, ProsemirrorCommand, toggleWrap } from \"../../api/command\";\nimport { EditorUI } from \"../../api/ui\";\nimport { OmniInsertGroup } from \"../../api/omni_insert\";\nimport { pandocAttrEnsureClass, pandocAttrSetKeyvalue, pandocAttrGetKeyvalue, \n pandocAttrRemoveKeyvalue, pandocAttrRemoveClass, pandocAttrFrom } from \"../../api/pandoc_attr\";\nimport { CalloutProps } from \"../../api/ui-dialogs\";\nimport { removeDiv } from \"./div\";\n\nexport function insertCalloutCommand(ui: EditorUI) {\n return new ProsemirrorCommand(EditorCommandId.Callout, [], insertCalloutCommandFn(ui), {\n name: ui.context.translateText('Callout'),\n description: ui.context.translateText('Content framed for special emphasis'),\n group: OmniInsertGroup.Content,\n priority: 2,\n image: () => ui.images.omni_insert?.generic!,\n });\n}\n\nexport async function editCalloutDiv(ui: EditorUI, state: EditorState, dispatch: (tr: Transaction) => void, div: ContentNodeWithPos) {\n \n // extract callout props\n const callout = defaultCallout();\n const attr = pandocAttrFrom(div.node.attrs);\n const calloutType = pandocAttrRemoveClass(attr, clz => clz.startsWith(\"callout-\"));\n if (calloutType) {\n let calloutAppearance = pandocAttrGetKeyvalue(attr, \"appearance\") as string | undefined;\n if (calloutAppearance) {\n pandocAttrRemoveKeyvalue(attr, \"appearance\");\n } else {\n calloutAppearance = \"default\";\n }\n let calloutIcon = true;\n if (pandocAttrGetKeyvalue(attr, \"icon\") === \"false\") {\n calloutIcon = false;\n pandocAttrRemoveKeyvalue(attr, \"icon\");\n }\n let calloutCaption = \"\";\n if (div.node.firstChild?.type === state.schema.nodes.heading) {\n calloutCaption = div.node.firstChild?.textContent || \"\";\n }\n callout.type = calloutType.replace(/^callout-/, \"\");\n callout.appearance = calloutAppearance;\n callout.icon = calloutIcon;\n callout.caption = calloutCaption;\n }\n \n // edit callout\n const result = await ui.dialogs.editCallout({ attr, callout }, true);\n \n if (result) {\n const tr = state.tr;\n if (result.action === 'edit') {\n \n // start with raw attributes\n const resultAttr = result.attr;\n\n // apply callout attributes \n pandocAttrEnsureClass(resultAttr, `callout-${result.callout.type}`);\n if (result.callout.appearance !== \"default\") {\n pandocAttrSetKeyvalue(resultAttr, \"appearance\", result.callout.appearance);\n }\n if (result.callout.icon !== true) {\n pandocAttrSetKeyvalue(resultAttr, \"icon\", \"false\");\n }\n\n // set node markup\n tr.setNodeMarkup(div.pos, div.node.type, resultAttr);\n\n // set caption if it's different\n if (result.callout && (callout?.caption !== result.callout?.caption)) {\n if (div.node.firstChild?.type === state.schema.nodes.heading) {\n if (result.callout?.caption) {\n tr.replaceRangeWith(\n div.start, \n div.start + div.node.firstChild?.nodeSize!, \n state.schema.nodes.heading.create(\n { level: 2 },\n state.schema.text(result.callout?.caption)\n )\n );\n } else {\n tr.deleteRange(div.start, div.start + div.node.firstChild?.nodeSize!);\n }\n } else if (result.callout?.caption) {\n tr.insert(\n div.start, \n state.schema.nodes.heading.create(\n { level: 2 }, \n state.schema.text(result.callout?.caption)\n )\n );\n }\n }\n dispatch(tr);\n\n } else if (result.action === 'remove') {\n removeDiv(state, dispatch, div); \n }\n }\n}\n\nfunction insertCalloutCommandFn(ui: EditorUI) {\n return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n \n const schema = state.schema;\n if (!toggleWrap(schema.nodes.div)(state)) {\n return false;\n }\n\n async function asyncInsertCallout() {\n if (dispatch) {\n await createCalloutDiv(ui, state, dispatch);\n if (view) {\n view.focus();\n }\n }\n }\n asyncInsertCallout();\n\n return true;\n };\n}\n\nasync function createCalloutDiv(ui: EditorUI, state: EditorState, dispatch: (tr: Transaction) => void) {\n const props = {\n attr: {},\n callout: defaultCallout()\n };\n const result = await ui.dialogs.editCallout(props, false);\n if (result) {\n wrapIn(state.schema.nodes.div)(state, (tr: Transaction) => {\n // set div props from callout\n const attr = result.attr as any;\n pandocAttrEnsureClass(attr, `callout-${result.callout.type}`);\n attr.keyvalue = attr.keyvalue || [];\n if (result.callout?.appearance !== \"default\") {\n attr.keyvalue.push([\"appearance\", result.callout.appearance]);\n }\n if (result.callout?.icon === false) {\n attr.keyvalue.push([\"icon\", \"false\"]);\n }\n const div = findParentNodeOfType(state.schema.nodes.div)(tr.selection)!;\n tr.setNodeMarkup(div.pos, div.node.type, attr);\n\n // insert caption if one is specified\n if (result.callout?.caption) {\n const calloutContent = [\n state.schema.nodes.heading.create(\n { level: 2 },\n state.schema.text(result.callout?.caption)\n ),\n state.schema.nodes.paragraph.create()\n ];\n tr.replaceWith(div.start, div.start + 1, calloutContent);\n setTextSelection(div.start + calloutContent[0].nodeSize)(tr);\n }\n dispatch(tr);\n });\n }\n}\n\nfunction defaultCallout() : CalloutProps {\n return {\n type: \"note\",\n appearance: \"default\",\n icon: true,\n caption: \"\"\n };\n}\n\n","/*\n * div-tabset.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from \"prosemirror-state\";\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { wrapIn } from \"prosemirror-commands\";\nimport { findParentNodeOfType, setTextSelection } from \"prosemirror-utils\";\nimport { EditorView } from \"prosemirror-view\";\n\nimport { EditorCommandId, ProsemirrorCommand, toggleWrap } from \"../../api/command\";\nimport { EditorUI } from \"../../api/ui\";\nimport { OmniInsertGroup } from \"../../api/omni_insert\";\nimport { pandocAttrEnsureClass } from \"../../api/pandoc_attr\";\n\n\nexport function insertTabsetCommand(ui: EditorUI) {\n return new ProsemirrorCommand(EditorCommandId.Tabset, [], insertTabsetCommandFn(ui), {\n name: ui.context.translateText('Tabset'),\n description: ui.context.translateText('Content divided into tabs'),\n group: OmniInsertGroup.Content,\n priority: 2,\n image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.tabset_dark! : ui.images.omni_insert?.tabset!),\n });\n}\n\nfunction insertTabsetCommandFn(ui: EditorUI) {\n return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n \n const schema = state.schema;\n if (!toggleWrap(schema.nodes.div)(state)) {\n return false;\n }\n\n async function asyncInsertTabset() {\n if (dispatch) {\n const result = await ui.dialogs.insertTabset();\n if (result) {\n wrapIn(state.schema.nodes.div)(state, (tr: Transaction) => {\n // locate inserted div\n const div = findParentNodeOfType(state.schema.nodes.div)(tr.selection)!;\n\n // ensure that .panel-tabset is the first class then set attributes\n pandocAttrEnsureClass(result.attr, \"panel-tabset\");\n tr.setNodeMarkup(div.pos, div.node.type, result.attr);\n \n // insert tabset\n const tabset: ProsemirrorNode[] = result.tabs.flatMap(tab => {\n return [\n schema.nodes.heading.create(\n { level: 2 },\n schema.text(tab)\n ),\n schema.nodes.paragraph.create()\n ];\n });\n tr.replaceWith(div.start, div.start + 1, tabset);\n\n // set selection\n setTextSelection(div.start + tabset[0].nodeSize)(tr);\n\n // dispatch\n dispatch(tr);\n });\n }\n if (view) {\n view.focus();\n }\n }\n }\n asyncInsertTabset();\n\n return true;\n };\n}\n\n\n\n","/*\n * list-checked.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema, Fragment, NodeType } from 'prosemirror-model';\nimport { NodeView, EditorView } from 'prosemirror-view';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { findParentNodeOfType, NodeWithPos, setTextSelection } from 'prosemirror-utils';\nimport { InputRule, wrappingInputRule } from 'prosemirror-inputrules';\n\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { PandocToken, mapTokens } from '../../api/pandoc';\n\n// custom NodeView that accomodates display / interaction with item check boxes\nexport class CheckedListItemNodeView implements NodeView {\n public readonly dom: HTMLElement;\n public readonly contentDOM: HTMLElement;\n\n private readonly node: ProsemirrorNode;\n private readonly view: EditorView;\n private readonly getPos: () => number;\n\n constructor(node: ProsemirrorNode, view: EditorView, getPos: () => number) {\n this.node = node;\n this.view = view;\n this.getPos = getPos;\n\n // create root li element\n this.dom = window.document.createElement('li');\n if (node.attrs.tight) {\n this.dom.setAttribute('data-tight', 'true');\n }\n\n const container = window.document.createElement('div');\n container.classList.add('list-item-container');\n this.dom.appendChild(container);\n\n // add checkbox for checked items\n if (node.attrs.checked !== null) {\n this.dom.setAttribute('data-checked', node.attrs.checked ? 'true' : 'false');\n\n // checkbox for editing checked state\n const input = window.document.createElement('input');\n input.classList.add('list-item-checkbox');\n input.setAttribute('type', 'checkbox');\n input.checked = node.attrs.checked;\n input.contentEditable = 'false';\n input.disabled = !(view as any).editable;\n input.addEventListener('mousedown', (ev: Event) => {\n ev.preventDefault(); // don't steal focus\n });\n input.addEventListener('change', (ev: Event) => {\n const tr = view.state.tr;\n tr.setNodeMarkup(getPos(), node.type, {\n ...node.attrs,\n checked: (ev.target as HTMLInputElement).checked,\n });\n setTextSelection(getPos() + 1)(tr);\n view.dispatch(tr);\n });\n container.appendChild(input);\n }\n\n // content div\n const content = window.document.createElement('div');\n content.classList.add('list-item-content');\n this.contentDOM = content;\n container.appendChild(content);\n }\n}\n\n// command to toggle checked list items\nexport function checkedListItemCommandFn(itemType: NodeType) {\n return (state: EditorState, dispatch?: ((tr: Transaction) => void) | undefined) => {\n const itemNode = findParentNodeOfType(itemType)(state.selection);\n if (!itemNode) {\n return false;\n }\n\n if (dispatch) {\n const tr = state.tr;\n if (itemNode.node.attrs.checked !== null) {\n setItemChecked(tr, itemNode, null);\n } else {\n setItemChecked(tr, itemNode, false);\n }\n\n dispatch(tr);\n }\n\n return true;\n };\n}\n\nexport function checkedListItemToggleCommandFn(itemType: NodeType) {\n return (state: EditorState, dispatch?: ((tr: Transaction) => void) | undefined) => {\n const itemNode = findParentNodeOfType(itemType)(state.selection);\n if (!itemNode || itemNode.node.attrs.checked === null) {\n return false;\n }\n\n if (dispatch) {\n const tr = state.tr;\n setItemChecked(tr, itemNode, !itemNode.node.attrs.checked);\n dispatch(tr);\n }\n\n return true;\n };\n}\n\nexport class CheckedListItemCommand extends ProsemirrorCommand {\n constructor(itemType: NodeType) {\n super(EditorCommandId.ListItemCheck, [], checkedListItemCommandFn(itemType));\n }\n\n public isActive(state: EditorState): boolean {\n if (this.isEnabled(state)) {\n const itemNode = findParentNodeOfType(state.schema.nodes.list_item)(state.selection) as NodeWithPos;\n return itemNode.node.attrs.checked !== null;\n } else {\n return false;\n }\n }\n}\n\nexport class CheckedListItemToggleCommand extends ProsemirrorCommand {\n private itemType: NodeType;\n\n constructor(itemType: NodeType) {\n super(EditorCommandId.ListItemCheckToggle, [], checkedListItemToggleCommandFn(itemType));\n this.itemType = itemType;\n }\n\n public isActive(state: EditorState): boolean {\n const itemNode = findParentNodeOfType(this.itemType)(state.selection);\n return itemNode && itemNode.node.attrs.checked;\n }\n}\n\n// allow users to type [x] or [ ] to define a checked list item\nexport function checkedListItemInputRule() {\n return new InputRule(/\\[([ x])\\]\\s$/, (state: EditorState, match: string[], start: number, end: number) => {\n const schema = state.schema;\n\n const itemNode = findParentNodeOfType(schema.nodes.list_item)(state.selection);\n if (itemNode) {\n // create transaction\n const tr = state.tr;\n\n // set checked\n setItemChecked(tr, itemNode, match[1]);\n\n // delete entered text\n tr.delete(start, end);\n\n // return transaction\n return tr;\n } else {\n return null;\n }\n });\n}\n\n// allow users to begin a new checked list by typing [x] or [ ] at the beginning of a line\nexport function checkedListInputRule(schema: Schema) {\n // regex to match checked list at the beginning of a line\n const regex = /^\\s*\\[([ x])\\]\\s$/;\n\n // we are going to steal the handler from the base bullet list wrapping input rule\n const baseInputRule: any = wrappingInputRule(regex, schema.nodes.bullet_list);\n\n return new InputRule(regex, (state: EditorState, match: string[], start: number, end: number) => {\n // call the base handler to create the bullet list\n const tr = baseInputRule.handler(state, match, start, end);\n if (tr) {\n // set the checkbox\n const itemNode = findParentNodeOfType(schema.nodes.list_item)(tr.selection);\n if (itemNode) {\n setItemChecked(tr, itemNode, match[1]);\n }\n\n return tr;\n } else {\n return null;\n }\n });\n}\n\nfunction setItemChecked(tr: Transaction, itemNode: NodeWithPos, check: null | boolean | string) {\n tr.setNodeMarkup(itemNode.pos, itemNode.node.type, {\n ...itemNode.node.attrs,\n checked: check === null ? null : typeof check === 'string' ? check === 'x' : check,\n });\n}\n// prepend a check mark to the provided fragment\nexport function fragmentWithCheck(schema: Schema, fragment: Fragment, checked: boolean) {\n // create a raw markdown node with [x] or [ ]\n const mark = schema.marks.raw_inline.create({ format: 'markdown' });\n const check = schema.text((checked ? '[x]' : '[ ]') + ' ', [mark]);\n return Fragment.from(check).append(fragment);\n}\n\nconst kCheckedChar = '☒';\nconst kUncheckedChar = '☐';\n\nexport function tokensWithChecked(tokens: PandocToken[]): { checked: null | boolean; tokens: PandocToken[] } {\n // will set this flag based on inspecting the first Str token\n let checked: null | boolean | undefined;\n let lastWasChecked = false;\n\n // map tokens\n const mappedTokens = mapTokens(tokens, tok => {\n // if the last token was checked then strip the next space\n if (tok.t === 'Space' && lastWasChecked) {\n lastWasChecked = false;\n return {\n t: 'Str',\n c: '',\n };\n }\n\n // derive 'checked' from first chraracter of first Str token encountered\n // if we find checked or unchecked then set the flag and strip off\n // the first 2 chraracters (the check and the space after it)\n else if (tok.t === 'Str' && checked === undefined) {\n let text = tok.c as string;\n if (text.charAt(0) === kCheckedChar) {\n checked = true;\n lastWasChecked = true;\n text = text.slice(1);\n } else if (text.charAt(0) === kUncheckedChar) {\n checked = false;\n lastWasChecked = true;\n text = text.slice(1);\n } else {\n checked = null;\n }\n return {\n t: 'Str',\n c: text,\n };\n } else {\n return tok;\n }\n });\n\n // return\n return {\n checked: checked !== undefined ? checked : null,\n tokens: mappedTokens,\n };\n}\n","/*\n * list-pandoc.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, NodeType, Fragment } from 'prosemirror-model';\n\nimport { PandocOutput, PandocToken, ProsemirrorWriter, PandocTokenType } from '../../api/pandoc';\n\nimport { fragmentWithCheck, tokensWithChecked } from './list-checked';\nimport { ListNumberDelim, ListNumberStyle } from './list';\nimport { ListCapabilities, isList } from '../../api/list';\n\nconst LIST_ATTRIBS = 0;\nconst LIST_CHILDREN = 1;\n\nconst LIST_ATTRIB_ORDER = 0;\nconst LIST_ATTRIB_NUMBER_STYLE = 1;\nconst LIST_ATTRIB_NUMBER_DELIM = 2;\n\n// Note that we are planning on eliminating the markdownOutputFilter after this commit\n// as there will be no more uses of it and it plays poorly w/ e.g. pandoc table output\n// which needs to reliably know the number of characters wide each column will be).\n// (previous uses of markdownOutputFilter were converted to use output.writeRawMarkdown).\n// So, if we are attempting to re-enable example lists b/c there is now round tripping\n// of example lists through the pandoc AST we need an alternative way to fixup\n// example list output (likely a more robust pandoc AST).\nconst kListItemExampleSentinel = '20543127-1873-4833-AC49-5B352CFA2AF5';\nconst kListItemExampleRegex = new RegExp(`\\\\(\\\\d+\\\\) ${kListItemExampleSentinel}`, 'g');\n\nexport function readPandocList(nodeType: NodeType, capabilities: ListCapabilities) {\n // alias schema\n const schema = nodeType.schema;\n\n // default extraction functions\n let getChildren = (tok: PandocToken) => tok.c;\n let getAttrs = (tok: PandocToken): { [key: string]: any } => ({});\n\n // function to read the number style (convert example to default if we\n // don't support example lists)\n const readNumberStyle = (attribs: any) => {\n if (capabilities.fancy) {\n const style = attribs[LIST_ATTRIB_NUMBER_STYLE].t;\n if (style === ListNumberStyle.Example && !capabilities.example) {\n return ListNumberStyle.DefaultStyle;\n } else {\n return style;\n }\n } else {\n return ListNumberStyle.DefaultStyle;\n }\n };\n\n // specialize for ordered_list\n if (nodeType === schema.nodes.ordered_list) {\n getAttrs = (tok: PandocToken) => {\n const attribs = tok.c[LIST_ATTRIBS];\n return {\n order: capabilities.order ? attribs[LIST_ATTRIB_ORDER] : 1,\n number_style: readNumberStyle(attribs),\n number_delim: capabilities.fancy ? attribs[LIST_ATTRIB_NUMBER_DELIM].t : ListNumberDelim.DefaultDelim,\n };\n };\n getChildren = (tok: PandocToken) => tok.c[LIST_CHILDREN];\n }\n\n const listItemNodeType = schema.nodes.list_item;\n return (writer: ProsemirrorWriter, tok: PandocToken) => {\n\n // determine if this is an example list and log if it is\n if ((nodeType === schema.nodes.ordered_list) && capabilities.fancy) {\n const style = tok.c[LIST_ATTRIBS][LIST_ATTRIB_NUMBER_STYLE].t;\n if (style === ListNumberStyle.Example) {\n writer.logExampleList();\n }\n }\n \n const children = getChildren(tok);\n const attrs = getAttrs(tok);\n attrs.tight = children.length && children[0].length && children[0][0].t === 'Plain';\n writer.openNode(nodeType, attrs);\n children.forEach((child: PandocToken[]) => {\n // setup tokens/attribs for output\n let tokens = child;\n const childAttrs: { checked: null | boolean } = { checked: null };\n\n // special task list processing if the current format supports task lists\n if (capabilities.tasks) {\n // look for checkbox in first character of child tokens\n // if we see it, remove it and set childAttrs.checked as appropriate\n const childWithChecked = tokensWithChecked(child);\n childAttrs.checked = childWithChecked.checked;\n tokens = childWithChecked.tokens;\n }\n\n // process children\n writer.openNode(listItemNodeType, childAttrs);\n writer.writeTokens(tokens);\n writer.closeNode();\n });\n writer.closeNode();\n };\n}\n\nexport function writePandocOrderedList(capabilities: ListCapabilities) {\n return (output: PandocOutput, node: ProsemirrorNode) => {\n // alias some list options\n const options = listNodeOptions(node, capabilities);\n\n // force delim to two parens for example styles. we do this\n // to simplify the search/replace of example list sentinels\n // during conversion post-processing\n const delim = options.example ? ListNumberDelim.TwoParens : node.attrs.number_delim;\n\n output.writeToken(PandocTokenType.OrderedList, () => {\n output.writeArray(() => {\n output.write(capabilities.order ? node.attrs.order : 1);\n output.writeToken(capabilities.fancy ? node.attrs.number_style : ListNumberStyle.DefaultStyle);\n output.writeToken(capabilities.fancy ? delim : ListNumberDelim.DefaultDelim);\n });\n output.writeArray(() => {\n node.forEach(item => writePandocListItem(output, options, item));\n });\n });\n };\n}\n\nexport function writePandocBulletList(capabilities: ListCapabilities) {\n return (output: PandocOutput, node: ProsemirrorNode) => {\n output.writeToken(PandocTokenType.BulletList, () => {\n node.forEach(item => writePandocListItem(output, listNodeOptions(node, capabilities), item));\n });\n };\n}\n\nexport function exampleListPandocMarkdownOutputFilter(markdown: string) {\n return markdown.replace(kListItemExampleRegex, '(@) ');\n}\n\ninterface ListNodeOptions {\n tight: boolean;\n example: boolean;\n}\n\nfunction listNodeOptions(node: ProsemirrorNode, capabilities: ListCapabilities): ListNodeOptions {\n const options = {\n tight: node.attrs.tight,\n example: capabilities.example ? node.attrs.number_style === ListNumberStyle.Example : false,\n };\n\n // if it's tight see if we need to override b/c of multiple blocks\n // (allow case of [paragraph,list] which is just a nested list)\n node.forEach(item => {\n if (options.tight && item.childCount > 1) {\n if (item.childCount > 2 || !isList(item.child(1)) ) {\n options.tight = false;\n }\n }\n });\n\n return options;\n}\n\nfunction writePandocListItem(output: PandocOutput, options: ListNodeOptions, node: ProsemirrorNode) {\n const checked = node.attrs.checked;\n\n output.writeArray(() => {\n node.forEach((itemNode: ProsemirrorNode, _offset, index) => {\n if (itemNode.type === node.type.schema.nodes.paragraph) {\n const paraItemBlockType = options.tight ? PandocTokenType.Plain : PandocTokenType.Para;\n output.writeToken(paraItemBlockType, () => {\n // for first item block, prepend check mark if we have one\n if (checked !== null && index === 0) {\n writeListItemInlines(\n output,\n options.example,\n fragmentWithCheck(node.type.schema, itemNode.content, checked),\n index,\n );\n } else {\n writeListItemInlines(output, options.example, itemNode.content, index);\n }\n });\n } else {\n output.writeNode(itemNode);\n }\n });\n });\n}\n\nfunction writeListItemInlines(output: PandocOutput, example: boolean, fragment: Fragment, index: number) {\n if (index === 0 && example) {\n output.writeToken(PandocTokenType.Str, kListItemExampleSentinel);\n }\n output.writeInlines(fragment);\n}\n","/*\n * image.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema, DOMOutputSpec } from 'prosemirror-model';\nimport { EditorState, NodeSelection, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { canInsertNode } from '../../api/node';\nimport { selectionIsImageNode, selectionIsEmptyParagraph } from '../../api/selection';\nimport {\n pandocAttrSpec,\n pandocAttrParseDom,\n pandocAttrToDomAttr,\n pandocAttrReadAST,\n pandocAttrAvailable,\n} from '../../api/pandoc_attr';\nimport {\n PandocOutput,\n PandocTokenType,\n ProsemirrorWriter,\n PandocToken,\n stringifyTokens,\n imageAttributesAvailable,\n} from '../../api/pandoc';\nimport { EditorUI } from '../../api/ui';\nimport { ImageDimensions } from '../../api/image';\nimport { asHTMLTag } from '../../api/html';\nimport { OmniInsertGroup } from '../../api/omni_insert';\nimport { EditorFormat } from '../../api/format';\n\nimport { imageDialog } from './image-dialog';\nimport { imageDimensionsFromImg, imageContainerWidth, inlineHTMLIsImage } from './image-util';\nimport { imageTextSelectionPlugin } from './image-textsel';\nimport { posHasProhibitedFigureParent } from './figure';\nimport { imageEventsPlugin } from './image-events';\nimport { imageNodeViewPlugins } from './image-view';\n\nconst TARGET_URL = 0;\nconst TARGET_TITLE = 1;\n\nconst IMAGE_ATTR = 0;\nconst IMAGE_ALT = 1;\nconst IMAGE_TARGET = 2;\n\nconst extension = (context: ExtensionContext): Extension => {\n const { pandocExtensions, ui, events, format } = context;\n\n const imageAttr = imageAttributesAvailable(pandocExtensions);\n\n return {\n nodes: [\n {\n name: 'image',\n spec: {\n inline: true,\n attrs: imageNodeAttrsSpec(false, imageAttr),\n group: 'inline',\n draggable: true,\n parseDOM: [\n {\n tag: 'img[src]',\n getAttrs(dom: Node | string) {\n return imageAttrsFromDOM(dom as Element, imageAttr);\n },\n },\n ],\n toDOM(node: ProsemirrorNode) {\n return imageDOMOutputSpec(node, imageAttr);\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.Image,\n handler: pandocImageHandler(false, imageAttr),\n },\n ],\n inlineHTMLReader: pandocExtensions.raw_html ? imageInlineHTMLReader : undefined,\n writer: imagePandocOutputWriter(false, ui),\n },\n\n attr_edit: () => ({\n type: (schema: Schema) => schema.nodes.image,\n noDecorator: true,\n editFn: () => imageCommand(ui, format, imageAttr),\n }),\n },\n ],\n\n commands: (_schema: Schema) => {\n return [\n new ProsemirrorCommand(\n EditorCommandId.Image,\n ['Shift-Mod-i'],\n imageCommand(ui, format, imageAttr),\n imageOmniInsert(ui),\n ),\n ];\n },\n\n plugins: (schema: Schema) => {\n return [\n imageTextSelectionPlugin(),\n imageEventsPlugin(ui),\n ...imageNodeViewPlugins('image', ui, format, events, pandocExtensions),\n ];\n },\n };\n};\n\nexport function pandocImageHandler(figure: boolean, imageAttributes: boolean) {\n return (schema: Schema) => (writer: ProsemirrorWriter, tok: PandocToken) => {\n // get attributes\n const target = tok.c[IMAGE_TARGET];\n const attrs = {\n src: decodeURI(target[TARGET_URL]),\n title: readPandocTitle(target[TARGET_TITLE]),\n caption: '',\n ...(imageAttributes ? pandocAttrReadAST(tok, IMAGE_ATTR) : {}),\n };\n\n // add alt as plain text if it's not a figure\n if (!figure) {\n attrs.caption = stringifyTokens(tok.c[IMAGE_ALT]);\n }\n\n // read image and (if appropriate) children\n writer.openNode(figure ? schema.nodes.figure : schema.nodes.image, attrs);\n if (figure) {\n writer.writeTokens(tok.c[IMAGE_ALT]);\n }\n writer.closeNode();\n };\n}\n\nexport function imagePandocOutputWriter(figure: boolean, ui: EditorUI) {\n return (output: PandocOutput, node: ProsemirrorNode) => {\n // default writer for markdown images\n let writer = () => {\n output.writeToken(PandocTokenType.Image, () => {\n if (output.extensions.link_attributes) {\n output.writeAttr(node.attrs.id, node.attrs.classes, node.attrs.keyvalue);\n } else {\n output.writeAttr();\n }\n output.writeArray(() => {\n if (figure) {\n output.writeInlines(node.content);\n } else {\n output.writeText(node.attrs.caption);\n }\n });\n output.write([encodeURI(node.attrs.src), node.attrs.title || '']);\n });\n };\n\n // see if we need to write raw html\n const requireHTML =\n pandocAttrAvailable(node.attrs) && // attribs need to be written\n !output.extensions.link_attributes && // markdown attribs not supported\n output.extensions.raw_html; // raw html is supported\n\n // if we do, then substitute a raw html writer\n if (node.attrs.raw || requireHTML) {\n writer = () => {\n const imgAttr = imageDOMAttributes(node, true, false);\n const html = asHTMLTag('img', imgAttr, true, true);\n output.writeRawMarkdown(html);\n };\n }\n\n // write (wrap in paragraph and possibly link for figures)\n if (figure) {\n let writeFigure = writer;\n if (node.attrs.linkTo) {\n writeFigure = () => {\n output.writeLink(node.attrs.linkTo, '', null, writer);\n };\n }\n output.writeToken(PandocTokenType.Para, writeFigure);\n } else {\n writer();\n }\n };\n}\n\n// parse inline html with <img> as image node\nfunction imageInlineHTMLReader(schema: Schema, html: string, writer?: ProsemirrorWriter) {\n const isImage = inlineHTMLIsImage(html);\n if (!isImage) {\n return false;\n }\n\n if (writer) {\n const attrs = imageAttrsFromHTML(html);\n if (attrs) {\n attrs.raw = true;\n writer.addNode(schema.nodes.image, attrs, []);\n } else {\n return false;\n }\n }\n\n return isImage;\n}\n\nexport function imageDOMOutputSpec(node: ProsemirrorNode, imageAttributes: boolean): DOMOutputSpec {\n return ['img', imageDOMAttributes(node, imageAttributes)];\n}\n\nexport function imageDOMAttributes(\n node: ProsemirrorNode,\n imageAttributes: boolean,\n marker = true,\n): { [key: string]: string } {\n const attr: { [key: string]: string } = {\n src: node.attrs.src,\n };\n const title = node.attrs.title;\n if (title) {\n attr.title = title;\n }\n const caption = node.attrs.caption || node.textContent;\n if (caption) {\n attr.alt = caption;\n }\n\n return {\n ...attr,\n ...(imageAttributes ? pandocAttrToDomAttr(node.attrs, marker) : {}),\n };\n}\n\nexport function imageNodeAttrsSpec(linkTo: boolean, imageAttributes: boolean) {\n return {\n src: {},\n title: { default: null },\n caption: { default: null },\n raw: { default: false },\n ...(linkTo ? { linkTo: { default: null } } : {}),\n ...(imageAttributes ? pandocAttrSpec : {}),\n };\n}\n\nexport function imageAttrsFromDOM(el: Element, imageAttributes: boolean, forceAttrs = false) {\n const attrs: { [key: string]: string | null } = {\n src: el.getAttribute('src') || null,\n title: el.getAttribute('title') || null,\n caption: el.getAttribute('alt') || null,\n };\n return {\n ...attrs,\n ...(imageAttributes ? pandocAttrParseDom(el, attrs, forceAttrs) : {}),\n };\n}\n\nexport function imageAttrsFromHTML(html: string) {\n const parser = new window.DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n if (doc.body && doc.body.firstChild instanceof HTMLImageElement) {\n return imageAttrsFromDOM(doc.body.firstChild, true, true);\n } else {\n return null;\n }\n}\n\nexport function imageCommand(editorUI: EditorUI, editorFormat: EditorFormat, imageAttributes: boolean) {\n return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n const schema = state.schema;\n\n if (!canInsertNode(state, schema.nodes.image) && !canInsertNode(state, schema.nodes.figure)) {\n return false;\n }\n\n if (dispatch && view) {\n // see if we are editing an existing node\n let node: ProsemirrorNode | null = null;\n let nodeType = schema.nodes.image;\n let img: HTMLImageElement | null = null;\n let imgDimensions: ImageDimensions | null = null;\n if (selectionIsImageNode(schema, state.selection)) {\n node = (state.selection as NodeSelection).node;\n nodeType = node.type;\n if (nodeType === schema.nodes.figure) {\n const figure = view.nodeDOM(state.selection.from) as HTMLElement;\n img = figure.firstChild!.firstChild as HTMLImageElement;\n } else {\n const span = view.nodeDOM(state.selection.from) as HTMLElement;\n img = span.firstChild! as HTMLImageElement;\n }\n if (img) {\n const containerWidth = imageContainerWidth(state.selection.from, view);\n imgDimensions = imageDimensionsFromImg(img, containerWidth);\n }\n }\n\n // see if we are in an empty paragraph (in that case insert a figure)\n if (\n selectionIsEmptyParagraph(schema, state.selection) &&\n !posHasProhibitedFigureParent(schema, state.selection.$head)\n ) {\n nodeType = schema.nodes.figure;\n }\n\n // show dialog\n imageDialog(node, imgDimensions, nodeType, view, editorUI, editorFormat, imageAttributes);\n }\n\n return true;\n };\n}\n\nfunction imageOmniInsert(ui: EditorUI) {\n return {\n name: ui.context.translateText('Figure / Image...'),\n description: ui.context.translateText('Figure or inline image'),\n group: OmniInsertGroup.Content,\n priority: 10,\n image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.image_dark! : ui.images.omni_insert?.image!),\n };\n}\n\nfunction readPandocTitle(title: string | null) {\n if (title) {\n return title.replace(/^(fig:)/, '');\n } else {\n return title;\n }\n}\n\nexport default extension;\n","/*\n * image-dialog.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, NodeType, Fragment, Mark } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\n\nimport { insertAndSelectNode } from '../../api/node';\nimport { EditorUI } from '../../api/ui';\nimport { ImageProps } from '../../api/ui-dialogs';\nimport { extractSizeStyles, kPercentUnit, kPixelUnit } from '../../api/css';\nimport { ImageType, ImageDimensions, isNaturalAspectRatio } from '../../api/image';\nimport { kWidthAttrib, kHeightAttrib, pandocAttrRemoveKeyvalue, \n pandocAttrGetKeyvalue, pandocAttrSetKeyvalue, \n kFigAlignAttrib, kFigEnvAttrib, kFigAltAttrib } from '../../api/pandoc_attr';\n import { EditorFormat, kQuartoDocType } from '../../api/format';\n\nimport { imagePropsWithSizes, hasPercentWidth } from './image-util';\n\nexport async function imageDialog(\n node: ProsemirrorNode | null,\n dims: ImageDimensions | null,\n nodeType: NodeType,\n view: EditorView,\n editorUI: EditorUI,\n editorFormat: EditorFormat,\n imageAttributes: boolean,\n) {\n // alias schema\n const schema = view.state.schema;\n\n // if we are being called with an existing node then read it's attributes\n let content = Fragment.empty;\n let image: ImageProps = { src: null };\n let linkMark: Mark | undefined;\n let marks: Mark[] = [];\n if (node && dims && node.type === nodeType) {\n // base attributess\n image = {\n ...(node.attrs as ImageProps),\n caption: nodeType === schema.nodes.figure ? node.textContent : node.attrs.caption,\n };\n\n // move width and height out of style and into keyvalue if necessary\n image = {\n ...image,\n keyvalue: extractSizeStyles(image.keyvalue),\n };\n\n // move width, height, and units out of keyvalue into explicit\n // top level image properties if necessary\n image = imagePropsWithSizes(image, dims);\n\n // record marks / linkTo\n if (nodeType === schema.nodes.image) {\n marks = node.marks;\n linkMark = node.marks.find(mark => mark.type === schema.marks.link);\n if (linkMark) {\n image.linkTo = linkMark.attrs.href;\n }\n }\n\n // content (will be caption for figures)\n content = node.content;\n } else {\n // create a new image\n image = nodeType.create(image).attrs as ImageProps;\n }\n\n // determine the type\n const type = nodeType === view.state.schema.nodes.image ? ImageType.Image : ImageType.Figure;\n\n // if this is a quarto figure then remove fig-align and fig-env from attributes\n const quartoFigure = (type === ImageType.Figure) && \n editorFormat.docTypes.includes(kQuartoDocType) && \n imageAttributes;\n if (quartoFigure) {\n // fig-alt\n image.alt = pandocAttrGetKeyvalue(image, kFigAltAttrib) || \"\";\n pandocAttrRemoveKeyvalue(image, kFigAltAttrib);\n // fig-align\n image.align = pandocAttrGetKeyvalue(image, kFigAlignAttrib) || \"default\";\n pandocAttrRemoveKeyvalue(image, kFigAlignAttrib);\n // fig env\n image.env = pandocAttrGetKeyvalue(image, kFigEnvAttrib) || \"\";\n pandocAttrRemoveKeyvalue(image, kFigEnvAttrib);\n }\n\n const result = await editorUI.dialogs.editImage(\n image, dims, type === ImageType.Figure, imageAttributes\n );\n if (result) {\n // since captions support inline formatting (and the dialog doesn't) we only want \n // to update the content if the alt/caption actually changed (as it will blow away\n // formatting)\n if (type === ImageType.Figure && image.caption !== result.caption) {\n if (result.caption) {\n content = Fragment.from(view.state.schema.text(result.caption));\n } else {\n content = Fragment.empty;\n }\n }\n\n // if we have align then move into keyvalue\n if (quartoFigure) {\n // fig-alt\n if (result.alt) {\n pandocAttrSetKeyvalue(result, kFigAltAttrib, result.alt);\n } else {\n pandocAttrRemoveKeyvalue(result, kFigAltAttrib);\n }\n // fig-align\n if (result.align) {\n if (result.align !== \"default\") {\n pandocAttrSetKeyvalue(result, kFigAlignAttrib, result.align);\n } else {\n pandocAttrRemoveKeyvalue(result, kFigAlignAttrib);\n }\n }\n // fig-env\n if (result.env) {\n pandocAttrSetKeyvalue(result, kFigEnvAttrib, result.env);\n } else {\n pandocAttrRemoveKeyvalue(result, kFigEnvAttrib);\n }\n }\n\n // if we have width and height move them into keyvalue\n let keyvalue = result.keyvalue;\n if (result.units) {\n // no units for px\n const units = result.units && result.units === kPixelUnit ? '' : result.units;\n // width\n if (result.width) {\n let width = result.width;\n if (hasPercentWidth(units)) {\n width = Math.min(width, 100);\n }\n keyvalue = keyvalue || [];\n keyvalue.push([kWidthAttrib, width + units]);\n }\n // only record height if it's not % units and it's not at it's natural height\n if (result.height && units !== kPercentUnit && !isNaturalHeight(result.width, result.height, dims)) {\n keyvalue = keyvalue || [];\n keyvalue.push([kHeightAttrib, result.height + units]);\n }\n }\n\n // merge updated keyvalue\n const imageProps = { ...result, keyvalue };\n\n // update or create link mark as necessary\n if (nodeType === schema.nodes.image) {\n if (linkMark) {\n marks = linkMark.removeFromSet(marks);\n if (imageProps.linkTo) {\n linkMark = linkMark.type.create({ ...linkMark.attrs, href: imageProps.linkTo });\n }\n } else if (imageProps.linkTo) {\n linkMark = schema.marks.link.create({ href: imageProps.linkTo });\n }\n if (imageProps.linkTo && linkMark) {\n marks = linkMark.addToSet(marks);\n }\n }\n\n // create the image\n const newImage = nodeType.createAndFill(imageProps, content, marks);\n\n // insert and select\n if (newImage) {\n insertAndSelectNode(view, newImage);\n }\n }\n\n if (view) {\n view.focus();\n }\n}\n\n// wrapper for isNaturalHeight that handles potentially undefined params\nfunction isNaturalHeight(width: number | undefined, height: number | undefined, dims: ImageDimensions | null) {\n if (width && height && dims) {\n return isNaturalAspectRatio(width, height, dims, false);\n } else {\n return false;\n }\n}\n","/*\n * image-util.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView } from 'prosemirror-view';\nimport { findParentNodeClosestToPos } from 'prosemirror-utils';\n\nimport { ImageProps } from '../../api/ui-dialogs';\nimport {\n imageSizePropWithUnit,\n isValidImageSizeUnit,\n ensureContainerWidth,\n isNaturalAspectRatio,\n ImageDimensions,\n} from '../../api/image';\nimport { kWidthAttrib, kHeightAttrib, attrPartitionKeyvalue } from '../../api/pandoc_attr';\nimport { kPercentUnit, kPixelUnit } from '../../api/css';\nimport { elementInnerDimensions } from '../../api/dom';\n\nexport function imagePropsWithSizes(image: ImageProps, dims: ImageDimensions) {\n // pull width, height, and units out of keyvalue if necessary\n // (enables front-ends to provide dedicated UI for width/height)\n // note that if the value doesn't use a unit supported by the\n // UI it's kept within the original keyvalue prop\n if (image.keyvalue) {\n let width: number | undefined;\n let height: number | undefined;\n let units: string | undefined;\n let lockRatio = true;\n const partitionedKeyvalue = attrPartitionKeyvalue([kWidthAttrib, kHeightAttrib], image.keyvalue);\n for (const kv of partitionedKeyvalue.partitioned) {\n const [key, value] = kv;\n let partitioned = false;\n const sizeWithUnit = imageSizePropWithUnit(value);\n if (sizeWithUnit) {\n sizeWithUnit.unit = sizeWithUnit.unit || kPixelUnit;\n if (isValidImageSizeUnit(sizeWithUnit.unit)) {\n if (key === kWidthAttrib) {\n width = sizeWithUnit.size;\n units = sizeWithUnit.unit;\n } else if (key === kHeightAttrib) {\n height = sizeWithUnit.size;\n units = units || sizeWithUnit.unit;\n }\n partitioned = true;\n }\n }\n if (!partitioned) {\n partitionedKeyvalue.base.push(kv);\n }\n }\n if (width && height) {\n lockRatio = isNaturalAspectRatio(width, height, dims, lockRatio);\n }\n return {\n ...image,\n width,\n height,\n units,\n lockRatio,\n keyvalue: partitionedKeyvalue.base,\n };\n } else {\n return image;\n }\n}\n\nexport function imageDimensionsFromImg(img: HTMLImageElement, containerWidth: number) {\n return {\n naturalWidth: img.naturalWidth || null,\n naturalHeight: img.naturalHeight || null,\n containerWidth: ensureContainerWidth(containerWidth),\n };\n}\n\nexport function hasPercentWidth(size: string | null) {\n return !!size && size.endsWith(kPercentUnit);\n}\n\nexport function imageContainerWidth(pos: number, view: EditorView) {\n let containerWidth = (view.dom as HTMLElement).offsetWidth;\n if (containerWidth > 0) {\n if (pos) {\n const imagePos = view.state.doc.resolve(pos);\n const resizeContainer = findParentNodeClosestToPos(imagePos, nd => nd.isBlock);\n if (resizeContainer) {\n const resizeEl = view.domAtPos(resizeContainer.pos + 1);\n containerWidth = elementInnerDimensions(resizeEl.node as HTMLElement).width;\n }\n }\n }\n\n return containerWidth;\n}\n\nexport function inlineHTMLIsImage(html: string) {\n return html\n .trimLeft()\n .toLowerCase()\n .startsWith('<img');\n}\n","/*\n * image-textsel.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction, NodeSelection, Plugin, PluginKey } from 'prosemirror-state';\nimport { DecorationSet, Decoration } from 'prosemirror-view';\nimport { nodeDecoration } from '../../api/decoration';\n\nconst pluginKey = new PluginKey('image-text-selection');\n\nexport function imageTextSelectionPlugin() {\n return new Plugin<DecorationSet>({\n key: pluginKey,\n state: {\n init(_config: { [key: string]: any }, instance: EditorState) {\n return DecorationSet.empty;\n },\n apply(tr: Transaction, set: DecorationSet, oldState: EditorState, newState: EditorState) {\n // no decorations for empty or node selection\n if (tr.selection.empty || tr.selection instanceof NodeSelection) {\n return DecorationSet.empty;\n }\n\n const schema = newState.schema;\n const decorations: Decoration[] = [];\n tr.doc.nodesBetween(tr.selection.from, tr.selection.to, (node, pos) => {\n if ([schema.nodes.image, schema.nodes.figure].includes(node.type)) {\n decorations.push(nodeDecoration({ node, pos }, { class: 'pm-image-text-selection' }));\n }\n });\n\n return DecorationSet.create(tr.doc, decorations);\n },\n },\n props: {\n decorations(state: EditorState) {\n return pluginKey.getState(state);\n },\n },\n });\n}\n","/*\n * figure.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema, Fragment, ResolvedPos } from 'prosemirror-model';\nimport { Transaction } from 'prosemirror-state';\nimport { Transform } from 'prosemirror-transform';\n\nimport { findChildrenByType, findParentNodeClosestToPos } from 'prosemirror-utils';\n\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { FixupContext } from '../../api/fixup';\nimport { isSingleLineHTML } from '../../api/html';\nimport { getMarkAttrs } from '../../api/mark';\nimport {\n PandocToken,\n PandocTokenType,\n ProsemirrorWriter,\n kRawBlockContent,\n kRawBlockFormat,\n imageAttributesAvailable,\n} from '../../api/pandoc';\nimport { trTransform } from '../../api/transaction';\n\nimport {\n imageAttrsFromDOM,\n imageNodeAttrsSpec,\n imageDOMOutputSpec,\n imagePandocOutputWriter,\n pandocImageHandler,\n imageAttrsFromHTML,\n imageCommand,\n} from './image';\nimport { inlineHTMLIsImage } from './image-util';\nimport { imageNodeViewPlugins } from './image-view';\nimport { figureKeys } from './figure-keys';\n\nconst extension = (context: ExtensionContext): Extension => {\n const { pandocExtensions, ui, events, format } = context;\n\n const imageAttr = imageAttributesAvailable(pandocExtensions);\n\n return {\n nodes: [\n {\n name: 'figure',\n spec: {\n attrs: imageNodeAttrsSpec(true, imageAttr),\n content: 'inline*',\n group: 'block',\n draggable: true,\n selectable: true,\n defining: true,\n parseDOM: [\n {\n tag: 'figure',\n contentElement: 'figcaption',\n getAttrs(dom: Node | string) {\n const el = dom as Element;\n const img = el.querySelector('img');\n if (img && img.parentNode === dom) {\n return imageAttrsFromDOM(img, imageAttr);\n } else {\n return {\n src: null,\n title: null,\n };\n }\n },\n },\n ],\n toDOM(node: ProsemirrorNode) {\n return ['figure', imageDOMOutputSpec(node, imageAttr), ['figcaption', { class: 'pm-figcaption' }, 0]];\n },\n },\n pandoc: {\n writer: imagePandocOutputWriter(true, ui),\n\n // intercept paragraphs with a single image and process them as figures\n blockReader: (schema: Schema, tok: PandocToken, writer: ProsemirrorWriter) => {\n // helper to process html image\n const handleHTMLImage = (html: string) => {\n const attrs = imageAttrsFromHTML(html);\n if (attrs) {\n attrs.raw = true;\n writer.addNode(schema.nodes.figure, attrs, []);\n return true;\n } else {\n return false;\n }\n };\n\n // unroll figure from paragraph with single image\n if (isParaWrappingFigure(tok) && !writerHasProhibitedFigureParent(schema, writer)) {\n const handler = pandocImageHandler(true, imageAttr)(schema);\n handler(writer, tok.c[0]);\n return true;\n // unroll figure from html RawBlock with single <img> tag\n } else if (isHTMLImageBlock(tok)) {\n return handleHTMLImage(tok.c[kRawBlockContent]);\n } else {\n return false;\n }\n },\n },\n\n attr_edit: () => ({\n type: (schema: Schema) => schema.nodes.figure,\n editFn: () => imageCommand(ui, format, imageAttr),\n offset: {\n top: 2,\n right: 0\n },\n noKeyvalueTags: true,\n preferHidden: true\n }),\n },\n ],\n\n fixups: (_schema: Schema) => {\n return [\n (tr: Transaction, fixupContext: FixupContext) => {\n if (fixupContext === FixupContext.Load) {\n return convertImagesToFigure(tr);\n } else {\n return tr;\n }\n },\n ];\n },\n\n appendTransaction: (schema: Schema) => {\n return [\n {\n name: 'figure-convert',\n nodeFilter: node => node.type === schema.nodes.image,\n append: convertImagesToFigure,\n },\n ];\n },\n\n baseKeys: figureKeys,\n\n plugins: (schema: Schema) => {\n return [...imageNodeViewPlugins('figure', ui, format, events, pandocExtensions)];\n },\n };\n};\n\nexport function posHasProhibitedFigureParent(schema: Schema, $pos: ResolvedPos) {\n return prohibitedFigureParents(schema).some(type => {\n return !!findParentNodeClosestToPos($pos, node => node.type === type);\n });\n}\n\nexport function writerHasProhibitedFigureParent(schema: Schema, writer: ProsemirrorWriter) {\n return prohibitedFigureParents(schema).some(writer.isNodeOpen);\n}\n\nfunction prohibitedFigureParents(schema: Schema) {\n return [schema.nodes.table_cell, schema.nodes.list_item, schema.nodes.definition_list];\n}\n\nfunction convertImagesToFigure(tr: Transaction) {\n return trTransform(tr, imagesToFiguresTransform);\n}\n\nfunction imagesToFiguresTransform(tr: Transform) {\n const schema = tr.doc.type.schema;\n const images = findChildrenByType(tr.doc, schema.nodes.image);\n images.forEach(image => {\n // position reflecting steps already taken in this handler\n const mappedImagePos = tr.mapping.mapResult(image.pos);\n\n // process image so long as it wasn't deleted by a previous step\n if (!mappedImagePos.deleted) {\n // resolve image pos\n const imagePos = tr.doc.resolve(mappedImagePos.pos);\n\n // if it's an image in a standalone paragraph, convert it to a figure\n if (\n imagePos.parent.type === schema.nodes.paragraph &&\n imagePos.parent.childCount === 1 &&\n !posHasProhibitedFigureParent(schema, imagePos)\n ) {\n // figure attributes\n const attrs = image.node.attrs;\n\n // extract linkTo from link mark (if any)\n if (schema.marks.link.isInSet(image.node.marks)) {\n const linkAttrs = getMarkAttrs(\n tr.doc,\n { from: mappedImagePos.pos, to: mappedImagePos.pos + image.node.nodeSize },\n schema.marks.link,\n );\n if (linkAttrs && linkAttrs.href) {\n attrs.linkTo = linkAttrs.href;\n }\n }\n\n // figure content\n const content = attrs.caption ? Fragment.from(schema.text(attrs.caption)) : Fragment.empty;\n\n // replace image with figure\n const figure = schema.nodes.figure.createAndFill(attrs, content);\n if (figure) {\n tr.replaceRangeWith(mappedImagePos.pos, mappedImagePos.pos + image.node.nodeSize, figure);\n }\n }\n }\n });\n}\n\nfunction isParaWrappingFigure(tok: PandocToken) {\n return isSingleChildParagraph(tok) && tok.c[0].t === PandocTokenType.Image;\n}\n\nfunction isHTMLImageBlock(tok: PandocToken) {\n if (tok.t === PandocTokenType.RawBlock) {\n const format = tok.c[kRawBlockFormat];\n const text = tok.c[kRawBlockContent] as string;\n return format === 'html' && isSingleLineHTML(text) && inlineHTMLIsImage(text);\n } else {\n return false;\n }\n}\n\nfunction isSingleChildParagraph(tok: PandocToken) {\n return tok.t === PandocTokenType.Para && tok.c && tok.c.length === 1;\n}\n\nexport default extension;\n","/*\n * decoration.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { NodeWithPos } from 'prosemirror-utils';\nimport { DecorationAttrs, Decoration } from 'prosemirror-view';\n\nexport function nodeDecoration(nodeWithPos: NodeWithPos, attrs: DecorationAttrs) {\n return Decoration.node(nodeWithPos.pos, nodeWithPos.pos + nodeWithPos.node.nodeSize, attrs);\n}\n","/*\n * image-view.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { NodeView, EditorView } from 'prosemirror-view';\nimport { NodeSelection, PluginKey, Plugin } from 'prosemirror-state';\n\nimport { EditorUI } from '../../api/ui';\nimport { ImageType } from '../../api/image';\nimport { PandocExtensions, imageAttributesAvailable } from '../../api/pandoc';\nimport { isElementVisible } from '../../api/dom';\nimport { EditorEvents } from '../../api/events';\nimport { ResizeEvent } from '../../api/event-types';\nimport { EditorFormat } from '../../api/format';\n\nimport { imageDialog } from './image-dialog';\nimport {\n attachResizeUI,\n initResizeContainer,\n ResizeUI,\n isResizeUICompatible,\n updateImageViewSize,\n} from './image-resize';\nimport { imageDimensionsFromImg, imageContainerWidth } from './image-util';\n\nimport './image-styles.css';\n\nexport function imageNodeViewPlugins(\n type: string,\n ui: EditorUI,\n format: EditorFormat,\n events: EditorEvents,\n pandocExtensions: PandocExtensions,\n): Plugin[] {\n return [\n new Plugin({\n key: new PluginKey(`${type}-node-view`),\n props: {\n nodeViews: {\n [type]: (node: ProsemirrorNode, view: EditorView, getPos: boolean | (() => number)) => {\n return new ImageNodeView(node, view, getPos as () => number, ui, format, events, pandocExtensions);\n },\n },\n },\n }),\n ];\n}\n\nclass ImageNodeView implements NodeView {\n // ProseMirror context\n private readonly type: ImageType;\n private node: ProsemirrorNode;\n private readonly view: EditorView;\n private readonly getPos: () => number;\n private readonly editorUI: EditorUI;\n private readonly editorFormat: EditorFormat;\n private readonly imageAttributes: boolean;\n private readonly implicitFigures: boolean;\n\n // DOM elements\n public readonly dom: HTMLElement;\n private readonly img: HTMLImageElement;\n public readonly contentDOM: HTMLElement | null;\n private readonly figcaption: HTMLElement | null;\n\n // transient state\n private imgBroken: boolean;\n\n // things to clean up\n private resizeUI: ResizeUI | null;\n private sizeOnVisibleTimer?: number;\n private unregisterOnResize: VoidFunction;\n private unregisterWatchImg: VoidFunction | null = null;\n\n constructor(\n node: ProsemirrorNode,\n view: EditorView,\n getPos: () => number,\n editorUI: EditorUI,\n editorFormat: EditorFormat,\n editorEvents: EditorEvents,\n pandocExtensions: PandocExtensions,\n ) {\n // determine type\n const schema = node.type.schema;\n this.type = node.type === schema.nodes.image ? ImageType.Image : ImageType.Figure;\n\n // save references\n this.node = node;\n this.view = view;\n this.getPos = getPos;\n this.imageAttributes = imageAttributesAvailable(pandocExtensions);\n this.implicitFigures = pandocExtensions.implicit_figures;\n this.editorUI = editorUI;\n this.editorFormat = editorFormat;\n this.resizeUI = null;\n this.imgBroken = false;\n\n // set node selection on click\n const selectOnClick = () => {\n const tr = view.state.tr;\n tr.setSelection(NodeSelection.create(view.state.doc, getPos()));\n view.dispatch(tr);\n };\n\n // show image dialog on double-click\n const editOnDblClick = () => {\n selectOnClick();\n imageDialog(\n this.node,\n imageDimensionsFromImg(this.img, this.containerWidth()),\n this.node.type,\n this.view,\n editorUI,\n editorFormat,\n this.imageAttributes,\n );\n };\n\n // stop propagation from child elmeents that need to handle click\n // (e.g. figcaption element)\n const noPropagateClick = (ev: MouseEvent) => {\n ev.stopPropagation();\n };\n\n // create the image (used by both image and figure node types)\n this.img = document.createElement('img');\n this.img.classList.add('pm-img');\n this.img.onload = () => {\n this.imgBroken = false;\n };\n this.img.onerror = () => {\n this.imgBroken = true;\n };\n this.img.onclick = selectOnClick;\n this.img.ondblclick = editOnDblClick;\n\n // wrap in figure if appropriate\n if (this.type === ImageType.Figure) {\n // create figure wrapper\n this.dom = document.createElement('figure');\n this.dom.classList.add('pm-figure');\n\n // create container\n const container = document.createElement('div');\n container.contentEditable = 'false';\n this.dom.append(container);\n\n // initialize the image\n container.append(this.img);\n this.updateImg();\n\n // create the caption and make it our contentDOM\n this.figcaption = document.createElement('figcaption');\n this.figcaption.classList.add('pm-figcaption');\n this.figcaption.classList.add('pm-node-caption');\n this.figcaption.onclick = noPropagateClick;\n this.figcaption.ondblclick = noPropagateClick;\n this.contentDOM = this.figcaption;\n this.dom.append(this.figcaption);\n\n // manage visibility\n this.manageFigcaption();\n\n // standard inline image\n } else {\n this.dom = document.createElement('span');\n\n this.dom.append(this.img);\n this.updateImg();\n\n this.contentDOM = null;\n this.figcaption = null;\n }\n\n // prevent drag/drop if the event doesn't target the image\n this.dom.ondragstart = (event: DragEvent) => {\n if (event.target !== this.img) {\n event.preventDefault();\n event.stopPropagation();\n }\n };\n\n // init resize if we support imageAttributes\n if (this.imageAttributes) {\n initResizeContainer(this.dom);\n }\n\n // update image size when the image first becomes visible\n this.updateSizeOnVisible();\n\n // update image size whenever the container is resized\n this.unregisterOnResize = editorEvents.subscribe(ResizeEvent, () => {\n this.updateImageSize();\n });\n }\n\n public destroy() {\n if (this.unregisterWatchImg) {\n this.unregisterWatchImg();\n }\n this.unregisterOnResize();\n this.clearSizeOnVisibleTimer();\n this.detachResizeUI();\n }\n\n public selectNode() {\n // mirror default implementation\n this.dom.classList.add('ProseMirror-selectednode');\n if (this.contentDOM || !this.node.type.spec.draggable) {\n this.dom.draggable = true;\n }\n\n // manage figcaption\n this.manageFigcaption();\n\n // attach resize UI\n this.attachResizeUI();\n }\n\n public deselectNode() {\n // mirror default implementation\n this.dom.classList.remove('ProseMirror-selectednode');\n if (this.contentDOM || !this.node.type.spec.draggable) {\n this.dom.draggable = false;\n }\n\n // remove resize UI\n this.detachResizeUI();\n }\n\n // update image with latest node/attributes\n public update(node: ProsemirrorNode) {\n // boilerplate type check\n if (node.type !== this.node.type) {\n return false;\n }\n\n // set new node and update the image\n this.node = node;\n this.updateImg();\n\n // if we already have resize UI then either update it\n // or detach it (if e.g. the units are no longer compatible)\n if (this.resizeUI) {\n if (isResizeUICompatible(this.img!)) {\n this.resizeUI.update();\n } else {\n this.resizeUI.detach();\n this.resizeUI = null;\n }\n // attach if the node is selected\n } else if (this.isNodeSelected()) {\n this.attachResizeUI();\n }\n return true;\n }\n\n // ignore mutations outside of the content dom so sizing actions don't cause PM re-render\n public ignoreMutation(mutation: MutationRecord | { type: 'selection'; target: Element }) {\n return !this.contentDOM || !this.contentDOM.contains(mutation.target);\n }\n\n // map node to img tag\n private updateImg() {\n // unsubscribe from any existing resource watcher\n if (this.unregisterWatchImg) {\n this.unregisterWatchImg();\n }\n\n // map to path reachable within current editing frame\n const src = this.node.attrs.src;\n this.img.src = this.editorUI.context.mapResourceToURL(src);\n\n // if this is a local resource then watch it and update when it changes\n if (!src.match(/^\\w+:\\/\\//)) {\n this.unregisterWatchImg = this.editorUI.context.watchResource(src, () => {\n this.img.src = this.editorUI.context.mapResourceToURL(src);\n });\n }\n\n // title/tooltip\n this.img.title = '';\n if (this.node.attrs.title) {\n this.img.title = this.node.attrs.title;\n }\n\n // ensure alt attribute so that we get default browser broken image treatment\n this.img.alt = this.node.textContent || this.node.attrs.src;\n\n // manage caption visibility\n this.manageFigcaption();\n\n // update size\n this.updateImageSize();\n }\n\n private updateImageSize() {\n const containerWidth = this.img.isConnected ? this.containerWidth() : 0;\n updateImageViewSize(this.node, this.img, this.isFigure() ? this.dom : null, containerWidth);\n }\n\n private updateSizeOnVisible() {\n const updateSizeOnVisible = () => {\n if (isElementVisible(this.img)) {\n this.updateImageSize();\n this.clearSizeOnVisibleTimer();\n }\n };\n this.sizeOnVisibleTimer = window.setInterval(updateSizeOnVisible, 200);\n }\n\n private clearSizeOnVisibleTimer() {\n if (this.sizeOnVisibleTimer) {\n clearInterval(this.sizeOnVisibleTimer);\n this.sizeOnVisibleTimer = undefined;\n }\n }\n\n // attach resize UI if appropriate\n private attachResizeUI() {\n if (this.imageAttributes && !this.imgBroken && isResizeUICompatible(this.img!)) {\n const imageNode = () => ({ pos: this.getPos(), node: this.node });\n const imgContainerWidth = () => this.containerWidth();\n this.resizeUI = attachResizeUI(imageNode, this.dom, this.img!, imgContainerWidth, \n this.view, this.editorUI, this.editorFormat);\n }\n }\n\n private detachResizeUI() {\n if (this.resizeUI) {\n this.resizeUI.detach();\n this.resizeUI = null;\n }\n }\n\n private isNodeSelected() {\n return this.dom.classList.contains('ProseMirror-selectednode');\n }\n\n private isFigure() {\n return this.type === ImageType.Figure;\n }\n\n private containerWidth() {\n return imageContainerWidth(this.getPos(), this.view);\n }\n\n private manageFigcaption() {\n // hide the figcaption if appropriate\n const noImplicitFigures = !this.implicitFigures;\n const emptyFigcaption = this.figcaption && this.node.textContent.length === 0;\n const selection = this.view.state.selection;\n const selectionInFigcaption = selection.empty && selection.$head.node() === this.node;\n const hide = noImplicitFigures || (emptyFigcaption && !selectionInFigcaption);\n\n // hide or show if we have a figcaption\n if (this.figcaption) {\n if (noImplicitFigures) {\n this.figcaption.style.display = 'none';\n this.figcaption.contentEditable = 'false';\n } else {\n this.figcaption.contentEditable = hide ? 'false' : 'true';\n this.figcaption.style.height = hide ? '0' : '';\n this.figcaption.style.minHeight = hide ? '0' : '';\n this.figcaption.style.margin = hide ? '0' : '';\n }\n }\n }\n}\n","/*\n * image-resize.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView } from 'prosemirror-view';\nimport { NodeWithPos } from 'prosemirror-utils';\nimport { NodeSelection } from 'prosemirror-state';\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport {\n createPopup,\n createHorizontalPanel,\n addHorizontalPanelCell,\n createInputLabel,\n createImageButton,\n createCheckboxInput,\n createSelectInput,\n createTextInput,\n} from '../../api/widgets/widgets';\nimport { EditorUI } from '../../api/ui';\nimport { editingRootScrollContainerElement } from '../../api/node';\nimport { extractSizeStyles, kPercentUnit, kPixelUnit, removeStyleAttrib } from '../../api/css';\nimport {\n imageSizePropWithUnit,\n isNaturalAspectRatio,\n unitToPixels,\n pixelsToUnit,\n roundUnit,\n kValidUnits,\n isValidImageSizeUnit,\n} from '../../api/image';\nimport { kWidthAttrib, kHeightAttrib, kStyleAttrib, kAlignAttrib, kFigAlignAttrib, pandocAttrGetKeyvalue } from '../../api/pandoc_attr';\nimport { EditorUIImages } from '../../api/ui-images';\nimport { EditorFormat } from '../../api/format';\n\nimport { imageDialog } from './image-dialog';\nimport { hasPercentWidth, imageDimensionsFromImg } from './image-util';\n\nconst kDataWidth = 'data-width';\nconst kDataHeight = 'data-height';\n\nconst kDefaultContainerDisplay = 'inline-block';\n\nexport function initResizeContainer(container: HTMLElement) {\n // add standard parent class\n container.classList.add('pm-image-resize-container', 'pm-selected-node-outline-color');\n\n // so that we are the offsetParent for the resize handles and shelf\n container.style.position = 'relative';\n\n // so that the container matches the size of the contained image\n container.style.display = kDefaultContainerDisplay;\n\n // so that the handles and shelf can be visible outside the boundaries of the image\n container.style.overflow = 'visible';\n\n // return for convenience\n return container;\n}\n\nexport function isResizeUICompatible(img: HTMLImageElement) {\n // incompatible if it has a width, but not a data-width\n const incompatibleWidth = img.style.width && !img.hasAttribute(kDataWidth);\n\n // incompatible if it has a height, but not a data-height\n const incompatibleHeight = img.style.height && img.style.height !== 'auto' && !img.hasAttribute(kDataHeight);\n\n return !incompatibleWidth && !incompatibleHeight;\n}\n\nexport interface ResizeUI {\n update: () => void;\n detach: () => void;\n}\n\nexport function attachResizeUI(\n imageNode: () => NodeWithPos,\n container: HTMLElement,\n img: HTMLImageElement,\n imgContainerWidth: () => number,\n view: EditorView,\n ui: EditorUI,\n format: EditorFormat\n): ResizeUI {\n // indicate that resize ui is active\n container.classList.add('pm-image-resize-active');\n\n // sync current state of shelf to node\n const updateImageNodeFromShelf = () => {\n updateImageNodeSize(\n view,\n imageNode(),\n img,\n imgContainerWidth,\n shelf.props.width(),\n shelf.props.height(),\n shelf.props.units(),\n );\n };\n\n // shelf init\n const onInitShelf = () => {\n // sync props\n shelf.sync();\n\n // default for lockRatio based on naturalWidth/naturalHeight\n const dims = imageDimensionsFromImg(img, imgContainerWidth());\n shelf.props.setLockRatio(isNaturalAspectRatio(shelf.props.width(), shelf.props.height(), dims, true));\n };\n\n // handle width changed from shelf\n const onWidthChanged = () => {\n const width = shelf.props.width();\n const height = shelf.props.lockRatio() ? (img.offsetHeight / img.offsetWidth) * width : shelf.props.height();\n shelf.props.setHeight(height);\n updateImageNodeFromShelf();\n };\n\n // handle height changed from shelf\n const onHeightChanged = () => {\n const height = shelf.props.height();\n const width = shelf.props.lockRatio() ? (img.offsetWidth / img.offsetHeight) * height : shelf.props.width();\n shelf.props.setWidth(width);\n updateImageNodeFromShelf();\n };\n\n // do necessary unit conversion when the units change\n const onUnitsChanged = () => {\n const prevUnits = shelfSizeFromImage(img).unit;\n const containerWidth = imgContainerWidth();\n\n const width = shelf.props.width();\n const widthPixels = unitToPixels(width, prevUnits, containerWidth);\n let widthInUnits = pixelsToUnit(widthPixels, shelf.props.units(), containerWidth);\n if (hasPercentWidth(shelf.props.units()) && widthInUnits > 100) {\n widthInUnits = 100;\n }\n shelf.props.setWidth(widthInUnits);\n\n const height = shelf.props.height();\n const heightPixels = unitToPixels(height, prevUnits, containerWidth);\n shelf.props.setHeight(pixelsToUnit(heightPixels, shelf.props.units(), containerWidth));\n\n updateImageNodeFromShelf();\n };\n\n // handle editImage request from shelf\n const onEditImage = () => {\n const nodeWithPos = imageNode();\n imageDialog(\n nodeWithPos.node,\n imageDimensionsFromImg(img, imgContainerWidth()),\n nodeWithPos.node.type,\n view,\n ui,\n format,\n true,\n );\n };\n\n // create resize shelf\n const shelf = resizeShelf(\n view,\n container,\n img,\n onInitShelf,\n onWidthChanged,\n onHeightChanged,\n onUnitsChanged,\n onEditImage,\n ui.images,\n ui.context.translateText,\n );\n\n // create resize handle and add it to the container\n const handle = resizeHandle(\n img,\n imageNode,\n container,\n imgContainerWidth,\n shelf.props.lockRatio,\n shelf.props.units,\n shelf.sync,\n updateImageNodeFromShelf,\n );\n container.append(handle);\n\n // return functions that can be used to update and detach the ui\n return {\n update: () => {\n shelf.sync();\n },\n detach: () => {\n container.classList.remove('pm-image-resize-active');\n handle.remove();\n shelf.remove();\n },\n };\n}\n\nfunction resizeShelf(\n view: EditorView,\n container: HTMLElement,\n img: HTMLImageElement,\n onInit: () => void,\n onWidthChanged: () => void,\n onHeightChanged: () => void,\n onUnitsChanged: () => void,\n onEditImage: () => void,\n uiImages: EditorUIImages,\n translateText: (text: string) => string,\n) {\n // create resize shelf\n const shelf = createPopup(view, []);\n\n // add the shelf to the editor container (so we don't mutate the editor dom)\n const editorContainer = view.dom.parentNode as HTMLElement;\n editorContainer.appendChild(shelf);\n\n // update shelf absolute position to make sure it's visible\n const updatePosition = () => {\n const kShelfRequiredSize = 333;\n const editorBox = editorContainer.getBoundingClientRect();\n const imageBox = container.getBoundingClientRect();\n shelf.style.top = imageBox.top - editorBox.top + imageBox.height + 6 + 'px';\n const positionLeft = imageBox.left + kShelfRequiredSize < editorBox.right;\n if (positionLeft) {\n shelf.style.right = '';\n shelf.style.left = imageBox.left - editorBox.left + 'px';\n } else {\n shelf.style.left = '';\n shelf.style.right = editorBox.right - imageBox.right + 'px';\n }\n };\n\n // detect when the editing root note scrolls and update the position\n const editingScrollContainerEl = editingRootScrollContainerElement(view);\n if (editingScrollContainerEl) {\n editingScrollContainerEl.addEventListener('scroll', updatePosition);\n }\n\n // update position every 50ms (cleanup drag/drop copy/paste mispositioning)\n const positionTimer = setInterval(updatePosition, 50);\n\n // main panel that holds the controls\n const panel = createHorizontalPanel();\n shelf.append(panel);\n const addToPanel = (widget: HTMLElement, paddingRight: number) => {\n addHorizontalPanelCell(panel, widget);\n if (paddingRight) {\n const paddingSpan = window.document.createElement('span');\n paddingSpan.style.width = paddingRight + kPixelUnit;\n addHorizontalPanelCell(panel, paddingSpan);\n }\n };\n\n // width\n const inputClasses = ['pm-text-color', 'pm-background-color'];\n const wLabel = createInputLabel('w:');\n addToPanel(wLabel, 4);\n const wInput = createTextInput(4, inputClasses);\n wInput.onchange = onWidthChanged;\n addToPanel(wInput, 8);\n\n // height\n const kHeightWidth = '38px';\n const hLabel = createInputLabel('h:');\n addToPanel(hLabel, 4);\n const hInput = createTextInput(4, inputClasses, { width: kHeightWidth });\n hInput.onchange = onHeightChanged;\n addToPanel(hInput, 0);\n const hAutoLabel = createInputLabel('(auto)', ['pm-light-text-color'], { width: kHeightWidth });\n addToPanel(hAutoLabel, 10);\n\n // units\n const unitsSelect = createSelectInput(kValidUnits, inputClasses);\n unitsSelect.onchange = () => {\n // drive focus to width and back to prevent wierd selection change\n // detection condition that causes PM to re-render the node the\n // next time we resize it\n wInput.focus();\n unitsSelect.focus();\n\n // manage UI\n manageUnitsUI();\n\n // notify client\n onUnitsChanged();\n };\n addToPanel(unitsSelect, 12);\n\n // lock ratio\n const checkboxWrapper = window.document.createElement('div');\n const lockCheckbox = createCheckboxInput();\n lockCheckbox.checked = true;\n checkboxWrapper.append(lockCheckbox);\n addToPanel(checkboxWrapper, 4);\n const lockLabel = createInputLabel(translateText('Lock ratio'));\n addToPanel(lockLabel, 20);\n\n // edit button\n const editImage = createImageButton(\n uiImages.properties!,\n ['pm-image-button-edit-properties'],\n translateText('Edit Attributes'),\n );\n editImage.onclick = onEditImage;\n addHorizontalPanelCell(panel, editImage);\n\n // run onInit (wait for image to load if necessary)\n if (img.complete) {\n setTimeout(onInit, 0);\n } else {\n img.onload = onInit;\n }\n\n // function used to manage units ui (percent vs. non-percent)\n const manageUnitsUI = () => {\n const percentSizing = unitsSelect.value === kPercentUnit;\n\n if (percentSizing) {\n lockCheckbox.checked = true;\n lockCheckbox.disabled = true;\n } else {\n lockCheckbox.disabled = false;\n }\n\n hInput.style.display = percentSizing ? 'none' : '';\n hAutoLabel.style.display = percentSizing ? '' : 'none';\n };\n manageUnitsUI();\n\n // helper function to get a dimension (returns null if input not currently valid)\n const getDim = (input: HTMLInputElement) => {\n const value = parseFloat(input.value);\n if (isNaN(value)) {\n return null;\n }\n if (value > 0) {\n return value;\n } else {\n return null;\n }\n };\n\n const setWidth = (width: number) => {\n wInput.value = roundUnit(width, unitsSelect.value);\n };\n const setHeight = (height: number) => {\n hInput.value = roundUnit(height, unitsSelect.value);\n };\n\n return {\n // shelf element\n el: shelf,\n\n // sync the shelf props to the current size/units of the image\n // we don't sync to the node b/c we want to benefit from automatic\n // unit handling in the conversion to the DOM\n sync: () => {\n const size = shelfSizeFromImage(img);\n unitsSelect.value = size.unit;\n setWidth(size.width);\n setHeight(size.height);\n\n // manage units ui\n manageUnitsUI();\n\n // ensure we are positioned correctly (not offscreen, wide enough, etc.)\n updatePosition();\n },\n\n position: () => {\n updatePosition();\n },\n\n remove: () => {\n if (editingScrollContainerEl) {\n editingScrollContainerEl.removeEventListener('scroll', updatePosition);\n }\n clearInterval(positionTimer);\n shelf.remove();\n },\n\n props: {\n width: () => getDim(wInput) || shelfSizeFromImage(img).width,\n setWidth,\n height: () => getDim(hInput) || shelfSizeFromImage(img).height,\n setHeight,\n units: () => unitsSelect.value,\n setUnits: (units: string) => (unitsSelect.value = units),\n lockRatio: () => lockCheckbox.checked,\n setLockRatio: (lock: boolean) => {\n if (!lockCheckbox.disabled) {\n lockCheckbox.checked = lock;\n }\n },\n },\n };\n}\n\nfunction resizeHandle(\n img: HTMLImageElement,\n imageNode: () => NodeWithPos,\n container: HTMLElement,\n imgContainerWidth: () => number,\n lockRatio: () => boolean,\n units: () => string,\n onSizing: () => void,\n onSizingComplete: () => void,\n) {\n const handle = document.createElement('span');\n handle.contentEditable = 'false';\n handle.classList.add('pm-image-resize-handle', 'pm-background-color', 'pm-selected-node-border-color');\n handle.style.position = 'absolute';\n handle.style.bottom = '-6px';\n handle.style.right = '-6px';\n handle.style.cursor = 'nwse-resize';\n\n const havePointerEvents = !!document.body.setPointerCapture;\n\n const onPointerDown = (ev: MouseEvent) => {\n ev.preventDefault();\n\n const startWidth = img.offsetWidth;\n const startHeight = img.offsetHeight;\n\n const startX = ev.pageX;\n const startY = ev.pageY;\n\n const containerWidth = imgContainerWidth();\n\n const onPointerMove = (e: MouseEvent) => {\n // detect pointer movement\n const movedX = e.pageX - startX;\n const movedY = e.pageY - startY;\n\n let width;\n let height;\n if (lockRatio()) {\n if (movedX >= movedY) {\n width = startWidth + movedX;\n height = startHeight + movedX * (startHeight / startWidth);\n } else {\n height = startHeight + movedY;\n width = startWidth + movedY * (startWidth / startHeight);\n }\n } else {\n width = startWidth + movedX;\n height = startHeight + movedY;\n }\n\n // determine the new width in units. If it's percent and > 100 then clip\n const widthInUnits = pixelsToUnit(width, units(), containerWidth);\n if (hasPercentWidth(units()) && widthInUnits > 100) {\n width = containerWidth;\n height = width * (startHeight / startWidth);\n }\n\n // set margins for any alignment we have\n const align = pandocAttrGetKeyvalue(imageNode().node.attrs, kFigAlignAttrib);\n if (align) {\n setMarginsForAlignment(container, align, width, containerWidth);\n }\n\n img.style.width = width + kPixelUnit;\n img.setAttribute(kDataWidth, pixelsToUnit(width, units(), containerWidth) + units());\n img.style.height = height + kPixelUnit;\n img.setAttribute(kDataHeight, pixelsToUnit(height, units(), containerWidth) + units());\n\n onSizing();\n };\n\n const onPointerUp = (e: MouseEvent) => {\n e.preventDefault();\n\n // stop listening to events\n if (havePointerEvents) {\n handle.releasePointerCapture((e as PointerEvent).pointerId);\n handle.removeEventListener('pointermove', onPointerMove);\n handle.removeEventListener('pointerup', onPointerUp);\n } else {\n document.removeEventListener('mousemove', onPointerMove);\n document.removeEventListener('mouseup', onPointerUp);\n }\n\n // update image size\n onSizingComplete();\n };\n\n if (havePointerEvents) {\n handle.setPointerCapture((ev as PointerEvent).pointerId);\n handle.addEventListener('pointermove', onPointerMove);\n handle.addEventListener('pointerup', onPointerUp);\n } else {\n document.addEventListener('mousemove', onPointerMove);\n document.addEventListener('mouseup', onPointerUp);\n }\n };\n\n if (havePointerEvents) {\n handle.addEventListener('pointerdown', onPointerDown);\n } else {\n handle.addEventListener('mousedown', onPointerDown);\n }\n\n return handle;\n}\n\n// derive the shelf size attributes from the image. takes advantage of any data-width\n// or data-height attributes, then falls back to actual offsetWidth/offsetHeight\n// as necessary\nfunction shelfSizeFromImage(img: HTMLImageElement) {\n // get attributes\n const width = img.getAttribute(kDataWidth);\n const height = img.getAttribute(kDataHeight);\n\n // if there is no width and no height, then use naturalWidth/naturalHeight\n if (!width && !height) {\n return {\n width: img.naturalWidth || img.offsetWidth,\n height: img.naturalHeight || img.offsetHeight,\n unit: kPixelUnit,\n };\n\n // read units\n } else {\n let widthWithUnit = imageSizePropWithUnit(width);\n let heightWithUnit = imageSizePropWithUnit(height);\n\n if (!widthWithUnit) {\n widthWithUnit = {\n size: heightWithUnit!.size * (img.offsetWidth / img.offsetHeight),\n unit: heightWithUnit!.unit,\n };\n }\n\n if (!heightWithUnit) {\n heightWithUnit = {\n size: widthWithUnit.size * (img.offsetHeight / img.offsetWidth),\n unit: widthWithUnit.unit,\n };\n }\n\n return {\n width: widthWithUnit.size,\n height: heightWithUnit.size,\n unit: widthWithUnit.unit,\n };\n }\n}\n\nfunction updateImageNodeSize(\n view: EditorView,\n image: NodeWithPos,\n img: HTMLImageElement,\n imgContainerWidth: () => number,\n width: number,\n height: number,\n unit: string,\n) {\n // don't write pixels explicitly\n unit = unit === kPixelUnit ? '' : unit;\n\n // edit width & height in keyvalue\n let keyvalue = extractSizeStyles(image.node.attrs.keyvalue as Array<[string, string]>)!;\n keyvalue = keyvalue.filter(value => ![kWidthAttrib, kHeightAttrib].includes(value[0]));\n keyvalue.push([kWidthAttrib, width + unit]);\n const dims = imageDimensionsFromImg(img, imgContainerWidth());\n if (!hasPercentWidth(width + unit) && !isNaturalAspectRatio(width, height, dims, false)) {\n keyvalue.push([kHeightAttrib, height + unit]);\n }\n\n // create transaction\n const tr = view.state.tr;\n\n // set new attributes\n tr.setNodeMarkup(image.pos, image.node.type, { ...image.node.attrs, keyvalue });\n\n // restore node selection if our tr.setNodeMarkup blew away the selection\n const prevState = view.state;\n if (prevState.selection instanceof NodeSelection && prevState.selection.from === image.pos) {\n tr.setSelection(NodeSelection.create(tr.doc, image.pos));\n }\n\n // dispatch transaction\n view.dispatch(tr);\n}\n\n// update the DOM representation of the image. extracts size-oriented attributes from the node and\n// applies them to the img element (alignment oriented attributes are applied to the figure elmenet)\nexport function updateImageViewSize(\n node: ProsemirrorNode,\n img: HTMLImageElement,\n figure: HTMLElement | null,\n containerWidth: number,\n) {\n // reset attributes (they'll be set to new values below)\n img.removeAttribute(kStyleAttrib);\n img.removeAttribute(kDataWidth);\n img.removeAttribute(kDataHeight);\n\n // reset figure styles (only reset styles that we explicitly set below, b/c some\n // styles may have been set by e.g. the attachResizeUI function)\n if (figure) {\n figure.style.cssFloat = '';\n figure.style.verticalAlign = '';\n figure.style.margin = '';\n figure.style.marginTop = '';\n figure.style.marginBottom = '';\n figure.style.marginRight = '';\n figure.style.marginLeft = '';\n figure.style.padding = '';\n figure.style.paddingTop = '';\n figure.style.paddingBottom = '';\n figure.style.paddingRight = '';\n figure.style.paddingLeft = '';\n figure.style.display = kDefaultContainerDisplay;\n }\n\n // apply keyvalue attribute to image\n if (node.attrs.keyvalue) {\n // factor width & height out of style\n const keyvalue = extractSizeStyles(node.attrs.keyvalue);\n\n // inspect all keys and process width, height, and style\n (keyvalue as Array<[string, string]>).forEach(attr => {\n // alias key and value\n const key = attr[0];\n let value = attr[1];\n\n // set align oriented styles on figure parent\n if (key === kStyleAttrib) {\n if (figure) {\n const liftStyle = (attrib: string, val: string) => figure.style.setProperty(attrib, val);\n value = removeStyleAttrib(value, 'float', liftStyle);\n value = removeStyleAttrib(value, 'vertical-align', liftStyle);\n value = removeStyleAttrib(value, 'padding(?:[\\\\w\\\\-])*', liftStyle);\n removeStyleAttrib(value, 'display', liftStyle); // leave display for lifting by image\n }\n\n // apply selected other styles to the image view (we don't just forward the entire\n // style attribute b/c that would interfere with setting of style props in the\n // width and height cases below). here we should enumerate all styles we think\n // users might want to see in the editor\n const liftImgStyle = (attrib: string, val: string) => img.style.setProperty(attrib, val);\n value = removeStyleAttrib(value, 'border(?:[\\\\w\\\\-])*', liftImgStyle);\n value = removeStyleAttrib(value, 'margin(?:[\\\\w\\\\-])*', liftImgStyle);\n value = removeStyleAttrib(value, 'display', liftImgStyle);\n } else if (key === kWidthAttrib) {\n // see if this is a unit we can edit\n const widthProp = imageSizePropWithUnit(value);\n if (widthProp) {\n widthProp.unit = widthProp.unit || kPixelUnit;\n if (isValidImageSizeUnit(widthProp.unit)) {\n img.setAttribute(kDataWidth, widthProp.size + widthProp.unit);\n img.style.width = unitToPixels(widthProp.size, widthProp.unit, containerWidth) + kPixelUnit;\n }\n }\n\n // if not, just pass it straight through (editing UI will be disabled)\n if (!img.hasAttribute(kDataWidth)) {\n img.style.width = value;\n }\n } else if (key === kHeightAttrib) {\n // see if this is a unit we can edit\n const heightProp = imageSizePropWithUnit(value);\n if (heightProp) {\n heightProp.unit = heightProp.unit || kPixelUnit;\n if (isValidImageSizeUnit(heightProp.unit)) {\n img.setAttribute(kDataHeight, heightProp.size + heightProp.unit);\n img.style.height = unitToPixels(heightProp.size, heightProp.unit, containerWidth) + kPixelUnit;\n }\n }\n\n // if not, just pass it straight through (editing UI will be disabled)\n if (!img.hasAttribute(kDataHeight)) {\n img.style.height = value;\n }\n\n // use of legacy 'align' attribute is common for some pandoc users\n // so we convert it to the requisite CSS and apply it to the figure container\n } else if (figure && key === kAlignAttrib) {\n switch (value) {\n case 'left':\n case 'right':\n figure.style.cssFloat = value;\n break;\n case 'top':\n case 'bottom':\n case 'middle':\n figure.style.verticalAlign = value;\n break;\n }\n }\n });\n\n // if we have a fig-align value then determine the displayed width and\n // apply margins as required to the figure\n if (figure) {\n const align = pandocAttrGetKeyvalue(node.attrs, kFigAlignAttrib);\n if (align && (align !== \"default\")) {\n let width: number | null = null;\n const widthProp = imageSizePropWithUnit(img.style.width);\n if (widthProp) {\n width = widthProp.size;\n } else {\n const dims = imageDimensionsFromImg(img, containerWidth);\n width = dims.naturalWidth;\n }\n if (width !== null) {\n setMarginsForAlignment(figure, align, width, containerWidth);\n }\n }\n }\n \n // if width is a percentage, then displayed height needs to be 'auto'\n if (hasPercentWidth(img.getAttribute(kDataWidth))) {\n img.style.height = 'auto';\n }\n }\n}\n\n\nfunction setMarginsForAlignment(el: HTMLElement, align: string, width: number, containerWidth: number) {\n const marginWidth = containerWidth - width;\n if (marginWidth > 0) {\n if (align === \"left\") {\n el.style.marginRight = marginWidth + kPixelUnit;\n } else if (align === \"right\") {\n el.style.marginLeft = marginWidth + kPixelUnit;\n } else if (align === \"center\") {\n el.style.marginLeft = (marginWidth/2) + kPixelUnit;\n el.style.marginRight = el.style.marginLeft ;\n }\n } else {\n el.style.marginLeft = \"\";\n el.style.marginRight = \"\" ;\n }\n}","/*\n * widgets.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView } from 'prosemirror-view';\n\nimport { applyStyles } from '../css';\n\nimport './widgets.css';\n\nexport function createHorizontalPanel() {\n const div = window.document.createElement('div');\n div.classList.add('pm-horizontal-panel');\n return div;\n}\n\nexport function addHorizontalPanelCell(panel: HTMLDivElement, el: HTMLElement) {\n el.classList.add('pm-horizontal-panel-cell');\n panel.append(el);\n}\n\nexport function createPopup(\n view: EditorView,\n classes: string[],\n onDestroyed?: () => void,\n style?: { [key: string]: string },\n) {\n // create popup\n const popup = window.document.createElement('span');\n popup.contentEditable = 'false';\n popup.classList.add(\n 'pm-popup',\n 'pm-text-color',\n 'pm-proportional-font',\n 'pm-pane-border-color',\n 'pm-background-color',\n );\n popup.style.position = 'absolute';\n popup.style.zIndex = '10';\n applyStyles(popup, classes, style);\n\n // create mutation observer that watches for destruction\n if (onDestroyed) {\n const observer = new MutationObserver(mutationsList => {\n mutationsList.forEach(mutation => {\n mutation.removedNodes.forEach(node => {\n if (node === popup) {\n observer.disconnect();\n onDestroyed();\n }\n });\n });\n });\n observer.observe(view.dom, { attributes: false, childList: true, subtree: true });\n }\n\n return popup;\n}\n\nexport function createImageButton(image: string, classes: string[], title: string, style?: { [key: string]: string }) {\n const button = window.document.createElement('button');\n button.classList.add('pm-image-button');\n button.title = title;\n applyStyles(button, classes, style);\n const imageEl = window.document.createElement('img') as HTMLImageElement;\n imageEl.src = image;\n imageEl.setAttribute('draggable', 'false');\n button.append(imageEl);\n return button;\n}\n\nexport function createInputLabel(text: string, classes?: string[], style?: { [key: string]: string }) {\n const label = window.document.createElement('label');\n label.innerText = text;\n label.classList.add('pm-input-label');\n applyStyles(label, classes, style);\n return label;\n}\n\nexport function createSelectInput(options: string[], classes?: string[], style?: { [key: string]: string }) {\n const select = window.document.createElement('select');\n appendOptions(select, options);\n select.classList.add('pm-input-select');\n select.classList.add('pm-pane-border-color');\n applyStyles(select, classes, style);\n return select;\n}\n\nfunction appendOptions(container: HTMLElement, options: string[]) {\n options.forEach(option => {\n const optionEl = window.document.createElement('option');\n optionEl.value = option;\n optionEl.textContent = option;\n container.append(optionEl);\n });\n}\n\nexport function createCheckboxInput(classes?: string[], style?: { [key: string]: string }) {\n const input = window.document.createElement('input');\n input.classList.add('pm-input-checkbox');\n input.type = 'checkbox';\n applyStyles(input, classes, style);\n return input;\n}\n\nexport function createTextInput(widthChars: number, classes?: string[], style?: { [key: string]: string }) {\n const input = document.createElement('input');\n input.type = 'text';\n input.classList.add('pm-input-text');\n input.classList.add('pm-pane-border-color');\n applyStyles(input, classes, style);\n input.style.width = widthChars + 'ch';\n return input;\n}\n","/*\n * figure-keys.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { EditorState, Transaction, NodeSelection, Selection, TextSelection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport {\n findParentNodeOfTypeClosestToPos,\n findSelectedNodeOfType,\n setTextSelection,\n ContentNodeWithPos,\n findParentNodeOfType,\n findParentNodeClosestToPos,\n} from 'prosemirror-utils';\n\nimport { BaseKey, verticalArrowCanAdvanceWithinTextBlock } from '../../api/basekeys';\nimport { exitNode } from '../../api/command';\n\nexport function figureKeys(schema: Schema) {\n return [\n { key: BaseKey.Enter, command: exitNode(schema.nodes.figure, -1, false) },\n { key: BaseKey.Backspace, command: backspaceHandler() },\n { key: BaseKey.ArrowLeft, command: arrowHandler('left') },\n { key: BaseKey.ArrowRight, command: arrowHandler('right') },\n { key: BaseKey.ArrowUp, command: arrowHandler('up') },\n { key: BaseKey.ArrowDown, command: arrowHandler('down') },\n ];\n}\n\nfunction backspaceHandler() {\n return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n // must be an empty selection\n const selection = state.selection;\n if (!selection.empty) {\n return false;\n }\n\n // must be a selection at the beginning of it's parent\n const schema = state.schema;\n const { $head } = state.selection;\n const { parentOffset } = $head;\n if (parentOffset !== 0) {\n return false;\n }\n\n // two scenarios: backspace within empty caption or backspace right after figure\n const isWithinEmptyCaption = $head.parent.type === schema.nodes.figure && $head.parent.childCount === 0;\n if (isWithinEmptyCaption) {\n if (dispatch) {\n // set a node selection for the figure\n const tr = state.tr;\n tr.setSelection(NodeSelection.create(tr.doc, $head.pos - 1));\n dispatch(tr);\n }\n return true;\n } else {\n // check if the previous node is a figure\n const parent = $head.node($head.depth - 1);\n const parentIndex = $head.index($head.depth - 1);\n if (parentIndex > 0) {\n const previousNode = parent.child(parentIndex - 1);\n if (previousNode.type === schema.nodes.figure) {\n if (dispatch) {\n const tr = state.tr;\n\n // if the current node is and empty textblock then remove it\n if ($head.node().childCount === 0) {\n const parentTextBlock = findParentNodeClosestToPos($head, node => node.isTextblock);\n if (parentTextBlock) {\n tr.deleteRange(parentTextBlock.pos, parentTextBlock.pos + parentTextBlock.node.nodeSize);\n }\n }\n\n const nodePos = $head.pos - previousNode.nodeSize - 1;\n const figureSelection = NodeSelection.create(tr.doc, nodePos);\n tr.setSelection(figureSelection);\n dispatch(tr);\n }\n return true;\n }\n }\n }\n\n return false;\n };\n}\n\nfunction arrowHandler(dir: 'up' | 'down' | 'left' | 'right') {\n return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n // select figure\n const selectFigure = (figure: ContentNodeWithPos) => {\n if (dispatch) {\n const tr = state.tr;\n const figureSelection = NodeSelection.create(state.doc, figure.pos);\n tr.setSelection(figureSelection).scrollIntoView();\n dispatch(tr);\n }\n };\n\n // select figure caption\n const selectFigureCaption = (figure: ContentNodeWithPos, atEnd = false) => {\n if (dispatch) {\n const tr = state.tr;\n setTextSelection(figure.pos + (atEnd ? figure.node.textContent.length + 1 : 0), 1)(tr);\n dispatch(tr);\n }\n };\n\n // alias schema and selection\n const { schema, selection } = state;\n\n // down/right arrow for node selection w/ caption drives cursor into caption\n if (\n (dir === 'down' || dir === 'right') &&\n selection instanceof NodeSelection &&\n selection.node.type === schema.nodes.figure\n ) {\n const figure = findSelectedNodeOfType(schema.nodes.figure)(selection);\n if (figure && figure.node.childCount > 0) {\n selectFigureCaption(figure);\n return true;\n }\n }\n\n // up/left arrow for selection in caption takes us back to the node selection\n if (\n (dir === 'up' || dir === 'left') &&\n selection instanceof TextSelection &&\n !!findParentNodeOfType(schema.nodes.figure)(selection)\n ) {\n if (dir === 'up' || (dir === 'left' && selection.$head.parentOffset === 0)) {\n const figure = findParentNodeOfType(schema.nodes.figure)(selection);\n if (figure) {\n selectFigure(figure);\n return true;\n }\n }\n\n // normal node traversal\n } else if (selection.empty && view && view.endOfTextblock(dir)) {\n // compute side offset\n const side = dir === 'left' || dir === 'up' ? -1 : 1;\n\n // get selection head\n const { $head } = selection;\n\n // see if this would traverse our type\n const nextPos = Selection.near(state.doc.resolve(side > 0 ? $head.after() : $head.before()), side);\n if (nextPos.$head) {\n const figure = findParentNodeOfTypeClosestToPos(nextPos.$head, schema.nodes.figure);\n if (figure) {\n // check for e.g. math where you can advance across embedded newlines\n if ((dir === 'up' || dir === 'down') && verticalArrowCanAdvanceWithinTextBlock(state.selection, dir)) {\n return false;\n }\n // arrowing back into a figure with a caption selects the caption\n if (side === -1 && figure.node.childCount > 0) {\n selectFigureCaption(figure, dir === 'left');\n // otherwise select the figure\n } else {\n selectFigure(figure);\n }\n return true;\n }\n }\n }\n\n // not handled\n return false;\n };\n}\n","/*\n * image-events.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView } from 'prosemirror-view';\n\nimport { Plugin, PluginKey } from 'prosemirror-state';\nimport { EditorUI } from '../../api/ui';\n\nconst kTextUriList = 'text/uri-list';\nconst kApplicationQtImage = 'application/x-qt-image';\n\nconst pluginKey = new PluginKey('image-events');\n\nexport function imageEventsPlugin(ui: EditorUI) {\n return new Plugin({\n key: pluginKey,\n props: {\n handleDOMEvents: {\n drop: imageDrop(ui),\n },\n handlePaste: imagePaste(ui),\n },\n });\n}\n\nfunction imagePaste(ui: EditorUI) {\n return (view: EditorView, event: Event) => {\n const clipboardEvent = event as ClipboardEvent;\n\n if (clipboardEvent.clipboardData) {\n // detect file pastes where there is no payload, in that case check to see\n // if there is clipboard data we can get from our context (e.g. from Qt)\n if (clipboardEvent.clipboardData.types.includes(kTextUriList)) {\n const uriList = clipboardEvent.clipboardData.getData(kTextUriList);\n if (uriList.length === 0) {\n ui.context.clipboardUris().then(uris => {\n if (uris) {\n handleImageUris(view, view.state.selection.from, event, uris, ui);\n }\n });\n event.preventDefault();\n return true;\n }\n // raw image paste (e.g. from an office doc)\n } else if (clipboardEvent.clipboardData.types.includes('application/x-qt-image')) {\n\n // don't process excel sheets (we want to use their html representation)\n const kTextHtml = \"text/html\";\n if (clipboardEvent.clipboardData.types.includes(kTextHtml) &&\n clipboardEvent.clipboardData.getData(kTextHtml).includes(\"content=Excel.Sheet\")) {\n return false;\n }\n \n ui.context.clipboardImage().then(image => {\n if (image) {\n handleImageUris(view, view.state.selection.from, event, [image], ui);\n }\n });\n event.preventDefault();\n return true;\n }\n }\n\n return false;\n };\n}\n\nfunction imageDrop(ui: EditorUI) {\n return (view: EditorView, event: Event) => {\n // alias to drag event so typescript knows about event.dataTransfer\n const dragEvent = event as DragEvent;\n\n // ensure we have data transfer\n if (!dragEvent.dataTransfer) {\n return false;\n }\n\n // ensure the drop coordinates map to an editor position\n const coordinates = view.posAtCoords({\n left: dragEvent.clientX,\n top: dragEvent.clientY,\n });\n if (!coordinates) {\n return false;\n }\n\n // array of uris\n let uris: string[] | null = null;\n\n // see if this is a drag of uris\n const uriList = dragEvent.dataTransfer.getData(kTextUriList);\n if (uriList) {\n uris = uriList.split('\\r?\\n');\n } else {\n // see if the ui context has some dropped uris\n uris = ui.context.droppedUris();\n }\n\n // process uris if we have them\n if (uris && handleImageUris(view, coordinates.pos, event, uris, ui)) {\n event.preventDefault();\n return true;\n } else {\n return false;\n }\n };\n}\n\nfunction handleImageUris(view: EditorView, pos: number, event: Event, uris: string[], ui: EditorUI): boolean {\n // filter out images\n const imageUris = uris.filter(uri => {\n // get extension and check it it's an image\n // https://developer.mozilla.org/en-US/docs/Web/Media/Formats/Image_types#Common_image_file_types\n const kImageExtensions = [\n 'apng',\n 'bmp',\n 'gif',\n 'ico',\n 'cur',\n 'jpg',\n 'jpeg',\n 'jfif',\n 'pjpeg',\n 'pjp',\n 'png',\n 'svg',\n 'tif',\n 'tiff',\n 'webp',\n ];\n const extension = uri\n .split(/\\./)\n .pop()!\n .toLowerCase();\n return kImageExtensions.includes(extension);\n });\n\n // exit if we have no image uris\n if (imageUris.length === 0) {\n return false;\n }\n\n // resolve image uris then insert them. note that this is done\n // async so we return true indicating we've handled the drop and\n // then we actually do the insertion once it returns\n ui.context.resolveImageUris(imageUris).then(images => {\n const tr = view.state.tr;\n images.forEach(image => {\n const node = view.state.schema.nodes.image.create({ src: image });\n tr.insert(pos, node);\n });\n view.dispatch(tr);\n });\n\n // indicate that we will handle the event\n return true;\n}\n","/*\n * hr.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, DOMOutputSpec } from 'prosemirror-model';\nimport { InputRule } from 'prosemirror-inputrules';\nimport { findParentNodeOfType } from 'prosemirror-utils';\nimport { EditorState } from 'prosemirror-state';\n\nimport { ProsemirrorCommand, insertNode, EditorCommandId } from '../api/command';\nimport { ExtensionContext } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\nimport { EditorUI } from '../api/ui';\nimport { OmniInsertGroup } from '../api/omni_insert';\n\nimport './hr-styles.css';\n\nconst extension = (context: ExtensionContext) => {\n const { ui } = context;\n\n return {\n nodes: [\n {\n name: 'horizontal_rule',\n spec: {\n group: 'block',\n parseDOM: [{ tag: 'hr' }],\n toDOM(): DOMOutputSpec {\n return ['div', ['hr', { class: 'pm-border-background-color' }]];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.HorizontalRule,\n node: 'horizontal_rule',\n },\n ],\n writer: (output: PandocOutput) => {\n output.writeToken(PandocTokenType.HorizontalRule);\n },\n },\n },\n ],\n\n commands: (schema: Schema) => {\n return [\n new ProsemirrorCommand(\n EditorCommandId.HorizontalRule,\n [],\n insertNode(schema.nodes.horizontal_rule, {}, true),\n hrOmniInsert(ui),\n ),\n ];\n },\n\n inputRules: (_schema: Schema) => {\n return [\n new InputRule(/^\\*{3}$/, (state: EditorState, match: string[], start: number, end: number) => {\n const schema = state.schema;\n const paraNode = findParentNodeOfType(schema.nodes.paragraph)(state.selection);\n if (paraNode && state.selection.$anchor.depth === 2) {\n // only in top-level paragraphs\n return state.tr.replaceRangeWith(start, end, schema.nodes.horizontal_rule.create());\n } else {\n return null;\n }\n }),\n ];\n },\n };\n};\n\nfunction hrOmniInsert(ui: EditorUI) {\n return {\n name: ui.context.translateText('Horizontal Rule'),\n keywords: [\"hr\"],\n description: ui.context.translateText('Line that spans across the page'),\n group: OmniInsertGroup.Content,\n priority: 1,\n image: () =>\n ui.prefs.darkMode() ? ui.images.omni_insert?.horizontal_rule_dark! : ui.images.omni_insert?.horizontal_rule!,\n };\n}\n\nexport default extension;\n","/*\n * hard_break.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { Extension } from '../api/extension';\nimport { BaseKey } from '../api/basekeys';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\n\nconst extension: Extension = {\n nodes: [\n {\n name: 'hard_break',\n spec: {\n inline: true,\n group: 'inline',\n selectable: false,\n parseDOM: [{ tag: 'br' }],\n toDOM() {\n return ['br'];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.LineBreak,\n node: 'hard_break',\n },\n ],\n writer: (output: PandocOutput) => {\n output.writeToken(PandocTokenType.LineBreak);\n },\n },\n },\n ],\n\n baseKeys: (_schema: Schema) => {\n return [\n { key: BaseKey.ModEnter, command: hardBreakCommandFn() },\n { key: BaseKey.ShiftEnter, command: hardBreakCommandFn() },\n ];\n },\n};\n\nexport function hardBreakCommandFn() {\n return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n const br = state.schema.nodes.hard_break;\n if (dispatch) {\n dispatch(state.tr.replaceSelectionWith(br.create()).scrollIntoView());\n }\n return true;\n };\n}\n\nexport default extension;\n","/*\n * null.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Extension } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\n\nimport './null-styles.css';\n\nconst extension: Extension = {\n nodes: [\n {\n name: 'null',\n spec: {\n group: 'block',\n atom: true,\n selectable: false,\n parseDOM: [{ tag: \"div[class*='null-block']\" }],\n toDOM() {\n return ['div', { class: 'null-block' }];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.Null,\n node: 'null',\n },\n ],\n writer: (output: PandocOutput) => {\n output.writeToken(PandocTokenType.Null);\n },\n },\n },\n ],\n};\n\nexport default extension;\n","/*\n * em.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Mark, Fragment } from 'prosemirror-model';\n\nimport { MarkCommand, EditorCommandId } from '../api/command';\nimport { Extension } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\nimport { delimiterMarkInputRule, MarkInputRuleFilter } from '../api/input_rule';\n\nconst extension: Extension = {\n marks: [\n {\n name: 'em',\n spec: {\n group: 'formatting',\n parseDOM: [\n { tag: 'i' },\n { tag: 'em' },\n { style: 'font-weight', getAttrs: (value: string | Node) => (value as string) === 'italic' && null },\n ],\n toDOM() {\n return ['em'];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.Emph,\n mark: 'em',\n },\n ],\n writer: {\n priority: 4,\n write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n output.writeMark(PandocTokenType.Emph, parent);\n },\n },\n },\n },\n ],\n\n commands: (schema: Schema) => {\n return [new MarkCommand(EditorCommandId.Em, ['Mod-i'], schema.marks.em)];\n },\n\n inputRules: (schema: Schema, filter: MarkInputRuleFilter) => {\n return [\n delimiterMarkInputRule('\\\\*', schema.marks.em, filter, '\\\\*-`', true),\n delimiterMarkInputRule('_', schema.marks.em, filter, '\\\\w_`', true),\n ];\n },\n};\n\nexport default extension;\n","/*\n * strong.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Mark, Fragment } from 'prosemirror-model';\n\nimport { MarkCommand, EditorCommandId } from '../api/command';\nimport { Extension } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\nimport { delimiterMarkInputRule, MarkInputRuleFilter } from '../api/input_rule';\n\nconst extension: Extension = {\n marks: [\n {\n name: 'strong',\n spec: {\n group: 'formatting',\n parseDOM: [\n // This works around a Google Docs misbehavior where pasted content will be inexplicably wrapped in `<b>`\n // tags with a font-weight normal.\n {\n tag: 'b',\n getAttrs: (value: string | Node) => (value as HTMLElement).style.fontWeight !== 'normal' && null,\n },\n { tag: 'strong' },\n {\n style: 'font-weight',\n getAttrs: (value: string | Node) => /^(bold(er)?|[5-9]\\d{2,})$/.test(value as string) && null,\n },\n ],\n toDOM() {\n return ['strong'];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.Strong,\n mark: 'strong',\n },\n ],\n writer: {\n priority: 3,\n write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n output.writeMark(PandocTokenType.Strong, parent);\n },\n },\n },\n },\n ],\n\n commands: (schema: Schema) => {\n return [new MarkCommand(EditorCommandId.Strong, ['Mod-b'], schema.marks.strong)];\n },\n\n inputRules: (schema: Schema, filter: MarkInputRuleFilter) => {\n return [\n delimiterMarkInputRule('\\\\*\\\\*', schema.marks.strong, filter, '`', true),\n delimiterMarkInputRule('__', schema.marks.strong, filter, '\\\\w`', true),\n ];\n },\n};\n\nexport default extension;\n","/*\n * code.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Fragment, Mark, Node as ProsemirrorNode, Schema } from 'prosemirror-model';\n\nimport { MarkCommand, EditorCommandId } from '../api/command';\nimport { Extension, ExtensionContext } from '../api/extension';\nimport { pandocAttrSpec, pandocAttrParseDom, pandocAttrToDomAttr, pandocAttrReadAST } from '../api/pandoc_attr';\nimport { PandocToken, PandocOutput, PandocTokenType } from '../api/pandoc';\n\nimport { kCodeText, kCodeAttr } from '../api/code';\nimport { delimiterMarkInputRule, MarkInputRuleFilter } from '../api/input_rule';\n\nconst extension = (context: ExtensionContext): Extension => {\n const { pandocExtensions } = context;\n\n const codeAttrs = pandocExtensions.inline_code_attributes;\n\n return {\n marks: [\n {\n name: 'code',\n noInputRules: true,\n noSpelling: true,\n spec: {\n group: 'formatting',\n attrs: codeAttrs ? pandocAttrSpec : {},\n parseDOM: [\n {\n tag: 'code',\n getAttrs(dom: Node | string) {\n if (codeAttrs) {\n return pandocAttrParseDom(dom as Element, {});\n } else {\n return {};\n }\n },\n },\n ],\n toDOM(mark: Mark) {\n const fontClass = 'pm-code pm-fixedwidth-font pm-chunk-background-color pm-block-border-color';\n const attrs = codeAttrs\n ? pandocAttrToDomAttr({\n ...mark.attrs,\n classes: [...mark.attrs.classes, fontClass],\n })\n : {\n class: fontClass,\n };\n return ['code', attrs];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.Code,\n mark: 'code',\n getText: (tok: PandocToken) => tok.c[kCodeText],\n getAttrs: (tok: PandocToken) => {\n if (codeAttrs) {\n return pandocAttrReadAST(tok, kCodeAttr);\n } else {\n return {};\n }\n },\n },\n ],\n writer: {\n // lowest possible mark priority since it doesn't call writeInlines\n // (so will 'eat' any other marks on the stack)\n priority: 0,\n write: (output: PandocOutput, mark: Mark, parent: Fragment) => {\n // collect code and trim it (pandoc will do this on parse anyway)\n let code = '';\n parent.forEach((node: ProsemirrorNode) => (code = code + node.textContent));\n code = code.trim();\n if (code.length > 0) {\n output.writeToken(PandocTokenType.Code, () => {\n if (codeAttrs) {\n output.writeAttr(mark.attrs.id, mark.attrs.classes, mark.attrs.keyvalue);\n } else {\n output.writeAttr();\n }\n output.write(code);\n });\n }\n },\n },\n },\n },\n ],\n\n commands: (schema: Schema) => {\n return [new MarkCommand(EditorCommandId.Code, ['Mod-d'], schema.marks.code)];\n },\n\n inputRules: (schema: Schema, filter: MarkInputRuleFilter) => {\n return [delimiterMarkInputRule('`', schema.marks.code, filter)];\n },\n };\n};\n\nexport default extension;\n","/*\n * link.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Fragment, Mark, Schema } from 'prosemirror-model';\nimport { PluginKey, Plugin } from 'prosemirror-state';\n\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { PandocToken, PandocOutput, PandocTokenType } from '../../api/pandoc';\nimport {\n pandocAttrSpec,\n pandocAttrParseDom,\n pandocAttrToDomAttr,\n pandocAttrReadAST,\n PandocAttr,\n} from '../../api/pandoc_attr';\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { kLinkTarget, kLinkTargetUrl, kLinkTargetTitle, kLinkAttr, kLinkChildren } from '../../api/link';\nimport { hasShortcutHeadingLinks } from '../../api/pandoc_format';\n\nimport { linkCommand, removeLinkCommand, linkOmniInsert } from './link-command';\nimport { linkInputRules, linkPasteHandler } from './link-auto';\nimport { linkHeadingsPostprocessor, syncHeadingLinksAppendTransaction } from './link-headings';\nimport { linkPopupPlugin } from './link-popup';\n\nimport './link-styles.css';\n\nconst extension = (context: ExtensionContext): Extension => {\n const { pandocExtensions, ui, navigation } = context;\n\n const capabilities = {\n headings: hasShortcutHeadingLinks(pandocExtensions),\n attributes: pandocExtensions.link_attributes,\n text: true,\n };\n const linkAttr = pandocExtensions.link_attributes;\n const autoLink = pandocExtensions.autolink_bare_uris;\n const headingLink = hasShortcutHeadingLinks(pandocExtensions);\n const citations = pandocExtensions.citations;\n\n const excludes = citations ? { excludes: 'cite_id' } : {};\n\n return {\n marks: [\n {\n name: 'link',\n spec: {\n attrs: {\n href: {},\n heading: { default: null },\n title: { default: null },\n ...(linkAttr ? pandocAttrSpec : {}),\n },\n inclusive: false,\n ...excludes,\n parseDOM: [\n {\n tag: 'a[href]',\n getAttrs(dom: Node | string) {\n const el = dom as Element;\n const attrs: { [key: string]: string | null } = {\n href: el.getAttribute('href'),\n title: el.getAttribute('title'),\n heading: el.getAttribute('data-heading'),\n };\n return {\n ...attrs,\n ...(linkAttr ? pandocAttrParseDom(el, attrs) : {}),\n };\n },\n },\n ],\n toDOM(mark: Mark) {\n const linkClasses = 'pm-link pm-link-text-color';\n\n let extraAttr: any = {};\n if (linkAttr) {\n extraAttr = pandocAttrToDomAttr({\n ...mark.attrs,\n classes: [...mark.attrs.classes, linkClasses],\n });\n } else {\n extraAttr = { class: linkClasses };\n }\n\n return [\n 'a',\n {\n href: mark.attrs.href,\n title: mark.attrs.title,\n 'data-heading': mark.attrs.heading,\n ...extraAttr,\n },\n ];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.Link,\n mark: 'link',\n getAttrs: (tok: PandocToken) => {\n const target = tok.c[kLinkTarget];\n return {\n href: target[kLinkTargetUrl],\n title: target[kLinkTargetTitle] || null,\n ...(linkAttr ? pandocAttrReadAST(tok, kLinkAttr) : {}),\n };\n },\n getChildren: (tok: PandocToken) => tok.c[kLinkChildren],\n\n postprocessor: hasShortcutHeadingLinks(pandocExtensions) ? linkHeadingsPostprocessor : undefined,\n },\n ],\n\n writer: {\n priority: 12,\n write: (output: PandocOutput, mark: Mark, parent: Fragment) => {\n if (mark.attrs.heading) {\n output.writeRawMarkdown('[');\n output.writeInlines(parent);\n output.writeRawMarkdown(']');\n } else {\n output.writeLink(\n mark.attrs.href,\n mark.attrs.title,\n linkAttr ? (mark.attrs as PandocAttr) : null,\n () => {\n output.writeInlines(parent);\n },\n );\n }\n },\n },\n },\n },\n ],\n\n commands: (schema: Schema) => {\n return [\n new ProsemirrorCommand(\n EditorCommandId.Link,\n ['Mod-k'],\n linkCommand(schema.marks.link, ui.dialogs.editLink, capabilities),\n linkOmniInsert(ui),\n ),\n new ProsemirrorCommand(EditorCommandId.RemoveLink, [], removeLinkCommand(schema.marks.link)),\n ];\n },\n\n inputRules: linkInputRules(autoLink, headingLink),\n\n appendTransaction: (schema: Schema) =>\n pandocExtensions.implicit_header_references ? [syncHeadingLinksAppendTransaction()] : [],\n\n plugins: (schema: Schema) => {\n const plugins = [\n linkPopupPlugin(\n schema,\n ui,\n navigation,\n linkCommand(schema.marks.link, ui.dialogs.editLink, capabilities),\n removeLinkCommand(schema.marks.link),\n ),\n ];\n if (autoLink) {\n plugins.push(\n new Plugin({\n key: new PluginKey('link-auto'),\n props: {\n transformPasted: linkPasteHandler(schema),\n },\n }),\n );\n }\n return plugins;\n },\n };\n};\n\nexport default extension;\n","/*\n * link-command.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { MarkType } from 'prosemirror-model';\nimport { EditorUI } from '../../api/ui';\nimport { LinkEditorFn, LinkProps } from '../../api/ui-dialogs';\nimport { EditorState, Transaction, TextSelection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { findChildren } from 'prosemirror-utils';\n\nimport { markIsActive, getMarkAttrs, getSelectionMarkRange, getMarkRange } from '../../api/mark';\n\nimport { linkTargets, LinkCapabilities, LinkType } from '../../api/link';\nimport { OmniInsertGroup } from '../../api/omni_insert';\nimport { equalsIgnoreCase } from '../../api/text';\n\nexport function linkCommand(markType: MarkType, onEditLink: LinkEditorFn, capabilities: LinkCapabilities) {\n return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n // if the current node doesn't allow this mark return false\n if (!state.selection.$from.node().type.allowsMarkType(markType)) {\n return false;\n }\n\n async function asyncEditLink() {\n if (dispatch) {\n // collect link targets\n const targets = await linkTargets(state.doc);\n\n // get the range of the mark\n const range = getSelectionMarkRange(state.selection, markType);\n\n // get link attributes if we have them\n let link: { [key: string]: any } = {};\n\n // only get text if this is a text selection\n if (state.selection instanceof TextSelection) {\n link.text = state.doc.textBetween(range.from, range.to);\n capabilities.text = true;\n } else {\n capabilities.text = false;\n }\n\n // get other attributes\n if (markIsActive(state, markType)) {\n link = {\n ...link,\n ...getMarkAttrs(state.doc, range, markType),\n };\n } else {\n // if the link text is a URL then make it the default\n if (link.text && link.text.match(/^https?:\\/\\/.*$/)) {\n link.href = link.text;\n }\n }\n\n // determine type\n if (link.heading) {\n link.type = LinkType.Heading;\n } else if (link.href && link.href.startsWith('#')) {\n link.type = LinkType.ID;\n } else {\n link.type = LinkType.URL;\n }\n\n // show edit ui\n const result = await onEditLink({ ...link } as LinkProps, targets, capabilities);\n if (result) {\n const tr = state.tr;\n tr.removeMark(range.from, range.to, markType);\n if (result.action === 'edit') {\n // create the mark\n const mark = markType.create(result.link);\n\n // if the content changed then replace the range, otherwise\n if (capabilities.text && link.text !== result.link.text) {\n const node = markType.schema.text(result.link.text, [mark]);\n // if we are editing an existing link then replace it, otherwise replace the selection\n if (link.href) {\n tr.replaceRangeWith(range.from, range.to, node);\n } else {\n tr.replaceSelectionWith(node, false);\n }\n } else {\n tr.addMark(range.from, range.to, mark);\n }\n\n // if it's a heading link then update heading to indicate it has an associated link\n if (result.link.type === LinkType.Heading) {\n const heading = findChildren(\n tr.doc,\n node =>\n node.type === state.schema.nodes.heading &&\n equalsIgnoreCase(node.textContent, result.link.heading || ''),\n );\n if (heading.length > 0) {\n tr.setNodeMarkup(heading[0].pos, state.schema.nodes.heading, {\n ...heading[0].node.attrs,\n link: result.link.heading,\n });\n }\n }\n }\n dispatch(tr);\n }\n if (view) {\n view.focus();\n }\n }\n }\n asyncEditLink();\n\n return true;\n };\n}\n\nexport function linkOmniInsert(ui: EditorUI) {\n return {\n name: ui.context.translateText('Link...'),\n description: ui.context.translateText('Link to another location'),\n group: OmniInsertGroup.Content,\n priority: 8,\n image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.link_dark! : ui.images.omni_insert?.link!),\n };\n}\n\nexport function removeLinkCommand(markType: MarkType) {\n return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n const range = getMarkRange(state.selection.$from, markType);\n if (!range) {\n return false;\n }\n\n if (dispatch) {\n const tr = state.tr;\n tr.removeMark(range.from, range.to, markType);\n dispatch(tr);\n }\n\n return true;\n };\n}\n","/*\n * link-auto.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { InputRule } from 'prosemirror-inputrules';\nimport { EditorState } from 'prosemirror-state';\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { markInputRule, MarkInputRuleFilter } from '../../api/input_rule';\nimport { markPasteHandler } from '../../api/clipboard';\n\nexport function linkInputRules(autoLink: boolean, headingLink: boolean) {\n return (schema: Schema, filter: MarkInputRuleFilter) => {\n const rules = [\n // <link> style link\n markInputRule(/(?:(?:^|[^`])<)(https?:\\/\\/[^>]+)(?:>)$/, schema.marks.link, filter, (match: string[]) => ({\n href: match[1],\n })),\n // full markdown link\n new InputRule(/(?:\\[)([^\\]]+)(?:\\]\\()([^)]+)(?:\\))$/, (state: EditorState, match: string[], start: number, end: number) => {\n if (!filter(state, start, end)) {\n return null;\n }\n \n // remove any leading delimter (modulo spaces)\n const textIndex = match[0].indexOf(match[1]);\n const prefix = match[0].substring(0, textIndex).replace(/^\\s/, \"\");\n const delimStart = start + textIndex - prefix.length;\n const tr = state.tr;\n tr.delete(delimStart, delimStart + prefix.length);\n \n // create mark\n const attrs = { href: match[2] };\n const mark = schema.marks.link.create(attrs);\n \n // apply it to the matching core text\n const markStart = start + textIndex - prefix.length;\n tr.addMark(markStart, markStart + match[1].length, mark);\n tr.removeStoredMark(mark); // Do not continue with mark.\n \n // remove any remaining text\n const remainStart = markStart + match[1].length;\n tr.delete(remainStart, end);\n setTextSelection(remainStart)(tr);\n \n return tr;\n })\n ];\n\n if (autoLink) {\n // plain link\n rules.push(\n new InputRule(\n /(^|[^`])(https?:\\/\\/[^\\s]+\\w)[\\.\\?!\\,)]* $/,\n (state: EditorState, match: string[], start: number, end: number) => {\n const tr = state.tr;\n start = start + match[1].length;\n const linkEnd = start + match[2].length;\n tr.addMark(start, linkEnd, schema.marks.link.create({ href: match[2] }));\n tr.removeStoredMark(schema.marks.link);\n tr.insertText(' ');\n setTextSelection(end + 1)(tr);\n return tr;\n },\n ),\n );\n }\n\n return rules;\n };\n}\n\nexport function linkPasteHandler(schema: Schema) {\n return markPasteHandler(/(?:<)?([a-z]+:\\/\\/[^\\s>]+)(?:>)?/g, schema.marks.link, url => ({ href: url }));\n}\n","/*\n * clipboard.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Slice, Fragment, MarkType, Node as ProsemirrorNode } from 'prosemirror-model';\n\n// add marks to plain text pasted into the editor (e.g. urls become links)\n// https://github.com/ProseMirror/prosemirror/issues/90\nexport function markPasteHandler(regexp: RegExp, type: MarkType, getAttrs: (s: string) => {}) {\n const handler = (fragment: Fragment) => {\n regexp.lastIndex = 0;\n\n const nodes: ProsemirrorNode[] = [];\n\n fragment.forEach((child: ProsemirrorNode) => {\n if (child.isText) {\n const { text } = child;\n let pos = 0;\n let match;\n\n do {\n match = regexp.exec(text!);\n if (match) {\n const start = match.index;\n const end = start + match[0].length;\n const matchText = match.length > 1 ? match[1] : match[0];\n const attrs = getAttrs instanceof Function ? getAttrs(matchText) : getAttrs;\n if (start > 0) {\n nodes.push(child.cut(pos, start));\n }\n nodes.push(type.schema.text(matchText).mark(type.create(attrs).addToSet(child.marks)));\n pos = end;\n }\n } while (match);\n\n if (pos < text!.length) {\n nodes.push(child.cut(pos));\n }\n } else {\n nodes.push(child.copy(handler(child.content)));\n }\n });\n\n regexp.lastIndex = 0;\n\n return Fragment.fromArray(nodes);\n };\n\n return (slice: Slice) => new Slice(handler(slice.content), slice.openStart, slice.openEnd);\n}\n","/*\n * link-headings.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { findChildrenByType, findChildrenByMark } from 'prosemirror-utils';\n\nimport { getMarkRange, getMarkAttrs } from '../../api/mark';\nimport { Transaction } from 'prosemirror-state';\nimport { equalsIgnoreCase } from '../../api/text';\n\n// detect links to headings within the doc read from pandoc and update the doc\n// to note those headings in the link attributes\nexport function linkHeadingsPostprocessor(doc: ProsemirrorNode) {\n // alias schema\n const schema = doc.type.schema;\n\n // start with a list of all headings\n const headings = findChildrenByType(doc, schema.nodes.heading);\n\n // find link marks\n findChildrenByMark(doc, schema.marks.link).forEach(link => {\n const markRange = getMarkRange(doc.resolve(link.pos), schema.marks.link);\n if (markRange) {\n const attrs = getMarkAttrs(doc, markRange, schema.marks.link);\n const linkText = doc.textBetween(markRange.from, markRange.to);\n const matchedHeading = headings.find(heading => {\n return equalsIgnoreCase(heading.node.textContent, linkText) && !attrs.title && attrs.href === '#';\n });\n if (matchedHeading) {\n // point the link mark at this heading by name\n doc.nodesBetween(markRange.from, markRange.to, node => {\n const linkMark = node.marks.find(m => m.type === schema.marks.link);\n if (linkMark) {\n linkMark.attrs.heading = matchedHeading.node.textContent;\n }\n });\n\n // update the heading to indicate it has a named link to it\n matchedHeading.node.attrs.link = linkText;\n }\n }\n });\n\n // return doc\n return doc;\n}\n\nexport function syncHeadingLinksAppendTransaction() {\n return {\n name: 'sync-heading-links',\n nodeFilter: (node: ProsemirrorNode) =>\n node.type === node.type.schema.nodes.heading || node.type.schema.marks.link.isInSet(node.marks),\n append: (tr: Transaction) => {\n // alias schema\n const schema = tr.doc.type.schema;\n\n // fix links to be in sync with their text\n const links = findChildrenByMark(tr.doc, schema.marks.link);\n links.forEach(link => {\n const linkPos = tr.mapping.map(link.pos);\n const range = getMarkRange(tr.doc.resolve(linkPos), schema.marks.link);\n if (range) {\n const attrs = getMarkAttrs(tr.doc, range, schema.marks.link);\n const linkText = tr.doc.textBetween(range.from, range.to);\n if (attrs.heading && !equalsIgnoreCase(attrs.heading, linkText)) {\n tr.removeMark(range.from, range.to, schema.marks.link);\n tr.addMark(range.from, range.to, schema.marks.link.create({ ...attrs, heading: linkText }));\n }\n }\n });\n\n // if a heading has deviated from it's link, then update the link\n findChildrenByType(tr.doc, schema.nodes.heading).forEach(heading => {\n const headingPos = tr.mapping.map(heading.pos);\n const headingText = heading.node.textContent;\n const headingLink = heading.node.attrs.link;\n\n if (headingLink && !equalsIgnoreCase(headingLink, headingText) && headingText.length > 0) {\n // set the heading link text\n tr.setNodeMarkup(headingPos, schema.nodes.heading, {\n ...heading.node.attrs,\n link: headingText,\n });\n\n // find links that don't match and update them\n findChildrenByMark(tr.doc, schema.marks.link).forEach(link => {\n const linkPos = tr.mapping.map(link.pos);\n const range = getMarkRange(tr.doc.resolve(linkPos), schema.marks.link);\n if (range) {\n const attrs = getMarkAttrs(tr.doc, range, schema.marks.link);\n if (equalsIgnoreCase(attrs.heading, headingLink)) {\n tr.insertText(headingText, range.from, range.to);\n tr.addMark(\n range.from,\n range.from + headingText.length,\n schema.marks.link.create({ ...attrs, heading: headingText }),\n );\n }\n }\n });\n }\n });\n },\n };\n}\n","/*\n * LinkPopup.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { DecorationSet, EditorView } from 'prosemirror-view';\nimport { Selection, PluginKey } from 'prosemirror-state';\n\nimport * as React from 'react';\n\nimport ClipboardJS from 'clipboard';\n\nimport { EditorUI } from '../../api/ui';\nimport { LinkProps } from '../../api/ui-dialogs';\nimport { CommandFn } from '../../api/command';\n\nimport { selectionIsImageNode } from '../../api/selection';\n\nimport { showTooltip } from '../../api/widgets/tooltip';\n\nimport { WidgetProps } from '../../api/widgets/react';\nimport { LinkButton, ImageButton } from '../../api/widgets/button';\nimport { Popup } from '../../api/widgets/popup';\nimport { EditorNavigation, NavigationType } from '../../api/navigation';\nimport { Schema } from 'prosemirror-model';\nimport { textPopupDecorationPlugin, TextPopupTarget } from '../../api/text-popup';\n\nexport function linkPopupPlugin(\n schema: Schema,\n ui: EditorUI,\n nav: EditorNavigation,\n linkCmd: CommandFn,\n removeLinkCmd: CommandFn,\n) {\n const kPopupChromeWidth = 70;\n const kMaxLinkWidth = 300;\n const maxWidth = kMaxLinkWidth + kPopupChromeWidth;\n\n return textPopupDecorationPlugin({\n key: new PluginKey<DecorationSet>('link-popup'),\n markType: schema.marks.link,\n maxWidth,\n createPopup: (view: EditorView, target: TextPopupTarget<LinkProps>, style: React.CSSProperties) => {\n return Promise.resolve(\n <LinkPopup\n link={target.attrs}\n maxLinkWidth={kMaxLinkWidth - 10} // prevent off by pixel(s) overflow\n linkCmd={linkCmd}\n removeLinkCmd={removeLinkCmd}\n view={view}\n ui={ui}\n nav={nav}\n style={style}\n />,\n );\n },\n specKey: (target: TextPopupTarget<LinkProps>) => {\n const linkText = target.attrs.heading ? target.attrs.heading : target.attrs.href;\n return `link:${linkText}`;\n },\n filter: (selection: Selection) => {\n return !selectionIsImageNode(schema, selection);\n },\n onCmdClick: (target: TextPopupTarget<LinkProps>) => {\n ui.display.openURL(target.attrs.href);\n },\n });\n}\n\ninterface LinkPopupProps extends WidgetProps {\n link: LinkProps;\n maxLinkWidth: number;\n view: EditorView;\n ui: EditorUI;\n nav: EditorNavigation;\n linkCmd: CommandFn;\n removeLinkCmd: CommandFn;\n}\n\nconst LinkPopup: React.FC<LinkPopupProps> = props => {\n // link\n const linkText = props.link.heading ? props.link.heading : props.link.href;\n const onLinkClicked = () => {\n props.view.focus();\n if (props.link.heading) {\n props.nav.navigate(NavigationType.Heading, props.link.heading);\n } else if (props.link.href.startsWith('#')) {\n props.nav.navigate(NavigationType.Href, props.link.href.substr(1));\n } else {\n props.ui.display.openURL(props.link.href);\n }\n };\n\n // copy\n const showCopyButton = !props.link.heading && ClipboardJS.isSupported();\n let clipboard: ClipboardJS;\n const setCopyButton = (button: HTMLButtonElement | null) => {\n if (button) {\n clipboard = new ClipboardJS(button, {\n text: () => linkText,\n });\n clipboard.on('success', () => {\n showTooltip(button, props.ui.context.translateText('Copied to Clipboard'), 's');\n });\n } else {\n if (clipboard) {\n clipboard.destroy();\n }\n }\n };\n\n // remove\n const onRemoveClicked = () => {\n // in rstudio (w/ webkit) removing the link during the click results\n // in a page-navigation! defer to next event cycle to avoid this\n setTimeout(() => {\n props.removeLinkCmd(props.view.state, props.view.dispatch, props.view);\n props.view.focus();\n }, 0);\n };\n\n // edit\n const onEditClicked = () => {\n props.linkCmd(props.view.state, props.view.dispatch, props.view);\n };\n\n return (\n <Popup classes={['pm-popup-link']} style={props.style}>\n <LinkButton text={linkText} onClick={onLinkClicked} maxWidth={props.maxLinkWidth} />\n {showCopyButton ? (\n <ImageButton\n image={props.ui.images.copy!}\n classes={['pm-image-button-copy-link']}\n title={props.ui.context.translateText('Copy Link to Clipboard')}\n ref={setCopyButton}\n />\n ) : null}\n <ImageButton\n image={props.ui.images.removelink!}\n classes={['pm-image-button-remove-link']}\n title={props.ui.context.translateText('Remove Link')}\n onClick={onRemoveClicked}\n />\n <ImageButton\n image={props.ui.images.properties!}\n classes={['pm-image-button-edit-properties']}\n title={props.ui.context.translateText('Edit Attributes')}\n onClick={onEditClicked}\n />\n </Popup>\n );\n};\n","/*\n * tooltip.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport tlite from 'tlite';\n\nimport './tooltip.css';\n\nexport function showTooltip(\n el: Element,\n text: string,\n grav: 's' | 'n' | 'e' | 'w' | 'sw' | 'se' | 'nw' | 'ne' = 'n',\n timeout = 2000,\n) {\n el.setAttribute('title', '');\n el.setAttribute('data-tlite', text);\n tlite.show(el, { grav });\n setTimeout(() => tlite.hide(el), timeout);\n}\n","/*\n * button.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\n\nimport { WidgetProps } from './react';\n\nexport interface LinkButtonProps extends WidgetProps {\n text: string;\n onClick: () => void;\n title?: string;\n maxWidth?: number;\n}\n\nexport const LinkButton: React.FC<LinkButtonProps> = props => {\n const className = ['pm-link', 'pm-link-text-color'].concat(props.classes || []).join(' ');\n\n const style: React.CSSProperties = {\n ...props.style,\n maxWidth: props.maxWidth,\n };\n\n const onClick = (e: React.MouseEvent) => {\n e.preventDefault();\n props.onClick();\n };\n\n const onKeyDown = (e: React.KeyboardEvent) => {\n if (e.keyCode === 32) {\n e.preventDefault();\n props.onClick();\n }\n };\n\n return (\n <a\n href={props.text}\n tabIndex={0}\n onClick={onClick}\n onKeyDown={onKeyDown}\n title={props.title || props.text}\n className={className}\n style={style}\n >\n {props.text}\n </a>\n );\n};\n\nexport interface ImageButtonProps extends WidgetProps {\n title: string;\n image: string;\n tabIndex?: number;\n onClick?: () => void;\n}\n\nexport const ImageButton = React.forwardRef<HTMLButtonElement, ImageButtonProps>((props: ImageButtonProps, ref) => {\n const className = ['pm-image-button'].concat(props.classes || []).join(' ');\n const onClick = (e: React.MouseEvent) => {\n if (props.onClick) {\n e.preventDefault();\n props.onClick();\n }\n };\n return (\n <button\n onClick={onClick}\n title={props.title}\n className={className}\n style={props.style}\n ref={ref}\n tabIndex={props.tabIndex}\n >\n <img src={props.image} alt={props.title} draggable=\"false\"/>\n </button>\n );\n});\n\nexport interface TextButtonProps extends WidgetProps {\n title: string;\n onClick?: () => void;\n tabIndex?: number;\n disabled?: boolean;\n}\n\nexport const TextButton = React.forwardRef<HTMLButtonElement, TextButtonProps>((props: TextButtonProps, ref) => {\n const className = ['pm-text-button', 'pm-input-button'].concat(props.classes || []).join(' ');\n const onClick = (e: React.MouseEvent) => {\n if (props.onClick) {\n e.preventDefault();\n props.onClick();\n }\n };\n return (\n <button\n onClick={onClick}\n type=\"button\"\n className={className}\n style={props.style}\n ref={ref}\n tabIndex={props.tabIndex}\n disabled={props.disabled}\n >\n {props.title}\n </button>\n );\n});\n\nexport interface OutlineButtonProps extends WidgetProps {\n title: string;\n onClick?: (event: React.MouseEvent<HTMLButtonElement>) => void;\n tabIndex?: number;\n}\n\nexport const OutlineButton = React.forwardRef<HTMLButtonElement, OutlineButtonProps>(\n (props: OutlineButtonProps, ref) => {\n const className = ['pm-outline-button', 'pm-input-button', 'pm-input-outline-button']\n .concat(props.classes || [])\n .join(' ');\n return (\n <button\n onClick={props.onClick}\n type=\"button\"\n className={className}\n style={props.style}\n ref={ref}\n tabIndex={props.tabIndex}\n >\n {props.title}\n </button>\n );\n },\n);\n","/*\n * TextPopup.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { DecorationSet, Decoration, EditorView } from 'prosemirror-view';\nimport { Selection, Plugin, PluginKey, EditorState, Transaction } from 'prosemirror-state';\n\nimport * as React from 'react';\n\nimport { getMarkRange, getMarkAttrs } from './mark';\nimport { kRestoreLocationTransaction, kNavigationTransaction } from './transaction';\n\nimport { reactRenderForEditorView } from './widgets/react';\nimport { textRangePopupDecorationPosition } from './widgets/decoration';\nimport { kPlatformMac } from './platform';\nimport { MarkType } from 'prosemirror-model';\n\nexport interface TextPopupTarget<AttrsType = any> {\n attrs: AttrsType;\n text: string;\n}\n\nexport interface TextPopupDecoration<AttrsType = any> {\n key: PluginKey<DecorationSet>;\n markType: MarkType;\n maxWidth: number;\n createPopup: (\n view: EditorView,\n target: TextPopupTarget<AttrsType>,\n style: React.CSSProperties,\n ) => Promise<JSX.Element | null>;\n dismissOnEdit?: boolean;\n makeLinksAccessible?: boolean;\n specKey?: (target: TextPopupTarget<AttrsType>) => string;\n filter?: (selection: Selection) => boolean;\n onCmdClick?: (target: TextPopupTarget<AttrsType>) => void;\n}\n\nexport function textPopupDecorationPlugin(deco: TextPopupDecoration): Plugin<DecorationSet> {\n const {\n key,\n markType,\n maxWidth,\n createPopup,\n specKey,\n dismissOnEdit,\n makeLinksAccessible,\n filter,\n onCmdClick,\n } = deco;\n\n let editorView: EditorView;\n\n return new Plugin<DecorationSet>({\n key,\n view(view: EditorView) {\n editorView = view;\n return {};\n },\n state: {\n init: (_config: { [key: string]: any }) => {\n return DecorationSet.empty;\n },\n apply: (tr: Transaction, old: DecorationSet, _oldState: EditorState, newState: EditorState) => {\n // if this a restore location or navigation then return empty\n if (tr.getMeta(kRestoreLocationTransaction) || tr.getMeta(kNavigationTransaction)) {\n return DecorationSet.empty;\n }\n\n // if this is doc update and we have dismiss on edit then return empty\n if (dismissOnEdit && tr.docChanged) {\n return DecorationSet.empty;\n }\n\n // if the selection is contained within the mark then show the popup\n const selection = newState.selection;\n\n // TODO JJA: The mark range is undefined when the the selection is 'after' the mark\n // e.g. [@allaire2012|]\n // which means that the preview doesn't show\n const range = getMarkRange(selection.$from, markType);\n\n if (range) {\n // selection has to be bounded by the range\n if (selection.from < range.from || selection.to > range.to) {\n return DecorationSet.empty;\n }\n\n // apply the filter\n if (filter && !filter(selection)) {\n return DecorationSet.empty;\n }\n\n // don't show the link popup if it's positioned at the far left of the mark\n // (awkward when cursor is just left of an image)\n if (selection.empty && range.from === selection.from) {\n return DecorationSet.empty;\n }\n\n // mark target\n const attrs = getMarkAttrs(newState.doc, range, markType);\n const text = newState.doc.textBetween(range.from, range.to);\n const target = { attrs, text };\n\n // compute position (we need this both for setting the styles on the LinkPopup\n // as well as for setting the Decorator pos)\n const decorationPosition = textRangePopupDecorationPosition(editorView, range, maxWidth);\n\n // key if one was provided\n let decoratorSpec: { [key: string]: any } | undefined;\n if (specKey) {\n decoratorSpec = {\n key: decorationPosition.key + specKey(target),\n ignoreSelection: true,\n stopEvent: () => {\n return true;\n },\n };\n }\n\n // create decorator\n const textPopupDecorator = Decoration.widget(\n decorationPosition.pos,\n\n (view: EditorView, getPos: () => number) => {\n // create decorator and render popup into it\n const decorationEl = window.document.createElement('div');\n decorationEl.style.visibility = 'hidden';\n\n // create popup component\n createPopup(view, target, decorationPosition.style).then(popup => {\n if (popup) {\n reactRenderForEditorView(popup, decorationEl, view);\n\n // make sure links responsd to spacebar\n if (makeLinksAccessible) {\n const links = decorationEl.getElementsByTagName('a');\n // tslint:disable-next-line: prefer-for-of\n for (let i = 0; i < links.length; i++) {\n const link = links[0];\n link.onkeydown = (e: KeyboardEvent) => {\n if (e.keyCode === 32) {\n e.preventDefault();\n link.click();\n }\n };\n }\n }\n\n decorationEl.style.visibility = 'visible';\n }\n });\n\n return decorationEl;\n },\n\n decoratorSpec,\n );\n\n // return decorations\n return DecorationSet.create(tr.doc, [textPopupDecorator]);\n } else {\n return DecorationSet.empty;\n }\n },\n },\n props: {\n decorations: (state: EditorState) => {\n return key.getState(state);\n },\n handleClick: onCmdClick\n ? (view: EditorView, pos: number, event: MouseEvent) => {\n const keyPressed = kPlatformMac && event.metaKey;\n if (keyPressed) {\n const attrs = getMarkAttrs(view.state.doc, { from: pos, to: pos }, markType);\n const range = getMarkRange(view.state.doc.resolve(pos));\n if (attrs && range) {\n event.stopPropagation();\n event.preventDefault();\n const text = view.state.doc.textBetween(range.from, range.to);\n onCmdClick({ attrs, text });\n return true;\n }\n }\n return false;\n }\n : undefined,\n },\n });\n}\n","/*\n * react.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport * as React from 'react';\nimport * as ReactDOM from 'react-dom';\n\nimport { EditorView } from 'prosemirror-view';\n\nexport interface WidgetProps {\n classes?: string[];\n style?: React.CSSProperties;\n}\n\n// Render a react element into a DOM container that will eventually be added to the EditorView.dom\n// this function is necessary for situations where an element is created and then handed to ProseMirror\n// (unattached to the DOM), and then subsequently destoyed/unmounted by ProseMirror. We use a\n// MutationObserver to watch EditorView.dom for the element's removal then in response call\n// ReactDOM.unmountComponentAtNode\nexport function reactRenderForEditorView(element: React.ReactElement, container: HTMLElement, view: EditorView) {\n // render the react element into the container\n const ref = ReactDOM.render(element, container);\n\n // track view dom mutations to determine when ProseMirror has destroyed the element\n // (our cue to unmount/cleanup the react component)\n const observer = new MutationObserver(mutationsList => {\n mutationsList.forEach(mutation => {\n mutation.removedNodes.forEach(node => {\n if (node === container) {\n observer.disconnect();\n ReactDOM.unmountComponentAtNode(container);\n }\n });\n });\n });\n observer.observe(view.dom, { attributes: false, childList: true, subtree: true });\n\n // return the ref\n return ref;\n}\n","/*\n * decoration.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { ResolvedPos } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\n\nimport { editingRootNodeClosestToPos } from '../node';\n\nimport { kPixelUnit } from '../css';\n\nexport interface DecorationPosition {\n pos: number;\n style: { [key: string]: string };\n key: string;\n}\n\nexport function textRangePopupDecorationPosition(\n view: EditorView,\n range: { from: number; to: number },\n maxWidth: number,\n): DecorationPosition {\n // get the (window) DOM coordinates for the start of the range. we use range.from + 1 so\n // that ranges that are at the beginning of a line don't have their position set\n // to the previous line\n const rangeCoords = view.coordsAtPos(range.from + 1);\n\n // get the node, element, coordinates, and style for the current editing root\n const rangePos = view.state.doc.resolve(range.from);\n const editingNode = editingRootNodeClosestToPos(rangePos)!;\n const editingEl = view.domAtPos(editingNode!.pos + 1).node as HTMLElement;\n const editingBox = editingEl.getBoundingClientRect();\n const editingBoxStyle = window.getComputedStyle(editingEl);\n\n // base popup style\n const topPadding = parseInt(editingBoxStyle.paddingTop!, 10) || 0;\n const popupStyle = {\n top: rangeCoords.bottom - editingBox.top - topPadding + 5 + kPixelUnit,\n };\n\n // we need to compute whether the popup will be visible (horizontally), do\n // this by testing whether we have room for the max link width + controls/padding\n let style: { [key: string]: string };\n const positionRight = rangeCoords.left + maxWidth > editingBox.right;\n if (positionRight) {\n const rightCoords = view.coordsAtPos(range.to);\n const rightPos = rangeCoords.top === rightCoords.top ? editingBox.right - rightCoords.right : 0;\n style = {\n ...popupStyle,\n right: rightPos + kPixelUnit,\n };\n } else {\n const marginLeft =\n 'calc(' +\n (rangeCoords.left - editingBox.left) +\n 'px ' +\n ' - ' +\n editingBoxStyle.borderLeftWidth +\n ' - ' +\n editingBoxStyle.paddingLeft +\n ' - ' +\n editingBoxStyle.marginLeft +\n ' - 1ch' +\n ')';\n style = {\n ...popupStyle,\n marginLeft,\n };\n }\n\n // calculate key\n const key = Object.keys(style)\n .map(attrib => `${attrib}=${style[attrib]}`)\n .join(';');\n\n return {\n pos: editingNode.pos + editingNode.node.nodeSize - 1,\n style,\n key,\n };\n}\n\nfunction getEditingBox(view: EditorView, pos$: ResolvedPos) {\n const editingNode = editingRootNodeClosestToPos(pos$);\n const editingEl = view.domAtPos(editingNode!.pos + 1).node as HTMLElement;\n return editingEl.getBoundingClientRect();\n}\n","/*\n * select_all.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorState, Transaction, TextSelection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { findBlockNodes, ContentNodeWithPos } from 'prosemirror-utils';\n\nimport { Extension } from '../api/extension';\nimport { ProsemirrorCommand, EditorCommandId } from '../api/command';\nimport { editingRootNode } from '../api/node';\n\nconst extension: Extension = {\n commands: () => {\n return [new ProsemirrorCommand(EditorCommandId.SelectAll, ['Mod-a'], selectAll)];\n },\n};\n\nexport function selectAll(state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) {\n if (dispatch) {\n const editingRoot = editingRootNode(state.selection);\n if (editingRoot) {\n const schema = state.schema;\n const tr = state.tr;\n if (editingRoot.node.type === schema.nodes.note) {\n tr.setSelection(childBlocksSelection(tr.doc, editingRoot));\n } else {\n const start = tr.doc.resolve(editingRoot.pos);\n const end = tr.doc.resolve(editingRoot.pos + editingRoot.node.nodeSize);\n tr.setSelection(new TextSelection(start, end));\n }\n dispatch(tr);\n if (view) {\n // we do this to escape from embedded editors e.g. codemirror\n view.focus();\n }\n }\n }\n return true;\n}\n\nfunction childBlocksSelection(doc: ProsemirrorNode, parent: ContentNodeWithPos) {\n const blocks = findBlockNodes(parent.node);\n const begin = parent.start + blocks[0].pos + 1;\n const lastBlock = blocks[blocks.length - 1];\n const end = parent.start + lastBlock.pos + lastBlock.node.nodeSize;\n return TextSelection.create(doc, begin, end);\n}\n\nexport default extension;\n","/*\n * history.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { history, redo, undo } from 'prosemirror-history';\n\nimport { ProsemirrorCommand, EditorCommandId } from '../api/command';\nimport { Extension } from '../api/extension';\n\nconst extension: Extension = {\n commands: () => {\n return [\n new ProsemirrorCommand(EditorCommandId.Undo, ['Mod-z'], undo),\n new ProsemirrorCommand(EditorCommandId.Redo, ['Shift-Mod-z'], redo),\n ];\n },\n\n plugins: () => {\n return [history()];\n },\n};\n\nexport default extension;\n","/*\n * cursor.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { PluginKey, Plugin, EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { ResolvedPos, Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { dropCursor } from 'prosemirror-dropcursor';\nimport { gapCursor, GapCursor } from 'prosemirror-gapcursor';\nimport 'prosemirror-gapcursor/style/gapcursor.css';\n\nimport { findParentNodeOfTypeClosestToPos, findParentNodeOfType, findParentNode } from 'prosemirror-utils';\n\nimport { Extension } from '../api/extension';\nimport { BaseKey, verticalArrowCanAdvanceWithinTextBlock } from '../api/basekeys';\nimport { isList } from '../api/list';\n\nimport './cursor.css';\n\n\nconst extension: Extension = {\n\n baseKeys: () => {\n return [\n { key: BaseKey.ArrowLeft, command: gapArrowHandler('left') },\n { key: BaseKey.ArrowUp, command: gapArrowHandler('up') }\n ];\n },\n\n plugins: () => {\n return [\n gapCursor(), \n dropCursor(),\n new Plugin({\n key: new PluginKey('div-gap-cursor'),\n props: {\n handleDOMEvents: {\n click: gapClickHandler,\n },\n },\n })];\n },\n};\n\nfunction gapArrowHandler(dir: 'up' | 'left') {\n return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n \n\n // function to create a gap cursor\n const createGapCursor = ($pos: ResolvedPos) => {\n if (dispatch) {\n const cursor = new GapCursor($pos, $pos);\n const tr = state.tr;\n tr.setSelection(cursor);\n dispatch(tr);\n }\n return true;\n };\n\n if (state.selection.empty && view && view.endOfTextblock(dir)) {\n \n // get the selection\n const $head = state.selection.$head;\n\n // if we are in a block that handles up/down (e.g. display math)\n // then we don't want to make a gap cursor\n if (dir === 'up' && verticalArrowCanAdvanceWithinTextBlock(state.selection, dir)) {\n return false;\n }\n\n // check if we are in a div \n if (state.schema.nodes.div) {\n const div = findParentNodeOfType(state.schema.nodes.div)(state.selection);\n \n // if we are at the very top of a div then create a gap cursor\n if (div) {\n \n const $divPos = state.doc.resolve(div.pos);\n if ($head.index($head.depth - 1) === 0 && !(state.selection instanceof GapCursor)) {\n \n // if we are in a list item the calculations about view.endOfTextblock will be off\n if (findParentNode(isList)(state.selection)) {\n return false;\n }\n \n return createGapCursor(state.doc.resolve($divPos.pos + 1));\n // if we are between divs then create a gap cursor between them\n } else if ($divPos.nodeBefore?.type === state.schema.nodes.div) {\n return createGapCursor(state.doc.resolve($divPos.pos));\n } \n }\n }\n \n\n // if we are at the top of the document then create a gap cursor\n if (!$head.nodeBefore && ($head.pos <= 2)) {\n return createGapCursor(state.doc.resolve($head.pos - 1));\n }\n \n return false;\n\n } else {\n return false;\n }\n\n \n };\n}\n\n\nfunction gapClickHandler(view: EditorView, event: Event): boolean {\n\n const schema = view.state.schema;\n const mouseEvent = event as MouseEvent;\n const clickPos = view.posAtCoords({ left: mouseEvent.clientX, top: mouseEvent.clientY } );\n\n if (clickPos) {\n\n // resolve click pos\n const $clickPos = view.state.doc.resolve(clickPos.pos); \n\n // create a gap cursor at the click position\n const createGapCursor = () => {\n // focus the view\n view.focus();\n \n // create the gap cursor\n const tr = view.state.tr;\n const cursor = new GapCursor($clickPos, $clickPos); \n tr.setSelection(cursor);\n view.dispatch(tr);\n \n // prevent default event handling\n event.preventDefault();\n event.stopImmediatePropagation();\n return false;\n };\n \n // handle clicks at the top of divs\n if (schema.nodes.div) {\n const div = findParentNodeOfTypeClosestToPos(\n view.state.doc.resolve(clickPos.pos), schema.nodes.div\n );\n if (div && div.pos === clickPos.inside) {\n const divNode = view.nodeDOM(div.start);\n if (divNode instanceof HTMLElement) {\n if (Math.abs(mouseEvent.clientX - divNode.getBoundingClientRect().left) < 150) {\n return createGapCursor();\n }\n }\n }\n }\n\n // handle clicks between certain block types that don't have a natural text cursor\n // for inserting additioanl content\n const blockRequiresGap = (node: ProsemirrorNode | null | undefined) => {\n if (node) {\n return node.type === schema.nodes.div ||\n node.type === schema.nodes.figure ||\n node.type === schema.nodes.table ||\n node.type === schema.nodes.horizontal_rule ||\n node.type === schema.nodes.code_block;\n } else {\n return false;\n }\n };\n if (!clickPos.inside) {\n if (blockRequiresGap($clickPos.nodeBefore) && blockRequiresGap($clickPos.nodeAfter)) {\n return createGapCursor();\n }\n }\n\n // handle clicks above body\n // Take this out for now b/c it was interfering with other mouse \n // gestures (e.g. clicking on attr editor). keyboard gestures still\n // work to get to the top of the body\n /*\n if ($clickPos.parent.type === schema.nodes.body &&\n $clickPos.start() === $clickPos.pos) {\n \n return createGapCursor();\n\n }\n */\n }\n\n return false;\n}\n\nexport default extension;\n","/*\n * clear_formatting.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\n\nimport { Extension } from '../api/extension';\nimport { ProsemirrorCommand, EditorCommandId } from '../api/command';\nimport { liftTarget } from 'prosemirror-transform';\n\n// marks included in clear formatting\nconst kFormattingMarks = ['code', 'em', 'underline', 'smallcaps', 'span', 'strikeout', 'strong', 'superscript', 'subscript'];\n\n// for nodes, all nodes with isTextblock === true will be converted to paragraph, and all\n// nodes in this list will be lifted\nconst kLiftFormattingNodes = ['blockquote', 'line_block', 'div', 'raw_block'];\n\nconst extension: Extension = {\n commands: () => {\n return [new ProsemirrorCommand(EditorCommandId.ClearFormatting, ['Mod-\\\\'], clearFormatting)];\n },\n};\n\nexport function clearFormatting(state: EditorState, dispatch?: (tr: Transaction) => void) {\n if (dispatch) {\n // create transaction\n const tr = state.tr;\n\n // alias schema and selection\n const schema = state.schema;\n const { from, to } = tr.selection;\n\n // clear formatting marks\n kFormattingMarks.forEach(markName => {\n const mark = state.schema.marks[markName];\n if (mark) {\n tr.removeMark(from, to, mark);\n }\n });\n tr.setStoredMarks([]);\n\n // lift / set nodes as required\n tr.doc.nodesBetween(from, to, (node: ProsemirrorNode, pos: number) => {\n // ignore paragraph and text nodes (already have 'cleared' formatting)\n if (node.type === schema.nodes.paragraph || node.type === schema.nodes.text) {\n return;\n }\n\n // pass recursively through list container nodes\n if (\n node.type === schema.nodes.bullet_list ||\n node.type === schema.nodes.ordered_list ||\n node.type === schema.nodes.definition_list ||\n node.type === schema.nodes.definition_list_term ||\n node.type === schema.nodes.definition_list_description\n ) {\n return;\n }\n\n // get node range (map positions)\n const fromPos = tr.doc.resolve(tr.mapping.map(pos + 1));\n const toPos = tr.doc.resolve(tr.mapping.map(pos + node.nodeSize - 1));\n const nodeRange = fromPos.blockRange(toPos);\n\n // process text blocks and blocks that can be lifted (e.g. blockquote)\n if (nodeRange) {\n if (node.type.isTextblock) {\n tr.setNodeMarkup(nodeRange.start, schema.nodes.paragraph);\n } else if (kLiftFormattingNodes.includes(node.type.name)) {\n const targetLiftDepth = liftTarget(nodeRange);\n if (targetLiftDepth || targetLiftDepth === 0) {\n tr.lift(nodeRange, targetLiftDepth);\n }\n }\n }\n });\n\n dispatch(tr);\n }\n\n return true;\n}\n\nexport default extension;\n","/*\n * smarty.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { ellipsis, InputRule } from 'prosemirror-inputrules';\nimport { Plugin, PluginKey, EditorState } from 'prosemirror-state';\nimport { Schema } from 'prosemirror-model';\n\nimport { Extension, extensionIfEnabled } from '../api/extension';\nimport { fancyQuotesToSimple } from '../api/quote';\n\nconst plugin = new PluginKey('smartypaste');\n\n// match enDash but only for lines that aren't an html comment\nconst enDash = new InputRule(/[^!-`]--$/, (state: EditorState, match: string[], start: number, end: number) => {\n const { parent, parentOffset } = state.selection.$head;\n const precedingText = parent.textBetween(0, parentOffset);\n if (precedingText.indexOf('<!--') === -1) {\n const tr = state.tr;\n tr.insertText('–', end - 1, end);\n return tr;\n } else {\n return null;\n }\n});\n\nconst emDash = new InputRule(/(^|[^`])–-$/, (state: EditorState, match: string[], start: number, end: number) => {\n const tr = state.tr;\n tr.insertText('—', end - 1, end);\n return tr;\n});\n\nconst extension: Extension = {\n inputRules: () => {\n return [ellipsis, enDash, emDash];\n },\n\n plugins: (schema: Schema) => {\n return [\n // apply smarty rules to plain text pastes\n new Plugin({\n key: plugin,\n props: {\n transformPastedText(text: string) {\n // emdash\n text = text.replace(/(\\w)---(\\w)/g, '$1—$2');\n\n // endash\n text = text.replace(/(\\w)--(\\w)/g, '$1–$2');\n\n // ellipses\n text = text.replace(/\\.\\.\\./g, '…');\n\n // we explicitly don't want fancy quotes in the editor\n text = fancyQuotesToSimple(text);\n\n return text;\n },\n },\n }),\n ];\n },\n};\n\nexport default extensionIfEnabled(extension, 'smart');\n","/*\n * attr_duplicate_id.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Transaction } from 'prosemirror-state';\nimport { Schema, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { Step, AddMarkStep } from 'prosemirror-transform';\nimport { findChildren } from 'prosemirror-utils';\n\nimport { Extension } from '../api/extension';\nimport { getMarkAttrs, getMarkRange } from '../api/mark';\nimport { extensionIfPandocAttrEnabled } from '../api/pandoc_attr';\n\nconst extension: Extension = {\n appendTransaction: (_schema: Schema) => {\n // detect changes in content with ids\n const hasAttrId = (node: ProsemirrorNode) => {\n return !!node.attrs.id || node.marks.some(mark => !!mark.attrs.id);\n };\n\n // detect mark steps with new ids\n const attrMarkStep = (step: Step) => {\n return step instanceof AddMarkStep && !!(step as any).mark.attrs.id;\n };\n\n return [\n {\n name: 'attr_duplicate_id',\n filter: (transactions: Transaction[]) => transactions.some(transaction => transaction.steps.some(attrMarkStep)),\n nodeFilter: hasAttrId,\n append: (tr: Transaction) => {\n const usedIds = new Set<string>();\n const scannedRanges: Array<{ from: number; to: number }> = [];\n findChildren(tr.doc, hasAttrId, true).forEach(attrNode => {\n if (attrNode.node.attrs.id) {\n const id = attrNode.node.attrs.id;\n if (usedIds.has(id)) {\n const node = attrNode.node;\n tr.setNodeMarkup(attrNode.pos, undefined, { ...node.attrs, id: null }, node.marks);\n } else {\n usedIds.add(id);\n }\n } else {\n const mark = attrNode.node.marks.find(mk => !!mk.attrs.id)!;\n const markRange = getMarkRange(tr.doc.resolve(attrNode.pos), mark.type) as { from: number; to: number };\n const markAttrs = getMarkAttrs(tr.doc, markRange, mark.type);\n const id = markAttrs.id;\n if (id && !scannedRanges.find(range => range.from === markRange.from && range.to === markRange.to)) {\n scannedRanges.push(markRange);\n if (usedIds.has(id)) {\n tr.removeMark(markRange.from, markRange.to, mark.type);\n tr.addMark(markRange.from, markRange.to, mark.type.create({ ...mark.attrs, id: null }));\n } else {\n usedIds.add(id);\n }\n }\n }\n });\n },\n },\n ];\n },\n};\n\nexport default extensionIfPandocAttrEnabled(extension);\n","/*\n * trailing_p.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Transaction } from 'prosemirror-state';\nimport { Schema } from 'prosemirror-model';\nimport { Extension } from '../api/extension';\nimport { FixupContext } from '../api/fixup';\nimport { requiresTrailingP, insertTrailingP } from '../api/trailing_p';\n\nconst extension: Extension = {\n fixups: () => {\n return [\n (tr: Transaction, context: FixupContext) => {\n if (context === FixupContext.Load) {\n if (requiresTrailingP(tr.selection)) {\n insertTrailingP(tr);\n }\n }\n return tr;\n },\n ];\n },\n\n appendTransaction: (schema: Schema) => {\n return [\n {\n name: 'trailing_p',\n append: (tr: Transaction) => {\n if (requiresTrailingP(tr.selection)) {\n insertTrailingP(tr);\n }\n return tr;\n },\n },\n ];\n },\n};\n\nexport default extension;\n","/*\n * empty_mark.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { Transaction, EditorState } from 'prosemirror-state';\nimport { ReplaceStep } from 'prosemirror-transform';\n\nimport { Extension } from '../api/extension';\nimport { getMarkRange } from '../api/mark';\n\nconst extension: Extension = {\n appendTransaction: (schema: Schema) => {\n return [\n {\n name: 'clear_empty_mark',\n append: (tr: Transaction, transactions: Transaction[], _oldState: EditorState, newState: EditorState) => {\n // if we have an empty selection\n if (newState.selection.empty) {\n // if the last change removed text\n const removedText = transactions.some(transaction =>\n transaction.steps.some(step => {\n return step instanceof ReplaceStep && (step as any).slice.content.size === 0;\n }),\n );\n if (removedText) {\n // if there is a stored mark w/ 0 range then remove it\n newState.storedMarks?.forEach(mark => {\n const markRange = getMarkRange(tr.doc.resolve(tr.selection.from), mark.type);\n if (!markRange || markRange.from === markRange.to) {\n tr.removeStoredMark(mark);\n }\n });\n }\n }\n },\n },\n ];\n },\n};\n\nexport default extension;\n","/*\n * escape_mark.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { Schema } from 'prosemirror-model';\n\nimport { BaseKey } from '../api/basekeys';\nimport { Extension } from '../api/extension';\n\nconst extension: Extension = {\n baseKeys: (_schema: Schema) => {\n return [\n {\n key: BaseKey.ArrowRight,\n command: (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n if (state.selection.empty) {\n // if we are at the end of a parent text block and there are\n // marks stored in the state or active on the selection then\n // clear the stored marks and insert a space.\n const $head = state.selection.$head;\n const parent = $head.node($head.depth);\n if (\n parent.type.isTextblock &&\n $head.parentOffset === parent.textContent.length &&\n ($head.marks().length > 0 || !!state.storedMarks)\n ) {\n if (dispatch) {\n const tr = state.tr;\n tr.setStoredMarks([]);\n tr.insertText(' ');\n dispatch(tr);\n }\n return true;\n }\n }\n return false;\n },\n },\n ];\n },\n};\n\nexport default extension;\n","/*\n * code_block_input.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { Schema, ResolvedPos, Fragment } from 'prosemirror-model';\nimport { InputRule } from 'prosemirror-inputrules';\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { PandocExtensions } from '../api/pandoc';\nimport { EditorFormat } from '../api/format';\nimport { Extension, ExtensionContext } from '../api/extension';\nimport { precedingListItemInsertPos, precedingListItemInsert } from '../api/list';\nimport { pandocAttrFrom } from '../api/pandoc_attr';\nimport { BaseKey } from '../api/basekeys';\n\nimport { markIsActive } from '../api/mark';\nimport { canInsertRmdChunk } from '../api/rmd';\n\nconst extension = (context: ExtensionContext): Extension => {\n const { pandocExtensions, format } = context;\n\n const fencedAttributes = pandocExtensions.fenced_code_attributes || !!format.rmdExtensions.codeChunks;\n\n return {\n baseKeys: () => {\n return [{ key: BaseKey.Enter, command: codeBlockInputRuleEnter(pandocExtensions, fencedAttributes, format) }];\n },\n\n inputRules: () => {\n if (fencedAttributes) {\n return [\n new InputRule(/^```+{$/, (state: EditorState, match: string[], start: number, end: number) => {\n if (!canApplyCodeBlockInputRule(state)) {\n return null;\n }\n const tr = state.tr;\n tr.insertText('{}');\n setTextSelection(start + match[0].length)(tr);\n return tr;\n }),\n ];\n } else {\n return [];\n }\n },\n };\n};\n\nfunction codeBlockInputRuleEnter(pandocExtensions: PandocExtensions, fencedAttributes: boolean, format: EditorFormat) {\n return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n // see if the parent consist of a pending code block input rule\n const schema = state.schema;\n const { $head } = state.selection;\n\n // selection must be empty\n if (!state.selection.empty) {\n return false;\n }\n\n // full text of parent must meet the pattern\n // eslint-disable-next-line no-useless-escape\n const match = $head.parent.textContent.match(/^```+(?:(\\w+)|\\{([\\.=]?[^\\}]+)\\})?$/);\n if (!match) {\n return false;\n }\n\n // no inline code marks\n if (markIsActive(state, schema.marks.code)) {\n return false;\n }\n\n // must be able to perform the replacement\n if (!canApplyCodeBlockInputRule(state)) {\n return false;\n }\n\n // determine nature of insert\n const fenced = fencedAttributes && !!match[2];\n const langAttrib = fenced ? match[2] : match[1] || '';\n const rawBlock = fenced && pandocExtensions.raw_attribute && langAttrib.match(/^=\\w.*$/);\n const rmdChunk = fenced && !!format.rmdExtensions.codeChunks && langAttrib.match(/^\\w.*$/);\n\n // if it's an rmd chunk then apply further validation\n if (rmdChunk && !canInsertRmdChunk(state)) {\n return false;\n }\n\n // execute\n if (dispatch) {\n // eslint-disable-next-line no-useless-escape\n const lang = langAttrib.replace(/^[\\.=]/, '');\n\n // create transaction and clear input\n const tr = state.tr;\n const start = $head.start();\n const end = start + $head.parent.textContent.length;\n tr.deleteRange(start, end);\n\n // determine type and attrs\n const type = rawBlock ? schema.nodes.raw_block : rmdChunk ? schema.nodes.rmd_chunk : schema.nodes.code_block;\n const content = rmdChunk ? schema.text(`{${match[2]}}\\n`) : Fragment.empty;\n const attrs = rawBlock ? { format: lang } : !rmdChunk && lang.length ? pandocAttrFrom({ classes: [lang] }) : {};\n\n // see if this should go into a preceding list item\n const prevListItemPos = precedingListItemInsertPos(state.doc, state.selection);\n if (prevListItemPos) {\n const block = type.createAndFill(attrs, content);\n precedingListItemInsert(tr, prevListItemPos, block);\n } else {\n tr.insert(start, content);\n tr.setBlockType(start, start, type, attrs);\n }\n\n dispatch(tr);\n }\n\n return true;\n };\n}\n\nfunction canReplaceNodeWithCodeBlock(schema: Schema, $pos: ResolvedPos) {\n return $pos.node(-1).canReplaceWith($pos.index(-1), $pos.indexAfter(-1), schema.nodes.code_block);\n}\n\nfunction canApplyCodeBlockInputRule(state: EditorState) {\n const schema = state.schema;\n const { $head } = state.selection;\n return canReplaceNodeWithCodeBlock(schema, $head) || precedingListItemInsertPos(state.doc, state.selection);\n}\n\nexport default extension;\n","/*\n * plain_text_paste.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { ResolvedPos, Schema, Fragment, Slice } from 'prosemirror-model';\nimport { Plugin, PluginKey } from 'prosemirror-state';\n\nimport { Extension } from '../api/extension';\n\nconst extension: Extension = {\n plugins: (schema: Schema) => [pasteTextPlugin(schema)],\n};\n\nfunction pasteTextPlugin(schema: Schema) {\n return new Plugin({\n key: new PluginKey('paste-text'),\n\n props: {\n clipboardTextParser: (text: string, $context: ResolvedPos): any => {\n // if it's a single line then create a slice w/ marks from the context active\n if (text.indexOf('\\n') === -1) {\n const marks = $context.marks();\n const textNode = schema.text(text, marks);\n return new Slice(Fragment.from(textNode), 0, 0);\n } else {\n return null;\n }\n },\n },\n });\n}\n\nexport default extension;\n","/*\n * bottom_padding.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Selection, Plugin, PluginKey, EditorState } from 'prosemirror-state';\nimport { Schema } from 'prosemirror-model';\n\nimport zenscroll from 'zenscroll';\n\nimport { Extension } from '../api/extension';\nimport { selectionWithinLastBodyParagraph } from '../api/selection';\nimport { EditorView } from 'prosemirror-view';\nimport { bodyElement } from '../api/dom';\nimport { findParentNodeOfType } from 'prosemirror-utils';\n\n// when we get close to the bottom, we autoscroll to provide more padding\nconst kAutoscrollGapPx = 25;\n\nconst extension: Extension = {\n plugins: (schema: Schema) => {\n return [\n new Plugin({\n key: new PluginKey('bottom_padding'),\n view: () => ({\n update: (view: EditorView, prevState: EditorState) => {\n const selection = view.state.selection;\n if (selectionWithinLastBodyParagraph(selection)) {\n const paragraphNode = findParentNodeOfType(schema.nodes.paragraph)(selection);\n if (paragraphNode) {\n const paragraphEl = view.nodeDOM(paragraphNode.pos) as HTMLElement;\n const paragraphRect = paragraphEl.getBoundingClientRect();\n const editorEl = view.dom;\n const editorRect = editorEl.getBoundingClientRect();\n if (Math.abs(paragraphRect.bottom - editorRect.bottom) < kAutoscrollGapPx) {\n const bodyEl = bodyElement(view);\n const scroller = zenscroll.createScroller(bodyEl);\n scroller.toY(bodyEl.scrollHeight, 0);\n }\n }\n }\n },\n }),\n }),\n ];\n },\n};\n\nexport default extension;\n","/*\n * insert_symbol.tsx\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { PluginKey, Transaction, EditorState } from 'prosemirror-state';\n\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { EditorUI } from '../../api/ui';\nimport { parseCodepoint } from '../../api/unicode';\nimport { OmniInsertGroup } from '../../api/omni_insert';\n\nimport { performInsertSymbol, InsertSymbolPlugin } from './insert_symbol-plugin';\nimport { SymbolDataProvider, SymbolCharacterGroup, SymbolCharacter } from './insert_symbol-dataprovider';\n\nimport symbolData from './symbols';\n\nconst key = new PluginKey<boolean>('insert-symbol');\n\nconst extension = (context: ExtensionContext): Extension => {\n const { ui, events } = context;\n return {\n commands: () => {\n return [new ProsemirrorCommand(EditorCommandId.Symbol, [], performInsertSymbol(key), symbolOmniInsert(ui))];\n },\n plugins: (_schema: Schema) => {\n return [new InsertSymbolPlugin(key, new UnicodeSymbolDataProvider(), ui, events)];\n },\n };\n};\n\nfunction symbolOmniInsert(ui: EditorUI) {\n return {\n name: ui.context.translateText('Symbol...'),\n keywords: ['unicode', 'special', 'character'],\n description: ui.context.translateText('Unicode symbol / special character'),\n group: OmniInsertGroup.Content,\n priority: 6,\n image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.symbol_dark! : ui.images.omni_insert?.symbol!),\n };\n}\n\nclass UnicodeSymbolDataProvider implements SymbolDataProvider {\n constructor() {\n this.symbolGroups = symbolData.sort((a, b) => a.name.localeCompare(b.name));\n }\n private readonly symbolGroups: SymbolCharacterGroup[];\n\n public insertSymbolTransaction(\n symbolCharacter: SymbolCharacter,\n searchTerm: string,\n state: EditorState,\n ): Transaction {\n const tr = state.tr;\n tr.insertText(symbolCharacter.value);\n return tr;\n }\n\n public readonly filterPlaceholderHint = 'keyword or codepoint';\n\n public readonly symbolPreviewStyle: React.CSSProperties = { fontSize: '28px' } as React.CSSProperties;\n\n public symbolGroupNames(): string[] {\n return [kCategoryAll, ...this.symbolGroups.map(symbolGroup => symbolGroup.name)];\n }\n\n public getSymbols(groupName: string | undefined) {\n if (groupName === undefined || groupName === kCategoryAll) {\n return this.symbolGroups\n .map(symbolGroup => symbolGroup.symbols)\n .flat()\n .sort((a, b) => a.codepoint! - b.codepoint!);\n }\n return this.symbolGroups\n .filter(symbolGroup => groupName === symbolGroup.name)\n .map(symbolGroup => symbolGroup.symbols)\n .flat();\n }\n\n public filterSymbols(filterText: string, symbols: SymbolCharacter[]): SymbolCharacter[] {\n const codepoint = parseCodepoint(filterText);\n const filteredSymbols = symbols.filter(symbol => {\n // Search by name\n if (symbol.name.includes(filterText.toUpperCase())) {\n return true;\n }\n\n // Search by codepoint\n if (codepoint && symbol.codepoint === codepoint) {\n return true;\n }\n\n return false;\n });\n\n if (filteredSymbols.length === 0 && codepoint !== undefined) {\n return [\n {\n name: codepoint.toString(16),\n value: String.fromCodePoint(codepoint),\n codepoint,\n },\n ];\n }\n return filteredSymbols;\n }\n}\nconst kCategoryAll = 'All';\n\nexport default extension;\n","/*\n * unicode.ts\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n// Tries to parse a unicode codepoint string that a user might enter\n// For example:\n// U+2A1F\n// 2A1F\n// 10783\nconst kMinValidCodepoint = 0;\nconst kMaxValidCodepoint = 1114112;\n\nconst kHexCodepointPrefix = 'U+';\nconst kHexNumberPrefex = '0x';\n\nexport function parseCodepoint(codepointText: string): number | undefined {\n // Try parsing it as a base 10 int\n // Use non primitive Number so we get strict parsing\n const base10Value = Number(codepointText).valueOf();\n if (!Number.isNaN(base10Value)) {\n if (isValidCodepoint(base10Value)) {\n return base10Value;\n }\n }\n\n // It might have a user prefix for unicode character, remove\n let hexOnlyText = codepointText.toUpperCase();\n if (hexOnlyText.startsWith(kHexCodepointPrefix.toUpperCase())) {\n hexOnlyText = codepointText.substr(kHexCodepointPrefix.length, codepointText.length - kHexCodepointPrefix.length);\n }\n\n // try parsing it as a hex string\n // Use non primitive Number so we get strict parsing, prefix with 0x to ensure treatment as hex\n if (!hexOnlyText.startsWith(kHexNumberPrefex)) {\n hexOnlyText = kHexNumberPrefex + hexOnlyText;\n }\n const hexValue = Number(hexOnlyText).valueOf();\n if (!Number.isNaN(hexValue) && isValidCodepoint(hexValue)) {\n return hexValue;\n }\n\n return undefined;\n}\n\nfunction isValidCodepoint(codepoint: number) {\n return codepoint > kMinValidCodepoint && codepoint < kMaxValidCodepoint;\n}\n","/*\n * insert_symbol-plugin.tsx\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction, Plugin, PluginKey } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport React from 'react';\nimport ReactDOM from 'react-dom';\n\nimport { applyStyles } from '../../api/css';\nimport { EditorEvents } from '../../api/events';\nimport { canInsertNode } from '../../api/node';\nimport { EditorUI } from '../../api/ui';\n\nimport { InsertSymbolPopup } from './insert_symbol-popup';\nimport { SymbolDataProvider, SymbolCharacter } from './insert_symbol-dataprovider';\n\nimport { ScrollEvent } from '../../api/event-types';\n\nconst kMinimumPanelPaddingToEdgeOfView = 5;\n\nexport const performInsertSymbol = (pluginKey: PluginKey<boolean>) => {\n return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n if (!isEnabled(state)) {\n return false;\n }\n\n if (dispatch && view) {\n const plugin = pluginKey.get(state) as InsertSymbolPlugin;\n plugin.showPopup(view);\n }\n return true;\n };\n};\n\nfunction isEnabled(state: EditorState) {\n return canInsertNode(state, state.schema.nodes.text);\n}\n\nexport class InsertSymbolPlugin extends Plugin<boolean> {\n private readonly scrollUnsubscribe: VoidFunction;\n private readonly ui: EditorUI;\n private popup: HTMLElement | null = null;\n private dataProvider: SymbolDataProvider;\n\n constructor(pluginKey: PluginKey<boolean>, dataProvider: SymbolDataProvider, ui: EditorUI, events: EditorEvents) {\n super({\n key: pluginKey,\n view: () => ({\n update: () => {\n this.closePopup();\n },\n destroy: () => {\n this.closePopup();\n this.scrollUnsubscribe();\n window.document.removeEventListener('onfocus', this.focusChanged);\n },\n }),\n });\n\n this.dataProvider = dataProvider;\n this.ui = ui;\n this.closePopup = this.closePopup.bind(this);\n this.scrollUnsubscribe = events.subscribe(ScrollEvent, this.closePopup);\n\n this.focusChanged = this.focusChanged.bind(this);\n window.document.addEventListener('onfocus', this.focusChanged);\n }\n\n public showPopup(view: EditorView) {\n if (!this.popup) {\n const kHeight = 336;\n const kWidth = 450;\n\n this.popup = window.document.createElement('div');\n this.popup.tabIndex = 0;\n this.popup.style.position = 'absolute';\n this.popup.style.zIndex = '900';\n\n applyStyles(this.popup, [], this.panelPositionStylesForCurrentSelection(view, kHeight, kWidth));\n ReactDOM.render(this.insertSymbolPopup(view, [kHeight, kWidth]), this.popup);\n window.document.body.appendChild(this.popup);\n }\n }\n\n private panelPositionStylesForCurrentSelection(view: EditorView, height: number, width: number) {\n const selection = view.state.selection;\n const editorRect = view.dom.getBoundingClientRect();\n\n const selectionCoords = view.coordsAtPos(selection.from);\n\n const maximumTopPosition = Math.min(\n selectionCoords.bottom,\n window.innerHeight - height - kMinimumPanelPaddingToEdgeOfView,\n );\n const minimumTopPosition = editorRect.y;\n const popupTopPosition = Math.max(minimumTopPosition, maximumTopPosition);\n\n const maximumLeftPosition = Math.min(\n selectionCoords.right,\n window.innerWidth - width - kMinimumPanelPaddingToEdgeOfView,\n );\n const minimumLeftPosition = editorRect.x;\n const popupLeftPosition = Math.max(minimumLeftPosition, maximumLeftPosition);\n\n // styles we'll return\n const styles = {\n top: popupTopPosition + 'px',\n left: popupLeftPosition + 'px',\n };\n\n return styles;\n }\n\n private focusChanged() {\n if (window.document.activeElement !== this.popup && !this.popup?.contains(window.document.activeElement)) {\n this.closePopup();\n }\n }\n\n private closePopup() {\n if (this.popup) {\n ReactDOM.unmountComponentAtNode(this.popup);\n this.popup.remove();\n this.popup = null;\n }\n }\n\n private insertSymbolPopup(view: EditorView, size: [number, number]) {\n const insertSymbol = (symbolCharacter: SymbolCharacter, searchTerm: string) => {\n const tr = this.dataProvider.insertSymbolTransaction(symbolCharacter, searchTerm, view.state);\n view.dispatch(tr);\n view.focus();\n };\n\n const closePopup = () => {\n this.closePopup();\n view.focus();\n };\n\n return (\n <InsertSymbolPopup\n symbolDataProvider={this.dataProvider}\n onClose={closePopup}\n onInsertSymbol={insertSymbol}\n enabled={isEnabled(view.state)}\n size={size}\n searchImage={this.ui.images.search}\n searchPlaceholder={this.ui.context.translateText(this.dataProvider.filterPlaceholderHint)}\n ui={this.ui}\n />\n );\n }\n}\n","/*\n * insert_symbol-popup.tsx\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React, { ChangeEvent } from 'react';\n\nimport { EditorUI } from '../../api/ui';\nimport { isElementFocused, focusElement } from '../../api/focus';\nimport { Popup } from '../../api/widgets/popup';\nimport { SelectInput } from '../../api/widgets/select';\nimport { TextInput } from '../../api/widgets/text';\nimport { WidgetProps } from '../../api/widgets/react';\n\nimport { SymbolDataProvider, SymbolCharacter } from './insert_symbol-dataprovider';\nimport SymbolCharacterGrid, { newIndexForKeyboardEvent } from './insert_symbol-grid';\n\nimport './insert_symbol-styles.css';\nimport { SymbolPreview } from './insert_symbol-grid-preview';\n\ninterface InsertSymbolPopupProps extends WidgetProps {\n symbolDataProvider: SymbolDataProvider;\n enabled: boolean;\n size: [number, number];\n onInsertSymbol: (symbolCharacter: SymbolCharacter, searchTerm: string) => void;\n onClose: VoidFunction;\n ui: EditorUI;\n searchImage?: string;\n searchPlaceholder?: string;\n}\n\nexport const InsertSymbolPopup: React.FC<InsertSymbolPopupProps> = props => {\n const kPopupChromeHeight = 25;\n const popupHeight = props.size[0] - kPopupChromeHeight;\n const popupWidth = props.size[1];\n const style: React.CSSProperties = {\n ...props.style,\n height: popupHeight + 'px',\n width: popupWidth + 'px',\n };\n const classNames = ['pm-popup-insert-symbol'].concat(props.classes || []);\n\n const gridHeight = popupHeight - 108;\n const gridWidth = popupWidth;\n const kNumberOfcolumns = 11;\n\n const [filterText, setFilterText] = React.useState<string>('');\n const [selectedSymbolGroup, setSelectedSymbolGroup] = React.useState<string>();\n const [selectedSymbolIndex, setSelectedSymbolIndex] = React.useState<number>(0);\n const [preferenceChanged, setPreferenceChanged] = React.useState<number>(0);\n\n const symbols = React.useMemo(() => props.symbolDataProvider.getSymbols(selectedSymbolGroup), [\n selectedSymbolGroup,\n preferenceChanged,\n props.symbolDataProvider,\n ]);\n const filteredSymbols = React.useMemo(() => props.symbolDataProvider.filterSymbols(filterText, symbols), [\n filterText,\n symbols,\n props.symbolDataProvider,\n ]);\n\n // If the symbol list gets shorter than the selected index, move\n // selected cell into range\n React.useEffect(() => {\n if (selectedSymbolIndex > filteredSymbols.length) {\n setSelectedSymbolIndex(Math.max(filteredSymbols.length - 1, 0));\n }\n }, [selectedSymbolIndex, filteredSymbols]);\n\n const textRef = React.useRef<HTMLInputElement>(null);\n const selectRef = React.useRef<HTMLSelectElement>(null);\n const gridRef = React.useRef<HTMLDivElement>(null);\n const preferenceRef = React.useRef<HTMLElement>(null);\n\n // Focus the first text box\n React.useEffect(() => {\n focusElement(textRef.current);\n }, []);\n\n const options = props.symbolDataProvider.symbolGroupNames().map(name => (\n <option key={name} value={name}>\n {props.ui.context.translateText(name)}\n </option>\n ));\n\n const handleSelectChanged = (event: ChangeEvent<Element>) => {\n const value: string = (event.target as HTMLSelectElement).selectedOptions[0].value;\n const selectedGroupName: string | undefined = props.symbolDataProvider\n .symbolGroupNames()\n .find(name => name === value);\n if (selectedGroupName) {\n setSelectedSymbolGroup(selectedGroupName);\n }\n };\n\n const handleKeyboardEvent = (event: React.KeyboardEvent<HTMLElement>) => {\n // The last element might be the preference panel, if a provider\n // provides one\n function lastElement(): React.RefObject<HTMLElement> {\n if (preferenceRef.current !== null) {\n return preferenceRef;\n }\n return gridRef;\n }\n\n // Global Key Handling\n switch (event.key) {\n case 'Escape':\n // Esc key - close popup\n props.onClose();\n event.preventDefault();\n break;\n\n case 'Tab':\n if (event.shiftKey && isElementFocused(textRef.current)) {\n focusElement(lastElement().current);\n event.preventDefault();\n } else if (!event.shiftKey && isElementFocused(lastElement().current)) {\n focusElement(textRef.current);\n event.preventDefault();\n }\n break;\n\n case 'Enter':\n if (isElementFocused(textRef.current) || isElementFocused(gridRef.current)) {\n handleSelectedSymbolCommitted();\n event.preventDefault();\n }\n break;\n\n case 'ArrowLeft':\n case 'ArrowRight':\n case 'ArrowUp':\n case 'ArrowDown':\n case 'PageUp':\n case 'PageDown':\n // If the text filter is focused, forward arrow keys to the grid. If other elements are focused\n // they may need to handle arrow keys, so don't handle them in this case\n if (isElementFocused(textRef.current) && !event.shiftKey && !event.altKey && !event.ctrlKey) {\n const newIndex = newIndexForKeyboardEvent(\n event,\n selectedSymbolIndex,\n kNumberOfcolumns,\n filteredSymbols.length,\n );\n if (newIndex !== undefined && newIndex >= 0 && newIndex !== selectedSymbolIndex) {\n event.preventDefault();\n setSelectedSymbolIndex(newIndex);\n }\n }\n break;\n default:\n break;\n }\n };\n\n const handleSelectedSymbolChanged = (symbolIndex: number) => {\n setSelectedSymbolIndex(symbolIndex);\n };\n\n const handleSelectedSymbolCommitted = () => {\n if (filteredSymbols.length > selectedSymbolIndex) {\n props.onInsertSymbol(filteredSymbols[selectedSymbolIndex], textRef.current?.value || '');\n }\n };\n\n const handleTextChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n setFilterText(event?.target.value);\n };\n\n const handlePreferencesChanged = () => {\n setPreferenceChanged(preferenceChanged + 1);\n };\n\n const preferencesProps = {\n selectedSymbolIndex,\n context: props.ui.context,\n prefs: props.ui.prefs,\n onPreferencesChanged: handlePreferencesChanged,\n ref: preferenceRef,\n };\n\n const preferencesPanel = props.symbolDataProvider.symbolPreferencesPanel\n ? React.createElement(props.symbolDataProvider.symbolPreferencesPanel, preferencesProps)\n : undefined;\n\n return (\n <Popup classes={classNames} style={style}>\n <div onKeyDown={handleKeyboardEvent}>\n <div className=\"pm-popup-insert-symbol-search-container\" style={{ width: gridWidth }}>\n <TextInput\n width={20 + 'ch'}\n iconAdornment={props.searchImage}\n tabIndex={0}\n className=\"pm-popup-insert-symbol-search-textbox\"\n placeholder={props.searchPlaceholder}\n onChange={handleTextChange}\n ref={textRef}\n />\n <SelectInput\n tabIndex={0}\n ref={selectRef}\n className=\"pm-popup-insert-symbol-select-category\"\n onChange={handleSelectChanged}\n >\n {options}\n </SelectInput>\n </div>\n\n <hr className=\"pm-popup-insert-symbol-separator pm-border-background-color\" />\n <div className=\"pm-popup-insert-symbol-grid-container\">\n <SymbolCharacterGrid\n symbolCharacters={filteredSymbols}\n selectedIndex={selectedSymbolIndex}\n onSelectionChanged={handleSelectedSymbolChanged}\n onSelectionCommitted={handleSelectedSymbolCommitted}\n height={gridHeight}\n width={gridWidth}\n numberOfColumns={kNumberOfcolumns}\n ref={gridRef}\n ui={props.ui}\n />\n <div\n className=\"pm-popup-insert-symbol-no-matching pm-light-text-color\"\n style={{ display: filteredSymbols.length > 0 ? 'none' : 'block' }}\n >\n No matching symbols\n </div>\n </div>\n <hr className=\"pm-popup-insert-symbol-separator pm-border-background-color\" />\n {filteredSymbols[selectedSymbolIndex] && (\n <SymbolPreview\n symbolCharacter={filteredSymbols[selectedSymbolIndex]}\n symbolPreviewStyle={props.symbolDataProvider.symbolPreviewStyle}\n ui={props.ui}\n >\n {preferencesPanel}\n </SymbolPreview>\n )}\n </div>\n </Popup>\n );\n};\n","/*\n * focus.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport function isElementFocused(element: HTMLElement | null): boolean {\n if (element) {\n return window.document.activeElement === element;\n }\n return false;\n}\n\nexport function focusElement(element: HTMLElement | null) {\n if (element) {\n element.focus();\n }\n}\n","/*\n * select.tsx\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React, { ChangeEventHandler, ReactNode } from 'react';\n\nimport { WidgetProps } from './react';\n\nexport interface SelectInputProps extends WidgetProps {\n tabIndex?: number;\n className?: string;\n onChange?: ChangeEventHandler;\n children: ReactNode;\n defaultValue?: string;\n}\n\nexport const SelectInput = React.forwardRef<HTMLSelectElement, SelectInputProps>((props, ref) => {\n const style: React.CSSProperties = {\n ...props.style,\n };\n\n return (\n <select\n className={`pm-input-select pm-background-color pm-pane-border-color pm-text-color ${props.className}`}\n style={style}\n tabIndex={props.tabIndex}\n ref={ref}\n onChange={props.onChange}\n defaultValue={props.defaultValue}\n >\n {props.children}\n </select>\n );\n});\n","/*\n * text.tsx\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React, { ChangeEventHandler, KeyboardEventHandler, FocusEventHandler, ClipboardEventHandler } from 'react';\n\nimport { WidgetProps } from './react';\n\nimport './text.css';\n\nexport interface TextInputProps extends WidgetProps {\n width: string;\n tabIndex?: number;\n className?: string;\n placeholder?: string;\n iconAdornment?: string;\n value?: string;\n onChange?: ChangeEventHandler;\n onKeyDown?: KeyboardEventHandler<HTMLInputElement>;\n onKeyUp?: KeyboardEventHandler<HTMLInputElement>;\n onKeyPress?: KeyboardEventHandler<HTMLInputElement>;\n onBlur?: FocusEventHandler<HTMLInputElement>;\n onPaste?: ClipboardEventHandler<HTMLInputElement>;\n onFocus?: FocusEventHandler<HTMLInputElement>;\n}\n\nexport const TextInput = React.forwardRef<HTMLInputElement, TextInputProps>((props, ref) => {\n // Allow specifying an actual width (e.g. a percentage) or a character width\n // If a character width is specified, we should prefer to use the size attribute of the input\n // as the focus widget that is added to focus elements is confused by the 'ch' size in styles\n const characterWidth = props.width.endsWith('ch')\n ? parseInt(props.width.substr(0, props.width.length - 2), 10)\n : undefined;\n const style: React.CSSProperties = {\n ...props.style,\n width: characterWidth ? undefined : props.width,\n };\n\n return (\n <div className=\"pm-textinput-container\" style={style}>\n {props.iconAdornment ? <img src={props.iconAdornment} className=\"pm-textinput-icon\" alt=\"\" draggable=\"false\"/> : undefined}\n <input\n type=\"text\"\n placeholder={props.placeholder}\n size={characterWidth}\n className={`\n pm-input-text \n pm-textinput-input \n pm-text-color \n pm-background-color \n ${props.className}\n ${props.iconAdornment ? 'pm-textinput-input-with-icon' : ''}`}\n value={props.value !== undefined ? props.value : undefined}\n onChange={props.onChange}\n onKeyDown={props.onKeyDown}\n onKeyUp={props.onKeyUp}\n onKeyPress={props.onKeyPress}\n onBlur={props.onBlur}\n onFocus={props.onFocus}\n tabIndex={props.tabIndex}\n onPaste={props.onPaste}\n ref={ref}\n spellCheck={false}\n />\n </div>\n );\n});\n","/*\n * insert_symbol-grid.tsx\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\nimport { FixedSizeGrid } from 'react-window';\n\nimport debounce from 'lodash.debounce';\n\nimport { EditorUI } from '../../api/ui';\nimport { WidgetProps } from '../../api/widgets/react';\n\nimport { CharacterGridCellItemData, SymbolCharacterCell } from './insert_symbol-grid-cell';\nimport { SymbolCharacter } from './insert_symbol-dataprovider';\n\nimport './insert_symbol-grid-styles.css';\n\ninterface CharacterGridProps extends WidgetProps {\n height: number;\n width: number;\n numberOfColumns: number;\n symbolCharacters: SymbolCharacter[];\n selectedIndex: number;\n onSelectionChanged: (selectedIndex: number) => void;\n onSelectionCommitted: VoidFunction;\n ui: EditorUI;\n}\n\nconst selectedItemClassName = 'pm-grid-item-selected';\n\nconst SymbolCharacterGrid = React.forwardRef<any, CharacterGridProps>((props, ref) => {\n const columnWidth = Math.floor(props.width / props.numberOfColumns);\n const characterCellData: CharacterGridCellItemData = {\n symbolCharacters: props.symbolCharacters,\n numberOfColumns: props.numberOfColumns,\n selectedIndex: props.selectedIndex,\n onSelectionChanged: props.onSelectionChanged,\n onSelectionCommitted: props.onSelectionCommitted,\n selectedItemClassName,\n };\n\n const gridRef = React.useRef<FixedSizeGrid>(null);\n const handleScroll = debounce(() => {\n gridRef.current?.scrollToItem({ rowIndex: Math.floor(props.selectedIndex / props.numberOfColumns) });\n }, 5);\n\n React.useEffect(handleScroll, [props.selectedIndex]);\n\n const handleKeyDown = (event: React.KeyboardEvent) => {\n const newIndex = newIndexForKeyboardEvent(\n event,\n props.selectedIndex,\n props.numberOfColumns,\n props.symbolCharacters.length,\n );\n if (newIndex !== undefined) {\n props.onSelectionChanged(newIndex);\n event.preventDefault();\n }\n };\n\n return (\n <div onKeyDown={handleKeyDown} tabIndex={0} ref={ref}>\n <FixedSizeGrid\n columnCount={props.numberOfColumns}\n rowCount={Math.ceil(props.symbolCharacters.length / props.numberOfColumns)}\n height={props.height}\n width={props.width + 1}\n rowHeight={columnWidth}\n columnWidth={columnWidth}\n itemData={characterCellData}\n className=\"pm-symbol-grid\"\n ref={gridRef}\n >\n {SymbolCharacterCell}\n </FixedSizeGrid>\n </div>\n );\n});\n\nfunction previous(currentIndex: number, numberOfColumns: number, numberOfCells: number): number {\n const newIndex = currentIndex - 1;\n return Math.max(0, newIndex);\n}\nfunction next(currentIndex: number, numberOfColumns: number, numberOfCells: number): number {\n const newIndex = currentIndex + 1;\n return Math.min(numberOfCells - 1, newIndex);\n}\nfunction prevRow(currentIndex: number, numberOfColumns: number, numberOfCells: number): number {\n const newIndex = currentIndex - numberOfColumns;\n return newIndex >= 0 ? newIndex : currentIndex;\n}\nfunction nextRow(currentIndex: number, numberOfColumns: number, numberOfCells: number): number {\n const newIndex = currentIndex + numberOfColumns;\n return newIndex < numberOfCells ? newIndex : currentIndex;\n}\nfunction nextPage(currentIndex: number, numberOfColumns: number, numberOfCells: number): number {\n const newIndex = currentIndex + 6 * numberOfColumns;\n return Math.min(numberOfCells - 1, newIndex);\n}\nfunction prevPage(currentIndex: number, numberOfColumns: number, numberOfCells: number): number {\n const newIndex = currentIndex - 6 * numberOfColumns;\n return Math.max(0, newIndex);\n}\n\nexport const newIndexForKeyboardEvent = (\n event: React.KeyboardEvent,\n selectedIndex: number,\n numberOfColumns: number,\n numberOfCells: number,\n): number | undefined => {\n switch (event.key) {\n case 'ArrowLeft': // left\n return previous(selectedIndex, numberOfColumns, numberOfCells);\n\n case 'ArrowUp': // up\n return prevRow(selectedIndex, numberOfColumns, numberOfCells);\n\n case 'ArrowRight': // right\n return next(selectedIndex, numberOfColumns, numberOfCells);\n\n case 'ArrowDown': // down\n return nextRow(selectedIndex, numberOfColumns, numberOfCells);\n\n case 'PageDown':\n return nextPage(selectedIndex, numberOfColumns, numberOfCells);\n\n case 'PageUp':\n return prevPage(selectedIndex, numberOfColumns, numberOfCells);\n\n case 'Home':\n return 0;\n\n case 'End':\n return numberOfCells - 1;\n\n default:\n return undefined;\n }\n};\n\nexport default SymbolCharacterGrid;\n","/*\n * insert_symbol-grid-cell.tsx\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\nimport { GridChildComponentProps } from 'react-window';\n\nimport { SymbolCharacter } from './insert_symbol-dataprovider';\n\nexport interface CharacterGridCellItemData {\n symbolCharacters: SymbolCharacter[];\n numberOfColumns: number;\n selectedIndex: number;\n selectedItemClassName: string;\n onSelectionChanged: (selectedIndex: number) => void;\n onSelectionCommitted: VoidFunction;\n}\n\nexport const SymbolCharacterCell = (props: GridChildComponentProps) => {\n const characterGridCellItemData = props.data as CharacterGridCellItemData;\n const symbolCharacters = characterGridCellItemData.symbolCharacters;\n const itemIndex = props.rowIndex * characterGridCellItemData.numberOfColumns + props.columnIndex;\n\n const handleMouseEnter = (event: React.MouseEvent) => {\n characterGridCellItemData.onSelectionChanged(itemIndex);\n };\n\n // If we don't handle and eat the mouse down event, the mouse down will propagate to the parent\n // editor and result in loss of focus to this element\n const handleMouseDown = (event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n };\n\n const handleMouseClick = (event: React.MouseEvent) => {\n event.preventDefault();\n event.stopPropagation();\n characterGridCellItemData.onSelectionCommitted();\n };\n\n if (itemIndex < symbolCharacters.length) {\n const ch = symbolCharacters[itemIndex];\n return (\n <div\n tabIndex={-1}\n style={props.style}\n className=\"pm-symbol-grid-container\"\n onClick={handleMouseClick}\n onMouseDown={handleMouseDown}\n onMouseEnter={handleMouseEnter}\n >\n <div\n className={`pm-symbol-grid-cell pm-grid-item pm-emoji-font ${\n characterGridCellItemData.selectedIndex === itemIndex ? characterGridCellItemData.selectedItemClassName : ''\n }`}\n >\n {ch.value || ''}\n </div>\n </div>\n );\n } else {\n return null;\n }\n};\n","/*\n * insert_symbol-grid-preview.tsx\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React, { CSSProperties, ReactNode } from 'react';\n\nimport { EditorUI } from '../../api/ui';\nimport { WidgetProps } from '../../api/widgets/react';\n\nimport { SymbolCharacter } from './insert_symbol-dataprovider';\n\nimport './insert_symbol-grid-preview.css';\n\ninterface SymbolPreviewProps extends WidgetProps {\n symbolCharacter: SymbolCharacter;\n symbolPreviewStyle: CSSProperties;\n ui: EditorUI;\n children: ReactNode;\n}\n\nexport const SymbolPreview = React.forwardRef<any, SymbolPreviewProps>((props, ref) => {\n return (\n <div style={{ height: '54px' }} className=\"pm-popup-insert-symbol-preview-container\" ref={ref}>\n <div className=\"pm-popup-insert-symbol-preview-thumbnail\">\n <div style={props.symbolPreviewStyle}>{props.symbolCharacter.value}</div>\n <div className=\"pm-popup-insert-symbol-preview-summary\">\n <div className=\"pm-popup-insert-symbol-preview-name pm-text-color\">\n {props.ui.context.translateText(props.symbolCharacter.name)}\n </div>\n <div className=\"pm-popup-insert-symbol-preview-markdown pm-light-text-color\">\n {props.symbolCharacter.markdown || `U+${props.symbolCharacter.codepoint?.toString(16)}`}\n </div>\n </div>\n </div>\n <div className=\"pm-popup-insert-symbol-preview-action\">{props.children}</div>\n </div>\n );\n});\n","import { SymbolCharacterGroup } from './insert_symbol-dataprovider';\n\nconst symbols: SymbolCharacterGroup[] = [\n {\n name: 'Miscellaneous',\n symbols: [\n {\n name: 'NO-BREAK SPACE',\n value: ' ',\n codepoint: 160,\n },\n {\n name: 'INVERTED EXCLAMATION MARK',\n value: '¡',\n codepoint: 161,\n },\n {\n name: 'CENT SIGN',\n value: '¢',\n codepoint: 162,\n },\n {\n name: 'POUND SIGN',\n value: '£',\n codepoint: 163,\n },\n {\n name: 'CURRENCY SIGN',\n value: '¤',\n codepoint: 164,\n },\n {\n name: 'YEN SIGN',\n value: '¥',\n codepoint: 165,\n },\n {\n name: 'BROKEN BAR',\n value: '¦',\n codepoint: 166,\n },\n {\n name: 'SECTION SIGN',\n value: '§',\n codepoint: 167,\n },\n {\n name: 'DIAERESIS',\n value: '¨',\n codepoint: 168,\n },\n {\n name: 'FEMININE ORDINAL INDICATOR',\n value: 'ª',\n codepoint: 170,\n },\n {\n name: 'LEFT-POINTING DOUBLE ANGLE QUOTATION MARK',\n value: '«',\n codepoint: 171,\n },\n {\n name: 'NOT SIGN',\n value: '¬',\n codepoint: 172,\n },\n {\n name: 'MACRON',\n value: '¯',\n codepoint: 175,\n },\n {\n name: 'DEGREE SIGN',\n value: '°',\n codepoint: 176,\n },\n {\n name: 'PLUS-MINUS SIGN',\n value: '±',\n codepoint: 177,\n },\n {\n name: 'SUPERSCRIPT TWO',\n value: '²',\n codepoint: 178,\n },\n {\n name: 'SUPERSCRIPT THREE',\n value: '³',\n codepoint: 179,\n },\n {\n name: 'ACUTE ACCENT',\n value: '´',\n codepoint: 180,\n },\n {\n name: 'MICRO SIGN',\n value: 'µ',\n codepoint: 181,\n },\n {\n name: 'PILCROW SIGN',\n value: '¶',\n codepoint: 182,\n },\n {\n name: 'MIDDLE DOT',\n value: '·',\n codepoint: 183,\n },\n {\n name: 'CEDILLA',\n value: '¸',\n codepoint: 184,\n },\n {\n name: 'SUPERSCRIPT ONE',\n value: '¹',\n codepoint: 185,\n },\n {\n name: 'MASCULINE ORDINAL INDICATOR',\n value: 'º',\n codepoint: 186,\n },\n {\n name: 'RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK',\n value: '»',\n codepoint: 187,\n },\n {\n name: 'VULGAR FRACTION ONE QUARTER',\n value: '¼',\n codepoint: 188,\n },\n {\n name: 'VULGAR FRACTION ONE HALF',\n value: '½',\n codepoint: 189,\n },\n {\n name: 'VULGAR FRACTION THREE QUARTERS',\n value: '¾',\n codepoint: 190,\n },\n {\n name: 'INVERTED QUESTION MARK',\n value: '¿',\n codepoint: 191,\n },\n {\n name: 'LATIN CAPITAL LETTER A WITH GRAVE',\n value: 'À',\n codepoint: 192,\n },\n {\n name: 'LATIN CAPITAL LETTER A WITH ACUTE',\n value: 'Á',\n codepoint: 193,\n },\n {\n name: 'LATIN CAPITAL LETTER A WITH CIRCUMFLEX',\n value: 'Â',\n codepoint: 194,\n },\n {\n name: 'LATIN CAPITAL LETTER A WITH TILDE',\n value: 'Ã',\n codepoint: 195,\n },\n {\n name: 'LATIN CAPITAL LETTER A WITH DIAERESIS',\n value: 'Ä',\n codepoint: 196,\n },\n {\n name: 'LATIN CAPITAL LETTER A WITH RING ABOVE',\n value: 'Å',\n codepoint: 197,\n },\n {\n name: 'LATIN CAPITAL LETTER AE',\n value: 'Æ',\n codepoint: 198,\n },\n {\n name: 'LATIN CAPITAL LETTER C WITH CEDILLA',\n value: 'Ç',\n codepoint: 199,\n },\n {\n name: 'LATIN CAPITAL LETTER E WITH GRAVE',\n value: 'È',\n codepoint: 200,\n },\n {\n name: 'LATIN CAPITAL LETTER E WITH ACUTE',\n value: 'É',\n codepoint: 201,\n },\n {\n name: 'LATIN CAPITAL LETTER E WITH CIRCUMFLEX',\n value: 'Ê',\n codepoint: 202,\n },\n {\n name: 'LATIN CAPITAL LETTER E WITH DIAERESIS',\n value: 'Ë',\n codepoint: 203,\n },\n {\n name: 'LATIN CAPITAL LETTER I WITH GRAVE',\n value: 'Ì',\n codepoint: 204,\n },\n {\n name: 'LATIN CAPITAL LETTER I WITH ACUTE',\n value: 'Í',\n codepoint: 205,\n },\n {\n name: 'LATIN CAPITAL LETTER I WITH CIRCUMFLEX',\n value: 'Î',\n codepoint: 206,\n },\n {\n name: 'LATIN CAPITAL LETTER I WITH DIAERESIS',\n value: 'Ï',\n codepoint: 207,\n },\n {\n name: 'LATIN CAPITAL LETTER ETH',\n value: 'Ð',\n codepoint: 208,\n },\n {\n name: 'LATIN CAPITAL LETTER N WITH TILDE',\n value: 'Ñ',\n codepoint: 209,\n },\n {\n name: 'LATIN CAPITAL LETTER O WITH GRAVE',\n value: 'Ò',\n codepoint: 210,\n },\n {\n name: 'LATIN CAPITAL LETTER O WITH ACUTE',\n value: 'Ó',\n codepoint: 211,\n },\n {\n name: 'LATIN CAPITAL LETTER O WITH CIRCUMFLEX',\n value: 'Ô',\n codepoint: 212,\n },\n {\n name: 'LATIN CAPITAL LETTER O WITH TILDE',\n value: 'Õ',\n codepoint: 213,\n },\n {\n name: 'LATIN CAPITAL LETTER O WITH DIAERESIS',\n value: 'Ö',\n codepoint: 214,\n },\n {\n name: 'MULTIPLICATION SIGN',\n value: '×',\n codepoint: 215,\n },\n {\n name: 'LATIN CAPITAL LETTER O WITH STROKE',\n value: 'Ø',\n codepoint: 216,\n },\n {\n name: 'LATIN CAPITAL LETTER U WITH GRAVE',\n value: 'Ù',\n codepoint: 217,\n },\n {\n name: 'LATIN CAPITAL LETTER U WITH ACUTE',\n value: 'Ú',\n codepoint: 218,\n },\n {\n name: 'LATIN CAPITAL LETTER U WITH CIRCUMFLEX',\n value: 'Û',\n codepoint: 219,\n },\n {\n name: 'LATIN CAPITAL LETTER U WITH DIAERESIS',\n value: 'Ü',\n codepoint: 220,\n },\n {\n name: 'LATIN CAPITAL LETTER Y WITH ACUTE',\n value: 'Ý',\n codepoint: 221,\n },\n {\n name: 'LATIN CAPITAL LETTER THORN',\n value: 'Þ',\n codepoint: 222,\n },\n {\n name: 'LATIN SMALL LETTER SHARP S',\n value: 'ß',\n codepoint: 223,\n },\n {\n name: 'LATIN SMALL LETTER A WITH GRAVE',\n value: 'à',\n codepoint: 224,\n },\n {\n name: 'LATIN SMALL LETTER A WITH ACUTE',\n value: 'á',\n codepoint: 225,\n },\n {\n name: 'LATIN SMALL LETTER A WITH CIRCUMFLEX',\n value: 'â',\n codepoint: 226,\n },\n {\n name: 'LATIN SMALL LETTER A WITH TILDE',\n value: 'ã',\n codepoint: 227,\n },\n {\n name: 'LATIN SMALL LETTER A WITH DIAERESIS',\n value: 'ä',\n codepoint: 228,\n },\n {\n name: 'LATIN SMALL LETTER A WITH RING ABOVE',\n value: 'å',\n codepoint: 229,\n },\n {\n name: 'LATIN SMALL LETTER AE',\n value: 'æ',\n codepoint: 230,\n },\n {\n name: 'LATIN SMALL LETTER C WITH CEDILLA',\n value: 'ç',\n codepoint: 231,\n },\n {\n name: 'LATIN SMALL LETTER E WITH GRAVE',\n value: 'è',\n codepoint: 232,\n },\n {\n name: 'LATIN SMALL LETTER E WITH ACUTE',\n value: 'é',\n codepoint: 233,\n },\n {\n name: 'LATIN SMALL LETTER E WITH CIRCUMFLEX',\n value: 'ê',\n codepoint: 234,\n },\n {\n name: 'LATIN SMALL LETTER E WITH DIAERESIS',\n value: 'ë',\n codepoint: 235,\n },\n {\n name: 'LATIN SMALL LETTER I WITH GRAVE',\n value: 'ì',\n codepoint: 236,\n },\n {\n name: 'LATIN SMALL LETTER I WITH ACUTE',\n value: 'í',\n codepoint: 237,\n },\n {\n name: 'LATIN SMALL LETTER I WITH CIRCUMFLEX',\n value: 'î',\n codepoint: 238,\n },\n {\n name: 'LATIN SMALL LETTER I WITH DIAERESIS',\n value: 'ï',\n codepoint: 239,\n },\n {\n name: 'LATIN SMALL LETTER ETH',\n value: 'ð',\n codepoint: 240,\n },\n {\n name: 'LATIN SMALL LETTER N WITH TILDE',\n value: 'ñ',\n codepoint: 241,\n },\n {\n name: 'LATIN SMALL LETTER O WITH GRAVE',\n value: 'ò',\n codepoint: 242,\n },\n {\n name: 'LATIN SMALL LETTER O WITH ACUTE',\n value: 'ó',\n codepoint: 243,\n },\n {\n name: 'LATIN SMALL LETTER O WITH CIRCUMFLEX',\n value: 'ô',\n codepoint: 244,\n },\n {\n name: 'LATIN SMALL LETTER O WITH TILDE',\n value: 'õ',\n codepoint: 245,\n },\n {\n name: 'LATIN SMALL LETTER O WITH DIAERESIS',\n value: 'ö',\n codepoint: 246,\n },\n {\n name: 'DIVISION SIGN',\n value: '÷',\n codepoint: 247,\n },\n {\n name: 'LATIN SMALL LETTER O WITH STROKE',\n value: 'ø',\n codepoint: 248,\n },\n {\n name: 'LATIN SMALL LETTER U WITH GRAVE',\n value: 'ù',\n codepoint: 249,\n },\n {\n name: 'LATIN SMALL LETTER U WITH ACUTE',\n value: 'ú',\n codepoint: 250,\n },\n {\n name: 'LATIN SMALL LETTER U WITH CIRCUMFLEX',\n value: 'û',\n codepoint: 251,\n },\n {\n name: 'LATIN SMALL LETTER U WITH DIAERESIS',\n value: 'ü',\n codepoint: 252,\n },\n {\n name: 'LATIN SMALL LETTER Y WITH ACUTE',\n value: 'ý',\n codepoint: 253,\n },\n {\n name: 'LATIN SMALL LETTER THORN',\n value: 'þ',\n codepoint: 254,\n },\n {\n name: 'LATIN SMALL LETTER Y WITH DIAERESIS',\n value: 'ÿ',\n codepoint: 255,\n },\n {\n name: 'ACCOUNT OF',\n value: '℀',\n codepoint: 8448,\n },\n {\n name: 'ADDRESSED TO THE SUBJECT',\n value: '℁',\n codepoint: 8449,\n },\n {\n name: 'DOUBLE-STRUCK CAPITAL C',\n value: 'ℂ',\n codepoint: 8450,\n },\n {\n name: 'DEGREE CELSIUS',\n value: '℃',\n codepoint: 8451,\n },\n {\n name: 'CENTRE LINE SYMBOL',\n value: '℄',\n codepoint: 8452,\n },\n {\n name: 'CARE OF',\n value: '℅',\n codepoint: 8453,\n },\n {\n name: 'CADA UNA',\n value: '℆',\n codepoint: 8454,\n },\n {\n name: 'EULER CONSTANT',\n value: 'ℇ',\n codepoint: 8455,\n },\n {\n name: 'SCRUPLE',\n value: '℈',\n codepoint: 8456,\n },\n {\n name: 'DEGREE FAHRENHEIT',\n value: '℉',\n codepoint: 8457,\n },\n {\n name: 'SCRIPT SMALL G',\n value: 'ℊ',\n codepoint: 8458,\n },\n {\n name: 'SCRIPT CAPITAL H',\n value: 'ℋ',\n codepoint: 8459,\n },\n {\n name: 'BLACK-LETTER CAPITAL H',\n value: 'ℌ',\n codepoint: 8460,\n },\n {\n name: 'DOUBLE-STRUCK CAPITAL H',\n value: 'ℍ',\n codepoint: 8461,\n },\n {\n name: 'PLANCK CONSTANT',\n value: 'ℎ',\n codepoint: 8462,\n },\n {\n name: 'PLANCK CONSTANT OVER TWO PI',\n value: 'ℏ',\n codepoint: 8463,\n },\n {\n name: 'SCRIPT CAPITAL I',\n value: 'ℐ',\n codepoint: 8464,\n },\n {\n name: 'BLACK-LETTER CAPITAL I',\n value: 'ℑ',\n codepoint: 8465,\n },\n {\n name: 'SCRIPT CAPITAL L',\n value: 'ℒ',\n codepoint: 8466,\n },\n {\n name: 'SCRIPT SMALL L',\n value: 'ℓ',\n codepoint: 8467,\n },\n {\n name: 'L B BAR SYMBOL',\n value: '℔',\n codepoint: 8468,\n },\n {\n name: 'DOUBLE-STRUCK CAPITAL N',\n value: 'ℕ',\n codepoint: 8469,\n },\n {\n name: 'NUMERO SIGN',\n value: '№',\n codepoint: 8470,\n },\n {\n name: 'SOUND RECORDING COPYRIGHT',\n value: '℗',\n codepoint: 8471,\n },\n {\n name: 'SCRIPT CAPITAL P',\n value: '℘',\n codepoint: 8472,\n },\n {\n name: 'DOUBLE-STRUCK CAPITAL P',\n value: 'ℙ',\n codepoint: 8473,\n },\n {\n name: 'DOUBLE-STRUCK CAPITAL Q',\n value: 'ℚ',\n codepoint: 8474,\n },\n {\n name: 'SCRIPT CAPITAL R',\n value: 'ℛ',\n codepoint: 8475,\n },\n {\n name: 'BLACK-LETTER CAPITAL R',\n value: 'ℜ',\n codepoint: 8476,\n },\n {\n name: 'DOUBLE-STRUCK CAPITAL R',\n value: 'ℝ',\n codepoint: 8477,\n },\n {\n name: 'PRESCRIPTION TAKE',\n value: '℞',\n codepoint: 8478,\n },\n {\n name: 'RESPONSE',\n value: '℟',\n codepoint: 8479,\n },\n {\n name: 'SERVICE MARK',\n value: '℠',\n codepoint: 8480,\n },\n {\n name: 'TELEPHONE SIGN',\n value: '℡',\n codepoint: 8481,\n },\n {\n name: 'VERSICLE',\n value: '℣',\n codepoint: 8483,\n },\n {\n name: 'DOUBLE-STRUCK CAPITAL Z',\n value: 'ℤ',\n codepoint: 8484,\n },\n {\n name: 'OUNCE SIGN',\n value: '℥',\n codepoint: 8485,\n },\n {\n name: 'OHM SIGN',\n value: 'Ω',\n codepoint: 8486,\n },\n {\n name: 'INVERTED OHM SIGN',\n value: '℧',\n codepoint: 8487,\n },\n {\n name: 'BLACK-LETTER CAPITAL Z',\n value: 'ℨ',\n codepoint: 8488,\n },\n {\n name: 'TURNED GREEK SMALL LETTER IOTA',\n value: '℩',\n codepoint: 8489,\n },\n {\n name: 'KELVIN SIGN',\n value: 'K',\n codepoint: 8490,\n },\n {\n name: 'ANGSTROM SIGN',\n value: 'Å',\n codepoint: 8491,\n },\n {\n name: 'SCRIPT CAPITAL B',\n value: 'ℬ',\n codepoint: 8492,\n },\n {\n name: 'BLACK-LETTER CAPITAL C',\n value: 'ℭ',\n codepoint: 8493,\n },\n {\n name: 'ESTIMATED SYMBOL',\n value: '℮',\n codepoint: 8494,\n },\n {\n name: 'SCRIPT SMALL E',\n value: 'ℯ',\n codepoint: 8495,\n },\n {\n name: 'SCRIPT CAPITAL E',\n value: 'ℰ',\n codepoint: 8496,\n },\n {\n name: 'SCRIPT CAPITAL F',\n value: 'ℱ',\n codepoint: 8497,\n },\n {\n name: 'TURNED CAPITAL F',\n value: 'Ⅎ',\n codepoint: 8498,\n },\n {\n name: 'SCRIPT CAPITAL M',\n value: 'ℳ',\n codepoint: 8499,\n },\n {\n name: 'SCRIPT SMALL O',\n value: 'ℴ',\n codepoint: 8500,\n },\n {\n name: 'ALEF SYMBOL',\n value: 'ℵ',\n codepoint: 8501,\n },\n {\n name: 'BET SYMBOL',\n value: 'ℶ',\n codepoint: 8502,\n },\n {\n name: 'GIMEL SYMBOL',\n value: 'ℷ',\n codepoint: 8503,\n },\n {\n name: 'DALET SYMBOL',\n value: 'ℸ',\n codepoint: 8504,\n },\n {\n name: 'ROTATED CAPITAL Q',\n value: '℺',\n codepoint: 8506,\n },\n {\n name: 'FACSIMILE SIGN',\n value: '℻',\n codepoint: 8507,\n },\n {\n name: 'DOUBLE-STRUCK SMALL PI',\n value: 'ℼ',\n codepoint: 8508,\n },\n {\n name: 'DOUBLE-STRUCK SMALL GAMMA',\n value: 'ℽ',\n codepoint: 8509,\n },\n {\n name: 'DOUBLE-STRUCK CAPITAL GAMMA',\n value: 'ℾ',\n codepoint: 8510,\n },\n {\n name: 'DOUBLE-STRUCK CAPITAL PI',\n value: 'ℿ',\n codepoint: 8511,\n },\n {\n name: 'DOUBLE-STRUCK N-ARY SUMMATION',\n value: '⅀',\n codepoint: 8512,\n },\n {\n name: 'TURNED SANS-SERIF CAPITAL G',\n value: '⅁',\n codepoint: 8513,\n },\n {\n name: 'TURNED SANS-SERIF CAPITAL L',\n value: '⅂',\n codepoint: 8514,\n },\n {\n name: 'REVERSED SANS-SERIF CAPITAL L',\n value: '⅃',\n codepoint: 8515,\n },\n {\n name: 'TURNED SANS-SERIF CAPITAL Y',\n value: '⅄',\n codepoint: 8516,\n },\n {\n name: 'DOUBLE-STRUCK ITALIC CAPITAL D',\n value: 'ⅅ',\n codepoint: 8517,\n },\n {\n name: 'DOUBLE-STRUCK ITALIC SMALL D',\n value: 'ⅆ',\n codepoint: 8518,\n },\n {\n name: 'DOUBLE-STRUCK ITALIC SMALL E',\n value: 'ⅇ',\n codepoint: 8519,\n },\n {\n name: 'DOUBLE-STRUCK ITALIC SMALL I',\n value: 'ⅈ',\n codepoint: 8520,\n },\n {\n name: 'DOUBLE-STRUCK ITALIC SMALL J',\n value: 'ⅉ',\n codepoint: 8521,\n },\n {\n name: 'PROPERTY LINE',\n value: '⅊',\n codepoint: 8522,\n },\n {\n name: 'TURNED AMPERSAND',\n value: '⅋',\n codepoint: 8523,\n },\n {\n name: 'PER SIGN',\n value: '⅌',\n codepoint: 8524,\n },\n {\n name: 'AKTIESELSKAB',\n value: '⅍',\n codepoint: 8525,\n },\n {\n name: 'TURNED SMALL F',\n value: 'ⅎ',\n codepoint: 8526,\n },\n {\n name: 'SYMBOL FOR SAMARITAN SOURCE',\n value: '⅏',\n codepoint: 8527,\n },\n {\n name: 'CIRCLED DIGIT ONE',\n value: '①',\n codepoint: 9312,\n },\n {\n name: 'CIRCLED DIGIT TWO',\n value: '②',\n codepoint: 9313,\n },\n {\n name: 'CIRCLED DIGIT THREE',\n value: '③',\n codepoint: 9314,\n },\n {\n name: 'CIRCLED DIGIT FOUR',\n value: '④',\n codepoint: 9315,\n },\n {\n name: 'CIRCLED DIGIT FIVE',\n value: '⑤',\n codepoint: 9316,\n },\n {\n name: 'CIRCLED DIGIT SIX',\n value: '⑥',\n codepoint: 9317,\n },\n {\n name: 'CIRCLED DIGIT SEVEN',\n value: '⑦',\n codepoint: 9318,\n },\n {\n name: 'CIRCLED DIGIT EIGHT',\n value: '⑧',\n codepoint: 9319,\n },\n {\n name: 'CIRCLED DIGIT NINE',\n value: '⑨',\n codepoint: 9320,\n },\n {\n name: 'CIRCLED NUMBER TEN',\n value: '⑩',\n codepoint: 9321,\n },\n {\n name: 'CIRCLED NUMBER ELEVEN',\n value: '⑪',\n codepoint: 9322,\n },\n {\n name: 'CIRCLED NUMBER TWELVE',\n value: '⑫',\n codepoint: 9323,\n },\n {\n name: 'CIRCLED NUMBER THIRTEEN',\n value: '⑬',\n codepoint: 9324,\n },\n {\n name: 'CIRCLED NUMBER FOURTEEN',\n value: '⑭',\n codepoint: 9325,\n },\n {\n name: 'CIRCLED NUMBER FIFTEEN',\n value: '⑮',\n codepoint: 9326,\n },\n {\n name: 'CIRCLED NUMBER SIXTEEN',\n value: '⑯',\n codepoint: 9327,\n },\n {\n name: 'CIRCLED NUMBER SEVENTEEN',\n value: '⑰',\n codepoint: 9328,\n },\n {\n name: 'CIRCLED NUMBER EIGHTEEN',\n value: '⑱',\n codepoint: 9329,\n },\n {\n name: 'CIRCLED NUMBER NINETEEN',\n value: '⑲',\n codepoint: 9330,\n },\n {\n name: 'CIRCLED NUMBER TWENTY',\n value: '⑳',\n codepoint: 9331,\n },\n {\n name: 'PARENTHESIZED DIGIT ONE',\n value: '⑴',\n codepoint: 9332,\n },\n {\n name: 'PARENTHESIZED DIGIT TWO',\n value: '⑵',\n codepoint: 9333,\n },\n {\n name: 'PARENTHESIZED DIGIT THREE',\n value: '⑶',\n codepoint: 9334,\n },\n {\n name: 'PARENTHESIZED DIGIT FOUR',\n value: '⑷',\n codepoint: 9335,\n },\n {\n name: 'PARENTHESIZED DIGIT FIVE',\n value: '⑸',\n codepoint: 9336,\n },\n {\n name: 'PARENTHESIZED DIGIT SIX',\n value: '⑹',\n codepoint: 9337,\n },\n {\n name: 'PARENTHESIZED DIGIT SEVEN',\n value: '⑺',\n codepoint: 9338,\n },\n {\n name: 'PARENTHESIZED DIGIT EIGHT',\n value: '⑻',\n codepoint: 9339,\n },\n {\n name: 'PARENTHESIZED DIGIT NINE',\n value: '⑼',\n codepoint: 9340,\n },\n {\n name: 'PARENTHESIZED NUMBER TEN',\n value: '⑽',\n codepoint: 9341,\n },\n {\n name: 'PARENTHESIZED NUMBER ELEVEN',\n value: '⑾',\n codepoint: 9342,\n },\n {\n name: 'PARENTHESIZED NUMBER TWELVE',\n value: '⑿',\n codepoint: 9343,\n },\n {\n name: 'PARENTHESIZED NUMBER THIRTEEN',\n value: '⒀',\n codepoint: 9344,\n },\n {\n name: 'PARENTHESIZED NUMBER FOURTEEN',\n value: '⒁',\n codepoint: 9345,\n },\n {\n name: 'PARENTHESIZED NUMBER FIFTEEN',\n value: '⒂',\n codepoint: 9346,\n },\n {\n name: 'PARENTHESIZED NUMBER SIXTEEN',\n value: '⒃',\n codepoint: 9347,\n },\n {\n name: 'PARENTHESIZED NUMBER SEVENTEEN',\n value: '⒄',\n codepoint: 9348,\n },\n {\n name: 'PARENTHESIZED NUMBER EIGHTEEN',\n value: '⒅',\n codepoint: 9349,\n },\n {\n name: 'PARENTHESIZED NUMBER NINETEEN',\n value: '⒆',\n codepoint: 9350,\n },\n {\n name: 'PARENTHESIZED NUMBER TWENTY',\n value: '⒇',\n codepoint: 9351,\n },\n {\n name: 'DIGIT ONE FULL STOP',\n value: '⒈',\n codepoint: 9352,\n },\n {\n name: 'DIGIT TWO FULL STOP',\n value: '⒉',\n codepoint: 9353,\n },\n {\n name: 'DIGIT THREE FULL STOP',\n value: '⒊',\n codepoint: 9354,\n },\n {\n name: 'DIGIT FOUR FULL STOP',\n value: '⒋',\n codepoint: 9355,\n },\n {\n name: 'DIGIT FIVE FULL STOP',\n value: '⒌',\n codepoint: 9356,\n },\n {\n name: 'DIGIT SIX FULL STOP',\n value: '⒍',\n codepoint: 9357,\n },\n {\n name: 'DIGIT SEVEN FULL STOP',\n value: '⒎',\n codepoint: 9358,\n },\n {\n name: 'DIGIT EIGHT FULL STOP',\n value: '⒏',\n codepoint: 9359,\n },\n {\n name: 'DIGIT NINE FULL STOP',\n value: '⒐',\n codepoint: 9360,\n },\n {\n name: 'NUMBER TEN FULL STOP',\n value: '⒑',\n codepoint: 9361,\n },\n {\n name: 'NUMBER ELEVEN FULL STOP',\n value: '⒒',\n codepoint: 9362,\n },\n {\n name: 'NUMBER TWELVE FULL STOP',\n value: '⒓',\n codepoint: 9363,\n },\n {\n name: 'NUMBER THIRTEEN FULL STOP',\n value: '⒔',\n codepoint: 9364,\n },\n {\n name: 'NUMBER FOURTEEN FULL STOP',\n value: '⒕',\n codepoint: 9365,\n },\n {\n name: 'NUMBER FIFTEEN FULL STOP',\n value: '⒖',\n codepoint: 9366,\n },\n {\n name: 'NUMBER SIXTEEN FULL STOP',\n value: '⒗',\n codepoint: 9367,\n },\n {\n name: 'NUMBER SEVENTEEN FULL STOP',\n value: '⒘',\n codepoint: 9368,\n },\n {\n name: 'NUMBER EIGHTEEN FULL STOP',\n value: '⒙',\n codepoint: 9369,\n },\n {\n name: 'NUMBER NINETEEN FULL STOP',\n value: '⒚',\n codepoint: 9370,\n },\n {\n name: 'NUMBER TWENTY FULL STOP',\n value: '⒛',\n codepoint: 9371,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER A',\n value: '⒜',\n codepoint: 9372,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER B',\n value: '⒝',\n codepoint: 9373,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER C',\n value: '⒞',\n codepoint: 9374,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER D',\n value: '⒟',\n codepoint: 9375,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER E',\n value: '⒠',\n codepoint: 9376,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER F',\n value: '⒡',\n codepoint: 9377,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER G',\n value: '⒢',\n codepoint: 9378,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER H',\n value: '⒣',\n codepoint: 9379,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER I',\n value: '⒤',\n codepoint: 9380,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER J',\n value: '⒥',\n codepoint: 9381,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER K',\n value: '⒦',\n codepoint: 9382,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER L',\n value: '⒧',\n codepoint: 9383,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER M',\n value: '⒨',\n codepoint: 9384,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER N',\n value: '⒩',\n codepoint: 9385,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER O',\n value: '⒪',\n codepoint: 9386,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER P',\n value: '⒫',\n codepoint: 9387,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER Q',\n value: '⒬',\n codepoint: 9388,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER R',\n value: '⒭',\n codepoint: 9389,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER S',\n value: '⒮',\n codepoint: 9390,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER T',\n value: '⒯',\n codepoint: 9391,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER U',\n value: '⒰',\n codepoint: 9392,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER V',\n value: '⒱',\n codepoint: 9393,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER W',\n value: '⒲',\n codepoint: 9394,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER X',\n value: '⒳',\n codepoint: 9395,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER Y',\n value: '⒴',\n codepoint: 9396,\n },\n {\n name: 'PARENTHESIZED LATIN SMALL LETTER Z',\n value: '⒵',\n codepoint: 9397,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER A',\n value: 'Ⓐ',\n codepoint: 9398,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER B',\n value: 'Ⓑ',\n codepoint: 9399,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER C',\n value: 'Ⓒ',\n codepoint: 9400,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER D',\n value: 'Ⓓ',\n codepoint: 9401,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER E',\n value: 'Ⓔ',\n codepoint: 9402,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER F',\n value: 'Ⓕ',\n codepoint: 9403,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER G',\n value: 'Ⓖ',\n codepoint: 9404,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER H',\n value: 'Ⓗ',\n codepoint: 9405,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER I',\n value: 'Ⓘ',\n codepoint: 9406,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER J',\n value: 'Ⓙ',\n codepoint: 9407,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER K',\n value: 'Ⓚ',\n codepoint: 9408,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER L',\n value: 'Ⓛ',\n codepoint: 9409,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER N',\n value: 'Ⓝ',\n codepoint: 9411,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER O',\n value: 'Ⓞ',\n codepoint: 9412,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER P',\n value: 'Ⓟ',\n codepoint: 9413,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER Q',\n value: 'Ⓠ',\n codepoint: 9414,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER R',\n value: 'Ⓡ',\n codepoint: 9415,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER S',\n value: 'Ⓢ',\n codepoint: 9416,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER T',\n value: 'Ⓣ',\n codepoint: 9417,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER U',\n value: 'Ⓤ',\n codepoint: 9418,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER V',\n value: 'Ⓥ',\n codepoint: 9419,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER W',\n value: 'Ⓦ',\n codepoint: 9420,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER X',\n value: 'Ⓧ',\n codepoint: 9421,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER Y',\n value: 'Ⓨ',\n codepoint: 9422,\n },\n {\n name: 'CIRCLED LATIN CAPITAL LETTER Z',\n value: 'Ⓩ',\n codepoint: 9423,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER A',\n value: 'ⓐ',\n codepoint: 9424,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER B',\n value: 'ⓑ',\n codepoint: 9425,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER C',\n value: 'ⓒ',\n codepoint: 9426,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER D',\n value: 'ⓓ',\n codepoint: 9427,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER E',\n value: 'ⓔ',\n codepoint: 9428,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER F',\n value: 'ⓕ',\n codepoint: 9429,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER G',\n value: 'ⓖ',\n codepoint: 9430,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER H',\n value: 'ⓗ',\n codepoint: 9431,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER I',\n value: 'ⓘ',\n codepoint: 9432,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER J',\n value: 'ⓙ',\n codepoint: 9433,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER K',\n value: 'ⓚ',\n codepoint: 9434,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER L',\n value: 'ⓛ',\n codepoint: 9435,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER M',\n value: 'ⓜ',\n codepoint: 9436,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER N',\n value: 'ⓝ',\n codepoint: 9437,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER O',\n value: 'ⓞ',\n codepoint: 9438,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER P',\n value: 'ⓟ',\n codepoint: 9439,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER Q',\n value: 'ⓠ',\n codepoint: 9440,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER R',\n value: 'ⓡ',\n codepoint: 9441,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER S',\n value: 'ⓢ',\n codepoint: 9442,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER T',\n value: 'ⓣ',\n codepoint: 9443,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER U',\n value: 'ⓤ',\n codepoint: 9444,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER V',\n value: 'ⓥ',\n codepoint: 9445,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER W',\n value: 'ⓦ',\n codepoint: 9446,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER X',\n value: 'ⓧ',\n codepoint: 9447,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER Y',\n value: 'ⓨ',\n codepoint: 9448,\n },\n {\n name: 'CIRCLED LATIN SMALL LETTER Z',\n value: 'ⓩ',\n codepoint: 9449,\n },\n {\n name: 'CIRCLED DIGIT ZERO',\n value: '⓪',\n codepoint: 9450,\n },\n {\n name: 'NEGATIVE CIRCLED NUMBER ELEVEN',\n value: '⓫',\n codepoint: 9451,\n },\n {\n name: 'NEGATIVE CIRCLED NUMBER TWELVE',\n value: '⓬',\n codepoint: 9452,\n },\n {\n name: 'NEGATIVE CIRCLED NUMBER THIRTEEN',\n value: '⓭',\n codepoint: 9453,\n },\n {\n name: 'NEGATIVE CIRCLED NUMBER FOURTEEN',\n value: '⓮',\n codepoint: 9454,\n },\n {\n name: 'NEGATIVE CIRCLED NUMBER FIFTEEN',\n value: '⓯',\n codepoint: 9455,\n },\n {\n name: 'NEGATIVE CIRCLED NUMBER SIXTEEN',\n value: '⓰',\n codepoint: 9456,\n },\n {\n name: 'NEGATIVE CIRCLED NUMBER SEVENTEEN',\n value: '⓱',\n codepoint: 9457,\n },\n {\n name: 'NEGATIVE CIRCLED NUMBER EIGHTEEN',\n value: '⓲',\n codepoint: 9458,\n },\n {\n name: 'NEGATIVE CIRCLED NUMBER NINETEEN',\n value: '⓳',\n codepoint: 9459,\n },\n {\n name: 'NEGATIVE CIRCLED NUMBER TWENTY',\n value: '⓴',\n codepoint: 9460,\n },\n {\n name: 'DOUBLE CIRCLED DIGIT ONE',\n value: '⓵',\n codepoint: 9461,\n },\n {\n name: 'DOUBLE CIRCLED DIGIT TWO',\n value: '⓶',\n codepoint: 9462,\n },\n {\n name: 'DOUBLE CIRCLED DIGIT THREE',\n value: '⓷',\n codepoint: 9463,\n },\n {\n name: 'DOUBLE CIRCLED DIGIT FOUR',\n value: '⓸',\n codepoint: 9464,\n },\n {\n name: 'DOUBLE CIRCLED DIGIT FIVE',\n value: '⓹',\n codepoint: 9465,\n },\n {\n name: 'DOUBLE CIRCLED DIGIT SIX',\n value: '⓺',\n codepoint: 9466,\n },\n {\n name: 'DOUBLE CIRCLED DIGIT SEVEN',\n value: '⓻',\n codepoint: 9467,\n },\n {\n name: 'DOUBLE CIRCLED DIGIT EIGHT',\n value: '⓼',\n codepoint: 9468,\n },\n {\n name: 'DOUBLE CIRCLED DIGIT NINE',\n value: '⓽',\n codepoint: 9469,\n },\n {\n name: 'DOUBLE CIRCLED NUMBER TEN',\n value: '⓾',\n codepoint: 9470,\n },\n {\n name: 'NEGATIVE CIRCLED DIGIT ZERO',\n value: '⓿',\n codepoint: 9471,\n },\n {\n name: 'BLACK STAR',\n value: '★',\n codepoint: 9733,\n },\n {\n name: 'WHITE STAR',\n value: '☆',\n codepoint: 9734,\n },\n {\n name: 'LIGHTNING',\n value: '☇',\n codepoint: 9735,\n },\n {\n name: 'THUNDERSTORM',\n value: '☈',\n codepoint: 9736,\n },\n {\n name: 'SUN',\n value: '☉',\n codepoint: 9737,\n },\n {\n name: 'ASCENDING NODE',\n value: '☊',\n codepoint: 9738,\n },\n {\n name: 'DESCENDING NODE',\n value: '☋',\n codepoint: 9739,\n },\n {\n name: 'CONJUNCTION',\n value: '☌',\n codepoint: 9740,\n },\n {\n name: 'OPPOSITION',\n value: '☍',\n codepoint: 9741,\n },\n {\n name: 'WHITE TELEPHONE',\n value: '☏',\n codepoint: 9743,\n },\n {\n name: 'BALLOT BOX',\n value: '☐',\n codepoint: 9744,\n },\n {\n name: 'BALLOT BOX WITH X',\n value: '☒',\n codepoint: 9746,\n },\n {\n name: 'SALTIRE',\n value: '☓',\n codepoint: 9747,\n },\n {\n name: 'WHITE SHOGI PIECE',\n value: '☖',\n codepoint: 9750,\n },\n {\n name: 'BLACK SHOGI PIECE',\n value: '☗',\n codepoint: 9751,\n },\n {\n name: 'REVERSED ROTATED FLORAL HEART BULLET',\n value: '☙',\n codepoint: 9753,\n },\n {\n name: 'BLACK LEFT POINTING INDEX',\n value: '☚',\n codepoint: 9754,\n },\n {\n name: 'BLACK RIGHT POINTING INDEX',\n value: '☛',\n codepoint: 9755,\n },\n {\n name: 'WHITE LEFT POINTING INDEX',\n value: '☜',\n codepoint: 9756,\n },\n {\n name: 'WHITE RIGHT POINTING INDEX',\n value: '☞',\n codepoint: 9758,\n },\n {\n name: 'WHITE DOWN POINTING INDEX',\n value: '☟',\n codepoint: 9759,\n },\n {\n name: 'CAUTION SIGN',\n value: '☡',\n codepoint: 9761,\n },\n {\n name: 'CADUCEUS',\n value: '☤',\n codepoint: 9764,\n },\n {\n name: 'ANKH',\n value: '☥',\n codepoint: 9765,\n },\n {\n name: 'CHI RHO',\n value: '☧',\n codepoint: 9767,\n },\n {\n name: 'CROSS OF LORRAINE',\n value: '☨',\n codepoint: 9768,\n },\n {\n name: 'CROSS OF JERUSALEM',\n value: '☩',\n codepoint: 9769,\n },\n {\n name: 'FARSI SYMBOL',\n value: '☫',\n codepoint: 9771,\n },\n {\n name: 'ADI SHAKTI',\n value: '☬',\n codepoint: 9772,\n },\n {\n name: 'HAMMER AND SICKLE',\n value: '☭',\n codepoint: 9773,\n },\n {\n name: 'TRIGRAM FOR HEAVEN',\n value: '☰',\n codepoint: 9776,\n },\n {\n name: 'TRIGRAM FOR LAKE',\n value: '☱',\n codepoint: 9777,\n },\n {\n name: 'TRIGRAM FOR FIRE',\n value: '☲',\n codepoint: 9778,\n },\n {\n name: 'TRIGRAM FOR THUNDER',\n value: '☳',\n codepoint: 9779,\n },\n {\n name: 'TRIGRAM FOR WIND',\n value: '☴',\n codepoint: 9780,\n },\n {\n name: 'TRIGRAM FOR WATER',\n value: '☵',\n codepoint: 9781,\n },\n {\n name: 'TRIGRAM FOR MOUNTAIN',\n value: '☶',\n codepoint: 9782,\n },\n {\n name: 'TRIGRAM FOR EARTH',\n value: '☷',\n codepoint: 9783,\n },\n {\n name: 'BLACK SMILING FACE',\n value: '☻',\n codepoint: 9787,\n },\n {\n name: 'WHITE SUN WITH RAYS',\n value: '☼',\n codepoint: 9788,\n },\n {\n name: 'FIRST QUARTER MOON',\n value: '☽',\n codepoint: 9789,\n },\n {\n name: 'LAST QUARTER MOON',\n value: '☾',\n codepoint: 9790,\n },\n {\n name: 'MERCURY',\n value: '☿',\n codepoint: 9791,\n },\n {\n name: 'EARTH',\n value: '♁',\n codepoint: 9793,\n },\n {\n name: 'JUPITER',\n value: '♃',\n codepoint: 9795,\n },\n {\n name: 'SATURN',\n value: '♄',\n codepoint: 9796,\n },\n {\n name: 'URANUS',\n value: '♅',\n codepoint: 9797,\n },\n {\n name: 'NEPTUNE',\n value: '♆',\n codepoint: 9798,\n },\n {\n name: 'PLUTO',\n value: '♇',\n codepoint: 9799,\n },\n {\n name: 'WHITE CHESS KING',\n value: '♔',\n codepoint: 9812,\n },\n {\n name: 'WHITE CHESS QUEEN',\n value: '♕',\n codepoint: 9813,\n },\n {\n name: 'WHITE CHESS ROOK',\n value: '♖',\n codepoint: 9814,\n },\n {\n name: 'WHITE CHESS BISHOP',\n value: '♗',\n codepoint: 9815,\n },\n {\n name: 'WHITE CHESS KNIGHT',\n value: '♘',\n codepoint: 9816,\n },\n {\n name: 'WHITE CHESS PAWN',\n value: '♙',\n codepoint: 9817,\n },\n {\n name: 'BLACK CHESS KING',\n value: '♚',\n codepoint: 9818,\n },\n {\n name: 'BLACK CHESS QUEEN',\n value: '♛',\n codepoint: 9819,\n },\n {\n name: 'BLACK CHESS ROOK',\n value: '♜',\n codepoint: 9820,\n },\n {\n name: 'BLACK CHESS BISHOP',\n value: '♝',\n codepoint: 9821,\n },\n {\n name: 'BLACK CHESS KNIGHT',\n value: '♞',\n codepoint: 9822,\n },\n {\n name: 'WHITE HEART SUIT',\n value: '♡',\n codepoint: 9825,\n },\n {\n name: 'WHITE DIAMOND SUIT',\n value: '♢',\n codepoint: 9826,\n },\n {\n name: 'WHITE SPADE SUIT',\n value: '♤',\n codepoint: 9828,\n },\n {\n name: 'WHITE CLUB SUIT',\n value: '♧',\n codepoint: 9831,\n },\n {\n name: 'QUARTER NOTE',\n value: '♩',\n codepoint: 9833,\n },\n {\n name: 'EIGHTH NOTE',\n value: '♪',\n codepoint: 9834,\n },\n {\n name: 'BEAMED EIGHTH NOTES',\n value: '♫',\n codepoint: 9835,\n },\n {\n name: 'BEAMED SIXTEENTH NOTES',\n value: '♬',\n codepoint: 9836,\n },\n {\n name: 'MUSIC FLAT SIGN',\n value: '♭',\n codepoint: 9837,\n },\n {\n name: 'MUSIC NATURAL SIGN',\n value: '♮',\n codepoint: 9838,\n },\n {\n name: 'MUSIC SHARP SIGN',\n value: '♯',\n codepoint: 9839,\n },\n {\n name: 'WEST SYRIAC CROSS',\n value: '♰',\n codepoint: 9840,\n },\n {\n name: 'EAST SYRIAC CROSS',\n value: '♱',\n codepoint: 9841,\n },\n {\n name: 'UNIVERSAL RECYCLING SYMBOL',\n value: '♲',\n codepoint: 9842,\n },\n {\n name: 'RECYCLING SYMBOL FOR TYPE-1 PLASTICS',\n value: '♳',\n codepoint: 9843,\n },\n {\n name: 'RECYCLING SYMBOL FOR TYPE-2 PLASTICS',\n value: '♴',\n codepoint: 9844,\n },\n {\n name: 'RECYCLING SYMBOL FOR TYPE-3 PLASTICS',\n value: '♵',\n codepoint: 9845,\n },\n {\n name: 'RECYCLING SYMBOL FOR TYPE-4 PLASTICS',\n value: '♶',\n codepoint: 9846,\n },\n {\n name: 'RECYCLING SYMBOL FOR TYPE-5 PLASTICS',\n value: '♷',\n codepoint: 9847,\n },\n {\n name: 'RECYCLING SYMBOL FOR TYPE-6 PLASTICS',\n value: '♸',\n codepoint: 9848,\n },\n {\n name: 'RECYCLING SYMBOL FOR TYPE-7 PLASTICS',\n value: '♹',\n codepoint: 9849,\n },\n {\n name: 'RECYCLING SYMBOL FOR GENERIC MATERIALS',\n value: '♺',\n codepoint: 9850,\n },\n {\n name: 'RECYCLED PAPER SYMBOL',\n value: '♼',\n codepoint: 9852,\n },\n {\n name: 'PARTIALLY-RECYCLED PAPER SYMBOL',\n value: '♽',\n codepoint: 9853,\n },\n {\n name: 'DIE FACE-1',\n value: '⚀',\n codepoint: 9856,\n },\n {\n name: 'DIE FACE-2',\n value: '⚁',\n codepoint: 9857,\n },\n {\n name: 'DIE FACE-3',\n value: '⚂',\n codepoint: 9858,\n },\n {\n name: 'DIE FACE-4',\n value: '⚃',\n codepoint: 9859,\n },\n {\n name: 'DIE FACE-5',\n value: '⚄',\n codepoint: 9860,\n },\n {\n name: 'DIE FACE-6',\n value: '⚅',\n codepoint: 9861,\n },\n {\n name: 'WHITE CIRCLE WITH DOT RIGHT',\n value: '⚆',\n codepoint: 9862,\n },\n {\n name: 'WHITE CIRCLE WITH TWO DOTS',\n value: '⚇',\n codepoint: 9863,\n },\n {\n name: 'BLACK CIRCLE WITH WHITE DOT RIGHT',\n value: '⚈',\n codepoint: 9864,\n },\n {\n name: 'BLACK CIRCLE WITH TWO WHITE DOTS',\n value: '⚉',\n codepoint: 9865,\n },\n {\n name: 'MONOGRAM FOR YANG',\n value: '⚊',\n codepoint: 9866,\n },\n {\n name: 'MONOGRAM FOR YIN',\n value: '⚋',\n codepoint: 9867,\n },\n {\n name: 'DIGRAM FOR GREATER YANG',\n value: '⚌',\n codepoint: 9868,\n },\n {\n name: 'DIGRAM FOR LESSER YIN',\n value: '⚍',\n codepoint: 9869,\n },\n {\n name: 'DIGRAM FOR LESSER YANG',\n value: '⚎',\n codepoint: 9870,\n },\n {\n name: 'DIGRAM FOR GREATER YIN',\n value: '⚏',\n codepoint: 9871,\n },\n {\n name: 'WHITE FLAG',\n value: '⚐',\n codepoint: 9872,\n },\n {\n name: 'BLACK FLAG',\n value: '⚑',\n codepoint: 9873,\n },\n {\n name: 'FLOWER',\n value: '⚘',\n codepoint: 9880,\n },\n {\n name: 'STAFF OF HERMES',\n value: '⚚',\n codepoint: 9882,\n },\n {\n name: 'DOUBLED FEMALE SIGN',\n value: '⚢',\n codepoint: 9890,\n },\n {\n name: 'DOUBLED MALE SIGN',\n value: '⚣',\n codepoint: 9891,\n },\n {\n name: 'INTERLOCKED FEMALE AND MALE SIGN',\n value: '⚤',\n codepoint: 9892,\n },\n {\n name: 'MALE AND FEMALE SIGN',\n value: '⚥',\n codepoint: 9893,\n },\n {\n name: 'MALE WITH STROKE SIGN',\n value: '⚦',\n codepoint: 9894,\n },\n {\n name: 'VERTICAL MALE WITH STROKE SIGN',\n value: '⚨',\n codepoint: 9896,\n },\n {\n name: 'HORIZONTAL MALE WITH STROKE SIGN',\n value: '⚩',\n codepoint: 9897,\n },\n {\n name: 'MEDIUM SMALL WHITE CIRCLE',\n value: '⚬',\n codepoint: 9900,\n },\n {\n name: 'MARRIAGE SYMBOL',\n value: '⚭',\n codepoint: 9901,\n },\n {\n name: 'DIVORCE SYMBOL',\n value: '⚮',\n codepoint: 9902,\n },\n {\n name: 'UNMARRIED PARTNERSHIP SYMBOL',\n value: '⚯',\n codepoint: 9903,\n },\n {\n name: 'NEUTER',\n value: '⚲',\n codepoint: 9906,\n },\n {\n name: 'WHITE DIAMOND IN SQUARE',\n value: '⛋',\n codepoint: 9931,\n },\n {\n name: 'ASTRONOMICAL SYMBOL FOR URANUS',\n value: '⛢',\n codepoint: 9954,\n },\n {\n name: 'UPPER BLADE SCISSORS',\n value: '✁',\n codepoint: 9985,\n },\n {\n name: 'LOWER BLADE SCISSORS',\n value: '✃',\n codepoint: 9987,\n },\n {\n name: 'WHITE SCISSORS',\n value: '✄',\n codepoint: 9988,\n },\n {\n name: 'TELEPHONE LOCATION SIGN',\n value: '✆',\n codepoint: 9990,\n },\n {\n name: 'TAPE DRIVE',\n value: '✇',\n codepoint: 9991,\n },\n {\n name: 'LOWER RIGHT PENCIL',\n value: '✎',\n codepoint: 9998,\n },\n {\n name: 'UPPER RIGHT PENCIL',\n value: '✐',\n codepoint: 10000,\n },\n {\n name: 'WHITE NIB',\n value: '✑',\n codepoint: 10001,\n },\n {\n name: 'CHECK MARK',\n value: '✓',\n codepoint: 10003,\n },\n {\n name: 'MULTIPLICATION X',\n value: '✕',\n codepoint: 10005,\n },\n {\n name: 'BALLOT X',\n value: '✗',\n codepoint: 10007,\n },\n {\n name: 'HEAVY BALLOT X',\n value: '✘',\n codepoint: 10008,\n },\n {\n name: 'OUTLINED GREEK CROSS',\n value: '✙',\n codepoint: 10009,\n },\n {\n name: 'HEAVY GREEK CROSS',\n value: '✚',\n codepoint: 10010,\n },\n {\n name: 'OPEN CENTRE CROSS',\n value: '✛',\n codepoint: 10011,\n },\n {\n name: 'HEAVY OPEN CENTRE CROSS',\n value: '✜',\n codepoint: 10012,\n },\n {\n name: 'SHADOWED WHITE LATIN CROSS',\n value: '✞',\n codepoint: 10014,\n },\n {\n name: 'OUTLINED LATIN CROSS',\n value: '✟',\n codepoint: 10015,\n },\n {\n name: 'MALTESE CROSS',\n value: '✠',\n codepoint: 10016,\n },\n {\n name: 'FOUR TEARDROP-SPOKED ASTERISK',\n value: '✢',\n codepoint: 10018,\n },\n {\n name: 'FOUR BALLOON-SPOKED ASTERISK',\n value: '✣',\n codepoint: 10019,\n },\n {\n name: 'HEAVY FOUR BALLOON-SPOKED ASTERISK',\n value: '✤',\n codepoint: 10020,\n },\n {\n name: 'FOUR CLUB-SPOKED ASTERISK',\n value: '✥',\n codepoint: 10021,\n },\n {\n name: 'BLACK FOUR POINTED STAR',\n value: '✦',\n codepoint: 10022,\n },\n {\n name: 'WHITE FOUR POINTED STAR',\n value: '✧',\n codepoint: 10023,\n },\n {\n name: 'STRESS OUTLINED WHITE STAR',\n value: '✩',\n codepoint: 10025,\n },\n {\n name: 'CIRCLED WHITE STAR',\n value: '✪',\n codepoint: 10026,\n },\n {\n name: 'OPEN CENTRE BLACK STAR',\n value: '✫',\n codepoint: 10027,\n },\n {\n name: 'BLACK CENTRE WHITE STAR',\n value: '✬',\n codepoint: 10028,\n },\n {\n name: 'OUTLINED BLACK STAR',\n value: '✭',\n codepoint: 10029,\n },\n {\n name: 'HEAVY OUTLINED BLACK STAR',\n value: '✮',\n codepoint: 10030,\n },\n {\n name: 'PINWHEEL STAR',\n value: '✯',\n codepoint: 10031,\n },\n {\n name: 'SHADOWED WHITE STAR',\n value: '✰',\n codepoint: 10032,\n },\n {\n name: 'HEAVY ASTERISK',\n value: '✱',\n codepoint: 10033,\n },\n {\n name: 'OPEN CENTRE ASTERISK',\n value: '✲',\n codepoint: 10034,\n },\n {\n name: 'EIGHT POINTED PINWHEEL STAR',\n value: '✵',\n codepoint: 10037,\n },\n {\n name: 'SIX POINTED BLACK STAR',\n value: '✶',\n codepoint: 10038,\n },\n {\n name: 'EIGHT POINTED RECTILINEAR BLACK STAR',\n value: '✷',\n codepoint: 10039,\n },\n {\n name: 'HEAVY EIGHT POINTED RECTILINEAR BLACK STAR',\n value: '✸',\n codepoint: 10040,\n },\n {\n name: 'TWELVE POINTED BLACK STAR',\n value: '✹',\n codepoint: 10041,\n },\n {\n name: 'SIXTEEN POINTED ASTERISK',\n value: '✺',\n codepoint: 10042,\n },\n {\n name: 'TEARDROP-SPOKED ASTERISK',\n value: '✻',\n codepoint: 10043,\n },\n {\n name: 'OPEN CENTRE TEARDROP-SPOKED ASTERISK',\n value: '✼',\n codepoint: 10044,\n },\n {\n name: 'HEAVY TEARDROP-SPOKED ASTERISK',\n value: '✽',\n codepoint: 10045,\n },\n {\n name: 'SIX PETALLED BLACK AND WHITE FLORETTE',\n value: '✾',\n codepoint: 10046,\n },\n {\n name: 'BLACK FLORETTE',\n value: '✿',\n codepoint: 10047,\n },\n {\n name: 'WHITE FLORETTE',\n value: '❀',\n codepoint: 10048,\n },\n {\n name: 'EIGHT PETALLED OUTLINED BLACK FLORETTE',\n value: '❁',\n codepoint: 10049,\n },\n {\n name: 'CIRCLED OPEN CENTRE EIGHT POINTED STAR',\n value: '❂',\n codepoint: 10050,\n },\n {\n name: 'HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK',\n value: '❃',\n codepoint: 10051,\n },\n {\n name: 'TIGHT TRIFOLIATE SNOWFLAKE',\n value: '❅',\n codepoint: 10053,\n },\n {\n name: 'HEAVY CHEVRON SNOWFLAKE',\n value: '❆',\n codepoint: 10054,\n },\n {\n name: 'HEAVY SPARKLE',\n value: '❈',\n codepoint: 10056,\n },\n {\n name: 'BALLOON-SPOKED ASTERISK',\n value: '❉',\n codepoint: 10057,\n },\n {\n name: 'EIGHT TEARDROP-SPOKED PROPELLER ASTERISK',\n value: '❊',\n codepoint: 10058,\n },\n {\n name: 'HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK',\n value: '❋',\n codepoint: 10059,\n },\n {\n name: 'SHADOWED WHITE CIRCLE',\n value: '❍',\n codepoint: 10061,\n },\n {\n name: 'LOWER RIGHT DROP-SHADOWED WHITE SQUARE',\n value: '❏',\n codepoint: 10063,\n },\n {\n name: 'UPPER RIGHT DROP-SHADOWED WHITE SQUARE',\n value: '❐',\n codepoint: 10064,\n },\n {\n name: 'LOWER RIGHT SHADOWED WHITE SQUARE',\n value: '❑',\n codepoint: 10065,\n },\n {\n name: 'UPPER RIGHT SHADOWED WHITE SQUARE',\n value: '❒',\n codepoint: 10066,\n },\n {\n name: 'BLACK DIAMOND MINUS WHITE X',\n value: '❖',\n codepoint: 10070,\n },\n {\n name: 'LIGHT VERTICAL BAR',\n value: '❘',\n codepoint: 10072,\n },\n {\n name: 'MEDIUM VERTICAL BAR',\n value: '❙',\n codepoint: 10073,\n },\n {\n name: 'HEAVY VERTICAL BAR',\n value: '❚',\n codepoint: 10074,\n },\n {\n name: 'HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT',\n value: '❛',\n codepoint: 10075,\n },\n {\n name: 'HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT',\n value: '❜',\n codepoint: 10076,\n },\n {\n name: 'HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT',\n value: '❝',\n codepoint: 10077,\n },\n {\n name: 'HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT',\n value: '❞',\n codepoint: 10078,\n },\n {\n name: 'CURVED STEM PARAGRAPH SIGN ORNAMENT',\n value: '❡',\n codepoint: 10081,\n },\n {\n name: 'HEAVY EXCLAMATION MARK ORNAMENT',\n value: '❢',\n codepoint: 10082,\n },\n {\n name: 'ROTATED HEAVY BLACK HEART BULLET',\n value: '❥',\n codepoint: 10085,\n },\n {\n name: 'FLORAL HEART',\n value: '❦',\n codepoint: 10086,\n },\n {\n name: 'ROTATED FLORAL HEART BULLET',\n value: '❧',\n codepoint: 10087,\n },\n {\n name: 'MEDIUM LEFT PARENTHESIS ORNAMENT',\n value: '❨',\n codepoint: 10088,\n },\n {\n name: 'MEDIUM RIGHT PARENTHESIS ORNAMENT',\n value: '❩',\n codepoint: 10089,\n },\n {\n name: 'MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT',\n value: '❪',\n codepoint: 10090,\n },\n {\n name: 'MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT',\n value: '❫',\n codepoint: 10091,\n },\n {\n name: 'MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT',\n value: '❬',\n codepoint: 10092,\n },\n {\n name: 'MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT',\n value: '❭',\n codepoint: 10093,\n },\n {\n name: 'HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT',\n value: '❮',\n codepoint: 10094,\n },\n {\n name: 'HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT',\n value: '❯',\n codepoint: 10095,\n },\n {\n name: 'HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT',\n value: '❰',\n codepoint: 10096,\n },\n {\n name: 'HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT',\n value: '❱',\n codepoint: 10097,\n },\n {\n name: 'LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT',\n value: '❲',\n codepoint: 10098,\n },\n {\n name: 'LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT',\n value: '❳',\n codepoint: 10099,\n },\n {\n name: 'MEDIUM LEFT CURLY BRACKET ORNAMENT',\n value: '❴',\n codepoint: 10100,\n },\n {\n name: 'MEDIUM RIGHT CURLY BRACKET ORNAMENT',\n value: '❵',\n codepoint: 10101,\n },\n {\n name: 'DINGBAT NEGATIVE CIRCLED DIGIT ONE',\n value: '❶',\n codepoint: 10102,\n },\n {\n name: 'DINGBAT NEGATIVE CIRCLED DIGIT TWO',\n value: '❷',\n codepoint: 10103,\n },\n {\n name: 'DINGBAT NEGATIVE CIRCLED DIGIT THREE',\n value: '❸',\n codepoint: 10104,\n },\n {\n name: 'DINGBAT NEGATIVE CIRCLED DIGIT FOUR',\n value: '❹',\n codepoint: 10105,\n },\n {\n name: 'DINGBAT NEGATIVE CIRCLED DIGIT FIVE',\n value: '❺',\n codepoint: 10106,\n },\n {\n name: 'DINGBAT NEGATIVE CIRCLED DIGIT SIX',\n value: '❻',\n codepoint: 10107,\n },\n {\n name: 'DINGBAT NEGATIVE CIRCLED DIGIT SEVEN',\n value: '❼',\n codepoint: 10108,\n },\n {\n name: 'DINGBAT NEGATIVE CIRCLED DIGIT EIGHT',\n value: '❽',\n codepoint: 10109,\n },\n {\n name: 'DINGBAT NEGATIVE CIRCLED DIGIT NINE',\n value: '❾',\n codepoint: 10110,\n },\n {\n name: 'DINGBAT NEGATIVE CIRCLED NUMBER TEN',\n value: '❿',\n codepoint: 10111,\n },\n {\n name: 'DINGBAT CIRCLED SANS-SERIF DIGIT ONE',\n value: '➀',\n codepoint: 10112,\n },\n {\n name: 'DINGBAT CIRCLED SANS-SERIF DIGIT TWO',\n value: '➁',\n codepoint: 10113,\n },\n {\n name: 'DINGBAT CIRCLED SANS-SERIF DIGIT THREE',\n value: '➂',\n codepoint: 10114,\n },\n {\n name: 'DINGBAT CIRCLED SANS-SERIF DIGIT FOUR',\n value: '➃',\n codepoint: 10115,\n },\n {\n name: 'DINGBAT CIRCLED SANS-SERIF DIGIT FIVE',\n value: '➄',\n codepoint: 10116,\n },\n {\n name: 'DINGBAT CIRCLED SANS-SERIF DIGIT SIX',\n value: '➅',\n codepoint: 10117,\n },\n {\n name: 'DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN',\n value: '➆',\n codepoint: 10118,\n },\n {\n name: 'DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT',\n value: '➇',\n codepoint: 10119,\n },\n {\n name: 'DINGBAT CIRCLED SANS-SERIF DIGIT NINE',\n value: '➈',\n codepoint: 10120,\n },\n {\n name: 'DINGBAT CIRCLED SANS-SERIF NUMBER TEN',\n value: '➉',\n codepoint: 10121,\n },\n {\n name: 'DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE',\n value: '➊',\n codepoint: 10122,\n },\n {\n name: 'DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO',\n value: '➋',\n codepoint: 10123,\n },\n {\n name: 'DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE',\n value: '➌',\n codepoint: 10124,\n },\n {\n name: 'DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR',\n value: '➍',\n codepoint: 10125,\n },\n {\n name: 'DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE',\n value: '➎',\n codepoint: 10126,\n },\n {\n name: 'DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX',\n value: '➏',\n codepoint: 10127,\n },\n {\n name: 'DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN',\n value: '➐',\n codepoint: 10128,\n },\n {\n name: 'DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT',\n value: '➑',\n codepoint: 10129,\n },\n {\n name: 'DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE',\n value: '➒',\n codepoint: 10130,\n },\n {\n name: 'DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN',\n value: '➓',\n codepoint: 10131,\n },\n {\n name: 'HEAVY WIDE-HEADED RIGHTWARDS ARROW',\n value: '➔',\n codepoint: 10132,\n },\n {\n name: 'HEAVY SOUTH EAST ARROW',\n value: '➘',\n codepoint: 10136,\n },\n {\n name: 'HEAVY RIGHTWARDS ARROW',\n value: '➙',\n codepoint: 10137,\n },\n {\n name: 'HEAVY NORTH EAST ARROW',\n value: '➚',\n codepoint: 10138,\n },\n {\n name: 'DRAFTING POINT RIGHTWARDS ARROW',\n value: '➛',\n codepoint: 10139,\n },\n {\n name: 'HEAVY ROUND-TIPPED RIGHTWARDS ARROW',\n value: '➜',\n codepoint: 10140,\n },\n {\n name: 'TRIANGLE-HEADED RIGHTWARDS ARROW',\n value: '➝',\n codepoint: 10141,\n },\n {\n name: 'HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW',\n value: '➞',\n codepoint: 10142,\n },\n {\n name: 'DASHED TRIANGLE-HEADED RIGHTWARDS ARROW',\n value: '➟',\n codepoint: 10143,\n },\n {\n name: 'HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW',\n value: '➠',\n codepoint: 10144,\n },\n {\n name: 'THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD',\n value: '➢',\n codepoint: 10146,\n },\n {\n name: 'THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD',\n value: '➣',\n codepoint: 10147,\n },\n {\n name: 'BLACK RIGHTWARDS ARROWHEAD',\n value: '➤',\n codepoint: 10148,\n },\n {\n name: 'HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW',\n value: '➥',\n codepoint: 10149,\n },\n {\n name: 'HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW',\n value: '➦',\n codepoint: 10150,\n },\n {\n name: 'SQUAT BLACK RIGHTWARDS ARROW',\n value: '➧',\n codepoint: 10151,\n },\n {\n name: 'HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW',\n value: '➨',\n codepoint: 10152,\n },\n {\n name: 'RIGHT-SHADED WHITE RIGHTWARDS ARROW',\n value: '➩',\n codepoint: 10153,\n },\n {\n name: 'LEFT-SHADED WHITE RIGHTWARDS ARROW',\n value: '➪',\n codepoint: 10154,\n },\n {\n name: 'BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW',\n value: '➫',\n codepoint: 10155,\n },\n {\n name: 'FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW',\n value: '➬',\n codepoint: 10156,\n },\n {\n name: 'HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW',\n value: '➭',\n codepoint: 10157,\n },\n {\n name: 'HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW',\n value: '➮',\n codepoint: 10158,\n },\n {\n name: 'NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW',\n value: '➯',\n codepoint: 10159,\n },\n {\n name: 'NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW',\n value: '➱',\n codepoint: 10161,\n },\n {\n name: 'CIRCLED HEAVY WHITE RIGHTWARDS ARROW',\n value: '➲',\n codepoint: 10162,\n },\n {\n name: 'WHITE-FEATHERED RIGHTWARDS ARROW',\n value: '➳',\n codepoint: 10163,\n },\n {\n name: 'BLACK-FEATHERED SOUTH EAST ARROW',\n value: '➴',\n codepoint: 10164,\n },\n {\n name: 'BLACK-FEATHERED RIGHTWARDS ARROW',\n value: '➵',\n codepoint: 10165,\n },\n {\n name: 'BLACK-FEATHERED NORTH EAST ARROW',\n value: '➶',\n codepoint: 10166,\n },\n {\n name: 'HEAVY BLACK-FEATHERED SOUTH EAST ARROW',\n value: '➷',\n codepoint: 10167,\n },\n {\n name: 'HEAVY BLACK-FEATHERED RIGHTWARDS ARROW',\n value: '➸',\n codepoint: 10168,\n },\n {\n name: 'HEAVY BLACK-FEATHERED NORTH EAST ARROW',\n value: '➹',\n codepoint: 10169,\n },\n {\n name: 'TEARDROP-BARBED RIGHTWARDS ARROW',\n value: '➺',\n codepoint: 10170,\n },\n {\n name: 'HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW',\n value: '➻',\n codepoint: 10171,\n },\n {\n name: 'WEDGE-TAILED RIGHTWARDS ARROW',\n value: '➼',\n codepoint: 10172,\n },\n {\n name: 'HEAVY WEDGE-TAILED RIGHTWARDS ARROW',\n value: '➽',\n codepoint: 10173,\n },\n {\n name: 'OPEN-OUTLINED RIGHTWARDS ARROW',\n value: '➾',\n codepoint: 10174,\n },\n ],\n },\n {\n name: 'Mathematical',\n symbols: [\n {\n name: 'FOR ALL',\n value: '∀',\n codepoint: 8704,\n },\n {\n name: 'COMPLEMENT',\n value: '∁',\n codepoint: 8705,\n },\n {\n name: 'PARTIAL DIFFERENTIAL',\n value: '∂',\n codepoint: 8706,\n },\n {\n name: 'THERE EXISTS',\n value: '∃',\n codepoint: 8707,\n },\n {\n name: 'THERE DOES NOT EXIST',\n value: '∄',\n codepoint: 8708,\n },\n {\n name: 'EMPTY SET',\n value: '∅',\n codepoint: 8709,\n },\n {\n name: 'INCREMENT',\n value: '∆',\n codepoint: 8710,\n },\n {\n name: 'NABLA',\n value: '∇',\n codepoint: 8711,\n },\n {\n name: 'ELEMENT OF',\n value: '∈',\n codepoint: 8712,\n },\n {\n name: 'NOT AN ELEMENT OF',\n value: '∉',\n codepoint: 8713,\n },\n {\n name: 'SMALL ELEMENT OF',\n value: '∊',\n codepoint: 8714,\n },\n {\n name: 'CONTAINS AS MEMBER',\n value: '∋',\n codepoint: 8715,\n },\n {\n name: 'DOES NOT CONTAIN AS MEMBER',\n value: '∌',\n codepoint: 8716,\n },\n {\n name: 'SMALL CONTAINS AS MEMBER',\n value: '∍',\n codepoint: 8717,\n },\n {\n name: 'END OF PROOF',\n value: '∎',\n codepoint: 8718,\n },\n {\n name: 'N-ARY PRODUCT',\n value: '∏',\n codepoint: 8719,\n },\n {\n name: 'N-ARY COPRODUCT',\n value: '∐',\n codepoint: 8720,\n },\n {\n name: 'N-ARY SUMMATION',\n value: '∑',\n codepoint: 8721,\n },\n {\n name: 'MINUS SIGN',\n value: '−',\n codepoint: 8722,\n },\n {\n name: 'MINUS-OR-PLUS SIGN',\n value: '∓',\n codepoint: 8723,\n },\n {\n name: 'DOT PLUS',\n value: '∔',\n codepoint: 8724,\n },\n {\n name: 'DIVISION SLASH',\n value: '∕',\n codepoint: 8725,\n },\n {\n name: 'SET MINUS',\n value: '∖',\n codepoint: 8726,\n },\n {\n name: 'ASTERISK OPERATOR',\n value: '∗',\n codepoint: 8727,\n },\n {\n name: 'RING OPERATOR',\n value: '∘',\n codepoint: 8728,\n },\n {\n name: 'BULLET OPERATOR',\n value: '∙',\n codepoint: 8729,\n },\n {\n name: 'SQUARE ROOT',\n value: '√',\n codepoint: 8730,\n },\n {\n name: 'CUBE ROOT',\n value: '∛',\n codepoint: 8731,\n },\n {\n name: 'FOURTH ROOT',\n value: '∜',\n codepoint: 8732,\n },\n {\n name: 'PROPORTIONAL TO',\n value: '∝',\n codepoint: 8733,\n },\n {\n name: 'INFINITY',\n value: '∞',\n codepoint: 8734,\n },\n {\n name: 'RIGHT ANGLE',\n value: '∟',\n codepoint: 8735,\n },\n {\n name: 'ANGLE',\n value: '∠',\n codepoint: 8736,\n },\n {\n name: 'MEASURED ANGLE',\n value: '∡',\n codepoint: 8737,\n },\n {\n name: 'SPHERICAL ANGLE',\n value: '∢',\n codepoint: 8738,\n },\n {\n name: 'DIVIDES',\n value: '∣',\n codepoint: 8739,\n },\n {\n name: 'DOES NOT DIVIDE',\n value: '∤',\n codepoint: 8740,\n },\n {\n name: 'PARALLEL TO',\n value: '∥',\n codepoint: 8741,\n },\n {\n name: 'NOT PARALLEL TO',\n value: '∦',\n codepoint: 8742,\n },\n {\n name: 'LOGICAL AND',\n value: '∧',\n codepoint: 8743,\n },\n {\n name: 'LOGICAL OR',\n value: '∨',\n codepoint: 8744,\n },\n {\n name: 'INTERSECTION',\n value: '∩',\n codepoint: 8745,\n },\n {\n name: 'UNION',\n value: '∪',\n codepoint: 8746,\n },\n {\n name: 'INTEGRAL',\n value: '∫',\n codepoint: 8747,\n },\n {\n name: 'DOUBLE INTEGRAL',\n value: '∬',\n codepoint: 8748,\n },\n {\n name: 'TRIPLE INTEGRAL',\n value: '∭',\n codepoint: 8749,\n },\n {\n name: 'CONTOUR INTEGRAL',\n value: '∮',\n codepoint: 8750,\n },\n {\n name: 'SURFACE INTEGRAL',\n value: '∯',\n codepoint: 8751,\n },\n {\n name: 'VOLUME INTEGRAL',\n value: '∰',\n codepoint: 8752,\n },\n {\n name: 'CLOCKWISE INTEGRAL',\n value: '∱',\n codepoint: 8753,\n },\n {\n name: 'CLOCKWISE CONTOUR INTEGRAL',\n value: '∲',\n codepoint: 8754,\n },\n {\n name: 'ANTICLOCKWISE CONTOUR INTEGRAL',\n value: '∳',\n codepoint: 8755,\n },\n {\n name: 'THEREFORE',\n value: '∴',\n codepoint: 8756,\n },\n {\n name: 'BECAUSE',\n value: '∵',\n codepoint: 8757,\n },\n {\n name: 'RATIO',\n value: '∶',\n codepoint: 8758,\n },\n {\n name: 'PROPORTION',\n value: '∷',\n codepoint: 8759,\n },\n {\n name: 'DOT MINUS',\n value: '∸',\n codepoint: 8760,\n },\n {\n name: 'EXCESS',\n value: '∹',\n codepoint: 8761,\n },\n {\n name: 'GEOMETRIC PROPORTION',\n value: '∺',\n codepoint: 8762,\n },\n {\n name: 'HOMOTHETIC',\n value: '∻',\n codepoint: 8763,\n },\n {\n name: 'TILDE OPERATOR',\n value: '∼',\n codepoint: 8764,\n },\n {\n name: 'REVERSED TILDE',\n value: '∽',\n codepoint: 8765,\n },\n {\n name: 'INVERTED LAZY S',\n value: '∾',\n codepoint: 8766,\n },\n {\n name: 'SINE WAVE',\n value: '∿',\n codepoint: 8767,\n },\n {\n name: 'WREATH PRODUCT',\n value: '≀',\n codepoint: 8768,\n },\n {\n name: 'NOT TILDE',\n value: '≁',\n codepoint: 8769,\n },\n {\n name: 'MINUS TILDE',\n value: '≂',\n codepoint: 8770,\n },\n {\n name: 'ASYMPTOTICALLY EQUAL TO',\n value: '≃',\n codepoint: 8771,\n },\n {\n name: 'NOT ASYMPTOTICALLY EQUAL TO',\n value: '≄',\n codepoint: 8772,\n },\n {\n name: 'APPROXIMATELY EQUAL TO',\n value: '≅',\n codepoint: 8773,\n },\n {\n name: 'APPROXIMATELY BUT NOT ACTUALLY EQUAL TO',\n value: '≆',\n codepoint: 8774,\n },\n {\n name: 'NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO',\n value: '≇',\n codepoint: 8775,\n },\n {\n name: 'ALMOST EQUAL TO',\n value: '≈',\n codepoint: 8776,\n },\n {\n name: 'NOT ALMOST EQUAL TO',\n value: '≉',\n codepoint: 8777,\n },\n {\n name: 'ALMOST EQUAL OR EQUAL TO',\n value: '≊',\n codepoint: 8778,\n },\n {\n name: 'TRIPLE TILDE',\n value: '≋',\n codepoint: 8779,\n },\n {\n name: 'ALL EQUAL TO',\n value: '≌',\n codepoint: 8780,\n },\n {\n name: 'EQUIVALENT TO',\n value: '≍',\n codepoint: 8781,\n },\n {\n name: 'GEOMETRICALLY EQUIVALENT TO',\n value: '≎',\n codepoint: 8782,\n },\n {\n name: 'DIFFERENCE BETWEEN',\n value: '≏',\n codepoint: 8783,\n },\n {\n name: 'APPROACHES THE LIMIT',\n value: '≐',\n codepoint: 8784,\n },\n {\n name: 'GEOMETRICALLY EQUAL TO',\n value: '≑',\n codepoint: 8785,\n },\n {\n name: 'APPROXIMATELY EQUAL TO OR THE IMAGE OF',\n value: '≒',\n codepoint: 8786,\n },\n {\n name: 'IMAGE OF OR APPROXIMATELY EQUAL TO',\n value: '≓',\n codepoint: 8787,\n },\n {\n name: 'COLON EQUALS',\n value: '≔',\n codepoint: 8788,\n },\n {\n name: 'EQUALS COLON',\n value: '≕',\n codepoint: 8789,\n },\n {\n name: 'RING IN EQUAL TO',\n value: '≖',\n codepoint: 8790,\n },\n {\n name: 'RING EQUAL TO',\n value: '≗',\n codepoint: 8791,\n },\n {\n name: 'CORRESPONDS TO',\n value: '≘',\n codepoint: 8792,\n },\n {\n name: 'ESTIMATES',\n value: '≙',\n codepoint: 8793,\n },\n {\n name: 'EQUIANGULAR TO',\n value: '≚',\n codepoint: 8794,\n },\n {\n name: 'STAR EQUALS',\n value: '≛',\n codepoint: 8795,\n },\n {\n name: 'DELTA EQUAL TO',\n value: '≜',\n codepoint: 8796,\n },\n {\n name: 'EQUAL TO BY DEFINITION',\n value: '≝',\n codepoint: 8797,\n },\n {\n name: 'MEASURED BY',\n value: '≞',\n codepoint: 8798,\n },\n {\n name: 'QUESTIONED EQUAL TO',\n value: '≟',\n codepoint: 8799,\n },\n {\n name: 'NOT EQUAL TO',\n value: '≠',\n codepoint: 8800,\n },\n {\n name: 'IDENTICAL TO',\n value: '≡',\n codepoint: 8801,\n },\n {\n name: 'NOT IDENTICAL TO',\n value: '≢',\n codepoint: 8802,\n },\n {\n name: 'STRICTLY EQUIVALENT TO',\n value: '≣',\n codepoint: 8803,\n },\n {\n name: 'LESS-THAN OR EQUAL TO',\n value: '≤',\n codepoint: 8804,\n },\n {\n name: 'GREATER-THAN OR EQUAL TO',\n value: '≥',\n codepoint: 8805,\n },\n {\n name: 'LESS-THAN OVER EQUAL TO',\n value: '≦',\n codepoint: 8806,\n },\n {\n name: 'GREATER-THAN OVER EQUAL TO',\n value: '≧',\n codepoint: 8807,\n },\n {\n name: 'LESS-THAN BUT NOT EQUAL TO',\n value: '≨',\n codepoint: 8808,\n },\n {\n name: 'GREATER-THAN BUT NOT EQUAL TO',\n value: '≩',\n codepoint: 8809,\n },\n {\n name: 'MUCH LESS-THAN',\n value: '≪',\n codepoint: 8810,\n },\n {\n name: 'MUCH GREATER-THAN',\n value: '≫',\n codepoint: 8811,\n },\n {\n name: 'BETWEEN',\n value: '≬',\n codepoint: 8812,\n },\n {\n name: 'NOT EQUIVALENT TO',\n value: '≭',\n codepoint: 8813,\n },\n {\n name: 'NOT LESS-THAN',\n value: '≮',\n codepoint: 8814,\n },\n {\n name: 'NOT GREATER-THAN',\n value: '≯',\n codepoint: 8815,\n },\n {\n name: 'NEITHER LESS-THAN NOR EQUAL TO',\n value: '≰',\n codepoint: 8816,\n },\n {\n name: 'NEITHER GREATER-THAN NOR EQUAL TO',\n value: '≱',\n codepoint: 8817,\n },\n {\n name: 'LESS-THAN OR EQUIVALENT TO',\n value: '≲',\n codepoint: 8818,\n },\n {\n name: 'GREATER-THAN OR EQUIVALENT TO',\n value: '≳',\n codepoint: 8819,\n },\n {\n name: 'NEITHER LESS-THAN NOR EQUIVALENT TO',\n value: '≴',\n codepoint: 8820,\n },\n {\n name: 'NEITHER GREATER-THAN NOR EQUIVALENT TO',\n value: '≵',\n codepoint: 8821,\n },\n {\n name: 'LESS-THAN OR GREATER-THAN',\n value: '≶',\n codepoint: 8822,\n },\n {\n name: 'GREATER-THAN OR LESS-THAN',\n value: '≷',\n codepoint: 8823,\n },\n {\n name: 'NEITHER LESS-THAN NOR GREATER-THAN',\n value: '≸',\n codepoint: 8824,\n },\n {\n name: 'NEITHER GREATER-THAN NOR LESS-THAN',\n value: '≹',\n codepoint: 8825,\n },\n {\n name: 'PRECEDES',\n value: '≺',\n codepoint: 8826,\n },\n {\n name: 'SUCCEEDS',\n value: '≻',\n codepoint: 8827,\n },\n {\n name: 'PRECEDES OR EQUAL TO',\n value: '≼',\n codepoint: 8828,\n },\n {\n name: 'SUCCEEDS OR EQUAL TO',\n value: '≽',\n codepoint: 8829,\n },\n {\n name: 'PRECEDES OR EQUIVALENT TO',\n value: '≾',\n codepoint: 8830,\n },\n {\n name: 'SUCCEEDS OR EQUIVALENT TO',\n value: '≿',\n codepoint: 8831,\n },\n {\n name: 'DOES NOT PRECEDE',\n value: '⊀',\n codepoint: 8832,\n },\n {\n name: 'DOES NOT SUCCEED',\n value: '⊁',\n codepoint: 8833,\n },\n {\n name: 'SUBSET OF',\n value: '⊂',\n codepoint: 8834,\n },\n {\n name: 'SUPERSET OF',\n value: '⊃',\n codepoint: 8835,\n },\n {\n name: 'NOT A SUBSET OF',\n value: '⊄',\n codepoint: 8836,\n },\n {\n name: 'NOT A SUPERSET OF',\n value: '⊅',\n codepoint: 8837,\n },\n {\n name: 'SUBSET OF OR EQUAL TO',\n value: '⊆',\n codepoint: 8838,\n },\n {\n name: 'SUPERSET OF OR EQUAL TO',\n value: '⊇',\n codepoint: 8839,\n },\n {\n name: 'NEITHER A SUBSET OF NOR EQUAL TO',\n value: '⊈',\n codepoint: 8840,\n },\n {\n name: 'NEITHER A SUPERSET OF NOR EQUAL TO',\n value: '⊉',\n codepoint: 8841,\n },\n {\n name: 'SUBSET OF WITH NOT EQUAL TO',\n value: '⊊',\n codepoint: 8842,\n },\n {\n name: 'SUPERSET OF WITH NOT EQUAL TO',\n value: '⊋',\n codepoint: 8843,\n },\n {\n name: 'MULTISET',\n value: '⊌',\n codepoint: 8844,\n },\n {\n name: 'MULTISET MULTIPLICATION',\n value: '⊍',\n codepoint: 8845,\n },\n {\n name: 'MULTISET UNION',\n value: '⊎',\n codepoint: 8846,\n },\n {\n name: 'SQUARE IMAGE OF',\n value: '⊏',\n codepoint: 8847,\n },\n {\n name: 'SQUARE ORIGINAL OF',\n value: '⊐',\n codepoint: 8848,\n },\n {\n name: 'SQUARE IMAGE OF OR EQUAL TO',\n value: '⊑',\n codepoint: 8849,\n },\n {\n name: 'SQUARE ORIGINAL OF OR EQUAL TO',\n value: '⊒',\n codepoint: 8850,\n },\n {\n name: 'SQUARE CAP',\n value: '⊓',\n codepoint: 8851,\n },\n {\n name: 'SQUARE CUP',\n value: '⊔',\n codepoint: 8852,\n },\n {\n name: 'CIRCLED PLUS',\n value: '⊕',\n codepoint: 8853,\n },\n {\n name: 'CIRCLED MINUS',\n value: '⊖',\n codepoint: 8854,\n },\n {\n name: 'CIRCLED TIMES',\n value: '⊗',\n codepoint: 8855,\n },\n {\n name: 'CIRCLED DIVISION SLASH',\n value: '⊘',\n codepoint: 8856,\n },\n {\n name: 'CIRCLED DOT OPERATOR',\n value: '⊙',\n codepoint: 8857,\n },\n {\n name: 'CIRCLED RING OPERATOR',\n value: '⊚',\n codepoint: 8858,\n },\n {\n name: 'CIRCLED ASTERISK OPERATOR',\n value: '⊛',\n codepoint: 8859,\n },\n {\n name: 'CIRCLED EQUALS',\n value: '⊜',\n codepoint: 8860,\n },\n {\n name: 'CIRCLED DASH',\n value: '⊝',\n codepoint: 8861,\n },\n {\n name: 'SQUARED PLUS',\n value: '⊞',\n codepoint: 8862,\n },\n {\n name: 'SQUARED MINUS',\n value: '⊟',\n codepoint: 8863,\n },\n {\n name: 'SQUARED TIMES',\n value: '⊠',\n codepoint: 8864,\n },\n {\n name: 'SQUARED DOT OPERATOR',\n value: '⊡',\n codepoint: 8865,\n },\n {\n name: 'RIGHT TACK',\n value: '⊢',\n codepoint: 8866,\n },\n {\n name: 'LEFT TACK',\n value: '⊣',\n codepoint: 8867,\n },\n {\n name: 'DOWN TACK',\n value: '⊤',\n codepoint: 8868,\n },\n {\n name: 'UP TACK',\n value: '⊥',\n codepoint: 8869,\n },\n {\n name: 'ASSERTION',\n value: '⊦',\n codepoint: 8870,\n },\n {\n name: 'MODELS',\n value: '⊧',\n codepoint: 8871,\n },\n {\n name: 'TRUE',\n value: '⊨',\n codepoint: 8872,\n },\n {\n name: 'FORCES',\n value: '⊩',\n codepoint: 8873,\n },\n {\n name: 'TRIPLE VERTICAL BAR RIGHT TURNSTILE',\n value: '⊪',\n codepoint: 8874,\n },\n {\n name: 'DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE',\n value: '⊫',\n codepoint: 8875,\n },\n {\n name: 'DOES NOT PROVE',\n value: '⊬',\n codepoint: 8876,\n },\n {\n name: 'NOT TRUE',\n value: '⊭',\n codepoint: 8877,\n },\n {\n name: 'DOES NOT FORCE',\n value: '⊮',\n codepoint: 8878,\n },\n {\n name: 'NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE',\n value: '⊯',\n codepoint: 8879,\n },\n {\n name: 'PRECEDES UNDER RELATION',\n value: '⊰',\n codepoint: 8880,\n },\n {\n name: 'SUCCEEDS UNDER RELATION',\n value: '⊱',\n codepoint: 8881,\n },\n {\n name: 'NORMAL SUBGROUP OF',\n value: '⊲',\n codepoint: 8882,\n },\n {\n name: 'CONTAINS AS NORMAL SUBGROUP',\n value: '⊳',\n codepoint: 8883,\n },\n {\n name: 'NORMAL SUBGROUP OF OR EQUAL TO',\n value: '⊴',\n codepoint: 8884,\n },\n {\n name: 'CONTAINS AS NORMAL SUBGROUP OR EQUAL TO',\n value: '⊵',\n codepoint: 8885,\n },\n {\n name: 'ORIGINAL OF',\n value: '⊶',\n codepoint: 8886,\n },\n {\n name: 'IMAGE OF',\n value: '⊷',\n codepoint: 8887,\n },\n {\n name: 'MULTIMAP',\n value: '⊸',\n codepoint: 8888,\n },\n {\n name: 'HERMITIAN CONJUGATE MATRIX',\n value: '⊹',\n codepoint: 8889,\n },\n {\n name: 'INTERCALATE',\n value: '⊺',\n codepoint: 8890,\n },\n {\n name: 'XOR',\n value: '⊻',\n codepoint: 8891,\n },\n {\n name: 'NAND',\n value: '⊼',\n codepoint: 8892,\n },\n {\n name: 'NOR',\n value: '⊽',\n codepoint: 8893,\n },\n {\n name: 'RIGHT ANGLE WITH ARC',\n value: '⊾',\n codepoint: 8894,\n },\n {\n name: 'RIGHT TRIANGLE',\n value: '⊿',\n codepoint: 8895,\n },\n {\n name: 'N-ARY LOGICAL AND',\n value: '⋀',\n codepoint: 8896,\n },\n {\n name: 'N-ARY LOGICAL OR',\n value: '⋁',\n codepoint: 8897,\n },\n {\n name: 'N-ARY INTERSECTION',\n value: '⋂',\n codepoint: 8898,\n },\n {\n name: 'N-ARY UNION',\n value: '⋃',\n codepoint: 8899,\n },\n {\n name: 'DIAMOND OPERATOR',\n value: '⋄',\n codepoint: 8900,\n },\n {\n name: 'DOT OPERATOR',\n value: '⋅',\n codepoint: 8901,\n },\n {\n name: 'STAR OPERATOR',\n value: '⋆',\n codepoint: 8902,\n },\n {\n name: 'DIVISION TIMES',\n value: '⋇',\n codepoint: 8903,\n },\n {\n name: 'BOWTIE',\n value: '⋈',\n codepoint: 8904,\n },\n {\n name: 'LEFT NORMAL FACTOR SEMIDIRECT PRODUCT',\n value: '⋉',\n codepoint: 8905,\n },\n {\n name: 'RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT',\n value: '⋊',\n codepoint: 8906,\n },\n {\n name: 'LEFT SEMIDIRECT PRODUCT',\n value: '⋋',\n codepoint: 8907,\n },\n {\n name: 'RIGHT SEMIDIRECT PRODUCT',\n value: '⋌',\n codepoint: 8908,\n },\n {\n name: 'REVERSED TILDE EQUALS',\n value: '⋍',\n codepoint: 8909,\n },\n {\n name: 'CURLY LOGICAL OR',\n value: '⋎',\n codepoint: 8910,\n },\n {\n name: 'CURLY LOGICAL AND',\n value: '⋏',\n codepoint: 8911,\n },\n {\n name: 'DOUBLE SUBSET',\n value: '⋐',\n codepoint: 8912,\n },\n {\n name: 'DOUBLE SUPERSET',\n value: '⋑',\n codepoint: 8913,\n },\n {\n name: 'DOUBLE INTERSECTION',\n value: '⋒',\n codepoint: 8914,\n },\n {\n name: 'DOUBLE UNION',\n value: '⋓',\n codepoint: 8915,\n },\n {\n name: 'PITCHFORK',\n value: '⋔',\n codepoint: 8916,\n },\n {\n name: 'EQUAL AND PARALLEL TO',\n value: '⋕',\n codepoint: 8917,\n },\n {\n name: 'LESS-THAN WITH DOT',\n value: '⋖',\n codepoint: 8918,\n },\n {\n name: 'GREATER-THAN WITH DOT',\n value: '⋗',\n codepoint: 8919,\n },\n {\n name: 'VERY MUCH LESS-THAN',\n value: '⋘',\n codepoint: 8920,\n },\n {\n name: 'VERY MUCH GREATER-THAN',\n value: '⋙',\n codepoint: 8921,\n },\n {\n name: 'LESS-THAN EQUAL TO OR GREATER-THAN',\n value: '⋚',\n codepoint: 8922,\n },\n {\n name: 'GREATER-THAN EQUAL TO OR LESS-THAN',\n value: '⋛',\n codepoint: 8923,\n },\n {\n name: 'EQUAL TO OR LESS-THAN',\n value: '⋜',\n codepoint: 8924,\n },\n {\n name: 'EQUAL TO OR GREATER-THAN',\n value: '⋝',\n codepoint: 8925,\n },\n {\n name: 'EQUAL TO OR PRECEDES',\n value: '⋞',\n codepoint: 8926,\n },\n {\n name: 'EQUAL TO OR SUCCEEDS',\n value: '⋟',\n codepoint: 8927,\n },\n {\n name: 'DOES NOT PRECEDE OR EQUAL',\n value: '⋠',\n codepoint: 8928,\n },\n {\n name: 'DOES NOT SUCCEED OR EQUAL',\n value: '⋡',\n codepoint: 8929,\n },\n {\n name: 'NOT SQUARE IMAGE OF OR EQUAL TO',\n value: '⋢',\n codepoint: 8930,\n },\n {\n name: 'NOT SQUARE ORIGINAL OF OR EQUAL TO',\n value: '⋣',\n codepoint: 8931,\n },\n {\n name: 'SQUARE IMAGE OF OR NOT EQUAL TO',\n value: '⋤',\n codepoint: 8932,\n },\n {\n name: 'SQUARE ORIGINAL OF OR NOT EQUAL TO',\n value: '⋥',\n codepoint: 8933,\n },\n {\n name: 'LESS-THAN BUT NOT EQUIVALENT TO',\n value: '⋦',\n codepoint: 8934,\n },\n {\n name: 'GREATER-THAN BUT NOT EQUIVALENT TO',\n value: '⋧',\n codepoint: 8935,\n },\n {\n name: 'PRECEDES BUT NOT EQUIVALENT TO',\n value: '⋨',\n codepoint: 8936,\n },\n {\n name: 'SUCCEEDS BUT NOT EQUIVALENT TO',\n value: '⋩',\n codepoint: 8937,\n },\n {\n name: 'NOT NORMAL SUBGROUP OF',\n value: '⋪',\n codepoint: 8938,\n },\n {\n name: 'DOES NOT CONTAIN AS NORMAL SUBGROUP',\n value: '⋫',\n codepoint: 8939,\n },\n {\n name: 'NOT NORMAL SUBGROUP OF OR EQUAL TO',\n value: '⋬',\n codepoint: 8940,\n },\n {\n name: 'DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL',\n value: '⋭',\n codepoint: 8941,\n },\n {\n name: 'VERTICAL ELLIPSIS',\n value: '⋮',\n codepoint: 8942,\n },\n {\n name: 'MIDLINE HORIZONTAL ELLIPSIS',\n value: '⋯',\n codepoint: 8943,\n },\n {\n name: 'UP RIGHT DIAGONAL ELLIPSIS',\n value: '⋰',\n codepoint: 8944,\n },\n {\n name: 'DOWN RIGHT DIAGONAL ELLIPSIS',\n value: '⋱',\n codepoint: 8945,\n },\n {\n name: 'ELEMENT OF WITH LONG HORIZONTAL STROKE',\n value: '⋲',\n codepoint: 8946,\n },\n {\n name: 'ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE',\n value: '⋳',\n codepoint: 8947,\n },\n {\n name: 'SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE',\n value: '⋴',\n codepoint: 8948,\n },\n {\n name: 'ELEMENT OF WITH DOT ABOVE',\n value: '⋵',\n codepoint: 8949,\n },\n {\n name: 'ELEMENT OF WITH OVERBAR',\n value: '⋶',\n codepoint: 8950,\n },\n {\n name: 'SMALL ELEMENT OF WITH OVERBAR',\n value: '⋷',\n codepoint: 8951,\n },\n {\n name: 'ELEMENT OF WITH UNDERBAR',\n value: '⋸',\n codepoint: 8952,\n },\n {\n name: 'ELEMENT OF WITH TWO HORIZONTAL STROKES',\n value: '⋹',\n codepoint: 8953,\n },\n {\n name: 'CONTAINS WITH LONG HORIZONTAL STROKE',\n value: '⋺',\n codepoint: 8954,\n },\n {\n name: 'CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE',\n value: '⋻',\n codepoint: 8955,\n },\n {\n name: 'SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE',\n value: '⋼',\n codepoint: 8956,\n },\n {\n name: 'CONTAINS WITH OVERBAR',\n value: '⋽',\n codepoint: 8957,\n },\n {\n name: 'SMALL CONTAINS WITH OVERBAR',\n value: '⋾',\n codepoint: 8958,\n },\n {\n name: 'Z NOTATION BAG MEMBERSHIP',\n value: '⋿',\n codepoint: 8959,\n },\n {\n name: 'THREE DIMENSIONAL ANGLE',\n value: '⟀',\n codepoint: 10176,\n },\n {\n name: 'WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE',\n value: '⟁',\n codepoint: 10177,\n },\n {\n name: 'PERPENDICULAR',\n value: '⟂',\n codepoint: 10178,\n },\n {\n name: 'OPEN SUBSET',\n value: '⟃',\n codepoint: 10179,\n },\n {\n name: 'OPEN SUPERSET',\n value: '⟄',\n codepoint: 10180,\n },\n {\n name: 'LEFT S-SHAPED BAG DELIMITER',\n value: '⟅',\n codepoint: 10181,\n },\n {\n name: 'RIGHT S-SHAPED BAG DELIMITER',\n value: '⟆',\n codepoint: 10182,\n },\n {\n name: 'OR WITH DOT INSIDE',\n value: '⟇',\n codepoint: 10183,\n },\n {\n name: 'REVERSE SOLIDUS PRECEDING SUBSET',\n value: '⟈',\n codepoint: 10184,\n },\n {\n name: 'SUPERSET PRECEDING SOLIDUS',\n value: '⟉',\n codepoint: 10185,\n },\n {\n name: 'VERTICAL BAR WITH HORIZONTAL STROKE',\n value: '⟊',\n codepoint: 10186,\n },\n {\n name: 'LONG DIVISION',\n value: '⟌',\n codepoint: 10188,\n },\n {\n name: 'WHITE DIAMOND WITH CENTRED DOT',\n value: '⟐',\n codepoint: 10192,\n },\n {\n name: 'AND WITH DOT',\n value: '⟑',\n codepoint: 10193,\n },\n {\n name: 'ELEMENT OF OPENING UPWARDS',\n value: '⟒',\n codepoint: 10194,\n },\n {\n name: 'LOWER RIGHT CORNER WITH DOT',\n value: '⟓',\n codepoint: 10195,\n },\n {\n name: 'UPPER LEFT CORNER WITH DOT',\n value: '⟔',\n codepoint: 10196,\n },\n {\n name: 'LEFT OUTER JOIN',\n value: '⟕',\n codepoint: 10197,\n },\n {\n name: 'RIGHT OUTER JOIN',\n value: '⟖',\n codepoint: 10198,\n },\n {\n name: 'FULL OUTER JOIN',\n value: '⟗',\n codepoint: 10199,\n },\n {\n name: 'LARGE UP TACK',\n value: '⟘',\n codepoint: 10200,\n },\n {\n name: 'LARGE DOWN TACK',\n value: '⟙',\n codepoint: 10201,\n },\n {\n name: 'LEFT AND RIGHT DOUBLE TURNSTILE',\n value: '⟚',\n codepoint: 10202,\n },\n {\n name: 'LEFT AND RIGHT TACK',\n value: '⟛',\n codepoint: 10203,\n },\n {\n name: 'LEFT MULTIMAP',\n value: '⟜',\n codepoint: 10204,\n },\n {\n name: 'LONG RIGHT TACK',\n value: '⟝',\n codepoint: 10205,\n },\n {\n name: 'LONG LEFT TACK',\n value: '⟞',\n codepoint: 10206,\n },\n {\n name: 'UP TACK WITH CIRCLE ABOVE',\n value: '⟟',\n codepoint: 10207,\n },\n {\n name: 'LOZENGE DIVIDED BY HORIZONTAL RULE',\n value: '⟠',\n codepoint: 10208,\n },\n {\n name: 'WHITE CONCAVE-SIDED DIAMOND',\n value: '⟡',\n codepoint: 10209,\n },\n {\n name: 'WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK',\n value: '⟢',\n codepoint: 10210,\n },\n {\n name: 'WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK',\n value: '⟣',\n codepoint: 10211,\n },\n {\n name: 'WHITE SQUARE WITH LEFTWARDS TICK',\n value: '⟤',\n codepoint: 10212,\n },\n {\n name: 'WHITE SQUARE WITH RIGHTWARDS TICK',\n value: '⟥',\n codepoint: 10213,\n },\n {\n name: 'MATHEMATICAL LEFT WHITE SQUARE BRACKET',\n value: '⟦',\n codepoint: 10214,\n },\n {\n name: 'MATHEMATICAL RIGHT WHITE SQUARE BRACKET',\n value: '⟧',\n codepoint: 10215,\n },\n {\n name: 'MATHEMATICAL LEFT ANGLE BRACKET',\n value: '⟨',\n codepoint: 10216,\n },\n {\n name: 'MATHEMATICAL RIGHT ANGLE BRACKET',\n value: '⟩',\n codepoint: 10217,\n },\n {\n name: 'MATHEMATICAL LEFT DOUBLE ANGLE BRACKET',\n value: '⟪',\n codepoint: 10218,\n },\n {\n name: 'MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET',\n value: '⟫',\n codepoint: 10219,\n },\n {\n name: 'MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET',\n value: '⟬',\n codepoint: 10220,\n },\n {\n name: 'MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET',\n value: '⟭',\n codepoint: 10221,\n },\n {\n name: 'MATHEMATICAL LEFT FLATTENED PARENTHESIS',\n value: '⟮',\n codepoint: 10222,\n },\n {\n name: 'MATHEMATICAL RIGHT FLATTENED PARENTHESIS',\n value: '⟯',\n codepoint: 10223,\n },\n {\n name: 'TRIPLE VERTICAL BAR DELIMITER',\n value: '⦀',\n codepoint: 10624,\n },\n {\n name: 'Z NOTATION SPOT',\n value: '⦁',\n codepoint: 10625,\n },\n {\n name: 'Z NOTATION TYPE COLON',\n value: '⦂',\n codepoint: 10626,\n },\n {\n name: 'LEFT WHITE CURLY BRACKET',\n value: '⦃',\n codepoint: 10627,\n },\n {\n name: 'RIGHT WHITE CURLY BRACKET',\n value: '⦄',\n codepoint: 10628,\n },\n {\n name: 'LEFT WHITE PARENTHESIS',\n value: '⦅',\n codepoint: 10629,\n },\n {\n name: 'RIGHT WHITE PARENTHESIS',\n value: '⦆',\n codepoint: 10630,\n },\n {\n name: 'Z NOTATION LEFT IMAGE BRACKET',\n value: '⦇',\n codepoint: 10631,\n },\n {\n name: 'Z NOTATION RIGHT IMAGE BRACKET',\n value: '⦈',\n codepoint: 10632,\n },\n {\n name: 'Z NOTATION LEFT BINDING BRACKET',\n value: '⦉',\n codepoint: 10633,\n },\n {\n name: 'Z NOTATION RIGHT BINDING BRACKET',\n value: '⦊',\n codepoint: 10634,\n },\n {\n name: 'LEFT SQUARE BRACKET WITH UNDERBAR',\n value: '⦋',\n codepoint: 10635,\n },\n {\n name: 'RIGHT SQUARE BRACKET WITH UNDERBAR',\n value: '⦌',\n codepoint: 10636,\n },\n {\n name: 'LEFT SQUARE BRACKET WITH TICK IN TOP CORNER',\n value: '⦍',\n codepoint: 10637,\n },\n {\n name: 'RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER',\n value: '⦎',\n codepoint: 10638,\n },\n {\n name: 'LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER',\n value: '⦏',\n codepoint: 10639,\n },\n {\n name: 'RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER',\n value: '⦐',\n codepoint: 10640,\n },\n {\n name: 'LEFT ANGLE BRACKET WITH DOT',\n value: '⦑',\n codepoint: 10641,\n },\n {\n name: 'RIGHT ANGLE BRACKET WITH DOT',\n value: '⦒',\n codepoint: 10642,\n },\n {\n name: 'LEFT ARC LESS-THAN BRACKET',\n value: '⦓',\n codepoint: 10643,\n },\n {\n name: 'RIGHT ARC GREATER-THAN BRACKET',\n value: '⦔',\n codepoint: 10644,\n },\n {\n name: 'DOUBLE LEFT ARC GREATER-THAN BRACKET',\n value: '⦕',\n codepoint: 10645,\n },\n {\n name: 'DOUBLE RIGHT ARC LESS-THAN BRACKET',\n value: '⦖',\n codepoint: 10646,\n },\n {\n name: 'LEFT BLACK TORTOISE SHELL BRACKET',\n value: '⦗',\n codepoint: 10647,\n },\n {\n name: 'RIGHT BLACK TORTOISE SHELL BRACKET',\n value: '⦘',\n codepoint: 10648,\n },\n {\n name: 'DOTTED FENCE',\n value: '⦙',\n codepoint: 10649,\n },\n {\n name: 'VERTICAL ZIGZAG LINE',\n value: '⦚',\n codepoint: 10650,\n },\n {\n name: 'MEASURED ANGLE OPENING LEFT',\n value: '⦛',\n codepoint: 10651,\n },\n {\n name: 'RIGHT ANGLE VARIANT WITH SQUARE',\n value: '⦜',\n codepoint: 10652,\n },\n {\n name: 'MEASURED RIGHT ANGLE WITH DOT',\n value: '⦝',\n codepoint: 10653,\n },\n {\n name: 'ANGLE WITH S INSIDE',\n value: '⦞',\n codepoint: 10654,\n },\n {\n name: 'ACUTE ANGLE',\n value: '⦟',\n codepoint: 10655,\n },\n {\n name: 'SPHERICAL ANGLE OPENING LEFT',\n value: '⦠',\n codepoint: 10656,\n },\n {\n name: 'SPHERICAL ANGLE OPENING UP',\n value: '⦡',\n codepoint: 10657,\n },\n {\n name: 'TURNED ANGLE',\n value: '⦢',\n codepoint: 10658,\n },\n {\n name: 'REVERSED ANGLE',\n value: '⦣',\n codepoint: 10659,\n },\n {\n name: 'ANGLE WITH UNDERBAR',\n value: '⦤',\n codepoint: 10660,\n },\n {\n name: 'REVERSED ANGLE WITH UNDERBAR',\n value: '⦥',\n codepoint: 10661,\n },\n {\n name: 'OBLIQUE ANGLE OPENING UP',\n value: '⦦',\n codepoint: 10662,\n },\n {\n name: 'OBLIQUE ANGLE OPENING DOWN',\n value: '⦧',\n codepoint: 10663,\n },\n {\n name: 'MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT',\n value: '⦨',\n codepoint: 10664,\n },\n {\n name: 'MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT',\n value: '⦩',\n codepoint: 10665,\n },\n {\n name: 'MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT',\n value: '⦪',\n codepoint: 10666,\n },\n {\n name: 'MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT',\n value: '⦫',\n codepoint: 10667,\n },\n {\n name: 'MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP',\n value: '⦬',\n codepoint: 10668,\n },\n {\n name: 'MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP',\n value: '⦭',\n codepoint: 10669,\n },\n {\n name: 'MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN',\n value: '⦮',\n codepoint: 10670,\n },\n {\n name: 'MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN',\n value: '⦯',\n codepoint: 10671,\n },\n {\n name: 'REVERSED EMPTY SET',\n value: '⦰',\n codepoint: 10672,\n },\n {\n name: 'EMPTY SET WITH OVERBAR',\n value: '⦱',\n codepoint: 10673,\n },\n {\n name: 'EMPTY SET WITH SMALL CIRCLE ABOVE',\n value: '⦲',\n codepoint: 10674,\n },\n {\n name: 'EMPTY SET WITH RIGHT ARROW ABOVE',\n value: '⦳',\n codepoint: 10675,\n },\n {\n name: 'EMPTY SET WITH LEFT ARROW ABOVE',\n value: '⦴',\n codepoint: 10676,\n },\n {\n name: 'CIRCLE WITH HORIZONTAL BAR',\n value: '⦵',\n codepoint: 10677,\n },\n {\n name: 'CIRCLED VERTICAL BAR',\n value: '⦶',\n codepoint: 10678,\n },\n {\n name: 'CIRCLED PARALLEL',\n value: '⦷',\n codepoint: 10679,\n },\n {\n name: 'CIRCLED REVERSE SOLIDUS',\n value: '⦸',\n codepoint: 10680,\n },\n {\n name: 'CIRCLED PERPENDICULAR',\n value: '⦹',\n codepoint: 10681,\n },\n {\n name: 'CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR',\n value: '⦺',\n codepoint: 10682,\n },\n {\n name: 'CIRCLE WITH SUPERIMPOSED X',\n value: '⦻',\n codepoint: 10683,\n },\n {\n name: 'CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN',\n value: '⦼',\n codepoint: 10684,\n },\n {\n name: 'UP ARROW THROUGH CIRCLE',\n value: '⦽',\n codepoint: 10685,\n },\n {\n name: 'CIRCLED WHITE BULLET',\n value: '⦾',\n codepoint: 10686,\n },\n {\n name: 'CIRCLED BULLET',\n value: '⦿',\n codepoint: 10687,\n },\n {\n name: 'CIRCLED LESS-THAN',\n value: '⧀',\n codepoint: 10688,\n },\n {\n name: 'CIRCLED GREATER-THAN',\n value: '⧁',\n codepoint: 10689,\n },\n {\n name: 'CIRCLE WITH SMALL CIRCLE TO THE RIGHT',\n value: '⧂',\n codepoint: 10690,\n },\n {\n name: 'CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT',\n value: '⧃',\n codepoint: 10691,\n },\n {\n name: 'SQUARED RISING DIAGONAL SLASH',\n value: '⧄',\n codepoint: 10692,\n },\n {\n name: 'SQUARED FALLING DIAGONAL SLASH',\n value: '⧅',\n codepoint: 10693,\n },\n {\n name: 'SQUARED ASTERISK',\n value: '⧆',\n codepoint: 10694,\n },\n {\n name: 'SQUARED SMALL CIRCLE',\n value: '⧇',\n codepoint: 10695,\n },\n {\n name: 'SQUARED SQUARE',\n value: '⧈',\n codepoint: 10696,\n },\n {\n name: 'TWO JOINED SQUARES',\n value: '⧉',\n codepoint: 10697,\n },\n {\n name: 'TRIANGLE WITH DOT ABOVE',\n value: '⧊',\n codepoint: 10698,\n },\n {\n name: 'TRIANGLE WITH UNDERBAR',\n value: '⧋',\n codepoint: 10699,\n },\n {\n name: 'S IN TRIANGLE',\n value: '⧌',\n codepoint: 10700,\n },\n {\n name: 'TRIANGLE WITH SERIFS AT BOTTOM',\n value: '⧍',\n codepoint: 10701,\n },\n {\n name: 'RIGHT TRIANGLE ABOVE LEFT TRIANGLE',\n value: '⧎',\n codepoint: 10702,\n },\n {\n name: 'LEFT TRIANGLE BESIDE VERTICAL BAR',\n value: '⧏',\n codepoint: 10703,\n },\n {\n name: 'VERTICAL BAR BESIDE RIGHT TRIANGLE',\n value: '⧐',\n codepoint: 10704,\n },\n {\n name: 'BOWTIE WITH LEFT HALF BLACK',\n value: '⧑',\n codepoint: 10705,\n },\n {\n name: 'BOWTIE WITH RIGHT HALF BLACK',\n value: '⧒',\n codepoint: 10706,\n },\n {\n name: 'BLACK BOWTIE',\n value: '⧓',\n codepoint: 10707,\n },\n {\n name: 'TIMES WITH LEFT HALF BLACK',\n value: '⧔',\n codepoint: 10708,\n },\n {\n name: 'TIMES WITH RIGHT HALF BLACK',\n value: '⧕',\n codepoint: 10709,\n },\n {\n name: 'WHITE HOURGLASS',\n value: '⧖',\n codepoint: 10710,\n },\n {\n name: 'BLACK HOURGLASS',\n value: '⧗',\n codepoint: 10711,\n },\n {\n name: 'LEFT WIGGLY FENCE',\n value: '⧘',\n codepoint: 10712,\n },\n {\n name: 'RIGHT WIGGLY FENCE',\n value: '⧙',\n codepoint: 10713,\n },\n {\n name: 'LEFT DOUBLE WIGGLY FENCE',\n value: '⧚',\n codepoint: 10714,\n },\n {\n name: 'RIGHT DOUBLE WIGGLY FENCE',\n value: '⧛',\n codepoint: 10715,\n },\n {\n name: 'INCOMPLETE INFINITY',\n value: '⧜',\n codepoint: 10716,\n },\n {\n name: 'TIE OVER INFINITY',\n value: '⧝',\n codepoint: 10717,\n },\n {\n name: 'INFINITY NEGATED WITH VERTICAL BAR',\n value: '⧞',\n codepoint: 10718,\n },\n {\n name: 'DOUBLE-ENDED MULTIMAP',\n value: '⧟',\n codepoint: 10719,\n },\n {\n name: 'SQUARE WITH CONTOURED OUTLINE',\n value: '⧠',\n codepoint: 10720,\n },\n {\n name: 'INCREASES AS',\n value: '⧡',\n codepoint: 10721,\n },\n {\n name: 'SHUFFLE PRODUCT',\n value: '⧢',\n codepoint: 10722,\n },\n {\n name: 'EQUALS SIGN AND SLANTED PARALLEL',\n value: '⧣',\n codepoint: 10723,\n },\n {\n name: 'EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE',\n value: '⧤',\n codepoint: 10724,\n },\n {\n name: 'IDENTICAL TO AND SLANTED PARALLEL',\n value: '⧥',\n codepoint: 10725,\n },\n {\n name: 'GLEICH STARK',\n value: '⧦',\n codepoint: 10726,\n },\n {\n name: 'THERMODYNAMIC',\n value: '⧧',\n codepoint: 10727,\n },\n {\n name: 'DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK',\n value: '⧨',\n codepoint: 10728,\n },\n {\n name: 'DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK',\n value: '⧩',\n codepoint: 10729,\n },\n {\n name: 'BLACK DIAMOND WITH DOWN ARROW',\n value: '⧪',\n codepoint: 10730,\n },\n {\n name: 'BLACK LOZENGE',\n value: '⧫',\n codepoint: 10731,\n },\n {\n name: 'WHITE CIRCLE WITH DOWN ARROW',\n value: '⧬',\n codepoint: 10732,\n },\n {\n name: 'BLACK CIRCLE WITH DOWN ARROW',\n value: '⧭',\n codepoint: 10733,\n },\n {\n name: 'ERROR-BARRED WHITE SQUARE',\n value: '⧮',\n codepoint: 10734,\n },\n {\n name: 'ERROR-BARRED BLACK SQUARE',\n value: '⧯',\n codepoint: 10735,\n },\n {\n name: 'ERROR-BARRED WHITE DIAMOND',\n value: '⧰',\n codepoint: 10736,\n },\n {\n name: 'ERROR-BARRED BLACK DIAMOND',\n value: '⧱',\n codepoint: 10737,\n },\n {\n name: 'ERROR-BARRED WHITE CIRCLE',\n value: '⧲',\n codepoint: 10738,\n },\n {\n name: 'ERROR-BARRED BLACK CIRCLE',\n value: '⧳',\n codepoint: 10739,\n },\n {\n name: 'RULE-DELAYED',\n value: '⧴',\n codepoint: 10740,\n },\n {\n name: 'REVERSE SOLIDUS OPERATOR',\n value: '⧵',\n codepoint: 10741,\n },\n {\n name: 'SOLIDUS WITH OVERBAR',\n value: '⧶',\n codepoint: 10742,\n },\n {\n name: 'REVERSE SOLIDUS WITH HORIZONTAL STROKE',\n value: '⧷',\n codepoint: 10743,\n },\n {\n name: 'BIG SOLIDUS',\n value: '⧸',\n codepoint: 10744,\n },\n {\n name: 'BIG REVERSE SOLIDUS',\n value: '⧹',\n codepoint: 10745,\n },\n {\n name: 'DOUBLE PLUS',\n value: '⧺',\n codepoint: 10746,\n },\n {\n name: 'TRIPLE PLUS',\n value: '⧻',\n codepoint: 10747,\n },\n {\n name: 'LEFT-POINTING CURVED ANGLE BRACKET',\n value: '⧼',\n codepoint: 10748,\n },\n {\n name: 'RIGHT-POINTING CURVED ANGLE BRACKET',\n value: '⧽',\n codepoint: 10749,\n },\n {\n name: 'TINY',\n value: '⧾',\n codepoint: 10750,\n },\n {\n name: 'MINY',\n value: '⧿',\n codepoint: 10751,\n },\n {\n name: 'N-ARY CIRCLED DOT OPERATOR',\n value: '⨀',\n codepoint: 10752,\n },\n {\n name: 'N-ARY CIRCLED PLUS OPERATOR',\n value: '⨁',\n codepoint: 10753,\n },\n {\n name: 'N-ARY CIRCLED TIMES OPERATOR',\n value: '⨂',\n codepoint: 10754,\n },\n {\n name: 'N-ARY UNION OPERATOR WITH DOT',\n value: '⨃',\n codepoint: 10755,\n },\n {\n name: 'N-ARY UNION OPERATOR WITH PLUS',\n value: '⨄',\n codepoint: 10756,\n },\n {\n name: 'N-ARY SQUARE INTERSECTION OPERATOR',\n value: '⨅',\n codepoint: 10757,\n },\n {\n name: 'N-ARY SQUARE UNION OPERATOR',\n value: '⨆',\n codepoint: 10758,\n },\n {\n name: 'TWO LOGICAL AND OPERATOR',\n value: '⨇',\n codepoint: 10759,\n },\n {\n name: 'TWO LOGICAL OR OPERATOR',\n value: '⨈',\n codepoint: 10760,\n },\n {\n name: 'N-ARY TIMES OPERATOR',\n value: '⨉',\n codepoint: 10761,\n },\n {\n name: 'MODULO TWO SUM',\n value: '⨊',\n codepoint: 10762,\n },\n {\n name: 'SUMMATION WITH INTEGRAL',\n value: '⨋',\n codepoint: 10763,\n },\n {\n name: 'QUADRUPLE INTEGRAL OPERATOR',\n value: '⨌',\n codepoint: 10764,\n },\n {\n name: 'FINITE PART INTEGRAL',\n value: '⨍',\n codepoint: 10765,\n },\n {\n name: 'INTEGRAL WITH DOUBLE STROKE',\n value: '⨎',\n codepoint: 10766,\n },\n {\n name: 'INTEGRAL AVERAGE WITH SLASH',\n value: '⨏',\n codepoint: 10767,\n },\n {\n name: 'CIRCULATION FUNCTION',\n value: '⨐',\n codepoint: 10768,\n },\n {\n name: 'ANTICLOCKWISE INTEGRATION',\n value: '⨑',\n codepoint: 10769,\n },\n {\n name: 'LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE',\n value: '⨒',\n codepoint: 10770,\n },\n {\n name: 'LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE',\n value: '⨓',\n codepoint: 10771,\n },\n {\n name: 'LINE INTEGRATION NOT INCLUDING THE POLE',\n value: '⨔',\n codepoint: 10772,\n },\n {\n name: 'INTEGRAL AROUND A POINT OPERATOR',\n value: '⨕',\n codepoint: 10773,\n },\n {\n name: 'QUATERNION INTEGRAL OPERATOR',\n value: '⨖',\n codepoint: 10774,\n },\n {\n name: 'INTEGRAL WITH LEFTWARDS ARROW WITH HOOK',\n value: '⨗',\n codepoint: 10775,\n },\n {\n name: 'INTEGRAL WITH TIMES SIGN',\n value: '⨘',\n codepoint: 10776,\n },\n {\n name: 'INTEGRAL WITH INTERSECTION',\n value: '⨙',\n codepoint: 10777,\n },\n {\n name: 'INTEGRAL WITH UNION',\n value: '⨚',\n codepoint: 10778,\n },\n {\n name: 'INTEGRAL WITH OVERBAR',\n value: '⨛',\n codepoint: 10779,\n },\n {\n name: 'INTEGRAL WITH UNDERBAR',\n value: '⨜',\n codepoint: 10780,\n },\n {\n name: 'JOIN',\n value: '⨝',\n codepoint: 10781,\n },\n {\n name: 'LARGE LEFT TRIANGLE OPERATOR',\n value: '⨞',\n codepoint: 10782,\n },\n {\n name: 'Z NOTATION SCHEMA COMPOSITION',\n value: '⨟',\n codepoint: 10783,\n },\n {\n name: 'Z NOTATION SCHEMA PIPING',\n value: '⨠',\n codepoint: 10784,\n },\n {\n name: 'Z NOTATION SCHEMA PROJECTION',\n value: '⨡',\n codepoint: 10785,\n },\n {\n name: 'PLUS SIGN WITH SMALL CIRCLE ABOVE',\n value: '⨢',\n codepoint: 10786,\n },\n {\n name: 'PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE',\n value: '⨣',\n codepoint: 10787,\n },\n {\n name: 'PLUS SIGN WITH TILDE ABOVE',\n value: '⨤',\n codepoint: 10788,\n },\n {\n name: 'PLUS SIGN WITH DOT BELOW',\n value: '⨥',\n codepoint: 10789,\n },\n {\n name: 'PLUS SIGN WITH TILDE BELOW',\n value: '⨦',\n codepoint: 10790,\n },\n {\n name: 'PLUS SIGN WITH SUBSCRIPT TWO',\n value: '⨧',\n codepoint: 10791,\n },\n {\n name: 'PLUS SIGN WITH BLACK TRIANGLE',\n value: '⨨',\n codepoint: 10792,\n },\n {\n name: 'MINUS SIGN WITH COMMA ABOVE',\n value: '⨩',\n codepoint: 10793,\n },\n {\n name: 'MINUS SIGN WITH DOT BELOW',\n value: '⨪',\n codepoint: 10794,\n },\n {\n name: 'MINUS SIGN WITH FALLING DOTS',\n value: '⨫',\n codepoint: 10795,\n },\n {\n name: 'MINUS SIGN WITH RISING DOTS',\n value: '⨬',\n codepoint: 10796,\n },\n {\n name: 'PLUS SIGN IN LEFT HALF CIRCLE',\n value: '⨭',\n codepoint: 10797,\n },\n {\n name: 'PLUS SIGN IN RIGHT HALF CIRCLE',\n value: '⨮',\n codepoint: 10798,\n },\n {\n name: 'VECTOR OR CROSS PRODUCT',\n value: '⨯',\n codepoint: 10799,\n },\n {\n name: 'MULTIPLICATION SIGN WITH DOT ABOVE',\n value: '⨰',\n codepoint: 10800,\n },\n {\n name: 'MULTIPLICATION SIGN WITH UNDERBAR',\n value: '⨱',\n codepoint: 10801,\n },\n {\n name: 'SEMIDIRECT PRODUCT WITH BOTTOM CLOSED',\n value: '⨲',\n codepoint: 10802,\n },\n {\n name: 'SMASH PRODUCT',\n value: '⨳',\n codepoint: 10803,\n },\n {\n name: 'MULTIPLICATION SIGN IN LEFT HALF CIRCLE',\n value: '⨴',\n codepoint: 10804,\n },\n {\n name: 'MULTIPLICATION SIGN IN RIGHT HALF CIRCLE',\n value: '⨵',\n codepoint: 10805,\n },\n {\n name: 'CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT',\n value: '⨶',\n codepoint: 10806,\n },\n {\n name: 'MULTIPLICATION SIGN IN DOUBLE CIRCLE',\n value: '⨷',\n codepoint: 10807,\n },\n {\n name: 'CIRCLED DIVISION SIGN',\n value: '⨸',\n codepoint: 10808,\n },\n {\n name: 'PLUS SIGN IN TRIANGLE',\n value: '⨹',\n codepoint: 10809,\n },\n {\n name: 'MINUS SIGN IN TRIANGLE',\n value: '⨺',\n codepoint: 10810,\n },\n {\n name: 'MULTIPLICATION SIGN IN TRIANGLE',\n value: '⨻',\n codepoint: 10811,\n },\n {\n name: 'INTERIOR PRODUCT',\n value: '⨼',\n codepoint: 10812,\n },\n {\n name: 'RIGHTHAND INTERIOR PRODUCT',\n value: '⨽',\n codepoint: 10813,\n },\n {\n name: 'Z NOTATION RELATIONAL COMPOSITION',\n value: '⨾',\n codepoint: 10814,\n },\n {\n name: 'AMALGAMATION OR COPRODUCT',\n value: '⨿',\n codepoint: 10815,\n },\n {\n name: 'INTERSECTION WITH DOT',\n value: '⩀',\n codepoint: 10816,\n },\n {\n name: 'UNION WITH MINUS SIGN',\n value: '⩁',\n codepoint: 10817,\n },\n {\n name: 'UNION WITH OVERBAR',\n value: '⩂',\n codepoint: 10818,\n },\n {\n name: 'INTERSECTION WITH OVERBAR',\n value: '⩃',\n codepoint: 10819,\n },\n {\n name: 'INTERSECTION WITH LOGICAL AND',\n value: '⩄',\n codepoint: 10820,\n },\n {\n name: 'UNION WITH LOGICAL OR',\n value: '⩅',\n codepoint: 10821,\n },\n {\n name: 'UNION ABOVE INTERSECTION',\n value: '⩆',\n codepoint: 10822,\n },\n {\n name: 'INTERSECTION ABOVE UNION',\n value: '⩇',\n codepoint: 10823,\n },\n {\n name: 'UNION ABOVE BAR ABOVE INTERSECTION',\n value: '⩈',\n codepoint: 10824,\n },\n {\n name: 'INTERSECTION ABOVE BAR ABOVE UNION',\n value: '⩉',\n codepoint: 10825,\n },\n {\n name: 'UNION BESIDE AND JOINED WITH UNION',\n value: '⩊',\n codepoint: 10826,\n },\n {\n name: 'INTERSECTION BESIDE AND JOINED WITH INTERSECTION',\n value: '⩋',\n codepoint: 10827,\n },\n {\n name: 'CLOSED UNION WITH SERIFS',\n value: '⩌',\n codepoint: 10828,\n },\n {\n name: 'CLOSED INTERSECTION WITH SERIFS',\n value: '⩍',\n codepoint: 10829,\n },\n {\n name: 'DOUBLE SQUARE INTERSECTION',\n value: '⩎',\n codepoint: 10830,\n },\n {\n name: 'DOUBLE SQUARE UNION',\n value: '⩏',\n codepoint: 10831,\n },\n {\n name: 'CLOSED UNION WITH SERIFS AND SMASH PRODUCT',\n value: '⩐',\n codepoint: 10832,\n },\n {\n name: 'LOGICAL AND WITH DOT ABOVE',\n value: '⩑',\n codepoint: 10833,\n },\n {\n name: 'LOGICAL OR WITH DOT ABOVE',\n value: '⩒',\n codepoint: 10834,\n },\n {\n name: 'DOUBLE LOGICAL AND',\n value: '⩓',\n codepoint: 10835,\n },\n {\n name: 'DOUBLE LOGICAL OR',\n value: '⩔',\n codepoint: 10836,\n },\n {\n name: 'TWO INTERSECTING LOGICAL AND',\n value: '⩕',\n codepoint: 10837,\n },\n {\n name: 'TWO INTERSECTING LOGICAL OR',\n value: '⩖',\n codepoint: 10838,\n },\n {\n name: 'SLOPING LARGE OR',\n value: '⩗',\n codepoint: 10839,\n },\n {\n name: 'SLOPING LARGE AND',\n value: '⩘',\n codepoint: 10840,\n },\n {\n name: 'LOGICAL OR OVERLAPPING LOGICAL AND',\n value: '⩙',\n codepoint: 10841,\n },\n {\n name: 'LOGICAL AND WITH MIDDLE STEM',\n value: '⩚',\n codepoint: 10842,\n },\n {\n name: 'LOGICAL OR WITH MIDDLE STEM',\n value: '⩛',\n codepoint: 10843,\n },\n {\n name: 'LOGICAL AND WITH HORIZONTAL DASH',\n value: '⩜',\n codepoint: 10844,\n },\n {\n name: 'LOGICAL OR WITH HORIZONTAL DASH',\n value: '⩝',\n codepoint: 10845,\n },\n {\n name: 'LOGICAL AND WITH DOUBLE OVERBAR',\n value: '⩞',\n codepoint: 10846,\n },\n {\n name: 'LOGICAL AND WITH UNDERBAR',\n value: '⩟',\n codepoint: 10847,\n },\n {\n name: 'LOGICAL AND WITH DOUBLE UNDERBAR',\n value: '⩠',\n codepoint: 10848,\n },\n {\n name: 'SMALL VEE WITH UNDERBAR',\n value: '⩡',\n codepoint: 10849,\n },\n {\n name: 'LOGICAL OR WITH DOUBLE OVERBAR',\n value: '⩢',\n codepoint: 10850,\n },\n {\n name: 'LOGICAL OR WITH DOUBLE UNDERBAR',\n value: '⩣',\n codepoint: 10851,\n },\n {\n name: 'Z NOTATION DOMAIN ANTIRESTRICTION',\n value: '⩤',\n codepoint: 10852,\n },\n {\n name: 'Z NOTATION RANGE ANTIRESTRICTION',\n value: '⩥',\n codepoint: 10853,\n },\n {\n name: 'EQUALS SIGN WITH DOT BELOW',\n value: '⩦',\n codepoint: 10854,\n },\n {\n name: 'IDENTICAL WITH DOT ABOVE',\n value: '⩧',\n codepoint: 10855,\n },\n {\n name: 'TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE',\n value: '⩨',\n codepoint: 10856,\n },\n {\n name: 'TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE',\n value: '⩩',\n codepoint: 10857,\n },\n {\n name: 'TILDE OPERATOR WITH DOT ABOVE',\n value: '⩪',\n codepoint: 10858,\n },\n {\n name: 'TILDE OPERATOR WITH RISING DOTS',\n value: '⩫',\n codepoint: 10859,\n },\n {\n name: 'SIMILAR MINUS SIMILAR',\n value: '⩬',\n codepoint: 10860,\n },\n {\n name: 'CONGRUENT WITH DOT ABOVE',\n value: '⩭',\n codepoint: 10861,\n },\n {\n name: 'EQUALS WITH ASTERISK',\n value: '⩮',\n codepoint: 10862,\n },\n {\n name: 'ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT',\n value: '⩯',\n codepoint: 10863,\n },\n {\n name: 'APPROXIMATELY EQUAL OR EQUAL TO',\n value: '⩰',\n codepoint: 10864,\n },\n {\n name: 'EQUALS SIGN ABOVE PLUS SIGN',\n value: '⩱',\n codepoint: 10865,\n },\n {\n name: 'PLUS SIGN ABOVE EQUALS SIGN',\n value: '⩲',\n codepoint: 10866,\n },\n {\n name: 'EQUALS SIGN ABOVE TILDE OPERATOR',\n value: '⩳',\n codepoint: 10867,\n },\n {\n name: 'DOUBLE COLON EQUAL',\n value: '⩴',\n codepoint: 10868,\n },\n {\n name: 'TWO CONSECUTIVE EQUALS SIGNS',\n value: '⩵',\n codepoint: 10869,\n },\n {\n name: 'THREE CONSECUTIVE EQUALS SIGNS',\n value: '⩶',\n codepoint: 10870,\n },\n {\n name: 'EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW',\n value: '⩷',\n codepoint: 10871,\n },\n {\n name: 'EQUIVALENT WITH FOUR DOTS ABOVE',\n value: '⩸',\n codepoint: 10872,\n },\n {\n name: 'LESS-THAN WITH CIRCLE INSIDE',\n value: '⩹',\n codepoint: 10873,\n },\n {\n name: 'GREATER-THAN WITH CIRCLE INSIDE',\n value: '⩺',\n codepoint: 10874,\n },\n {\n name: 'LESS-THAN WITH QUESTION MARK ABOVE',\n value: '⩻',\n codepoint: 10875,\n },\n {\n name: 'GREATER-THAN WITH QUESTION MARK ABOVE',\n value: '⩼',\n codepoint: 10876,\n },\n {\n name: 'LESS-THAN OR SLANTED EQUAL TO',\n value: '⩽',\n codepoint: 10877,\n },\n {\n name: 'GREATER-THAN OR SLANTED EQUAL TO',\n value: '⩾',\n codepoint: 10878,\n },\n {\n name: 'LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE',\n value: '⩿',\n codepoint: 10879,\n },\n {\n name: 'GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE',\n value: '⪀',\n codepoint: 10880,\n },\n {\n name: 'LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE',\n value: '⪁',\n codepoint: 10881,\n },\n {\n name: 'GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE',\n value: '⪂',\n codepoint: 10882,\n },\n {\n name: 'LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT',\n value: '⪃',\n codepoint: 10883,\n },\n {\n name: 'GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT',\n value: '⪄',\n codepoint: 10884,\n },\n {\n name: 'LESS-THAN OR APPROXIMATE',\n value: '⪅',\n codepoint: 10885,\n },\n {\n name: 'GREATER-THAN OR APPROXIMATE',\n value: '⪆',\n codepoint: 10886,\n },\n {\n name: 'LESS-THAN AND SINGLE-LINE NOT EQUAL TO',\n value: '⪇',\n codepoint: 10887,\n },\n {\n name: 'GREATER-THAN AND SINGLE-LINE NOT EQUAL TO',\n value: '⪈',\n codepoint: 10888,\n },\n {\n name: 'LESS-THAN AND NOT APPROXIMATE',\n value: '⪉',\n codepoint: 10889,\n },\n {\n name: 'GREATER-THAN AND NOT APPROXIMATE',\n value: '⪊',\n codepoint: 10890,\n },\n {\n name: 'LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN',\n value: '⪋',\n codepoint: 10891,\n },\n {\n name: 'GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN',\n value: '⪌',\n codepoint: 10892,\n },\n {\n name: 'LESS-THAN ABOVE SIMILAR OR EQUAL',\n value: '⪍',\n codepoint: 10893,\n },\n {\n name: 'GREATER-THAN ABOVE SIMILAR OR EQUAL',\n value: '⪎',\n codepoint: 10894,\n },\n {\n name: 'LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN',\n value: '⪏',\n codepoint: 10895,\n },\n {\n name: 'GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN',\n value: '⪐',\n codepoint: 10896,\n },\n {\n name: 'LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL',\n value: '⪑',\n codepoint: 10897,\n },\n {\n name: 'GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL',\n value: '⪒',\n codepoint: 10898,\n },\n {\n name: 'LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL',\n value: '⪓',\n codepoint: 10899,\n },\n {\n name: 'GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL',\n value: '⪔',\n codepoint: 10900,\n },\n {\n name: 'SLANTED EQUAL TO OR LESS-THAN',\n value: '⪕',\n codepoint: 10901,\n },\n {\n name: 'SLANTED EQUAL TO OR GREATER-THAN',\n value: '⪖',\n codepoint: 10902,\n },\n {\n name: 'SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE',\n value: '⪗',\n codepoint: 10903,\n },\n {\n name: 'SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE',\n value: '⪘',\n codepoint: 10904,\n },\n {\n name: 'DOUBLE-LINE EQUAL TO OR LESS-THAN',\n value: '⪙',\n codepoint: 10905,\n },\n {\n name: 'DOUBLE-LINE EQUAL TO OR GREATER-THAN',\n value: '⪚',\n codepoint: 10906,\n },\n {\n name: 'DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN',\n value: '⪛',\n codepoint: 10907,\n },\n {\n name: 'DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN',\n value: '⪜',\n codepoint: 10908,\n },\n {\n name: 'SIMILAR OR LESS-THAN',\n value: '⪝',\n codepoint: 10909,\n },\n {\n name: 'SIMILAR OR GREATER-THAN',\n value: '⪞',\n codepoint: 10910,\n },\n {\n name: 'SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN',\n value: '⪟',\n codepoint: 10911,\n },\n {\n name: 'SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN',\n value: '⪠',\n codepoint: 10912,\n },\n {\n name: 'DOUBLE NESTED LESS-THAN',\n value: '⪡',\n codepoint: 10913,\n },\n {\n name: 'DOUBLE NESTED GREATER-THAN',\n value: '⪢',\n codepoint: 10914,\n },\n {\n name: 'DOUBLE NESTED LESS-THAN WITH UNDERBAR',\n value: '⪣',\n codepoint: 10915,\n },\n {\n name: 'GREATER-THAN OVERLAPPING LESS-THAN',\n value: '⪤',\n codepoint: 10916,\n },\n {\n name: 'GREATER-THAN BESIDE LESS-THAN',\n value: '⪥',\n codepoint: 10917,\n },\n {\n name: 'LESS-THAN CLOSED BY CURVE',\n value: '⪦',\n codepoint: 10918,\n },\n {\n name: 'GREATER-THAN CLOSED BY CURVE',\n value: '⪧',\n codepoint: 10919,\n },\n {\n name: 'LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL',\n value: '⪨',\n codepoint: 10920,\n },\n {\n name: 'GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL',\n value: '⪩',\n codepoint: 10921,\n },\n {\n name: 'SMALLER THAN',\n value: '⪪',\n codepoint: 10922,\n },\n {\n name: 'LARGER THAN',\n value: '⪫',\n codepoint: 10923,\n },\n {\n name: 'SMALLER THAN OR EQUAL TO',\n value: '⪬',\n codepoint: 10924,\n },\n {\n name: 'LARGER THAN OR EQUAL TO',\n value: '⪭',\n codepoint: 10925,\n },\n {\n name: 'EQUALS SIGN WITH BUMPY ABOVE',\n value: '⪮',\n codepoint: 10926,\n },\n {\n name: 'PRECEDES ABOVE SINGLE-LINE EQUALS SIGN',\n value: '⪯',\n codepoint: 10927,\n },\n {\n name: 'SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN',\n value: '⪰',\n codepoint: 10928,\n },\n {\n name: 'PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO',\n value: '⪱',\n codepoint: 10929,\n },\n {\n name: 'SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO',\n value: '⪲',\n codepoint: 10930,\n },\n {\n name: 'PRECEDES ABOVE EQUALS SIGN',\n value: '⪳',\n codepoint: 10931,\n },\n {\n name: 'SUCCEEDS ABOVE EQUALS SIGN',\n value: '⪴',\n codepoint: 10932,\n },\n {\n name: 'PRECEDES ABOVE NOT EQUAL TO',\n value: '⪵',\n codepoint: 10933,\n },\n {\n name: 'SUCCEEDS ABOVE NOT EQUAL TO',\n value: '⪶',\n codepoint: 10934,\n },\n {\n name: 'PRECEDES ABOVE ALMOST EQUAL TO',\n value: '⪷',\n codepoint: 10935,\n },\n {\n name: 'SUCCEEDS ABOVE ALMOST EQUAL TO',\n value: '⪸',\n codepoint: 10936,\n },\n {\n name: 'PRECEDES ABOVE NOT ALMOST EQUAL TO',\n value: '⪹',\n codepoint: 10937,\n },\n {\n name: 'SUCCEEDS ABOVE NOT ALMOST EQUAL TO',\n value: '⪺',\n codepoint: 10938,\n },\n {\n name: 'DOUBLE PRECEDES',\n value: '⪻',\n codepoint: 10939,\n },\n {\n name: 'DOUBLE SUCCEEDS',\n value: '⪼',\n codepoint: 10940,\n },\n {\n name: 'SUBSET WITH DOT',\n value: '⪽',\n codepoint: 10941,\n },\n {\n name: 'SUPERSET WITH DOT',\n value: '⪾',\n codepoint: 10942,\n },\n {\n name: 'SUBSET WITH PLUS SIGN BELOW',\n value: '⪿',\n codepoint: 10943,\n },\n {\n name: 'SUPERSET WITH PLUS SIGN BELOW',\n value: '⫀',\n codepoint: 10944,\n },\n {\n name: 'SUBSET WITH MULTIPLICATION SIGN BELOW',\n value: '⫁',\n codepoint: 10945,\n },\n {\n name: 'SUPERSET WITH MULTIPLICATION SIGN BELOW',\n value: '⫂',\n codepoint: 10946,\n },\n {\n name: 'SUBSET OF OR EQUAL TO WITH DOT ABOVE',\n value: '⫃',\n codepoint: 10947,\n },\n {\n name: 'SUPERSET OF OR EQUAL TO WITH DOT ABOVE',\n value: '⫄',\n codepoint: 10948,\n },\n {\n name: 'SUBSET OF ABOVE EQUALS SIGN',\n value: '⫅',\n codepoint: 10949,\n },\n {\n name: 'SUPERSET OF ABOVE EQUALS SIGN',\n value: '⫆',\n codepoint: 10950,\n },\n {\n name: 'SUBSET OF ABOVE TILDE OPERATOR',\n value: '⫇',\n codepoint: 10951,\n },\n {\n name: 'SUPERSET OF ABOVE TILDE OPERATOR',\n value: '⫈',\n codepoint: 10952,\n },\n {\n name: 'SUBSET OF ABOVE ALMOST EQUAL TO',\n value: '⫉',\n codepoint: 10953,\n },\n {\n name: 'SUPERSET OF ABOVE ALMOST EQUAL TO',\n value: '⫊',\n codepoint: 10954,\n },\n {\n name: 'SUBSET OF ABOVE NOT EQUAL TO',\n value: '⫋',\n codepoint: 10955,\n },\n {\n name: 'SUPERSET OF ABOVE NOT EQUAL TO',\n value: '⫌',\n codepoint: 10956,\n },\n {\n name: 'SQUARE LEFT OPEN BOX OPERATOR',\n value: '⫍',\n codepoint: 10957,\n },\n {\n name: 'SQUARE RIGHT OPEN BOX OPERATOR',\n value: '⫎',\n codepoint: 10958,\n },\n {\n name: 'CLOSED SUBSET',\n value: '⫏',\n codepoint: 10959,\n },\n {\n name: 'CLOSED SUPERSET',\n value: '⫐',\n codepoint: 10960,\n },\n {\n name: 'CLOSED SUBSET OR EQUAL TO',\n value: '⫑',\n codepoint: 10961,\n },\n {\n name: 'CLOSED SUPERSET OR EQUAL TO',\n value: '⫒',\n codepoint: 10962,\n },\n {\n name: 'SUBSET ABOVE SUPERSET',\n value: '⫓',\n codepoint: 10963,\n },\n {\n name: 'SUPERSET ABOVE SUBSET',\n value: '⫔',\n codepoint: 10964,\n },\n {\n name: 'SUBSET ABOVE SUBSET',\n value: '⫕',\n codepoint: 10965,\n },\n {\n name: 'SUPERSET ABOVE SUPERSET',\n value: '⫖',\n codepoint: 10966,\n },\n {\n name: 'SUPERSET BESIDE SUBSET',\n value: '⫗',\n codepoint: 10967,\n },\n {\n name: 'SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET',\n value: '⫘',\n codepoint: 10968,\n },\n {\n name: 'ELEMENT OF OPENING DOWNWARDS',\n value: '⫙',\n codepoint: 10969,\n },\n {\n name: 'PITCHFORK WITH TEE TOP',\n value: '⫚',\n codepoint: 10970,\n },\n {\n name: 'TRANSVERSAL INTERSECTION',\n value: '⫛',\n codepoint: 10971,\n },\n {\n name: 'FORKING',\n value: '⫝̸',\n codepoint: 10972,\n },\n {\n name: 'NONFORKING',\n value: '⫝',\n codepoint: 10973,\n },\n {\n name: 'SHORT LEFT TACK',\n value: '⫞',\n codepoint: 10974,\n },\n {\n name: 'SHORT DOWN TACK',\n value: '⫟',\n codepoint: 10975,\n },\n {\n name: 'SHORT UP TACK',\n value: '⫠',\n codepoint: 10976,\n },\n {\n name: 'PERPENDICULAR WITH S',\n value: '⫡',\n codepoint: 10977,\n },\n {\n name: 'VERTICAL BAR TRIPLE RIGHT TURNSTILE',\n value: '⫢',\n codepoint: 10978,\n },\n {\n name: 'DOUBLE VERTICAL BAR LEFT TURNSTILE',\n value: '⫣',\n codepoint: 10979,\n },\n {\n name: 'VERTICAL BAR DOUBLE LEFT TURNSTILE',\n value: '⫤',\n codepoint: 10980,\n },\n {\n name: 'DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE',\n value: '⫥',\n codepoint: 10981,\n },\n {\n name: 'LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL',\n value: '⫦',\n codepoint: 10982,\n },\n {\n name: 'SHORT DOWN TACK WITH OVERBAR',\n value: '⫧',\n codepoint: 10983,\n },\n {\n name: 'SHORT UP TACK WITH UNDERBAR',\n value: '⫨',\n codepoint: 10984,\n },\n {\n name: 'SHORT UP TACK ABOVE SHORT DOWN TACK',\n value: '⫩',\n codepoint: 10985,\n },\n {\n name: 'DOUBLE DOWN TACK',\n value: '⫪',\n codepoint: 10986,\n },\n {\n name: 'DOUBLE UP TACK',\n value: '⫫',\n codepoint: 10987,\n },\n {\n name: 'DOUBLE STROKE NOT SIGN',\n value: '⫬',\n codepoint: 10988,\n },\n {\n name: 'REVERSED DOUBLE STROKE NOT SIGN',\n value: '⫭',\n codepoint: 10989,\n },\n {\n name: 'DOES NOT DIVIDE WITH REVERSED NEGATION SLASH',\n value: '⫮',\n codepoint: 10990,\n },\n {\n name: 'VERTICAL LINE WITH CIRCLE ABOVE',\n value: '⫯',\n codepoint: 10991,\n },\n {\n name: 'VERTICAL LINE WITH CIRCLE BELOW',\n value: '⫰',\n codepoint: 10992,\n },\n {\n name: 'DOWN TACK WITH CIRCLE BELOW',\n value: '⫱',\n codepoint: 10993,\n },\n {\n name: 'PARALLEL WITH HORIZONTAL STROKE',\n value: '⫲',\n codepoint: 10994,\n },\n {\n name: 'PARALLEL WITH TILDE OPERATOR',\n value: '⫳',\n codepoint: 10995,\n },\n {\n name: 'TRIPLE VERTICAL BAR BINARY RELATION',\n value: '⫴',\n codepoint: 10996,\n },\n {\n name: 'TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE',\n value: '⫵',\n codepoint: 10997,\n },\n {\n name: 'TRIPLE COLON OPERATOR',\n value: '⫶',\n codepoint: 10998,\n },\n {\n name: 'TRIPLE NESTED LESS-THAN',\n value: '⫷',\n codepoint: 10999,\n },\n {\n name: 'TRIPLE NESTED GREATER-THAN',\n value: '⫸',\n codepoint: 11000,\n },\n {\n name: 'DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO',\n value: '⫹',\n codepoint: 11001,\n },\n {\n name: 'DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO',\n value: '⫺',\n codepoint: 11002,\n },\n {\n name: 'TRIPLE SOLIDUS BINARY RELATION',\n value: '⫻',\n codepoint: 11003,\n },\n {\n name: 'LARGE TRIPLE VERTICAL BAR OPERATOR',\n value: '⫼',\n codepoint: 11004,\n },\n {\n name: 'DOUBLE SOLIDUS OPERATOR',\n value: '⫽',\n codepoint: 11005,\n },\n {\n name: 'WHITE VERTICAL BAR',\n value: '⫾',\n codepoint: 11006,\n },\n {\n name: 'N-ARY WHITE VERTICAL BAR',\n value: '⫿',\n codepoint: 11007,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL A',\n value: '𝐀',\n codepoint: 119808,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL B',\n value: '𝐁',\n codepoint: 119809,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL C',\n value: '𝐂',\n codepoint: 119810,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL D',\n value: '𝐃',\n codepoint: 119811,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL E',\n value: '𝐄',\n codepoint: 119812,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL F',\n value: '𝐅',\n codepoint: 119813,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL G',\n value: '𝐆',\n codepoint: 119814,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL H',\n value: '𝐇',\n codepoint: 119815,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL I',\n value: '𝐈',\n codepoint: 119816,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL J',\n value: '𝐉',\n codepoint: 119817,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL K',\n value: '𝐊',\n codepoint: 119818,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL L',\n value: '𝐋',\n codepoint: 119819,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL M',\n value: '𝐌',\n codepoint: 119820,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL N',\n value: '𝐍',\n codepoint: 119821,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL O',\n value: '𝐎',\n codepoint: 119822,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL P',\n value: '𝐏',\n codepoint: 119823,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL Q',\n value: '𝐐',\n codepoint: 119824,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL R',\n value: '𝐑',\n codepoint: 119825,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL S',\n value: '𝐒',\n codepoint: 119826,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL T',\n value: '𝐓',\n codepoint: 119827,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL U',\n value: '𝐔',\n codepoint: 119828,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL V',\n value: '𝐕',\n codepoint: 119829,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL W',\n value: '𝐖',\n codepoint: 119830,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL X',\n value: '𝐗',\n codepoint: 119831,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL Y',\n value: '𝐘',\n codepoint: 119832,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL Z',\n value: '𝐙',\n codepoint: 119833,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL A',\n value: '𝐚',\n codepoint: 119834,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL B',\n value: '𝐛',\n codepoint: 119835,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL C',\n value: '𝐜',\n codepoint: 119836,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL D',\n value: '𝐝',\n codepoint: 119837,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL E',\n value: '𝐞',\n codepoint: 119838,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL F',\n value: '𝐟',\n codepoint: 119839,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL G',\n value: '𝐠',\n codepoint: 119840,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL H',\n value: '𝐡',\n codepoint: 119841,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL I',\n value: '𝐢',\n codepoint: 119842,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL J',\n value: '𝐣',\n codepoint: 119843,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL K',\n value: '𝐤',\n codepoint: 119844,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL L',\n value: '𝐥',\n codepoint: 119845,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL M',\n value: '𝐦',\n codepoint: 119846,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL N',\n value: '𝐧',\n codepoint: 119847,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL O',\n value: '𝐨',\n codepoint: 119848,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL P',\n value: '𝐩',\n codepoint: 119849,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL Q',\n value: '𝐪',\n codepoint: 119850,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL R',\n value: '𝐫',\n codepoint: 119851,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL S',\n value: '𝐬',\n codepoint: 119852,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL T',\n value: '𝐭',\n codepoint: 119853,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL U',\n value: '𝐮',\n codepoint: 119854,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL V',\n value: '𝐯',\n codepoint: 119855,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL W',\n value: '𝐰',\n codepoint: 119856,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL X',\n value: '𝐱',\n codepoint: 119857,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL Y',\n value: '𝐲',\n codepoint: 119858,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL Z',\n value: '𝐳',\n codepoint: 119859,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL A',\n value: '𝐴',\n codepoint: 119860,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL B',\n value: '𝐵',\n codepoint: 119861,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL C',\n value: '𝐶',\n codepoint: 119862,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL D',\n value: '𝐷',\n codepoint: 119863,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL E',\n value: '𝐸',\n codepoint: 119864,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL F',\n value: '𝐹',\n codepoint: 119865,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL G',\n value: '𝐺',\n codepoint: 119866,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL H',\n value: '𝐻',\n codepoint: 119867,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL I',\n value: '𝐼',\n codepoint: 119868,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL J',\n value: '𝐽',\n codepoint: 119869,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL K',\n value: '𝐾',\n codepoint: 119870,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL L',\n value: '𝐿',\n codepoint: 119871,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL M',\n value: '𝑀',\n codepoint: 119872,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL N',\n value: '𝑁',\n codepoint: 119873,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL O',\n value: '𝑂',\n codepoint: 119874,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL P',\n value: '𝑃',\n codepoint: 119875,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL Q',\n value: '𝑄',\n codepoint: 119876,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL R',\n value: '𝑅',\n codepoint: 119877,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL S',\n value: '𝑆',\n codepoint: 119878,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL T',\n value: '𝑇',\n codepoint: 119879,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL U',\n value: '𝑈',\n codepoint: 119880,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL V',\n value: '𝑉',\n codepoint: 119881,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL W',\n value: '𝑊',\n codepoint: 119882,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL X',\n value: '𝑋',\n codepoint: 119883,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL Y',\n value: '𝑌',\n codepoint: 119884,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL Z',\n value: '𝑍',\n codepoint: 119885,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL A',\n value: '𝑎',\n codepoint: 119886,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL B',\n value: '𝑏',\n codepoint: 119887,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL C',\n value: '𝑐',\n codepoint: 119888,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL D',\n value: '𝑑',\n codepoint: 119889,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL E',\n value: '𝑒',\n codepoint: 119890,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL F',\n value: '𝑓',\n codepoint: 119891,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL G',\n value: '𝑔',\n codepoint: 119892,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL I',\n value: '𝑖',\n codepoint: 119894,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL J',\n value: '𝑗',\n codepoint: 119895,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL K',\n value: '𝑘',\n codepoint: 119896,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL L',\n value: '𝑙',\n codepoint: 119897,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL M',\n value: '𝑚',\n codepoint: 119898,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL N',\n value: '𝑛',\n codepoint: 119899,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL O',\n value: '𝑜',\n codepoint: 119900,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL P',\n value: '𝑝',\n codepoint: 119901,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL Q',\n value: '𝑞',\n codepoint: 119902,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL R',\n value: '𝑟',\n codepoint: 119903,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL S',\n value: '𝑠',\n codepoint: 119904,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL T',\n value: '𝑡',\n codepoint: 119905,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL U',\n value: '𝑢',\n codepoint: 119906,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL V',\n value: '𝑣',\n codepoint: 119907,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL W',\n value: '𝑤',\n codepoint: 119908,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL X',\n value: '𝑥',\n codepoint: 119909,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL Y',\n value: '𝑦',\n codepoint: 119910,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL Z',\n value: '𝑧',\n codepoint: 119911,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL A',\n value: '𝑨',\n codepoint: 119912,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL B',\n value: '𝑩',\n codepoint: 119913,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL C',\n value: '𝑪',\n codepoint: 119914,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL D',\n value: '𝑫',\n codepoint: 119915,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL E',\n value: '𝑬',\n codepoint: 119916,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL F',\n value: '𝑭',\n codepoint: 119917,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL G',\n value: '𝑮',\n codepoint: 119918,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL H',\n value: '𝑯',\n codepoint: 119919,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL I',\n value: '𝑰',\n codepoint: 119920,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL J',\n value: '𝑱',\n codepoint: 119921,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL K',\n value: '𝑲',\n codepoint: 119922,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL L',\n value: '𝑳',\n codepoint: 119923,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL M',\n value: '𝑴',\n codepoint: 119924,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL N',\n value: '𝑵',\n codepoint: 119925,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL O',\n value: '𝑶',\n codepoint: 119926,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL P',\n value: '𝑷',\n codepoint: 119927,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL Q',\n value: '𝑸',\n codepoint: 119928,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL R',\n value: '𝑹',\n codepoint: 119929,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL S',\n value: '𝑺',\n codepoint: 119930,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL T',\n value: '𝑻',\n codepoint: 119931,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL U',\n value: '𝑼',\n codepoint: 119932,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL V',\n value: '𝑽',\n codepoint: 119933,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL W',\n value: '𝑾',\n codepoint: 119934,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL X',\n value: '𝑿',\n codepoint: 119935,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL Y',\n value: '𝒀',\n codepoint: 119936,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL Z',\n value: '𝒁',\n codepoint: 119937,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL A',\n value: '𝒂',\n codepoint: 119938,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL B',\n value: '𝒃',\n codepoint: 119939,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL C',\n value: '𝒄',\n codepoint: 119940,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL D',\n value: '𝒅',\n codepoint: 119941,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL E',\n value: '𝒆',\n codepoint: 119942,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL F',\n value: '𝒇',\n codepoint: 119943,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL G',\n value: '𝒈',\n codepoint: 119944,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL H',\n value: '𝒉',\n codepoint: 119945,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL I',\n value: '𝒊',\n codepoint: 119946,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL J',\n value: '𝒋',\n codepoint: 119947,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL K',\n value: '𝒌',\n codepoint: 119948,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL L',\n value: '𝒍',\n codepoint: 119949,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL M',\n value: '𝒎',\n codepoint: 119950,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL N',\n value: '𝒏',\n codepoint: 119951,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL O',\n value: '𝒐',\n codepoint: 119952,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL P',\n value: '𝒑',\n codepoint: 119953,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL Q',\n value: '𝒒',\n codepoint: 119954,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL R',\n value: '𝒓',\n codepoint: 119955,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL S',\n value: '𝒔',\n codepoint: 119956,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL T',\n value: '𝒕',\n codepoint: 119957,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL U',\n value: '𝒖',\n codepoint: 119958,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL V',\n value: '𝒗',\n codepoint: 119959,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL W',\n value: '𝒘',\n codepoint: 119960,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL X',\n value: '𝒙',\n codepoint: 119961,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL Y',\n value: '𝒚',\n codepoint: 119962,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL Z',\n value: '𝒛',\n codepoint: 119963,\n },\n {\n name: 'MATHEMATICAL SCRIPT CAPITAL A',\n value: '𝒜',\n codepoint: 119964,\n },\n {\n name: 'MATHEMATICAL SCRIPT CAPITAL C',\n value: '𝒞',\n codepoint: 119966,\n },\n {\n name: 'MATHEMATICAL SCRIPT CAPITAL D',\n value: '𝒟',\n codepoint: 119967,\n },\n {\n name: 'MATHEMATICAL SCRIPT CAPITAL G',\n value: '𝒢',\n codepoint: 119970,\n },\n {\n name: 'MATHEMATICAL SCRIPT CAPITAL J',\n value: '𝒥',\n codepoint: 119973,\n },\n {\n name: 'MATHEMATICAL SCRIPT CAPITAL K',\n value: '𝒦',\n codepoint: 119974,\n },\n {\n name: 'MATHEMATICAL SCRIPT CAPITAL N',\n value: '𝒩',\n codepoint: 119977,\n },\n {\n name: 'MATHEMATICAL SCRIPT CAPITAL O',\n value: '𝒪',\n codepoint: 119978,\n },\n {\n name: 'MATHEMATICAL SCRIPT CAPITAL P',\n value: '𝒫',\n codepoint: 119979,\n },\n {\n name: 'MATHEMATICAL SCRIPT CAPITAL Q',\n value: '𝒬',\n codepoint: 119980,\n },\n {\n name: 'MATHEMATICAL SCRIPT CAPITAL S',\n value: '𝒮',\n codepoint: 119982,\n },\n {\n name: 'MATHEMATICAL SCRIPT CAPITAL T',\n value: '𝒯',\n codepoint: 119983,\n },\n {\n name: 'MATHEMATICAL SCRIPT CAPITAL U',\n value: '𝒰',\n codepoint: 119984,\n },\n {\n name: 'MATHEMATICAL SCRIPT CAPITAL V',\n value: '𝒱',\n codepoint: 119985,\n },\n {\n name: 'MATHEMATICAL SCRIPT CAPITAL W',\n value: '𝒲',\n codepoint: 119986,\n },\n {\n name: 'MATHEMATICAL SCRIPT CAPITAL X',\n value: '𝒳',\n codepoint: 119987,\n },\n {\n name: 'MATHEMATICAL SCRIPT CAPITAL Y',\n value: '𝒴',\n codepoint: 119988,\n },\n {\n name: 'MATHEMATICAL SCRIPT CAPITAL Z',\n value: '𝒵',\n codepoint: 119989,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL A',\n value: '𝒶',\n codepoint: 119990,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL B',\n value: '𝒷',\n codepoint: 119991,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL C',\n value: '𝒸',\n codepoint: 119992,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL D',\n value: '𝒹',\n codepoint: 119993,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL F',\n value: '𝒻',\n codepoint: 119995,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL H',\n value: '𝒽',\n codepoint: 119997,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL I',\n value: '𝒾',\n codepoint: 119998,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL J',\n value: '𝒿',\n codepoint: 119999,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL K',\n value: '𝓀',\n codepoint: 120000,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL L',\n value: '𝓁',\n codepoint: 120001,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL M',\n value: '𝓂',\n codepoint: 120002,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL N',\n value: '𝓃',\n codepoint: 120003,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL P',\n value: '𝓅',\n codepoint: 120005,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL Q',\n value: '𝓆',\n codepoint: 120006,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL R',\n value: '𝓇',\n codepoint: 120007,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL S',\n value: '𝓈',\n codepoint: 120008,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL T',\n value: '𝓉',\n codepoint: 120009,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL U',\n value: '𝓊',\n codepoint: 120010,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL V',\n value: '𝓋',\n codepoint: 120011,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL W',\n value: '𝓌',\n codepoint: 120012,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL X',\n value: '𝓍',\n codepoint: 120013,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL Y',\n value: '𝓎',\n codepoint: 120014,\n },\n {\n name: 'MATHEMATICAL SCRIPT SMALL Z',\n value: '𝓏',\n codepoint: 120015,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL A',\n value: '𝓐',\n codepoint: 120016,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL B',\n value: '𝓑',\n codepoint: 120017,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL C',\n value: '𝓒',\n codepoint: 120018,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL D',\n value: '𝓓',\n codepoint: 120019,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL E',\n value: '𝓔',\n codepoint: 120020,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL F',\n value: '𝓕',\n codepoint: 120021,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL G',\n value: '𝓖',\n codepoint: 120022,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL H',\n value: '𝓗',\n codepoint: 120023,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL I',\n value: '𝓘',\n codepoint: 120024,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL J',\n value: '𝓙',\n codepoint: 120025,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL K',\n value: '𝓚',\n codepoint: 120026,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL L',\n value: '𝓛',\n codepoint: 120027,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL M',\n value: '𝓜',\n codepoint: 120028,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL N',\n value: '𝓝',\n codepoint: 120029,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL O',\n value: '𝓞',\n codepoint: 120030,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL P',\n value: '𝓟',\n codepoint: 120031,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL Q',\n value: '𝓠',\n codepoint: 120032,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL R',\n value: '𝓡',\n codepoint: 120033,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL S',\n value: '𝓢',\n codepoint: 120034,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL T',\n value: '𝓣',\n codepoint: 120035,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL U',\n value: '𝓤',\n codepoint: 120036,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL V',\n value: '𝓥',\n codepoint: 120037,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL W',\n value: '𝓦',\n codepoint: 120038,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL X',\n value: '𝓧',\n codepoint: 120039,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL Y',\n value: '𝓨',\n codepoint: 120040,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT CAPITAL Z',\n value: '𝓩',\n codepoint: 120041,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL A',\n value: '𝓪',\n codepoint: 120042,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL B',\n value: '𝓫',\n codepoint: 120043,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL C',\n value: '𝓬',\n codepoint: 120044,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL D',\n value: '𝓭',\n codepoint: 120045,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL E',\n value: '𝓮',\n codepoint: 120046,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL F',\n value: '𝓯',\n codepoint: 120047,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL G',\n value: '𝓰',\n codepoint: 120048,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL H',\n value: '𝓱',\n codepoint: 120049,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL I',\n value: '𝓲',\n codepoint: 120050,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL J',\n value: '𝓳',\n codepoint: 120051,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL K',\n value: '𝓴',\n codepoint: 120052,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL L',\n value: '𝓵',\n codepoint: 120053,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL M',\n value: '𝓶',\n codepoint: 120054,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL N',\n value: '𝓷',\n codepoint: 120055,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL O',\n value: '𝓸',\n codepoint: 120056,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL P',\n value: '𝓹',\n codepoint: 120057,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL Q',\n value: '𝓺',\n codepoint: 120058,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL R',\n value: '𝓻',\n codepoint: 120059,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL S',\n value: '𝓼',\n codepoint: 120060,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL T',\n value: '𝓽',\n codepoint: 120061,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL U',\n value: '𝓾',\n codepoint: 120062,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL V',\n value: '𝓿',\n codepoint: 120063,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL W',\n value: '𝔀',\n codepoint: 120064,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL X',\n value: '𝔁',\n codepoint: 120065,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL Y',\n value: '𝔂',\n codepoint: 120066,\n },\n {\n name: 'MATHEMATICAL BOLD SCRIPT SMALL Z',\n value: '𝔃',\n codepoint: 120067,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL A',\n value: '𝔄',\n codepoint: 120068,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL B',\n value: '𝔅',\n codepoint: 120069,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL D',\n value: '𝔇',\n codepoint: 120071,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL E',\n value: '𝔈',\n codepoint: 120072,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL F',\n value: '𝔉',\n codepoint: 120073,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL G',\n value: '𝔊',\n codepoint: 120074,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL J',\n value: '𝔍',\n codepoint: 120077,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL K',\n value: '𝔎',\n codepoint: 120078,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL L',\n value: '𝔏',\n codepoint: 120079,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL M',\n value: '𝔐',\n codepoint: 120080,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL N',\n value: '𝔑',\n codepoint: 120081,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL O',\n value: '𝔒',\n codepoint: 120082,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL P',\n value: '𝔓',\n codepoint: 120083,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL Q',\n value: '𝔔',\n codepoint: 120084,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL S',\n value: '𝔖',\n codepoint: 120086,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL T',\n value: '𝔗',\n codepoint: 120087,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL U',\n value: '𝔘',\n codepoint: 120088,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL V',\n value: '𝔙',\n codepoint: 120089,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL W',\n value: '𝔚',\n codepoint: 120090,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL X',\n value: '𝔛',\n codepoint: 120091,\n },\n {\n name: 'MATHEMATICAL FRAKTUR CAPITAL Y',\n value: '𝔜',\n codepoint: 120092,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL A',\n value: '𝔞',\n codepoint: 120094,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL B',\n value: '𝔟',\n codepoint: 120095,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL C',\n value: '𝔠',\n codepoint: 120096,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL D',\n value: '𝔡',\n codepoint: 120097,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL E',\n value: '𝔢',\n codepoint: 120098,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL F',\n value: '𝔣',\n codepoint: 120099,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL G',\n value: '𝔤',\n codepoint: 120100,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL H',\n value: '𝔥',\n codepoint: 120101,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL I',\n value: '𝔦',\n codepoint: 120102,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL J',\n value: '𝔧',\n codepoint: 120103,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL K',\n value: '𝔨',\n codepoint: 120104,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL L',\n value: '𝔩',\n codepoint: 120105,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL M',\n value: '𝔪',\n codepoint: 120106,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL N',\n value: '𝔫',\n codepoint: 120107,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL O',\n value: '𝔬',\n codepoint: 120108,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL P',\n value: '𝔭',\n codepoint: 120109,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL Q',\n value: '𝔮',\n codepoint: 120110,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL R',\n value: '𝔯',\n codepoint: 120111,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL S',\n value: '𝔰',\n codepoint: 120112,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL T',\n value: '𝔱',\n codepoint: 120113,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL U',\n value: '𝔲',\n codepoint: 120114,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL V',\n value: '𝔳',\n codepoint: 120115,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL W',\n value: '𝔴',\n codepoint: 120116,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL X',\n value: '𝔵',\n codepoint: 120117,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL Y',\n value: '𝔶',\n codepoint: 120118,\n },\n {\n name: 'MATHEMATICAL FRAKTUR SMALL Z',\n value: '𝔷',\n codepoint: 120119,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL A',\n value: '𝔸',\n codepoint: 120120,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL B',\n value: '𝔹',\n codepoint: 120121,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL D',\n value: '𝔻',\n codepoint: 120123,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL E',\n value: '𝔼',\n codepoint: 120124,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL F',\n value: '𝔽',\n codepoint: 120125,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL G',\n value: '𝔾',\n codepoint: 120126,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL I',\n value: '𝕀',\n codepoint: 120128,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL J',\n value: '𝕁',\n codepoint: 120129,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL K',\n value: '𝕂',\n codepoint: 120130,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL L',\n value: '𝕃',\n codepoint: 120131,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL M',\n value: '𝕄',\n codepoint: 120132,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL O',\n value: '𝕆',\n codepoint: 120134,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL S',\n value: '𝕊',\n codepoint: 120138,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL T',\n value: '𝕋',\n codepoint: 120139,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL U',\n value: '𝕌',\n codepoint: 120140,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL V',\n value: '𝕍',\n codepoint: 120141,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL W',\n value: '𝕎',\n codepoint: 120142,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL X',\n value: '𝕏',\n codepoint: 120143,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK CAPITAL Y',\n value: '𝕐',\n codepoint: 120144,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL A',\n value: '𝕒',\n codepoint: 120146,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL B',\n value: '𝕓',\n codepoint: 120147,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL C',\n value: '𝕔',\n codepoint: 120148,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL D',\n value: '𝕕',\n codepoint: 120149,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL E',\n value: '𝕖',\n codepoint: 120150,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL F',\n value: '𝕗',\n codepoint: 120151,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL G',\n value: '𝕘',\n codepoint: 120152,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL H',\n value: '𝕙',\n codepoint: 120153,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL I',\n value: '𝕚',\n codepoint: 120154,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL J',\n value: '𝕛',\n codepoint: 120155,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL K',\n value: '𝕜',\n codepoint: 120156,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL L',\n value: '𝕝',\n codepoint: 120157,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL M',\n value: '𝕞',\n codepoint: 120158,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL N',\n value: '𝕟',\n codepoint: 120159,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL O',\n value: '𝕠',\n codepoint: 120160,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL P',\n value: '𝕡',\n codepoint: 120161,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL Q',\n value: '𝕢',\n codepoint: 120162,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL R',\n value: '𝕣',\n codepoint: 120163,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL S',\n value: '𝕤',\n codepoint: 120164,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL T',\n value: '𝕥',\n codepoint: 120165,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL U',\n value: '𝕦',\n codepoint: 120166,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL V',\n value: '𝕧',\n codepoint: 120167,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL W',\n value: '𝕨',\n codepoint: 120168,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL X',\n value: '𝕩',\n codepoint: 120169,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL Y',\n value: '𝕪',\n codepoint: 120170,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK SMALL Z',\n value: '𝕫',\n codepoint: 120171,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL A',\n value: '𝕬',\n codepoint: 120172,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL B',\n value: '𝕭',\n codepoint: 120173,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL C',\n value: '𝕮',\n codepoint: 120174,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL D',\n value: '𝕯',\n codepoint: 120175,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL E',\n value: '𝕰',\n codepoint: 120176,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL F',\n value: '𝕱',\n codepoint: 120177,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL G',\n value: '𝕲',\n codepoint: 120178,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL H',\n value: '𝕳',\n codepoint: 120179,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL I',\n value: '𝕴',\n codepoint: 120180,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL J',\n value: '𝕵',\n codepoint: 120181,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL K',\n value: '𝕶',\n codepoint: 120182,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL L',\n value: '𝕷',\n codepoint: 120183,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL M',\n value: '𝕸',\n codepoint: 120184,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL N',\n value: '𝕹',\n codepoint: 120185,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL O',\n value: '𝕺',\n codepoint: 120186,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL P',\n value: '𝕻',\n codepoint: 120187,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL Q',\n value: '𝕼',\n codepoint: 120188,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL R',\n value: '𝕽',\n codepoint: 120189,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL S',\n value: '𝕾',\n codepoint: 120190,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL T',\n value: '𝕿',\n codepoint: 120191,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL U',\n value: '𝖀',\n codepoint: 120192,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL V',\n value: '𝖁',\n codepoint: 120193,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL W',\n value: '𝖂',\n codepoint: 120194,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL X',\n value: '𝖃',\n codepoint: 120195,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL Y',\n value: '𝖄',\n codepoint: 120196,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR CAPITAL Z',\n value: '𝖅',\n codepoint: 120197,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL A',\n value: '𝖆',\n codepoint: 120198,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL B',\n value: '𝖇',\n codepoint: 120199,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL C',\n value: '𝖈',\n codepoint: 120200,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL D',\n value: '𝖉',\n codepoint: 120201,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL E',\n value: '𝖊',\n codepoint: 120202,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL F',\n value: '𝖋',\n codepoint: 120203,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL G',\n value: '𝖌',\n codepoint: 120204,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL H',\n value: '𝖍',\n codepoint: 120205,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL I',\n value: '𝖎',\n codepoint: 120206,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL J',\n value: '𝖏',\n codepoint: 120207,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL K',\n value: '𝖐',\n codepoint: 120208,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL L',\n value: '𝖑',\n codepoint: 120209,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL M',\n value: '𝖒',\n codepoint: 120210,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL N',\n value: '𝖓',\n codepoint: 120211,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL O',\n value: '𝖔',\n codepoint: 120212,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL P',\n value: '𝖕',\n codepoint: 120213,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL Q',\n value: '𝖖',\n codepoint: 120214,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL R',\n value: '𝖗',\n codepoint: 120215,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL S',\n value: '𝖘',\n codepoint: 120216,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL T',\n value: '𝖙',\n codepoint: 120217,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL U',\n value: '𝖚',\n codepoint: 120218,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL V',\n value: '𝖛',\n codepoint: 120219,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL W',\n value: '𝖜',\n codepoint: 120220,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL X',\n value: '𝖝',\n codepoint: 120221,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL Y',\n value: '𝖞',\n codepoint: 120222,\n },\n {\n name: 'MATHEMATICAL BOLD FRAKTUR SMALL Z',\n value: '𝖟',\n codepoint: 120223,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL A',\n value: '𝖠',\n codepoint: 120224,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL B',\n value: '𝖡',\n codepoint: 120225,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL C',\n value: '𝖢',\n codepoint: 120226,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL D',\n value: '𝖣',\n codepoint: 120227,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL E',\n value: '𝖤',\n codepoint: 120228,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL F',\n value: '𝖥',\n codepoint: 120229,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL G',\n value: '𝖦',\n codepoint: 120230,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL H',\n value: '𝖧',\n codepoint: 120231,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL I',\n value: '𝖨',\n codepoint: 120232,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL J',\n value: '𝖩',\n codepoint: 120233,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL K',\n value: '𝖪',\n codepoint: 120234,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL L',\n value: '𝖫',\n codepoint: 120235,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL M',\n value: '𝖬',\n codepoint: 120236,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL N',\n value: '𝖭',\n codepoint: 120237,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL O',\n value: '𝖮',\n codepoint: 120238,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL P',\n value: '𝖯',\n codepoint: 120239,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL Q',\n value: '𝖰',\n codepoint: 120240,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL R',\n value: '𝖱',\n codepoint: 120241,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL S',\n value: '𝖲',\n codepoint: 120242,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL T',\n value: '𝖳',\n codepoint: 120243,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL U',\n value: '𝖴',\n codepoint: 120244,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL V',\n value: '𝖵',\n codepoint: 120245,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL W',\n value: '𝖶',\n codepoint: 120246,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL X',\n value: '𝖷',\n codepoint: 120247,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL Y',\n value: '𝖸',\n codepoint: 120248,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF CAPITAL Z',\n value: '𝖹',\n codepoint: 120249,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL A',\n value: '𝖺',\n codepoint: 120250,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL B',\n value: '𝖻',\n codepoint: 120251,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL C',\n value: '𝖼',\n codepoint: 120252,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL D',\n value: '𝖽',\n codepoint: 120253,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL E',\n value: '𝖾',\n codepoint: 120254,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL F',\n value: '𝖿',\n codepoint: 120255,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL G',\n value: '𝗀',\n codepoint: 120256,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL H',\n value: '𝗁',\n codepoint: 120257,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL I',\n value: '𝗂',\n codepoint: 120258,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL J',\n value: '𝗃',\n codepoint: 120259,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL K',\n value: '𝗄',\n codepoint: 120260,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL L',\n value: '𝗅',\n codepoint: 120261,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL M',\n value: '𝗆',\n codepoint: 120262,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL N',\n value: '𝗇',\n codepoint: 120263,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL O',\n value: '𝗈',\n codepoint: 120264,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL P',\n value: '𝗉',\n codepoint: 120265,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL Q',\n value: '𝗊',\n codepoint: 120266,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL R',\n value: '𝗋',\n codepoint: 120267,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL S',\n value: '𝗌',\n codepoint: 120268,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL T',\n value: '𝗍',\n codepoint: 120269,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL U',\n value: '𝗎',\n codepoint: 120270,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL V',\n value: '𝗏',\n codepoint: 120271,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL W',\n value: '𝗐',\n codepoint: 120272,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL X',\n value: '𝗑',\n codepoint: 120273,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL Y',\n value: '𝗒',\n codepoint: 120274,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF SMALL Z',\n value: '𝗓',\n codepoint: 120275,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL A',\n value: '𝗔',\n codepoint: 120276,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL B',\n value: '𝗕',\n codepoint: 120277,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL C',\n value: '𝗖',\n codepoint: 120278,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL D',\n value: '𝗗',\n codepoint: 120279,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL E',\n value: '𝗘',\n codepoint: 120280,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL F',\n value: '𝗙',\n codepoint: 120281,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL G',\n value: '𝗚',\n codepoint: 120282,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL H',\n value: '𝗛',\n codepoint: 120283,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL I',\n value: '𝗜',\n codepoint: 120284,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL J',\n value: '𝗝',\n codepoint: 120285,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL K',\n value: '𝗞',\n codepoint: 120286,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL L',\n value: '𝗟',\n codepoint: 120287,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL M',\n value: '𝗠',\n codepoint: 120288,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL N',\n value: '𝗡',\n codepoint: 120289,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL O',\n value: '𝗢',\n codepoint: 120290,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL P',\n value: '𝗣',\n codepoint: 120291,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL Q',\n value: '𝗤',\n codepoint: 120292,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL R',\n value: '𝗥',\n codepoint: 120293,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL S',\n value: '𝗦',\n codepoint: 120294,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL T',\n value: '𝗧',\n codepoint: 120295,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL U',\n value: '𝗨',\n codepoint: 120296,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL V',\n value: '𝗩',\n codepoint: 120297,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL W',\n value: '𝗪',\n codepoint: 120298,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL X',\n value: '𝗫',\n codepoint: 120299,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL Y',\n value: '𝗬',\n codepoint: 120300,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL Z',\n value: '𝗭',\n codepoint: 120301,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL A',\n value: '𝗮',\n codepoint: 120302,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL B',\n value: '𝗯',\n codepoint: 120303,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL C',\n value: '𝗰',\n codepoint: 120304,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL D',\n value: '𝗱',\n codepoint: 120305,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL E',\n value: '𝗲',\n codepoint: 120306,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL F',\n value: '𝗳',\n codepoint: 120307,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL G',\n value: '𝗴',\n codepoint: 120308,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL H',\n value: '𝗵',\n codepoint: 120309,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL I',\n value: '𝗶',\n codepoint: 120310,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL J',\n value: '𝗷',\n codepoint: 120311,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL K',\n value: '𝗸',\n codepoint: 120312,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL L',\n value: '𝗹',\n codepoint: 120313,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL M',\n value: '𝗺',\n codepoint: 120314,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL N',\n value: '𝗻',\n codepoint: 120315,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL O',\n value: '𝗼',\n codepoint: 120316,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL P',\n value: '𝗽',\n codepoint: 120317,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL Q',\n value: '𝗾',\n codepoint: 120318,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL R',\n value: '𝗿',\n codepoint: 120319,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL S',\n value: '𝘀',\n codepoint: 120320,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL T',\n value: '𝘁',\n codepoint: 120321,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL U',\n value: '𝘂',\n codepoint: 120322,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL V',\n value: '𝘃',\n codepoint: 120323,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL W',\n value: '𝘄',\n codepoint: 120324,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL X',\n value: '𝘅',\n codepoint: 120325,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL Y',\n value: '𝘆',\n codepoint: 120326,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL Z',\n value: '𝘇',\n codepoint: 120327,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL A',\n value: '𝘈',\n codepoint: 120328,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL B',\n value: '𝘉',\n codepoint: 120329,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL C',\n value: '𝘊',\n codepoint: 120330,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL D',\n value: '𝘋',\n codepoint: 120331,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL E',\n value: '𝘌',\n codepoint: 120332,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL F',\n value: '𝘍',\n codepoint: 120333,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL G',\n value: '𝘎',\n codepoint: 120334,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL H',\n value: '𝘏',\n codepoint: 120335,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL I',\n value: '𝘐',\n codepoint: 120336,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL J',\n value: '𝘑',\n codepoint: 120337,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL K',\n value: '𝘒',\n codepoint: 120338,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL L',\n value: '𝘓',\n codepoint: 120339,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL M',\n value: '𝘔',\n codepoint: 120340,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL N',\n value: '𝘕',\n codepoint: 120341,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL O',\n value: '𝘖',\n codepoint: 120342,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL P',\n value: '𝘗',\n codepoint: 120343,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q',\n value: '𝘘',\n codepoint: 120344,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL R',\n value: '𝘙',\n codepoint: 120345,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL S',\n value: '𝘚',\n codepoint: 120346,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL T',\n value: '𝘛',\n codepoint: 120347,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL U',\n value: '𝘜',\n codepoint: 120348,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL V',\n value: '𝘝',\n codepoint: 120349,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL W',\n value: '𝘞',\n codepoint: 120350,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL X',\n value: '𝘟',\n codepoint: 120351,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y',\n value: '𝘠',\n codepoint: 120352,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z',\n value: '𝘡',\n codepoint: 120353,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL A',\n value: '𝘢',\n codepoint: 120354,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL B',\n value: '𝘣',\n codepoint: 120355,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL C',\n value: '𝘤',\n codepoint: 120356,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL D',\n value: '𝘥',\n codepoint: 120357,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL E',\n value: '𝘦',\n codepoint: 120358,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL F',\n value: '𝘧',\n codepoint: 120359,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL G',\n value: '𝘨',\n codepoint: 120360,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL H',\n value: '𝘩',\n codepoint: 120361,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL I',\n value: '𝘪',\n codepoint: 120362,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL J',\n value: '𝘫',\n codepoint: 120363,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL K',\n value: '𝘬',\n codepoint: 120364,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL L',\n value: '𝘭',\n codepoint: 120365,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL M',\n value: '𝘮',\n codepoint: 120366,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL N',\n value: '𝘯',\n codepoint: 120367,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL O',\n value: '𝘰',\n codepoint: 120368,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL P',\n value: '𝘱',\n codepoint: 120369,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL Q',\n value: '𝘲',\n codepoint: 120370,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL R',\n value: '𝘳',\n codepoint: 120371,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL S',\n value: '𝘴',\n codepoint: 120372,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL T',\n value: '𝘵',\n codepoint: 120373,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL U',\n value: '𝘶',\n codepoint: 120374,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL V',\n value: '𝘷',\n codepoint: 120375,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL W',\n value: '𝘸',\n codepoint: 120376,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL X',\n value: '𝘹',\n codepoint: 120377,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL Y',\n value: '𝘺',\n codepoint: 120378,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF ITALIC SMALL Z',\n value: '𝘻',\n codepoint: 120379,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A',\n value: '𝘼',\n codepoint: 120380,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B',\n value: '𝘽',\n codepoint: 120381,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C',\n value: '𝘾',\n codepoint: 120382,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D',\n value: '𝘿',\n codepoint: 120383,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E',\n value: '𝙀',\n codepoint: 120384,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F',\n value: '𝙁',\n codepoint: 120385,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G',\n value: '𝙂',\n codepoint: 120386,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H',\n value: '𝙃',\n codepoint: 120387,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I',\n value: '𝙄',\n codepoint: 120388,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J',\n value: '𝙅',\n codepoint: 120389,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K',\n value: '𝙆',\n codepoint: 120390,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L',\n value: '𝙇',\n codepoint: 120391,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M',\n value: '𝙈',\n codepoint: 120392,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N',\n value: '𝙉',\n codepoint: 120393,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O',\n value: '𝙊',\n codepoint: 120394,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P',\n value: '𝙋',\n codepoint: 120395,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q',\n value: '𝙌',\n codepoint: 120396,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R',\n value: '𝙍',\n codepoint: 120397,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S',\n value: '𝙎',\n codepoint: 120398,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T',\n value: '𝙏',\n codepoint: 120399,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U',\n value: '𝙐',\n codepoint: 120400,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V',\n value: '𝙑',\n codepoint: 120401,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W',\n value: '𝙒',\n codepoint: 120402,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X',\n value: '𝙓',\n codepoint: 120403,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y',\n value: '𝙔',\n codepoint: 120404,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z',\n value: '𝙕',\n codepoint: 120405,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A',\n value: '𝙖',\n codepoint: 120406,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B',\n value: '𝙗',\n codepoint: 120407,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C',\n value: '𝙘',\n codepoint: 120408,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D',\n value: '𝙙',\n codepoint: 120409,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E',\n value: '𝙚',\n codepoint: 120410,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F',\n value: '𝙛',\n codepoint: 120411,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G',\n value: '𝙜',\n codepoint: 120412,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H',\n value: '𝙝',\n codepoint: 120413,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I',\n value: '𝙞',\n codepoint: 120414,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J',\n value: '𝙟',\n codepoint: 120415,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K',\n value: '𝙠',\n codepoint: 120416,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L',\n value: '𝙡',\n codepoint: 120417,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M',\n value: '𝙢',\n codepoint: 120418,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N',\n value: '𝙣',\n codepoint: 120419,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O',\n value: '𝙤',\n codepoint: 120420,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P',\n value: '𝙥',\n codepoint: 120421,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q',\n value: '𝙦',\n codepoint: 120422,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R',\n value: '𝙧',\n codepoint: 120423,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S',\n value: '𝙨',\n codepoint: 120424,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T',\n value: '𝙩',\n codepoint: 120425,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U',\n value: '𝙪',\n codepoint: 120426,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V',\n value: '𝙫',\n codepoint: 120427,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W',\n value: '𝙬',\n codepoint: 120428,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X',\n value: '𝙭',\n codepoint: 120429,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y',\n value: '𝙮',\n codepoint: 120430,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z',\n value: '𝙯',\n codepoint: 120431,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL A',\n value: '𝙰',\n codepoint: 120432,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL B',\n value: '𝙱',\n codepoint: 120433,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL C',\n value: '𝙲',\n codepoint: 120434,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL D',\n value: '𝙳',\n codepoint: 120435,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL E',\n value: '𝙴',\n codepoint: 120436,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL F',\n value: '𝙵',\n codepoint: 120437,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL G',\n value: '𝙶',\n codepoint: 120438,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL H',\n value: '𝙷',\n codepoint: 120439,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL I',\n value: '𝙸',\n codepoint: 120440,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL J',\n value: '𝙹',\n codepoint: 120441,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL K',\n value: '𝙺',\n codepoint: 120442,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL L',\n value: '𝙻',\n codepoint: 120443,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL M',\n value: '𝙼',\n codepoint: 120444,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL N',\n value: '𝙽',\n codepoint: 120445,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL O',\n value: '𝙾',\n codepoint: 120446,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL P',\n value: '𝙿',\n codepoint: 120447,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL Q',\n value: '𝚀',\n codepoint: 120448,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL R',\n value: '𝚁',\n codepoint: 120449,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL S',\n value: '𝚂',\n codepoint: 120450,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL T',\n value: '𝚃',\n codepoint: 120451,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL U',\n value: '𝚄',\n codepoint: 120452,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL V',\n value: '𝚅',\n codepoint: 120453,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL W',\n value: '𝚆',\n codepoint: 120454,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL X',\n value: '𝚇',\n codepoint: 120455,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL Y',\n value: '𝚈',\n codepoint: 120456,\n },\n {\n name: 'MATHEMATICAL MONOSPACE CAPITAL Z',\n value: '𝚉',\n codepoint: 120457,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL A',\n value: '𝚊',\n codepoint: 120458,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL B',\n value: '𝚋',\n codepoint: 120459,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL C',\n value: '𝚌',\n codepoint: 120460,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL D',\n value: '𝚍',\n codepoint: 120461,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL E',\n value: '𝚎',\n codepoint: 120462,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL F',\n value: '𝚏',\n codepoint: 120463,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL G',\n value: '𝚐',\n codepoint: 120464,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL H',\n value: '𝚑',\n codepoint: 120465,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL I',\n value: '𝚒',\n codepoint: 120466,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL J',\n value: '𝚓',\n codepoint: 120467,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL K',\n value: '𝚔',\n codepoint: 120468,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL L',\n value: '𝚕',\n codepoint: 120469,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL M',\n value: '𝚖',\n codepoint: 120470,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL N',\n value: '𝚗',\n codepoint: 120471,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL O',\n value: '𝚘',\n codepoint: 120472,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL P',\n value: '𝚙',\n codepoint: 120473,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL Q',\n value: '𝚚',\n codepoint: 120474,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL R',\n value: '𝚛',\n codepoint: 120475,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL S',\n value: '𝚜',\n codepoint: 120476,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL T',\n value: '𝚝',\n codepoint: 120477,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL U',\n value: '𝚞',\n codepoint: 120478,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL V',\n value: '𝚟',\n codepoint: 120479,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL W',\n value: '𝚠',\n codepoint: 120480,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL X',\n value: '𝚡',\n codepoint: 120481,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL Y',\n value: '𝚢',\n codepoint: 120482,\n },\n {\n name: 'MATHEMATICAL MONOSPACE SMALL Z',\n value: '𝚣',\n codepoint: 120483,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL DOTLESS I',\n value: '𝚤',\n codepoint: 120484,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL DOTLESS J',\n value: '𝚥',\n codepoint: 120485,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL ALPHA',\n value: '𝚨',\n codepoint: 120488,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL BETA',\n value: '𝚩',\n codepoint: 120489,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL GAMMA',\n value: '𝚪',\n codepoint: 120490,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL DELTA',\n value: '𝚫',\n codepoint: 120491,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL EPSILON',\n value: '𝚬',\n codepoint: 120492,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL ZETA',\n value: '𝚭',\n codepoint: 120493,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL ETA',\n value: '𝚮',\n codepoint: 120494,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL THETA',\n value: '𝚯',\n codepoint: 120495,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL IOTA',\n value: '𝚰',\n codepoint: 120496,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL KAPPA',\n value: '𝚱',\n codepoint: 120497,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL LAMDA',\n value: '𝚲',\n codepoint: 120498,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL MU',\n value: '𝚳',\n codepoint: 120499,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL NU',\n value: '𝚴',\n codepoint: 120500,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL XI',\n value: '𝚵',\n codepoint: 120501,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL OMICRON',\n value: '𝚶',\n codepoint: 120502,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL PI',\n value: '𝚷',\n codepoint: 120503,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL RHO',\n value: '𝚸',\n codepoint: 120504,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL THETA SYMBOL',\n value: '𝚹',\n codepoint: 120505,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL SIGMA',\n value: '𝚺',\n codepoint: 120506,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL TAU',\n value: '𝚻',\n codepoint: 120507,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL UPSILON',\n value: '𝚼',\n codepoint: 120508,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL PHI',\n value: '𝚽',\n codepoint: 120509,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL CHI',\n value: '𝚾',\n codepoint: 120510,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL PSI',\n value: '𝚿',\n codepoint: 120511,\n },\n {\n name: 'MATHEMATICAL BOLD CAPITAL OMEGA',\n value: '𝛀',\n codepoint: 120512,\n },\n {\n name: 'MATHEMATICAL BOLD NABLA',\n value: '𝛁',\n codepoint: 120513,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL ALPHA',\n value: '𝛂',\n codepoint: 120514,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL BETA',\n value: '𝛃',\n codepoint: 120515,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL GAMMA',\n value: '𝛄',\n codepoint: 120516,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL DELTA',\n value: '𝛅',\n codepoint: 120517,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL EPSILON',\n value: '𝛆',\n codepoint: 120518,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL ZETA',\n value: '𝛇',\n codepoint: 120519,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL ETA',\n value: '𝛈',\n codepoint: 120520,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL THETA',\n value: '𝛉',\n codepoint: 120521,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL IOTA',\n value: '𝛊',\n codepoint: 120522,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL KAPPA',\n value: '𝛋',\n codepoint: 120523,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL LAMDA',\n value: '𝛌',\n codepoint: 120524,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL MU',\n value: '𝛍',\n codepoint: 120525,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL NU',\n value: '𝛎',\n codepoint: 120526,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL XI',\n value: '𝛏',\n codepoint: 120527,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL OMICRON',\n value: '𝛐',\n codepoint: 120528,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL PI',\n value: '𝛑',\n codepoint: 120529,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL RHO',\n value: '𝛒',\n codepoint: 120530,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL FINAL SIGMA',\n value: '𝛓',\n codepoint: 120531,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL SIGMA',\n value: '𝛔',\n codepoint: 120532,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL TAU',\n value: '𝛕',\n codepoint: 120533,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL UPSILON',\n value: '𝛖',\n codepoint: 120534,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL PHI',\n value: '𝛗',\n codepoint: 120535,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL CHI',\n value: '𝛘',\n codepoint: 120536,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL PSI',\n value: '𝛙',\n codepoint: 120537,\n },\n {\n name: 'MATHEMATICAL BOLD SMALL OMEGA',\n value: '𝛚',\n codepoint: 120538,\n },\n {\n name: 'MATHEMATICAL BOLD PARTIAL DIFFERENTIAL',\n value: '𝛛',\n codepoint: 120539,\n },\n {\n name: 'MATHEMATICAL BOLD EPSILON SYMBOL',\n value: '𝛜',\n codepoint: 120540,\n },\n {\n name: 'MATHEMATICAL BOLD THETA SYMBOL',\n value: '𝛝',\n codepoint: 120541,\n },\n {\n name: 'MATHEMATICAL BOLD KAPPA SYMBOL',\n value: '𝛞',\n codepoint: 120542,\n },\n {\n name: 'MATHEMATICAL BOLD PHI SYMBOL',\n value: '𝛟',\n codepoint: 120543,\n },\n {\n name: 'MATHEMATICAL BOLD RHO SYMBOL',\n value: '𝛠',\n codepoint: 120544,\n },\n {\n name: 'MATHEMATICAL BOLD PI SYMBOL',\n value: '𝛡',\n codepoint: 120545,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL ALPHA',\n value: '𝛢',\n codepoint: 120546,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL BETA',\n value: '𝛣',\n codepoint: 120547,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL GAMMA',\n value: '𝛤',\n codepoint: 120548,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL DELTA',\n value: '𝛥',\n codepoint: 120549,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL EPSILON',\n value: '𝛦',\n codepoint: 120550,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL ZETA',\n value: '𝛧',\n codepoint: 120551,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL ETA',\n value: '𝛨',\n codepoint: 120552,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL THETA',\n value: '𝛩',\n codepoint: 120553,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL IOTA',\n value: '𝛪',\n codepoint: 120554,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL KAPPA',\n value: '𝛫',\n codepoint: 120555,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL LAMDA',\n value: '𝛬',\n codepoint: 120556,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL MU',\n value: '𝛭',\n codepoint: 120557,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL NU',\n value: '𝛮',\n codepoint: 120558,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL XI',\n value: '𝛯',\n codepoint: 120559,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL OMICRON',\n value: '𝛰',\n codepoint: 120560,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL PI',\n value: '𝛱',\n codepoint: 120561,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL RHO',\n value: '𝛲',\n codepoint: 120562,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL THETA SYMBOL',\n value: '𝛳',\n codepoint: 120563,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL SIGMA',\n value: '𝛴',\n codepoint: 120564,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL TAU',\n value: '𝛵',\n codepoint: 120565,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL UPSILON',\n value: '𝛶',\n codepoint: 120566,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL PHI',\n value: '𝛷',\n codepoint: 120567,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL CHI',\n value: '𝛸',\n codepoint: 120568,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL PSI',\n value: '𝛹',\n codepoint: 120569,\n },\n {\n name: 'MATHEMATICAL ITALIC CAPITAL OMEGA',\n value: '𝛺',\n codepoint: 120570,\n },\n {\n name: 'MATHEMATICAL ITALIC NABLA',\n value: '𝛻',\n codepoint: 120571,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL ALPHA',\n value: '𝛼',\n codepoint: 120572,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL BETA',\n value: '𝛽',\n codepoint: 120573,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL GAMMA',\n value: '𝛾',\n codepoint: 120574,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL DELTA',\n value: '𝛿',\n codepoint: 120575,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL EPSILON',\n value: '𝜀',\n codepoint: 120576,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL ZETA',\n value: '𝜁',\n codepoint: 120577,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL ETA',\n value: '𝜂',\n codepoint: 120578,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL THETA',\n value: '𝜃',\n codepoint: 120579,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL IOTA',\n value: '𝜄',\n codepoint: 120580,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL KAPPA',\n value: '𝜅',\n codepoint: 120581,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL LAMDA',\n value: '𝜆',\n codepoint: 120582,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL MU',\n value: '𝜇',\n codepoint: 120583,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL NU',\n value: '𝜈',\n codepoint: 120584,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL XI',\n value: '𝜉',\n codepoint: 120585,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL OMICRON',\n value: '𝜊',\n codepoint: 120586,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL PI',\n value: '𝜋',\n codepoint: 120587,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL RHO',\n value: '𝜌',\n codepoint: 120588,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL FINAL SIGMA',\n value: '𝜍',\n codepoint: 120589,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL SIGMA',\n value: '𝜎',\n codepoint: 120590,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL TAU',\n value: '𝜏',\n codepoint: 120591,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL UPSILON',\n value: '𝜐',\n codepoint: 120592,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL PHI',\n value: '𝜑',\n codepoint: 120593,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL CHI',\n value: '𝜒',\n codepoint: 120594,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL PSI',\n value: '𝜓',\n codepoint: 120595,\n },\n {\n name: 'MATHEMATICAL ITALIC SMALL OMEGA',\n value: '𝜔',\n codepoint: 120596,\n },\n {\n name: 'MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL',\n value: '𝜕',\n codepoint: 120597,\n },\n {\n name: 'MATHEMATICAL ITALIC EPSILON SYMBOL',\n value: '𝜖',\n codepoint: 120598,\n },\n {\n name: 'MATHEMATICAL ITALIC THETA SYMBOL',\n value: '𝜗',\n codepoint: 120599,\n },\n {\n name: 'MATHEMATICAL ITALIC KAPPA SYMBOL',\n value: '𝜘',\n codepoint: 120600,\n },\n {\n name: 'MATHEMATICAL ITALIC PHI SYMBOL',\n value: '𝜙',\n codepoint: 120601,\n },\n {\n name: 'MATHEMATICAL ITALIC RHO SYMBOL',\n value: '𝜚',\n codepoint: 120602,\n },\n {\n name: 'MATHEMATICAL ITALIC PI SYMBOL',\n value: '𝜛',\n codepoint: 120603,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL ALPHA',\n value: '𝜜',\n codepoint: 120604,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL BETA',\n value: '𝜝',\n codepoint: 120605,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL GAMMA',\n value: '𝜞',\n codepoint: 120606,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL DELTA',\n value: '𝜟',\n codepoint: 120607,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL EPSILON',\n value: '𝜠',\n codepoint: 120608,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL ZETA',\n value: '𝜡',\n codepoint: 120609,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL ETA',\n value: '𝜢',\n codepoint: 120610,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL THETA',\n value: '𝜣',\n codepoint: 120611,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL IOTA',\n value: '𝜤',\n codepoint: 120612,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL KAPPA',\n value: '𝜥',\n codepoint: 120613,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL LAMDA',\n value: '𝜦',\n codepoint: 120614,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL MU',\n value: '𝜧',\n codepoint: 120615,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL NU',\n value: '𝜨',\n codepoint: 120616,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL XI',\n value: '𝜩',\n codepoint: 120617,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL OMICRON',\n value: '𝜪',\n codepoint: 120618,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL PI',\n value: '𝜫',\n codepoint: 120619,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL RHO',\n value: '𝜬',\n codepoint: 120620,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL',\n value: '𝜭',\n codepoint: 120621,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL SIGMA',\n value: '𝜮',\n codepoint: 120622,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL TAU',\n value: '𝜯',\n codepoint: 120623,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL UPSILON',\n value: '𝜰',\n codepoint: 120624,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL PHI',\n value: '𝜱',\n codepoint: 120625,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL CHI',\n value: '𝜲',\n codepoint: 120626,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL PSI',\n value: '𝜳',\n codepoint: 120627,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC CAPITAL OMEGA',\n value: '𝜴',\n codepoint: 120628,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC NABLA',\n value: '𝜵',\n codepoint: 120629,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL ALPHA',\n value: '𝜶',\n codepoint: 120630,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL BETA',\n value: '𝜷',\n codepoint: 120631,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL GAMMA',\n value: '𝜸',\n codepoint: 120632,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL DELTA',\n value: '𝜹',\n codepoint: 120633,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL EPSILON',\n value: '𝜺',\n codepoint: 120634,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL ZETA',\n value: '𝜻',\n codepoint: 120635,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL ETA',\n value: '𝜼',\n codepoint: 120636,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL THETA',\n value: '𝜽',\n codepoint: 120637,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL IOTA',\n value: '𝜾',\n codepoint: 120638,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL KAPPA',\n value: '𝜿',\n codepoint: 120639,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL LAMDA',\n value: '𝝀',\n codepoint: 120640,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL MU',\n value: '𝝁',\n codepoint: 120641,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL NU',\n value: '𝝂',\n codepoint: 120642,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL XI',\n value: '𝝃',\n codepoint: 120643,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL OMICRON',\n value: '𝝄',\n codepoint: 120644,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL PI',\n value: '𝝅',\n codepoint: 120645,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL RHO',\n value: '𝝆',\n codepoint: 120646,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA',\n value: '𝝇',\n codepoint: 120647,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL SIGMA',\n value: '𝝈',\n codepoint: 120648,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL TAU',\n value: '𝝉',\n codepoint: 120649,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL UPSILON',\n value: '𝝊',\n codepoint: 120650,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL PHI',\n value: '𝝋',\n codepoint: 120651,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL CHI',\n value: '𝝌',\n codepoint: 120652,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL PSI',\n value: '𝝍',\n codepoint: 120653,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC SMALL OMEGA',\n value: '𝝎',\n codepoint: 120654,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL',\n value: '𝝏',\n codepoint: 120655,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC EPSILON SYMBOL',\n value: '𝝐',\n codepoint: 120656,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC THETA SYMBOL',\n value: '𝝑',\n codepoint: 120657,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC KAPPA SYMBOL',\n value: '𝝒',\n codepoint: 120658,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC PHI SYMBOL',\n value: '𝝓',\n codepoint: 120659,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC RHO SYMBOL',\n value: '𝝔',\n codepoint: 120660,\n },\n {\n name: 'MATHEMATICAL BOLD ITALIC PI SYMBOL',\n value: '𝝕',\n codepoint: 120661,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA',\n value: '𝝖',\n codepoint: 120662,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA',\n value: '𝝗',\n codepoint: 120663,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA',\n value: '𝝘',\n codepoint: 120664,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA',\n value: '𝝙',\n codepoint: 120665,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON',\n value: '𝝚',\n codepoint: 120666,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA',\n value: '𝝛',\n codepoint: 120667,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA',\n value: '𝝜',\n codepoint: 120668,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA',\n value: '𝝝',\n codepoint: 120669,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA',\n value: '𝝞',\n codepoint: 120670,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA',\n value: '𝝟',\n codepoint: 120671,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA',\n value: '𝝠',\n codepoint: 120672,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL MU',\n value: '𝝡',\n codepoint: 120673,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL NU',\n value: '𝝢',\n codepoint: 120674,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL XI',\n value: '𝝣',\n codepoint: 120675,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON',\n value: '𝝤',\n codepoint: 120676,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL PI',\n value: '𝝥',\n codepoint: 120677,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO',\n value: '𝝦',\n codepoint: 120678,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL',\n value: '𝝧',\n codepoint: 120679,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA',\n value: '𝝨',\n codepoint: 120680,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU',\n value: '𝝩',\n codepoint: 120681,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON',\n value: '𝝪',\n codepoint: 120682,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI',\n value: '𝝫',\n codepoint: 120683,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI',\n value: '𝝬',\n codepoint: 120684,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI',\n value: '𝝭',\n codepoint: 120685,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA',\n value: '𝝮',\n codepoint: 120686,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD NABLA',\n value: '𝝯',\n codepoint: 120687,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA',\n value: '𝝰',\n codepoint: 120688,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL BETA',\n value: '𝝱',\n codepoint: 120689,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA',\n value: '𝝲',\n codepoint: 120690,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL DELTA',\n value: '𝝳',\n codepoint: 120691,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON',\n value: '𝝴',\n codepoint: 120692,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL ZETA',\n value: '𝝵',\n codepoint: 120693,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL ETA',\n value: '𝝶',\n codepoint: 120694,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL THETA',\n value: '𝝷',\n codepoint: 120695,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL IOTA',\n value: '𝝸',\n codepoint: 120696,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA',\n value: '𝝹',\n codepoint: 120697,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA',\n value: '𝝺',\n codepoint: 120698,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL MU',\n value: '𝝻',\n codepoint: 120699,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL NU',\n value: '𝝼',\n codepoint: 120700,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL XI',\n value: '𝝽',\n codepoint: 120701,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON',\n value: '𝝾',\n codepoint: 120702,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL PI',\n value: '𝝿',\n codepoint: 120703,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL RHO',\n value: '𝞀',\n codepoint: 120704,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA',\n value: '𝞁',\n codepoint: 120705,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA',\n value: '𝞂',\n codepoint: 120706,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL TAU',\n value: '𝞃',\n codepoint: 120707,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON',\n value: '𝞄',\n codepoint: 120708,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL PHI',\n value: '𝞅',\n codepoint: 120709,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL CHI',\n value: '𝞆',\n codepoint: 120710,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL PSI',\n value: '𝞇',\n codepoint: 120711,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA',\n value: '𝞈',\n codepoint: 120712,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL',\n value: '𝞉',\n codepoint: 120713,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL',\n value: '𝞊',\n codepoint: 120714,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL',\n value: '𝞋',\n codepoint: 120715,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL',\n value: '𝞌',\n codepoint: 120716,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL',\n value: '𝞍',\n codepoint: 120717,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL',\n value: '𝞎',\n codepoint: 120718,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD PI SYMBOL',\n value: '𝞏',\n codepoint: 120719,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA',\n value: '𝞐',\n codepoint: 120720,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA',\n value: '𝞑',\n codepoint: 120721,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA',\n value: '𝞒',\n codepoint: 120722,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA',\n value: '𝞓',\n codepoint: 120723,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON',\n value: '𝞔',\n codepoint: 120724,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA',\n value: '𝞕',\n codepoint: 120725,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA',\n value: '𝞖',\n codepoint: 120726,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA',\n value: '𝞗',\n codepoint: 120727,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA',\n value: '𝞘',\n codepoint: 120728,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA',\n value: '𝞙',\n codepoint: 120729,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA',\n value: '𝞚',\n codepoint: 120730,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU',\n value: '𝞛',\n codepoint: 120731,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU',\n value: '𝞜',\n codepoint: 120732,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI',\n value: '𝞝',\n codepoint: 120733,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON',\n value: '𝞞',\n codepoint: 120734,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI',\n value: '𝞟',\n codepoint: 120735,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO',\n value: '𝞠',\n codepoint: 120736,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL',\n value: '𝞡',\n codepoint: 120737,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA',\n value: '𝞢',\n codepoint: 120738,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU',\n value: '𝞣',\n codepoint: 120739,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON',\n value: '𝞤',\n codepoint: 120740,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI',\n value: '𝞥',\n codepoint: 120741,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI',\n value: '𝞦',\n codepoint: 120742,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI',\n value: '𝞧',\n codepoint: 120743,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA',\n value: '𝞨',\n codepoint: 120744,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA',\n value: '𝞩',\n codepoint: 120745,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA',\n value: '𝞪',\n codepoint: 120746,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA',\n value: '𝞫',\n codepoint: 120747,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA',\n value: '𝞬',\n codepoint: 120748,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA',\n value: '𝞭',\n codepoint: 120749,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON',\n value: '𝞮',\n codepoint: 120750,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA',\n value: '𝞯',\n codepoint: 120751,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA',\n value: '𝞰',\n codepoint: 120752,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA',\n value: '𝞱',\n codepoint: 120753,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA',\n value: '𝞲',\n codepoint: 120754,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA',\n value: '𝞳',\n codepoint: 120755,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA',\n value: '𝞴',\n codepoint: 120756,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU',\n value: '𝞵',\n codepoint: 120757,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU',\n value: '𝞶',\n codepoint: 120758,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI',\n value: '𝞷',\n codepoint: 120759,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON',\n value: '𝞸',\n codepoint: 120760,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI',\n value: '𝞹',\n codepoint: 120761,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO',\n value: '𝞺',\n codepoint: 120762,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA',\n value: '𝞻',\n codepoint: 120763,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA',\n value: '𝞼',\n codepoint: 120764,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU',\n value: '𝞽',\n codepoint: 120765,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON',\n value: '𝞾',\n codepoint: 120766,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI',\n value: '𝞿',\n codepoint: 120767,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI',\n value: '𝟀',\n codepoint: 120768,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI',\n value: '𝟁',\n codepoint: 120769,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA',\n value: '𝟂',\n codepoint: 120770,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL',\n value: '𝟃',\n codepoint: 120771,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL',\n value: '𝟄',\n codepoint: 120772,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL',\n value: '𝟅',\n codepoint: 120773,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL',\n value: '𝟆',\n codepoint: 120774,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL',\n value: '𝟇',\n codepoint: 120775,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL',\n value: '𝟈',\n codepoint: 120776,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL',\n value: '𝟉',\n codepoint: 120777,\n },\n {\n name: 'MATHEMATICAL BOLD DIGIT ZERO',\n value: '𝟎',\n codepoint: 120782,\n },\n {\n name: 'MATHEMATICAL BOLD DIGIT ONE',\n value: '𝟏',\n codepoint: 120783,\n },\n {\n name: 'MATHEMATICAL BOLD DIGIT TWO',\n value: '𝟐',\n codepoint: 120784,\n },\n {\n name: 'MATHEMATICAL BOLD DIGIT THREE',\n value: '𝟑',\n codepoint: 120785,\n },\n {\n name: 'MATHEMATICAL BOLD DIGIT FOUR',\n value: '𝟒',\n codepoint: 120786,\n },\n {\n name: 'MATHEMATICAL BOLD DIGIT FIVE',\n value: '𝟓',\n codepoint: 120787,\n },\n {\n name: 'MATHEMATICAL BOLD DIGIT SIX',\n value: '𝟔',\n codepoint: 120788,\n },\n {\n name: 'MATHEMATICAL BOLD DIGIT SEVEN',\n value: '𝟕',\n codepoint: 120789,\n },\n {\n name: 'MATHEMATICAL BOLD DIGIT EIGHT',\n value: '𝟖',\n codepoint: 120790,\n },\n {\n name: 'MATHEMATICAL BOLD DIGIT NINE',\n value: '𝟗',\n codepoint: 120791,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO',\n value: '𝟘',\n codepoint: 120792,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK DIGIT ONE',\n value: '𝟙',\n codepoint: 120793,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK DIGIT TWO',\n value: '𝟚',\n codepoint: 120794,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK DIGIT THREE',\n value: '𝟛',\n codepoint: 120795,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR',\n value: '𝟜',\n codepoint: 120796,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE',\n value: '𝟝',\n codepoint: 120797,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK DIGIT SIX',\n value: '𝟞',\n codepoint: 120798,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN',\n value: '𝟟',\n codepoint: 120799,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT',\n value: '𝟠',\n codepoint: 120800,\n },\n {\n name: 'MATHEMATICAL DOUBLE-STRUCK DIGIT NINE',\n value: '𝟡',\n codepoint: 120801,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF DIGIT ZERO',\n value: '𝟢',\n codepoint: 120802,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF DIGIT ONE',\n value: '𝟣',\n codepoint: 120803,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF DIGIT TWO',\n value: '𝟤',\n codepoint: 120804,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF DIGIT THREE',\n value: '𝟥',\n codepoint: 120805,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF DIGIT FOUR',\n value: '𝟦',\n codepoint: 120806,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF DIGIT FIVE',\n value: '𝟧',\n codepoint: 120807,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF DIGIT SIX',\n value: '𝟨',\n codepoint: 120808,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF DIGIT SEVEN',\n value: '𝟩',\n codepoint: 120809,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF DIGIT EIGHT',\n value: '𝟪',\n codepoint: 120810,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF DIGIT NINE',\n value: '𝟫',\n codepoint: 120811,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO',\n value: '𝟬',\n codepoint: 120812,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD DIGIT ONE',\n value: '𝟭',\n codepoint: 120813,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD DIGIT TWO',\n value: '𝟮',\n codepoint: 120814,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD DIGIT THREE',\n value: '𝟯',\n codepoint: 120815,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR',\n value: '𝟰',\n codepoint: 120816,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE',\n value: '𝟱',\n codepoint: 120817,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD DIGIT SIX',\n value: '𝟲',\n codepoint: 120818,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN',\n value: '𝟳',\n codepoint: 120819,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT',\n value: '𝟴',\n codepoint: 120820,\n },\n {\n name: 'MATHEMATICAL SANS-SERIF BOLD DIGIT NINE',\n value: '𝟵',\n codepoint: 120821,\n },\n {\n name: 'MATHEMATICAL MONOSPACE DIGIT ZERO',\n value: '𝟶',\n codepoint: 120822,\n },\n {\n name: 'MATHEMATICAL MONOSPACE DIGIT ONE',\n value: '𝟷',\n codepoint: 120823,\n },\n {\n name: 'MATHEMATICAL MONOSPACE DIGIT TWO',\n value: '𝟸',\n codepoint: 120824,\n },\n {\n name: 'MATHEMATICAL MONOSPACE DIGIT THREE',\n value: '𝟹',\n codepoint: 120825,\n },\n {\n name: 'MATHEMATICAL MONOSPACE DIGIT FOUR',\n value: '𝟺',\n codepoint: 120826,\n },\n {\n name: 'MATHEMATICAL MONOSPACE DIGIT FIVE',\n value: '𝟻',\n codepoint: 120827,\n },\n {\n name: 'MATHEMATICAL MONOSPACE DIGIT SIX',\n value: '𝟼',\n codepoint: 120828,\n },\n {\n name: 'MATHEMATICAL MONOSPACE DIGIT SEVEN',\n value: '𝟽',\n codepoint: 120829,\n },\n {\n name: 'MATHEMATICAL MONOSPACE DIGIT EIGHT',\n value: '𝟾',\n codepoint: 120830,\n },\n {\n name: 'MATHEMATICAL MONOSPACE DIGIT NINE',\n value: '𝟿',\n codepoint: 120831,\n },\n ],\n },\n {\n name: 'Punctuation',\n symbols: [\n {\n name: 'HYPHEN',\n value: '‐',\n codepoint: 8208,\n },\n {\n name: 'NON-BREAKING HYPHEN',\n value: '‑',\n codepoint: 8209,\n },\n {\n name: 'FIGURE DASH',\n value: '‒',\n codepoint: 8210,\n },\n {\n name: 'EN DASH',\n value: '–',\n codepoint: 8211,\n },\n {\n name: 'EM DASH',\n value: '—',\n codepoint: 8212,\n },\n {\n name: 'HORIZONTAL BAR',\n value: '―',\n codepoint: 8213,\n },\n {\n name: 'DOUBLE VERTICAL LINE',\n value: '‖',\n codepoint: 8214,\n },\n {\n name: 'DOUBLE LOW LINE',\n value: '‗',\n codepoint: 8215,\n },\n {\n name: 'LEFT SINGLE QUOTATION MARK',\n value: '‘',\n codepoint: 8216,\n },\n {\n name: 'RIGHT SINGLE QUOTATION MARK',\n value: '’',\n codepoint: 8217,\n },\n {\n name: 'SINGLE LOW-9 QUOTATION MARK',\n value: '‚',\n codepoint: 8218,\n },\n {\n name: 'SINGLE HIGH-REVERSED-9 QUOTATION MARK',\n value: '‛',\n codepoint: 8219,\n },\n {\n name: 'LEFT DOUBLE QUOTATION MARK',\n value: '“',\n codepoint: 8220,\n },\n {\n name: 'RIGHT DOUBLE QUOTATION MARK',\n value: '”',\n codepoint: 8221,\n },\n {\n name: 'DOUBLE LOW-9 QUOTATION MARK',\n value: '„',\n codepoint: 8222,\n },\n {\n name: 'DOUBLE HIGH-REVERSED-9 QUOTATION MARK',\n value: '‟',\n codepoint: 8223,\n },\n {\n name: 'DAGGER',\n value: '†',\n codepoint: 8224,\n },\n {\n name: 'DOUBLE DAGGER',\n value: '‡',\n codepoint: 8225,\n },\n {\n name: 'BULLET',\n value: '•',\n codepoint: 8226,\n },\n {\n name: 'TRIANGULAR BULLET',\n value: '‣',\n codepoint: 8227,\n },\n {\n name: 'ONE DOT LEADER',\n value: '․',\n codepoint: 8228,\n },\n {\n name: 'TWO DOT LEADER',\n value: '‥',\n codepoint: 8229,\n },\n {\n name: 'HORIZONTAL ELLIPSIS',\n value: '…',\n codepoint: 8230,\n },\n {\n name: 'HYPHENATION POINT',\n value: '‧',\n codepoint: 8231,\n },\n {\n name: 'NARROW NO-BREAK SPACE',\n value: ' ',\n codepoint: 8239,\n },\n {\n name: 'PER MILLE SIGN',\n value: '‰',\n codepoint: 8240,\n },\n {\n name: 'PER TEN THOUSAND SIGN',\n value: '‱',\n codepoint: 8241,\n },\n {\n name: 'PRIME',\n value: '′',\n codepoint: 8242,\n },\n {\n name: 'DOUBLE PRIME',\n value: '″',\n codepoint: 8243,\n },\n {\n name: 'TRIPLE PRIME',\n value: '‴',\n codepoint: 8244,\n },\n {\n name: 'REVERSED PRIME',\n value: '‵',\n codepoint: 8245,\n },\n {\n name: 'REVERSED DOUBLE PRIME',\n value: '‶',\n codepoint: 8246,\n },\n {\n name: 'REVERSED TRIPLE PRIME',\n value: '‷',\n codepoint: 8247,\n },\n {\n name: 'CARET',\n value: '‸',\n codepoint: 8248,\n },\n {\n name: 'SINGLE LEFT-POINTING ANGLE QUOTATION MARK',\n value: '‹',\n codepoint: 8249,\n },\n {\n name: 'SINGLE RIGHT-POINTING ANGLE QUOTATION MARK',\n value: '›',\n codepoint: 8250,\n },\n {\n name: 'REFERENCE MARK',\n value: '※',\n codepoint: 8251,\n },\n {\n name: 'INTERROBANG',\n value: '‽',\n codepoint: 8253,\n },\n {\n name: 'OVERLINE',\n value: '‾',\n codepoint: 8254,\n },\n {\n name: 'UNDERTIE',\n value: '‿',\n codepoint: 8255,\n },\n {\n name: 'CHARACTER TIE',\n value: '⁀',\n codepoint: 8256,\n },\n {\n name: 'CARET INSERTION POINT',\n value: '⁁',\n codepoint: 8257,\n },\n {\n name: 'ASTERISM',\n value: '⁂',\n codepoint: 8258,\n },\n {\n name: 'HYPHEN BULLET',\n value: '⁃',\n codepoint: 8259,\n },\n {\n name: 'FRACTION SLASH',\n value: '⁄',\n codepoint: 8260,\n },\n {\n name: 'LEFT SQUARE BRACKET WITH QUILL',\n value: '⁅',\n codepoint: 8261,\n },\n {\n name: 'RIGHT SQUARE BRACKET WITH QUILL',\n value: '⁆',\n codepoint: 8262,\n },\n {\n name: 'DOUBLE QUESTION MARK',\n value: '⁇',\n codepoint: 8263,\n },\n {\n name: 'QUESTION EXCLAMATION MARK',\n value: '⁈',\n codepoint: 8264,\n },\n {\n name: 'TIRONIAN SIGN ET',\n value: '⁊',\n codepoint: 8266,\n },\n {\n name: 'REVERSED PILCROW SIGN',\n value: '⁋',\n codepoint: 8267,\n },\n {\n name: 'BLACK LEFTWARDS BULLET',\n value: '⁌',\n codepoint: 8268,\n },\n {\n name: 'BLACK RIGHTWARDS BULLET',\n value: '⁍',\n codepoint: 8269,\n },\n {\n name: 'LOW ASTERISK',\n value: '⁎',\n codepoint: 8270,\n },\n {\n name: 'REVERSED SEMICOLON',\n value: '⁏',\n codepoint: 8271,\n },\n {\n name: 'CLOSE UP',\n value: '⁐',\n codepoint: 8272,\n },\n {\n name: 'TWO ASTERISKS ALIGNED VERTICALLY',\n value: '⁑',\n codepoint: 8273,\n },\n {\n name: 'COMMERCIAL MINUS SIGN',\n value: '⁒',\n codepoint: 8274,\n },\n {\n name: 'SWUNG DASH',\n value: '⁓',\n codepoint: 8275,\n },\n {\n name: 'INVERTED UNDERTIE',\n value: '⁔',\n codepoint: 8276,\n },\n {\n name: 'FLOWER PUNCTUATION MARK',\n value: '⁕',\n codepoint: 8277,\n },\n {\n name: 'THREE DOT PUNCTUATION',\n value: '⁖',\n codepoint: 8278,\n },\n {\n name: 'QUADRUPLE PRIME',\n value: '⁗',\n codepoint: 8279,\n },\n {\n name: 'FOUR DOT PUNCTUATION',\n value: '⁘',\n codepoint: 8280,\n },\n {\n name: 'FIVE DOT PUNCTUATION',\n value: '⁙',\n codepoint: 8281,\n },\n {\n name: 'TWO DOT PUNCTUATION',\n value: '⁚',\n codepoint: 8282,\n },\n {\n name: 'FOUR DOT MARK',\n value: '⁛',\n codepoint: 8283,\n },\n {\n name: 'DOTTED CROSS',\n value: '⁜',\n codepoint: 8284,\n },\n {\n name: 'TRICOLON',\n value: '⁝',\n codepoint: 8285,\n },\n {\n name: 'VERTICAL FOUR DOTS',\n value: '⁞',\n codepoint: 8286,\n },\n {\n name: 'MEDIUM MATHEMATICAL SPACE',\n value: ' ',\n codepoint: 8287,\n },\n {\n name: 'RIGHT ANGLE SUBSTITUTION MARKER',\n value: '⸀',\n codepoint: 11776,\n },\n {\n name: 'RIGHT ANGLE DOTTED SUBSTITUTION MARKER',\n value: '⸁',\n codepoint: 11777,\n },\n {\n name: 'LEFT SUBSTITUTION BRACKET',\n value: '⸂',\n codepoint: 11778,\n },\n {\n name: 'RIGHT SUBSTITUTION BRACKET',\n value: '⸃',\n codepoint: 11779,\n },\n {\n name: 'LEFT DOTTED SUBSTITUTION BRACKET',\n value: '⸄',\n codepoint: 11780,\n },\n {\n name: 'RIGHT DOTTED SUBSTITUTION BRACKET',\n value: '⸅',\n codepoint: 11781,\n },\n {\n name: 'RAISED INTERPOLATION MARKER',\n value: '⸆',\n codepoint: 11782,\n },\n {\n name: 'RAISED DOTTED INTERPOLATION MARKER',\n value: '⸇',\n codepoint: 11783,\n },\n {\n name: 'DOTTED TRANSPOSITION MARKER',\n value: '⸈',\n codepoint: 11784,\n },\n {\n name: 'LEFT TRANSPOSITION BRACKET',\n value: '⸉',\n codepoint: 11785,\n },\n {\n name: 'RIGHT TRANSPOSITION BRACKET',\n value: '⸊',\n codepoint: 11786,\n },\n {\n name: 'RAISED SQUARE',\n value: '⸋',\n codepoint: 11787,\n },\n {\n name: 'LEFT RAISED OMISSION BRACKET',\n value: '⸌',\n codepoint: 11788,\n },\n {\n name: 'RIGHT RAISED OMISSION BRACKET',\n value: '⸍',\n codepoint: 11789,\n },\n {\n name: 'EDITORIAL CORONIS',\n value: '⸎',\n codepoint: 11790,\n },\n {\n name: 'PARAGRAPHOS',\n value: '⸏',\n codepoint: 11791,\n },\n {\n name: 'FORKED PARAGRAPHOS',\n value: '⸐',\n codepoint: 11792,\n },\n {\n name: 'REVERSED FORKED PARAGRAPHOS',\n value: '⸑',\n codepoint: 11793,\n },\n {\n name: 'HYPODIASTOLE',\n value: '⸒',\n codepoint: 11794,\n },\n {\n name: 'DOTTED OBELOS',\n value: '⸓',\n codepoint: 11795,\n },\n {\n name: 'DOWNWARDS ANCORA',\n value: '⸔',\n codepoint: 11796,\n },\n {\n name: 'UPWARDS ANCORA',\n value: '⸕',\n codepoint: 11797,\n },\n {\n name: 'DOTTED RIGHT-POINTING ANGLE',\n value: '⸖',\n codepoint: 11798,\n },\n {\n name: 'DOUBLE OBLIQUE HYPHEN',\n value: '⸗',\n codepoint: 11799,\n },\n {\n name: 'INVERTED INTERROBANG',\n value: '⸘',\n codepoint: 11800,\n },\n {\n name: 'HYPHEN WITH DIAERESIS',\n value: '⸚',\n codepoint: 11802,\n },\n {\n name: 'TILDE WITH RING ABOVE',\n value: '⸛',\n codepoint: 11803,\n },\n {\n name: 'LEFT LOW PARAPHRASE BRACKET',\n value: '⸜',\n codepoint: 11804,\n },\n {\n name: 'RIGHT LOW PARAPHRASE BRACKET',\n value: '⸝',\n codepoint: 11805,\n },\n {\n name: 'TILDE WITH DOT ABOVE',\n value: '⸞',\n codepoint: 11806,\n },\n {\n name: 'TILDE WITH DOT BELOW',\n value: '⸟',\n codepoint: 11807,\n },\n {\n name: 'LEFT VERTICAL BAR WITH QUILL',\n value: '⸠',\n codepoint: 11808,\n },\n {\n name: 'RIGHT VERTICAL BAR WITH QUILL',\n value: '⸡',\n codepoint: 11809,\n },\n {\n name: 'TOP LEFT HALF BRACKET',\n value: '⸢',\n codepoint: 11810,\n },\n {\n name: 'TOP RIGHT HALF BRACKET',\n value: '⸣',\n codepoint: 11811,\n },\n {\n name: 'BOTTOM LEFT HALF BRACKET',\n value: '⸤',\n codepoint: 11812,\n },\n {\n name: 'BOTTOM RIGHT HALF BRACKET',\n value: '⸥',\n codepoint: 11813,\n },\n {\n name: 'LEFT SIDEWAYS U BRACKET',\n value: '⸦',\n codepoint: 11814,\n },\n {\n name: 'RIGHT SIDEWAYS U BRACKET',\n value: '⸧',\n codepoint: 11815,\n },\n {\n name: 'LEFT DOUBLE PARENTHESIS',\n value: '⸨',\n codepoint: 11816,\n },\n {\n name: 'RIGHT DOUBLE PARENTHESIS',\n value: '⸩',\n codepoint: 11817,\n },\n {\n name: 'TWO DOTS OVER ONE DOT PUNCTUATION',\n value: '⸪',\n codepoint: 11818,\n },\n {\n name: 'ONE DOT OVER TWO DOTS PUNCTUATION',\n value: '⸫',\n codepoint: 11819,\n },\n {\n name: 'SQUARED FOUR DOT PUNCTUATION',\n value: '⸬',\n codepoint: 11820,\n },\n {\n name: 'FIVE DOT MARK',\n value: '⸭',\n codepoint: 11821,\n },\n {\n name: 'REVERSED QUESTION MARK',\n value: '⸮',\n codepoint: 11822,\n },\n {\n name: 'VERTICAL TILDE',\n value: 'ⸯ',\n codepoint: 11823,\n },\n {\n name: 'RING POINT',\n value: '⸰',\n codepoint: 11824,\n },\n {\n name: 'WORD SEPARATOR MIDDLE DOT',\n value: '⸱',\n codepoint: 11825,\n },\n ],\n },\n {\n name: 'Technical',\n symbols: [\n {\n name: 'DIAMETER SIGN',\n value: '⌀',\n codepoint: 8960,\n },\n {\n name: 'ELECTRIC ARROW',\n value: '⌁',\n codepoint: 8961,\n },\n {\n name: 'HOUSE',\n value: '⌂',\n codepoint: 8962,\n },\n {\n name: 'UP ARROWHEAD',\n value: '⌃',\n codepoint: 8963,\n },\n {\n name: 'DOWN ARROWHEAD',\n value: '⌄',\n codepoint: 8964,\n },\n {\n name: 'PROJECTIVE',\n value: '⌅',\n codepoint: 8965,\n },\n {\n name: 'PERSPECTIVE',\n value: '⌆',\n codepoint: 8966,\n },\n {\n name: 'WAVY LINE',\n value: '⌇',\n codepoint: 8967,\n },\n {\n name: 'LEFT CEILING',\n value: '⌈',\n codepoint: 8968,\n },\n {\n name: 'RIGHT CEILING',\n value: '⌉',\n codepoint: 8969,\n },\n {\n name: 'LEFT FLOOR',\n value: '⌊',\n codepoint: 8970,\n },\n {\n name: 'RIGHT FLOOR',\n value: '⌋',\n codepoint: 8971,\n },\n {\n name: 'BOTTOM RIGHT CROP',\n value: '⌌',\n codepoint: 8972,\n },\n {\n name: 'BOTTOM LEFT CROP',\n value: '⌍',\n codepoint: 8973,\n },\n {\n name: 'TOP RIGHT CROP',\n value: '⌎',\n codepoint: 8974,\n },\n {\n name: 'TOP LEFT CROP',\n value: '⌏',\n codepoint: 8975,\n },\n {\n name: 'REVERSED NOT SIGN',\n value: '⌐',\n codepoint: 8976,\n },\n {\n name: 'SQUARE LOZENGE',\n value: '⌑',\n codepoint: 8977,\n },\n {\n name: 'ARC',\n value: '⌒',\n codepoint: 8978,\n },\n {\n name: 'SEGMENT',\n value: '⌓',\n codepoint: 8979,\n },\n {\n name: 'SECTOR',\n value: '⌔',\n codepoint: 8980,\n },\n {\n name: 'TELEPHONE RECORDER',\n value: '⌕',\n codepoint: 8981,\n },\n {\n name: 'POSITION INDICATOR',\n value: '⌖',\n codepoint: 8982,\n },\n {\n name: 'VIEWDATA SQUARE',\n value: '⌗',\n codepoint: 8983,\n },\n {\n name: 'PLACE OF INTEREST SIGN',\n value: '⌘',\n codepoint: 8984,\n },\n {\n name: 'TURNED NOT SIGN',\n value: '⌙',\n codepoint: 8985,\n },\n {\n name: 'TOP LEFT CORNER',\n value: '⌜',\n codepoint: 8988,\n },\n {\n name: 'TOP RIGHT CORNER',\n value: '⌝',\n codepoint: 8989,\n },\n {\n name: 'BOTTOM LEFT CORNER',\n value: '⌞',\n codepoint: 8990,\n },\n {\n name: 'BOTTOM RIGHT CORNER',\n value: '⌟',\n codepoint: 8991,\n },\n {\n name: 'TOP HALF INTEGRAL',\n value: '⌠',\n codepoint: 8992,\n },\n {\n name: 'BOTTOM HALF INTEGRAL',\n value: '⌡',\n codepoint: 8993,\n },\n {\n name: 'FROWN',\n value: '⌢',\n codepoint: 8994,\n },\n {\n name: 'SMILE',\n value: '⌣',\n codepoint: 8995,\n },\n {\n name: 'UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS',\n value: '⌤',\n codepoint: 8996,\n },\n {\n name: 'OPTION KEY',\n value: '⌥',\n codepoint: 8997,\n },\n {\n name: 'ERASE TO THE RIGHT',\n value: '⌦',\n codepoint: 8998,\n },\n {\n name: 'X IN A RECTANGLE BOX',\n value: '⌧',\n codepoint: 8999,\n },\n {\n name: 'LEFT-POINTING ANGLE BRACKET',\n value: '〈',\n codepoint: 9001,\n },\n {\n name: 'RIGHT-POINTING ANGLE BRACKET',\n value: '〉',\n codepoint: 9002,\n },\n {\n name: 'ERASE TO THE LEFT',\n value: '⌫',\n codepoint: 9003,\n },\n {\n name: 'BENZENE RING',\n value: '⌬',\n codepoint: 9004,\n },\n {\n name: 'CYLINDRICITY',\n value: '⌭',\n codepoint: 9005,\n },\n {\n name: 'ALL AROUND-PROFILE',\n value: '⌮',\n codepoint: 9006,\n },\n {\n name: 'SYMMETRY',\n value: '⌯',\n codepoint: 9007,\n },\n {\n name: 'TOTAL RUNOUT',\n value: '⌰',\n codepoint: 9008,\n },\n {\n name: 'DIMENSION ORIGIN',\n value: '⌱',\n codepoint: 9009,\n },\n {\n name: 'CONICAL TAPER',\n value: '⌲',\n codepoint: 9010,\n },\n {\n name: 'SLOPE',\n value: '⌳',\n codepoint: 9011,\n },\n {\n name: 'COUNTERBORE',\n value: '⌴',\n codepoint: 9012,\n },\n {\n name: 'COUNTERSINK',\n value: '⌵',\n codepoint: 9013,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL I-BEAM',\n value: '⌶',\n codepoint: 9014,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL SQUISH QUAD',\n value: '⌷',\n codepoint: 9015,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD EQUAL',\n value: '⌸',\n codepoint: 9016,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD DIVIDE',\n value: '⌹',\n codepoint: 9017,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD DIAMOND',\n value: '⌺',\n codepoint: 9018,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD JOT',\n value: '⌻',\n codepoint: 9019,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD CIRCLE',\n value: '⌼',\n codepoint: 9020,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL CIRCLE STILE',\n value: '⌽',\n codepoint: 9021,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL CIRCLE JOT',\n value: '⌾',\n codepoint: 9022,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL SLASH BAR',\n value: '⌿',\n codepoint: 9023,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL BACKSLASH BAR',\n value: '⍀',\n codepoint: 9024,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD SLASH',\n value: '⍁',\n codepoint: 9025,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD BACKSLASH',\n value: '⍂',\n codepoint: 9026,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD LESS-THAN',\n value: '⍃',\n codepoint: 9027,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD GREATER-THAN',\n value: '⍄',\n codepoint: 9028,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL LEFTWARDS VANE',\n value: '⍅',\n codepoint: 9029,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL RIGHTWARDS VANE',\n value: '⍆',\n codepoint: 9030,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW',\n value: '⍇',\n codepoint: 9031,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW',\n value: '⍈',\n codepoint: 9032,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH',\n value: '⍉',\n codepoint: 9033,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR',\n value: '⍊',\n codepoint: 9034,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL DELTA STILE',\n value: '⍋',\n codepoint: 9035,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD DOWN CARET',\n value: '⍌',\n codepoint: 9036,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD DELTA',\n value: '⍍',\n codepoint: 9037,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL DOWN TACK JOT',\n value: '⍎',\n codepoint: 9038,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL UPWARDS VANE',\n value: '⍏',\n codepoint: 9039,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW',\n value: '⍐',\n codepoint: 9040,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL UP TACK OVERBAR',\n value: '⍑',\n codepoint: 9041,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL DEL STILE',\n value: '⍒',\n codepoint: 9042,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD UP CARET',\n value: '⍓',\n codepoint: 9043,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD DEL',\n value: '⍔',\n codepoint: 9044,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL UP TACK JOT',\n value: '⍕',\n codepoint: 9045,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL DOWNWARDS VANE',\n value: '⍖',\n codepoint: 9046,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW',\n value: '⍗',\n codepoint: 9047,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUOTE UNDERBAR',\n value: '⍘',\n codepoint: 9048,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL DELTA UNDERBAR',\n value: '⍙',\n codepoint: 9049,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR',\n value: '⍚',\n codepoint: 9050,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL JOT UNDERBAR',\n value: '⍛',\n codepoint: 9051,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR',\n value: '⍜',\n codepoint: 9052,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL UP SHOE JOT',\n value: '⍝',\n codepoint: 9053,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUOTE QUAD',\n value: '⍞',\n codepoint: 9054,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL CIRCLE STAR',\n value: '⍟',\n codepoint: 9055,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD COLON',\n value: '⍠',\n codepoint: 9056,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL UP TACK DIAERESIS',\n value: '⍡',\n codepoint: 9057,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL DEL DIAERESIS',\n value: '⍢',\n codepoint: 9058,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL STAR DIAERESIS',\n value: '⍣',\n codepoint: 9059,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL JOT DIAERESIS',\n value: '⍤',\n codepoint: 9060,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS',\n value: '⍥',\n codepoint: 9061,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL DOWN SHOE STILE',\n value: '⍦',\n codepoint: 9062,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL LEFT SHOE STILE',\n value: '⍧',\n codepoint: 9063,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL TILDE DIAERESIS',\n value: '⍨',\n codepoint: 9064,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS',\n value: '⍩',\n codepoint: 9065,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL COMMA BAR',\n value: '⍪',\n codepoint: 9066,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL DEL TILDE',\n value: '⍫',\n codepoint: 9067,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL ZILDE',\n value: '⍬',\n codepoint: 9068,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL STILE TILDE',\n value: '⍭',\n codepoint: 9069,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR',\n value: '⍮',\n codepoint: 9070,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD NOT EQUAL',\n value: '⍯',\n codepoint: 9071,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD QUESTION',\n value: '⍰',\n codepoint: 9072,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL DOWN CARET TILDE',\n value: '⍱',\n codepoint: 9073,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL UP CARET TILDE',\n value: '⍲',\n codepoint: 9074,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL IOTA',\n value: '⍳',\n codepoint: 9075,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL RHO',\n value: '⍴',\n codepoint: 9076,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL OMEGA',\n value: '⍵',\n codepoint: 9077,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL ALPHA UNDERBAR',\n value: '⍶',\n codepoint: 9078,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL EPSILON UNDERBAR',\n value: '⍷',\n codepoint: 9079,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL IOTA UNDERBAR',\n value: '⍸',\n codepoint: 9080,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL OMEGA UNDERBAR',\n value: '⍹',\n codepoint: 9081,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL ALPHA',\n value: '⍺',\n codepoint: 9082,\n },\n {\n name: 'NOT CHECK MARK',\n value: '⍻',\n codepoint: 9083,\n },\n {\n name: 'RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW',\n value: '⍼',\n codepoint: 9084,\n },\n {\n name: 'SHOULDERED OPEN BOX',\n value: '⍽',\n codepoint: 9085,\n },\n {\n name: 'BELL SYMBOL',\n value: '⍾',\n codepoint: 9086,\n },\n {\n name: 'VERTICAL LINE WITH MIDDLE DOT',\n value: '⍿',\n codepoint: 9087,\n },\n {\n name: 'INSERTION SYMBOL',\n value: '⎀',\n codepoint: 9088,\n },\n {\n name: 'CONTINUOUS UNDERLINE SYMBOL',\n value: '⎁',\n codepoint: 9089,\n },\n {\n name: 'DISCONTINUOUS UNDERLINE SYMBOL',\n value: '⎂',\n codepoint: 9090,\n },\n {\n name: 'EMPHASIS SYMBOL',\n value: '⎃',\n codepoint: 9091,\n },\n {\n name: 'COMPOSITION SYMBOL',\n value: '⎄',\n codepoint: 9092,\n },\n {\n name: 'WHITE SQUARE WITH CENTRE VERTICAL LINE',\n value: '⎅',\n codepoint: 9093,\n },\n {\n name: 'ENTER SYMBOL',\n value: '⎆',\n codepoint: 9094,\n },\n {\n name: 'ALTERNATIVE KEY SYMBOL',\n value: '⎇',\n codepoint: 9095,\n },\n {\n name: 'HELM SYMBOL',\n value: '⎈',\n codepoint: 9096,\n },\n {\n name: 'CIRCLED HORIZONTAL BAR WITH NOTCH',\n value: '⎉',\n codepoint: 9097,\n },\n {\n name: 'CIRCLED TRIANGLE DOWN',\n value: '⎊',\n codepoint: 9098,\n },\n {\n name: 'BROKEN CIRCLE WITH NORTHWEST ARROW',\n value: '⎋',\n codepoint: 9099,\n },\n {\n name: 'UNDO SYMBOL',\n value: '⎌',\n codepoint: 9100,\n },\n {\n name: 'MONOSTABLE SYMBOL',\n value: '⎍',\n codepoint: 9101,\n },\n {\n name: 'HYSTERESIS SYMBOL',\n value: '⎎',\n codepoint: 9102,\n },\n {\n name: 'OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL',\n value: '⎏',\n codepoint: 9103,\n },\n {\n name: 'OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL',\n value: '⎐',\n codepoint: 9104,\n },\n {\n name: 'PASSIVE-PULL-DOWN-OUTPUT SYMBOL',\n value: '⎑',\n codepoint: 9105,\n },\n {\n name: 'PASSIVE-PULL-UP-OUTPUT SYMBOL',\n value: '⎒',\n codepoint: 9106,\n },\n {\n name: 'DIRECT CURRENT SYMBOL FORM TWO',\n value: '⎓',\n codepoint: 9107,\n },\n {\n name: 'SOFTWARE-FUNCTION SYMBOL',\n value: '⎔',\n codepoint: 9108,\n },\n {\n name: 'APL FUNCTIONAL SYMBOL QUAD',\n value: '⎕',\n codepoint: 9109,\n },\n {\n name: 'DECIMAL SEPARATOR KEY SYMBOL',\n value: '⎖',\n codepoint: 9110,\n },\n {\n name: 'PREVIOUS PAGE',\n value: '⎗',\n codepoint: 9111,\n },\n {\n name: 'NEXT PAGE',\n value: '⎘',\n codepoint: 9112,\n },\n {\n name: 'PRINT SCREEN SYMBOL',\n value: '⎙',\n codepoint: 9113,\n },\n {\n name: 'CLEAR SCREEN SYMBOL',\n value: '⎚',\n codepoint: 9114,\n },\n {\n name: 'LEFT PARENTHESIS UPPER HOOK',\n value: '⎛',\n codepoint: 9115,\n },\n {\n name: 'LEFT PARENTHESIS EXTENSION',\n value: '⎜',\n codepoint: 9116,\n },\n {\n name: 'LEFT PARENTHESIS LOWER HOOK',\n value: '⎝',\n codepoint: 9117,\n },\n {\n name: 'RIGHT PARENTHESIS UPPER HOOK',\n value: '⎞',\n codepoint: 9118,\n },\n {\n name: 'RIGHT PARENTHESIS EXTENSION',\n value: '⎟',\n codepoint: 9119,\n },\n {\n name: 'RIGHT PARENTHESIS LOWER HOOK',\n value: '⎠',\n codepoint: 9120,\n },\n {\n name: 'LEFT SQUARE BRACKET UPPER CORNER',\n value: '⎡',\n codepoint: 9121,\n },\n {\n name: 'LEFT SQUARE BRACKET EXTENSION',\n value: '⎢',\n codepoint: 9122,\n },\n {\n name: 'LEFT SQUARE BRACKET LOWER CORNER',\n value: '⎣',\n codepoint: 9123,\n },\n {\n name: 'RIGHT SQUARE BRACKET UPPER CORNER',\n value: '⎤',\n codepoint: 9124,\n },\n {\n name: 'RIGHT SQUARE BRACKET EXTENSION',\n value: '⎥',\n codepoint: 9125,\n },\n {\n name: 'RIGHT SQUARE BRACKET LOWER CORNER',\n value: '⎦',\n codepoint: 9126,\n },\n {\n name: 'LEFT CURLY BRACKET UPPER HOOK',\n value: '⎧',\n codepoint: 9127,\n },\n {\n name: 'LEFT CURLY BRACKET MIDDLE PIECE',\n value: '⎨',\n codepoint: 9128,\n },\n {\n name: 'LEFT CURLY BRACKET LOWER HOOK',\n value: '⎩',\n codepoint: 9129,\n },\n {\n name: 'CURLY BRACKET EXTENSION',\n value: '⎪',\n codepoint: 9130,\n },\n {\n name: 'RIGHT CURLY BRACKET UPPER HOOK',\n value: '⎫',\n codepoint: 9131,\n },\n {\n name: 'RIGHT CURLY BRACKET MIDDLE PIECE',\n value: '⎬',\n codepoint: 9132,\n },\n {\n name: 'RIGHT CURLY BRACKET LOWER HOOK',\n value: '⎭',\n codepoint: 9133,\n },\n {\n name: 'INTEGRAL EXTENSION',\n value: '⎮',\n codepoint: 9134,\n },\n {\n name: 'HORIZONTAL LINE EXTENSION',\n value: '⎯',\n codepoint: 9135,\n },\n {\n name: 'UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION',\n value: '⎰',\n codepoint: 9136,\n },\n {\n name: 'UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION',\n value: '⎱',\n codepoint: 9137,\n },\n {\n name: 'SUMMATION TOP',\n value: '⎲',\n codepoint: 9138,\n },\n {\n name: 'SUMMATION BOTTOM',\n value: '⎳',\n codepoint: 9139,\n },\n {\n name: 'TOP SQUARE BRACKET',\n value: '⎴',\n codepoint: 9140,\n },\n {\n name: 'BOTTOM SQUARE BRACKET',\n value: '⎵',\n codepoint: 9141,\n },\n {\n name: 'BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET',\n value: '⎶',\n codepoint: 9142,\n },\n {\n name: 'RADICAL SYMBOL BOTTOM',\n value: '⎷',\n codepoint: 9143,\n },\n {\n name: 'LEFT VERTICAL BOX LINE',\n value: '⎸',\n codepoint: 9144,\n },\n {\n name: 'RIGHT VERTICAL BOX LINE',\n value: '⎹',\n codepoint: 9145,\n },\n {\n name: 'HORIZONTAL SCAN LINE-1',\n value: '⎺',\n codepoint: 9146,\n },\n {\n name: 'HORIZONTAL SCAN LINE-3',\n value: '⎻',\n codepoint: 9147,\n },\n {\n name: 'HORIZONTAL SCAN LINE-7',\n value: '⎼',\n codepoint: 9148,\n },\n {\n name: 'HORIZONTAL SCAN LINE-9',\n value: '⎽',\n codepoint: 9149,\n },\n {\n name: 'DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT',\n value: '⎾',\n codepoint: 9150,\n },\n {\n name: 'DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT',\n value: '⎿',\n codepoint: 9151,\n },\n {\n name: 'DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE',\n value: '⏀',\n codepoint: 9152,\n },\n {\n name: 'DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE',\n value: '⏁',\n codepoint: 9153,\n },\n {\n name: 'DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE',\n value: '⏂',\n codepoint: 9154,\n },\n {\n name: 'DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE',\n value: '⏃',\n codepoint: 9155,\n },\n {\n name: 'DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE',\n value: '⏄',\n codepoint: 9156,\n },\n {\n name: 'DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE',\n value: '⏅',\n codepoint: 9157,\n },\n {\n name: 'DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE',\n value: '⏆',\n codepoint: 9158,\n },\n {\n name: 'DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE',\n value: '⏇',\n codepoint: 9159,\n },\n {\n name: 'DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE',\n value: '⏈',\n codepoint: 9160,\n },\n {\n name: 'DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL',\n value: '⏉',\n codepoint: 9161,\n },\n {\n name: 'DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL',\n value: '⏊',\n codepoint: 9162,\n },\n {\n name: 'DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT',\n value: '⏋',\n codepoint: 9163,\n },\n {\n name: 'DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT',\n value: '⏌',\n codepoint: 9164,\n },\n {\n name: 'SQUARE FOOT',\n value: '⏍',\n codepoint: 9165,\n },\n {\n name: 'RETURN SYMBOL',\n value: '⏎',\n codepoint: 9166,\n },\n {\n name: 'VERTICAL LINE EXTENSION',\n value: '⏐',\n codepoint: 9168,\n },\n {\n name: 'METRICAL BREVE',\n value: '⏑',\n codepoint: 9169,\n },\n {\n name: 'METRICAL LONG OVER SHORT',\n value: '⏒',\n codepoint: 9170,\n },\n {\n name: 'METRICAL SHORT OVER LONG',\n value: '⏓',\n codepoint: 9171,\n },\n {\n name: 'METRICAL LONG OVER TWO SHORTS',\n value: '⏔',\n codepoint: 9172,\n },\n {\n name: 'METRICAL TWO SHORTS OVER LONG',\n value: '⏕',\n codepoint: 9173,\n },\n {\n name: 'METRICAL TWO SHORTS JOINED',\n value: '⏖',\n codepoint: 9174,\n },\n {\n name: 'METRICAL TRISEME',\n value: '⏗',\n codepoint: 9175,\n },\n {\n name: 'METRICAL TETRASEME',\n value: '⏘',\n codepoint: 9176,\n },\n {\n name: 'METRICAL PENTASEME',\n value: '⏙',\n codepoint: 9177,\n },\n {\n name: 'EARTH GROUND',\n value: '⏚',\n codepoint: 9178,\n },\n {\n name: 'FUSE',\n value: '⏛',\n codepoint: 9179,\n },\n {\n name: 'TOP PARENTHESIS',\n value: '⏜',\n codepoint: 9180,\n },\n {\n name: 'BOTTOM PARENTHESIS',\n value: '⏝',\n codepoint: 9181,\n },\n {\n name: 'TOP CURLY BRACKET',\n value: '⏞',\n codepoint: 9182,\n },\n {\n name: 'BOTTOM CURLY BRACKET',\n value: '⏟',\n codepoint: 9183,\n },\n {\n name: 'TOP TORTOISE SHELL BRACKET',\n value: '⏠',\n codepoint: 9184,\n },\n {\n name: 'BOTTOM TORTOISE SHELL BRACKET',\n value: '⏡',\n codepoint: 9185,\n },\n {\n name: 'WHITE TRAPEZIUM',\n value: '⏢',\n codepoint: 9186,\n },\n {\n name: 'BENZENE RING WITH CIRCLE',\n value: '⏣',\n codepoint: 9187,\n },\n {\n name: 'STRAIGHTNESS',\n value: '⏤',\n codepoint: 9188,\n },\n {\n name: 'FLATNESS',\n value: '⏥',\n codepoint: 9189,\n },\n {\n name: 'AC CURRENT',\n value: '⏦',\n codepoint: 9190,\n },\n {\n name: 'ELECTRICAL INTERSECTION',\n value: '⏧',\n codepoint: 9191,\n },\n ],\n },\n {\n name: 'Arrows',\n symbols: [\n {\n name: 'UPWARDS QUADRUPLE ARROW',\n value: '⟰',\n codepoint: 10224,\n },\n {\n name: 'DOWNWARDS QUADRUPLE ARROW',\n value: '⟱',\n codepoint: 10225,\n },\n {\n name: 'ANTICLOCKWISE GAPPED CIRCLE ARROW',\n value: '⟲',\n codepoint: 10226,\n },\n {\n name: 'CLOCKWISE GAPPED CIRCLE ARROW',\n value: '⟳',\n codepoint: 10227,\n },\n {\n name: 'RIGHT ARROW WITH CIRCLED PLUS',\n value: '⟴',\n codepoint: 10228,\n },\n {\n name: 'LONG LEFTWARDS ARROW',\n value: '⟵',\n codepoint: 10229,\n },\n {\n name: 'LONG RIGHTWARDS ARROW',\n value: '⟶',\n codepoint: 10230,\n },\n {\n name: 'LONG LEFT RIGHT ARROW',\n value: '⟷',\n codepoint: 10231,\n },\n {\n name: 'LONG LEFTWARDS DOUBLE ARROW',\n value: '⟸',\n codepoint: 10232,\n },\n {\n name: 'LONG RIGHTWARDS DOUBLE ARROW',\n value: '⟹',\n codepoint: 10233,\n },\n {\n name: 'LONG LEFT RIGHT DOUBLE ARROW',\n value: '⟺',\n codepoint: 10234,\n },\n {\n name: 'LONG LEFTWARDS ARROW FROM BAR',\n value: '⟻',\n codepoint: 10235,\n },\n {\n name: 'LONG RIGHTWARDS ARROW FROM BAR',\n value: '⟼',\n codepoint: 10236,\n },\n {\n name: 'LONG LEFTWARDS DOUBLE ARROW FROM BAR',\n value: '⟽',\n codepoint: 10237,\n },\n {\n name: 'LONG RIGHTWARDS DOUBLE ARROW FROM BAR',\n value: '⟾',\n codepoint: 10238,\n },\n {\n name: 'LONG RIGHTWARDS SQUIGGLE ARROW',\n value: '⟿',\n codepoint: 10239,\n },\n {\n name: 'RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE',\n value: '⤀',\n codepoint: 10496,\n },\n {\n name: 'RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE',\n value: '⤁',\n codepoint: 10497,\n },\n {\n name: 'LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE',\n value: '⤂',\n codepoint: 10498,\n },\n {\n name: 'RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE',\n value: '⤃',\n codepoint: 10499,\n },\n {\n name: 'LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE',\n value: '⤄',\n codepoint: 10500,\n },\n {\n name: 'RIGHTWARDS TWO-HEADED ARROW FROM BAR',\n value: '⤅',\n codepoint: 10501,\n },\n {\n name: 'LEFTWARDS DOUBLE ARROW FROM BAR',\n value: '⤆',\n codepoint: 10502,\n },\n {\n name: 'RIGHTWARDS DOUBLE ARROW FROM BAR',\n value: '⤇',\n codepoint: 10503,\n },\n {\n name: 'DOWNWARDS ARROW WITH HORIZONTAL STROKE',\n value: '⤈',\n codepoint: 10504,\n },\n {\n name: 'UPWARDS ARROW WITH HORIZONTAL STROKE',\n value: '⤉',\n codepoint: 10505,\n },\n {\n name: 'UPWARDS TRIPLE ARROW',\n value: '⤊',\n codepoint: 10506,\n },\n {\n name: 'DOWNWARDS TRIPLE ARROW',\n value: '⤋',\n codepoint: 10507,\n },\n {\n name: 'LEFTWARDS DOUBLE DASH ARROW',\n value: '⤌',\n codepoint: 10508,\n },\n {\n name: 'RIGHTWARDS DOUBLE DASH ARROW',\n value: '⤍',\n codepoint: 10509,\n },\n {\n name: 'LEFTWARDS TRIPLE DASH ARROW',\n value: '⤎',\n codepoint: 10510,\n },\n {\n name: 'RIGHTWARDS TRIPLE DASH ARROW',\n value: '⤏',\n codepoint: 10511,\n },\n {\n name: 'RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW',\n value: '⤐',\n codepoint: 10512,\n },\n {\n name: 'RIGHTWARDS ARROW WITH DOTTED STEM',\n value: '⤑',\n codepoint: 10513,\n },\n {\n name: 'UPWARDS ARROW TO BAR',\n value: '⤒',\n codepoint: 10514,\n },\n {\n name: 'DOWNWARDS ARROW TO BAR',\n value: '⤓',\n codepoint: 10515,\n },\n {\n name: 'RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE',\n value: '⤔',\n codepoint: 10516,\n },\n {\n name: 'RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE',\n value: '⤕',\n codepoint: 10517,\n },\n {\n name: 'RIGHTWARDS TWO-HEADED ARROW WITH TAIL',\n value: '⤖',\n codepoint: 10518,\n },\n {\n name: 'RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE',\n value: '⤗',\n codepoint: 10519,\n },\n {\n name: 'RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE',\n value: '⤘',\n codepoint: 10520,\n },\n {\n name: 'LEFTWARDS ARROW-TAIL',\n value: '⤙',\n codepoint: 10521,\n },\n {\n name: 'RIGHTWARDS ARROW-TAIL',\n value: '⤚',\n codepoint: 10522,\n },\n {\n name: 'LEFTWARDS DOUBLE ARROW-TAIL',\n value: '⤛',\n codepoint: 10523,\n },\n {\n name: 'RIGHTWARDS DOUBLE ARROW-TAIL',\n value: '⤜',\n codepoint: 10524,\n },\n {\n name: 'LEFTWARDS ARROW TO BLACK DIAMOND',\n value: '⤝',\n codepoint: 10525,\n },\n {\n name: 'RIGHTWARDS ARROW TO BLACK DIAMOND',\n value: '⤞',\n codepoint: 10526,\n },\n {\n name: 'LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND',\n value: '⤟',\n codepoint: 10527,\n },\n {\n name: 'RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND',\n value: '⤠',\n codepoint: 10528,\n },\n {\n name: 'NORTH WEST AND SOUTH EAST ARROW',\n value: '⤡',\n codepoint: 10529,\n },\n {\n name: 'NORTH EAST AND SOUTH WEST ARROW',\n value: '⤢',\n codepoint: 10530,\n },\n {\n name: 'NORTH WEST ARROW WITH HOOK',\n value: '⤣',\n codepoint: 10531,\n },\n {\n name: 'NORTH EAST ARROW WITH HOOK',\n value: '⤤',\n codepoint: 10532,\n },\n {\n name: 'SOUTH EAST ARROW WITH HOOK',\n value: '⤥',\n codepoint: 10533,\n },\n {\n name: 'SOUTH WEST ARROW WITH HOOK',\n value: '⤦',\n codepoint: 10534,\n },\n {\n name: 'NORTH WEST ARROW AND NORTH EAST ARROW',\n value: '⤧',\n codepoint: 10535,\n },\n {\n name: 'NORTH EAST ARROW AND SOUTH EAST ARROW',\n value: '⤨',\n codepoint: 10536,\n },\n {\n name: 'SOUTH EAST ARROW AND SOUTH WEST ARROW',\n value: '⤩',\n codepoint: 10537,\n },\n {\n name: 'SOUTH WEST ARROW AND NORTH WEST ARROW',\n value: '⤪',\n codepoint: 10538,\n },\n {\n name: 'RISING DIAGONAL CROSSING FALLING DIAGONAL',\n value: '⤫',\n codepoint: 10539,\n },\n {\n name: 'FALLING DIAGONAL CROSSING RISING DIAGONAL',\n value: '⤬',\n codepoint: 10540,\n },\n {\n name: 'SOUTH EAST ARROW CROSSING NORTH EAST ARROW',\n value: '⤭',\n codepoint: 10541,\n },\n {\n name: 'NORTH EAST ARROW CROSSING SOUTH EAST ARROW',\n value: '⤮',\n codepoint: 10542,\n },\n {\n name: 'FALLING DIAGONAL CROSSING NORTH EAST ARROW',\n value: '⤯',\n codepoint: 10543,\n },\n {\n name: 'RISING DIAGONAL CROSSING SOUTH EAST ARROW',\n value: '⤰',\n codepoint: 10544,\n },\n {\n name: 'NORTH EAST ARROW CROSSING NORTH WEST ARROW',\n value: '⤱',\n codepoint: 10545,\n },\n {\n name: 'NORTH WEST ARROW CROSSING NORTH EAST ARROW',\n value: '⤲',\n codepoint: 10546,\n },\n {\n name: 'WAVE ARROW POINTING DIRECTLY RIGHT',\n value: '⤳',\n codepoint: 10547,\n },\n {\n name: 'ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS',\n value: '⤶',\n codepoint: 10550,\n },\n {\n name: 'ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS',\n value: '⤷',\n codepoint: 10551,\n },\n {\n name: 'RIGHT-SIDE ARC CLOCKWISE ARROW',\n value: '⤸',\n codepoint: 10552,\n },\n {\n name: 'LEFT-SIDE ARC ANTICLOCKWISE ARROW',\n value: '⤹',\n codepoint: 10553,\n },\n {\n name: 'TOP ARC ANTICLOCKWISE ARROW',\n value: '⤺',\n codepoint: 10554,\n },\n {\n name: 'BOTTOM ARC ANTICLOCKWISE ARROW',\n value: '⤻',\n codepoint: 10555,\n },\n {\n name: 'TOP ARC CLOCKWISE ARROW WITH MINUS',\n value: '⤼',\n codepoint: 10556,\n },\n {\n name: 'TOP ARC ANTICLOCKWISE ARROW WITH PLUS',\n value: '⤽',\n codepoint: 10557,\n },\n {\n name: 'LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW',\n value: '⤾',\n codepoint: 10558,\n },\n {\n name: 'LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW',\n value: '⤿',\n codepoint: 10559,\n },\n {\n name: 'ANTICLOCKWISE CLOSED CIRCLE ARROW',\n value: '⥀',\n codepoint: 10560,\n },\n {\n name: 'CLOCKWISE CLOSED CIRCLE ARROW',\n value: '⥁',\n codepoint: 10561,\n },\n {\n name: 'RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW',\n value: '⥂',\n codepoint: 10562,\n },\n {\n name: 'LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW',\n value: '⥃',\n codepoint: 10563,\n },\n {\n name: 'SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW',\n value: '⥄',\n codepoint: 10564,\n },\n {\n name: 'RIGHTWARDS ARROW WITH PLUS BELOW',\n value: '⥅',\n codepoint: 10565,\n },\n {\n name: 'LEFTWARDS ARROW WITH PLUS BELOW',\n value: '⥆',\n codepoint: 10566,\n },\n {\n name: 'RIGHTWARDS ARROW THROUGH X',\n value: '⥇',\n codepoint: 10567,\n },\n {\n name: 'LEFT RIGHT ARROW THROUGH SMALL CIRCLE',\n value: '⥈',\n codepoint: 10568,\n },\n {\n name: 'UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE',\n value: '⥉',\n codepoint: 10569,\n },\n {\n name: 'LEFT BARB UP RIGHT BARB DOWN HARPOON',\n value: '⥊',\n codepoint: 10570,\n },\n {\n name: 'LEFT BARB DOWN RIGHT BARB UP HARPOON',\n value: '⥋',\n codepoint: 10571,\n },\n {\n name: 'UP BARB RIGHT DOWN BARB LEFT HARPOON',\n value: '⥌',\n codepoint: 10572,\n },\n {\n name: 'UP BARB LEFT DOWN BARB RIGHT HARPOON',\n value: '⥍',\n codepoint: 10573,\n },\n {\n name: 'LEFT BARB UP RIGHT BARB UP HARPOON',\n value: '⥎',\n codepoint: 10574,\n },\n {\n name: 'UP BARB RIGHT DOWN BARB RIGHT HARPOON',\n value: '⥏',\n codepoint: 10575,\n },\n {\n name: 'LEFT BARB DOWN RIGHT BARB DOWN HARPOON',\n value: '⥐',\n codepoint: 10576,\n },\n {\n name: 'UP BARB LEFT DOWN BARB LEFT HARPOON',\n value: '⥑',\n codepoint: 10577,\n },\n {\n name: 'LEFTWARDS HARPOON WITH BARB UP TO BAR',\n value: '⥒',\n codepoint: 10578,\n },\n {\n name: 'RIGHTWARDS HARPOON WITH BARB UP TO BAR',\n value: '⥓',\n codepoint: 10579,\n },\n {\n name: 'UPWARDS HARPOON WITH BARB RIGHT TO BAR',\n value: '⥔',\n codepoint: 10580,\n },\n {\n name: 'DOWNWARDS HARPOON WITH BARB RIGHT TO BAR',\n value: '⥕',\n codepoint: 10581,\n },\n {\n name: 'LEFTWARDS HARPOON WITH BARB DOWN TO BAR',\n value: '⥖',\n codepoint: 10582,\n },\n {\n name: 'RIGHTWARDS HARPOON WITH BARB DOWN TO BAR',\n value: '⥗',\n codepoint: 10583,\n },\n {\n name: 'UPWARDS HARPOON WITH BARB LEFT TO BAR',\n value: '⥘',\n codepoint: 10584,\n },\n {\n name: 'DOWNWARDS HARPOON WITH BARB LEFT TO BAR',\n value: '⥙',\n codepoint: 10585,\n },\n {\n name: 'LEFTWARDS HARPOON WITH BARB UP FROM BAR',\n value: '⥚',\n codepoint: 10586,\n },\n {\n name: 'RIGHTWARDS HARPOON WITH BARB UP FROM BAR',\n value: '⥛',\n codepoint: 10587,\n },\n {\n name: 'UPWARDS HARPOON WITH BARB RIGHT FROM BAR',\n value: '⥜',\n codepoint: 10588,\n },\n {\n name: 'DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR',\n value: '⥝',\n codepoint: 10589,\n },\n {\n name: 'LEFTWARDS HARPOON WITH BARB DOWN FROM BAR',\n value: '⥞',\n codepoint: 10590,\n },\n {\n name: 'RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR',\n value: '⥟',\n codepoint: 10591,\n },\n {\n name: 'UPWARDS HARPOON WITH BARB LEFT FROM BAR',\n value: '⥠',\n codepoint: 10592,\n },\n {\n name: 'DOWNWARDS HARPOON WITH BARB LEFT FROM BAR',\n value: '⥡',\n codepoint: 10593,\n },\n {\n name: 'LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN',\n value: '⥢',\n codepoint: 10594,\n },\n {\n name: 'UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT',\n value: '⥣',\n codepoint: 10595,\n },\n {\n name: 'RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN',\n value: '⥤',\n codepoint: 10596,\n },\n {\n name: 'DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT',\n value: '⥥',\n codepoint: 10597,\n },\n {\n name: 'LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP',\n value: '⥦',\n codepoint: 10598,\n },\n {\n name: 'LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN',\n value: '⥧',\n codepoint: 10599,\n },\n {\n name: 'RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP',\n value: '⥨',\n codepoint: 10600,\n },\n {\n name: 'RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN',\n value: '⥩',\n codepoint: 10601,\n },\n {\n name: 'LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH',\n value: '⥪',\n codepoint: 10602,\n },\n {\n name: 'LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH',\n value: '⥫',\n codepoint: 10603,\n },\n {\n name: 'RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH',\n value: '⥬',\n codepoint: 10604,\n },\n {\n name: 'RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH',\n value: '⥭',\n codepoint: 10605,\n },\n {\n name: 'UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT',\n value: '⥮',\n codepoint: 10606,\n },\n {\n name: 'DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT',\n value: '⥯',\n codepoint: 10607,\n },\n {\n name: 'RIGHT DOUBLE ARROW WITH ROUNDED HEAD',\n value: '⥰',\n codepoint: 10608,\n },\n {\n name: 'EQUALS SIGN ABOVE RIGHTWARDS ARROW',\n value: '⥱',\n codepoint: 10609,\n },\n {\n name: 'TILDE OPERATOR ABOVE RIGHTWARDS ARROW',\n value: '⥲',\n codepoint: 10610,\n },\n {\n name: 'LEFTWARDS ARROW ABOVE TILDE OPERATOR',\n value: '⥳',\n codepoint: 10611,\n },\n {\n name: 'RIGHTWARDS ARROW ABOVE TILDE OPERATOR',\n value: '⥴',\n codepoint: 10612,\n },\n {\n name: 'RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO',\n value: '⥵',\n codepoint: 10613,\n },\n {\n name: 'LESS-THAN ABOVE LEFTWARDS ARROW',\n value: '⥶',\n codepoint: 10614,\n },\n {\n name: 'LEFTWARDS ARROW THROUGH LESS-THAN',\n value: '⥷',\n codepoint: 10615,\n },\n {\n name: 'GREATER-THAN ABOVE RIGHTWARDS ARROW',\n value: '⥸',\n codepoint: 10616,\n },\n {\n name: 'SUBSET ABOVE RIGHTWARDS ARROW',\n value: '⥹',\n codepoint: 10617,\n },\n {\n name: 'LEFTWARDS ARROW THROUGH SUBSET',\n value: '⥺',\n codepoint: 10618,\n },\n {\n name: 'SUPERSET ABOVE LEFTWARDS ARROW',\n value: '⥻',\n codepoint: 10619,\n },\n {\n name: 'LEFT FISH TAIL',\n value: '⥼',\n codepoint: 10620,\n },\n {\n name: 'RIGHT FISH TAIL',\n value: '⥽',\n codepoint: 10621,\n },\n {\n name: 'UP FISH TAIL',\n value: '⥾',\n codepoint: 10622,\n },\n {\n name: 'DOWN FISH TAIL',\n value: '⥿',\n codepoint: 10623,\n },\n {\n name: 'NORTH EAST WHITE ARROW',\n value: '⬀',\n codepoint: 11008,\n },\n {\n name: 'NORTH WEST WHITE ARROW',\n value: '⬁',\n codepoint: 11009,\n },\n {\n name: 'SOUTH EAST WHITE ARROW',\n value: '⬂',\n codepoint: 11010,\n },\n {\n name: 'SOUTH WEST WHITE ARROW',\n value: '⬃',\n codepoint: 11011,\n },\n {\n name: 'LEFT RIGHT WHITE ARROW',\n value: '⬄',\n codepoint: 11012,\n },\n {\n name: 'NORTH EAST BLACK ARROW',\n value: '⬈',\n codepoint: 11016,\n },\n {\n name: 'NORTH WEST BLACK ARROW',\n value: '⬉',\n codepoint: 11017,\n },\n {\n name: 'SOUTH EAST BLACK ARROW',\n value: '⬊',\n codepoint: 11018,\n },\n {\n name: 'SOUTH WEST BLACK ARROW',\n value: '⬋',\n codepoint: 11019,\n },\n {\n name: 'LEFT RIGHT BLACK ARROW',\n value: '⬌',\n codepoint: 11020,\n },\n {\n name: 'UP DOWN BLACK ARROW',\n value: '⬍',\n codepoint: 11021,\n },\n {\n name: 'RIGHTWARDS ARROW WITH TIP DOWNWARDS',\n value: '⬎',\n codepoint: 11022,\n },\n {\n name: 'RIGHTWARDS ARROW WITH TIP UPWARDS',\n value: '⬏',\n codepoint: 11023,\n },\n {\n name: 'LEFTWARDS ARROW WITH TIP DOWNWARDS',\n value: '⬐',\n codepoint: 11024,\n },\n {\n name: 'LEFTWARDS ARROW WITH TIP UPWARDS',\n value: '⬑',\n codepoint: 11025,\n },\n {\n name: 'SQUARE WITH TOP HALF BLACK',\n value: '⬒',\n codepoint: 11026,\n },\n {\n name: 'SQUARE WITH BOTTOM HALF BLACK',\n value: '⬓',\n codepoint: 11027,\n },\n {\n name: 'SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK',\n value: '⬔',\n codepoint: 11028,\n },\n {\n name: 'SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK',\n value: '⬕',\n codepoint: 11029,\n },\n {\n name: 'DIAMOND WITH LEFT HALF BLACK',\n value: '⬖',\n codepoint: 11030,\n },\n {\n name: 'DIAMOND WITH RIGHT HALF BLACK',\n value: '⬗',\n codepoint: 11031,\n },\n {\n name: 'DIAMOND WITH TOP HALF BLACK',\n value: '⬘',\n codepoint: 11032,\n },\n {\n name: 'DIAMOND WITH BOTTOM HALF BLACK',\n value: '⬙',\n codepoint: 11033,\n },\n {\n name: 'DOTTED SQUARE',\n value: '⬚',\n codepoint: 11034,\n },\n {\n name: 'BLACK VERY SMALL SQUARE',\n value: '⬝',\n codepoint: 11037,\n },\n {\n name: 'WHITE VERY SMALL SQUARE',\n value: '⬞',\n codepoint: 11038,\n },\n {\n name: 'BLACK PENTAGON',\n value: '⬟',\n codepoint: 11039,\n },\n {\n name: 'WHITE PENTAGON',\n value: '⬠',\n codepoint: 11040,\n },\n {\n name: 'WHITE HEXAGON',\n value: '⬡',\n codepoint: 11041,\n },\n {\n name: 'BLACK HEXAGON',\n value: '⬢',\n codepoint: 11042,\n },\n {\n name: 'HORIZONTAL BLACK HEXAGON',\n value: '⬣',\n codepoint: 11043,\n },\n {\n name: 'BLACK LARGE CIRCLE',\n value: '⬤',\n codepoint: 11044,\n },\n {\n name: 'BLACK MEDIUM DIAMOND',\n value: '⬥',\n codepoint: 11045,\n },\n {\n name: 'WHITE MEDIUM DIAMOND',\n value: '⬦',\n codepoint: 11046,\n },\n {\n name: 'BLACK MEDIUM LOZENGE',\n value: '⬧',\n codepoint: 11047,\n },\n {\n name: 'WHITE MEDIUM LOZENGE',\n value: '⬨',\n codepoint: 11048,\n },\n {\n name: 'BLACK SMALL DIAMOND',\n value: '⬩',\n codepoint: 11049,\n },\n {\n name: 'BLACK SMALL LOZENGE',\n value: '⬪',\n codepoint: 11050,\n },\n {\n name: 'WHITE SMALL LOZENGE',\n value: '⬫',\n codepoint: 11051,\n },\n {\n name: 'BLACK HORIZONTAL ELLIPSE',\n value: '⬬',\n codepoint: 11052,\n },\n {\n name: 'WHITE HORIZONTAL ELLIPSE',\n value: '⬭',\n codepoint: 11053,\n },\n {\n name: 'BLACK VERTICAL ELLIPSE',\n value: '⬮',\n codepoint: 11054,\n },\n {\n name: 'WHITE VERTICAL ELLIPSE',\n value: '⬯',\n codepoint: 11055,\n },\n {\n name: 'LEFT ARROW WITH SMALL CIRCLE',\n value: '⬰',\n codepoint: 11056,\n },\n {\n name: 'THREE LEFTWARDS ARROWS',\n value: '⬱',\n codepoint: 11057,\n },\n {\n name: 'LEFT ARROW WITH CIRCLED PLUS',\n value: '⬲',\n codepoint: 11058,\n },\n {\n name: 'LONG LEFTWARDS SQUIGGLE ARROW',\n value: '⬳',\n codepoint: 11059,\n },\n {\n name: 'LEFTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE',\n value: '⬴',\n codepoint: 11060,\n },\n {\n name: 'LEFTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE',\n value: '⬵',\n codepoint: 11061,\n },\n {\n name: 'LEFTWARDS TWO-HEADED ARROW FROM BAR',\n value: '⬶',\n codepoint: 11062,\n },\n {\n name: 'LEFTWARDS TWO-HEADED TRIPLE DASH ARROW',\n value: '⬷',\n codepoint: 11063,\n },\n {\n name: 'LEFTWARDS ARROW WITH DOTTED STEM',\n value: '⬸',\n codepoint: 11064,\n },\n {\n name: 'LEFTWARDS ARROW WITH TAIL WITH VERTICAL STROKE',\n value: '⬹',\n codepoint: 11065,\n },\n {\n name: 'LEFTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE',\n value: '⬺',\n codepoint: 11066,\n },\n {\n name: 'LEFTWARDS TWO-HEADED ARROW WITH TAIL',\n value: '⬻',\n codepoint: 11067,\n },\n {\n name: 'LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE',\n value: '⬼',\n codepoint: 11068,\n },\n {\n name: 'LEFTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE',\n value: '⬽',\n codepoint: 11069,\n },\n {\n name: 'LEFTWARDS ARROW THROUGH X',\n value: '⬾',\n codepoint: 11070,\n },\n {\n name: 'WAVE ARROW POINTING DIRECTLY LEFT',\n value: '⬿',\n codepoint: 11071,\n },\n {\n name: 'EQUALS SIGN ABOVE LEFTWARDS ARROW',\n value: '⭀',\n codepoint: 11072,\n },\n {\n name: 'REVERSE TILDE OPERATOR ABOVE LEFTWARDS ARROW',\n value: '⭁',\n codepoint: 11073,\n },\n {\n name: 'LEFTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO',\n value: '⭂',\n codepoint: 11074,\n },\n {\n name: 'RIGHTWARDS ARROW THROUGH GREATER-THAN',\n value: '⭃',\n codepoint: 11075,\n },\n {\n name: 'RIGHTWARDS ARROW THROUGH SUPERSET',\n value: '⭄',\n codepoint: 11076,\n },\n {\n name: 'LEFTWARDS QUADRUPLE ARROW',\n value: '⭅',\n codepoint: 11077,\n },\n {\n name: 'RIGHTWARDS QUADRUPLE ARROW',\n value: '⭆',\n codepoint: 11078,\n },\n {\n name: 'REVERSE TILDE OPERATOR ABOVE RIGHTWARDS ARROW',\n value: '⭇',\n codepoint: 11079,\n },\n {\n name: 'RIGHTWARDS ARROW ABOVE REVERSE ALMOST EQUAL TO',\n value: '⭈',\n codepoint: 11080,\n },\n {\n name: 'TILDE OPERATOR ABOVE LEFTWARDS ARROW',\n value: '⭉',\n codepoint: 11081,\n },\n {\n name: 'LEFTWARDS ARROW ABOVE ALMOST EQUAL TO',\n value: '⭊',\n codepoint: 11082,\n },\n {\n name: 'LEFTWARDS ARROW ABOVE REVERSE TILDE OPERATOR',\n value: '⭋',\n codepoint: 11083,\n },\n {\n name: 'RIGHTWARDS ARROW ABOVE REVERSE TILDE OPERATOR',\n value: '⭌',\n codepoint: 11084,\n },\n {\n name: 'BLACK SMALL STAR',\n value: '⭑',\n codepoint: 11089,\n },\n {\n name: 'WHITE SMALL STAR',\n value: '⭒',\n codepoint: 11090,\n },\n {\n name: 'BLACK RIGHT-POINTING PENTAGON',\n value: '⭓',\n codepoint: 11091,\n },\n {\n name: 'WHITE RIGHT-POINTING PENTAGON',\n value: '⭔',\n codepoint: 11092,\n },\n ],\n },\n {\n name: 'Ancient',\n symbols: [\n {\n name: 'GREEK ACROPHONIC ATTIC ONE QUARTER',\n value: '𐅀',\n codepoint: 65856,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC ONE HALF',\n value: '𐅁',\n codepoint: 65857,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC ONE DRACHMA',\n value: '𐅂',\n codepoint: 65858,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC FIVE',\n value: '𐅃',\n codepoint: 65859,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC FIVE THOUSAND',\n value: '𐅆',\n codepoint: 65862,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC FIFTY THOUSAND',\n value: '𐅇',\n codepoint: 65863,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC FIVE TALENTS',\n value: '𐅈',\n codepoint: 65864,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC TEN TALENTS',\n value: '𐅉',\n codepoint: 65865,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC FIFTY TALENTS',\n value: '𐅊',\n codepoint: 65866,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS',\n value: '𐅋',\n codepoint: 65867,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS',\n value: '𐅌',\n codepoint: 65868,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS',\n value: '𐅍',\n codepoint: 65869,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS',\n value: '𐅎',\n codepoint: 65870,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC FIVE STATERS',\n value: '𐅏',\n codepoint: 65871,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC TEN STATERS',\n value: '𐅐',\n codepoint: 65872,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC FIFTY STATERS',\n value: '𐅑',\n codepoint: 65873,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS',\n value: '𐅒',\n codepoint: 65874,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS',\n value: '𐅓',\n codepoint: 65875,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS',\n value: '𐅔',\n codepoint: 65876,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS',\n value: '𐅕',\n codepoint: 65877,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS',\n value: '𐅖',\n codepoint: 65878,\n },\n {\n name: 'GREEK ACROPHONIC ATTIC TEN MNAS',\n value: '𐅗',\n codepoint: 65879,\n },\n {\n name: 'GREEK ACROPHONIC HERAEUM ONE PLETHRON',\n value: '𐅘',\n codepoint: 65880,\n },\n {\n name: 'GREEK ACROPHONIC THESPIAN ONE',\n value: '𐅙',\n codepoint: 65881,\n },\n {\n name: 'GREEK ACROPHONIC HERMIONIAN ONE',\n value: '𐅚',\n codepoint: 65882,\n },\n {\n name: 'GREEK ACROPHONIC EPIDAUREAN TWO',\n value: '𐅛',\n codepoint: 65883,\n },\n {\n name: 'GREEK ACROPHONIC THESPIAN TWO',\n value: '𐅜',\n codepoint: 65884,\n },\n {\n name: 'GREEK ACROPHONIC CYRENAIC TWO DRACHMAS',\n value: '𐅝',\n codepoint: 65885,\n },\n {\n name: 'GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS',\n value: '𐅞',\n codepoint: 65886,\n },\n {\n name: 'GREEK ACROPHONIC TROEZENIAN FIVE',\n value: '𐅟',\n codepoint: 65887,\n },\n {\n name: 'GREEK ACROPHONIC TROEZENIAN TEN',\n value: '𐅠',\n codepoint: 65888,\n },\n {\n name: 'GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM',\n value: '𐅡',\n codepoint: 65889,\n },\n {\n name: 'GREEK ACROPHONIC HERMIONIAN TEN',\n value: '𐅢',\n codepoint: 65890,\n },\n {\n name: 'GREEK ACROPHONIC MESSENIAN TEN',\n value: '𐅣',\n codepoint: 65891,\n },\n {\n name: 'GREEK ACROPHONIC THESPIAN TEN',\n value: '𐅤',\n codepoint: 65892,\n },\n {\n name: 'GREEK ACROPHONIC THESPIAN THIRTY',\n value: '𐅥',\n codepoint: 65893,\n },\n {\n name: 'GREEK ACROPHONIC TROEZENIAN FIFTY',\n value: '𐅦',\n codepoint: 65894,\n },\n {\n name: 'GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM',\n value: '𐅧',\n codepoint: 65895,\n },\n {\n name: 'GREEK ACROPHONIC HERMIONIAN FIFTY',\n value: '𐅨',\n codepoint: 65896,\n },\n {\n name: 'GREEK ACROPHONIC THESPIAN FIFTY',\n value: '𐅩',\n codepoint: 65897,\n },\n {\n name: 'GREEK ACROPHONIC THESPIAN ONE HUNDRED',\n value: '𐅪',\n codepoint: 65898,\n },\n {\n name: 'GREEK ACROPHONIC THESPIAN THREE HUNDRED',\n value: '𐅫',\n codepoint: 65899,\n },\n {\n name: 'GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED',\n value: '𐅬',\n codepoint: 65900,\n },\n {\n name: 'GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED',\n value: '𐅭',\n codepoint: 65901,\n },\n {\n name: 'GREEK ACROPHONIC THESPIAN FIVE HUNDRED',\n value: '𐅮',\n codepoint: 65902,\n },\n {\n name: 'GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED',\n value: '𐅯',\n codepoint: 65903,\n },\n {\n name: 'GREEK ACROPHONIC NAXIAN FIVE HUNDRED',\n value: '𐅰',\n codepoint: 65904,\n },\n {\n name: 'GREEK ACROPHONIC THESPIAN ONE THOUSAND',\n value: '𐅱',\n codepoint: 65905,\n },\n {\n name: 'GREEK ACROPHONIC THESPIAN FIVE THOUSAND',\n value: '𐅲',\n codepoint: 65906,\n },\n {\n name: 'GREEK ACROPHONIC DELPHIC FIVE MNAS',\n value: '𐅳',\n codepoint: 65907,\n },\n {\n name: 'GREEK ACROPHONIC STRATIAN FIFTY MNAS',\n value: '𐅴',\n codepoint: 65908,\n },\n {\n name: 'GREEK ONE HALF SIGN',\n value: '𐅵',\n codepoint: 65909,\n },\n {\n name: 'GREEK YEAR SIGN',\n value: '𐅹',\n codepoint: 65913,\n },\n {\n name: 'GREEK TALENT SIGN',\n value: '𐅺',\n codepoint: 65914,\n },\n {\n name: 'GREEK DRACHMA SIGN',\n value: '𐅻',\n codepoint: 65915,\n },\n {\n name: 'GREEK OBOL SIGN',\n value: '𐅼',\n codepoint: 65916,\n },\n {\n name: 'GREEK TWO OBOLS SIGN',\n value: '𐅽',\n codepoint: 65917,\n },\n {\n name: 'GREEK THREE OBOLS SIGN',\n value: '𐅾',\n codepoint: 65918,\n },\n {\n name: 'GREEK FOUR OBOLS SIGN',\n value: '𐅿',\n codepoint: 65919,\n },\n {\n name: 'GREEK FIVE OBOLS SIGN',\n value: '𐆀',\n codepoint: 65920,\n },\n {\n name: 'GREEK METRETES SIGN',\n value: '𐆁',\n codepoint: 65921,\n },\n {\n name: 'GREEK KYATHOS BASE SIGN',\n value: '𐆂',\n codepoint: 65922,\n },\n {\n name: 'GREEK OUNKIA SIGN',\n value: '𐆄',\n codepoint: 65924,\n },\n {\n name: 'GREEK XESTES SIGN',\n value: '𐆅',\n codepoint: 65925,\n },\n {\n name: 'GREEK ARTABE SIGN',\n value: '𐆆',\n codepoint: 65926,\n },\n {\n name: 'GREEK ZERO SIGN',\n value: '𐆊',\n codepoint: 65930,\n },\n {\n name: 'ROMAN SEXTANS SIGN',\n value: '𐆐',\n codepoint: 65936,\n },\n {\n name: 'ROMAN UNCIA SIGN',\n value: '𐆑',\n codepoint: 65937,\n },\n {\n name: 'ROMAN SEMUNCIA SIGN',\n value: '𐆒',\n codepoint: 65938,\n },\n {\n name: 'ROMAN SEXTULA SIGN',\n value: '𐆓',\n codepoint: 65939,\n },\n {\n name: 'ROMAN DIMIDIA SEXTULA SIGN',\n value: '𐆔',\n codepoint: 65940,\n },\n {\n name: 'ROMAN SILIQUA SIGN',\n value: '𐆕',\n codepoint: 65941,\n },\n {\n name: 'ROMAN DENARIUS SIGN',\n value: '𐆖',\n codepoint: 65942,\n },\n {\n name: 'ROMAN QUINARIUS SIGN',\n value: '𐆗',\n codepoint: 65943,\n },\n {\n name: 'ROMAN SESTERTIUS SIGN',\n value: '𐆘',\n codepoint: 65944,\n },\n {\n name: 'ROMAN DUPONDIUS SIGN',\n value: '𐆙',\n codepoint: 65945,\n },\n {\n name: 'ROMAN AS SIGN',\n value: '𐆚',\n codepoint: 65946,\n },\n {\n name: 'ROMAN CENTURIAL SIGN',\n value: '𐆛',\n codepoint: 65947,\n },\n ],\n },\n {\n name: 'Braille',\n symbols: [\n {\n name: 'BRAILLE PATTERN BLANK',\n value: '⠀',\n codepoint: 10240,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1',\n value: '⠁',\n codepoint: 10241,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2',\n value: '⠂',\n codepoint: 10242,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12',\n value: '⠃',\n codepoint: 10243,\n },\n {\n name: 'BRAILLE PATTERN DOTS-3',\n value: '⠄',\n codepoint: 10244,\n },\n {\n name: 'BRAILLE PATTERN DOTS-13',\n value: '⠅',\n codepoint: 10245,\n },\n {\n name: 'BRAILLE PATTERN DOTS-23',\n value: '⠆',\n codepoint: 10246,\n },\n {\n name: 'BRAILLE PATTERN DOTS-123',\n value: '⠇',\n codepoint: 10247,\n },\n {\n name: 'BRAILLE PATTERN DOTS-4',\n value: '⠈',\n codepoint: 10248,\n },\n {\n name: 'BRAILLE PATTERN DOTS-14',\n value: '⠉',\n codepoint: 10249,\n },\n {\n name: 'BRAILLE PATTERN DOTS-24',\n value: '⠊',\n codepoint: 10250,\n },\n {\n name: 'BRAILLE PATTERN DOTS-124',\n value: '⠋',\n codepoint: 10251,\n },\n {\n name: 'BRAILLE PATTERN DOTS-34',\n value: '⠌',\n codepoint: 10252,\n },\n {\n name: 'BRAILLE PATTERN DOTS-134',\n value: '⠍',\n codepoint: 10253,\n },\n {\n name: 'BRAILLE PATTERN DOTS-234',\n value: '⠎',\n codepoint: 10254,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1234',\n value: '⠏',\n codepoint: 10255,\n },\n {\n name: 'BRAILLE PATTERN DOTS-5',\n value: '⠐',\n codepoint: 10256,\n },\n {\n name: 'BRAILLE PATTERN DOTS-15',\n value: '⠑',\n codepoint: 10257,\n },\n {\n name: 'BRAILLE PATTERN DOTS-25',\n value: '⠒',\n codepoint: 10258,\n },\n {\n name: 'BRAILLE PATTERN DOTS-125',\n value: '⠓',\n codepoint: 10259,\n },\n {\n name: 'BRAILLE PATTERN DOTS-35',\n value: '⠔',\n codepoint: 10260,\n },\n {\n name: 'BRAILLE PATTERN DOTS-135',\n value: '⠕',\n codepoint: 10261,\n },\n {\n name: 'BRAILLE PATTERN DOTS-235',\n value: '⠖',\n codepoint: 10262,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1235',\n value: '⠗',\n codepoint: 10263,\n },\n {\n name: 'BRAILLE PATTERN DOTS-45',\n value: '⠘',\n codepoint: 10264,\n },\n {\n name: 'BRAILLE PATTERN DOTS-145',\n value: '⠙',\n codepoint: 10265,\n },\n {\n name: 'BRAILLE PATTERN DOTS-245',\n value: '⠚',\n codepoint: 10266,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1245',\n value: '⠛',\n codepoint: 10267,\n },\n {\n name: 'BRAILLE PATTERN DOTS-345',\n value: '⠜',\n codepoint: 10268,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1345',\n value: '⠝',\n codepoint: 10269,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2345',\n value: '⠞',\n codepoint: 10270,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12345',\n value: '⠟',\n codepoint: 10271,\n },\n {\n name: 'BRAILLE PATTERN DOTS-6',\n value: '⠠',\n codepoint: 10272,\n },\n {\n name: 'BRAILLE PATTERN DOTS-16',\n value: '⠡',\n codepoint: 10273,\n },\n {\n name: 'BRAILLE PATTERN DOTS-26',\n value: '⠢',\n codepoint: 10274,\n },\n {\n name: 'BRAILLE PATTERN DOTS-126',\n value: '⠣',\n codepoint: 10275,\n },\n {\n name: 'BRAILLE PATTERN DOTS-36',\n value: '⠤',\n codepoint: 10276,\n },\n {\n name: 'BRAILLE PATTERN DOTS-136',\n value: '⠥',\n codepoint: 10277,\n },\n {\n name: 'BRAILLE PATTERN DOTS-236',\n value: '⠦',\n codepoint: 10278,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1236',\n value: '⠧',\n codepoint: 10279,\n },\n {\n name: 'BRAILLE PATTERN DOTS-46',\n value: '⠨',\n codepoint: 10280,\n },\n {\n name: 'BRAILLE PATTERN DOTS-146',\n value: '⠩',\n codepoint: 10281,\n },\n {\n name: 'BRAILLE PATTERN DOTS-246',\n value: '⠪',\n codepoint: 10282,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1246',\n value: '⠫',\n codepoint: 10283,\n },\n {\n name: 'BRAILLE PATTERN DOTS-346',\n value: '⠬',\n codepoint: 10284,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1346',\n value: '⠭',\n codepoint: 10285,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2346',\n value: '⠮',\n codepoint: 10286,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12346',\n value: '⠯',\n codepoint: 10287,\n },\n {\n name: 'BRAILLE PATTERN DOTS-56',\n value: '⠰',\n codepoint: 10288,\n },\n {\n name: 'BRAILLE PATTERN DOTS-156',\n value: '⠱',\n codepoint: 10289,\n },\n {\n name: 'BRAILLE PATTERN DOTS-256',\n value: '⠲',\n codepoint: 10290,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1256',\n value: '⠳',\n codepoint: 10291,\n },\n {\n name: 'BRAILLE PATTERN DOTS-356',\n value: '⠴',\n codepoint: 10292,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1356',\n value: '⠵',\n codepoint: 10293,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2356',\n value: '⠶',\n codepoint: 10294,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12356',\n value: '⠷',\n codepoint: 10295,\n },\n {\n name: 'BRAILLE PATTERN DOTS-456',\n value: '⠸',\n codepoint: 10296,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1456',\n value: '⠹',\n codepoint: 10297,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2456',\n value: '⠺',\n codepoint: 10298,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12456',\n value: '⠻',\n codepoint: 10299,\n },\n {\n name: 'BRAILLE PATTERN DOTS-3456',\n value: '⠼',\n codepoint: 10300,\n },\n {\n name: 'BRAILLE PATTERN DOTS-13456',\n value: '⠽',\n codepoint: 10301,\n },\n {\n name: 'BRAILLE PATTERN DOTS-23456',\n value: '⠾',\n codepoint: 10302,\n },\n {\n name: 'BRAILLE PATTERN DOTS-123456',\n value: '⠿',\n codepoint: 10303,\n },\n {\n name: 'BRAILLE PATTERN DOTS-7',\n value: '⡀',\n codepoint: 10304,\n },\n {\n name: 'BRAILLE PATTERN DOTS-17',\n value: '⡁',\n codepoint: 10305,\n },\n {\n name: 'BRAILLE PATTERN DOTS-27',\n value: '⡂',\n codepoint: 10306,\n },\n {\n name: 'BRAILLE PATTERN DOTS-127',\n value: '⡃',\n codepoint: 10307,\n },\n {\n name: 'BRAILLE PATTERN DOTS-37',\n value: '⡄',\n codepoint: 10308,\n },\n {\n name: 'BRAILLE PATTERN DOTS-137',\n value: '⡅',\n codepoint: 10309,\n },\n {\n name: 'BRAILLE PATTERN DOTS-237',\n value: '⡆',\n codepoint: 10310,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1237',\n value: '⡇',\n codepoint: 10311,\n },\n {\n name: 'BRAILLE PATTERN DOTS-47',\n value: '⡈',\n codepoint: 10312,\n },\n {\n name: 'BRAILLE PATTERN DOTS-147',\n value: '⡉',\n codepoint: 10313,\n },\n {\n name: 'BRAILLE PATTERN DOTS-247',\n value: '⡊',\n codepoint: 10314,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1247',\n value: '⡋',\n codepoint: 10315,\n },\n {\n name: 'BRAILLE PATTERN DOTS-347',\n value: '⡌',\n codepoint: 10316,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1347',\n value: '⡍',\n codepoint: 10317,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2347',\n value: '⡎',\n codepoint: 10318,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12347',\n value: '⡏',\n codepoint: 10319,\n },\n {\n name: 'BRAILLE PATTERN DOTS-57',\n value: '⡐',\n codepoint: 10320,\n },\n {\n name: 'BRAILLE PATTERN DOTS-157',\n value: '⡑',\n codepoint: 10321,\n },\n {\n name: 'BRAILLE PATTERN DOTS-257',\n value: '⡒',\n codepoint: 10322,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1257',\n value: '⡓',\n codepoint: 10323,\n },\n {\n name: 'BRAILLE PATTERN DOTS-357',\n value: '⡔',\n codepoint: 10324,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1357',\n value: '⡕',\n codepoint: 10325,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2357',\n value: '⡖',\n codepoint: 10326,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12357',\n value: '⡗',\n codepoint: 10327,\n },\n {\n name: 'BRAILLE PATTERN DOTS-457',\n value: '⡘',\n codepoint: 10328,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1457',\n value: '⡙',\n codepoint: 10329,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2457',\n value: '⡚',\n codepoint: 10330,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12457',\n value: '⡛',\n codepoint: 10331,\n },\n {\n name: 'BRAILLE PATTERN DOTS-3457',\n value: '⡜',\n codepoint: 10332,\n },\n {\n name: 'BRAILLE PATTERN DOTS-13457',\n value: '⡝',\n codepoint: 10333,\n },\n {\n name: 'BRAILLE PATTERN DOTS-23457',\n value: '⡞',\n codepoint: 10334,\n },\n {\n name: 'BRAILLE PATTERN DOTS-123457',\n value: '⡟',\n codepoint: 10335,\n },\n {\n name: 'BRAILLE PATTERN DOTS-67',\n value: '⡠',\n codepoint: 10336,\n },\n {\n name: 'BRAILLE PATTERN DOTS-167',\n value: '⡡',\n codepoint: 10337,\n },\n {\n name: 'BRAILLE PATTERN DOTS-267',\n value: '⡢',\n codepoint: 10338,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1267',\n value: '⡣',\n codepoint: 10339,\n },\n {\n name: 'BRAILLE PATTERN DOTS-367',\n value: '⡤',\n codepoint: 10340,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1367',\n value: '⡥',\n codepoint: 10341,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2367',\n value: '⡦',\n codepoint: 10342,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12367',\n value: '⡧',\n codepoint: 10343,\n },\n {\n name: 'BRAILLE PATTERN DOTS-467',\n value: '⡨',\n codepoint: 10344,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1467',\n value: '⡩',\n codepoint: 10345,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2467',\n value: '⡪',\n codepoint: 10346,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12467',\n value: '⡫',\n codepoint: 10347,\n },\n {\n name: 'BRAILLE PATTERN DOTS-3467',\n value: '⡬',\n codepoint: 10348,\n },\n {\n name: 'BRAILLE PATTERN DOTS-13467',\n value: '⡭',\n codepoint: 10349,\n },\n {\n name: 'BRAILLE PATTERN DOTS-23467',\n value: '⡮',\n codepoint: 10350,\n },\n {\n name: 'BRAILLE PATTERN DOTS-123467',\n value: '⡯',\n codepoint: 10351,\n },\n {\n name: 'BRAILLE PATTERN DOTS-567',\n value: '⡰',\n codepoint: 10352,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1567',\n value: '⡱',\n codepoint: 10353,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2567',\n value: '⡲',\n codepoint: 10354,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12567',\n value: '⡳',\n codepoint: 10355,\n },\n {\n name: 'BRAILLE PATTERN DOTS-3567',\n value: '⡴',\n codepoint: 10356,\n },\n {\n name: 'BRAILLE PATTERN DOTS-13567',\n value: '⡵',\n codepoint: 10357,\n },\n {\n name: 'BRAILLE PATTERN DOTS-23567',\n value: '⡶',\n codepoint: 10358,\n },\n {\n name: 'BRAILLE PATTERN DOTS-123567',\n value: '⡷',\n codepoint: 10359,\n },\n {\n name: 'BRAILLE PATTERN DOTS-4567',\n value: '⡸',\n codepoint: 10360,\n },\n {\n name: 'BRAILLE PATTERN DOTS-14567',\n value: '⡹',\n codepoint: 10361,\n },\n {\n name: 'BRAILLE PATTERN DOTS-24567',\n value: '⡺',\n codepoint: 10362,\n },\n {\n name: 'BRAILLE PATTERN DOTS-124567',\n value: '⡻',\n codepoint: 10363,\n },\n {\n name: 'BRAILLE PATTERN DOTS-34567',\n value: '⡼',\n codepoint: 10364,\n },\n {\n name: 'BRAILLE PATTERN DOTS-134567',\n value: '⡽',\n codepoint: 10365,\n },\n {\n name: 'BRAILLE PATTERN DOTS-234567',\n value: '⡾',\n codepoint: 10366,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1234567',\n value: '⡿',\n codepoint: 10367,\n },\n {\n name: 'BRAILLE PATTERN DOTS-8',\n value: '⢀',\n codepoint: 10368,\n },\n {\n name: 'BRAILLE PATTERN DOTS-18',\n value: '⢁',\n codepoint: 10369,\n },\n {\n name: 'BRAILLE PATTERN DOTS-28',\n value: '⢂',\n codepoint: 10370,\n },\n {\n name: 'BRAILLE PATTERN DOTS-128',\n value: '⢃',\n codepoint: 10371,\n },\n {\n name: 'BRAILLE PATTERN DOTS-38',\n value: '⢄',\n codepoint: 10372,\n },\n {\n name: 'BRAILLE PATTERN DOTS-138',\n value: '⢅',\n codepoint: 10373,\n },\n {\n name: 'BRAILLE PATTERN DOTS-238',\n value: '⢆',\n codepoint: 10374,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1238',\n value: '⢇',\n codepoint: 10375,\n },\n {\n name: 'BRAILLE PATTERN DOTS-48',\n value: '⢈',\n codepoint: 10376,\n },\n {\n name: 'BRAILLE PATTERN DOTS-148',\n value: '⢉',\n codepoint: 10377,\n },\n {\n name: 'BRAILLE PATTERN DOTS-248',\n value: '⢊',\n codepoint: 10378,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1248',\n value: '⢋',\n codepoint: 10379,\n },\n {\n name: 'BRAILLE PATTERN DOTS-348',\n value: '⢌',\n codepoint: 10380,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1348',\n value: '⢍',\n codepoint: 10381,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2348',\n value: '⢎',\n codepoint: 10382,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12348',\n value: '⢏',\n codepoint: 10383,\n },\n {\n name: 'BRAILLE PATTERN DOTS-58',\n value: '⢐',\n codepoint: 10384,\n },\n {\n name: 'BRAILLE PATTERN DOTS-158',\n value: '⢑',\n codepoint: 10385,\n },\n {\n name: 'BRAILLE PATTERN DOTS-258',\n value: '⢒',\n codepoint: 10386,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1258',\n value: '⢓',\n codepoint: 10387,\n },\n {\n name: 'BRAILLE PATTERN DOTS-358',\n value: '⢔',\n codepoint: 10388,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1358',\n value: '⢕',\n codepoint: 10389,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2358',\n value: '⢖',\n codepoint: 10390,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12358',\n value: '⢗',\n codepoint: 10391,\n },\n {\n name: 'BRAILLE PATTERN DOTS-458',\n value: '⢘',\n codepoint: 10392,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1458',\n value: '⢙',\n codepoint: 10393,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2458',\n value: '⢚',\n codepoint: 10394,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12458',\n value: '⢛',\n codepoint: 10395,\n },\n {\n name: 'BRAILLE PATTERN DOTS-3458',\n value: '⢜',\n codepoint: 10396,\n },\n {\n name: 'BRAILLE PATTERN DOTS-13458',\n value: '⢝',\n codepoint: 10397,\n },\n {\n name: 'BRAILLE PATTERN DOTS-23458',\n value: '⢞',\n codepoint: 10398,\n },\n {\n name: 'BRAILLE PATTERN DOTS-123458',\n value: '⢟',\n codepoint: 10399,\n },\n {\n name: 'BRAILLE PATTERN DOTS-68',\n value: '⢠',\n codepoint: 10400,\n },\n {\n name: 'BRAILLE PATTERN DOTS-168',\n value: '⢡',\n codepoint: 10401,\n },\n {\n name: 'BRAILLE PATTERN DOTS-268',\n value: '⢢',\n codepoint: 10402,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1268',\n value: '⢣',\n codepoint: 10403,\n },\n {\n name: 'BRAILLE PATTERN DOTS-368',\n value: '⢤',\n codepoint: 10404,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1368',\n value: '⢥',\n codepoint: 10405,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2368',\n value: '⢦',\n codepoint: 10406,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12368',\n value: '⢧',\n codepoint: 10407,\n },\n {\n name: 'BRAILLE PATTERN DOTS-468',\n value: '⢨',\n codepoint: 10408,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1468',\n value: '⢩',\n codepoint: 10409,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2468',\n value: '⢪',\n codepoint: 10410,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12468',\n value: '⢫',\n codepoint: 10411,\n },\n {\n name: 'BRAILLE PATTERN DOTS-3468',\n value: '⢬',\n codepoint: 10412,\n },\n {\n name: 'BRAILLE PATTERN DOTS-13468',\n value: '⢭',\n codepoint: 10413,\n },\n {\n name: 'BRAILLE PATTERN DOTS-23468',\n value: '⢮',\n codepoint: 10414,\n },\n {\n name: 'BRAILLE PATTERN DOTS-123468',\n value: '⢯',\n codepoint: 10415,\n },\n {\n name: 'BRAILLE PATTERN DOTS-568',\n value: '⢰',\n codepoint: 10416,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1568',\n value: '⢱',\n codepoint: 10417,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2568',\n value: '⢲',\n codepoint: 10418,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12568',\n value: '⢳',\n codepoint: 10419,\n },\n {\n name: 'BRAILLE PATTERN DOTS-3568',\n value: '⢴',\n codepoint: 10420,\n },\n {\n name: 'BRAILLE PATTERN DOTS-13568',\n value: '⢵',\n codepoint: 10421,\n },\n {\n name: 'BRAILLE PATTERN DOTS-23568',\n value: '⢶',\n codepoint: 10422,\n },\n {\n name: 'BRAILLE PATTERN DOTS-123568',\n value: '⢷',\n codepoint: 10423,\n },\n {\n name: 'BRAILLE PATTERN DOTS-4568',\n value: '⢸',\n codepoint: 10424,\n },\n {\n name: 'BRAILLE PATTERN DOTS-14568',\n value: '⢹',\n codepoint: 10425,\n },\n {\n name: 'BRAILLE PATTERN DOTS-24568',\n value: '⢺',\n codepoint: 10426,\n },\n {\n name: 'BRAILLE PATTERN DOTS-124568',\n value: '⢻',\n codepoint: 10427,\n },\n {\n name: 'BRAILLE PATTERN DOTS-34568',\n value: '⢼',\n codepoint: 10428,\n },\n {\n name: 'BRAILLE PATTERN DOTS-134568',\n value: '⢽',\n codepoint: 10429,\n },\n {\n name: 'BRAILLE PATTERN DOTS-234568',\n value: '⢾',\n codepoint: 10430,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1234568',\n value: '⢿',\n codepoint: 10431,\n },\n {\n name: 'BRAILLE PATTERN DOTS-78',\n value: '⣀',\n codepoint: 10432,\n },\n {\n name: 'BRAILLE PATTERN DOTS-178',\n value: '⣁',\n codepoint: 10433,\n },\n {\n name: 'BRAILLE PATTERN DOTS-278',\n value: '⣂',\n codepoint: 10434,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1278',\n value: '⣃',\n codepoint: 10435,\n },\n {\n name: 'BRAILLE PATTERN DOTS-378',\n value: '⣄',\n codepoint: 10436,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1378',\n value: '⣅',\n codepoint: 10437,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2378',\n value: '⣆',\n codepoint: 10438,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12378',\n value: '⣇',\n codepoint: 10439,\n },\n {\n name: 'BRAILLE PATTERN DOTS-478',\n value: '⣈',\n codepoint: 10440,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1478',\n value: '⣉',\n codepoint: 10441,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2478',\n value: '⣊',\n codepoint: 10442,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12478',\n value: '⣋',\n codepoint: 10443,\n },\n {\n name: 'BRAILLE PATTERN DOTS-3478',\n value: '⣌',\n codepoint: 10444,\n },\n {\n name: 'BRAILLE PATTERN DOTS-13478',\n value: '⣍',\n codepoint: 10445,\n },\n {\n name: 'BRAILLE PATTERN DOTS-23478',\n value: '⣎',\n codepoint: 10446,\n },\n {\n name: 'BRAILLE PATTERN DOTS-123478',\n value: '⣏',\n codepoint: 10447,\n },\n {\n name: 'BRAILLE PATTERN DOTS-578',\n value: '⣐',\n codepoint: 10448,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1578',\n value: '⣑',\n codepoint: 10449,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2578',\n value: '⣒',\n codepoint: 10450,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12578',\n value: '⣓',\n codepoint: 10451,\n },\n {\n name: 'BRAILLE PATTERN DOTS-3578',\n value: '⣔',\n codepoint: 10452,\n },\n {\n name: 'BRAILLE PATTERN DOTS-13578',\n value: '⣕',\n codepoint: 10453,\n },\n {\n name: 'BRAILLE PATTERN DOTS-23578',\n value: '⣖',\n codepoint: 10454,\n },\n {\n name: 'BRAILLE PATTERN DOTS-123578',\n value: '⣗',\n codepoint: 10455,\n },\n {\n name: 'BRAILLE PATTERN DOTS-4578',\n value: '⣘',\n codepoint: 10456,\n },\n {\n name: 'BRAILLE PATTERN DOTS-14578',\n value: '⣙',\n codepoint: 10457,\n },\n {\n name: 'BRAILLE PATTERN DOTS-24578',\n value: '⣚',\n codepoint: 10458,\n },\n {\n name: 'BRAILLE PATTERN DOTS-124578',\n value: '⣛',\n codepoint: 10459,\n },\n {\n name: 'BRAILLE PATTERN DOTS-34578',\n value: '⣜',\n codepoint: 10460,\n },\n {\n name: 'BRAILLE PATTERN DOTS-134578',\n value: '⣝',\n codepoint: 10461,\n },\n {\n name: 'BRAILLE PATTERN DOTS-234578',\n value: '⣞',\n codepoint: 10462,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1234578',\n value: '⣟',\n codepoint: 10463,\n },\n {\n name: 'BRAILLE PATTERN DOTS-678',\n value: '⣠',\n codepoint: 10464,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1678',\n value: '⣡',\n codepoint: 10465,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2678',\n value: '⣢',\n codepoint: 10466,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12678',\n value: '⣣',\n codepoint: 10467,\n },\n {\n name: 'BRAILLE PATTERN DOTS-3678',\n value: '⣤',\n codepoint: 10468,\n },\n {\n name: 'BRAILLE PATTERN DOTS-13678',\n value: '⣥',\n codepoint: 10469,\n },\n {\n name: 'BRAILLE PATTERN DOTS-23678',\n value: '⣦',\n codepoint: 10470,\n },\n {\n name: 'BRAILLE PATTERN DOTS-123678',\n value: '⣧',\n codepoint: 10471,\n },\n {\n name: 'BRAILLE PATTERN DOTS-4678',\n value: '⣨',\n codepoint: 10472,\n },\n {\n name: 'BRAILLE PATTERN DOTS-14678',\n value: '⣩',\n codepoint: 10473,\n },\n {\n name: 'BRAILLE PATTERN DOTS-24678',\n value: '⣪',\n codepoint: 10474,\n },\n {\n name: 'BRAILLE PATTERN DOTS-124678',\n value: '⣫',\n codepoint: 10475,\n },\n {\n name: 'BRAILLE PATTERN DOTS-34678',\n value: '⣬',\n codepoint: 10476,\n },\n {\n name: 'BRAILLE PATTERN DOTS-134678',\n value: '⣭',\n codepoint: 10477,\n },\n {\n name: 'BRAILLE PATTERN DOTS-234678',\n value: '⣮',\n codepoint: 10478,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1234678',\n value: '⣯',\n codepoint: 10479,\n },\n {\n name: 'BRAILLE PATTERN DOTS-5678',\n value: '⣰',\n codepoint: 10480,\n },\n {\n name: 'BRAILLE PATTERN DOTS-15678',\n value: '⣱',\n codepoint: 10481,\n },\n {\n name: 'BRAILLE PATTERN DOTS-25678',\n value: '⣲',\n codepoint: 10482,\n },\n {\n name: 'BRAILLE PATTERN DOTS-125678',\n value: '⣳',\n codepoint: 10483,\n },\n {\n name: 'BRAILLE PATTERN DOTS-35678',\n value: '⣴',\n codepoint: 10484,\n },\n {\n name: 'BRAILLE PATTERN DOTS-135678',\n value: '⣵',\n codepoint: 10485,\n },\n {\n name: 'BRAILLE PATTERN DOTS-235678',\n value: '⣶',\n codepoint: 10486,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1235678',\n value: '⣷',\n codepoint: 10487,\n },\n {\n name: 'BRAILLE PATTERN DOTS-45678',\n value: '⣸',\n codepoint: 10488,\n },\n {\n name: 'BRAILLE PATTERN DOTS-145678',\n value: '⣹',\n codepoint: 10489,\n },\n {\n name: 'BRAILLE PATTERN DOTS-245678',\n value: '⣺',\n codepoint: 10490,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1245678',\n value: '⣻',\n codepoint: 10491,\n },\n {\n name: 'BRAILLE PATTERN DOTS-345678',\n value: '⣼',\n codepoint: 10492,\n },\n {\n name: 'BRAILLE PATTERN DOTS-1345678',\n value: '⣽',\n codepoint: 10493,\n },\n {\n name: 'BRAILLE PATTERN DOTS-2345678',\n value: '⣾',\n codepoint: 10494,\n },\n {\n name: 'BRAILLE PATTERN DOTS-12345678',\n value: '⣿',\n codepoint: 10495,\n },\n ],\n },\n {\n name: 'Currency',\n symbols: [\n {\n name: 'EURO-CURRENCY SIGN',\n value: '₠',\n codepoint: 8352,\n },\n {\n name: 'COLON SIGN',\n value: '₡',\n codepoint: 8353,\n },\n {\n name: 'CRUZEIRO SIGN',\n value: '₢',\n codepoint: 8354,\n },\n {\n name: 'FRENCH FRANC SIGN',\n value: '₣',\n codepoint: 8355,\n },\n {\n name: 'LIRA SIGN',\n value: '₤',\n codepoint: 8356,\n },\n {\n name: 'MILL SIGN',\n value: '₥',\n codepoint: 8357,\n },\n {\n name: 'NAIRA SIGN',\n value: '₦',\n codepoint: 8358,\n },\n {\n name: 'PESETA SIGN',\n value: '₧',\n codepoint: 8359,\n },\n {\n name: 'RUPEE SIGN',\n value: '₨',\n codepoint: 8360,\n },\n {\n name: 'WON SIGN',\n value: '₩',\n codepoint: 8361,\n },\n {\n name: 'NEW SHEQEL SIGN',\n value: '₪',\n codepoint: 8362,\n },\n {\n name: 'DONG SIGN',\n value: '₫',\n codepoint: 8363,\n },\n {\n name: 'EURO SIGN',\n value: '€',\n codepoint: 8364,\n },\n {\n name: 'KIP SIGN',\n value: '₭',\n codepoint: 8365,\n },\n {\n name: 'TUGRIK SIGN',\n value: '₮',\n codepoint: 8366,\n },\n {\n name: 'DRACHMA SIGN',\n value: '₯',\n codepoint: 8367,\n },\n {\n name: 'GERMAN PENNY SIGN',\n value: '₰',\n codepoint: 8368,\n },\n {\n name: 'PESO SIGN',\n value: '₱',\n codepoint: 8369,\n },\n {\n name: 'GUARANI SIGN',\n value: '₲',\n codepoint: 8370,\n },\n {\n name: 'AUSTRAL SIGN',\n value: '₳',\n codepoint: 8371,\n },\n {\n name: 'HRYVNIA SIGN',\n value: '₴',\n codepoint: 8372,\n },\n {\n name: 'CEDI SIGN',\n value: '₵',\n codepoint: 8373,\n },\n {\n name: 'LIVRE TOURNOIS SIGN',\n value: '₶',\n codepoint: 8374,\n },\n {\n name: 'SPESMILO SIGN',\n value: '₷',\n codepoint: 8375,\n },\n {\n name: 'TENGE SIGN',\n value: '₸',\n codepoint: 8376,\n },\n {\n name: 'INDIAN RUPEE SIGN',\n value: '₹',\n codepoint: 8377,\n },\n ],\n },\n {\n name: 'Game Symbols',\n symbols: [\n {\n name: 'MAHJONG TILE EAST WIND',\n value: '🀀',\n codepoint: 126976,\n },\n {\n name: 'MAHJONG TILE SOUTH WIND',\n value: '🀁',\n codepoint: 126977,\n },\n {\n name: 'MAHJONG TILE WEST WIND',\n value: '🀂',\n codepoint: 126978,\n },\n {\n name: 'MAHJONG TILE NORTH WIND',\n value: '🀃',\n codepoint: 126979,\n },\n {\n name: 'MAHJONG TILE GREEN DRAGON',\n value: '🀅',\n codepoint: 126981,\n },\n {\n name: 'MAHJONG TILE WHITE DRAGON',\n value: '🀆',\n codepoint: 126982,\n },\n {\n name: 'MAHJONG TILE ONE OF CHARACTERS',\n value: '🀇',\n codepoint: 126983,\n },\n {\n name: 'MAHJONG TILE TWO OF CHARACTERS',\n value: '🀈',\n codepoint: 126984,\n },\n {\n name: 'MAHJONG TILE THREE OF CHARACTERS',\n value: '🀉',\n codepoint: 126985,\n },\n {\n name: 'MAHJONG TILE FOUR OF CHARACTERS',\n value: '🀊',\n codepoint: 126986,\n },\n {\n name: 'MAHJONG TILE FIVE OF CHARACTERS',\n value: '🀋',\n codepoint: 126987,\n },\n {\n name: 'MAHJONG TILE SIX OF CHARACTERS',\n value: '🀌',\n codepoint: 126988,\n },\n {\n name: 'MAHJONG TILE SEVEN OF CHARACTERS',\n value: '🀍',\n codepoint: 126989,\n },\n {\n name: 'MAHJONG TILE EIGHT OF CHARACTERS',\n value: '🀎',\n codepoint: 126990,\n },\n {\n name: 'MAHJONG TILE NINE OF CHARACTERS',\n value: '🀏',\n codepoint: 126991,\n },\n {\n name: 'MAHJONG TILE ONE OF BAMBOOS',\n value: '🀐',\n codepoint: 126992,\n },\n {\n name: 'MAHJONG TILE TWO OF BAMBOOS',\n value: '🀑',\n codepoint: 126993,\n },\n {\n name: 'MAHJONG TILE THREE OF BAMBOOS',\n value: '🀒',\n codepoint: 126994,\n },\n {\n name: 'MAHJONG TILE FOUR OF BAMBOOS',\n value: '🀓',\n codepoint: 126995,\n },\n {\n name: 'MAHJONG TILE FIVE OF BAMBOOS',\n value: '🀔',\n codepoint: 126996,\n },\n {\n name: 'MAHJONG TILE SIX OF BAMBOOS',\n value: '🀕',\n codepoint: 126997,\n },\n {\n name: 'MAHJONG TILE SEVEN OF BAMBOOS',\n value: '🀖',\n codepoint: 126998,\n },\n {\n name: 'MAHJONG TILE EIGHT OF BAMBOOS',\n value: '🀗',\n codepoint: 126999,\n },\n {\n name: 'MAHJONG TILE NINE OF BAMBOOS',\n value: '🀘',\n codepoint: 127000,\n },\n {\n name: 'MAHJONG TILE ONE OF CIRCLES',\n value: '🀙',\n codepoint: 127001,\n },\n {\n name: 'MAHJONG TILE TWO OF CIRCLES',\n value: '🀚',\n codepoint: 127002,\n },\n {\n name: 'MAHJONG TILE THREE OF CIRCLES',\n value: '🀛',\n codepoint: 127003,\n },\n {\n name: 'MAHJONG TILE FOUR OF CIRCLES',\n value: '🀜',\n codepoint: 127004,\n },\n {\n name: 'MAHJONG TILE FIVE OF CIRCLES',\n value: '🀝',\n codepoint: 127005,\n },\n {\n name: 'MAHJONG TILE SIX OF CIRCLES',\n value: '🀞',\n codepoint: 127006,\n },\n {\n name: 'MAHJONG TILE SEVEN OF CIRCLES',\n value: '🀟',\n codepoint: 127007,\n },\n {\n name: 'MAHJONG TILE EIGHT OF CIRCLES',\n value: '🀠',\n codepoint: 127008,\n },\n {\n name: 'MAHJONG TILE NINE OF CIRCLES',\n value: '🀡',\n codepoint: 127009,\n },\n {\n name: 'MAHJONG TILE PLUM',\n value: '🀢',\n codepoint: 127010,\n },\n {\n name: 'MAHJONG TILE ORCHID',\n value: '🀣',\n codepoint: 127011,\n },\n {\n name: 'MAHJONG TILE BAMBOO',\n value: '🀤',\n codepoint: 127012,\n },\n {\n name: 'MAHJONG TILE CHRYSANTHEMUM',\n value: '🀥',\n codepoint: 127013,\n },\n {\n name: 'MAHJONG TILE SPRING',\n value: '🀦',\n codepoint: 127014,\n },\n {\n name: 'MAHJONG TILE SUMMER',\n value: '🀧',\n codepoint: 127015,\n },\n {\n name: 'MAHJONG TILE AUTUMN',\n value: '🀨',\n codepoint: 127016,\n },\n {\n name: 'MAHJONG TILE WINTER',\n value: '🀩',\n codepoint: 127017,\n },\n {\n name: 'MAHJONG TILE JOKER',\n value: '🀪',\n codepoint: 127018,\n },\n {\n name: 'MAHJONG TILE BACK',\n value: '🀫',\n codepoint: 127019,\n },\n {\n name: 'DOMINO TILE HORIZONTAL BACK',\n value: '🀰',\n codepoint: 127024,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-00-00',\n value: '🀱',\n codepoint: 127025,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-00-01',\n value: '🀲',\n codepoint: 127026,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-00-02',\n value: '🀳',\n codepoint: 127027,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-00-03',\n value: '🀴',\n codepoint: 127028,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-00-04',\n value: '🀵',\n codepoint: 127029,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-00-05',\n value: '🀶',\n codepoint: 127030,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-00-06',\n value: '🀷',\n codepoint: 127031,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-01-00',\n value: '🀸',\n codepoint: 127032,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-01-01',\n value: '🀹',\n codepoint: 127033,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-01-02',\n value: '🀺',\n codepoint: 127034,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-01-03',\n value: '🀻',\n codepoint: 127035,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-01-04',\n value: '🀼',\n codepoint: 127036,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-01-05',\n value: '🀽',\n codepoint: 127037,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-01-06',\n value: '🀾',\n codepoint: 127038,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-02-00',\n value: '🀿',\n codepoint: 127039,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-02-01',\n value: '🁀',\n codepoint: 127040,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-02-02',\n value: '🁁',\n codepoint: 127041,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-02-03',\n value: '🁂',\n codepoint: 127042,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-02-04',\n value: '🁃',\n codepoint: 127043,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-02-05',\n value: '🁄',\n codepoint: 127044,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-02-06',\n value: '🁅',\n codepoint: 127045,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-03-00',\n value: '🁆',\n codepoint: 127046,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-03-01',\n value: '🁇',\n codepoint: 127047,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-03-02',\n value: '🁈',\n codepoint: 127048,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-03-03',\n value: '🁉',\n codepoint: 127049,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-03-04',\n value: '🁊',\n codepoint: 127050,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-03-05',\n value: '🁋',\n codepoint: 127051,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-03-06',\n value: '🁌',\n codepoint: 127052,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-04-00',\n value: '🁍',\n codepoint: 127053,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-04-01',\n value: '🁎',\n codepoint: 127054,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-04-02',\n value: '🁏',\n codepoint: 127055,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-04-03',\n value: '🁐',\n codepoint: 127056,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-04-04',\n value: '🁑',\n codepoint: 127057,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-04-05',\n value: '🁒',\n codepoint: 127058,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-04-06',\n value: '🁓',\n codepoint: 127059,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-05-00',\n value: '🁔',\n codepoint: 127060,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-05-01',\n value: '🁕',\n codepoint: 127061,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-05-02',\n value: '🁖',\n codepoint: 127062,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-05-03',\n value: '🁗',\n codepoint: 127063,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-05-04',\n value: '🁘',\n codepoint: 127064,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-05-05',\n value: '🁙',\n codepoint: 127065,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-05-06',\n value: '🁚',\n codepoint: 127066,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-06-00',\n value: '🁛',\n codepoint: 127067,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-06-01',\n value: '🁜',\n codepoint: 127068,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-06-02',\n value: '🁝',\n codepoint: 127069,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-06-03',\n value: '🁞',\n codepoint: 127070,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-06-04',\n value: '🁟',\n codepoint: 127071,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-06-05',\n value: '🁠',\n codepoint: 127072,\n },\n {\n name: 'DOMINO TILE HORIZONTAL-06-06',\n value: '🁡',\n codepoint: 127073,\n },\n {\n name: 'DOMINO TILE VERTICAL BACK',\n value: '🁢',\n codepoint: 127074,\n },\n {\n name: 'DOMINO TILE VERTICAL-00-00',\n value: '🁣',\n codepoint: 127075,\n },\n {\n name: 'DOMINO TILE VERTICAL-00-01',\n value: '🁤',\n codepoint: 127076,\n },\n {\n name: 'DOMINO TILE VERTICAL-00-02',\n value: '🁥',\n codepoint: 127077,\n },\n {\n name: 'DOMINO TILE VERTICAL-00-03',\n value: '🁦',\n codepoint: 127078,\n },\n {\n name: 'DOMINO TILE VERTICAL-00-04',\n value: '🁧',\n codepoint: 127079,\n },\n {\n name: 'DOMINO TILE VERTICAL-00-05',\n value: '🁨',\n codepoint: 127080,\n },\n {\n name: 'DOMINO TILE VERTICAL-00-06',\n value: '🁩',\n codepoint: 127081,\n },\n {\n name: 'DOMINO TILE VERTICAL-01-00',\n value: '🁪',\n codepoint: 127082,\n },\n {\n name: 'DOMINO TILE VERTICAL-01-01',\n value: '🁫',\n codepoint: 127083,\n },\n {\n name: 'DOMINO TILE VERTICAL-01-02',\n value: '🁬',\n codepoint: 127084,\n },\n {\n name: 'DOMINO TILE VERTICAL-01-03',\n value: '🁭',\n codepoint: 127085,\n },\n {\n name: 'DOMINO TILE VERTICAL-01-04',\n value: '🁮',\n codepoint: 127086,\n },\n {\n name: 'DOMINO TILE VERTICAL-01-05',\n value: '🁯',\n codepoint: 127087,\n },\n {\n name: 'DOMINO TILE VERTICAL-01-06',\n value: '🁰',\n codepoint: 127088,\n },\n {\n name: 'DOMINO TILE VERTICAL-02-00',\n value: '🁱',\n codepoint: 127089,\n },\n {\n name: 'DOMINO TILE VERTICAL-02-01',\n value: '🁲',\n codepoint: 127090,\n },\n {\n name: 'DOMINO TILE VERTICAL-02-02',\n value: '🁳',\n codepoint: 127091,\n },\n {\n name: 'DOMINO TILE VERTICAL-02-03',\n value: '🁴',\n codepoint: 127092,\n },\n {\n name: 'DOMINO TILE VERTICAL-02-04',\n value: '🁵',\n codepoint: 127093,\n },\n {\n name: 'DOMINO TILE VERTICAL-02-05',\n value: '🁶',\n codepoint: 127094,\n },\n {\n name: 'DOMINO TILE VERTICAL-02-06',\n value: '🁷',\n codepoint: 127095,\n },\n {\n name: 'DOMINO TILE VERTICAL-03-00',\n value: '🁸',\n codepoint: 127096,\n },\n {\n name: 'DOMINO TILE VERTICAL-03-01',\n value: '🁹',\n codepoint: 127097,\n },\n {\n name: 'DOMINO TILE VERTICAL-03-02',\n value: '🁺',\n codepoint: 127098,\n },\n {\n name: 'DOMINO TILE VERTICAL-03-03',\n value: '🁻',\n codepoint: 127099,\n },\n {\n name: 'DOMINO TILE VERTICAL-03-04',\n value: '🁼',\n codepoint: 127100,\n },\n {\n name: 'DOMINO TILE VERTICAL-03-05',\n value: '🁽',\n codepoint: 127101,\n },\n {\n name: 'DOMINO TILE VERTICAL-03-06',\n value: '🁾',\n codepoint: 127102,\n },\n {\n name: 'DOMINO TILE VERTICAL-04-00',\n value: '🁿',\n codepoint: 127103,\n },\n {\n name: 'DOMINO TILE VERTICAL-04-01',\n value: '🂀',\n codepoint: 127104,\n },\n {\n name: 'DOMINO TILE VERTICAL-04-02',\n value: '🂁',\n codepoint: 127105,\n },\n {\n name: 'DOMINO TILE VERTICAL-04-03',\n value: '🂂',\n codepoint: 127106,\n },\n {\n name: 'DOMINO TILE VERTICAL-04-04',\n value: '🂃',\n codepoint: 127107,\n },\n {\n name: 'DOMINO TILE VERTICAL-04-05',\n value: '🂄',\n codepoint: 127108,\n },\n {\n name: 'DOMINO TILE VERTICAL-04-06',\n value: '🂅',\n codepoint: 127109,\n },\n {\n name: 'DOMINO TILE VERTICAL-05-00',\n value: '🂆',\n codepoint: 127110,\n },\n {\n name: 'DOMINO TILE VERTICAL-05-01',\n value: '🂇',\n codepoint: 127111,\n },\n {\n name: 'DOMINO TILE VERTICAL-05-02',\n value: '🂈',\n codepoint: 127112,\n },\n {\n name: 'DOMINO TILE VERTICAL-05-03',\n value: '🂉',\n codepoint: 127113,\n },\n {\n name: 'DOMINO TILE VERTICAL-05-04',\n value: '🂊',\n codepoint: 127114,\n },\n {\n name: 'DOMINO TILE VERTICAL-05-05',\n value: '🂋',\n codepoint: 127115,\n },\n {\n name: 'DOMINO TILE VERTICAL-05-06',\n value: '🂌',\n codepoint: 127116,\n },\n {\n name: 'DOMINO TILE VERTICAL-06-00',\n value: '🂍',\n codepoint: 127117,\n },\n {\n name: 'DOMINO TILE VERTICAL-06-01',\n value: '🂎',\n codepoint: 127118,\n },\n {\n name: 'DOMINO TILE VERTICAL-06-02',\n value: '🂏',\n codepoint: 127119,\n },\n {\n name: 'DOMINO TILE VERTICAL-06-03',\n value: '🂐',\n codepoint: 127120,\n },\n {\n name: 'DOMINO TILE VERTICAL-06-04',\n value: '🂑',\n codepoint: 127121,\n },\n {\n name: 'DOMINO TILE VERTICAL-06-05',\n value: '🂒',\n codepoint: 127122,\n },\n {\n name: 'DOMINO TILE VERTICAL-06-06',\n value: '🂓',\n codepoint: 127123,\n },\n {\n name: 'PLAYING CARD BACK',\n value: '🂠',\n codepoint: 127136,\n },\n {\n name: 'PLAYING CARD ACE OF SPADES',\n value: '🂡',\n codepoint: 127137,\n },\n {\n name: 'PLAYING CARD TWO OF SPADES',\n value: '🂢',\n codepoint: 127138,\n },\n {\n name: 'PLAYING CARD THREE OF SPADES',\n value: '🂣',\n codepoint: 127139,\n },\n {\n name: 'PLAYING CARD FOUR OF SPADES',\n value: '🂤',\n codepoint: 127140,\n },\n {\n name: 'PLAYING CARD FIVE OF SPADES',\n value: '🂥',\n codepoint: 127141,\n },\n {\n name: 'PLAYING CARD SIX OF SPADES',\n value: '🂦',\n codepoint: 127142,\n },\n {\n name: 'PLAYING CARD SEVEN OF SPADES',\n value: '🂧',\n codepoint: 127143,\n },\n {\n name: 'PLAYING CARD EIGHT OF SPADES',\n value: '🂨',\n codepoint: 127144,\n },\n {\n name: 'PLAYING CARD NINE OF SPADES',\n value: '🂩',\n codepoint: 127145,\n },\n {\n name: 'PLAYING CARD TEN OF SPADES',\n value: '🂪',\n codepoint: 127146,\n },\n {\n name: 'PLAYING CARD JACK OF SPADES',\n value: '🂫',\n codepoint: 127147,\n },\n {\n name: 'PLAYING CARD KNIGHT OF SPADES',\n value: '🂬',\n codepoint: 127148,\n },\n {\n name: 'PLAYING CARD QUEEN OF SPADES',\n value: '🂭',\n codepoint: 127149,\n },\n {\n name: 'PLAYING CARD KING OF SPADES',\n value: '🂮',\n codepoint: 127150,\n },\n {\n name: 'PLAYING CARD ACE OF HEARTS',\n value: '🂱',\n codepoint: 127153,\n },\n {\n name: 'PLAYING CARD TWO OF HEARTS',\n value: '🂲',\n codepoint: 127154,\n },\n {\n name: 'PLAYING CARD THREE OF HEARTS',\n value: '🂳',\n codepoint: 127155,\n },\n {\n name: 'PLAYING CARD FOUR OF HEARTS',\n value: '🂴',\n codepoint: 127156,\n },\n {\n name: 'PLAYING CARD FIVE OF HEARTS',\n value: '🂵',\n codepoint: 127157,\n },\n {\n name: 'PLAYING CARD SIX OF HEARTS',\n value: '🂶',\n codepoint: 127158,\n },\n {\n name: 'PLAYING CARD SEVEN OF HEARTS',\n value: '🂷',\n codepoint: 127159,\n },\n {\n name: 'PLAYING CARD EIGHT OF HEARTS',\n value: '🂸',\n codepoint: 127160,\n },\n {\n name: 'PLAYING CARD NINE OF HEARTS',\n value: '🂹',\n codepoint: 127161,\n },\n {\n name: 'PLAYING CARD TEN OF HEARTS',\n value: '🂺',\n codepoint: 127162,\n },\n {\n name: 'PLAYING CARD JACK OF HEARTS',\n value: '🂻',\n codepoint: 127163,\n },\n {\n name: 'PLAYING CARD KNIGHT OF HEARTS',\n value: '🂼',\n codepoint: 127164,\n },\n {\n name: 'PLAYING CARD QUEEN OF HEARTS',\n value: '🂽',\n codepoint: 127165,\n },\n {\n name: 'PLAYING CARD KING OF HEARTS',\n value: '🂾',\n codepoint: 127166,\n },\n {\n name: 'PLAYING CARD ACE OF DIAMONDS',\n value: '🃁',\n codepoint: 127169,\n },\n {\n name: 'PLAYING CARD TWO OF DIAMONDS',\n value: '🃂',\n codepoint: 127170,\n },\n {\n name: 'PLAYING CARD THREE OF DIAMONDS',\n value: '🃃',\n codepoint: 127171,\n },\n {\n name: 'PLAYING CARD FOUR OF DIAMONDS',\n value: '🃄',\n codepoint: 127172,\n },\n {\n name: 'PLAYING CARD FIVE OF DIAMONDS',\n value: '🃅',\n codepoint: 127173,\n },\n {\n name: 'PLAYING CARD SIX OF DIAMONDS',\n value: '🃆',\n codepoint: 127174,\n },\n {\n name: 'PLAYING CARD SEVEN OF DIAMONDS',\n value: '🃇',\n codepoint: 127175,\n },\n {\n name: 'PLAYING CARD EIGHT OF DIAMONDS',\n value: '🃈',\n codepoint: 127176,\n },\n {\n name: 'PLAYING CARD NINE OF DIAMONDS',\n value: '🃉',\n codepoint: 127177,\n },\n {\n name: 'PLAYING CARD TEN OF DIAMONDS',\n value: '🃊',\n codepoint: 127178,\n },\n {\n name: 'PLAYING CARD JACK OF DIAMONDS',\n value: '🃋',\n codepoint: 127179,\n },\n {\n name: 'PLAYING CARD KNIGHT OF DIAMONDS',\n value: '🃌',\n codepoint: 127180,\n },\n {\n name: 'PLAYING CARD QUEEN OF DIAMONDS',\n value: '🃍',\n codepoint: 127181,\n },\n {\n name: 'PLAYING CARD KING OF DIAMONDS',\n value: '🃎',\n codepoint: 127182,\n },\n {\n name: 'PLAYING CARD ACE OF CLUBS',\n value: '🃑',\n codepoint: 127185,\n },\n {\n name: 'PLAYING CARD TWO OF CLUBS',\n value: '🃒',\n codepoint: 127186,\n },\n {\n name: 'PLAYING CARD THREE OF CLUBS',\n value: '🃓',\n codepoint: 127187,\n },\n {\n name: 'PLAYING CARD FOUR OF CLUBS',\n value: '🃔',\n codepoint: 127188,\n },\n {\n name: 'PLAYING CARD FIVE OF CLUBS',\n value: '🃕',\n codepoint: 127189,\n },\n {\n name: 'PLAYING CARD SIX OF CLUBS',\n value: '🃖',\n codepoint: 127190,\n },\n {\n name: 'PLAYING CARD SEVEN OF CLUBS',\n value: '🃗',\n codepoint: 127191,\n },\n {\n name: 'PLAYING CARD EIGHT OF CLUBS',\n value: '🃘',\n codepoint: 127192,\n },\n {\n name: 'PLAYING CARD NINE OF CLUBS',\n value: '🃙',\n codepoint: 127193,\n },\n {\n name: 'PLAYING CARD TEN OF CLUBS',\n value: '🃚',\n codepoint: 127194,\n },\n {\n name: 'PLAYING CARD JACK OF CLUBS',\n value: '🃛',\n codepoint: 127195,\n },\n {\n name: 'PLAYING CARD KNIGHT OF CLUBS',\n value: '🃜',\n codepoint: 127196,\n },\n {\n name: 'PLAYING CARD QUEEN OF CLUBS',\n value: '🃝',\n codepoint: 127197,\n },\n {\n name: 'PLAYING CARD KING OF CLUBS',\n value: '🃞',\n codepoint: 127198,\n },\n {\n name: 'PLAYING CARD WHITE JOKER',\n value: '🃟',\n codepoint: 127199,\n },\n ],\n },\n {\n name: 'Music',\n symbols: [\n {\n name: 'MUSICAL SYMBOL SINGLE BARLINE',\n value: '𝄀',\n codepoint: 119040,\n },\n {\n name: 'MUSICAL SYMBOL DOUBLE BARLINE',\n value: '𝄁',\n codepoint: 119041,\n },\n {\n name: 'MUSICAL SYMBOL FINAL BARLINE',\n value: '𝄂',\n codepoint: 119042,\n },\n {\n name: 'MUSICAL SYMBOL REVERSE FINAL BARLINE',\n value: '𝄃',\n codepoint: 119043,\n },\n {\n name: 'MUSICAL SYMBOL DASHED BARLINE',\n value: '𝄄',\n codepoint: 119044,\n },\n {\n name: 'MUSICAL SYMBOL SHORT BARLINE',\n value: '𝄅',\n codepoint: 119045,\n },\n {\n name: 'MUSICAL SYMBOL LEFT REPEAT SIGN',\n value: '𝄆',\n codepoint: 119046,\n },\n {\n name: 'MUSICAL SYMBOL RIGHT REPEAT SIGN',\n value: '𝄇',\n codepoint: 119047,\n },\n {\n name: 'MUSICAL SYMBOL REPEAT DOTS',\n value: '𝄈',\n codepoint: 119048,\n },\n {\n name: 'MUSICAL SYMBOL FERMATA',\n value: '𝄐',\n codepoint: 119056,\n },\n {\n name: 'MUSICAL SYMBOL FERMATA BELOW',\n value: '𝄑',\n codepoint: 119057,\n },\n {\n name: 'MUSICAL SYMBOL BREATH MARK',\n value: '𝄒',\n codepoint: 119058,\n },\n {\n name: 'MUSICAL SYMBOL G CLEF',\n value: '𝄞',\n codepoint: 119070,\n },\n {\n name: 'MUSICAL SYMBOL C CLEF',\n value: '𝄡',\n codepoint: 119073,\n },\n {\n name: 'MUSICAL SYMBOL F CLEF',\n value: '𝄢',\n codepoint: 119074,\n },\n {\n name: 'MUSICAL SYMBOL DOUBLE SHARP',\n value: '𝄪',\n codepoint: 119082,\n },\n {\n name: 'MUSICAL SYMBOL DOUBLE FLAT',\n value: '𝄫',\n codepoint: 119083,\n },\n {\n name: 'MUSICAL SYMBOL CRESCENDO',\n value: '𝆒',\n codepoint: 119186,\n },\n {\n name: 'MUSICAL SYMBOL DECRESCENDO',\n value: '𝆓',\n codepoint: 119187,\n },\n {\n name: 'MUSICAL SYMBOL HAUPTSTIMME',\n value: '𝆦',\n codepoint: 119206,\n },\n {\n name: 'MUSICAL SYMBOL NEBENSTIMME',\n value: '𝆧',\n codepoint: 119207,\n },\n {\n name: 'MUSICAL SYMBOL END OF STIMME',\n value: '𝆨',\n codepoint: 119208,\n },\n {\n name: 'MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA',\n value: '𝇇',\n codepoint: 119239,\n },\n {\n name: 'MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA',\n value: '𝇈',\n codepoint: 119240,\n },\n {\n name: 'MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1',\n value: '𝇉',\n codepoint: 119241,\n },\n {\n name: 'MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA',\n value: '𝇊',\n codepoint: 119242,\n },\n {\n name: 'MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA',\n value: '𝇋',\n codepoint: 119243,\n },\n {\n name: 'MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1',\n value: '𝇌',\n codepoint: 119244,\n },\n {\n name: 'MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2',\n value: '𝇍',\n codepoint: 119245,\n },\n {\n name: 'MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3',\n value: '𝇎',\n codepoint: 119246,\n },\n ],\n },\n {\n name: 'Geometric Shapes',\n symbols: [\n {\n name: 'BLACK SQUARE',\n value: '■',\n codepoint: 9632,\n },\n {\n name: 'WHITE SQUARE',\n value: '□',\n codepoint: 9633,\n },\n {\n name: 'WHITE SQUARE WITH ROUNDED CORNERS',\n value: '▢',\n codepoint: 9634,\n },\n {\n name: 'WHITE SQUARE CONTAINING BLACK SMALL SQUARE',\n value: '▣',\n codepoint: 9635,\n },\n {\n name: 'SQUARE WITH HORIZONTAL FILL',\n value: '▤',\n codepoint: 9636,\n },\n {\n name: 'SQUARE WITH VERTICAL FILL',\n value: '▥',\n codepoint: 9637,\n },\n {\n name: 'SQUARE WITH ORTHOGONAL CROSSHATCH FILL',\n value: '▦',\n codepoint: 9638,\n },\n {\n name: 'SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL',\n value: '▧',\n codepoint: 9639,\n },\n {\n name: 'SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL',\n value: '▨',\n codepoint: 9640,\n },\n {\n name: 'SQUARE WITH DIAGONAL CROSSHATCH FILL',\n value: '▩',\n codepoint: 9641,\n },\n {\n name: 'BLACK RECTANGLE',\n value: '▬',\n codepoint: 9644,\n },\n {\n name: 'WHITE RECTANGLE',\n value: '▭',\n codepoint: 9645,\n },\n {\n name: 'BLACK VERTICAL RECTANGLE',\n value: '▮',\n codepoint: 9646,\n },\n {\n name: 'WHITE VERTICAL RECTANGLE',\n value: '▯',\n codepoint: 9647,\n },\n {\n name: 'BLACK PARALLELOGRAM',\n value: '▰',\n codepoint: 9648,\n },\n {\n name: 'WHITE PARALLELOGRAM',\n value: '▱',\n codepoint: 9649,\n },\n {\n name: 'BLACK UP-POINTING TRIANGLE',\n value: '▲',\n codepoint: 9650,\n },\n {\n name: 'WHITE UP-POINTING TRIANGLE',\n value: '△',\n codepoint: 9651,\n },\n {\n name: 'BLACK UP-POINTING SMALL TRIANGLE',\n value: '▴',\n codepoint: 9652,\n },\n {\n name: 'WHITE UP-POINTING SMALL TRIANGLE',\n value: '▵',\n codepoint: 9653,\n },\n {\n name: 'WHITE RIGHT-POINTING TRIANGLE',\n value: '▷',\n codepoint: 9655,\n },\n {\n name: 'BLACK RIGHT-POINTING SMALL TRIANGLE',\n value: '▸',\n codepoint: 9656,\n },\n {\n name: 'WHITE RIGHT-POINTING SMALL TRIANGLE',\n value: '▹',\n codepoint: 9657,\n },\n {\n name: 'BLACK RIGHT-POINTING POINTER',\n value: '►',\n codepoint: 9658,\n },\n {\n name: 'WHITE RIGHT-POINTING POINTER',\n value: '▻',\n codepoint: 9659,\n },\n {\n name: 'BLACK DOWN-POINTING TRIANGLE',\n value: '▼',\n codepoint: 9660,\n },\n {\n name: 'WHITE DOWN-POINTING TRIANGLE',\n value: '▽',\n codepoint: 9661,\n },\n {\n name: 'BLACK DOWN-POINTING SMALL TRIANGLE',\n value: '▾',\n codepoint: 9662,\n },\n {\n name: 'WHITE DOWN-POINTING SMALL TRIANGLE',\n value: '▿',\n codepoint: 9663,\n },\n {\n name: 'WHITE LEFT-POINTING TRIANGLE',\n value: '◁',\n codepoint: 9665,\n },\n {\n name: 'BLACK LEFT-POINTING SMALL TRIANGLE',\n value: '◂',\n codepoint: 9666,\n },\n {\n name: 'WHITE LEFT-POINTING SMALL TRIANGLE',\n value: '◃',\n codepoint: 9667,\n },\n {\n name: 'BLACK LEFT-POINTING POINTER',\n value: '◄',\n codepoint: 9668,\n },\n {\n name: 'WHITE LEFT-POINTING POINTER',\n value: '◅',\n codepoint: 9669,\n },\n {\n name: 'BLACK DIAMOND',\n value: '◆',\n codepoint: 9670,\n },\n {\n name: 'WHITE DIAMOND',\n value: '◇',\n codepoint: 9671,\n },\n {\n name: 'WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND',\n value: '◈',\n codepoint: 9672,\n },\n {\n name: 'FISHEYE',\n value: '◉',\n codepoint: 9673,\n },\n {\n name: 'LOZENGE',\n value: '◊',\n codepoint: 9674,\n },\n {\n name: 'WHITE CIRCLE',\n value: '○',\n codepoint: 9675,\n },\n {\n name: 'DOTTED CIRCLE',\n value: '◌',\n codepoint: 9676,\n },\n {\n name: 'CIRCLE WITH VERTICAL FILL',\n value: '◍',\n codepoint: 9677,\n },\n {\n name: 'BULLSEYE',\n value: '◎',\n codepoint: 9678,\n },\n {\n name: 'BLACK CIRCLE',\n value: '●',\n codepoint: 9679,\n },\n {\n name: 'CIRCLE WITH LEFT HALF BLACK',\n value: '◐',\n codepoint: 9680,\n },\n {\n name: 'CIRCLE WITH RIGHT HALF BLACK',\n value: '◑',\n codepoint: 9681,\n },\n {\n name: 'CIRCLE WITH LOWER HALF BLACK',\n value: '◒',\n codepoint: 9682,\n },\n {\n name: 'CIRCLE WITH UPPER HALF BLACK',\n value: '◓',\n codepoint: 9683,\n },\n {\n name: 'CIRCLE WITH UPPER RIGHT QUADRANT BLACK',\n value: '◔',\n codepoint: 9684,\n },\n {\n name: 'CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK',\n value: '◕',\n codepoint: 9685,\n },\n {\n name: 'LEFT HALF BLACK CIRCLE',\n value: '◖',\n codepoint: 9686,\n },\n {\n name: 'RIGHT HALF BLACK CIRCLE',\n value: '◗',\n codepoint: 9687,\n },\n {\n name: 'INVERSE BULLET',\n value: '◘',\n codepoint: 9688,\n },\n {\n name: 'INVERSE WHITE CIRCLE',\n value: '◙',\n codepoint: 9689,\n },\n {\n name: 'UPPER HALF INVERSE WHITE CIRCLE',\n value: '◚',\n codepoint: 9690,\n },\n {\n name: 'LOWER HALF INVERSE WHITE CIRCLE',\n value: '◛',\n codepoint: 9691,\n },\n {\n name: 'UPPER LEFT QUADRANT CIRCULAR ARC',\n value: '◜',\n codepoint: 9692,\n },\n {\n name: 'UPPER RIGHT QUADRANT CIRCULAR ARC',\n value: '◝',\n codepoint: 9693,\n },\n {\n name: 'LOWER RIGHT QUADRANT CIRCULAR ARC',\n value: '◞',\n codepoint: 9694,\n },\n {\n name: 'LOWER LEFT QUADRANT CIRCULAR ARC',\n value: '◟',\n codepoint: 9695,\n },\n {\n name: 'UPPER HALF CIRCLE',\n value: '◠',\n codepoint: 9696,\n },\n {\n name: 'LOWER HALF CIRCLE',\n value: '◡',\n codepoint: 9697,\n },\n {\n name: 'BLACK LOWER RIGHT TRIANGLE',\n value: '◢',\n codepoint: 9698,\n },\n {\n name: 'BLACK LOWER LEFT TRIANGLE',\n value: '◣',\n codepoint: 9699,\n },\n {\n name: 'BLACK UPPER LEFT TRIANGLE',\n value: '◤',\n codepoint: 9700,\n },\n {\n name: 'BLACK UPPER RIGHT TRIANGLE',\n value: '◥',\n codepoint: 9701,\n },\n {\n name: 'WHITE BULLET',\n value: '◦',\n codepoint: 9702,\n },\n {\n name: 'SQUARE WITH LEFT HALF BLACK',\n value: '◧',\n codepoint: 9703,\n },\n {\n name: 'SQUARE WITH RIGHT HALF BLACK',\n value: '◨',\n codepoint: 9704,\n },\n {\n name: 'SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK',\n value: '◩',\n codepoint: 9705,\n },\n {\n name: 'SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK',\n value: '◪',\n codepoint: 9706,\n },\n {\n name: 'WHITE SQUARE WITH VERTICAL BISECTING LINE',\n value: '◫',\n codepoint: 9707,\n },\n {\n name: 'WHITE UP-POINTING TRIANGLE WITH DOT',\n value: '◬',\n codepoint: 9708,\n },\n {\n name: 'UP-POINTING TRIANGLE WITH LEFT HALF BLACK',\n value: '◭',\n codepoint: 9709,\n },\n {\n name: 'UP-POINTING TRIANGLE WITH RIGHT HALF BLACK',\n value: '◮',\n codepoint: 9710,\n },\n {\n name: 'LARGE CIRCLE',\n value: '◯',\n codepoint: 9711,\n },\n {\n name: 'WHITE SQUARE WITH UPPER LEFT QUADRANT',\n value: '◰',\n codepoint: 9712,\n },\n {\n name: 'WHITE SQUARE WITH LOWER LEFT QUADRANT',\n value: '◱',\n codepoint: 9713,\n },\n {\n name: 'WHITE SQUARE WITH LOWER RIGHT QUADRANT',\n value: '◲',\n codepoint: 9714,\n },\n {\n name: 'WHITE SQUARE WITH UPPER RIGHT QUADRANT',\n value: '◳',\n codepoint: 9715,\n },\n {\n name: 'WHITE CIRCLE WITH UPPER LEFT QUADRANT',\n value: '◴',\n codepoint: 9716,\n },\n {\n name: 'WHITE CIRCLE WITH LOWER LEFT QUADRANT',\n value: '◵',\n codepoint: 9717,\n },\n {\n name: 'WHITE CIRCLE WITH LOWER RIGHT QUADRANT',\n value: '◶',\n codepoint: 9718,\n },\n {\n name: 'WHITE CIRCLE WITH UPPER RIGHT QUADRANT',\n value: '◷',\n codepoint: 9719,\n },\n {\n name: 'UPPER LEFT TRIANGLE',\n value: '◸',\n codepoint: 9720,\n },\n {\n name: 'UPPER RIGHT TRIANGLE',\n value: '◹',\n codepoint: 9721,\n },\n {\n name: 'LOWER LEFT TRIANGLE',\n value: '◺',\n codepoint: 9722,\n },\n {\n name: 'LOWER RIGHT TRIANGLE',\n value: '◿',\n codepoint: 9727,\n },\n ],\n },\n {\n name: 'Ideographic',\n symbols: [\n {\n name: 'IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT',\n value: '⿰',\n codepoint: 12272,\n },\n {\n name: 'IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW',\n value: '⿱',\n codepoint: 12273,\n },\n {\n name: 'IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT',\n value: '⿲',\n codepoint: 12274,\n },\n {\n name: 'IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW',\n value: '⿳',\n codepoint: 12275,\n },\n {\n name: 'IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND',\n value: '⿴',\n codepoint: 12276,\n },\n {\n name: 'IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE',\n value: '⿵',\n codepoint: 12277,\n },\n {\n name: 'IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW',\n value: '⿶',\n codepoint: 12278,\n },\n {\n name: 'IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT',\n value: '⿷',\n codepoint: 12279,\n },\n {\n name: 'IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT',\n value: '⿸',\n codepoint: 12280,\n },\n {\n name: 'IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT',\n value: '⿹',\n codepoint: 12281,\n },\n {\n name: 'IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT',\n value: '⿺',\n codepoint: 12282,\n },\n {\n name: 'IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID',\n value: '⿻',\n codepoint: 12283,\n },\n ],\n },\n];\n\nexport default symbols;\n","/*\n * insert_emoji.tsx\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { PluginKey, EditorState } from 'prosemirror-state';\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\n\nimport React from 'react';\n\nimport { EditorUI } from '../../api/ui';\nimport { emojiCategories, emojis, Emoji, emojiFromString, SkinTone } from '../../api/emoji';\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { nodeForEmoji } from '../../marks/emoji/emoji';\nimport { OmniInsertGroup } from '../../api/omni_insert';\n\nimport { performInsertSymbol, InsertSymbolPlugin } from './insert_symbol-plugin';\nimport { SymbolDataProvider, SymbolCharacter } from './insert_symbol-dataprovider';\nimport { SymbolEmojiPreferencesPanel } from './insert_symbol-emoji-skintone';\n\nconst key = new PluginKey<boolean>('insert-emoji');\n\nconst extension = (context: ExtensionContext): Extension => {\n const { ui, events } = context;\n return {\n commands: () => {\n return [new ProsemirrorCommand(EditorCommandId.Emoji, [], performInsertSymbol(key), emojiOmniInsert(ui))];\n },\n plugins: (_schema: Schema) => {\n return [new InsertSymbolPlugin(key, new EmojiSymbolDataProvider(ui), ui, events)];\n },\n };\n};\n\nfunction emojiOmniInsert(ui: EditorUI) {\n return {\n name: ui.context.translateText('Emoji...'),\n description: ui.context.translateText('Image expressing idea, emotion, etc.'),\n group: OmniInsertGroup.Content,\n priority: 6,\n image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.emoji_dark! : ui.images.omni_insert?.emoji!),\n };\n}\n\nexport class EmojiSymbolDataProvider implements SymbolDataProvider {\n public constructor(ui: EditorUI) {\n this.ui = ui;\n }\n private readonly ui: EditorUI;\n\n public readonly filterPlaceholderHint = 'emoji name';\n\n public readonly symbolPreviewStyle: React.CSSProperties = { fontSize: '36px' } as React.CSSProperties;\n\n public symbolPreferencesPanel = SymbolEmojiPreferencesPanel;\n\n public insertSymbolTransaction(symbolCharacter: SymbolCharacter, searchTerm: string, state: EditorState) {\n const emoji = emojiFromString(symbolCharacter.value, this.skinTone());\n const tr = state.tr;\n if (emoji) {\n // Try to find an alias that matches the user's search term\n const bestAlias = emoji.aliases.find(alias => alias.includes(searchTerm));\n tr.replaceSelectionWith(nodeForEmoji(state.schema, emoji, bestAlias || emoji.aliases[0], false), false);\n } else {\n // This doesn't appear to be an emoji or it doesn't have a markdown representation,\n // just insert the text\n tr.insertText(symbolCharacter.value);\n }\n return tr;\n }\n\n public symbolGroupNames(): string[] {\n return [kCategoryAll, ...emojiCategories()];\n }\n\n public getSymbols(groupName: string | undefined) {\n if (groupName === kCategoryAll || groupName === undefined) {\n return emojis(this.skinTone()).map(emoji => symbolForEmoji(emoji));\n } else {\n return emojis(this.skinTone())\n .filter(emoji => emoji.category === groupName)\n .map(emoji => symbolForEmoji(emoji));\n }\n }\n\n public filterSymbols(filterText: string, symbols: SymbolCharacter[]): SymbolCharacter[] {\n const filteredSymbols = symbols.filter(symbol => {\n // Search by name\n if (symbol.name.includes(filterText)) {\n return true;\n }\n\n // search each of the aliases\n if (symbol.aliases && symbol.aliases.find(alias => alias.includes(filterText))) {\n return true;\n }\n\n return false;\n });\n return filteredSymbols;\n }\n\n private skinTone(): SkinTone {\n return this.ui.prefs.emojiSkinTone();\n }\n}\n\nconst kCategoryAll = 'All';\nfunction symbolForEmoji(emoji: Emoji): SymbolCharacter {\n return {\n name: emoji.description,\n value: emoji.emoji,\n markdown: emoji.hasMarkdownRepresentation ? `:${emoji.aliases[0]}:` : undefined,\n aliases: emoji.aliases,\n description: emoji.description,\n };\n}\n\nexport default extension;\n","/*\n * emoji.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport kEmojis from './emojis-all';\n\nexport const kEmojiAttr = 0;\nexport const kEmojiContent = 1;\n\n// A raw emoji which doesn't include skin tone information\nexport interface EmojiRaw {\n emojiRaw: string;\n aliases: string[];\n category: string;\n description: string;\n supportsSkinTone?: boolean;\n hasMarkdownRepresentation: boolean;\n}\n\n// A complete emoji that may additional render skintone\nexport interface Emoji extends EmojiRaw {\n emoji: string;\n skinTone: SkinTone;\n}\n\n// Skin tones that are permitted for emoji\n// None = user hasn't expressed a preference\n// Default = don't apply a skin tone (use yellow emoji)\nexport enum SkinTone {\n None = -1,\n Default = 0,\n Light = 0x1f3fb,\n MediumLight = 0x1f3fc,\n Medium = 0x1f3fd,\n MediumDark = 0x1f3fe,\n Dark = 0x1f3ff,\n}\n\nfunction hasSkinTone(skinTone: SkinTone): boolean {\n return skinTone !== SkinTone.None && skinTone !== SkinTone.Default;\n}\n\nexport function emojis(skinTone: SkinTone): Emoji[] {\n return kEmojis.map(emoji => emojiWithSkinTone(emoji, skinTone));\n}\n\nexport function emojiCategories(): string[] {\n return kEmojis\n .map(emoji => emoji.category)\n .filter((catgegory, index, categories) => categories.indexOf(catgegory) === index);\n}\n\nexport function emojiFromString(emojiString: string, skinTone: SkinTone): Emoji | undefined {\n return emojis(skinTone).find(em => em.emoji === emojiString);\n}\n\nexport function emojiWithSkinTonePreference(emoji: EmojiRaw, skinTone: SkinTone): Emoji {\n return emojiWithSkinTone(emoji, skinTone);\n}\n\n// Find a matching non skin toned emoji for a given string\nexport function emojiFromChar(emojiString: string): EmojiRaw | undefined {\n return kEmojis.find(emoji => emoji.emojiRaw === emojiString);\n}\n\n// Returns a non skin tonned emoji for a given alias.\nexport function emojiFromAlias(emojiAlias: string): EmojiRaw | undefined {\n for (const emoji of kEmojis) {\n if (emoji.aliases.includes(emojiAlias)) {\n return emoji;\n }\n }\n return undefined;\n}\n\n// Returns an array of skin toned emoji including the unskintoned emoji. If the emoji\n// doesn't support skin tones, this returns the original emoji.\nexport function emojiForAllSkinTones(emoji: EmojiRaw): Emoji[] {\n if (emoji.supportsSkinTone) {\n return [\n emojiWithSkinTone(emoji, SkinTone.Default),\n emojiWithSkinTone(emoji, SkinTone.Light),\n emojiWithSkinTone(emoji, SkinTone.MediumLight),\n emojiWithSkinTone(emoji, SkinTone.Medium),\n emojiWithSkinTone(emoji, SkinTone.MediumDark),\n emojiWithSkinTone(emoji, SkinTone.Dark),\n ];\n } else {\n return [emojiWithSkinTone(emoji, SkinTone.Default)];\n }\n}\n\n// Returns a skin toned version of the emoji, or the original emoji if it\n// doesn't support skin tones\nfunction emojiWithSkinTone(emoji: EmojiRaw, skinTone: SkinTone): Emoji {\n if (!emoji.supportsSkinTone) {\n return { ...emoji, emoji: emoji.emojiRaw, skinTone: SkinTone.Default };\n }\n\n const skinToneEmoji: Emoji = {\n emojiRaw: emoji.emojiRaw,\n aliases: emoji.aliases,\n category: emoji.category,\n description: emoji.description,\n supportsSkinTone: emoji.supportsSkinTone,\n hasMarkdownRepresentation: emoji.hasMarkdownRepresentation,\n emoji: emoji.emojiRaw + characterForSkinTone(skinTone), //\n skinTone,\n };\n return skinToneEmoji;\n}\n\n// No skin tone returns an empty string, otherwise the skintone codepoint\n// is converted into a string\nfunction characterForSkinTone(skinTone: SkinTone): string {\n return hasSkinTone(skinTone) ? String.fromCodePoint(skinTone) : '';\n}\n","import { EmojiRaw } from './emoji';\n\nconst emjois: EmojiRaw[] = [\n {\n \"emojiRaw\": \"😀\",\n \"description\": \"grinning face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"grinning\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😃\",\n \"description\": \"grinning face with big eyes\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"smiley\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😄\",\n \"description\": \"grinning face with smiling eyes\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"smile\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😁\",\n \"description\": \"beaming face with smiling eyes\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"grin\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😆\",\n \"description\": \"grinning squinting face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"laughing\",\n \"satisfied\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😅\",\n \"description\": \"grinning face with sweat\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"sweat_smile\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤣\",\n \"description\": \"rolling on the floor laughing\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"rofl\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😂\",\n \"description\": \"face with tears of joy\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"joy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙂\",\n \"description\": \"slightly smiling face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"slightly_smiling_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙃\",\n \"description\": \"upside-down face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"upside_down_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😉\",\n \"description\": \"winking face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"wink\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😊\",\n \"description\": \"smiling face with smiling eyes\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"blush\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😇\",\n \"description\": \"smiling face with halo\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"innocent\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥰\",\n \"description\": \"smiling face with hearts\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"smiling_face_with_three_hearts\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😍\",\n \"description\": \"smiling face with heart-eyes\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"heart_eyes\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤩\",\n \"description\": \"star-struck\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"star_struck\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😘\",\n \"description\": \"face blowing a kiss\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"kissing_heart\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😗\",\n \"description\": \"kissing face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"kissing\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😚\",\n \"description\": \"kissing face with closed eyes\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"kissing_closed_eyes\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😙\",\n \"description\": \"kissing face with smiling eyes\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"kissing_smiling_eyes\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😋\",\n \"description\": \"face savoring food\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"yum\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😛\",\n \"description\": \"face with tongue\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"stuck_out_tongue\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😜\",\n \"description\": \"winking face with tongue\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"stuck_out_tongue_winking_eye\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤪\",\n \"description\": \"zany face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"zany_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😝\",\n \"description\": \"squinting face with tongue\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"stuck_out_tongue_closed_eyes\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤑\",\n \"description\": \"money-mouth face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"money_mouth_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤗\",\n \"description\": \"hugging face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"hugs\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤭\",\n \"description\": \"face with hand over mouth\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"hand_over_mouth\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤫\",\n \"description\": \"shushing face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"shushing_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤔\",\n \"description\": \"thinking face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"thinking\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤐\",\n \"description\": \"zipper-mouth face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"zipper_mouth_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤨\",\n \"description\": \"face with raised eyebrow\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"raised_eyebrow\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😐\",\n \"description\": \"neutral face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"neutral_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😑\",\n \"description\": \"expressionless face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"expressionless\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😶\",\n \"description\": \"face without mouth\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"no_mouth\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😏\",\n \"description\": \"smirking face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"smirk\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😒\",\n \"description\": \"unamused face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"unamused\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙄\",\n \"description\": \"face with rolling eyes\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"roll_eyes\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😬\",\n \"description\": \"grimacing face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"grimacing\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤥\",\n \"description\": \"lying face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"lying_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😌\",\n \"description\": \"relieved face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"relieved\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😔\",\n \"description\": \"pensive face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"pensive\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😪\",\n \"description\": \"sleepy face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"sleepy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤤\",\n \"description\": \"drooling face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"drooling_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😴\",\n \"description\": \"sleeping face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"sleeping\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😷\",\n \"description\": \"face with medical mask\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"mask\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤒\",\n \"description\": \"face with thermometer\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"face_with_thermometer\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤕\",\n \"description\": \"face with head-bandage\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"face_with_head_bandage\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤢\",\n \"description\": \"nauseated face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"nauseated_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤮\",\n \"description\": \"face vomiting\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"vomiting_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤧\",\n \"description\": \"sneezing face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"sneezing_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥵\",\n \"description\": \"hot face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"hot_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥶\",\n \"description\": \"cold face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"cold_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥴\",\n \"description\": \"woozy face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"woozy_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😵\",\n \"description\": \"dizzy face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"dizzy_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤯\",\n \"description\": \"exploding head\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"exploding_head\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤠\",\n \"description\": \"cowboy hat face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"cowboy_hat_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥳\",\n \"description\": \"partying face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"partying_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😎\",\n \"description\": \"smiling face with sunglasses\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"sunglasses\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤓\",\n \"description\": \"nerd face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"nerd_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧐\",\n \"description\": \"face with monocle\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"monocle_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😕\",\n \"description\": \"confused face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"confused\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😟\",\n \"description\": \"worried face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"worried\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙁\",\n \"description\": \"slightly frowning face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"slightly_frowning_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😮\",\n \"description\": \"face with open mouth\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"open_mouth\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😯\",\n \"description\": \"hushed face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"hushed\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😲\",\n \"description\": \"astonished face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"astonished\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😳\",\n \"description\": \"flushed face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"flushed\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥺\",\n \"description\": \"pleading face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"pleading_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😦\",\n \"description\": \"frowning face with open mouth\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"frowning\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😧\",\n \"description\": \"anguished face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"anguished\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😨\",\n \"description\": \"fearful face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"fearful\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😰\",\n \"description\": \"anxious face with sweat\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"cold_sweat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😥\",\n \"description\": \"sad but relieved face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"disappointed_relieved\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😢\",\n \"description\": \"crying face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"cry\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😭\",\n \"description\": \"loudly crying face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"sob\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😱\",\n \"description\": \"face screaming in fear\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"scream\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😖\",\n \"description\": \"confounded face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"confounded\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😣\",\n \"description\": \"persevering face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"persevere\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😞\",\n \"description\": \"disappointed face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"disappointed\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😓\",\n \"description\": \"downcast face with sweat\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"sweat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😩\",\n \"description\": \"weary face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"weary\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😫\",\n \"description\": \"tired face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"tired_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥱\",\n \"description\": \"yawning face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"yawning_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😤\",\n \"description\": \"face with steam from nose\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"triumph\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😡\",\n \"description\": \"pouting face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"rage\",\n \"pout\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😠\",\n \"description\": \"angry face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"angry\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤬\",\n \"description\": \"face with symbols on mouth\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"cursing_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😈\",\n \"description\": \"smiling face with horns\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"smiling_imp\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👿\",\n \"description\": \"angry face with horns\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"imp\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💀\",\n \"description\": \"skull\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"skull\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"☠️\",\n \"description\": \"skull and crossbones\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"skull_and_crossbones\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💩\",\n \"description\": \"pile of poo\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"hankey\",\n \"poop\",\n \"shit\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤡\",\n \"description\": \"clown face\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"clown_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👹\",\n \"description\": \"ogre\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"japanese_ogre\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👺\",\n \"description\": \"goblin\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"japanese_goblin\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👻\",\n \"description\": \"ghost\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"ghost\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👽\",\n \"description\": \"alien\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"alien\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👾\",\n \"description\": \"alien monster\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"space_invader\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤖\",\n \"description\": \"robot\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"robot\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😺\",\n \"description\": \"grinning cat\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"smiley_cat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😸\",\n \"description\": \"grinning cat with smiling eyes\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"smile_cat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😹\",\n \"description\": \"cat with tears of joy\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"joy_cat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😻\",\n \"description\": \"smiling cat with heart-eyes\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"heart_eyes_cat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😼\",\n \"description\": \"cat with wry smile\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"smirk_cat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😽\",\n \"description\": \"kissing cat\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"kissing_cat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙀\",\n \"description\": \"weary cat\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"scream_cat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😿\",\n \"description\": \"crying cat\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"crying_cat_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"😾\",\n \"description\": \"pouting cat\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"pouting_cat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙈\",\n \"description\": \"see-no-evil monkey\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"see_no_evil\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙉\",\n \"description\": \"hear-no-evil monkey\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"hear_no_evil\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙊\",\n \"description\": \"speak-no-evil monkey\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"speak_no_evil\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💋\",\n \"description\": \"kiss mark\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"kiss\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💌\",\n \"description\": \"love letter\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"love_letter\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💘\",\n \"description\": \"heart with arrow\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"cupid\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💝\",\n \"description\": \"heart with ribbon\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"gift_heart\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💖\",\n \"description\": \"sparkling heart\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"sparkling_heart\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💗\",\n \"description\": \"growing heart\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"heartpulse\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💓\",\n \"description\": \"beating heart\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"heartbeat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💞\",\n \"description\": \"revolving hearts\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"revolving_hearts\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💕\",\n \"description\": \"two hearts\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"two_hearts\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💟\",\n \"description\": \"heart decoration\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"heart_decoration\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"❣️\",\n \"description\": \"heart exclamation\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"heavy_heart_exclamation\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💔\",\n \"description\": \"broken heart\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"broken_heart\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"❤️\",\n \"description\": \"red heart\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"heart\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧡\",\n \"description\": \"orange heart\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"orange_heart\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💛\",\n \"description\": \"yellow heart\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"yellow_heart\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💚\",\n \"description\": \"green heart\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"green_heart\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💙\",\n \"description\": \"blue heart\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"blue_heart\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💜\",\n \"description\": \"purple heart\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"purple_heart\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤎\",\n \"description\": \"brown heart\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"brown_heart\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🖤\",\n \"description\": \"black heart\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"black_heart\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤍\",\n \"description\": \"white heart\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"white_heart\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💯\",\n \"description\": \"hundred points\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"100\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💢\",\n \"description\": \"anger symbol\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"anger\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💥\",\n \"description\": \"collision\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"boom\",\n \"collision\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💫\",\n \"description\": \"dizzy\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"dizzy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💦\",\n \"description\": \"sweat droplets\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"sweat_drops\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💨\",\n \"description\": \"dashing away\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"dash\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕳️\",\n \"description\": \"hole\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"hole\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💣\",\n \"description\": \"bomb\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"bomb\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💬\",\n \"description\": \"speech balloon\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"speech_balloon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👁️🗨️\",\n \"description\": \"eye in speech bubble\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"eye_speech_bubble\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🗨️\",\n \"description\": \"left speech bubble\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"left_speech_bubble\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🗯️\",\n \"description\": \"right anger bubble\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"right_anger_bubble\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💭\",\n \"description\": \"thought balloon\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"thought_balloon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💤\",\n \"description\": \"zzz\",\n \"category\": \"Smileys & Emotion\",\n \"aliases\": [\n \"zzz\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👋\",\n \"description\": \"waving hand\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"wave\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤚\",\n \"description\": \"raised back of hand\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"raised_back_of_hand\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🖐️\",\n \"description\": \"hand with fingers splayed\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"raised_hand_with_fingers_splayed\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"✋\",\n \"description\": \"raised hand\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"hand\",\n \"raised_hand\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🖖\",\n \"description\": \"vulcan salute\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"vulcan_salute\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👌\",\n \"description\": \"OK hand\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"ok_hand\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤏\",\n \"description\": \"pinching hand\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"pinching_hand\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"✌️\",\n \"description\": \"victory hand\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"v\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤞\",\n \"description\": \"crossed fingers\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"crossed_fingers\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤟\",\n \"description\": \"love-you gesture\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"love_you_gesture\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤘\",\n \"description\": \"sign of the horns\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"metal\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤙\",\n \"description\": \"call me hand\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"call_me_hand\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👈\",\n \"description\": \"backhand index pointing left\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"point_left\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👉\",\n \"description\": \"backhand index pointing right\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"point_right\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👆\",\n \"description\": \"backhand index pointing up\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"point_up_2\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🖕\",\n \"description\": \"middle finger\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"middle_finger\",\n \"fu\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👇\",\n \"description\": \"backhand index pointing down\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"point_down\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"☝️\",\n \"description\": \"index pointing up\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"point_up\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👍\",\n \"description\": \"thumbs up\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"+1\",\n \"thumbsup\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👎\",\n \"description\": \"thumbs down\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"-1\",\n \"thumbsdown\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"✊\",\n \"description\": \"raised fist\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"fist_raised\",\n \"fist\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👊\",\n \"description\": \"oncoming fist\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"fist_oncoming\",\n \"facepunch\",\n \"punch\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤛\",\n \"description\": \"left-facing fist\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"fist_left\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤜\",\n \"description\": \"right-facing fist\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"fist_right\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👏\",\n \"description\": \"clapping hands\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"clap\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙌\",\n \"description\": \"raising hands\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"raised_hands\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👐\",\n \"description\": \"open hands\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"open_hands\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤲\",\n \"description\": \"palms up together\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"palms_up_together\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤝\",\n \"description\": \"handshake\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"handshake\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙏\",\n \"description\": \"folded hands\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"pray\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"✍️\",\n \"description\": \"writing hand\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"writing_hand\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💅\",\n \"description\": \"nail polish\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"nail_care\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤳\",\n \"description\": \"selfie\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"selfie\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💪\",\n \"description\": \"flexed biceps\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"muscle\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦾\",\n \"description\": \"mechanical arm\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"mechanical_arm\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦿\",\n \"description\": \"mechanical leg\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"mechanical_leg\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦵\",\n \"description\": \"leg\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"leg\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦶\",\n \"description\": \"foot\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"foot\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👂\",\n \"description\": \"ear\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"ear\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦻\",\n \"description\": \"ear with hearing aid\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"ear_with_hearing_aid\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👃\",\n \"description\": \"nose\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"nose\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧠\",\n \"description\": \"brain\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"brain\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦷\",\n \"description\": \"tooth\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"tooth\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦴\",\n \"description\": \"bone\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"bone\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👀\",\n \"description\": \"eyes\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"eyes\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👁️\",\n \"description\": \"eye\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"eye\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👅\",\n \"description\": \"tongue\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"tongue\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👄\",\n \"description\": \"mouth\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"lips\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👶\",\n \"description\": \"baby\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"baby\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧒\",\n \"description\": \"child\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"child\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👦\",\n \"description\": \"boy\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"boy\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👧\",\n \"description\": \"girl\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"girl\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑\",\n \"description\": \"person\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"adult\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👱\",\n \"description\": \"person: blond hair\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"blond_haired_person\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨\",\n \"description\": \"man\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧔\",\n \"description\": \"man: beard\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"bearded_person\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨🦰\",\n \"description\": \"man: red hair\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"red_haired_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨🦱\",\n \"description\": \"man: curly hair\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"curly_haired_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨🦳\",\n \"description\": \"man: white hair\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"white_haired_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨🦲\",\n \"description\": \"man: bald\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"bald_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩\",\n \"description\": \"woman\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩🦰\",\n \"description\": \"woman: red hair\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"red_haired_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑🦰\",\n \"description\": \"person: red hair\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"person_red_hair\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩🦱\",\n \"description\": \"woman: curly hair\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"curly_haired_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑🦱\",\n \"description\": \"person: curly hair\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"person_curly_hair\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩🦳\",\n \"description\": \"woman: white hair\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"white_haired_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑🦳\",\n \"description\": \"person: white hair\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"person_white_hair\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩🦲\",\n \"description\": \"woman: bald\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"bald_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑🦲\",\n \"description\": \"person: bald\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"person_bald\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👱♀️\",\n \"description\": \"woman: blond hair\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"blond_haired_woman\",\n \"blonde_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👱♂️\",\n \"description\": \"man: blond hair\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"blond_haired_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧓\",\n \"description\": \"older person\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"older_adult\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👴\",\n \"description\": \"old man\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"older_man\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👵\",\n \"description\": \"old woman\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"older_woman\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙍\",\n \"description\": \"person frowning\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"frowning_person\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙍♂️\",\n \"description\": \"man frowning\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"frowning_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙍♀️\",\n \"description\": \"woman frowning\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"frowning_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙎\",\n \"description\": \"person pouting\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"pouting_face\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙎♂️\",\n \"description\": \"man pouting\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"pouting_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙎♀️\",\n \"description\": \"woman pouting\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"pouting_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙅\",\n \"description\": \"person gesturing NO\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"no_good\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙅♂️\",\n \"description\": \"man gesturing NO\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"no_good_man\",\n \"ng_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙅♀️\",\n \"description\": \"woman gesturing NO\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"no_good_woman\",\n \"ng_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙆\",\n \"description\": \"person gesturing OK\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"ok_person\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙆♂️\",\n \"description\": \"man gesturing OK\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"ok_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙆♀️\",\n \"description\": \"woman gesturing OK\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"ok_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💁\",\n \"description\": \"person tipping hand\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"tipping_hand_person\",\n \"information_desk_person\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💁♂️\",\n \"description\": \"man tipping hand\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"tipping_hand_man\",\n \"sassy_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💁♀️\",\n \"description\": \"woman tipping hand\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"tipping_hand_woman\",\n \"sassy_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙋\",\n \"description\": \"person raising hand\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"raising_hand\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙋♂️\",\n \"description\": \"man raising hand\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"raising_hand_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙋♀️\",\n \"description\": \"woman raising hand\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"raising_hand_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧏\",\n \"description\": \"deaf person\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"deaf_person\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧏♂️\",\n \"description\": \"deaf man\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"deaf_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧏♀️\",\n \"description\": \"deaf woman\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"deaf_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙇\",\n \"description\": \"person bowing\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"bow\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙇♂️\",\n \"description\": \"man bowing\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"bowing_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🙇♀️\",\n \"description\": \"woman bowing\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"bowing_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤦\",\n \"description\": \"person facepalming\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"facepalm\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤦♂️\",\n \"description\": \"man facepalming\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_facepalming\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤦♀️\",\n \"description\": \"woman facepalming\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_facepalming\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤷\",\n \"description\": \"person shrugging\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"shrug\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤷♂️\",\n \"description\": \"man shrugging\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_shrugging\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤷♀️\",\n \"description\": \"woman shrugging\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_shrugging\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑⚕️\",\n \"description\": \"health worker\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"health_worker\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨⚕️\",\n \"description\": \"man health worker\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_health_worker\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩⚕️\",\n \"description\": \"woman health worker\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_health_worker\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑🎓\",\n \"description\": \"student\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"student\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨🎓\",\n \"description\": \"man student\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_student\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩🎓\",\n \"description\": \"woman student\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_student\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑🏫\",\n \"description\": \"teacher\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"teacher\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨🏫\",\n \"description\": \"man teacher\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_teacher\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩🏫\",\n \"description\": \"woman teacher\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_teacher\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑⚖️\",\n \"description\": \"judge\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"judge\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨⚖️\",\n \"description\": \"man judge\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_judge\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩⚖️\",\n \"description\": \"woman judge\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_judge\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑🌾\",\n \"description\": \"farmer\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"farmer\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨🌾\",\n \"description\": \"man farmer\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_farmer\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩🌾\",\n \"description\": \"woman farmer\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_farmer\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑🍳\",\n \"description\": \"cook\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"cook\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨🍳\",\n \"description\": \"man cook\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_cook\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩🍳\",\n \"description\": \"woman cook\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_cook\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑🔧\",\n \"description\": \"mechanic\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"mechanic\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨🔧\",\n \"description\": \"man mechanic\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_mechanic\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩🔧\",\n \"description\": \"woman mechanic\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_mechanic\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑🏭\",\n \"description\": \"factory worker\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"factory_worker\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨🏭\",\n \"description\": \"man factory worker\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_factory_worker\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩🏭\",\n \"description\": \"woman factory worker\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_factory_worker\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑💼\",\n \"description\": \"office worker\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"office_worker\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨💼\",\n \"description\": \"man office worker\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_office_worker\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩💼\",\n \"description\": \"woman office worker\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_office_worker\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑🔬\",\n \"description\": \"scientist\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"scientist\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨🔬\",\n \"description\": \"man scientist\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_scientist\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩🔬\",\n \"description\": \"woman scientist\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_scientist\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑💻\",\n \"description\": \"technologist\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"technologist\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨💻\",\n \"description\": \"man technologist\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_technologist\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩💻\",\n \"description\": \"woman technologist\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_technologist\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑🎤\",\n \"description\": \"singer\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"singer\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨🎤\",\n \"description\": \"man singer\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_singer\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩🎤\",\n \"description\": \"woman singer\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_singer\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑🎨\",\n \"description\": \"artist\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"artist\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨🎨\",\n \"description\": \"man artist\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_artist\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩🎨\",\n \"description\": \"woman artist\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_artist\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑✈️\",\n \"description\": \"pilot\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"pilot\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨✈️\",\n \"description\": \"man pilot\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_pilot\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩✈️\",\n \"description\": \"woman pilot\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_pilot\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑🚀\",\n \"description\": \"astronaut\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"astronaut\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨🚀\",\n \"description\": \"man astronaut\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_astronaut\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩🚀\",\n \"description\": \"woman astronaut\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_astronaut\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑🚒\",\n \"description\": \"firefighter\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"firefighter\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨🚒\",\n \"description\": \"man firefighter\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_firefighter\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩🚒\",\n \"description\": \"woman firefighter\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_firefighter\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👮\",\n \"description\": \"police officer\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"police_officer\",\n \"cop\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👮♂️\",\n \"description\": \"man police officer\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"policeman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👮♀️\",\n \"description\": \"woman police officer\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"policewoman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕵️\",\n \"description\": \"detective\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"detective\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕵️♂️\",\n \"description\": \"man detective\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"male_detective\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕵️♀️\",\n \"description\": \"woman detective\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"female_detective\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💂\",\n \"description\": \"guard\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"guard\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💂♂️\",\n \"description\": \"man guard\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"guardsman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💂♀️\",\n \"description\": \"woman guard\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"guardswoman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👷\",\n \"description\": \"construction worker\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"construction_worker\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👷♂️\",\n \"description\": \"man construction worker\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"construction_worker_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👷♀️\",\n \"description\": \"woman construction worker\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"construction_worker_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤴\",\n \"description\": \"prince\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"prince\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👸\",\n \"description\": \"princess\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"princess\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👳\",\n \"description\": \"person wearing turban\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"person_with_turban\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👳♂️\",\n \"description\": \"man wearing turban\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_with_turban\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👳♀️\",\n \"description\": \"woman wearing turban\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_with_turban\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👲\",\n \"description\": \"person with skullcap\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_with_gua_pi_mao\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧕\",\n \"description\": \"woman with headscarf\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_with_headscarf\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤵\",\n \"description\": \"person in tuxedo\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"person_in_tuxedo\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👰\",\n \"description\": \"person with veil\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"person_with_veil\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤰\",\n \"description\": \"pregnant woman\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"pregnant_woman\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤱\",\n \"description\": \"breast-feeding\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"breast_feeding\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👼\",\n \"description\": \"baby angel\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"angel\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎅\",\n \"description\": \"Santa Claus\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"santa\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤶\",\n \"description\": \"Mrs. Claus\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"mrs_claus\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑🎄\",\n \"description\": \"mx claus\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"mx_claus\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": false\n },\n {\n \"emojiRaw\": \"🦸\",\n \"description\": \"superhero\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"superhero\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦸♂️\",\n \"description\": \"man superhero\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"superhero_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦸♀️\",\n \"description\": \"woman superhero\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"superhero_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦹\",\n \"description\": \"supervillain\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"supervillain\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦹♂️\",\n \"description\": \"man supervillain\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"supervillain_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦹♀️\",\n \"description\": \"woman supervillain\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"supervillain_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧙\",\n \"description\": \"mage\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"mage\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧙♂️\",\n \"description\": \"man mage\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"mage_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧙♀️\",\n \"description\": \"woman mage\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"mage_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧚\",\n \"description\": \"fairy\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"fairy\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧚♂️\",\n \"description\": \"man fairy\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"fairy_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧚♀️\",\n \"description\": \"woman fairy\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"fairy_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧛\",\n \"description\": \"vampire\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"vampire\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧛♂️\",\n \"description\": \"man vampire\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"vampire_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧛♀️\",\n \"description\": \"woman vampire\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"vampire_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧜\",\n \"description\": \"merperson\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"merperson\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧜♂️\",\n \"description\": \"merman\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"merman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧜♀️\",\n \"description\": \"mermaid\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"mermaid\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧝\",\n \"description\": \"elf\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"elf\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧝♂️\",\n \"description\": \"man elf\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"elf_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧝♀️\",\n \"description\": \"woman elf\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"elf_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧞\",\n \"description\": \"genie\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"genie\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧞♂️\",\n \"description\": \"man genie\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"genie_man\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧞♀️\",\n \"description\": \"woman genie\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"genie_woman\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧟\",\n \"description\": \"zombie\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"zombie\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧟♂️\",\n \"description\": \"man zombie\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"zombie_man\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧟♀️\",\n \"description\": \"woman zombie\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"zombie_woman\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💆\",\n \"description\": \"person getting massage\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"massage\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💆♂️\",\n \"description\": \"man getting massage\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"massage_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💆♀️\",\n \"description\": \"woman getting massage\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"massage_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💇\",\n \"description\": \"person getting haircut\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"haircut\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💇♂️\",\n \"description\": \"man getting haircut\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"haircut_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💇♀️\",\n \"description\": \"woman getting haircut\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"haircut_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚶\",\n \"description\": \"person walking\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"walking\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚶♂️\",\n \"description\": \"man walking\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"walking_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚶♀️\",\n \"description\": \"woman walking\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"walking_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧍\",\n \"description\": \"person standing\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"standing_person\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧍♂️\",\n \"description\": \"man standing\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"standing_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧍♀️\",\n \"description\": \"woman standing\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"standing_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧎\",\n \"description\": \"person kneeling\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"kneeling_person\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧎♂️\",\n \"description\": \"man kneeling\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"kneeling_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧎♀️\",\n \"description\": \"woman kneeling\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"kneeling_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑🦯\",\n \"description\": \"person with white cane\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"person_with_probing_cane\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨🦯\",\n \"description\": \"man with white cane\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_with_probing_cane\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩🦯\",\n \"description\": \"woman with white cane\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_with_probing_cane\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑🦼\",\n \"description\": \"person in motorized wheelchair\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"person_in_motorized_wheelchair\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨🦼\",\n \"description\": \"man in motorized wheelchair\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_in_motorized_wheelchair\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩🦼\",\n \"description\": \"woman in motorized wheelchair\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_in_motorized_wheelchair\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑🦽\",\n \"description\": \"person in manual wheelchair\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"person_in_manual_wheelchair\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨🦽\",\n \"description\": \"man in manual wheelchair\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_in_manual_wheelchair\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩🦽\",\n \"description\": \"woman in manual wheelchair\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_in_manual_wheelchair\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏃\",\n \"description\": \"person running\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"runner\",\n \"running\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏃♂️\",\n \"description\": \"man running\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"running_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏃♀️\",\n \"description\": \"woman running\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"running_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💃\",\n \"description\": \"woman dancing\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_dancing\",\n \"dancer\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕺\",\n \"description\": \"man dancing\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_dancing\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕴️\",\n \"description\": \"person in suit levitating\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"business_suit_levitating\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👯\",\n \"description\": \"people with bunny ears\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"dancers\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👯♂️\",\n \"description\": \"men with bunny ears\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"dancing_men\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👯♀️\",\n \"description\": \"women with bunny ears\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"dancing_women\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧖\",\n \"description\": \"person in steamy room\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"sauna_person\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧖♂️\",\n \"description\": \"man in steamy room\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"sauna_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧖♀️\",\n \"description\": \"woman in steamy room\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"sauna_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧗\",\n \"description\": \"person climbing\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"climbing\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧗♂️\",\n \"description\": \"man climbing\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"climbing_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧗♀️\",\n \"description\": \"woman climbing\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"climbing_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤺\",\n \"description\": \"person fencing\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"person_fencing\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏇\",\n \"description\": \"horse racing\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"horse_racing\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛷️\",\n \"description\": \"skier\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"skier\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏂\",\n \"description\": \"snowboarder\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"snowboarder\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏌️\",\n \"description\": \"person golfing\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"golfing\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏌️♂️\",\n \"description\": \"man golfing\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"golfing_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏌️♀️\",\n \"description\": \"woman golfing\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"golfing_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏄\",\n \"description\": \"person surfing\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"surfer\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏄♂️\",\n \"description\": \"man surfing\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"surfing_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏄♀️\",\n \"description\": \"woman surfing\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"surfing_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚣\",\n \"description\": \"person rowing boat\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"rowboat\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚣♂️\",\n \"description\": \"man rowing boat\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"rowing_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚣♀️\",\n \"description\": \"woman rowing boat\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"rowing_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏊\",\n \"description\": \"person swimming\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"swimmer\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏊♂️\",\n \"description\": \"man swimming\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"swimming_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏊♀️\",\n \"description\": \"woman swimming\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"swimming_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛹️\",\n \"description\": \"person bouncing ball\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"bouncing_ball_person\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛹️♂️\",\n \"description\": \"man bouncing ball\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"bouncing_ball_man\",\n \"basketball_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛹️♀️\",\n \"description\": \"woman bouncing ball\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"bouncing_ball_woman\",\n \"basketball_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏋️\",\n \"description\": \"person lifting weights\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"weight_lifting\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏋️♂️\",\n \"description\": \"man lifting weights\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"weight_lifting_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏋️♀️\",\n \"description\": \"woman lifting weights\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"weight_lifting_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚴\",\n \"description\": \"person biking\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"bicyclist\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚴♂️\",\n \"description\": \"man biking\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"biking_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚴♀️\",\n \"description\": \"woman biking\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"biking_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚵\",\n \"description\": \"person mountain biking\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"mountain_bicyclist\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚵♂️\",\n \"description\": \"man mountain biking\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"mountain_biking_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚵♀️\",\n \"description\": \"woman mountain biking\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"mountain_biking_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤸\",\n \"description\": \"person cartwheeling\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"cartwheeling\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤸♂️\",\n \"description\": \"man cartwheeling\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_cartwheeling\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤸♀️\",\n \"description\": \"woman cartwheeling\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_cartwheeling\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤼\",\n \"description\": \"people wrestling\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"wrestling\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤼♂️\",\n \"description\": \"men wrestling\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"men_wrestling\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤼♀️\",\n \"description\": \"women wrestling\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"women_wrestling\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤽\",\n \"description\": \"person playing water polo\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"water_polo\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤽♂️\",\n \"description\": \"man playing water polo\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_playing_water_polo\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤽♀️\",\n \"description\": \"woman playing water polo\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_playing_water_polo\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤾\",\n \"description\": \"person playing handball\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"handball_person\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤾♂️\",\n \"description\": \"man playing handball\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_playing_handball\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤾♀️\",\n \"description\": \"woman playing handball\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_playing_handball\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤹\",\n \"description\": \"person juggling\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"juggling_person\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤹♂️\",\n \"description\": \"man juggling\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"man_juggling\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤹♀️\",\n \"description\": \"woman juggling\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"woman_juggling\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧘\",\n \"description\": \"person in lotus position\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"lotus_position\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧘♂️\",\n \"description\": \"man in lotus position\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"lotus_position_man\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧘♀️\",\n \"description\": \"woman in lotus position\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"lotus_position_woman\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛀\",\n \"description\": \"person taking bath\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"bath\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛌\",\n \"description\": \"person in bed\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"sleeping_bed\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧑🤝🧑\",\n \"description\": \"people holding hands\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"people_holding_hands\"\n ],\n \"supportsSkinTone\": false,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👭\",\n \"description\": \"women holding hands\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"two_women_holding_hands\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👫\",\n \"description\": \"woman and man holding hands\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"couple\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👬\",\n \"description\": \"men holding hands\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"two_men_holding_hands\"\n ],\n \"supportsSkinTone\": true,\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💏\",\n \"description\": \"kiss\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"couplekiss\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩❤️💋👨\",\n \"description\": \"kiss: woman, man\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"couplekiss_man_woman\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨❤️💋👨\",\n \"description\": \"kiss: man, man\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"couplekiss_man_man\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩❤️💋👩\",\n \"description\": \"kiss: woman, woman\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"couplekiss_woman_woman\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💑\",\n \"description\": \"couple with heart\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"couple_with_heart\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩❤️👨\",\n \"description\": \"couple with heart: woman, man\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"couple_with_heart_woman_man\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨❤️👨\",\n \"description\": \"couple with heart: man, man\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"couple_with_heart_man_man\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩❤️👩\",\n \"description\": \"couple with heart: woman, woman\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"couple_with_heart_woman_woman\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👪\",\n \"description\": \"family\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨👩👦\",\n \"description\": \"family: man, woman, boy\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_man_woman_boy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨👩👧\",\n \"description\": \"family: man, woman, girl\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_man_woman_girl\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨👩👧👦\",\n \"description\": \"family: man, woman, girl, boy\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_man_woman_girl_boy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨👩👦👦\",\n \"description\": \"family: man, woman, boy, boy\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_man_woman_boy_boy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨👩👧👧\",\n \"description\": \"family: man, woman, girl, girl\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_man_woman_girl_girl\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨👨👦\",\n \"description\": \"family: man, man, boy\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_man_man_boy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨👨👧\",\n \"description\": \"family: man, man, girl\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_man_man_girl\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨👨👧👦\",\n \"description\": \"family: man, man, girl, boy\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_man_man_girl_boy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨👨👦👦\",\n \"description\": \"family: man, man, boy, boy\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_man_man_boy_boy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨👨👧👧\",\n \"description\": \"family: man, man, girl, girl\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_man_man_girl_girl\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩👩👦\",\n \"description\": \"family: woman, woman, boy\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_woman_woman_boy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩👩👧\",\n \"description\": \"family: woman, woman, girl\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_woman_woman_girl\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩👩👧👦\",\n \"description\": \"family: woman, woman, girl, boy\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_woman_woman_girl_boy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩👩👦👦\",\n \"description\": \"family: woman, woman, boy, boy\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_woman_woman_boy_boy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩👩👧👧\",\n \"description\": \"family: woman, woman, girl, girl\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_woman_woman_girl_girl\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨👦\",\n \"description\": \"family: man, boy\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_man_boy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨👦👦\",\n \"description\": \"family: man, boy, boy\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_man_boy_boy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨👧\",\n \"description\": \"family: man, girl\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_man_girl\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨👧👦\",\n \"description\": \"family: man, girl, boy\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_man_girl_boy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👨👧👧\",\n \"description\": \"family: man, girl, girl\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_man_girl_girl\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩👦\",\n \"description\": \"family: woman, boy\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_woman_boy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩👦👦\",\n \"description\": \"family: woman, boy, boy\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_woman_boy_boy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩👧\",\n \"description\": \"family: woman, girl\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_woman_girl\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩👧👦\",\n \"description\": \"family: woman, girl, boy\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_woman_girl_boy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👩👧👧\",\n \"description\": \"family: woman, girl, girl\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"family_woman_girl_girl\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🗣️\",\n \"description\": \"speaking head\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"speaking_head\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👤\",\n \"description\": \"bust in silhouette\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"bust_in_silhouette\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👥\",\n \"description\": \"busts in silhouette\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"busts_in_silhouette\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👣\",\n \"description\": \"footprints\",\n \"category\": \"People & Body\",\n \"aliases\": [\n \"footprints\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐵\",\n \"description\": \"monkey face\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"monkey_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐒\",\n \"description\": \"monkey\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"monkey\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦍\",\n \"description\": \"gorilla\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"gorilla\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦧\",\n \"description\": \"orangutan\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"orangutan\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐶\",\n \"description\": \"dog face\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"dog\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐕\",\n \"description\": \"dog\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"dog2\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦮\",\n \"description\": \"guide dog\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"guide_dog\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐕🦺\",\n \"description\": \"service dog\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"service_dog\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐩\",\n \"description\": \"poodle\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"poodle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐺\",\n \"description\": \"wolf\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"wolf\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦊\",\n \"description\": \"fox\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"fox_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦝\",\n \"description\": \"raccoon\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"raccoon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐱\",\n \"description\": \"cat face\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"cat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐈\",\n \"description\": \"cat\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"cat2\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦁\",\n \"description\": \"lion\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"lion\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐯\",\n \"description\": \"tiger face\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"tiger\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐅\",\n \"description\": \"tiger\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"tiger2\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐆\",\n \"description\": \"leopard\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"leopard\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐴\",\n \"description\": \"horse face\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"horse\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐎\",\n \"description\": \"horse\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"racehorse\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦄\",\n \"description\": \"unicorn\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"unicorn\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦓\",\n \"description\": \"zebra\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"zebra\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦌\",\n \"description\": \"deer\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"deer\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐮\",\n \"description\": \"cow face\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"cow\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐂\",\n \"description\": \"ox\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"ox\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐃\",\n \"description\": \"water buffalo\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"water_buffalo\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐄\",\n \"description\": \"cow\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"cow2\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐷\",\n \"description\": \"pig face\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"pig\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐖\",\n \"description\": \"pig\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"pig2\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐗\",\n \"description\": \"boar\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"boar\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐽\",\n \"description\": \"pig nose\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"pig_nose\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐏\",\n \"description\": \"ram\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"ram\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐑\",\n \"description\": \"ewe\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"sheep\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐐\",\n \"description\": \"goat\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"goat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐪\",\n \"description\": \"camel\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"dromedary_camel\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐫\",\n \"description\": \"two-hump camel\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"camel\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦙\",\n \"description\": \"llama\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"llama\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦒\",\n \"description\": \"giraffe\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"giraffe\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐘\",\n \"description\": \"elephant\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"elephant\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦏\",\n \"description\": \"rhinoceros\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"rhinoceros\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦛\",\n \"description\": \"hippopotamus\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"hippopotamus\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐭\",\n \"description\": \"mouse face\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"mouse\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐁\",\n \"description\": \"mouse\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"mouse2\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐀\",\n \"description\": \"rat\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"rat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐹\",\n \"description\": \"hamster\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"hamster\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐰\",\n \"description\": \"rabbit face\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"rabbit\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐇\",\n \"description\": \"rabbit\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"rabbit2\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐿️\",\n \"description\": \"chipmunk\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"chipmunk\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦔\",\n \"description\": \"hedgehog\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"hedgehog\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦇\",\n \"description\": \"bat\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"bat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐻\",\n \"description\": \"bear\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"bear\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐻❄️\",\n \"description\": \"polar bear\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"polar_bear\"\n ],\n \"hasMarkdownRepresentation\": false\n },\n {\n \"emojiRaw\": \"🐨\",\n \"description\": \"koala\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"koala\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐼\",\n \"description\": \"panda\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"panda_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦥\",\n \"description\": \"sloth\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"sloth\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦦\",\n \"description\": \"otter\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"otter\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦨\",\n \"description\": \"skunk\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"skunk\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦘\",\n \"description\": \"kangaroo\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"kangaroo\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦡\",\n \"description\": \"badger\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"badger\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐾\",\n \"description\": \"paw prints\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"feet\",\n \"paw_prints\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦃\",\n \"description\": \"turkey\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"turkey\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐔\",\n \"description\": \"chicken\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"chicken\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐓\",\n \"description\": \"rooster\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"rooster\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐣\",\n \"description\": \"hatching chick\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"hatching_chick\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐤\",\n \"description\": \"baby chick\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"baby_chick\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐥\",\n \"description\": \"front-facing baby chick\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"hatched_chick\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐦\",\n \"description\": \"bird\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"bird\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐧\",\n \"description\": \"penguin\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"penguin\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕊️\",\n \"description\": \"dove\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"dove\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦅\",\n \"description\": \"eagle\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"eagle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦆\",\n \"description\": \"duck\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"duck\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦢\",\n \"description\": \"swan\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"swan\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦉\",\n \"description\": \"owl\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"owl\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦩\",\n \"description\": \"flamingo\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"flamingo\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦚\",\n \"description\": \"peacock\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"peacock\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦜\",\n \"description\": \"parrot\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"parrot\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐸\",\n \"description\": \"frog\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"frog\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐊\",\n \"description\": \"crocodile\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"crocodile\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐢\",\n \"description\": \"turtle\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"turtle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦎\",\n \"description\": \"lizard\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"lizard\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐍\",\n \"description\": \"snake\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"snake\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐲\",\n \"description\": \"dragon face\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"dragon_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐉\",\n \"description\": \"dragon\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"dragon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦕\",\n \"description\": \"sauropod\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"sauropod\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦖\",\n \"description\": \"T-Rex\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"t-rex\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐳\",\n \"description\": \"spouting whale\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"whale\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐋\",\n \"description\": \"whale\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"whale2\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐬\",\n \"description\": \"dolphin\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"dolphin\",\n \"flipper\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐟\",\n \"description\": \"fish\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"fish\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐠\",\n \"description\": \"tropical fish\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"tropical_fish\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐡\",\n \"description\": \"blowfish\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"blowfish\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦈\",\n \"description\": \"shark\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"shark\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐙\",\n \"description\": \"octopus\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"octopus\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐚\",\n \"description\": \"spiral shell\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"shell\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐌\",\n \"description\": \"snail\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"snail\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦋\",\n \"description\": \"butterfly\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"butterfly\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐛\",\n \"description\": \"bug\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"bug\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐜\",\n \"description\": \"ant\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"ant\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐝\",\n \"description\": \"honeybee\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"bee\",\n \"honeybee\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🐞\",\n \"description\": \"lady beetle\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"lady_beetle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦗\",\n \"description\": \"cricket\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"cricket\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕷️\",\n \"description\": \"spider\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"spider\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕸️\",\n \"description\": \"spider web\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"spider_web\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦂\",\n \"description\": \"scorpion\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"scorpion\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦟\",\n \"description\": \"mosquito\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"mosquito\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦠\",\n \"description\": \"microbe\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"microbe\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💐\",\n \"description\": \"bouquet\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"bouquet\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌸\",\n \"description\": \"cherry blossom\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"cherry_blossom\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💮\",\n \"description\": \"white flower\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"white_flower\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏵️\",\n \"description\": \"rosette\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"rosette\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌹\",\n \"description\": \"rose\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"rose\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥀\",\n \"description\": \"wilted flower\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"wilted_flower\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌺\",\n \"description\": \"hibiscus\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"hibiscus\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌻\",\n \"description\": \"sunflower\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"sunflower\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌼\",\n \"description\": \"blossom\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"blossom\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌷\",\n \"description\": \"tulip\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"tulip\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌱\",\n \"description\": \"seedling\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"seedling\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌲\",\n \"description\": \"evergreen tree\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"evergreen_tree\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌳\",\n \"description\": \"deciduous tree\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"deciduous_tree\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌴\",\n \"description\": \"palm tree\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"palm_tree\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌵\",\n \"description\": \"cactus\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"cactus\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌾\",\n \"description\": \"sheaf of rice\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"ear_of_rice\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌿\",\n \"description\": \"herb\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"herb\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"☘️\",\n \"description\": \"shamrock\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"shamrock\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍀\",\n \"description\": \"four leaf clover\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"four_leaf_clover\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍁\",\n \"description\": \"maple leaf\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"maple_leaf\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍂\",\n \"description\": \"fallen leaf\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"fallen_leaf\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍃\",\n \"description\": \"leaf fluttering in wind\",\n \"category\": \"Animals & Nature\",\n \"aliases\": [\n \"leaves\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍇\",\n \"description\": \"grapes\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"grapes\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍈\",\n \"description\": \"melon\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"melon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍉\",\n \"description\": \"watermelon\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"watermelon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍊\",\n \"description\": \"tangerine\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"tangerine\",\n \"orange\",\n \"mandarin\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍋\",\n \"description\": \"lemon\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"lemon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍌\",\n \"description\": \"banana\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"banana\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍍\",\n \"description\": \"pineapple\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"pineapple\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥭\",\n \"description\": \"mango\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"mango\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍎\",\n \"description\": \"red apple\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"apple\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍏\",\n \"description\": \"green apple\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"green_apple\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍐\",\n \"description\": \"pear\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"pear\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍑\",\n \"description\": \"peach\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"peach\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍒\",\n \"description\": \"cherries\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"cherries\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍓\",\n \"description\": \"strawberry\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"strawberry\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥝\",\n \"description\": \"kiwi fruit\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"kiwi_fruit\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍅\",\n \"description\": \"tomato\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"tomato\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥥\",\n \"description\": \"coconut\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"coconut\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥑\",\n \"description\": \"avocado\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"avocado\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍆\",\n \"description\": \"eggplant\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"eggplant\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥔\",\n \"description\": \"potato\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"potato\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥕\",\n \"description\": \"carrot\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"carrot\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌽\",\n \"description\": \"ear of corn\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"corn\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌶️\",\n \"description\": \"hot pepper\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"hot_pepper\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥒\",\n \"description\": \"cucumber\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"cucumber\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥬\",\n \"description\": \"leafy green\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"leafy_green\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥦\",\n \"description\": \"broccoli\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"broccoli\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧄\",\n \"description\": \"garlic\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"garlic\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧅\",\n \"description\": \"onion\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"onion\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍄\",\n \"description\": \"mushroom\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"mushroom\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥜\",\n \"description\": \"peanuts\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"peanuts\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌰\",\n \"description\": \"chestnut\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"chestnut\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍞\",\n \"description\": \"bread\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"bread\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥐\",\n \"description\": \"croissant\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"croissant\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥖\",\n \"description\": \"baguette bread\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"baguette_bread\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥨\",\n \"description\": \"pretzel\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"pretzel\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥯\",\n \"description\": \"bagel\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"bagel\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥞\",\n \"description\": \"pancakes\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"pancakes\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧇\",\n \"description\": \"waffle\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"waffle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧀\",\n \"description\": \"cheese wedge\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"cheese\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍖\",\n \"description\": \"meat on bone\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"meat_on_bone\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍗\",\n \"description\": \"poultry leg\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"poultry_leg\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥩\",\n \"description\": \"cut of meat\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"cut_of_meat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥓\",\n \"description\": \"bacon\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"bacon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍔\",\n \"description\": \"hamburger\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"hamburger\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍟\",\n \"description\": \"french fries\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"fries\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍕\",\n \"description\": \"pizza\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"pizza\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌭\",\n \"description\": \"hot dog\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"hotdog\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥪\",\n \"description\": \"sandwich\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"sandwich\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌮\",\n \"description\": \"taco\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"taco\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌯\",\n \"description\": \"burrito\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"burrito\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥙\",\n \"description\": \"stuffed flatbread\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"stuffed_flatbread\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧆\",\n \"description\": \"falafel\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"falafel\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥚\",\n \"description\": \"egg\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"egg\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍳\",\n \"description\": \"cooking\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"fried_egg\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥘\",\n \"description\": \"shallow pan of food\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"shallow_pan_of_food\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍲\",\n \"description\": \"pot of food\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"stew\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥣\",\n \"description\": \"bowl with spoon\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"bowl_with_spoon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥗\",\n \"description\": \"green salad\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"green_salad\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍿\",\n \"description\": \"popcorn\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"popcorn\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧈\",\n \"description\": \"butter\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"butter\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧂\",\n \"description\": \"salt\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"salt\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥫\",\n \"description\": \"canned food\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"canned_food\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍱\",\n \"description\": \"bento box\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"bento\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍘\",\n \"description\": \"rice cracker\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"rice_cracker\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍙\",\n \"description\": \"rice ball\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"rice_ball\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍚\",\n \"description\": \"cooked rice\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"rice\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍛\",\n \"description\": \"curry rice\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"curry\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍜\",\n \"description\": \"steaming bowl\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"ramen\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍝\",\n \"description\": \"spaghetti\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"spaghetti\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍠\",\n \"description\": \"roasted sweet potato\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"sweet_potato\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍢\",\n \"description\": \"oden\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"oden\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍣\",\n \"description\": \"sushi\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"sushi\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍤\",\n \"description\": \"fried shrimp\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"fried_shrimp\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍥\",\n \"description\": \"fish cake with swirl\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"fish_cake\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥮\",\n \"description\": \"moon cake\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"moon_cake\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍡\",\n \"description\": \"dango\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"dango\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥟\",\n \"description\": \"dumpling\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"dumpling\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥠\",\n \"description\": \"fortune cookie\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"fortune_cookie\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥡\",\n \"description\": \"takeout box\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"takeout_box\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦀\",\n \"description\": \"crab\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"crab\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦞\",\n \"description\": \"lobster\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"lobster\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦐\",\n \"description\": \"shrimp\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"shrimp\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦑\",\n \"description\": \"squid\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"squid\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦪\",\n \"description\": \"oyster\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"oyster\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍦\",\n \"description\": \"soft ice cream\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"icecream\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍧\",\n \"description\": \"shaved ice\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"shaved_ice\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍨\",\n \"description\": \"ice cream\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"ice_cream\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍩\",\n \"description\": \"doughnut\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"doughnut\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍪\",\n \"description\": \"cookie\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"cookie\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎂\",\n \"description\": \"birthday cake\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"birthday\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍰\",\n \"description\": \"shortcake\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"cake\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧁\",\n \"description\": \"cupcake\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"cupcake\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥧\",\n \"description\": \"pie\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"pie\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍫\",\n \"description\": \"chocolate bar\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"chocolate_bar\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍬\",\n \"description\": \"candy\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"candy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍭\",\n \"description\": \"lollipop\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"lollipop\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍮\",\n \"description\": \"custard\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"custard\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍯\",\n \"description\": \"honey pot\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"honey_pot\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍼\",\n \"description\": \"baby bottle\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"baby_bottle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥛\",\n \"description\": \"glass of milk\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"milk_glass\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"☕\",\n \"description\": \"hot beverage\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"coffee\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍵\",\n \"description\": \"teacup without handle\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"tea\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍶\",\n \"description\": \"sake\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"sake\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍾\",\n \"description\": \"bottle with popping cork\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"champagne\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍷\",\n \"description\": \"wine glass\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"wine_glass\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍸\",\n \"description\": \"cocktail glass\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"cocktail\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍹\",\n \"description\": \"tropical drink\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"tropical_drink\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍺\",\n \"description\": \"beer mug\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"beer\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍻\",\n \"description\": \"clinking beer mugs\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"beers\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥂\",\n \"description\": \"clinking glasses\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"clinking_glasses\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥃\",\n \"description\": \"tumbler glass\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"tumbler_glass\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥤\",\n \"description\": \"cup with straw\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"cup_with_straw\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧃\",\n \"description\": \"beverage box\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"beverage_box\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧉\",\n \"description\": \"mate\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"mate\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧊\",\n \"description\": \"ice\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"ice_cube\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥢\",\n \"description\": \"chopsticks\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"chopsticks\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍽️\",\n \"description\": \"fork and knife with plate\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"plate_with_cutlery\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🍴\",\n \"description\": \"fork and knife\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"fork_and_knife\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥄\",\n \"description\": \"spoon\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"spoon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔪\",\n \"description\": \"kitchen knife\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"hocho\",\n \"knife\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏺\",\n \"description\": \"amphora\",\n \"category\": \"Food & Drink\",\n \"aliases\": [\n \"amphora\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌍\",\n \"description\": \"globe showing Europe-Africa\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"earth_africa\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌎\",\n \"description\": \"globe showing Americas\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"earth_americas\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌏\",\n \"description\": \"globe showing Asia-Australia\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"earth_asia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌐\",\n \"description\": \"globe with meridians\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"globe_with_meridians\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🗺️\",\n \"description\": \"world map\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"world_map\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🗾\",\n \"description\": \"map of Japan\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"japan\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧭\",\n \"description\": \"compass\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"compass\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏔️\",\n \"description\": \"snow-capped mountain\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"mountain_snow\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛰️\",\n \"description\": \"mountain\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"mountain\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌋\",\n \"description\": \"volcano\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"volcano\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🗻\",\n \"description\": \"mount fuji\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"mount_fuji\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏕️\",\n \"description\": \"camping\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"camping\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏖️\",\n \"description\": \"beach with umbrella\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"beach_umbrella\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏜️\",\n \"description\": \"desert\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"desert\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏝️\",\n \"description\": \"desert island\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"desert_island\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏞️\",\n \"description\": \"national park\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"national_park\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏟️\",\n \"description\": \"stadium\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"stadium\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏛️\",\n \"description\": \"classical building\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"classical_building\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏗️\",\n \"description\": \"building construction\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"building_construction\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧱\",\n \"description\": \"brick\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"bricks\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏘️\",\n \"description\": \"houses\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"houses\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏚️\",\n \"description\": \"derelict house\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"derelict_house\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏠\",\n \"description\": \"house\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"house\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏡\",\n \"description\": \"house with garden\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"house_with_garden\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏢\",\n \"description\": \"office building\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"office\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏣\",\n \"description\": \"Japanese post office\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"post_office\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏤\",\n \"description\": \"post office\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"european_post_office\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏥\",\n \"description\": \"hospital\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"hospital\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏦\",\n \"description\": \"bank\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"bank\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏨\",\n \"description\": \"hotel\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"hotel\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏩\",\n \"description\": \"love hotel\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"love_hotel\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏪\",\n \"description\": \"convenience store\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"convenience_store\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏫\",\n \"description\": \"school\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"school\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏬\",\n \"description\": \"department store\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"department_store\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏭\",\n \"description\": \"factory\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"factory\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏯\",\n \"description\": \"Japanese castle\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"japanese_castle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏰\",\n \"description\": \"castle\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"european_castle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💒\",\n \"description\": \"wedding\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"wedding\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🗼\",\n \"description\": \"Tokyo tower\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"tokyo_tower\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🗽\",\n \"description\": \"Statue of Liberty\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"statue_of_liberty\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛪\",\n \"description\": \"church\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"church\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕌\",\n \"description\": \"mosque\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"mosque\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛕\",\n \"description\": \"hindu temple\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"hindu_temple\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕍\",\n \"description\": \"synagogue\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"synagogue\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛩️\",\n \"description\": \"shinto shrine\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"shinto_shrine\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕋\",\n \"description\": \"kaaba\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"kaaba\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛲\",\n \"description\": \"fountain\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"fountain\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛺\",\n \"description\": \"tent\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"tent\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌁\",\n \"description\": \"foggy\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"foggy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌃\",\n \"description\": \"night with stars\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"night_with_stars\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏙️\",\n \"description\": \"cityscape\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"cityscape\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌄\",\n \"description\": \"sunrise over mountains\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"sunrise_over_mountains\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌅\",\n \"description\": \"sunrise\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"sunrise\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌆\",\n \"description\": \"cityscape at dusk\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"city_sunset\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌇\",\n \"description\": \"sunset\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"city_sunrise\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌉\",\n \"description\": \"bridge at night\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"bridge_at_night\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♨️\",\n \"description\": \"hot springs\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"hotsprings\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎠\",\n \"description\": \"carousel horse\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"carousel_horse\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎡\",\n \"description\": \"ferris wheel\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"ferris_wheel\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎢\",\n \"description\": \"roller coaster\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"roller_coaster\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💈\",\n \"description\": \"barber pole\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"barber\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎪\",\n \"description\": \"circus tent\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"circus_tent\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚂\",\n \"description\": \"locomotive\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"steam_locomotive\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚃\",\n \"description\": \"railway car\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"railway_car\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚄\",\n \"description\": \"high-speed train\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"bullettrain_side\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚅\",\n \"description\": \"bullet train\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"bullettrain_front\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚆\",\n \"description\": \"train\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"train2\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚇\",\n \"description\": \"metro\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"metro\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚈\",\n \"description\": \"light rail\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"light_rail\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚉\",\n \"description\": \"station\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"station\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚊\",\n \"description\": \"tram\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"tram\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚝\",\n \"description\": \"monorail\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"monorail\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚞\",\n \"description\": \"mountain railway\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"mountain_railway\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚋\",\n \"description\": \"tram car\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"train\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚌\",\n \"description\": \"bus\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"bus\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚍\",\n \"description\": \"oncoming bus\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"oncoming_bus\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚎\",\n \"description\": \"trolleybus\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"trolleybus\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚐\",\n \"description\": \"minibus\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"minibus\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚑\",\n \"description\": \"ambulance\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"ambulance\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚒\",\n \"description\": \"fire engine\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"fire_engine\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚓\",\n \"description\": \"police car\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"police_car\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚔\",\n \"description\": \"oncoming police car\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"oncoming_police_car\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚕\",\n \"description\": \"taxi\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"taxi\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚖\",\n \"description\": \"oncoming taxi\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"oncoming_taxi\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚗\",\n \"description\": \"automobile\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"car\",\n \"red_car\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚘\",\n \"description\": \"oncoming automobile\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"oncoming_automobile\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚙\",\n \"description\": \"sport utility vehicle\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"blue_car\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚚\",\n \"description\": \"delivery truck\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"truck\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚛\",\n \"description\": \"articulated lorry\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"articulated_lorry\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚜\",\n \"description\": \"tractor\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"tractor\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏎️\",\n \"description\": \"racing car\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"racing_car\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏍️\",\n \"description\": \"motorcycle\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"motorcycle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛵\",\n \"description\": \"motor scooter\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"motor_scooter\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦽\",\n \"description\": \"manual wheelchair\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"manual_wheelchair\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦼\",\n \"description\": \"motorized wheelchair\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"motorized_wheelchair\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛺\",\n \"description\": \"auto rickshaw\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"auto_rickshaw\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚲\",\n \"description\": \"bicycle\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"bike\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛴\",\n \"description\": \"kick scooter\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"kick_scooter\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛹\",\n \"description\": \"skateboard\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"skateboard\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚏\",\n \"description\": \"bus stop\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"busstop\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛣️\",\n \"description\": \"motorway\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"motorway\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛤️\",\n \"description\": \"railway track\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"railway_track\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛢️\",\n \"description\": \"oil drum\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"oil_drum\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛽\",\n \"description\": \"fuel pump\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"fuelpump\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚨\",\n \"description\": \"police car light\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"rotating_light\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚥\",\n \"description\": \"horizontal traffic light\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"traffic_light\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚦\",\n \"description\": \"vertical traffic light\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"vertical_traffic_light\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛑\",\n \"description\": \"stop sign\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"stop_sign\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚧\",\n \"description\": \"construction\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"construction\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⚓\",\n \"description\": \"anchor\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"anchor\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛵\",\n \"description\": \"sailboat\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"boat\",\n \"sailboat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛶\",\n \"description\": \"canoe\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"canoe\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚤\",\n \"description\": \"speedboat\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"speedboat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛳️\",\n \"description\": \"passenger ship\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"passenger_ship\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛴️\",\n \"description\": \"ferry\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"ferry\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛥️\",\n \"description\": \"motor boat\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"motor_boat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚢\",\n \"description\": \"ship\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"ship\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"✈️\",\n \"description\": \"airplane\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"airplane\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛩️\",\n \"description\": \"small airplane\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"small_airplane\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛫\",\n \"description\": \"airplane departure\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"flight_departure\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛬\",\n \"description\": \"airplane arrival\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"flight_arrival\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🪂\",\n \"description\": \"parachute\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"parachute\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💺\",\n \"description\": \"seat\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"seat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚁\",\n \"description\": \"helicopter\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"helicopter\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚟\",\n \"description\": \"suspension railway\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"suspension_railway\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚠\",\n \"description\": \"mountain cableway\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"mountain_cableway\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚡\",\n \"description\": \"aerial tramway\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"aerial_tramway\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛰️\",\n \"description\": \"satellite\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"artificial_satellite\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚀\",\n \"description\": \"rocket\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"rocket\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛸\",\n \"description\": \"flying saucer\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"flying_saucer\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛎️\",\n \"description\": \"bellhop bell\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"bellhop_bell\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧳\",\n \"description\": \"luggage\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"luggage\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⌛\",\n \"description\": \"hourglass done\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"hourglass\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⏳\",\n \"description\": \"hourglass not done\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"hourglass_flowing_sand\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⌚\",\n \"description\": \"watch\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"watch\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⏰\",\n \"description\": \"alarm clock\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"alarm_clock\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⏱️\",\n \"description\": \"stopwatch\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"stopwatch\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⏲️\",\n \"description\": \"timer clock\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"timer_clock\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕰️\",\n \"description\": \"mantelpiece clock\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"mantelpiece_clock\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕛\",\n \"description\": \"twelve o’clock\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock12\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕧\",\n \"description\": \"twelve-thirty\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock1230\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕐\",\n \"description\": \"one o’clock\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock1\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕜\",\n \"description\": \"one-thirty\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock130\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕑\",\n \"description\": \"two o’clock\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock2\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕝\",\n \"description\": \"two-thirty\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock230\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕒\",\n \"description\": \"three o’clock\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock3\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕞\",\n \"description\": \"three-thirty\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock330\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕓\",\n \"description\": \"four o’clock\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock4\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕟\",\n \"description\": \"four-thirty\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock430\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕔\",\n \"description\": \"five o’clock\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock5\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕠\",\n \"description\": \"five-thirty\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock530\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕕\",\n \"description\": \"six o’clock\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock6\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕡\",\n \"description\": \"six-thirty\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock630\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕖\",\n \"description\": \"seven o’clock\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock7\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕢\",\n \"description\": \"seven-thirty\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock730\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕗\",\n \"description\": \"eight o’clock\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock8\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕣\",\n \"description\": \"eight-thirty\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock830\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕘\",\n \"description\": \"nine o’clock\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock9\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕤\",\n \"description\": \"nine-thirty\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock930\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕙\",\n \"description\": \"ten o’clock\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock10\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕥\",\n \"description\": \"ten-thirty\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock1030\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕚\",\n \"description\": \"eleven o’clock\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock11\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕦\",\n \"description\": \"eleven-thirty\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"clock1130\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌑\",\n \"description\": \"new moon\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"new_moon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌒\",\n \"description\": \"waxing crescent moon\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"waxing_crescent_moon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌓\",\n \"description\": \"first quarter moon\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"first_quarter_moon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌔\",\n \"description\": \"waxing gibbous moon\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"moon\",\n \"waxing_gibbous_moon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌕\",\n \"description\": \"full moon\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"full_moon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌖\",\n \"description\": \"waning gibbous moon\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"waning_gibbous_moon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌗\",\n \"description\": \"last quarter moon\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"last_quarter_moon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌘\",\n \"description\": \"waning crescent moon\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"waning_crescent_moon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌙\",\n \"description\": \"crescent moon\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"crescent_moon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌚\",\n \"description\": \"new moon face\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"new_moon_with_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌛\",\n \"description\": \"first quarter moon face\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"first_quarter_moon_with_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌜\",\n \"description\": \"last quarter moon face\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"last_quarter_moon_with_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌡️\",\n \"description\": \"thermometer\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"thermometer\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"☀️\",\n \"description\": \"sun\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"sunny\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌝\",\n \"description\": \"full moon face\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"full_moon_with_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌞\",\n \"description\": \"sun with face\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"sun_with_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🪐\",\n \"description\": \"ringed planet\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"ringed_planet\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⭐\",\n \"description\": \"star\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"star\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌟\",\n \"description\": \"glowing star\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"star2\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌠\",\n \"description\": \"shooting star\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"stars\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌌\",\n \"description\": \"milky way\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"milky_way\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"☁️\",\n \"description\": \"cloud\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"cloud\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛅\",\n \"description\": \"sun behind cloud\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"partly_sunny\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛈️\",\n \"description\": \"cloud with lightning and rain\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"cloud_with_lightning_and_rain\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌤️\",\n \"description\": \"sun behind small cloud\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"sun_behind_small_cloud\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌥️\",\n \"description\": \"sun behind large cloud\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"sun_behind_large_cloud\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌦️\",\n \"description\": \"sun behind rain cloud\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"sun_behind_rain_cloud\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌧️\",\n \"description\": \"cloud with rain\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"cloud_with_rain\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌨️\",\n \"description\": \"cloud with snow\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"cloud_with_snow\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌩️\",\n \"description\": \"cloud with lightning\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"cloud_with_lightning\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌪️\",\n \"description\": \"tornado\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"tornado\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌫️\",\n \"description\": \"fog\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"fog\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌬️\",\n \"description\": \"wind face\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"wind_face\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌀\",\n \"description\": \"cyclone\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"cyclone\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌈\",\n \"description\": \"rainbow\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"rainbow\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌂\",\n \"description\": \"closed umbrella\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"closed_umbrella\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"☂️\",\n \"description\": \"umbrella\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"open_umbrella\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"☔\",\n \"description\": \"umbrella with rain drops\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"umbrella\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛱️\",\n \"description\": \"umbrella on ground\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"parasol_on_ground\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⚡\",\n \"description\": \"high voltage\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"zap\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"❄️\",\n \"description\": \"snowflake\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"snowflake\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"☃️\",\n \"description\": \"snowman\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"snowman_with_snow\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛄\",\n \"description\": \"snowman without snow\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"snowman\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"☄️\",\n \"description\": \"comet\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"comet\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔥\",\n \"description\": \"fire\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"fire\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💧\",\n \"description\": \"droplet\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"droplet\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🌊\",\n \"description\": \"water wave\",\n \"category\": \"Travel & Places\",\n \"aliases\": [\n \"ocean\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎃\",\n \"description\": \"jack-o-lantern\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"jack_o_lantern\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎄\",\n \"description\": \"Christmas tree\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"christmas_tree\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎆\",\n \"description\": \"fireworks\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"fireworks\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎇\",\n \"description\": \"sparkler\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"sparkler\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧨\",\n \"description\": \"firecracker\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"firecracker\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"✨\",\n \"description\": \"sparkles\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"sparkles\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎈\",\n \"description\": \"balloon\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"balloon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎉\",\n \"description\": \"party popper\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"tada\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎊\",\n \"description\": \"confetti ball\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"confetti_ball\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎋\",\n \"description\": \"tanabata tree\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"tanabata_tree\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎍\",\n \"description\": \"pine decoration\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"bamboo\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎎\",\n \"description\": \"Japanese dolls\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"dolls\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎏\",\n \"description\": \"carp streamer\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"flags\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎐\",\n \"description\": \"wind chime\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"wind_chime\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎑\",\n \"description\": \"moon viewing ceremony\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"rice_scene\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧧\",\n \"description\": \"red envelope\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"red_envelope\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎀\",\n \"description\": \"ribbon\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"ribbon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎁\",\n \"description\": \"wrapped gift\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"gift\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎗️\",\n \"description\": \"reminder ribbon\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"reminder_ribbon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎟️\",\n \"description\": \"admission tickets\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"tickets\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎫\",\n \"description\": \"ticket\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"ticket\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎖️\",\n \"description\": \"military medal\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"medal_military\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏆\",\n \"description\": \"trophy\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"trophy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏅\",\n \"description\": \"sports medal\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"medal_sports\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥇\",\n \"description\": \"1st place medal\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"1st_place_medal\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥈\",\n \"description\": \"2nd place medal\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"2nd_place_medal\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥉\",\n \"description\": \"3rd place medal\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"3rd_place_medal\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⚽\",\n \"description\": \"soccer ball\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"soccer\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⚾\",\n \"description\": \"baseball\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"baseball\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥎\",\n \"description\": \"softball\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"softball\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏀\",\n \"description\": \"basketball\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"basketball\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏐\",\n \"description\": \"volleyball\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"volleyball\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏈\",\n \"description\": \"american football\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"football\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏉\",\n \"description\": \"rugby football\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"rugby_football\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎾\",\n \"description\": \"tennis\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"tennis\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥏\",\n \"description\": \"flying disc\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"flying_disc\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎳\",\n \"description\": \"bowling\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"bowling\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏏\",\n \"description\": \"cricket game\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"cricket_game\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏑\",\n \"description\": \"field hockey\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"field_hockey\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏒\",\n \"description\": \"ice hockey\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"ice_hockey\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥍\",\n \"description\": \"lacrosse\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"lacrosse\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏓\",\n \"description\": \"ping pong\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"ping_pong\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏸\",\n \"description\": \"badminton\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"badminton\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥊\",\n \"description\": \"boxing glove\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"boxing_glove\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥋\",\n \"description\": \"martial arts uniform\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"martial_arts_uniform\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥅\",\n \"description\": \"goal net\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"goal_net\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛳\",\n \"description\": \"flag in hole\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"golf\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛸️\",\n \"description\": \"ice skate\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"ice_skate\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎣\",\n \"description\": \"fishing pole\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"fishing_pole_and_fish\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🤿\",\n \"description\": \"diving mask\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"diving_mask\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎽\",\n \"description\": \"running shirt\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"running_shirt_with_sash\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎿\",\n \"description\": \"skis\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"ski\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛷\",\n \"description\": \"sled\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"sled\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥌\",\n \"description\": \"curling stone\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"curling_stone\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎯\",\n \"description\": \"direct hit\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"dart\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🪀\",\n \"description\": \"yo-yo\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"yo_yo\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🪁\",\n \"description\": \"kite\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"kite\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎱\",\n \"description\": \"pool 8 ball\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"8ball\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔮\",\n \"description\": \"crystal ball\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"crystal_ball\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧿\",\n \"description\": \"nazar amulet\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"nazar_amulet\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎮\",\n \"description\": \"video game\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"video_game\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕹️\",\n \"description\": \"joystick\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"joystick\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎰\",\n \"description\": \"slot machine\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"slot_machine\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎲\",\n \"description\": \"game die\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"game_die\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧩\",\n \"description\": \"puzzle piece\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"jigsaw\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧸\",\n \"description\": \"teddy bear\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"teddy_bear\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🪅\",\n \"description\": \"piñata\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"pinata\"\n ],\n \"hasMarkdownRepresentation\": false\n },\n {\n \"emojiRaw\": \"♠️\",\n \"description\": \"spade suit\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"spades\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♥️\",\n \"description\": \"heart suit\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"hearts\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♦️\",\n \"description\": \"diamond suit\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"diamonds\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♣️\",\n \"description\": \"club suit\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"clubs\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♟️\",\n \"description\": \"chess pawn\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"chess_pawn\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🃏\",\n \"description\": \"joker\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"black_joker\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🀄\",\n \"description\": \"mahjong red dragon\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"mahjong\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎴\",\n \"description\": \"flower playing cards\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"flower_playing_cards\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎭\",\n \"description\": \"performing arts\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"performing_arts\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🖼️\",\n \"description\": \"framed picture\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"framed_picture\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎨\",\n \"description\": \"artist palette\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"art\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧵\",\n \"description\": \"thread\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"thread\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧶\",\n \"description\": \"yarn\",\n \"category\": \"Activities\",\n \"aliases\": [\n \"yarn\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👓\",\n \"description\": \"glasses\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"eyeglasses\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕶️\",\n \"description\": \"sunglasses\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"dark_sunglasses\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥽\",\n \"description\": \"goggles\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"goggles\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥼\",\n \"description\": \"lab coat\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"lab_coat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦺\",\n \"description\": \"safety vest\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"safety_vest\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👔\",\n \"description\": \"necktie\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"necktie\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👕\",\n \"description\": \"t-shirt\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"shirt\",\n \"tshirt\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👖\",\n \"description\": \"jeans\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"jeans\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧣\",\n \"description\": \"scarf\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"scarf\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧤\",\n \"description\": \"gloves\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"gloves\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧥\",\n \"description\": \"coat\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"coat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧦\",\n \"description\": \"socks\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"socks\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👗\",\n \"description\": \"dress\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"dress\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👘\",\n \"description\": \"kimono\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"kimono\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥻\",\n \"description\": \"sari\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"sari\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🩱\",\n \"description\": \"one-piece swimsuit\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"one_piece_swimsuit\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🩲\",\n \"description\": \"briefs\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"swim_brief\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🩳\",\n \"description\": \"shorts\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"shorts\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👙\",\n \"description\": \"bikini\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"bikini\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👚\",\n \"description\": \"woman’s clothes\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"womans_clothes\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👛\",\n \"description\": \"purse\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"purse\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👜\",\n \"description\": \"handbag\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"handbag\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👝\",\n \"description\": \"clutch bag\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"pouch\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛍️\",\n \"description\": \"shopping bags\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"shopping\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎒\",\n \"description\": \"backpack\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"school_satchel\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👞\",\n \"description\": \"man’s shoe\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"mans_shoe\",\n \"shoe\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👟\",\n \"description\": \"running shoe\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"athletic_shoe\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥾\",\n \"description\": \"hiking boot\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"hiking_boot\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥿\",\n \"description\": \"flat shoe\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"flat_shoe\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👠\",\n \"description\": \"high-heeled shoe\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"high_heel\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👡\",\n \"description\": \"woman’s sandal\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"sandal\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🩰\",\n \"description\": \"ballet shoes\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"ballet_shoes\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👢\",\n \"description\": \"woman’s boot\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"boot\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👑\",\n \"description\": \"crown\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"crown\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"👒\",\n \"description\": \"woman’s hat\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"womans_hat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎩\",\n \"description\": \"top hat\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"tophat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎓\",\n \"description\": \"graduation cap\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"mortar_board\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧢\",\n \"description\": \"billed cap\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"billed_cap\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛑️\",\n \"description\": \"rescue worker’s helmet\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"rescue_worker_helmet\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📿\",\n \"description\": \"prayer beads\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"prayer_beads\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💄\",\n \"description\": \"lipstick\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"lipstick\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💍\",\n \"description\": \"ring\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"ring\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💎\",\n \"description\": \"gem stone\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"gem\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔇\",\n \"description\": \"muted speaker\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"mute\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔈\",\n \"description\": \"speaker low volume\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"speaker\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔉\",\n \"description\": \"speaker medium volume\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"sound\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔊\",\n \"description\": \"speaker high volume\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"loud_sound\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📢\",\n \"description\": \"loudspeaker\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"loudspeaker\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📣\",\n \"description\": \"megaphone\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"mega\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📯\",\n \"description\": \"postal horn\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"postal_horn\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔔\",\n \"description\": \"bell\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"bell\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔕\",\n \"description\": \"bell with slash\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"no_bell\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎼\",\n \"description\": \"musical score\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"musical_score\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎵\",\n \"description\": \"musical note\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"musical_note\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎶\",\n \"description\": \"musical notes\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"notes\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎙️\",\n \"description\": \"studio microphone\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"studio_microphone\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎚️\",\n \"description\": \"level slider\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"level_slider\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎛️\",\n \"description\": \"control knobs\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"control_knobs\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎤\",\n \"description\": \"microphone\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"microphone\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎧\",\n \"description\": \"headphone\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"headphones\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📻\",\n \"description\": \"radio\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"radio\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎷\",\n \"description\": \"saxophone\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"saxophone\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎸\",\n \"description\": \"guitar\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"guitar\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎹\",\n \"description\": \"musical keyboard\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"musical_keyboard\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎺\",\n \"description\": \"trumpet\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"trumpet\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎻\",\n \"description\": \"violin\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"violin\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🪕\",\n \"description\": \"banjo\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"banjo\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🥁\",\n \"description\": \"drum\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"drum\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🪘\",\n \"description\": \"long drum\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"long_drum\"\n ],\n \"hasMarkdownRepresentation\": false\n },\n {\n \"emojiRaw\": \"📱\",\n \"description\": \"mobile phone\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"iphone\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📲\",\n \"description\": \"mobile phone with arrow\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"calling\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"☎️\",\n \"description\": \"telephone\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"phone\",\n \"telephone\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📞\",\n \"description\": \"telephone receiver\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"telephone_receiver\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📟\",\n \"description\": \"pager\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"pager\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📠\",\n \"description\": \"fax machine\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"fax\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔋\",\n \"description\": \"battery\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"battery\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔌\",\n \"description\": \"electric plug\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"electric_plug\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💻\",\n \"description\": \"laptop\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"computer\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🖥️\",\n \"description\": \"desktop computer\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"desktop_computer\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🖨️\",\n \"description\": \"printer\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"printer\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⌨️\",\n \"description\": \"keyboard\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"keyboard\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🖱️\",\n \"description\": \"computer mouse\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"computer_mouse\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🖲️\",\n \"description\": \"trackball\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"trackball\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💽\",\n \"description\": \"computer disk\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"minidisc\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💾\",\n \"description\": \"floppy disk\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"floppy_disk\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💿\",\n \"description\": \"optical disk\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"cd\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📀\",\n \"description\": \"dvd\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"dvd\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧮\",\n \"description\": \"abacus\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"abacus\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎥\",\n \"description\": \"movie camera\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"movie_camera\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎞️\",\n \"description\": \"film frames\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"film_strip\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📽️\",\n \"description\": \"film projector\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"film_projector\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎬\",\n \"description\": \"clapper board\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"clapper\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📺\",\n \"description\": \"television\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"tv\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📷\",\n \"description\": \"camera\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"camera\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📸\",\n \"description\": \"camera with flash\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"camera_flash\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📹\",\n \"description\": \"video camera\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"video_camera\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📼\",\n \"description\": \"videocassette\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"vhs\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔍\",\n \"description\": \"magnifying glass tilted left\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"mag\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔎\",\n \"description\": \"magnifying glass tilted right\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"mag_right\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕯️\",\n \"description\": \"candle\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"candle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💡\",\n \"description\": \"light bulb\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"bulb\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔦\",\n \"description\": \"flashlight\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"flashlight\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏮\",\n \"description\": \"red paper lantern\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"izakaya_lantern\",\n \"lantern\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🪔\",\n \"description\": \"diya lamp\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"diya_lamp\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📔\",\n \"description\": \"notebook with decorative cover\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"notebook_with_decorative_cover\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📕\",\n \"description\": \"closed book\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"closed_book\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📖\",\n \"description\": \"open book\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"book\",\n \"open_book\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📗\",\n \"description\": \"green book\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"green_book\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📘\",\n \"description\": \"blue book\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"blue_book\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📙\",\n \"description\": \"orange book\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"orange_book\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📚\",\n \"description\": \"books\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"books\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📓\",\n \"description\": \"notebook\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"notebook\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📒\",\n \"description\": \"ledger\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"ledger\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📃\",\n \"description\": \"page with curl\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"page_with_curl\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📜\",\n \"description\": \"scroll\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"scroll\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📄\",\n \"description\": \"page facing up\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"page_facing_up\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📰\",\n \"description\": \"newspaper\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"newspaper\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🗞️\",\n \"description\": \"rolled-up newspaper\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"newspaper_roll\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📑\",\n \"description\": \"bookmark tabs\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"bookmark_tabs\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔖\",\n \"description\": \"bookmark\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"bookmark\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏷️\",\n \"description\": \"label\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"label\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💰\",\n \"description\": \"money bag\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"moneybag\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💴\",\n \"description\": \"yen banknote\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"yen\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💵\",\n \"description\": \"dollar banknote\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"dollar\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💶\",\n \"description\": \"euro banknote\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"euro\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💷\",\n \"description\": \"pound banknote\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"pound\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💸\",\n \"description\": \"money with wings\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"money_with_wings\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💳\",\n \"description\": \"credit card\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"credit_card\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧾\",\n \"description\": \"receipt\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"receipt\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💹\",\n \"description\": \"chart increasing with yen\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"chart\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"✉️\",\n \"description\": \"envelope\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"envelope\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📧\",\n \"description\": \"e-mail\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"email\",\n \"e-mail\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📨\",\n \"description\": \"incoming envelope\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"incoming_envelope\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📩\",\n \"description\": \"envelope with arrow\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"envelope_with_arrow\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📤\",\n \"description\": \"outbox tray\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"outbox_tray\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📥\",\n \"description\": \"inbox tray\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"inbox_tray\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📦\",\n \"description\": \"package\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"package\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📫\",\n \"description\": \"closed mailbox with raised flag\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"mailbox\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📪\",\n \"description\": \"closed mailbox with lowered flag\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"mailbox_closed\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📬\",\n \"description\": \"open mailbox with raised flag\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"mailbox_with_mail\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📭\",\n \"description\": \"open mailbox with lowered flag\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"mailbox_with_no_mail\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📮\",\n \"description\": \"postbox\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"postbox\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🗳️\",\n \"description\": \"ballot box with ballot\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"ballot_box\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"✏️\",\n \"description\": \"pencil\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"pencil2\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"✒️\",\n \"description\": \"black nib\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"black_nib\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🖋️\",\n \"description\": \"fountain pen\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"fountain_pen\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🖊️\",\n \"description\": \"pen\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"pen\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🖌️\",\n \"description\": \"paintbrush\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"paintbrush\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🖍️\",\n \"description\": \"crayon\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"crayon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📝\",\n \"description\": \"memo\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"memo\",\n \"pencil\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💼\",\n \"description\": \"briefcase\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"briefcase\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📁\",\n \"description\": \"file folder\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"file_folder\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📂\",\n \"description\": \"open file folder\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"open_file_folder\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🗂️\",\n \"description\": \"card index dividers\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"card_index_dividers\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📅\",\n \"description\": \"calendar\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"date\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📆\",\n \"description\": \"tear-off calendar\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"calendar\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🗒️\",\n \"description\": \"spiral notepad\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"spiral_notepad\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🗓️\",\n \"description\": \"spiral calendar\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"spiral_calendar\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📇\",\n \"description\": \"card index\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"card_index\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📈\",\n \"description\": \"chart increasing\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"chart_with_upwards_trend\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📉\",\n \"description\": \"chart decreasing\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"chart_with_downwards_trend\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📊\",\n \"description\": \"bar chart\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"bar_chart\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📋\",\n \"description\": \"clipboard\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"clipboard\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📌\",\n \"description\": \"pushpin\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"pushpin\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📍\",\n \"description\": \"round pushpin\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"round_pushpin\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📎\",\n \"description\": \"paperclip\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"paperclip\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🖇️\",\n \"description\": \"linked paperclips\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"paperclips\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📏\",\n \"description\": \"straight ruler\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"straight_ruler\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📐\",\n \"description\": \"triangular ruler\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"triangular_ruler\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"✂️\",\n \"description\": \"scissors\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"scissors\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🗃️\",\n \"description\": \"card file box\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"card_file_box\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🗄️\",\n \"description\": \"file cabinet\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"file_cabinet\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🗑️\",\n \"description\": \"wastebasket\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"wastebasket\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔒\",\n \"description\": \"locked\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"lock\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔓\",\n \"description\": \"unlocked\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"unlock\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔏\",\n \"description\": \"locked with pen\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"lock_with_ink_pen\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔐\",\n \"description\": \"locked with key\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"closed_lock_with_key\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔑\",\n \"description\": \"key\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"key\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🗝️\",\n \"description\": \"old key\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"old_key\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔨\",\n \"description\": \"hammer\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"hammer\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🪓\",\n \"description\": \"axe\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"axe\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛏️\",\n \"description\": \"pick\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"pick\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⚒️\",\n \"description\": \"hammer and pick\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"hammer_and_pick\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛠️\",\n \"description\": \"hammer and wrench\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"hammer_and_wrench\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🗡️\",\n \"description\": \"dagger\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"dagger\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⚔️\",\n \"description\": \"crossed swords\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"crossed_swords\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔫\",\n \"description\": \"pistol\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"gun\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏹\",\n \"description\": \"bow and arrow\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"bow_and_arrow\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛡️\",\n \"description\": \"shield\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"shield\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔧\",\n \"description\": \"wrench\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"wrench\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔩\",\n \"description\": \"nut and bolt\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"nut_and_bolt\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⚙️\",\n \"description\": \"gear\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"gear\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🗜️\",\n \"description\": \"clamp\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"clamp\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⚖️\",\n \"description\": \"balance scale\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"balance_scale\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🦯\",\n \"description\": \"white cane\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"probing_cane\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔗\",\n \"description\": \"link\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"link\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛓️\",\n \"description\": \"chains\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"chains\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧰\",\n \"description\": \"toolbox\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"toolbox\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧲\",\n \"description\": \"magnet\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"magnet\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⚗️\",\n \"description\": \"alembic\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"alembic\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧪\",\n \"description\": \"test tube\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"test_tube\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧫\",\n \"description\": \"petri dish\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"petri_dish\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧬\",\n \"description\": \"dna\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"dna\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔬\",\n \"description\": \"microscope\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"microscope\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔭\",\n \"description\": \"telescope\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"telescope\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📡\",\n \"description\": \"satellite antenna\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"satellite\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💉\",\n \"description\": \"syringe\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"syringe\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🩸\",\n \"description\": \"drop of blood\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"drop_of_blood\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💊\",\n \"description\": \"pill\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"pill\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🩹\",\n \"description\": \"adhesive bandage\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"adhesive_bandage\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🩺\",\n \"description\": \"stethoscope\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"stethoscope\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚪\",\n \"description\": \"door\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"door\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛏️\",\n \"description\": \"bed\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"bed\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛋️\",\n \"description\": \"couch and lamp\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"couch_and_lamp\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🪑\",\n \"description\": \"chair\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"chair\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚽\",\n \"description\": \"toilet\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"toilet\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚿\",\n \"description\": \"shower\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"shower\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛁\",\n \"description\": \"bathtub\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"bathtub\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🪒\",\n \"description\": \"razor\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"razor\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧴\",\n \"description\": \"lotion bottle\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"lotion_bottle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧷\",\n \"description\": \"safety pin\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"safety_pin\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧹\",\n \"description\": \"broom\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"broom\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧺\",\n \"description\": \"basket\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"basket\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧻\",\n \"description\": \"roll of paper\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"roll_of_paper\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧼\",\n \"description\": \"soap\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"soap\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧽\",\n \"description\": \"sponge\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"sponge\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🧯\",\n \"description\": \"fire extinguisher\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"fire_extinguisher\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛒\",\n \"description\": \"shopping cart\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"shopping_cart\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚬\",\n \"description\": \"cigarette\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"smoking\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⚰️\",\n \"description\": \"coffin\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"coffin\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⚱️\",\n \"description\": \"funeral urn\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"funeral_urn\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🗿\",\n \"description\": \"moai\",\n \"category\": \"Objects\",\n \"aliases\": [\n \"moyai\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏧\",\n \"description\": \"ATM sign\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"atm\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚮\",\n \"description\": \"litter in bin sign\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"put_litter_in_its_place\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚰\",\n \"description\": \"potable water\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"potable_water\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♿\",\n \"description\": \"wheelchair symbol\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"wheelchair\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚹\",\n \"description\": \"men’s room\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"mens\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚺\",\n \"description\": \"women’s room\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"womens\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚻\",\n \"description\": \"restroom\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"restroom\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚼\",\n \"description\": \"baby symbol\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"baby_symbol\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚾\",\n \"description\": \"water closet\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"wc\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛂\",\n \"description\": \"passport control\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"passport_control\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛃\",\n \"description\": \"customs\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"customs\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛄\",\n \"description\": \"baggage claim\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"baggage_claim\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛅\",\n \"description\": \"left luggage\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"left_luggage\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⚠️\",\n \"description\": \"warning\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"warning\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚸\",\n \"description\": \"children crossing\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"children_crossing\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛔\",\n \"description\": \"no entry\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"no_entry\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚫\",\n \"description\": \"prohibited\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"no_entry_sign\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚳\",\n \"description\": \"no bicycles\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"no_bicycles\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚭\",\n \"description\": \"no smoking\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"no_smoking\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚯\",\n \"description\": \"no littering\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"do_not_litter\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚱\",\n \"description\": \"non-potable water\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"non-potable_water\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚷\",\n \"description\": \"no pedestrians\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"no_pedestrians\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📵\",\n \"description\": \"no mobile phones\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"no_mobile_phones\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔞\",\n \"description\": \"no one under eighteen\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"underage\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"☢️\",\n \"description\": \"radioactive\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"radioactive\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"☣️\",\n \"description\": \"biohazard\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"biohazard\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⬆️\",\n \"description\": \"up arrow\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"arrow_up\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"↗️\",\n \"description\": \"up-right arrow\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"arrow_upper_right\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"➡️\",\n \"description\": \"right arrow\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"arrow_right\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"↘️\",\n \"description\": \"down-right arrow\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"arrow_lower_right\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⬇️\",\n \"description\": \"down arrow\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"arrow_down\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"↙️\",\n \"description\": \"down-left arrow\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"arrow_lower_left\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⬅️\",\n \"description\": \"left arrow\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"arrow_left\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"↖️\",\n \"description\": \"up-left arrow\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"arrow_upper_left\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"↕️\",\n \"description\": \"up-down arrow\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"arrow_up_down\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"↔️\",\n \"description\": \"left-right arrow\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"left_right_arrow\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"↩️\",\n \"description\": \"right arrow curving left\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"leftwards_arrow_with_hook\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"↪️\",\n \"description\": \"left arrow curving right\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"arrow_right_hook\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⤴️\",\n \"description\": \"right arrow curving up\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"arrow_heading_up\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⤵️\",\n \"description\": \"right arrow curving down\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"arrow_heading_down\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔃\",\n \"description\": \"clockwise vertical arrows\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"arrows_clockwise\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔄\",\n \"description\": \"counterclockwise arrows button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"arrows_counterclockwise\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔙\",\n \"description\": \"BACK arrow\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"back\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔚\",\n \"description\": \"END arrow\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"end\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔛\",\n \"description\": \"ON! arrow\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"on\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔜\",\n \"description\": \"SOON arrow\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"soon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔝\",\n \"description\": \"TOP arrow\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"top\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🛐\",\n \"description\": \"place of worship\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"place_of_worship\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⚛️\",\n \"description\": \"atom symbol\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"atom_symbol\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕉️\",\n \"description\": \"om\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"om\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"✡️\",\n \"description\": \"star of David\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"star_of_david\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"☸️\",\n \"description\": \"wheel of dharma\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"wheel_of_dharma\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"☯️\",\n \"description\": \"yin yang\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"yin_yang\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"✝️\",\n \"description\": \"latin cross\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"latin_cross\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"☦️\",\n \"description\": \"orthodox cross\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"orthodox_cross\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"☪️\",\n \"description\": \"star and crescent\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"star_and_crescent\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"☮️\",\n \"description\": \"peace symbol\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"peace_symbol\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🕎\",\n \"description\": \"menorah\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"menorah\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔯\",\n \"description\": \"dotted six-pointed star\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"six_pointed_star\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♈\",\n \"description\": \"Aries\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"aries\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♉\",\n \"description\": \"Taurus\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"taurus\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♊\",\n \"description\": \"Gemini\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"gemini\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♋\",\n \"description\": \"Cancer\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"cancer\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♌\",\n \"description\": \"Leo\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"leo\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♍\",\n \"description\": \"Virgo\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"virgo\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♎\",\n \"description\": \"Libra\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"libra\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♏\",\n \"description\": \"Scorpio\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"scorpius\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♐\",\n \"description\": \"Sagittarius\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"sagittarius\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♑\",\n \"description\": \"Capricorn\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"capricorn\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♒\",\n \"description\": \"Aquarius\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"aquarius\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♓\",\n \"description\": \"Pisces\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"pisces\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⛎\",\n \"description\": \"Ophiuchus\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"ophiuchus\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔀\",\n \"description\": \"shuffle tracks button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"twisted_rightwards_arrows\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔁\",\n \"description\": \"repeat button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"repeat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔂\",\n \"description\": \"repeat single button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"repeat_one\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"▶️\",\n \"description\": \"play button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"arrow_forward\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⏩\",\n \"description\": \"fast-forward button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"fast_forward\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⏭️\",\n \"description\": \"next track button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"next_track_button\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⏯️\",\n \"description\": \"play or pause button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"play_or_pause_button\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"◀️\",\n \"description\": \"reverse button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"arrow_backward\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⏪\",\n \"description\": \"fast reverse button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"rewind\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⏮️\",\n \"description\": \"last track button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"previous_track_button\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔼\",\n \"description\": \"upwards button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"arrow_up_small\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⏫\",\n \"description\": \"fast up button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"arrow_double_up\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔽\",\n \"description\": \"downwards button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"arrow_down_small\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⏬\",\n \"description\": \"fast down button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"arrow_double_down\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⏸️\",\n \"description\": \"pause button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"pause_button\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⏹️\",\n \"description\": \"stop button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"stop_button\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⏺️\",\n \"description\": \"record button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"record_button\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⏏️\",\n \"description\": \"eject button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"eject_button\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎦\",\n \"description\": \"cinema\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"cinema\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔅\",\n \"description\": \"dim button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"low_brightness\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔆\",\n \"description\": \"bright button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"high_brightness\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📶\",\n \"description\": \"antenna bars\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"signal_strength\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📳\",\n \"description\": \"vibration mode\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"vibration_mode\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📴\",\n \"description\": \"mobile phone off\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"mobile_phone_off\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♀️\",\n \"description\": \"female sign\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"female_sign\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♂️\",\n \"description\": \"male sign\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"male_sign\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⚧️\",\n \"description\": \"transgender symbol\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"transgender_symbol\"\n ],\n \"hasMarkdownRepresentation\": false\n },\n {\n \"emojiRaw\": \"✖️\",\n \"description\": \"multiply\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"heavy_multiplication_x\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"➕\",\n \"description\": \"plus\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"heavy_plus_sign\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"➖\",\n \"description\": \"minus\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"heavy_minus_sign\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"➗\",\n \"description\": \"divide\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"heavy_division_sign\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♾️\",\n \"description\": \"infinity\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"infinity\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"‼️\",\n \"description\": \"double exclamation mark\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"bangbang\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⁉️\",\n \"description\": \"exclamation question mark\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"interrobang\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"❓\",\n \"description\": \"question mark\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"question\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"❔\",\n \"description\": \"white question mark\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"grey_question\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"❕\",\n \"description\": \"white exclamation mark\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"grey_exclamation\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"❗\",\n \"description\": \"exclamation mark\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"exclamation\",\n \"heavy_exclamation_mark\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"〰️\",\n \"description\": \"wavy dash\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"wavy_dash\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💱\",\n \"description\": \"currency exchange\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"currency_exchange\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💲\",\n \"description\": \"heavy dollar sign\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"heavy_dollar_sign\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⚕️\",\n \"description\": \"medical symbol\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"medical_symbol\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"♻️\",\n \"description\": \"recycling symbol\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"recycle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⚜️\",\n \"description\": \"fleur-de-lis\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"fleur_de_lis\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔱\",\n \"description\": \"trident emblem\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"trident\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"📛\",\n \"description\": \"name badge\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"name_badge\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔰\",\n \"description\": \"Japanese symbol for beginner\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"beginner\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⭕\",\n \"description\": \"hollow red circle\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"o\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"✅\",\n \"description\": \"check mark button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"white_check_mark\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"☑️\",\n \"description\": \"check box with check\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"ballot_box_with_check\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"✔️\",\n \"description\": \"check mark\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"heavy_check_mark\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"❌\",\n \"description\": \"cross mark\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"x\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"❎\",\n \"description\": \"cross mark button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"negative_squared_cross_mark\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"➰\",\n \"description\": \"curly loop\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"curly_loop\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"➿\",\n \"description\": \"double curly loop\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"loop\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"〽️\",\n \"description\": \"part alternation mark\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"part_alternation_mark\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"✳️\",\n \"description\": \"eight-spoked asterisk\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"eight_spoked_asterisk\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"✴️\",\n \"description\": \"eight-pointed star\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"eight_pointed_black_star\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"❇️\",\n \"description\": \"sparkle\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"sparkle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"©️\",\n \"description\": \"copyright\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"copyright\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"®️\",\n \"description\": \"registered\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"registered\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"™️\",\n \"description\": \"trade mark\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"tm\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"#️⃣\",\n \"description\": \"keycap: #\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"hash\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"*️⃣\",\n \"description\": \"keycap: *\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"asterisk\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"0️⃣\",\n \"description\": \"keycap: 0\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"zero\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"1️⃣\",\n \"description\": \"keycap: 1\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"one\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"2️⃣\",\n \"description\": \"keycap: 2\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"two\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"3️⃣\",\n \"description\": \"keycap: 3\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"three\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"4️⃣\",\n \"description\": \"keycap: 4\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"four\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"5️⃣\",\n \"description\": \"keycap: 5\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"five\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"6️⃣\",\n \"description\": \"keycap: 6\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"six\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"7️⃣\",\n \"description\": \"keycap: 7\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"seven\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"8️⃣\",\n \"description\": \"keycap: 8\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"eight\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"9️⃣\",\n \"description\": \"keycap: 9\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"nine\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔟\",\n \"description\": \"keycap: 10\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"keycap_ten\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔠\",\n \"description\": \"input latin uppercase\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"capital_abcd\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔡\",\n \"description\": \"input latin lowercase\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"abcd\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔢\",\n \"description\": \"input numbers\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"1234\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔣\",\n \"description\": \"input symbols\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"symbols\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔤\",\n \"description\": \"input latin letters\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"abc\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🅰️\",\n \"description\": \"A button (blood type)\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"a\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🆎\",\n \"description\": \"AB button (blood type)\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"ab\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🅱️\",\n \"description\": \"B button (blood type)\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"b\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🆑\",\n \"description\": \"CL button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"cl\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🆒\",\n \"description\": \"COOL button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"cool\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🆓\",\n \"description\": \"FREE button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"free\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"ℹ️\",\n \"description\": \"information\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"information_source\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🆔\",\n \"description\": \"ID button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"id\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"Ⓜ️\",\n \"description\": \"circled M\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"m\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🆕\",\n \"description\": \"NEW button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"new\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🆖\",\n \"description\": \"NG button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"ng\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🅾️\",\n \"description\": \"O button (blood type)\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"o2\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🆗\",\n \"description\": \"OK button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"ok\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🅿️\",\n \"description\": \"P button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"parking\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🆘\",\n \"description\": \"SOS button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"sos\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🆙\",\n \"description\": \"UP! button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"up\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🆚\",\n \"description\": \"VS button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"vs\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🈁\",\n \"description\": \"Japanese “here” button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"koko\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🈂️\",\n \"description\": \"Japanese “service charge” button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"sa\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🈷️\",\n \"description\": \"Japanese “monthly amount” button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"u6708\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🈶\",\n \"description\": \"Japanese “not free of charge” button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"u6709\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🈯\",\n \"description\": \"Japanese “reserved” button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"u6307\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🉐\",\n \"description\": \"Japanese “bargain” button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"ideograph_advantage\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🈹\",\n \"description\": \"Japanese “discount” button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"u5272\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🈚\",\n \"description\": \"Japanese “free of charge” button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"u7121\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🈲\",\n \"description\": \"Japanese “prohibited” button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"u7981\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🉑\",\n \"description\": \"Japanese “acceptable” button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"accept\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🈸\",\n \"description\": \"Japanese “application” button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"u7533\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🈴\",\n \"description\": \"Japanese “passing grade” button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"u5408\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🈳\",\n \"description\": \"Japanese “vacancy” button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"u7a7a\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"㊗️\",\n \"description\": \"Japanese “congratulations” button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"congratulations\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"㊙️\",\n \"description\": \"Japanese “secret” button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"secret\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🈺\",\n \"description\": \"Japanese “open for business” button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"u55b6\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🈵\",\n \"description\": \"Japanese “no vacancy” button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"u6e80\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔴\",\n \"description\": \"red circle\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"red_circle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🟠\",\n \"description\": \"orange circle\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"orange_circle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🟡\",\n \"description\": \"yellow circle\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"yellow_circle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🟢\",\n \"description\": \"green circle\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"green_circle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔵\",\n \"description\": \"blue circle\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"large_blue_circle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🟣\",\n \"description\": \"purple circle\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"purple_circle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🟤\",\n \"description\": \"brown circle\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"brown_circle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⚫\",\n \"description\": \"black circle\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"black_circle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⚪\",\n \"description\": \"white circle\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"white_circle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🟥\",\n \"description\": \"red square\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"red_square\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🟧\",\n \"description\": \"orange square\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"orange_square\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🟨\",\n \"description\": \"yellow square\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"yellow_square\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🟩\",\n \"description\": \"green square\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"green_square\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🟦\",\n \"description\": \"blue square\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"blue_square\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🟪\",\n \"description\": \"purple square\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"purple_square\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🟫\",\n \"description\": \"brown square\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"brown_square\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⬛\",\n \"description\": \"black large square\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"black_large_square\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"⬜\",\n \"description\": \"white large square\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"white_large_square\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"◼️\",\n \"description\": \"black medium square\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"black_medium_square\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"◻️\",\n \"description\": \"white medium square\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"white_medium_square\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"◾\",\n \"description\": \"black medium-small square\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"black_medium_small_square\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"◽\",\n \"description\": \"white medium-small square\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"white_medium_small_square\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"▪️\",\n \"description\": \"black small square\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"black_small_square\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"▫️\",\n \"description\": \"white small square\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"white_small_square\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔶\",\n \"description\": \"large orange diamond\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"large_orange_diamond\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔷\",\n \"description\": \"large blue diamond\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"large_blue_diamond\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔸\",\n \"description\": \"small orange diamond\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"small_orange_diamond\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔹\",\n \"description\": \"small blue diamond\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"small_blue_diamond\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔺\",\n \"description\": \"red triangle pointed up\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"small_red_triangle\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔻\",\n \"description\": \"red triangle pointed down\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"small_red_triangle_down\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"💠\",\n \"description\": \"diamond with a dot\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"diamond_shape_with_a_dot_inside\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔘\",\n \"description\": \"radio button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"radio_button\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔳\",\n \"description\": \"white square button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"white_square_button\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🔲\",\n \"description\": \"black square button\",\n \"category\": \"Symbols\",\n \"aliases\": [\n \"black_square_button\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏁\",\n \"description\": \"chequered flag\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"checkered_flag\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🚩\",\n \"description\": \"triangular flag\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"triangular_flag_on_post\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🎌\",\n \"description\": \"crossed flags\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"crossed_flags\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏴\",\n \"description\": \"black flag\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"black_flag\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏳️\",\n \"description\": \"white flag\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"white_flag\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏳️🌈\",\n \"description\": \"rainbow flag\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"rainbow_flag\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏳️⚧️\",\n \"description\": \"transgender flag\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"transgender_flag\"\n ],\n \"hasMarkdownRepresentation\": false\n },\n {\n \"emojiRaw\": \"🏴☠️\",\n \"description\": \"pirate flag\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"pirate_flag\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇦🇨\",\n \"description\": \"flag: Ascension Island\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"ascension_island\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇦🇩\",\n \"description\": \"flag: Andorra\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"andorra\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇦🇪\",\n \"description\": \"flag: United Arab Emirates\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"united_arab_emirates\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇦🇫\",\n \"description\": \"flag: Afghanistan\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"afghanistan\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇦🇬\",\n \"description\": \"flag: Antigua & Barbuda\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"antigua_barbuda\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇦🇮\",\n \"description\": \"flag: Anguilla\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"anguilla\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇦🇱\",\n \"description\": \"flag: Albania\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"albania\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇦🇲\",\n \"description\": \"flag: Armenia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"armenia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇦🇴\",\n \"description\": \"flag: Angola\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"angola\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇦🇶\",\n \"description\": \"flag: Antarctica\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"antarctica\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇦🇷\",\n \"description\": \"flag: Argentina\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"argentina\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇦🇸\",\n \"description\": \"flag: American Samoa\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"american_samoa\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇦🇹\",\n \"description\": \"flag: Austria\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"austria\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇦🇺\",\n \"description\": \"flag: Australia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"australia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇦🇼\",\n \"description\": \"flag: Aruba\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"aruba\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇦🇽\",\n \"description\": \"flag: Åland Islands\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"aland_islands\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇦🇿\",\n \"description\": \"flag: Azerbaijan\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"azerbaijan\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇦\",\n \"description\": \"flag: Bosnia & Herzegovina\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"bosnia_herzegovina\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇧\",\n \"description\": \"flag: Barbados\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"barbados\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇩\",\n \"description\": \"flag: Bangladesh\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"bangladesh\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇪\",\n \"description\": \"flag: Belgium\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"belgium\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇫\",\n \"description\": \"flag: Burkina Faso\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"burkina_faso\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇬\",\n \"description\": \"flag: Bulgaria\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"bulgaria\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇭\",\n \"description\": \"flag: Bahrain\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"bahrain\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇮\",\n \"description\": \"flag: Burundi\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"burundi\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇯\",\n \"description\": \"flag: Benin\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"benin\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇱\",\n \"description\": \"flag: St. Barthélemy\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"st_barthelemy\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇲\",\n \"description\": \"flag: Bermuda\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"bermuda\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇳\",\n \"description\": \"flag: Brunei\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"brunei\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇴\",\n \"description\": \"flag: Bolivia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"bolivia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇶\",\n \"description\": \"flag: Caribbean Netherlands\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"caribbean_netherlands\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇷\",\n \"description\": \"flag: Brazil\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"brazil\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇸\",\n \"description\": \"flag: Bahamas\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"bahamas\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇹\",\n \"description\": \"flag: Bhutan\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"bhutan\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇻\",\n \"description\": \"flag: Bouvet Island\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"bouvet_island\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇼\",\n \"description\": \"flag: Botswana\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"botswana\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇾\",\n \"description\": \"flag: Belarus\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"belarus\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇧🇿\",\n \"description\": \"flag: Belize\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"belize\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇨🇦\",\n \"description\": \"flag: Canada\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"canada\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇨🇨\",\n \"description\": \"flag: Cocos (Keeling) Islands\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"cocos_islands\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇨🇩\",\n \"description\": \"flag: Congo - Kinshasa\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"congo_kinshasa\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇨🇫\",\n \"description\": \"flag: Central African Republic\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"central_african_republic\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇨🇬\",\n \"description\": \"flag: Congo - Brazzaville\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"congo_brazzaville\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇨🇭\",\n \"description\": \"flag: Switzerland\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"switzerland\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇨🇮\",\n \"description\": \"flag: Côte d’Ivoire\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"cote_divoire\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇨🇰\",\n \"description\": \"flag: Cook Islands\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"cook_islands\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇨🇱\",\n \"description\": \"flag: Chile\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"chile\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇨🇲\",\n \"description\": \"flag: Cameroon\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"cameroon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇨🇳\",\n \"description\": \"flag: China\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"cn\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇨🇴\",\n \"description\": \"flag: Colombia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"colombia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇨🇵\",\n \"description\": \"flag: Clipperton Island\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"clipperton_island\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇨🇷\",\n \"description\": \"flag: Costa Rica\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"costa_rica\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇨🇺\",\n \"description\": \"flag: Cuba\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"cuba\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇨🇻\",\n \"description\": \"flag: Cape Verde\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"cape_verde\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇨🇼\",\n \"description\": \"flag: Curaçao\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"curacao\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇨🇽\",\n \"description\": \"flag: Christmas Island\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"christmas_island\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇨🇾\",\n \"description\": \"flag: Cyprus\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"cyprus\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇨🇿\",\n \"description\": \"flag: Czechia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"czech_republic\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇩🇪\",\n \"description\": \"flag: Germany\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"de\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇩🇬\",\n \"description\": \"flag: Diego Garcia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"diego_garcia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇩🇯\",\n \"description\": \"flag: Djibouti\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"djibouti\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇩🇰\",\n \"description\": \"flag: Denmark\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"denmark\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇩🇲\",\n \"description\": \"flag: Dominica\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"dominica\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇩🇴\",\n \"description\": \"flag: Dominican Republic\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"dominican_republic\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇩🇿\",\n \"description\": \"flag: Algeria\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"algeria\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇪🇦\",\n \"description\": \"flag: Ceuta & Melilla\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"ceuta_melilla\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇪🇨\",\n \"description\": \"flag: Ecuador\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"ecuador\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇪🇪\",\n \"description\": \"flag: Estonia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"estonia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇪🇬\",\n \"description\": \"flag: Egypt\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"egypt\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇪🇭\",\n \"description\": \"flag: Western Sahara\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"western_sahara\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇪🇷\",\n \"description\": \"flag: Eritrea\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"eritrea\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇪🇸\",\n \"description\": \"flag: Spain\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"es\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇪🇹\",\n \"description\": \"flag: Ethiopia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"ethiopia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇪🇺\",\n \"description\": \"flag: European Union\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"eu\",\n \"european_union\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇫🇮\",\n \"description\": \"flag: Finland\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"finland\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇫🇯\",\n \"description\": \"flag: Fiji\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"fiji\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇫🇰\",\n \"description\": \"flag: Falkland Islands\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"falkland_islands\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇫🇲\",\n \"description\": \"flag: Micronesia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"micronesia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇫🇴\",\n \"description\": \"flag: Faroe Islands\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"faroe_islands\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇫🇷\",\n \"description\": \"flag: France\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"fr\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇬🇦\",\n \"description\": \"flag: Gabon\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"gabon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇬🇧\",\n \"description\": \"flag: United Kingdom\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"gb\",\n \"uk\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇬🇩\",\n \"description\": \"flag: Grenada\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"grenada\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇬🇪\",\n \"description\": \"flag: Georgia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"georgia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇬🇫\",\n \"description\": \"flag: French Guiana\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"french_guiana\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇬🇬\",\n \"description\": \"flag: Guernsey\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"guernsey\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇬🇭\",\n \"description\": \"flag: Ghana\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"ghana\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇬🇮\",\n \"description\": \"flag: Gibraltar\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"gibraltar\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇬🇱\",\n \"description\": \"flag: Greenland\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"greenland\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇬🇲\",\n \"description\": \"flag: Gambia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"gambia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇬🇳\",\n \"description\": \"flag: Guinea\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"guinea\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇬🇵\",\n \"description\": \"flag: Guadeloupe\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"guadeloupe\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇬🇶\",\n \"description\": \"flag: Equatorial Guinea\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"equatorial_guinea\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇬🇷\",\n \"description\": \"flag: Greece\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"greece\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇬🇸\",\n \"description\": \"flag: South Georgia & South Sandwich Islands\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"south_georgia_south_sandwich_islands\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇬🇹\",\n \"description\": \"flag: Guatemala\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"guatemala\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇬🇺\",\n \"description\": \"flag: Guam\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"guam\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇬🇼\",\n \"description\": \"flag: Guinea-Bissau\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"guinea_bissau\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇬🇾\",\n \"description\": \"flag: Guyana\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"guyana\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇭🇰\",\n \"description\": \"flag: Hong Kong SAR China\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"hong_kong\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇭🇲\",\n \"description\": \"flag: Heard & McDonald Islands\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"heard_mcdonald_islands\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇭🇳\",\n \"description\": \"flag: Honduras\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"honduras\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇭🇷\",\n \"description\": \"flag: Croatia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"croatia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇭🇹\",\n \"description\": \"flag: Haiti\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"haiti\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇭🇺\",\n \"description\": \"flag: Hungary\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"hungary\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇮🇨\",\n \"description\": \"flag: Canary Islands\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"canary_islands\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇮🇩\",\n \"description\": \"flag: Indonesia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"indonesia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇮🇪\",\n \"description\": \"flag: Ireland\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"ireland\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇮🇱\",\n \"description\": \"flag: Israel\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"israel\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇮🇲\",\n \"description\": \"flag: Isle of Man\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"isle_of_man\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇮🇳\",\n \"description\": \"flag: India\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"india\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇮🇴\",\n \"description\": \"flag: British Indian Ocean Territory\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"british_indian_ocean_territory\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇮🇶\",\n \"description\": \"flag: Iraq\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"iraq\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇮🇷\",\n \"description\": \"flag: Iran\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"iran\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇮🇸\",\n \"description\": \"flag: Iceland\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"iceland\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇮🇹\",\n \"description\": \"flag: Italy\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"it\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇯🇪\",\n \"description\": \"flag: Jersey\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"jersey\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇯🇲\",\n \"description\": \"flag: Jamaica\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"jamaica\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇯🇴\",\n \"description\": \"flag: Jordan\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"jordan\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇯🇵\",\n \"description\": \"flag: Japan\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"jp\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇰🇪\",\n \"description\": \"flag: Kenya\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"kenya\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇰🇬\",\n \"description\": \"flag: Kyrgyzstan\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"kyrgyzstan\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇰🇭\",\n \"description\": \"flag: Cambodia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"cambodia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇰🇮\",\n \"description\": \"flag: Kiribati\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"kiribati\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇰🇲\",\n \"description\": \"flag: Comoros\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"comoros\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇰🇳\",\n \"description\": \"flag: St. Kitts & Nevis\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"st_kitts_nevis\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇰🇵\",\n \"description\": \"flag: North Korea\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"north_korea\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇰🇷\",\n \"description\": \"flag: South Korea\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"kr\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇰🇼\",\n \"description\": \"flag: Kuwait\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"kuwait\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇰🇾\",\n \"description\": \"flag: Cayman Islands\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"cayman_islands\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇰🇿\",\n \"description\": \"flag: Kazakhstan\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"kazakhstan\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇱🇦\",\n \"description\": \"flag: Laos\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"laos\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇱🇧\",\n \"description\": \"flag: Lebanon\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"lebanon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇱🇨\",\n \"description\": \"flag: St. Lucia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"st_lucia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇱🇮\",\n \"description\": \"flag: Liechtenstein\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"liechtenstein\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇱🇰\",\n \"description\": \"flag: Sri Lanka\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"sri_lanka\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇱🇷\",\n \"description\": \"flag: Liberia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"liberia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇱🇸\",\n \"description\": \"flag: Lesotho\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"lesotho\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇱🇹\",\n \"description\": \"flag: Lithuania\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"lithuania\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇱🇺\",\n \"description\": \"flag: Luxembourg\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"luxembourg\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇱🇻\",\n \"description\": \"flag: Latvia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"latvia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇱🇾\",\n \"description\": \"flag: Libya\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"libya\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇦\",\n \"description\": \"flag: Morocco\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"morocco\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇨\",\n \"description\": \"flag: Monaco\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"monaco\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇩\",\n \"description\": \"flag: Moldova\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"moldova\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇪\",\n \"description\": \"flag: Montenegro\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"montenegro\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇫\",\n \"description\": \"flag: St. Martin\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"st_martin\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇬\",\n \"description\": \"flag: Madagascar\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"madagascar\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇭\",\n \"description\": \"flag: Marshall Islands\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"marshall_islands\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇰\",\n \"description\": \"flag: North Macedonia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"macedonia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇱\",\n \"description\": \"flag: Mali\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"mali\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇲\",\n \"description\": \"flag: Myanmar (Burma)\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"myanmar\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇳\",\n \"description\": \"flag: Mongolia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"mongolia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇴\",\n \"description\": \"flag: Macao SAR China\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"macau\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇵\",\n \"description\": \"flag: Northern Mariana Islands\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"northern_mariana_islands\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇶\",\n \"description\": \"flag: Martinique\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"martinique\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇷\",\n \"description\": \"flag: Mauritania\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"mauritania\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇸\",\n \"description\": \"flag: Montserrat\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"montserrat\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇹\",\n \"description\": \"flag: Malta\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"malta\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇺\",\n \"description\": \"flag: Mauritius\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"mauritius\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇻\",\n \"description\": \"flag: Maldives\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"maldives\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇼\",\n \"description\": \"flag: Malawi\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"malawi\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇽\",\n \"description\": \"flag: Mexico\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"mexico\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇾\",\n \"description\": \"flag: Malaysia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"malaysia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇲🇿\",\n \"description\": \"flag: Mozambique\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"mozambique\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇳🇦\",\n \"description\": \"flag: Namibia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"namibia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇳🇨\",\n \"description\": \"flag: New Caledonia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"new_caledonia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇳🇪\",\n \"description\": \"flag: Niger\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"niger\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇳🇫\",\n \"description\": \"flag: Norfolk Island\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"norfolk_island\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇳🇬\",\n \"description\": \"flag: Nigeria\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"nigeria\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇳🇮\",\n \"description\": \"flag: Nicaragua\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"nicaragua\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇳🇱\",\n \"description\": \"flag: Netherlands\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"netherlands\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇳🇴\",\n \"description\": \"flag: Norway\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"norway\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇳🇵\",\n \"description\": \"flag: Nepal\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"nepal\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇳🇷\",\n \"description\": \"flag: Nauru\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"nauru\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇳🇺\",\n \"description\": \"flag: Niue\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"niue\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇳🇿\",\n \"description\": \"flag: New Zealand\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"new_zealand\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇴🇲\",\n \"description\": \"flag: Oman\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"oman\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇵🇦\",\n \"description\": \"flag: Panama\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"panama\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇵🇪\",\n \"description\": \"flag: Peru\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"peru\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇵🇫\",\n \"description\": \"flag: French Polynesia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"french_polynesia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇵🇬\",\n \"description\": \"flag: Papua New Guinea\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"papua_new_guinea\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇵🇭\",\n \"description\": \"flag: Philippines\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"philippines\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇵🇰\",\n \"description\": \"flag: Pakistan\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"pakistan\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇵🇱\",\n \"description\": \"flag: Poland\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"poland\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇵🇲\",\n \"description\": \"flag: St. Pierre & Miquelon\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"st_pierre_miquelon\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇵🇳\",\n \"description\": \"flag: Pitcairn Islands\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"pitcairn_islands\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇵🇷\",\n \"description\": \"flag: Puerto Rico\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"puerto_rico\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇵🇸\",\n \"description\": \"flag: Palestinian Territories\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"palestinian_territories\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇵🇹\",\n \"description\": \"flag: Portugal\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"portugal\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇵🇼\",\n \"description\": \"flag: Palau\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"palau\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇵🇾\",\n \"description\": \"flag: Paraguay\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"paraguay\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇶🇦\",\n \"description\": \"flag: Qatar\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"qatar\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇷🇪\",\n \"description\": \"flag: Réunion\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"reunion\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇷🇴\",\n \"description\": \"flag: Romania\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"romania\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇷🇸\",\n \"description\": \"flag: Serbia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"serbia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇷🇺\",\n \"description\": \"flag: Russia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"ru\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇷🇼\",\n \"description\": \"flag: Rwanda\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"rwanda\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇦\",\n \"description\": \"flag: Saudi Arabia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"saudi_arabia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇧\",\n \"description\": \"flag: Solomon Islands\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"solomon_islands\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇨\",\n \"description\": \"flag: Seychelles\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"seychelles\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇩\",\n \"description\": \"flag: Sudan\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"sudan\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇪\",\n \"description\": \"flag: Sweden\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"sweden\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇬\",\n \"description\": \"flag: Singapore\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"singapore\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇭\",\n \"description\": \"flag: St. Helena\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"st_helena\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇮\",\n \"description\": \"flag: Slovenia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"slovenia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇯\",\n \"description\": \"flag: Svalbard & Jan Mayen\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"svalbard_jan_mayen\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇰\",\n \"description\": \"flag: Slovakia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"slovakia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇱\",\n \"description\": \"flag: Sierra Leone\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"sierra_leone\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇲\",\n \"description\": \"flag: San Marino\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"san_marino\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇳\",\n \"description\": \"flag: Senegal\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"senegal\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇴\",\n \"description\": \"flag: Somalia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"somalia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇷\",\n \"description\": \"flag: Suriname\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"suriname\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇸\",\n \"description\": \"flag: South Sudan\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"south_sudan\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇹\",\n \"description\": \"flag: São Tomé & Príncipe\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"sao_tome_principe\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇻\",\n \"description\": \"flag: El Salvador\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"el_salvador\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇽\",\n \"description\": \"flag: Sint Maarten\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"sint_maarten\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇾\",\n \"description\": \"flag: Syria\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"syria\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇸🇿\",\n \"description\": \"flag: Eswatini\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"swaziland\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇹🇦\",\n \"description\": \"flag: Tristan da Cunha\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"tristan_da_cunha\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇹🇨\",\n \"description\": \"flag: Turks & Caicos Islands\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"turks_caicos_islands\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇹🇩\",\n \"description\": \"flag: Chad\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"chad\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇹🇫\",\n \"description\": \"flag: French Southern Territories\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"french_southern_territories\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇹🇬\",\n \"description\": \"flag: Togo\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"togo\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇹🇭\",\n \"description\": \"flag: Thailand\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"thailand\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇹🇯\",\n \"description\": \"flag: Tajikistan\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"tajikistan\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇹🇰\",\n \"description\": \"flag: Tokelau\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"tokelau\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇹🇱\",\n \"description\": \"flag: Timor-Leste\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"timor_leste\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇹🇲\",\n \"description\": \"flag: Turkmenistan\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"turkmenistan\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇹🇳\",\n \"description\": \"flag: Tunisia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"tunisia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇹🇴\",\n \"description\": \"flag: Tonga\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"tonga\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇹🇷\",\n \"description\": \"flag: Turkey\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"tr\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇹🇹\",\n \"description\": \"flag: Trinidad & Tobago\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"trinidad_tobago\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇹🇻\",\n \"description\": \"flag: Tuvalu\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"tuvalu\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇹🇼\",\n \"description\": \"flag: Taiwan\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"taiwan\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇹🇿\",\n \"description\": \"flag: Tanzania\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"tanzania\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇺🇦\",\n \"description\": \"flag: Ukraine\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"ukraine\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇺🇬\",\n \"description\": \"flag: Uganda\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"uganda\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇺🇲\",\n \"description\": \"flag: U.S. Outlying Islands\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"us_outlying_islands\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇺🇳\",\n \"description\": \"flag: United Nations\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"united_nations\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇺🇸\",\n \"description\": \"flag: United States\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"us\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇺🇾\",\n \"description\": \"flag: Uruguay\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"uruguay\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇺🇿\",\n \"description\": \"flag: Uzbekistan\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"uzbekistan\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇻🇦\",\n \"description\": \"flag: Vatican City\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"vatican_city\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇻🇨\",\n \"description\": \"flag: St. Vincent & Grenadines\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"st_vincent_grenadines\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇻🇪\",\n \"description\": \"flag: Venezuela\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"venezuela\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇻🇬\",\n \"description\": \"flag: British Virgin Islands\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"british_virgin_islands\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇻🇮\",\n \"description\": \"flag: U.S. Virgin Islands\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"us_virgin_islands\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇻🇳\",\n \"description\": \"flag: Vietnam\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"vietnam\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇻🇺\",\n \"description\": \"flag: Vanuatu\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"vanuatu\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇼🇫\",\n \"description\": \"flag: Wallis & Futuna\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"wallis_futuna\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇼🇸\",\n \"description\": \"flag: Samoa\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"samoa\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇽🇰\",\n \"description\": \"flag: Kosovo\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"kosovo\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇾🇪\",\n \"description\": \"flag: Yemen\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"yemen\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇾🇹\",\n \"description\": \"flag: Mayotte\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"mayotte\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇿🇦\",\n \"description\": \"flag: South Africa\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"south_africa\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇿🇲\",\n \"description\": \"flag: Zambia\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"zambia\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🇿🇼\",\n \"description\": \"flag: Zimbabwe\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"zimbabwe\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏴\",\n \"description\": \"flag: England\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"england\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏴\",\n \"description\": \"flag: Scotland\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"scotland\"\n ],\n \"hasMarkdownRepresentation\": true\n },\n {\n \"emojiRaw\": \"🏴\",\n \"description\": \"flag: Wales\",\n \"category\": \"Flags\",\n \"aliases\": [\n \"wales\"\n ],\n \"hasMarkdownRepresentation\": true\n }\n];\n\nexport default emjois;\n","/*\n * emoji.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Mark, Fragment, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { InputRule } from 'prosemirror-inputrules';\nimport { EditorState, Transaction } from 'prosemirror-state';\n\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { PandocOutput, PandocToken, PandocTokenType, ProsemirrorWriter, PandocExtensions } from '../../api/pandoc';\nimport { pandocAttrReadAST } from '../../api/pandoc_attr';\nimport { fragmentText } from '../../api/fragment';\n\nimport { FixupContext } from '../../api/fixup';\nimport { MarkTransaction } from '../../api/transaction';\nimport { mergedTextNodes } from '../../api/text';\nimport {\n emojis,\n emojiFromAlias,\n emojiFromChar,\n emojiForAllSkinTones,\n Emoji,\n emojiWithSkinTonePreference,\n kEmojiAttr,\n kEmojiContent,\n} from '../../api/emoji';\nimport { emojiCompletionHandler, emojiSkintonePreferenceCompletionHandler } from './emoji-completion';\nimport { getMarkAttrs } from '../../api/mark';\n\nconst extension = (context: ExtensionContext): Extension | null => {\n const { ui } = context;\n\n return {\n marks: [\n {\n name: 'emoji',\n noSpelling: true,\n spec: {\n inclusive: false,\n noInputRules: true,\n attrs: {\n emojihint: {},\n prompt: { default: true },\n },\n parseDOM: [\n {\n tag: \"span[class*='emoji']\",\n getAttrs(dom: Node | string) {\n const el = dom as Element;\n return {\n emojihint: el.getAttribute('data-emojihint'),\n prompt: el.getAttribute('data-emojiprompt') || false,\n };\n },\n },\n ],\n toDOM(mark: Mark) {\n return [\n 'span',\n {\n class: 'emoji pm-emoji-font',\n title: ':' + mark.attrs.emojihint + ':',\n 'data-emojihint': mark.attrs.emojihint,\n 'data-emojiprompt': mark.attrs.prompt,\n },\n ];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.Span,\n match: (tok: PandocToken) => {\n const attrs = pandocAttrReadAST(tok, kEmojiAttr);\n return attrs.keyvalue.length > 0 && attrs.keyvalue[0][0] === 'data-emoji';\n },\n handler: (schema: Schema) => (writer: ProsemirrorWriter, tok: PandocToken) => {\n const attrs = pandocAttrReadAST(tok, kEmojiAttr);\n const emojihint = attrs.keyvalue[0][1];\n const emojiMark = schema.marks.emoji.create({ emojihint });\n writer.openMark(emojiMark);\n const emojiChar = tok.c[kEmojiContent][0].c;\n writer.writeText(emojiChar);\n writer.closeMark(emojiMark);\n },\n },\n ],\n writer: {\n priority: 2,\n write: (output: PandocOutput, mark: Mark, parent: Fragment) => {\n // look for a matching emoji\n const char = fragmentText(parent);\n const emoji = emojiFromChar(char);\n if (emoji) {\n output.writeToken(PandocTokenType.Span, () => {\n // resolve which alias to use\n let alias = emoji.aliases[0];\n if (emoji.aliases.length > 1) {\n if (emoji.aliases.includes(mark.attrs.emojihint)) {\n alias = mark.attrs.emojihint;\n }\n }\n output.writeAttr('', ['emoji'], [['data-emoji', alias]]);\n output.writeArray(() => {\n output.writeText(emoji.emojiRaw);\n });\n });\n } else {\n output.writeInlines(parent);\n }\n },\n },\n },\n },\n ],\n\n inputRules: () => {\n return [\n new InputRule(/(^|[^`]):(\\w+):$/, (state: EditorState, match: string[], start: number, end: number) => {\n const emojiName = match[2];\n const emoji = emojiFromAlias(emojiName.toLowerCase());\n if (emoji) {\n const emojiWithSkinTone = emojiWithSkinTonePreference(emoji, ui.prefs.emojiSkinTone());\n const schema = state.schema;\n const tr = state.tr;\n tr.delete(start + match[1].length, end);\n tr.replaceSelectionWith(nodeForEmoji(schema, emojiWithSkinTone, emojiName), false);\n return tr;\n } else {\n return null;\n }\n }),\n ];\n },\n\n completionHandlers: () => [emojiCompletionHandler(ui), emojiSkintonePreferenceCompletionHandler(ui)],\n\n fixups: (schema: Schema) => {\n return [\n (tr: Transaction, fixupContext: FixupContext) => {\n // only apply on save and load\n if (![FixupContext.Save, FixupContext.Load].includes(fixupContext)) {\n return tr;\n }\n\n // create mark transation wrapper\n const markTr = new MarkTransaction(tr);\n\n const textNodes = mergedTextNodes(\n markTr.doc,\n (_node: ProsemirrorNode, _pos: number, parentNode: ProsemirrorNode) =>\n parentNode.type.allowsMarkType(schema.marks.emoji),\n );\n\n textNodes.forEach(textNode => {\n // Since emoji can be composed of multiple characters (including\n // other emoji), we always need to prefer the longest match when inserting\n // a mark for any given starting position.\n\n // Find the possible emoji at each position in this text node\n const possibleMarks = new Map<number, Array<{ to: number; emoji: Emoji }>>();\n for (const emoji of emojis(ui.prefs.emojiSkinTone())) {\n emojiForAllSkinTones(emoji).forEach(skinToneEmoji => {\n let charLoc = textNode.text.indexOf(skinToneEmoji.emoji);\n while (charLoc !== -1) {\n const from = textNode.pos + charLoc;\n const to = from + skinToneEmoji.emoji.length;\n possibleMarks.set(from, (possibleMarks.get(from) || []).concat({ to, emoji: skinToneEmoji }));\n charLoc = textNode.text.indexOf(skinToneEmoji.emoji, charLoc + 1);\n }\n });\n }\n\n // For each position that has emoji, use the longest emoji match as the\n // emoji to be marked.\n possibleMarks.forEach((possibleEmojis, markFrom) => {\n const orderedEmojis = possibleEmojis.sort((a, b) => b.to - a.to);\n const to = orderedEmojis[0].to;\n const emoji = orderedEmojis[0].emoji;\n\n // remove any existing mark (preserving attribues if we do )\n let existingAttrs: { [key: string]: any } | null = null;\n if (markTr.doc.rangeHasMark(markFrom, to, schema.marks.emoji)) {\n existingAttrs = getMarkAttrs(markTr.doc, { from: markFrom, to }, schema.marks.emoji);\n markTr.removeMark(markFrom, to, schema.marks.emoji);\n }\n\n // create a new mark\n const mark = schema.marks.emoji.create({\n emojihint: emoji.aliases[0],\n ...existingAttrs,\n });\n\n // on load we want to cover the entire span\n if (fixupContext === FixupContext.Load) {\n markTr.addMark(markFrom, to, mark);\n // on save we just want the raw emjoi character(s)\n } else if (fixupContext === FixupContext.Save) {\n markTr.addMark(markFrom, markFrom + emoji.emoji.length, mark);\n }\n });\n });\n\n return tr;\n },\n ];\n },\n };\n};\n\nexport function nodeForEmoji(schema: Schema, emoji: Emoji, hint: string, prompt?: boolean): ProsemirrorNode {\n const mark = schema.marks.emoji.create({ emojihint: hint, prompt });\n return schema.text(emoji.emoji, [mark]);\n}\n\nexport default extension;\n","/*\n * emoji-completion.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\n\nimport React from 'react';\n\nimport { EditorUI } from '../../api/ui';\n\nimport { CompletionHandler, CompletionResult, CompletionHeaderProps } from '../../api/completion';\nimport { emojis, Emoji, SkinTone, emojiFromChar, emojiForAllSkinTones } from '../../api/emoji';\nimport { getMarkRange, getMarkAttrs } from '../../api/mark';\nimport { nodeForEmoji } from './emoji';\n\nimport './emoji-completion.css';\n\nexport function emojiCompletionHandler(ui: EditorUI): CompletionHandler<Emoji> {\n return {\n id: '95A133E1-968B-4D96-8849-4A325FF02C11',\n\n completions: emojiCompletions(ui),\n\n replacement(schema: Schema, emoji: Emoji | null): string | ProsemirrorNode | null {\n if (emoji) {\n return nodeForEmoji(schema, emoji, emoji.aliases[0]);\n } else {\n return null;\n }\n },\n\n view: {\n component: EmojiView,\n key: emoji => emoji.emoji,\n width: 200,\n hideNoResults: true,\n },\n };\n}\n\nconst kMaxEmojiCompletions = 20;\nconst kEmojiCompletionRegEx = /(^|[^`\\:]):(\\w{2,})$/;\n\nfunction emojiCompletions(ui: EditorUI) {\n return (text: string, context: EditorState | Transaction): CompletionResult<Emoji> | null => {\n // look for requisite text sequence\n const match = text.match(kEmojiCompletionRegEx);\n if (match) {\n // determine insert position and prefix to search for\n const prefix = match[2].toLowerCase();\n const pos = context.selection.head - prefix.length - 1; // -1 for the leading :\n\n // scan for completions that match the prefix (truncate as necessary)\n const completions: Emoji[] = [];\n for (const emoji of emojis(ui.prefs.emojiSkinTone())) {\n const alias = emoji.aliases.find(a => a.startsWith(prefix));\n if (alias) {\n completions.push({\n ...emoji,\n aliases: [alias],\n });\n }\n if (completions.length >= kMaxEmojiCompletions) {\n break;\n }\n }\n\n // return result\n return {\n pos,\n token: prefix,\n completions: () => Promise.resolve(completions),\n };\n\n // no match\n } else {\n return null;\n }\n };\n}\n\nconst EmojiView: React.FC<Emoji> = emoji => {\n return (\n <div className={'pm-completion-list-item-text pm-emoji-font'}>\n {emoji.emoji} :{emoji.aliases[0]}:\n </div>\n );\n};\n\nexport function emojiSkintonePreferenceCompletionHandler(ui: EditorUI): CompletionHandler<Emoji> {\n return {\n id: '15E92D42-8006-40F4-8FFD-6526F6A8A7FD',\n\n completions: emojiSkintonePreferenceCompletions(ui),\n\n replacement(schema: Schema, emoji: Emoji | null): string | ProsemirrorNode | null {\n if (emoji) {\n // Save this preference and use it in the future\n ui.prefs.setEmojiSkinTone(emoji.skinTone);\n\n // Emit the emoji of the correct skin tone\n return nodeForEmoji(schema, emoji, emoji.aliases[0]);\n } else {\n // The user didn't select a skintoned emoji (e.g. pressed 'ESC'), so\n // just store Default and use that in the future\n ui.prefs.setEmojiSkinTone(SkinTone.Default);\n\n return null;\n }\n },\n\n view: {\n header: () => ({\n component: EmojiSkintonePreferenceHeaderView,\n height: kHeaderHeight,\n }),\n component: EmojiSkintonePreferenceView,\n key: pref => pref.skinTone,\n width: kCellWidth,\n height: kCellWidth,\n horizontal: true,\n horizontalItemWidths: [55],\n },\n };\n}\n\nconst kCellWidth = 40;\nconst kHeaderHeight = 20;\n\nfunction emojiSkintonePreferenceCompletions(ui: EditorUI) {\n return (text: string, context: EditorState | Transaction): CompletionResult<Emoji> | null => {\n // The user has set a preference for skin tone\n if (ui.prefs.emojiSkinTone() !== SkinTone.None) {\n return null;\n }\n\n const range = getMarkRange(context.doc.resolve(context.selection.head - 1), context.doc.type.schema.marks.emoji);\n if (!range) {\n return null;\n }\n\n const emojiText = context.doc.textBetween(range.from, range.to);\n\n // If an attribute to suppress the prompt was explicitly set, don't prompt\n // the user for a skin tone\n const emojiAttrs = getMarkAttrs(context.doc, range, context.doc.type.schema.marks.emoji);\n if (!emojiAttrs.prompt) {\n return null;\n }\n const emoji = emojiFromChar(emojiText);\n\n // If this is an emoji that doesn't support skin tones just return\n if (!emoji?.supportsSkinTone) {\n return null;\n }\n\n return {\n pos: range.from,\n token: emojiText,\n completions: () => Promise.resolve(emojiForAllSkinTones(emoji)),\n };\n };\n}\n\nconst EmojiSkintonePreferenceHeaderView: React.FC<CompletionHeaderProps> = props => {\n return (\n <div className={'pm-completion-emoji-cell-header pm-light-text-color'}>\n {props.ui.context.translateText('Choose preferred skin tone:')}\n </div>\n );\n};\n\n// use outline to apply border as a separator\nconst EmojiSkintonePreferenceView: React.FC<Emoji> = emoji => {\n return <div className=\"pm-completion-list-item-text pm-completion-emoji-cell\">{emoji.emoji}</div>;\n};\n","/*\n * insert_symbol-emoji-skintone.ts\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\n\nimport { TextButton } from '../../api/widgets/button';\n\nimport { SkinTone, emojiFromAlias, emojiWithSkinTonePreference, emojiForAllSkinTones, Emoji } from '../../api/emoji';\nimport { SymbolPreferencesProps } from './insert_symbol-dataprovider';\n\nimport './insert_symbol-emoji-skintone.css';\n\nexport const SymbolEmojiPreferencesPanel = React.forwardRef<any, SymbolPreferencesProps>((props, ref) => {\n // The currently selected skin tone\n const [selectedSkinTone, setSelectedSkinTone] = React.useState<SkinTone>(props.prefs.emojiSkinTone());\n\n // Shows and hides the selection UI\n const [selectSkinTone, setSelectSkinTone] = React.useState<boolean>(false);\n\n const previewEmoji = React.useMemo(() => {\n const emojiRaw = emojiFromAlias('hand');\n return emojiWithSkinTonePreference(emojiRaw!, selectedSkinTone);\n }, [selectedSkinTone]);\n\n const previewEmojiWithSkinTones = React.useMemo(() => {\n return emojiForAllSkinTones(previewEmoji);\n }, [previewEmoji]);\n\n // If the user navigates or changes the symbol, close the picker\n React.useEffect(() => {\n setSelectSkinTone(false);\n }, [props.selectedSymbolIndex]);\n\n // Support navigation within the panel\n const handleKeyDown = (event: React.KeyboardEvent) => {\n switch (event.key) {\n case 'ArrowRight':\n if (selectSkinTone) {\n setSelectedSkinTone(nextSkinTone());\n }\n break;\n\n case 'ArrowLeft':\n if (selectSkinTone) {\n setSelectedSkinTone(previousSkinTone());\n }\n break;\n\n case 'Enter':\n case ' ':\n commitSkinTonePreference(selectedSkinTone);\n setSelectSkinTone(!selectSkinTone);\n event.preventDefault();\n break;\n }\n };\n\n const handleClick = (skinTone: SkinTone) => {\n return (event: React.MouseEvent<HTMLElement>) => {\n commitSkinTonePreference(skinTone);\n setSelectSkinTone(false);\n };\n };\n\n const handleButtonClick = () => {\n setSelectSkinTone(true);\n };\n\n function nextSkinTone(): SkinTone {\n const index = getCurrentSkinToneIndex();\n if (index + 1 < previewEmojiWithSkinTones.length) {\n return previewEmojiWithSkinTones[index + 1].skinTone;\n }\n return selectedSkinTone;\n }\n\n function previousSkinTone(): SkinTone {\n const index = getCurrentSkinToneIndex();\n if (index - 1 >= 0) {\n return previewEmojiWithSkinTones[index - 1].skinTone;\n }\n return selectedSkinTone;\n }\n\n function getCurrentSkinToneIndex(): number {\n const index = previewEmojiWithSkinTones.findIndex(emoji => emoji.skinTone === selectedSkinTone);\n return Math.max(Math.min(index, previewEmojiWithSkinTones.length), 0);\n }\n\n function skinToneSelectedClass(emoji: Emoji): string {\n if (\n selectedSkinTone === emoji.skinTone ||\n (selectedSkinTone === SkinTone.None && emoji.skinTone === SkinTone.Default)\n ) {\n return 'pm-emoji-skintone-picker-item-selected pm-input-button';\n }\n return '';\n }\n\n function commitSkinTonePreference(skinTone: SkinTone) {\n setSelectedSkinTone(skinTone);\n props.prefs.setEmojiSkinTone(skinTone);\n props.onPreferencesChanged();\n }\n\n const skinTonePicker = () => {\n return (\n <div>\n <div className=\"pm-emoji-skintone-picker pm-input-button\">\n {previewEmojiWithSkinTones.map(emoji => {\n return (\n <div\n key={emoji.emoji}\n className={`pm-emoji-skintone-picker-item ${skinToneSelectedClass(emoji)}`}\n onClick={handleClick(emoji.skinTone)}\n >\n {emoji.emoji}\n </div>\n );\n })}\n </div>\n <div className=\"pm-emoji-skintone-picker-label pm-light-text-color\">\n {props.context.translateText('Preferred skin tone')}\n </div>\n </div>\n );\n };\n\n const currentSkinToneButton = () => {\n return (\n <TextButton\n classes={['pm-emoji-skintone-picker-button', 'pm-light-text-color']}\n title={\n selectedSkinTone === SkinTone.None\n ? props.context.translateText(`${previewEmoji.emoji} Skin tone`)\n : previewEmoji.emoji\n }\n onClick={handleButtonClick}\n tabIndex={-1}\n />\n );\n };\n\n return (\n <div className=\"pm-emoji-skintone-picker-container pm-emoji-font\" onKeyDown={handleKeyDown} tabIndex={0} ref={ref}>\n {selectSkinTone ? skinTonePicker() : currentSkinToneButton()}\n </div>\n );\n});\n","/*\n * insert_special_characters.ts\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorCommandId, InsertCharacterCommand, ProsemirrorCommand } from '../../api/command';\nimport { hardBreakCommandFn } from '../../nodes/hard_break';\n\nconst extension = {\n commands: () => {\n return [\n new InsertCharacterCommand(EditorCommandId.EmDash, '—', []),\n new InsertCharacterCommand(EditorCommandId.EnDash, '–', []),\n new ProsemirrorCommand(EditorCommandId.HardLineBreak, ['Shift-Enter'], hardBreakCommandFn())\n ];\n },\n};\n\nexport default extension;\n","/*\n * nbsp.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { DecorationSet, Decoration } from 'prosemirror-view';\nimport { Plugin, PluginKey, EditorState, Transaction } from 'prosemirror-state';\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { EditorCommandId, InsertCharacterCommand } from '../api/command';\nimport { forChangedNodes } from '../api/transaction';\nimport { mergedTextNodes } from '../api/text';\n\nconst kNbsp = '\\u00A0';\nconst kNbspRegEx = /\\xA0/g;\n\nconst extension = {\n commands: () => {\n return [new InsertCharacterCommand(EditorCommandId.NonBreakingSpace, kNbsp, ['Ctrl-Space', 'Ctrl-Shift-Space'])];\n },\n\n plugins: () => {\n return [nonBreakingSpacePastePlugin(), nonBreakingSpaceHighlightPlugin()];\n },\n};\n\nconst pastePluginKey = new PluginKey('nbsp-paste');\n\nfunction nonBreakingSpacePastePlugin() {\n return new Plugin({\n key: pastePluginKey,\n props: {\n transformPastedHTML: (html: string) => {\n // strips spans that contain a single non-breaking space (chrome/webkit seem to\n // do this for spaces surrounding marked html)\n return html.replace(/<span> <\\/span>/g, ' ');\n },\n },\n });\n}\n\nconst highlightPluginKey = new PluginKey('nbsp-highlight');\n\nfunction nonBreakingSpaceHighlightPlugin() {\n return new Plugin<DecorationSet>({\n key: highlightPluginKey,\n state: {\n init(_config: { [key: string]: any }, instance: EditorState) {\n return DecorationSet.create(instance.doc, highlightNode(instance.doc));\n },\n apply(tr: Transaction, set: DecorationSet, oldState: EditorState, newState: EditorState) {\n // map\n set = set.map(tr.mapping, tr.doc);\n\n // find new\n if (tr.docChanged) {\n const decorations: Decoration[] = [];\n forChangedNodes(\n oldState,\n newState,\n node => node.isTextblock && node.textContent.includes(kNbsp),\n (node, pos) => {\n decorations.push(...highlightNode(node, pos + 1));\n },\n );\n set = set.add(tr.doc, decorations);\n }\n\n // return the set\n return set;\n },\n },\n props: {\n decorations(state: EditorState) {\n return highlightPluginKey.getState(state);\n },\n },\n });\n}\n\nfunction highlightNode(node: ProsemirrorNode, nodePos = 0) {\n const decorations: Decoration[] = [];\n const textNodes = mergedTextNodes(node);\n textNodes.forEach(textNode => {\n const text = textNode.text;\n let m;\n kNbspRegEx.lastIndex = 0;\n // tslint:disable-next-line no-conditional-assignment\n while ((m = kNbspRegEx.exec(text))) {\n if (m[0] === '') {\n break;\n }\n const from = nodePos + textNode.pos + m.index;\n const to = nodePos + textNode.pos + m.index + m[0].length;\n const classes = ['pm-nbsp', 'pm-invisible-text-color'];\n decorations.push(Decoration.inline(from, to, { class: classes.join(' ') }));\n }\n kNbspRegEx.lastIndex = 0;\n });\n return decorations;\n}\n\nexport default extension;\n","/*\n * remove_section.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { Transaction, EditorState, Selection, Plugin, PluginKey } from 'prosemirror-state';\nimport { ReplaceStep, ReplaceAroundStep } from 'prosemirror-transform';\n\nimport { findParentNodeOfType } from 'prosemirror-utils';\n\nimport { Extension } from '../api/extension';\nimport { isList } from '../api/list';\nimport { transactionsDocChanged } from '../api/transaction';\n\nconst extension: Extension = {\n\n plugins: (schema: Schema) => {\n return [\n new Plugin({\n key: new PluginKey('remove-section'),\n appendTransaction: (transactions: Transaction[], oldState: EditorState, newState: EditorState) => {\n \n // skip for selection-only changes\n if (!transactionsDocChanged(transactions)) {\n return;\n }\n\n if (isSectionRemoval(transactions, oldState)) {\n\n // if we had selected the entire contents of a div then prosemirror will remove\n // the div entirely -- we actually want to leave an empty div in place\n const fullySelectedDiv = fullySelectedDivSection(oldState); \n if (fullySelectedDiv) {\n const tr = newState.tr;\n tr.replaceSelectionWith(\n schema.nodes.div.create(fullySelectedDiv.node.attrs,\n schema.nodes.paragraph.create()));\n return tr;\n }\n \n \n // if we are left with an empty selection in an empty heading block this may\n // have been the removal of a section (more than 1 textBlock). in that case\n // remove the empty heading node\n else if (isEmptyHeadingSelection(newState.selection)) {\n const tr = newState.tr;\n const $head = tr.selection.$head;\n const start = $head.start();\n const end = start + 2;\n tr.deleteRange(start, end);\n return tr;\n }\n }\n\n\n }\n })\n ];\n },\n};\n\n\nfunction isSectionRemoval(transactions: Transaction[], oldState: EditorState) {\n // was this the removal of a section?\n let isRemoval = false;\n if (transactions.length === 1 && transactions[0].steps.length === 1) {\n // see if this is a delete step\n let isDeleteStep = false;\n const step = transactions[0].steps[0];\n if (step instanceof ReplaceStep) {\n isDeleteStep = (step as any).slice.content.size === 0;\n } else if (step instanceof ReplaceAroundStep) {\n const { gapFrom, gapTo } = step as any;\n isDeleteStep = gapFrom === gapTo;\n }\n\n // if it's a delete step then see if we removed multiple text blocks\n let numBlocks = 0;\n const { from, to } = step as any;\n oldState.doc.nodesBetween(from, to, node => {\n if (isRemoval) {\n return false;\n }\n if (isList(node)) {\n isRemoval = true;\n return false;\n } else if (node.isTextblock) {\n if (numBlocks++ >= 1) {\n isRemoval = true;\n return false;\n }\n }\n });\n }\n\n return isRemoval;\n}\n\n\nfunction fullySelectedDivSection(state: EditorState) {\n\n if (!state.selection.empty && state.schema.nodes.div) {\n\n const div = findParentNodeOfType(state.schema.nodes.div)(state.selection);\n if (div) {\n \n // calculate the inner selection of the div (accounting for container position offsets)\n let divSelFrom = div.start + 1; // offset to get to beginning first block text\n let divSelTo = div.pos + div.node.nodeSize - 2; // offset to end of last block text\n \n // if the div's first child is a list we need to push in 2 more\n if (isList(div.node.firstChild)) {\n divSelFrom += 2;\n }\n // if the div's last child is a list we need to push in 2 more\n if (isList(div.node.lastChild)) {\n divSelTo -=2;\n }\n\n // does the selection span the entire div?\n if (state.selection.from === divSelFrom && state.selection.to === divSelTo) {\n return div;\n } else {\n return false;\n }\n }\n }\n\n return false;\n}\n\n\nfunction isEmptyHeadingSelection(selection: Selection) {\n const parent = selection.$head.parent;\n const schema = parent.type.schema;\n return selection.empty && parent.type === schema.nodes.heading && parent.content.size === 0;\n}\n\n\nexport default extension;\n","/*\n * slides.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Transaction, EditorState } from \"prosemirror-state\";\nimport { setTextSelection, findParentNodeOfType } from \"prosemirror-utils\";\n\nimport { ExtensionContext } from \"../api/extension\";\nimport { kPresentationDocType } from \"../api/format\";\nimport { canInsertNode, editingRootNode } from \"../api/node\";\nimport { ProsemirrorCommand, EditorCommandId } from \"../api/command\";\nimport { OmniInsertGroup } from \"../api/omni_insert\";\nimport { wrapIn } from \"prosemirror-commands\";\n\nconst extension = (context: ExtensionContext) => {\n\n const { ui, format, pandocExtensions } = context;\n\n if (!format.docTypes.includes(kPresentationDocType)) {\n return null;\n }\n\n return {\n commands: () => {\n const cmds: ProsemirrorCommand[] = [\n new ProsemirrorCommand(EditorCommandId.InsertSlidePause, [], insertSlidePause, {\n name: ui.context.translateText('Slide Pause'),\n description: ui.context.translateText('Pause after content'),\n group: OmniInsertGroup.Content,\n priority: 2,\n image: () => ui.prefs.darkMode() ? ui.images.omni_insert!.slide_pause_dark! : ui.images.omni_insert!.slide_pause!\n })\n ];\n\n if (pandocExtensions.fenced_divs) {\n cmds.push(new ProsemirrorCommand(EditorCommandId.InsertSlideNotes, [], insertSlideNotes, {\n name: ui.context.translateText('Slide Notes'),\n description: ui.context.translateText('Slide speaker notes'),\n group: OmniInsertGroup.Content,\n priority: 2,\n image: () => ui.prefs.darkMode() ? ui.images.omni_insert!.slide_notes_dark! : ui.images.omni_insert!.slide_notes!\n }));\n cmds.push(new ProsemirrorCommand(EditorCommandId.InsertSlideColumns, [], insertSlideColumns, {\n name: ui.context.translateText('Slide Columns'),\n description: ui.context.translateText('Two column layout'),\n group: OmniInsertGroup.Content,\n priority: 2,\n image: () => ui.prefs.darkMode() ? ui.images.omni_insert!.slide_columns_dark! : ui.images.omni_insert!.slide_columns!\n }));\n }\n\n return cmds;\n }\n\n };\n};\n\n\nexport function insertSlideColumns(state: EditorState, dispatch?: (tr: Transaction) => void) {\n const schema = state.schema;\n if (!canInsertNode(state, schema.nodes.div)) {\n return false;\n }\n\n\n\n if (dispatch) {\n wrapIn(state.schema.nodes.div)(state, (tr: Transaction) => {\n\n const div = findParentNodeOfType(state.schema.nodes.div)(tr.selection)!;\n tr.setNodeMarkup(div.pos, div.node.type, { classes: [\"columns\"] });\n\n const columnAttrs = { classes: [\"column\"], keyvalue:[[\"width\", \"50%\"]] };\n const columnsContent = [\n state.schema.nodes.div.create(\n columnAttrs,\n state.schema.nodes.paragraph.create()\n ),\n state.schema.nodes.div.create(\n columnAttrs,\n state.schema.nodes.paragraph.create()\n )\n ];\n tr.replaceWith(div.start, div.start + 1, columnsContent);\n setTextSelection(div.start + 1)(tr);\n \n dispatch(tr);\n });\n }\n return true;\n}\n\nexport function insertSlidePause(state: EditorState, dispatch?: (tr: Transaction) => void) {\n const schema = state.schema;\n if (!canInsertNode(state, schema.nodes.paragraph)) {\n return false;\n }\n if (dispatch) {\n const tr = state.tr;\n tr.replaceSelectionWith(schema.nodes.paragraph.createAndFill({}, schema.text('. . .')));\n setTextSelection(tr.selection.from - 1, -1)(tr);\n tr.replaceSelectionWith(schema.nodes.paragraph.create());\n setTextSelection(tr.selection.from - 1, -1)(tr);\n dispatch(tr);\n }\n return true;\n}\n\nexport function insertSlideNotes(state: EditorState, dispatch?: (tr: Transaction) => void) {\n const schema = state.schema;\n if (!canInsertNode(state, schema.nodes.div)) {\n return false;\n }\n if (dispatch) {\n const tr = state.tr;\n tr.replaceSelectionWith(schema.nodes.div.createAndFill({ classes: ['notes']}, schema.nodes.paragraph.create()));\n setTextSelection(state.selection.from + 1, 1)(tr);\n dispatch(tr);\n }\n return true;\n}\n\nexport default extension;","/*\n * strikeout.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Mark, Fragment } from 'prosemirror-model';\n\nimport { MarkCommand, EditorCommandId } from '../api/command';\nimport { Extension, extensionIfEnabled } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\nimport { delimiterMarkInputRule, MarkInputRuleFilter } from '../api/input_rule';\n\nconst extension: Extension = {\n marks: [\n {\n name: 'strikeout',\n spec: {\n group: 'formatting',\n parseDOM: [\n { tag: 'del' },\n { tag: 's' },\n {\n style: 'text-decoration',\n getAttrs: (value: string | Node) => (value as string) === 'line-through' && null,\n },\n ],\n toDOM() {\n return ['del'];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.Strikeout,\n mark: 'strikeout',\n },\n ],\n writer: {\n priority: 6,\n write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n output.writeMark(PandocTokenType.Strikeout, parent);\n },\n },\n },\n },\n ],\n\n commands: (schema: Schema) => {\n return [new MarkCommand(EditorCommandId.Strikeout, [], schema.marks.strikeout)];\n },\n\n inputRules: (schema: Schema, filter: MarkInputRuleFilter) => {\n return [delimiterMarkInputRule('~~', schema.marks.strikeout, filter, '`', true)];\n },\n};\n\nexport default extensionIfEnabled(extension, 'strikeout');\n","/*\n * superscript.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Mark, Fragment } from 'prosemirror-model';\n\nimport { MarkCommand, EditorCommandId } from '../api/command';\nimport { Extension, extensionIfEnabled } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\nimport { delimiterMarkInputRule, MarkInputRuleFilter } from '../api/input_rule';\n\nconst extension: Extension = {\n marks: [\n {\n name: 'superscript',\n spec: {\n group: 'formatting',\n parseDOM: [{ tag: 'sup' }],\n toDOM() {\n return ['sup'];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.Superscript,\n mark: 'superscript',\n },\n ],\n writer: {\n priority: 15,\n write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n output.writeMark(PandocTokenType.Superscript, parent);\n },\n },\n },\n },\n ],\n\n commands: (schema: Schema) => {\n return [new MarkCommand(EditorCommandId.Superscript, [], schema.marks.superscript)];\n },\n\n inputRules: (schema: Schema, filter: MarkInputRuleFilter) => {\n return [delimiterMarkInputRule('\\\\^', schema.marks.superscript, filter, '`', true)];\n },\n};\n\nexport default extensionIfEnabled(extension, 'superscript');\n","/*\n * subscript.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Mark, Fragment } from 'prosemirror-model';\n\nimport { MarkCommand, EditorCommandId } from '../api/command';\nimport { Extension, extensionIfEnabled } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\nimport { delimiterMarkInputRule, MarkInputRuleFilter } from '../api/input_rule';\n\nconst extension: Extension = {\n marks: [\n {\n name: 'subscript',\n spec: {\n group: 'formatting',\n parseDOM: [{ tag: 'sub' }],\n toDOM() {\n return ['sub'];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.Subscript,\n mark: 'subscript',\n },\n ],\n writer: {\n priority: 15,\n write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n output.writeMark(PandocTokenType.Subscript, parent);\n },\n },\n },\n },\n ],\n\n commands: (schema: Schema) => {\n return [new MarkCommand(EditorCommandId.Subscript, [], schema.marks.subscript)];\n },\n\n inputRules: (schema: Schema, filter: MarkInputRuleFilter) => {\n return [delimiterMarkInputRule('\\\\~', schema.marks.subscript, filter, '`\\\\~-', true)];\n },\n};\n\nexport default extensionIfEnabled(extension, 'subscript');\n","/*\n * smallcaps.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Mark, Fragment } from 'prosemirror-model';\n\nimport { MarkCommand, EditorCommandId } from '../api/command';\nimport { Extension, extensionIfEnabled } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\n\nimport './smallcaps-styles.css';\n\nconst extension: Extension = {\n marks: [\n {\n name: 'smallcaps',\n spec: {\n group: 'formatting',\n parseDOM: [\n { tag: \"span[class*='smallcaps']\" },\n { style: 'font-variant', getAttrs: (value: string | Node) => (value as string) === 'small-caps' && null },\n ],\n toDOM() {\n return ['span', { class: 'smallcaps' }];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.SmallCaps,\n mark: 'smallcaps',\n },\n ],\n writer: {\n priority: 8,\n write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n output.writeMark(PandocTokenType.SmallCaps, parent);\n },\n },\n },\n },\n ],\n\n commands: (schema: Schema) => {\n return [new MarkCommand(EditorCommandId.Smallcaps, [], schema.marks.smallcaps)];\n },\n};\n\nexport default extensionIfEnabled(extension, ['bracketed_spans', 'native_spans']);\n","/*\n * underline.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Mark, Fragment } from 'prosemirror-model';\n\nimport { MarkCommand, EditorCommandId } from '../api/command';\nimport { Extension, extensionIfEnabled } from '../api/extension';\nimport { PandocOutput, PandocTokenType } from '../api/pandoc';\n\nimport './underline-styles.css';\nimport { kPlatformMac } from '../api/platform';\n\nconst extension: Extension = {\n marks: [\n {\n name: 'underline',\n spec: {\n parseDOM: [\n { tag: \"span[class*='underline']\" },\n { tag: \"span[class*='ul']\" },\n { tag: \"u\" },\n { tag: \"ins\" }\n ],\n toDOM() {\n return ['span', { class: 'underline' }];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.Underline,\n mark: 'underline',\n },\n ],\n writer: {\n priority: 7,\n write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n output.writeMark(PandocTokenType.Underline, parent);\n },\n },\n },\n },\n ],\n\n commands: (schema: Schema) => {\n return [new MarkCommand(EditorCommandId.Underline, kPlatformMac ? ['Mod-u'] : [], schema.marks.underline)];\n },\n};\n\nexport default extensionIfEnabled(extension, ['bracketed_spans', 'native_spans']);\n","/*\n * raw_inline.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Mark, Fragment, MarkType } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { ProsemirrorCommand, EditorCommandId, toggleMarkType } from '../../api/command';\nimport { PandocOutput, PandocToken, PandocTokenType } from '../../api/pandoc';\nimport { getMarkRange, markIsActive, getMarkAttrs } from '../../api/mark';\nimport { EditorUI } from '../../api/ui';\nimport { RawFormatProps } from '../../api/ui-dialogs';\nimport { canInsertNode } from '../../api/node';\nimport { fragmentText } from '../../api/fragment';\nimport { OmniInsertGroup } from '../../api/omni_insert';\n\nexport const kRawInlineFormat = 0;\nexport const kRawInlineContent = 1;\n\nconst extension = (context: ExtensionContext): Extension | null => {\n const { pandocExtensions, pandocCapabilities, ui } = context;\n\n // always enabled so that extensions can make use of preprocessors + raw_attribute\n // to hoist content out of pandoc for further processing by our token handlers.\n // that means that users can always use the raw attribute in their markdown even\n // if the editing format doesn't support it (in which case it will just get echoed\n // back to the markdown just the way it was written).\n\n // return the extension\n return {\n marks: [\n {\n name: 'raw_inline',\n noInputRules: true,\n noSpelling: true,\n spec: {\n inclusive: false,\n excludes: 'formatting',\n attrs: {\n format: {},\n },\n parseDOM: [\n {\n tag: \"span[class*='raw-inline']\",\n getAttrs(dom: Node | string) {\n const el = dom as Element;\n return {\n format: el.getAttribute('data-format'),\n };\n },\n },\n ],\n toDOM(mark: Mark) {\n const attr: any = {\n class: 'raw-inline pm-fixedwidth-font pm-markup-text-color',\n 'data-format': mark.attrs.format,\n };\n return ['span', attr];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.RawInline,\n mark: 'raw_inline',\n getAttrs: (tok: PandocToken) => {\n return {\n format: tok.c[kRawInlineFormat],\n };\n },\n getText: (tok: PandocToken) => {\n return tok.c[kRawInlineContent];\n },\n },\n ],\n writer: {\n priority: 1,\n write: (output: PandocOutput, mark: Mark, parent: Fragment) => {\n // get raw content\n const raw = fragmentText(parent);\n\n // write it\n output.writeToken(PandocTokenType.RawInline, () => {\n output.write(mark.attrs.format);\n output.write(raw);\n });\n },\n },\n },\n },\n ],\n\n // insert command\n commands: (_schema: Schema) => {\n if (pandocExtensions.raw_attribute) {\n return [new RawInlineCommand(EditorCommandId.RawInline, '', ui, pandocCapabilities.output_formats)];\n } else {\n return [];\n }\n },\n };\n};\n\n// base class for inline commands that auto-insert content\nexport class RawInlineInsertCommand extends ProsemirrorCommand {\n private markType: MarkType;\n constructor(id: EditorCommandId, keymap: readonly string[], markType: MarkType, insert: (tr: Transaction) => void) {\n super(id, keymap, (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n // if we aren't active then make sure we can insert a text node here\n if (!this.isActive(state) && !canInsertNode(state, markType.schema.nodes.text)) {\n return false;\n }\n\n // ensure we can apply this mark here\n if (!toggleMarkType(this.markType)(state)) {\n return false;\n }\n\n if (dispatch) {\n const tr = state.tr;\n\n if (this.isActive(state)) {\n const range = getMarkRange(state.selection.$head, this.markType);\n if (range) {\n tr.removeMark(range.from, range.to, this.markType);\n }\n } else if (!tr.selection.empty) {\n const mark = markType.create();\n tr.addMark(tr.selection.from, tr.selection.to, mark);\n } else {\n insert(tr);\n }\n\n dispatch(tr);\n }\n\n return true;\n });\n this.markType = markType;\n }\n\n public isActive(state: EditorState) {\n return markIsActive(state, this.markType);\n }\n}\n\n// generic raw inline command (opens dialog that allows picking from among formats)\nexport class RawInlineCommand extends ProsemirrorCommand {\n constructor(id: EditorCommandId, defaultFormat: string, ui: EditorUI, outputFormats: string[]) {\n super(\n id,\n [],\n (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n const schema = state.schema;\n\n if (!canInsertNode(state, schema.nodes.text) || !toggleMarkType(schema.marks.raw_inline)(state)) {\n return false;\n }\n\n async function asyncInlineRaw() {\n if (dispatch) {\n // check if mark is active\n const isActive = markIsActive(state, schema.marks.raw_inline);\n\n // get the range of the mark\n let range = { from: state.selection.from, to: state.selection.to };\n if (isActive) {\n range = getMarkRange(state.selection.$from, schema.marks.raw_inline) as { from: number; to: number };\n }\n\n // get raw attributes if we have them\n let raw: RawFormatProps = { content: '', format: defaultFormat };\n raw.content = state.doc.textBetween(range.from, range.to);\n if (isActive) {\n raw = {\n ...raw,\n ...getMarkAttrs(state.doc, state.selection, schema.marks.raw_inline),\n };\n }\n\n const result = await ui.dialogs.editRawInline(raw, outputFormats);\n if (result) {\n const tr = state.tr;\n tr.removeMark(range.from, range.to, schema.marks.raw_inline);\n if (result.action === 'edit') {\n const mark = schema.marks.raw_inline.create({ format: result.raw.format });\n const node = schema.text(result.raw.content, [mark]);\n // if we are editing a selection then replace it, otherwise insert\n if (raw.content) {\n tr.replaceRangeWith(range.from, range.to, node);\n } else {\n tr.replaceSelectionWith(node, false);\n }\n }\n dispatch(tr);\n }\n\n if (view) {\n view.focus();\n }\n }\n }\n asyncInlineRaw();\n\n return true;\n },\n {\n name: ui.context.translateText('Raw Inline...'),\n description: ui.context.translateText('Raw inline content'),\n group: OmniInsertGroup.Content,\n priority: 0,\n image: () =>\n ui.prefs.darkMode() ? ui.images.omni_insert?.raw_inline_dark! : ui.images.omni_insert?.raw_inline!,\n },\n );\n }\n}\n\nexport default extension;\n","/*\n * raw_tex.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Mark, Fragment, Schema } from 'prosemirror-model';\nimport { DecorationSet } from 'prosemirror-view';\nimport { Plugin, PluginKey, EditorState, Transaction, TextSelection } from 'prosemirror-state';\nimport { InputRule, inputRules } from 'prosemirror-inputrules';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { PandocToken, PandocTokenType, PandocOutput } from '../../api/pandoc';\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { kTexFormat } from '../../api/raw';\nimport { markHighlightPlugin, markHighlightDecorations } from '../../api/mark-highlight';\nimport { MarkTransaction } from '../../api/transaction';\nimport { markIsActive, splitInvalidatedMarks } from '../../api/mark';\nimport { EditorCommandId, toggleMarkType } from '../../api/command';\nimport { texLength } from '../../api/tex';\nimport { MarkInputRuleFilter } from '../../api/input_rule';\n\nimport { kRawInlineFormat, kRawInlineContent, RawInlineInsertCommand } from './raw_inline';\n\nconst kTexPlaceholder = 'tex';\n\nconst extension = (context: ExtensionContext): Extension | null => {\n const { pandocExtensions } = context;\n\n if (!pandocExtensions.raw_tex) {\n return null;\n }\n\n return {\n marks: [\n {\n name: 'raw_tex',\n noInputRules: true,\n noSpelling: true,\n spec: {\n inclusive: true,\n excludes: 'formatting',\n attrs: {},\n parseDOM: [\n {\n tag: \"span[class*='raw-tex']\",\n },\n ],\n toDOM(_mark: Mark) {\n const attr: any = {\n class: 'raw-tex pm-fixedwidth-font pm-light-text-color',\n };\n return ['span', attr];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.RawInline,\n mark: 'raw_tex',\n match: (tok: PandocToken) => {\n const format = tok.c[kRawInlineFormat];\n return format === kTexFormat;\n },\n getText: (tok: PandocToken) => {\n return tok.c[kRawInlineContent];\n },\n },\n ],\n writer: {\n priority: 1,\n write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n output.writeRawMarkdown(parent);\n },\n },\n },\n },\n ],\n\n // insert command\n commands: (schema: Schema) => {\n return [new InsertInlineLatexCommand(schema)];\n },\n\n appendMarkTransaction: (schema: Schema) => {\n return [\n {\n name: 'remove-raw-tex-marks',\n filter: node => node.isTextblock && node.type.allowsMarkType(schema.marks.raw_tex),\n append: (tr: MarkTransaction, node: ProsemirrorNode, pos: number) => {\n splitInvalidatedMarks(tr, node, pos, texLength, schema.marks.raw_tex);\n },\n },\n ];\n },\n\n inputRules: (schema: Schema, filter: MarkInputRuleFilter) => {\n return [texInputRule(schema, filter)];\n },\n\n // plugin to add highlighting decorations\n plugins: (schema: Schema) => {\n // plugins to return\n const plugins: Plugin[] = [];\n\n // latex equation highlighting\n plugins.push(latexHighlightingPlugin(schema));\n\n // latex brace matching\n const braces = new Map([\n ['{', '}'],\n ['[', ']'],\n ]);\n plugins.push(\n inputRules({\n rules: [\n new InputRule(/(^|[^^\\\\])([{[])$/, (state: EditorState, match: string[], start: number, end: number) => {\n if (markIsActive(state, schema.marks.raw_tex)) {\n const tr = state.tr;\n tr.insertText(match[2] + braces.get(match[2]));\n setTextSelection(start + match[1].length + 1)(tr);\n return tr;\n } else {\n return null;\n }\n }),\n ],\n }),\n );\n\n // return\n return plugins;\n },\n };\n};\n\nfunction texInputRule(schema: Schema, filter: MarkInputRuleFilter) {\n return new InputRule(/(^| )\\\\$/, (state: EditorState, match: string[], start: number, end: number) => {\n const rawTexMark = schema.marks.raw_tex;\n\n if (state.selection.empty && toggleMarkType(rawTexMark)(state)) {\n // if there is no tex ahead of us or we don't pass the fitler (b/c marks that don't allow\n // input rules are active) then bail\n const $head = state.selection.$head;\n const texText = '\\\\' + $head.parent.textContent.slice($head.parentOffset);\n if (!texText.startsWith('\\\\ ')) {\n const texMatchLength = texLength(texText);\n if (texMatchLength === 0 || !filter(state, state.selection.from, state.selection.from + texMatchLength)) {\n return null;\n }\n }\n\n // create transaction\n const tr = state.tr;\n\n // insert tex backslash\n const mark = schema.marks.raw_tex.create();\n tr.addStoredMark(mark);\n tr.insertText('\\\\');\n\n // extend the mark to cover any valid tex that immediately follows the \\\n const { parent, parentOffset } = tr.selection.$head;\n const text = parent.textContent.slice(parentOffset - 1);\n if (text.length > 0) {\n const length = texLength(text);\n if (length > 1) {\n const startTex = tr.selection.from - 1;\n tr.addMark(startTex, startTex + length, mark);\n return tr;\n }\n }\n\n // insert placeholder if it's a standalone \\\n if (text === '\\\\' || text.startsWith('\\\\ ')) {\n tr.insertText(kTexPlaceholder);\n setTexSelectionAfterInsert(tr);\n return tr;\n }\n }\n\n // didn't find a valid context for a tex comand\n return null;\n });\n}\n\nclass InsertInlineLatexCommand extends RawInlineInsertCommand {\n constructor(schema: Schema) {\n super(EditorCommandId.TexInline, [], schema.marks.raw_tex, (tr: Transaction) => {\n const mark = schema.marks.raw_tex.create();\n const tex = '\\\\' + kTexPlaceholder;\n const node = schema.text(tex, [mark]);\n tr.replaceSelectionWith(node, false);\n setTexSelectionAfterInsert(tr);\n });\n }\n}\n\nfunction setTexSelectionAfterInsert(tr: Transaction) {\n tr.setSelection(\n new TextSelection(tr.doc.resolve(tr.selection.from - kTexPlaceholder.length), tr.doc.resolve(tr.selection.from)),\n );\n}\n\nconst key = new PluginKey<DecorationSet>('latex-highlight');\n\nexport function latexHighlightingPlugin(schema: Schema) {\n return markHighlightPlugin(key, schema.marks.raw_tex, (text, _attrs, markRange) => {\n const kIdClass = 'pm-markup-text-color';\n return markHighlightDecorations(markRange, text, /\\\\[A-Za-z]+/g, kIdClass);\n });\n}\n\nexport default extension;\n","/*\n * mark-highlight.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { PluginKey, Plugin, EditorState, Transaction } from 'prosemirror-state';\nimport { DecorationSet, Decoration } from 'prosemirror-view';\nimport { Node as ProsemirrorNode, MarkType } from 'prosemirror-model';\nimport { findChildrenByMark } from 'prosemirror-utils';\nimport { AddMarkStep, RemoveMarkStep } from 'prosemirror-transform';\n\nimport { getMarkRange, getMarkAttrs } from './mark';\nimport { forChangedNodes } from './transaction';\n\nexport type MarkHighligher = (\n text: string,\n attrs: { [key: string]: any },\n range: { from: number; to: number },\n) => Decoration[];\n\nexport function markHighlightDecorations(\n markRange: { from: number; to: number },\n text: string,\n re: RegExp,\n className: string,\n) {\n const decorations: Decoration[] = [];\n re.lastIndex = 0;\n let match = re.exec(text);\n while (match) {\n decorations.push(\n Decoration.inline(markRange.from + match.index, markRange.from + re.lastIndex, { class: className }),\n );\n match = re.exec(text);\n }\n re.lastIndex = 0;\n return decorations;\n}\n\nexport function markHighlightPlugin(key: PluginKey<DecorationSet>, markType: MarkType, highlighter: MarkHighligher) {\n function decorationsForDoc(doc: ProsemirrorNode) {\n let decorations: Decoration[] = [];\n findChildrenByMark(doc, markType, true).forEach(markedNode => {\n decorations = decorations.concat(markDecorations(doc, markType, markedNode.pos, highlighter));\n });\n return DecorationSet.create(doc, decorations);\n }\n\n return new Plugin<DecorationSet>({\n key,\n state: {\n // initialize by highlighting the entire document\n init(_config: { [key: string]: any }, instance: EditorState) {\n return decorationsForDoc(instance.doc);\n },\n\n // whenever an edit affecting this mark type occurs then update the decorations\n apply(tr: Transaction, set: DecorationSet, oldState: EditorState, newState: EditorState) {\n // ignore selection changes\n if (!tr.docChanged) {\n return set.map(tr.mapping, tr.doc);\n }\n\n // if one of the steps added or removed a mark of our type then rescan the doc.\n if (\n tr.steps.some(\n step =>\n (step instanceof AddMarkStep && (step as any).mark.type === markType) ||\n (step instanceof RemoveMarkStep && (step as any).mark.type === markType),\n )\n ) {\n // rehighlight entire doc\n return decorationsForDoc(newState.doc);\n\n // incremental rehighlighting based on presence of mark in changed regions\n } else {\n // adjust decoration positions to changes made by the transaction (decorations that apply\n // to removed chunks of content will be removed by this)\n set = set.map(tr.mapping, tr.doc);\n\n // function to rehighlight parent of specified pos\n const rehighlightParent = (pos: number) => {\n const resolvedPos = tr.doc.resolve(pos);\n const parent = resolvedPos.node();\n const from = resolvedPos.start();\n const marks = findChildrenByMark(parent, markType);\n marks.forEach(mark => {\n const markRange = getMarkRange(tr.doc.resolve(from + mark.pos), markType) as { from: number; to: number };\n const removeDecorations = set.find(markRange.from, markRange.to);\n set = set.remove(removeDecorations);\n const addDecorations = markDecorations(tr.doc, markType, markRange.from, highlighter);\n set = set.add(tr.doc, addDecorations);\n });\n };\n\n // rehighlight nodes that changed and have our mark type\n forChangedNodes(\n oldState,\n newState,\n node => node.type.allowsMarkType(markType),\n (node, pos) => {\n if (newState.doc.rangeHasMark(pos, pos + node.nodeSize, markType)) {\n rehighlightParent(pos);\n }\n },\n );\n\n return set;\n }\n },\n },\n props: {\n decorations(state: EditorState) {\n return key.getState(state);\n },\n },\n });\n}\n\nfunction markDecorations(doc: ProsemirrorNode, markType: MarkType, pos: number, highlighter: MarkHighligher) {\n const markRange = getMarkRange(doc.resolve(pos), markType);\n if (markRange) {\n const attrs = getMarkAttrs(doc, markRange, markType);\n const text = doc.textBetween(markRange.from, markRange.to);\n return highlighter(text, attrs, markRange);\n } else {\n return [];\n }\n}\n","/*\n * tex.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n// Get the length of valid tex content for the passed text. return values include:\n// -1: Invalid tex content (starts with \\ but doesn't close braces/brackets properly)\n// 0: Not tex content\n// >1: Length of valid tex string\nexport function texLength(text: string) {\n\n // if tex includes newlines it's auto-valid (could be math)\n if (text.includes('\\n')) {\n return text.length;\n }\n \n\n let braceLevel = 0;\n let bracketLevel = 0;\n\n let i;\n for (i = 0; i < text.length; i++) {\n // next character\n const ch = text[i];\n\n // must start with \\{ltr}\n if (i === 0 && ch !== '\\\\') {\n return 0;\n }\n if (i === 1 && !isLetter(ch)) {\n return 0;\n }\n\n // only letters, backslashes, and open brace/bracket allowed (unless we are in braces or brackets)\n const inBraces = braceLevel >= 1;\n const inBrackets = bracketLevel >= 1;\n if (i > 0 && !isLetter(ch) && ch !== '\\\\' && ch !== '{' && ch !== '[' && !inBraces && !inBrackets) {\n return i;\n }\n\n // manage brace and bracket levels\n if (ch === '{') {\n braceLevel++;\n } else if (ch === '}') {\n braceLevel--;\n } else if (ch === '[') {\n bracketLevel++;\n } else if (ch === ']') {\n bracketLevel--;\n }\n }\n\n if (braceLevel === 0 && bracketLevel === 0) {\n return i;\n } else {\n return -1; // invalid tex\n }\n}\n\n\nconst LetterRegex = /[A-Za-z]/;\nfunction isLetter(ch: string) {\n return LetterRegex.test(ch);\n}\n","/*\n * raw_html.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Mark, Schema, Fragment } from 'prosemirror-model';\nimport { InputRule } from 'prosemirror-inputrules';\nimport { EditorState } from 'prosemirror-state';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { PandocTokenType, PandocToken, ProsemirrorWriter, PandocOutput } from '../../api/pandoc';\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { isRawHTMLFormat } from '../../api/raw';\nimport { MarkInputRuleFilter } from '../../api/input_rule';\n\nimport { kRawInlineFormat, kRawInlineContent } from './raw_inline';\nimport { toggleMarkType } from '../../api/command';\n\nconst extension = (context: ExtensionContext): Extension | null => {\n const { pandocExtensions } = context;\n return {\n marks: [\n {\n name: 'raw_html',\n noInputRules: true,\n noSpelling: true,\n spec: {\n inclusive: false,\n excludes: 'formatting',\n parseDOM: [\n {\n tag: \"span[class*='raw-html']\",\n getAttrs(dom: Node | string) {\n return {};\n },\n },\n ],\n toDOM(mark: Mark) {\n const attr: any = {\n class: 'raw-html pm-fixedwidth-font pm-markup-text-color',\n };\n return ['span', attr];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.RawInline,\n match: (tok: PandocToken) => {\n const format = tok.c[kRawInlineFormat];\n return isRawHTMLFormat(format);\n },\n handler: (schema: Schema) => {\n return (writer: ProsemirrorWriter, tok: PandocToken) => {\n const html = tok.c[kRawInlineContent];\n if (writer.hasInlineHTMLWriter(html)) {\n writer.writeInlineHTML(html);\n } else {\n writeInlneHTML(schema, html, writer);\n }\n };\n },\n },\n ],\n\n inlineHTMLReader: (schema: Schema, html: string, writer?: ProsemirrorWriter) => {\n // read single tags as inline html\n const isSingleTag = tagStartLoc(html, html.length - 2) === 0;\n if (isSingleTag && writer) {\n writeInlneHTML(schema, html, writer);\n }\n return isSingleTag;\n },\n writer: {\n priority: 1,\n write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n output.writeRawMarkdown(parent);\n },\n },\n },\n },\n ],\n\n // input rules\n inputRules: (schema: Schema, filter: MarkInputRuleFilter) => {\n if (pandocExtensions.raw_html) {\n return [rawHtmlInputRule(schema, filter)];\n } else {\n return [];\n }\n },\n };\n};\n\nfunction writeInlneHTML(schema: Schema, html: string, writer: ProsemirrorWriter) {\n const mark = schema.marks.raw_html.create();\n writer.openMark(mark);\n writer.writeText(html);\n writer.closeMark(mark);\n}\n\nexport function rawHtmlInputRule(schema: Schema, filter: MarkInputRuleFilter) {\n return new InputRule(/>$/, (state: EditorState, match: string[], start: number, end: number) => {\n const rawhtmlMark = state.schema.marks.raw_html;\n\n // ensure we pass all conditions for html input\n if (state.selection.empty && toggleMarkType(rawhtmlMark)(state) && filter(state, start, end)) {\n // get tag info\n const { parent, parentOffset } = state.selection.$head;\n const text = parent.textContent;\n const endLoc = parentOffset - 1;\n const tag = tagInfo(text, endLoc);\n if (tag) {\n // create transaction\n const tr = state.tr;\n\n // insert >\n tr.insertText('>');\n\n // add mark\n start = tr.selection.from - (tag.end - tag.start + 1);\n tr.addMark(start, end + 1, rawhtmlMark.create());\n tr.removeStoredMark(rawhtmlMark);\n\n // if it wasn't an end tag and it isn't a void tag then also\n // insert an end tag (and leave the cursor in the middle)\n if (!tag.close && !tag.void) {\n const endTag = schema.text(`</${tag.name}>`);\n tr.replaceSelectionWith(endTag, false);\n setTextSelection(tr.selection.from - endTag.textContent.length)(tr);\n tr.addMark(tr.selection.from, tr.selection.from + endTag.textContent.length, rawhtmlMark.create());\n tr.removeStoredMark(rawhtmlMark);\n }\n\n // return transaction\n return tr;\n }\n }\n\n return null;\n });\n}\n\nfunction tagInfo(text: string, endLoc: number) {\n const startLoc = tagStartLoc(text, endLoc);\n if (startLoc !== -1) {\n // don't match if preceding character is a backtick\n // (user is attempting to write an html tag in code)\n if (text.charAt(startLoc - 1) === '`') {\n return null;\n }\n const tagText = text.substring(startLoc, endLoc + 1);\n const match = tagText.match(/<(\\/?)(\\w+)/);\n if (match) {\n const name = match[2];\n if (isHTMLTag(name)) {\n return {\n name: match[2],\n close: match[1].length > 0,\n void: isVoidTag(name),\n start: startLoc,\n end: endLoc + 1,\n };\n }\n }\n }\n return null;\n}\n\nfunction tagStartLoc(text: string, endLoc: number) {\n let inSingleQuote = false;\n let inDoubleQuote = false;\n let i;\n for (i = endLoc; i >= 0; i--) {\n // next character\n const ch = text[i];\n\n // invalid if we see another > when not in quotes\n if (ch === '>' && !inSingleQuote && !inDoubleQuote) {\n return -1;\n }\n\n // > terminate on < if we aren't in quotes\n if (ch === '<' && !inSingleQuote && !inDoubleQuote) {\n return i;\n }\n\n // handle single quote\n if (ch === \"'\") {\n if (inSingleQuote) {\n inSingleQuote = false;\n } else if (!inDoubleQuote) {\n inSingleQuote = true;\n }\n\n // handle double quote\n } else if (ch === '\"') {\n if (inDoubleQuote) {\n inDoubleQuote = false;\n } else if (!inSingleQuote) {\n inDoubleQuote = true;\n }\n }\n }\n\n return -1;\n}\n\nfunction isHTMLTag(tag: string) {\n return [\n // structural\n 'a',\n 'article',\n 'aside',\n 'body',\n 'br',\n 'details',\n 'div',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'head',\n 'header',\n 'hgroup',\n 'hr',\n 'html',\n 'footer',\n 'nav',\n 'p',\n 'section',\n 'span',\n 'summary',\n\n // metadata\n 'base',\n 'basefont',\n 'link',\n 'meta',\n 'style',\n 'title',\n\n // form\n 'button',\n 'datalist',\n 'fieldset',\n 'form',\n 'input',\n 'keygen',\n 'label',\n 'legend',\n 'meter',\n 'optgroup',\n 'option',\n 'select',\n 'textarea',\n\n // formatting\n 'abbr',\n 'acronym',\n 'address',\n 'b',\n 'bdi',\n 'bdo',\n 'big',\n 'blockquote',\n 'center',\n 'cite',\n 'code',\n 'del',\n 'dfn',\n 'em',\n 'font',\n 'i',\n 'ins',\n 'kbd',\n 'mark',\n 'output',\n 'pre',\n 'progress',\n 'q',\n 'rp',\n 'rt',\n 'ruby',\n 's',\n 'samp',\n 'small',\n 'strike',\n 'strong',\n 'sub',\n 'sup',\n 'tt',\n 'u',\n 'var',\n 'wbr',\n\n // list\n 'dd',\n 'dir',\n 'dl',\n 'dt',\n 'li',\n 'ol',\n 'menu',\n 'ul',\n\n // table\n 'caption',\n 'col',\n 'colgroup',\n 'table',\n 'tbody',\n 'td',\n 'tfoot',\n 'thead',\n 'th',\n 'tr',\n\n // scripting\n 'script',\n 'noscript',\n\n // embedded content\n 'applet',\n 'area',\n 'audio',\n 'canvas',\n 'embed',\n 'figcaption',\n 'figure',\n 'frame',\n 'frameset',\n 'iframe',\n 'img',\n 'map',\n 'noframes',\n 'object',\n 'param',\n 'source',\n 'time',\n 'video',\n ].includes(tag.toLowerCase());\n}\n\nfunction isVoidTag(tag: string) {\n return [\n 'area',\n 'base',\n 'br',\n 'col',\n 'command',\n 'embed',\n 'hr',\n 'img',\n 'input',\n 'keygen',\n 'link',\n 'meta',\n 'param',\n 'source',\n 'track',\n 'wbr',\n ].includes(tag.toLowerCase());\n}\n\nexport default extension;\n","/*\n * math.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema, Mark, Fragment, Slice } from 'prosemirror-model';\nimport { Plugin, PluginKey, EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { InputRule } from 'prosemirror-inputrules';\n\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { PandocTokenType, PandocToken, PandocOutput } from '../../api/pandoc';\nimport { BaseKey, BaseKeyBinding } from '../../api/basekeys';\nimport { markIsActive } from '../../api/mark';\nimport { kCodeText } from '../../api/code';\nimport { kPasteTransaction } from '../../api/transaction';\nimport { kQuartoDocType } from '../../api/format';\nimport { kMathContent, kMathType, delimiterForType, MathType, kMathId } from '../../api/math';\nimport { MarkInputRuleFilter } from '../../api/input_rule';\n\nimport { InsertInlineMathCommand, InsertDisplayMathCommand, insertMath } from './math-commands';\nimport { mathAppendMarkTransaction } from './math-transaction';\nimport { mathHighlightPlugin } from './math-highlight';\nimport { MathPopupPlugin } from './math-popup';\nimport { mathViewPlugins } from './math-view';\nimport { displayMathNewline, inlineMathNav } from './math-keys';\n\nimport './math-styles.css';\n\nconst kInlineMathPattern = '\\\\$[^ ].*?[^\\\\ ]?\\\\$';\nconst kInlineMathRegex = new RegExp(kInlineMathPattern);\n\nconst kSingleLineDisplayMathPattern = '\\\\$\\\\$[^\\n]*?\\\\$\\\\$';\nconst kSingleLineDisplayMathRegex = new RegExp(kSingleLineDisplayMathPattern);\n\nconst extension = (context: ExtensionContext): Extension | null => {\n const { ui, format, math, events } = context;\n\n // note that we always enable math (harmless as worst case it is \n // simply output as ascii math by pandoc) so no check is made here\n\n // special blogdown handling for markdown renderers that don't support math\n const blogdownMathInCode = format.rmdExtensions.blogdownMathInCode;\n const singleLineDisplayMath = blogdownMathInCode;\n\n return {\n marks: [\n {\n name: 'math',\n noInputRules: true,\n noSpelling: true,\n spec: {\n attrs: {\n type: {},\n id: { default: null }\n },\n inclusive: false,\n excludes: 'formatting',\n parseDOM: [\n {\n tag: \"span[class*='math']\",\n getAttrs(dom: Node | string) {\n const el = dom as Element;\n return {\n type: el.getAttribute('data-type'),\n };\n },\n preserveWhitespace: 'full',\n },\n ],\n\n toDOM(mark: Mark) {\n return [\n 'span',\n {\n class: 'math pm-fixedwidth-font pm-light-text-color',\n 'data-type': mark.attrs.type,\n spellcheck: 'false',\n },\n ];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.Math,\n mark: 'math',\n getAttrs: (tok: PandocToken) => {\n return {\n type: tok.c[kMathType].t,\n id: tok.c[kMathId] || null\n };\n },\n getText: (tok: PandocToken) => {\n const delimter = delimiterForType(tok.c[kMathType].t);\n return delimter + tok.c[kMathContent] + delimter;\n },\n },\n // extract math from backtick code for blogdown\n ...(blogdownMathInCode\n ? [\n {\n token: PandocTokenType.Code,\n mark: 'math',\n match: (tok: PandocToken) => {\n const text = tok.c[kCodeText];\n return kSingleLineDisplayMathRegex.test(text) || kInlineMathRegex.test(text);\n },\n getAttrs: (tok: PandocToken) => {\n const text = tok.c[kCodeText];\n return {\n type: kSingleLineDisplayMathRegex.test(text) ? MathType.Display : MathType.Inline,\n };\n },\n getText: (tok: PandocToken) => {\n return tok.c[kCodeText];\n },\n },\n ]\n : []),\n ],\n writer: {\n priority: 1,\n write: (output: PandocOutput, mark: Mark, parent: Fragment) => {\n // collect math content\n let mathText = '';\n parent.forEach((node: ProsemirrorNode) => (mathText = mathText + node.textContent));\n\n // if this is blogdownMathInCode just write the content in a code mark\n if (blogdownMathInCode) {\n output.writeToken(PandocTokenType.Code, () => {\n output.writeAttr();\n output.write(mathText);\n });\n } else {\n // check for delimeter (if it's gone then write this w/o them math mark)\n const delimiter = delimiterForType(mark.attrs.type);\n if (mathText.startsWith(delimiter) && mathText.endsWith(delimiter)) {\n // remove delimiter\n mathText = mathText.substr(delimiter.length, mathText.length - 2 * delimiter.length);\n\n \n if (mark.attrs.type === MathType.Inline) {\n // trim inline math\n mathText = mathText.trim();\n } else if (mark.attrs.type === MathType.Display) {\n // remove blank lines from display math (but preserve enclosing whitespace)\n const beginMatch = mathText.match(/^\\s*/);\n const begin = beginMatch ? beginMatch[0].replace(/\\n{2,}/g, \"\\n\") : '';\n const endMatch = mathText.match(/\\s*$/);\n const end = endMatch ? endMatch[0].replace(/\\n{2,}/g, \"\\n\") : '';\n mathText = begin + mathText.trim()\n .split(\"\\n\")\n .filter(line => line.trim().length > 0)\n .join(\"\\n\") + end;\n }\n \n // if it's just whitespace then it's not actually math (we allow this state\n // in the editor because it's the natural starting place for new equations)\n if (mathText.length === 0) {\n output.writeText(delimiter + mathText + delimiter);\n } else {\n output.writeToken(PandocTokenType.Math, () => {\n // write type\n output.writeToken(\n mark.attrs.type === MathType.Inline ? PandocTokenType.InlineMath : PandocTokenType.DisplayMath,\n );\n output.write(mathText);\n });\n // write id if we have it\n if (mark.attrs.id) {\n output.writeRawMarkdown(` {#${mark.attrs.id}}`);\n }\n }\n } else {\n // user removed the delimiter so write the content literally. when it round trips\n // back into editor it will no longer be parsed by pandoc as math\n output.writeRawMarkdown(mathText);\n }\n }\n },\n },\n // filter for picking out id for quarto crossref\n tokensFilter: format.docTypes.includes(kQuartoDocType) ? (tokens: PandocToken[]) => {\n const pendingTokens: PandocToken[] = [];\n const filteredTokens: PandocToken[] = [];\n\n const clearPendingTokens = () => {\n pendingTokens.splice(0, pendingTokens.length);\n };\n\n const flushPendingTokens = () => {\n filteredTokens.push(...pendingTokens);\n clearPendingTokens();\n };\n\n for (const token of tokens) {\n switch(token.t) {\n case PandocTokenType.Math: \n flushPendingTokens();\n if (token.c[kMathType].t === PandocTokenType.DisplayMath) {\n pendingTokens.push(token);\n } else {\n filteredTokens.push(token);\n }\n break;\n case PandocTokenType.Space:\n if (pendingTokens.length > 0) {\n pendingTokens.push(token);\n } else {\n filteredTokens.push(token);\n }\n break;\n case PandocTokenType.Str:\n if (pendingTokens.length > 0) {\n const match = (token.c as string).match(/{#(eq-[^ }]+)}/);\n if (match) {\n const mathToken = pendingTokens[0];\n mathToken.c[kMathId] = match[1];\n clearPendingTokens();\n filteredTokens.push(mathToken);\n } else {\n flushPendingTokens();\n filteredTokens.push(token);\n }\n } else {\n filteredTokens.push(token);\n }\n break;\n default:\n flushPendingTokens();\n filteredTokens.push(token);\n break;\n }\n }\n flushPendingTokens();\n\n return filteredTokens;\n } : undefined\n },\n },\n ],\n\n baseKeys: (_schema: Schema) => {\n const keys: BaseKeyBinding[] = [\n { key: BaseKey.Home, command: inlineMathNav(true) },\n { key: BaseKey.End, command: inlineMathNav(false) }\n ];\n if (!singleLineDisplayMath) {\n keys.push({ key: BaseKey.Enter, command: displayMathNewline });\n } \n return keys;\n },\n\n inputRules: (schema: Schema, filter: MarkInputRuleFilter) => {\n const kInlineMathInputRulePattern = '\\\\$[^ ][^\\\\$]*?[^\\\\ ]?\\\\$';\n return [\n // inline math\n new InputRule(\n new RegExp('(^|[^`])' + kInlineMathInputRulePattern + '$'),\n (state: EditorState, match: string[], start: number, end: number) => {\n if (!markIsActive(state, schema.marks.math) && filter(state, start, end)) {\n const tr = state.tr;\n tr.insertText('$');\n const mark = schema.marks.math.create({ type: MathType.Inline });\n tr.addMark(start + match[1].length, end + 1, mark);\n return tr;\n } else {\n return null;\n }\n },\n ),\n new InputRule(/(?:^|[^`])\\$$/, (state: EditorState, match: string[], start: number, end: number) => {\n if (!markIsActive(state, schema.marks.math)) {\n const { parent, parentOffset } = state.selection.$head;\n const text = '$' + parent.textContent.slice(parentOffset);\n if (text.length > 0) {\n const length = mathLength(text);\n if (length > 1) {\n if (filter(state, start, start + length)) {\n const tr = state.tr;\n tr.insertText('$');\n const startMath = tr.selection.from - 1;\n const mark = schema.marks.math.create({ type: MathType.Inline });\n tr.addMark(startMath, startMath + length, mark);\n return tr;\n }\n }\n }\n }\n return null;\n }),\n // display math\n new InputRule(/^\\$\\$$/, (state: EditorState, match: string[], start: number, end: number) => {\n if (filter(state, start, end)) {\n const tr = state.tr;\n tr.delete(start, end);\n insertMath(tr.selection, MathType.Display, !singleLineDisplayMath, tr);\n return tr;\n } else {\n return null;\n }\n }),\n ];\n },\n\n commands: (_schema: Schema) => {\n return [new InsertInlineMathCommand(ui), new InsertDisplayMathCommand(ui, !singleLineDisplayMath)];\n },\n\n appendMarkTransaction: (_schema: Schema) => {\n return [mathAppendMarkTransaction()];\n },\n\n plugins: (schema: Schema) => {\n const plugins = [\n new Plugin({\n key: new PluginKey('math'),\n props: {\n // paste plain text into math blocks\n handlePaste: handlePasteIntoMath(),\n },\n }),\n mathHighlightPlugin(schema),\n ];\n if (math) {\n plugins.push(new MathPopupPlugin(ui, math, events, false));\n plugins.push(...mathViewPlugins(schema, format, ui, math));\n }\n return plugins;\n },\n };\n};\n\nfunction mathLength(text: string) {\n const match = text.match(kInlineMathRegex);\n if (match) {\n return match[0].length;\n } else {\n return 0;\n }\n}\n\nfunction handlePasteIntoMath() {\n return (view: EditorView, _event: Event, slice: Slice) => {\n const schema = view.state.schema;\n if (markIsActive(view.state, schema.marks.math)) {\n const tr = view.state.tr;\n tr.setMeta(kPasteTransaction, true);\n tr.setMeta('uiEvent', 'paste');\n let math = '';\n slice.content.forEach((node: ProsemirrorNode) => (math = math + node.textContent));\n tr.replaceSelectionWith(schema.text(math));\n view.dispatch(tr);\n return true;\n } else {\n return false;\n }\n };\n}\n\n\nexport default extension;\n","/*\n * math-commands.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction, Selection } from 'prosemirror-state';\nimport { setTextSelection, findParentNodeOfType } from 'prosemirror-utils';\n\nimport { ProsemirrorCommand, EditorCommandId, toggleMarkType } from '../../api/command';\nimport { canInsertNode } from '../../api/node';\nimport { EditorUI } from '../../api/ui';\nimport { OmniInsert, OmniInsertGroup } from '../../api/omni_insert';\nimport { MathType, delimiterForType } from '../../api/math';\nimport { EditorView } from 'prosemirror-view';\nimport { getMarkRange, getMarkAttrs } from '../../api/mark';\nimport { EditorFormat, kQuartoDocType } from '../../api/format';\n\nexport class InsertInlineMathCommand extends ProsemirrorCommand {\n constructor(ui: EditorUI) {\n super(EditorCommandId.InlineMath, [], insertMathCommand(MathType.Inline, false), inlineMathOmniInsert(ui));\n }\n}\n\nexport class InsertDisplayMathCommand extends ProsemirrorCommand {\n constructor(ui: EditorUI, allowNewline: boolean) {\n super(\n EditorCommandId.DisplayMath,\n [],\n insertMathCommand(MathType.Display, allowNewline),\n displayMathOmniInsert(ui),\n );\n }\n}\n\nfunction insertMathCommand(type: MathType, allowNewline: boolean) {\n return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n // enable/disable command\n const schema = state.schema;\n if (!canInsertNode(state, schema.nodes.text) || !toggleMarkType(schema.marks.math)(state)) {\n return false;\n }\n\n if (dispatch) {\n const tr = state.tr;\n insertMath(state.selection, type, allowNewline, tr);\n dispatch(tr);\n }\n return true;\n };\n}\n\nfunction inlineMathOmniInsert(ui: EditorUI): OmniInsert {\n return {\n name: ui.context.translateText('Inline Math'),\n keywords: [ui.context.translateText('equation')],\n description: ui.context.translateText('Math within a line or paragraph'),\n group: OmniInsertGroup.Math,\n priority: 2,\n image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.math_inline_dark! : ui.images.omni_insert?.math_inline!),\n };\n}\n\nfunction displayMathOmniInsert(ui: EditorUI): OmniInsert {\n return {\n name: ui.context.translateText('Display Math'),\n keywords: [ui.context.translateText('equation')],\n description: ui.context.translateText('Math set apart from the main text'),\n group: OmniInsertGroup.Math,\n priority: 1,\n image: () =>\n ui.prefs.darkMode() ? ui.images.omni_insert?.math_display_dark! : ui.images.omni_insert?.math_display!,\n };\n}\n\nexport function insertMath(selection: Selection, type: MathType, allowNewline: boolean, tr: Transaction) {\n // include a newline for display math in an empty paragraph\n const schema = tr.doc.type.schema;\n let content = '';\n if (type === MathType.Display) {\n const para = findParentNodeOfType(schema.nodes.paragraph)(selection);\n if (allowNewline && para && !para.node.textContent.length) {\n content = '\\n\\n';\n }\n }\n const delim = delimiterForType(type);\n const mathText = schema.text(delim + content + delim);\n tr.replaceSelectionWith(mathText, false);\n const mathMark = schema.marks.math.create({ type });\n const from = tr.selection.head - content.length - delim.length * 2;\n const to = from + delim.length * 2 + content.length;\n tr.addMark(from, to, mathMark);\n const pos = tr.mapping.map(selection.head) - delim.length - (content ? 1 : 0);\n return setTextSelection(pos)(tr).scrollIntoView();\n}\n\nexport function editMathAttributesEnabled(\n format: EditorFormat, \n state: EditorState, \n range?: { from: number, to: number } | false\n) {\n if (format.docTypes.includes(kQuartoDocType)) {\n if (!range) {\n range = getMarkRange(state.selection.$from, state.schema.marks.math);\n }\n if (range) {\n const mathAttrs = getMarkAttrs(state.doc, range, state.schema.marks.math);\n return mathAttrs.type === MathType.Display;\n } else {\n return false;\n }\n } else {\n return false;\n }\n}\n\nexport function editMathAttributes(ui: EditorUI) {\n \n return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n \n // look one position ahead in case this resulted from a click on the edit attributes button\n const mathRange = getMarkRange(\n state.doc.resolve(state.selection.from+1), \n state.schema.marks.math\n ) as { from: number; to: number };\n if (!mathRange) {\n // always return true so the edit button always displays\n return true;\n }\n\n async function asyncEditMath() {\n if (dispatch) {\n \n const mathAttrs = getMarkAttrs(state.doc, mathRange, state.schema.marks.math);\n const id = await ui.dialogs.editMath(mathAttrs.id || \"\");\n if (id !== null) {\n const tr = state.tr;\n const mark = state.schema.marks.math.create({ ...mathAttrs, id: id.length > 0 ? id : null });\n tr.removeMark(mathRange.from, mathRange.to, state.schema.marks.math);\n tr.addMark(mathRange.from, mathRange.to, mark);\n dispatch(tr);\n }\n if (view) {\n view.focus();\n }\n }\n }\n asyncEditMath();\n\n return true;\n };\n}\n","/*\n * math-transaction.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { findChildrenByMark } from 'prosemirror-utils';\n\nimport { getMarkRange, getMarkAttrs } from '../../api/mark';\nimport { AppendMarkTransactionHandler, MarkTransaction } from '../../api/transaction';\nimport { delimiterForType, MathType } from '../../api/math';\nimport { selectionIsWithinRange } from '../../api/selection';\n\nexport function mathAppendMarkTransaction(): AppendMarkTransactionHandler {\n return {\n name: 'math-marks',\n\n filter: node => node.isTextblock && node.type.allowsMarkType(node.type.schema.marks.math),\n\n append: (tr: MarkTransaction, node: ProsemirrorNode, pos: number) => {\n // find all math blocks and convert them to text if they no longer conform\n const schema = node.type.schema;\n const maths = findChildrenByMark(node, schema.marks.math, true);\n for (const math of maths) {\n const from = pos + 1 + math.pos;\n const mathRange = getMarkRange(tr.doc.resolve(from), schema.marks.math);\n if (mathRange) {\n const mathAttr = getMarkAttrs(tr.doc, mathRange, schema.marks.math);\n if (mathAttr.type === MathType.Inline) {\n const mathDelim = delimiterForType(mathAttr.type);\n const mathText = tr.doc.textBetween(mathRange.from, mathRange.to);\n const charAfter = tr.doc.textBetween(mathRange.to, mathRange.to + 1);\n const noDelims = !mathText.startsWith(mathDelim) || !mathText.endsWith(mathDelim);\n const selectionIsWithin = selectionIsWithinRange(tr.selection, mathRange);\n const spaceAtLeft =\n !selectionIsWithin && mathAttr.type === MathType.Inline && mathText.startsWith(mathDelim + ' ');\n const spaceAtRight =\n !selectionIsWithin && mathAttr.type === MathType.Inline && mathText.endsWith(' ' + mathDelim);\n const numberAfter = mathAttr.type === MathType.Inline && /\\d/.test(charAfter);\n if (noDelims || spaceAtLeft || spaceAtRight || numberAfter) {\n tr.removeMark(mathRange.from, mathRange.to, schema.marks.math);\n tr.removeStoredMark(schema.marks.math);\n }\n }\n }\n }\n },\n };\n}\n","/*\n * math-highlight.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { PluginKey } from 'prosemirror-state';\nimport { DecorationSet, Decoration } from 'prosemirror-view';\nimport { Schema } from 'prosemirror-model';\n\nimport { markHighlightPlugin } from '../../api/mark-highlight';\nimport { delimiterForType } from '../../api/math';\n\nconst key = new PluginKey<DecorationSet>('math-highlight');\n\nexport function mathHighlightPlugin(schema: Schema) {\n return markHighlightPlugin(key, schema.marks.math, (_text, attrs, markRange) => {\n const kDelimClass = 'pm-markup-text-color';\n const delim = delimiterForType(attrs.type);\n if (markRange.to - markRange.from === delim.length * 2) {\n return [Decoration.inline(markRange.from, markRange.to, { class: kDelimClass })];\n } else {\n return [\n Decoration.inline(markRange.from, markRange.from + delim.length, { class: kDelimClass }),\n Decoration.inline(markRange.to - delim.length, markRange.to, { class: kDelimClass }),\n ];\n }\n });\n}\n","/*\n * math-preview.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Plugin, PluginKey } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { ResolvedPos } from 'prosemirror-model';\n\nimport debounce from 'lodash.debounce';\nimport zenscroll from 'zenscroll';\n\nimport { EditorUI } from '../../api/ui';\nimport { getMarkRange } from '../../api/mark';\nimport { EditorEvents } from '../../api/events';\nimport { ScrollEvent, ResizeEvent } from '../../api/event-types';\nimport { applyStyles } from '../../api/css';\nimport { editingRootNodeClosestToPos, editingRootNode } from '../../api/node';\nimport { createPopup } from '../../api/widgets/widgets';\nimport { EditorMath } from '../../api/math';\n\nconst kMathPopupVerticalOffset = 10;\nconst kMathPopupInputDebuounceMs = 250;\n\nconst key = new PluginKey('math-preview');\n\nexport class MathPopupPlugin extends Plugin {\n private readonly ui: EditorUI;\n private readonly math: EditorMath;\n\n private view: EditorView | null = null;\n\n private popup: HTMLElement | null = null;\n private lastRenderedMath: string | null = null;\n\n private readonly updatePopupTimer: number;\n\n private scrollUnsubscribe: VoidFunction;\n private resizeUnsubscribe: VoidFunction;\n\n constructor(ui: EditorUI, math: EditorMath, events: EditorEvents, onHover: boolean) {\n super({\n key,\n view: () => {\n return {\n update: debounce(\n (view: EditorView) => {\n this.view = view;\n this.updatePopup();\n },\n kMathPopupInputDebuounceMs,\n { leading: true, trailing: true },\n ),\n destroy: () => {\n clearInterval(this.updatePopupTimer);\n this.scrollUnsubscribe();\n this.resizeUnsubscribe();\n this.closePopup();\n },\n };\n },\n props: {\n handleDOMEvents: {\n ...(onHover\n ? {\n mousemove: debounce((view: EditorView, event: Event) => {\n const ev = event as MouseEvent;\n const pos = view.posAtCoords({ top: ev.clientY, left: ev.clientX });\n if (pos && pos.inside !== -1) {\n this.updatePopup(view.state.doc.resolve(pos.pos));\n }\n return false;\n }, kMathPopupInputDebuounceMs),\n }\n : {}),\n },\n },\n });\n\n // save reference to ui and math\n this.ui = ui;\n this.math = math;\n\n // update popup for resize, scrolling, as well as every 100ms to cover reflowing\n // of the document as a result of latex math being shown/hidden (will effectively\n // be a no-op if the math text and document layout / scroll position hasn't changed)\n this.updatePopup = this.updatePopup.bind(this);\n this.updatePopupTimer = setInterval(this.updatePopup, 100);\n this.scrollUnsubscribe = events.subscribe(ScrollEvent, () => this.updatePopup());\n this.resizeUnsubscribe = events.subscribe(ResizeEvent, () => this.updatePopup());\n }\n\n private updatePopup($mousePos?: ResolvedPos) {\n // bail if we don't have a view\n if (!this.view) {\n return;\n }\n\n // capture state, etc.\n const state = this.view.state;\n const schema = state.schema;\n\n // determine math range\n let range: false | { from: number; to: number } = false;\n\n // if a $pos was passed (e.g. for a mouse hover) then check that first\n if ($mousePos) {\n range = getMarkRange($mousePos, schema.marks.math);\n }\n\n // if that didn't work try the selection\n if (!range) {\n range = getMarkRange(state.selection.$from, schema.marks.math);\n }\n\n // bail if we don't have a target\n if (!range) {\n this.closePopup();\n return;\n }\n\n // bail if the user has this disabled\n if (!this.ui.prefs.equationPreview()) {\n this.closePopup();\n return;\n }\n\n // get the math text. bail if it's empty\n const inlineMath = state.doc.textBetween(range.from, range.to);\n if (inlineMath.match(/^\\${1,2}\\s*\\${1,2}$/)) {\n this.closePopup();\n return;\n }\n\n // get the position for the range\n const styles = popupPositionStyles(this.view, range);\n\n // if the popup already exists just move it\n if (this.popup) {\n applyStyles(this.popup, [], styles);\n } else {\n this.popup = createPopup(this.view, ['pm-math-preview'], undefined, {\n ...styles,\n visibility: 'hidden',\n });\n this.view.dom.parentNode?.appendChild(this.popup);\n }\n\n // typeset the math if we haven't already\n if (inlineMath !== this.lastRenderedMath && this.popup) {\n this.math.typeset!(this.popup, inlineMath, true).then(error => {\n if (!error) {\n this.popup!.style.visibility = 'visible';\n this.lastRenderedMath = inlineMath;\n // autoscroll for non-mouse triggers\n if (!$mousePos && range) {\n this.autoscollPopup(range);\n }\n }\n });\n }\n }\n\n private closePopup() {\n this.lastRenderedMath = null;\n if (this.popup) {\n this.popup.remove();\n this.popup = null;\n }\n }\n\n private autoscollPopup(mathRange: { from: number; to: number }) {\n const editingRoot = editingRootNode(this.view!.state.selection);\n if (editingRoot) {\n const editorEl = this.view!.nodeDOM(editingRoot.pos) as HTMLElement;\n const editorBox = editorEl.getBoundingClientRect();\n const popupBox = this.popup!.getBoundingClientRect();\n if (popupBox.top + popupBox.height + kMathPopupVerticalOffset > editorBox.bottom) {\n const mathBottom = this.view!.coordsAtPos(mathRange.to);\n const mathScrollBottom = editorEl.scrollTop + mathBottom.bottom;\n const mathPopupScrollBottom = mathScrollBottom + kMathPopupVerticalOffset + popupBox.height;\n const scrollTop = mathPopupScrollBottom + kMathPopupVerticalOffset - editorBox.top - editorBox.height;\n const scroller = zenscroll.createScroller(editorEl);\n scroller.toY(scrollTop, 100);\n }\n }\n }\n}\n\nfunction popupPositionStyles(view: EditorView, range: { from: number; to: number }) {\n // get coordinates for editor view (use to offset)\n const editorBox = (view.dom.parentNode! as HTMLElement).getBoundingClientRect();\n\n // +1 to ensure beginning of line doesn't resolve as line before\n // (will subtract it back out below)\n const rangeStartCoords = view.coordsAtPos(range.from + 1);\n const rangeEndCoords = view.coordsAtPos(range.to);\n\n // default positions\n const top = Math.round(rangeEndCoords.bottom - editorBox.top) + kMathPopupVerticalOffset + 'px';\n let left = `calc(${Math.round(rangeStartCoords.left - editorBox.left)}px - 1ch)`;\n\n // if it flow across two lines then position at far left of editing root\n // (we give it the 5 pixels of wiggle room so that detection still works\n // when a mathjax preview is shown in place of math text)\n if (Math.abs(rangeStartCoords.bottom - rangeEndCoords.bottom) > 5) {\n const editingRoot = editingRootNodeClosestToPos(view.state.doc.resolve(range.from));\n if (editingRoot) {\n const editingEl = view.nodeDOM(editingRoot.pos) as HTMLElement;\n if (editingEl) {\n const editingElStyle = window.getComputedStyle(editingEl);\n left = `calc(${editingEl.getBoundingClientRect().left}px + ${editingElStyle.paddingLeft} - 1ch - 2px)`;\n }\n }\n }\n\n // return position\n return { top, left };\n}\n","/*\n * math-viewts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Plugin, PluginKey, EditorState, Transaction, Selection } from 'prosemirror-state';\nimport { Schema } from 'prosemirror-model';\nimport { DecorationSet, EditorView, Decoration } from 'prosemirror-view';\nimport { keymap } from 'prosemirror-keymap';\nimport { AddMarkStep, RemoveMarkStep } from 'prosemirror-transform';\n\nimport { findChildrenByMark, setTextSelection } from 'prosemirror-utils';\n\nimport { getMarkRange, getMarkAttrs } from '../../api/mark';\n\nimport { EditorMath, MathType } from '../../api/math';\nimport { EditorUI } from '../../api/ui';\nimport { kSetMarkdownTransaction } from '../../api/transaction';\nimport { attrEditDecorationWidget } from '../../api/attr_edit/attr_edit-decoration';\nimport { EditorFormat } from '../../api/format';\nimport { editMathAttributes, editMathAttributesEnabled } from './math-commands';\n\n// NOTE: rendered equations don't curently show selection background color when part\n// of a larger selection (in spite of a few failed attempts to get this to work)\n// it would be nice to figure out how to do this\n\nexport function mathViewPlugins(schema: Schema, format: EditorFormat, ui: EditorUI, math: EditorMath): Plugin[] {\n return [\n mathViewPlugin(schema, format, ui, math),\n keymap({\n ArrowUp: verticalArrowHandler('up'),\n ArrowDown: verticalArrowHandler('down'),\n }),\n ];\n}\n\nfunction mathViewPlugin(schema: Schema, format: EditorFormat, ui: EditorUI, math: EditorMath) {\n const key = new PluginKey<DecorationSet>('math-view');\n\n function decorationsForDoc(state: EditorState) {\n const decorations: Decoration[] = [];\n findChildrenByMark(state.doc, schema.marks.math, true).forEach(markedNode => {\n // get mark range and attributes\n const range = getMarkRange(state.doc.resolve(markedNode.pos), schema.marks.math) as { from: number; to: number };\n const attrs = getMarkAttrs(state.doc, range, schema.marks.math);\n\n // if the selection isn't in the mark, then show the preview\n const preview = state.selection.from < range.from || state.selection.from > range.to;\n if (preview) {\n // get the math text\n const mathText = state.doc.textBetween(range.from, range.to);\n\n // hide the code\n decorations.push(Decoration.inline(range.from, range.to, { style: 'display: none;' }));\n\n // show a math preview\n decorations.push(\n Decoration.widget(\n range.from,\n (view: EditorView, getPos: () => number) => {\n const mathjaxDiv = window.document.createElement('div');\n mathjaxDiv.classList.add('pm-math-mathjax');\n // text selection 'within' code for clicks on the preview image\n mathjaxDiv.onclick = () => {\n const tr = view.state.tr;\n let pos = getPos();\n if (attrs.type === MathType.Display) {\n // set position to first non $, non whitespace character\n const match = mathText.match(/^[$\\s]+/);\n if (match) {\n pos += match[0].length;\n }\n } else {\n // set position to the middle of the equation\n pos = pos + mathText.length / 2;\n }\n setTextSelection(pos)(tr);\n view.dispatch(tr);\n view.focus();\n };\n math.typeset(mathjaxDiv, mathText, ui.context.isActiveTab());\n return mathjaxDiv;\n },\n { key: mathText },\n ),\n );\n } \n\n // for display math in quarto, show an edit widget\n if (editMathAttributesEnabled(format, state, range)) {\n decorations.push(attrEditDecorationWidget({\n pos: markedNode.pos-1,\n tags: attrs.id ? [`#${attrs.id}`] : [],\n editFn: editMathAttributes(ui),\n ui,\n offset: { top: 0, right: 6 },\n }));\n }\n });\n\n return DecorationSet.create(state.doc, decorations);\n }\n\n return new Plugin<DecorationSet>({\n key,\n\n state: {\n init(_config: { [key: string]: any }, instance: EditorState) {\n return decorationsForDoc(instance);\n },\n\n apply(tr: Transaction, set: DecorationSet, oldState: EditorState, newState: EditorState) {\n // replacing the entire editor triggers decorations\n if (tr.getMeta(kSetMarkdownTransaction)) {\n return decorationsForDoc(newState);\n\n // if one of the steps added or removed a mark of our type then rescan the doc.\n } else if (\n tr.steps.some(\n step =>\n (step instanceof AddMarkStep && (step as any).mark.type === schema.marks.math) ||\n (step instanceof RemoveMarkStep && (step as any).mark.type === schema.marks.math),\n )\n ) {\n return decorationsForDoc(newState);\n\n // if the previous or current state is in or at the border of a math mark, then rescan\n } else if (\n oldState.doc.rangeHasMark(oldState.selection.from - 2, oldState.selection.from + 1, schema.marks.math) ||\n getMarkRange(newState.selection.$from, schema.marks.math)\n ) {\n return decorationsForDoc(newState);\n\n // incremental scanning based on presence of mark in changed regions\n } else {\n // adjust decoration positions to changes made by the transaction (decorations that apply\n // to removed chunks of content will be removed by this)\n return set.map(tr.mapping, tr.doc);\n }\n },\n },\n\n appendTransaction: (_transactions: Transaction[], oldState: EditorState, newState: EditorState) => {\n // not currently in math\n if (!getMarkRange(newState.selection.$from, schema.marks.math) && newState.selection.from > 0) {\n // did we end up just to the right of math? if so check for navigation from a distance\n // (would imply an up/down arrow)\n const prevMathRange = getMarkRange(newState.doc.resolve(newState.selection.from - 1), schema.marks.math);\n if (prevMathRange) {\n // if the selection came from afar then treat it as an actual selection\n const delta = oldState.selection.from - newState.selection.from;\n if (Math.abs(delta) > 3) {\n const tr = newState.tr;\n const mathText = newState.doc.textBetween(prevMathRange.from, prevMathRange.to);\n const attrs = getMarkAttrs(newState.doc, prevMathRange, schema.marks.math);\n if (attrs.type === MathType.Inline) {\n setTextSelection(prevMathRange.from + mathText.length / 2)(tr);\n }\n return tr;\n }\n }\n }\n\n return null;\n },\n\n props: {\n decorations(state: EditorState) {\n return key.getState(state);\n },\n },\n });\n}\n\nfunction verticalArrowHandler(dir: 'up' | 'down') {\n return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n if (!view) {\n return false;\n }\n\n const schema = state.schema;\n\n // see if we need to provide up/down for inline math (it doesn't work by default, likely because\n // of the display: none decorator). This implementation just moves the selection before or\n // after the mark (better than the cursor doing nothing which is what we saw w/o this) however\n // it would be cool if we could fully emulate up/down\n const range = getMarkRange(state.selection.$head, schema.marks.math);\n if (range) {\n const attrs = getMarkAttrs(state.doc, range, schema.marks.math);\n if (attrs.type === MathType.Inline) {\n if (dispatch) {\n const side = dir === 'up' ? -1 : 1;\n const $head = state.selection.$head;\n const nextPos = Selection.near(state.doc.resolve(side > 0 ? $head.after() : $head.before()), side);\n const tr = state.tr;\n tr.setSelection(nextPos);\n dispatch(tr);\n }\n return true;\n }\n }\n\n if (view.endOfTextblock(dir)) {\n const side = dir === 'up' ? -1 : 1;\n const $head = state.selection.$head;\n const nextPos = Selection.near(state.doc.resolve(side > 0 ? $head.after() : $head.before()), side);\n if (\n nextPos.$head &&\n nextPos.$head.parent.childCount === 1 &&\n schema.marks.math.isInSet(nextPos.$head.parent.firstChild!.marks)\n ) {\n if (dispatch) {\n const mathText = nextPos.$head.parent.textContent;\n const match = mathText.match(/^[$\\s]+/);\n if (match) {\n const tr = state.tr;\n const mathPos = nextPos.$head.start($head.depth);\n setTextSelection(mathPos + match[0].length)(tr);\n dispatch(tr);\n }\n }\n return true;\n }\n }\n return false;\n };\n}\n","/*\n * attr_edit-decoration.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { NodeSelection } from 'prosemirror-state';\nimport { EditorView, Decoration } from 'prosemirror-view';\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport * as React from 'react';\n\nimport { EditorUI } from '../../api/ui';\nimport { ImageButton } from '../../api/widgets/button';\nimport { CommandFn } from '../../api/command';\nimport { WidgetProps, reactRenderForEditorView } from '../../api/widgets/react';\n\nimport { selectionIsWithinRange } from '../../api/selection';\nimport './attr_edit-decoration.css';\n\nexport const kEditAttrShortcut = 'F4';\n\nexport interface AttrEditDecorationOptions {\n pos: number;\n tags: string[];\n editFn: CommandFn;\n ui: EditorUI;\n offset?: { top: number; right: number };\n preferHidden?: boolean;\n noSelectOnClick?: boolean;\n}\n\nexport function attrEditDecorationWidget(options: AttrEditDecorationOptions) {\n return Decoration.widget(\n options.pos,\n (view: EditorView, getPos: () => number) => {\n // does the offsetParent have any right padding we need to offset for?\n // we normally use right: 5px for positioning but that is relative to\n // the edge of the offsetParent. However, some offset parents (e.g. a\n // td or a nested div) have their own internal padding to account for\n // so we look for it here\n let rightPaddingOffset = 0;\n const attrsNode = view.nodeDOM(getPos());\n if (attrsNode) {\n const attrsEl = attrsNode as HTMLElement;\n if (attrsEl.offsetParent) {\n const offsetParentStyle = window.getComputedStyle(attrsEl.offsetParent);\n rightPaddingOffset = -parseInt(offsetParentStyle.paddingRight!, 10) || 0;\n }\n }\n\n // cacculate position offsets\n const baseOffset = options.offset || { top: 0, right: 0 };\n const xOffset = baseOffset.right + rightPaddingOffset;\n const yOffset = baseOffset.top + 6;\n const cssProps: React.CSSProperties = {\n transform: `translate(${xOffset}px,-${yOffset}px)`,\n };\n\n // create attr edit react component\n const attrEdit = (\n <AttrEditDecoration\n tags={options.tags}\n editFn={options.editFn}\n getPos={getPos}\n view={view}\n ui={options.ui}\n style={cssProps}\n noSelectOnClick={options.noSelectOnClick}\n />\n );\n\n // create decorator and render attr editor into it\n const decoration = window.document.createElement('div');\n reactRenderForEditorView(attrEdit, decoration, view);\n\n return decoration;\n },\n {\n ignoreSelection: true,\n stopEvent: () => {\n return true;\n },\n preferHidden: options.preferHidden\n },\n );\n}\n\ninterface AttrEditDecorationProps extends WidgetProps {\n tags: string[];\n editFn: CommandFn;\n getPos: () => number;\n view: EditorView;\n ui: EditorUI;\n noSelectOnClick?: boolean;\n}\n\nconst AttrEditDecoration: React.FC<AttrEditDecorationProps> = props => {\n const buttonTitle = `${props.ui.context.translateText('Edit Attributes')} (${kEditAttrShortcut})`;\n\n const onClick = () => {\n // set selection before invoking function\n if (props.view.dispatch && !props.noSelectOnClick) {\n const pos = props.getPos();\n const node = props.view.state.doc.nodeAt(pos);\n if (node) {\n const tr = props.view.state.tr;\n if (node.type.spec.selectable) {\n tr.setSelection(new NodeSelection(tr.doc.resolve(pos)));\n } else {\n if (!selectionIsWithinRange(tr.selection, { from: pos, to: pos + node.nodeSize })) {\n setTextSelection(pos + 1)(tr);\n }\n }\n props.view.dispatch(tr);\n }\n }\n \n // perform edit\n props.editFn(props.view.state, props.view.dispatch, props.view);\n };\n\n return (\n <div className=\"pm-attr-edit-decoration pm-surface-widget-text-color \" style={props.style}>\n {props.tags.length\n ? props.tags.map(tag => {\n return (\n <span\n key={tag}\n className=\"attr-edit-tag attr-edit-widget pm-block-border-color pm-border-background-color\"\n onClick={onClick}\n >\n {tag}\n </span>\n );\n })\n : null}\n {props.editFn(props.view.state) ? (\n <ImageButton\n classes={['attr-edit-button']}\n image={props.ui.prefs.darkMode() ? props.ui.images.properties_deco_dark! : props.ui.images.properties_deco!}\n title={buttonTitle}\n tabIndex={-1}\n onClick={onClick}\n />\n ) : null}\n </div>\n );\n};\n","/*\n * math-keys.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n\nimport { EditorState, Transaction } from \"prosemirror-state\";\nimport { setTextSelection } from \"prosemirror-utils\";\n\nimport { MathType, mathTypeIsActive } from \"../../api/math\";\nimport { getSelectionMarkRange } from \"../../api/mark\";\n\n// enable insertion of newlines\nexport function displayMathNewline(state: EditorState, dispatch?: (tr: Transaction) => void) {\n // display math mark must be active\n if (!mathTypeIsActive(state, MathType.Display)) {\n return false;\n }\n\n // insert a newline\n if (dispatch) {\n const tr = state.tr;\n tr.insertText('\\n');\n dispatch(tr);\n }\n return true;\n}\n\nexport function inlineMathNav(begin: boolean) {\n return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n // inlne math mark must be active\n if (!mathTypeIsActive(state, MathType.Inline)) {\n return false;\n }\n const range = getSelectionMarkRange(state.selection, state.schema.marks.math);\n if (!range) {\n return false;\n }\n \n // insert a newline\n if (dispatch) {\n const tr = state.tr;\n setTextSelection(begin ? (range.from+1) : (range.to-1))(tr);\n dispatch(tr);\n }\n return true;\n };\n}\n","/*\n * cite.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Mark, Schema, Fragment, Node as ProsemirrorNode, Slice, ResolvedPos } from 'prosemirror-model';\nimport { InputRule } from 'prosemirror-inputrules';\nimport { EditorState, Transaction, Plugin, PluginKey, Selection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport uniqby from 'lodash.uniqby';\n\nimport { FocusEvent } from '../../api/event-types';\nimport { PandocTokenType, PandocToken, PandocOutput, ProsemirrorWriter, PandocServer, kPreventBracketEscape } from '../../api/pandoc';\nimport { fragmentText } from '../../api/fragment';\nimport { markIsActive, splitInvalidatedMarks, getMarkRange, detectAndApplyMarks } from '../../api/mark';\nimport { MarkTransaction, kPasteTransaction } from '../../api/transaction';\nimport { BibliographyManager, BibliographyFile, BibliographySource } from '../../api/bibliography/bibliography';\nimport { EditorUI } from '../../api/ui';\nimport { joinPaths, getExtension } from '../../api/path';\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { InsertCiteProps, kAlertTypeError, kAlertTypeWarning } from '../../api/ui-dialogs';\nimport { CSL, sanitizeForCiteproc } from '../../api/csl';\nimport { suggestCiteId, formatForPreview } from '../../api/cite';\nimport { performCompletionReplacement } from '../../api/completion';\nimport { FixupContext } from '../../api/fixup';\nimport { ensureBibliographyFileForDoc } from '../../api/bibliography/bibliography-provider_local';\n\nimport { citationCompletionHandler } from './cite-completion';\nimport { citeHighlightPlugin } from './cite-highlight';\nimport { citationDoiCompletionHandler } from './cite-completion_doi';\nimport { doiFromSlice } from './cite-doi';\nimport { citePopupPlugin } from './cite-popup';\nimport { InsertCitationCommand } from './cite-commands';\nimport { setTextSelection, findChildren } from 'prosemirror-utils';\nimport { AddMarkStep } from 'prosemirror-transform';\nimport { citeXrefPopupPlugin } from './cite-popup-xref';\n\nconst kCiteCitationsIndex = 0;\n\n\n// Follow the pandoc rules for citations\n// Each citation must have a key, composed of ‘@’ + the citation identifier from the database, \n// and may optionally have a prefix, a locator, and a suffix. The citation key must begin with a letter, \n// digit, or _, and may contain alphanumerics (UNICODE), _, and internal punctuation characters (:.#$%&-+?<>~/).\n// In addition, we don't permit the citation to include a . or ? character (which are allowed in the cite identifier)\n// This is only because when writing in text citations, it will be common to follow a citation with \n// punctuation, and we should be smart enough to filter that punctuation out of the citation itself.\nconst kCiteIdPrefixPattern = '-?@';\nconst kCiteIdCharsPattern = '[^@;\\\\[\\\\]\\\\s\\\\!\\\\,]*';\nconst kCiteIdBasePattern = `${kCiteIdPrefixPattern}${kCiteIdCharsPattern}`;\n\n// Completions examine all the text inside the citation mark, so they need to only be interested\n// in a citeId that terminates at the cursor (at the end of the text)\nconst kCompletionCiteIdRegEx = new RegExp(`(${kCiteIdPrefixPattern})(${kCiteIdCharsPattern})$`);\n\n// Note that since Cite Ids can appear inline as in-text representations or can appear inside of brackets \n// in a Note style. Consequently, this is used in various places to identify them interchangeably (e.g. we use)\n// this to identify a citeId inline in text, but also to identify a citedId in a bracketed citation.\nconst kCiteId = new RegExp(`^${kCiteIdBasePattern}`);\n\n// Plain In Text: @foo2019 (this is intentionally a duplicate of the above)\n// just to make the meaning more clear (this is used to detect an in text citation)\nconst kInTextCiteRegex = new RegExp(`${kCiteIdBasePattern}$`);\n\n// Note Style: [@foo2019]\nconst kBeginCitePattern = `(.* ${kCiteIdPrefixPattern}|${kCiteIdPrefixPattern})`;\nconst kNoteCiteRegex = new RegExp(`\\\\[${kBeginCitePattern}${kCiteIdCharsPattern}.*?\\\\]`);\n\n// In Text with Suffix: @foo2019 [p 35]\nconst kInTextCiteWithSuffixPattern = `${kCiteIdPrefixPattern}${kCiteIdCharsPattern}\\\\s+\\\\[.*?\\\\]`;\nconst kInTextCiteWithSuffixRegEx = new RegExp(`^${kInTextCiteWithSuffixPattern}$`);\n\nenum CitationMode {\n NormalCitation = 'NormalCitation',\n AuthorInText = 'AuthorInText',\n SuppressAuthor = 'SuppressAuthor',\n}\n\ninterface Citation {\n citationHash: number;\n citationId: string;\n citationMode: {\n t: CitationMode;\n };\n citationNoteNum: number;\n citationPrefix: PandocToken[];\n citationSuffix: PandocToken[];\n}\n\nconst extension = (context: ExtensionContext): Extension | null => {\n const { pandocExtensions, ui } = context;\n\n // prime bibliography on initial focus\n const bibliographyManager = new BibliographyManager(context.server.pandoc, context.server.zotero);\n const focusUnsubscribe = context.events.subscribe(FocusEvent, doc => {\n bibliographyManager.prime(ui, doc!);\n focusUnsubscribe();\n });\n\n if (!pandocExtensions.citations) {\n return null;\n }\n\n return {\n marks: [\n {\n name: 'cite',\n spec: {\n attrs: {},\n inclusive: false,\n parseDOM: [\n {\n tag: \"span[class*='cite']\",\n // use priority to ensure that cite_id is parsed before cite\n // when reading the DOM for the clipboard. we need this because\n // 'cite' is first in the mark order (so that @ witin a cite\n // properly triggers the input rule)\n priority: 5\n },\n ],\n toDOM(mark: Mark) {\n return { '0': 'span', '1': { class: 'cite' } };\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.Cite,\n handler: readPandocCite,\n },\n ],\n\n writer: {\n priority: 14,\n write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n\n // extract parentText for inspection\n const parentText = fragmentText(parent);\n\n // if it's just a cite id then write it straight up\n if (fragmentText(parent).match(kInTextCiteRegex)) {\n\n output.writeInlines(parent);\n\n } else {\n\n // divide out delimiters from body\n const openCite = parent.cut(0, 1);\n const cite = parent.cut(1, parent.size - 1);\n const closeCite = parent.cut(parent.size - 1, parent.size);\n\n // check for fully enclosed in brackets\n if (\n fragmentText(openCite) === '[' &&\n fragmentText(closeCite) === ']'\n ) {\n output.writeRawMarkdown('[');\n output.withOption(kPreventBracketEscape, true, () => {\n output.writeInlines(cite);\n });\n output.writeRawMarkdown(']');\n\n\n // if it starts with a valid cite id prefix and ends with a close\n // bracket then it might be an in-text citation with a suffix\n } else if (parentText.match(kInTextCiteWithSuffixRegEx)) {\n\n // find the position of the begin bracket that matches the end bracket\n let beginBracketPos = -1;\n let bracketLevel = 0;\n for (let i = parentText.length - 2; i >= 0; i--) {\n const char = parentText.charAt(i);\n if (char === ']') {\n bracketLevel++;\n } else if (char === '[') {\n if (bracketLevel > 0) {\n bracketLevel--;\n } else {\n beginBracketPos = i;\n break;\n }\n }\n }\n\n // if we found one then cut as approrpriate\n if (beginBracketPos) {\n output.writeInlines(parent.cut(0, beginBracketPos));\n output.writeRawMarkdown('[');\n output.writeInlines(parent.cut(beginBracketPos + 1, parentText.length - 1));\n output.writeRawMarkdown(']');\n\n } else {\n output.writeInlines(parent);\n }\n } else {\n output.writeInlines(parent);\n }\n }\n },\n },\n },\n },\n {\n name: 'cite_id',\n noSpelling: true,\n spec: {\n attrs: {},\n inclusive: true,\n parseDOM: [\n {\n tag: \"span[class*='cite-id']\",\n // use priority to ensure that cite_id is parsed before cite\n // when reading the DOM for the clipboard. we need this because\n // 'cite' is first in the mark order (so that @ witin a cite\n // properly triggers the input rule)\n priority: 10\n },\n ],\n toDOM(mark: Mark) {\n return ['span', { class: 'cite-id pm-link-text-color pm-fixedwidth-font' }];\n },\n },\n pandoc: {\n readers: [],\n writer: {\n priority: 13,\n write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n const idText = fragmentText(parent);\n // only write as a citation id (i.e. don't escape @) if it is still\n // a valid citation id. note that this in principle is also taken care\n // of by the application of splitInvalidatedMarks below (as the\n // mark would have been broken by this if it wasn't valid). this\n // code predates that, and we leave it in for good measure in case that\n // code is removed or changes in another unexpected way.\n if (idText.match(kInTextCiteRegex)) {\n const prefixMatch = idText.match(/^-?@/);\n if (prefixMatch) {\n output.writeRawMarkdown(prefixMatch.input!);\n output.writeInlines(parent.cut(prefixMatch.input!.length));\n } else {\n output.writeInlines(parent);\n }\n } else {\n output.writeInlines(parent);\n }\n },\n },\n },\n },\n ],\n\n commands: (_schema: Schema) => {\n return [new InsertCitationCommand(ui, context.events, bibliographyManager, context.server)];\n },\n\n appendTransaction: (schema: Schema) => {\n return [{\n name: 'cite-id-join',\n append: (tr: Transaction) => {\n const range = getMarkRange(tr.doc.resolve(tr.selection.head - 1), schema.marks.cite_id);\n if (range) {\n const text = tr.doc.textBetween(range.from, tr.selection.$head.after());\n const citeIdLen = citeIdLength(text);\n const markLength = range.to - range.from;\n if (citeIdLen > markLength) {\n tr.addMark(range.from, range.from + citeIdLen, schema.marks.cite_id.create());\n }\n }\n return tr;\n },\n }];\n },\n\n fixups: (schema: Schema) => {\n return [\n (tr: Transaction, fixupContext: FixupContext) => {\n if (fixupContext === FixupContext.Load) {\n // apply marks\n const markType = schema.marks.cite;\n const predicate = (node: ProsemirrorNode) => {\n return node.isTextblock && \n node.type.allowsMarkType(markType) &&\n node.textContent.indexOf('@') !== -1;\n };\n const markTr = new MarkTransaction(tr);\n findChildren(tr.doc, predicate).forEach(nodeWithPos => {\n const { pos } = nodeWithPos;\n applyCiteMarks(markTr, nodeWithPos.node, pos);\n });\n }\n return tr;\n },\n ];\n },\n\n appendMarkTransaction: (schema: Schema) => {\n\n return [\n {\n // 'break' cite marks if they are no longer valid. note that this will still preserve\n // the mark up to the length that it is valid. \n name: 'cite-marks',\n filter: (node: ProsemirrorNode, transactions: Transaction[]) => {\n\n // if the transaction added any cite id marks then we need to lay off\n // (mostly so that input rules can be reversed)\n if (transactions.some(trans => trans.steps.some(step => {\n if (step instanceof AddMarkStep) {\n return (step as any).mark.type === schema.marks.cite_id;\n }\n }))) {\n return false;\n\n /// otherwise proceed if this node is a textblock that allows cites\n } else {\n\n return node.isTextblock && node.type.allowsMarkType(schema.marks.cite);\n }\n },\n append: (tr: MarkTransaction, node: ProsemirrorNode, pos: number) => {\n splitInvalidatedMarks(tr, node, pos, citeLength, schema.marks.cite, (from: number, to: number) => {\n tr.removeMark(from, to, schema.marks.cite);\n });\n // match all valid forms of mark\n if (node.textContent.indexOf('@') !== -1) {\n applyCiteMarks(tr, node, pos);\n }\n },\n },\n {\n // 'break' cite_id marks if they are no longer valid. note that this will still preserve\n // the mark up to the length that it is valid (so e.g. if a space is inserted within a\n // cite_id this will keep the mark on the part before the space and remove it from the\n // part after the space)\n name: 'remove-cite-id-marks',\n filter: (node: ProsemirrorNode) => node.isTextblock && node.type.allowsMarkType(schema.marks.cite_id),\n append: (tr: MarkTransaction, node: ProsemirrorNode, pos: number) => {\n splitInvalidatedMarks(tr, node, pos, citeIdLength, schema.marks.cite_id);\n },\n },\n ];\n },\n\n inputRules: (schema: Schema) => {\n return [\n citeIdInputRule(schema),\n citeIdDashInputRule(schema),\n ];\n },\n\n completionHandlers: () => [\n citationDoiCompletionHandler(context.ui, bibliographyManager, context.server),\n citationCompletionHandler(context.ui, context.events, bibliographyManager, context.server, context.format),\n ],\n\n plugins: (schema: Schema) => {\n return [\n new Plugin({\n key: new PluginKey('paste_cite_doi'),\n props: {\n handlePaste: handlePaste(ui, bibliographyManager, context.server.pandoc),\n },\n }),\n citeHighlightPlugin(schema),\n citeXrefPopupPlugin(schema, ui, context.server),\n citePopupPlugin(schema, ui, bibliographyManager, context.server),\n\n ];\n },\n };\n};\n\nfunction handlePaste(ui: EditorUI, bibManager: BibliographyManager, server: PandocServer) {\n return (view: EditorView, _event: Event, slice: Slice) => {\n const schema = view.state.schema;\n if (markIsActive(view.state, schema.marks.cite_id)) {\n // This is a DOI\n const parsedDOI = doiFromSlice(view.state, slice);\n if (parsedDOI) {\n // Insert the DOI text as a placeholder\n const tr = view.state.tr;\n tr.setMeta(kPasteTransaction, true);\n tr.setMeta('uiEvent', 'paste');\n\n const doiText = schema.text(parsedDOI.token);\n tr.replaceSelectionWith(doiText, true);\n view.dispatch(tr);\n\n // First check the local bibliography- if we already have this DOI\n // we can just paste the DOI\n const source = bibManager.findDoiInLocalBibliography(parsedDOI.token);\n if (!source && bibManager.allowsWrites()) {\n insertCitation(view, parsedDOI.token, bibManager, parsedDOI.pos, ui, server);\n }\n return true;\n } else {\n // This is just content, accept any text and try pasting that\n let text = '';\n slice.content.forEach((node: ProsemirrorNode) => (text = text + node.textContent));\n if (text.length > 0) {\n const tr = view.state.tr;\n tr.setMeta(kPasteTransaction, true);\n tr.setMeta('uiEvent', 'paste');\n tr.replaceSelectionWith(schema.text(text));\n view.dispatch(tr);\n return true;\n } else {\n // There wasn't any text, just allow the paste to be handled by anyone else\n return false;\n }\n }\n } else {\n // We aren't in a citation so let someone else handle the paste\n return false;\n }\n };\n}\n\n\n// create a cite_id within a citation when the @ sign is typed\nfunction citeIdInputRule(schema: Schema) {\n return new InputRule(/@$/, (state: EditorState, match: string[], start: number, end: number) => {\n if (!markIsActive(state, schema.marks.cite_id)) {\n const { parent, parentOffset } = state.selection.$head;\n const text = match[0] + parent.textContent.slice(parentOffset);\n const textBefore = parent.textContent.slice(0, parentOffset);\n\n // reject unless the right prefix is there\n if (textBefore.length && !textBefore.match(/[\\xA0 \\t\\-\\[]$/)) {\n return null;\n }\n\n // get cite id length\n const citeIdLen = citeIdLength(text);\n\n // insert the @\n const tr = state.tr;\n tr.insertText(match[0]);\n\n // insert a pairing end bracket if we started with [\n if (citeIdLen === 1 && textBefore.match(/\\[-?$/) && text[1] !== ']') {\n tr.insertText(']');\n setTextSelection(tr.selection.head - 1)(tr);\n }\n\n if (citeIdLen) {\n // offset mark for incidence of '-' prefix\n const offset = textBefore.endsWith('-') ? 1 : 0;\n const citeStart = start - offset;\n const citeEnd = citeStart + citeIdLen + offset;\n tr.addMark(citeStart, citeEnd, schema.marks.cite_id.create());\n }\n\n return tr;\n }\n return null;\n });\n}\n\n\nfunction citeIdDashInputRule(schema: Schema) {\n return new InputRule(new RegExp(`-$`), (state: EditorState, match: string[], start: number, end: number) => {\n if (state.doc.rangeHasMark(start + 1, end + 2, schema.marks.cite_id)) {\n const tr = state.tr;\n tr.insertText(match[0]);\n tr.addMark(start, start + 1, schema.marks.cite_id.create());\n return tr;\n }\n return null;\n });\n}\n\n\n// read pandoc citation, creating requisite cite and cite_id marks as we go\nfunction readPandocCite(schema: Schema) {\n return (writer: ProsemirrorWriter, tok: PandocToken) => {\n\n // create and open the mark\n const citeMark = schema.marks.cite.create();\n writer.openMark(citeMark);\n\n // helper to write a citation\n const writeCitation = (citation: Citation) => {\n // prefix\n writer.writeTokens(citation.citationPrefix);\n if (citation.citationPrefix.length) {\n writer.writeText(' ');\n }\n\n // id\n const suppress = citation.citationMode.t === CitationMode.SuppressAuthor ? '-' : '';\n const citeIdMark = schema.marks.cite_id.create();\n writer.openMark(citeIdMark);\n writer.writeText(suppress + '@' + citation.citationId);\n writer.closeMark(citeIdMark);\n\n // suffix\n const inTextSuffix = citation.citationMode.t === CitationMode.AuthorInText && citation.citationSuffix.length;\n if (inTextSuffix) {\n writer.writeText(' [');\n }\n writer.writeTokens(citation.citationSuffix);\n if (inTextSuffix) {\n writer.writeText(']');\n }\n };\n\n // get all of the citations\n const citations: Citation[] = tok.c[kCiteCitationsIndex];\n\n // look for a single in-text citation\n if (citations.length === 1 && citations[0].citationMode.t === CitationMode.AuthorInText) {\n writeCitation(citations[0]);\n // non-in text and/or multiple citations\n } else {\n writer.writeText('[');\n citations.forEach((citation: Citation, index: number) => {\n // add delimiter\n if (index !== 0) {\n writer.writeText('; ');\n }\n writeCitation(citation);\n });\n writer.writeText(']');\n }\n\n writer.closeMark(citeMark);\n };\n}\n\nconst kCitationIdRegex = new RegExp(`(^\\\\[| )(${kCiteIdBasePattern})`, 'g');\n\nfunction encloseInCiteMark(tr: Transaction, start: number, end: number) {\n const schema = tr.doc.type.schema;\n const mark = schema.marks.cite.create();\n\n tr.addMark(start, end, mark);\n\n // look for valid citation ids inside and mark them\n const citeText = tr.doc.textBetween(start, end);\n\n kCitationIdRegex.lastIndex = 0;\n let match = kCitationIdRegex.exec(citeText);\n while (match !== null) {\n const pos = start + match.index + match[1].length;\n const idMark = schema.marks.cite_id.create();\n\n tr.addMark(pos, pos + match[2].length, idMark);\n match = kCitationIdRegex.exec(citeText);\n }\n kCitationIdRegex.lastIndex = 0;\n return tr;\n}\n\nfunction citeLength(text: string) {\n if (text.match(kNoteCiteRegex) ||\n text.match(kInTextCiteRegex) ||\n text.match(kInTextCiteWithSuffixRegEx)) {\n return text.length;\n } else {\n return 0;\n }\n}\n\n// up to how many characters of the passed text constitute a valid cite_id in the editor\n// (note that the editor tolerates citations ids with just an '@')\nfunction citeIdLength(text: string) {\n const match = text.match(kCiteId);\n if (match) {\n return match[0].length;\n } else {\n return 0;\n }\n}\n\n\nconst kFindInTextCiteRegex = new RegExp(kCiteIdBasePattern, 'g');\nconst kFindInTextCiteWithSuffixRegex = new RegExp(kInTextCiteWithSuffixPattern, 'g');\nconst kFindFullCiteRegex = new RegExp(kNoteCiteRegex.source, 'g');\n\nfunction applyCiteMarks(tr: MarkTransaction, node: ProsemirrorNode, pos: number) {\n const schema = node.type.schema;\n [kFindInTextCiteRegex, kFindFullCiteRegex, kFindInTextCiteWithSuffixRegex].forEach(re => {\n detectAndApplyMarks(\n tr,\n tr.doc.nodeAt(pos)!,\n pos,\n re,\n schema.marks.cite,\n () => ({}),\n (from: number, to: number) => {\n return tr.doc.rangeHasMark(from, to, schema.marks.cite_id);\n }\n );\n });\n}\n\n\nexport interface ParsedCitation {\n token: string;\n pos: number;\n offset: number;\n}\n\nexport function parseCitation(context: EditorState | Transaction): ParsedCitation | null {\n // return completions only if we are inside a cite_id . This way\n // if the user dismisses the cite_id (e.g. decides to type @ as literal string)\n // we won't offer completions\n const markType = context.doc.type.schema.marks.cite_id;\n const range = getMarkRange(context.doc.resolve(context.selection.head - 1), markType);\n if (range) {\n // examine text up to the cursor\n const citeText = context.doc.textBetween(range.from, context.selection.head);\n\n // make sure there is no text directly ahead (except bracket, space, semicolon)\n const nextChar = context.doc.textBetween(context.selection.head, context.selection.head + 1);\n if (!nextChar || [';', ' ', ']'].includes(nextChar)) {\n // look for a cite id that terminates at the cursor (including spaces/text after the id,\n // but before any semicolon delimiter)\n const match = citeText.match(kCompletionCiteIdRegEx);\n if (match) {\n const token = match[2];\n const pos = range.from + match.index! + match[1].length;\n return { token, pos, offset: -match[1].length };\n }\n }\n }\n return null;\n}\n\n// Replaces the current selection with a resolved citation id\nexport async function insertCitation(\n view: EditorView,\n doi: string,\n bibManager: BibliographyManager,\n pos: number,\n ui: EditorUI,\n server: PandocServer,\n csl?: CSL,\n provider?: string,\n) {\n // ensure the bib manager is loaded before proceeding\n await bibManager.load(ui, view.state.doc);\n\n // We try not call this function if the entry for this DOI is already in the bibliography,\n // but it can happen. So we need to check here if it is already in the bibliography and\n // if it is, deal with it appropriately.\n const existingEntry = bibManager.findDoiInLocalBibliography(doi);\n if (existingEntry) {\n // Now that we have loaded the bibliography, there is an entry\n // Just write it. Not an ideal experience, but something that\n // should happen only in unusual experiences\n const tr = view.state.tr;\n\n // This could be called by paste handler, so stop completions\n performCiteCompletionReplacement(tr, tr.mapping.map(pos), existingEntry.id);\n view.dispatch(tr);\n } else {\n // There isn't an entry in the existing bibliography\n // Show the user UI to and ultimately create an entry in the biblography\n // (even creating a bibliography if necessary)\n\n // Read bibliographies out of the document and pass those alone\n const existingIds = bibManager.localSources().map(source => source.id);\n\n const citeProps: InsertCiteProps = {\n doi,\n existingIds,\n bibliographyFiles: bibManager\n .writableBibliographyFiles(view.state.doc, ui)\n .map(writableFile => writableFile.displayPath),\n provider,\n csl,\n citeUI: csl\n ? {\n suggestedId: csl.id || suggestCiteId(existingIds, csl),\n previewFields: formatForPreview(csl),\n }\n : undefined,\n };\n\n const result = await ui.dialogs.insertCite(citeProps);\n if (result && result.id.length) {\n if (!result?.csl.title) {\n await ui.dialogs.alert(\n ui.context.translateText(\n \"This citation can't be added to the bibliography because it is missing required fields.\",\n ),\n ui.context.translateText('Invalid Citation'),\n kAlertTypeError,\n );\n } else {\n // Figure out whether this is a project or document level bibliography\n const writableBiblios = bibManager.writableBibliographyFiles(view.state.doc, ui);\n\n // Sort out the bibliography file into which we should write the entry\n const thisWritableBiblio = writableBiblios.find(writable => writable.displayPath === result.bibliographyFile);\n const project = thisWritableBiblio?.isProject || false;\n const writableBiblioPath = thisWritableBiblio\n ? thisWritableBiblio.fullPath\n : joinPaths(ui.context.getDefaultResourceDir(), result.bibliographyFile);\n const bibliographyFile: BibliographyFile = {\n displayPath: result.bibliographyFile,\n fullPath: writableBiblioPath,\n isProject: project,\n writable: true,\n };\n\n // Create the source that holds the id, provider, etc...\n const source: BibliographySource = {\n ...result.csl,\n id: result.id,\n providerKey: provider || '',\n };\n\n // Start the transaction\n const tr = view.state.tr;\n\n // Write the source to the bibliography if needed\n const writeCiteId = await ensureSourcesInBibliography(\n tr,\n [source],\n bibliographyFile,\n bibManager,\n view,\n ui,\n server,\n );\n\n if (writeCiteId) {\n // Write the citeId\n const schema = view.state.schema;\n const idText = schema.text(source.id, [schema.marks.cite_id.create()]);\n performCiteCompletionReplacement(tr, tr.mapping.map(pos), idText);\n }\n\n // Dispath the transaction\n view.dispatch(tr);\n }\n }\n view.focus();\n }\n}\n\n// Ensures that the sources are in the specified bibliography file\n// and ensures that the bibliography file is properly referenced (either)\n// as a project bibliography or inline in the document YAML\nexport async function ensureSourcesInBibliography(\n tr: Transaction,\n sources: BibliographySource[],\n bibliographyFile: BibliographyFile,\n bibManager: BibliographyManager,\n view: EditorView,\n ui: EditorUI,\n server: PandocServer,\n): Promise<boolean> {\n // Write entry to a bibliography file if it isn't already present\n await bibManager.load(ui, view.state.doc);\n\n // See if there is a warning for the selected provider. If there is, we may need to surface\n // that to the user. If there is no provider specified, no need to care about warnings.\n const providers = uniqby(sources, (source: BibliographySource) => source.providerKey).map(\n source => source.providerKey,\n );\n\n // Find any providers that have warnings\n const providersWithWarnings = providers.filter(prov => bibManager.warningForProvider(prov));\n\n // Is this a bibtex bibliography?\n const bibliographyFileExtension = getExtension(bibliographyFile.fullPath);\n const isBibTexBibliography = bibliographyFileExtension === 'bib' || bibliographyFileExtension === 'bibtex';\n\n // If there is a warning message and we're exporting to BibTeX, show the warning\n // message to the user and confirm that they'd like to proceed. This would ideally\n // know more about the warning type and not have this filter here (e.g. it would just\n // always show the warning)\n let proceedWithInsert = true;\n if (providersWithWarnings.length > 0 && ui.prefs.zoteroUseBetterBibtex() && isBibTexBibliography) {\n const results = await Promise.all<boolean>(\n providersWithWarnings.map(async withWarning => {\n const warning = bibManager.warningForProvider(withWarning);\n if (warning) {\n return await ui.dialogs.yesNoMessage(\n warning,\n 'Warning',\n kAlertTypeWarning,\n ui.context.translateText('Insert Citation Anyway'),\n ui.context.translateText('Cancel'),\n );\n } else {\n return true;\n }\n }),\n );\n proceedWithInsert = results.every(result => result);\n }\n\n if (proceedWithInsert) {\n await Promise.all(\n sources.map(async (source, i) => {\n if (source.id) {\n // Crossref sometimes provides invalid json for some entries. Sanitize it for citeproc\n const cslToWrite = sanitizeForCiteproc(source);\n\n if (!bibManager.findIdInLocalBibliography(source.id)) {\n const sourceAsBibTex = isBibTexBibliography\n ? await bibManager.generateBibTeX(ui, source.id, cslToWrite, source.providerKey)\n : undefined;\n await server.addToBibliography(\n bibliographyFile.fullPath,\n bibliographyFile.isProject,\n source.id,\n JSON.stringify([cslToWrite]),\n sourceAsBibTex || '',\n );\n }\n\n if (!bibliographyFile.isProject) {\n ensureBibliographyFileForDoc(tr, bibliographyFile.displayPath, ui);\n }\n }\n }),\n );\n }\n return proceedWithInsert;\n}\nexport function performCiteCompletionReplacement(tr: Transaction, pos: number, replacement: ProsemirrorNode | string) {\n // perform replacement\n performCompletionReplacement(tr, pos, replacement);\n\n // find the range of the cite and fixup marks\n const range = getMarkRange(tr.selection.$head, tr.doc.type.schema.marks.cite);\n if (range) {\n encloseInCiteMark(tr, range.from, range.to);\n }\n}\n\nexport default extension;\n","/*\n * bibliography.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport Fuse from 'fuse.js';\nimport { PandocServer } from '../pandoc';\n\nimport { EditorUI } from '../ui';\nimport { ParsedYaml, parseYamlNodes } from '../yaml';\nimport { CSL } from '../csl';\nimport { ZoteroServer } from '../zotero';\nimport { BibliographyDataProviderLocal, kLocalBibliographyProviderKey } from './bibliography-provider_local';\nimport { BibliographyDataProviderZotero } from './bibliography-provider_zotero';\nimport { toBibTeX } from './bibDB';\nimport { joinPaths, isAbsolute } from '../path';\n\nexport interface BibliographyFile {\n displayPath: string;\n fullPath: string;\n isProject: boolean;\n writable: boolean;\n}\n\nexport function bibliographyFileForPath(path: string, ui: EditorUI): BibliographyFile {\n return {\n displayPath: path,\n fullPath: isAbsolute(path, ui.context.isWindowsDesktop()) ? path : joinPaths(ui.context.getDefaultResourceDir(), path),\n isProject: false,\n writable: true,\n };\n}\n\nexport interface BibliographyType {\n extension: string;\n displayName: string;\n default: boolean;\n}\n\n// The types of bibliography files and the default value\nexport function bibliographyTypes(ui: EditorUI): BibliographyType[] {\n const defaultBiblioType = ui.prefs.bibliographyDefaultType();\n return [\n {\n displayName: ui.context.translateText('BibTeX'),\n extension: 'bib',\n default: defaultBiblioType === 'bib',\n },\n {\n displayName: ui.context.translateText('CSL-YAML'),\n extension: 'yaml',\n default: defaultBiblioType === 'yaml',\n },\n {\n displayName: ui.context.translateText('CSL-JSON'),\n extension: 'json',\n default: defaultBiblioType === 'json',\n },\n ];\n}\n\nexport interface BibliographyDataProvider {\n key: string;\n name: string;\n requiresWritable: boolean;\n\n isEnabled(): boolean;\n load(\n ui: EditorUI,\n docPath: string | null,\n resourcePath: string,\n yamlBlocks: ParsedYaml[],\n refreshCollectionData?: boolean,\n ): Promise<boolean>;\n collections(): BibliographyCollection[];\n items(): BibliographySourceWithCollections[];\n itemsForCollection(collectionKey: string): BibliographySourceWithCollections[];\n bibliographyPaths(doc: ProsemirrorNode, ui: EditorUI): BibliographyFile[];\n generateBibTeX(ui: EditorUI, id: string, csl: CSL): Promise<string | undefined>;\n warningMessage(): string | undefined;\n}\n\nexport interface BibliographyCollection {\n name: string;\n key: string;\n provider: string;\n parentKey?: string;\n}\n\nexport interface Bibliography {\n sources: CSL[];\n project_biblios: string[];\n}\n\n// The individual bibliographic source\nexport interface BibliographySource extends CSL {\n id: string;\n providerKey: string;\n}\n\nexport interface BibliographySourceWithCollections extends BibliographySource {\n collectionKeys: string[];\n}\n\n// The fields and weights that will indexed and searched\n// when searching bibliographic sources\nconst kFields: Fuse.FuseOptionKeyObject[] = [\n { name: 'id', weight: 30 },\n { name: 'author.family', weight: 15 },\n { name: 'author.literal', weight: 15 },\n { name: 'issued.raw', weight: 15 },\n { name: 'title', weight: 15 },\n { name: 'author.given', weight: 10 },\n { name: 'providerKey', weight: 0.01 },\n { name: 'collectionKeys', weight: 0.01 },\n];\n\nconst kSearchOptions = {\n isCaseSensitive: false,\n shouldSort: true,\n includeMatches: false,\n includeScore: false,\n keys: kFields,\n};\n\nexport class BibliographyManager {\n private providers: BibliographyDataProvider[];\n private sources?: BibliographySourceWithCollections[];\n private writable?: boolean;\n private searchIndex?: Fuse<BibliographySourceWithCollections>;\n\n public constructor(server: PandocServer, zoteroServer: ZoteroServer) {\n this.providers = [new BibliographyDataProviderLocal(server), new BibliographyDataProviderZotero(zoteroServer)];\n }\n\n public async prime(ui: EditorUI, doc: ProsemirrorNode) {\n // Load the bibliography\n await this.load(ui, doc, true);\n }\n\n public async load(ui: EditorUI, doc: ProsemirrorNode, refreshCollectionData?: boolean): Promise<void> {\n // read the Yaml blocks from the document\n const parsedYamlNodes = parseYamlNodes(doc);\n\n // Currently edited doc\n const docPath = ui.context.getDocumentPath();\n\n // Load each provider\n const providersNeedUpdate = await Promise.all(\n this.providers.map(provider =>\n provider.load(ui, docPath, ui.context.getDefaultResourceDir(), parsedYamlNodes, refreshCollectionData),\n ),\n );\n\n // Once loaded, see if any of the providers required an index update\n const needsIndexUpdate = providersNeedUpdate.reduce((prev, curr) => prev || curr);\n\n // Update the index if anything requires that we do so\n if (needsIndexUpdate) {\n // Get the entries\n const providersEntries = this.providers.map(provider => provider.items());\n\n // These are in arbitrary order, so sort them alphabetically\n const idSort = (a: BibliographySource, b: BibliographySource) => {\n return a.id.localeCompare(b.id);\n };\n this.sources = ([] as BibliographySourceWithCollections[]).concat(...providersEntries).sort(idSort);\n\n this.searchIndex = this.getFuse(this.sources);\n }\n\n // Is this a writable bibliography\n this.writable = this.isWritable(doc, ui);\n }\n\n public hasSources() {\n return this.allSources().length > 0;\n }\n\n public allSources(): BibliographySourceWithCollections[] {\n if (this.sources && this.allowsWrites()) {\n return this.sources;\n } else {\n return this.sources?.filter(source => source.providerKey === kLocalBibliographyProviderKey) || [];\n }\n return [];\n }\n\n public sourcesForProvider(providerKey: string): BibliographySourceWithCollections[] {\n return this.allSources().filter(item => item.providerKey === providerKey);\n }\n\n public sourcesForProviderCollection(provider: string, collectionKey: string): BibliographySourceWithCollections[] {\n return this.sourcesForProvider(provider).filter(item => item.collectionKeys.includes(collectionKey));\n }\n\n public localSources(): BibliographySourceWithCollections[] {\n return this.allSources().filter(source => source.providerKey === kLocalBibliographyProviderKey);\n }\n\n public allowsWrites(): boolean {\n return this.writable || false;\n }\n\n private isWritable(doc: ProsemirrorNode, ui: EditorUI): boolean {\n const bibliographyFiles = this.bibliographyFiles(doc, ui);\n if (bibliographyFiles.length === 0) {\n // Since there are no bibliographies, we can permit writing a fresh one\n return true;\n }\n return bibliographyFiles.filter(bibFile => bibFile.writable).length > 0;\n }\n\n public writableBibliographyFiles(doc: ProsemirrorNode, ui: EditorUI) {\n return this.bibliographyFiles(doc, ui).filter(bibFile => bibFile.writable);\n }\n\n public bibliographyFiles(doc: ProsemirrorNode, ui: EditorUI): BibliographyFile[] {\n const bibliographyPaths = this.providers.map(provider => provider.bibliographyPaths(doc, ui));\n return ([] as BibliographyFile[]).concat(...bibliographyPaths);\n }\n\n public localProviders(): BibliographyDataProvider[] {\n if (this.allowsWrites()) {\n return this.providers;\n } else {\n return this.providers.filter(provider => provider.requiresWritable === false);\n }\n }\n\n public providerName(providerKey: string): string | undefined {\n const dataProvider = this.providers.find(prov => prov.key === providerKey);\n return dataProvider?.name;\n }\n\n // Allows providers to generate bibTeX, if needed. This is useful in contexts\n // like Zotero where a user may be using the Better Bibtex plugin which can generate\n // superior BibTeX using things like stable citekeys with custom rules, and more.\n //\n // If the provider doesn't provide BibTeX, we can generate it ourselves\n public async generateBibTeX(ui: EditorUI, id: string, csl: CSL, provider?: string): Promise<string | undefined> {\n const dataProvider = this.providers.find(prov => prov.key === provider);\n if (dataProvider) {\n const dataProviderBibTeX = dataProvider.generateBibTeX(ui, id, csl);\n if (dataProviderBibTeX) {\n return dataProviderBibTeX;\n }\n }\n return Promise.resolve(toBibTeX(id, csl));\n }\n\n public warning(): string | undefined {\n const warningProvider = this.providers.find(provider => provider.warningMessage());\n if (warningProvider) {\n return warningProvider.warningMessage();\n }\n }\n\n public warningForProvider(providerKey?: string): string | undefined {\n if (providerKey) {\n const warningProvider = this.providers.find(prov => prov.key === providerKey);\n if (warningProvider) {\n return warningProvider.warningMessage();\n }\n }\n }\n\n public findDoiInLocalBibliography(doi: string): BibliographySourceWithCollections | undefined {\n // NOTE: This will only search sources that have already been loaded.\n // Please be sure to use load() before calling this or\n // accept the risk that this will not properly search for a DOI if the\n // bibliography hasn't already been loaded.\n return this.localSources().find(source => source.DOI === doi);\n }\n\n public findIdInLocalBibliography(id: string): BibliographySourceWithCollections | undefined {\n // NOTE: This will only search sources that have already been loaded.\n // Please be sure to use load() before calling this or\n // accept the risk that this will not properly search for a DOI if the\n // bibliography hasn't already been loaded.\n\n return this.localSources().find(source => source.id === id);\n }\n\n // A general purpose search interface for filtered searching\n public search(query?: string, providerKey?: string, collectionKey?: string): BibliographySourceWithCollections[] {\n const limit = 100;\n if (query && query.length > 0) {\n // These are ordered by search score, so leave as is\n if (providerKey && collectionKey) {\n return this.searchProviderCollection(query, limit, providerKey, collectionKey);\n } else if (providerKey) {\n return this.searchProvider(query, limit, providerKey);\n } else {\n return this.searchAllSources(query, limit);\n }\n } else {\n if (providerKey && collectionKey) {\n return this.sourcesForProviderCollection(providerKey, collectionKey);\n } else if (providerKey) {\n return this.sourcesForProvider(providerKey);\n } else {\n return this.allSources();\n }\n }\n }\n\n public searchAllSources(query: string, limit: number): BibliographySourceWithCollections[] {\n return this.searchSources(query, limit, this.allSources());\n }\n\n public searchSources(\n query: string,\n limit: number,\n sources: BibliographySourceWithCollections[],\n ): BibliographySourceWithCollections[] {\n // NOTE: This will only search sources that have already been loaded.\n // Please be sure to use load() before calling this or\n // accept the risk that this will not properly search for a source if the\n // bibliography hasn't already been loaded.\n if (sources && this.searchIndex) {\n // NOTE: Search performance can really drop off for long strings\n // Test cases start at 20ms to search for a single character\n // grow to 270ms to search for 20 character string\n // grow to 1060ms to search for 40 character string\n const searchResults = this.searchIndex.search(query, { ...kSearchOptions, limit });\n const items = searchResults.map((result: { item: any }) => result.item);\n\n // Filter out any non local items if this isn't a writable bibliography\n const filteredItems = this.allowsWrites()\n ? items\n : items.filter(item => item.provider === kLocalBibliographyProviderKey);\n return filteredItems;\n } else {\n return [];\n }\n }\n\n // Search only a specific provider\n public searchProvider(query: string, limit: number, providerKey: string): BibliographySourceWithCollections[] {\n const orFields = kFields.flatMap(field => {\n if (Array.isArray(field)) {\n return field.map(name => ({ [name]: query }));\n } else {\n return {\n [field.name as string]: query,\n };\n }\n \n });\n const q = {\n $and: [\n { providerKey },\n {\n $or: orFields,\n },\n ],\n };\n\n if (this.searchIndex) {\n const searchResults = this.searchIndex.search(q, { limit });\n return searchResults.map((result: { item: any }) => result.item);\n } else {\n return [];\n }\n }\n\n // Search a specific provider and collection\n public searchProviderCollection(\n query: string,\n limit: number,\n providerKey: string,\n collectionKey: string,\n ): BibliographySourceWithCollections[] {\n const orFields = kFields.flatMap(field => {\n if (Array.isArray(field.name)) {\n return field.name.map(name => ( { [name]: query }));\n } else {\n return {\n [field.name as string]: query,\n };\n }\n \n });\n const q = {\n $and: [\n {\n providerKey,\n },\n {\n collectionKeys: collectionKey,\n },\n {\n $or: orFields,\n },\n ],\n };\n\n if (this.searchIndex) {\n const searchResults = this.searchIndex.search(q, { limit });\n return searchResults.map((result: { item: any }) => result.item);\n } else {\n return [];\n }\n }\n\n private getFuse(bibSources: BibliographySourceWithCollections[]) {\n // build search index\n const options = {\n ...kSearchOptions,\n keys: kFields.map(field => field.name),\n };\n const index = Fuse.createIndex<BibliographySourceWithCollections>(options.keys, bibSources);\n return new Fuse(bibSources, options, index);\n }\n}\n","/*\n * bibliography-provider_local.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\nimport { Transaction } from 'prosemirror-state';\n\nimport { PandocServer } from '../pandoc';\n\nimport { getExtension, joinPaths, isAbsolute } from '../path';\nimport { EditorUI } from '../ui';\n\nimport {\n BibliographyDataProvider,\n Bibliography,\n BibliographyFile,\n BibliographyCollection,\n BibliographySourceWithCollections,\n} from './bibliography';\nimport { ParsedYaml, parseYamlNodes, valueFromYamlText } from '../yaml';\nimport { toBibTeX } from './bibDB';\nimport { CSL } from '../csl';\n\nexport interface BibliographyResult {\n etag: string;\n bibliography: Bibliography;\n}\nexport const kLocalBibliographyProviderKey = 'E06068FE-45DA-4D88-ABDA-0DF290624950';\n\nexport class BibliographyDataProviderLocal implements BibliographyDataProvider {\n private etag: string;\n private bibliography?: Bibliography;\n private readonly server: PandocServer;\n\n public constructor(server: PandocServer) {\n this.server = server;\n this.etag = '';\n }\n public name: string = 'Bibliography';\n public key: string = kLocalBibliographyProviderKey;\n public requiresWritable: boolean = false;\n\n // Always enabled;\n public isEnabled(): boolean {\n return true;\n }\n\n public prime(): Promise<any> {\n return Promise.resolve();\n }\n\n public async load(ui: EditorUI, docPath: string | null, resourcePath: string, yamlBlocks: ParsedYaml[]): Promise<boolean> {\n // Gather the biblography files from the document\n const bibliographiesRelative = bibliographyFilesFromDoc(yamlBlocks);\n const bibliographiesAbsolute = bibliographiesRelative?.map(path => {\n if (isAbsolute(path, ui.context.isWindowsDesktop())) {\n return path;\n } else {\n return joinPaths(resourcePath, path);\n }\n }) || [];\n\n // Gather the reference block\n const refBlock = referenceBlockFromYaml(yamlBlocks);\n\n let updateIndex = false;\n if (docPath || bibliographiesAbsolute.length > 0 || refBlock) {\n // get the bibliography\n try {\n const result = await this.server.getBibliography(docPath, bibliographiesAbsolute, refBlock, this.etag);\n\n // Read bibliography data from files (via server)\n if (!this.bibliography || result.etag !== this.etag) {\n this.bibliography = result.bibliography;\n updateIndex = true;\n }\n\n // record the etag for future queries\n this.etag = result.etag;\n } catch (e) {\n // ignore error\n }\n }\n return updateIndex;\n }\n\n public collections(): BibliographyCollection[] {\n return [];\n\n // NOTE: If we can make the 'itemsForCollections' call work, we can begin emitting the various\n // bibliography files here. Right now, the server generates the CSL for all the bibligraphy runs\n // in a single call, meaning that the items lose context of which bibliography file that they\n // come from.\n /*\n if (!this.bibliography || !this.bibliography.sources) {\n return [];\n }\n\n if (this.projectBiblios().length > 0) {\n return this.projectBiblios().map(biblio => ({ name: biblio, key: biblio }));\n }\n\n const bibliographies = bibliographyFilesFromDocument(doc, ui);\n return bibliographies ? bibliographies.map(biblio => ({ name: biblio, key: biblio })) : [];\n */\n }\n\n public items(): BibliographySourceWithCollections[] {\n if (!this.bibliography || !this.bibliography.sources) {\n return [];\n }\n\n return this.bibliography.sources.map(source => ({\n ...source,\n id: source.id!, // Local CSL always has an id\n providerKey: this.key,\n collectionKeys: [],\n }));\n }\n\n public itemsForCollection(collectionKey: string): BibliographySourceWithCollections[] {\n // NOTE: IF we add support, need to filter by biblio file\n return [];\n }\n\n public projectBiblios(): string[] {\n return this.bibliography?.project_biblios || [];\n }\n\n public generateBibTeX(_ui: EditorUI, id: string, csl: CSL): Promise<string | undefined> {\n return Promise.resolve(toBibTeX(id, csl));\n }\n\n public warningMessage(): string | undefined {\n return undefined;\n }\n\n public bibliographyPaths(doc: ProsemirrorNode, ui: EditorUI): BibliographyFile[] {\n const kPermissableFileExtensions = ['bibtex', 'bib', 'yaml', 'yml', 'json'];\n if (this.bibliography?.project_biblios && this.bibliography.project_biblios.length > 0) {\n return this.bibliography?.project_biblios.map(projectBiblio => {\n return {\n displayPath: projectBiblio,\n fullPath: projectBiblio,\n isProject: true,\n writable: kPermissableFileExtensions.includes(getExtension(projectBiblio)),\n };\n });\n }\n return (\n bibliographyFilesFromDocument(doc, ui)?.map(path => {\n return {\n displayPath: path,\n fullPath: isAbsolute(path, ui.context.isWindowsDesktop()) ? path : joinPaths(ui.context.getDefaultResourceDir(), path),\n isProject: false,\n writable: kPermissableFileExtensions.includes(getExtension(path)),\n };\n }) || []\n );\n }\n}\n\nfunction bibliographyFilesFromDocument(doc: ProsemirrorNode, ui: EditorUI): string[] | undefined {\n // Gather the files from the document\n return bibliographyFilesFromDoc(parseYamlNodes(doc));\n}\n\nfunction bibliographyFilesFromDoc(parsedYamls: ParsedYaml[]): string[] | undefined {\n // Read the values of any yaml blocks that include bibliography headers\n // filter out blocks that don't include such headers\n const bibliographyValues = parsedYamls\n .map(parsedYaml => {\n return valueFromYamlText('bibliography', parsedYaml.yamlCode);\n })\n .filter(val => val !== null);\n\n if (bibliographyValues.length > 0) {\n // Pandoc will use the last biblography node when generating a bibliography.\n // So replicate this and use the last biblography node that we find\n const bibliographyFiles = bibliographyValues[bibliographyValues.length - 1];\n if (\n Array.isArray(bibliographyFiles) &&\n bibliographyFiles.every(bibliographyFile => typeof bibliographyFile === 'string')\n ) {\n return bibliographyFiles as string[];\n } else if (typeof bibliographyFiles === \"string\") {\n // A single bibliography\n return [bibliographyFiles as string];\n }\n }\n return undefined;\n}\n\nfunction referenceBlockFromYaml(parsedYamls: ParsedYaml[]): string {\n const refBlockParsedYamls = parsedYamls.filter(\n parsedYaml => parsedYaml.yaml !== null && typeof parsedYaml.yaml === 'object' && parsedYaml.yaml.references,\n );\n\n // Pandoc will use the last references node when generating a bibliography.\n // So replicate this and use the last biblography node that we find\n if (refBlockParsedYamls.length > 0) {\n const lastReferenceParsedYaml = refBlockParsedYamls[refBlockParsedYamls.length - 1];\n if (lastReferenceParsedYaml) {\n return `---\\n${lastReferenceParsedYaml.yamlCode}\\n---\\n`;\n }\n }\n\n return '';\n}\n\nconst kSpaceOrColonRegex = /[\\s:]/;\nfunction bibliographyLine(bibliographyFile: string): string {\n const sketchyCharMatch = bibliographyFile.match(kSpaceOrColonRegex);\n if (sketchyCharMatch) {\n return `bibliography: \"${bibliographyFile}\"`;\n } else {\n return `bibliography: ${bibliographyFile}`;\n }\n}\n\nexport function ensureBibliographyFileForDoc(tr: Transaction, bibliographyFile: string, ui: EditorUI) {\n // read the Yaml blocks from the document\n const parsedYamlNodes = parseYamlNodes(tr.doc);\n\n // Gather the biblography files from the document\n const bibliographiesRelative = bibliographyFilesFromDoc(parsedYamlNodes);\n if (bibliographiesRelative && bibliographiesRelative.length > 0) {\n // The user selected bibliography is already in the document OR\n // There is a bibliography entry, but it doesn't include the user\n // selected bibliography. In either case, we're not going to write\n // a bibliography entry to any YAML node.\n return bibliographiesRelative.includes(bibliographyFile);\n } else {\n // There aren't any bibliographies declared for this document yet either because\n // there are no yaml metadata blocks or the yaml metadata blocks that exist omit\n // the bibliography property\n if (parsedYamlNodes.length === 0) {\n // There aren't any yaml nodes in this document, need to create one\n const biblioNode = createBiblographyYamlNode(tr.doc.type.schema, bibliographyFile);\n tr.insert(1, biblioNode);\n } else {\n // We found at least one node in the document, add to the first node that we found\n const firstBlock = parsedYamlNodes[0];\n const updatedNode = addBibliographyToYamlNode(tr.doc.type.schema, bibliographyFile, firstBlock);\n tr.replaceRangeWith(firstBlock.node.pos, firstBlock.node.pos + firstBlock.node.node.nodeSize, updatedNode);\n }\n return true;\n }\n}\n\nfunction addBibliographyToYamlNode(schema: Schema, bibliographyFile: string, parsedYaml: ParsedYaml) {\n // Add this to the first node\n const yamlCode = parsedYaml.yamlCode;\n const yamlWithBib = `---\\n${yamlCode}\\n${bibliographyLine(bibliographyFile)}\\n---`;\n const yamlText = schema.text(yamlWithBib);\n return schema.nodes.yaml_metadata.create({}, yamlText);\n}\n\nfunction createBiblographyYamlNode(schema: Schema, bibliographyFile: string) {\n const yamlText = schema.text(`---\\n${bibliographyLine(bibliographyFile)}\\n---`);\n return schema.nodes.yaml_metadata.create({}, yamlText);\n}\n","/*\n * path.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport function expandPaths(rootPath: string, paths: string[]): string[] {\n return paths.map(path => joinPaths(rootPath, path));\n}\n\nexport function joinPaths(root: string, path: string) {\n const mergedPath = `${root}/${path}`;\n\n // Clean out duplicate paths\n return mergedPath.replace(/\\/\\//g, '/');\n}\n\n// Ported from\n// https://github.com/denoland/deno_std/tree/main/path\nexport function isAbsolute(path: string, isWindows: boolean) {\n\n if (isWindows) {\n // Win32 implementation\n const len = path.length;\n if (len === 0) {\n return false;\n }\n\n const code = path.charCodeAt(0);\n if (isWinPathSeparator(code)) {\n return true;\n } else if (isWindowsDeviceRoot(code)) {\n // Possible device root\n\n if (len > 2 && path.charCodeAt(1) === CHAR_COLON) {\n if (isWinPathSeparator(path.charCodeAt(2))) {\n return true;\n }\n }\n }\n return false;\n\n } else {\n // posix implementation\n return path.length > 0 && path.charCodeAt(0) === CHAR_FORWARD_SLASH;\n }\n}\n\nexport function getExtension(path: string) {\n // Get the file out of the path\n const fileName = path.split(/[\\\\/]/).pop();\n if (fileName) {\n const lastDot = fileName.lastIndexOf('.');\n if (lastDot > 0) {\n return fileName.slice(lastDot + 1);\n }\n }\n return '';\n}\n\nexport function changeExtension(path: string, extension: string) {\n const lastDot = path.lastIndexOf('.');\n const pathNoExtension = path.substr(0, lastDot + 1);\n return pathNoExtension + extension;\n}\n\nconst CHAR_UPPERCASE_A = 65; /* A */\nconst CHAR_LOWERCASE_A = 97; /* a */\nconst CHAR_UPPERCASE_Z = 90; /* Z */\nconst CHAR_LOWERCASE_Z = 122; /* z */\nconst CHAR_FORWARD_SLASH = 47; /* / */\nconst CHAR_BACKWARD_SLASH = 92; /* \\ */\nconst CHAR_COLON = 58; /* : */\n\nfunction isWinPathSeparator(code: number) {\n return code === CHAR_FORWARD_SLASH || code === CHAR_BACKWARD_SLASH;\n}\n\nfunction isWindowsDeviceRoot(code: number): boolean {\n return (\n (code >= CHAR_LOWERCASE_A && code <= CHAR_LOWERCASE_Z) ||\n (code >= CHAR_UPPERCASE_A && code <= CHAR_UPPERCASE_Z)\n );\n}","/*\n * BibDB.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport {\n BibFieldTypes,\n NameDictObject,\n NodeArray,\n RangeArray,\n BibField,\n BibLatexExporter,\n BibTypes,\n BibType,\n} from 'biblatex-csl-converter';\n\nimport { Mark, Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { CSL, CSLDate, cslDateToEDTFDate, CSLName } from '../csl';\nimport { cslTextToProsemirrorNode } from '../csl-text';\nimport { bibDbToBibTeX } from '../bibtex/bibtex';\n\nexport type BibDB = Record<string, EntryObject>;\n\nexport interface EntryObject {\n csl_type?: string;\n bib_type: string;\n entry_key: string;\n fields: Record<string, any>;\n incomplete?: boolean;\n unexpected_fields?: Record<string, any>;\n unknown_fields?: Record<string, any>;\n}\n\n// This is our wrapper of a typescript BibLaTeX exporter\n// https://github.com/fiduswriter/biblatex-csl-converter\n\n// Traditional Form Looks Like:\n// author = {{Abbas}, {Osma Ahmed} and {Ibrahim}, {Issa Ghada} and {Ismail}, {Abdel-Gawad Eman}}\n//\n// Non traditional form looks like:\n// author = {given={Osma Ahmed}, family={Abbas} and given={Issa Ghada}, family={Ibrahim} and given={Abdel-Gawad Eman}, family={Ismail}}\nconst kUseTraditionalNameForm = false;\n\n// Generates bibLaTeX for a given CSL object / id\nexport function toBibLaTeX(id: string, csl: CSL): string | undefined {\n // A BibDB is basically a map of key / EntryObject[] that is\n // used by the exporter to generate BibLaTeX\n const bibDB = cslToBibDB(id, csl);\n if (bibDB) {\n // Use the exported to parse the bibDB and generate bibLaTeX\n const exporter: BibLatexExporter = new BibLatexExporter(bibDB, false, {\n traditionalNames: kUseTraditionalNameForm,\n });\n const sourceAsBibLaTeX = exporter.parse();\n\n // Indent any , new lines\n return sourceAsBibLaTeX.replace(/,\\n/g, ',\\n\\t');\n }\n return undefined;\n}\n\nexport function toBibTeX(id: string, csl: CSL): string | undefined {\n // A BibDB is basically a map of key / EntryObject[] that is\n // used by the exporter to generate BibLaTeX\n const bibDB = cslToBibDB(id, csl);\n if (bibDB) {\n // Use the exported to parse the bibDB and generate bibLaTeX\n const sourceAsBibTeX = bibDbToBibTeX(bibDB);\n\n // Indent any , new lines\n return sourceAsBibTeX;\n }\n return undefined;\n}\n\n// Converts a single CSL item to a bibDB containing\n// a single EntryObject representing that CSL item\nfunction cslToBibDB(id: string, csl: CSL): BibDB | undefined {\n const bibType = bibTypeForCSL(csl.type);\n const bibObject: EntryObject = {\n bib_type: bibType[0],\n csl_type: bibType[1].csl,\n entry_key: id,\n fields: {},\n };\n\n const enumerableCSL = csl as any;\n sortedKeys(csl).forEach(key => {\n const value: any = enumerableCSL[key];\n\n const bibFieldDatas = bibFieldForValue(key, csl.type);\n\n bibFieldDatas?.forEach(bibFieldData => {\n if (bibFieldData) {\n const bibFieldKey = bibFieldData[0];\n const bibField = bibFieldData[1];\n const type = bibField.type;\n let nodeValue: any;\n switch (type) {\n case 'f_date':\n // f_date = // EDTF 1.0 level 0/1 compliant string. (2000-12-31)\n const cslDate = value as CSLDate;\n if (cslDate) {\n const edtfDate = cslDateToEDTFDate(cslDate);\n if (edtfDate) {\n nodeValue = edtfDate;\n }\n }\n break;\n case 'f_integer':\n case 'f_literal':\n case 'f_long_literal':\n case 'f_title':\n // f_integer, f_literal, f_long_literal, f_title = [nodeValue]\n // l_literal = [nodeValue]\n if (value && value.length > 0) {\n nodeValue = textNodes(value);\n }\n break;\n case 'l_literal':\n // l_literal = [NodeArray]\n if (value && value.length > 0) {\n nodeValue = [textNodes(value)];\n }\n break;\n case 'f_key':\n // f_key: string | NodeArray (string points to another key\n // name in BibObject whose value is used for this key)\n if (bibField.options) {\n const options = bibField.options as any;\n Object.keys(options).find(optionKey => {\n const optionValue: any = options[optionKey];\n if (optionValue.csl === value) {\n nodeValue = optionKey;\n return true;\n }\n });\n\n if (!nodeValue) {\n nodeValue = textNodes(value);\n }\n }\n\n break;\n case 'l_key':\n // l_key, list of [string | NodeArray]\n if (bibField.options) {\n const options = bibField.options as any;\n Object.keys(options).find(optionKey => {\n const optionValue: any = options[optionKey];\n if (optionValue.csl === value) {\n nodeValue = [optionKey];\n return true;\n }\n });\n\n if (!nodeValue && value && value.length > 0) {\n nodeValue = textNodes(value);\n }\n }\n break;\n case 'l_range':\n // l_range Array<RangeArray>\n const valueStr = value as string;\n const parts = valueStr.split('-');\n const range = rangeArray(parts);\n if (range) {\n nodeValue = [range];\n }\n break;\n case 'f_uri':\n case 'f_verbatim':\n // f_uri, f_verbatim: string\n nodeValue = value;\n break;\n case 'l_name':\n // l_name Array<NameDictObject>\n const names = value as CSLName[];\n nodeValue = names.map(name => {\n const nameDict: NameDictObject = {\n family: name.family ? textNodes(name.family) : undefined,\n given: name.given ? textNodes(name.given) : undefined,\n literal: name.literal ? textNodes(name.literal) : undefined,\n };\n return nameDict;\n });\n\n break;\n case 'l_tag':\n // l_tag: string[]\n nodeValue = [value];\n break;\n }\n\n if (nodeValue) {\n if (shouldIncludeField(bibFieldKey, bibType[1])) {\n bibObject.fields[bibFieldKey] = nodeValue;\n }\n }\n }\n });\n });\n\n const bibDB: BibDB = {\n item: bibObject,\n };\n return bibDB;\n}\n\n// For a given type, we filter out any fields that aren't required,\n// eitheror, or optional.\nfunction shouldIncludeField(bibDBFieldName: string, bibType: BibType) {\n // Special case:\n // For datasets, allow author \n // Fixes https://github.com/rstudio/rstudio/issues/9059\n if (bibType.csl === 'dataset' && bibDBFieldName === 'author') {\n return true;\n }\n\n return (\n bibType.required.includes(bibDBFieldName) ||\n bibType.optional.includes(bibDBFieldName) ||\n bibType.eitheror.includes(bibDBFieldName)\n );\n}\n\n// Returns text nodes for a given CSL string. This implements\n// support for the basic CSL marks that are outlined here:\n// https://citeproc-js.readthedocs.io/en/latest/csl-json/markup.html#html-like-formatting-tags\nfunction textNodes(str: string): NodeArray {\n const pmNode = cslTextToProsemirrorNode(str);\n if (pmNode) {\n const nodes: NodeArray = [];\n pmNode.forEach((node: ProsemirrorNode) => {\n nodes.push({\n type: 'text',\n text: node.textContent,\n marks: node.marks.map((mark: Mark) => ({ type: mark.type.name })),\n });\n });\n return nodes;\n } else {\n return [\n {\n type: 'text',\n text: str,\n marks: [],\n attrs: {},\n },\n ];\n }\n}\n\n// Useful for things like page ranges\nfunction rangeArray(parts: string[]): RangeArray | undefined {\n if (parts.length === 1) {\n return [textNodes(parts[0])];\n } else if (parts.length === 2) {\n return [textNodes(parts[0]), textNodes(parts[1])];\n }\n}\n\n// Returns the bibDB type for a given CSL type.\nfunction bibTypeForCSL(cslType: string): [string, BibType] {\n const key = Object.keys(BibTypes).find(bibTypeKey => {\n const bibType = BibTypes[bibTypeKey];\n if (bibType.csl === cslType) {\n return bibTypeKey;\n }\n });\n\n if (key) {\n const bibType = BibTypes[key];\n return [key, bibType];\n } else {\n const bibType = BibTypes.misc;\n return ['misc', bibType];\n }\n}\n\nfunction bibFieldForValue(cslKey: string, cslType: string): Array<[string, BibField]> | undefined {\n // Special case the following fields:\n // article-journal issue\n // patent number\n // * collection-number\n // See https://discourse.citationstyles.org/t/issue-number-and-bibtex/1072\n // https://github.com/fiduswriter/biblatex-csl-converter/blob/35d152935eba253ebadd00e285fb13c5828f167f/src/const.js#L561\n if (\n (cslType === 'article-journal' && cslKey === 'issue') ||\n (cslType === 'patent' && cslKey === 'number') ||\n cslKey === 'collection-number'\n ) {\n const bibField = {\n type: 'f_literal',\n biblatex: 'number',\n csl: cslKey,\n };\n return [['number', bibField]];\n }\n\n // Find the key that corresponds to this CSL key\n const keys = Object.keys(BibFieldTypes).filter(bibFieldKey => {\n const bibField = BibFieldTypes[bibFieldKey];\n const cslFieldName = bibField.csl;\n if (cslFieldName && cslFieldName === cslKey) {\n return bibField;\n }\n });\n\n // Get the field and return\n if (keys) {\n return keys.map(key => {\n const bibField = BibFieldTypes[key];\n return [key, bibField];\n });\n }\n}\n\nfunction sortedKeys(csl: CSL) {\n let pos = 1;\n const keySortOrder: { [id: string]: number } = {};\n keySortOrder.title = pos++;\n\n keySortOrder.author = pos++;\n keySortOrder.editor = pos++;\n keySortOrder.director = pos++;\n keySortOrder.illustrator = pos++;\n keySortOrder['collection-editor'] = pos++;\n keySortOrder.translator = pos++;\n\n keySortOrder.doi = pos++;\n\n keySortOrder.issued = pos++;\n keySortOrder['event-date'] = pos++;\n\n keySortOrder['container-title'] = pos++;\n keySortOrder['collection-title'] = pos++;\n\n keySortOrder.url = pos++;\n\n keySortOrder.page = pos++;\n keySortOrder.publisher = pos++;\n\n const enumerableCSL = csl as any;\n const keys = Object.keys(enumerableCSL);\n const sorted = keys.sort((a, b) => {\n const aOrder = keySortOrder[a.toLowerCase()];\n const bOrder = keySortOrder[b.toLowerCase()];\n if (aOrder && bOrder) {\n return aOrder - bOrder;\n } else if (aOrder !== undefined) {\n return -1;\n } else if (bOrder !== undefined) {\n return 1;\n }\n return a.localeCompare(b);\n });\n return sorted;\n}\n","/*\n * csl.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { parseYamlNodes } from './yaml';\nimport { crossRefTypeToCSLType } from './crossref';\nimport { EditorUI } from './ui';\nimport { EditorUIImages } from './ui-images';\n\nexport interface CSL {\n // The id. This is technically required, but some providers (like crossref) don't provide\n // one\n id?: string;\n\n // Enumeration, one of the type ids from https://api.crossref.org/v1/types\n type: string;\n\n // An item key that may be used to identify this item\n key?: string;\n\n // Name of work's publisher\n publisher?: string;\n\n // Title\n title?: string;\n\n // DOI of the work\n DOI?: string;\n\n // URL form of the work's DOI\n URL?: string;\n\n // Array of Contributors\n author?: CSLName[];\n\n // Earliest of published-print and published-online\n issued?: CSLDate;\n\n // Full titles of the containing work (usually a book or journal)\n 'container-title'?: string;\n\n // Short titles of the containing work (usually a book or journal)\n 'short-container-title'?: string;\n\n // Issue number of an article's journal\n issue?: string;\n\n // Volume number of an article's journal\n volume?: string;\n\n // Pages numbers of an article within its journal\n page?: string;\n\n // These properties are often not included in CSL entries and are here\n // primarily because they may need to be sanitized\n ISSN?: string;\n ISBN?: string;\n 'original-title'?: string;\n 'short-title'?: string;\n subtitle?: string;\n subject?: string;\n archive?: string;\n license?: [];\n}\n\nexport interface CSLName {\n family: string;\n given: string;\n literal?: string;\n}\n\nexport interface CSLDate {\n 'date-parts'?: Array<[number, number?, number?]>;\n raw?: string;\n}\n\n// Crossref sends some items back with invalid data types in the CSL JSON\n// This appears to tend to happen the most frequently with fields that CrossRef\n// stores as Arrays which are not properly flatted to strings as Pandoc cite-proc expects.\n// This will flatten any of these fields to the first element of the array\nexport function sanitizeForCiteproc(csl: CSL): CSL {\n // This field list was create speculatively, so may contain fields that do not require\n // sanitization (or may omit fields that require it).\n const sanitizeProperties = [\n 'ISSN',\n 'ISBN',\n 'title',\n 'subject',\n 'archive',\n 'original-title',\n 'short-title',\n 'subtitle',\n 'container-title',\n 'short-container-title',\n 'license'\n ];\n const cslAny: { [key: string]: any } = {\n ...csl,\n };\n const keys = Object.keys(cslAny);\n keys\n .filter(key => sanitizeProperties.includes(key))\n .forEach(property => {\n const value = cslAny[property];\n if (value && Array.isArray(value)) {\n if (value.length > 0) {\n cslAny[property] = value[0];\n } else {\n cslAny[property] = undefined;\n }\n }\n return cslAny;\n });\n\n // Strip any raw date representations\n if (cslAny.issued?.raw) {\n delete cslAny.issued.raw;\n }\n\n // Pubmed and others may included license information (including date ranges and more)\n // which will not be properly parsed by Pandoc (when writing to the bibliography). Remove\n if (cslAny.license) {\n delete cslAny.license;\n }\n\n // Datacite and others may include a 'contributor' field which should be an array of author types\n // however, pandoc can't properly process contributor field\n if (cslAny.contributor) {\n delete cslAny.contributor;\n }\n\n // pandoc-citeproc performance is extremely poor with large abstracts. As a result, purge this property\n delete cslAny.abstract;\n delete cslAny.id;\n\n // Ensure only valid CSL types make it through\n cslAny.type = ensureValidCSLType(cslAny.type);\n\n return cslAny as CSL;\n}\n\n// Crossref and other sources may allow invalid types to leak through\n// (for example, this DOI 10.5962/bhl.title.5326 is of a monograph)\n// and the type will leak through as monograph. This function will verify\n// that the type is a CSL type and if it not, do its best to map the type\n// to a valid CSL type\nexport function ensureValidCSLType(type: string): string {\n if (Object.values(cslTypes).includes(type)) {\n // This is a valid type\n return type;\n } else {\n return crossRefTypeToCSLType(type);\n }\n}\n\nexport function cslFromDoc(doc: ProsemirrorNode): string | undefined {\n // read the Yaml blocks from the document\n const parsedYamlNodes = parseYamlNodes(doc);\n\n const cslParsedYamls = parsedYamlNodes.filter(\n parsedYaml => parsedYaml.yaml !== null && typeof parsedYaml.yaml === 'object' && parsedYaml.yaml.csl,\n );\n\n // Look through any yaml nodes to see whether any contain csl information\n if (cslParsedYamls.length > 0) {\n // Pandoc uses the last csl block (whether or not it shares a yaml block with the\n // bibliographies element that pandoc will ultimately use) so just pick the last csl\n // block.\n const cslParsedYaml = cslParsedYamls[cslParsedYamls.length - 1];\n const cslFile = cslParsedYaml.yaml.csl;\n return cslFile;\n }\n return undefined;\n}\n\n// Converts a csl date to an EDTF date.\n// See https://www.loc.gov/standards/datetime/\n// Currently omits time component so this isn't truly level 0\nexport function cslDateToEDTFDate(date: CSLDate) {\n if (date['date-parts']) {\n const paddedParts = date['date-parts'][0].map(part => {\n const partStr = part?.toString();\n if (partStr?.length === 1) {\n return `0${partStr}`;\n }\n return partStr;\n });\n return paddedParts.join('-');\n }\n}\n\nexport function imageForType(images: EditorUIImages, type: string): [string?, string?] {\n switch (type) {\n case cslTypes.article:\n case cslTypes.articleJournal:\n case cslTypes.articleMagazine:\n case cslTypes.articleNewspaper:\n case cslTypes.paperConference:\n case cslTypes.review:\n case cslTypes.reviewBook:\n return [images.citations?.article, images.citations?.article_dark];\n case cslTypes.bill:\n case cslTypes.legislation:\n case cslTypes.legalCase:\n case cslTypes.treaty:\n return [images.citations?.legal, images.citations?.legal_dark];\n case cslTypes.book:\n case cslTypes.chapter:\n case cslTypes.manuscript:\n case cslTypes.thesis:\n return [images.citations?.book, images.citations?.book_dark];\n case cslTypes.broadcast:\n return [images.citations?.broadcast, images.citations?.broadcast_dark];\n case cslTypes.dataset:\n return [images.citations?.data, images.citations?.data_dark];\n case cslTypes.entry:\n case cslTypes.entryDictionary:\n case cslTypes.entryEncylopedia:\n return [images.citations?.entry, images.citations?.entry_dark];\n case cslTypes.figure:\n case cslTypes.graphic:\n return [images.citations?.image, images.citations?.image_dark];\n case cslTypes.map:\n return [images.citations?.map, images.citations?.map_dark];\n case cslTypes.motionPicture:\n return [images.citations?.movie, images.citations?.movie_dark];\n case cslTypes.musicalScore:\n case cslTypes.song:\n return [images.citations?.song, images.citations?.song_dark];\n case cslTypes.post:\n case cslTypes.postWeblog:\n case cslTypes.webpage:\n return [images.citations?.web, images.citations?.web_dark];\n case cslTypes.paperConference:\n case cslTypes.interview:\n case cslTypes.pamphlet:\n case cslTypes.personalCommunication:\n case cslTypes.report:\n case cslTypes.speech:\n default:\n return [images.citations?.other, images.citations?.other_dark];\n }\n}\n\nexport const cslTypes = {\n article: 'article',\n articleMagazine: 'article-magazine',\n articleNewspaper: 'article-newspaper',\n articleJournal: 'article-journal',\n bill: 'bill',\n book: 'book',\n broadcast: 'broadcast',\n chapter: 'chapter',\n dataset: 'dataset',\n entry: 'entry',\n entryDictionary: 'entry-dictionary',\n entryEncylopedia: 'entry-encyclopedia',\n figure: 'figure',\n graphic: 'graphic',\n interview: 'interview',\n legislation: 'legislation',\n legalCase: 'legal_case',\n manuscript: 'manuscript',\n map: 'map',\n motionPicture: 'motion_picture',\n musicalScore: 'musical_score',\n pamphlet: 'pamphlet',\n paperConference: 'paper-conference',\n patent: 'patent',\n post: 'post',\n postWeblog: 'post-weblog',\n personalCommunication: 'personal_communication',\n report: 'report',\n review: 'review',\n reviewBook: 'review-book',\n song: 'song',\n speech: 'speech',\n thesis: 'thesis',\n treaty: 'treaty',\n webpage: 'webpage',\n};\n","/*\n * crossref.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorUI } from './ui';\nimport { cslTypes } from './csl';\n\n// https://github.com/CrossRef/rest-api-doc\nexport interface CrossrefServer {\n works: (query: string) => Promise<CrossrefMessage<CrossrefWork>>;\n}\n\nexport const kCrossrefItemsPerPage = 'items-per-page';\nexport const kCrossrefStartIndex = 'start-index';\nexport const kCrossrefSearchTerms = 'search-terms';\nexport const kCrossrefTotalResults = 'total-results';\n\nexport interface CrossrefMessage<T> {\n items: T[];\n [kCrossrefItemsPerPage]: number;\n query: {\n [kCrossrefStartIndex]: number;\n [kCrossrefSearchTerms]: string;\n };\n [kCrossrefTotalResults]: number;\n}\n\n// https://github.com/Crossref/rest-api-doc/blob/master/api_format.md#work\nexport interface CrossrefWork {\n // Name of work's publisher\n publisher: string;\n\n // Work titles, including translated titles\n title?: string[];\n\n // DOI of the work\n DOI: string;\n\n // URL form of the work's DOI\n URL: string;\n\n // Enumeration, one of the type ids from https://api.crossref.org/v1/types\n type: string;\n\n // Array of Contributors\n author: CrossrefContributor[];\n\n // Earliest of published-print and published-online\n issued: CrossrefDate;\n\n // Full titles of the containing work (usually a book or journal)\n 'container-title'?: string;\n\n // Short titles of the containing work (usually a book or journal)\n 'short-container-title'?: string;\n\n // Issue number of an article's journal\n issue: string;\n\n // Volume number of an article's journal\n volume: string;\n\n // Pages numbers of an article within its journal\n page: string;\n}\n\nexport interface CrossrefContributor {\n family: string;\n given?: string;\n}\n\n/* (Partial Date) Contains an ordered array of year, month, day of month. Only year is required. \nNote that the field contains a nested array, e.g. [ [ 2006, 5, 19 ] ] to conform \nto citeproc JSON dates */\nexport interface CrossrefDate {\n 'date-parts': Array<[number, number?, number?]>;\n}\n\nexport function imageForCrossrefType(ui: EditorUI, type: string): [string?, string?] {\n switch (type) {\n case crossRefTypes.monograph:\n case crossRefTypes.report:\n case crossRefTypes.journalArticle:\n case crossRefTypes.journalVolume:\n case crossRefTypes.journal:\n case crossRefTypes.journalIssue:\n case crossRefTypes.proceedingsArticle:\n case crossRefTypes.dissertation:\n case crossRefTypes.reportSeries:\n return [ui.images.citations?.article, ui.images.citations?.article_dark];\n case crossRefTypes.bookSection:\n case crossRefTypes.bookPart:\n case crossRefTypes.bookSeries:\n case crossRefTypes.editedBook:\n case crossRefTypes.bookChapter:\n case crossRefTypes.book:\n case crossRefTypes.bookSet:\n case crossRefTypes.bookTrack:\n case crossRefTypes.referenceBook:\n return [ui.images.citations?.book, ui.images.citations?.book_dark];\n case crossRefTypes.dataset:\n return [ui.images.citations?.data, ui.images.citations?.data_dark];\n case crossRefTypes.referenceEntry:\n return [ui.images.citations?.entry, ui.images.citations?.entry_dark];\n case crossRefTypes.postedContent:\n return [ui.images.citations?.web, ui.images.citations?.web_dark];\n case crossRefTypes.other:\n case crossRefTypes.standard:\n case crossRefTypes.standardSeries:\n case crossRefTypes.peerReview:\n case crossRefTypes.component:\n case crossRefTypes.proceedingsSeries:\n case crossRefTypes.proceedings:\n default:\n return [ui.images.citations?.other, ui.images.citations?.other_dark];\n }\n}\n\nexport function prettyType(ui: EditorUI, type: string): string {\n switch (type) {\n case crossRefTypes.monograph:\n return ui.context.translateText('Monograph');\n case crossRefTypes.report:\n return ui.context.translateText('Report');\n case crossRefTypes.journalArticle:\n return ui.context.translateText('Journal');\n case crossRefTypes.journalVolume:\n return ui.context.translateText('Journal Volume');\n case crossRefTypes.journal:\n return ui.context.translateText('Journal');\n case crossRefTypes.journalIssue:\n return ui.context.translateText('Journal Issue');\n case crossRefTypes.proceedingsArticle:\n case crossRefTypes.proceedingsSeries:\n case crossRefTypes.proceedings:\n return ui.context.translateText('Proceedings');\n case crossRefTypes.dissertation:\n return ui.context.translateText('Dissertation');\n case crossRefTypes.reportSeries:\n return ui.context.translateText('Series');\n case crossRefTypes.bookSection:\n return ui.context.translateText('Book Section');\n case crossRefTypes.bookPart:\n return ui.context.translateText('Book Part');\n case crossRefTypes.bookSeries:\n return ui.context.translateText('Book Series');\n case crossRefTypes.bookChapter:\n return ui.context.translateText('Book Chapter');\n case crossRefTypes.editedBook:\n case crossRefTypes.bookSet:\n case crossRefTypes.bookTrack:\n case crossRefTypes.referenceBook:\n return ui.context.translateText('Book');\n case crossRefTypes.dataset:\n return ui.context.translateText('Dataset');\n case crossRefTypes.referenceEntry:\n return ui.context.translateText('Entry');\n case crossRefTypes.postedContent:\n return ui.context.translateText('Content');\n case crossRefTypes.other:\n case crossRefTypes.standard:\n case crossRefTypes.standardSeries:\n case crossRefTypes.peerReview:\n case crossRefTypes.component:\n return ui.context.translateText('Other');\n default:\n return type;\n }\n}\n\nexport function crossRefTypeToCSLType(type: string): string {\n // This isn't a valid type, try to map it to a valid type\n switch (type) {\n case crossRefTypes.bookSection:\n case crossRefTypes.bookChapter:\n case crossRefTypes.bookPart:\n return cslTypes.chapter;\n case crossRefTypes.book:\n case crossRefTypes.bookSet:\n case crossRefTypes.bookTrack:\n case crossRefTypes.referenceBook:\n case crossRefTypes.bookSeries:\n case crossRefTypes.editedBook:\n return cslTypes.book;\n case crossRefTypes.report:\n return cslTypes.report;\n case crossRefTypes.peerReview:\n return cslTypes.review;\n case crossRefTypes.journalArticle:\n case crossRefTypes.journalVolume:\n case crossRefTypes.journal:\n case crossRefTypes.journalIssue:\n return cslTypes.articleJournal;\n case crossRefTypes.referenceEntry:\n return cslTypes.entry;\n case crossRefTypes.monograph:\n case crossRefTypes.proceedingsArticle:\n case crossRefTypes.component:\n case crossRefTypes.other:\n return cslTypes.article;\n case crossRefTypes.proceedings:\n case crossRefTypes.proceedingsSeries:\n return cslTypes.paperConference;\n case crossRefTypes.reportSeries:\n return cslTypes.report;\n case crossRefTypes.standard:\n case crossRefTypes.standardSeries:\n return cslTypes.patent;\n case crossRefTypes.postedContent:\n return cslTypes.webpage;\n case crossRefTypes.dissertation:\n return cslTypes.thesis;\n case crossRefTypes.dataset:\n return cslTypes.dataset;\n default:\n return cslTypes.article;\n }\n}\n\nexport const crossRefTypes = {\n bookSection: 'book-section',\n monograph: 'monograph',\n report: 'report',\n peerReview: 'peer-review',\n bookTrack: 'book-track',\n journalArticle: 'journal-article',\n bookPart: 'book-part',\n other: 'other',\n book: 'book',\n journalVolume: 'journal-volume',\n bookSet: 'book-set',\n referenceEntry: 'reference-entry',\n proceedingsArticle: 'proceedings-article',\n journal: 'journal',\n component: 'component',\n bookChapter: 'book-chapter',\n proceedingsSeries: 'proceedings-series',\n reportSeries: 'report-series',\n proceedings: 'proceedings',\n standard: 'standard',\n referenceBook: 'reference-book',\n postedContent: 'posted-content',\n journalIssue: 'journal-issue',\n dissertation: 'dissertation',\n dataset: 'dataset',\n bookSeries: 'book-series',\n editedBook: 'edited-book',\n standardSeries: 'standard-series',\n};\n","import { Schema, NodeSpec, MarkSpec, DOMParser, Node as ProsemirrorNode } from 'prosemirror-model';\n\nconst kCslDOMParser = cslDOMParser();\n\nexport function cslTextToProsemirrorNode(text: string): ProsemirrorNode | null {\n const domParser = new window.DOMParser();\n const doc = domParser.parseFromString(text, 'text/html');\n if (doc) {\n const pmNode = kCslDOMParser.parse(doc.body, { preserveWhitespace: 'full' });\n return pmNode;\n } else {\n return null;\n }\n}\n\nexport function cslDOMParser(): DOMParser {\n return DOMParser.fromSchema(cslSchema());\n}\n\nfunction cslSchema() {\n const nodes: { [name: string]: NodeSpec } = {\n doc: {\n content: 'inline*',\n },\n text: {\n group: 'inline',\n toDOM(node: ProsemirrorNode): any {\n return node.text;\n },\n },\n };\n const marks: { [name: string]: MarkSpec } = {};\n marks.strong = tagSpec('b');\n marks.em = tagSpec('i');\n marks.sup = tagSpec('sup');\n marks.sub = tagSpec('sub');\n marks.smallcaps = spanSpec('smallcaps');\n marks.nocase = spanSpec('nocase');\n\n // return schema\n return new Schema({\n nodes,\n marks,\n });\n}\n\nfunction tagSpec(tag: string): MarkSpec {\n return {\n parseDOM: [{ tag }],\n toDOM() {\n return [tag];\n },\n };\n}\n\nfunction spanSpec(clz: string): MarkSpec {\n return {\n parseDOM: [{ tag: `span[class*='${clz}']` }],\n toDOM() {\n return ['span', { class: clz }];\n },\n };\n}\n","/*\n * bibtex.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { NodeArray, RangeArray, NameDictObject, TextNodeObject } from 'biblatex-csl-converter';\nimport { FieldMap } from './fields';\nimport { typeMapping } from './types';\nimport { FormattingTags } from './formatting';\nimport characters from './characters';\nimport { BibDB, EntryObject } from '../bibliography/bibDB';\n\nexport interface Config {\n traditionalNames?: boolean;\n exportUnexpectedFields?: boolean;\n}\n\nexport interface Entry {\n type: string;\n key: string;\n values?: { [key: string]: string };\n}\n\ninterface Warning {\n type: string;\n variable: string;\n}\n\nexport function bibDbToBibTeX(bibDB: BibDB, config: Config = {}) {\n // Keys of items to export\n const keysToExport = Object.keys(bibDB);\n\n // The final entries\n const bibtexEntries: Entry[] = [];\n\n // Go through each item and compose the entry and\n // append all the fields with BibTeX specific formatting\n keysToExport?.forEach(key => {\n const entryObject: EntryObject = bibDB[key];\n\n const cslType = entryObject.csl_type;\n const bibTexType = cslType ? typeMapping(cslType).bibtex : entryObject.bib_type;\n\n const bibtexEntry: Entry = {\n type: bibTexType,\n key: entryObject.entry_key,\n };\n\n // The formatted output fields for this entry\n const outputFields: { [key: string]: string } = {};\n\n // All the fields for this entry\n const fieldsForExport: Record<string, any> = entryObject.fields;\n Object.keys(fieldsForExport).forEach(fieldKey => {\n // Lookup the field information in the mapping\n // (maps CSL fields names to their peer BibTeX types)\n const fieldType = FieldMap[fieldKey];\n\n // This is a well understood field type\n if (fieldType) {\n const type = fieldType.type;\n\n // Read the type (either as raw value or passing the type to look it up)\n const typeReader = fieldType.bibtex;\n const bibtexKey = typeof typeReader === 'string' ? typeReader : typeReader(bibTexType);\n const bibtexValue = fieldsForExport[fieldKey];\n\n switch (type) {\n case 'f_date':\n // Output the raw date value\n outputFields[bibtexKey] = bibtexValue;\n\n // Also output the year and month, if possible\n // The value being parsed is a EDTF 1.0 level 0/1 compliant string. (2000-12-31)\n const parts: string[] = bibtexValue.split('-');\n if (parts.length > 0) {\n outputFields.year = parts[0];\n if (parts.length > 1) {\n outputFields.month = parts[1];\n }\n }\n\n break;\n case 'f_integer':\n outputFields[bibtexKey] = formatText(bibtexValue);\n break;\n case 'f_key':\n outputFields[bibtexKey] = formatKey(bibtexValue, bibtexKey);\n break;\n case 'f_literal':\n case 'f_long_literal':\n outputFields[bibtexKey] = formatText(bibtexValue);\n break;\n case 'l_range':\n outputFields[bibtexKey] = formatRange(bibtexValue);\n break;\n case 'f_title':\n outputFields[bibtexKey] = formatText(bibtexValue);\n break;\n case 'f_uri':\n case 'f_verbatim':\n // Strip any braces from verbatims\n outputFields[bibtexKey] = bibtexValue.replace(/{|}/g, '');\n break;\n case 'l_key':\n outputFields[bibtexKey] = escapeNonAscii(\n bibtexValue.map((k: string) => formatKey(k, bibtexKey)).join(' and '),\n );\n break;\n case 'l_literal':\n outputFields[bibtexKey] = bibtexValue.map((text: NodeArray) => formatText(text)).join(' and ');\n break;\n case 'l_name':\n outputFields[bibtexKey] = formatNames(bibtexValue);\n break;\n case 'l_tag':\n outputFields[bibtexKey] = escapeNonAscii(bibtexValue.join(', '));\n break;\n default:\n // This is a field type that we don't understand, skip it\n break;\n }\n }\n });\n\n bibtexEntry.values = outputFields;\n bibtexEntries.push(bibtexEntry);\n });\n return toBibtex(bibtexEntries);\n}\n\n// Writes BibTex\nconst toBibtex = (entries: Entry[]): string => {\n const length = entries.length;\n let bibTexStr = '';\n for (let i = 0; i < length; i++) {\n // The entry we're writing\n const entry = entries[i];\n\n // Write the key and open the entry\n bibTexStr = bibTexStr + `@${entry.type}{${entry.key}`;\n\n // The fields for this item\n if (entry.values && Object.keys(entry.values).length > 0) {\n sortedKeys(entry.values).forEach(key => {\n if (entry.values) {\n const rawValue = entry.values[key];\n const value = `{${rawValue}}`;\n\n // Strip empty braces\n // TODO: If we support variables, we may need to clean this\n // const cleanedValue = value.replace(/\\{\\} # /g, '').replace(/# \\{\\}/g, '');\n bibTexStr = bibTexStr + `,\\n\\t${key} = ${value}`;\n }\n });\n } else {\n // There are no values, we need to minimally place a ',' at the end of the id\n // If we omit this, pandoc cannot parse the bibliography\n bibTexStr = bibTexStr + \",\";\n }\n\n // Close the entry\n bibTexStr = bibTexStr + '\\n}';\n }\n return bibTexStr;\n};\n\nconst sortedKeys = (fields: { [key: string]: string }) => {\n let pos = 1;\n const keySortOrder: { [id: string]: number } = {};\n keySortOrder.title = pos++;\n keySortOrder.author = pos++;\n keySortOrder.editor = pos++;\n keySortOrder.year = pos++;\n keySortOrder.month = pos++;\n keySortOrder.date = pos++;\n keySortOrder.journal = pos++;\n keySortOrder.booktitle = pos++;\n keySortOrder.publisher = pos++;\n keySortOrder.howpublished = pos++;\n keySortOrder.pages = pos++;\n keySortOrder.series = pos++;\n keySortOrder.volume = pos++;\n keySortOrder.chapter = pos++;\n keySortOrder.number = pos++;\n keySortOrder.edition = pos++;\n keySortOrder.issue = pos++;\n keySortOrder.doi = pos++;\n keySortOrder.url = pos++;\n keySortOrder.abstract = pos++;\n keySortOrder.note = pos++;\n\n const keys = Object.keys(fields);\n const sorted = keys.sort((a, b) => {\n const aOrder = keySortOrder[a.toLowerCase()];\n const bOrder = keySortOrder[b.toLowerCase()];\n if (aOrder && bOrder) {\n return aOrder - bOrder;\n } else if (aOrder !== undefined) {\n return -1;\n } else if (bOrder !== undefined) {\n return 1;\n }\n return a.localeCompare(b);\n });\n return sorted;\n};\n\n// Converts any non asciii characters to their LaTeX representations\nconst escapeNonAscii = (value: string): string => {\n let result = '';\n\n // Split the string in a way that will maintain unicode characters\n const chars = Array.from(value);\n chars.forEach(c => {\n const char = c.codePointAt(0);\n // Look for a LaTeX replace in the character mapping\n if (char) {\n const characterMap = characters[char];\n if (characterMap) {\n // Found one, emit the LaTeX\n // Use the braces to group the expression, unless the character replacement explicitly\n // doesn't want to be grouped\n result = result + (characterMap.ungrouped ? characterMap.latex : `{${characterMap.latex}}`);\n } else {\n // No LaTeX replacement, just emit the character\n result = result + String.fromCodePoint(char);\n }\n } else {\n // A position which has no codepoint. what on earth is this?\n result = result + '?';\n }\n });\n return result;\n};\n\n// Formats keys\nconst formatKey = (value: string | NodeArray, fieldKey: string) => {\n if (typeof value === 'string') {\n const fieldType = FieldMap[fieldKey];\n // If the field is an array, we can just emit the value\n // Otherwise, we should treat options as a keyed object and lookup\n // the bibtex value for this value\n if (Array.isArray(fieldType.options)) {\n return escapeNonAscii(value);\n } else if (fieldType.options) {\n return escapeNonAscii(fieldType.options[value].bibtex);\n } else {\n return escapeNonAscii(value);\n }\n } else {\n return formatText(value);\n }\n};\n\n// Formats text\nconst formatText = (nodes: NodeArray): string => {\n let formattedText = '';\n let lastNodeMarks: string[] = [];\n\n // This empty node at the end will cause us to go through the loop\n // after the last 'real' node and close out any open marks.\n const textNodes = nodes.concat({ type: 'text', text: '' });\n\n textNodes.forEach(node => {\n /*\n // TODO: Do we need to deal with this (and if so, we need to re-add that escape routine)\n if (node.type === 'variable') {\n // This is an undefined variable\n // This should usually not happen, as CSL doesn't know what to\n // do with these. We'll put them into an unsupported tag.\n latex += `} # ${node.attrs.variable} # {`\n this.warnings.push({\n type: 'undefined_variable',\n variable: node.attrs.variable\n })\n return\n }\n */\n\n const thisNodeMarks: string[] = [];\n if (node.marks) {\n // Figure out the new marks for this node\n // TODO: Do we need to re-enable math mode for these low level sup/sub nodes?\n // let mathEnabled = false;\n node.marks.forEach(mark => {\n // We need to activate mathmode for the lowest level sub/sup node.\n // Don't activate math mode for the lowest level node\n /*\n if ((mark.type === 'sup' || mark.type === 'sub') && !mathEnabled) {\n thisNodeMarks.push('math');\n thisNodeMarks.push(mark.type);\n mathEnabled = true;\n } else \n */\n\n if (mark.type === 'nocase') {\n // No case should be the outer mark\n thisNodeMarks.unshift(mark.type);\n } else {\n // regular old mark\n thisNodeMarks.push(mark.type);\n }\n });\n }\n\n // Close any marks that aren't still open in this node\n let closing = false;\n const closeTags: string[] = [];\n lastNodeMarks.forEach((mark, index) => {\n if (mark !== thisNodeMarks[index]) {\n closing = true;\n }\n if (closing) {\n const closeTag =\n lastNodeMarks[0] !== 'nocase' && FormattingTags[mark].open[0] === '\\\\'\n ? `${FormattingTags[mark].close}}`\n : FormattingTags[mark].close;\n closeTags.push(closeTag);\n }\n });\n\n // Emit the close tags for the previous (last to first)\n closeTags.reverse();\n formattedText = formattedText + closeTags.join('');\n\n // Emit the open tags\n let opening = false;\n let doNotEscape = false;\n thisNodeMarks.forEach((mark, index) => {\n if (mark !== lastNodeMarks[index]) {\n opening = true;\n }\n if (opening) {\n // If not in a nocase, we can add protective brace\n if (thisNodeMarks[0] !== 'nocase' && FormattingTags[mark].open[0] === '\\\\') {\n formattedText = formattedText + '{';\n }\n formattedText = formattedText + FormattingTags[mark].open;\n if (FormattingTags[mark].verbatim) {\n doNotEscape = true;\n }\n }\n });\n\n const textNode = node as TextNodeObject;\n if (doNotEscape) {\n formattedText = formattedText + textNode.text;\n } else {\n formattedText = formattedText + escapeNonAscii(textNode.text);\n }\n lastNodeMarks = thisNodeMarks;\n });\n return formattedText;\n};\n\n// Formats ranges\nconst formatRange = (value: RangeArray[]): string => {\n // The correct symbol for a range of numbers is an en-dash, which in LaTeX is usually input as --.\n return value.map(range => range.map(text => formatText(text)).join('--')).join(',');\n};\n\n// Formats author values\nconst formatNames = (names: NameDictObject[]): string => {\n const formattedNames: string[] = [];\n names.forEach(name => {\n if (name.literal) {\n // Use the literal\n const literal = formatText(name.literal);\n if (literal.length) {\n formattedNames.push(`{${literal}}`);\n }\n } else {\n // Compose the name\n // http://www.texfaq.org/FAQ-manyauthor\n const family = name.family ? formatText(name.family) : '';\n const given = name.given ? formatText(name.given) : '';\n const suffix = name.suffix ? formatText(name.suffix) : false;\n const prefix = name.prefix ? formatText(name.prefix) : false;\n\n if (suffix && prefix) {\n formattedNames.push(`${protect(`${prefix} ${family}`)}, ${protect(suffix)}, ${protect(given)}`);\n } else if (suffix) {\n formattedNames.push(`${protect(family)}, ${protect(suffix)}, ${protect(given)}`);\n } else if (prefix) {\n formattedNames.push(`${protect(`${prefix} ${family}`)}, ${protect(given)}`);\n } else {\n formattedNames.push(`${protect(family)}, ${protect(given)}`);\n }\n }\n });\n return formattedNames.join(' and ');\n};\n\nconst kBibtexSafeRegex = /^[a-zA-Z0-9 .-]*$/;\nfunction protect(str: string) {\n if (str.match(kBibtexSafeRegex)) {\n return str;\n } else {\n return `{${str}}`;\n }\n}","/*\n * fields.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { lanagugeMappings } from './language';\n\nexport interface Field {\n type: string;\n bibtex: ((bibTexType: string) => string) | string;\n csl: string | undefined;\n options?: string[] | { [key: string]: { bibtex: string } } | undefined;\n}\n\n// CSL Field (variable) definitions from\n// https://docs.citationstyles.org/en/stable/specification.html#appendix-iv-variables\n\n// TODO: bibtex: string | (type: string) => string\n//\n\nexport const FieldMap: { [key: string]: Field } = {\n abstract: {\n type: 'f_long_literal',\n bibtex: 'abstract',\n csl: 'abstract',\n },\n author: {\n type: 'l_name',\n bibtex: 'author',\n csl: 'author',\n },\n bookauthor: {\n type: 'l_name',\n bibtex: 'author',\n csl: 'container-author',\n },\n containerTitle: {\n type: 'f_title',\n bibtex: (bibTexType: string) => {\n switch (bibTexType) {\n case 'conference':\n case 'inproceedings':\n case 'incollection':\n return 'booktitle';\n default:\n return 'journal';\n }\n },\n csl: 'container-title',\n },\n chapter: {\n type: 'f_literal',\n bibtex: 'chapter',\n csl: 'chapter-number',\n },\n date: {\n type: 'f_date',\n bibtex: 'date',\n csl: 'issued',\n },\n doi: {\n type: 'f_verbatim',\n bibtex: 'doi',\n csl: 'DOI',\n },\n edition: {\n type: 'f_integer',\n bibtex: 'edition',\n csl: 'edition',\n },\n editor: {\n type: 'l_name',\n bibtex: 'editor',\n csl: 'editor',\n },\n eventdate: {\n type: 'f_date',\n bibtex: 'date',\n csl: 'event-date',\n },\n eventtitle: {\n type: 'f_title',\n bibtex: 'title',\n csl: 'event',\n },\n howpublished: {\n type: 'f_literal',\n bibtex: 'howpublished',\n csl: 'medium',\n },\n issue: {\n type: 'f_literal',\n bibtex: 'issue',\n csl: 'issue',\n },\n journaltitle: {\n type: 'f_literal',\n bibtex: 'journal',\n csl: 'container-title',\n },\n // Special - not really in CSL or BibTeX\n langid: {\n type: 'f_key',\n bibtex: 'langid',\n csl: 'language',\n options: lanagugeMappings,\n },\n location: {\n type: 'l_literal',\n bibtex: 'address',\n csl: 'publisher-place',\n },\n note: {\n type: 'f_literal',\n bibtex: 'note',\n csl: 'note',\n },\n number: {\n type: 'f_literal',\n bibtex: 'number',\n csl: 'collection-number',\n },\n pages: {\n type: 'l_range',\n bibtex: 'pages',\n csl: 'page',\n },\n publisher: {\n type: 'l_literal',\n bibtex: 'publisher',\n csl: 'publisher',\n },\n series: {\n type: 'f_literal',\n bibtex: 'series',\n csl: 'collection-title',\n },\n title: {\n type: 'f_title',\n bibtex: 'title',\n csl: 'title',\n },\n url: {\n type: 'f_uri',\n bibtex: 'url',\n csl: 'URL',\n },\n volume: {\n type: 'f_literal',\n bibtex: 'volume',\n csl: 'volume',\n },\n};\n","/*\n * language.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n// Support emitting languages using 'babel' names\n// This isn't strictly supported by pure BibTex\n// but this seems likely to helpful to include\nexport const lanagugeMappings = {\n acadian: {\n csl: 'fr-CA',\n bibtex: 'acadian',\n },\n afrikaans: {\n csl: 'af-ZA',\n bibtex: 'afrikaans',\n },\n arabic: {\n csl: 'ar',\n bibtex: 'arabic',\n },\n basque: {\n csl: 'eu',\n bibtex: 'basque',\n },\n bulgarian: {\n csl: 'bg-BG',\n bibtex: 'bulgarian',\n },\n catalan: {\n csl: 'ca-AD',\n bibtex: 'catalan',\n },\n chinese: {\n csl: 'zh-CN',\n bibtex: 'pinyin',\n },\n croatian: {\n csl: 'hr-HR',\n bibtex: 'croatian',\n },\n czech: {\n csl: 'cs-CZ',\n bibtex: 'czech',\n },\n danish: {\n csl: 'da-DK',\n bibtex: 'danish',\n },\n dutch: {\n csl: 'nl-NL',\n bibtex: 'dutch',\n },\n auenglish: {\n csl: 'en-GB',\n bibtex: 'australian',\n },\n caenglish: {\n csl: 'en-US',\n bibtex: 'canadian',\n },\n nzenglish: {\n csl: 'en-GB',\n bibtex: 'newzealand',\n },\n ukenglish: {\n csl: 'en-GB',\n bibtex: 'ukenglish',\n },\n usenglish: {\n csl: 'en-US',\n bibtex: 'usenglish',\n },\n estonian: {\n csl: 'et-EE',\n bibtex: 'estonian',\n },\n finnish: {\n csl: 'fi-FI',\n bibtex: 'finnish',\n },\n french: {\n csl: 'fr-FR',\n bibtex: 'french',\n },\n cafrench: {\n csl: 'fr-CA',\n bibtex: 'canadien',\n },\n german: {\n csl: 'de-DE',\n bibtex: 'ngerman',\n },\n atgerman: {\n csl: 'de-AT',\n bibtex: 'naustrian',\n },\n greek: {\n csl: 'el-GR',\n bibtex: 'greek',\n },\n hebrew: {\n csl: 'he-IL',\n bibtex: 'hebrew',\n },\n hungarian: {\n csl: 'hu-HU',\n bibtex: 'hungarian',\n },\n icelandic: {\n csl: 'is-IS',\n bibtex: 'icelandic',\n },\n italian: {\n csl: 'it-IT',\n bibtex: 'italian',\n },\n japanese: {\n csl: 'ja-JP',\n bibtex: 'japanese',\n },\n latin: {\n csl: 'la',\n bibtex: 'latin',\n },\n latvian: {\n csl: 'lv-LV',\n bibtex: 'latvian',\n },\n lithuanian: {\n csl: 'lt-LT',\n bibtex: 'lithuanian',\n },\n magyar: {\n csl: 'hu-HU',\n bibtex: 'magyar',\n },\n mongolian: {\n csl: 'mn-MN',\n bibtex: 'mongolian',\n },\n norwegian: {\n csl: 'nb-NO',\n bibtex: 'norsk',\n },\n newnorwegian: {\n csl: 'nn-NO',\n bibtex: 'nynorsk',\n },\n farsi: {\n csl: 'fa-IR',\n bibtex: 'farsi',\n },\n polish: {\n csl: 'pl-PL',\n bibtex: 'polish',\n },\n portuguese: {\n csl: 'pt-PT',\n bibtex: 'portuguese',\n },\n brportuguese: {\n csl: 'pt-BR',\n bibtex: 'brazilian',\n },\n romanian: {\n csl: 'ro-RO',\n bibtex: 'romanian',\n },\n russian: {\n csl: 'ru-RU',\n bibtex: 'russian',\n },\n serbian: {\n csl: 'sr-RS',\n bibtex: 'serbian',\n },\n cyrillicserbian: {\n csl: 'sr-RS',\n bibtex: 'serbianc',\n },\n slovak: {\n csl: 'sk-SK',\n bibtex: 'slovak',\n },\n slovene: {\n csl: 'sl-SL',\n bibtex: 'slovene',\n },\n spanish: {\n csl: 'es-ES',\n bibtex: 'spanish',\n },\n swedish: {\n csl: 'sv-SE',\n bibtex: 'swedish',\n },\n thai: {\n csl: 'th-TH',\n bibtex: 'thai',\n },\n turkish: {\n csl: 'tr-TR',\n bibtex: 'turkish',\n },\n ukrainian: {\n csl: 'uk-UA',\n bibtex: 'ukrainian',\n },\n vietnamese: {\n csl: 'vi-VN',\n bibtex: 'vietnamese',\n },\n};\n","/*\n * types.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { cslTypes } from '../csl';\n\nexport interface Type {\n bibtex: string;\n fieldsRequired: string[];\n fieldsOptional: string[];\n fieldsEitherOr: string[];\n}\n\n// Maps CSL Types to the equivalent BibTeX types.\n// Mapping derived from:\n// https://github.com/citation-style-language/styles/blob/master/bibtex.csl\nexport function typeMapping(cslType: string): Type {\n switch (cslType) {\n case cslTypes.article:\n case cslTypes.articleJournal:\n case cslTypes.articleMagazine:\n case cslTypes.articleNewspaper:\n return {\n bibtex: BibTextTypes.article.type,\n ...BibTextTypes.article.fields,\n };\n\n case cslTypes.book:\n return {\n bibtex: BibTextTypes.book.type,\n ...BibTextTypes.book.fields,\n };\n\n case cslTypes.chapter:\n return {\n bibtex: BibTextTypes.inbook.type,\n ...BibTextTypes.inbook.fields,\n };\n\n case cslTypes.thesis:\n return {\n bibtex: BibTextTypes.phdthesis.type,\n ...BibTextTypes.phdthesis.fields,\n };\n\n case cslTypes.manuscript:\n return {\n bibtex: BibTextTypes.unpublished.type,\n ...BibTextTypes.unpublished.fields,\n };\n\n case cslTypes.paperConference:\n return {\n bibtex: BibTextTypes.inproceedings.type,\n ...BibTextTypes.inproceedings.fields,\n };\n\n case cslTypes.report:\n return {\n bibtex: BibTextTypes.techreport.type,\n ...BibTextTypes.techreport.fields,\n };\n\n case cslTypes.bill:\n case cslTypes.graphic:\n case cslTypes.legalCase:\n case cslTypes.legislation:\n case cslTypes.motionPicture:\n case cslTypes.report:\n case cslTypes.song:\n default:\n return {\n bibtex: BibTextTypes.misc.type,\n ...BibTextTypes.misc.fields,\n };\n }\n}\n\nexport function bibtextTypeToCSLType(bibtexType: string) {\n switch (bibtexType) {\n case BibTextTypes.article.type:\n return cslTypes.articleJournal;\n\n case BibTextTypes.proceedings.type:\n case BibTextTypes.manual.type:\n case BibTextTypes.book.type:\n return cslTypes.book;\n\n case BibTextTypes.booklet.type:\n return cslTypes.pamphlet;\n\n case BibTextTypes.inbook.type:\n case BibTextTypes.incollection.type:\n return cslTypes.chapter;\n\n case BibTextTypes.conference.type:\n case BibTextTypes.inproceedings.type:\n return cslTypes.paperConference;\n\n case BibTextTypes.mastersthesis.type:\n case BibTextTypes.phdthesis.type:\n return cslTypes.thesis;\n\n case BibTextTypes.techreport.type:\n return cslTypes.report;\n\n case BibTextTypes.unpublished.type:\n return cslTypes.manuscript;\n\n case BibTextTypes.misc.type:\n default:\n return cslTypes.article;\n }\n}\n\n// BibTeX types and their fields\n// See https://www.openoffice.org/bibliographic/bibtex-defs.html\n// (a corrected version of Appendix B.2 of the LATEX book [2], © 1986, by Addison-Wesley.)\nexport const BibTextTypes = {\n // An article from a journal or magazine.\n article: {\n type: 'article',\n fields: {\n fieldsRequired: ['author', 'title', 'journal', 'year'],\n fieldsOptional: ['volume', 'number', 'pages', 'month', 'note'],\n fieldsEitherOr: [],\n },\n },\n // A book with an explicit publisher.\n book: {\n type: 'book',\n fields: {\n fieldsRequired: ['title', 'publisher', 'year'],\n fieldsOptional: ['volume', 'number', 'series', 'address', 'edition', 'month', 'note'],\n fieldsEitherOr: ['author', 'editor'],\n },\n },\n\n // A work that is printed and bound, but without a named publisher or sponsoring institution.\n booklet: {\n type: 'booklet',\n fields: {\n fieldsRequired: ['title'],\n fieldsOptional: ['author', 'howpublished', 'address', 'month', 'year', 'note'],\n fieldsEitherOr: [],\n },\n },\n\n // The same as inproceedings, included for Scribe compatibility.\n conference: {\n type: 'conference',\n fields: {\n fieldsRequired: ['author', 'title', 'booktitle', 'year'],\n fieldsOptional: [\n 'editor',\n 'volume',\n 'number',\n 'series',\n 'pages',\n 'address',\n 'month',\n 'organization',\n 'publisher',\n 'note',\n ],\n fieldsEitherOr: [],\n },\n },\n\n // A part of a book, which may be a chapter (or section or whatever) and/or a range of pages.\n inbook: {\n type: 'inbook',\n fields: {\n fieldsRequired: ['title', 'chapter', 'pages', 'publisher', 'year'],\n fieldsOptional: ['volume', 'number', 'series', 'type', 'address', 'edition', 'month', 'note'],\n fieldsEitherOr: ['author', 'editor'],\n },\n },\n\n // A part of a book having its own title.\n incollection: {\n type: 'incollection',\n fields: {\n fieldsRequired: ['author', 'title', 'booktitle', 'publisher', 'year'],\n fieldsOptional: [\n 'editor',\n 'volume',\n 'number',\n 'series',\n 'type',\n 'chapter',\n 'pages',\n 'address',\n 'edition',\n 'month',\n 'note',\n ],\n fieldsEitherOr: [],\n },\n },\n\n // An article in a conference proceedings.\n inproceedings: {\n type: 'inproceedings',\n fields: {\n fieldsRequired: ['author', 'title', 'booktitle', 'year'],\n fieldsOptional: [\n 'editor',\n 'volume',\n 'number',\n 'series',\n 'pages',\n 'address',\n 'month',\n 'organization',\n 'publisher',\n 'note',\n ],\n fieldsEitherOr: [],\n },\n },\n\n // Technical documentation\n manual: {\n type: 'manual',\n fields: {\n fieldsRequired: ['title'],\n fieldsOptional: ['author', 'organization', 'address', 'edition', 'month', 'year', 'note'],\n fieldsEitherOr: [],\n },\n },\n\n // A Master's thesis.\n mastersthesis: {\n type: 'mastersthesis',\n fields: {\n fieldsRequired: ['author', 'title', 'school', 'year'],\n fieldsOptional: ['type', 'address', 'month', 'note'],\n fieldsEitherOr: [],\n },\n },\n\n // Use this type when nothing else fits.\n misc: {\n type: 'misc',\n fields: {\n fieldsRequired: [],\n fieldsOptional: ['author', 'title', 'howpublished', 'month', 'year', 'note'],\n fieldsEitherOr: [],\n },\n },\n\n // A PhD thesis.\n phdthesis: {\n type: 'phdthesis',\n fields: {\n fieldsRequired: ['author', 'title', 'school', 'year'],\n fieldsOptional: ['type', 'address', 'month', 'note'],\n fieldsEitherOr: [],\n },\n },\n\n // The proceedings of a conference.\n proceedings: {\n type: 'proceedings',\n fields: {\n fieldsRequired: ['title', 'year'],\n fieldsOptional: ['editor', 'volume', 'number', 'series', 'address', 'month', 'organization', 'publisher', 'note'],\n fieldsEitherOr: [],\n },\n },\n\n // A report published by a school or other institution, usually numbered within a series.\n techreport: {\n type: 'techreport',\n fields: {\n fieldsRequired: ['author', 'title', 'institution', 'year'],\n fieldsOptional: ['type', 'number', 'address', 'month', 'note'],\n fieldsEitherOr: [],\n },\n },\n\n // A document having an author and title, but not formally published.\n unpublished: {\n type: 'unpublished',\n fields: {\n fieldsRequired: ['author', 'title', 'note'],\n fieldsOptional: ['month', 'year'],\n fieldsEitherOr: [],\n },\n },\n};\n","/*\n * formatting.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport interface FormattingTag {\n open: string;\n close: string;\n verbatim: boolean;\n}\n\n// Maps formatting tags/marks to the LaTeX replacements\n// When marks are applied to text nodes, these will be emitted in place of those marks\nexport const FormattingTags: { [key: string]: FormattingTag } = {\n strong: { open: '\\\\textbf{', close: '}', verbatim: false },\n em: { open: '\\\\emph{', close: '}', verbatim: false },\n sub: { open: '\\\\textsubscript{', close: '}', verbatim: false },\n sup: { open: '\\\\textsuperscript{', close: '}', verbatim: false },\n nocase: { open: '{{', close: '}}', verbatim: false },\n smallcaps: { open: '\\\\textsc{', close: '}', verbatim: false },\n enquote: { open: '\\\\enquote{', close: '}', verbatim: false },\n math: { open: '$', close: '$', verbatim: false },\n url: { open: '\\\\url{', close: '}', verbatim: true },\n};\n","/*\n * character.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n// Maps unicode characters to their latex equivalent.\n// Generated from:\n// https://www.w3.org/2003/entities/2007xml/unicode.xml\n// and\n// http://www.w3.org/Math/characters/unicode.xml\n//\n// When both xml files contained entries for a unicode character,\n// the definition provided by entities/2007xml was preferred\nexport interface CharacterMap {\n id: string;\n decimal: number;\n character: string;\n latex: string;\n ungrouped?: boolean;\n}\n\nconst characters: { [key: number]: CharacterMap } = {\n 34: { id: 'U00022', decimal: 34, character: '\"', latex: '\"' },\n 35: { id: 'U00023', decimal: 35, character: '#', latex: '\\\\#' },\n 36: { id: 'U00024', decimal: 36, character: '$', latex: '\\\\$' },\n 94: { id: 'U0005e', decimal: 94, character: '^', latex: '\\\\textasciicircum' },\n 95: { id: 'U0005f', decimal: 95, character: '_', latex: '\\\\_' },\n 123: { id: 'U0007b', decimal: 123, character: '{', latex: '\\\\textbraceleft' },\n 125: { id: 'U0007d', decimal: 125, character: '}', latex: '\\\\textbraceright' },\n 256: {\n id: 'U00100',\n decimal: 256,\n character: 'Ā',\n latex: '\\\\={A}',\n },\n 257: {\n id: 'U00101',\n decimal: 257,\n character: 'ā',\n latex: '\\\\={a}',\n },\n 258: {\n id: 'U00102',\n decimal: 258,\n character: 'Ă',\n latex: '\\\\u{A}',\n },\n 259: {\n id: 'U00103',\n decimal: 259,\n character: 'ă',\n latex: '\\\\u{a}',\n },\n 260: {\n id: 'U00104',\n decimal: 260,\n character: 'Ą',\n latex: '\\\\k{A}',\n },\n 261: {\n id: 'U00105',\n decimal: 261,\n character: 'ą',\n latex: '\\\\k{a}',\n },\n 262: {\n id: 'U00106',\n decimal: 262,\n character: 'Ć',\n latex: \"\\\\'{C}\",\n },\n 263: {\n id: 'U00107',\n decimal: 263,\n character: 'ć',\n latex: \"\\\\'{c}\",\n },\n 264: {\n id: 'U00108',\n decimal: 264,\n character: 'Ĉ',\n latex: '\\\\^{C}',\n },\n 265: {\n id: 'U00109',\n decimal: 265,\n character: 'ĉ',\n latex: '\\\\^{c}',\n },\n 266: {\n id: 'U0010A',\n decimal: 266,\n character: 'Ċ',\n latex: '\\\\.{C}',\n },\n 267: {\n id: 'U0010B',\n decimal: 267,\n character: 'ċ',\n latex: '\\\\.{c}',\n },\n 268: {\n id: 'U0010C',\n decimal: 268,\n character: 'Č',\n latex: '\\\\v{C}',\n },\n 269: {\n id: 'U0010D',\n decimal: 269,\n character: 'č',\n latex: '\\\\v{c}',\n },\n 270: {\n id: 'U0010E',\n decimal: 270,\n character: 'Ď',\n latex: '\\\\v{D}',\n },\n 271: {\n id: 'U0010F',\n decimal: 271,\n character: 'ď',\n latex: '\\\\v{d}',\n },\n 272: {\n id: 'U00110',\n decimal: 272,\n character: 'Đ',\n latex: '\\\\DJ',\n },\n 273: {\n id: 'U00111',\n decimal: 273,\n character: 'đ',\n latex: '\\\\dj',\n },\n 274: {\n id: 'U00112',\n decimal: 274,\n character: 'Ē',\n latex: '\\\\={E}',\n },\n 275: {\n id: 'U00113',\n decimal: 275,\n character: 'ē',\n latex: '\\\\={e}',\n },\n 276: {\n id: 'U00114',\n decimal: 276,\n character: 'Ĕ',\n latex: '\\\\u{E}',\n },\n 277: {\n id: 'U00115',\n decimal: 277,\n character: 'ĕ',\n latex: '\\\\u{e}',\n },\n 278: {\n id: 'U00116',\n decimal: 278,\n character: 'Ė',\n latex: '\\\\.{E}',\n },\n 279: {\n id: 'U00117',\n decimal: 279,\n character: 'ė',\n latex: '\\\\.{e}',\n },\n 280: {\n id: 'U00118',\n decimal: 280,\n character: 'Ę',\n latex: '\\\\k{E}',\n },\n 281: {\n id: 'U00119',\n decimal: 281,\n character: 'ę',\n latex: '\\\\k{e}',\n },\n 282: {\n id: 'U0011A',\n decimal: 282,\n character: 'Ě',\n latex: '\\\\v{E}',\n },\n 283: {\n id: 'U0011B',\n decimal: 283,\n character: 'ě',\n latex: '\\\\v{e}',\n },\n 284: {\n id: 'U0011C',\n decimal: 284,\n character: 'Ĝ',\n latex: '\\\\^{G}',\n },\n 285: {\n id: 'U0011D',\n decimal: 285,\n character: 'ĝ',\n latex: '\\\\^{g}',\n },\n 286: {\n id: 'U0011E',\n decimal: 286,\n character: 'Ğ',\n latex: '\\\\u{G}',\n },\n 287: {\n id: 'U0011F',\n decimal: 287,\n character: 'ğ',\n latex: '\\\\u{g}',\n },\n 288: {\n id: 'U00120',\n decimal: 288,\n character: 'Ġ',\n latex: '\\\\.{G}',\n },\n 289: {\n id: 'U00121',\n decimal: 289,\n character: 'ġ',\n latex: '\\\\.{g}',\n },\n 290: {\n id: 'U00122',\n decimal: 290,\n character: 'Ģ',\n latex: '\\\\c{G}',\n },\n 291: {\n id: 'U00123',\n decimal: 291,\n character: 'ģ',\n latex: '\\\\c{g}',\n },\n 292: {\n id: 'U00124',\n decimal: 292,\n character: 'Ĥ',\n latex: '\\\\^{H}',\n },\n 293: {\n id: 'U00125',\n decimal: 293,\n character: 'ĥ',\n latex: '\\\\^{h}',\n },\n 296: {\n id: 'U00128',\n decimal: 296,\n character: 'Ĩ',\n latex: '\\\\~{I}',\n },\n 297: {\n id: 'U00129',\n decimal: 297,\n character: 'ĩ',\n latex: '\\\\~{\\\\i}',\n },\n 298: {\n id: 'U0012A',\n decimal: 298,\n character: 'Ī',\n latex: '\\\\={I}',\n },\n 299: {\n id: 'U0012B',\n decimal: 299,\n character: 'ī',\n latex: '\\\\={\\\\i}',\n },\n 300: {\n id: 'U0012C',\n decimal: 300,\n character: 'Ĭ',\n latex: '\\\\u{I}',\n },\n 301: {\n id: 'U0012D',\n decimal: 301,\n character: 'ĭ',\n latex: '\\\\u{\\\\i}',\n },\n 302: {\n id: 'U0012E',\n decimal: 302,\n character: 'Į',\n latex: '\\\\k{I}',\n },\n 303: {\n id: 'U0012F',\n decimal: 303,\n character: 'į',\n latex: '\\\\k{i}',\n },\n 304: {\n id: 'U00130',\n decimal: 304,\n character: 'İ',\n latex: '\\\\.{I}',\n },\n 305: {\n id: 'U00131',\n decimal: 305,\n character: 'ı',\n latex: '\\\\i',\n },\n 306: {\n id: 'U00132',\n decimal: 306,\n character: 'IJ',\n latex: 'IJ',\n },\n 307: {\n id: 'U00133',\n decimal: 307,\n character: 'ij',\n latex: 'ij',\n },\n 308: {\n id: 'U00134',\n decimal: 308,\n character: 'Ĵ',\n latex: '\\\\^{J}',\n },\n 309: {\n id: 'U00135',\n decimal: 309,\n character: 'ĵ',\n latex: '\\\\^{\\\\j}',\n },\n 310: {\n id: 'U00136',\n decimal: 310,\n character: 'Ķ',\n latex: '\\\\c{K}',\n },\n 311: {\n id: 'U00137',\n decimal: 311,\n character: 'ķ',\n latex: '\\\\c{k}',\n },\n 313: {\n id: 'U00139',\n decimal: 313,\n character: 'Ĺ',\n latex: \"\\\\'{L}\",\n },\n 314: {\n id: 'U0013A',\n decimal: 314,\n character: 'ĺ',\n latex: \"\\\\'{l}\",\n },\n 315: {\n id: 'U0013B',\n decimal: 315,\n character: 'Ļ',\n latex: '\\\\c{L}',\n },\n 316: {\n id: 'U0013C',\n decimal: 316,\n character: 'ļ',\n latex: '\\\\c{l}',\n },\n 317: {\n id: 'U0013D',\n decimal: 317,\n character: 'Ľ',\n latex: '\\\\v{L}',\n },\n 318: {\n id: 'U0013E',\n decimal: 318,\n character: 'ľ',\n latex: '\\\\v{l}',\n },\n 321: {\n id: 'U00141',\n decimal: 321,\n character: 'Ł',\n latex: '\\\\L',\n },\n 322: {\n id: 'U00142',\n decimal: 322,\n character: 'ł',\n latex: '\\\\l',\n },\n 323: {\n id: 'U00143',\n decimal: 323,\n character: 'Ń',\n latex: \"\\\\'{N}\",\n },\n 324: {\n id: 'U00144',\n decimal: 324,\n character: 'ń',\n latex: \"\\\\'{n}\",\n },\n 325: {\n id: 'U00145',\n decimal: 325,\n character: 'Ņ',\n latex: '\\\\c{N}',\n },\n 326: {\n id: 'U00146',\n decimal: 326,\n character: 'ņ',\n latex: '\\\\c{n}',\n },\n 327: {\n id: 'U00147',\n decimal: 327,\n character: 'Ň',\n latex: '\\\\v{N}',\n },\n 328: {\n id: 'U00148',\n decimal: 328,\n character: 'ň',\n latex: '\\\\v{n}',\n },\n 329: {\n id: 'U00149',\n decimal: 329,\n character: 'ʼn',\n latex: \"'n\",\n },\n 330: {\n id: 'U0014A',\n decimal: 330,\n character: 'Ŋ',\n latex: '\\\\NG',\n },\n 331: {\n id: 'U0014B',\n decimal: 331,\n character: 'ŋ',\n latex: '\\\\ng',\n },\n 332: {\n id: 'U0014C',\n decimal: 332,\n character: 'Ō',\n latex: '\\\\={O}',\n },\n 333: {\n id: 'U0014D',\n decimal: 333,\n character: 'ō',\n latex: '\\\\={o}',\n },\n 334: {\n id: 'U0014E',\n decimal: 334,\n character: 'Ŏ',\n latex: '\\\\u{O}',\n },\n 335: {\n id: 'U0014F',\n decimal: 335,\n character: 'ŏ',\n latex: '\\\\u{o}',\n },\n 336: {\n id: 'U00150',\n decimal: 336,\n character: 'Ő',\n latex: '{\\\\H O}',\n },\n 337: {\n id: 'U00151',\n decimal: 337,\n character: 'ő',\n latex: '{\\\\H o}',\n },\n 338: {\n id: 'U00152',\n decimal: 338,\n character: 'Œ',\n latex: '\\\\OE',\n },\n 339: {\n id: 'U00153',\n decimal: 339,\n character: 'œ',\n latex: '\\\\oe',\n },\n 340: {\n id: 'U00154',\n decimal: 340,\n character: 'Ŕ',\n latex: \"\\\\'{R}\",\n },\n 341: {\n id: 'U00155',\n decimal: 341,\n character: 'ŕ',\n latex: \"\\\\'{r}\",\n },\n 342: {\n id: 'U00156',\n decimal: 342,\n character: 'Ŗ',\n latex: '\\\\c{R}',\n },\n 343: {\n id: 'U00157',\n decimal: 343,\n character: 'ŗ',\n latex: '\\\\c{r}',\n },\n 344: {\n id: 'U00158',\n decimal: 344,\n character: 'Ř',\n latex: '\\\\v{R}',\n },\n 345: {\n id: 'U00159',\n decimal: 345,\n character: 'ř',\n latex: '\\\\v{r}',\n },\n 346: {\n id: 'U0015A',\n decimal: 346,\n character: 'Ś',\n latex: \"\\\\'{S}\",\n },\n 347: {\n id: 'U0015B',\n decimal: 347,\n character: 'ś',\n latex: \"\\\\'{s}\",\n },\n 348: {\n id: 'U0015C',\n decimal: 348,\n character: 'Ŝ',\n latex: '\\\\^{S}',\n },\n 349: {\n id: 'U0015D',\n decimal: 349,\n character: 'ŝ',\n latex: '\\\\^{s}',\n },\n 350: {\n id: 'U0015E',\n decimal: 350,\n character: 'Ş',\n latex: '\\\\c{S}',\n },\n 351: {\n id: 'U0015F',\n decimal: 351,\n character: 'ş',\n latex: '\\\\c{s}',\n },\n 352: {\n id: 'U00160',\n decimal: 352,\n character: 'Š',\n latex: '\\\\v{S}',\n },\n 353: {\n id: 'U00161',\n decimal: 353,\n character: 'š',\n latex: '\\\\v{s}',\n },\n 354: {\n id: 'U00162',\n decimal: 354,\n character: 'Ţ',\n latex: '\\\\c{T}',\n },\n 355: {\n id: 'U00163',\n decimal: 355,\n character: 'ţ',\n latex: '\\\\c{t}',\n },\n 356: {\n id: 'U00164',\n decimal: 356,\n character: 'Ť',\n latex: '\\\\v{T}',\n },\n 357: {\n id: 'U00165',\n decimal: 357,\n character: 'ť',\n latex: '\\\\v{t}',\n },\n 360: {\n id: 'U00168',\n decimal: 360,\n character: 'Ũ',\n latex: '\\\\~{U}',\n },\n 361: {\n id: 'U00169',\n decimal: 361,\n character: 'ũ',\n latex: '\\\\~{u}',\n },\n 362: {\n id: 'U0016A',\n decimal: 362,\n character: 'Ū',\n latex: '\\\\={U}',\n },\n 363: {\n id: 'U0016B',\n decimal: 363,\n character: 'ū',\n latex: '\\\\={u}',\n },\n 364: {\n id: 'U0016C',\n decimal: 364,\n character: 'Ŭ',\n latex: '\\\\u{U}',\n },\n 365: {\n id: 'U0016D',\n decimal: 365,\n character: 'ŭ',\n latex: '\\\\u{u}',\n },\n 366: {\n id: 'U0016E',\n decimal: 366,\n character: 'Ů',\n latex: '\\\\r{U}',\n },\n 367: {\n id: 'U0016F',\n decimal: 367,\n character: 'ů',\n latex: '\\\\r{u}',\n },\n 368: {\n id: 'U00170',\n decimal: 368,\n character: 'Ű',\n latex: '{\\\\H U}',\n },\n 369: {\n id: 'U00171',\n decimal: 369,\n character: 'ű',\n latex: '{\\\\H u}',\n },\n 370: {\n id: 'U00172',\n decimal: 370,\n character: 'Ų',\n latex: '\\\\k{U}',\n },\n 371: {\n id: 'U00173',\n decimal: 371,\n character: 'ų',\n latex: '\\\\k{u}',\n },\n 372: {\n id: 'U00174',\n decimal: 372,\n character: 'Ŵ',\n latex: '\\\\^{W}',\n },\n 373: {\n id: 'U00175',\n decimal: 373,\n character: 'ŵ',\n latex: '\\\\^{w}',\n },\n 374: {\n id: 'U00176',\n decimal: 374,\n character: 'Ŷ',\n latex: '\\\\^{Y}',\n },\n 375: {\n id: 'U00177',\n decimal: 375,\n character: 'ŷ',\n latex: '\\\\^{y}',\n },\n 376: {\n id: 'U00178',\n decimal: 376,\n character: 'Ÿ',\n latex: '\\\\\"{Y}',\n },\n 377: {\n id: 'U00179',\n decimal: 377,\n character: 'Ź',\n latex: \"\\\\'{Z}\",\n },\n 378: {\n id: 'U0017A',\n decimal: 378,\n character: 'ź',\n latex: \"\\\\'{z}\",\n },\n 379: {\n id: 'U0017B',\n decimal: 379,\n character: 'Ż',\n latex: '\\\\.{Z}',\n },\n 380: {\n id: 'U0017C',\n decimal: 380,\n character: 'ż',\n latex: '\\\\.{z}',\n },\n 381: {\n id: 'U0017D',\n decimal: 381,\n character: 'Ž',\n latex: '\\\\v{Z}',\n },\n 382: {\n id: 'U0017E',\n decimal: 382,\n character: 'ž',\n latex: '\\\\v{z}',\n },\n 402: {\n id: 'U00192',\n decimal: 402,\n character: 'ƒ',\n latex: '\\\\textflorin',\n },\n 501: {\n id: 'U001F5',\n decimal: 501,\n character: 'ǵ',\n latex: \"\\\\'{g}\",\n },\n 609: {\n id: 'U00261',\n decimal: 609,\n character: 'ɡ',\n latex: 'g',\n },\n 700: {\n id: 'U002BC',\n decimal: 700,\n character: 'ʼ',\n latex: \"'\",\n },\n 711: {\n id: 'U002C7',\n decimal: 711,\n character: 'ˇ',\n latex: '\\\\textasciicaron',\n },\n 714: {\n id: 'U002ca',\n decimal: 714,\n character: 'ˊ',\n latex: '\\\\textasciitilde',\n },\n 728: {\n id: 'U002D8',\n decimal: 728,\n character: '˘',\n latex: '\\\\textasciibreve',\n },\n 729: {\n id: 'U002D9',\n decimal: 729,\n character: '˙',\n latex: '\\\\textperiodcentered',\n },\n 730: {\n id: 'U002DA',\n decimal: 730,\n character: '˚',\n latex: '\\\\r{}',\n },\n 731: {\n id: 'U002DB',\n decimal: 731,\n character: '˛',\n latex: '\\\\k{}',\n },\n 732: {\n id: 'U002DC',\n decimal: 732,\n character: '˜',\n latex: '\\\\texttildelow',\n },\n 733: {\n id: 'U002dd',\n decimal: 733,\n character: '˝',\n latex: '\\\\textacutedbl',\n },\n 768: {\n id: 'U00300',\n decimal: 768,\n character: '̀',\n latex: '\\\\`',\n ungrouped: true,\n },\n 769: {\n id: 'U00301',\n decimal: 769,\n character: '́',\n latex: \"\\\\'\",\n ungrouped: true,\n },\n 770: {\n id: 'U00302',\n decimal: 770,\n character: '̂',\n latex: '\\\\^',\n ungrouped: true,\n },\n 771: {\n id: 'U00303',\n decimal: 771,\n character: '̃',\n latex: '\\\\~',\n ungrouped: true,\n },\n 772: {\n id: 'U00304',\n decimal: 772,\n character: '̄',\n latex: '\\\\=',\n ungrouped: true,\n },\n 774: {\n id: 'U00306',\n decimal: 774,\n character: '̆',\n latex: '\\\\u',\n ungrouped: true,\n },\n 775: {\n id: 'U00307',\n decimal: 775,\n character: '̇',\n latex: '\\\\.',\n ungrouped: true,\n },\n 776: {\n id: 'U00308',\n decimal: 776,\n character: '̈',\n latex: '\\\\\"',\n ungrouped: true,\n },\n 778: {\n id: 'U0030A',\n decimal: 778,\n character: '̊',\n latex: '\\\\r',\n ungrouped: true,\n },\n 780: {\n id: 'U0030C',\n decimal: 780,\n character: '̌',\n latex: '\\\\v',\n ungrouped: true,\n },\n 807: {\n id: 'U00327',\n decimal: 807,\n character: '̧',\n latex: '\\\\c',\n ungrouped: true,\n },\n 808: {\n id: 'U00328',\n decimal: 808,\n character: '̨',\n latex: '\\\\k',\n ungrouped: true,\n },\n 902: {\n id: 'U00386',\n decimal: 902,\n character: 'Ά',\n latex: \"\\\\'{A}\",\n },\n 904: {\n id: 'U00388',\n decimal: 904,\n character: 'Έ',\n latex: \"\\\\'{E}\",\n },\n 905: {\n id: 'U00389',\n decimal: 905,\n character: 'Ή',\n latex: \"\\\\'{H}\",\n },\n 906: {\n id: 'U0038A',\n decimal: 906,\n character: 'Ί',\n latex: \"\\\\'{}{I}\",\n },\n 908: {\n id: 'U0038C',\n decimal: 908,\n character: 'Ό',\n latex: \"\\\\'{}O\",\n },\n 910: {\n id: 'U0038E',\n decimal: 910,\n character: 'Ύ',\n latex: \"$\\\\mathrm{'Y}$\",\n },\n 911: {\n id: 'U0038F',\n decimal: 911,\n character: 'Ώ',\n latex: \"$\\\\mathrm{'\\\\Omega}$\",\n },\n 924: {\n id: 'U0039C',\n decimal: 924,\n character: 'Μ',\n latex: 'M',\n },\n 925: {\n id: 'U0039D',\n decimal: 925,\n character: 'Ν',\n latex: 'N',\n },\n 927: {\n id: 'U0039F',\n decimal: 927,\n character: 'Ο',\n latex: 'O',\n },\n 938: {\n id: 'U003AA',\n decimal: 938,\n character: 'Ϊ',\n latex: '$\\\\mathrm{\\\\ddot{I}}$',\n },\n 939: {\n id: 'U003AB',\n decimal: 939,\n character: 'Ϋ',\n latex: '$\\\\mathrm{\\\\ddot{Y}}$',\n },\n 940: {\n id: 'U003AC',\n decimal: 940,\n character: 'ά',\n latex: \"\\\\'{$\\\\alpha$}\",\n },\n 959: {\n id: 'U003BF',\n decimal: 959,\n character: 'ο',\n latex: 'o',\n },\n 972: {\n id: 'U003CC',\n decimal: 972,\n character: 'ό',\n latex: \"\\\\'{o}\",\n },\n 8194: {\n id: 'U02002',\n decimal: 8194,\n character: ' ',\n latex: '\\\\hspace{0.6em}',\n },\n 8195: {\n id: 'U02003',\n decimal: 8195,\n character: ' ',\n latex: '\\\\hspace{1em}',\n },\n 8196: {\n id: 'U02004',\n decimal: 8196,\n character: ' ',\n latex: '\\\\hspace{0.33em}',\n },\n 8197: {\n id: 'U02005',\n decimal: 8197,\n character: ' ',\n latex: '\\\\hspace{0.25em}',\n },\n 8198: {\n id: 'U02006',\n decimal: 8198,\n character: ' ',\n latex: '\\\\hspace{0.166em}',\n },\n 8199: {\n id: 'U02007',\n decimal: 8199,\n character: ' ',\n latex: '\\\\hphantom{0}',\n },\n 8200: {\n id: 'U02008',\n decimal: 8200,\n character: ' ',\n latex: '\\\\hphantom{,}',\n },\n 8201: {\n id: 'U02009',\n decimal: 8201,\n character: ' ',\n latex: '\\\\hspace{0.167em}',\n },\n 8204: {\n id: 'U00200c',\n decimal: 8204,\n character: '',\n latex: '\\\\textcompwordmark',\n },\n 8208: {\n id: 'U02010',\n decimal: 8208,\n character: '‐',\n latex: '-',\n },\n 8209: {\n id: 'U2011',\n decimal: 8209,\n character: '‑',\n latex: '\\\\nobreakdash-'\n },\n 8211: {\n id: 'U02013',\n decimal: 8211,\n character: '–',\n latex: '\\\\textendash',\n },\n 8212: {\n id: 'U02014',\n decimal: 8212,\n character: '—',\n latex: '\\\\textemdash',\n },\n 8213: {\n id: 'U02015',\n decimal: 8213,\n character: '―',\n latex: '\\\\rule{1em}{1pt}',\n },\n 8216: {\n id: 'U02018',\n decimal: 8216,\n character: '‘',\n latex: '\\\\textquoteleft',\n },\n 8217: {\n id: 'U02019',\n decimal: 8217,\n character: '’',\n latex: '\\\\textquoteright',\n },\n 8218: {\n id: 'U0201A',\n decimal: 8218,\n character: '‚',\n latex: ',',\n },\n 8220: {\n id: 'U0201C',\n decimal: 8220,\n character: '“',\n latex: '\\\\textquotedblleft',\n },\n 8221: {\n id: 'U0201D',\n decimal: 8221,\n character: '”',\n latex: '\\\\textquotedblright',\n },\n 8222: {\n id: 'U0201E',\n decimal: 8222,\n character: '„',\n latex: ',,',\n },\n 8224: {\n id: 'U02020',\n decimal: 8224,\n character: '†',\n latex: '\\\\textdagger',\n },\n 8225: {\n id: 'U02021',\n decimal: 8225,\n character: '‡',\n latex: '\\\\textdaggerdbl',\n },\n 8226: {\n id: 'U02022',\n decimal: 8226,\n character: '•',\n latex: '\\\\textbullet',\n },\n 8228: {\n id: 'U02024',\n decimal: 8228,\n character: '․',\n latex: '.',\n },\n 8229: {\n id: 'U02025',\n decimal: 8229,\n character: '‥',\n latex: '..',\n },\n 8230: {\n id: 'U02026',\n decimal: 8230,\n character: '…',\n latex: '\\\\ldots',\n },\n 8240: {\n id: 'U02030',\n decimal: 8240,\n character: '‰',\n latex: '\\\\textperthousand',\n },\n 8241: {\n id: 'U02031',\n decimal: 8241,\n character: '‱',\n latex: '\\\\textpertenthousand',\n },\n 8242: {\n id: 'U02032',\n decimal: 8242,\n character: '′',\n latex: \"{'}\",\n },\n 8243: {\n id: 'U02033',\n decimal: 8243,\n character: '″',\n latex: \"{''}\",\n },\n 8244: {\n id: 'U02034',\n decimal: 8244,\n character: '‴',\n latex: \"{'''}\",\n },\n 8249: {\n id: 'U02039',\n decimal: 8249,\n character: '‹',\n latex: '\\\\guilsinglleft',\n },\n 8250: {\n id: 'U0203A',\n decimal: 8250,\n character: '›',\n latex: '\\\\guilsinglright',\n },\n 8279: {\n id: 'U02057',\n decimal: 8279,\n character: '⁗',\n latex: \"''''\",\n },\n 8288: {\n id: 'U02060',\n decimal: 8288,\n character: '',\n latex: '\\\\nolinebreak',\n },\n 8364: {\n id: 'U020AC',\n decimal: 8364,\n character: '€',\n latex: '\\\\mbox{\\\\texteuro}',\n },\n 8450: {\n id: 'U02102',\n decimal: 8450,\n character: 'ℂ',\n latex: '$\\\\mathbb{C}$',\n },\n 8460: {\n id: 'U0210C',\n decimal: 8460,\n character: 'ℌ',\n latex: '$\\\\mathfrak{H}$',\n },\n 8461: {\n id: 'U0210D',\n decimal: 8461,\n character: 'ℍ',\n latex: '$\\\\mathbb{H}$',\n },\n 8465: {\n id: 'U02111',\n decimal: 8465,\n character: 'ℑ',\n latex: '$\\\\mathfrak{I}$',\n },\n 8469: {\n id: 'U02115',\n decimal: 8469,\n character: 'ℕ',\n latex: '$\\\\mathbb{N}$',\n },\n 8473: {\n id: 'U02119',\n decimal: 8473,\n character: 'ℙ',\n latex: '$\\\\mathbb{P}$',\n },\n 8474: {\n id: 'U0211A',\n decimal: 8474,\n character: 'ℚ',\n latex: '$\\\\mathbb{Q}$',\n },\n 8476: {\n id: 'U0211C',\n decimal: 8476,\n character: 'ℜ',\n latex: '$\\\\mathfrak{R}$',\n },\n 8477: {\n id: 'U0211D',\n decimal: 8477,\n character: 'ℝ',\n latex: '$\\\\mathbb{R}$',\n },\n 8482: {\n id: 'U02122',\n decimal: 8482,\n character: '™',\n latex: '\\\\texttrademark',\n },\n 8484: {\n id: 'U02124',\n decimal: 8484,\n character: 'ℤ',\n latex: '$\\\\mathbb{Z}$',\n },\n 8488: {\n id: 'U02128',\n decimal: 8488,\n character: 'ℨ',\n latex: '$\\\\mathfrak{Z}$',\n },\n 8491: {\n id: 'U0212B',\n decimal: 8491,\n character: 'Å',\n latex: '\\\\AA',\n },\n 8493: {\n id: 'U0212D',\n decimal: 8493,\n character: 'ℭ',\n latex: '$\\\\mathfrak{C}$',\n },\n 8722: {\n id: 'U02212',\n decimal: 8722,\n character: '−',\n latex: '-',\n },\n 8762: {\n id: 'U0223A',\n decimal: 8762,\n character: '∺',\n latex: '$\\\\mathbin{{:}\\\\!\\\\!{-}\\\\!\\\\!{:}}$',\n },\n 8788: {\n id: 'U02254',\n decimal: 8788,\n character: '≔',\n latex: ':=',\n },\n 8789: {\n id: 'U02255',\n decimal: 8789,\n character: '≕',\n latex: '=:',\n },\n 8942: {\n id: 'U022EE',\n decimal: 8942,\n character: '⋮',\n latex: '\\\\vdots',\n },\n 8982: {\n id: 'U02316',\n decimal: 8982,\n character: '⌖',\n latex: '$\\\\mathchar\"2208$',\n },\n 9251: {\n id: 'U02423',\n decimal: 9251,\n character: '␣',\n latex: '\\\\textvisiblespace',\n },\n 9645: {\n id: 'U025AD',\n decimal: 9645,\n character: '▭',\n latex: '\\\\fbox{~~}',\n },\n 11005: {\n id: 'U02AFD-020E5',\n decimal: 11005,\n character: '⫽',\n latex: '{\\\\rlap{\\\\textbackslash}{{/}\\\\!\\\\!{/}}}',\n },\n 64256: {\n id: 'U0FB00',\n decimal: 64256,\n character: 'ff',\n latex: 'ff',\n },\n 64257: {\n id: 'U0FB01',\n decimal: 64257,\n character: 'fi',\n latex: 'fi',\n },\n 64258: {\n id: 'U0FB02',\n decimal: 64258,\n character: 'fl',\n latex: 'fl',\n },\n 64259: {\n id: 'U0FB03',\n decimal: 64259,\n character: 'ffi',\n latex: 'ffi',\n },\n 64260: {\n id: 'U0FB04',\n decimal: 64260,\n character: 'ffl',\n latex: 'ffl',\n },\n 119808: {\n id: 'U1D400',\n decimal: 119808,\n character: '퐀',\n latex: '$\\\\mathbf{A}$',\n },\n 119809: {\n id: 'U1D401',\n decimal: 119809,\n character: '퐁',\n latex: '$\\\\mathbf{B}$',\n },\n 119810: {\n id: 'U1D402',\n decimal: 119810,\n character: '퐂',\n latex: '$\\\\mathbf{C}$',\n },\n 119811: {\n id: 'U1D403',\n decimal: 119811,\n character: '퐃',\n latex: '$\\\\mathbf{D}$',\n },\n 119812: {\n id: 'U1D404',\n decimal: 119812,\n character: '퐄',\n latex: '$\\\\mathbf{E}$',\n },\n 119813: {\n id: 'U1D405',\n decimal: 119813,\n character: '퐅',\n latex: '{$\\\\mathbf{F}$}',\n },\n 119814: {\n id: 'U1D406',\n decimal: 119814,\n character: '퐆',\n latex: '$\\\\mathbf{G}$',\n },\n 119815: {\n id: 'U1D407',\n decimal: 119815,\n character: '퐇',\n latex: '$\\\\mathbf{H}$',\n },\n 119816: {\n id: 'U1D408',\n decimal: 119816,\n character: '퐈',\n latex: '$\\\\mathbf{I}$',\n },\n 119817: {\n id: 'U1D409',\n decimal: 119817,\n character: '퐉',\n latex: '$\\\\mathbf{J}$',\n },\n 119818: {\n id: 'U1D40A',\n decimal: 119818,\n character: '퐊',\n latex: '$\\\\mathbf{K}$',\n },\n 119819: {\n id: 'U1D40B',\n decimal: 119819,\n character: '퐋',\n latex: '$\\\\mathbf{L}$',\n },\n 119820: {\n id: 'U1D40C',\n decimal: 119820,\n character: '퐌',\n latex: '$\\\\mathbf{M}$',\n },\n 119821: {\n id: 'U1D40D',\n decimal: 119821,\n character: '퐍',\n latex: '$\\\\mathbf{N}$',\n },\n 119822: {\n id: 'U1D40E',\n decimal: 119822,\n character: '퐎',\n latex: '$\\\\mathbf{O}$',\n },\n 119823: {\n id: 'U1D40F',\n decimal: 119823,\n character: '퐏',\n latex: '$\\\\mathbf{P}$',\n },\n 119824: {\n id: 'U1D410',\n decimal: 119824,\n character: '퐐',\n latex: '$\\\\mathbf{Q}$',\n },\n 119825: {\n id: 'U1D411',\n decimal: 119825,\n character: '퐑',\n latex: '$\\\\mathbf{R}$',\n },\n 119826: {\n id: 'U1D412',\n decimal: 119826,\n character: '퐒',\n latex: '$\\\\mathbf{S}$',\n },\n 119827: {\n id: 'U1D413',\n decimal: 119827,\n character: '퐓',\n latex: '$\\\\mathbf{T}$',\n },\n 119828: {\n id: 'U1D414',\n decimal: 119828,\n character: '퐔',\n latex: '$\\\\mathbf{U}$',\n },\n 119829: {\n id: 'U1D415',\n decimal: 119829,\n character: '퐕',\n latex: '$\\\\mathbf{V}$',\n },\n 119830: {\n id: 'U1D416',\n decimal: 119830,\n character: '퐖',\n latex: '$\\\\mathbf{W}$',\n },\n 119831: {\n id: 'U1D417',\n decimal: 119831,\n character: '퐗',\n latex: '$\\\\mathbf{X}$',\n },\n 119832: {\n id: 'U1D418',\n decimal: 119832,\n character: '퐘',\n latex: '$\\\\mathbf{Y}$',\n },\n 119833: {\n id: 'U1D419',\n decimal: 119833,\n character: '퐙',\n latex: '$\\\\mathbf{Z}$',\n },\n 119834: {\n id: 'U1D41A',\n decimal: 119834,\n character: '퐚',\n latex: '$\\\\mathbf{a}$',\n },\n 119835: {\n id: 'U1D41B',\n decimal: 119835,\n character: '퐛',\n latex: '$\\\\mathbf{b}$',\n },\n 119836: {\n id: 'U1D41C',\n decimal: 119836,\n character: '퐜',\n latex: '$\\\\mathbf{c}$',\n },\n 119837: {\n id: 'U1D41D',\n decimal: 119837,\n character: '퐝',\n latex: '$\\\\mathbf{d}$',\n },\n 119838: {\n id: 'U1D41E',\n decimal: 119838,\n character: '퐞',\n latex: '$\\\\mathbf{e}$',\n },\n 119839: {\n id: 'U1D41F',\n decimal: 119839,\n character: '퐟',\n latex: '{$\\\\mathbf{f}$}',\n },\n 119840: {\n id: 'U1D420',\n decimal: 119840,\n character: '퐠',\n latex: '$\\\\mathbf{g}$',\n },\n 119841: {\n id: 'U1D421',\n decimal: 119841,\n character: '퐡',\n latex: '$\\\\mathbf{h}$',\n },\n 119842: {\n id: 'U1D422',\n decimal: 119842,\n character: '퐢',\n latex: '$\\\\mathbf{i}$',\n },\n 119843: {\n id: 'U1D423',\n decimal: 119843,\n character: '퐣',\n latex: '$\\\\mathbf{j}$',\n },\n 119844: {\n id: 'U1D424',\n decimal: 119844,\n character: '퐤',\n latex: '$\\\\mathbf{k}$',\n },\n 119845: {\n id: 'U1D425',\n decimal: 119845,\n character: '퐥',\n latex: '$\\\\mathbf{l}$',\n },\n 119846: {\n id: 'U1D426',\n decimal: 119846,\n character: '퐦',\n latex: '$\\\\mathbf{m}$',\n },\n 119847: {\n id: 'U1D427',\n decimal: 119847,\n character: '퐧',\n latex: '$\\\\mathbf{n}$',\n },\n 119848: {\n id: 'U1D428',\n decimal: 119848,\n character: '퐨',\n latex: '$\\\\mathbf{o}$',\n },\n 119849: {\n id: 'U1D429',\n decimal: 119849,\n character: '퐩',\n latex: '$\\\\mathbf{p}$',\n },\n 119850: {\n id: 'U1D42A',\n decimal: 119850,\n character: '퐪',\n latex: '$\\\\mathbf{q}$',\n },\n 119851: {\n id: 'U1D42B',\n decimal: 119851,\n character: '퐫',\n latex: '$\\\\mathbf{r}$',\n },\n 119852: {\n id: 'U1D42C',\n decimal: 119852,\n character: '퐬',\n latex: '$\\\\mathbf{s}$',\n },\n 119853: {\n id: 'U1D42D',\n decimal: 119853,\n character: '퐭',\n latex: '$\\\\mathbf{t}$',\n },\n 119854: {\n id: 'U1D42E',\n decimal: 119854,\n character: '퐮',\n latex: '$\\\\mathbf{u}$',\n },\n 119855: {\n id: 'U1D42F',\n decimal: 119855,\n character: '퐯',\n latex: '$\\\\mathbf{v}$',\n },\n 119856: {\n id: 'U1D430',\n decimal: 119856,\n character: '퐰',\n latex: '$\\\\mathbf{w}$',\n },\n 119857: {\n id: 'U1D431',\n decimal: 119857,\n character: '퐱',\n latex: '$\\\\mathbf{x}$',\n },\n 119858: {\n id: 'U1D432',\n decimal: 119858,\n character: '퐲',\n latex: '$\\\\mathbf{y}$',\n },\n 119859: {\n id: 'U1D433',\n decimal: 119859,\n character: '퐳',\n latex: '$\\\\mathbf{z}$',\n },\n 120068: {\n id: 'U1D504',\n decimal: 120068,\n character: '프',\n latex: '$\\\\mathfrak{A}$',\n },\n 120069: {\n id: 'U1D505',\n decimal: 120069,\n character: '픅',\n latex: '$\\\\mathfrak{B}$',\n },\n 120071: {\n id: 'U1D507',\n decimal: 120071,\n character: '픇',\n latex: '$\\\\mathfrak{D}$',\n },\n 120072: {\n id: 'U1D508',\n decimal: 120072,\n character: '픈',\n latex: '$\\\\mathfrak{E}$',\n },\n 120073: {\n id: 'U1D509',\n decimal: 120073,\n character: '픉',\n latex: '$\\\\mathfrak{F}$',\n },\n 120074: {\n id: 'U1D50A',\n decimal: 120074,\n character: '픊',\n latex: '$\\\\mathfrak{G}$',\n },\n 120077: {\n id: 'U1D50D',\n decimal: 120077,\n character: '픍',\n latex: '$\\\\mathfrak{J}$',\n },\n 120078: {\n id: 'U1D50E',\n decimal: 120078,\n character: '픎',\n latex: '$\\\\mathfrak{K}$',\n },\n 120079: {\n id: 'U1D50F',\n decimal: 120079,\n character: '픏',\n latex: '$\\\\mathfrak{L}$',\n },\n 120080: {\n id: 'U1D510',\n decimal: 120080,\n character: '픐',\n latex: '$\\\\mathfrak{M}$',\n },\n 120081: {\n id: 'U1D511',\n decimal: 120081,\n character: '픑',\n latex: '$\\\\mathfrak{N}$',\n },\n 120082: {\n id: 'U1D512',\n decimal: 120082,\n character: '픒',\n latex: '$\\\\mathfrak{O}$',\n },\n 120083: {\n id: 'U1D513',\n decimal: 120083,\n character: '픓',\n latex: '$\\\\mathfrak{P}$',\n },\n 120084: {\n id: 'U1D514',\n decimal: 120084,\n character: '픔',\n latex: '$\\\\mathfrak{Q}$',\n },\n 120086: {\n id: 'U1D516',\n decimal: 120086,\n character: '픖',\n latex: '$\\\\mathfrak{S}$',\n },\n 120087: {\n id: 'U1D517',\n decimal: 120087,\n character: '픗',\n latex: '$\\\\mathfrak{T}$',\n },\n 120088: {\n id: 'U1D518',\n decimal: 120088,\n character: '픘',\n latex: '$\\\\mathfrak{U}$',\n },\n 120089: {\n id: 'U1D519',\n decimal: 120089,\n character: '픙',\n latex: '$\\\\mathfrak{V}$',\n },\n 120090: {\n id: 'U1D51A',\n decimal: 120090,\n character: '픚',\n latex: '$\\\\mathfrak{W}$',\n },\n 120091: {\n id: 'U1D51B',\n decimal: 120091,\n character: '픛',\n latex: '$\\\\mathfrak{X}$',\n },\n 120092: {\n id: 'U1D51C',\n decimal: 120092,\n character: '픜',\n latex: '$\\\\mathfrak{Y}$',\n },\n 120094: {\n id: 'U1D51E',\n decimal: 120094,\n character: '픞',\n latex: '$\\\\mathfrak{a}$',\n },\n 120095: {\n id: 'U1D51F',\n decimal: 120095,\n character: '픟',\n latex: '$\\\\mathfrak{b}$',\n },\n 120096: {\n id: 'U1D520',\n decimal: 120096,\n character: '픠',\n latex: '$\\\\mathfrak{c}$',\n },\n 120097: {\n id: 'U1D521',\n decimal: 120097,\n character: '픡',\n latex: '$\\\\mathfrak{d}$',\n },\n 120098: {\n id: 'U1D522',\n decimal: 120098,\n character: '픢',\n latex: '$\\\\mathfrak{e}$',\n },\n 120099: {\n id: 'U1D523',\n decimal: 120099,\n character: '픣',\n latex: '$\\\\mathfrak{f}$',\n },\n 120100: {\n id: 'U1D524',\n decimal: 120100,\n character: '픤',\n latex: '$\\\\mathfrak{g}$',\n },\n 120101: {\n id: 'U1D525',\n decimal: 120101,\n character: '픥',\n latex: '$\\\\mathfrak{h}$',\n },\n 120102: {\n id: 'U1D526',\n decimal: 120102,\n character: '픦',\n latex: '$\\\\mathfrak{i}$',\n },\n 120103: {\n id: 'U1D527',\n decimal: 120103,\n character: '픧',\n latex: '$\\\\mathfrak{j}$',\n },\n 120104: {\n id: 'U1D528',\n decimal: 120104,\n character: '픨',\n latex: '$\\\\mathfrak{k}$',\n },\n 120105: {\n id: 'U1D529',\n decimal: 120105,\n character: '픩',\n latex: '$\\\\mathfrak{l}$',\n },\n 120106: {\n id: 'U1D52A',\n decimal: 120106,\n character: '픪',\n latex: '$\\\\mathfrak{m}$',\n },\n 120107: {\n id: 'U1D52B',\n decimal: 120107,\n character: '픫',\n latex: '$\\\\mathfrak{n}$',\n },\n 120108: {\n id: 'U1D52C',\n decimal: 120108,\n character: '픬',\n latex: '$\\\\mathfrak{o}$',\n },\n 120109: {\n id: 'U1D52D',\n decimal: 120109,\n character: '픭',\n latex: '$\\\\mathfrak{p}$',\n },\n 120110: {\n id: 'U1D52E',\n decimal: 120110,\n character: '픮',\n latex: '$\\\\mathfrak{q}$',\n },\n 120111: {\n id: 'U1D52F',\n decimal: 120111,\n character: '픯',\n latex: '$\\\\mathfrak{r}$',\n },\n 120112: {\n id: 'U1D530',\n decimal: 120112,\n character: '픰',\n latex: '$\\\\mathfrak{s}$',\n },\n 120113: {\n id: 'U1D531',\n decimal: 120113,\n character: '픱',\n latex: '$\\\\mathfrak{t}$',\n },\n 120114: {\n id: 'U1D532',\n decimal: 120114,\n character: '픲',\n latex: '$\\\\mathfrak{u}$',\n },\n 120115: {\n id: 'U1D533',\n decimal: 120115,\n character: '픳',\n latex: '$\\\\mathfrak{v}$',\n },\n 120116: {\n id: 'U1D534',\n decimal: 120116,\n character: '픴',\n latex: '$\\\\mathfrak{w}$',\n },\n 120117: {\n id: 'U1D535',\n decimal: 120117,\n character: '픵',\n latex: '$\\\\mathfrak{x}$',\n },\n 120118: {\n id: 'U1D536',\n decimal: 120118,\n character: '픶',\n latex: '$\\\\mathfrak{y}$',\n },\n 120119: {\n id: 'U1D537',\n decimal: 120119,\n character: '픷',\n latex: '$\\\\mathfrak{z}$',\n },\n 120120: {\n id: 'U1D538',\n decimal: 120120,\n character: '픸',\n latex: '$\\\\mathbb{A}$',\n },\n 120121: {\n id: 'U1D539',\n decimal: 120121,\n character: '픹',\n latex: '$\\\\mathbb{B}$',\n },\n 120123: {\n id: 'U1D53B',\n decimal: 120123,\n character: '픻',\n latex: '$\\\\mathbb{D}$',\n },\n 120124: {\n id: 'U1D53C',\n decimal: 120124,\n character: '피',\n latex: '$\\\\mathbb{E}$',\n },\n 120125: {\n id: 'U1D53D',\n decimal: 120125,\n character: '픽',\n latex: '$\\\\mathbb{F}$',\n },\n 120126: {\n id: 'U1D53E',\n decimal: 120126,\n character: '픾',\n latex: '$\\\\mathbb{G}$',\n },\n 120128: {\n id: 'U1D540',\n decimal: 120128,\n character: '핀',\n latex: '$\\\\mathbb{I}$',\n },\n 120129: {\n id: 'U1D541',\n decimal: 120129,\n character: '핁',\n latex: '$\\\\mathbb{J}$',\n },\n 120130: {\n id: 'U1D542',\n decimal: 120130,\n character: '핂',\n latex: '$\\\\mathbb{K}$',\n },\n 120131: {\n id: 'U1D543',\n decimal: 120131,\n character: '핃',\n latex: '$\\\\mathbb{L}$',\n },\n 120132: {\n id: 'U1D544',\n decimal: 120132,\n character: '필',\n latex: '$\\\\mathbb{M}$',\n },\n 120134: {\n id: 'U1D546',\n decimal: 120134,\n character: '핆',\n latex: '$\\\\mathbb{O}$',\n },\n 120138: {\n id: 'U1D54A',\n decimal: 120138,\n character: '핊',\n latex: '$\\\\mathbb{S}$',\n },\n 120139: {\n id: 'U1D54B',\n decimal: 120139,\n character: '핋',\n latex: '$\\\\mathbb{T}$',\n },\n 120140: {\n id: 'U1D54C',\n decimal: 120140,\n character: '핌',\n latex: '$\\\\mathbb{U}$',\n },\n 120141: {\n id: 'U1D54D',\n decimal: 120141,\n character: '핍',\n latex: '$\\\\mathbb{V}$',\n },\n 120142: {\n id: 'U1D54E',\n decimal: 120142,\n character: '핎',\n latex: '$\\\\mathbb{W}$',\n },\n 120143: {\n id: 'U1D54F',\n decimal: 120143,\n character: '핏',\n latex: '$\\\\mathbb{X}$',\n },\n 120144: {\n id: 'U1D550',\n decimal: 120144,\n character: '핐',\n latex: '$\\\\mathbb{Y}$',\n },\n 120146: {\n id: 'U1D552',\n decimal: 120146,\n character: '핒',\n latex: '$\\\\mathbb{a}$',\n },\n 120147: {\n id: 'U1D553',\n decimal: 120147,\n character: '핓',\n latex: '$\\\\mathbb{b}$',\n },\n 120148: {\n id: 'U1D554',\n decimal: 120148,\n character: '핔',\n latex: '$\\\\mathbb{c}$',\n },\n 120149: {\n id: 'U1D555',\n decimal: 120149,\n character: '핕',\n latex: '$\\\\mathbb{d}$',\n },\n 120150: {\n id: 'U1D556',\n decimal: 120150,\n character: '핖',\n latex: '$\\\\mathbb{e}$',\n },\n 120151: {\n id: 'U1D557',\n decimal: 120151,\n character: '핗',\n latex: '$\\\\mathbb{f}$',\n },\n 120152: {\n id: 'U1D558',\n decimal: 120152,\n character: '하',\n latex: '$\\\\mathbb{g}$',\n },\n 120153: {\n id: 'U1D559',\n decimal: 120153,\n character: '학',\n latex: '$\\\\mathbb{h}$',\n },\n 120154: {\n id: 'U1D55A',\n decimal: 120154,\n character: '핚',\n latex: '$\\\\mathbb{i}$',\n },\n 120155: {\n id: 'U1D55B',\n decimal: 120155,\n character: '핛',\n latex: '$\\\\mathbb{j}$',\n },\n 120156: {\n id: 'U1D55C',\n decimal: 120156,\n character: '한',\n latex: '$\\\\mathbb{k}$',\n },\n 120157: {\n id: 'U1D55D',\n decimal: 120157,\n character: '핝',\n latex: '$\\\\mathbb{l}$',\n },\n 120158: {\n id: 'U1D55E',\n decimal: 120158,\n character: '핞',\n latex: '$\\\\mathbb{m}$',\n },\n 120159: {\n id: 'U1D55F',\n decimal: 120159,\n character: '핟',\n latex: '$\\\\mathbb{n}$',\n },\n 120160: {\n id: 'U1D560',\n decimal: 120160,\n character: '할',\n latex: '$\\\\mathbb{o}$',\n },\n 120161: {\n id: 'U1D561',\n decimal: 120161,\n character: '핡',\n latex: '$\\\\mathbb{p}$',\n },\n 120162: {\n id: 'U1D562',\n decimal: 120162,\n character: '핢',\n latex: '$\\\\mathbb{q}$',\n },\n 120163: {\n id: 'U1D563',\n decimal: 120163,\n character: '핣',\n latex: '$\\\\mathbb{r}$',\n },\n 120164: {\n id: 'U1D564',\n decimal: 120164,\n character: '핤',\n latex: '$\\\\mathbb{s}$',\n },\n 120165: {\n id: 'U1D565',\n decimal: 120165,\n character: '핥',\n latex: '$\\\\mathbb{t}$',\n },\n 120166: {\n id: 'U1D566',\n decimal: 120166,\n character: '핦',\n latex: '$\\\\mathbb{u}$',\n },\n 120167: {\n id: 'U1D567',\n decimal: 120167,\n character: '핧',\n latex: '$\\\\mathbb{v}$',\n },\n 120168: {\n id: 'U1D568',\n decimal: 120168,\n character: '함',\n latex: '$\\\\mathbb{w}$',\n },\n 120169: {\n id: 'U1D569',\n decimal: 120169,\n character: '합',\n latex: '$\\\\mathbb{x}$',\n },\n 120170: {\n id: 'U1D56A',\n decimal: 120170,\n character: '핪',\n latex: '$\\\\mathbb{y}$',\n },\n 120171: {\n id: 'U1D56B',\n decimal: 120171,\n character: '핫',\n latex: '$\\\\mathbb{z}$',\n },\n 120224: {\n id: 'U1D5A0',\n decimal: 120224,\n character: '햠',\n latex: '$\\\\mathsf{A}$',\n },\n 120225: {\n id: 'U1D5A1',\n decimal: 120225,\n character: '햡',\n latex: '$\\\\mathsf{B}$',\n },\n 120226: {\n id: 'U1D5A2',\n decimal: 120226,\n character: '햢',\n latex: '$\\\\mathsf{C}$',\n },\n 120227: {\n id: 'U1D5A3',\n decimal: 120227,\n character: '햣',\n latex: '$\\\\mathsf{D}$',\n },\n 120228: {\n id: 'U1D5A4',\n decimal: 120228,\n character: '햤',\n latex: '$\\\\mathsf{E}$',\n },\n 120229: {\n id: 'U1D5A5',\n decimal: 120229,\n character: '향',\n latex: '$\\\\mathsf{F}$',\n },\n 120230: {\n id: 'U1D5A6',\n decimal: 120230,\n character: '햦',\n latex: '$\\\\mathsf{G}$',\n },\n 120231: {\n id: 'U1D5A7',\n decimal: 120231,\n character: '햧',\n latex: '$\\\\mathsf{H}$',\n },\n 120232: {\n id: 'U1D5A8',\n decimal: 120232,\n character: '햨',\n latex: '$\\\\mathsf{I}$',\n },\n 120233: {\n id: 'U1D5A9',\n decimal: 120233,\n character: '햩',\n latex: '$\\\\mathsf{J}$',\n },\n 120234: {\n id: 'U1D5AA',\n decimal: 120234,\n character: '햪',\n latex: '$\\\\mathsf{K}$',\n },\n 120235: {\n id: 'U1D5AB',\n decimal: 120235,\n character: '햫',\n latex: '$\\\\mathsf{L}$',\n },\n 120236: {\n id: 'U1D5AC',\n decimal: 120236,\n character: '햬',\n latex: '$\\\\mathsf{M}$',\n },\n 120237: {\n id: 'U1D5AD',\n decimal: 120237,\n character: '햭',\n latex: '$\\\\mathsf{N}$',\n },\n 120238: {\n id: 'U1D5AE',\n decimal: 120238,\n character: '햮',\n latex: '$\\\\mathsf{O}$',\n },\n 120239: {\n id: 'U1D5AF',\n decimal: 120239,\n character: '햯',\n latex: '$\\\\mathsf{P}$',\n },\n 120240: {\n id: 'U1D5B0',\n decimal: 120240,\n character: '햰',\n latex: '$\\\\mathsf{Q}$',\n },\n 120241: {\n id: 'U1D5B1',\n decimal: 120241,\n character: '햱',\n latex: '$\\\\mathsf{R}$',\n },\n 120242: {\n id: 'U1D5B2',\n decimal: 120242,\n character: '햲',\n latex: '$\\\\mathsf{S}$',\n },\n 120243: {\n id: 'U1D5B3',\n decimal: 120243,\n character: '햳',\n latex: '$\\\\mathsf{T}$',\n },\n 120244: {\n id: 'U1D5B4',\n decimal: 120244,\n character: '햴',\n latex: '$\\\\mathsf{U}$',\n },\n 120245: {\n id: 'U1D5B5',\n decimal: 120245,\n character: '햵',\n latex: '$\\\\mathsf{V}$',\n },\n 120246: {\n id: 'U1D5B6',\n decimal: 120246,\n character: '햶',\n latex: '$\\\\mathsf{W}$',\n },\n 120247: {\n id: 'U1D5B7',\n decimal: 120247,\n character: '햷',\n latex: '$\\\\mathsf{X}$',\n },\n 120248: {\n id: 'U1D5B8',\n decimal: 120248,\n character: '햸',\n latex: '$\\\\mathsf{Y}$',\n },\n 120249: {\n id: 'U1D5B9',\n decimal: 120249,\n character: '햹',\n latex: '$\\\\mathsf{Z}$',\n },\n 120250: {\n id: 'U1D5BA',\n decimal: 120250,\n character: '햺',\n latex: '$\\\\mathsf{a}$',\n },\n 120251: {\n id: 'U1D5BB',\n decimal: 120251,\n character: '햻',\n latex: '$\\\\mathsf{b}$',\n },\n 120252: {\n id: 'U1D5BC',\n decimal: 120252,\n character: '햼',\n latex: '$\\\\mathsf{c}$',\n },\n 120253: {\n id: 'U1D5BD',\n decimal: 120253,\n character: '햽',\n latex: '$\\\\mathsf{d}$',\n },\n 120254: {\n id: 'U1D5BE',\n decimal: 120254,\n character: '햾',\n latex: '$\\\\mathsf{e}$',\n },\n 120255: {\n id: 'U1D5BF',\n decimal: 120255,\n character: '햿',\n latex: '$\\\\mathsf{f}$',\n },\n 120256: {\n id: 'U1D5C0',\n decimal: 120256,\n character: '헀',\n latex: '$\\\\mathsf{g}$',\n },\n 120257: {\n id: 'U1D5C1',\n decimal: 120257,\n character: '헁',\n latex: '$\\\\mathsf{h}$',\n },\n 120258: {\n id: 'U1D5C2',\n decimal: 120258,\n character: '헂',\n latex: '$\\\\mathsf{i}$',\n },\n 120259: {\n id: 'U1D5C3',\n decimal: 120259,\n character: '헃',\n latex: '$\\\\mathsf{j}$',\n },\n 120260: {\n id: 'U1D5C4',\n decimal: 120260,\n character: '헄',\n latex: '$\\\\mathsf{k}$',\n },\n 120261: {\n id: 'U1D5C5',\n decimal: 120261,\n character: '헅',\n latex: '$\\\\mathsf{l}$',\n },\n 120262: {\n id: 'U1D5C6',\n decimal: 120262,\n character: '헆',\n latex: '$\\\\mathsf{m}$',\n },\n 120263: {\n id: 'U1D5C7',\n decimal: 120263,\n character: '헇',\n latex: '$\\\\mathsf{n}$',\n },\n 120264: {\n id: 'U1D5C8',\n decimal: 120264,\n character: '허',\n latex: '$\\\\mathsf{o}$',\n },\n 120265: {\n id: 'U1D5C9',\n decimal: 120265,\n character: '헉',\n latex: '$\\\\mathsf{p}$',\n },\n 120266: {\n id: 'U1D5CA',\n decimal: 120266,\n character: '헊',\n latex: '$\\\\mathsf{q}$',\n },\n 120267: {\n id: 'U1D5CB',\n decimal: 120267,\n character: '헋',\n latex: '$\\\\mathsf{r}$',\n },\n 120268: {\n id: 'U1D5CC',\n decimal: 120268,\n character: '헌',\n latex: '$\\\\mathsf{s}$',\n },\n 120269: {\n id: 'U1D5CD',\n decimal: 120269,\n character: '헍',\n latex: '$\\\\mathsf{t}$',\n },\n 120270: {\n id: 'U1D5CE',\n decimal: 120270,\n character: '헎',\n latex: '$\\\\mathsf{u}$',\n },\n 120271: {\n id: 'U1D5CF',\n decimal: 120271,\n character: '헏',\n latex: '$\\\\mathsf{v}$',\n },\n 120272: {\n id: 'U1D5D0',\n decimal: 120272,\n character: '헐',\n latex: '$\\\\mathsf{w}$',\n },\n 120273: {\n id: 'U1D5D1',\n decimal: 120273,\n character: '헑',\n latex: '$\\\\mathsf{x}$',\n },\n 120274: {\n id: 'U1D5D2',\n decimal: 120274,\n character: '헒',\n latex: '$\\\\mathsf{y}$',\n },\n 120275: {\n id: 'U1D5D3',\n decimal: 120275,\n character: '헓',\n latex: '$\\\\mathsf{z}$',\n },\n 120432: {\n id: 'U1D670',\n decimal: 120432,\n character: '홰',\n latex: '$\\\\mathtt{A}$',\n },\n 120433: {\n id: 'U1D671',\n decimal: 120433,\n character: '홱',\n latex: '$\\\\mathtt{B}$',\n },\n 120434: {\n id: 'U1D672',\n decimal: 120434,\n character: '홲',\n latex: '$\\\\mathtt{C}$',\n },\n 120435: {\n id: 'U1D673',\n decimal: 120435,\n character: '홳',\n latex: '$\\\\mathtt{D}$',\n },\n 120436: {\n id: 'U1D674',\n decimal: 120436,\n character: '홴',\n latex: '$\\\\mathtt{E}$',\n },\n 120437: {\n id: 'U1D675',\n decimal: 120437,\n character: '홵',\n latex: '$\\\\mathtt{F}$',\n },\n 120438: {\n id: 'U1D676',\n decimal: 120438,\n character: '홶',\n latex: '$\\\\mathtt{G}$',\n },\n 120439: {\n id: 'U1D677',\n decimal: 120439,\n character: '홷',\n latex: '$\\\\mathtt{H}$',\n },\n 120440: {\n id: 'U1D678',\n decimal: 120440,\n character: '홸',\n latex: '$\\\\mathtt{I}$',\n },\n 120441: {\n id: 'U1D679',\n decimal: 120441,\n character: '홹',\n latex: '$\\\\mathtt{J}$',\n },\n 120442: {\n id: 'U1D67A',\n decimal: 120442,\n character: '홺',\n latex: '$\\\\mathtt{K}$',\n },\n 120443: {\n id: 'U1D67B',\n decimal: 120443,\n character: '홻',\n latex: '$\\\\mathtt{L}$',\n },\n 120444: {\n id: 'U1D67C',\n decimal: 120444,\n character: '홼',\n latex: '$\\\\mathtt{M}$',\n },\n 120445: {\n id: 'U1D67D',\n decimal: 120445,\n character: '홽',\n latex: '$\\\\mathtt{N}$',\n },\n 120446: {\n id: 'U1D67E',\n decimal: 120446,\n character: '홾',\n latex: '$\\\\mathtt{O}$',\n },\n 120447: {\n id: 'U1D67F',\n decimal: 120447,\n character: '홿',\n latex: '$\\\\mathtt{P}$',\n },\n 120448: {\n id: 'U1D680',\n decimal: 120448,\n character: '횀',\n latex: '$\\\\mathtt{Q}$',\n },\n 120449: {\n id: 'U1D681',\n decimal: 120449,\n character: '횁',\n latex: '$\\\\mathtt{R}$',\n },\n 120450: {\n id: 'U1D682',\n decimal: 120450,\n character: '횂',\n latex: '$\\\\mathtt{S}$',\n },\n 120451: {\n id: 'U1D683',\n decimal: 120451,\n character: '횃',\n latex: '$\\\\mathtt{T}$',\n },\n 120452: {\n id: 'U1D684',\n decimal: 120452,\n character: '횄',\n latex: '$\\\\mathtt{U}$',\n },\n 120453: {\n id: 'U1D685',\n decimal: 120453,\n character: '횅',\n latex: '$\\\\mathtt{V}$',\n },\n 120454: {\n id: 'U1D686',\n decimal: 120454,\n character: '횆',\n latex: '$\\\\mathtt{W}$',\n },\n 120455: {\n id: 'U1D687',\n decimal: 120455,\n character: '횇',\n latex: '$\\\\mathtt{X}$',\n },\n 120456: {\n id: 'U1D688',\n decimal: 120456,\n character: '횈',\n latex: '$\\\\mathtt{Y}$',\n },\n 120457: {\n id: 'U1D689',\n decimal: 120457,\n character: '횉',\n latex: '$\\\\mathtt{Z}$',\n },\n 120458: {\n id: 'U1D68A',\n decimal: 120458,\n character: '횊',\n latex: '$\\\\mathtt{a}$',\n },\n 120459: {\n id: 'U1D68B',\n decimal: 120459,\n character: '횋',\n latex: '$\\\\mathtt{b}$',\n },\n 120460: {\n id: 'U1D68C',\n decimal: 120460,\n character: '회',\n latex: '$\\\\mathtt{c}$',\n },\n 120461: {\n id: 'U1D68D',\n decimal: 120461,\n character: '획',\n latex: '$\\\\mathtt{d}$',\n },\n 120462: {\n id: 'U1D68E',\n decimal: 120462,\n character: '횎',\n latex: '$\\\\mathtt{e}$',\n },\n 120463: {\n id: 'U1D68F',\n decimal: 120463,\n character: '횏',\n latex: '$\\\\mathtt{f}$',\n },\n 120464: {\n id: 'U1D690',\n decimal: 120464,\n character: '횐',\n latex: '$\\\\mathtt{g}$',\n },\n 120465: {\n id: 'U1D691',\n decimal: 120465,\n character: '횑',\n latex: '$\\\\mathtt{h}$',\n },\n 120466: {\n id: 'U1D692',\n decimal: 120466,\n character: '횒',\n latex: '$\\\\mathtt{i}$',\n },\n 120467: {\n id: 'U1D693',\n decimal: 120467,\n character: '횓',\n latex: '$\\\\mathtt{j}$',\n },\n 120468: {\n id: 'U1D694',\n decimal: 120468,\n character: '횔',\n latex: '$\\\\mathtt{k}$',\n },\n 120469: {\n id: 'U1D695',\n decimal: 120469,\n character: '횕',\n latex: '$\\\\mathtt{l}$',\n },\n 120470: {\n id: 'U1D696',\n decimal: 120470,\n character: '횖',\n latex: '$\\\\mathtt{m}$',\n },\n 120471: {\n id: 'U1D697',\n decimal: 120471,\n character: '횗',\n latex: '$\\\\mathtt{n}$',\n },\n 120472: {\n id: 'U1D698',\n decimal: 120472,\n character: '횘',\n latex: '$\\\\mathtt{o}$',\n },\n 120473: {\n id: 'U1D699',\n decimal: 120473,\n character: '횙',\n latex: '$\\\\mathtt{p}$',\n },\n 120474: {\n id: 'U1D69A',\n decimal: 120474,\n character: '횚',\n latex: '$\\\\mathtt{q}$',\n },\n 120475: {\n id: 'U1D69B',\n decimal: 120475,\n character: '횛',\n latex: '$\\\\mathtt{r}$',\n },\n 120476: {\n id: 'U1D69C',\n decimal: 120476,\n character: '횜',\n latex: '$\\\\mathtt{s}$',\n },\n 120477: {\n id: 'U1D69D',\n decimal: 120477,\n character: '횝',\n latex: '$\\\\mathtt{t}$',\n },\n 120478: {\n id: 'U1D69E',\n decimal: 120478,\n character: '횞',\n latex: '$\\\\mathtt{u}$',\n },\n 120479: {\n id: 'U1D69F',\n decimal: 120479,\n character: '횟',\n latex: '$\\\\mathtt{v}$',\n },\n 120480: {\n id: 'U1D6A0',\n decimal: 120480,\n character: '횠',\n latex: '$\\\\mathtt{w}$',\n },\n 120481: {\n id: 'U1D6A1',\n decimal: 120481,\n character: '횡',\n latex: '$\\\\mathtt{x}$',\n },\n 120482: {\n id: 'U1D6A2',\n decimal: 120482,\n character: '횢',\n latex: '$\\\\mathtt{y}$',\n },\n 120483: {\n id: 'U1D6A3',\n decimal: 120483,\n character: '횣',\n latex: '$\\\\mathtt{z}$',\n },\n 120490: {\n id: 'U1D6AA',\n decimal: 120490,\n character: '횪',\n latex: '$\\\\mathbf{\\\\Gamma}$',\n },\n 120491: {\n id: 'U1D6AB',\n decimal: 120491,\n character: '횫',\n latex: '$\\\\mathbf{\\\\Delta}$',\n },\n 120495: {\n id: 'U1D6AF',\n decimal: 120495,\n character: '횯',\n latex: '$\\\\mathbf{\\\\Theta}$',\n },\n 120498: {\n id: 'U1D6B2',\n decimal: 120498,\n character: '횲',\n latex: '$\\\\mathbf{\\\\Lambda}$',\n },\n 120499: {\n id: 'U1D6B3',\n decimal: 120499,\n character: '횳',\n latex: '$\\\\mathbf{M}$',\n },\n 120500: {\n id: 'U1D6B4',\n decimal: 120500,\n character: '횴',\n latex: 'N',\n },\n 120501: {\n id: 'U1D6B5',\n decimal: 120501,\n character: '횵',\n latex: '$\\\\mathbf{\\\\Xi}$',\n },\n 120502: {\n id: 'U1D6B6',\n decimal: 120502,\n character: '횶',\n latex: 'O',\n },\n 120503: {\n id: 'U1D6B7',\n decimal: 120503,\n character: '횷',\n latex: '$\\\\mathbf{\\\\Pi}$',\n },\n 120505: {\n id: 'U1D6B9',\n decimal: 120505,\n character: '횹',\n latex: '$\\\\mathbf{\\\\vartheta}$',\n },\n 120506: {\n id: 'U1D6BA',\n decimal: 120506,\n character: '횺',\n latex: '$\\\\mathbf{\\\\Sigma}$',\n },\n 120508: {\n id: 'U1D6BC',\n decimal: 120508,\n character: '횼',\n latex: '$\\\\mathbf{\\\\Upsilon}$',\n },\n 120509: {\n id: 'U1D6BD',\n decimal: 120509,\n character: '횽',\n latex: '$\\\\mathbf{\\\\Phi}$',\n },\n 120511: {\n id: 'U1D6BF',\n decimal: 120511,\n character: '횿',\n latex: '$\\\\mathbf{\\\\Psi}$',\n },\n 120512: {\n id: 'U1D6C0',\n decimal: 120512,\n character: '훀',\n latex: '$\\\\mathbf{\\\\Omega}$',\n },\n 120513: {\n id: 'U1D6C1',\n decimal: 120513,\n character: '훁',\n latex: '$\\\\mathbf{\\\\nabla}$',\n },\n 120514: {\n id: 'U1D6C2',\n decimal: 120514,\n character: '훂',\n latex: '$\\\\mathbf{\\\\alpha}$',\n },\n 120515: {\n id: 'U1D6C3',\n decimal: 120515,\n character: '훃',\n latex: '$\\\\mathbf{\\\\beta}$',\n },\n 120516: {\n id: 'U1D6C4',\n decimal: 120516,\n character: '후',\n latex: '$\\\\mathbf{\\\\gamma}$',\n },\n 120517: {\n id: 'U1D6C5',\n decimal: 120517,\n character: '훅',\n latex: '$\\\\mathbf{\\\\delta}$',\n },\n 120518: {\n id: 'U1D6C6',\n decimal: 120518,\n character: '훆',\n latex: '$\\\\mathbf{\\\\epsilon}$',\n },\n 120519: {\n id: 'U1D6C7',\n decimal: 120519,\n character: '훇',\n latex: '$\\\\mathbf{\\\\zeta}$',\n },\n 120520: {\n id: 'U1D6C8',\n decimal: 120520,\n character: '훈',\n latex: '$\\\\mathbf{\\\\eta}$',\n },\n 120521: {\n id: 'U1D6C9',\n decimal: 120521,\n character: '훉',\n latex: '$\\\\mathbf{\\\\theta}$',\n },\n 120522: {\n id: 'U1D6CA',\n decimal: 120522,\n character: '훊',\n latex: '$\\\\mathbf{\\\\iota}$',\n },\n 120523: {\n id: 'U1D6CB',\n decimal: 120523,\n character: '훋',\n latex: '$\\\\mathbf{\\\\kappa}$',\n },\n 120524: {\n id: 'U1D6CC',\n decimal: 120524,\n character: '훌',\n latex: '$\\\\mathbf{\\\\lambda}$',\n },\n 120525: {\n id: 'U1D6CD',\n decimal: 120525,\n character: '훍',\n latex: '$\\\\mathbf{\\\\mu}$',\n },\n 120526: {\n id: 'U1D6CE',\n decimal: 120526,\n character: '훎',\n latex: '$\\\\mathbf{\\\\nu}$',\n },\n 120527: {\n id: 'U1D6CF',\n decimal: 120527,\n character: '훏',\n latex: '$\\\\mathbf{\\\\xi}$',\n },\n 120528: {\n id: 'U1D6D0',\n decimal: 120528,\n character: '훐',\n latex: '$\\\\mathbf{o}$',\n },\n 120529: {\n id: 'U1D6D1',\n decimal: 120529,\n character: '훑',\n latex: '$\\\\mathbf{\\\\pi}$',\n },\n 120530: {\n id: 'U1D6D2',\n decimal: 120530,\n character: '훒',\n latex: '$\\\\mathbf{\\\\rho}$',\n },\n 120531: {\n id: 'U1D6D3',\n decimal: 120531,\n character: '훓',\n latex: '$\\\\mathbf{\\\\varsigma}$',\n },\n 120532: {\n id: 'U1D6D4',\n decimal: 120532,\n character: '훔',\n latex: '$\\\\mathbf{\\\\sigma}$',\n },\n 120533: {\n id: 'U1D6D5',\n decimal: 120533,\n character: '훕',\n latex: '$\\\\mathbf{\\\\tau}$',\n },\n 120534: {\n id: 'U1D6D6',\n decimal: 120534,\n character: '훖',\n latex: '$\\\\mathbf{\\\\upsilon}$',\n },\n 120535: {\n id: 'U1D6D7',\n decimal: 120535,\n character: '훗',\n latex: '$\\\\mathbf{\\\\phi}$',\n },\n 120536: {\n id: 'U1D6D8',\n decimal: 120536,\n character: '훘',\n latex: '$\\\\mathbf{\\\\chi}$',\n },\n 120537: {\n id: 'U1D6D9',\n decimal: 120537,\n character: '훙',\n latex: '$\\\\mathbf{\\\\psi}$',\n },\n 120538: {\n id: 'U1D6DA',\n decimal: 120538,\n character: '훚',\n latex: '$\\\\mathbf{\\\\omega}$',\n },\n 120540: {\n id: 'U1D6DC',\n decimal: 120540,\n character: '훜',\n latex: '$\\\\mathbf{\\\\varepsilon}$',\n },\n 120541: {\n id: 'U1D6DD',\n decimal: 120541,\n character: '훝',\n latex: '$\\\\mathbf{\\\\vartheta}$',\n },\n 120542: {\n id: 'U1D6DE',\n decimal: 120542,\n character: '훞',\n latex: '$\\\\mathbf{\\\\varkappa}$',\n },\n 120543: {\n id: 'U1D6DF',\n decimal: 120543,\n character: '훟',\n latex: '$\\\\mathbf{\\\\phi}$',\n },\n 120544: {\n id: 'U1D6E0',\n decimal: 120544,\n character: '훠',\n latex: '$\\\\mathbf{\\\\varrho}$',\n },\n 120545: {\n id: 'U1D6E1',\n decimal: 120545,\n character: '훡',\n latex: '$\\\\mathbf{\\\\varpi}$',\n },\n 120558: {\n id: 'U1D6EE',\n decimal: 120558,\n character: '훮',\n latex: 'N',\n },\n 120560: {\n id: 'U1D6F0',\n decimal: 120560,\n character: '훰',\n latex: 'O',\n },\n 120618: {\n id: 'U1D72A',\n decimal: 120618,\n character: '휪',\n latex: 'O',\n },\n 120676: {\n id: 'U1D764',\n decimal: 120676,\n character: '흤',\n latex: 'O',\n },\n 120734: {\n id: 'U1D79E',\n decimal: 120734,\n character: '힞',\n latex: 'O',\n },\n 120782: {\n id: 'U1D7CE',\n decimal: 120782,\n character: 'ퟎ',\n latex: '$\\\\mathbf{0}$',\n },\n 120783: {\n id: 'U1D7CF',\n decimal: 120783,\n character: 'ퟏ',\n latex: '$\\\\mathbf{1}$',\n },\n 120784: {\n id: 'U1D7D0',\n decimal: 120784,\n character: 'ퟐ',\n latex: '$\\\\mathbf{2}$',\n },\n 120785: {\n id: 'U1D7D1',\n decimal: 120785,\n character: 'ퟑ',\n latex: '$\\\\mathbf{3}$',\n },\n 120786: {\n id: 'U1D7D2',\n decimal: 120786,\n character: 'ퟒ',\n latex: '$\\\\mathbf{4}$',\n },\n 120787: {\n id: 'U1D7D3',\n decimal: 120787,\n character: 'ퟓ',\n latex: '$\\\\mathbf{5}$',\n },\n 120788: {\n id: 'U1D7D4',\n decimal: 120788,\n character: 'ퟔ',\n latex: '$\\\\mathbf{6}$',\n },\n 120789: {\n id: 'U1D7D5',\n decimal: 120789,\n character: 'ퟕ',\n latex: '$\\\\mathbf{7}$',\n },\n 120790: {\n id: 'U1D7D6',\n decimal: 120790,\n character: 'ퟖ',\n latex: '$\\\\mathbf{8}$',\n },\n 120791: {\n id: 'U1D7D7',\n decimal: 120791,\n character: 'ퟗ',\n latex: '$\\\\mathbf{9}$',\n },\n 120792: {\n id: 'U1D7D8',\n decimal: 120792,\n character: 'ퟘ',\n latex: '$\\\\mathbb{0}$',\n },\n 120793: {\n id: 'U1D7D9',\n decimal: 120793,\n character: 'ퟙ',\n latex: '$\\\\mathbb{1}$',\n },\n 120794: {\n id: 'U1D7DA',\n decimal: 120794,\n character: 'ퟚ',\n latex: '$\\\\mathbb{2}$',\n },\n 120795: {\n id: 'U1D7DB',\n decimal: 120795,\n character: 'ퟛ',\n latex: '$\\\\mathbb{3}$',\n },\n 120796: {\n id: 'U1D7DC',\n decimal: 120796,\n character: 'ퟜ',\n latex: '$\\\\mathbb{4}$',\n },\n 120797: {\n id: 'U1D7DD',\n decimal: 120797,\n character: 'ퟝ',\n latex: '$\\\\mathbb{5}$',\n },\n 120798: {\n id: 'U1D7DE',\n decimal: 120798,\n character: 'ퟞ',\n latex: '$\\\\mathbb{6}$',\n },\n 120799: {\n id: 'U1D7DF',\n decimal: 120799,\n character: 'ퟟ',\n latex: '$\\\\mathbb{7}$',\n },\n 120800: {\n id: 'U1D7E0',\n decimal: 120800,\n character: 'ퟠ',\n latex: '$\\\\mathbb{8}$',\n },\n 120801: {\n id: 'U1D7E1',\n decimal: 120801,\n character: 'ퟡ',\n latex: '$\\\\mathbb{9}$',\n },\n 120802: {\n id: 'U1D7E2',\n decimal: 120802,\n character: 'ퟢ',\n latex: '$\\\\mathsf{0}$',\n },\n 120803: {\n id: 'U1D7E3',\n decimal: 120803,\n character: 'ퟣ',\n latex: '$\\\\mathsf{1}$',\n },\n 120804: {\n id: 'U1D7E4',\n decimal: 120804,\n character: 'ퟤ',\n latex: '$\\\\mathsf{2}$',\n },\n 120805: {\n id: 'U1D7E5',\n decimal: 120805,\n character: 'ퟥ',\n latex: '$\\\\mathsf{3}$',\n },\n 120806: {\n id: 'U1D7E6',\n decimal: 120806,\n character: 'ퟦ',\n latex: '$\\\\mathsf{4}$',\n },\n 120807: {\n id: 'U1D7E7',\n decimal: 120807,\n character: 'ퟧ',\n latex: '$\\\\mathsf{5}$',\n },\n 120808: {\n id: 'U1D7E8',\n decimal: 120808,\n character: 'ퟨ',\n latex: '$\\\\mathsf{6}$',\n },\n 120809: {\n id: 'U1D7E9',\n decimal: 120809,\n character: 'ퟩ',\n latex: '$\\\\mathsf{7}$',\n },\n 120810: {\n id: 'U1D7EA',\n decimal: 120810,\n character: 'ퟪ',\n latex: '$\\\\mathsf{8}$',\n },\n 120811: {\n id: 'U1D7EB',\n decimal: 120811,\n character: 'ퟫ',\n latex: '$\\\\mathsf{9}$',\n },\n 120822: {\n id: 'U1D7F6',\n decimal: 120822,\n character: 'ퟶ',\n latex: '$\\\\mathtt{0}$',\n },\n 120823: {\n id: 'U1D7F7',\n decimal: 120823,\n character: 'ퟷ',\n latex: '$\\\\mathtt{1}$',\n },\n 120824: {\n id: 'U1D7F8',\n decimal: 120824,\n character: 'ퟸ',\n latex: '$\\\\mathtt{2}$',\n },\n 120825: {\n id: 'U1D7F9',\n decimal: 120825,\n character: 'ퟹ',\n latex: '$\\\\mathtt{3}$',\n },\n 120826: {\n id: 'U1D7FA',\n decimal: 120826,\n character: 'ퟺ',\n latex: '$\\\\mathtt{4}$',\n },\n 120827: {\n id: 'U1D7FB',\n decimal: 120827,\n character: 'ퟻ',\n latex: '$\\\\mathtt{5}$',\n },\n 120828: {\n id: 'U1D7FC',\n decimal: 120828,\n character: '',\n latex: '$\\\\mathtt{6}$',\n },\n 120829: {\n id: 'U1D7FD',\n decimal: 120829,\n character: '',\n latex: '$\\\\mathtt{7}$',\n },\n 120830: {\n id: 'U1D7FE',\n decimal: 120830,\n character: '',\n latex: '$\\\\mathtt{8}$',\n },\n 120831: {\n id: 'U1D7FF',\n decimal: 120831,\n character: '',\n latex: '$\\\\mathtt{9}$',\n },\n};\n\nexport default characters;\n","/*\n * bibliography-provider_zotero.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { ZoteroCollection, ZoteroServer, kZoteroBibTeXTranslator, ZoteroCollectionSpec, ZoteroCSL } from '../zotero';\n\nimport { ParsedYaml, valueFromYamlText } from '../yaml';\nimport { suggestCiteId } from '../cite';\n\nimport {\n BibliographyDataProvider,\n BibliographyFile,\n BibliographySourceWithCollections,\n BibliographyCollection,\n} from './bibliography';\nimport { EditorUI } from '../ui';\nimport { CSL } from '../csl';\nimport { toBibTeX } from './bibDB';\nimport { Editor } from '../../editor/editor';\n\nexport const kZoteroProviderKey = '2509FBBE-5BB0-44C4-B119-6083A81ED673';\n\nexport class BibliographyDataProviderZotero implements BibliographyDataProvider {\n private allCollections: ZoteroCollection[] = [];\n private allCollectionSpecs: BibliographyCollection[] = [];\n private server: ZoteroServer;\n private warning: string | undefined;\n private enabled = true;\n\n private docPath: string | undefined;\n private zoteroConfig: boolean | string[] | undefined;\n\n public constructor(server: ZoteroServer) {\n this.server = server;\n }\n\n public name: string = 'Zotero';\n public key: string = kZoteroProviderKey;\n public requiresWritable: boolean = true;\n\n public async load(\n _ui: EditorUI,\n docPath: string,\n _resourcePath: string,\n yamlBlocks: ParsedYaml[],\n refreshCollectionData: boolean,\n ): Promise<boolean> {\n let hasUpdates = false;\n this.docPath = docPath;\n this.zoteroConfig = zoteroConfig(yamlBlocks);\n if (this.zoteroConfig) {\n // Enabled\n this.enabled = true;\n try {\n // Don't send the items back through to the server\n const collectionSpecs = this.allCollections.map(({ items, ...rest }) => rest);\n\n // If there is a warning, stop using the cache and force a fresh trip\n // through the whole pipeline to be sure we're trying to clear that warning\n const useCache = this.warning === undefined || this.warning.length === 0;\n\n // The collection specified in the document header\n const collections = Array.isArray(this.zoteroConfig) ? this.zoteroConfig : [];\n const result = await this.server.getCollections(docPath, collections, collectionSpecs || [], useCache);\n this.warning = result.warning;\n if (result.status === 'ok') {\n if (result.message) {\n const newCollections = (result.message as ZoteroCollection[]).map(collection => {\n const existingCollection = this.allCollections.find(col => col.name === collection.name);\n // If the version is 0 this is a local instance that isn't incrementing version numbers, do not cache\n if (useCache && existingCollection && existingCollection.version === collection.version && existingCollection.version !== 0) {\n collection.items = existingCollection.items;\n } else {\n hasUpdates = true;\n }\n return collection;\n });\n hasUpdates = hasUpdates || newCollections.length !== this.collections.length;\n this.allCollections = newCollections;\n }\n } else {\n // console.log(result.status);\n }\n } catch (err) {\n // console.log(err);\n }\n\n if (refreshCollectionData) {\n // Lookup the collection specs\n const specResult = await this.server.getActiveCollectionSpecs(\n this.docPath || null,\n Array.isArray(this.zoteroConfig) ? this.zoteroConfig : [],\n );\n if (specResult && specResult.status === 'ok') {\n this.allCollectionSpecs = specResult.message.map((spec: ZoteroCollectionSpec) =>\n this.toBibliographyCollection(spec),\n );\n } else {\n this.allCollectionSpecs = [];\n }\n }\n } else {\n // Zotero is disabled, clear any already loaded bibliography\n if (this.collections.length > 0) {\n hasUpdates = true;\n }\n // Disabled\n this.enabled = false;\n this.allCollections = [];\n this.allCollectionSpecs = [];\n }\n return hasUpdates;\n }\n\n // Respect enabled;\n public isEnabled(): boolean {\n return this.enabled && (this.allCollections.length > 0 || this.allCollectionSpecs.length > 0);\n }\n\n public collections(): BibliographyCollection[] {\n return this.allCollectionSpecs || [];\n }\n\n private toBibliographyCollection(zoteroSpec: ZoteroCollectionSpec) {\n return {\n name: zoteroSpec.name,\n key: zoteroSpec.key,\n parentKey: zoteroSpec.parentKey,\n provider: kZoteroProviderKey,\n };\n }\n\n public items(): BibliographySourceWithCollections[] {\n const entryArrays = this.allCollections?.map(collection => this.bibliographySources(collection)) || [];\n const zoteroEntries = ([] as BibliographySourceWithCollections[]).concat(...entryArrays);\n return zoteroEntries;\n }\n\n public itemsForCollection(collectionKey?: string): BibliographySourceWithCollections[] {\n if (!collectionKey) {\n return this.items();\n }\n\n return this.items().filter((item: any) => {\n if (item.collectionKeys) {\n return item.collectionKeys.includes(collectionKey);\n }\n return false;\n });\n }\n\n public bibliographyPaths(doc: ProsemirrorNode, ui: EditorUI): BibliographyFile[] {\n return [];\n }\n\n public async generateBibTeX(ui: EditorUI, id: string, csl: CSL): Promise<string | undefined> {\n if (csl.key && ui.prefs.zoteroUseBetterBibtex()) {\n const bibTeX = await this.server.betterBibtexExport(\n [csl.key],\n kZoteroBibTeXTranslator,\n parseInt((csl as ZoteroCSL).libraryID, 10),\n );\n if (bibTeX) {\n return Promise.resolve(bibTeX.message);\n }\n }\n return Promise.resolve(toBibTeX(id, csl));\n }\n\n public warningMessage(): string | undefined {\n return this.warning;\n }\n\n private bibliographySources(collection: ZoteroCollection): BibliographySourceWithCollections[] {\n const items = collection.items?.map(item => {\n return {\n ...item,\n id: item.id || suggestCiteId([], item),\n providerKey: this.key,\n collectionKeys: item.collectionKeys,\n };\n });\n return items || [];\n }\n}\n\n// The Zotero header allows the following:\n// zotero: true | false Globally enables or disables the zotero integration\n// If true, uses all collections. If false uses none.\n//\n// By default, zotero integration is enabled. Add this header to disable integration\n//\nfunction zoteroConfig(parsedYamls: ParsedYaml[]): boolean | string[] {\n // Read the values of any yaml blocks that include bibliography headers\n // filter out blocks that don't include such headers\n const zoteroValues = parsedYamls\n .map(parsedYaml => {\n return valueFromYamlText('zotero', parsedYaml.yamlCode);\n })\n .filter(val => val !== null);\n\n if (zoteroValues.length > 0) {\n // Pandoc will use the last biblography node when generating a bibliography.\n // Take the same approach to the Zotero header and use the last node\n const zoteroConfigValue = zoteroValues[zoteroValues.length - 1];\n if (typeof zoteroConfigValue === 'boolean') {\n return zoteroConfigValue;\n } else if (typeof zoteroConfigValue === 'string') {\n return [zoteroConfigValue];\n } else if (Array.isArray(zoteroConfigValue)) {\n return zoteroConfigValue.map(String);\n } else {\n return true;\n }\n }\n return true;\n}\n","/*\n * zotero.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { CSL } from './csl';\n\nexport interface ZoteroResult {\n status:\n | 'ok' // ok (results in 'message')\n | 'notfound' // invalid api key\n | 'nohost' // no internet connectivity\n | 'error'; // unexpected error (details in 'error')\n message: any | null;\n warning: string;\n error: string;\n}\n\nexport interface ZoteroCollectionSpec {\n name: string;\n version: number;\n key: string;\n parentKey: string;\n}\n\nexport interface ZoteroCollection extends ZoteroCollectionSpec {\n items: ZoteroCSL[];\n}\n\nexport interface ZoteroCSL extends CSL {\n libraryID: string;\n collectionKeys: string[];\n}\n\n// https://github.com/retorquere/zotero-better-bibtex/blob/master/translators/Better%20BibTeX.json\nexport const kZoteroBibTeXTranslator = 'ca65189f-8815-4afe-8c8b-8c7c15f0edca';\n\nexport interface ZoteroServer {\n validateWebAPIKey: (key: string) => Promise<boolean>;\n\n getCollections: (\n file: string | null,\n collections: string[],\n cached: ZoteroCollectionSpec[],\n useCache: boolean,\n ) => Promise<ZoteroResult>;\n\n getLibraryNames: () => Promise<ZoteroResult>;\n\n getActiveCollectionSpecs: (file: string | null, collections: string[]) => Promise<ZoteroResult>;\n\n // Return status: nohost w/ warning text if it fails to\n // communciate w/ Better BibTeX. Otherwise returns\n // status: ok with exported text in message.\n betterBibtexExport: (itemKeys: string[], translatorId: string, libraryId: number) => Promise<ZoteroResult>;\n}\n","/*\n * cite-completion.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\nimport { DecorationSet, EditorView } from 'prosemirror-view';\n\nimport React from 'react';\nimport uniqby from 'lodash.uniqby';\n\nimport { BibliographyManager } from '../../api/bibliography/bibliography';\nimport { CompletionHandler, CompletionResult, CompletionHeaderProps } from '../../api/completion';\nimport { hasDOI } from '../../api/doi';\nimport { searchPlaceholderDecoration } from '../../api/placeholder';\nimport { EditorUI } from '../../api/ui';\nimport { CompletionItemView } from '../../api/widgets/completion';\n\nimport { EditorServer } from '../../api/server';\nimport { EditorEvents } from '../../api/events';\n\nimport { parseCitation } from './cite';\n\nimport './cite-completion.css';\nimport { bibliographyCiteCompletionProvider } from './cite-completion-bibliography';\nimport { EditorFormat, kQuartoDocType } from '../../api/format';\nimport { quartoXrefCiteCompletionProvider, kCiteCompletionTypeXref } from './cite-completion-quarto-xref';\nimport { completionIndex, CiteCompletionSearch } from './cite-completion-search';\n\n\nconst kAuthorMaxChars = 28;\nconst kMaxCitationCompletions = 100;\nconst kHeaderHeight = 20;\n\nexport const kCiteCompletionWidth = 400;\nconst kCiteCompletionItemPadding = 10;\n\nexport const kCitationCompleteScope = 'CitationScope';\n\n// An entry which includes the source as well\n// additional metadata for displaying a bibliograph item\nexport interface CiteCompletionEntry {\n id: string;\n type: string;\n primaryText: string;\n secondaryText: (len: number) => string;\n detailText: string;\n image?: string;\n imageAdornment?: string;\n replace: (view: EditorView, pos: number, server: EditorServer) => Promise<void>;\n index?: {\n secondary?: string;\n tertiary?: string;\n };\n}\n\nexport interface CiteCompletionProvider {\n currentEntries: () => CiteCompletionEntry[] | undefined;\n streamEntries: (doc: ProsemirrorNode, onStreamReady: (entries: CiteCompletionEntry[]) => void) => void;\n awaitEntries: (doc: ProsemirrorNode) => Promise<CiteCompletionEntry[]>;\n warningMessage: () => string | undefined;\n}\n\nexport function citationCompletionHandler(\n ui: EditorUI,\n _events: EditorEvents,\n bibManager: BibliographyManager,\n server: EditorServer,\n format: EditorFormat\n): CompletionHandler<CiteCompletionEntry> {\n\n // Load the providers\n const completionProviders = [bibliographyCiteCompletionProvider(ui, bibManager)];\n if (format.docTypes.includes(kQuartoDocType)) {\n // If this is a Quarto doc, use the quartoXref provider\n completionProviders.push(quartoXrefCiteCompletionProvider(ui, server));\n }\n // create the search index\n const searchIndex = completionIndex();\n\n return {\n id: 'AB9D4F8C-DA00-403A-AB4A-05373906FD8C',\n\n scope: kCitationCompleteScope,\n\n completions: citationCompletions(ui, completionProviders, searchIndex),\n\n filter: (entries: CiteCompletionEntry[], state: EditorState, token: string) => {\n return filterCitations(token, completionProviders, searchIndex, entries, ui, state.doc);\n },\n\n replace(view: EditorView, pos: number, entry: CiteCompletionEntry | null) {\n // If there is an entry selected, insert it into the document\n if (entry) {\n entry.replace(view, pos, server);\n }\n return Promise.resolve();\n },\n\n replacement(_schema: Schema, entry: CiteCompletionEntry | null): string | ProsemirrorNode | null {\n if (entry) {\n return entry.id;\n } else {\n return null;\n }\n },\n\n view: {\n header: () => {\n const warningProvider = completionProviders.find(provider => provider.warningMessage() !== undefined);\n if (warningProvider) {\n return {\n component: CompletionWarningHeaderView,\n height: kHeaderHeight,\n message: warningProvider.warningMessage(),\n };\n }\n },\n component: CiteCompletionItemView,\n key: entry => entry.id,\n width: kCiteCompletionWidth,\n height: 54,\n maxVisible: 5,\n hideNoResults: true,\n },\n };\n}\n\nfunction filterCitations(token: string, completionProviders: CiteCompletionProvider[], citeSearch: CiteCompletionSearch, entries: CiteCompletionEntry[], ui: EditorUI, doc: ProsemirrorNode) {\n // Empty query or DOI\n if (token.trim().length === 0 || hasDOI(token)) {\n return entries;\n }\n // Filter an exact match - if its exact match to an entry in the bibliography already, skip completion\n // Ignore any punctuation at the end of the token\n const tokenWithoutEndPunctuation = token.match(/.*[^\\,\\!\\?\\.\\:]/);\n const completionId = tokenWithoutEndPunctuation ? tokenWithoutEndPunctuation[0] : token;\n if (citeSearch.exactMatch(completionId)) {\n return [];\n }\n\n // Perform a search\n const searchResults = citeSearch.search(token, kMaxCitationCompletions);\n return searchResults || [];\n}\n\nfunction dedupe(entries: CiteCompletionEntry[]): CiteCompletionEntry[] {\n // Move the xrefs to the front to ensure that they are kept\n const orderedByType = entries.sort((a, b) => {\n if (a.type === b.type) {\n return 0;\n } else if (a.type === kCiteCompletionTypeXref) {\n return -1;\n } else {\n return 1;\n }\n });\n\n return uniqby(orderedByType, (entry: CiteCompletionEntry) => entry.id);\n}\n\nfunction sortEntries(entries: CiteCompletionEntry[]): CiteCompletionEntry[] {\n const dedupedSources = dedupe(entries);\n return dedupedSources.sort((a, b) => a.id.localeCompare(b.id));\n}\n\nfunction citationCompletions(ui: EditorUI, completionProviders: CiteCompletionProvider[], citeSearch: CiteCompletionSearch) {\n return (_text: string, context: EditorState | Transaction): CompletionResult<CiteCompletionEntry> | null => {\n\n const parsed = parseCitation(context);\n if (parsed) {\n return {\n token: parsed.token,\n pos: parsed.pos,\n offset: parsed.offset,\n completions: async (_state: EditorState) => {\n\n // If all providers have entries already loaded, we can use those and stream any updates\n const hasCurrentEntries = completionProviders.every(provider => provider.currentEntries());\n if (hasCurrentEntries) {\n\n let currentEntries: CiteCompletionEntry[] = [];\n completionProviders.forEach(provider => {\n const entries = provider.currentEntries();\n if (entries) {\n currentEntries = currentEntries || [];\n currentEntries.push(...entries);\n }\n });\n\n // Index the current Entries\n currentEntries = sortEntries(currentEntries);\n citeSearch.setEntries(currentEntries);\n\n // kick off another load which we'll stream in by setting entries\n let loadedEntries: CiteCompletionEntry[] = [];\n let providerCount = 0;\n completionProviders.forEach(provider => {\n provider.streamEntries(context.doc, (entries: CiteCompletionEntry[]) => {\n providerCount = providerCount + 1;\n\n const updatedEntries = [...loadedEntries, ...entries];\n loadedEntries = sortEntries(updatedEntries);\n if (providerCount >= completionProviders.length) {\n citeSearch.setEntries(loadedEntries);\n }\n });\n });\n\n // return stream\n return {\n items: currentEntries,\n stream: () => loadedEntries,\n };\n\n } else {\n // Otherwise, we need to wait and load the entries\n const promises = completionProviders.map(provider => provider.awaitEntries(context.doc));\n return Promise.all(promises).then(values => {\n const results: CiteCompletionEntry[] = [];\n\n values.forEach(value => results.push(...value));\n\n // Index the current Entries\n const sortedEntries = sortEntries(results);\n citeSearch.setEntries(sortedEntries);\n return sortedEntries;\n });\n }\n },\n decorations:\n parsed.token.length === 0\n ? DecorationSet.create(context.doc, [\n searchPlaceholderDecoration(context.selection.head, ui, ui.context.translateText('or DOI')),\n ])\n : undefined,\n };\n }\n return null;\n };\n}\n\n// The title may contain spans to control case specifically - consequently, we need\n// to render the title as HTML rather than as a string\nexport const CiteCompletionItemView: React.FC<CiteCompletionEntry> = entry => {\n return (\n <CompletionItemView\n width={kCiteCompletionWidth - kCiteCompletionItemPadding}\n image={entry.image}\n imageAdornment={entry.imageAdornment}\n title={`@${entry.primaryText}`}\n detail={entry.secondaryText(kAuthorMaxChars - entry.primaryText.length)}\n subTitle={entry.detailText}\n htmlTitle={true}\n />\n );\n};\n\nconst CompletionWarningHeaderView: React.FC<CompletionHeaderProps> = props => {\n return (\n <div className={'pm-completion-cite-warning pm-pane-border-color'}>\n {props.ui.context.translateText(props.message || 'An unexpected warning occurred.')}\n </div>\n );\n};\n","/*\n * completion.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\n\nimport { WidgetProps } from './react';\n\nimport './completion.css';\n\nexport interface CompletionItemViewProps extends WidgetProps {\n width: number;\n image?: string;\n imageAdornment?: string;\n title: string;\n detail?: string;\n subTitle: string;\n htmlTitle?: boolean;\n}\n\nexport const CompletionItemView: React.FC<CompletionItemViewProps> = props => {\n const className = ['pm-completion-item'].concat(props.classes || []).join(' ');\n const style: React.CSSProperties = {\n width: props.width + 'px',\n ...props.style,\n };\n\n return (\n <div className={className} style={style}>\n <div className={'pm-completion-item-type'}>\n {props.imageAdornment ? (\n <img\n className={'pm-completion-image-adorn pm-block-border-color pm-background-color'}\n src={props.imageAdornment}\n draggable=\"false\"\n />\n ) : (\n undefined\n )}\n <img className={'pm-completion-item-icon pm-block-border-color'} src={props.image} draggable=\"false\"/>\n </div>\n <div className={'pm-completion-item-summary'} style={{ width: props.width - 40 - 36 + 'px' }}>\n <div className={'pm-completion-item-id'}>\n <div className={'pm-completion-item-primary pm-completion-item-title pm-fixedwidth-font'}>{props.title}</div>\n <div className={'pm-completion-item-primary pm-completion-item-detail'}>{props.detail}</div>\n </div>\n {props.htmlTitle ? (\n <div className={'pm-completion-item-subTitle'} dangerouslySetInnerHTML={{ __html: props.subTitle || '' }} />\n ) : (\n <div className={'pm-completion-item-subTitle'}>{props.subTitle}</div>\n )}\n </div>\n </div>\n );\n};\n","/*\n * cite-completion-bibliography.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\n\nimport { BibliographySource, BibliographyManager } from '../../api/bibliography/bibliography';\nimport { kZoteroProviderKey } from '../../api/bibliography/bibliography-provider_zotero';\nimport { formatAuthors, formatIssuedDate } from '../../api/cite';\nimport { imageForType, CSLName } from '../../api/csl';\nimport { EditorUI } from '../../api/ui';\n\nimport { insertCitation as insertSingleCitation, performCiteCompletionReplacement } from './cite';\nimport { CiteCompletionEntry, CiteCompletionProvider } from './cite-completion';\nimport { EditorServer } from '../../api/server';\n\nexport const kCiteCompletionTypeBibliography = \"bibl\";\n\nexport function bibliographyCiteCompletionProvider(ui: EditorUI, bibliographyManager: BibliographyManager): CiteCompletionProvider {\n\n const referenceEntryForSource = (source: BibliographySource, forceLightMode?: boolean): CiteCompletionEntry => {\n\n // Core item metadata\n const id = source.id;\n const primaryText = id;\n const detailText = source.title || source['short-title'] || source['container-title'] || source.type;\n const image = imageForType(ui.images, source.type)[ui.prefs.darkMode() && !forceLightMode ? 1 : 0];\n const imageAdornment = source.providerKey === kZoteroProviderKey ? ui.images.citations?.zoteroOverlay : undefined;\n\n // The author text (and index representation)\n const secondaryText = (len: number) => {\n const authorStr = formatAuthors(source.author, len - source.id.length);\n const date = source.issued ? formatIssuedDate(source.issued) : '';\n const detail = `${authorStr} ${date}`;\n return detail;\n };\n const authorIndexStr = (cslName: CSLName) => {\n const names: string[] = [];\n if (cslName.family) {\n names.push(cslName.family);\n }\n if (cslName.given) {\n names.push(cslName.given);\n }\n if (cslName.literal) {\n names.push(cslName.literal);\n }\n return names.join(\" \");\n }\n const secondaryIndex = source.author?.map(authorIndexStr).join(\" \");\n\n // The function to insert this entry\n const replace = (view: EditorView, pos: number, server: EditorServer) => {\n if (source && bibliographyManager.findIdInLocalBibliography(source.id)) {\n // It's already in the bibliography, just write the id\n const tr = view.state.tr;\n const schema = view.state.schema;\n const citeIdMark = schema.text(source.id, [schema.marks.cite_id.create()]);\n performCiteCompletionReplacement(tr, pos, citeIdMark);\n view.dispatch(tr);\n return Promise.resolve();\n } else if (source) {\n // It isn't in the bibliography, show the insert cite dialog\n return insertSingleCitation(\n view,\n source.DOI || '',\n bibliographyManager,\n pos,\n ui,\n server.pandoc,\n source,\n bibliographyManager.providerName(source.providerKey),\n );\n } else {\n return Promise.resolve();\n }\n };\n\n return {\n id,\n type: kCiteCompletionTypeBibliography,\n primaryText,\n secondaryText,\n detailText,\n image,\n imageAdornment,\n index: {\n secondary: secondaryIndex,\n tertiary: detailText\n },\n replace\n };\n };\n\n return {\n currentEntries: () => {\n if (bibliographyManager.hasSources()) {\n return bibliographyManager.allSources().map(source => referenceEntryForSource(source));\n } else {\n return undefined;\n }\n },\n streamEntries: (doc: ProsemirrorNode, onStreamReady: (entries: CiteCompletionEntry[]) => void) => {\n bibliographyManager.load(ui, doc).then(() => {\n onStreamReady(bibliographyManager.allSources().map(source => referenceEntryForSource(source)));\n });\n },\n awaitEntries: async (doc: ProsemirrorNode) => {\n await bibliographyManager.load(ui, doc);\n return bibliographyManager.allSources().map(source => referenceEntryForSource(source));\n },\n warningMessage: () => {\n return bibliographyManager.warning();\n }\n\n };\n}\n\n\n","/*\n * cite-completion-quarto-xref.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\n\nimport { EditorUI } from '../../api/ui';\n\nimport { performCiteCompletionReplacement } from './cite';\nimport { CiteCompletionEntry, CiteCompletionProvider } from './cite-completion';\nimport { EditorServer } from '../../api/server';\nimport { XRef, xrefKey } from '../../api/xref';\nimport { kQuartoXRefTypes } from '../xref/xref-completion';\n\nexport const kCiteCompletionTypeXref = \"xref\";\n\nexport function quartoXrefCiteCompletionProvider(ui: EditorUI, server: EditorServer): CiteCompletionProvider {\n const referenceEntryForXref = (xref: XRef, forceLightMode?: boolean): CiteCompletionEntry => {\n\n // The type (e.g. fig)\n const type = kQuartoXRefTypes[xref.type];\n\n // The id (e.g. fig-foobar)\n const id = xrefKey(xref, \"quarto\");\n\n // The display text for the entry\n const primaryText = id;\n const secondaryText = (len: number) => {\n return xref.file;\n };\n const detailText = xref.title || \"\";\n\n // The image and adornment\n const image = type?.image(ui) || ui.images.omni_insert?.generic!;\n const imageAdornment = undefined;\n\n // Insert item\n const replace = (view: EditorView, pos: number, _server: EditorServer) => {\n // It's already in the bibliography, just write the id\n const tr = view.state.tr;\n const schema = view.state.schema;\n const idMark = schema.text(id, [schema.marks.cite_id.create()]);\n performCiteCompletionReplacement(tr, pos, idMark);\n view.dispatch(tr);\n return Promise.resolve();\n };\n\n return {\n id,\n type: kCiteCompletionTypeXref,\n primaryText,\n secondaryText,\n detailText,\n image,\n imageAdornment,\n replace\n };\n };\n\n let loadedEntries: CiteCompletionEntry[] | undefined;\n return {\n currentEntries: () => {\n return loadedEntries;\n },\n streamEntries: (doc: ProsemirrorNode, onStreamReady: (entries: CiteCompletionEntry[]) => void) => {\n const docPath = ui.context.getDocumentPath();\n if (docPath) {\n ui.context.withSavedDocument().then(() => {\n server.xref.quartoIndexForFile(docPath).then(xrefs => {\n loadedEntries = xrefs.refs.map(ref => referenceEntryForXref(ref));\n onStreamReady(loadedEntries);\n });\n });\n }\n },\n awaitEntries: async (doc: ProsemirrorNode) => {\n const docPath = ui.context.getDocumentPath();\n if (docPath) {\n await ui.context.withSavedDocument();\n const index = await server.xref.quartoIndexForFile(docPath);\n loadedEntries = index.refs.map(ref => referenceEntryForXref(ref));\n return loadedEntries;\n } else {\n return Promise.resolve([]);\n }\n },\n warningMessage: () => {\n return undefined;\n }\n };\n}\n\n\n","/*\n * xref-completion.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\nimport { DecorationSet } from 'prosemirror-view';\n\nimport React from 'react';\n\nimport Fuse from 'fuse.js';\nimport uniqby from 'lodash.uniqby';\n\nimport { EditorUI } from '../../api/ui';\nimport { CompletionHandler, CompletionResult } from '../../api/completion';\nimport { XRef, XRefServer, xrefKey } from '../../api/xref';\nimport { markIsActive } from '../../api/mark';\nimport { searchPlaceholderDecoration } from '../../api/placeholder';\nimport { CompletionItemView } from '../../api/widgets/completion';\n\nimport './xref-completion.css';\n\nconst kMaxResults = 20;\n\nexport function xrefCompletionHandler(ui: EditorUI, server: XRefServer): CompletionHandler<XRef> {\n const index = new FuseIndex();\n\n return {\n id: 'BAACC160-56BE-4322-B079-54477A880623',\n\n enabled: (context: EditorState | Transaction) => {\n return markIsActive(context, context.doc.type.schema.marks.xref);\n },\n\n completions: xrefCompletions(ui, server, index),\n\n filter: (completions: XRef[], _state: EditorState, token: string) => {\n if (token.length > 0) {\n return index.search(token, kMaxResults);\n } else {\n return completions.slice(0, kMaxResults);\n }\n },\n\n replacement(schema: Schema, xref: XRef | null): string | ProsemirrorNode | null {\n if (xref) {\n return xrefKey(xref);\n } else {\n return null;\n }\n },\n\n view: {\n component: xrefView(ui),\n key: xref => xrefKey(xref),\n height: 52,\n width: 350,\n maxVisible: 5,\n hideNoResults: true,\n },\n };\n}\n\nclass FuseIndex {\n private fuse: Fuse<XRef>;\n\n private keys: Fuse.FuseOptionKeyObject[] = [\n { name: 'id', weight: 20 },\n { name: 'type', weight: 1 },\n { name: 'title', weight: 1 },\n ];\n\n constructor() {\n this.fuse = this.createIndex([]);\n }\n\n public update(xrefs: XRef[]) {\n this.fuse = this.createIndex(xrefs);\n }\n\n public search(query: string, limit: number) {\n // see if we have an explicit type\n let type: string | null = null;\n let typeQuery: string | null = null;\n const colonLoc = query.indexOf(':');\n if (colonLoc !== -1) {\n const prefix = query.slice(0, colonLoc);\n if (kXRefTypes.hasOwnProperty(prefix)) {\n type = prefix;\n if (query.length > type.length + 1) {\n typeQuery = query.slice(colonLoc + 1);\n }\n }\n }\n\n // search options\n const options = {\n isCaseSensitive: false,\n shouldSort: true,\n minMatchCharLength: 2,\n limit,\n keys: this.keys,\n };\n\n // perform query (use type if we have one)\n const results = type\n ? typeQuery\n ? this.fuse.search({ $and: [{ type }, { $or: [{ id: typeQuery }, { title: typeQuery }] }] }, options)\n : this.fuse.search({ type }, options)\n : this.fuse.search(query, options);\n\n // return results (eliminating duplicates)\n return uniqby(\n results.map((result: { item: XRef }) => result.item),\n xrefKey,\n );\n }\n\n private createIndex(xrefs: XRef[]) {\n const options = {\n keys: this.keys.map(key => key.name),\n };\n const index = Fuse.createIndex(options.keys, xrefs);\n return new Fuse(xrefs, options, index);\n }\n}\n\nfunction xrefCompletions(ui: EditorUI, server: XRefServer, index: FuseIndex) {\n const kXRefCompletionRegEx = /(@ref\\()([ A-Za-z0-9:-]*)$/;\n return (text: string, context: EditorState | Transaction): CompletionResult<XRef> | null => {\n const match = text.match(kXRefCompletionRegEx);\n if (match) {\n const pos = context.selection.head - match[2].length;\n const token = match[2];\n return {\n pos,\n offset: -match[1].length + 1,\n token,\n completions: async () => {\n const docPath = ui.context.getDocumentPath();\n if (docPath) {\n await ui.context.withSavedDocument();\n const xrefs = await server.indexForFile(docPath);\n index.update(xrefs.refs);\n return xrefs.refs;\n } else {\n index.update([]);\n return Promise.resolve([]);\n }\n },\n decorations:\n token.length === 0 ? DecorationSet.create(context.doc, [searchPlaceholderDecoration(pos, ui)]) : undefined,\n };\n } else {\n return null;\n }\n };\n}\n\nfunction xrefView(ui: EditorUI): React.FC<XRef> {\n return (xref: XRef) => {\n const type = kXRefTypes[xref.type];\n const image = type?.image(ui) || ui.images.omni_insert?.generic!;\n\n return (\n <CompletionItemView\n width={350}\n classes={['pm-xref-completion-item']}\n image={image}\n title={xrefKey(xref)}\n subTitle={xref.title || ''}\n detail={xref.file}\n />\n );\n };\n}\n\nconst kGenericType = {\n image: (ui: EditorUI) => ui.images.omni_insert?.generic!,\n};\n\nconst kEqType = {\n image: (ui: EditorUI) =>\n ui.prefs.darkMode() ? ui.images.omni_insert?.math_display_dark : ui.images.omni_insert?.math_display,\n};\n\nconst kTableType = {\n image: (ui: EditorUI) => (ui.prefs.darkMode() ? ui.images.omni_insert?.table_dark : ui.images.omni_insert?.table),\n};\n\nexport const kXRefTypes: { [key: string]: { image: (ui: EditorUI) => string | undefined } } = {\n h1: {\n image: (ui: EditorUI) =>\n ui.prefs.darkMode() ? ui.images.omni_insert?.heading1_dark : ui.images.omni_insert?.heading1,\n },\n h2: {\n image: (ui: EditorUI) =>\n ui.prefs.darkMode() ? ui.images.omni_insert?.heading2_dark : ui.images.omni_insert?.heading2,\n },\n h3: {\n image: (ui: EditorUI) =>\n ui.prefs.darkMode() ? ui.images.omni_insert?.heading3_dark : ui.images.omni_insert?.heading3,\n },\n h4: {\n image: (ui: EditorUI) =>\n ui.prefs.darkMode() ? ui.images.omni_insert?.heading4_dark : ui.images.omni_insert?.heading4,\n },\n fig: {\n image: (ui: EditorUI) => (ui.prefs.darkMode() ? ui.images.omni_insert?.image_dark : ui.images.omni_insert?.image),\n },\n tab: kTableType,\n tbl:kTableType,\n eq: kEqType,\n thm: kEqType,\n lem: kEqType,\n cor: kEqType,\n prp: kEqType,\n cnj: kEqType,\n def: kEqType,\n exm: kGenericType,\n exr: kGenericType,\n};\n\nconst kTheoremType = {\n image: (ui: EditorUI) => (ui.prefs.darkMode() ? ui.images.xrefs?.theorem_dark : ui.images.xrefs?.theorem)\n};\n\n\nexport const kQuartoXRefTypes: { [key: string]: { image: (ui: EditorUI) => string | undefined } } = {\n sec: {\n image: (ui: EditorUI) => (ui.prefs.darkMode() ? ui.images.xrefs?.section_dark : ui.images.xrefs?.section)\n },\n fig: {\n image: (ui: EditorUI) => (ui.prefs.darkMode() ? ui.images.xrefs?.figure_dark : ui.images.xrefs?.figure),\n },\n tbl: {\n image: (ui: EditorUI) => (ui.prefs.darkMode() ? ui.images.xrefs?.table_dark : ui.images.xrefs?.table),\n },\n lst: {\n image: (ui: EditorUI) => (ui.prefs.darkMode() ? ui.images.xrefs?.listing_dark : ui.images.xrefs?.listing),\n },\n eq: {\n image: (ui: EditorUI) => (ui.prefs.darkMode() ? ui.images.xrefs?.equation_dark : ui.images.xrefs?.equation)\n },\n thm: kTheoremType,\n lem: kTheoremType,\n cor: kTheoremType,\n prp: kTheoremType,\n cnj: kTheoremType,\n def: kTheoremType,\n exm: kTheoremType,\n exr: kTheoremType,\n};","\n/*\n * cite-completion-search.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport Fuse from 'fuse.js';\n\nimport { CiteCompletionEntry } from \"./cite-completion\";\n\nconst searchFields: Fuse.FuseOptionKeyObject[] = [\n { name: 'id', weight: 30 },\n { name: 'index.secondary', weight: 30 },\n { name: 'index.tertiary', weight: 5 },\n];\n\nexport interface CiteCompletionSearch {\n setEntries: (entries: CiteCompletionEntry[]) => void;\n search: (searchTerm: string, limit: number) => CiteCompletionEntry[];\n exactMatch: (searchTerm: string) => boolean;\n}\n\nexport function completionIndex(defaultEntries?: CiteCompletionEntry[]): CiteCompletionSearch {\n // build search index\n const options = {\n isCaseSensitive: false,\n shouldSort: true,\n includeMatches: false,\n includeScore: false,\n minMatchCharLength: 3,\n threshold: 0.5,\n keys: searchFields,\n };\n\n defaultEntries = defaultEntries || [];\n const index = Fuse.createIndex<CiteCompletionEntry>(searchFields, defaultEntries);\n const fuse = new Fuse(defaultEntries, options, index);\n let indexedEntries: CiteCompletionEntry[] = [];\n\n return {\n setEntries: (entries: CiteCompletionEntry[]) => {\n fuse.setCollection(entries);\n indexedEntries = entries;\n },\n search: (searchTerm: string, limit: number): CiteCompletionEntry[] => {\n const results = fuse.search('^' + searchTerm, { ...options, limit });\n return results.map(result => result.item);\n },\n exactMatch: (searchTerm: string): boolean => {\n return indexedEntries.some(entry => entry.id === searchTerm);\n }\n };\n}","/*\n * cite-highlight.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { PluginKey } from 'prosemirror-state';\nimport { DecorationSet } from 'prosemirror-view';\nimport { Schema } from 'prosemirror-model';\n\nimport { markHighlightPlugin, markHighlightDecorations } from '../../api/mark-highlight';\n\nconst key = new PluginKey<DecorationSet>('cite-highlight');\n\nexport function citeHighlightPlugin(schema: Schema) {\n return markHighlightPlugin(key, schema.marks.cite, (text, _attrs, markRange) => {\n return markHighlightDecorations(markRange, text, /([\\[\\]])/g, 'pm-link-text-color pm-fixedwidth-font');\n });\n}\n","/*\n * cite-completion_doi.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView } from 'prosemirror-view';\nimport { EditorState, Transaction } from 'prosemirror-state';\n\nimport React from 'react';\n\nimport { EditorUI } from '../../api/ui';\nimport {\n CompletionHandler,\n CompletionResult,\n performCompletionReplacement,\n CompletionContext,\n} from '../../api/completion';\nimport { formatAuthors, formatIssuedDate } from '../../api/cite';\nimport { CSL, imageForType } from '../../api/csl';\nimport { CompletionItemDetailedView } from '../../api/widgets/completion-detailed';\nimport { BibliographyManager } from '../../api/bibliography/bibliography';\nimport { EditorServer } from '../../api/server';\nimport { DOIServer } from '../../api/doi';\n\nimport { doiFromEditingContext } from './cite-doi';\nimport { insertCitation } from './cite';\nimport { kCitationCompleteScope } from './cite-completion';\n\nconst kCompletionWidth = 400;\nconst kCompletionItemPadding = 10;\n\nexport function citationDoiCompletionHandler(\n ui: EditorUI,\n bibManager: BibliographyManager,\n server: EditorServer,\n): CompletionHandler<CSLEntry> {\n return {\n id: '56DA14DD-6E3A-4481-93A9-938DC00393A5',\n\n scope: kCitationCompleteScope,\n\n completions: citationDOICompletions(ui, server.doi, bibManager),\n\n replace(view: EditorView, pos: number, cslEntry: CSLEntry | null) {\n if (cslEntry && cslEntry.inBibliography) {\n // It's already in the bibliography, just write the id\n const tr = view.state.tr;\n const schema = view.state.schema;\n const id = schema.text(cslEntry.id, [schema.marks.cite_id.create()]);\n performCompletionReplacement(tr, pos, id);\n view.dispatch(tr);\n } else if (cslEntry) {\n // It isn't in the bibliography, show the insert cite dialog\n return insertCitation(view, cslEntry.csl.DOI || '', bibManager, pos, ui, server.pandoc, cslEntry.csl);\n }\n return Promise.resolve();\n },\n\n view: {\n component: CSLSourceView,\n key: cslEntry => cslEntry.csl.DOI,\n width: kCompletionWidth,\n height: 120,\n maxVisible: 5,\n hideNoResults: true,\n },\n };\n}\n\nconst kPRogressDelay = 350;\n\nfunction citationDOICompletions(ui: EditorUI, server: DOIServer, bibliographyManager: BibliographyManager) {\n return (_text: string, context: EditorState | Transaction): CompletionResult<CSLEntry> | null => {\n const parsedDOI = doiFromEditingContext(context);\n if (parsedDOI) {\n return {\n token: parsedDOI.token,\n pos: parsedDOI.pos,\n offset: parsedDOI.offset,\n completions: async (_state: EditorState, completionContext: CompletionContext) => {\n // If we have a local source that matches this DOI, just show the\n // completion for the entry\n await bibliographyManager.load(ui, context.doc);\n const source = bibliographyManager.findDoiInLocalBibliography(parsedDOI.token);\n if (source) {\n return [\n {\n id: source.id,\n csl: source,\n inBibliography: true,\n image: imageForType(ui.images, source.type)[ui.prefs.darkMode() ? 1 : 0],\n formattedAuthor: formatAuthors(source.author, 50),\n formattedIssueDate: formatIssuedDate(source.issued),\n },\n ];\n } else {\n return [];\n }\n },\n };\n }\n return null;\n };\n}\n\ninterface CSLEntry {\n id: string;\n csl: CSL;\n inBibliography: boolean;\n image?: string;\n formattedAuthor: string;\n formattedIssueDate: string;\n}\n\nconst CSLSourceView: React.FC<CSLEntry> = cslEntry => {\n const csl = cslEntry.csl;\n return (\n <CompletionItemDetailedView\n width={kCompletionWidth - kCompletionItemPadding}\n image={cslEntry.image}\n heading={csl['short-container-title'] || csl.publisher || ''}\n title={csl.title || ''}\n subTitle={`${cslEntry.formattedAuthor} ${cslEntry.formattedIssueDate}` || ''}\n />\n );\n};\n","/*\n * completion-detailed.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\n\nimport { WidgetProps } from './react';\n\nimport './completion-detailed.css';\n\nexport interface CompletionItemDetailedViewProps extends WidgetProps {\n width: number;\n image?: string;\n heading: string;\n title: string;\n subTitle: string;\n}\n\nexport const CompletionItemDetailedView: React.FC<CompletionItemDetailedViewProps> = props => {\n const className = ['pm-completion-detailed-item'].concat(props.classes || []).join(' ');\n const style: React.CSSProperties = {\n width: props.width + 'px',\n ...props.style,\n };\n\n return (\n <div className={className} style={style}>\n <div className={'pm-completion-detailed-item-type'}>\n <img className={'pm-block-border-color'} src={props.image} draggable=\"false\"/>\n </div>\n <div className={'pm-completion-item-detailed-summary'}>\n <div className={'pm-completion-item-detailed-heading'}>{props.heading}</div>\n <div className={'pm-completion-item-detailed-title'}>{props.title}</div>\n <div className={'pm-completion-item-detailed-subTitle'}>{props.subTitle}</div>\n </div>\n </div>\n );\n};\n","/*\n * cite-doi.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { Slice } from 'prosemirror-model';\n\nimport { findDOI } from '../../api/doi';\n\nimport { parseCitation, ParsedCitation } from './cite';\n\n// Parses the transation or state to determine whether the current position\n// represents a citation containing a DOI\nexport function doiFromEditingContext(context: EditorState | Transaction): ParsedCitation | undefined {\n \n const parsedCitation = parseCitation(context);\n if (parsedCitation) {\n const doi = findDOI(parsedCitation.token);\n if (doi) {\n return parsedCitation;\n }\n return undefined;\n }\n}\n\n// Parses a slice to determine whether the slice contains\n// a single DOI\nexport function doiFromSlice(context: EditorState | Transaction, slice: Slice): ParsedCitation | undefined {\n const parsedCitation = parseCitation(context);\n if (parsedCitation) {\n // Concatenate all the text and search for a DOI\n let text = '';\n slice.content.forEach(node => (text = text + node.textContent));\n if (text.length) {\n const doi = findDOI(text.trim());\n if (doi) {\n return { ...parsedCitation, token: doi };\n }\n }\n return undefined;\n }\n}\n","/*\n * cite-popup.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { PluginKey, Selection } from 'prosemirror-state';\nimport { DecorationSet, EditorView } from 'prosemirror-view';\n\nimport React from 'react';\n\nimport { EditorUI } from '../../api/ui';\nimport { textPopupDecorationPlugin, TextPopupTarget } from '../../api/text-popup';\nimport { WidgetProps } from '../../api/widgets/react';\nimport { Popup } from '../../api/widgets/popup';\nimport { BibliographyManager } from '../../api/bibliography/bibliography';\nimport { PandocServer } from '../../api/pandoc';\n\nimport './cite-popup.css';\nimport { urlForCitation } from '../../api/cite';\nimport { cslFromDoc } from '../../api/csl';\nimport { EditorServer } from '../../api/server';\n\nconst kMaxWidth = 400; // also in cite-popup.css\n\nexport function citePopupPlugin(schema: Schema, ui: EditorUI, bibMgr: BibliographyManager, server: EditorServer) {\n return textPopupDecorationPlugin({\n key: new PluginKey<DecorationSet>('cite-popup'),\n markType: schema.marks.cite_id,\n maxWidth: kMaxWidth,\n dismissOnEdit: true,\n makeLinksAccessible: true,\n createPopup: async (view: EditorView, target: TextPopupTarget, style: React.CSSProperties) => {\n await bibMgr.load(ui, view.state.doc);\n\n const citeId = target.text.replace(/^-@|^@/, '');\n\n // See if this will be handled by Xref\n let isXRef = false;\n const docPath = ui.context.getDocumentPath();\n if (docPath) {\n const xrefs = await server.xref.quartoXrefForId(docPath, citeId);\n isXRef = xrefs.refs.length > 0;\n }\n\n if (!isXRef) {\n const csl = cslFromDoc(view.state.doc);\n const source = bibMgr.findIdInLocalBibliography(citeId);\n\n if (source) {\n const previewHtml = await server.pandoc.citationHTML(\n ui.context.getDocumentPath(),\n JSON.stringify([source]),\n csl || null,\n );\n const finalHtml = ensureSafeLinkIsPresent(previewHtml, () => {\n const url = urlForCitation(source);\n if (url) {\n return {\n text: ui.context.translateText('[Link]'),\n url,\n };\n }\n });\n\n return <CitePopup previewHtml={finalHtml} style={style} />;\n }\n }\n return null;\n },\n specKey: (target: TextPopupTarget) => {\n return `cite:${target.text}`;\n },\n });\n}\n\nconst kCiteHangingIndentClass = 'hanging-indent';\nconst kCiteLinkClassName = 'pm-cite-popup-link';\n\nfunction ensureSafeLinkIsPresent(html: string, getLinkData: () => { text: string; url: string } | undefined) {\n const parser = new window.DOMParser();\n const doc = parser.parseFromString(html, 'text/html');\n\n // remove id, class, and role from main div\n const rootDiv = doc.body.getElementsByClassName('references');\n if (rootDiv.length > 0) {\n const classNames = rootDiv[0].getAttribute('class');\n const hasHangingIndent = classNames?.match(`(^|\\\\s)${kCiteHangingIndentClass}($|\\\\s)`);\n\n rootDiv[0].removeAttribute('id');\n rootDiv[0].removeAttribute('role');\n\n if (hasHangingIndent && hasHangingIndent.length > 0) {\n rootDiv[0].setAttribute('class', kCiteHangingIndentClass);\n } else {\n rootDiv[0].removeAttribute('class');\n }\n }\n\n const linkElements = doc.body.getElementsByTagName('a');\n if (linkElements.length === 0) {\n const linkData = getLinkData();\n\n // There aren't any links, we should append one\n // (If links are present, we assume that we shouldn't add another)\n const paragraphs = doc.body.getElementsByTagName('p');\n if (paragraphs.length === 1 && linkData) {\n // The paragraph containing the formatted source\n const paragraph = paragraphs[0];\n\n // Create a link to append\n const linkElement = doc.createElement('a');\n linkElement.innerText = linkData.text;\n linkElement.setAttribute('href', linkData.url);\n linkElement.setAttribute('class', `${kCiteLinkClassName} pm-link-text-color`);\n setLinkTarget(linkElement);\n\n // Append the link to the formatted source\n paragraph.appendChild(linkElement);\n }\n } else {\n // There are links, ensure all of them have appropriate target information\n // tslint:disable-next-line: prefer-for-of\n for (let i = 0; i < linkElements.length; i++) {\n linkElements[i].setAttribute('class', `pm-link-text-color`);\n setLinkTarget(linkElements[i]);\n }\n }\n\n // Return the HTML omitting CR/LF - CR\n return doc.body.innerHTML.replace(/\\r?\\n|\\r/g, '');\n}\n\nfunction setLinkTarget(linkElement: HTMLAnchorElement) {\n linkElement.setAttribute('target', '_blank');\n linkElement.setAttribute('rel', 'noopener noreferrer');\n}\n\ninterface CitePopupProps extends WidgetProps {\n previewHtml: string;\n}\n\nconst CitePopup: React.FC<CitePopupProps> = props => {\n return (\n <Popup classes={['pm-cite-popup']} style={props.style}>\n <div className=\"pm-cite-popup-preview\">\n <div dangerouslySetInnerHTML={{ __html: props.previewHtml || '' }} />\n </div>\n </Popup>\n );\n};\n","/*\n * cite-commands.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { ProsemirrorCommand, EditorCommandId, toggleMarkType } from '../../api/command';\nimport { canInsertNode } from '../../api/node';\nimport { EditorUI } from '../../api/ui';\nimport { OmniInsertGroup } from '../../api/omni_insert';\nimport { EditorEvents } from '../../api/events';\nimport { EditorServer } from '../../api/server';\nimport { BibliographyManager } from '../../api/bibliography/bibliography';\n\nimport { ensureSourcesInBibliography } from './cite';\nimport { showInsertCitationDialog, InsertCitationDialogResult } from '../../behaviors/insert_citation/insert_citation';\nimport { markIsActive, getMarkRange } from '../../api/mark';\n\nexport class InsertCitationCommand extends ProsemirrorCommand {\n private initialSelectionKey: string | undefined;\n\n constructor(ui: EditorUI, events: EditorEvents, bibliographyManager: BibliographyManager, server: EditorServer) {\n super(\n EditorCommandId.Citation,\n ['Shift-Mod-F8'],\n (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n // enable/disable command\n const schema = state.schema;\n if (!canInsertNode(state, schema.nodes.text) || !toggleMarkType(schema.marks.cite)(state)) {\n return false;\n }\n\n if (dispatch && view) {\n showInsertCitationDialog(\n ui,\n state.doc,\n bibliographyManager,\n server,\n async (result: InsertCitationDialogResult) => {\n if (result) {\n // Remember the last tree node that was selected\n this.initialSelectionKey = result.selectionKey;\n\n // Remember whether the citation is intext for the future\n ui.prefs.setCitationDefaultInText(result.intextCitationStyle);\n\n // The citations that we should insert\n const bibliographySources = result.bibliographySources;\n\n // The bibliography that we should insert sources into (if needed)\n const bibliography = result.bibliography;\n\n // The transaction that will hold all the changes we'll make\n const tr = state.tr;\n\n // First, be sure that we add any sources to the bibliography\n // and that the bibliography is properly configured\n const writeCiteId = await ensureSourcesInBibliography(\n tr,\n bibliographySources,\n bibliography,\n bibliographyManager,\n view,\n ui,\n server.pandoc,\n );\n\n if (writeCiteId) {\n // The starting location of this transaction\n const start = tr.selection.from;\n\n // See if we are already inside an active cite mark\n const alreadyInCite = markIsActive(tr, schema.marks.cite);\n const includeWrapper = !result.intextCitationStyle || result.bibliographySources.length > 1;\n\n // Insert the wrapping [] if the user wants that style citation\n // Note that if the use is inserting more than one citation, we ignore this and just\n // always perform a 'note' style citation insert\n // If we're already inside a cite including [], don't bother inserting wrapper\n if (!alreadyInCite && includeWrapper) {\n const wrapperText = schema.text('[]');\n tr.insert(tr.selection.from, wrapperText);\n\n // move the selection into the wrapper\n setTextSelection(tr.selection.from - 1)(tr);\n }\n\n // If the previous character is a part of a cite_id, advance to the end of the mark,\n // insert a separator, and then proceed\n const preCiteIdRange = getMarkRange(tr.doc.resolve(start - 1), schema.marks.cite_id);\n if (preCiteIdRange) {\n setTextSelection(preCiteIdRange.to)(tr);\n const separator = schema.text('; ');\n tr.insert(tr.selection.from, separator);\n }\n\n // insert the CiteId marks and text\n bibliographySources.forEach((citation, i) => {\n const citeIdMark = schema.marks.cite_id.create();\n const citeIdText = schema.text(`@${citation.id}`, [citeIdMark]);\n tr.insert(tr.selection.from, citeIdText);\n if (bibliographySources.length > 1 && i !== bibliographySources.length - 1) {\n tr.insert(tr.selection.from, schema.text('; ', []));\n }\n });\n\n // If the next character is a part of a cite_id, insert a separator (that will appear after the current citeId)\n const postCiteIdRange = getMarkRange(tr.doc.resolve(tr.selection.from + 1), schema.marks.cite_id);\n if (postCiteIdRange) {\n const separator = schema.text('; ');\n tr.insert(tr.selection.from, separator);\n }\n\n // Enclose wrapper in the cite mark (if not already in a cite)\n if (!alreadyInCite) {\n const endOfWrapper = includeWrapper ? tr.selection.from + 1 : tr.selection.from;\n const citeMark = schema.marks.cite.create();\n tr.addMark(start, endOfWrapper, citeMark);\n setTextSelection(endOfWrapper)(tr);\n }\n }\n\n // commit the transaction\n dispatch(tr);\n\n return Promise.resolve();\n }\n },\n this.initialSelectionKey,\n );\n }\n return true;\n },\n {\n name: ui.context.translateText('Citation...'),\n description: ui.context.translateText('Reference to a source'),\n group: OmniInsertGroup.References,\n priority: 1,\n image: () => (ui.prefs.darkMode() ? ui.images.omni_insert!.citation_dark! : ui.images.omni_insert!.citation!),\n },\n // false\n );\n }\n}\n","/*\n * insert_citation_picker.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\nimport ReactDOM from 'react-dom';\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport {\n BibliographyFile,\n BibliographyManager,\n bibliographyTypes,\n bibliographyFileForPath,\n BibliographySource,\n} from '../../api/bibliography/bibliography';\nimport { kInvalidCiteKeyChars } from '../../api/cite';\nimport { changeExtension } from '../../api/path';\nimport { EditorServer } from '../../api/server';\nimport { EditorUI } from '../../api/ui';\nimport { WidgetProps } from '../../api/widgets/react';\nimport { TagInput, TagItem } from '../../api/widgets/tag-input';\nimport { NavigationTreeNode, containsChild, NavigationTree } from '../../api/widgets/navigation-tree';\nimport { DialogButtons } from '../../api/widgets/dialog-buttons';\n\nimport {\n CitationSourcePanelProps,\n CitationSourcePanelProvider,\n CitationListEntry,\n CitationSourceListStatus,\n BibliographySourceProvider,\n CitationSourcePanelSearchResult,\n} from './source_panels/insert_citation-source-panel';\nimport { bibliographySourcePanel } from './source_panels/insert_citation-source-panel-bibliography';\nimport { doiSourcePanel } from './source_panels/insert_citation-source-panel-doi';\nimport { crossrefSourcePanel } from './source_panels/insert_citation-source-panel-crossref';\nimport { pubmedSourcePanel } from './source_panels/insert_citation-source-panel-pubmed';\nimport { dataciteSourcePanel } from './source_panels/insert_citation-source-panel-datacite';\nimport { CitationBibliographyPicker } from './insert_citation-bibliography-picker';\nimport { packageSourcePanel } from './source_panels/insert_citation-source-panel-packages';\n\nimport './insert_citation.css';\nimport debounce from 'lodash.debounce';\nimport { CheckboxInput } from '../../api/widgets/checkbox-input';\n\n\n// When the dialog has completed, it will return this result\n// If the dialog is canceled no result will be returned\nexport interface InsertCitationDialogResult {\n bibliographySources: BibliographySource[];\n bibliography: BibliographyFile;\n intextCitationStyle: boolean;\n selectionKey?: string;\n}\n\n// Show the insert citation dialog and returns the\n// items that should be inserted, the bibliography in which to write them\n// and the last selected position in the tree\nexport async function showInsertCitationDialog(\n ui: EditorUI,\n doc: ProsemirrorNode,\n bibliographyManager: BibliographyManager,\n server: EditorServer,\n performInsertCitations: (result: InsertCitationDialogResult) => Promise<void>,\n initiallySelectedNodeKey?: string,\n): Promise<boolean> {\n // The result that will be returned to the called\n let result: InsertCitationDialogResult | undefined;\n\n // Present the dialog\n const performInsert = await ui.dialogs.htmlDialog(\n 'Insert Citation',\n 'Insert',\n (\n containerWidth: number,\n containerHeight: number,\n confirm: VoidFunction,\n cancel: VoidFunction,\n showProgress: (message: string) => void,\n hideProgress: VoidFunction,\n ) => {\n const kMaxHeight = 650;\n const kMaxWidth = 900;\n const kMaxHeightProportion = 0.9;\n const kdialogPaddingIncludingButtons = 70;\n\n const windowHeight = containerHeight;\n const windowWidth = containerWidth;\n\n const height = Math.min(kMaxHeight, windowHeight * kMaxHeightProportion - kdialogPaddingIncludingButtons);\n const width = Math.max(Math.min(kMaxWidth, windowWidth * 0.9), 550);\n\n const container = window.document.createElement('div');\n container.className = 'pm-default-theme';\n\n // Provide the providers top the dialog and then refresh the bibliography and reload\n // the items\n const providersForBibliography = (writable: boolean) => {\n return writable\n ? [\n bibliographySourcePanel(doc, ui, bibliographyManager),\n doiSourcePanel(ui, server.doi, bibliographyManager),\n crossrefSourcePanel(ui, server.crossref, server.doi, bibliographyManager),\n dataciteSourcePanel(ui, server.datacite, server.doi, bibliographyManager),\n pubmedSourcePanel(ui, server.pubmed, server.doi, bibliographyManager),\n packageSourcePanel(ui, server.environment)\n ]\n : [bibliographySourcePanel(doc, ui, bibliographyManager)];\n };\n\n // Provide a configuration stream that will update after the bibliography loads\n let updatedConfiguration: InsertCitationPanelConfiguration | undefined;\n const configurationStream: InsertCitationPanelConfigurationStream = {\n current: {\n providers: providersForBibliography(bibliographyManager.allowsWrites()),\n bibliographyFiles: bibliographyManager.bibliographyFiles(doc, ui),\n existingIds: bibliographyManager.localSources().map(source => source.id),\n },\n stream: () => {\n return updatedConfiguration || null;\n },\n };\n\n // Load the bibliography and then update the configuration\n bibliographyManager.load(ui, doc, true).then(() => {\n updatedConfiguration = {\n providers: providersForBibliography(bibliographyManager.allowsWrites()),\n bibliographyFiles: bibliographyManager.bibliographyFiles(doc, ui),\n existingIds: bibliographyManager.localSources().map(source => source.id),\n };\n });\n\n // Handles the confirmation by the user\n const onOk = async (\n bibliographySourceProviders: BibliographySourceProvider[],\n bibliography: BibliographyFile,\n selectedNode: NavigationTreeNode,\n intextCitationStyle: boolean\n ) => {\n // Because some bibliography entries will need to download their CSL (based upon the\n // DOI), we need to keep the dialog alive so we can use it to show progress. As a result\n // rather than waiting for the dialog to be dismissed and using the result, we do the work\n // here ahead of calling 'confirm'. But confirm also provides the validation message for the\n // dialog, so we still call 'confirm' even if we know it isn't valid (no citations selected)\n // so the validation message can be displayed to the user.\n if (bibliographySourceProviders.length > 0) {\n\n // Look through the items and see whether any will be slow\n // If some are slow, show progress\n const requiresProgress = bibliographySourceProviders.some(\n sourceProvider => sourceProvider.isSlowGeneratingBibliographySource,\n );\n if (requiresProgress) {\n showProgress(\n ui.context.translateText(\n bibliographySourceProviders.length === 1\n ? 'Creating bibliography entry...'\n : 'Creating bibliography entries...',\n ),\n );\n }\n\n // Generate bibliography sources for each of the entries\n const bibliographySources = await Promise.all(\n bibliographySourceProviders.map(sourceProvider => sourceProvider.toBibliographySource(sourceProvider.id)),\n );\n result = {\n bibliographySources,\n bibliography,\n intextCitationStyle,\n selectionKey: selectedNode.key,\n };\n\n // Notify the caller to perform the inseration\n await performInsertCitations(result);\n\n // Clear progress\n if (requiresProgress) {\n hideProgress();\n }\n }\n // Dismiss the dialog\n confirm();\n };\n\n container.style.width = width + 'px';\n ReactDOM.render(\n <InsertCitationPanel\n height={height}\n width={width}\n configuration={configurationStream}\n initiallySelectedNodeKey={initiallySelectedNodeKey}\n onOk={onOk}\n onCancel={cancel}\n doc={doc}\n ui={ui}\n />,\n container,\n );\n return container;\n },\n () => {\n // Focus\n // dealt with in the React Component itself\n },\n () => {\n // Validation\n // User has to select a citation, everything else we can use defaults\n if (!result || result.bibliographySources.length === 0) {\n return ui.context.translateText('Please select at least one citation to insert.');\n }\n return null;\n },\n );\n\n // return the result to the caller\n if (performInsert && result) {\n return Promise.resolve(true);\n } else {\n return Promise.resolve(false);\n }\n}\n\ninterface InsertCitationPanelConfiguration {\n providers: CitationSourcePanelProvider[];\n bibliographyFiles: BibliographyFile[];\n existingIds: string[];\n}\n\ninterface InsertCitationPanelConfigurationStream {\n current: InsertCitationPanelConfiguration;\n stream: () => InsertCitationPanelConfiguration | null;\n}\n\n// The picker is a full featured UI for finding and selecting citation data\n// to be added to a document.\ninterface InsertCitationPanelProps extends WidgetProps {\n ui: EditorUI;\n doc: ProsemirrorNode;\n height: number;\n width: number;\n configuration: InsertCitationPanelConfigurationStream;\n initiallySelectedNodeKey?: string;\n onOk: (\n bibliographySourceProviders: BibliographySourceProvider[],\n bibliography: BibliographyFile,\n selectedNode: NavigationTreeNode,\n intextCitationStyle: boolean\n ) => void;\n onCancel: () => void;\n}\n\ninterface InsertCitationPanelState {\n citations: CitationListEntry[];\n citationsToAdd: CitationListEntry[];\n selectedIndex: number;\n searchTerm: string;\n selectedNode: NavigationTreeNode;\n status: CitationSourceListStatus;\n statusMessage: string;\n existingBibliographyFile: BibliographyFile;\n createBibliographyFile: BibliographyFile;\n intextCitationStyle: boolean;\n}\n\ninterface InsertCitationPanelUpdateState {\n citations?: CitationListEntry[];\n citationsToAdd?: CitationListEntry[];\n selectedIndex?: number;\n searchTerm?: string;\n selectedNode?: NavigationTreeNode;\n status?: CitationSourceListStatus;\n statusMessage?: string;\n existingBibliographyFile?: BibliographyFile;\n createBibliographyFile?: BibliographyFile;\n intextCitationStyle?: boolean;\n}\n\nexport const InsertCitationPanel: React.FC<InsertCitationPanelProps> = props => {\n // The configuration state of this panel\n const [insertCitationConfiguration, setInsertCitationConfiguration] = React.useState<\n InsertCitationPanelConfiguration\n >(props.configuration.current);\n\n // The source data for the tree\n const treeSourceData = insertCitationConfiguration.providers.map(panel => panel.treeNode());\n\n // The selected provider / panel for the dialog\n const defaultNode = nodeForKey(treeSourceData, props.initiallySelectedNodeKey);\n const [selectedPanelProvider, setSelectedPanelProvider] = React.useState<CitationSourcePanelProvider>(\n panelForNode(insertCitationConfiguration.providers, defaultNode) || insertCitationConfiguration.providers[0],\n );\n\n // Holder of the dialog state\n const [insertCitationPanelState, setInsertCitationPanelState] = React.useState<InsertCitationPanelState>({\n citations: [],\n citationsToAdd: [],\n selectedIndex: -1,\n searchTerm: '',\n selectedNode: defaultNode || selectedPanelProvider.treeNode(),\n status: CitationSourceListStatus.default,\n statusMessage: selectedPanelProvider.placeHolderMessage || '',\n existingBibliographyFile: props.configuration.current.bibliographyFiles[0],\n createBibliographyFile: bibliographyFileForPath(\n changeExtension(\n 'references.json',\n props.ui.prefs.bibliographyDefaultType() || bibliographyTypes(props.ui)[0].extension,\n ),\n props.ui,\n ),\n intextCitationStyle: props.ui.prefs.citationDefaultInText()\n });\n\n // Core method to update dialog state\n const updateState = (updatedState: InsertCitationPanelUpdateState) => {\n const newState = {\n ...insertCitationPanelState,\n ...updatedState,\n };\n setInsertCitationPanelState(newState);\n };\n\n // The dialog intelligently manages and merges the selected item and the explicitly added items\n // This is the merged set of citations based upon the explicitly chosen and currently selected citations\n const displayedCitations = insertCitationPanelState.citations.filter(\n citation => !insertCitationPanelState.citationsToAdd.includes(citation),\n );\n const selectedCitation =\n insertCitationPanelState.selectedIndex > -1\n ? displayedCitations[insertCitationPanelState.selectedIndex]\n : undefined;\n const mergedCitationsToAdd = mergeCitations(insertCitationPanelState.citationsToAdd, selectedCitation);\n const existingCitationIds = [\n ...insertCitationConfiguration.existingIds,\n ...mergedCitationsToAdd.map(citation => citation.id),\n ];\n\n // The initial setting of focus and loading of data for the panel.\n const panelRef = React.useRef<any>(undefined);\n\n // When the stream of configuration changes is actually loaded, we need to refresh the search\n // results to reflect the new configuration. The below refs basically:\n // 1) Capture the timer itself so only timer is created and it will be properly canceled\n // 2) Captures the up to date state in the callback that will be used to refresh the search results -\n // If we don't refresh it each render, it will capture the state the time it was created\n const streamTimerId = React.useRef<NodeJS.Timeout>();\n const refreshSearchCallback = React.useRef<VoidFunction>();\n React.useEffect(() => {\n refreshSearchCallback.current = async () => {\n if (selectedPanelProvider.typeAheadSearch) {\n // Once the configurations, refresh the search\n selectedPanelProvider.typeAheadSearch(\n insertCitationPanelState.searchTerm,\n insertCitationPanelState.selectedNode,\n insertCitationConfiguration.existingIds,\n (results: CitationSourcePanelSearchResult) => {\n updateState({\n searchTerm: '',\n citations: results?.citations || [],\n status: results?.status || CitationSourceListStatus.default,\n statusMessage: results?.statusMessage || selectedPanelProvider.placeHolderMessage,\n });\n }\n );\n }\n };\n });\n\n React.useEffect(() => {\n // Set initial focus\n if (panelRef.current) {\n setTimeout(() => {\n panelRef.current.focus();\n }, 200);\n }\n\n // Poll the configuration stream for updates\n // We need to keep the Timeout to clear around as ref so\n // it survives any renders\n streamTimerId.current = setInterval(() => {\n const result = props.configuration.stream();\n if (result !== null) {\n if (streamTimerId.current) {\n clearInterval(streamTimerId.current);\n }\n\n setInsertCitationConfiguration(result);\n const panelProvider = panelForNode(result.providers, insertCitationPanelState.selectedNode);\n if (panelProvider) {\n setSelectedPanelProvider(panelProvider);\n }\n if (refreshSearchCallback.current) {\n refreshSearchCallback.current();\n }\n }\n }, 200);\n\n // Set the default state to initialize the first search\n if (selectedPanelProvider.typeAheadSearch) {\n selectedPanelProvider.typeAheadSearch(\n '',\n insertCitationPanelState.selectedNode,\n insertCitationConfiguration.existingIds,\n (result: CitationSourcePanelSearchResult) => {\n updateState({\n searchTerm: '',\n citations: result?.citations || [],\n status: result?.status || CitationSourceListStatus.default,\n statusMessage: result?.statusMessage || selectedPanelProvider.placeHolderMessage,\n });\n }\n );\n }\n }, []);\n\n // When the user presses the insert button\n const onOk = () => {\n props.onOk(\n mergedCitationsToAdd,\n insertCitationPanelState.existingBibliographyFile || insertCitationPanelState.createBibliographyFile,\n insertCitationPanelState.selectedNode,\n insertCitationPanelState.intextCitationStyle\n );\n };\n\n // Style properties\n const style: React.CSSProperties = {\n width: props.width + 'px',\n ...props.style,\n };\n\n // Figure out the panel height (the height of the main panel less padding and other elements)\n const panelHeight = props.height * 0.75;\n\n // In order to debounce typeahead search, we need to memoize the callback so the same debounce function will be\n // used even when renders happen. Be sure to pass everything that need to reflect updated state since\n // otherwise the value will be captured when the callback is memoized.\n const memoizedTypeaheadSearch = React.useCallback(\n debounce(\n (\n searchTerm: string,\n panelProvider: CitationSourcePanelProvider,\n existingIds: string[],\n existingState: InsertCitationPanelState\n ) => {\n if (panelProvider.typeAheadSearch) {\n panelProvider.typeAheadSearch(searchTerm, existingState.selectedNode, existingIds, (result: CitationSourcePanelSearchResult) => {\n setInsertCitationPanelState(\n {\n ...existingState,\n searchTerm,\n citations: result?.citations,\n status: result?.status,\n statusMessage: result?.statusMessage,\n }\n );\n });\n }\n },\n 30,\n ),\n [],\n );\n\n // The core props that will be passed to whatever the selected panel is\n // This implements the connection of the panel events and data and the\n // core dialog state\n const citationProps: CitationSourcePanelProps = {\n ui: props.ui,\n height: panelHeight,\n citations: displayedCitations,\n citationsToAdd: mergedCitationsToAdd,\n searchTerm: insertCitationPanelState.searchTerm,\n onSearchTermChanged: (term: string) => {\n const updatedState = { ...insertCitationPanelState, searchTerm: term };\n updateState(updatedState);\n memoizedTypeaheadSearch(term, selectedPanelProvider, insertCitationConfiguration.existingIds, updatedState);\n },\n onExecuteSearch: (searchTerm: string) => {\n searchCanceled.current = false;\n updateState({\n searchTerm,\n status: CitationSourceListStatus.inProgress,\n statusMessage: selectedPanelProvider.progressMessage,\n });\n if (selectedPanelProvider.search) {\n selectedPanelProvider\n .search(searchTerm, insertCitationPanelState.selectedNode, existingCitationIds)\n .then(searchResult => {\n if (!searchCanceled.current) {\n // If only a single result is returned, select that by default\n const selectedIndex = searchResult?.citations.length === 1 ? 0 : -1;\n\n updateState({\n searchTerm,\n citations: searchResult?.citations,\n status: searchResult?.status,\n statusMessage: searchResult?.statusMessage,\n selectedIndex,\n });\n }\n });\n }\n },\n onAddCitation: (citation: CitationListEntry) => {\n const newCitations = [...insertCitationPanelState.citationsToAdd, citation];\n updateState({ selectedIndex: -1, citationsToAdd: newCitations });\n },\n onRemoveCitation: (citation: CitationListEntry) => {\n deleteCitation(citation.id);\n },\n selectedIndex: insertCitationPanelState.selectedIndex,\n onSelectedIndexChanged: (index: number) => {\n updateState({ selectedIndex: index });\n },\n onConfirm: onOk,\n status: insertCitationPanelState.status,\n statusMessage: insertCitationPanelState.statusMessage,\n warningMessage: selectedPanelProvider.warningMessage || '',\n ref: panelRef,\n };\n\n // Tracks whether a long running search has been canceled\n // for example by the user navigating to another section of the dialog\n const searchCanceled = React.useRef<boolean>(false);\n\n // This implements the connection of the dialog (non-provider panel) events and data and the\n // core dialog state\n const onNodeSelected = async (node: NavigationTreeNode) => {\n const suggestedPanel = panelForNode(insertCitationConfiguration.providers, node);\n if (suggestedPanel) {\n\n // Clear the current displayed citations\n updateState({ citations: [], selectedNode: node, status: CitationSourceListStatus.default, statusMessage: \"\" });\n searchCanceled.current = true;\n if (suggestedPanel.typeAheadSearch) {\n suggestedPanel.typeAheadSearch('', node, insertCitationConfiguration.existingIds, (result: CitationSourcePanelSearchResult) => {\n updateState({\n searchTerm: '',\n citations: result?.citations || [],\n status: result?.status || CitationSourceListStatus.default,\n statusMessage: result?.statusMessage || suggestedPanel.placeHolderMessage,\n selectedNode: node,\n });\n });\n }\n\n if (suggestedPanel?.key !== selectedPanelProvider?.key) {\n setSelectedPanelProvider(suggestedPanel);\n }\n }\n };\n\n const deleteCitation = (id: string) => {\n\n // First, see if the item we're delete is the selection\n const selCite = displayedCitations[insertCitationPanelState.selectedIndex];\n if (selCite && selCite.id === id) {\n // This is the selected index, just clear the selection\n updateState({ selectedIndex: -1 });\n } else {\n // This is an explicitly added citation, remove it\n const filteredCitations = insertCitationPanelState.citationsToAdd.filter(source => source.id !== id);\n updateState({ citationsToAdd: filteredCitations });\n }\n };\n\n const onTagDeleted = (tag: TagItem) => {\n deleteCitation(tag.key);\n };\n\n const onTagChanged = (key: string, text: string) => {\n // Edit any matching entries in the citation basket\n const targetSource = insertCitationPanelState.citationsToAdd.find(source => source.id === key);\n if (targetSource) {\n targetSource.id = text;\n }\n\n // Edit the currently selected item\n if (insertCitationPanelState.selectedIndex > -1) {\n const currentlySelectedCitation = insertCitationPanelState.citations[insertCitationPanelState.selectedIndex];\n if (currentlySelectedCitation && currentlySelectedCitation.id === key) {\n currentlySelectedCitation.id = text;\n }\n }\n };\n\n const onTagValidate = (key: string, text: string) => {\n const invalidChars = text.match(kInvalidCiteKeyChars);\n if (invalidChars) {\n return props.ui.context.translateText(\n 'The citekey includes invalid characters such as a space or a special character.',\n );\n }\n return null;\n };\n\n const onBibliographyFileChanged = (biblographyFile: BibliographyFile) => {\n updateState({ existingBibliographyFile: biblographyFile });\n };\n\n const onCreateBibliographyFileNameChanged = (fileName: string) => {\n updateState({ createBibliographyFile: bibliographyFileForPath(fileName, props.ui) });\n };\n\n const onCitationStyleChanged = (e: React.ChangeEvent<HTMLInputElement>) => {\n updateState({\n intextCitationStyle: e.target.checked\n });\n };\n\n // Support keyboard shortcuts for dismissing dialog\n const onKeyPress = (event: React.KeyboardEvent) => {\n if (event.key === 'Enter') {\n event.preventDefault();\n event.stopPropagation();\n onOk();\n }\n };\n\n // Esc can cause loss of focus so catch it early\n const onKeyDown = (event: React.KeyboardEvent) => {\n if (event.key === 'Escape') {\n event.stopPropagation();\n props.onCancel();\n }\n };\n\n const totalCitationCount = insertCitationPanelState.citationsToAdd.length + (insertCitationPanelState.selectedIndex > -1 ? 1 : 0);\n\n\n // Create the panel that should be displayed for the selected node of the tree\n const panelToDisplay = selectedPanelProvider\n ? React.createElement(selectedPanelProvider.panel, citationProps)\n : undefined;\n return (\n <div className=\"pm-cite-panel-container\" style={style} onKeyPress={onKeyPress} onKeyDown={onKeyDown}>\n <div className=\"pm-cite-panel-cite-selection\">\n <div className=\"pm-cite-panel-cite-selection-sources pm-block-border-color pm-background-color\">\n <NavigationTree\n height={panelHeight}\n nodes={treeSourceData}\n selectedNode={insertCitationPanelState.selectedNode}\n onSelectedNodeChanged={onNodeSelected}\n />\n </div>\n <div className=\"pm-cite-panel-cite-selection-items\">{panelToDisplay}</div>\n </div>\n <div className=\"pm-cite-panel-selected-cites pm-block-border-color pm-background-color\">\n <TagInput\n tags={mergedCitationsToAdd.map(source => ({\n key: source.id,\n displayText: source.id,\n displayPrefix: '@',\n isEditable: source.isIdEditable,\n }))}\n onTagDeleted={onTagDeleted}\n onTagChanged={onTagChanged}\n onTagValidate={onTagValidate}\n ui={props.ui}\n placeholder={props.ui.context.translateText('Selected Citation Keys')}\n maxDisplayCharacters={50}\n />\n </div>\n <div className=\"pm-cite-panel-insert-inputs\">\n <div className=\"pm-cite-panel-insert-options\">\n {// Only show the picker if there are either no bibliographies specified, or if there are writable bibliographies\n insertCitationConfiguration.bibliographyFiles.length === 0 ||\n insertCitationConfiguration.bibliographyFiles.some(bibFile => bibFile?.writable) ? (\n <CitationBibliographyPicker\n bibliographyTypes={bibliographyTypes(props.ui)}\n createBibliographyFileName={insertCitationPanelState.createBibliographyFile.displayPath}\n onCreateBibliographyFileNameChanged={onCreateBibliographyFileNameChanged}\n bibliographyFiles={insertCitationConfiguration.bibliographyFiles}\n onBiblographyFileChanged={onBibliographyFileChanged}\n ui={props.ui}\n />\n ) : (\n <div />\n )}\n {\n totalCitationCount <= 1 ? (\n <div className='pm-cite-panel-checkbox-group'>\n <CheckboxInput\n id='intextStyleCheckbox'\n checked={insertCitationPanelState.intextCitationStyle}\n className='pm-cite-panel-checkbox'\n onChange={onCitationStyleChanged} />\n <label htmlFor='intextStyleCheckbox' className='pm-cite-panel-checkbox-label'>{props.ui.context.translateText('Use in-text citation')}</label>\n </div>\n ) : (\n <div />\n )}\n\n </div>\n\n <DialogButtons\n okLabel={props.ui.context.translateText('Insert')}\n cancelLabel={props.ui.context.translateText('Cancel')}\n onOk={onOk}\n onCancel={props.onCancel}\n />\n </div>\n </div>\n );\n};\n\n// Finds the panel associated with the selected tree node\nconst panelForNode = (sourcePanels: CitationSourcePanelProvider[], node?: NavigationTreeNode) => {\n if (node) {\n const panelItem = sourcePanels.find(panel => {\n const panelTreeNode = panel.treeNode();\n return containsChild(node.key, panelTreeNode);\n });\n return panelItem;\n } else {\n return undefined;\n }\n};\n\n// Given a key, find the node associated with the key (useful for restoring a selected node from a key)\nconst nodeForKey = (nodes: NavigationTreeNode[], key?: string): NavigationTreeNode | undefined => {\n if (!key) {\n return undefined;\n }\n\n for (const node of nodes) {\n if (node.key === key) {\n return node;\n }\n const childNode = nodeForKey(node.children, key);\n if (childNode) {\n return childNode;\n }\n }\n return undefined;\n};\n\n// Merge the selected citation into the list that is displayed for add and filter it\n// out of the citation list itself\nconst mergeCitations = (toAdd: CitationListEntry[], selected?: CitationListEntry) => {\n if (!selected) {\n return toAdd;\n } else {\n if (toAdd.map(citation => citation.id).includes(selected.id)) {\n return toAdd;\n } else {\n return (toAdd || []).concat(selected);\n }\n }\n};\n","/*\n * tag-input.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\n\nimport { WidgetProps } from './react';\n\nimport { EditorUI } from '../ui';\n\nimport './tag-input.css';\nimport { TextInput } from './text';\nimport { kAlertTypeError } from '../ui-dialogs';\n\n// Item representing a tag entry\n// The key remains stable even if the tag is edited\n// The displayPrefix will be displayed to the user, but removed when editing\nexport interface TagItem {\n key: string;\n displayText: string;\n displayPrefix: string;\n isEditable?: boolean;\n}\n\ninterface TagInputProps extends WidgetProps {\n tags: TagItem[];\n onTagDeleted: (tag: TagItem) => void;\n onTagChanged: (key: string, text: string) => void;\n onTagValidate?: (key: string, text: string) => string | null;\n ui: EditorUI;\n placeholder?: string;\n maxDisplayCharacters?: number;\n}\n\nexport const TagInput = React.forwardRef<HTMLDivElement, TagInputProps>((props, ref) => {\n return (\n <div style={props.style} className=\"pm-tag-input-container\" ref={ref}>\n {props.tags.length === 0 ? (\n <div className=\"pm-tag-input-placeholder\">\n <div className=\"pm-placeholder-text-color\">{props.placeholder}</div>\n </div>\n ) : (\n undefined\n )}\n {props.tags.map(tag => (\n <Tag\n key={tag.key}\n tag={tag}\n onTagDeleted={props.onTagDeleted}\n onTagChanged={props.onTagChanged}\n onTagValidate={props.onTagValidate}\n ui={props.ui}\n maxDisplayCharacters={props.maxDisplayCharacters}\n />\n ))}\n </div>\n );\n});\n\ninterface TagProps extends WidgetProps {\n tag: TagItem;\n onTagDeleted: (tag: TagItem) => void;\n onTagChanged: (key: string, text: string) => void;\n onTagValidate?: (key: string, text: string) => string | null;\n ui: EditorUI;\n maxDisplayCharacters?: number;\n}\n\nconst Tag: React.FC<TagProps> = props => {\n const [editing, setEditing] = React.useState<boolean>(false);\n const [editingText, setEditingText] = React.useState<string>(props.tag.displayText);\n const [displayText, setDisplayText] = React.useState<string>(props.tag.displayText);\n\n const editImage = React.useRef<HTMLImageElement>(null);\n const showingValidationError = React.useRef<boolean>(false);\n const restoreFocusAfterCancel = React.useRef<boolean>(false);\n\n // Anytime we begin editing, focus the text input\n const editTextInput = React.useRef<HTMLInputElement>(null);\n React.useLayoutEffect(() => {\n if (editing) {\n editTextInput.current?.focus();\n } else if (restoreFocusAfterCancel.current) {\n // Focus the edit image\n editImage.current?.focus();\n restoreFocusAfterCancel.current = false;\n }\n }, [editing]);\n\n // Click the delete icon\n const onDeleteClick = (e: React.MouseEvent) => {\n props.onTagDeleted(props.tag);\n };\n\n // Enter or space while delete icon focused\n const onDeleteKeyPress = (e: React.KeyboardEvent) => {\n switch (e.key) {\n case 'Enter':\n case ' ':\n e.preventDefault();\n e.stopPropagation();\n props.onTagDeleted(props.tag);\n break;\n }\n };\n\n // Click on the edit icon\n const onEditClick = (e: React.MouseEvent) => {\n if (props.tag.isEditable) {\n setEditing(true);\n }\n };\n\n // Enter or space while edit icon is focused\n const onEditKeyPress = (e: React.KeyboardEvent) => {\n switch (e.key) {\n case 'Enter':\n case ' ':\n e.preventDefault();\n e.stopPropagation();\n setEditing(true);\n break;\n }\n };\n\n // Commit edits to the tag\n const commitTagEdit = () => {\n // Validate the input\n if (props.onTagValidate) {\n const validationMessage = props.onTagValidate(props.tag.key, editingText);\n if (validationMessage !== null) {\n showingValidationError.current = true;\n props.ui.dialogs\n .alert(\n props.ui.context.translateText(validationMessage),\n props.ui.context.translateText('Validation Error'),\n kAlertTypeError,\n )\n .then(() => {\n editTextInput.current?.focus();\n showingValidationError.current = false;\n });\n return;\n }\n }\n\n // Update the text\n setDisplayText(editingText);\n\n // Halt editing\n setEditing(false);\n\n // Notify of change\n props.onTagChanged(props.tag.key, editingText);\n\n // Focus the edit image\n editImage.current?.focus();\n };\n\n const cancelTagEdit = () => {\n // Halt editing\n setEditing(false);\n\n // Revert editing text\n setEditingText(displayText);\n\n // The editing control will lose focus, so we need to focus something else\n restoreFocusAfterCancel.current = true;\n };\n\n // When editing the tag, allow enter to accept the changes\n const handleEditKeyDown = (e: React.KeyboardEvent) => {\n switch (e.key) {\n case 'Enter':\n // If we're validiating, don't commit.\n if (showingValidationError.current) {\n return;\n }\n e.preventDefault();\n e.stopPropagation();\n commitTagEdit();\n break;\n case 'Escape':\n e.preventDefault();\n e.stopPropagation();\n cancelTagEdit();\n break;\n }\n };\n\n // When editing, clicking away from the tag will accept changes\n const handleEditBlur = () => {\n // If we're validiating, don't commit.\n if (showingValidationError.current) {\n return;\n }\n commitTagEdit();\n };\n\n const handleEditChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const edittedText = e.target.value;\n setEditingText(edittedText);\n };\n\n return (\n <div key={props.tag.displayText} className=\"pm-tag-input-tag pm-block-border-color\">\n <img\n src={props.ui.images.widgets?.tag_delete}\n onClick={onDeleteClick}\n onKeyPress={onDeleteKeyPress}\n className=\"pm-tag-input-delete-image\"\n tabIndex={0}\n draggable=\"false\"\n />\n <div className={`pm-tag-input-text ${props.tag.isEditable ? 'pm-tag-input-text-edittable' : undefined}`}>\n {!editing ? (\n <div onClick={onEditClick} className=\"pm-tag-input-text-raw pm-text-color\">\n {props.tag.displayPrefix}\n {props.maxDisplayCharacters ? \n displayText.length > props.maxDisplayCharacters ? displayText.substr(0, props.maxDisplayCharacters - 1) + '…' : displayText: \n displayText}\n </div>\n ) : (\n <TextInput\n width={props.maxDisplayCharacters ? \n `${Math.min(props.maxDisplayCharacters, editingText.length)}ch` :\n `${editingText.length}ch`\n }\n ref={editTextInput}\n className=\"pm-tag-input-text-edit\"\n value={editingText}\n onChange={handleEditChange}\n onKeyDown={handleEditKeyDown}\n onBlur={handleEditBlur}\n />\n )}\n </div>\n {props.tag.isEditable ? (\n <img\n src={props.ui.images.widgets?.tag_edit}\n className=\"pm-tag-input-edit-image\"\n onClick={onEditClick}\n onKeyPress={onEditKeyPress}\n tabIndex={0}\n ref={editImage}\n draggable=\"false\"\n />\n ) : (\n undefined\n )}\n </div>\n );\n};\n","/*\n * navigation-tree.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React, { CSSProperties } from 'react';\n\nimport { WidgetProps } from './react';\nimport { FixedSizeList, ListChildComponentProps } from 'react-window';\n\nimport './navigation-tree.css';\n\n// Individual nodes and children of the Select Tree\nexport interface NavigationTreeNode {\n key: string;\n image?: string;\n name: string;\n type: string;\n children: NavigationTreeNode[];\n expanded?: boolean;\n}\n\ninterface NavigationTreeProps extends WidgetProps {\n height: number;\n nodes: NavigationTreeNode[];\n selectedNode: NavigationTreeNode;\n onSelectedNodeChanged: (node: NavigationTreeNode) => void;\n}\n\ninterface NavigationTreeItemProps extends ListChildComponentProps {\n data: {\n nodes: NavigationTreeNode[];\n selectedNode: NavigationTreeNode;\n onSelectedNodeChanged: (node: NavigationTreeNode) => void;\n showSelection: boolean;\n preventFocus: boolean;\n };\n}\n\n// Indent level for each level\nconst kNavigationTreeIndent = 8;\n\n// Select Tree is a single selection tree that is useful in\n// hierarchical navigation type contexts. It does not support\n// multiple selection and is generally not a well behaved tree\n// like you would use to navigate a hierarchical file system.\nexport const NavigationTree: React.FC<NavigationTreeProps> = props => {\n const style: CSSProperties = {\n height: props.height + 'px',\n ...props.style,\n };\n\n // The currently selected node should always be expanded\n const selectedNode = props.selectedNode;\n\n // Ensure that all the parents of the selected node are expanded\n const nodes = props.nodes;\n const currentNodePath = pathToNode(selectedNode, nodes);\n currentNodePath.forEach(node => (node.expanded = true));\n const selNode = nodes.find(n => n.key === selectedNode.key);\n if (selNode) {\n selNode.expanded = true;\n }\n const vizNodes = visibleNodes(props.nodes, props.selectedNode);\n\n // Ensure the item is scrolled into view\n const fixedList = React.useRef<FixedSizeList>(null);\n React.useEffect(() => {\n if (props.selectedNode) {\n vizNodes.find((value, index) => {\n if (value.key === selectedNode.key) {\n fixedList.current?.scrollToItem(index);\n return true;\n }\n });\n }\n });\n\n // Process keys to enable keyboard based navigation\n const processKey = (e: React.KeyboardEvent) => {\n const selected = props.selectedNode;\n switch (e.key) {\n case 'ArrowDown':\n if (selected) {\n const next = stepNode(selectedNode, props.nodes, 1);\n props.onSelectedNodeChanged(next);\n }\n break;\n\n case 'ArrowUp':\n if (selected) {\n const previous = stepNode(selectedNode, props.nodes, -1);\n props.onSelectedNodeChanged(previous);\n }\n break;\n\n case 'PageDown':\n if (selected) {\n const next = stepNode(selectedNode, props.nodes, 4);\n props.onSelectedNodeChanged(next);\n }\n break;\n\n case 'PageUp':\n if (selected) {\n const previous = stepNode(selectedNode, props.nodes, -4);\n props.onSelectedNodeChanged(previous);\n }\n break;\n }\n };\n\n return (\n <div style={style} tabIndex={0} onKeyDown={processKey}>\n <FixedSizeList\n className=\"pm-navigation-tree\"\n height={props.height}\n width=\"100%\"\n itemCount={vizNodes.length}\n itemSize={28}\n itemData={{\n nodes: vizNodes,\n selectedNode: props.selectedNode,\n onSelectedNodeChanged: props.onSelectedNodeChanged,\n showSelection: true,\n preventFocus: true,\n }}\n ref={fixedList}\n >\n {NavigationTreeItem}\n </FixedSizeList>\n </div>\n );\n};\n\n// Renders each item\nconst NavigationTreeItem = (props: NavigationTreeItemProps) => {\n const data = props.data;\n const node: NavigationTreeNode = props.data.nodes[props.index];\n const path = pathToNode(node, data.nodes);\n const depth = path.length - 1;\n\n // Select the tree node\n const onClick = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n data.onSelectedNodeChanged(node);\n };\n\n // Whether this node is selected\n const selected = data.selectedNode.key === node.key;\n\n const indentLevel = depth;\n const indentStyle = {\n paddingLeft: indentLevel * kNavigationTreeIndent + 'px',\n };\n\n const selectedClassName = `${\n selected ? 'pm-selected-navigation-tree-item' : 'pm-navigation-tree-item'\n } pm-navigation-tree-node`;\n return (\n <div key={node.key} onClick={onClick} style={props.style}>\n <div className={selectedClassName} style={indentLevel > 0 ? indentStyle : undefined}>\n {node.image ? (\n <div className=\"pm-navigation-tree-node-image-div\">\n <img src={node.image} alt={node.name} className=\"pm-navigation-tree-node-image\" draggable=\"false\"/>\n </div>\n ) : null}\n <div className=\"pm-navigation-tree-node-label-div pm-text-color\">{node.name}</div>\n </div>\n </div>\n );\n};\n\n// Indicates whether a given key is the identified node or one of its\n// children\nexport function containsChild(key: string, node: NavigationTreeNode): boolean {\n if (node.key === key) {\n return true;\n }\n\n for (const childNode of node.children) {\n const hasChild = containsChild(key, childNode);\n if (hasChild) {\n return true;\n }\n }\n return false;\n}\n\n// enumerate the nodes that lead to a selected node\nfunction pathToNode(node: NavigationTreeNode, nodes: NavigationTreeNode[]): NavigationTreeNode[] {\n const path: NavigationTreeNode[] = [];\n if (node) {\n for (const root of nodes) {\n if (root.key === node.key) {\n path.push(node);\n return path;\n }\n\n const childPath = pathToNode(node, root.children);\n if (childPath.length > 0) {\n path.push(root, ...childPath);\n return path;\n }\n }\n }\n return path;\n}\n\n// Creates an ordered flattened list of visible nodes in the\n// tree. Useful for incrementing through visible nodes :)\nfunction visibleNodes(nodes: NavigationTreeNode[], selectedNode: NavigationTreeNode) {\n const nodeList: NavigationTreeNode[][] = nodes.map(node => {\n if (node.expanded || node.key === selectedNode.key) {\n return [node].concat(visibleNodes(node.children, selectedNode));\n } else {\n return [node];\n }\n });\n return ([] as NavigationTreeNode[]).concat(...nodeList);\n}\n\n// Get the previous node for the current node\nfunction stepNode(node: NavigationTreeNode, allNodes: NavigationTreeNode[], increment: number): NavigationTreeNode {\n const nodes = visibleNodes(allNodes, node);\n const currentIndex = nodes.map(n => n.key).indexOf(node.key);\n const step = currentIndex + increment;\n if (step >= 0 && step < nodes.length - 1) {\n return nodes[step];\n } else if (step < 0) {\n return nodes[0];\n } else {\n return nodes[nodes.length - 1];\n }\n}\n","/*\n * dialog-buttons.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { WidgetProps } from './react';\n\nimport { EditorUI } from '../ui';\n\nimport { TextButton } from './button';\nimport React from 'react';\n\nimport './dialog-buttons.css';\n\nexport interface DialogButtonsProps extends WidgetProps {\n okLabel: string;\n cancelLabel: string;\n onOk: () => void;\n onCancel: () => void;\n}\n\nexport const DialogButtons: React.FC<DialogButtonsProps> = props => {\n return (\n <div className=\"pm-dialog-buttons-panel\" style={props.style}>\n <TextButton\n title={props.okLabel}\n classes={['pm-default-theme', 'pm-dialog-buttons-button', 'pm-rstudio-button']}\n onClick={props.onOk}\n style={{\n fontWeight: 600,\n }}\n />\n\n <TextButton\n title={props.cancelLabel}\n classes={['pm-default-theme', 'pm-dialog-buttons-button', 'pm-rstudio-button']}\n onClick={props.onCancel}\n />\n </div>\n );\n};\n","// Panels get a variety of information as properties to permit them to search\n\nimport { WidgetProps } from '../../../api/widgets/react';\n\nimport { EditorUI } from '../../../api/ui';\n\nimport { NavigationTreeNode } from '../../../api/widgets/navigation-tree';\nimport { BibliographySource, BibliographyManager } from '../../../api/bibliography/bibliography';\nimport { CSL, imageForType } from '../../../api/csl';\nimport { suggestCiteId, formatIssuedDate, formatAuthors } from '../../../api/cite';\n\n// citations and add them\nexport interface CitationSourcePanelProps extends WidgetProps {\n ui: EditorUI;\n height: number;\n\n searchTerm: string;\n onSearchTermChanged: (term: string) => void;\n onExecuteSearch: (term: string) => void;\n\n citations: CitationListEntry[];\n citationsToAdd: CitationListEntry[];\n\n onAddCitation: (citation: CitationListEntry) => void;\n onRemoveCitation: (citation: CitationListEntry) => void;\n onConfirm: VoidFunction;\n\n selectedIndex: number;\n onSelectedIndexChanged: (index: number) => void;\n\n status: CitationSourceListStatus;\n statusMessage: string;\n\n warningMessage: string;\n\n ref: React.Ref<any>;\n}\n\n// Citation Panels Providers are the core element of ths dialog. Each provider provides\n// the main panel UI as well as the tree to display when the panel is displayed.\nexport interface CitationSourcePanelProvider {\n key: string;\n panel: React.FC<CitationSourcePanelProps>;\n treeNode(): NavigationTreeNode;\n placeHolderMessage?: string;\n progressMessage?: string;\n warningMessage?: string;\n typeAheadSearch?: (\n term: string,\n selectedNode: NavigationTreeNode,\n existingCitationIds: string[],\n onResults: (result: CitationSourcePanelSearchResult) => void\n ) => void;\n search?: (\n term: string,\n selectedNode: NavigationTreeNode,\n existingCitationIds: string[],\n ) => Promise<CitationSourcePanelSearchResult>;\n}\n\nexport interface CitationSourcePanelSearchResult {\n citations: CitationListEntry[];\n status: CitationSourceListStatus;\n statusMessage: string;\n}\n\nexport interface CitationListEntry extends BibliographySourceProvider {\n id: string;\n isIdEditable: boolean;\n image?: string;\n imageAdornment?: string;\n type: string;\n title: string;\n authors: (width: number) => string;\n date: string;\n journal: string | undefined;\n doi?: string;\n}\n\nexport interface BibliographySourceProvider {\n id: string;\n isSlowGeneratingBibliographySource: boolean;\n toBibliographySource: (id: string) => Promise<BibliographySource>;\n}\n\nexport enum CitationSourceListStatus {\n default,\n inProgress,\n noResults,\n error,\n}\n\nexport function errorForStatus(ui: EditorUI, status: string, providerName: string) {\n return status === 'nohost'\n ? ui.context.translateText(`Unable to search ${providerName}. Please check your network connection and try again.`)\n : ui.context.translateText(`An error occurred while searching ${providerName}.`);\n}\n\n\nexport function matchExistingSourceCitationListEntry(doi: string, existingIds: string[], ui: EditorUI, bibliographyManager: BibliographyManager) {\n\n const localSources = bibliographyManager.localSources();\n const existingSource = localSources.find(source => {\n if (source.DOI?.toLowerCase() === doi.toLowerCase()) {\n return source;\n }\n });\n if (existingSource) {\n return existingSourceToCitationListEntry(existingSource, existingIds, ui);\n }\n}\n\nfunction existingSourceToCitationListEntry(csl: CSL, existingIds: string[], ui: EditorUI): CitationListEntry {\n const providerKey = 'pubmed';\n return {\n id: csl.id || suggestCiteId(existingIds, csl),\n isIdEditable: false,\n title: csl.title || '',\n doi: csl.DOI,\n type: '',\n date: formatIssuedDate(csl.issued) || '',\n journal: csl[\"container-title\"],\n authors: (length: number) => {\n return formatAuthors(csl.author || [], length);\n },\n image: imageForType(ui.images, csl.type)[0],\n toBibliographySource: async (finalId: string) => {\n // Generate CSL using the DOI\n return { ...csl, id: finalId, providerKey };\n },\n isSlowGeneratingBibliographySource: true,\n };\n}","/*\n * insert_citation-panel-bibliography.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\nimport uniqby from 'lodash.uniqby';\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { EditorUI } from '../../../api/ui';\nimport { NavigationTreeNode } from '../../../api/widgets/navigation-tree';\nimport {\n BibliographyManager,\n BibliographyCollection,\n BibliographySource,\n} from '../../../api/bibliography/bibliography';\nimport { kZoteroProviderKey } from '../../../api/bibliography/bibliography-provider_zotero';\nimport { kLocalBibliographyProviderKey } from '../../../api/bibliography/bibliography-provider_local';\nimport { formatAuthors, formatIssuedDate, createUniqueCiteId } from '../../../api/cite';\nimport {\n CitationSourcePanelProvider,\n CitationSourcePanelProps,\n CitationListEntry,\n CitationSourceListStatus,\n CitationSourcePanelSearchResult,\n} from './insert_citation-source-panel';\nimport { CitationSourceTypeheadSearchPanel } from './insert_citation-source-panel-typeahead-search';\nimport { imageForType } from '../../../api/csl';\n\nimport './insert_citation-source-panel-bibliography.css';\n\nconst kAllLocalSourcesRootNodeType = 'All Local Sources';\n\nexport function bibliographySourcePanel(\n doc: ProsemirrorNode,\n ui: EditorUI,\n bibliographyManager: BibliographyManager,\n): CitationSourcePanelProvider {\n const providers = bibliographyManager.localProviders();\n const providerNodes: { [key: string]: NavigationTreeNode } = {};\n\n // For each of the providers, discover their collections\n providers\n .filter(provider => provider.isEnabled())\n .forEach(provider => {\n const getFolder = (prov: string, hasParent: boolean) => {\n return folderImageForProvider(prov, hasParent, ui);\n };\n\n // Get the response which could be items or could be a stream\n const collectionSpecs = provider.collections();\n // Note the temporary collections\n providerNodes[provider.key] = {\n key: provider.key,\n name: ui.context.translateText(provider.name),\n type: provider.key,\n image: rootImageForProvider(provider.key, ui),\n children: toTree(provider.key, collectionSpecs, getFolder),\n expanded: true,\n };\n });\n\n return {\n key: '17373086-77FE-410F-A319-33E314482125',\n panel: BibligraphySourcePanel,\n treeNode: () => {\n return {\n key: 'My Sources',\n name: ui.context.translateText('My Sources'),\n image: ui.images.citations?.local_sources,\n type: kAllLocalSourcesRootNodeType,\n children: Object.values(providerNodes),\n expanded: true,\n };\n },\n warningMessage: bibliographyManager.warning(),\n typeAheadSearch: (searchTerm: string, selectedNode: NavigationTreeNode, existingCitationIds: string[], onResults: (result: CitationSourcePanelSearchResult) => void) => {\n const providerForNode = (node: NavigationTreeNode): string | undefined => {\n // The node could be the root node, no provider\n return node.type === kAllLocalSourcesRootNodeType ? undefined : node.type;\n };\n\n const collectionKeyForNode = (node: NavigationTreeNode): string | undefined => {\n // The node could be a provider root or a collection\n return node.type !== kAllLocalSourcesRootNodeType &&\n node.key !== kZoteroProviderKey &&\n node.key !== kLocalBibliographyProviderKey\n ? node.key\n : undefined;\n };\n const sources = bibliographyManager.search(\n searchTerm,\n providerForNode(selectedNode),\n collectionKeyForNode(selectedNode),\n );\n const uniqueSources = uniqby(sources, source => source.id);\n\n const citations = toCitationListEntries(uniqueSources, existingCitationIds, ui);\n onResults({\n citations,\n status: citations.length > 0 ? CitationSourceListStatus.default : CitationSourceListStatus.noResults,\n statusMessage: citations.length > 0 ? '' : ui.context.translateText('No items'),\n });\n },\n };\n}\n\nexport const BibligraphySourcePanel = React.forwardRef<HTMLDivElement, CitationSourcePanelProps>(\n (props: CitationSourcePanelProps, ref) => {\n return (\n <>\n {props.warningMessage ? (\n <div className=\"pm-insert-bibliography-source-panel-warning pm-block-border-color\">\n {props.warningMessage}\n </div>\n ) : (\n undefined\n )}\n <CitationSourceTypeheadSearchPanel\n height={props.height}\n citations={props.citations}\n citationsToAdd={props.citationsToAdd}\n searchTerm={props.searchTerm}\n onSearchTermChanged={props.onSearchTermChanged}\n selectedIndex={props.selectedIndex}\n onSelectedIndexChanged={props.onSelectedIndexChanged}\n onAddCitation={props.onAddCitation}\n onRemoveCitation={props.onRemoveCitation}\n onConfirm={props.onConfirm}\n status={props.status}\n statusMessage={props.statusMessage}\n ui={props.ui}\n ref={ref}\n />\n </>\n );\n },\n);\n\nfunction rootImageForProvider(providerKey: string, ui: EditorUI) {\n switch (providerKey) {\n case kZoteroProviderKey:\n return ui.images.citations?.zotero_root;\n case kLocalBibliographyProviderKey:\n return ui.images.citations?.bibligraphy;\n }\n}\n\nfunction folderImageForProvider(providerKey: string, hasParent: boolean, ui: EditorUI) {\n switch (providerKey) {\n case kZoteroProviderKey:\n if (hasParent) {\n return ui.images.citations?.zotero_collection;\n } else {\n return ui.images.citations?.zotero_library;\n }\n case kLocalBibliographyProviderKey:\n return ui.images.citations?.bibligraphy_folder;\n }\n}\n\n// Takes a flat data structure of containers and turns it into a hierarchical\n// tree structure for display as TreeNodes.\nfunction toTree(\n type: string,\n containers: BibliographyCollection[],\n folderImage?: (providerKey: string, hasParent: boolean) => string | undefined,\n): NavigationTreeNode[] {\n const treeMap: { [id: string]: NavigationTreeNode } = {};\n const rootNodes: NavigationTreeNode[] = [];\n\n // Sort the folder in alphabetical order at each level of the tree\n containers\n .sort((a, b) => {\n // For Zotero collection, sort the 'My Library to the top always'\n if (a.provider === kZoteroProviderKey && a.key === '1') {\n return -1;\n }\n return a.name.localeCompare(b.name);\n })\n .forEach(container => {\n // First see if we have an existing node for this item\n // A node could already be there if we had to insert a 'placeholder'\n // node to contain the node's children before we encountered the node.\n const currentNode = treeMap[container.key] || { key: container.key, name: container.name, children: [], type };\n\n // Always set its name to be sure we fill this in when we encounter it\n const hasParent = container.parentKey !== undefined && container.parentKey.length > 0;\n currentNode.name = container.name;\n currentNode.image = folderImage ? folderImage(container.provider, hasParent) : undefined;\n\n if (container.parentKey) {\n let parentNode = treeMap[container.parentKey];\n if (!parentNode) {\n // This is a placeholder node - we haven't yet encountered this child's parent\n // so we insert this to hold the child. Once we encounter the true parent node,\n // we will fix up the values in this placeholder node.\n parentNode = { key: container.parentKey, name: '', children: [], type };\n treeMap[container.parentKey] = parentNode;\n }\n parentNode.children?.push(currentNode);\n } else {\n rootNodes.push(currentNode);\n }\n treeMap[container.key] = currentNode;\n });\n return rootNodes;\n}\n\nfunction toCitationListEntries(\n sources: BibliographySource[],\n existingCitationIds: string[],\n ui: EditorUI,\n): CitationListEntry[] {\n const useBetterBibTex = ui.prefs.zoteroUseBetterBibtex();\n return sources.map(source => {\n return {\n id:\n source.providerKey === kLocalBibliographyProviderKey || useBetterBibTex\n ? source.id\n : createUniqueCiteId(existingCitationIds, source.id),\n isIdEditable: source.providerKey === kZoteroProviderKey && !useBetterBibTex,\n type: source.type,\n title: source.title || '',\n providerKey: source.providerKey,\n date: formatIssuedDate(source.issued),\n journal: '',\n image: imageForType(ui.images, source.type)[0],\n imageAdornment: source.providerKey === kZoteroProviderKey ? ui.images.citations?.zoteroOverlay : undefined,\n authors: (length: number) => {\n return formatAuthors(source.author, length);\n },\n toBibliographySource: (finalId: string) => {\n return Promise.resolve({ ...source, id: finalId, providerKey: source.providerKey });\n },\n isSlowGeneratingBibliographySource: false,\n };\n });\n}\n","/*\n * insert_citation-source-panel-typeahead-search.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport React from 'react';\n\nimport { EditorUI } from '../../../api/ui';\nimport { TextInput } from '../../../api/widgets/text';\nimport { WidgetProps } from '../../../api/widgets/react';\n\nimport './insert_citation-source-panel-typeahead-search.css';\nimport { CitationSourceList } from './insert_citation-source-panel-list';\nimport { CitationListEntry, CitationSourceListStatus } from './insert_citation-source-panel';\nimport { CitationSourcePanelListItem } from './insert_citation-source-panel-list-item';\n\nexport interface CitationSourceTypeaheadSearchPanelProps extends WidgetProps {\n height: number;\n citations: CitationListEntry[];\n citationsToAdd: CitationListEntry[];\n searchTerm: string;\n onSearchTermChanged: (searchTerm: string) => void;\n selectedIndex: number;\n onSelectedIndexChanged: (index: number) => void;\n onAddCitation: (citation: CitationListEntry) => void;\n onRemoveCitation: (citation: CitationListEntry) => void;\n onConfirm: VoidFunction;\n status: CitationSourceListStatus;\n statusMessage: string;\n ui: EditorUI;\n}\n\n// Height of textbox including border\nconst kTextBoxHeight = 30;\n\nexport const CitationSourceTypeheadSearchPanel = React.forwardRef<\n HTMLDivElement,\n CitationSourceTypeaheadSearchPanelProps\n>((props: CitationSourceTypeaheadSearchPanelProps, ref) => {\n const listContainer = React.useRef<HTMLDivElement>(null);\n\n // Search the user search terms\n const searchChanged = (e: React.ChangeEvent<HTMLInputElement>) => {\n const search = e.target.value;\n props.onSearchTermChanged(search);\n };\n\n // Perform first load tasks\n const searchBoxRef = React.useRef<HTMLInputElement>(null);\n\n // If the user arrows down in the search text box, advance to the list of items\n const handleTextKeyDown = (event: React.KeyboardEvent) => {\n switch (event.key) {\n case 'ArrowDown':\n listContainer.current?.focus();\n break;\n }\n };\n\n // Used to focus the search box\n const focusSearch = () => {\n searchBoxRef.current?.focus();\n };\n\n const addCitation = (citation: CitationListEntry) => {\n // Add the citation and reset selection\n props.onAddCitation(citation);\n focusSearch();\n };\n\n // On focus, select the search term for overtype\n const searchBoxFocused = (event: React.FocusEvent<HTMLInputElement>) => {\n event.target.select();\n };\n\n return (\n <div\n style={props.style}\n className=\"pm-insert-citation-panel-search pm-block-border-color pm-background-color\"\n ref={ref}\n tabIndex={-1}\n onFocus={focusSearch}\n >\n <div className=\"pm-insert-citation-search-panel-textbox-container\">\n <TextInput\n width=\"100%\"\n iconAdornment={props.ui.images.search}\n tabIndex={0}\n className=\"pm-insert-citation-panel-search-textbox pm-block-border-color\"\n placeholder={props.ui.context.translateText('Search for citation')}\n onKeyDown={handleTextKeyDown}\n onChange={searchChanged}\n onFocus={searchBoxFocused}\n value={props.searchTerm}\n ref={searchBoxRef}\n />\n </div>\n <CitationSourceList\n height={props.height - kTextBoxHeight}\n citations={props.citations}\n citationsToAdd={props.citationsToAdd}\n onConfirm={props.onConfirm}\n onAddCitation={addCitation}\n onRemoveCitation={props.onRemoveCitation}\n selectedIndex={props.selectedIndex}\n onSelectedIndexChanged={props.onSelectedIndexChanged}\n focusPrevious={focusSearch}\n status={props.status}\n statusMessage={props.statusMessage}\n itemHeight={64}\n itemProvider={CitationSourcePanelListItem}\n ui={props.ui}\n ref={listContainer}\n />\n </div>\n );\n});\n","/*\n * insert_citation-source-panel-list.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport React from 'react';\n\nimport { FixedSizeList, ListChildComponentProps } from 'react-window';\n\nimport { EditorUI } from '../../../api/ui';\nimport { WidgetProps } from '../../../api/widgets/react';\n\nimport { CitationListEntry, CitationSourceListStatus } from './insert_citation-source-panel';\n\nimport './insert_citation-source-panel-list.css';\n\nexport interface CitationSourcePanelListItemData {\n citations: CitationListEntry[];\n citationsToAdd: CitationListEntry[];\n selectedIndex: number;\n onSelectedIndexChanged: (index: number) => void;\n onAddCitation: (source: CitationListEntry) => void;\n onRemoveCitation: (source: CitationListEntry) => void;\n onConfirm: () => void;\n ui: EditorUI;\n showSeparator?: boolean;\n showSelection?: boolean;\n preventFocus?: boolean;\n}\n\nexport interface CitationSourceListProps extends WidgetProps {\n height: number;\n citations: CitationListEntry[];\n citationsToAdd: CitationListEntry[];\n selectedIndex: number;\n onSelectedIndexChanged: (index: number) => void;\n onAddCitation: (citation: CitationListEntry) => void;\n onRemoveCitation: (citation: CitationListEntry) => void;\n onConfirm: VoidFunction;\n focusPrevious?: () => void;\n\n itemProvider: (props: ListChildComponentProps) => JSX.Element;\n itemHeight: number;\n\n status: CitationSourceListStatus;\n statusMessage: string;\n ui: EditorUI;\n}\n\nexport const CitationSourceList = React.forwardRef<HTMLDivElement, CitationSourceListProps>(\n (props: CitationSourceListProps, ref) => {\n const fixedList = React.useRef<FixedSizeList>(null);\n\n // Item height and consequently page height\n const itemsPerPage = Math.floor(props.height / props.itemHeight);\n\n // Update selected item index (this will manage bounds)\n const handleIncrementIndex = (event: React.KeyboardEvent, increment: number, index: number) => {\n event.stopPropagation();\n event.preventDefault();\n if (props.citations && index > -1) {\n const maxIndex = props.citations.length - 1;\n const newIndex = Math.min(Math.max(0, index + increment), maxIndex);\n props.onSelectedIndexChanged(newIndex);\n }\n };\n\n // Toggle the currently selected item as added or removed\n const handleAddItem = (event: React.KeyboardEvent) => {\n event.stopPropagation();\n event.preventDefault();\n const currentCitation = props.selectedIndex > -1 ? props.citations[props.selectedIndex] : undefined;\n if (currentCitation) {\n props.onAddCitation(currentCitation);\n }\n };\n\n const handleListKeyDown = (event: React.KeyboardEvent) => {\n const currentIndex = props.selectedIndex;\n switch (event.key) {\n case 'ArrowUp':\n if (currentIndex === 0 && props.focusPrevious) {\n props.focusPrevious();\n } else {\n handleIncrementIndex(event, -1, currentIndex);\n }\n break;\n\n case 'ArrowDown':\n handleIncrementIndex(event, 1, currentIndex);\n break;\n\n case 'PageDown':\n handleIncrementIndex(event, itemsPerPage, currentIndex);\n break;\n\n case 'PageUp':\n handleIncrementIndex(event, -itemsPerPage, currentIndex);\n break;\n\n case 'Enter':\n handleAddItem(event);\n props.onConfirm();\n break;\n case ' ':\n handleAddItem(event);\n break;\n }\n };\n\n // Ensure the item is scrolled into view\n React.useEffect(() => {\n if (props.selectedIndex > -1) {\n fixedList.current?.scrollToItem(props.selectedIndex);\n }\n });\n\n // Focus / Blur are used to track whether to show selection highlighting\n const onFocus = (event: React.FocusEvent<HTMLDivElement>) => {\n if (props.selectedIndex < 0) {\n props.onSelectedIndexChanged(0);\n }\n event.stopPropagation();\n event.preventDefault();\n };\n\n const onBlur = (event: React.FocusEvent<HTMLDivElement>) => {\n event.stopPropagation();\n event.preventDefault();\n };\n\n const classes = ['pm-insert-citation-source-panel-list-container'].concat(props.classes || []).join(' ');\n switch (props.status) {\n case CitationSourceListStatus.default:\n if (props.citations.length > 0) {\n return (\n <div\n tabIndex={0}\n onKeyDown={handleListKeyDown}\n onFocus={onFocus}\n onBlur={onBlur}\n ref={ref}\n className={classes}\n >\n <FixedSizeList\n className=\"pm-insert-citation-source-panel-list\"\n height={props.height}\n width=\"100%\"\n itemCount={props.citations.length}\n itemSize={props.itemHeight}\n itemData={{\n selectedIndex: props.selectedIndex,\n onSelectedIndexChanged: props.onSelectedIndexChanged,\n citations: props.citations,\n citationsToAdd: props.citationsToAdd,\n onAddCitation: props.onAddCitation,\n onRemoveCitation: props.onRemoveCitation,\n onConfirm: props.onConfirm,\n showSeparator: true,\n showSelection: true,\n preventFocus: true,\n ui: props.ui,\n }}\n ref={fixedList}\n >\n {props.itemProvider}\n </FixedSizeList>\n </div>\n );\n } else {\n return (\n <div className={classes} style={{ height: props.height + 'px' }} ref={ref}>\n <div className=\"pm-insert-citation-source-panel-list-noresults-text\">{props.statusMessage}</div>\n </div>\n );\n }\n\n case CitationSourceListStatus.inProgress:\n return (\n <div className={classes} style={{ height: props.height + 'px' }} ref={ref}>\n <div className=\"pm-insert-citation-source-panel-list-noresults-text\">\n <img src={props.ui.images.search_progress} className=\"pm-insert-citation-source-panel-list-progress\" \n draggable=\"false\"/>\n {props.statusMessage}\n </div>\n </div>\n );\n\n case CitationSourceListStatus.noResults:\n return (\n <div className={classes} style={{ height: props.height + 'px' }} ref={ref}>\n <div className=\"pm-insert-citation-source-panel-list-noresults-text\">{props.statusMessage}</div>\n </div>\n );\n\n case CitationSourceListStatus.error:\n return (\n <div className={classes} style={{ height: props.height + 'px' }} ref={ref}>\n <div className=\"pm-insert-citation-source-panel-list-noresults-text\">\n {props.statusMessage || props.ui.context.translateText('An error occurred.')}\n </div>\n </div>\n );\n\n case CitationSourceListStatus.default:\n default:\n if (props.citations.length > 0) {\n return (\n <div\n tabIndex={0}\n onKeyDown={handleListKeyDown}\n onFocus={onFocus}\n onBlur={onBlur}\n ref={ref}\n className={classes}\n >\n <FixedSizeList\n className=\"pm-insert-citation-source-panel-list\"\n height={props.height}\n width=\"100%\"\n itemCount={props.citations.length}\n itemSize={props.itemHeight}\n itemData={{\n selectedIndex: props.selectedIndex,\n onSelectedIndexChanged: props.onSelectedIndexChanged,\n citations: props.citations,\n citationsToAdd: props.citationsToAdd,\n onAddCitation: props.onAddCitation,\n onRemoveCitation: props.onRemoveCitation,\n onConfirm: props.onConfirm,\n showSeparator: true,\n showSelection: true,\n preventFocus: true,\n ui: props.ui,\n }}\n ref={fixedList}\n >\n {props.itemProvider}\n </FixedSizeList>\n </div>\n );\n } else {\n return (\n <div className={classes} style={{ height: props.height + 'px' }} ref={ref}>\n <div className=\"pm-insert-citation-source-panel-list-noresults-text\">{props.statusMessage}</div>\n </div>\n );\n }\n }\n },\n);\n","/*\n * insert_citation-source-panel-list-item.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\nimport { ListChildComponentProps } from 'react-window';\n\nimport { OutlineButton } from '../../../api/widgets/button';\n\nimport { CitationSourcePanelListItemData } from './insert_citation-source-panel-list';\n\nimport './insert_citation-source-panel-list-item.css';\n\nexport const CitationSourcePanelListItem = (props: ListChildComponentProps) => {\n const citationListData: CitationSourcePanelListItemData = props.data;\n\n const citationEntry = citationListData.citations[props.index];\n\n // NOTE: Could consider making this length dynamic to account for item width\n const maxIdLength = 30;\n const id =\n citationEntry.id.length > maxIdLength ? `@${citationEntry.id.substr(0, maxIdLength - 1)}…` : `@${citationEntry.id}`;\n const authorWidth = Math.max(10, 50 - id.length);\n\n // Wheher this item is selected\n const selected = citationListData.showSelection && props.index === citationListData.selectedIndex;\n\n // Whether this item is already in the list of items to add\n // If the item is selected, it is always a candidate to be added explicitly to the list\n const alreadyAdded = citationListData.citationsToAdd.map(src => src.id).includes(citationEntry.id) && !selected;\n\n const onButtonClick = (event: React.MouseEvent) => {\n event.stopPropagation();\n event.preventDefault();\n\n if (alreadyAdded) {\n citationListData.onRemoveCitation(citationEntry);\n } else {\n citationListData.onAddCitation(citationEntry);\n }\n };\n\n const onItemClick = (e: React.MouseEvent) => {\n if (e.shiftKey) {\n citationListData.onAddCitation(citationEntry);\n } else {\n citationListData.onSelectedIndexChanged(props.index);\n }\n };\n\n const onDoubleClick = () => {\n citationListData.onAddCitation(citationEntry);\n citationListData.onConfirm();\n };\n\n let authors = \"\";\n try {\n authors = citationEntry.authors(authorWidth);\n } catch (er) {\n // Failed to format the authors, just ignore this.\n }\n\n return (\n <div\n onMouseDown={onItemClick}\n onDoubleClick={onDoubleClick}\n className=\"pm-insert-citation-source-panel-item\"\n style={props.style}\n >\n <div className={`pm-insert-citation-source-panel-item-border ${selected ? 'pm-list-item-selected' : ''}`}>\n <div className=\"pm-insert-citation-source-panel-item-container\">\n <div className=\"pm-insert-citation-source-panel-item-type\">\n {citationEntry.imageAdornment ? (\n <img\n className=\"pm-insert-citation-source-panel-item-adorn pm-block-border-color pm-background-color\"\n src={citationEntry.imageAdornment}\n draggable=\"false\"\n />\n ) : (\n undefined\n )}\n <img\n className=\"pm-insert-citation-source-panel-item-icon pm-block-border-color\"\n src={citationEntry.image}\n draggable=\"false\"\n />\n </div>\n <div className=\"pm-insert-citation-source-panel-item-summary\">\n <div className=\"pm-insert-citation-source-panel-item-id\">\n <div className=\"pm-insert-citation-source-panel-item-title pm-fixedwidth-font pm-text-color\">{id}</div>\n <div className=\"pm-insert-citation-source-panel-item-detail pm-text-color\">\n {authors} {citationEntry.date}\n </div>\n </div>\n <div className=\"pm-insert-citation-source-panel-item-subtitle-text pm-text-color\">\n {citationEntry.title}\n </div>\n </div>\n <div className=\"pm-insert-citation-source-panel-item-button\">\n <OutlineButton\n tabIndex={citationListData.preventFocus ? -1 : 0}\n style={{ width: '24px', height: '24px' }}\n title={alreadyAdded ? '-' : '+'}\n onClick={onButtonClick}\n />\n </div>\n </div>\n </div>\n </div>\n );\n};\n","/*\n * insert_citation-panel-doi.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport React from 'react';\n\nimport { EditorUI } from '../../../api/ui';\n\nimport { suggestCiteId, formatAuthors, formatIssuedDate } from '../../../api/cite';\nimport { CSL, imageForType } from '../../../api/csl';\nimport { DOIServer } from '../../../api/doi';\nimport { logException } from '../../../api/log';\nimport { NavigationTreeNode } from '../../../api/widgets/navigation-tree';\n\nimport {\n CitationSourcePanelProps,\n CitationSourcePanelProvider,\n CitationListEntry,\n CitationSourceListStatus,\n errorForStatus,\n matchExistingSourceCitationListEntry,\n} from './insert_citation-source-panel';\nimport { CitationSourceLatentSearchPanel } from './insert_citation-source-panel-latent-search';\n\nimport './insert_citation-source-panel-doi.css';\nimport { BibliographyManager } from '../../../api/bibliography/bibliography';\n\nconst kDOIType = 'DOI Search';\n\nexport function doiSourcePanel(\n ui: EditorUI,\n server: DOIServer,\n bibliographyManager: BibliographyManager\n): CitationSourcePanelProvider {\n return {\n key: '76561E2A-8FB7-4D4B-B235-9DD8B8270EA1',\n panel: DOISourcePanel,\n treeNode: () => {\n return {\n key: 'DOI',\n name: ui.context.translateText('From DOI'),\n image: ui.images.citations?.doi,\n type: kDOIType,\n children: [],\n expanded: true,\n };\n },\n progressMessage: ui.context.translateText('Looking up DOI....'),\n placeHolderMessage: ui.context.translateText('Paste or enter a DOI to find citation data.'),\n search: async (searchTerm: string, _selectedNode: NavigationTreeNode, existingCitationIds: string[]) => {\n try {\n const result = await server.fetchCSL(searchTerm, 1000);\n if (result.status === 'ok') {\n\n // Form the entry\n const doi = searchTerm;\n const csl = result.message;\n const citation = matchExistingSourceCitationListEntry(doi, existingCitationIds, ui, bibliographyManager) || toCitationListEntry(csl, existingCitationIds, ui);\n\n return Promise.resolve({\n citations: citation ? [citation] : [],\n status: CitationSourceListStatus.default,\n statusMessage: '',\n });\n } else if (result.status === 'notfound') {\n return Promise.resolve({\n citations: [],\n status: CitationSourceListStatus.noResults,\n statusMessage: ui.context.translateText('No data for this DOI could be found.'),\n });\n } else {\n return Promise.resolve({\n citations: [],\n status: CitationSourceListStatus.error,\n statusMessage: errorForStatus(ui, result.status, 'for this DOI'),\n });\n }\n } catch (e) {\n logException(e);\n return Promise.resolve({\n citations: [],\n status: CitationSourceListStatus.error,\n statusMessage: ui.context.translateText('An unknown error occurred. Please try again.'),\n });\n }\n },\n };\n}\n\nexport const DOISourcePanel = React.forwardRef<HTMLDivElement, CitationSourcePanelProps>(\n (props: CitationSourcePanelProps, ref) => {\n // Track whether we are mounted to allow a latent search that returns after the\n // component unmounts to nmot mutate state further\n return (\n <CitationSourceLatentSearchPanel\n height={props.height}\n citations={props.citations}\n citationsToAdd={props.citationsToAdd}\n searchTerm={props.searchTerm}\n onSearchTermChanged={props.onSearchTermChanged}\n executeSearch={props.onExecuteSearch}\n onAddCitation={props.onAddCitation}\n onRemoveCitation={props.onRemoveCitation}\n selectedIndex={props.selectedIndex}\n onSelectedIndexChanged={props.onSelectedIndexChanged}\n onConfirm={props.onConfirm}\n searchPlaceholderText={props.ui.context.translateText('Paste a DOI to search')}\n status={props.status}\n statusMessage={props.statusMessage}\n ui={props.ui}\n ref={ref}\n />\n );\n },\n);\n\nfunction toCitationListEntry(\n csl: CSL | undefined,\n existingCitationIds: string[],\n ui: EditorUI,\n): CitationListEntry | undefined {\n if (csl) {\n const suggestedId = suggestCiteId(existingCitationIds, csl);\n const providerKey = 'doi';\n return {\n id: suggestedId,\n isIdEditable: true,\n type: csl.type,\n title: csl.title || csl['short-title'] || csl['original-title'] || '',\n date: formatIssuedDate(csl.issued),\n journal: csl['container-title'] || csl['short-container-title'] || csl.publisher,\n doi: csl.DOI,\n image: imageForType(ui.images, csl.type)[0],\n authors: (length: number) => {\n return formatAuthors(csl.author, length);\n },\n toBibliographySource: (finalId: string) => {\n return Promise.resolve({ ...csl, id: finalId, providerKey });\n },\n isSlowGeneratingBibliographySource: false,\n };\n }\n return undefined;\n}\n","/*\n * insert_citation-source-panel-search-latent.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport React from 'react';\n\nimport { EditorUI } from '../../../api/ui';\nimport { TextInput } from '../../../api/widgets/text';\nimport { WidgetProps } from '../../../api/widgets/react';\n\nimport { CitationSourceList } from './insert_citation-source-panel-list';\nimport { TextButton } from '../../../api/widgets/button';\nimport { CitationListEntry, CitationSourceListStatus } from './insert_citation-source-panel';\n\nimport './insert_citation-source-panel-latent-search.css';\nimport { CitationSourcePanelListItemDetailed } from './insert_citation-source-panel-list-item-detailed';\n\nexport interface CitationSourceLatentSearchPanelProps extends WidgetProps {\n height: number;\n citations: CitationListEntry[];\n citationsToAdd: CitationListEntry[];\n searchTerm: string;\n onSearchTermChanged: (searchTerm: string) => void;\n executeSearch: (searchTerm: string) => void;\n selectedIndex: number;\n onSelectedIndexChanged: (index: number) => void;\n onAddCitation: (citation: CitationListEntry) => void;\n onRemoveCitation: (citation: CitationListEntry) => void;\n onConfirm: VoidFunction;\n ui: EditorUI;\n searchPlaceholderText?: string;\n status: CitationSourceListStatus;\n statusMessage: string;\n}\n\nconst kSearchBoxHeightWithMargin = 38;\n\nexport const CitationSourceLatentSearchPanel = React.forwardRef<HTMLDivElement, CitationSourceLatentSearchPanelProps>(\n (props, ref) => {\n const listContainer = React.useRef<HTMLDivElement>(null);\n const pasted = React.useRef<boolean>(false);\n const lastSearch = React.useRef<string>('');\n\n const performSearch = (searchTerm: string) => {\n props.executeSearch(searchTerm);\n lastSearch.current = searchTerm;\n pasted.current = false;\n };\n\n // Search the user search terms\n const searchChanged = (e: React.ChangeEvent<HTMLInputElement>) => {\n const search = e.target.value;\n if (pasted.current) {\n performSearch(search);\n } else {\n props.onSearchTermChanged(search);\n }\n };\n\n // If the user arrows down in the search text box, advance to the list of items\n const handleTextKeyDown = (event: React.KeyboardEvent) => {\n switch (event.key) {\n case 'ArrowDown':\n event.preventDefault();\n event.stopPropagation();\n listContainer.current?.focus();\n break;\n case 'Enter':\n if (lastSearch.current !== props.searchTerm || props.selectedIndex < 0) {\n event.preventDefault();\n event.stopPropagation();\n performSearch(props.searchTerm);\n }\n break;\n }\n };\n\n const handleButtonClick = () => {\n performSearch(props.searchTerm);\n };\n\n const onPaste = (e: React.ClipboardEvent<HTMLInputElement>) => {\n pasted.current = true;\n };\n\n // Used to focus the search box\n const searchBoxRef = React.useRef<HTMLInputElement>(null);\n\n const focusSearch = () => {\n searchBoxRef.current?.focus();\n };\n\n // Allow the search box to gain focus the first time the enclosing\n // container div receives focus.\n const initialFocusSet = React.useRef<boolean>(false);\n const parentFocused = () => {\n if (!initialFocusSet.current) {\n focusSearch();\n initialFocusSet.current = true;\n }\n };\n\n const onAddCitation = (citation: CitationListEntry) => {\n props.onAddCitation(citation);\n focusSearch();\n };\n\n return (\n <div\n style={props.style}\n className=\"pm-insert-citation-panel-latent-search\"\n ref={ref}\n tabIndex={-1}\n onFocus={parentFocused}\n >\n <div className=\"pm-insert-citation-panel-latent-search-textbox-container\">\n <TextInput\n value={props.searchTerm}\n width=\"100%\"\n iconAdornment={props.ui.images.search}\n tabIndex={0}\n className=\"pm-insert-citation-panel-latent-search-textbox pm-block-border-color\"\n placeholder={props.searchPlaceholderText}\n onKeyDown={handleTextKeyDown}\n onChange={searchChanged}\n onPaste={onPaste}\n ref={searchBoxRef}\n />\n\n <TextButton\n title={props.ui.context.translateText('Search')}\n classes={['pm-insert-citation-panel-latent-search-button']}\n onClick={handleButtonClick}\n disabled={props.status === CitationSourceListStatus.inProgress}\n />\n </div>\n\n <div className=\"pm-insert-citation-panel-latent-search-list-container\">\n <CitationSourceList\n height={props.height - kSearchBoxHeightWithMargin}\n citations={props.citations}\n citationsToAdd={props.citationsToAdd}\n onAddCitation={onAddCitation}\n onRemoveCitation={props.onRemoveCitation}\n selectedIndex={props.selectedIndex}\n onSelectedIndexChanged={props.onSelectedIndexChanged}\n focusPrevious={focusSearch}\n onConfirm={props.onConfirm}\n ui={props.ui}\n itemHeight={100}\n itemProvider={CitationSourcePanelListItemDetailed}\n status={props.status}\n statusMessage={props.statusMessage}\n classes={['pm-insert-citation-panel-latent-search-list', 'pm-block-border-color', 'pm-background-color']}\n ref={listContainer}\n />\n </div>\n </div>\n );\n },\n);\n","/*\n * insert_citation-source-panel-list-item.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\nimport { ListChildComponentProps } from 'react-window';\n\nimport { OutlineButton } from '../../../api/widgets/button';\n\nimport { CitationSourcePanelListItemData } from './insert_citation-source-panel-list';\n\nimport './insert_citation-source-panel-list-item-detailed.css';\n\nexport const CitationSourcePanelListItemDetailed = (props: ListChildComponentProps) => {\n const citationListData: CitationSourcePanelListItemData = props.data;\n\n const citationEntry = citationListData.citations[props.index];\n\n // Wheher this item is selected\n const selected = citationListData.showSelection && props.index === citationListData.selectedIndex;\n\n // Whether this item is already in the list of items to add\n // If the item is selected, it is always a candidate to be added explicitly to the list\n const alreadyAdded = citationListData.citationsToAdd.map(src => src.id).includes(citationEntry.id) && !selected;\n\n const onButtonClick = (event: React.MouseEvent) => {\n event.stopPropagation();\n event.preventDefault();\n\n if (alreadyAdded) {\n citationListData.onRemoveCitation(citationEntry);\n } else {\n citationListData.onAddCitation(citationEntry);\n }\n };\n\n const onItemClick = () => {\n citationListData.onSelectedIndexChanged(props.index);\n };\n\n const onDoubleClick = () => {\n citationListData.onAddCitation(citationEntry);\n citationListData.onConfirm();\n };\n\n const secondLine = [citationEntry.date, citationEntry.journal].filter(text => text).join(', ');\n const thirdLine = citationEntry.authors(80);\n\n return (\n <div\n onMouseDown={onItemClick}\n onDoubleClick={onDoubleClick}\n className=\"pm-insert-citation-source-panel-item-detailed\"\n style={props.style}\n >\n <div\n className={`pm-insert-citation-source-panel-item-detailed-border ${selected ? 'pm-list-item-selected' : ''}`}\n >\n <div className=\"pm-insert-citation-source-panel-item-detailed-container\">\n <div className=\"pm-insert-citation-source-panel-item-detailed-type\">\n {citationEntry.imageAdornment ? (\n <img\n className=\"pm-insert-citation-source-panel-item-detailed-adorn pm-block-border-color pm-background-color\"\n src={citationEntry.imageAdornment}\n draggable=\"false\"\n />\n ) : (\n undefined\n )}\n <img\n className=\"pm-insert-citation-source-panel-item-detailed-icon pm-block-border-color\"\n src={citationEntry.image}\n draggable=\"false\"\n />\n </div>\n <div className=\"pm-insert-citation-source-panel-item-detailed-summary\">\n <div className=\"pm-insert-citation-source-panel-item-detailed-title pm-fixedwidth-font pm-text-color\">\n {citationEntry.title}\n </div>\n <div className=\"pm-insert-citation-source-panel-item-detailed-subtitle-text pm-text-color\">\n {secondLine}\n </div>\n <div className=\"pm-insert-citation-source-panel-item-detailed-subtitle-text pm-text-color\">{thirdLine}</div>\n <div className=\"pm-insert-citation-source-panel-item-detailed-subtitle-text pm-text-color\">\n <a href={`https://doi.org/${citationEntry.doi}`} target=\"_new\">\n {citationEntry.doi}\n </a>\n </div>\n </div>\n <div className=\"pm-insert-citation-source-panel-item-detailed-button\">\n <OutlineButton\n tabIndex={citationListData.preventFocus ? -1 : 0}\n style={{ width: '24px', height: '24px' }}\n title={alreadyAdded ? '-' : '+'}\n onClick={onButtonClick}\n />\n </div>\n </div>\n </div>\n </div>\n );\n};\n","/*\n * insert_citation-source-panel-crossref.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\n\nimport { suggestCiteId, formatAuthors, formatIssuedDate } from '../../../api/cite';\nimport { CrossrefWork, imageForCrossrefType, CrossrefServer, prettyType } from '../../../api/crossref';\nimport { sanitizeForCiteproc, CSL } from '../../../api/csl';\nimport { DOIServer } from '../../../api/doi';\nimport { logException } from '../../../api/log';\nimport { NavigationTreeNode } from '../../../api/widgets/navigation-tree';\n\nimport { EditorUI } from '../../../api/ui';\n\nimport {\n CitationSourcePanelProps,\n CitationSourcePanelProvider,\n CitationListEntry,\n CitationSourceListStatus,\n matchExistingSourceCitationListEntry,\n} from './insert_citation-source-panel';\nimport { CitationSourceLatentSearchPanel } from './insert_citation-source-panel-latent-search';\nimport { BibliographyManager } from '../../../api/bibliography/bibliography';\n\nexport function crossrefSourcePanel(\n ui: EditorUI,\n server: CrossrefServer,\n doiServer: DOIServer,\n bibliographyManager: BibliographyManager\n): CitationSourcePanelProvider {\n const kCrossrefType = 'Crossref';\n return {\n key: 'E38370AA-78AE-450B-BBE8-878E1C817C04',\n panel: CrossRefSourcePanel,\n treeNode: () => {\n return {\n key: 'CrossRef',\n name: ui.context.translateText('Crossref'),\n image: ui.images.citations?.crossref,\n type: kCrossrefType,\n children: [],\n expanded: true,\n };\n },\n progressMessage: ui.context.translateText('Searching Crossref....'),\n placeHolderMessage: ui.context.translateText('Enter search terms to search Crossref'),\n search: async (searchTerm: string, _selectedNode: NavigationTreeNode, existingCitationIds: string[]) => {\n try {\n const works = await server.works(searchTerm);\n const existingSources = bibliographyManager.localSources();\n\n const dedupeCitationIds = existingCitationIds;\n const citationEntries = works.items.map(work => {\n const citationEntry = matchExistingSourceCitationListEntry(work.DOI, dedupeCitationIds, ui, bibliographyManager) || toCitationListEntry(work, dedupeCitationIds, ui, doiServer);\n if (citationEntry) {\n // Add this id to the list of existing Ids so future ids will de-duplicate against this one\n dedupeCitationIds.push(citationEntry.id);\n }\n return citationEntry;\n });\n\n return Promise.resolve({\n citations: citationEntries,\n status: citationEntries.length > 0 ? CitationSourceListStatus.default : CitationSourceListStatus.noResults,\n statusMessage:\n citationEntries.length > 0 ? '' : ui.context.translateText('No results matching these search terms.'),\n });\n } catch (e) {\n logException(e);\n return Promise.resolve({\n citations: [],\n status: CitationSourceListStatus.error,\n statusMessage: ui.context.translateText('An unknown error occurred. Please try again.'),\n });\n }\n },\n };\n}\n\nexport const CrossRefSourcePanel = React.forwardRef<HTMLDivElement, CitationSourcePanelProps>(\n (props: CitationSourcePanelProps, ref) => {\n return (\n <CitationSourceLatentSearchPanel\n height={props.height}\n citations={props.citations}\n citationsToAdd={props.citationsToAdd}\n searchTerm={props.searchTerm}\n onSearchTermChanged={props.onSearchTermChanged}\n executeSearch={props.onExecuteSearch}\n onAddCitation={props.onAddCitation}\n onRemoveCitation={props.onRemoveCitation}\n selectedIndex={props.selectedIndex}\n onSelectedIndexChanged={props.onSelectedIndexChanged}\n onConfirm={props.onConfirm}\n searchPlaceholderText={props.ui.context.translateText('Search Crossref for Citations')}\n status={props.status}\n statusMessage={props.statusMessage}\n ui={props.ui}\n ref={ref}\n />\n );\n },\n);\n\nfunction toCitationListEntry(\n crossrefWork: CrossrefWork,\n existingIds: string[],\n ui: EditorUI,\n doiServer: DOIServer,\n): CitationListEntry {\n const coercedCSL = sanitizeForCiteproc((crossrefWork as unknown) as CSL);\n const id = suggestCiteId(existingIds, coercedCSL);\n const providerKey = 'crossref';\n return {\n id,\n isIdEditable: true,\n title: crossrefWorkTitle(crossrefWork, ui),\n type: prettyType(ui, crossrefWork.type),\n date: formatIssuedDate(crossrefWork.issued),\n journal: crossrefWork['container-title'] || crossrefWork['short-container-title'] || crossrefWork.publisher,\n image: imageForCrossrefType(ui, crossrefWork.type)[0],\n doi: crossrefWork.DOI,\n authors: (length: number) => {\n return formatAuthors(coercedCSL.author, length);\n },\n toBibliographySource: async (finalId: string) => {\n // Generate CSL using the DOI\n const doiResult = await doiServer.fetchCSL(crossrefWork.DOI, -1);\n\n const csl = doiResult.message as CSL;\n return { ...csl, id: finalId, providerKey };\n },\n isSlowGeneratingBibliographySource: true,\n };\n}\n\nfunction crossrefWorkTitle(work: CrossrefWork, ui: EditorUI) {\n if (work.title) {\n return work.title[0];\n } else {\n return ui.context.translateText('(Untitled)');\n }\n}\n","/*\n * insert_citation-source-panel-pubmed.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport React from 'react';\n\nimport { BibliographyManager } from '../../../api/bibliography/bibliography';\nimport { createUniqueCiteId } from '../../../api/cite';\nimport { CSL, sanitizeForCiteproc } from '../../../api/csl';\nimport { DOIServer } from '../../../api/doi';\nimport { logException } from '../../../api/log';\nimport { NavigationTreeNode } from '../../../api/widgets/navigation-tree';\nimport { PubMedServer, PubMedDocument, suggestCiteId, imageForType } from '../../../api/pubmed';\nimport { EditorUI } from '../../../api/ui';\n\nimport {\n CitationSourcePanelProps,\n CitationSourcePanelProvider,\n CitationListEntry,\n CitationSourceListStatus,\n errorForStatus,\n matchExistingSourceCitationListEntry,\n} from './insert_citation-source-panel';\nimport { CitationSourceLatentSearchPanel } from './insert_citation-source-panel-latent-search';\n\nexport function pubmedSourcePanel(\n ui: EditorUI,\n server: PubMedServer,\n doiServer: DOIServer,\n bibliographyManager: BibliographyManager\n): CitationSourcePanelProvider {\n const kPubmedType = 'Pubmed';\n return {\n key: 'EF556233-05B0-4678-8216-38061908463F',\n panel: PubmedSourcePanel,\n treeNode: () => {\n return {\n key: 'PubMed',\n name: ui.context.translateText('PubMed'),\n image: ui.images.citations?.pubmed,\n type: kPubmedType,\n children: [],\n expanded: true,\n };\n },\n progressMessage: ui.context.translateText('Searching PubMed....'),\n placeHolderMessage: ui.context.translateText('Enter a PubMed query to search for citations.'),\n search: async (searchTerm: string, _selectedNode: NavigationTreeNode, existingCitationIds: string[]) => {\n try {\n const noResultsMessage = ui.context.translateText('No results matching these search terms.');\n\n // Do the PubMed Search\n const pubMedResult = await server.search(searchTerm);\n switch (pubMedResult.status) {\n case 'ok':\n if (pubMedResult.message !== null) {\n // There is a message\n // PubMed Results and Existing Ids\n const docs: PubMedDocument[] = pubMedResult.message;\n const dedupeCitationIds = existingCitationIds;\n\n // Create Citation List Entries for these PubMed docs\n const citationEntries = docs.map(doc => {\n const citationEntry = matchExistingSourceCitationListEntry(doc.doi, dedupeCitationIds, ui, bibliographyManager) || toCitationListEntry(doc, dedupeCitationIds, ui, doiServer);\n if (citationEntry && citationEntry.id) {\n // Add this id to the list of existing Ids so future ids will de-duplicate against this one\n dedupeCitationIds.push(citationEntry.id);\n }\n return citationEntry;\n });\n\n // Return the search result\n return Promise.resolve({\n citations: citationEntries,\n status:\n citationEntries.length > 0 ? CitationSourceListStatus.default : CitationSourceListStatus.noResults,\n statusMessage: citationEntries.length > 0 ? '' : noResultsMessage,\n });\n } else {\n // No message, no results\n return Promise.resolve({\n citations: [],\n status: CitationSourceListStatus.noResults,\n statusMessage: noResultsMessage,\n });\n }\n\n default:\n // Resolve with Error\n return Promise.resolve({\n citations: [],\n status: CitationSourceListStatus.error,\n statusMessage: ui.context.translateText(errorForStatus(ui, pubMedResult.status, 'PubMed')),\n });\n }\n } catch (e) {\n logException(e);\n return Promise.resolve({\n citations: [],\n status: CitationSourceListStatus.error,\n statusMessage: ui.context.translateText('An unknown error occurred. Please try again.'),\n });\n }\n },\n };\n}\n\nexport const PubmedSourcePanel = React.forwardRef<HTMLDivElement, CitationSourcePanelProps>(\n (props: CitationSourcePanelProps, ref) => {\n return (\n <CitationSourceLatentSearchPanel\n height={props.height}\n citations={props.citations}\n citationsToAdd={props.citationsToAdd}\n searchTerm={props.searchTerm}\n onSearchTermChanged={props.onSearchTermChanged}\n executeSearch={props.onExecuteSearch}\n onAddCitation={props.onAddCitation}\n onRemoveCitation={props.onRemoveCitation}\n selectedIndex={props.selectedIndex}\n onSelectedIndexChanged={props.onSelectedIndexChanged}\n onConfirm={props.onConfirm}\n searchPlaceholderText={props.ui.context.translateText('Search PubMed for Citations')}\n status={props.status}\n statusMessage={props.statusMessage}\n ui={props.ui}\n ref={ref}\n />\n );\n },\n);\n\nfunction toCitationListEntry(\n doc: PubMedDocument,\n existingIds: string[],\n ui: EditorUI,\n doiServer: DOIServer,\n): CitationListEntry {\n const id = createUniqueCiteId(existingIds, suggestCiteId(doc));\n const providerKey = 'pubmed';\n return {\n id,\n isIdEditable: true,\n title: doc.title || '',\n doi: doc.doi,\n type: '',\n date: doc.pubDate || '',\n journal: doc.source,\n authors: (length: number) => {\n return formatAuthors(doc.authors || [], length);\n },\n image: imageForType(ui, doc.pubTypes)[0],\n toBibliographySource: async (finalId: string) => {\n // Generate CSL using the DOI\n const doiResult = await doiServer.fetchCSL(doc.doi, -1);\n const csl = doiResult.message as CSL;\n const sanitizedCSL = sanitizeForCiteproc(csl);\n return { ...sanitizedCSL, id: finalId, providerKey };\n },\n isSlowGeneratingBibliographySource: true,\n };\n}\n\nfunction formatAuthors(authors: string[], length: number) {\n return authors.join(',');\n}\n","/*\n * pubmed.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorUI } from './ui';\n\nexport interface PubMedResult {\n status: 'ok' | 'notfound' | 'nohost' | 'error';\n message: PubMedDocument[] | null;\n error: string;\n}\n\nexport interface PubMedDocument {\n doi: string;\n pubTypes?: string[];\n authors?: string[];\n sortFirstAuthor?: string;\n title?: string;\n source?: string;\n volume?: string;\n issue?: string;\n pubDate?: string;\n}\n\nexport interface PubMedServer {\n search: (query: string) => Promise<PubMedResult>;\n}\n\nexport function suggestCiteId(doc: PubMedDocument): string {\n // Try to get the last name. Prefer the sort first author,\n // but otherwise just use the first author (if any)\n let suggestedId = '';\n if (doc.sortFirstAuthor) {\n suggestedId = doc.sortFirstAuthor.split(' ')[0];\n } else if (doc.authors && doc.authors.length > 0) {\n suggestedId = doc.authors[0].split(' ')[0];\n }\n\n // Try to read the year\n if (doc.pubDate) {\n suggestedId = suggestedId + doc.pubDate.split(' ')[0];\n }\n return suggestedId;\n}\n\nexport function imageForType(ui: EditorUI, pubTypes?: string[]): [string?, string?] {\n const type = pubTypes && pubTypes.length > 0 ? pubTypes[0] : '';\n switch (type) {\n case 'Journal Article':\n case 'Historical Article':\n case 'Classical Article':\n case 'Introductory Journal Article':\n case 'paper-conference':\n return [ui.images.citations?.article, ui.images.citations?.article_dark];\n case 'Legal Case':\n case 'Legislation':\n return [ui.images.citations?.legal, ui.images.citations?.legal_dark];\n case 'Dataset':\n return [ui.images.citations?.data, ui.images.citations?.data_dark];\n case 'Video-Audio Media':\n return [ui.images.citations?.movie, ui.images.citations?.movie_dark];\n case 'Webcasts':\n return [ui.images.citations?.web, ui.images.citations?.web_dark];\n default:\n return [ui.images.citations?.other, ui.images.citations?.other_dark];\n }\n}\n","/*\n * insert_citation-source-panel-pubmed.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\n\nimport { createUniqueCiteId } from '../../../api/cite';\nimport { CSL, imageForType } from '../../../api/csl';\nimport { DataCiteServer, DataCiteRecord, suggestCiteId, DataCiteCreator } from '../../../api/datacite';\nimport { DOIServer } from '../../../api/doi';\nimport { NavigationTreeNode } from '../../../api/widgets/navigation-tree';\nimport { logException } from '../../../api/log';\nimport { EditorUI } from '../../../api/ui';\n\nimport {\n CitationSourcePanelProps,\n CitationSourcePanelProvider,\n CitationListEntry,\n CitationSourceListStatus,\n errorForStatus,\n matchExistingSourceCitationListEntry,\n} from './insert_citation-source-panel';\nimport { CitationSourceLatentSearchPanel } from './insert_citation-source-panel-latent-search';\nimport { BibliographyManager } from '../../../api/bibliography/bibliography';\n\nexport function dataciteSourcePanel(\n ui: EditorUI,\n server: DataCiteServer,\n doiServer: DOIServer,\n bibliographyManager: BibliographyManager\n): CitationSourcePanelProvider {\n const kDataCiteType = 'Datacite';\n return {\n key: '66A6EADB-22AE-4DDD-BCD5-70BC0DEB8FB3',\n panel: DataCiteSourcePanel,\n treeNode: () => {\n return {\n key: 'DataCite',\n name: ui.context.translateText('DataCite'),\n image: ui.images.citations?.datacite,\n type: kDataCiteType,\n children: [],\n expanded: true,\n };\n },\n progressMessage: ui.context.translateText('Searching DataCite....'),\n placeHolderMessage: ui.context.translateText('Enter search terms to search DataCite'),\n search: async (searchTerm: string, _selectedNode: NavigationTreeNode, existingCitationIds: string[]) => {\n try {\n const dataciteResult = await server.search(searchTerm);\n const noResultsMessage = ui.context.translateText('No results matching these search terms.');\n switch (dataciteResult.status) {\n case 'ok':\n if (dataciteResult.message !== null) {\n const records: DataCiteRecord[] = dataciteResult.message;\n const dedupeCitationIds = existingCitationIds;\n const citationEntries = records.map(record => {\n const citationEntry = matchExistingSourceCitationListEntry(record.doi, dedupeCitationIds, ui, bibliographyManager) || toCitationListEntry(record, dedupeCitationIds, ui, doiServer);\n if (citationEntry) {\n // Add this id to the list of existing Ids so future ids will de-duplicate against this one\n dedupeCitationIds.push(citationEntry.id);\n }\n return citationEntry;\n });\n return Promise.resolve({\n citations: citationEntries,\n status:\n citationEntries.length > 0 ? CitationSourceListStatus.default : CitationSourceListStatus.noResults,\n statusMessage: citationEntries.length > 0 ? '' : noResultsMessage,\n });\n } else {\n // No results\n return Promise.resolve({\n citations: [],\n status: CitationSourceListStatus.noResults,\n statusMessage: noResultsMessage,\n });\n }\n default:\n // Resolve with Error\n return Promise.resolve({\n citations: [],\n status: CitationSourceListStatus.error,\n statusMessage: ui.context.translateText(errorForStatus(ui, dataciteResult.status, 'DataCite')),\n });\n }\n } catch (e) {\n logException(e);\n return Promise.resolve({\n citations: [],\n status: CitationSourceListStatus.error,\n statusMessage: ui.context.translateText('An unknown error occurred. Please try again.'),\n });\n }\n },\n };\n}\n\nexport const DataCiteSourcePanel = React.forwardRef<HTMLDivElement, CitationSourcePanelProps>(\n (props: CitationSourcePanelProps, ref) => {\n return (\n <CitationSourceLatentSearchPanel\n height={props.height}\n citations={props.citations}\n citationsToAdd={props.citationsToAdd}\n searchTerm={props.searchTerm}\n onSearchTermChanged={props.onSearchTermChanged}\n executeSearch={props.onExecuteSearch}\n onAddCitation={props.onAddCitation}\n onRemoveCitation={props.onRemoveCitation}\n selectedIndex={props.selectedIndex}\n onSelectedIndexChanged={props.onSelectedIndexChanged}\n onConfirm={props.onConfirm}\n searchPlaceholderText={props.ui.context.translateText('Search DataCite for Citations')}\n status={props.status}\n statusMessage={props.statusMessage}\n ui={props.ui}\n ref={ref}\n />\n );\n },\n);\n\nfunction toCitationListEntry(\n record: DataCiteRecord,\n existingIds: string[],\n ui: EditorUI,\n doiServer: DOIServer,\n): CitationListEntry {\n const id = createUniqueCiteId(existingIds, suggestCiteId(record));\n const providerKey = 'datacite';\n return {\n id,\n isIdEditable: true,\n title: record.title || '',\n type: record.type || '',\n date: record.publicationYear?.toString() || '',\n journal: record.publisher,\n image: imageForType(ui.images, record.type || '')[0],\n doi: record.doi,\n authors: (length: number) => {\n return formatAuthors(record.creators || [], length);\n },\n toBibliographySource: async (finalId: string) => {\n // Generate CSL using the DOI\n const doiResult = await doiServer.fetchCSL(record.doi, -1);\n\n const csl = doiResult.message as CSL;\n return { ...csl, id: finalId, providerKey };\n },\n isSlowGeneratingBibliographySource: true,\n };\n}\n\nfunction formatAuthors(authors: DataCiteCreator[], length: number) {\n return authors.map(creator => creator.fullName).join(',');\n}\n","/*\n * datacite.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport interface DataCiteResult {\n status: 'ok' | 'notfound' | 'nohost' | 'error';\n message: DataCiteRecord[] | null;\n error: string;\n}\n\nexport interface DataCiteRecord {\n doi: string;\n title?: string;\n publisher?: string;\n publicationYear?: number;\n creators?: DataCiteCreator[];\n type?: string; // citeproc type\n}\n\nexport interface DataCiteCreator {\n fullName: string;\n familyName?: string;\n givenName?: string;\n}\n\nexport interface DataCiteServer {\n search: (query: string) => Promise<DataCiteResult>;\n}\n\nexport function suggestCiteId(record: DataCiteRecord): string {\n // Try to use the last name (or the first name)\n let suggestedId = '';\n if (record.creators && record.creators.length > 0) {\n suggestedId = record.creators[0].familyName || record.creators[0].fullName;\n }\n\n // Try to read the year\n if (record.publicationYear) {\n suggestedId = suggestedId + record.publicationYear;\n }\n return suggestedId;\n}\n","/*\n * insert_citation-picker-bibliography.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\n\nimport { EditorUI } from '../../api/ui';\nimport { changeExtension } from '../../api/path';\nimport { WidgetProps } from '../../api/widgets/react';\nimport { TextInput } from '../../api/widgets/text';\nimport { SelectInput } from '../../api/widgets/select';\nimport { BibliographyFile, BibliographyType } from '../../api/bibliography/bibliography';\n\nimport './insert_citation-bibliography-picker.css';\n\nexport interface CitationBiblographyPickerProps extends WidgetProps {\n bibliographyTypes: BibliographyType[];\n bibliographyFiles: BibliographyFile[];\n onBiblographyFileChanged: (file: BibliographyFile) => void;\n createBibliographyFileName: string;\n onCreateBibliographyFileNameChanged: (fileName: string) => void;\n ui: EditorUI;\n}\n\nexport const CitationBibliographyPicker: React.FC<CitationBiblographyPickerProps> = props => {\n // Selection of file from list\n const onChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n const index = e.target.selectedIndex;\n props.onBiblographyFileChanged(props.bibliographyFiles[index]);\n };\n\n // Change to the file we should create\n const onTextChange = (e: React.ChangeEvent<HTMLInputElement>) => {\n const text = e.target.value;\n props.onCreateBibliographyFileNameChanged(text);\n };\n\n // File type change\n const onTypeChange = (e: React.ChangeEvent<HTMLSelectElement>) => {\n const index = e.target.selectedIndex;\n const type = props.bibliographyTypes[index];\n const newPath = changeExtension(props.createBibliographyFileName, type.extension);\n props.onCreateBibliographyFileNameChanged(newPath);\n props.ui.prefs.setBibliographyDefaultType(type.extension);\n };\n\n return (\n <div className=\"pm-citation-bibliography-picker-container\" style={props.style}>\n <div className=\"pm-citation-bibliography-picker-label pm-text-color\">\n {props.bibliographyFiles.length > 0\n ? props.ui.context.translateText('Add to bibliography:')\n : props.ui.context.translateText('Create bibliography:')}\n </div>\n {props.bibliographyFiles.length > 0 ? (\n <SelectInput onChange={onChange}>\n {props.bibliographyFiles.map(file => (\n <option key={file.fullPath} value={file.fullPath}>\n {file.displayPath}\n </option>\n ))}\n </SelectInput>\n ) : (\n <div className=\"pm-citation-bibliography-picker-create-controls\">\n <TextInput\n width=\"100\"\n tabIndex={0}\n className=\"pm-citation-bibliography-picker-textbox pm-block-border-color\"\n placeholder={props.ui.context.translateText('Bibligraphy file name')}\n value={props.createBibliographyFileName}\n onChange={onTextChange}\n />\n <div className=\"pm-citation-bibliography-format-label pm-text-color\">\n {props.ui.context.translateText('Format:')}\n </div>\n <SelectInput\n onChange={onTypeChange}\n defaultValue={props.bibliographyTypes.find(bibType => bibType.default)?.extension}\n >\n {props.bibliographyTypes.map(bibType => (\n <option key={bibType.extension} value={bibType.extension}>\n {bibType.displayName}\n </option>\n ))}\n </SelectInput>\n </div>\n )}\n </div>\n );\n};\n","/*\n * insert_citation-panel-packages.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React from 'react';\n\nimport { EditorUI } from '../../../api/ui';\nimport { NavigationTreeNode } from '../../../api/widgets/navigation-tree';\nimport { imageForType, CSL, cslTypes, CSLDate } from '../../../api/csl';\nimport { EnvironmentServer, RPackageInfo, RPackageCitationPerson, RPackageCitation } from '../../../api/environment';\nimport { bibtextTypeToCSLType } from '../../../api/bibtex/types';\n\nimport {\n CitationSourcePanelProvider,\n CitationSourcePanelProps,\n CitationListEntry,\n CitationSourceListStatus,\n CitationSourcePanelSearchResult,\n} from './insert_citation-source-panel';\nimport { CitationSourceTypeheadSearchPanel } from './insert_citation-source-panel-typeahead-search';\n\nimport Fuse from 'fuse.js';\nimport uniqBy from 'lodash.uniqby';\nimport orderBy from 'lodash.orderby';\n\nconst kPackageType = 'Packages';\n\nexport function packageSourcePanel(\n ui: EditorUI,\n server: EnvironmentServer,\n): CitationSourcePanelProvider {\n\n // Fetch the packages and index when needed\n let pkgInfos: RPackageInfo[];\n let pkgIndex: PackageSearch;\n const getPackageIndex = async () => {\n if (pkgIndex === undefined) {\n\n // Read the package state\n const pkgState = await server.getRPackageState();\n\n // Sorting in this way ensures that the packages are in alpha order and that in.project.library packages appear first\n // uniqby will always select the first uniq entry, so this ensures that in.project.library packages are preferred\n // (in.project.library represents a package provided as a part of packrat or renv)\n const sorted = orderBy(pkgState.package_list, [pkg => pkg.name.toLowerCase(), 'in.project.library'], ['asc', 'desc']);\n\n // Create the list of info and index\n pkgInfos = uniqBy(sorted, pkg => pkg.name);\n pkgIndex = packageIndex(pkgInfos);\n }\n return {\n packageInfos: pkgInfos,\n index: pkgIndex\n };\n };\n\n return {\n key: '97863EFF-2075-43B2-8F0F-88A250CC33BE',\n panel: PackageSourcePanel,\n treeNode: () => {\n return {\n key: 'RPackages',\n name: ui.context.translateText('R Package'),\n image: ui.images.citations?.packages,\n type: kPackageType,\n children: [],\n expanded: true,\n };\n },\n typeAheadSearch: (searchTerm: string, _selectedNode: NavigationTreeNode, existingCitationIds: string[], onResults: (result: CitationSourcePanelSearchResult) => void) => {\n\n // Get the index, then search it\n getPackageIndex().then(({ packageInfos, index }) => {\n const matchingEntries = searchTerm ? index.search(searchTerm) : packageInfos;\n const citations = matchingEntries.map(pkg => {\n return toCitationListEntry(pkg, existingCitationIds, ui, server);\n });\n const status = citations.length > 0 ? CitationSourceListStatus.default : CitationSourceListStatus.noResults;\n const statusMessage = citations.length > 0 ? \"\" : ui.context.translateText('No matching packages');\n onResults({\n citations,\n status,\n statusMessage\n });\n });\n },\n };\n}\n\nexport const PackageSourcePanel = React.forwardRef<HTMLDivElement, CitationSourcePanelProps>(\n (props: CitationSourcePanelProps, ref) => {\n return (\n <>\n <CitationSourceTypeheadSearchPanel\n height={props.height}\n citations={props.citations}\n citationsToAdd={props.citationsToAdd}\n searchTerm={props.searchTerm}\n onSearchTermChanged={props.onSearchTermChanged}\n selectedIndex={props.selectedIndex}\n onSelectedIndexChanged={props.onSelectedIndexChanged}\n onAddCitation={props.onAddCitation}\n onRemoveCitation={props.onRemoveCitation}\n onConfirm={props.onConfirm}\n status={props.status}\n statusMessage={props.statusMessage}\n ui={props.ui}\n ref={ref}\n />\n </>\n );\n },\n);\n\nfunction toCitationListEntry(\n packageInfo: RPackageInfo,\n existingCitationIds: string[],\n ui: EditorUI,\n server: EnvironmentServer\n): CitationListEntry {\n return {\n id: suggestPackageCiteId(packageInfo.name, existingCitationIds),\n isIdEditable: true,\n type: cslTypes.entry,\n title: packageInfo.desc || \"\",\n date: packageInfo.version || \"\",\n journal: \"\",\n doi: \"\",\n image: imageForType(ui.images, cslTypes.book)[0],\n authors: (_length: number) => {\n return packageInfo.name || \"\";\n },\n toBibliographySource: async (finalId: string) => {\n const csl = await packageToCSL(packageInfo, server);\n if (csl) {\n return { ...csl, id: finalId, providerKey: kPackageType };\n } else {\n // This should never happen\n return { type: cslTypes.book, id: finalId, providerKey: kPackageType };\n }\n },\n isSlowGeneratingBibliographySource: false,\n };\n}\n\nasync function packageToCSL(packageInfo: RPackageInfo, server: EnvironmentServer) {\n const citeInfos = await server.getRPackageCitations(packageInfo.name);\n if (citeInfos && citeInfos.length) {\n // RPackages can return multiple possible citations (e.g. the package, the paper in which it appeared,\n // a book documenting it), but the first one is by convention the package itself\n const citeInfo = citeInfos[0];\n return packageCitationToCSL(citeInfo);\n }\n}\n\n\nfunction packageCitationToCSL(citeInfo: RPackageCitation) {\n const toCSLNames = (people?: RPackageCitationPerson[]) => {\n if (people) {\n return people.map(person => {\n return {\n family: person.family,\n given: person.given.join(' ')\n };\n });\n } else {\n return undefined;\n }\n };\n\n const toCSLDate = (year?: string): CSLDate | undefined => {\n if (year) {\n\n return {\n 'date-parts': [[Number.parseInt(year, 10)]]\n };\n } else {\n return undefined;\n }\n };\n\n const csl: CSL = {\n type: bibtextTypeToCSLType(citeInfo.type),\n title: citeInfo.title,\n };\n\n if (citeInfo.doi !== null) {\n csl.DOI = citeInfo.doi;\n }\n if (citeInfo.url !== null) {\n csl.URL = citeInfo.url;\n }\n if (citeInfo.publisher !== null) {\n csl.publisher = citeInfo.publisher;\n }\n if (citeInfo.booktitle !== null) {\n csl['container-title'] = citeInfo.booktitle;\n }\n if (citeInfo.pages !== null) {\n csl.page = citeInfo.pages;\n }\n if (citeInfo.volume !== null) {\n csl.volume = citeInfo.volume;\n }\n if (citeInfo.author !== null) {\n csl.author = toCSLNames(citeInfo.author);\n }\n if (citeInfo.year !== null) {\n csl.issued = toCSLDate(citeInfo.year);\n }\n return csl;\n\n}\n\n// Create a citeky using the package, de-duplicating by incrementing a counter\n// until the key is unique\nfunction suggestPackageCiteId(name: string, existingCitationIds: string[]) {\n\n\n let retryCount = 0;\n const incrementName = () => {\n retryCount = retryCount + 1;\n if (retryCount === 1) {\n return name;\n } else {\n return `${name}-${retryCount}`;\n }\n };\n\n let citekey = incrementName();\n while (existingCitationIds.includes(citekey)) {\n citekey = incrementName();\n }\n return citekey;\n}\n\n\n// Search index for packages\ninterface PackageSearch {\n search(searchTerm: string): RPackageInfo[];\n}\n\nconst searchFields: Fuse.FuseOptionKeyObject[] = [\n { name: 'name', weight: 30 },\n { name: 'desc', weight: 15 },\n { name: 'version', weight: 5 },\n];\n\nfunction packageIndex(entries: RPackageInfo[]): PackageSearch {\n // build search index\n const options = {\n isCaseSensitive: false,\n shouldSort: true,\n includeMatches: false,\n includeScore: false,\n minMatchCharLength: 1,\n threshold: 0.2,\n keys: searchFields,\n limit: 10000\n };\n const index = Fuse.createIndex<RPackageInfo>(searchFields.map(searchField => searchField.name), entries);\n const fuse = new Fuse(entries, options, index);\n return {\n search: (searchTerm: string): RPackageInfo[] => {\n const results = fuse.search(searchTerm, options);\n return results.map(result => result.item);\n },\n };\n}\n\n","/*\n * text.tsx\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport React, { ChangeEventHandler, KeyboardEventHandler, FocusEventHandler, ClipboardEventHandler } from 'react';\n\nimport { WidgetProps } from './react';\n\nimport './text.css';\n\nexport interface CheckboxInputProps extends WidgetProps {\n id?: string;\n tabIndex?: number;\n className?: string;\n checked?: boolean;\n onChange?: ChangeEventHandler;\n}\n\nexport const CheckboxInput= React.forwardRef<HTMLInputElement, CheckboxInputProps>((props, ref) => {\n const style: React.CSSProperties = {\n ...props.style,\n };\n\n return (\n <input\n id={props.id} \n type=\"checkbox\"\n className={`\n pm-input-checkbox\n pm-text-color \n pm-background-color \n ${props.className}`}\n checked={props.checked}\n onChange={props.onChange}\n tabIndex={props.tabIndex}\n ref={ref}\n />\n );\n});\n\n\n","/*\n * xref-popup.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { PluginKey } from 'prosemirror-state';\nimport { DecorationSet, EditorView } from 'prosemirror-view';\n\nimport React from 'react';\n\nimport { EditorUI } from '../../api/ui';\nimport { textPopupDecorationPlugin, TextPopupTarget } from '../../api/text-popup';\nimport { WidgetProps } from '../../api/widgets/react';\nimport { Popup } from '../../api/widgets/popup';\nimport { EditorServer } from '../../api/server';\nimport { XRef, xrefKey, parseQuartoXRef } from '../../api/xref';\nimport { LinkButton } from '../../api/widgets/button';\n\nimport './cite-popup-xref.css';\n\nconst kMaxWidth = 350;\n\nexport function citeXrefPopupPlugin(schema: Schema, ui: EditorUI, server: EditorServer) {\n return textPopupDecorationPlugin({\n key: new PluginKey<DecorationSet>('cite-xref-popup'),\n markType: schema.marks.cite_id,\n maxWidth: kMaxWidth,\n dismissOnEdit: false,\n createPopup: async (view: EditorView, target: TextPopupTarget, style: React.CSSProperties) => {\n\n // lookup xref on server\n const docPath = ui.context.getDocumentPath();\n if (docPath) {\n\n const citeId = target.text.replace(/^-@|^@/, '');\n const parsed = parseQuartoXRef(citeId);\n if (parsed) {\n const { id, type } = parsed;\n\n const xrefs = await server.xref.quartoXrefForId(docPath, `${type.toLowerCase()}-${id}`);\n if (xrefs.refs.length > 0) {\n if (xrefs.refs.length) {\n const xref = xrefs.refs[0];\n\n // click handler\n const onClick = () => {\n const file = xrefs.baseDir + '/' + xref.file;\n ui.display.navigateToXRef(file, xref);\n };\n\n return <XrefCitefPopup xref={xref} onClick={onClick} style={style} />;\n }\n }\n }\n }\n return null;\n }\n });\n}\n\ninterface XRefCitePopupProps extends WidgetProps {\n xref: XRef;\n onClick: VoidFunction;\n style: React.CSSProperties;\n}\n\nconst XrefCitefPopup: React.FC<XRefCitePopupProps> = props => {\n return (\n <Popup classes={['pm-cite-xref-popup']} style={props.style} >\n <div>\n <LinkButton\n text={xrefKey(props.xref, \"quarto\")}\n onClick={props.onClick}\n maxWidth={kMaxWidth - 20\n }\n classes={['pm-cite-xref-popup-key pm-fixedwidth-font']}\n />\n </div>\n {props.xref.title ? (\n <div className=\"pm-cite-xref-popup-text\" >{props.xref.title} </div>\n ) : null}\n <div className=\"pm-cite-xref-popup-file\" >{props.xref.file} </div>\n </Popup>\n );\n};\n","/*\n * span.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Mark, Fragment, Schema, DOMOutputSpec } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nimport { ExtensionContext } from '../api/extension';\nimport { ProsemirrorCommand, EditorCommandId } from '../api/command';\nimport { EditorUI } from '../api/ui';\nimport { markIsActive, getMarkAttrs, getSelectionMarkRange } from '../api/mark';\nimport { PandocOutput, PandocTokenType, PandocToken } from '../api/pandoc';\nimport {\n pandocAttrSpec,\n pandocAttrReadAST,\n pandocAttrParseDom,\n pandocAttrToDomAttr,\n kSpanAttr,\n kSpanChildren,\n} from '../api/pandoc_attr';\n\nconst extension = (context: ExtensionContext) => {\n const { pandocExtensions, ui } = context;\n\n if (!pandocExtensions.bracketed_spans && !pandocExtensions.native_spans) {\n return null;\n }\n\n return {\n marks: [\n {\n name: 'span',\n spec: {\n attrs: pandocAttrSpec,\n inclusive: false,\n parseDOM: [\n {\n tag: 'span[data-span=\"1\"]',\n getAttrs(dom: Node | string) {\n const attrs: {} = { 'data-span': 1 };\n return {\n ...attrs,\n ...pandocAttrParseDom(dom as Element, attrs),\n };\n },\n },\n ],\n toDOM(mark: Mark): DOMOutputSpec {\n const attr = {\n 'data-span': '1',\n ...pandocAttrToDomAttr({\n ...mark.attrs,\n classes: [...mark.attrs.classes, 'pm-span pm-span-background-color'],\n }),\n };\n return ['span', attr];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.Span,\n mark: 'span',\n getAttrs: (tok: PandocToken) => {\n return pandocAttrReadAST(tok, kSpanAttr);\n },\n getChildren: (tok: PandocToken) => tok.c[kSpanChildren],\n },\n ],\n writer: {\n priority: 11,\n write: (output: PandocOutput, mark: Mark, parent: Fragment) => {\n output.writeToken(PandocTokenType.Span, () => {\n output.writeAttr(mark.attrs.id, mark.attrs.classes, mark.attrs.keyvalue);\n output.writeArray(() => {\n output.writeInlines(parent);\n });\n });\n },\n },\n },\n },\n ],\n\n commands: (_schema: Schema) => {\n return [new SpanCommand(ui)];\n },\n };\n};\n\nclass SpanCommand extends ProsemirrorCommand {\n constructor(ui: EditorUI) {\n super(EditorCommandId.Span, [], (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n const schema = state.schema;\n\n // if there is no contiguous selection and no existing span mark active\n // then the command should be disabled (unknown what the span target is)\n if (!markIsActive(state, schema.marks.span) && state.selection.empty) {\n return false;\n }\n\n // if the current node doesn't allow this mark return false\n if (!state.selection.$from.node().type.allowsMarkType(schema.marks.span)) {\n return false;\n }\n\n async function asyncEditSpan() {\n if (dispatch) {\n let attr: { [key: string]: any } = { id: null, classes: [], keyvalue: [] };\n if (markIsActive(state, schema.marks.span)) {\n attr = getMarkAttrs(state.doc, state.selection, schema.marks.span);\n }\n const result = await ui.dialogs.editSpan(attr);\n if (result) {\n const tr = state.tr;\n const range = getSelectionMarkRange(state.selection, schema.marks.span);\n tr.removeMark(range.from, range.to, schema.marks.span);\n if (result.action === 'edit') {\n const mark = schema.marks.span.create(result.attr);\n tr.addMark(range.from, range.to, mark);\n }\n dispatch(tr);\n }\n }\n if (view) {\n view.focus();\n }\n }\n asyncEditSpan();\n\n return true;\n });\n }\n}\n\nexport default extension;\n","/*\n * xref.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Node as ProsemirrorNode, Mark, Fragment } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { InputRule } from 'prosemirror-inputrules';\nimport { Transform } from 'prosemirror-transform';\n\nimport { setTextSelection, findChildren, findChildrenByMark } from 'prosemirror-utils';\n\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { detectAndApplyMarks, removeInvalidatedMarks, getMarkRange } from '../../api/mark';\nimport { MarkTransaction, trTransform } from '../../api/transaction';\nimport { FixupContext } from '../../api/fixup';\nimport { ProsemirrorCommand, EditorCommandId, toggleMarkType } from '../../api/command';\nimport { canInsertNode } from '../../api/node';\nimport { fragmentText } from '../../api/fragment';\nimport { PandocOutput } from '../../api/pandoc';\nimport { OmniInsertGroup } from '../../api/omni_insert';\nimport { xrefCompletionHandler } from './xref-completion';\nimport { xrefPopupPlugin } from './xref-popup';\nimport { kQuartoDocType } from '../../api/format';\nimport { insertXref } from '../../behaviors/insert_xref/insert_xref';\n\nconst kRefRegExDetectAndApply = /(?:^|[^`])(\\\\?@ref\\([ A-Za-z0-9:-]*\\))/g;\n\nconst extension = (context: ExtensionContext): Extension | null => {\n const { pandocExtensions, format, ui, server } = context;\n\n if (!format.rmdExtensions.bookdownXRef) {\n return null;\n }\n\n return {\n marks: [\n {\n name: 'xref',\n noInputRules: true,\n noSpelling: true,\n spec: {\n inclusive: false,\n excludes: 'formatting',\n attrs: {},\n parseDOM: [\n {\n tag: \"span[class*='xref']\",\n },\n ],\n toDOM(_mark: Mark) {\n return ['span', { class: 'xref pm-link-text-color pm-fixedwidth-font' }];\n },\n },\n pandoc: {\n readers: [],\n writer: {\n priority: 1,\n write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n // alias xref (may need to transform it to deal with \\ prefix)\n let xref = parent;\n\n // if it starts with a \\ then don't write the slash (pandoc will\n // either create one automatically or we'll write one explicitly\n // if pandoc won't b/c it doesn't have all_symbols_escapable)\n if (fragmentText(xref).startsWith('\\\\')) {\n xref = xref.cut(1, xref.size);\n }\n\n // if all symbols aren't escapable then we need an explicit \\\n // (because pandoc won't automatically escape the \\)\n if (!pandocExtensions.all_symbols_escapable) {\n output.writeRawMarkdown('\\\\');\n }\n\n // write xref\n output.writeInlines(xref);\n },\n },\n },\n },\n ],\n\n fixups: (schema: Schema) => {\n return [\n (tr: Transaction, fixupContext: FixupContext) => {\n if (fixupContext === FixupContext.Load) {\n // apply marks\n const markType = schema.marks.xref;\n const predicate = (node: ProsemirrorNode) => {\n return node.isTextblock && node.type.allowsMarkType(markType);\n };\n const markTr = new MarkTransaction(tr);\n findChildren(tr.doc, predicate).forEach(nodeWithPos => {\n const { pos } = nodeWithPos;\n detectAndApplyMarks(\n markTr,\n tr.doc.nodeAt(pos)!,\n pos,\n kRefRegExDetectAndApply,\n markType,\n () => ({}),\n () => true,\n match => match[1],\n );\n });\n\n // remove leading \\ as necessary (this would occur if the underlying format includes\n // a \\@ref and doesn't have all_symbols_escapable, e.g. blackfriday)\n trTransform(tr, stripRefBackslashTransform);\n }\n return tr;\n },\n ];\n },\n\n appendMarkTransaction: (schema: Schema) => {\n return [\n {\n name: 'xref-marks',\n filter: (node: ProsemirrorNode) => node.isTextblock && node.type.allowsMarkType(node.type.schema.marks.xref),\n append: (tr: MarkTransaction, node: ProsemirrorNode, pos: number) => {\n removeInvalidatedMarks(tr, node, pos, kRefRegExDetectAndApply, node.type.schema.marks.xref);\n detectAndApplyMarks(\n tr,\n tr.doc.nodeAt(pos)!,\n pos,\n kRefRegExDetectAndApply,\n node.type.schema.marks.xref,\n () => ({}),\n () => true,\n match => match[1],\n );\n },\n },\n ];\n },\n\n inputRules: (_schema: Schema) => {\n return [atRefInputRule(), ...(format.rmdExtensions.bookdownXRefUI ? [refPrefixInputRule()] : [])];\n },\n\n plugins: (schema: Schema) => [xrefPopupPlugin(schema, ui, server)],\n\n completionHandlers: () => [xrefCompletionHandler(ui, server.xref)],\n\n commands: (schema: Schema) => {\n if (format.rmdExtensions.bookdownXRefUI) {\n return [\n new ProsemirrorCommand(\n EditorCommandId.CrossReference,\n [],\n (state: EditorState, dispatch?: (tr: Transaction<any>) => void) => {\n // enable/disable command\n if (!canInsertNode(state, schema.nodes.text) || !toggleMarkType(schema.marks.xref)(state)) {\n return false;\n }\n if (dispatch) {\n const tr = state.tr;\n insertRef(tr);\n dispatch(tr);\n }\n return true;\n },\n {\n name: ui.context.translateText('Cross Reference'),\n description: ui.context.translateText('Reference to related content'),\n group: OmniInsertGroup.References,\n priority: 0,\n image: () =>\n ui.prefs.darkMode()\n ? ui.images.omni_insert!.cross_reference_dark!\n : ui.images.omni_insert!.cross_reference!,\n },\n ),\n ];\n } else if (format.docTypes.includes(kQuartoDocType) && pandocExtensions.citations) {\n return [\n new ProsemirrorCommand(\n EditorCommandId.CrossReference,\n ['Shift-Mod-F10'],\n (state: EditorState, dispatch?: (tr: Transaction<any>) => void) => {\n // enable/disable command\n if (!canInsertNode(state, schema.nodes.text) || !toggleMarkType(schema.marks.cite_id)(state)) {\n return false;\n }\n\n // Show the insert Xref dialog\n if (dispatch) {\n insertXref(ui, state.doc, server, (key: string, prefix?: string) => {\n // An xref was selected, insert it\n const tr = state.tr;\n const xref = schema.text(key, [schema.marks.cite_id.create()]);\n\n // If there is a custom prefix, create a full cite\n if (prefix !== undefined || key.startsWith('-')) {\n const start = tr.selection.from;\n const wrapperText = schema.text('[]');\n tr.replaceSelectionWith(wrapperText);\n\n // move the selection into the wrapper\n setTextSelection(tr.selection.from - 1)(tr);\n\n // Insert the prefix\n if (prefix !== undefined) {\n tr.insertText(`${prefix} `, tr.selection.from);\n }\n\n // Insert the xref\n tr.insert(tr.selection.from, xref);\n\n // Add the cite mark\n const citeMark = schema.marks.cite.create();\n tr.addMark(start, tr.selection.from + 1, citeMark);\n\n setTextSelection(tr.selection.from + 1)(tr);\n dispatch(tr);\n\n } else {\n // otherwise, create simple cite_id\n tr.replaceSelectionWith(xref, false);\n setTextSelection(tr.selection.from)(tr);\n dispatch(tr);\n }\n });\n }\n return true;\n },\n {\n name: ui.context.translateText('Cross Reference'),\n description: ui.context.translateText('Reference to related content'),\n group: OmniInsertGroup.References,\n priority: 0,\n image: () =>\n ui.prefs.darkMode()\n ? ui.images.omni_insert!.cross_reference_dark!\n : ui.images.omni_insert!.cross_reference!,\n },\n ),\n ];\n\n\n } else {\n return [];\n }\n },\n };\n};\n\nfunction atRefInputRule() {\n return new InputRule(/(^|[^`])(\\\\?@ref\\()$/, (state: EditorState, match: string[], start: number, end: number) => {\n // if this completes an xref at this position then stand down\n const kRefLen = 4;\n const { parent, parentOffset } = state.selection.$head;\n const before = parent.textContent.slice(parentOffset - kRefLen, parentOffset);\n const after = parent.textContent.slice(parentOffset);\n const potentialXRef = before + '(' + after;\n if (/^@ref\\([A-Za-z0-9:-]*\\).*$/.test(potentialXRef)) {\n return null;\n }\n\n // insert the xref\n const tr = state.tr;\n tr.delete(start + match[1].length, end);\n insertRef(tr);\n return tr;\n });\n}\n\nfunction refPrefixInputRule() {\n return new InputRule(\n /(^|[^`])(Chapter|Chapters|Appendix|Section|Figure|Table|Equation) $/,\n (state: EditorState, match: string[], start: number, end: number) => {\n const tr = state.tr;\n tr.insertText(' ');\n let prefix = '';\n if (match[2] === 'Figure') {\n prefix = 'fig:';\n } else if (match[2] === 'Table') {\n prefix = 'tab:';\n } else if (match[2] === 'Equation') {\n prefix = 'eq:';\n }\n insertRef(tr, prefix);\n setTextSelection(tr.selection.head - 1)(tr);\n return tr;\n },\n );\n}\n\nfunction insertRef(tr: Transaction, prefix = '') {\n const schema = tr.doc.type.schema;\n const selection = tr.selection;\n const refText = `@ref(${prefix})`;\n tr.replaceSelectionWith(schema.text(refText, schema.marks.xref.create()), false);\n setTextSelection(tr.mapping.map(selection.head) - 1)(tr);\n}\n\nfunction stripRefBackslashTransform(tr: Transform) {\n const markType = tr.doc.type.schema.marks.xref;\n findChildrenByMark(tr.doc, markType).forEach(markedNode => {\n const pos = tr.mapping.map(markedNode.pos);\n if (markType.isInSet(markedNode.node.marks)) {\n const markRange = getMarkRange(tr.doc.resolve(pos), markType);\n if (markRange) {\n const text = tr.doc.textBetween(markRange.from, markRange.to);\n if (text.startsWith('\\\\')) {\n tr.deleteRange(markRange.from, markRange.from + 1);\n }\n }\n }\n });\n}\n\nexport default extension;\n","/*\n * xref-popup.tsx\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { PluginKey } from 'prosemirror-state';\nimport { DecorationSet, EditorView } from 'prosemirror-view';\n\nimport React from 'react';\n\nimport { EditorUI } from '../../api/ui';\nimport { textPopupDecorationPlugin, TextPopupTarget } from '../../api/text-popup';\nimport { WidgetProps } from '../../api/widgets/react';\nimport { Popup } from '../../api/widgets/popup';\nimport { EditorServer } from '../../api/server';\nimport { XRef, xrefKey } from '../../api/xref';\nimport { LinkButton } from '../../api/widgets/button';\n\nimport './xref-popup.css';\n\nconst kMaxWidth = 350; // also in xref-popup.css\n\nexport function xrefPopupPlugin(schema: Schema, ui: EditorUI, server: EditorServer) {\n return textPopupDecorationPlugin({\n key: new PluginKey<DecorationSet>('xref-popup'),\n markType: schema.marks.xref,\n maxWidth: kMaxWidth,\n dismissOnEdit: true,\n createPopup: async (view: EditorView, target: TextPopupTarget, style: React.CSSProperties) => {\n // lookup xref on server\n const docPath = ui.context.getDocumentPath();\n if (docPath) {\n const kXRefRegEx = /^@ref\\(([A-Za-z0-9:-]*)\\)$/;\n const match = target.text.match(kXRefRegEx);\n if (match && match[1].length) {\n await ui.context.withSavedDocument();\n const xrefs = await server.xref.xrefForId(docPath, match[1]);\n if (xrefs.refs.length) {\n const xref = xrefs.refs[0];\n\n // click handler\n const onClick = () => {\n const file = xrefs.baseDir + '/' + xref.file;\n ui.display.navigateToXRef(file, xref);\n };\n\n return <XRefPopup xref={xref} onClick={onClick} style={style} />;\n }\n }\n }\n return null;\n },\n specKey: (target: TextPopupTarget) => {\n return `xref:${target.text}`;\n },\n });\n}\n\ninterface XRefPopupProps extends WidgetProps {\n xref: XRef;\n onClick: VoidFunction;\n style: React.CSSProperties;\n}\n\nconst XRefPopup: React.FC<XRefPopupProps> = props => {\n return (\n <Popup classes={['pm-xref-popup']} style={props.style}>\n <div>\n <LinkButton\n text={xrefKey(props.xref)}\n onClick={props.onClick}\n maxWidth={kMaxWidth - 20}\n classes={['pm-xref-popup-key pm-fixedwidth-font']}\n />\n </div>\n <div className=\"pm-xref-popup-file\">{props.xref.file}</div>\n </Popup>\n );\n};\n","/*\n * insert_xref.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport React, { ChangeEvent } from 'react';\nimport ReactDOM from 'react-dom';\nimport { FixedSizeList, ListChildComponentProps } from 'react-window';\nimport uniqBy from 'lodash.uniqby';\nimport debounce from 'lodash.debounce';\n\nimport { EditorUI } from \"../../api/ui\";\nimport { EditorServer } from \"../../api/server\";\nimport { WidgetProps } from '../../api/widgets/react';\nimport { DialogButtons } from '../../api/widgets/dialog-buttons';\nimport { XRef, xrefKey } from '../../api/xref';\nimport { TextInput } from '../../api/widgets/text';\nimport { SelectInput } from '../../api/widgets/select';\nimport { NavigationTree, NavigationTreeNode } from '../../api/widgets/navigation-tree';\nimport { kQuartoXRefTypes } from '../../marks/xref/xref-completion';\n\nimport { xrefIndex } from './insert_xref_index';\nimport './insert_xref-styles.css';\nimport { kAlertTypeError } from '../../api/ui-dialogs';\n\n// Keep the most recently used selected style around\nlet lastSelectedStyleIndex = 0;\n\n// Height of textbox including border\nconst kXrefSearchBoxHeight = 30;\n\n// constants\nconst kStyleDefault = \"Default\";\nconst kStyleCustom = \"Custom\";\nconst kStyleCapital = \"Capitalize\";\nconst kStyleNone = \"(None)\";\n\n// Styles used for xrefs\nconst kXRefStyles: XRefStyle[] = [\n {\n key: kStyleDefault,\n fn: (key: string) => {\n return `@${key}`;\n }\n },\n {\n key: kStyleCapital,\n fn: (key: string) => {\n return `@${key.charAt(0).toUpperCase() + key.slice(1)}`;\n }\n },\n {\n key: kStyleCustom,\n fn: (key: string) => {\n return `@${key}`;\n }\n },\n {\n key: kStyleNone,\n fn: (key: string) => {\n return `-@${key}`;\n }\n },\n];\n\ninterface XRefStyle {\n key: string;\n fn: (key: string) => string;\n}\n\ninterface XRefType {\n type: string;\n prefix: string[];\n}\n\n// Types (prefixes + display) for xrefs\nconst kTheoremTypes = [\"thm\", \"lem\", \"cor\", \"prp\", \"cnj\", \"def\", \"exm\", \"exr\"];\nconst kSecType = \"sec\";\nconst kFigType = \"fig\";\nconst kTableType = \"tbl\";\nconst kEquationType = \"eq\";\nconst kListingtype = \"lst\";\n\nconst xRefTypes = [\n {\n type: \"All Types\",\n prefix: [kSecType, kFigType, kTableType, kEquationType, kListingtype, ...kTheoremTypes],\n image: (ui: EditorUI) => {\n return ui.images.xrefs?.type_all;\n }\n },\n {\n type: \"Sections\",\n prefix: [kSecType],\n image: (ui: EditorUI) => {\n return ui.images.xrefs?.type_section;\n }\n },\n {\n type: \"Figures\",\n prefix: [kFigType],\n image: (ui: EditorUI) => {\n return ui.images.xrefs?.type_figure;\n }\n },\n {\n type: \"Tables\",\n prefix: [kTableType],\n image: (ui: EditorUI) => {\n return ui.images.xrefs?.type_table;\n }\n },\n {\n type: \"Equations\",\n prefix: [kEquationType],\n image: (ui: EditorUI) => {\n return ui.images.xrefs?.type_equation;\n }\n },\n {\n type: \"Listings\",\n prefix: [kListingtype],\n image: (ui: EditorUI) => {\n return ui.images.xrefs?.type_listing;\n }\n },\n {\n type: \"Theorems\",\n prefix: kTheoremTypes,\n image: (ui: EditorUI) => {\n return ui.images.xrefs?.type_theorem;\n }\n },\n];\n\n\nexport async function insertXref(\n ui: EditorUI,\n doc: ProsemirrorNode,\n server: EditorServer,\n onInsertXref: (key: string, prefix?: string) => void\n) {\n await ui.dialogs.htmlDialog(\n 'Insert Cross Reference',\n 'Insert',\n (\n containerWidth: number,\n containerHeight: number,\n confirm: VoidFunction,\n cancel: VoidFunction,\n _showProgress: (message: string) => void,\n _hideProgress: VoidFunction,\n ) => {\n const kMaxHeight = 400;\n const kMaxWidth = 650;\n const kMaxHeightProportion = 0.9;\n const kdialogPaddingIncludingButtons = 70;\n\n const windowHeight = containerHeight;\n const windowWidth = containerWidth;\n\n const height = Math.min(kMaxHeight, windowHeight * kMaxHeightProportion - kdialogPaddingIncludingButtons);\n const width = Math.max(Math.min(kMaxWidth, windowWidth * 0.9), 550);\n\n const container = window.document.createElement('div');\n container.className = 'pm-default-theme';\n container.style.width = width + 'px';\n\n // Look up the document and initialize the state\n const docPath = ui.context.getDocumentPath() || \"\";\n\n // Read the xrefs\n const loadXRefs = async () => {\n await ui.context.withSavedDocument();\n return (await server.xref.quartoIndexForFile(docPath)).refs;\n };\n\n const onInsert = (xref: XRef, style: XRefStyle, prefix?: string) => {\n onInsertXref(style.fn(xrefKey(xref, \"quarto\")), prefix);\n confirm();\n };\n\n // REnder the panel\n ReactDOM.render(\n <InsertXrefPanel\n height={height}\n width={width}\n styleIndex={lastSelectedStyleIndex}\n onOk={onInsert}\n onCancel={cancel}\n doc={doc}\n ui={ui}\n loadXRefs={loadXRefs}\n />,\n container,\n );\n return container;\n },\n () => {\n // Focus\n // dealt with in the React Component itself\n },\n () => {\n // Validation\n return null;\n },\n );\n}\n\ninterface InsertXrefPanelProps extends WidgetProps {\n ui: EditorUI;\n doc: ProsemirrorNode;\n height: number;\n width: number;\n styleIndex: number;\n loadXRefs: () => Promise<XRef[]>;\n onOk: (xref: XRef, style: XRefStyle, prefix?: string) => void;\n onCancel: () => void;\n}\n\nconst InsertXrefPanel: React.FC<InsertXrefPanelProps> = props => {\n\n // State\n const [xrefs, setXrefs] = React.useState<XRef[]>();\n const [selectedXRefIndex, setSelectedXRefIndex] = React.useState<number>(0);\n const [selectedTypeIndex, setSelectedTypeIndex] = React.useState<number>(0);\n const [selectedStyleIndex, setSelectedStyleIndex] = React.useState<number>(props.styleIndex);\n const [filterText, setFilterText] = React.useState<string>(\"\");\n\n // References to key controls\n const textRef = React.useRef<HTMLInputElement>(null);\n const fixedList = React.useRef<FixedSizeList>(null);\n const styleSelectRef = React.useRef<HTMLSelectElement>(null);\n const prefixRef = React.useRef<HTMLInputElement>(null);\n\n // Focus the custom prefix textbox when the user selects custom\n React.useEffect(() => {\n const option = styleSelectRef.current?.options[selectedStyleIndex];\n const key = option?.value || \"\";\n if (key === kStyleCustom) {\n prefixRef.current?.focus();\n }\n }, [selectedStyleIndex]);\n\n // Load the cross ref data when the dialog loads\n React.useEffect(() => {\n props.loadXRefs().then(values => {\n\n // Sort the data\n const sorted = values.sort((a, b) => {\n const typeOrder = a.type.localeCompare(b.type);\n if (typeOrder !== 0) {\n return typeOrder;\n } else {\n return a.id.localeCompare(b.id);\n }\n });\n\n // Ensure that the items are unique\n const unique = uniqBy(sorted, (xref => {\n return `${xref.type}-${xref.id}${xref.suffix}`;\n }));\n\n setXrefs(unique);\n });\n\n setTimeout(() => {\n textRef.current?.focus();\n if (styleSelectRef.current) {\n styleSelectRef.current.selectedIndex = lastSelectedStyleIndex;\n }\n });\n }, []);\n\n // The styles\n const styleOptions = kXRefStyles.map(style => (\n <option key={style.key} value={style.key}>\n {props.ui.context.translateText(style.key)}\n </option>\n ));\n\n\n // Filter the xrefs (by type or matching user typed text)\n const filterXrefs = () => {\n if (!xrefs) {\n return [];\n }\n\n let filtered = xrefs;\n if (selectedTypeIndex !== 0) {\n filtered = filtered.filter(xref => xRefTypes[selectedTypeIndex].prefix.includes(xref.type));\n }\n\n if (filterText) {\n const search = xrefIndex(filtered);\n filtered = search.search(filterText, 1000);\n }\n return filtered;\n };\n const filteredXrefs = filterXrefs();\n\n // The Types\n const typeNodes = xRefTypes.map(type => {\n return {\n key: type.type,\n image: type.image(props.ui),\n name: type.type,\n type: type.type,\n children: [],\n expanded: true,\n };\n });\n const selectedNode = typeNodes[selectedTypeIndex];\n\n\n // The current index (adjusted to ensure it is in bounds)\n const currentIndex = Math.min(selectedXRefIndex, filteredXrefs.length - 1);\n\n // Increments or decrements the index\n const incrementIndex = (increment: number) => {\n let newIndex = currentIndex;\n if (increment > 0) {\n newIndex = Math.min(currentIndex + increment, filteredXrefs.length - 1);\n } else {\n newIndex = Math.max(currentIndex + increment, 0);\n }\n if (newIndex !== currentIndex) {\n setSelectedXRefIndex(newIndex);\n fixedList.current?.scrollToItem(newIndex);\n }\n };\n\n const currentStyle = () => {\n const option = styleSelectRef.current?.options[selectedStyleIndex];\n const key = option?.value || \"\";\n return kXRefStyles.find(style => style.key === key) || kXRefStyles[0];\n };\n\n const currentPrefix = () => {\n return prefixRef.current?.value || undefined;\n };\n\n const placeholderText = () => {\n if (xrefs === undefined) {\n return props.ui.context.translateText(\"Loading Cross References\");\n }\n return props.ui.context.translateText(\"No Matching Cross References Found.\");\n };\n\n // Insert the item\n const insertItem = (index: number) => {\n const xref = filteredXrefs[index];\n const style = currentStyle();\n const prefix = style.key === kStyleCustom ? currentPrefix() : undefined;\n\n if (xref === undefined) {\n // There is no item selected\n props.ui.dialogs\n .alert(\n props.ui.context.translateText(\"Please select a cross reference to insert.\"),\n props.ui.context.translateText('Validation Error'),\n kAlertTypeError,\n );\n } else if (style.key === kStyleCustom && !prefix) {\n // Custom was selected, but no prefix provided\n props.ui.dialogs\n .alert(\n props.ui.context.translateText(\"Please enter a custom prefix for this reference.\"),\n props.ui.context.translateText('Validation Error'),\n kAlertTypeError,\n )\n .then(() => {\n prefixRef.current?.focus();\n });\n } else {\n lastSelectedStyleIndex = styleSelectRef.current?.selectedIndex || 0;\n props.onOk(xref, style, prefix);\n }\n };\n\n // debounce the text filtering\n const memoizedTextFilter = React.useCallback(\n debounce(\n (txt: string) => {\n setFilterText(txt);\n },\n 30,\n ),\n [],\n );\n\n const kPageSize = 5;\n const handleKeyboardEvent = (event: React.KeyboardEvent<HTMLElement>) => {\n // Global Key Handling\n switch (event.key) {\n case 'ArrowUp':\n incrementIndex(-1);\n event.preventDefault();\n break;\n case 'ArrowDown':\n incrementIndex(1);\n event.preventDefault();\n break;\n case 'PageUp':\n incrementIndex(-kPageSize);\n event.preventDefault();\n break;\n case 'PageDown':\n incrementIndex(kPageSize);\n event.preventDefault();\n break;\n case 'Enter':\n acceptSelected();\n event.preventDefault();\n case 'Escape':\n props.onCancel();\n event.preventDefault();\n break;\n default:\n break;\n }\n };\n\n // Select the item\n const handleItemClicked = (index: number) => {\n setSelectedXRefIndex(index);\n };\n\n\n const handleItemDoubleClicked = (index: number) => {\n insertItem(index);\n };\n\n const acceptSelected = () => {\n insertItem(currentIndex);\n };\n\n // The user typed some text\n const handleTextChange = (event: React.ChangeEvent<HTMLInputElement>) => {\n memoizedTextFilter(event?.target.value);\n };\n\n // Handle the updating type selection\n const handleStyleChanged = (event: ChangeEvent<Element>) => {\n const index = (event.target as HTMLSelectElement).selectedOptions[0].index;\n setSelectedStyleIndex(index);\n };\n\n const handleNodeSelected = (node: NavigationTreeNode) => {\n setSelectedTypeIndex(xRefTypes.findIndex(type => type.type === node.key));\n };\n\n return (\n <div className=\"pm-insert-xref\">\n <div className=\"pm-insert-xref-container\">\n <div className=\"pm-insert-xref-type-container pm-block-border-color pm-background-color\">\n <NavigationTree\n height={props.height + kXrefSearchBoxHeight}\n nodes={typeNodes}\n selectedNode={selectedNode}\n onSelectedNodeChanged={handleNodeSelected}\n />\n </div>\n\n <div className=\"pm-insert-xref-list-container\">\n <TextInput\n onKeyDown={handleKeyboardEvent}\n width={20 + 'ch'}\n iconAdornment={props.ui.images.search}\n tabIndex={0}\n className=\"pm-insert-xref-search-textbox\"\n placeholder={props.ui.context.translateText(\"Search for Cross Reference\")}\n onChange={handleTextChange}\n ref={textRef}\n />\n\n\n {filteredXrefs && filteredXrefs.length > 0 ? (\n <div\n onKeyDown={handleKeyboardEvent}\n tabIndex={0}\n >\n <FixedSizeList\n className=\"pm-insert-xref-list pm-block-border-color pm-background-color\"\n height={props.height}\n width=\"100%\"\n itemCount={filteredXrefs.length}\n itemSize={66}\n itemData={{\n xrefs: filteredXrefs,\n selectedIndex: currentIndex,\n ui: props.ui,\n onclick: handleItemClicked,\n ondoubleclick: handleItemDoubleClicked\n }}\n ref={fixedList}\n >\n {XRefItem}\n </FixedSizeList>\n </div>\n\n ) : (\n <div\n className=\"pm-insert-xref-list-placeholder pm-block-border-color pm-background-color\"\n style={{ height: props.height + \"px\" }}\n >\n <div>{placeholderText()}</div>\n </div>\n )}\n\n </div>\n </div>\n <div className='pm-insert-xref-insert-options'>\n\n <div className='pm-insert-xref-prefix'>\n <div>{[props.ui.context.translateText(\"Prefix\")]}</div>\n <SelectInput\n tabIndex={0}\n ref={styleSelectRef}\n className=\"pm-insert-xref-select-style\"\n onChange={handleStyleChanged}\n >\n {styleOptions}\n </SelectInput>\n {kXRefStyles[selectedStyleIndex].key === kStyleCustom ? (\n <TextInput\n width={20 + 'ch'}\n tabIndex={0}\n className=\"pm-insert-xref-custom-prefix\"\n placeholder={props.ui.context.translateText(\"Enter Prefix\")}\n ref={prefixRef}\n />) : (\n null\n )}\n </div>\n <div>\n <DialogButtons\n okLabel={props.ui.context.translateText('Insert')}\n cancelLabel={props.ui.context.translateText('Cancel')}\n onOk={acceptSelected}\n onCancel={props.onCancel}\n />\n </div>\n </div>\n </div>\n );\n};\n\ninterface XRefItemProps extends ListChildComponentProps {\n data: {\n xrefs: XRef[],\n selectedIndex: number\n ui: EditorUI,\n onclick: (index: number) => void,\n ondoubleclick: (index: number) => void\n };\n}\n\nconst XRefItem = (props: XRefItemProps) => {\n const thisXref: XRef = props.data.xrefs[props.index];\n\n // The type (e.g. fig)\n const type = kQuartoXRefTypes[thisXref.type];\n\n // The id (e.g. fig-foobar)\n const id = xrefKey(thisXref, \"quarto\");\n\n // The display text for the entry\n const primaryText = `@${id}`;\n const secondaryText = thisXref.file;\n const detailText = thisXref.title || \"\";\n\n // The image and adornment\n const image = type?.image(props.data.ui) || props.data.ui.images.omni_insert?.generic!;\n\n // Click handlers\n const onItemClick = () => {\n props.data.onclick(props.index);\n };\n\n const onItemDoubleClick = () => {\n props.data.ondoubleclick(props.index);\n };\n\n // Whether this node is selected\n const selected = props.data.selectedIndex === props.index;\n const selectedClassName = `pm-xref-item${selected ? ' pm-list-item-selected' : ''}`;\n return (\n <div key={thisXref.id} style={props.style} className={selectedClassName} onClick={onItemClick} onDoubleClick={onItemDoubleClick}>\n <div className={`pm-xref-item-image-container ${thisXref.type}`}>\n <img src={image} className={'pm-xref-item-image pm-border-color'} draggable=\"false\"/>\n </div>\n <div className={'pm-xref-item-body pm-text-color'}>\n <div className=\"pm-xref-item-title\">\n <div className=\"pm-xref-item-primary pm-fixedwidth-font\">{primaryText}</div>\n <div className=\"pm-xref-item-secondary\">{secondaryText}</div>\n </div>\n <div>\n <div className=\"pm-xref-item-detail\">{detailText}</div>\n </div>\n </div>\n </div>\n );\n};\n","\n/*\n * insert_xref-index.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\nimport Fuse from 'fuse.js';\nimport { XRef, xrefKey } from '../../api/xref';\n\n\nconst searchFields: Fuse.FuseOptionKeyObject[] = [\n { name: 'key', weight: 50 },\n { name: 'title', weight: 30 },\n];\n\nexport interface XRefSearch {\n search: (searchTerm: string, limit: number) => XRef[];\n}\n\ninterface QuartoXRef extends XRef {\n key: string;\n}\n\nexport function xrefIndex(entries: XRef[]): XRefSearch {\n // build search index\n const options = {\n isCaseSensitive: false,\n shouldSort: true,\n includeMatches: false,\n includeScore: false,\n minMatchCharLength: 2,\n threshold: 0.3,\n keys: searchFields,\n };\n\n const index = Fuse.createIndex<QuartoXRef>(searchFields.map(searchField => searchField.name), entries.map(entry => {\n return {\n key: xrefKey(entry, \"quarto\"),\n ...entry\n };\n }));\n const fuse = new Fuse(entries, options, index);\n return {\n search: (searchTerm: string, limit: number): XRef[] => {\n const results = fuse.search(searchTerm, { ...options, limit });\n return results.map(result => result.item);\n },\n };\n}","/*\n * raw_html-comment.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Mark, Fragment, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { Transaction, TextSelection, EditorState } from 'prosemirror-state';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { EditorCommandId, ProsemirrorCommand, toggleMarkType } from '../../api/command';\nimport { canInsertNode } from '../../api/node';\nimport { ProsemirrorWriter, PandocOutput } from '../../api/pandoc';\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { EditorUI } from '../../api/ui';\nimport { MarkTransaction } from '../../api/transaction';\nimport { removeInvalidatedMarks, detectAndApplyMarks } from '../../api/mark';\nimport { matchPandocFormatComment } from '../../api/pandoc_format';\nimport { kHTMLCommentRegEx, isHTMLComment } from '../../api/html';\nimport { OmniInsertGroup } from '../../api/omni_insert';\n\nimport './raw_html_comment-styles.css';\n\nconst kHTMLEditingCommentRegEx = /^<!--# ([\\s\\S]*?)-->$/;\n\nconst extension = (context: ExtensionContext): Extension | null => {\n const { options, ui } = context;\n\n return {\n marks: [\n {\n name: 'raw_html_comment',\n noInputRules: true,\n noSpelling: true,\n spec: {\n attrs: {\n editing: { default: false },\n format: { default: false },\n },\n inclusive: false,\n excludes: 'formatting',\n parseDOM: [\n {\n tag: \"span[class*='raw-html-comment']\",\n getAttrs(dom: Node | string) {\n const el = dom as Element;\n return {\n editing: el.getAttribute('data-editing') === '1',\n format: el.getAttribute('data-format') === '1',\n };\n },\n },\n ],\n toDOM(mark: Mark) {\n const attr: any = {\n class:\n 'raw-html-comment pm-fixedwidth-font ' +\n (mark.attrs.editing ? 'pm-comment-color pm-comment-background-color' : 'pm-light-text-color') +\n (mark.attrs.format && options.hideFormatComment ? ' pm-comment-hidden' : ''),\n 'data-editing': mark.attrs.editing ? '1' : '0',\n 'data-format': mark.attrs.format ? '1' : '0',\n };\n return ['span', attr];\n },\n },\n pandoc: {\n readers: [],\n inlineHTMLReader: (schema: Schema, html: string, writer?: ProsemirrorWriter) => {\n const isComment = isHTMLComment(html);\n if (!isComment) {\n return false;\n }\n\n if (writer) {\n const mark = schema.marks.raw_html_comment.create(commentMarkAttribs(html));\n writer.openMark(mark);\n writer.writeText(html);\n writer.closeMark(mark);\n }\n\n return isComment;\n },\n writer: {\n priority: 1,\n write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n output.writeRawMarkdown(parent);\n },\n },\n },\n },\n ],\n\n appendMarkTransaction: (schema: Schema) => {\n const markType = schema.marks.raw_html_comment;\n const kHTMLCommentMarkRegEx = new RegExp(kHTMLCommentRegEx.source, 'g');\n return [\n {\n name: 'html-editing-comment-marks',\n filter: (node: ProsemirrorNode) => node.isTextblock && node.type.allowsMarkType(markType),\n append: (tr: MarkTransaction, node: ProsemirrorNode, pos: number) => {\n removeInvalidatedMarks(tr, node, pos, kHTMLCommentRegEx, markType);\n detectAndApplyMarks(\n tr,\n tr.doc.nodeAt(pos)!,\n pos,\n kHTMLCommentMarkRegEx,\n markType,\n match => commentMarkAttribs(match[1]),\n () => true,\n match => match[1],\n );\n },\n },\n ];\n },\n\n // insert command\n commands: (schema: Schema) => {\n return [new InsertHTMLCommentCommand(schema, ui)];\n },\n };\n};\n\nexport class InsertHTMLCommentCommand extends ProsemirrorCommand {\n constructor(schema: Schema, ui: EditorUI) {\n super(\n EditorCommandId.HTMLComment,\n ['Shift-Mod-c'],\n (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n // make sure we can insert a text node here\n if (!canInsertNode(state, schema.nodes.text)) {\n return false;\n }\n\n // make sure we can apply this mark here\n if (!toggleMarkType(schema.marks.raw_html)(state)) {\n return false;\n }\n\n // make sure the end of the selection (where we will insert the comment)\n // isn't already in a mark of this type\n if (state.doc.rangeHasMark(state.selection.to, state.selection.to + 1, schema.marks.raw_html)) {\n return false;\n }\n\n if (dispatch) {\n const tr = state.tr;\n\n // set the selection to the end of the current selection (comment 'on' the selection)\n setTextSelection(tr.selection.to)(tr);\n\n // if we have a character right before us then insert a space\n const { parent, parentOffset } = tr.selection.$to;\n const charBefore = parent.textContent.slice(parentOffset - 1, parentOffset);\n if (charBefore.length && charBefore !== ' ') {\n tr.insertText(' ');\n }\n\n // insert the comment\n const comment = '<!--# -->';\n const mark = schema.marks.raw_html_comment.create({ editing: true });\n tr.insert(tr.selection.to, schema.text(comment, [mark]));\n\n // set the selection to the middle of the comment\n tr.setSelection(new TextSelection(tr.doc.resolve(tr.selection.to - (comment.length / 2 - 1))));\n\n // dispatch\n dispatch(tr);\n }\n\n return true;\n },\n {\n name: ui.context.translateText('Comment'),\n description: ui.context.translateText('Editing comment'),\n group: OmniInsertGroup.Content,\n priority: 3,\n image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.comment_dark! : ui.images.omni_insert?.comment!),\n },\n );\n }\n}\n\nfunction commentMarkAttribs(comment: string) {\n return {\n editing: !!comment.match(kHTMLEditingCommentRegEx),\n format: !!matchPandocFormatComment(comment),\n };\n}\n\nexport default extension;\n","/*\n * shortcode.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Node as ProsemirrorNode, Mark, Fragment } from 'prosemirror-model';\nimport { Transaction } from 'prosemirror-state';\n\nimport { findChildren } from 'prosemirror-utils';\n\nimport { Extension, ExtensionContext } from '../api/extension';\nimport { detectAndApplyMarks, removeInvalidatedMarks } from '../api/mark';\nimport { MarkTransaction } from '../api/transaction';\nimport { FixupContext } from '../api/fixup';\nimport { kShortcodeRegEx } from '../api/shortcode';\nimport { PandocOutput } from '../api/pandoc';\n\nconst extension = (context: ExtensionContext): Extension | null => {\n const { format } = context;\n\n if (!format.hugoExtensions.shortcodes) {\n return null;\n }\n\n return {\n marks: [\n {\n name: 'shortcode',\n noInputRules: true,\n noSpelling: true,\n spec: {\n inclusive: false,\n excludes: 'formatting',\n attrs: {},\n parseDOM: [\n {\n tag: \"span[class*='shortcode']\",\n },\n ],\n toDOM(_mark: Mark) {\n return ['span', { class: 'shortcode pm-markup-text-color pm-fixedwidth-font' }];\n },\n },\n pandoc: {\n readers: [],\n writer: {\n priority: 1,\n write: (output: PandocOutput, _mark: Mark, parent: Fragment) => {\n output.writeRawMarkdown(parent);\n },\n },\n },\n },\n ],\n\n fixups: (schema: Schema) => {\n return [\n (tr: Transaction, fixupContext: FixupContext) => {\n if (fixupContext === FixupContext.Load) {\n // apply marks\n const markType = schema.marks.shortcode;\n const predicate = (node: ProsemirrorNode) => {\n return node.isTextblock && node.type.allowsMarkType(markType);\n };\n const markTr = new MarkTransaction(tr);\n findChildren(tr.doc, predicate).forEach(nodeWithPos => {\n const { pos } = nodeWithPos;\n detectAndCreateShortcodes(schema, markTr, pos);\n });\n }\n return tr;\n },\n ];\n },\n\n appendMarkTransaction: (schema: Schema) => {\n return [\n {\n name: 'shortcode-marks',\n filter: (node: ProsemirrorNode) =>\n node.isTextblock && node.type.allowsMarkType(node.type.schema.marks.shortcode),\n append: (tr: MarkTransaction, node: ProsemirrorNode, pos: number) => {\n removeInvalidatedMarks(tr, node, pos, kShortcodeRegEx, node.type.schema.marks.shortcode);\n detectAndCreateShortcodes(node.type.schema, tr, pos);\n },\n },\n ];\n },\n };\n};\n\nfunction detectAndCreateShortcodes(schema: Schema, tr: MarkTransaction, pos: number) {\n // apply marks wherever they belong\n detectAndApplyMarks(\n tr,\n tr.doc.nodeAt(pos)!,\n pos,\n kShortcodeRegEx,\n schema.marks.shortcode,\n () => ({}),\n () => true,\n match => match[1],\n );\n}\n\nexport default extension;\n","/*\n * footnote.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema, Fragment, NodeType, DOMOutputSpec } from 'prosemirror-model';\nimport { Plugin, PluginKey, EditorState, Transaction, TextSelection, Selection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport {\n findChildrenByType,\n findParentNodeOfType,\n findSelectedNodeOfType,\n NodeWithPos,\n findChildren,\n} from 'prosemirror-utils';\n\nimport { ExtensionContext } from '../../api/extension';\nimport { uuidv4 } from '../../api/util';\nimport { PandocOutput, PandocTokenType, ProsemirrorWriter, PandocToken } from '../../api/pandoc';\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { canInsertNode } from '../../api/node';\nimport { EditorUI } from '../../api/ui';\nimport { OmniInsertGroup } from '../../api/omni_insert';\n\nimport {\n footnoteEditorKeyDownHandler,\n footnoteEditorActivationPlugin,\n footnoteEditorNodeViews,\n} from './footnote-editor';\nimport {\n footnoteAppendTransaction,\n footnoteFilterTransaction,\n footnoteSelectNoteAppendTransaction,\n} from './footnote-transaction';\n\nimport './footnote-styles.css';\n\nconst plugin = new PluginKey('footnote');\n\nconst extension = (context: ExtensionContext) => {\n const { pandocExtensions, ui } = context;\n\n if (!pandocExtensions.footnotes) {\n return null;\n }\n\n return {\n nodes: [\n {\n name: 'footnote',\n spec: {\n inline: true,\n attrs: {\n number: { default: 1 },\n ref: {},\n content: { default: '' },\n },\n group: 'inline',\n // atom: true,\n parseDOM: [\n {\n tag: \"span[class*='footnote']\",\n getAttrs(dom: Node | string) {\n const el = dom as Element;\n return {\n ref: el.getAttribute('data-ref'),\n content: el.getAttribute('data-content'),\n };\n },\n },\n ],\n toDOM(node: ProsemirrorNode): DOMOutputSpec {\n return [\n 'span',\n { class: 'footnote pm-footnote', 'data-ref': node.attrs.ref, 'data-content': node.attrs.content },\n node.attrs.number.toString(),\n ];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.Note,\n handler: writePandocNote,\n },\n ],\n writer: (output: PandocOutput, node: ProsemirrorNode) => {\n output.writeNote(node);\n },\n },\n },\n ],\n\n appendTransaction: (_schema: Schema) => {\n return [footnoteAppendTransaction()];\n },\n\n plugins: (_schema: Schema) => {\n return [\n footnoteEditorActivationPlugin(),\n\n new Plugin({\n key: plugin,\n\n // footnote editor\n props: {\n handleKeyDown: footnoteEditorKeyDownHandler(),\n nodeViews: footnoteEditorNodeViews(),\n },\n\n // footnote transactions (fixups, etc.)\n filterTransaction: footnoteFilterTransaction(),\n appendTransaction: footnoteSelectNoteAppendTransaction(),\n }),\n ];\n },\n\n commands: () => {\n return [\n new ProsemirrorCommand(EditorCommandId.Footnote, ['Shift-Mod-F7'], footnoteCommandFn(), footnoteOmniInsert(ui)),\n ];\n },\n };\n};\n\nfunction writePandocNote(schema: Schema) {\n return (writer: ProsemirrorWriter, tok: PandocToken) => {\n // generate unique id\n const ref = uuidv4();\n\n // add note to notes collection (will be handled specially by closeNode b/c it\n // has schema.nodes.node type)\n writer.openNoteNode(ref);\n writer.writeTokens(tok.c);\n const noteNode = writer.closeNode();\n\n // store json version of node in an attribute of the footnote (we can copy/paste)\n // between different documents\n const content = JSON.stringify(noteNode.content.toJSON());\n\n // add inline node to the body\n writer.addNode(schema.nodes.footnote, { ref, number: noteNode.attrs.number, content }, []);\n };\n}\n\nfunction footnoteCommandFn() {\n return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n if (!canInsertFootnote(state)) {\n return false;\n }\n if (dispatch) {\n const tr = state.tr;\n insertFootnote(tr);\n dispatch(tr);\n }\n return true;\n };\n}\n\nfunction footnoteOmniInsert(ui: EditorUI) {\n return {\n name: ui.context.translateText('Footnote'),\n description: ui.context.translateText('Note placed at the bottom of the page'),\n group: OmniInsertGroup.References,\n priority: 2,\n image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.footnote_dark! : ui.images.omni_insert?.footnote!),\n };\n}\n\nfunction canInsertFootnote(state: EditorState) {\n return (\n canInsertNode(state, state.schema.nodes.footnote) && !findParentNodeOfType(state.schema.nodes.note)(state.selection)\n );\n}\n\nfunction insertFootnote(\n tr: Transaction,\n edit = true,\n content?: Fragment | ProsemirrorNode | ProsemirrorNode[] | undefined,\n): string {\n // resolve content\n const schema = tr.doc.type.schema;\n if (!content) {\n content = schema.nodes.paragraph.create();\n }\n\n // generate note id\n const ref = uuidv4();\n\n // insert empty note\n const notes = findChildrenByType(tr.doc, schema.nodes.notes, true)[0];\n const note = schema.nodes.note.createAndFill({ ref }, content);\n tr.insert(notes.pos + 1, note as ProsemirrorNode);\n\n // insert footnote linked to note\n const footnote = schema.nodes.footnote.create({ ref });\n tr.replaceSelectionWith(footnote, false);\n\n // open note editor\n if (edit) {\n const noteNode = findNoteNode(tr.doc, ref);\n if (noteNode) {\n tr.setSelection(TextSelection.create(tr.doc, noteNode.pos + 1));\n }\n }\n\n // return ref\n return ref;\n}\n\nexport function selectedFootnote(selection: Selection): NodeWithPos | undefined {\n const schema = selection.$head.node().type.schema;\n return findSelectedNodeOfType(schema.nodes.footnote)(selection);\n}\n\nexport function selectedNote(selection: Selection): NodeWithPos | undefined {\n const schema = selection.$head.node().type.schema;\n return findParentNodeOfType(schema.nodes.note)(selection);\n}\n\nexport function findNoteNode(doc: ProsemirrorNode, ref: string): NodeWithPos | undefined {\n return findNodeOfTypeWithRef(doc, doc.type.schema.nodes.note, ref);\n}\n\nexport function findFootnoteNode(doc: ProsemirrorNode, ref: string): NodeWithPos | undefined {\n return findNodeOfTypeWithRef(doc, doc.type.schema.nodes.footnote, ref);\n}\n\nfunction findNodeOfTypeWithRef(doc: ProsemirrorNode, type: NodeType, ref: string): NodeWithPos | undefined {\n const foundNode = findChildren(doc, node => node.type === type && node.attrs.ref === ref, true);\n if (foundNode.length) {\n return foundNode[0];\n } else {\n return undefined;\n }\n}\n\nexport default extension;\n","/*\n * shortcode.ts\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport const kShortcodePattern = '(?:^|[^`])({{([%<])\\\\s+.*?[%>]}})';\nexport const kShortcodeRegEx = new RegExp(kShortcodePattern, 'g');\n","/*\n * footnote-editor.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorView, DecorationSet, NodeView } from 'prosemirror-view';\nimport { findParentNodeOfType, NodeWithPos, findChildrenByType, findChildren } from 'prosemirror-utils';\nimport { EditorState, TextSelection, Plugin, PluginKey, Transaction } from 'prosemirror-state';\n\nimport { nodeDecoration } from '../../api/decoration';\nimport { firstNode, lastNode } from '../../api/node';\nimport { selectionIsWithin } from '../../api/selection';\nimport { scrollIntoView } from '../../api/scroll';\n\nimport { findFootnoteNode, selectedFootnote, selectedNote } from './footnote';\n\nconst key = new PluginKey<DecorationSet>('footnote-editor-activate');\n\nexport function footnoteEditorActivationPlugin() {\n return new Plugin<DecorationSet>({\n key,\n state: {\n init(_config: { [key: string]: any }, instance: EditorState) {\n return DecorationSet.empty;\n },\n\n // whenever an edit affecting this mark type occurs then update the decorations\n apply(tr: Transaction, set: DecorationSet, oldState: EditorState, newState: EditorState) {\n if (selectedFootnote(newState.selection) || selectedNote(newState.selection)) {\n // if we are in the same note selection as before just return the set\n if (oldState.selection.$head.node() === newState.selection.$head.node()) {\n return set.map(tr.mapping, tr.doc);\n } else {\n return footnoteEditorDecorations(newState);\n }\n } else {\n return DecorationSet.empty;\n }\n },\n },\n props: {\n decorations(state: EditorState) {\n return key.getState(state);\n },\n },\n\n view: () => ({\n // scroll footnote into view (if necessary) when note editor is active\n update: (view: EditorView) => {\n const note = selectedNote(view.state.selection);\n if (note) {\n const footnote = findFootnoteNode(view.state.doc, note.node.attrs.ref);\n if (footnote) {\n scrollIntoView(view, footnote.pos, false, 0, 30);\n }\n }\n },\n }),\n });\n}\n\n// selection-driven decorations (mostly css classes) required to activate the footnote editor\nfunction footnoteEditorDecorations(state: EditorState) {\n const schema = state.schema;\n\n // see if either a footnote node or note (footnote editor) node has the selection\n let footnoteNode = selectedFootnote(state.selection);\n let noteNode = selectedNote(state.selection);\n\n // if they do then we need to enable footnote editing/behavior by\n // using decorators to inject appropriate css classes\n if (footnoteNode || noteNode) {\n // get body and notes nodes\n const bodyNode = findChildrenByType(state.doc, schema.nodes.body)[0];\n const notesNode = findChildrenByType(state.doc, schema.nodes.notes)[0];\n\n // resolve the specific footnote node or specific note node\n if (footnoteNode) {\n const ref = footnoteNode.node.attrs.ref;\n const matching = findChildren(notesNode.node, node => node.attrs.ref === ref);\n if (matching.length) {\n noteNode = matching[0];\n noteNode.pos = notesNode.pos + 1 + noteNode.pos;\n }\n } else if (noteNode) {\n const ref = noteNode.node.attrs.ref;\n const matching = findChildren(\n state.doc,\n node => node.type === schema.nodes.footnote && node.attrs.ref === ref,\n true,\n );\n if (matching.length) {\n footnoteNode = matching[0];\n }\n }\n\n if (footnoteNode && noteNode) {\n return DecorationSet.create(state.doc, [\n // make notes node visible\n nodeDecoration(noteNode, { class: 'active' }),\n\n // paint outline over footnote\n nodeDecoration(footnoteNode, { class: 'active pm-selected-node-outline-color' }),\n\n // position body and notes nodes for footnote editing\n nodeDecoration(bodyNode, { class: 'editing-footnote pm-pane-border-color' }),\n nodeDecoration(notesNode, { class: 'editing-footnote pm-pane-border-color' }),\n ]);\n } else {\n return DecorationSet.empty;\n }\n } else {\n return DecorationSet.empty;\n }\n}\n\n// node view that display the note number alongside the note content\nexport function footnoteEditorNodeViews() {\n return {\n note(node: ProsemirrorNode, view: EditorView, getPos: boolean | (() => number)) {\n return new NoteEditorView(node, view, getPos as () => number);\n },\n };\n}\n\nclass NoteEditorView implements NodeView {\n public readonly dom: HTMLElement;\n public readonly contentDOM: HTMLElement;\n\n private readonly node: ProsemirrorNode;\n private readonly view: EditorView;\n private readonly getPos: () => number;\n\n constructor(node: ProsemirrorNode, view: EditorView, getPos: () => number) {\n this.node = node;\n this.view = view;\n this.getPos = getPos;\n\n this.dom = window.document.createElement('div');\n this.dom.setAttribute('data-ref', this.node.attrs.ref);\n this.dom.classList.add('note');\n\n const label = window.document.createElement('div');\n label.classList.add('note-label');\n label.contentEditable = 'false';\n label.innerHTML = `<p>${this.node.attrs.number}:</p>`;\n this.dom.appendChild(label);\n\n const content = window.document.createElement('div');\n content.classList.add('note-content');\n this.contentDOM = content;\n this.dom.appendChild(content);\n }\n}\n\n// custom handling for arrow keys that cause selection to escape the editor\nexport function footnoteEditorKeyDownHandler() {\n return (view: EditorView, event: KeyboardEvent) => {\n // alias schema & selection\n const schema = view.state.schema;\n const selection = view.state.selection;\n\n // pass if the selection isn't in a note\n const noteNode: NodeWithPos | undefined = findParentNodeOfType(schema.nodes.note)(selection);\n if (!noteNode) {\n return false;\n }\n\n // function to find and move selection to associated footnote\n // will call this from Escape, ArrowLeft, and ArrowUp handlers below\n const selectFootnote = (before = true) => {\n const footnoteNode = findFootnoteNode(view.state.doc, noteNode.node.attrs.ref);\n if (footnoteNode) {\n const tr = view.state.tr;\n tr.setSelection(TextSelection.near(tr.doc.resolve(footnoteNode.pos + (before ? 0 : 1))));\n view.dispatch(tr);\n }\n };\n\n // if this is the Escape key then close the editor\n if (event.key === 'Escape') {\n selectFootnote();\n return true;\n }\n\n // ...otherwise check to see if the user is attempting to arrow out of the footnote\n\n // get first and last text block nodes (bail if we aren't in either)\n const firstTextBlock = firstNode(noteNode, node => node.isTextblock);\n const lastTextBlock = lastNode(noteNode, node => node.isTextblock);\n if (!firstTextBlock && !lastTextBlock) {\n return false;\n }\n\n // exiting from first text block w/ left or up arrow?\n if (firstTextBlock) {\n if (selectionIsWithin(selection, firstTextBlock)) {\n switch (event.key) {\n case 'ArrowLeft':\n if (selection.anchor === firstTextBlock.pos + 1) {\n selectFootnote(true);\n return true;\n }\n break;\n case 'ArrowUp': {\n if (view.endOfTextblock('up')) {\n selectFootnote(true);\n return true;\n }\n break;\n }\n }\n }\n }\n\n // exiting from last text block with right or down arrow?\n if (lastTextBlock) {\n if (selectionIsWithin(selection, lastTextBlock)) {\n switch (event.key) {\n case 'ArrowRight':\n if (selection.anchor === lastTextBlock.pos + lastTextBlock.node.nodeSize - 1) {\n selectFootnote(false);\n return true;\n }\n break;\n case 'ArrowDown': {\n if (view.endOfTextblock('down')) {\n selectFootnote(false);\n return true;\n }\n break;\n }\n }\n }\n }\n\n return false;\n };\n}\n","/*\n * footnote-transaction.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Fragment, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { Transaction, EditorState, TextSelection } from 'prosemirror-state';\nimport {\n findChildrenByType,\n NodeWithPos,\n findSelectedNodeOfType,\n ContentNodeWithPos,\n findParentNodeOfType,\n} from 'prosemirror-utils';\nimport { Transform } from 'prosemirror-transform';\n\nimport { uuidv4 } from '../../api/util';\n\nimport { findNoteNode, selectedNote } from './footnote';\nimport { trTransform } from '../../api/transaction';\n\n// examine transactions and filter out attempts to place foonotes within note bodies\n// (this is not allowed by pandoc markdown)\nexport function footnoteFilterTransaction() {\n return (tr: Transaction, state: EditorState) => {\n const noteWithPos = selectedNote(tr.selection);\n if (noteWithPos && findChildrenByType(noteWithPos.node, state.schema.nodes.footnote).length) {\n return false;\n }\n return true;\n };\n}\n\n// examine editor transactions and append a transaction that handles fixup of footnote numbers,\n// importing of pasted footnotes, selection propagation to the footnote editor, etc.\nexport function footnoteAppendTransaction() {\n const footnoteChange = (node: ProsemirrorNode) => {\n const schema = node.type.schema;\n return node.type === schema.nodes.footnote || node.type === schema.nodes.note;\n };\n\n return {\n name: 'footnote-renumber',\n nodeFilter: footnoteChange,\n append: (tr: Transaction) => {\n const schema = tr.doc.type.schema;\n const activeNote = findParentNodeOfType(schema.nodes.note)(tr.selection);\n trTransform(tr, footnoteFixupTransform(activeNote));\n },\n };\n}\n\nfunction footnoteFixupTransform(activeNote: ContentNodeWithPos | undefined) {\n return (tr: Transform) => {\n // query for notes and footnotes. note that since these are computed at the beginning\n // before any steps are applied, we always need to map their positions before using them\n const schema = tr.doc.type.schema;\n const footnotes = findAllFootnotes(tr.doc);\n const allNotes = findAllNotes(tr.doc);\n\n // iterate through footnotes in the newState\n const refs = new Set<string>();\n footnotes.forEach((footnote, index) => {\n // map position\n footnote.pos = tr.mapping.map(footnote.pos);\n\n // footnote number\n const number = index + 1;\n\n // alias ref and content (either or both may be updated)\n let { ref, content } = footnote.node.attrs;\n\n // we may be creating a new note to append\n let newNote: any;\n\n // get reference to note (if any)\n const note = allNotes.find(noteWithPos => noteWithPos.node.attrs.ref === ref);\n\n // matching note found\n if (note) {\n // map position since we scanned for all of the notes at the top and we may\n // have called tr.insert for a new note below which would have invalidated\n // the positions\n note.pos = tr.mapping.map(note.pos);\n\n // update content if this is a note edit (used to propagate user edits back to data-content)\n if (activeNote && activeNote.node.attrs.ref === ref) {\n content = JSON.stringify(note.node.content.toJSON());\n }\n\n // if we've already processed this ref then it's a duplicate, make a copy w/ a new ref/id\n if (refs.has(ref)) {\n // create a new unique id and change the ref to it\n ref = uuidv4();\n\n // create and insert new note with this id\n newNote = schema.nodes.note.createAndFill({ ref, number }, note.node.content);\n\n // otherwise update the note with the correct number (if necessary)\n } else {\n if (note.node.attrs.number !== number) {\n tr.setNodeMarkup(note.pos, schema.nodes.note, {\n ...note.node.attrs,\n number,\n });\n }\n }\n\n // if there is no note then create one using the content attr\n // (this can happen for a copy/paste operation from another document)\n } else if (content) {\n newNote = schema.nodes.note.createAndFill({ ref, number }, Fragment.fromJSON(schema, JSON.parse(content)));\n }\n\n // insert newNote if necessary\n if (newNote) {\n const notesContainer = findNotesContainer(tr.doc);\n tr.insert(notesContainer.pos + 1, newNote as ProsemirrorNode);\n }\n\n // indicate that we've seen this ref\n refs.add(ref);\n\n // set new footnote markup if necessary\n const attrs = footnote.node.attrs;\n if (ref !== attrs.ref || content !== attrs.content || number !== attrs.number) {\n tr.setNodeMarkup(footnote.pos, schema.nodes.footnote, {\n ...footnote.node.attrs,\n ref,\n content,\n number,\n });\n }\n });\n\n // remove ophraned notes\n for (let i = allNotes.length - 1; i >= 0; i--) {\n const note = allNotes[i];\n note.pos = tr.mapping.map(note.pos);\n const footnote = footnotes.find(fn => fn.node.attrs.ref === note.node.attrs.ref);\n if (!footnote) {\n tr.delete(note.pos, note.pos + note.node.nodeSize);\n }\n }\n };\n}\n\nexport function footnoteSelectNoteAppendTransaction() {\n return (_transactions: Transaction[], _oldState: EditorState, newState: EditorState) => {\n const schema = newState.schema;\n const footnoteNode: NodeWithPos | undefined = findSelectedNodeOfType(schema.nodes.footnote)(newState.selection);\n if (footnoteNode) {\n const tr = newState.tr;\n const ref = footnoteNode.node.attrs.ref;\n const noteNode = findNoteNode(tr.doc, ref);\n if (noteNode) {\n tr.setSelection(TextSelection.near(tr.doc.resolve(noteNode.pos)));\n }\n return tr;\n }\n };\n}\n\nfunction findAllFootnotes(doc: ProsemirrorNode) {\n const schema = doc.type.schema;\n return findChildrenByType(doc, schema.nodes.footnote, true);\n}\n\nfunction findAllNotes(doc: ProsemirrorNode) {\n const schema = doc.type.schema;\n const notesContainer = findNotesContainer(doc);\n const offset = notesContainer.pos + 1;\n const notes = findChildrenByType(notesContainer.node, schema.nodes.note, false);\n return notes.map(note => ({ ...note, pos: note.pos + offset }));\n}\n\nfunction findNotesContainer(doc: ProsemirrorNode) {\n return findChildrenByType(doc, doc.type.schema.nodes.notes, false)[0];\n}\n","/*\n * raw_block.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema, NodeType } from 'prosemirror-model';\n\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { setBlockType } from 'prosemirror-commands';\n\nimport { findParentNode } from 'prosemirror-utils';\n\nimport { Extension, ExtensionContext } from '../api/extension';\n\nimport {\n PandocOutput,\n PandocToken,\n PandocTokenType,\n ProsemirrorWriter,\n kRawBlockContent,\n kRawBlockFormat,\n} from '../api/pandoc';\nimport { ProsemirrorCommand, EditorCommandId } from '../api/command';\n\nimport { EditorUI } from '../api/ui';\nimport { isSingleLineHTML } from '../api/html';\nimport { kHTMLFormat, kTexFormat, editRawBlockCommand, isRawHTMLFormat } from '../api/raw';\nimport { OmniInsert, OmniInsertGroup } from '../api/omni_insert';\nimport { kRawInlineFormat, kRawInlineContent } from '../marks/raw_inline/raw_inline';\n\nconst extension = (context: ExtensionContext): Extension | null => {\n const { pandocExtensions, pandocCapabilities, ui } = context;\n\n const rawAttribute = pandocExtensions.raw_attribute;\n\n return {\n nodes: [\n {\n name: 'raw_block',\n spec: {\n content: 'text*',\n group: 'block',\n marks: '',\n code: true,\n defining: true,\n isolating: true,\n attrs: {\n format: {},\n },\n parseDOM: [\n {\n tag: \"div[class*='raw-block']\",\n preserveWhitespace: 'full',\n getAttrs: (node: Node | string) => {\n const el = node as Element;\n return {\n format: el.getAttribute('data-format'),\n };\n },\n },\n ],\n toDOM(node: ProsemirrorNode) {\n return [\n 'div',\n {\n class: 'raw-block pm-fixedwidth-font pm-code-block pm-markup-text-color',\n 'data-format': node.attrs.format,\n },\n 0,\n ];\n },\n },\n\n code_view: {\n lang: (node: ProsemirrorNode) => {\n return node.attrs.format;\n },\n attrEditFn: rawAttribute ? editRawBlockCommand(ui, pandocCapabilities.output_formats) : undefined,\n borderColorClass: 'pm-raw-block-border',\n },\n\n attr_edit: () => ({\n type: (schema: Schema) => schema.nodes.raw_block,\n tags: (node: ProsemirrorNode) => [node.attrs.format],\n editFn: rawAttribute\n ? () => editRawBlockCommand(ui, pandocCapabilities.output_formats)\n : () => (state: EditorState) => false,\n }),\n\n pandoc: {\n readers: [\n {\n token: PandocTokenType.RawBlock,\n block: 'raw_block',\n },\n ],\n\n // ensure that usethis badges comment ends up in it's own block\n preprocessor: (markdown: string) => {\n return markdown.replace(/([^\\n])(\\n^<!-- badges: end -->$)/gm, (_match, p1, p2) => {\n return p1 + '\\n' + p2;\n });\n },\n\n // we define a custom blockReader here so that we can convert html and tex blocks with\n // a single line of code into paragraph with a raw inline\n blockReader: (schema: Schema, tok: PandocToken, writer: ProsemirrorWriter) => {\n if (tok.t === PandocTokenType.RawBlock) {\n readPandocRawBlock(schema, tok, writer);\n return true;\n } else if (isParagraphWrappingMultilineRaw(tok)) {\n const rawTok = tok.c[0];\n const format = rawTok.c[kRawBlockFormat];\n const content = rawTok.c[kRawBlockContent];\n writer.addNode(schema.nodes.raw_block, { format }, [schema.text(content)]);\n return true;\n } else if (isParagraphWrappingLatexBeginOrEnd(tok)) {\n writer.addNode(schema.nodes.raw_block, { format: kTexFormat }, [schema.text(tok.c[0].c)]);\n return true;\n } else if (isParagraphWrappingRawLatexBeginOrEnd(tok)) {\n writer.addNode(schema.nodes.raw_block, { format: kTexFormat }, [schema.text(tok.c[0].c[kRawInlineContent])]);\n return true;\n } else {\n return false;\n }\n },\n writer: (output: PandocOutput, node: ProsemirrorNode) => {\n if (!pandocExtensions.raw_attribute || node.textContent.trim() === '<!-- -->') {\n output.writeToken(PandocTokenType.Para, () => {\n output.writeRawMarkdown(node.textContent);\n });\n\n // raw block with embedded ``` (e.g. a commented out Rmd code chunk) needs\n // extra backticks on the outside to prevent the rmd chunk end backticks\n // from being considered the end of the raw html block.\n } else if (node.textContent.includes(\"\\n```\")) {\n // find the ``` standing by itself on a line\n const matches: RegExpExecArray[] = [];\n const embeddedTickRegEx = /\\n(`{3,})\\s*?\\n/g;\n embeddedTickRegEx.lastIndex = 0;\n let match: RegExpExecArray | null = null;\n // tslint:disable-next-line no-conditional-assignment\n while (match = embeddedTickRegEx.exec(node.textContent)) {\n matches.push(match);\n }\n embeddedTickRegEx.lastIndex = 0;\n const matchRev = matches.reverse();\n const ticks = (matchRev.length > 0 ? matchRev[0][1] : \"```\") + \"`\";\n output.writeToken(PandocTokenType.Para, () => {\n output.writeRawMarkdown(`${ticks}{=${node.attrs.format}}\\n${node.textContent}\\n${ticks}\\n`);\n });\n } else {\n output.writeToken(PandocTokenType.RawBlock, () => {\n output.write(node.attrs.format);\n output.write(node.textContent);\n });\n }\n },\n },\n },\n ],\n\n commands: (schema: Schema) => {\n const commands: ProsemirrorCommand[] = [];\n\n commands.push(\n new FormatRawBlockCommand(EditorCommandId.HTMLBlock, kHTMLFormat, schema.nodes.raw_block, {\n name: ui.context.translateText('HTML Block'),\n description: ui.context.translateText('Raw HTML content'),\n group: OmniInsertGroup.Blocks,\n priority: 6,\n image: () =>\n ui.prefs.darkMode() ? ui.images.omni_insert?.html_block_dark! : ui.images.omni_insert?.html_block!,\n }),\n );\n\n if (pandocExtensions.raw_tex) {\n commands.push(\n new FormatRawBlockCommand(EditorCommandId.TexBlock, kTexFormat, schema.nodes.raw_block, {\n name: ui.context.translateText('TeX Block'),\n description: ui.context.translateText('Raw TeX content'),\n group: OmniInsertGroup.Blocks,\n priority: 5,\n image: () =>\n ui.prefs.darkMode() ? ui.images.omni_insert?.tex_block_dark! : ui.images.omni_insert?.tex_block!,\n }),\n );\n }\n\n if (rawAttribute) {\n commands.push(new RawBlockCommand(ui, pandocCapabilities.output_formats));\n }\n\n return commands;\n },\n };\n};\n\nfunction readPandocRawBlock(schema: Schema, tok: PandocToken, writer: ProsemirrorWriter) {\n // single lines of html should be read as inline html (allows for\n // highlighting and more seamless editing experience)\n const format = tok.c[kRawBlockFormat];\n const text = tok.c[kRawBlockContent] as string;\n const textTrimmed = text.trimRight();\n if (isRawHTMLFormat(format) && isSingleLineHTML(textTrimmed) && writer.hasInlineHTMLWriter(textTrimmed)) {\n writer.openNode(schema.nodes.paragraph, {});\n writer.writeInlineHTML(textTrimmed);\n writer.closeNode();\n\n // similarly, single lines of tex (that aren't begin or end) should be read as inline tex\n } else if (format === kTexFormat && readAsInlineTex(textTrimmed)) {\n writer.openNode(schema.nodes.paragraph, {});\n const rawTexMark = schema.marks.raw_tex.create();\n writer.openMark(rawTexMark);\n writer.writeText(textTrimmed);\n writer.closeMark(rawTexMark);\n writer.closeNode();\n } else {\n writer.openNode(schema.nodes.raw_block, { format });\n writer.writeText(text);\n writer.closeNode();\n }\n}\n\n\nexport function readAsInlineTex(tex: string) {\n tex = tex.trimRight();\n if (tex.split('\\n').length === 1){\n return !isLatexBeginOrEnd(tex);\n } else {\n return false;\n }\n}\n\nfunction isParagraphWrappingMultilineRaw(tok: PandocToken) {\n return isSingleChildParagraph(tok) && \n tok.c[0].t === PandocTokenType.RawInline &&\n isMultilineString(tok.c[0].c[kRawBlockContent]);\n}\n\nfunction isParagraphWrappingLatexBeginOrEnd(tok: PandocToken) {\n return isSingleChildParagraph(tok) &&\n tok.c[0].t === PandocTokenType.Str &&\n isLatexBeginOrEnd(tok.c[0].c);\n}\n\nfunction isParagraphWrappingRawLatexBeginOrEnd(tok: PandocToken) {\n return isSingleChildParagraph(tok) &&\n (tok.c[0].t === PandocTokenType.RawInline &&\n tok.c[0].c[kRawInlineFormat] === kTexFormat &&\n isLatexBeginOrEnd(tok.c[0].c[kRawInlineContent]));\n}\n\nfunction isLatexBeginOrEnd(str: string) {\n return str && str.trimLeft().match(/\\\\(begin|end)/);\n}\n\nfunction isSingleChildParagraph(tok: PandocToken) {\n return tok.t === PandocTokenType.Para && tok.c && tok.c.length === 1;\n}\n\nfunction isMultilineString(str: string) {\n return str.indexOf('\\n') !== -1;\n}\n\n// base class for format specific raw block commands (e.g. html/tex)\nclass FormatRawBlockCommand extends ProsemirrorCommand {\n private format: string;\n private nodeType: NodeType;\n\n constructor(id: EditorCommandId, format: string, nodeType: NodeType, omniInsert?: OmniInsert) {\n super(\n id,\n [],\n (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n if (!this.isActive(state) && !setBlockType(this.nodeType, { format })(state)) {\n return false;\n }\n\n if (dispatch) {\n const schema = state.schema;\n if (this.isActive(state)) {\n setBlockType(schema.nodes.paragraph)(state, dispatch);\n } else {\n setBlockType(this.nodeType, { format })(state, dispatch);\n }\n }\n\n return true;\n },\n omniInsert,\n );\n this.format = format;\n this.nodeType = nodeType;\n }\n\n public isActive(state: EditorState) {\n return !!findParentNode(node => node.type === this.nodeType && node.attrs.format === this.format)(state.selection);\n }\n}\n\n// generic raw block command (shows dialog to allow choosing from among raw formats)\nclass RawBlockCommand extends ProsemirrorCommand {\n constructor(ui: EditorUI, outputFormats: string[]) {\n super(EditorCommandId.RawBlock, [], editRawBlockCommand(ui, outputFormats), {\n name: ui.context.translateText('Raw Block...'),\n description: ui.context.translateText('Raw content block'),\n group: OmniInsertGroup.Blocks,\n priority: 4,\n image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.raw_block_dark! : ui.images.omni_insert?.raw_block!),\n });\n }\n}\n\nexport default extension;\n","/*\n * yaml_metadata.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, DOMOutputSpec, ParseRule } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { ExtensionContext, Extension } from '../../api/extension';\nimport { PandocOutput, PandocTokenType } from '../../api/pandoc';\nimport { EditorUI } from '../../api/ui';\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { canInsertNode } from '../../api/node';\nimport { codeNodeSpec } from '../../api/code';\nimport { selectionIsBodyTopLevel } from '../../api/selection';\nimport { yamlMetadataTitlePlugin } from './yaml_metadata-title';\nimport { yamlMetadataBlockCapsuleFilter } from './yaml_metadata-capsule';\nimport { OmniInsertGroup } from '../../api/omni_insert';\nimport { fragmentText } from '../../api/fragment';\nimport { stripYamlDelimeters } from '../../api/yaml';\n\nconst extension = (context: ExtensionContext): Extension => {\n const { ui } = context;\n\n return {\n nodes: [\n {\n name: 'yaml_metadata',\n\n spec: {\n ...codeNodeSpec(),\n attrs: {\n navigation_id: { default: null },\n },\n parseDOM: [\n {\n tag: \"div[class*='yaml-block']\",\n preserveWhitespace: 'full',\n } as ParseRule,\n ],\n toDOM(node: ProsemirrorNode): DOMOutputSpec {\n return ['div', { class: 'yaml-block pm-code-block' }, 0];\n },\n },\n\n code_view: {\n lang: () => 'yaml-frontmatter',\n classes: ['pm-metadata-background-color', 'pm-yaml-metadata-block'],\n },\n\n pandoc: {\n blockCapsuleFilter: yamlMetadataBlockCapsuleFilter(),\n\n writer: (output: PandocOutput, node: ProsemirrorNode) => {\n output.writeToken(PandocTokenType.Para, () => {\n const yaml = '---\\n' + stripYamlDelimeters(fragmentText(node.content)) + '\\n---';\n output.writeRawMarkdown(yaml);\n });\n },\n },\n },\n ],\n\n commands: () => {\n return [new YamlMetadataCommand(ui)];\n },\n\n plugins: () => [yamlMetadataTitlePlugin()],\n };\n};\n\nclass YamlMetadataCommand extends ProsemirrorCommand {\n constructor(ui: EditorUI) {\n super(\n EditorCommandId.YamlMetadata,\n [],\n (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n const schema = state.schema;\n\n if (!canInsertNode(state, schema.nodes.yaml_metadata)) {\n return false;\n }\n\n // only allow inserting at the top level\n if (!selectionIsBodyTopLevel(state.selection)) {\n return false;\n }\n\n // create yaml metadata text\n if (dispatch) {\n const tr = state.tr;\n const kYamlLeading = '---\\n';\n const kYamlTrailing = '\\n---';\n const yamlText = schema.text(kYamlLeading + kYamlTrailing);\n const yamlNode = schema.nodes.yaml_metadata.create({}, yamlText);\n tr.replaceSelectionWith(yamlNode);\n setTextSelection(tr.mapping.map(state.selection.from) - kYamlTrailing.length - 1)(tr);\n dispatch(tr);\n }\n\n return true;\n },\n {\n name: ui.context.translateText('YAML'),\n description: ui.context.translateText('YAML metadata block'),\n group: OmniInsertGroup.Blocks,\n priority: 3,\n selectionOffset: -4,\n image: () =>\n ui.prefs.darkMode() ? ui.images.omni_insert?.yaml_block_dark! : ui.images.omni_insert?.yaml_block!,\n },\n );\n }\n}\n\nexport default extension;\n","/*\n * yaml_metadata-capsule.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\n\nimport { ProsemirrorWriter } from '../../api/pandoc';\nimport { uuidv4 } from '../../api/util';\nimport {\n encodedBlockCapsuleRegex,\n blockCapsuleSourceWithoutPrefix,\n PandocBlockCapsule,\n blockCapsuleParagraphTokenHandler,\n blockCapsuleTextHandler,\n} from '../../api/pandoc_capsule';\n\nconst kYamlBlocksRegex = /(^)(---[ \\t]*\\n(?![ \\t]*\\n)[\\W\\w]*?\\n(?:---|\\.\\.\\.))([ \\t]*)$/gm;\n\nconst kYamlDiscardRegex = /^([\\t >]*)`{3,}/m;\n\nexport function yamlMetadataBlockCapsuleFilter() {\n const kYamlMetadataCapsuleType = 'E1819605-0ACD-4FAE-8B99-9C1B7BD7C0F1'.toLowerCase();\n\n return {\n type: kYamlMetadataCapsuleType,\n\n match: kYamlBlocksRegex,\n\n // if there was an unterminated yaml block inside a code block (followed by more yaml,\n // perhaps in yet another code block) then the main regex eats the code block boundary.\n // provide a discard expression that excludes any yaml block that has what appears\n // to be a fenced code block boundary\n discard: kYamlDiscardRegex,\n\n // add a newline to ensure that if the metadata block has text right\n // below it we still end up in our own pandoc paragarph block\n enclose: (capsuleText: string) => capsuleText + '\\n',\n // globally replace any instances of our block capsule found in text\n handleText: blockCapsuleTextHandler(\n kYamlMetadataCapsuleType,\n encodedBlockCapsuleRegex(undefined, '\\\\n', 'gm'),\n (text: string) => text.substring(0, text.length - 1), // trim off newline\n ),\n\n // we are looking for a paragraph token consisting entirely of a\n // block capsule of our type. if find that then return the block\n // capsule text\n handleToken: blockCapsuleParagraphTokenHandler(kYamlMetadataCapsuleType),\n\n // write as yaml_metadata\n writeNode: (schema: Schema, writer: ProsemirrorWriter, capsule: PandocBlockCapsule) => {\n writer.openNode(schema.nodes.yaml_metadata, {\n navigation_id: uuidv4(),\n md_index: capsule.position,\n });\n // write the lines w/o the source-level prefix\n writer.writeText(blockCapsuleSourceWithoutPrefix(capsule.source, capsule.prefix));\n writer.closeNode();\n },\n };\n}\n","/*\n * rmd_chunk.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\n\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { PandocOutput, PandocTokenType } from '../../api/pandoc';\n\nimport { codeNodeSpec } from '../../api/code';\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\n\nimport { EditorUI } from '../../api/ui';\nimport { kBookdownDocType } from '../../api/format';\nimport { rmdChunk, insertRmdChunk } from '../../api/rmd';\nimport { OmniInsertGroup } from '../../api/omni_insert';\n\nimport { RmdChunkImagePreviewPlugin } from './rmd_chunk-image';\nimport { rmdChunkBlockCapsuleFilter } from './rmd_chunk-capsule';\n\nimport './rmd_chunk-styles.css';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\n\nconst extension = (context: ExtensionContext): Extension | null => {\n const { ui, options, format } = context;\n\n if (!format.rmdExtensions.codeChunks) {\n return null;\n }\n\n return {\n nodes: [\n {\n name: 'rmd_chunk',\n spec: {\n ...codeNodeSpec(),\n attrs: {\n navigation_id: { default: null },\n md_index: { default: 0 },\n },\n parseDOM: [\n {\n tag: \"div[class*='rmd-chunk']\",\n preserveWhitespace: 'full',\n },\n ],\n toDOM(node: ProsemirrorNode) {\n return ['div', { class: 'rmd-chunk pm-code-block' }, 0];\n },\n },\n\n code_view: {\n firstLineMeta: true,\n lineNumbers: true,\n lineNumberFormatter: (lineNumber: number, lineCount?: number, line?: string) => {\n if (lineNumber === 1) {\n return '';\n } else {\n return lineNumber - 1 + '';\n }\n },\n bookdownTheorems: format.docTypes.includes(kBookdownDocType),\n classes: ['pm-chunk-background-color'],\n lang: (_node: ProsemirrorNode, content: string) => {\n const match = content.match(/^\\{([a-zA-Z0-9_]+)/);\n if (match) {\n return match[1];\n } else {\n return null;\n }\n },\n createFromPastePattern: /^\\{([a-zA-Z0-9_]+).*}.*?\\n/m,\n },\n\n pandoc: {\n blockCapsuleFilter: rmdChunkBlockCapsuleFilter(),\n\n writer: (output: PandocOutput, node: ProsemirrorNode) => {\n output.writeToken(PandocTokenType.Para, () => {\n const parts = rmdChunk(node.textContent);\n if (parts) {\n output.writeRawMarkdown(parts.delimiter + '{' + parts.meta + '}\\n' + parts.code + parts.delimiter + '\\n');\n }\n });\n },\n },\n },\n ],\n\n commands: (_schema: Schema) => {\n const commands = [\n new RChunkCommand(ui),\n new PythonChunkCommand(ui),\n new BashChunkCommand(ui),\n new RcppChunkCommand(ui),\n new SQLChunkCommand(ui),\n new D3ChunkCommand(ui),\n new StanChunkCommand(ui),\n new ExpandAllChunksCommand(ui),\n new CollapseAllChunksCommand(ui)\n ];\n return commands;\n },\n\n plugins: (_schema: Schema) => {\n if (options.rmdImagePreview) {\n return [new RmdChunkImagePreviewPlugin(ui.context)];\n } else {\n return [];\n }\n },\n };\n};\n\nclass RmdChunkCommand extends ProsemirrorCommand {\n constructor(\n ui: EditorUI,\n id: EditorCommandId,\n keymap: string[],\n priority: number,\n lang: string,\n placeholder: string,\n image: () => string,\n group = OmniInsertGroup.Chunks\n ) {\n super(id, keymap, insertRmdChunk(placeholder), {\n name: `${lang} ${ui.context.translateText('Code Chunk')}`,\n description: `${ui.context.translateText('Executable')} ${lang} ${ui.context.translateText('chunk')}`,\n group,\n priority,\n image\n });\n }\n}\n\nclass RChunkCommand extends RmdChunkCommand {\n constructor(ui: EditorUI) {\n super(ui, EditorCommandId.RCodeChunk, ['Mod-Alt-i'], 10, 'R', '{r}\\n', () =>\n ui.prefs.darkMode() ? ui.images.omni_insert!.r_chunk_dark! : ui.images.omni_insert!.r_chunk!,\n OmniInsertGroup.Common\n );\n }\n}\n\nclass PythonChunkCommand extends RmdChunkCommand {\n constructor(ui: EditorUI) {\n super(\n ui,\n EditorCommandId.PythonCodeChunk,\n [],\n 8,\n 'Python',\n '{python}\\n',\n () => ui.images.omni_insert!.python_chunk!,\n OmniInsertGroup.Common\n );\n }\n}\n\nclass BashChunkCommand extends RmdChunkCommand {\n constructor(ui: EditorUI) {\n super(ui, EditorCommandId.BashCodeChunk, [], 7, 'Bash', '{bash}\\n', () =>\n ui.prefs.darkMode() ? ui.images.omni_insert!.bash_chunk_dark! : ui.images.omni_insert!.bash_chunk!,\n );\n }\n}\n\nclass RcppChunkCommand extends RmdChunkCommand {\n constructor(ui: EditorUI) {\n super(ui, EditorCommandId.RcppCodeChunk, [], 6, 'Rcpp', '{Rcpp}\\n', () =>\n ui.prefs.darkMode() ? ui.images.omni_insert!.rcpp_chunk_dark! : ui.images.omni_insert!.rcpp_chunk!,\n );\n }\n}\n\nclass SQLChunkCommand extends RmdChunkCommand {\n constructor(ui: EditorUI) {\n super(\n ui,\n EditorCommandId.SQLCodeChunk,\n [],\n 5,\n 'SQL',\n '{sql connection=}\\n',\n () => ui.images.omni_insert!.sql_chunk!,\n OmniInsertGroup.Chunks\n );\n }\n}\n\nclass D3ChunkCommand extends RmdChunkCommand {\n constructor(ui: EditorUI) {\n super(ui, EditorCommandId.D3CodeChunk, [], 4, 'D3', '{d3 data=}\\n', () => ui.images.omni_insert!.d3_chunk!, OmniInsertGroup.Chunks);\n }\n}\n\nclass StanChunkCommand extends RmdChunkCommand {\n constructor(ui: EditorUI) {\n super(\n ui,\n EditorCommandId.StanCodeChunk,\n [],\n 7,\n 'Stan',\n '{stan output.var=}\\n',\n () => ui.images.omni_insert!.stan_chunk!,\n OmniInsertGroup.Chunks\n );\n }\n}\n\nclass ChunkExpansionCommand extends ProsemirrorCommand {\n constructor(\n ui: EditorUI,\n id: EditorCommandId,\n keymap: string[],\n expand: boolean\n ) {\n super(id, keymap, (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => \n {\n if (dispatch) {\n ui.chunks.setChunksExpanded(expand);\n }\n return true;\n });\n }\n}\n\nclass ExpandAllChunksCommand extends ChunkExpansionCommand {\n constructor(ui: EditorUI) {\n super(ui, EditorCommandId.ExpandAllChunks, [], true);\n }\n}\n\nclass CollapseAllChunksCommand extends ChunkExpansionCommand {\n constructor(ui: EditorUI) {\n super(ui, EditorCommandId.CollapseAllChunks, [], false);\n }\n}\n\nexport default extension;\n","/*\n * rmd_chunk-image.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { Plugin, PluginKey, Transaction, EditorState } from 'prosemirror-state';\nimport { DecorationSet, Decoration, EditorView } from 'prosemirror-view';\n\nimport { findChildrenByType, setTextSelection } from 'prosemirror-utils';\n\nimport { transactionsAreTypingChange, transactionsHaveChange } from '../../api/transaction';\nimport { EditorUIContext } from '../../api/ui';\nimport { stripQuotes } from '../../api/text';\nimport { onElementRemoved } from '../../api/dom';\n\nconst key = new PluginKey<DecorationSet>('rmd-chunk-image-preview');\n\nexport class RmdChunkImagePreviewPlugin extends Plugin<DecorationSet> {\n constructor(uiContext: EditorUIContext) {\n super({\n key,\n state: {\n init: (_config: { [key: string]: any }, state: EditorState) => {\n return imagePreviewDecorations(state, uiContext);\n },\n apply: (tr: Transaction, old: DecorationSet, oldState: EditorState, newState: EditorState) => {\n const transactions = [tr];\n\n // doc didn't change, return existing decorations\n if (!tr.docChanged) {\n return old.map(tr.mapping, tr.doc);\n\n // non-typing change, do a full rescan\n } else if (!transactionsAreTypingChange(transactions)) {\n return imagePreviewDecorations(newState, uiContext);\n\n // change that affects a rmd chunk block, do a full rescan\n } else if (transactionsHaveChange(transactions, oldState, newState, isRmdChunkNode)) {\n return imagePreviewDecorations(newState, uiContext);\n }\n\n // otherwise return the existing set (mapped)\n else {\n return old.map(tr.mapping, tr.doc);\n }\n },\n },\n props: {\n decorations: (state: EditorState) => {\n return key.getState(state);\n },\n },\n });\n }\n}\n\nfunction imagePreviewDecorations(state: EditorState, uiContext: EditorUIContext) {\n // find all rmd code chunks with knitr::include_graphics\n const decorations: Decoration[] = [];\n findChildrenByType(state.doc, state.schema.nodes.rmd_chunk).forEach(rmdChunk => {\n // look for a line with knitr::include_graphics\n const match = rmdChunk.node.textContent.match(/^(knitr::)?include_graphics\\((['\"])([^\\2]+)\\2/m);\n if (match) {\n // see if we can also find an out.width on the first line\n let width = '';\n const firstLine = rmdChunk.node.textContent.split(/\\r?\\n/)[0];\n const widthMatch = firstLine.match(/^\\s*\\{[r|R][, ].*out\\.width\\s*=\\s*([^ ,$]+).*}/);\n if (widthMatch) {\n width = stripQuotes(widthMatch[1].trim());\n // revert if they are using out.width = NULL\n if (width === 'NULL') {\n width = '';\n }\n }\n\n // see if we can find fig.align='center'\n const alignCenter = !!firstLine.match(/^\\s*\\{[r|R][, ].*fig\\.align\\s*=\\s*['\"]?center['\"]?/);\n\n const imagePath = match[3];\n const decoration = Decoration.widget(\n rmdChunk.pos + rmdChunk.node.nodeSize,\n (view: EditorView, getPos: () => number) => {\n const container = window.document.createElement('div');\n container.style.marginTop = '-1.5em'; // to bridge back to the codemirror block\n // which has a margin-block-end of 1em\n container.classList.add('pm-image-preview');\n container.classList.add('pm-block-border-color');\n const img = window.document.createElement('img');\n if (alignCenter) {\n img.classList.add('pm-image-centered');\n }\n\n img.src = uiContext.mapResourceToURL(imagePath);\n img.setAttribute('draggable', 'false');\n\n // watch for changes to the file\n const unsubscribe = uiContext.watchResource(imagePath, () => {\n img.src = uiContext.mapResourceToURL(imagePath);\n });\n onElementRemoved(view.dom, container, unsubscribe);\n\n if (width) {\n img.setAttribute('width', width);\n }\n img.draggable = false;\n img.onload = () => {\n img.alt = '';\n };\n img.onerror = () => {\n img.alt = ` ${uiContext.translateText('Image not found')}: ${imagePath}`;\n };\n // select rmd_chunk for clicks on the preview image\n img.onclick = () => {\n const tr = view.state.tr;\n setTextSelection(getPos() - 1)(tr);\n view.dispatch(tr);\n };\n container.append(img);\n return container;\n },\n { key: imagePath + 'width:' + width + 'center:' + alignCenter },\n );\n decorations.push(decoration);\n }\n });\n\n // return decorations\n return DecorationSet.create(state.doc, decorations);\n}\n\nfunction isRmdChunkNode(node: ProsemirrorNode) {\n return node.type === node.type.schema.nodes.rmd_chunk;\n}\n","/*\n * rmd_chunk-capsule.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\n\nimport { PandocBlockCapsule, parsePandocBlockCapsule, blockCapsuleSourceWithoutPrefix } from '../../api/pandoc_capsule';\nimport { PandocToken, PandocTokenType, ProsemirrorWriter } from '../../api/pandoc';\nimport { pandocAttrReadAST, kCodeBlockAttr, PandocAttr, kCodeBlockText } from '../../api/pandoc_attr';\nimport { uuidv4 } from '../../api/util';\n\nexport function rmdChunkBlockCapsuleFilter() {\n // (note that this constant is also defined in VisualMode.java)\n const kBlockCapsuleType = 'F3175F2A-E8A0-4436-BE12-B33925B6D220'.toLowerCase();\n const kBlockCapsuleTextRegEx = new RegExp('```' + kBlockCapsuleType + '\\\\n[ \\\\t>]*([^`]+)\\\\n[ \\\\t>]*```', 'g');\n\n return {\n type: kBlockCapsuleType,\n\n match: /^([\\t >]*)((```+)\\s*\\{[a-zA-Z0-9_]+(?: *[ ,].*?)?\\}[ \\t]*\\n(?:[\\t >]*\\3|[\\W\\w]*?\\n[\\t >]*\\3))([ \\t]*)$/gm,\n\n extract: (match: string, p1: string, p2: string, p3: string, p4: string) => {\n return {\n prefix: p1,\n source: p2,\n suffix: p4,\n };\n },\n\n // textually enclose the capsule so that pandoc parses it as the type of block we want it to\n // (in this case a code block). we use the capsule prefix here to make sure that the code block's\n // content and end backticks match the indentation level of the first line correctly\n enclose: (capsuleText: string, capsule: PandocBlockCapsule) =>\n '```' + kBlockCapsuleType + '\\n' + capsule.prefix + capsuleText + '\\n' + capsule.prefix + '```',\n // look for one of our block capsules within pandoc ast text (e.g. a code or raw block)\n // and if we find it, parse and return the original source code\n handleText: (text: string, tok: PandocToken) => {\n // if this is a code block then we need to strip the prefix\n const stripPrefix = tok.t === PandocTokenType.CodeBlock;\n\n return text.replace(kBlockCapsuleTextRegEx, (_match, p1) => {\n const capsuleText = p1;\n const capsule = parsePandocBlockCapsule(capsuleText);\n if (stripPrefix) {\n return blockCapsuleSourceWithoutPrefix(capsule.source, capsule.prefix);\n } else {\n return capsule.source;\n }\n });\n },\n\n // look for a block capsule of our type within a code block (indicated by the\n // presence of a special css class)\n handleToken: (tok: PandocToken) => {\n if (tok.t === PandocTokenType.CodeBlock) {\n const attr = pandocAttrReadAST(tok, kCodeBlockAttr) as PandocAttr;\n if (attr.classes.includes(kBlockCapsuleType)) {\n return tok.c[kCodeBlockText];\n }\n }\n return null;\n },\n\n // write the node as an rmd_chunk, being careful to remove the backticks\n // preserved as part of the source, and striping out the base indentation\n // level implied by the prefix\n writeNode: (schema: Schema, writer: ProsemirrorWriter, capsule: PandocBlockCapsule) => {\n // open node\n writer.openNode(schema.nodes.rmd_chunk, {\n navigation_id: uuidv4(),\n md_index: capsule.position,\n });\n\n // source still has leading and trailing backticks, remove them\n const source = capsule.source.replace(/^```+/, '').replace(/\\n[\\t >]*```+$/, '');\n\n // write the lines w/o the source-level prefix\n writer.writeText(blockCapsuleSourceWithoutPrefix(source, capsule.prefix));\n\n // all done\n writer.closeNode();\n },\n };\n}\n","/*\n * line_block.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema, DOMOutputSpec } from 'prosemirror-model';\n\nimport { ExtensionContext } from '../api/extension';\nimport { PandocOutput, PandocTokenType, PandocToken, kWriteSpaces } from '../api/pandoc';\n\nimport { EditorCommandId, WrapCommand } from '../api/command';\nimport { OmniInsertGroup } from '../api/omni_insert';\n\nimport './line_block-styles.css';\n\nconst extension = (context: ExtensionContext) => {\n const { pandocExtensions, ui } = context;\n\n if (!pandocExtensions.line_blocks) {\n return null;\n }\n\n return {\n nodes: [\n {\n name: 'line_block',\n spec: {\n content: 'paragraph+',\n group: 'block',\n defining: true,\n parseDOM: [\n {\n tag: \"div[class*='line-block']\",\n },\n ],\n toDOM(): DOMOutputSpec {\n return ['div', { class: 'line-block pm-line-block pm-block-border-color pm-margin-bordered' }, 0];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.LineBlock,\n block: 'line_block',\n getChildren: (tok: PandocToken) => {\n return tok.c.map((line: PandocToken[]) => ({ t: PandocTokenType.Para, c: line }));\n },\n },\n ],\n writer: (output: PandocOutput, node: ProsemirrorNode) => {\n output.withOption(kWriteSpaces, false, () => {\n output.writeToken(PandocTokenType.LineBlock, () => {\n node.forEach(line => {\n output.writeArray(() => {\n output.writeInlines(line.content);\n });\n });\n });\n });\n },\n },\n },\n ],\n commands: (schema: Schema) => {\n return [\n new WrapCommand(\n EditorCommandId.LineBlock,\n [],\n schema.nodes.line_block,\n {},\n {\n name: ui.context.translateText('Line Block'),\n description: ui.context.translateText('Preserve leading spaces and line breaks'),\n group: OmniInsertGroup.Blocks,\n priority: 2,\n image: () =>\n ui.prefs.darkMode() ? ui.images.omni_insert?.line_block_dark! : ui.images.omni_insert?.line_block!,\n },\n ),\n ];\n },\n };\n};\n\nexport default extension;\n","/*\n * table.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\nimport { Transaction, EditorState } from 'prosemirror-state';\nimport { Transform } from 'prosemirror-transform';\nimport { tableEditing, columnResizing, goToNextCell, deleteColumn, deleteRow } from 'prosemirror-tables';\nimport { sinkListItem, liftListItem } from 'prosemirror-schema-list';\n\nimport { findChildrenByType } from 'prosemirror-utils';\n\nimport { Extension, ExtensionContext } from '../../api/extension';\nimport { BaseKey } from '../../api/basekeys';\nimport { ProsemirrorCommand, EditorCommandId, exitNode } from '../../api/command';\nimport { TableCapabilities } from '../../api/table';\nimport { trTransform } from '../../api/transaction';\n\nimport {\n insertTable,\n deleteTable,\n deleteTableCaption,\n addRows,\n addColumns,\n TableColumnAlignmentCommand,\n TableRowCommand,\n TableColumnCommand,\n TableToggleHeaderCommand,\n TableToggleCaptionCommand,\n CssAlignment,\n insertTableOmniInsert,\n} from './table-commands';\n\nimport {\n tableContainerNode,\n tableNode,\n tableCaptionNode,\n tableCellNode,\n tableHeaderNode,\n tableRowNode,\n} from './table-nodes';\n\nimport { fixupTableWidths } from './table-columns';\nimport { TableContextMenuPlugin } from './table-contextmenu';\nimport { tablePaste } from './table-paste';\n\nimport 'prosemirror-tables/style/tables.css';\nimport './table-styles.css';\n\nconst extension = (context: ExtensionContext): Extension | null => {\n const { pandocExtensions, ui } = context;\n\n // not enabled if there are no tables enabled\n if (\n !pandocExtensions.grid_tables &&\n !pandocExtensions.pipe_tables &&\n !pandocExtensions.simple_tables &&\n !pandocExtensions.multiline_tables &&\n !pandocExtensions.raw_html\n ) {\n return null;\n }\n\n // define table capabilities\n const capabilities: TableCapabilities = {\n captions: pandocExtensions.table_captions,\n headerOptional: pandocExtensions.grid_tables,\n multiline: pandocExtensions.multiline_tables || pandocExtensions.grid_tables,\n };\n\n return {\n nodes: [\n tableContainerNode,\n tableNode,\n tableCaptionNode,\n tableCellNode(pandocExtensions.grid_tables),\n tableHeaderNode,\n tableRowNode,\n ],\n\n commands: (_schema: Schema) => {\n const commands = [\n new ProsemirrorCommand(\n EditorCommandId.Table,\n ['Alt-Mod-t'],\n insertTable(capabilities, ui),\n insertTableOmniInsert(ui),\n ),\n new ProsemirrorCommand(\n EditorCommandId.TableInsertTable,\n [],\n insertTable(capabilities, ui),\n ),\n new ProsemirrorCommand(EditorCommandId.TableNextCell, ['Tab'], goToNextCell(1)),\n new ProsemirrorCommand(EditorCommandId.TablePreviousCell, ['Shift-Tab'], goToNextCell(-1)),\n new TableColumnCommand(EditorCommandId.TableAddColumnAfter, [], addColumns(true)),\n new TableColumnCommand(EditorCommandId.TableAddColumnBefore, [], addColumns(false)),\n new TableColumnCommand(EditorCommandId.TableDeleteColumn, [], deleteColumn),\n new TableRowCommand(EditorCommandId.TableAddRowAfter, [], addRows(true)),\n new TableRowCommand(EditorCommandId.TableAddRowBefore, [], addRows(false)),\n new TableRowCommand(EditorCommandId.TableDeleteRow, [], deleteRow),\n new ProsemirrorCommand(EditorCommandId.TableDeleteTable, [], deleteTable()),\n new TableColumnAlignmentCommand(EditorCommandId.TableAlignColumnLeft, CssAlignment.Left),\n new TableColumnAlignmentCommand(EditorCommandId.TableAlignColumnRight, CssAlignment.Right),\n new TableColumnAlignmentCommand(EditorCommandId.TableAlignColumnCenter, CssAlignment.Center),\n new TableColumnAlignmentCommand(EditorCommandId.TableAlignColumnDefault, null),\n ];\n if (capabilities.captions) {\n commands.push(new TableToggleCaptionCommand());\n }\n if (capabilities.headerOptional) {\n commands.push(new TableToggleHeaderCommand());\n }\n return commands;\n },\n\n plugins: (schema: Schema) => {\n return [\n columnResizing({\n handleWidth: 5,\n }),\n tableEditing(),\n tablePaste(),\n new TableContextMenuPlugin(schema, ui),\n ];\n },\n\n baseKeys: (schema: Schema) => {\n // core keys\n const keys = [\n { key: BaseKey.Backspace, command: deleteTableCaption() },\n { key: BaseKey.Enter, command: exitNode(schema.nodes.table_caption, -2, false) },\n { key: BaseKey.Tab, command: tableTabKey },\n { key: BaseKey.ShiftTab, command: tableShiftTabKey },\n ];\n\n // turn enter key variations into tab if we don't support multi-line\n if (!capabilities.multiline) {\n keys.push({ key: BaseKey.Enter, command: goToNextCell(1) });\n keys.push({ key: BaseKey.ShiftEnter, command: goToNextCell(-11) });\n keys.push({ key: BaseKey.ModEnter, command: goToNextCell(1) });\n }\n\n return keys;\n },\n\n fixups: (_schema: Schema, view: EditorView) => {\n return [fixupTableWidths(view)];\n },\n\n appendTransaction: (_schema: Schema) => {\n return [\n {\n name: 'table-repair',\n nodeFilter: node => node.type === node.type.schema.nodes.table,\n append: (tr: Transaction) => {\n trTransform(tr, tableRepairTransform);\n },\n },\n ];\n },\n };\n};\n\nexport function tableTabKey(state: EditorState, dispatch?: (tr: Transaction) => void): boolean {\n if (sinkListItem(state.schema.nodes.list_item)(state)) {\n return false;\n } else {\n return goToNextCell(1)(state, dispatch);\n }\n}\n\nexport function tableShiftTabKey(state: EditorState, dispatch?: (tr: Transaction) => void): boolean {\n if (liftListItem(state.schema.nodes.list_item)(state)) {\n return false;\n } else {\n return goToNextCell(-1)(state, dispatch);\n }\n}\n\nfunction tableRepairTransform(tr: Transform) {\n const schema = tr.doc.type.schema;\n const tables = findChildrenByType(tr.doc, schema.nodes.table);\n tables.forEach(table => {\n // map the position\n const pos = tr.mapping.map(table.pos);\n\n // get containing node (pos is right before the table)\n const containingNode = tr.doc.resolve(pos).node();\n\n // table with no container\n if (containingNode.type !== schema.nodes.table_container) {\n // add the container\n const caption = schema.nodes.table_caption.createAndFill({ inactive: true }, undefined)!;\n const container = schema.nodes.table_container.createAndFill({}, [table.node, caption])!;\n tr.replaceWith(pos, pos + table.node.nodeSize, container);\n }\n\n // table with no content (possible w/ half caption leftover)\n else if (table.node.firstChild && table.node.firstChild.childCount === 0) {\n // delete the table (and container if necessary)\n const hasContainer = containingNode.type === schema.nodes.table_container;\n if (hasContainer) {\n tr.deleteRange(pos - 1, pos - 1 + containingNode.nodeSize);\n } else {\n tr.deleteRange(pos, table.node.nodeSize);\n }\n }\n });\n}\n\nexport default extension;\n","/*\n * table-commands.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorView } from 'prosemirror-view';\nimport { Node as ProsemirrorNode, Fragment } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\nimport { findParentNodeOfType, setTextSelection, findChildrenByType } from 'prosemirror-utils';\nimport {\n isInTable,\n Rect,\n TableMap,\n selectionCell,\n CellSelection,\n toggleHeader,\n addRow,\n addColumn,\n} from 'prosemirror-tables';\n\nimport { EditorUI } from '../../api/ui';\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { canInsertNode } from '../../api/node';\nimport { TableCapabilities } from '../../api/table';\nimport { OmniInsertGroup } from '../../api/omni_insert';\n\nexport function insertTable(capabilities: TableCapabilities, ui: EditorUI) {\n return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n const schema = state.schema;\n\n // can we insert?\n if (!canInsertNode(state, schema.nodes.table_container)) {\n return false;\n }\n\n // is the selection inside a table caption? if it is then we can't insert\n // as it will \"split\" the table_container in such a way that an invalid\n // table will be created\n if (findParentNodeOfType(schema.nodes.table_caption)(state.selection)) {\n return false;\n }\n\n async function asyncInsertTable() {\n if (dispatch) {\n const result = await ui.dialogs.insertTable(capabilities);\n if (result) {\n // create cells\n const numRows = result.rows + (result.header ? 1 : 0);\n const rows: ProsemirrorNode[] = [];\n for (let r = 0; r < numRows; r++) {\n const cells: ProsemirrorNode[] = [];\n const cellType = r === 0 && result.header ? schema.nodes.table_header : schema.nodes.table_cell;\n for (let c = 0; c < result.cols; c++) {\n const content =\n cellType === schema.nodes.table_header\n ? schema.text(`${ui.context.translateText('Col')}${c + 1}`)\n : Fragment.empty;\n cells.push(cellType.createAndFill({}, schema.nodes.paragraph.createAndFill({}, content)!)!);\n }\n rows.push(schema.nodes.table_row.createAndFill({}, cells)!);\n }\n\n // create table\n const table = schema.nodes.table.createAndFill({}, rows)!;\n const tableCaption = schema.nodes.table_caption.createAndFill(\n { inactive: !result.caption },\n result.caption ? schema.text(result.caption) : undefined,\n )!;\n const tableContainer = schema.nodes.table_container.createAndFill({}, [table, tableCaption])!;\n\n // insert\n const tr = state.tr;\n tr.replaceSelectionWith(tableContainer);\n\n // select first cell\n const selectionPos = tr.mapping.map(state.selection.from, -1);\n setTextSelection(selectionPos)(tr).scrollIntoView();\n\n // dispatch & focus\n dispatch(tr);\n }\n if (view) {\n view.focus();\n }\n }\n }\n asyncInsertTable();\n\n return true;\n };\n}\n\nexport function insertTableOmniInsert(ui: EditorUI) {\n return {\n name: ui.context.translateText('Table'),\n description: ui.context.translateText('Content in rows and columns'),\n group: OmniInsertGroup.Lists,\n priority: 1,\n image: () => (ui.prefs.darkMode() ? ui.images.omni_insert?.table_dark! : ui.images.omni_insert?.table!),\n };\n}\n\nexport function deleteTable() {\n return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n const schema = state.schema;\n const container = findParentNodeOfType(schema.nodes.table_container)(state.selection);\n if (container) {\n if (dispatch) {\n const tr = state.tr;\n tr.delete(container.pos, container.pos + container.node.nodeSize);\n dispatch(tr.scrollIntoView());\n }\n return true;\n }\n return false;\n };\n}\n\nexport function deleteTableCaption() {\n return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n // must be a selection within an empty table caption\n const schema = state.schema;\n const { $head } = state.selection;\n if ($head.parent.type !== schema.nodes.table_caption || $head.parent.childCount !== 0) {\n return false;\n }\n\n if (dispatch) {\n // set the caption to inactive\n const tr = state.tr;\n const caption = $head.parent;\n tr.setNodeMarkup($head.pos - 1, schema.nodes.table_caption, {\n ...caption.attrs,\n inactive: true,\n });\n setTextSelection($head.pos - 1, -1)(tr);\n dispatch(tr);\n }\n\n return true;\n };\n}\n\nexport function addColumns(after: boolean) {\n return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n if (!isInTable(state)) {\n return false;\n }\n if (dispatch) {\n let tr = state.tr;\n const rect = selectedRect(state);\n const columns = rect.right - rect.left;\n for (let i = 0; i < columns; i++) {\n tr = addColumn(tr, rect, after ? rect.right : rect.left);\n }\n dispatch(tr);\n }\n return true;\n };\n}\n\nexport function addRows(after: boolean) {\n return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n if (!isInTable(state)) {\n return false;\n }\n if (dispatch) {\n // add the rows\n let tr = state.tr;\n const rect = selectedRect(state);\n const rows = rect.bottom - rect.top;\n for (let i = 0; i < rows; i++) {\n tr = addRow(tr, rect, after ? rect.bottom : rect.top);\n }\n\n // sync column alignments for table\n const table = findParentNodeOfType(state.schema.nodes.table)(tr.selection);\n if (table) {\n const alignments = new Array<CssAlignment | null>(rect.map.width);\n table.node.forEach((rowNode, rowOffset, rowIndex) => {\n rowNode.forEach((cellNode, cellOffset, colIndex) => {\n const cellPos = table.pos + 1 + rowOffset + 1 + cellOffset;\n if (rowIndex === 0) {\n const cell = tr.doc.nodeAt(cellPos);\n alignments[colIndex] = cell?.attrs.align || null;\n } else {\n tr.setNodeMarkup(cellPos, cellNode.type, {\n ...cellNode.attrs,\n align: alignments[colIndex] || null,\n });\n }\n });\n });\n }\n\n dispatch(tr);\n }\n return true;\n };\n}\n\nexport class TableToggleHeaderCommand extends ProsemirrorCommand {\n constructor() {\n super(EditorCommandId.TableToggleHeader, [], toggleHeader('row'));\n }\n\n public isActive(state: EditorState): boolean {\n if (!isInTable(state)) {\n return false;\n }\n const { table } = selectedRect(state);\n const firstCell = table.firstChild!.firstChild!;\n return firstCell.type === state.schema.nodes.table_header;\n }\n}\n\nexport class TableToggleCaptionCommand extends ProsemirrorCommand {\n constructor() {\n super(\n EditorCommandId.TableToggleCaption,\n [],\n (state: EditorState, dispatch?: (tr: Transaction<any>, view?: EditorView) => void) => {\n if (!isInTable(state)) {\n return false;\n }\n const caption = this.tableCaptionNode(state);\n if (!caption) {\n return false;\n }\n\n if (dispatch) {\n const focus = caption.node.attrs.inactive;\n const tr = state.tr;\n tr.setNodeMarkup(caption.pos + 1, state.schema.nodes.table_caption, {\n ...caption.node.attrs,\n inactive: !caption.node.attrs.inactive,\n });\n if (focus) {\n setTextSelection(caption.pos + 1)(tr).scrollIntoView();\n }\n dispatch(tr);\n }\n\n return true;\n },\n );\n }\n\n public isActive(state: EditorState): boolean {\n if (!isInTable(state)) {\n return false;\n }\n\n const caption = this.tableCaptionNode(state);\n if (!caption) {\n return false;\n }\n\n return !caption.node.attrs.inactive;\n }\n\n private tableCaptionNode(state: EditorState) {\n const container = findParentNodeOfType(state.schema.nodes.table_container)(state.selection);\n if (container) {\n const caption = findChildrenByType(container.node, state.schema.nodes.table_caption);\n return {\n node: caption[0].node,\n pos: container.pos + caption[0].pos,\n };\n } else {\n return undefined;\n }\n }\n}\n\nexport enum CssAlignment {\n Left = 'left',\n Right = 'right',\n Center = 'center',\n}\n\nexport class TableRowCommand extends ProsemirrorCommand {\n public plural(state: EditorState) {\n if (!isInTable(state)) {\n return 1;\n }\n\n const rect = selectedRect(state);\n return rect.bottom - rect.top;\n }\n}\n\nexport class TableColumnCommand extends ProsemirrorCommand {\n public plural(state: EditorState) {\n if (!isInTable(state)) {\n return 1;\n }\n\n const rect = selectedRect(state);\n return rect.right - rect.left;\n }\n}\n\nexport class TableColumnAlignmentCommand extends ProsemirrorCommand {\n private readonly align: CssAlignment | null;\n\n constructor(id: EditorCommandId, align: CssAlignment | null) {\n super(id, [], (state: EditorState, dispatch?: (tr: Transaction<any>) => void) => {\n if (!isInTable(state)) {\n return false;\n }\n\n if (dispatch) {\n const { table, tableStart, left, right } = selectedRect(state);\n const tr = state.tr;\n table.forEach((rowNode, rowOffset) => {\n rowNode.forEach((cellNode, cellOffset, i) => {\n if (i >= left && i < right) {\n const cellPos = tableStart + 1 + rowOffset + cellOffset;\n tr.setNodeMarkup(cellPos, cellNode.type, {\n ...cellNode.attrs,\n align,\n });\n }\n });\n });\n dispatch(tr);\n }\n\n return true;\n });\n this.align = align;\n }\n\n public isActive(state: EditorState): boolean {\n if (!isInTable(state)) {\n return false;\n }\n const { table, top, left } = selectedRect(state);\n const cell = table.child(top).child(left);\n return cell.attrs.align === this.align;\n }\n}\n\n// from: https://github.com/ProseMirror/prosemirror-tables/blob/master/src/commands.js\n\ninterface SelectedRect extends Rect {\n tableStart: number;\n map: TableMap;\n table: ProsemirrorNode;\n}\n\nfunction selectedRect(state: EditorState): SelectedRect {\n const sel = state.selection;\n const $pos = selectionCell(state)!;\n const table = $pos.node(-1);\n const tableStart = $pos.start(-1);\n const map = TableMap.get(table);\n let rect: Rect;\n if (sel instanceof CellSelection) {\n rect = map.rectBetween(sel.$anchorCell.pos - tableStart, sel.$headCell.pos - tableStart);\n } else {\n rect = map.findCell($pos.pos - tableStart);\n }\n return {\n ...rect,\n tableStart,\n map,\n table,\n };\n}\n","/*\n * table-nodes.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { tableNodes } from 'prosemirror-tables';\nimport { Node as ProsemirrorNode, DOMOutputSpec } from 'prosemirror-model';\n\nimport { PandocTokenType } from '../../api/pandoc';\n\nimport {\n readPandocTable,\n writePandocTableContainer,\n writePandocTable,\n writePandocTableCaption,\n writePandocTableNodes,\n writePandocTableHeaderNodes,\n} from './table-pandoc';\nimport { tableColumnWidths } from './table-columns';\nimport { tableBlockCapsuleFilter } from './table-capsule';\n\nexport const kDefaultCellClasses = 'pm-table-cell pm-block-border-color';\n\nconst nodes = tableNodes({\n tableGroup: 'block',\n cellContent: 'block+',\n cellAttributes: {\n align: {\n default: null,\n getFromDOM(dom: Element) {\n return (dom as HTMLElement).style.textAlign || null;\n },\n setDOMAttr(value, attrs) {\n if (value) {\n attrs.style = (attrs.style || '') + `text-align: ${value};`;\n }\n },\n },\n className: {\n default: kDefaultCellClasses,\n getFromDOM(dom: Element) {\n return (dom as HTMLElement).className;\n },\n setDOMAttr(value, attrs) {\n attrs.class = kDefaultCellClasses;\n },\n },\n },\n});\n\nexport const tableContainerNode = {\n name: 'table_container',\n spec: {\n content: 'table table_caption',\n group: 'block',\n parseDOM: [{ tag: \"div[class*='table-container']\" }],\n toDOM(node: ProsemirrorNode): DOMOutputSpec {\n return ['div', { class: 'table-container pm-table-container' }, 0];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.Table,\n handler: readPandocTable,\n },\n ],\n writer: writePandocTableContainer,\n blockCapsuleFilter: tableBlockCapsuleFilter(),\n },\n};\n\nexport const tableNode = {\n name: 'table',\n spec: {\n ...nodes.table,\n attrs: {\n ...nodes.table.attrs,\n width: { default: null },\n colpercents: { default: null },\n },\n parseDOM: [\n {\n tag: 'table',\n getAttrs: (dom: Node | string) => {\n const el = dom as HTMLElement;\n\n // shared colpercents\n let colpercents: number[] | null = null;\n\n // if we have a colgroup w/ widths then read percents from there\n // <colgroup><col style=\"width: 44%\" /><col style=\"width: 11%\" /></colgroup>\n const colgroup = el.getElementsByTagName('colgroup');\n if (colgroup.length) {\n const cols = colgroup[0].childElementCount;\n colpercents = new Array<number>(cols).fill(0);\n for (let i = 0; i < cols; i++) {\n const col = colgroup[0].children.item(i) as HTMLElement;\n if (col.style.width) {\n colpercents[i] = (parseInt(col.style.width, 10) || 0) / 100;\n }\n }\n if (colpercents.every(value => !!value)) {\n return {\n colpercents,\n };\n }\n }\n\n // otherwise read from data-colwidth\n let width: number | null = null;\n const rows = el.getElementsByTagName('tr');\n if (rows.length) {\n const firstRow = rows.item(0)!;\n const numCells = firstRow.cells.length;\n const colWidths = new Array<number>(numCells).fill(0);\n for (let i = 0; i < numCells; i++) {\n const cell = firstRow.cells.item(i)!;\n const colWidth = cell.getAttribute('data-colwidth');\n if (colWidth) {\n colWidths[i] = Number(colWidth);\n }\n }\n if (colWidths.every(colWidth => colWidth > 0)) {\n width = colWidths.reduce((total, value) => total + value, 0);\n colpercents = colWidths.map(colWidth => colWidth / width!);\n }\n }\n\n return {\n width,\n colpercents,\n };\n },\n },\n ],\n toDOM(node: ProsemirrorNode): DOMOutputSpec {\n const attrs: any = {};\n if (node.attrs.width) {\n attrs['data-width'] = node.attrs.width.toString();\n }\n attrs['data-colpercents'] = tableColumnWidths(node).join(',');\n return ['table', attrs, ['tbody', 0]];\n },\n },\n pandoc: {\n writer: writePandocTable,\n },\n};\n\nexport const tableCaptionNode = {\n name: 'table_caption',\n spec: {\n attrs: {\n inactive: { default: false },\n },\n content: 'inline*',\n parseDOM: [\n {\n tag: \"p[class*='table-caption']\",\n getAttrs(dom: Node | string) {\n return {\n inactive: (dom as HTMLElement).classList.contains('table-caption-inactive'),\n };\n },\n },\n ],\n toDOM(node: ProsemirrorNode): DOMOutputSpec {\n const classes = ['table-caption', 'pm-node-caption'];\n if (node.attrs.inactive) {\n classes.push('table-caption-inactive');\n }\n return ['p', { class: classes.join(' ') }, 0];\n },\n },\n pandoc: {\n writer: writePandocTableCaption,\n },\n};\n\nexport const tableRowNode = {\n name: 'table_row',\n spec: nodes.table_row,\n pandoc: {\n writer: writePandocTableNodes,\n },\n};\n\nexport const tableCellNode = (blocks: boolean) => ({\n name: 'table_cell',\n spec: {\n ...nodes.table_cell,\n content: blocks ? 'block+' : 'paragraph',\n },\n pandoc: {\n writer: writePandocTableNodes,\n },\n});\n\nexport const tableHeaderNode = {\n name: 'table_header',\n spec: nodes.table_header,\n pandoc: {\n writer: writePandocTableHeaderNodes,\n },\n};\n","/*\n * table-pandoc.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, NodeType, Node as ProsemirrorNode, Fragment } from 'prosemirror-model';\n\nimport { ProsemirrorWriter, PandocToken, PandocTokenType, PandocOutput } from '../../api/pandoc';\n\nimport { CssAlignment } from './table-commands';\nimport { tableColumnAlignments, tableColumnWidths } from './table-columns';\n\n// attributes\nconst kTableAttr = 0;\n\n// caption\nconst kTableCaption = 1;\nconst kTableCaptionShort = 0; // [Inline]\nconst kTableCaptionFull = 1; // [Block]\n\n// columdefs\nconst kTableColSpec = 2;\nconst kTableColSpecAlign = 0;\nconst kTableColSpecWidth = 1;\n\n// table head\nconst kTableHead = 3;\nconst kTableHeadAttr = 0;\nconst kTableHeadRows = 1; // [Row]\n\n// table body\nconst kTableBody = 4;\nconst kTableBodyAttr = 0;\nconst kTableBodyRowHeadNumColumns = 1;\nconst kTableBodyRowHead = 2;\nconst kTableBodyRows = 3; // [Row]\n\n// table foot\nconst kTableFoot = 5;\nconst kTableFootAttr = 0;\nconst kTableFootRows = 1; // [Row]\n\n// table row\nconst kTableRowAttr = 0;\nconst kTableRowCells = 1; // [Cell]\n\n// table cell\nconst kTableCellAttr = 0;\nconst kTableCellAlignments = 1;\nconst kTableCellRowSpan = 2;\nconst kTableCellColSpan = 3;\nconst KTableCellContents = 4; // [Block]\n\n\nexport function readPandocTable(schema: Schema) {\n return (writer: ProsemirrorWriter, tok: PandocToken) => {\n // get alignments and columns widths\n const alignments = columnCssAlignments(tok);\n const colpercents = columnPercents(tok);\n\n // helper function to parse a table row\n const parseRow = (row: any[], cellType: NodeType) => {\n const cells: any[] = row[kTableRowCells];\n if (cells.length) {\n writer.openNode(schema.nodes.table_row, {});\n cells.forEach((cell: any[], i) => {\n writer.openNode(cellType, { align: alignments[i] });\n writer.writeTokens(cell[KTableCellContents]);\n writer.closeNode();\n });\n writer.closeNode();\n }\n };\n\n // open table container node\n writer.openNode(schema.nodes.table_container, {});\n\n // open table node\n writer.openNode(schema.nodes.table, { colpercents });\n\n // parse column headers\n const head = tok.c[kTableHead] as any[];\n const firstRow = head[kTableHeadRows][0];\n if (firstRow && firstRow[kTableRowCells].some((cell: any[]) => cell[KTableCellContents].length > 0)) {\n parseRow(firstRow, schema.nodes.table_header);\n }\n\n // parse table rows\n const body = tok.c[kTableBody][0] as any[];\n body[kTableBodyRows].forEach((row: any[]) => {\n parseRow(row, schema.nodes.table_cell);\n });\n\n // close table node\n writer.closeNode();\n\n // read caption\n const caption = tok.c[kTableCaption][kTableCaptionFull];\n const captionBlock: PandocToken[] = caption.length ? caption[0].c : [];\n writer.openNode(schema.nodes.table_caption, { inactive: captionBlock.length === 0 });\n writer.writeTokens(captionBlock);\n writer.closeNode();\n\n // close table container node\n writer.closeNode();\n };\n}\n\nexport function writePandocTableContainer(output: PandocOutput, node: ProsemirrorNode) {\n const caption = node.lastChild!;\n const table = node.firstChild!;\n\n output.writeToken(PandocTokenType.Table, () => {\n\n // write empty attributes\n output.writeAttr();\n\n // write caption\n output.writeNode(caption);\n\n // write table\n output.writeNode(table);\n });\n}\n\nexport function writePandocTable(output: PandocOutput, node: ProsemirrorNode) {\n const firstRow = node.firstChild!;\n\n // get alignments and column widths\n const alignments = tableColumnAlignments(node);\n const widths = tableColumnWidths(node);\n\n // write colspcs\n // TODO: Columns are coming out ColWidthDefault\n output.writeArray(() => {\n alignments.forEach((align, i) => {\n output.writeArray(() => {\n output.writeToken(align);\n if (widths[i] === 0) {\n output.writeToken(PandocTokenType.ColWidthDefault);\n } else {\n output.writeToken(PandocTokenType.ColWidth, widths[i]);\n }\n });\n });\n });\n\n\n // write header row if necessary\n const headerCut = firstRow.firstChild!.type === node.type.schema.nodes.table_header ? 1 : 0;\n output.writeArray(() => {\n output.writeAttr();\n output.writeArray(() => {\n writePandocTableRow(output, firstRow, headerCut === 0);\n });\n });\n\n // write table body\n output.writeArray(() => {\n output.writeArray(() => {\n output.writeAttr();\n output.write(0);\n output.writeArray(() => { /* */ });\n // write rows\n output.writeArray(() => {\n for (let i = headerCut; i < node.childCount; i++) {\n writePandocTableRow(output, node.content.child(i));\n }\n });\n });\n });\n\n // write table footer\n output.writeArray(() => {\n output.writeAttr();\n output.writeArray(() => { /* */ });\n });\n\n\n}\n\nexport function writePandocTableCaption(output: PandocOutput, node: ProsemirrorNode) {\n output.writeArray(() => {\n output.write(null);\n output.writeArray(() => {\n if (!node.attrs.inactive && node.childCount > 0) {\n output.writeToken(PandocTokenType.Plain, () => {\n output.writeInlines(node.content);\n });\n }\n });\n });\n}\n\nexport function writePandocTableNodes(output: PandocOutput, node: ProsemirrorNode) {\n output.writeArray(() => {\n output.writeNodes(node);\n });\n}\n\nexport function writePandocTableHeaderNodes(output: PandocOutput, node: ProsemirrorNode) {\n output.writeArray(() => {\n if (node.textContent.length > 0) {\n output.writeNodes(node);\n } else {\n // write a paragraph containing a space (this is an attempt to fix an issue where\n // empty headers don't get correct round-tripping)\n output.writeToken(PandocTokenType.Para, () => {\n output.writeRawMarkdown(' ');\n });\n }\n });\n}\n\nfunction writePandocTableRow(output: PandocOutput, node: ProsemirrorNode, empty = false) {\n output.writeArray(() => {\n output.writeAttr();\n output.writeArray(() => {\n node.forEach((cellNode) => {\n output.writeArray(() => {\n output.writeAttr();\n output.writeToken(PandocTokenType.AlignDefault);\n output.write(1);\n output.write(1);\n if (!empty) {\n output.writeNode(cellNode);\n } else {\n output.writeArray(() => {\n output.writeInlines(Fragment.empty);\n });\n }\n });\n });\n });\n });\n}\n\n\nfunction columnCssAlignments(tableToken: PandocToken) {\n return tableToken.c[kTableColSpec].map((spec: any) => {\n const alignment = spec[kTableColSpecAlign];\n switch (alignment.t) {\n case PandocTokenType.AlignLeft:\n return CssAlignment.Left;\n case PandocTokenType.AlignRight:\n return CssAlignment.Right;\n case PandocTokenType.AlignCenter:\n return CssAlignment.Center;\n case PandocTokenType.AlignDefault:\n default:\n return null;\n }\n });\n}\n\nfunction columnPercents(tableToken: PandocToken): number[] {\n return tableToken.c[kTableColSpec].map((spec: any) => {\n const width = spec[kTableColSpecWidth];\n return width.t === PandocTokenType.ColWidth ? width.c : 0;\n });\n}\n","/*\n * table-columns.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\nimport { Transaction } from 'prosemirror-state';\nimport { findChildrenByType } from 'prosemirror-utils';\n\nimport { PandocTokenType } from '../../api/pandoc';\n\nimport { CssAlignment } from './table-commands';\n\nexport function tableColumnAlignments(node: ProsemirrorNode) {\n // get the first row (schema requires at least 1 row)\n const firstRow = node.firstChild!;\n\n // determine # of columns\n const cols = firstRow.childCount;\n\n // return alignments\n const alignments = new Array<PandocTokenType>(cols);\n for (let i = 0; i < cols; i++) {\n const cell = firstRow.child(i);\n const align: CssAlignment = cell.attrs.align;\n switch (align) {\n case CssAlignment.Left:\n alignments[i] = PandocTokenType.AlignLeft;\n break;\n case CssAlignment.Right:\n alignments[i] = PandocTokenType.AlignRight;\n break;\n case CssAlignment.Center:\n alignments[i] = PandocTokenType.AlignCenter;\n break;\n case null:\n default:\n alignments[i] = PandocTokenType.AlignDefault;\n break;\n }\n }\n return alignments;\n}\n\nexport function tableColumnWidths(node: ProsemirrorNode) {\n // get the first row (schema requires at least 1 row)\n const firstRow = node.firstChild!;\n\n // determine # of columns\n const cols = firstRow.childCount;\n\n // width percentages\n let widths = new Array<number>(cols).fill(0);\n\n // take note of explicitly sized columns\n const totalWidth = node.attrs.width;\n let availableWidth = totalWidth;\n let colsWithWidth = 0;\n for (let i = 0; i < cols; i++) {\n const col = firstRow.child(i);\n if (col.attrs.colwidth && col.attrs.colwidth[0]) {\n widths[i] = col.attrs.colwidth[0];\n colsWithWidth++;\n availableWidth -= widths[i];\n }\n }\n\n // allocate remaining widths if we have at least 1 sized columns (otherwise\n // we leave all of the widths at 0 which results in no sizing)\n if (colsWithWidth > 0) {\n if (availableWidth > 0) {\n const defaultWidth = availableWidth / (cols - colsWithWidth);\n for (let i = 0; i < cols; i++) {\n const col = firstRow.child(i);\n if (!col.attrs.colwidth || !col.attrs.colwidth[0]) {\n widths[i] = defaultWidth;\n }\n }\n }\n\n // convert widths to percentages\n widths = widths.map(width => width / totalWidth);\n }\n\n return widths;\n}\n\nexport function fixupTableWidths(view: EditorView) {\n return (tr: Transaction) => {\n const schema = tr.doc.type.schema;\n\n // don't do fixup if we aren't connected to the DOM\n if (!view.dom || !view.dom.isConnected) {\n return tr;\n }\n\n const tables = findChildrenByType(tr.doc, schema.nodes.table);\n for (const table of tables) {\n // get table width\n const el = view.domAtPos(table.pos).node as HTMLElement;\n const containerWidth = table.node.attrs.width || el.clientWidth;\n if (containerWidth === 0) {\n continue;\n }\n\n // resolve colpercents (read by tokenzier)\n let colpercents: number[] = table.node.attrs.colpercents;\n\n if (colpercents) {\n\n // enforce a minimum column width of 25% (otherwise hard to edit)\n // note some of this will get taken back when we adjust all columns\n // for the extra bonus given to small columns\n const kMinPercent = 0.25;\n const totalPercent = colpercents.reduce((total: number, pct: number) => {\n return total + pct;\n }, 0);\n colpercents = colpercents.map(pct => Math.max(pct, kMinPercent));\n const adjustedPercent = colpercents.reduce((total: number, pct: number) => {\n return total + pct;\n }, 0);\n const extraPercent = adjustedPercent - totalPercent;\n colpercents = colpercents.map(pct => pct - (extraPercent/colpercents.length));\n const colWidths = colpercents.map(pct => Math.floor(pct * containerWidth));\n\n // for each row\n table.node.forEach((rowNode, rowOffset, r) => {\n // for each cell\n rowNode.forEach((cellNode, cellOffset, c) => {\n const cellPos = table.pos + 1 + rowOffset + 1 + cellOffset;\n const colWidth = [colWidths[c]];\n if (colWidth !== cellNode.attrs.colwidth) {\n tr.setNodeMarkup(cellPos, cellNode.type, {\n ...cellNode.attrs,\n colwidth: colWidth,\n });\n }\n });\n });\n }\n\n if (containerWidth !== table.node.attrs.width || colpercents) {\n tr.setNodeMarkup(table.pos, schema.nodes.table, {\n ...table.node.attrs,\n width: containerWidth,\n colpercents: null,\n });\n }\n }\n return tr;\n };\n}\n","/*\n * table-capsule.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, DOMParser } from 'prosemirror-model';\n\nimport {\n PandocBlockCapsuleFilter,\n PandocBlockCapsule,\n blockCapsuleParagraphTokenHandler,\n encodedBlockCapsuleRegex,\n blockCapsuleTextHandler,\n blockCapsuleSourceWithoutPrefix,\n parsePandocBlockCapsule,\n} from '../../api/pandoc_capsule';\nimport { ProsemirrorWriter, PandocToken, PandocTokenType } from '../../api/pandoc';\nimport { kHTMLFormat } from '../../api/raw';\n\nexport function tableBlockCapsuleFilter(): PandocBlockCapsuleFilter {\n const kTableBlockCapsuleType = '8EF5A772-DD63-4622-84BF-AF1995A1B2B9'.toLowerCase();\n const pagraphTokenCapsuleHandler = blockCapsuleParagraphTokenHandler(kTableBlockCapsuleType);\n const tokenRegex = encodedBlockCapsuleRegex('^', '$');\n\n return {\n type: kTableBlockCapsuleType,\n\n match: /^([\\t >]*)(<table[\\W\\w]*?<\\/table>)([ \\t]*)$/gm,\n\n // textually enclose the capsule so that pandoc parses it as the type of block we want it to\n // (in this case we don't do anything because pandoc would have written this table as a\n // semantically standalone block)\n enclose: (capsuleText: string, capsule: PandocBlockCapsule) => {\n return capsuleText;\n },\n\n // look for one of our block capsules within pandoc ast text (e.g. a code or raw block)\n // and if we find it, parse and return the original source code\n handleText: blockCapsuleTextHandler(kTableBlockCapsuleType, encodedBlockCapsuleRegex(undefined, undefined, 'gm')),\n\n // we are looking for a paragraph token consisting entirely of a block capsule of our type.\n // if find that then return the block capsule text\n handleToken: (tok: PandocToken) => {\n // first check for a paragraph\n const capsuleText = pagraphTokenCapsuleHandler(tok);\n if (capsuleText) {\n return capsuleText;\n }\n\n // now look for a definition list (which is what a table with a caption parses as)\n if (tok.t === PandocTokenType.DefinitionList) {\n if (tok.c.length === 1) {\n const definition = tok.c[0];\n if (definition[0][0].t === PandocTokenType.Str) {\n const term = definition[0][0].c as string;\n const match = term.match(tokenRegex);\n if (match) {\n const capsuleRecord = parsePandocBlockCapsule(term);\n if (capsuleRecord.type === kTableBlockCapsuleType) {\n return term;\n }\n }\n }\n }\n }\n\n return null;\n },\n\n // write the node as a table (parse the html)\n writeNode: (schema: Schema, writer: ProsemirrorWriter, capsule: PandocBlockCapsule) => {\n // remove the source prefix\n const source = blockCapsuleSourceWithoutPrefix(capsule.source, capsule.prefix);\n\n // fallback to write as raw html\n const writeAsRawHTML = () => {\n writer.openNode(schema.nodes.raw_block, { format: kHTMLFormat });\n writer.writeText(source);\n writer.closeNode();\n };\n\n // parse the table from the string\n const parser = new window.DOMParser();\n const doc = parser.parseFromString(capsule.source, 'text/html');\n if (doc.body && doc.body.firstChild instanceof HTMLTableElement) {\n // get prosemirror dom parser\n const prosemirrorDomParser = DOMParser.fromSchema(schema);\n\n // get unparsed (by prosemirror) table\n const unparsedTable = doc.body.firstChild;\n\n // ensure that table cells all have content\n const ensureCellContent = (tag: string) => {\n const cells = unparsedTable.getElementsByTagName(tag);\n for (let i = 0; i < cells.length; i++) {\n const cell = cells.item(i)!;\n if (cell.children.length === 0) {\n cell.append(window.document.createElement('p'));\n }\n }\n };\n ensureCellContent('td');\n ensureCellContent('th');\n\n // extract caption element\n let captionElement: HTMLTableCaptionElement | null = null;\n const captionCollection = unparsedTable.getElementsByTagName('caption');\n if (captionCollection.length) {\n captionElement = captionCollection.item(0);\n if (captionElement) {\n captionElement.remove();\n }\n }\n\n // determine caption (either empty or parsed from element)\n let caption = schema.nodes.table_caption.create({ inactive: true });\n if (captionElement) {\n const captionSlice = prosemirrorDomParser.parseSlice(captionElement);\n caption = schema.nodes.table_caption.createAndFill({ inactive: false }, captionSlice.content)!;\n }\n\n // parse the prosemirror table element\n const slice = prosemirrorDomParser.parseSlice(doc.body);\n if (slice.content.firstChild && slice.content.firstChild.type === schema.nodes.table) {\n const table = slice.content.firstChild;\n writer.addNode(schema.nodes.table_container, {}, [table, caption]);\n } else {\n writeAsRawHTML();\n }\n\n // fallback to writing as raw_html (round-trip unmodified)\n } else {\n writeAsRawHTML();\n }\n },\n };\n}\n","/*\n * table-contextmenu.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Plugin, PluginKey, Transaction, EditorState } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { Schema } from 'prosemirror-model';\nimport { isInTable } from 'prosemirror-tables';\n\nimport { EditorUI } from '../../api/ui';\nimport { EditorCommandId } from '../../api/command';\n\nexport class TableContextMenuPlugin extends Plugin {\n private menuVisible = false;\n\n constructor(_schema: Schema, ui: EditorUI) {\n super({\n key: new PluginKey('table-contextmenu'),\n\n props: {\n handleDOMEvents: {\n contextmenu: (view: EditorView, event: Event) => {\n // only trigger when in table\n if (!isInTable(view.state)) {\n return false;\n }\n\n const asyncShowTableContextMenu = async () => {\n const menu = [\n { command: EditorCommandId.TableAddRowBefore },\n { command: EditorCommandId.TableAddRowAfter },\n { separator: true },\n { command: EditorCommandId.TableAddColumnBefore },\n { command: EditorCommandId.TableAddColumnAfter },\n { separator: true },\n { command: EditorCommandId.TableDeleteRow },\n { command: EditorCommandId.TableDeleteColumn },\n { separator: true },\n { command: EditorCommandId.TableDeleteTable },\n { separator: true },\n {\n text: ui.context.translateText('Align Column'),\n subMenu: {\n items: [\n { command: EditorCommandId.TableAlignColumnLeft },\n { command: EditorCommandId.TableAlignColumnCenter },\n { command: EditorCommandId.TableAlignColumnRight },\n { separator: true },\n { command: EditorCommandId.TableAlignColumnDefault },\n ],\n },\n },\n { separator: true },\n { command: EditorCommandId.TableToggleHeader },\n { command: EditorCommandId.TableToggleCaption },\n ];\n\n const { clientX, clientY } = event as MouseEvent;\n await ui.display.showContextMenu!(menu, clientX, clientY);\n this.menuVisible = false;\n };\n\n if (ui.display.showContextMenu) {\n this.menuVisible = true;\n asyncShowTableContextMenu();\n event.stopPropagation();\n event.preventDefault();\n return true;\n } else {\n return false;\n }\n },\n },\n },\n\n // prevent selection while the context menu is visible (the right-click\n // that invokes the context menu ends up resetting the selection, which\n // makes the selection-based commands behave incorrectly when multiple\n // rows or columns are selected)\n filterTransaction: (tr: Transaction, state: EditorState) => {\n if (this.menuVisible && isInTable(state)) {\n return !(tr.selectionSet && !tr.docChanged && !tr.storedMarksSet);\n } else {\n return true;\n }\n },\n });\n }\n}\n","/*\n * table-paste.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Plugin, PluginKey, Transaction, EditorState } from 'prosemirror-state';\nimport { Slice, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorView } from 'prosemirror-view';\n\nimport { sliceHasNode } from '../../api/slice';\n\nimport { fixupTableWidths } from './table-columns';\nimport { forChangedNodes } from '../../api/transaction';\n\nimport { kDefaultCellClasses } from './table-nodes';\n\nexport function tablePaste() {\n return new Plugin({\n key: new PluginKey('table-paste'),\n props: {\n handlePaste: (view: EditorView, _event: Event, slice: Slice) => {\n // if the slice contains a table then we handle it\n if (sliceHasNode(slice, node => node.type === node.type.schema.nodes.table)) {\n // based on https://github.com/ProseMirror/prosemirror-view/blob/fb799aae4e9dd5cfc256708a6845d76aaaf145bf/src/input.js#L503-L510\n const tr = view.state.tr.replaceSelection(slice);\n view.dispatch(\n tr\n .scrollIntoView()\n .setMeta('paste', true)\n .setMeta('tablePaste', true)\n .setMeta('uiEvent', 'paste'),\n );\n view.dispatch(fixupTableWidths(view)(view.state.tr));\n return true;\n } else {\n return false;\n }\n },\n },\n appendTransaction: (transactions: Transaction[], oldState: EditorState, newState: EditorState) => {\n // alias schema\n const schema = newState.schema;\n\n // only process table paste transactions\n if (!transactions.some(transaction => transaction.getMeta('tablePaste'))) {\n return null;\n }\n\n // cleanup table by converting the first row to header cells, ensuring that column alignments\n // are derived from the alignment of the first row, and applying the standard cell class names\n const tr = newState.tr;\n forChangedNodes(\n oldState,\n newState,\n node => node.type === node.type.schema.nodes.table,\n (node, pos) => {\n let firstRow: ProsemirrorNode;\n let currentColumn = 0;\n const columnAlignments: string[] = [];\n\n node.descendants((childNode, childPos, parent) => {\n // if this is a row then reset the current column to 0\n if (childNode.type === schema.nodes.table_row) {\n currentColumn = 0;\n }\n\n // first thing we will encounter in traveral is the first row, note that and move along to cells\n if (!firstRow) {\n // note first row\n firstRow = childNode;\n\n // children of the first row are the headers\n } else if (parent === firstRow) {\n // collect alignment (will be applied below to cells in this column)\n columnAlignments.push(childNode.attrs.align);\n\n // convert to a table header w/ default class\n const headerPos = pos + 1 + childPos;\n tr.setNodeMarkup(headerPos, schema.nodes.table_header, {\n ...childNode.attrs,\n className: kDefaultCellClasses,\n });\n\n // normal cell - apply the requisite alignment and give it the default class\n } else if (childNode.type === schema.nodes.table_cell) {\n // determine alignment\n const align = columnAlignments[currentColumn] || null;\n\n // apply markup\n const cellPos = pos + 1 + childPos;\n tr.setNodeMarkup(cellPos, schema.nodes.table_cell, {\n ...childNode.attrs,\n align,\n className: kDefaultCellClasses,\n });\n }\n\n // if this is a cell then advance the current column\n if (childNode.type === schema.nodes.table_header || childNode.type === schema.nodes.table_cell) {\n currentColumn++;\n }\n });\n },\n );\n\n if (tr.docChanged) {\n return tr;\n }\n },\n });\n}\n","/*\n * definition_list.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, DOMOutputSpec } from 'prosemirror-model';\n\nimport { PandocTokenType } from '../../api/pandoc';\nimport { ExtensionContext } from '../../api/extension';\nimport { BaseKey } from '../../api/basekeys';\n\nimport { InsertDefinitionList, InsertDefinitionDescription, InsertDefinitionTerm } from './definition_list-commands';\n\nimport {\n definitionListEnter,\n definitionListBackspace,\n definitionListTab,\n definitionListShiftTab,\n} from './definition-list-keys';\n\nimport { definitionInputRule } from './definition_list-inputrule';\n\nimport { insertDefinitionListAppendTransaction } from './definition_list-insert';\nimport {\n readPandocDefinitionList,\n writePandocDefinitionList,\n writePandocDefinitionListTerm,\n writePandocDefinitionListDescription,\n} from './definition_list-pandoc';\n\nimport './definition_list-styles.css';\nimport { emptyNodePlaceholderPlugin } from '../../api/placeholder';\n\nconst extension = (context: ExtensionContext) => {\n const { pandocExtensions, ui } = context;\n\n if (!pandocExtensions.definition_lists) {\n return null;\n }\n\n return {\n nodes: [\n {\n name: 'definition_list_term',\n spec: {\n content: 'inline*',\n isolating: true,\n parseDOM: [{ tag: 'dt' }],\n toDOM(): DOMOutputSpec {\n return ['dt', { class: 'pm-definition-term' }, 0];\n },\n },\n pandoc: {\n writer: writePandocDefinitionListTerm,\n },\n },\n {\n name: 'definition_list_description',\n spec: {\n content: 'block+',\n parseDOM: [{ tag: 'dd' }],\n toDOM(): DOMOutputSpec {\n return ['dd', { class: 'pm-definition-description pm-block-border-color pm-margin-bordered' }, 0];\n },\n },\n pandoc: {\n writer: writePandocDefinitionListDescription,\n },\n },\n {\n name: 'definition_list',\n spec: {\n content: '(definition_list_term definition_list_description*)+',\n group: 'block',\n defining: true,\n parseDOM: [{ tag: 'dl' }],\n toDOM(): DOMOutputSpec {\n return ['dl', { class: 'pm-definition-list' }, 0];\n },\n },\n pandoc: {\n readers: [\n {\n token: PandocTokenType.DefinitionList,\n handler: readPandocDefinitionList,\n },\n ],\n\n writer: writePandocDefinitionList,\n },\n },\n ],\n\n commands: (schema: Schema) => {\n return [\n new InsertDefinitionList(ui),\n new InsertDefinitionTerm(schema, ui),\n new InsertDefinitionDescription(schema),\n ];\n },\n\n baseKeys: (_schema: Schema) => {\n return [\n { key: BaseKey.Enter, command: definitionListEnter() },\n { key: BaseKey.Backspace, command: definitionListBackspace() },\n { key: BaseKey.Tab, command: definitionListTab() },\n { key: BaseKey.ShiftTab, command: definitionListShiftTab() },\n ];\n },\n\n inputRules: (_schema: Schema) => {\n return [definitionInputRule()];\n },\n\n appendTransaction: (_schema: Schema) => {\n return [insertDefinitionListAppendTransaction()];\n },\n\n plugins: (schema: Schema) => {\n return [emptyNodePlaceholderPlugin(schema.nodes.definition_list_term, () => ui.context.translateText('Term'))];\n },\n };\n};\n\nexport default extension;\n","/*\n * definition_list-commands.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { Schema, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorState, Transaction, TextSelection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { findParentNodeOfType, setTextSelection } from 'prosemirror-utils';\n\nimport { canInsertNode } from '../../api/node';\nimport { insertDefinitionList } from './definition_list-insert';\nimport { EditorUI } from '../../api/ui';\nimport { OmniInsertGroup } from '../../api/omni_insert';\n\nexport class InsertDefinitionList extends ProsemirrorCommand {\n constructor(ui: EditorUI) {\n super(\n EditorCommandId.DefinitionList,\n [],\n (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n const schema = state.schema;\n\n if (\n findParentNodeOfType(schema.nodes.definition_list)(state.selection) ||\n !canInsertNode(state, schema.nodes.definition_list)\n ) {\n return false;\n }\n\n // new definition list\n if (dispatch) {\n const tr = state.tr;\n\n // create new list\n const termText = insertTermText(ui);\n const term = schema.text(termText);\n insertDefinitionList(tr, [\n schema.nodes.definition_list_term.createAndFill({}, term),\n createDefinitionDescription(schema),\n ]);\n const start = state.selection.from;\n tr.setSelection(TextSelection.create(tr.doc, start, start + termText.length + 1)).scrollIntoView();\n dispatch(tr);\n }\n return true;\n },\n // omni insert\n {\n name: ui.context.translateText('Definition List'),\n description: ui.context.translateText('List with a definition for each item'),\n group: OmniInsertGroup.Lists,\n priority: 3,\n image: () =>\n ui.prefs.darkMode() ? ui.images.omni_insert?.definition_list_dark! : ui.images.omni_insert?.definition_list!,\n },\n );\n }\n}\n\nclass InsertDefinitionListItemCommand extends ProsemirrorCommand {\n constructor(id: EditorCommandId, createFn: () => ProsemirrorNode) {\n super(id, [], (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n const schema = state.schema;\n\n if (!findParentNodeOfType(schema.nodes.definition_list)(state.selection)) {\n return false;\n }\n\n if (dispatch) {\n const tr = state.tr;\n const dlTypes = [schema.nodes.definition_list_term, schema.nodes.definition_list_description];\n const parent = findParentNodeOfType(dlTypes)(state.selection)!;\n const insertPos = parent.pos + parent.node.nodeSize;\n const insertNode = createFn();\n tr.insert(insertPos, insertNode);\n if (insertNode.textContent.length > 1) {\n tr.setSelection(TextSelection.create(tr.doc, insertPos, insertPos + insertNode.textContent.length + 1));\n } else {\n setTextSelection(insertPos, 1)(tr);\n }\n tr.scrollIntoView();\n\n dispatch(tr);\n }\n\n return true;\n });\n }\n}\n\nexport class InsertDefinitionTerm extends InsertDefinitionListItemCommand {\n constructor(schema: Schema, ui: EditorUI) {\n super(EditorCommandId.DefinitionTerm, () => {\n const term = schema.text(insertTermText(ui));\n return schema.nodes.definition_list_term.createAndFill({}, term)!;\n });\n }\n}\n\nexport class InsertDefinitionDescription extends InsertDefinitionListItemCommand {\n constructor(schema: Schema) {\n super(EditorCommandId.DefinitionDescription, () => {\n return createDefinitionDescription(schema);\n });\n }\n}\n\nfunction insertTermText(ui: EditorUI) {\n return ui.context.translateText('term');\n}\n\nfunction createDefinitionDescription(schema: Schema) {\n return schema.nodes.definition_list_description.createAndFill({}, schema.nodes.paragraph.create())!;\n}\n","/*\n * definition_list-insert.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { Transaction } from 'prosemirror-state';\nimport { setTextSelection } from 'prosemirror-utils';\nimport { findChildrenByType } from 'prosemirror-utils';\nimport { trTransform } from '../../api/transaction';\nimport { Transform } from 'prosemirror-transform';\n\nexport function insertDefinitionList(tr: Transaction, items: ProsemirrorNode[]) {\n const schema = items[0].type.schema;\n const definitionList = schema.nodes.definition_list.createAndFill({}, items)!;\n const prevCursor = tr.selection.to;\n tr.replaceSelectionWith(definitionList);\n setTextSelection(tr.mapping.map(prevCursor) - 1, -1)(tr).scrollIntoView();\n return tr;\n}\n\nexport function insertDefinitionListAppendTransaction() {\n return {\n name: 'definition-list-join',\n nodeFilter: (node: ProsemirrorNode) => node.type === node.type.schema.nodes.definition_list,\n append: (tr: Transaction) => {\n // if a transaction creates 2 adjacent definition lists then join them\n trTransform(tr, joinDefinitionListsTransform);\n },\n };\n}\n\nfunction joinDefinitionListsTransform(tr: Transform) {\n const nodeType = tr.doc.type.schema.nodes.definition_list;\n const lists = findChildrenByType(tr.doc, nodeType, true);\n for (const list of lists) {\n // NOTE: no mapping (checking for deletion + getting the updated\n // position) is required here because we only ever do one transform\n // (see return after tr.join below)\n const listPos = tr.doc.resolve(list.pos + 1);\n const listIndex = listPos.index(listPos.depth - 1);\n const listParent = listPos.node(listPos.depth - 1);\n if (listIndex + 1 < listParent.childCount) {\n const nextNode = listParent.child(listIndex + 1);\n if (nextNode.type === nodeType) {\n tr.join(list.pos + list.node.nodeSize);\n return;\n }\n }\n }\n}\n","/*\n * definition_list-keys.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction, TextSelection } from 'prosemirror-state';\nimport {\n findParentNodeOfType,\n findParentNodeOfTypeClosestToPos,\n setTextSelection,\n hasParentNodeOfType,\n ContentNodeWithPos,\n} from 'prosemirror-utils';\n\nimport { isLastChild, isOnlyChild } from '../../api/position';\n\nexport function definitionListEnter() {\n return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n // process if we are within a definition list\n const schema = state.schema;\n const parentDL = findParentNodeOfType(schema.nodes.definition_list)(state.selection);\n if (!parentDL) {\n return false;\n }\n\n // handle only empty selections\n if (!state.selection.empty) {\n return false;\n }\n\n // handle enter in either a term or definition\n const parentTerm = findParentNodeOfType(schema.nodes.definition_list_term)(state.selection);\n if (parentTerm) {\n return termEnter(parentTerm, state, dispatch);\n\n // enter in trailing empty description paragraph (append a term)\n } else if (isTrailingEmptyParagraph(state)) {\n if (dispatch) {\n endOfDescriptionEnter(state, dispatch);\n }\n return true;\n } else {\n return false;\n }\n };\n}\n\nexport function definitionListBackspace() {\n return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n // process if we are within a definition item\n const schema = state.schema;\n const dlTypes = [schema.nodes.definition_list_term, schema.nodes.definition_list_description];\n const parentTerm = findParentNodeOfType(dlTypes)(state.selection);\n if (!parentTerm) {\n return false;\n }\n\n if (parentTerm.node.type === schema.nodes.definition_list_term) {\n // if it's empty\n if (parentTerm.node.childCount === 0) {\n if (dispatch) {\n emptyTermBackspace(state, dispatch);\n }\n return true;\n }\n } else {\n // if the enclosing description is empty then delete it\n if (parentTerm.node.textContent.length === 0) {\n if (dispatch) {\n emptyDescriptionBackspace(parentTerm, state, dispatch);\n }\n\n return true;\n }\n }\n\n return false;\n };\n}\n\nexport function definitionListTab() {\n return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n // process if we are within a definition_term\n const schema = state.schema;\n const dlTypes = [schema.nodes.definition_list_term, schema.nodes.definition_list_description];\n const parentTerm = findParentNodeOfType(dlTypes)(state.selection);\n if (!parentTerm) {\n return false;\n }\n\n // advance past node\n if (dispatch) {\n const tr = state.tr;\n const advancePos = parentTerm.pos + parentTerm.node.nodeSize;\n setTextSelection(advancePos, 1)(tr).scrollIntoView();\n dispatch(tr);\n }\n\n return true;\n };\n}\n\nexport function definitionListShiftTab() {\n return (state: EditorState, dispatch?: (tr: Transaction) => void) => {\n // process if we are within a definition_term\n const schema = state.schema;\n const dlTypes = [schema.nodes.definition_list_term, schema.nodes.definition_list_description];\n const parentTerm = findParentNodeOfType(dlTypes)(state.selection);\n if (!parentTerm) {\n return false;\n }\n\n if (dispatch) {\n const tr = state.tr;\n const backwardPos = state.doc.resolve(parentTerm.pos - 1);\n const prevNode = findParentNodeOfTypeClosestToPos(backwardPos, dlTypes);\n if (prevNode) {\n setTextSelection(prevNode.start, 1)(tr).scrollIntoView();\n } else {\n const listNode = findParentNodeOfType(schema.nodes.definition_list)(tr.selection)!;\n setTextSelection(listNode.pos, -1)(tr).scrollIntoView();\n }\n\n dispatch(tr);\n }\n\n return true;\n };\n}\n\nfunction termEnter(term: ContentNodeWithPos, state: EditorState, dispatch?: (tr: Transaction) => void) {\n const schema = state.schema;\n const $head = state.selection.$head;\n\n // only handle empty selections\n if (!state.selection.empty) {\n return false;\n }\n\n // if we are empty then it's an exit (delete the term)\n const isEmpty = term.node.textContent.length === 0;\n if (isEmpty) {\n if (dispatch) {\n const tr = state.tr;\n tr.deleteRange(term.pos, term.pos + term.node.nodeSize);\n tr.replaceSelectionWith(schema.nodes.paragraph.create());\n setTextSelection(tr.mapping.map(state.selection.from), 1)(tr);\n dispatch(tr);\n }\n return true;\n\n // variable handling for non-empty\n } else {\n // selection at the beginning means insert another term above\n if ($head.parentOffset === 0) {\n if (dispatch) {\n const tr = state.tr;\n const insertPos = tr.selection.$head.before($head.depth);\n tr.insert(insertPos, schema.nodes.definition_list_term.create());\n dispatch(tr);\n }\n return true;\n\n // selection at the end means insert a description below\n } else if ($head.parentOffset === term.node.textContent.length) {\n if (dispatch) {\n const tr = state.tr;\n const insertPos = tr.selection.$head.after($head.depth);\n tr.insert(\n insertPos,\n schema.nodes.definition_list_description.createAndFill({}, schema.nodes.paragraph.create())!,\n );\n setTextSelection(insertPos, 1)(tr).scrollIntoView();\n dispatch(tr);\n }\n return true;\n }\n }\n\n return false;\n}\n\nfunction emptyTermBackspace(state: EditorState, dispatch: (tr: Transaction) => void) {\n const { $head } = state.selection;\n const tr = state.tr;\n // if it's the only child then delete the entire list\n if (isOnlyChild($head)) {\n const start = $head.start($head.depth - 1) - 1;\n tr.deleteRange(start, start + $head.node($head.depth - 1).nodeSize);\n } else {\n const start = $head.start($head.depth) - 1;\n tr.deleteRange(start, start + $head.node($head.depth).nodeSize);\n }\n dispatch(tr);\n}\n\nfunction endOfDescriptionEnter(state: EditorState, dispatch: (tr: Transaction) => void) {\n const schema = state.schema;\n const { $head } = state.selection;\n const selectionNode = $head.node($head.depth);\n\n const tr = state.tr;\n\n // if the parent description is empty then delete it\n let start = null;\n const descriptionNode = $head.node($head.depth - 1);\n if (descriptionNode.textContent.trim().length === 0) {\n start = $head.start($head.depth - 1) - 1;\n tr.deleteRange(start, start + descriptionNode.nodeSize);\n\n // only if at very end\n if (isLastChild($head, 2)) {\n const insertPos = tr.mapping.map($head.after($head.depth - 2));\n tr.insert(insertPos, schema.nodes.paragraph.create());\n setTextSelection(insertPos, 1)(tr).scrollIntoView();\n }\n\n // otherwise just delete the paragraph and insert a term\n } else {\n start = $head.start($head.depth) - 1;\n tr.deleteRange(start, start + selectionNode.nodeSize);\n start = tr.mapping.map(start);\n tr.insert(start + 1, schema.nodes.definition_list_term.create());\n setTextSelection(start, 1)(tr).scrollIntoView();\n }\n\n dispatch(tr);\n}\n\nfunction emptyDescriptionBackspace(\n description: ContentNodeWithPos,\n state: EditorState,\n dispatch: (tr: Transaction) => void,\n) {\n const tr = state.tr;\n tr.deleteRange(description.pos, description.pos + description.node.nodeSize);\n dispatch(tr);\n}\n\nfunction isTrailingEmptyParagraph(state: EditorState) {\n const { $head } = state.selection;\n const selectionNode = $head.node($head.depth);\n const isParagraph = selectionNode.type === state.schema.nodes.paragraph;\n const isEmpty = selectionNode.textContent.trim().length === 0;\n return isParagraph && isEmpty && isLastChild($head);\n}\n\n// eslint-disable-next-line\nfunction selectionCrossesListBoundary(state: EditorState) {\n const { $head, $anchor } = state.selection;\n const headInDL = hasParentNodeOfType(state.schema.nodes.definition_list)(TextSelection.near($head));\n const anchorInDL = hasParentNodeOfType(state.schema.nodes.definition_list)(TextSelection.near($anchor));\n return headInDL !== anchorInDL;\n}\n","/*\n * definition_list-inputrule.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { InputRule } from 'prosemirror-inputrules';\nimport { EditorState } from 'prosemirror-state';\nimport { setTextSelection, findParentNodeOfTypeClosestToPos } from 'prosemirror-utils';\n\nimport { insertDefinitionList } from './definition_list-insert';\n\nexport function definitionInputRule() {\n return new InputRule(/^:[ ]+$/, (state: EditorState, match: string[], start: number, end: number) => {\n const schema = state.schema;\n\n // if we are inside a definiition list description this means start a new description\n const { $head } = state.selection;\n const container = $head.node($head.depth - 1);\n const parent = $head.node($head.depth);\n\n // must be just ': '\n if (parent.textContent.trim() !== ':') {\n return null;\n }\n\n // check for : within a definition list description\n if (container.type === schema.nodes.definition_list_description && parent.type === schema.nodes.paragraph) {\n const tr = state.tr;\n const startPos = $head.start($head.depth) - 1;\n tr.deleteRange(startPos, startPos + $head.node($head.depth).nodeSize);\n const insertPos = tr.mapping.map(startPos) + 1;\n tr.insert(\n insertPos,\n schema.nodes.definition_list_description.createAndFill({}, schema.nodes.paragraph.create())!,\n );\n setTextSelection(insertPos, 1)(tr).scrollIntoView();\n return tr;\n\n // check for : in a paragraph immediately after another paragraph\n } else if (container.type !== schema.nodes.definition_list_description && isParagraphAfterParagraph(state)) {\n const prevPara = findParentNodeOfTypeClosestToPos(state.doc.resolve(start - 2), schema.nodes.paragraph);\n if (prevPara) {\n const tr = state.tr;\n tr.deleteRange(prevPara.start, end);\n insertDefinitionList(tr, [\n schema.nodes.definition_list_term.createAndFill({}, prevPara.node.content)!,\n schema.nodes.definition_list_description.createAndFill({}, schema.nodes.paragraph.create())!,\n ]);\n return tr;\n } else {\n return null;\n }\n } else {\n return null;\n }\n });\n}\n\nfunction isParagraphAfterParagraph(state: EditorState) {\n const schema = state.schema;\n const { $head } = state.selection;\n\n // check if the selection is in a paragraph\n const selectionInParagraph = $head.node($head.depth).type === schema.nodes.paragraph;\n if (!selectionInParagraph) {\n return false;\n }\n\n // check if the previous node is a paragraph\n const parent = $head.node($head.depth - 1);\n const parentIndex = $head.index($head.depth - 1);\n return parentIndex > 0 && parent.child(parentIndex - 1).type === schema.nodes.paragraph;\n}\n","/*\n * position.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { ResolvedPos } from 'prosemirror-model';\n\nexport function isOnlyChild(pos: ResolvedPos, depthOffset = 1) {\n return pos.node(pos.depth - depthOffset).childCount === 1;\n}\n\nexport function isLastChild(pos: ResolvedPos, depthOffset = 1) {\n return pos.index(pos.depth - depthOffset) === pos.node(pos.depth - depthOffset).childCount - 1;\n}\n","/*\n * definition_list-pandoc.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { ProsemirrorWriter, PandocToken, PandocOutput, PandocTokenType } from '../../api/pandoc';\n\nexport function readPandocDefinitionList(schema: Schema) {\n return (writer: ProsemirrorWriter, tok: PandocToken) => {\n writer.openNode(schema.nodes.definition_list, {});\n\n const definitions = tok.c;\n definitions.forEach((definition: [PandocToken[], PandocToken[][]]) => {\n const term = definition[0];\n writer.openNode(schema.nodes.definition_list_term, {});\n writer.writeTokens(term);\n writer.closeNode();\n\n const descriptions = definition[1];\n descriptions.forEach(description => {\n writer.openNode(schema.nodes.definition_list_description, {});\n writer.writeTokens(description);\n writer.closeNode();\n });\n });\n writer.closeNode();\n };\n}\n\nexport function writePandocDefinitionList(output: PandocOutput, node: ProsemirrorNode) {\n output.writeToken(PandocTokenType.DefinitionList, () => {\n // collect terms and descriptions\n const currentDefinition: {\n term?: ProsemirrorNode;\n descriptions: ProsemirrorNode[];\n } = { descriptions: new Array<ProsemirrorNode>() };\n\n // functions to manipulate current definition\n function writeCurrent() {\n if (currentDefinition.term) {\n output.writeArray(() => {\n output.writeNode(currentDefinition.term!);\n output.writeArray(() => {\n currentDefinition.descriptions.forEach(description => {\n output.writeNode(description);\n });\n });\n });\n }\n }\n\n // write the list\n node.forEach(child => {\n if (child.type === child.type.schema.nodes.definition_list_term) {\n writeCurrent();\n currentDefinition.term = child;\n currentDefinition.descriptions = [];\n } else {\n currentDefinition.descriptions.push(child);\n }\n });\n writeCurrent();\n });\n}\n\nexport function writePandocDefinitionListTerm(output: PandocOutput, node: ProsemirrorNode) {\n output.writeArray(() => {\n output.writeInlines(node.content);\n });\n}\n\nexport function writePandocDefinitionListDescription(output: PandocOutput, node: ProsemirrorNode) {\n output.writeArray(() => {\n output.writeNodes(node);\n });\n}\n","/*\n * shortcode_block.ts\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\nimport { EditorState, Transaction } from 'prosemirror-state';\n\nimport { setTextSelection } from 'prosemirror-utils';\n\nimport { PandocOutput, PandocTokenType, PandocToken, stringifyTokens, ProsemirrorWriter } from '../api/pandoc';\n\nimport { kHugoDocType, kQuartoDocType } from '../api/format';\n\nimport { Extension, ExtensionContext } from '../api/extension';\nimport { codeNodeSpec } from '../api/code';\nimport { ProsemirrorCommand, EditorCommandId } from '../api/command';\nimport { canInsertNode } from '../api/node';\nimport { kShortcodeRegEx } from '../api/shortcode';\nimport {\n PandocBlockCapsuleFilter,\n blockCapsuleParagraphTokenHandler,\n encodedBlockCapsuleRegex,\n PandocBlockCapsule,\n blockCapsuleTextHandler,\n blockCapsuleSourceWithoutPrefix,\n} from '../api/pandoc_capsule';\n\nconst extension = (context: ExtensionContext): Extension | null => {\n const { format } = context;\n\n // return null if no shortcodes\n if (!format.hugoExtensions.shortcodes) {\n return null;\n }\n\n return {\n nodes: [\n {\n name: 'shortcode_block',\n\n spec: {\n ...codeNodeSpec(),\n attrs: {},\n parseDOM: [\n {\n tag: \"div[class*='shortcode-block']\",\n preserveWhitespace: 'full',\n },\n ],\n toDOM(node: ProsemirrorNode) {\n return ['div', { class: 'shortcode-block pm-fixedwidth-font pm-code-block pm-markup-text-color' }, 0];\n },\n },\n\n code_view: {\n lang: () => 'text',\n borderColorClass: 'pm-raw-block-border',\n },\n\n attr_edit: () => ({\n type: (schema: Schema) => schema.nodes.shortcode_block,\n tags: () => ['shortcode'],\n editFn: () => () => false,\n }),\n\n pandoc: {\n // unroll shortcode from paragraph with single shortcode\n blockReader: (schema: Schema, tok: PandocToken, writer: ProsemirrorWriter) => {\n if (isParaWrappingShortcode(tok)) {\n const text = stringifyTokens(tok.c);\n writer.addNode(schema.nodes.shortcode_block, {}, [schema.text(text)]);\n return true;\n } else {\n return false;\n }\n },\n\n // capture shortcuts w/ begin/end tags\n blockCapsuleFilter: shortcodeBlockCapsuleFilter(),\n\n writer: (output: PandocOutput, node: ProsemirrorNode) => {\n output.writeToken(PandocTokenType.Para, () => {\n output.writeRawMarkdown(node.content);\n });\n },\n },\n },\n ],\n\n commands: (schema: Schema) => {\n // only create command for hugo anq quarto doc types\n if (!format.docTypes.includes(kHugoDocType) && \n !format.docTypes.includes(kQuartoDocType)) {\n return [];\n }\n\n return [\n new ProsemirrorCommand(\n EditorCommandId.Shortcode,\n [],\n (state: EditorState, dispatch?: (tr: Transaction<any>) => void) => {\n // enable/disable command\n if (!canInsertNode(state, schema.nodes.shortcode_block)) {\n return false;\n }\n if (dispatch) {\n const tr = state.tr;\n const shortcode = '{{< >}}';\n const shortcodeNode = schema.nodes.shortcode_block.create({}, schema.text(shortcode));\n tr.replaceSelectionWith(shortcodeNode);\n setTextSelection(tr.mapping.map(state.selection.from) - shortcode.length / 2 - 1)(tr);\n dispatch(tr);\n }\n return true;\n },\n ),\n ];\n },\n };\n};\n\nfunction isParaWrappingShortcode(tok: PandocToken) {\n if (tok.t === PandocTokenType.Para) {\n // qualify that this paragraph has text that begins with {{< (so that\n // we don't end up scanning every token of every paragraph )\n const children: PandocToken[] = tok.c;\n if (tok.c.length > 1) {\n const [first, second] = tok.c;\n const firstText = first.t === PandocTokenType.Str ? first.c : second.c;\n if (typeof firstText === 'string' && firstText.startsWith('{{<')) {\n const text = stringifyTokens(children);\n return !!text.match(kShortcodeRegEx);\n }\n }\n }\n return false;\n}\n\nexport function shortcodeBlockCapsuleFilter(): PandocBlockCapsuleFilter {\n const kShortcodeBlockCapsuleType = 'B65B58FD-D707-4C30-8C97-3D99ACF9A157'.toLowerCase();\n\n return {\n type: kShortcodeBlockCapsuleType,\n\n // eslint-disable-next-line no-useless-escape\n match: /^([\\t >]*)(\\{\\{<\\s+([^\\/][^\\t ]+).*?>\\}\\}[ \\t]*\\n(?![ \\t]*\\n)[\\W\\w]*?\\n[\\t >]*\\{\\{<\\s+\\/\\3\\s+>\\}\\})([ \\t]*)$/gm,\n\n extract: (_match: string, p1: string, p2: string, _p3: string, p4: string) => {\n return {\n prefix: p1,\n source: p2,\n suffix: p4,\n };\n },\n\n // textually enclose the capsule so that pandoc parses it as the type of block we want it to\n // (in this case we don't do anything because pandoc would have written this table as a\n // semantically standalone block)\n enclose: (capsuleText: string, capsule: PandocBlockCapsule) => {\n return capsuleText;\n },\n\n // look for one of our block capsules within pandoc ast text (e.g. a code or raw block)\n // and if we find it, parse and return the original source code\n handleText: blockCapsuleTextHandler(\n kShortcodeBlockCapsuleType,\n encodedBlockCapsuleRegex(undefined, undefined, 'gm'),\n ),\n\n // we are looking for a paragraph token consisting entirely of a block capsule of our type.\n // if find that then return the block capsule text\n handleToken: blockCapsuleParagraphTokenHandler(kShortcodeBlockCapsuleType),\n\n // write the node\n writeNode: (schema: Schema, writer: ProsemirrorWriter, capsule: PandocBlockCapsule) => {\n // remove the source prefix\n const source = blockCapsuleSourceWithoutPrefix(capsule.source, capsule.prefix);\n\n // write the node\n writer.addNode(schema.nodes.shortcode_block, {}, [schema.text(source)]);\n },\n };\n}\n\nexport default extension;\n","/*\n * html_preserve.ts\n *\n * Copyright (C) 2019-20 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Node as ProsemirrorNode, Schema } from 'prosemirror-model';\n\nimport { PandocOutput, PandocTokenType, ProsemirrorWriter } from '../api/pandoc';\nimport { Extension, ExtensionContext } from '../api/extension';\nimport { codeNodeSpec } from '../api/code';\n\nimport {\n PandocBlockCapsuleFilter,\n blockCapsuleParagraphTokenHandler,\n encodedBlockCapsuleRegex,\n PandocBlockCapsule,\n blockCapsuleTextHandler,\n blockCapsuleSourceWithoutPrefix,\n} from '../api/pandoc_capsule';\n\nconst extension = (context: ExtensionContext): Extension | null => {\n const { format } = context;\n\n return {\n nodes: [\n {\n name: 'html_preserve',\n\n spec: {\n ...codeNodeSpec(),\n attrs: {},\n parseDOM: [\n {\n tag: \"div[class*='pm-html-preserve']\",\n preserveWhitespace: 'full',\n },\n ],\n toDOM(node: ProsemirrorNode) {\n return ['div', { class: 'pm-html-preserve pm-fixedwidth-font pm-code-block pm-markup-text-color' }, 0];\n },\n },\n\n code_view: {\n lang: () => 'html',\n borderColorClass: 'pm-raw-block-border',\n },\n\n attr_edit: () => ({\n type: (schema: Schema) => schema.nodes.html_preserve,\n tags: () => ['html_preserve'],\n editFn: () => () => false,\n }),\n\n pandoc: {\n // capture shortcuts w/ begin/end tags\n blockCapsuleFilter: htmlPreserveBlockCapsuleFilter(),\n\n writer: (output: PandocOutput, node: ProsemirrorNode) => {\n output.writeToken(PandocTokenType.Para, () => {\n output.writeRawMarkdown(node.content);\n });\n },\n },\n },\n ],\n };\n};\n\nexport function htmlPreserveBlockCapsuleFilter(): PandocBlockCapsuleFilter {\n const kHtmlPreserveBlockCapsuleType = '83CFCBF3-0429-4822-AAC6-D6F31591AEA8'.toLowerCase();\n\n return {\n type: kHtmlPreserveBlockCapsuleType,\n\n // eslint-disable-next-line no-useless-escape\n match: /^([\\t >]*)(<!--html_preserve-->[\\W\\w]*?<!--\\/html_preserve-->)([ \\t]*)$/gm,\n\n extract: (_match: string, p1: string, p2: string, p3: string) => {\n return {\n prefix: p1,\n source: p2,\n suffix: p3,\n };\n },\n\n // textually enclose the capsule so that pandoc parses it as the type of block we want it to\n // (in this case we don't do anything because pandoc would have written this as a\n // semantically standalone block)\n enclose: (capsuleText: string, capsule: PandocBlockCapsule) => {\n return capsuleText;\n },\n\n // look for one of our block capsules within pandoc ast text (e.g. a code or raw block)\n // and if we find it, parse and return the original source code\n handleText: blockCapsuleTextHandler(\n kHtmlPreserveBlockCapsuleType,\n encodedBlockCapsuleRegex(undefined, undefined, 'gm'),\n ),\n\n // we are looking for a paragraph token consisting entirely of a block capsule of our type.\n // if find that then return the block capsule text\n handleToken: blockCapsuleParagraphTokenHandler(kHtmlPreserveBlockCapsuleType),\n\n // write the node\n writeNode: (schema: Schema, writer: ProsemirrorWriter, capsule: PandocBlockCapsule) => {\n // remove the source prefix\n const source = blockCapsuleSourceWithoutPrefix(capsule.source, capsule.prefix);\n\n // write the node\n writer.addNode(schema.nodes.html_preserve, {}, [schema.text(source)]);\n },\n };\n}\n\nexport default extension;\n","/*\n * ace.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport {\n Plugin,\n PluginKey,\n TextSelection,\n EditorState,\n Transaction,\n Selection,\n NodeSelection,\n} from 'prosemirror-state';\n\nimport { Node as ProsemirrorNode } from 'prosemirror-model';\nimport { EditorView, NodeView, Decoration } from 'prosemirror-view';\nimport { undo, redo } from 'prosemirror-history';\nimport { exitCode } from 'prosemirror-commands';\nimport { keymap } from 'prosemirror-keymap';\nimport { undoInputRule } from 'prosemirror-inputrules';\nimport { GapCursor } from 'prosemirror-gapcursor';\n\nimport { CodeViewOptions, editingRootNode } from '../../api/node';\nimport { insertParagraph } from '../../api/paragraph';\nimport { EditorUI, ChunkEditor } from '../../api/ui';\nimport { EditorOptions } from '../../api/options';\nimport { EditorEvents } from '../../api/events';\nimport { ExtensionContext, ExtensionFn } from '../../api/extension';\nimport { DispatchEvent, ResizeEvent, ScrollEvent } from '../../api/event-types';\nimport { verticalArrowCanAdvanceWithinTextBlock } from '../../api/basekeys';\nimport { handleArrowToAdjacentNode } from '../../api/cursor';\n\nimport { selectAll } from '../../behaviors/select_all';\nimport { findPluginState } from '../../behaviors/find';\n\nimport { AceRenderQueue } from './ace-render-queue';\nimport { AcePlaceholder } from './ace-placeholder';\nimport { AceNodeViews } from './ace-node-views';\n\nimport zenscroll from 'zenscroll';\n\nimport './ace.css';\nimport { ProsemirrorCommand, EditorCommandId } from '../../api/command';\nimport { setTextSelection } from 'prosemirror-utils';\n\nconst plugin = new PluginKey('ace');\n\nexport function aceExtension(codeViews: { [key: string]: CodeViewOptions }): ExtensionFn {\n\n return (context: ExtensionContext) => {\n // shared services\n const aceRenderQueue = new AceRenderQueue(context.events);\n const aceNodeViews = new AceNodeViews();\n\n // build nodeViews\n const nodeTypes = Object.keys(codeViews);\n const nodeViews: {\n [name: string]: (node: ProsemirrorNode<any>, view: EditorView<any>, getPos: boolean | (() => number)) => NodeView;\n } = {};\n nodeTypes.forEach(name => {\n nodeViews[name] = (node: ProsemirrorNode, view: EditorView, getPos: boolean | (() => number)) => {\n return new AceNodeView(\n node,\n view,\n getPos as () => number,\n context,\n codeViews[name],\n aceRenderQueue,\n aceNodeViews,\n );\n };\n });\n\n const activeAceNodeViewCommand = (fn: (view: AceNodeView) => void) => {\n return (state: EditorState, dispatch?: (tr: Transaction) => void, view?: EditorView) => {\n const activeView = aceNodeViews.activeNodeView();\n if (!activeView) {\n return false;\n }\n if (dispatch) {\n fn(activeView);\n }\n return true;\n };\n };\n\n return {\n plugins: () => [\n new Plugin({\n key: plugin,\n props: {\n nodeViews,\n handleDOMEvents: {\n click: aceNodeViews.handleClick.bind(aceNodeViews),\n },\n },\n }),\n // arrow in and out of editor\n keymap({\n ArrowLeft: arrowHandler('left', nodeTypes),\n ArrowRight: arrowHandler('right', nodeTypes),\n ArrowUp: arrowHandler('up', nodeTypes),\n ArrowDown: arrowHandler('down', nodeTypes),\n }),\n ],\n commands: () => [\n new ProsemirrorCommand(EditorCommandId.ExpandChunk, [], activeAceNodeViewCommand(nodeView => {\n nodeView.setExpanded(true); \n })),\n new ProsemirrorCommand(EditorCommandId.CollapseChunk, [], activeAceNodeViewCommand(nodeView => {\n nodeView.setExpanded(false);\n })),\n ]\n };\n };\n}\n\n/**\n * Represents a selection that was applied prior to the editor rendering (needs\n * to be applied when the editor rendering completes)\n */\nclass QueuedSelection {\n constructor(public readonly anchor: number, public readonly head: number) {}\n}\n\nexport class AceNodeView implements NodeView {\n public readonly getPos: () => number;\n public node: ProsemirrorNode;\n public readonly dom: HTMLElement;\n\n private readonly view: EditorView;\n private readonly ui: EditorUI;\n private readonly nodeViews: AceNodeViews;\n private readonly renderQueue: AceRenderQueue;\n private chunk?: ChunkEditor;\n private aceEditor?: AceAjax.Editor;\n private editSession?: AceAjax.IEditSession;\n private readonly editorOptions: EditorOptions;\n private readonly options: CodeViewOptions;\n private readonly events: EditorEvents;\n\n private updating: boolean;\n private escaping: boolean;\n private gapCursorPending: boolean;\n private mouseDown: boolean;\n private mode: string;\n private findMarkers: number[];\n private selectionMarker: number | null;\n private queuedSelection: QueuedSelection | null;\n private resizeTimer: number;\n private renderedWidth: number;\n private scrollRow: number;\n private cursorDirty: boolean;\n\n private readonly subscriptions: VoidFunction[];\n\n constructor(\n node: ProsemirrorNode,\n view: EditorView,\n getPos: () => number,\n context: ExtensionContext,\n options: CodeViewOptions,\n renderQueue: AceRenderQueue,\n nodeViews: AceNodeViews,\n ) {\n // context\n const ui = context.ui;\n const editorOptions = context.options;\n\n // Store for later\n this.node = node;\n this.view = view;\n this.ui = context.ui;\n this.events = context.events;\n this.getPos = getPos;\n\n // Initialize values\n this.mode = '';\n this.escaping = false;\n this.gapCursorPending = false;\n this.findMarkers = [];\n this.selectionMarker = null;\n this.renderQueue = renderQueue;\n this.nodeViews = nodeViews;\n this.queuedSelection = null;\n this.subscriptions = [];\n this.resizeTimer = 0;\n this.renderedWidth = 0;\n this.scrollRow = -1;\n this.cursorDirty = false;\n this.mouseDown = false;\n\n // options\n this.editorOptions = editorOptions;\n this.options = options;\n\n // The editor's outer node is our DOM representation\n this.dom = document.createElement('div');\n this.dom.classList.add('pm-code-editor');\n this.dom.classList.add('pm-ace-editor');\n this.dom.classList.add('pm-ace-editor-inactive');\n this.dom.classList.add(options.borderColorClass || 'pm-block-border-color');\n if (this.options.classes) {\n this.options.classes.forEach(className => this.dom.classList.add(className));\n }\n\n // Create a preview of the text (will be shown until editor is fully initialized)\n const preview = new AcePlaceholder(node.textContent);\n this.dom.appendChild(preview.getElement());\n\n // Style the first line differently if requested\n if (options.firstLineMeta) {\n this.dom.classList.add('pm-ace-first-line-meta');\n }\n\n // update mode\n this.updateMode();\n\n // observe all editor dispatches\n this.subscriptions.push(\n this.events.subscribe(DispatchEvent, (tr: Transaction | undefined) => {\n if (tr) {\n this.onEditorDispatch(tr);\n }\n }),\n );\n\n // This flag is used to avoid an update loop between the outer and\n // inner editor\n this.updating = false;\n\n if (renderQueue.isRenderCompleted()) {\n // All editors have been rendered and the queue is empty; initialize\n // directly (this happens when e.g., inserting code chunks interactively\n // after the document is fully rendered)\n this.initEditor();\n } else {\n // Rendering is not complete; add to the queue\n renderQueue.add(this);\n }\n\n // add ourselves to the list of all ace node views\n this.nodeViews.add(this);\n }\n\n public destroy() {\n // Unsubscribe from events\n this.subscriptions.forEach(unsub => unsub());\n\n // Clean up attached editor instance when it's removed from the DOM\n if (this.chunk) {\n this.chunk.destroy();\n }\n\n // remove ourselves from the list of all ace node views\n this.nodeViews.remove(this);\n }\n\n public update(node: ProsemirrorNode, _decos: Decoration[]) {\n if (node.type !== this.node.type) {\n return false;\n }\n if (!this.editSession) {\n return false;\n }\n this.node = node;\n this.updateMode();\n\n const AceRange = window.require('ace/range').Range;\n const doc = this.editSession.getDocument();\n\n const change = computeChange(this.editSession.getValue(), node.textContent);\n if (change) {\n this.updating = true;\n const range = AceRange.fromPoints(doc.indexToPosition(change.from, 0), doc.indexToPosition(change.to, 0));\n this.editSession.replace(range, change.text);\n this.updating = false;\n }\n\n // Clear any previously rendered find markers\n this.findMarkers.forEach(id => {\n if (this.editSession) {\n this.editSession.removeMarker(id);\n }\n });\n this.findMarkers = [];\n\n // Get all of the find results inside this node\n const decorations = findPluginState(this.view.state);\n if (decorations) {\n const decos = decorations?.find(this.getPos(), this.getPos() + node.nodeSize - 1);\n\n // If we got results, render them\n if (decos) {\n decos.forEach((deco: any) => {\n if (!this.editSession) {\n return;\n }\n\n // Calculate from/to position for result marker (adjust for zero based column)\n const markerFrom = doc.indexToPosition(deco.from - this.getPos(), 0);\n markerFrom.column--;\n const markerTo = doc.indexToPosition(deco.to - this.getPos(), 0);\n markerTo.column--;\n const range = AceRange.fromPoints(markerFrom, markerTo);\n\n // Create the search result marker and add it to the rendered set\n const markerId = this.editSession.addMarker(range, deco.type.attrs.class, 'result', true);\n this.findMarkers.push(markerId);\n });\n }\n }\n\n // Ensure that the chunk is expanded if it contains find markers (so user can see search results)\n if (this.chunk && this.findMarkers.length > 0) {\n this.chunk.setExpanded(true);\n }\n\n return true;\n }\n\n public setSelection(anchor: number, head: number) {\n // We haven't drawn the editor yet, so queue the selection until we can\n // apply it.\n if (!this.aceEditor || !this.editSession) {\n this.queuedSelection = new QueuedSelection(anchor, head);\n return;\n }\n if (!this.escaping && !this.gapCursorPending) {\n this.aceEditor.focus();\n }\n this.updating = true;\n const doc = this.editSession.getDocument();\n const AceRange = window.require('ace/range').Range;\n const range = AceRange.fromPoints(doc.indexToPosition(anchor, 0), doc.indexToPosition(head, 0));\n this.editSession.getSelection().setSelectionRange(range);\n this.updating = false;\n }\n\n public setGapCursorPending(pending: boolean) {\n this.gapCursorPending = pending;\n }\n\n public isFocused() {\n return this.aceEditor && this.aceEditor.isFocused();\n }\n\n public setExpanded(expanded: boolean) {\n if (this.chunk) {\n this.chunk.setExpanded(expanded);\n }\n }\n\n public getExpanded() {\n if (this.chunk) {\n return this.chunk.getExpanded();\n } else {\n return false;\n }\n }\n\n public selectNode() {\n if (this.aceEditor) {\n this.aceEditor.focus();\n }\n }\n\n public stopEvent() {\n return true;\n }\n\n public ignoreMutation(_mutation: MutationRecord | { type: 'selection'; target: Element }) {\n return true;\n }\n\n private onEditorDispatch(tr: Transaction) {\n if (!tr.docChanged && tr.selectionSet) {\n this.highlightSelectionAcross(tr.selection); \n }\n }\n\n private forwardSelection() {\n // ignore if we don't have focus\n if (!this.chunk || !this.chunk.element.contains(window.document.activeElement)) {\n return;\n }\n\n const state = this.view.state;\n const selection = this.asProseMirrorSelection(state.doc);\n if (selection && !selection.eq(state.selection)) {\n this.view.dispatch(state.tr.setSelection(selection));\n }\n }\n\n private asProseMirrorSelection(doc: ProsemirrorNode) {\n if (!this.editSession) {\n return null;\n }\n const offset = this.getPos() + 1;\n const session = this.editSession;\n const range = session.getSelection().getRange();\n const anchor = session.getDocument().positionToIndex(range.start, 0) + offset;\n const head = session.getDocument().positionToIndex(range.end, 0) + offset;\n return TextSelection.create(doc, anchor, head);\n }\n\n // detect the entire editor being selected across, in which case we add an ace marker\n // visually indicating that the text is selected\n private highlightSelectionAcross(selection: Selection) {\n if (!this.aceEditor || !this.editSession) {\n return;\n }\n\n // clear any existing selection marker\n if (this.selectionMarker !== null) {\n this.editSession.removeMarker(this.selectionMarker);\n this.selectionMarker = null;\n }\n\n // check for selection spanning us\n const pos = this.getPos();\n if (selection.from < pos && selection.to > pos + this.node.nodeSize) {\n const doc = this.editSession.getDocument();\n const AceRange = window.require('ace/range').Range;\n const range = AceRange.fromPoints(doc.indexToPosition(0, 0), doc.indexToPosition(this.node.nodeSize - 1, 0));\n this.selectionMarker = this.editSession.addMarker(range, 'pm-selected-text', 'selection', true);\n }\n }\n\n private valueChanged() {\n const change = computeChange(this.node.textContent, this.getContents());\n if (change) {\n // update content\n const start = this.getPos() + 1;\n if (!isNaN(start)) {\n const tr = this.view.state.tr.replaceWith(\n start + change.from,\n start + change.to,\n change.text ? this.node.type.schema.text(change.text) : null,\n );\n this.view.dispatch(tr);\n }\n }\n this.updateMode();\n }\n\n /**\n * Scrolls a child of the editor chunk into view.\n *\n * @param ele The child to scroll.\n */\n private scrollIntoView(ele: HTMLElement) {\n const editingRoot = editingRootNode(this.view.state.selection);\n if (editingRoot) {\n const container = this.view.nodeDOM(editingRoot.pos) as HTMLElement;\n const scroller = zenscroll.createScroller(container);\n\n let top = 0;\n\n // The DOM node representing this editor chunk (this.dom) may not be a\n // direct child of the scrollable container. If it isn't, walk up the DOM\n // tree until we find the main content node (pm-content), which is the\n // offset parent against which we need to compute scroll position.\n let scrollParent = this.dom;\n while (scrollParent.offsetParent != null &&\n !scrollParent.offsetParent.classList.contains(\"pm-content\"))\n {\n top += scrollParent.offsetTop;\n scrollParent = scrollParent.offsetParent as HTMLElement;\n }\n\n // Since the element we want to scroll into view is not a direct child of\n // the scrollable container, do a little math to figure out the\n // destination scroll position.\n top += ele.offsetTop + scrollParent.offsetTop;\n const bottom = top + ele.offsetHeight;\n const viewTop = container.scrollTop;\n const viewBottom = container.scrollTop + container.offsetHeight;\n\n // Scroll based on element's current position and size\n if (top > viewTop && bottom < viewBottom) {\n // Element is already fully contained in the viewport\n return;\n } else if (ele.offsetHeight > container.offsetHeight) {\n // Element is taller than the viewport, so show the first part of it\n scroller.toY(top);\n } else if (top < viewTop) {\n // Element is above viewport, so scroll it into view\n scroller.toY(top);\n } else if (bottom > viewBottom) {\n // Part of the element is beneath the viewport, so scroll just enough to\n // bring it into view\n scroller.toY(container.scrollTop - (viewBottom - bottom));\n }\n }\n }\n\n /**\n * Initializes the editing surface by creating and injecting an Ace editor\n * instance from the host.\n */\n public initEditor() {\n // skip if we're already initialized\n if (this.aceEditor) {\n return;\n }\n\n // call host factory to instantiate editor\n this.chunk = this.ui.chunks.createChunkEditor('ace', this.dom, this.node.attrs.md_index, this.node.attrs.classes, {\n getPos: () => this.getPos(),\n scrollIntoView: ele => this.scrollIntoView(ele),\n scrollCursorIntoView: () => this.scrollCursorIntoView(),\n getTextContent: () => this.node.textContent\n });\n\n // populate initial contents\n this.aceEditor = this.chunk.editor as AceAjax.Editor;\n this.updating = true;\n this.aceEditor.setValue(this.node.textContent);\n this.updating = false;\n\n this.aceEditor.clearSelection();\n\n // cache edit session for convenience; most operations happen on the session\n this.editSession = this.aceEditor.getSession();\n\n // remove the preview and recreate chunk toolbar\n this.dom.innerHTML = '';\n this.dom.appendChild(this.chunk.element);\n\n // Propagate updates from the code editor to ProseMirror\n this.aceEditor.on('changeSelection', () => {\n if (!this.updating) {\n this.forwardSelection();\n }\n });\n this.aceEditor.on('change', () => {\n if (!this.updating) {\n this.valueChanged();\n }\n });\n\n // Forward selection we we receive it\n this.aceEditor.on('focus', () => {\n this.dom.classList.remove('pm-ace-editor-inactive');\n this.forwardSelection();\n });\n\n this.aceEditor.on('blur', () => {\n // Add a class to editor; this class contains CSS rules that hide editor\n // components that Ace cannot hide natively (such as the cursor,\n // matching bracket indicator, and active selection)\n this.dom.classList.add('pm-ace-editor-inactive');\n });\n\n // If the cursor moves and we're in focus, ensure that the cursor is\n // visible. Ace's own cursor visiblity mechanisms don't work in embedded\n // editors.\n this.aceEditor.getSelection().on('changeCursor', () => {\n if (this.dom.contains(document.activeElement) && !this.mouseDown) {\n this.cursorDirty = true;\n }\n });\n\n this.aceEditor.renderer.on('afterRender', () => {\n // If the cursor position is dirty and the mouse is not down, scroll the\n // cursor into view. Don't scroll while the mouse is down, as it will be\n // treated as a click-and-drag by Ace.\n if (this.cursorDirty && !this.mouseDown) {\n this.scrollCursorIntoView();\n this.cursorDirty = false;\n }\n });\n\n // Add custom escape commands for movement keys (left/right/up/down); these\n // will check to see whether the movement should leave the editor, and if\n // so will do so instead of moving the cursor.\n this.aceEditor.commands.addCommand({\n name: 'leftEscape',\n bindKey: 'Left',\n exec: () => {\n this.arrowMaybeEscape('char', -1, 'gotoleft');\n },\n readOnly: true\n });\n this.aceEditor.commands.addCommand({\n name: 'rightEscape',\n bindKey: 'Right',\n exec: () => {\n // if the chunk is currently collapsed, the right arrow should open it up\n if (this.chunk && !this.chunk.getExpanded()) {\n this.chunk.setExpanded(true);\n return;\n }\n this.arrowMaybeEscape('char', 1, 'gotoright');\n },\n readOnly: true\n });\n this.aceEditor.commands.addCommand({\n name: 'upEscape',\n bindKey: 'Up',\n exec: () => {\n this.arrowMaybeEscape('line', -1, 'golineup');\n },\n readOnly: true\n });\n this.aceEditor.commands.addCommand({\n name: 'downEscape',\n bindKey: 'Down',\n exec: () => {\n this.arrowMaybeEscape('line', 1, 'golinedown');\n },\n readOnly: true\n });\n\n // Pressing Backspace in the editor when it's empty should delete it.\n this.aceEditor.commands.addCommand({\n name: 'backspaceDeleteNode',\n bindKey: 'Backspace',\n exec: () => {\n this.backspaceMaybeDeleteNode();\n },\n });\n\n // Handle undo/redo in ProseMirror\n this.aceEditor.commands.addCommand({\n name: 'undoProsemirror',\n bindKey: {\n win: 'Ctrl-Z',\n mac: 'Command-Z',\n },\n exec: () => {\n if (undo(this.view.state, this.view.dispatch)) {\n this.view.focus();\n }\n },\n });\n this.aceEditor.commands.addCommand({\n name: 'redoProsemirror',\n bindKey: {\n win: 'Ctrl-Shift-Z|Ctrl-Y',\n mac: 'Command-Shift-Z|Command-Y',\n },\n exec: () => {\n if (redo(this.view.state, this.view.dispatch)) {\n this.view.focus();\n }\n },\n });\n\n // Handle Select All in ProseMirror\n this.aceEditor.commands.addCommand({\n name: 'selectAllProsemirror',\n bindKey: {\n win: 'Ctrl-A',\n mac: 'Command-A',\n },\n exec: () => {\n if (selectAll(this.view.state, this.view.dispatch, this.view)) {\n this.view.focus();\n }\n },\n });\n\n // Handle shortcuts for moving focus out of the code editor and into\n // ProseMirror\n this.aceEditor.commands.addCommand({\n name: 'exitCodeBlock',\n bindKey: 'Shift-Enter',\n exec: () => {\n if (exitCode(this.view.state, this.view.dispatch)) {\n this.view.focus();\n }\n },\n });\n\n // Create a command for inserting paragraphs from the code editor\n this.aceEditor.commands.addCommand({\n name: 'insertParagraph',\n bindKey: {\n win: 'Ctrl-\\\\',\n mac: 'Command-\\\\',\n },\n exec: () => {\n if (insertParagraph(this.view.state, this.view.dispatch)) {\n this.view.focus();\n }\n },\n });\n\n // Line-by-line execution\n this.aceEditor.commands.addCommand({\n name: 'executeSelection',\n bindKey: {\n win: 'Ctrl-Enter',\n mac: 'Ctrl-Enter|Command-Enter',\n },\n exec: () => {\n if (this.chunk && this.aceEditor) {\n // Record the position prior to execution\n const pos = this.aceEditor.getCursorPosition();\n\n // Execute the selection\n this.chunk.executeSelection();\n\n // If the cursor stayed on the last line, step out of the code block\n // if we're not at the end of the doc (this is a no-op when not on the\n // last line, and mirrors the behavior when stepping past the end of\n // chunks in the code editor)\n if (pos.row === this.aceEditor.getCursorPosition().row) {\n this.arrowMaybeEscape('line', 1);\n }\n }\n },\n });\n\n // If an attribute editor function was supplied, bind it to F4\n if (this.options.attrEditFn) {\n this.aceEditor.commands.addCommand({\n name: 'editAttributes',\n bindKey: 'F4',\n exec: () => {\n this.options.attrEditFn!(this.view.state, this.view.dispatch, this.view);\n },\n });\n }\n\n // Apply editor mode\n if (this.mode) {\n this.chunk.setMode(this.mode);\n }\n\n // Disconnect font metrics system after render loop\n (this.aceEditor.renderer as any).on('afterRender', () => {\n // Update known rendered width\n if (this.chunk) {\n this.renderedWidth = this.chunk.element.offsetWidth;\n }\n\n window.setTimeout(() => {\n if (this.aceEditor) {\n const metrics = (this.aceEditor.renderer as any).$fontMetrics;\n if (metrics && metrics.$observer) {\n metrics.$observer.disconnect();\n }\n }\n }, 0);\n });\n\n // Hook up the container to the render queue\n const editingRoot = editingRootNode(this.view.state.selection)!;\n const container = this.view.nodeDOM(editingRoot.pos) as HTMLElement;\n if (container.parentElement) {\n this.renderQueue.setContainer(container);\n }\n\n // Forward selection, if we have one (this can be set while the editor is\n // waiting to render)\n if (this.queuedSelection) {\n this.setSelection(this.queuedSelection.anchor, this.queuedSelection.head);\n this.queuedSelection = null;\n }\n\n // Subscribe to resize event; will reflow the editor to wrap properly at the\n // new width\n this.subscriptions.push(\n this.events.subscribe(ResizeEvent, () => {\n this.debounceResize();\n }),\n );\n\n // Subscribe to scroll event; invalidates the row we're scrolled to so\n // scrollback will be triggered if necessary (after e.g., typing after\n // scrolling offscreen)\n this.subscriptions.push(\n this.events.subscribe(ScrollEvent, () => {\n this.scrollRow = -1;\n }),\n );\n\n // Keep track of mouse state so we can avoid e.g., autoscrolling while the\n // mouse is down\n this.dom.addEventListener(\"mousedown\", (evt) => {\n this.mouseDown = true;\n });\n this.dom.addEventListener(\"mouseup\", (evt) => {\n this.mouseDown = false;\n });\n this.dom.addEventListener(\"mouseleave\", (evt) => {\n // Treat mouse exit as an up since it will cause us to miss the up event\n this.mouseDown = false;\n });\n }\n\n /**\n * Debounced version of editor resize; ensures we don't aggressively resize\n * while size is still changing.\n */\n private debounceResize() {\n // Clear any previously running resize timer\n if (this.resizeTimer !== 0) {\n window.clearTimeout(this.resizeTimer);\n }\n\n // Create a new resize timer\n this.resizeTimer = window.setTimeout(() => {\n if (this.chunk && this.aceEditor) {\n // If the width we last rendered is different than our current width,\n // trigger an Ace resize event (causes editor to reflow wrapped text)\n if (this.renderedWidth !== this.chunk.element.offsetWidth) {\n this.aceEditor.resize();\n }\n }\n this.resizeTimer = 0;\n }, 500);\n }\n\n private updateMode() {\n // get lang\n const lang = this.options.lang(this.node, this.getContents());\n\n if (lang !== null && this.mode !== lang) {\n if (this.chunk) {\n this.chunk.setMode(lang);\n }\n this.mode = lang;\n }\n }\n\n private backspaceMaybeDeleteNode() {\n // if the node is empty and we execute a backspace then delete the node\n if (this.node.childCount === 0) {\n // if there is an input rule we just executed then use this to undo it\n if (undoInputRule(this.view.state)) {\n undoInputRule(this.view.state, this.view.dispatch);\n this.view.focus();\n } else {\n const tr = this.view.state.tr;\n tr.delete(this.getPos(), this.getPos() + this.node.nodeSize);\n tr.setSelection(TextSelection.near(tr.doc.resolve(this.getPos()), -1));\n this.view.dispatch(tr);\n this.view.focus();\n }\n } else if (this.aceEditor) {\n this.aceEditor.execCommand('backspace');\n }\n }\n\n // Checks to see whether an arrow key should escape the editor or not. If so,\n // sends the focus to the right node; if not, executes the given Ace command\n // (to perform the arrow key's usual action)\n private arrowMaybeEscape(unit: string, dir: number, command?: string) {\n if (!this.aceEditor || !this.editSession) {\n return;\n }\n\n const pos = this.aceEditor.getCursorPosition();\n const lastrow = this.editSession.getLength() - 1;\n if (this.getExpanded() && // special handing of keys for collapsed\n (!this.aceEditor.getSelection().isEmpty() ||\n pos.row !== (dir < 0 ? 0 : lastrow) ||\n (unit === 'char' && pos.column !== (dir < 0 ? 0 : this.editSession.getDocument().getLine(pos.row).length)))\n ) {\n // this movement is happening inside the editor itself. don't escape\n // the editor; just execute the underlying command\n if (command) {\n this.aceEditor.execCommand(command);\n }\n return;\n }\n\n // the cursor is about to leave the editor region; flag this to avoid side\n // effects\n this.escaping = true;\n\n // ensure we are focused\n this.view.focus();\n\n // handle arrow key\n handleArrowToAdjacentNode(this.getPos(), dir, this.view.state, this.view.dispatch);\n\n // set focus\n this.view.focus();\n this.escaping = false;\n }\n\n private getContents(): string {\n if (this.editSession) {\n return this.editSession.getValue();\n } else {\n return this.dom.innerText;\n }\n }\n\n /**\n * Ensures that the Ace cursor is visible in the scrollable region of the document.\n */\n private scrollCursorIntoView(): void {\n // No need to try to enforce cursor position if we're already scrolled to\n // this row\n if (this.editSession && this.editSession.getSelection().getCursor().row === this.scrollRow) {\n return;\n }\n\n // Ensure we still have focus before proceeding\n if (this.dom.contains(document.activeElement)) {\n\n // Find the element containing the rendered virtual cursor \n const cursor = this.dom.querySelector(\".ace_cursor\");\n if (cursor === null) {\n return;\n }\n\n // Ace doesn't actually move the cursor but uses CSS translations to\n // make it appear in the right place, so we need to use the somewhat\n // expensive getBoundingClientRect call to get a resolved position.\n // (The alternative would be parse the translate: transform(10px 20px))\n // call from the style property.)\n const editingRoot = editingRootNode(this.view.state.selection)!;\n const container = this.view.nodeDOM(editingRoot.pos) as HTMLElement;\n const containerRect = container.getBoundingClientRect();\n const cursorRect = cursor.getBoundingClientRect();\n\n // Scrolling down?\n const down = cursorRect.bottom + 10 - containerRect.bottom;\n if (down > 0) {\n container.scrollTop += down;\n } else {\n // Scrolling up?\n const up = containerRect.top + 10 - cursorRect.top;\n if (up > 0) {\n container.scrollTop -= up;\n }\n }\n\n // Update cached scroll row so we don't unnecessarily redo these\n // computations\n if (this.editSession) {\n this.scrollRow = this.editSession.getSelection().getCursor().row;\n }\n }\n }\n}\n\nfunction computeChange(oldVal: string, newVal: string) {\n if (oldVal === newVal) {\n return null;\n }\n let start = 0;\n let oldEnd = oldVal.length;\n let newEnd = newVal.length;\n while (start < oldEnd && oldVal.charCodeAt(start) === newVal.charCodeAt(start)) {\n ++start;\n }\n while (oldEnd > start && newEnd > start && oldVal.charCodeAt(oldEnd - 1) === newVal.charCodeAt(newEnd - 1)) {\n oldEnd--;\n newEnd--;\n }\n return {\n from: start,\n to: oldEnd,\n text: newVal.slice(start, newEnd),\n };\n}\n\nfunction arrowHandler(dir: 'up' | 'down' | 'left' | 'right', nodeTypes: string[]) {\n return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n if (state.selection.empty && !(state.selection instanceof GapCursor) && view && view.endOfTextblock(dir)) {\n const side = dir === 'left' || dir === 'up' ? -1 : 1;\n const $head = state.selection.$head;\n const nextPos = Selection.near(state.doc.resolve(side > 0 ? $head.after() : $head.before()), side);\n if (nextPos.$head && nodeTypes.includes(nextPos.$head.parent.type.name)) {\n // check for e.g. math where you can advance across embedded newlines\n if ((dir === 'up' || dir === 'down') && verticalArrowCanAdvanceWithinTextBlock(state.selection, dir)) {\n return false;\n }\n if (dispatch) {\n dispatch(state.tr.setSelection(nextPos));\n }\n return true;\n }\n }\n return false;\n };\n}\n","/*\n * cursor.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction, NodeSelection, Selection } from 'prosemirror-state';\nimport { GapCursor } from 'prosemirror-gapcursor';\n\nexport function handleArrowToAdjacentNode(\n nodePos: number,\n dir: number,\n state: EditorState,\n dispatch?: (tr: Transaction<any>) => void,\n): boolean {\n // resolve the node and position\n const node = state.doc.nodeAt(nodePos);\n if (!node) {\n return false;\n }\n const $pos = state.doc.resolve(nodePos);\n\n // helpers to figure out the nature of prev/next nodes\n const prevNodeSelectable = () => {\n return $pos.nodeBefore && $pos.nodeBefore.type.spec.selectable;\n };\n const nextNodeSelectable = () => {\n const nextNode = state.doc.nodeAt(nodePos + node.nodeSize);\n return nextNode?.type.spec.selectable;\n };\n const prevNodeTextBlock = () => {\n return $pos.nodeBefore && $pos.nodeBefore.isTextblock;\n };\n const nextNodeTextBlock = () => {\n const nextNode = state.doc.nodeAt(nodePos + node.nodeSize);\n return nextNode?.isTextblock;\n };\n const prevNodeCode = () => {\n return $pos.nodeBefore && !!$pos.nodeBefore.type.spec.code;\n };\n const nextNodeCode = () => {\n const nextNode = state.doc.nodeAt(nodePos + node.nodeSize);\n return !!nextNode?.type.spec.code;\n };\n\n // see if we can get a new selection\n const tr = state.tr;\n let selection: Selection | undefined;\n\n // if we are going backwards and there is no previous position, then return a gap cursor\n if (dir < 0 && !$pos.nodeBefore) {\n selection = new GapCursor(tr.doc.resolve(nodePos), tr.doc.resolve(nodePos));\n\n // if we are going forwards and there is no next position, then return a gap cursor\n } else if (dir > 0 && !$pos.nodeAfter) {\n const cursorPos = nodePos + node.nodeSize;\n selection = new GapCursor(tr.doc.resolve(cursorPos), tr.doc.resolve(cursorPos));\n\n // if we are going backwards and the previous node can take node selections then select it\n } else if (dir < 0 && prevNodeSelectable()) {\n const prevNodePos = nodePos - $pos.nodeBefore!.nodeSize;\n selection = NodeSelection.create(tr.doc, prevNodePos);\n\n // if we are going forwards and the next node can take node selections then select it\n } else if (dir >= 0 && nextNodeSelectable()) {\n const nextNodePos = nodePos + node.nodeSize;\n selection = NodeSelection.create(tr.doc, nextNodePos);\n\n // if we are going backwards and the previous node is not a text block then create a gap cursor\n } else if (dir < 0 && (!prevNodeTextBlock() || prevNodeCode())) {\n selection = new GapCursor(tr.doc.resolve(nodePos), tr.doc.resolve(nodePos));\n\n // if we are going forwards and the next node is not a text block then create a gap cursor\n } else if (dir >= 0 && (!nextNodeTextBlock() || nextNodeCode())) {\n const endPos = nodePos + node.nodeSize;\n selection = new GapCursor(tr.doc.resolve(endPos), tr.doc.resolve(endPos));\n\n // otherwise use text selection handling (handles forward/backward text selections)\n } else {\n const targetPos = nodePos + (dir < 0 ? 0 : node.nodeSize);\n const targetNode = tr.doc.nodeAt(targetPos);\n if (targetNode) {\n selection = Selection.near(tr.doc.resolve(targetPos), dir);\n }\n }\n\n if (selection) {\n if (dispatch) {\n tr.setSelection(selection);\n dispatch(tr);\n }\n return true;\n } else {\n return false;\n }\n}\n","/*\n * ace-render-queue.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { AceNodeView } from './ace';\nimport { EditorEvents } from '../../api/events';\nimport { ScrollEvent, UpdateEvent } from '../../api/event-types';\n\n/**\n * Represents a queue of Ace editor instances that are rendered asynchronously.\n */\nexport class AceRenderQueue {\n private readonly renderQueue: AceNodeView[] = [];\n\n private renderCompleted: boolean = false;\n private renderTimer: number = 0;\n private updateTimer: number = 0;\n private container?: HTMLElement;\n private needsSort: boolean = true;\n private bypass: number = 5;\n private observer?: IntersectionObserver;\n private visible: boolean = true;\n private readonly subscriptions: VoidFunction[] = [];\n\n constructor(private events: EditorEvents) {\n // Begin listening for scroll and update events so we can manage the queue\n // accordingly\n this.subscriptions.push(\n events.subscribe(ScrollEvent, () => {\n this.onScroll();\n }),\n );\n this.subscriptions.push(\n events.subscribe(UpdateEvent, () => {\n this.onUpdate();\n }),\n );\n }\n\n /**\n * Sets (or replaces) the scroll container hosting the render queue. The\n * scroll container is used to prioritize the queue (i.e. objects in the\n * viewport or close to it are to be given more priority).\n *\n * @param container The HTML element of the scroll container\n */\n public setContainer(container: HTMLElement) {\n // Skip if we're already looking at this container\n if (this.container === container) {\n return;\n }\n\n // Clean up observer on any previous container\n if (this.observer) {\n this.observer.disconnect();\n }\n\n // Save reference to container\n this.container = container;\n\n // Create intersection observer to ensure that we don't needlessly churn\n // through renders while offscreen.\n this.observer = new IntersectionObserver(\n (entries: IntersectionObserverEntry[]) => {\n for (const entry of entries) {\n if (entry.isIntersecting && !this.visible) {\n // We just became visible; process the render queue now.\n this.visible = true;\n this.processRenderQueue();\n }\n if (!entry.isIntersecting && this.visible) {\n // We just lost visibility; end processing of the render queue. (Note\n // that we only do this when connected to the DOM as another reason\n // the element can become invisible is ProseMirror swapping it out\n // internally.)\n if (this.container?.parentElement) {\n this.visible = false;\n this.cancelTimer();\n }\n }\n }\n },\n {\n root: null,\n },\n );\n\n // Begin observing intersection events in container\n this.observer.observe(container);\n }\n\n /**\n * Invoke when the editor surface is scrolled\n */\n private onScroll() {\n // Whenever a scroll event occurs, we need to re-sort the queue so that\n // objects in or closest to the viewport are given priority.\n this.needsSort = true;\n\n // If we don't think we're visible but we're scrolling and have height,\n // then we are in fact visible. (This catches a case where the\n // intsersection observer created below doesn't fire for visiblity\n // changes.)\n if (!this.visible && this.container && this.container.offsetHeight > 0) {\n this.visible = true;\n this.processRenderQueue();\n }\n }\n\n /**\n * Invoke when the document has changed\n */\n private onUpdate() {\n // Debounce update timer. This timer is used to prevent the CPU intensive\n // editor rendering from happening while the user is actively updating the\n // document.\n if (this.updateTimer !== 0) {\n window.clearTimeout(this.updateTimer);\n }\n this.updateTimer = window.setTimeout(() => {\n this.updateTimer = 0;\n // Process queue immediately if we have one\n this.scheduleRender(0);\n }, 1000);\n }\n\n /**\n * Indicates whether the render queue has a scroll container defined\n */\n public hasContainer(): boolean {\n if (this.container) {\n return true;\n }\n return false;\n }\n\n /**\n * Indicates whether the rendering is finished.\n */\n public isRenderCompleted(): boolean {\n return this.renderCompleted;\n }\n\n /**\n * Adds a node view to the render queue\n */\n public add(view: AceNodeView) {\n // We allow the first few code blocks to render synchronously instead of\n // being dumped into the queue for later processing. This slightly increases\n // startup time but prevents the flicker that would otherwise occur as\n // editors render one by one.\n if (this.bypass > 0) {\n this.bypass--;\n view.initEditor();\n return;\n }\n\n this.renderQueue.push(view);\n\n // Defer/debounce rendering of editors until event loop finishes\n if (this.renderTimer === 0) {\n this.scheduleRender(0);\n }\n }\n\n /**\n * Processes the queue of editor instances that need to be rendered.\n */\n private processRenderQueue() {\n // No work to do if queue is empty\n if (this.renderQueue.length === 0) {\n return;\n }\n\n // Don't render while hidden; it wastes resources plus can result in\n // incorrect sizing calculations\n if (!this.visible) {\n return;\n }\n\n // Don't render while the user is actively updating the document (it makes\n // the interface sluggish)\n if (this.updateTimer !== 0) {\n return;\n }\n\n // Compute offset for sorting (based on scroll position)\n let offset = 0;\n if (this.container) {\n offset = this.container.scrollTop;\n }\n\n // Sort the queue if required\n if (this.needsSort) {\n // Sort the render queue based on distance from the top of the viewport\n this.renderQueue.sort((a, b) => {\n return Math.abs(a.dom.offsetTop - offset) - Math.abs(b.dom.offsetTop - offset);\n });\n\n // Clear flag so we don't sort the queue on every render\n this.needsSort = false;\n }\n\n // Pop the next view (editor instance) to be rendered off the stack.\n // Fast-forward past instances that no longer have a position; these can\n // accumulate when NodeViews are added to the render queue but replaced\n // (by a document rebuild) before they have a chance to render.\n let view: AceNodeView | undefined;\n while ((view === null || view === undefined || view.getPos() === undefined) &&\n this.renderQueue.length > 0) {\n view = this.renderQueue.shift();\n }\n\n // Render this view\n if (view) {\n view.initEditor();\n }\n\n if (this.renderQueue.length > 0) {\n // There are still remaining editors to be rendered, so process again on\n // the next event loop.\n //\n // If these editors are near the viewport, render them as soon as\n // possible; otherwise, let the render proceed at a slower pace to\n // increase responsiveness.\n let delayMs = 1000;\n if (this.container) {\n const distance = Math.abs(this.renderQueue[0].dom.offsetTop - offset);\n if (distance < this.container.offsetHeight * 2) {\n // Container is near the viewport, so render it ASAP\n delayMs = 0;\n }\n }\n this.scheduleRender(delayMs);\n } else {\n // No remaining editors; we're done.\n this.renderCompleted = true;\n this.destroy();\n }\n }\n\n /**\n * Cancels the timer that is responsible for triggering the processing of the\n * next unit in the render queue.\n */\n private cancelTimer() {\n if (this.renderTimer !== 0) {\n window.clearTimeout(this.renderTimer);\n this.renderTimer = 0;\n }\n }\n\n /**\n * Reschedules a pending render, or schedules a new one.\n */\n private scheduleRender(delayMs: number) {\n this.cancelTimer();\n this.renderTimer = window.setTimeout(() => {\n this.processRenderQueue();\n this.renderTimer = 0;\n }, delayMs);\n }\n\n /**\n * Cleans up the render queue instance\n */\n private destroy() {\n // Cancel any pending renders\n this.cancelTimer();\n\n // Clear any pending update timer\n if (this.updateTimer !== 0) {\n window.clearTimeout(this.updateTimer);\n }\n\n // Remove event subscriptions\n this.subscriptions.forEach(unsub => unsub());\n\n // Clean up resize observer\n if (this.observer) {\n this.observer.disconnect();\n }\n }\n}\n","/*\n * ace-placeholder.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\n/**\n * Represents a placeholder (preview) rendering of an Ace editor. Since Ace\n * editors are somewhat expensive to draw, this placeholder is used in place\n * of a real editor instance to make code visible and allow for correct height\n * computations.\n */\nexport class AcePlaceholder {\n private readonly element: HTMLElement;\n\n constructor(content: string) {\n const ele = document.createElement('pre');\n ele.innerText = content;\n ele.className = 'ace_editor';\n this.element = ele;\n }\n\n public getElement() {\n return this.element;\n }\n}\n","/*\n * ace-node-views.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { GapCursor } from 'prosemirror-gapcursor';\nimport { AceNodeView } from './ace';\nimport { EditorView } from 'prosemirror-view';\n\n/**\n * Track all Ace node view instances to implement additional behavior\n * (e.g. gap cursor for clicks between editor instances)\n */\n\nexport class AceNodeViews {\n private nodeViews: AceNodeView[];\n\n constructor() {\n this.nodeViews = [];\n }\n public add(nodeView: AceNodeView) {\n this.nodeViews.push(nodeView);\n }\n\n public remove(nodeView: AceNodeView) {\n const index = this.nodeViews.indexOf(nodeView);\n if (index >= 0) {\n this.nodeViews.splice(index, 1);\n }\n }\n\n public activeNodeView() : AceNodeView | undefined {\n return this.nodeViews.find(view => view.isFocused());\n }\n\n public handleClick(view: EditorView, event: Event): boolean {\n // alias to mouseEvent\n const mouseEvent = event as MouseEvent;\n\n // see if the click is between 2 contiguously located node views\n for (const nodeView of this.nodeViews) {\n // gap cursor we might detect\n let gapCursor: GapCursor | null = null;\n\n // get the position\n const pos = nodeView.getPos();\n const $pos = view.state.doc.resolve(pos);\n\n // if the previous node is code, see if the click is between the 2 nodes\n if ($pos.nodeBefore && $pos.nodeBefore.type.spec.code) {\n // get our bounding rect\n const dom = nodeView.dom;\n const nodeViewRect = dom.getBoundingClientRect();\n\n // get the previous node's bounding rect\n const prevNodePos = pos - $pos.nodeBefore!.nodeSize;\n const prevNodeView = this.nodeViews.find(nv => nv.getPos() === prevNodePos);\n if (prevNodeView) {\n const prevNodeRect = prevNodeView.dom.getBoundingClientRect();\n\n // check for a click between the two nodes\n const mouseY = mouseEvent.clientY;\n if (mouseY > prevNodeRect.top + prevNodeRect.height && mouseY < nodeViewRect.top) {\n gapCursor = new GapCursor($pos, $pos);\n }\n }\n\n // if there is no previous node and the click is above us then gap cursor above\n // (only do this if the cursor is within 150 pixels of the left edge)\n } else if (\n !$pos.nodeBefore &&\n $pos.depth === 1 &&\n mouseEvent.clientY < nodeView.dom.getBoundingClientRect().top &&\n Math.abs(mouseEvent.clientX - nodeView.dom.getBoundingClientRect().left) < 150\n ) {\n gapCursor = new GapCursor($pos, $pos);\n }\n\n // return gapCursor if we found one\n if (gapCursor) {\n const tr = view.state.tr;\n\n // notify the node views that we are setting a gap cursor\n this.nodeViews.forEach(ndView => ndView.setGapCursorPending(true));\n\n // ensure the view is focused\n view.focus();\n\n // set the selection\n tr.setSelection(gapCursor);\n view.dispatch(tr);\n\n // notify the node views that we are done setting the gap cursor\n this.nodeViews.forEach(ndView => ndView.setGapCursorPending(false));\n\n // prevent default event handling\n event.preventDefault();\n event.stopImmediatePropagation();\n return true;\n }\n }\n\n return false;\n }\n}\n","/*\n * attr_edit.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, Node as ProsemirrorNode } from 'prosemirror-model';\nimport { findChildren } from 'prosemirror-utils';\nimport { Plugin, PluginKey, Transaction, EditorState, Selection } from 'prosemirror-state';\nimport { DecorationSet, Decoration, WidgetDecorationSpec } from 'prosemirror-view';\n\nimport { EditorUI } from '../../api/ui';\nimport { pandocAttrEnabled, pandocAttrAvailable } from '../../api/pandoc_attr';\nimport { kSetMarkdownTransaction, transactionsAreTypingChange, forChangedNodes } from '../../api/transaction';\n\nimport { PandocExtensions } from '../../api/pandoc';\nimport { Extension } from '../../api/extension';\nimport { hasFencedCodeBlocks } from '../../api/pandoc_format';\nimport { selectionIsWithinRange } from '../../api/selection';\n\nimport { AttrEditOptions } from '../../api/attr_edit';\nimport { attrEditDecorationWidget } from '../../api/attr_edit/attr_edit-decoration';\n\nimport { AttrEditCommand, attrEditNodeCommandFn } from './attr_edit-command';\nimport { EditorFormat } from '../../api/format';\n\nexport function attrEditExtension(\n pandocExtensions: PandocExtensions,\n ui: EditorUI,\n format: EditorFormat,\n editors: AttrEditOptions[],\n): Extension {\n const hasAttr = pandocAttrEnabled(pandocExtensions) || hasFencedCodeBlocks(pandocExtensions);\n\n return {\n commands: (_schema: Schema) => {\n if (hasAttr) {\n return [new AttrEditCommand(ui, format, pandocExtensions, editors)];\n } else {\n return [];\n }\n },\n\n plugins: (_schema: Schema) => {\n if (hasAttr) {\n return [new AttrEditDecorationPlugin(ui, pandocExtensions, editors)];\n } else {\n return [];\n }\n },\n };\n}\n\nconst key = new PluginKey<DecorationSet>('attr_edit_decoration');\n\nclass AttrEditDecorationPlugin extends Plugin<DecorationSet> {\n constructor(ui: EditorUI, pandocExtensions: PandocExtensions, editors: AttrEditOptions[]) {\n\n const decoratorForNode = (editor: AttrEditOptions, \n selection: Selection, \n node: ProsemirrorNode, \n pos: number) => {\n\n // if we prefer hidden and have no attributes then bail\n const range = { from: pos, to: pos + node.nodeSize };\n if (editor.preferHidden && \n !pandocAttrAvailable(node.attrs, !editor.noKeyvalueTags) && \n !selectionIsWithinRange(selection, range)) {\n return undefined;\n }\n\n // provide some editor defaults\n editor.tags = editor.tags ||\n (editorNode => {\n const attrTags = [];\n if (editorNode.attrs.id) {\n attrTags.push(`#${editorNode.attrs.id}`);\n }\n if (editorNode.attrs.classes && editorNode.attrs.classes.length) {\n attrTags.push(`${editorNode.attrs.classes.map((clz: string) => '.' + clz).join(' ')}`);\n }\n if (!editor.noKeyvalueTags && editorNode.attrs.keyvalue && editorNode.attrs.keyvalue.length) {\n attrTags.push(`${editorNode.attrs.keyvalue.map(\n (kv: [string,string]) => kv[0] + '=\"' + (kv[1] || '1') + '\"').join(' ')}\n `);\n }\n return attrTags;\n });\n editor.offset = editor.offset || { top: 0, right: 0 };\n\n // get editFn\n const editFn = attrEditNodeCommandFn(\n { node, pos }, \n ui, \n pandocExtensions, \n editors\n );\n\n // attr_edit controls\n return attrEditDecorationWidget({\n pos,\n tags: editor.tags(node),\n editFn,\n ui,\n offset: editor.offset,\n preferHidden: editor.preferHidden\n });\n \n };\n\n function decoratorsForDoc(state: EditorState) {\n const decorations: Decoration[] = [];\n const nodeTypes = editors.map(ed => ed.type(state.schema));\n findChildren(state.doc, node => nodeTypes.includes(node.type), true).forEach(attrNode => {\n const editor = editors.find(ed => ed.type(state.schema) === attrNode.node.type)!;\n if (!editor.noDecorator) {\n const decorator = decoratorForNode(editor, state.selection, attrNode.node, attrNode.pos);\n if (decorator) {\n decorations.push(decorator);\n }\n \n }\n });\n return DecorationSet.create(state.doc, decorations);\n }\n \n super({\n key,\n state: {\n init: (_config: { [key: string]: any }, state: EditorState) => {\n return decoratorsForDoc(state);\n },\n apply: (tr: Transaction, set: DecorationSet, oldState: EditorState, newState: EditorState) => {\n\n // replacing the entire editor triggers decorations\n if (tr.getMeta(kSetMarkdownTransaction)) {\n return decoratorsForDoc(newState);\n }\n\n // get schema and nodetypes\n const schema = newState.schema;\n const nodeTypes = editors.map(ed => ed.type(schema));\n\n // map \n set = set.map(tr.mapping, tr.doc);\n\n // typing change, return existing decorations\n if (transactionsAreTypingChange([tr])) {\n return set;\n }\n\n // selection change, might need to toggle some decorations on/off\n if (tr.selectionSet) {\n \n // look through each decorator, if it has preferHidden, it's node has no attributes,\n // and it's no longer in the selection then remove it\n const preferHiddenDecorators = set.find(undefined, undefined, spec => !!spec.preferHidden);\n for (const dec of preferHiddenDecorators) {\n const node = newState.doc.nodeAt(dec.from);\n if (node && !pandocAttrAvailable(node.attrs)) {\n if (!selectionIsWithinRange(tr.selection, \n { from: dec.from, to: dec.from + node.nodeSize })) {\n set = set.remove([dec]);\n }\n }\n }\n \n // now look for nodes above us with preferHidden and add decorators for them\n const $head = tr.selection.$head;\n for (let i=1; i<=$head.depth; i++) {\n const parentWithAttrs = { node: $head.node(i), pos: $head.before(i) };\n if (!nodeTypes.includes(parentWithAttrs.node.type)) {\n continue;\n }\n const { pos, node } = parentWithAttrs;\n const editor = editors.find(ed => ed.type(schema) === parentWithAttrs.node.type)!;\n if (editor?.preferHidden && set.find(pos, pos).length === 0) {\n const decorator = decoratorForNode(editor, tr.selection, node, pos);\n if (decorator) {\n set = set.add(tr.doc, [decorator]);\n }\n }\n }\n }\n\n // doc didn't change, return existing decorations\n if (!tr.docChanged && !tr.storedMarksSet) {\n return set;\n }\n \n // scan for added/modified nodes that have attr_edit decorations\n forChangedNodes(\n oldState,\n newState,\n node => nodeTypes.includes(node.type),\n (node, pos) => {\n // remove existing decorations for changed nodes\n const removeDecorations = set.find(pos, pos, (spec: WidgetDecorationSpec) => {\n return !!spec.key && spec.key.startsWith(\"tags:\");\n });\n if (removeDecorations.length > 0) {\n set = set.remove(removeDecorations);\n }\n\n // get editor and screen on noDecorator\n const editor = editors.find(ed => ed.type(schema) === node.type)!;\n if (!editor.noDecorator) {\n const decorator = decoratorForNode(editor, newState.selection, node, pos);\n if (decorator) {\n set = set.add(tr.doc, [decorator]);\n }\n }\n },\n );\n \n // return the updated set\n return set;\n }\n },\n props: {\n decorations: (state: EditorState) => {\n return key.getState(state);\n },\n },\n });\n }\n}\n\n\n","/*\n * attr_edit-command.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState, Transaction, NodeSelection } from 'prosemirror-state';\nimport { EditorView } from 'prosemirror-view';\nimport { Mark, Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { findParentNodeOfType, NodeWithPos } from 'prosemirror-utils';\n\nimport { EditorUI } from '../../api/ui';\nimport { pandocAttrInSpec } from '../../api/pandoc_attr';\nimport { getSelectionMarkRange } from '../../api/mark';\nimport { EditorCommandId, ProsemirrorCommand } from '../../api/command';\n\nimport { AttrEditOptions } from '../../api/attr_edit';\nimport { pandocAutoIdentifier, gfmAutoIdentifier } from '../../api/pandoc_id';\nimport { PandocExtensions } from '../../api/pandoc';\nimport { fragmentText } from '../../api/fragment';\nimport { kEditAttrShortcut } from '../../api/attr_edit/attr_edit-decoration';\nimport { EditorFormat } from '../../api/format';\nimport { editMathAttributesEnabled, editMathAttributes } from '../../marks/math/math-commands';\n\nexport class AttrEditCommand extends ProsemirrorCommand {\n constructor(ui: EditorUI, format: EditorFormat, pandocExtensions: PandocExtensions, editors: AttrEditOptions[]) {\n super(EditorCommandId.AttrEdit, [kEditAttrShortcut], attrEditCommandFn(ui, format, pandocExtensions, editors));\n }\n}\n\nexport function attrEditCommandFn(\n ui: EditorUI, \n format: EditorFormat,\n pandocExtensions: PandocExtensions, \n editors: AttrEditOptions[]\n) {\n return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n \n // give math attributes first crack (in case it's inside a node with attributes)\n if (editMathAttributesEnabled(format, state)) {\n return editMathAttributes(ui)(state, dispatch, view);\n }\n \n // see if there is an active mark with attrs or a parent node with attrs\n const marks = state.storedMarks || state.selection.$head.marks();\n const mark = marks.find((m: Mark) => pandocAttrInSpec(m.type.spec));\n\n let node: ProsemirrorNode | null = null;\n let pos: number = 0;\n // node selection of node with attributes\n if (state.selection instanceof NodeSelection && pandocAttrInSpec(state.selection.node.type.spec)) {\n node = state.selection.node;\n pos = state.selection.$anchor.pos;\n } else {\n // selection inside node with editable attributes\n const nodeTypes = editors.map(editor => editor.type(state.schema));\n const parentWithAttrs = findParentNodeOfType(nodeTypes)(state.selection);\n if (parentWithAttrs) {\n node = parentWithAttrs.node;\n pos = parentWithAttrs.pos;\n }\n }\n\n // return false (disabled) for no targets\n if (!mark && !node) {\n return false;\n }\n\n // if this is a node and we have a custom attribute editor then just delegate to that\n if (node) {\n const editor = editors.find(ed => ed.type(state.schema) === node!.type)!;\n if (editor && editor.editFn) {\n return editor.editFn()(state, dispatch, view);\n }\n }\n\n // edit attributes\n async function asyncEditAttrs() {\n if (dispatch) {\n if (mark) {\n await editMarkAttrs(mark, state, dispatch, ui);\n } else {\n await editNodeAttrs(pos, state, dispatch, ui, pandocExtensions);\n }\n if (view) {\n view.focus();\n }\n }\n }\n asyncEditAttrs();\n\n // return true\n return true;\n };\n}\n\nexport function attrEditNodeCommandFn(nodeWithPos: NodeWithPos, \n ui: EditorUI, \n pandocExtensions: PandocExtensions, \n editors: AttrEditOptions[]) {\n \n return (state: EditorState, dispatch?: (tr: Transaction<any>) => void, view?: EditorView) => {\n\n // alias\n const { node, pos } = nodeWithPos;\n\n // registered editor\n const editor = editors.find(ed => ed.type(state.schema) === node!.type)!;\n if (editor && editor.editFn) {\n return editor.editFn()(state, dispatch, view);\n }\n\n // generic editor\n async function asyncEditAttrs() {\n if (dispatch) {\n await editNodeAttrs(pos, state, dispatch, ui, pandocExtensions);\n if (view) {\n view.focus();\n }\n }\n }\n asyncEditAttrs();\n\n // return true\n return true;\n };\n}\n\nasync function editMarkAttrs(\n mark: Mark,\n state: EditorState,\n dispatch: (tr: Transaction<any>) => void,\n ui: EditorUI,\n): Promise<void> {\n const attrs = mark.attrs;\n const markType = mark.type;\n const result = await ui.dialogs.editAttr({ ...attrs });\n if (result) {\n const tr = state.tr;\n const range = getSelectionMarkRange(state.selection, markType);\n tr.removeMark(range.from, range.to, markType);\n tr.addMark(\n range.from,\n range.to,\n markType.create({\n ...attrs,\n ...result.attr,\n }),\n );\n dispatch(tr);\n }\n}\n\nasync function editNodeAttrs(\n pos: number,\n state: EditorState,\n dispatch: (tr: Transaction<any>) => void,\n ui: EditorUI,\n pandocExtensions: PandocExtensions,\n): Promise<void> {\n const node = state.doc.nodeAt(pos);\n if (node) {\n const attrs = node.attrs;\n const result = await ui.dialogs.editAttr({ ...attrs }, idHint(node, pandocExtensions));\n if (result) {\n const tr = state.tr;\n const targetNode = tr.doc.nodeAt(pos);\n if (targetNode) {\n tr.setNodeMarkup(pos, targetNode.type, {\n ...attrs,\n ...result.attr,\n }),\n dispatch(tr);\n }\n }\n }\n}\n\nfunction idHint(node: ProsemirrorNode, pandocExtensions: PandocExtensions) {\n if (node.type === node.type.schema.nodes.heading) {\n const unemoji = pandocExtensions.gfm_auto_identifiers;\n const text = fragmentText(node.content, unemoji);\n\n if (pandocExtensions.gfm_auto_identifiers) {\n return gfmAutoIdentifier(text, pandocExtensions.ascii_identifiers);\n } else {\n return pandocAutoIdentifier(text, pandocExtensions.ascii_identifiers);\n }\n } else {\n return undefined;\n }\n}\n","/*\n * editor-theme.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nexport interface EditorTheme {\n darkMode: boolean;\n solarizedMode: boolean;\n cursorColor: string;\n selectionColor: string;\n nodeSelectionColor: string;\n backgroundColor: string;\n metadataBackgroundColor: string;\n chunkBackgroundColor: string;\n spanBackgroundColor: string;\n divBackgroundColor: string;\n commentColor: string;\n commentBackgroundColor: string;\n gutterBackgroundColor: string;\n gutterTextColor: string;\n textColor: string;\n lightTextColor: string;\n placeholderTextColor: string;\n invisibleTextColor: string;\n linkTextColor: string;\n surfaceWidgetTextColor: string;\n markupTextColor: string;\n findTextBackgroundColor: string;\n findTextBorderColor: string;\n borderBackgroundColor: string;\n blockBorderColor: string;\n focusOutlineColor: string;\n paneBorderColor: string;\n fixedWidthFont: string;\n fixedWidthFontSizePt: number;\n proportionalFont: string;\n proportionalFontSizePt: number;\n code: CodeTheme;\n}\n\nexport interface CodeTheme {\n keywordColor: string;\n atomColor: string;\n numberColor: string;\n variableColor: string;\n defColor: string;\n operatorColor: string;\n commentColor: string;\n stringColor: string;\n metaColor: string;\n builtinColor: string;\n bracketColor: string;\n tagColor: string;\n attributeColor: string;\n hrColor: string;\n linkColor: string;\n errorColor: string;\n}\n\nexport function defaultTheme(): EditorTheme {\n return {\n darkMode: false,\n solarizedMode: false,\n cursorColor: 'black',\n selectionColor: '#8cf',\n nodeSelectionColor: 'rgb(102,155,243)',\n backgroundColor: 'white',\n metadataBackgroundColor: 'rgb(255, 255, 255)',\n chunkBackgroundColor: 'rgb(251,251,251)',\n spanBackgroundColor: '#fff8dc',\n divBackgroundColor: 'rgb(243, 243, 243)',\n commentColor: '#3c4c72',\n commentBackgroundColor: '#FFECCB',\n gutterBackgroundColor: '#f0f0f0',\n gutterTextColor: '#333',\n textColor: 'black',\n surfaceWidgetTextColor: 'rgba(0,0,0,0.5)',\n lightTextColor: 'rgb(60, 76, 114)',\n linkTextColor: '#106ba3',\n placeholderTextColor: 'gray',\n invisibleTextColor: 'rgb(191, 191, 191)',\n markupTextColor: 'rgb(185, 6, 144)',\n findTextBackgroundColor: 'rgb(250, 250, 255)',\n findTextBorderColor: 'rgb(200, 200, 250)',\n borderBackgroundColor: '#ddd',\n blockBorderColor: '#ddd',\n focusOutlineColor: '#5d84cd',\n paneBorderColor: 'silver',\n fixedWidthFont: 'monospace, monospace',\n fixedWidthFontSizePt: 9,\n proportionalFont: '\"Lucida Sans\", \"DejaVu Sans\", \"Lucida Grande\", \"Segoe UI\", Verdana, Helvetica, sans-serif',\n proportionalFontSizePt: 10,\n code: {\n keywordColor: 'rgb(0, 0, 255)',\n atomColor: 'rgb(88, 92, 246)',\n numberColor: 'rgb(0, 0, 205)',\n variableColor: 'rgb(0, 0, 0)',\n defColor: 'rgb(0, 0, 0)',\n operatorColor: 'rgb(104, 118, 135)',\n commentColor: 'rgb(76, 136, 107)',\n stringColor: 'rgb(3, 106, 7)',\n metaColor: 'rgb(0, 0, 0)',\n builtinColor: 'rgb(0, 0, 0)',\n bracketColor: 'rgb(104, 118, 135)',\n tagColor: 'rgb(0, 22, 142)',\n attributeColor: 'rgb(0, 0, 0)',\n hrColor: 'rgb(0, 0, 0)',\n linkColor: 'rgb(0, 0, 255)',\n errorColor: 'rgb(197, 6, 11)',\n },\n };\n}\n\nexport function applyTheme(theme: EditorTheme) {\n // merge w/ defaults\n const defaults = defaultTheme();\n theme = {\n ...defaults,\n ...theme,\n code: {\n ...defaults.code,\n ...theme.code,\n },\n };\n\n // generate theme css\n const themeCss = `\n .pm-default-theme .pm-background-color {\n background-color: ${defaults.backgroundColor} !important;\n }\n .pm-default-theme .pm-text-color {\n color: ${defaults.textColor} !important;\n }\n .pm-default-theme .pm-border-background-color {\n background-color: ${defaults.borderBackgroundColor} !important;\n }\n .pm-default-theme .pm-input-text {\n border-color: ${defaults.paneBorderColor} !important\n }\n .pm-default-theme .pm-block-border-color {\n border-color: ${defaults.blockBorderColor} !important;\n }\n .pm-default-theme .pm-input-outline-button {\n color: ${defaults.textColor};\n border-color: ${defaults.textColor};\n background-color: ${defaults.backgroundColor};\n }\n .pm-default-theme .pm-selected-navigation-tree-item {\n background-color: ${defaults.findTextBackgroundColor} !important;\n border-color: ${defaults.findTextBorderColor} !important;\n }\n .pm-default-theme .pm-navigation-tree-item {\n border-color: ${defaults.backgroundColor} !important;\n }\n .pm-default-theme .pm-block-border-color {\n border-color: ${defaults.blockBorderColor} !important;\n }\n .pm-default-theme .pm-focus-outline-color {\n border-color: ${defaults.focusOutlineColor} !important;\n }\n .pm-default-theme .pm-input-button {\n border-color: ${defaults.borderBackgroundColor};\n background-color: ${defaults.backgroundColor};\n }\n .pm-default-theme .pm-placeholder-text-color {\n color: ${defaults.placeholderTextColor} !important;\n }\n .pm-default-theme .pm-background-color *::selection {\n background-color: ${defaults.selectionColor} !important;\n }\n .pm-default-theme .pm-find-text,\n .pm-default-theme .pm-list-item-selected,\n .pm-default-theme .pm-grid-item-selected {\n background-color: ${defaults.findTextBackgroundColor} !important;\n box-shadow: 0 0 0 1px ${defaults.findTextBorderColor}; \n border-radius: 3px;\n }\n .pm-default-theme .pm-rstudio-button {\n border-color: DarkGray !important;\n }\n .pm-cursor-color {\n caret-color: ${theme.cursorColor}\n }\n .pm-background-color {\n background-color: ${theme.backgroundColor} !important;\n }\n .pm-metadata-background-color {\n background-color: ${theme.metadataBackgroundColor} !important;\n }\n .pm-chunk-background-color {\n background-color: ${theme.chunkBackgroundColor} !important;\n }\n .pm-span-background-color {\n background-color: ${theme.spanBackgroundColor} !important;\n }\n .pm-div-background-color {\n background-color: ${theme.divBackgroundColor} !important;\n }\n .pm-nbsp-background-color {\n background-color: ${theme.spanBackgroundColor} !important;\n }\n .pm-comment-color {\n color: ${theme.commentColor} !important;\n }\n .pm-comment-background-color {\n background-color: ${theme.commentBackgroundColor} !important;\n }\n .pm-text-color {\n color: ${theme.textColor} !important;\n }\n .pm-surface-widget-text-color {\n color: ${theme.surfaceWidgetTextColor} !important;\n }\n .pm-light-text-color {\n color: ${theme.lightTextColor} !important;\n }\n .pm-placeholder-text-color {\n color: ${theme.placeholderTextColor} !important;\n }\n .pm-invisible-text-color {\n color: ${theme.invisibleTextColor} !important;\n }\n .pm-link-text-color {\n color: ${theme.linkTextColor} !important;\n }\n .pm-markup-text-color {\n color: ${theme.markupTextColor} !important;\n }\n .pm-find-text,\n .pm-list-item-selected,\n .pm-grid-item-selected {\n background-color: ${theme.findTextBackgroundColor} !important;\n box-shadow: 0 0 0 1px ${theme.findTextBorderColor}; \n border-radius: 3px;\n }\n .pm-selected-text {\n background-color: ${theme.selectionColor} !important;\n }\n .pm-selected-list-item {\n background-color: ${theme.findTextBackgroundColor} !important;\n border: 1px solid ${theme.findTextBorderColor} !important;\n border-radius: 3px;\n }\n .pm-dark-mode .pm-selected-list-item {\n background-color: ${theme.chunkBackgroundColor} !important;\n border: 1px solid transparent !important;\n }\n .pm-navigation-tree-item {\n border: 1px solid ${theme.backgroundColor} !important;\n border-radius: 3px;\n margin-left: 2px;\n margin-right: 2px;\n }\n .pm-selected-navigation-tree-item {\n background-color: ${theme.findTextBackgroundColor} !important;\n border: 1px solid ${theme.findTextBorderColor} !important;\n border-radius: 3px;\n margin-left: 2px;\n margin-right: 2px;\n }\n .pm-border-background-color {\n background-color: ${theme.borderBackgroundColor}!important;\n }\n .pm-block-border-color {\n border-color: ${theme.blockBorderColor} !important;\n }\n .pm-focus-outline-color {\n border-color: ${theme.focusOutlineColor} !important;\n }\n .pm-pane-border-color {\n border-color: ${theme.paneBorderColor} !important;\n }\n .pm-div .pm-div {\n border-color: ${theme.focusOutlineColor} !important;\n }\n .pm-raw-block-border {\n border-color: ${theme.markupTextColor} !important;\n }\n .pm-popup {\n box-shadow: 0 1px 3px ${theme.blockBorderColor} !important;\n }\n .pm-selected-node-outline-color,\n .ProseMirror-selectednode {\n outline-color: ${theme.nodeSelectionColor} !important;\n }\n .pm-selected-node-border-color {\n border-color: ${theme.nodeSelectionColor} !important;\n }\n .pm-dark-mode .pm-selected-node-outline-color,\n .pm-dark-mode .ProseMirror-selectednode {\n outline-color: ${theme.nodeSelectionColor} !important;\n }\n .pm-dark-mode .pm-selected-node-border-color {\n border-color: ${theme.nodeSelectionColor} !important;\n }\n .pm-background-color *::selection {\n background-color: ${theme.selectionColor} !important;\n }\n .pm-background-color *::-moz-selection {\n background-color: ${theme.selectionColor} !important;\n }\n .pm-fixedwidth-font {\n font-family: ${theme.fixedWidthFont} !important;\n font-size: ${theme.fixedWidthFontSizePt}pt !important;\n }\n .pm-proportional-font {\n font-family: ${theme.proportionalFont} !important;\n font-size: ${theme.proportionalFontSizePt}pt !important;\n }\n .pm-emoji-font {\n font-family: ${theme.fixedWidthFont} !important;\n }\n .pm-input-text {\n border-color: ${theme.paneBorderColor};\n }\n .pm-input-button {\n border-color: ${theme.borderBackgroundColor};\n background-color: ${theme.backgroundColor};\n }\n .pm-input-outline-button {\n color: ${theme.textColor};\n border-color: ${theme.textColor};\n background-color: ${theme.backgroundColor};\n }\n .pm-ace-first-line-meta .ace_text-layer .ace_line_group:first-child,\n .pm-ace-first-line-meta .ace_text-layer .ace_line_group:first-child span {\n color: ${theme.lightTextColor} !important;\n }\n .pm-ace-collapsed.pm-ace-focused {\n border-color: ${theme.paneBorderColor} !important;\n }\n .ProseMirror-gapcursor:after {\n border-top: 1px solid ${theme.textColor};\n }\n `;\n\n // set style\n setStyleElement('pm-editor-theme-styles-id', themeCss);\n}\n\nexport function applyPadding(padding: string) {\n const paddingCss = `\n .pm-editing-root-node {\n padding-left: ${padding} !important;\n padding-right: ${padding} !important;\n }\n `;\n setStyleElement('pm-editor-padding-styles-id', paddingCss);\n}\n\nfunction setStyleElement(id: string, css: string) {\n // get access to style element (create if necessary)\n let styleEl = window.document.getElementById(id);\n if (styleEl === null) {\n styleEl = window.document.createElement('style');\n styleEl.setAttribute('id', id);\n styleEl.setAttribute('type', 'text/css');\n window.document.head.appendChild(styleEl);\n }\n\n // set css\n styleEl.innerHTML = css;\n}\n","/*\n * editor-images.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorUIImages } from '../api/ui-images';\n\nimport copyImage from './images/copy.png';\nimport propertiesImage from './images/properties.png';\nimport propertiesDecoImage from './images/properties_deco.png';\nimport propertiesDecoDarkImage from './images/properties_deco_dark.png';\nimport removelinkImage from './images/removelink.png';\nimport runchunkImage from './images/runchunk.png';\nimport runprevchunksImage from './images/runprevchunks.png';\nimport searchImage from './images/search.png';\nimport searchProgressImage from './images/search_progress.gif';\n\nimport omniInsertGenericImage from './images/omni_insert/generic.png';\nimport heading1Image from './images/omni_insert/heading1.png';\nimport heading1DarkImage from './images/omni_insert/heading1_dark.png';\nimport heading2Image from './images/omni_insert/heading2.png';\nimport heading2DarkImage from './images/omni_insert/heading2_dark.png';\nimport heading3Image from './images/omni_insert/heading3.png';\nimport heading3DarkImage from './images/omni_insert/heading3_dark.png';\nimport heading4Image from './images/omni_insert/heading4.png';\nimport heading4DarkImage from './images/omni_insert/heading4_dark.png';\nimport bulletListImage from './images/omni_insert/bullet_list.png';\nimport bulletListDarkImage from './images/omni_insert/bullet_list_dark.png';\nimport orderedListImage from './images/omni_insert/ordered_list.png';\nimport orderedListDarkImage from './images/omni_insert/ordered_list_dark.png';\nimport blockquoteImage from './images/omni_insert/blockquote.png';\nimport blockquoteDarkImage from './images/omni_insert/blockquote_dark.png';\nimport mathInlineImage from './images/omni_insert/math_inline.png';\nimport mathInlineDarkImage from './images/omni_insert/math_inline_dark.png';\nimport mathDisplayImage from './images/omni_insert/math_display.png';\nimport mathDisplayDarkImage from './images/omni_insert/math_display_dark.png';\nimport htmlBlockImage from './images/omni_insert/html_block.png';\nimport htmlBlockDarkImage from './images/omni_insert/html_block_dark.png';\nimport lineBlockImage from './images/omni_insert/line_block.png';\nimport lineBlockDarkImage from './images/omni_insert/line_block_dark.png';\nimport emojiImage from './images/omni_insert/emoji.png';\nimport emojiDarkImage from './images/omni_insert/emoji_dark.png';\nimport commentImage from './images/omni_insert/comment.png';\nimport commentDarkImage from './images/omni_insert/comment_dark.png';\nimport divImage from './images/omni_insert/div.png';\nimport divDarkImage from './images/omni_insert/div_dark.png';\nimport codeBlockImage from './images/omni_insert/code_block.png';\nimport codeBlockDarkImage from './images/omni_insert/code_block_dark.png';\nimport footnoteImage from './images/omni_insert/footnote.png';\nimport footnoteDarkImage from './images/omni_insert/footnote_dark.png';\nimport citationImage from './images/omni_insert/citation.png';\nimport citationDarkImage from './images/omni_insert/citation_dark.png';\nimport crossReferenceImage from './images/omni_insert/cross_reference.png';\nimport crossReferenceDarkImage from './images/omni_insert/cross_reference_dark.png';\nimport symbolImage from './images/omni_insert/symbol.png';\nimport symbolDarkImage from './images/omni_insert/symbol_dark.png';\nimport tableImage from './images/omni_insert/table.png';\nimport tableDarkImage from './images/omni_insert/table_dark.png';\nimport definitionListImage from './images/omni_insert/definition_list.png';\nimport definitionListDarkImage from './images/omni_insert/definition_list_dark.png';\nimport horizontalRuleImage from './images/omni_insert/horizontal_rule.png';\nimport horizontalRuleDarkImage from './images/omni_insert/horizontal_rule_dark.png';\nimport imgImage from './images/omni_insert/image.png';\nimport imgDarkImage from './images/omni_insert/image_dark.png';\nimport linkImage from './images/omni_insert/link.png';\nimport linkDarkImage from './images/omni_insert/link_dark.png';\nimport paragraphImage from './images/omni_insert/paragraph.png';\nimport paragraphDarkImage from './images/omni_insert/paragraph_dark.png';\nimport rawBlockImage from './images/omni_insert/raw_block.png';\nimport rawBlockDarkImage from './images/omni_insert/raw_block_dark.png';\nimport rawInlineImage from './images/omni_insert/raw_inline.png';\nimport rawInlineDarkImage from './images/omni_insert/raw_inline_dark.png';\nimport texBlockImage from './images/omni_insert/tex_block.png';\nimport texBlockDarkImage from './images/omni_insert/tex_block_dark.png';\nimport yamlBlockImage from './images/omni_insert/yaml_block.png';\nimport yamlBlockDarkImage from './images/omni_insert/yaml_block_dark.png';\nimport pythonChunkImage from './images/omni_insert/python_chunk.png';\nimport sqlChunkImage from './images/omni_insert/sql_chunk.png';\nimport d3ChunkImage from './images/omni_insert/d3_chunk.png';\nimport stanChunkImage from './images/omni_insert/stan_chunk.png';\nimport bashChunkImage from './images/omni_insert/bash_chunk.png';\nimport bashChunkDarkImage from './images/omni_insert/bash_chunk_dark.png';\nimport rChunkImage from './images/omni_insert/r_chunk.png';\nimport rChunkDarkImage from './images/omni_insert/r_chunk_dark.png';\nimport rcppChunkImage from './images/omni_insert/rcpp_chunk.png';\nimport rcppChunkDarkImage from './images/omni_insert/rcpp_chunk_dark.png';\nimport tabsetImage from './images/omni_insert/tabset.png';\nimport tabsetDarkImage from './images/omni_insert/tabset_dark.png';\nimport slideColumns from './images/omni_insert/slide_columns.png';\nimport slideColumnsDark from './images/omni_insert/slide_columns_dark.png';\nimport slidePause from './images/omni_insert/slide_pause.png';\nimport slidePauseDark from './images/omni_insert/slide_pause_dark.png';\nimport slideNotes from './images/omni_insert/slide_notes.png';\nimport slideNotesDark from './images/omni_insert/slide_notes_dark.png';\n\nimport articleImage from './images/citations/article.png';\nimport articleDarkImage from './images/citations/article_dark.png';\nimport bookImage from './images/citations/book.png';\nimport bookDarkImage from './images/citations/book_dark.png';\nimport broadcastImage from './images/citations/broadcast.png';\nimport broadcastDarkImage from './images/citations/broadcast_dark.png';\nimport dataImage from './images/citations/data.png';\nimport dataDarkImage from './images/citations/data_dark.png';\nimport entryImage from './images/citations/entry.png';\nimport entryDarkImage from './images/citations/entry_dark.png';\nimport imageImage from './images/citations/image.png';\nimport imageDarkImage from './images/citations/image_dark.png';\nimport legalImage from './images/citations/legal.png';\nimport legalDarkImage from './images/citations/legal_dark.png';\nimport mapImage from './images/citations/map.png';\nimport mapDarkImage from './images/citations/map_dark.png';\nimport movieImage from './images/citations/movie.png';\nimport movieDarkImage from './images/citations/movie_dark.png';\nimport otherImage from './images/citations/other.png';\nimport otherDarkImage from './images/citations/other_dark.png';\nimport songImage from './images/citations/song.png';\nimport songDarkImage from './images/citations/song_dark.png';\nimport webImage from './images/citations/web.png';\nimport webDarkImage from './images/citations/web_dark.png';\nimport zoteroOverlayImage from './images/citations/zotero-overlay.png';\nimport localSourcesImage from './images/citations/insert/local-sources.png';\nimport packageImage from './images/citations/insert/packages.png';\nimport bibliographyImage from './images/citations/insert/bibliography.png';\nimport bibliographyFolderImage from './images/citations/insert/bibliography-folder.png';\nimport zoteroRootImage from './images/citations/insert/zotero-root.png';\nimport zoteroLibraryImage from './images/citations/insert/zotero-library.png';\nimport zoteroCollectionImage from './images/citations/insert/zotero-collection.png';\nimport doiImage from './images/citations/insert/doi.png';\nimport crossRefImage from './images/citations/insert/crossref.png';\nimport pubmedImage from './images/citations/insert/pubmed.png';\nimport dataciteImage from './images/citations/insert/datacite.png';\n\nimport equationXRefImage from './images/xref/equation.png';\nimport equationXRefDarkImage from './images/xref/equation_dark.png';\nimport sectionXRefImage from './images/xref/section.png';\nimport sectionXRefDarkImage from './images/xref/section_dark.png';\nimport listingXRefImage from './images/xref/listing.png';\nimport listingXRefDarkImage from './images/xref/listing.png';\nimport tableXRefImage from './images/xref/table.png';\nimport tableXRefDarkImage from './images/xref/table_dark.png';\nimport figureXRefImage from './images/xref/figure.png';\nimport figureXRefDarkImage from './images/xref/figure_dark.png';\nimport theoremXRefImage from './images/xref/theorem.png';\nimport theoremXRefDarkImage from './images/xref/theorem_dark.png';\n\nimport allXRefInsertImage from './images/xref/insert/all.png';\nimport equationXRefInsertImage from './images/xref/insert/equation.png';\nimport sectionXRefInsertImage from './images/xref/insert/section.png';\nimport listingXRefInsertImage from './images/xref/insert/listing.png';\nimport tableXRefInsertImage from './images/xref/insert/table.png';\nimport figureXRefInsertImage from './images/xref/insert/figure.png';\nimport theoremXRefInsertImage from './images/xref/insert/theorem.png';\n\nimport tagDelete from './images/widgets/tag-delete.png';\nimport tagEdit from './images/widgets/tag-edit.png';\n\nexport function defaultEditorUIImages(): EditorUIImages {\n return {\n copy: copyImage,\n properties: propertiesImage,\n properties_deco: propertiesDecoImage,\n properties_deco_dark: propertiesDecoDarkImage,\n removelink: removelinkImage,\n runchunk: runchunkImage,\n runprevchunks: runprevchunksImage,\n search: searchImage,\n search_progress: searchProgressImage,\n omni_insert: {\n generic: omniInsertGenericImage,\n heading1: heading1Image,\n heading1_dark: heading1DarkImage,\n heading2: heading2Image,\n heading2_dark: heading2DarkImage,\n heading3: heading3Image,\n heading3_dark: heading3DarkImage,\n heading4: heading4Image,\n heading4_dark: heading4DarkImage,\n bullet_list: bulletListImage,\n bullet_list_dark: bulletListDarkImage,\n ordered_list: orderedListImage,\n ordered_list_dark: orderedListDarkImage,\n blockquote: blockquoteImage,\n blockquote_dark: blockquoteDarkImage,\n math_inline: mathInlineImage,\n math_inline_dark: mathInlineDarkImage,\n math_display: mathDisplayImage,\n math_display_dark: mathDisplayDarkImage,\n html_block: htmlBlockImage,\n html_block_dark: htmlBlockDarkImage,\n line_block: lineBlockImage,\n line_block_dark: lineBlockDarkImage,\n emoji: emojiImage,\n emoji_dark: emojiDarkImage,\n comment: commentImage,\n comment_dark: commentDarkImage,\n div: divImage,\n div_dark: divDarkImage,\n code_block: codeBlockImage,\n code_block_dark: codeBlockDarkImage,\n footnote: footnoteImage,\n footnote_dark: footnoteDarkImage,\n citation: citationImage,\n citation_dark: citationDarkImage,\n cross_reference: crossReferenceImage,\n cross_reference_dark: crossReferenceDarkImage,\n symbol: symbolImage,\n symbol_dark: symbolDarkImage,\n table: tableImage,\n table_dark: tableDarkImage,\n definition_list: definitionListImage,\n definition_list_dark: definitionListDarkImage,\n horizontal_rule: horizontalRuleImage,\n horizontal_rule_dark: horizontalRuleDarkImage,\n image: imgImage,\n image_dark: imgDarkImage,\n link: linkImage,\n link_dark: linkDarkImage,\n paragraph: paragraphImage,\n paragraph_dark: paragraphDarkImage,\n raw_block: rawBlockImage,\n raw_block_dark: rawBlockDarkImage,\n raw_inline: rawInlineImage,\n raw_inline_dark: rawInlineDarkImage,\n tex_block: texBlockImage,\n tex_block_dark: texBlockDarkImage,\n yaml_block: yamlBlockImage,\n yaml_block_dark: yamlBlockDarkImage,\n python_chunk: pythonChunkImage,\n sql_chunk: sqlChunkImage,\n d3_chunk: d3ChunkImage,\n stan_chunk: stanChunkImage,\n bash_chunk: bashChunkImage,\n bash_chunk_dark: bashChunkDarkImage,\n r_chunk: rChunkImage,\n r_chunk_dark: rChunkDarkImage,\n rcpp_chunk: rcppChunkImage,\n rcpp_chunk_dark: rcppChunkDarkImage,\n tabset: tabsetImage,\n tabset_dark: tabsetDarkImage,\n slide_columns: slideColumns,\n slide_columns_dark: slideColumnsDark,\n slide_notes: slideNotes,\n slide_notes_dark: slideNotesDark,\n slide_pause: slidePause,\n slide_pause_dark: slidePauseDark\n },\n citations: {\n article: articleImage,\n article_dark: articleDarkImage,\n book: bookImage,\n book_dark: bookDarkImage,\n broadcast: broadcastImage,\n broadcast_dark: broadcastDarkImage,\n data: dataImage,\n data_dark: dataDarkImage,\n entry: entryImage,\n entry_dark: entryDarkImage,\n image: imageImage,\n image_dark: imageDarkImage,\n legal: legalImage,\n legal_dark: legalDarkImage,\n map: mapImage,\n map_dark: mapDarkImage,\n movie: movieImage,\n movie_dark: movieDarkImage,\n other: otherImage,\n other_dark: otherDarkImage,\n song: songImage,\n song_dark: songDarkImage,\n web: webImage,\n web_dark: webDarkImage,\n zoteroOverlay: zoteroOverlayImage,\n local_sources: localSourcesImage,\n packages: packageImage,\n bibligraphy: bibliographyImage,\n bibligraphy_folder: bibliographyFolderImage,\n zotero_library: zoteroLibraryImage,\n zotero_collection: zoteroCollectionImage,\n zotero_root: zoteroRootImage,\n doi: doiImage,\n crossref: crossRefImage,\n pubmed: pubmedImage,\n datacite: dataciteImage,\n },\n xrefs: {\n section: sectionXRefImage,\n section_dark: sectionXRefDarkImage,\n figure: figureXRefImage,\n figure_dark: figureXRefDarkImage,\n table: tableXRefImage,\n table_dark: tableXRefDarkImage,\n listing: listingXRefImage,\n listing_dark: listingXRefDarkImage,\n equation: equationXRefImage,\n equation_dark: equationXRefDarkImage,\n theorem: theoremXRefImage,\n theorem_dark: theoremXRefDarkImage,\n type_all: allXRefInsertImage,\n type_section: sectionXRefInsertImage,\n type_equation: equationXRefInsertImage,\n type_figure: figureXRefInsertImage,\n type_table: tableXRefInsertImage,\n type_listing: listingXRefInsertImage,\n type_theorem: theoremXRefInsertImage\n },\n widgets: {\n tag_delete: tagDelete,\n tag_edit: tagEdit,\n },\n };\n}\n","/*\n * editor-menus.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorMenuItem, EditorUI } from '../api/ui';\nimport { tableMenu } from '../api/table';\nimport { EditorCommandId, EditorCommand } from '../api/command';\n\nexport interface EditorMenus {\n format: EditorMenuItem[];\n insert: EditorMenuItem[];\n table: EditorMenuItem[];\n}\n\nexport function editorMenus(ui: EditorUI, commands: EditorCommand[]) {\n return {\n format: formatMenu(ui, commands),\n insert: insertMenu(ui, commands),\n table: tableMenu(true, ui),\n };\n}\n\nfunction formatMenu(ui: EditorUI, commands: EditorCommand[]) {\n return [\n { command: EditorCommandId.Strong },\n { command: EditorCommandId.Em },\n { command: EditorCommandId.Underline },\n { command: EditorCommandId.Code },\n {\n text: ui.context.translateText('Text'),\n subMenu: {\n items: [\n { command: EditorCommandId.Strikeout },\n { command: EditorCommandId.Superscript },\n { command: EditorCommandId.Subscript },\n { command: EditorCommandId.Smallcaps },\n ],\n },\n },\n { separator: true },\n {\n text: ui.context.translateText('Bullets & Numbering'),\n subMenu: {\n items: [\n { command: EditorCommandId.BulletList },\n { command: EditorCommandId.OrderedList },\n { separator: true },\n { command: EditorCommandId.TightList },\n { separator: true },\n { command: EditorCommandId.ListItemCheck },\n { command: EditorCommandId.ListItemCheckToggle },\n { separator: true },\n { command: EditorCommandId.ListItemSink },\n { command: EditorCommandId.ListItemLift },\n { separator: true },\n { command: EditorCommandId.EditListProperties },\n ],\n },\n },\n { separator: true },\n { command: codeBlockCommand(commands) },\n { command: EditorCommandId.Blockquote },\n { command: EditorCommandId.LineBlock },\n { separator: haveAnyOf(commands, EditorCommandId.Div, EditorCommandId.Span) },\n { command: EditorCommandId.Div },\n { command: EditorCommandId.Span },\n { separator: true },\n {\n text: ui.context.translateText('Raw'),\n subMenu: {\n items: [\n { command: EditorCommandId.HTMLInline },\n { command: EditorCommandId.HTMLBlock },\n { separator: true },\n { command: EditorCommandId.TexInline },\n { command: EditorCommandId.TexBlock },\n { separator: true },\n { command: EditorCommandId.RawInline },\n { command: EditorCommandId.RawBlock },\n ],\n },\n },\n { separator: true },\n { command: EditorCommandId.ClearFormatting },\n { separator: true },\n { command: EditorCommandId.AttrEdit },\n ];\n}\n\nfunction insertMenu(ui: EditorUI, commands: EditorCommand[]) {\n return [\n { command: EditorCommandId.OmniInsert },\n ...(haveAnyOf(commands, EditorCommandId.RCodeChunk, EditorCommandId.PythonCodeChunk)\n ? [\n { separator: true },\n {\n text: ui.context.translateText('Code Chunk'),\n subMenu: {\n items: [\n { command: EditorCommandId.RCodeChunk },\n { separator: true },\n { command: EditorCommandId.PythonCodeChunk },\n { command: EditorCommandId.BashCodeChunk },\n { command: EditorCommandId.RcppCodeChunk },\n { command: EditorCommandId.SQLCodeChunk },\n { command: EditorCommandId.D3CodeChunk },\n { command: EditorCommandId.StanCodeChunk },\n ],\n },\n },\n ]\n : []),\n { separator: true },\n { command: EditorCommandId.Table },\n { command: EditorCommandId.Image },\n { command: EditorCommandId.Link },\n { command: EditorCommandId.Shortcode },\n ...(haveAnyOf(commands, EditorCommandId.Citation, EditorCommandId.CrossReference, EditorCommandId.Footnote)\n ? [\n { separator: true },\n { command: EditorCommandId.Citation },\n { command: EditorCommandId.CrossReference },\n { command: EditorCommandId.Footnote },\n ] : []),\n ...(haveAnyOf(commands, EditorCommandId.InsertSlideNotes, EditorCommandId.InsertSlidePause, EditorCommandId.InsertSlideColumns)\n ? [\n { separator: true },\n { command: EditorCommandId.InsertSlideColumns },\n { command: EditorCommandId.InsertSlidePause },\n { command: EditorCommandId.InsertSlideNotes }\n ] : []),\n { separator: true },\n ...(haveAnyOf(commands, EditorCommandId.InlineMath, EditorCommandId.DisplayMath)\n ? [\n {\n text: ui.context.translateText('LaTeX Math'),\n subMenu: {\n items: [\n { command: EditorCommandId.InlineMath },\n { command: EditorCommandId.DisplayMath },\n ],\n },\n },\n ]\n : []),\n ...(haveAnyOf(commands, EditorCommandId.DefinitionList)\n ? [\n {\n text: ui.context.translateText('Definition'),\n subMenu: {\n items: [\n { command: EditorCommandId.DefinitionList },\n { separator: true },\n { command: EditorCommandId.DefinitionTerm },\n { command: EditorCommandId.DefinitionDescription },\n ],\n },\n },\n ]\n : []),\n {\n text: ui.context.translateText('Special Characters'),\n subMenu: {\n items: [\n { command: EditorCommandId.Emoji },\n { command: EditorCommandId.Symbol },\n { separator: true },\n { command: EditorCommandId.EnDash },\n { command: EditorCommandId.EmDash },\n { separator: true },\n { command: EditorCommandId.NonBreakingSpace },\n { separator: true },\n { command: EditorCommandId.HardLineBreak },\n ],\n },\n },\n { separator: true },\n { command: EditorCommandId.ParagraphInsert },\n { command: EditorCommandId.InsertDiv },\n { command: EditorCommandId.HorizontalRule },\n ...(haveAnyOf(commands, EditorCommandId.Tabset)\n ? [\n { separator: true },\n { command: EditorCommandId.Tabset },\n { command: EditorCommandId.Callout },\n ] : []),\n { separator: true },\n { command: EditorCommandId.CodeBlockFormat },\n { command: EditorCommandId.YamlMetadata },\n { separator: true },\n { command: EditorCommandId.HTMLComment },\n ];\n}\n\n\nfunction haveReferenceMenu(commands: EditorCommand[]) {\n return haveAnyOf(commands, \n EditorCommandId.Citation,\n EditorCommandId.CrossReference,\n EditorCommandId.Footnote\n );\n}\n\nfunction haveAnyOf(commands: EditorCommand[], ...ids: EditorCommandId[]) {\n for (const command of commands) {\n if (ids.includes(command.id)) {\n return true;\n }\n }\n return false;\n}\n\nfunction codeBlockCommand(commands: EditorCommand[]) {\n return haveAnyOf(commands, EditorCommandId.CodeBlockFormat)\n ? EditorCommandId.CodeBlockFormat\n : EditorCommandId.CodeBlock;\n}\n","/*\n * table.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorCommandId } from './command';\nimport { EditorUI } from './ui';\n\nexport interface TableCapabilities {\n captions: boolean;\n headerOptional: boolean;\n multiline: boolean;\n}\n\nexport function tableMenu(insert: boolean, ui: EditorUI) {\n return [\n ...(insert \n ? [{ command: EditorCommandId.TableInsertTable }, \n { separator: true }\n ] \n : []\n ),\n { command: EditorCommandId.TableAddRowBefore },\n { command: EditorCommandId.TableAddRowAfter },\n { separator: true },\n { command: EditorCommandId.TableAddColumnBefore },\n { command: EditorCommandId.TableAddColumnAfter },\n { separator: true },\n { command: EditorCommandId.TableDeleteRow },\n { command: EditorCommandId.TableDeleteColumn },\n { separator: true },\n { command: EditorCommandId.TableDeleteTable },\n { separator: true },\n {\n text: ui.context.translateText('Align Column'),\n subMenu: {\n items: [\n { command: EditorCommandId.TableAlignColumnLeft },\n { command: EditorCommandId.TableAlignColumnCenter },\n { command: EditorCommandId.TableAlignColumnRight },\n { separator: true },\n { command: EditorCommandId.TableAlignColumnDefault },\n ],\n },\n },\n { separator: true },\n { command: EditorCommandId.TableToggleHeader },\n { command: EditorCommandId.TableToggleCaption },\n ];\n}\n","/*\n * editor-schema.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { Schema, NodeSpec, MarkSpec, Node as ProsemirrorNode } from 'prosemirror-model';\n\nimport { ExtensionManager } from './editor-extensions';\nimport { PandocNode } from '../api/node';\nimport { PandocMark } from '../api/mark';\n\nexport function editorSchema(extensions: ExtensionManager): Schema {\n // build in doc node + nodes from extensions\n const nodes: { [name: string]: NodeSpec } = {\n doc: {\n attrs: {\n initial: { default: false },\n },\n content: 'body notes',\n },\n\n body: {\n content: 'block+',\n isolating: true,\n parseDOM: [{ tag: 'div[class*=\"body\"]' }],\n toDOM() {\n return [\n 'div',\n { class: 'body pm-cursor-color pm-text-color pm-background-color pm-editing-root-node' },\n ['div', { class: 'pm-content' }, 0],\n ];\n },\n },\n\n notes: {\n content: 'note*',\n parseDOM: [{ tag: 'div[class*=\"notes\"]' }],\n toDOM() {\n return [\n 'div',\n { class: 'notes pm-cursor-color pm-text-color pm-background-color pm-editing-root-node' },\n ['div', { class: 'pm-content' }, 0],\n ];\n },\n },\n\n note: {\n content: 'block+',\n attrs: {\n ref: {},\n number: { default: 1 },\n },\n isolating: true,\n parseDOM: [\n {\n tag: 'div[class*=\"note\"]',\n getAttrs(dom: Node | string) {\n const el = dom as Element;\n return {\n ref: el.getAttribute('data-ref'),\n };\n },\n },\n ],\n toDOM(node: ProsemirrorNode) {\n return [\n 'div',\n { 'data-ref': node.attrs.ref, class: 'note pm-footnote-body', 'data-number': node.attrs.number },\n 0,\n ];\n },\n },\n };\n extensions.pandocNodes().forEach((node: PandocNode) => {\n nodes[node.name] = node.spec;\n });\n\n // marks from extensions\n const marks: { [name: string]: MarkSpec } = {};\n extensions.pandocMarks().forEach((mark: PandocMark) => {\n marks[mark.name] = mark.spec;\n });\n\n // allow code to exclude marks that don't support input rules\n // (e.g. marks that denote a special escape sequences from markdown,\n // like raw_tex, raw_html, shortcodes, xrefs, math, etc.)\n if (marks.code) {\n const excludeInCode = extensions\n .pandocMarks()\n .filter(mark => mark.noInputRules && mark.name !== 'code')\n .map(mark => mark.name)\n .join(' ');\n marks.code.excludes = excludeInCode;\n }\n\n // return schema\n return new Schema({\n nodes,\n marks,\n });\n}\n","/*\n * presentation.ts\n *\n * Copyright (C) 2022 by RStudio, PBC\n *\n * Unless you have received this program directly from RStudio pursuant\n * to the terms of a commercial license agreement with RStudio, then\n * this program is licensed to you under the terms of version 3 of the\n * GNU Affero General Public License. This program is distributed WITHOUT\n * ANY EXPRESS OR IMPLIED WARRANTY, INCLUDING THOSE OF NON-INFRINGEMENT,\n * MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Please refer to the\n * AGPL (http://www.gnu.org/licenses/agpl-3.0.txt) for more details.\n *\n */\n\nimport { EditorState } from 'prosemirror-state';\n\nimport { findTopLevelBodyNodes } from './node';\nimport { titleFromState } from './yaml';\n\nexport interface PresentationEditorLocation {\n items: PresentationEditorLocationItem[];\n auto_slide_level: number;\n}\n\nexport const kPresentationEditorLocationTitle = \"title\";\nexport const kPresentationEditorLocationHeading = \"heading\";\nexport const kPresentationEditorLocationHr = \"hr\";\nexport const kPresentationEditorLocationCursor = \"cursor\";\n\nexport interface PresentationEditorLocationItem {\n type: string;\n level: number;\n // extra field we use internally for navigation\n pos: number;\n}\n\nexport function getPresentationEditorLocation(state: EditorState) : PresentationEditorLocation {\n \n // not the cursor position\n const cursorPos = state.selection.from;\n\n // build list of items\n let autoSlideLevel = Number.MAX_VALUE;\n const items: PresentationEditorLocationItem[] = [];\n\n // get top level headings and horizontal rules\n const schema = state.schema;\n const bodyNodes = findTopLevelBodyNodes(state.doc, node => true);\n\n // bail if empty\n if (bodyNodes.length === 0) {\n return { items, auto_slide_level: 0 };\n }\n\n // start with title if we have one. note that pandoc will make the title slide\n // first no matter where it appears in the document, so we do the same here\n const title = titleFromState(state);\n if (title) {\n items.push({ \n type: kPresentationEditorLocationTitle, \n level: 0,\n pos: bodyNodes[0].pos\n });\n }\n\n // get top level headings and horizontal rules\n \n let pendingAutoSlideLevel = 0;\n let foundCursor = false;\n for (const nodeWithPos of bodyNodes) {\n // if node is past the selection then add the cursor token\n if (!foundCursor && (nodeWithPos.pos > cursorPos)) {\n foundCursor = true;\n items.push({\n type: kPresentationEditorLocationCursor,\n level: 0,\n pos: nodeWithPos.pos\n });\n }\n // add the node with the requisite type\n const node = nodeWithPos.node;\n if (node.type === schema.nodes.heading) {\n const level = node.attrs.level || 0;\n // track pending auto slide level\n if (level < autoSlideLevel) {\n pendingAutoSlideLevel = level;\n } else{\n pendingAutoSlideLevel= 0;\n }\n items.push({\n type: kPresentationEditorLocationHeading,\n level,\n pos: nodeWithPos.pos\n });\n } else if (node.type === schema.nodes.horizontal_rule) {\n items.push({\n type: kPresentationEditorLocationHr,\n level: 0,\n pos: nodeWithPos.pos\n });\n pendingAutoSlideLevel= 0;\n } else if (pendingAutoSlideLevel > 0) {\n autoSlideLevel = pendingAutoSlideLevel;\n pendingAutoSlideLevel = 0;\n }\n }\n\n // last chance to collect pending auto slide level\n if (pendingAutoSlideLevel > 0){\n autoSlideLevel = pendingAutoSlideLevel;\n }\n \n // didn't find an auto slide level\n if (autoSlideLevel === Number.MAX_VALUE) {\n autoSlideLevel = 0;\n }\n \n // return the items\n return { items, auto_slide_level: autoSlideLevel };\n}\n\nexport function positionForPresentationEditorLocation(\n state: EditorState, \n location: PresentationEditorLocation\n) : number {\n // get the positions of the editor's current state (filter out cursor)\n const editorItems = getPresentationEditorLocation(state).items\n .filter(item => item.type !== kPresentationEditorLocationCursor);\n \n // get the index of the cursor passed in the location\n const cursorIdx = location.items.findIndex(\n item => item.type === kPresentationEditorLocationCursor)\n ;\n\n // go one slide before the cursor\n if (cursorIdx >= 0) {\n const locationItem = editorItems[cursorIdx];\n return locationItem.pos;\n }\n\n // default if we can't find a location\n return -1;\n}\n"]} \ No newline at end of file overalldiffered=1 (number of pkgs that are not bit-by-bit identical: 0 is good) overall=1