From 381ef47d11ce9996dab3cfa320f776a32836eaa4 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 6 Nov 2025 00:25:59 +0000 Subject: [PATCH 1/6] Initial plan From 810c7be00514ea415c6aea8817e1313e444d8e44 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 6 Nov 2025 00:40:33 +0000 Subject: [PATCH 2/6] Add read-along directive implementation Co-authored-by: mikebarkmin <2592379+mikebarkmin@users.noreply.github.com> --- .../assets/directive-readalong/client.js | 326 ++++++++++++++++++ .../assets/directive-readalong/style.css | 107 ++++++ packages/markdown/src/process.ts | 2 + .../markdown/src/remarkDirectiveReadalong.ts | 185 ++++++++++ .../remarkDirectiveReadalong.test.ts.snap | 62 ++++ .../tests/remarkDirectiveReadalong.test.ts | 116 +++++++ 6 files changed, 798 insertions(+) create mode 100644 packages/markdown/assets/directive-readalong/client.js create mode 100644 packages/markdown/assets/directive-readalong/style.css create mode 100644 packages/markdown/src/remarkDirectiveReadalong.ts create mode 100644 packages/markdown/tests/__snapshots__/remarkDirectiveReadalong.test.ts.snap create mode 100644 packages/markdown/tests/remarkDirectiveReadalong.test.ts diff --git a/packages/markdown/assets/directive-readalong/client.js b/packages/markdown/assets/directive-readalong/client.js new file mode 100644 index 00000000..a12a33c6 --- /dev/null +++ b/packages/markdown/assets/directive-readalong/client.js @@ -0,0 +1,326 @@ +hyperbook.readalong = (function () { + /** + * @typedef {Object} WordTimestamp + * @property {string} word + * @property {number} start + * @property {number} end + */ + + /** + * @typedef {Object} ReadalongConfig + * @property {string} id + * @property {WordTimestamp[]} timestamps + * @property {boolean} autoGenerate + * @property {number} speed + * @property {string} text + */ + + /** + * @typedef {Object} ReadalongInstance + * @property {HTMLElement} container + * @property {HTMLAudioElement} audio + * @property {HTMLElement} textContainer + * @property {ReadalongConfig} config + * @property {number} currentWordIndex + * @property {number} intervalId + */ + + /** + * @type {Record} + */ + const instances = {}; + + /** + * Format seconds to MM:SS + * @param {number} seconds + */ + function formatTime(seconds) { + seconds = Math.floor(seconds); + const m = Math.floor(seconds / 60); + const s = seconds - m * 60; + const tm = m < 10 ? "0" + m : m; + const ts = s < 10 ? "0" + s : s; + return tm + ":" + ts; + } + + /** + * Generate automatic timestamps based on text and speed + * @param {string} text + * @param {number} speed Words per minute + * @param {number} duration Audio duration in seconds + * @returns {WordTimestamp[]} + */ + function generateTimestamps(text, speed, duration) { + // Split text into words, keeping punctuation + const words = text.match(/\S+/g) || []; + const millisecondsPerWord = (60 / speed) * 1000; + + const timestamps = []; + let currentTime = 0; + + for (let i = 0; i < words.length; i++) { + const word = words[i]; + const wordDuration = millisecondsPerWord; + + timestamps.push({ + word: word, + start: currentTime / 1000, + end: (currentTime + wordDuration) / 1000, + }); + + currentTime += wordDuration; + } + + return timestamps; + } + + /** + * Wrap each word in the text container with a span + * @param {HTMLElement} textContainer + * @param {WordTimestamp[]} timestamps + */ + function wrapWords(textContainer, timestamps) { + // Get all text nodes + const walker = document.createTreeWalker( + textContainer, + NodeFilter.SHOW_TEXT, + null + ); + + const textNodes = []; + let node; + while ((node = walker.nextNode())) { + textNodes.push(node); + } + + let timestampIndex = 0; + + for (const textNode of textNodes) { + const text = textNode.nodeValue || ""; + const words = text.match(/\S+|\s+/g) || []; + const fragment = document.createDocumentFragment(); + + for (const word of words) { + if (word.trim()) { + // It's a word, not whitespace + const span = document.createElement("span"); + span.className = "readalong-word"; + span.textContent = word; + + if (timestamps[timestampIndex]) { + span.setAttribute("data-start", timestamps[timestampIndex].start.toString()); + span.setAttribute("data-end", timestamps[timestampIndex].end.toString()); + span.setAttribute("data-index", timestampIndex.toString()); + + // Make word clickable + span.style.cursor = "pointer"; + span.onclick = function() { + const start = parseFloat(this.getAttribute("data-start") || "0"); + const instance = instances[textContainer.getAttribute("data-id")]; + if (instance && instance.audio) { + instance.audio.currentTime = start; + if (instance.audio.paused) { + instance.audio.play(); + } + } + }; + + timestampIndex++; + } + + fragment.appendChild(span); + } else { + // It's whitespace, keep as text + fragment.appendChild(document.createTextNode(word)); + } + } + + textNode.parentNode.replaceChild(fragment, textNode); + } + } + + /** + * Highlight the current word based on audio time + * @param {string} id + */ + function updateHighlight(id) { + const instance = instances[id]; + if (!instance) return; + + const currentTime = instance.audio.currentTime; + const words = instance.textContainer.querySelectorAll(".readalong-word"); + + let foundActive = false; + words.forEach((word, index) => { + const start = parseFloat(word.getAttribute("data-start") || "0"); + const end = parseFloat(word.getAttribute("data-end") || "0"); + + if (currentTime >= start && currentTime < end) { + word.classList.add("active"); + foundActive = true; + + // Scroll into view if needed + if (!isInViewport(word)) { + word.scrollIntoView({ behavior: "smooth", block: "center" }); + } + } else { + word.classList.remove("active"); + } + }); + } + + /** + * Check if element is in viewport + * @param {HTMLElement} element + */ + function isInViewport(element) { + const rect = element.getBoundingClientRect(); + return ( + rect.top >= 0 && + rect.left >= 0 && + rect.bottom <= (window.innerHeight || document.documentElement.clientHeight) && + rect.right <= (window.innerWidth || document.documentElement.clientWidth) + ); + } + + /** + * Update time display + * @param {string} id + */ + function updateTimeDisplay(id) { + const instance = instances[id]; + if (!instance) return; + + const currentTimeEl = instance.container.querySelector(".current-time"); + const totalTimeEl = instance.container.querySelector(".total-time"); + + if (currentTimeEl) { + currentTimeEl.textContent = formatTime(instance.audio.currentTime); + } + if (totalTimeEl && !isNaN(instance.audio.duration)) { + totalTimeEl.textContent = formatTime(instance.audio.duration); + } + } + + /** + * Toggle play/pause + * @param {string} id + */ + function togglePlayPause(id) { + const instance = instances[id]; + if (!instance) return; + + const button = instance.container.querySelector(".play-pause"); + + if (instance.audio.paused) { + instance.audio.play(); + button.classList.add("playing"); + } else { + instance.audio.pause(); + button.classList.remove("playing"); + } + } + + /** + * Initialize a readalong instance + * @param {string} id + */ + function initInstance(id) { + const container = document.querySelector(`.directive-readalong[data-id="${id}"]`); + if (!container) return; + + const audio = container.querySelector(".readalong-audio"); + const textContainer = container.querySelector(".readalong-text"); + const configEl = container.querySelector(".readalong-config"); + + if (!audio || !textContainer || !configEl) return; + + let config; + try { + config = JSON.parse(configEl.textContent || "{}"); + } catch (e) { + console.error("Failed to parse readalong config", e); + return; + } + + const instance = { + container, + audio, + textContainer, + config, + currentWordIndex: -1, + intervalId: null, + }; + + instances[id] = instance; + + // Wait for audio metadata to load + audio.addEventListener("loadedmetadata", function() { + let timestamps = config.timestamps; + + // Generate timestamps if needed + if (!timestamps && config.autoGenerate) { + timestamps = generateTimestamps( + config.text, + config.speed || 150, + audio.duration + ); + } + + if (timestamps && timestamps.length > 0) { + wrapWords(textContainer, timestamps); + } + + updateTimeDisplay(id); + }); + + // Update on time update + audio.addEventListener("timeupdate", function() { + updateHighlight(id); + updateTimeDisplay(id); + }); + + // Update button state on play/pause + audio.addEventListener("play", function() { + const button = container.querySelector(".play-pause"); + button.classList.add("playing"); + }); + + audio.addEventListener("pause", function() { + const button = container.querySelector(".play-pause"); + button.classList.remove("playing"); + }); + + // Reset on end + audio.addEventListener("ended", function() { + const button = container.querySelector(".play-pause"); + button.classList.remove("playing"); + const words = textContainer.querySelectorAll(".readalong-word"); + words.forEach(word => word.classList.remove("active")); + }); + } + + /** + * Initialize all readalong instances on the page + */ + function init() { + const readalongElements = document.querySelectorAll(".directive-readalong"); + readalongElements.forEach(el => { + const id = el.getAttribute("data-id"); + if (id) { + initInstance(id); + } + }); + } + + // Initialize on load + if (document.readyState === "loading") { + document.addEventListener("DOMContentLoaded", init); + } else { + init(); + } + + return { + togglePlayPause, + }; +})(); diff --git a/packages/markdown/assets/directive-readalong/style.css b/packages/markdown/assets/directive-readalong/style.css new file mode 100644 index 00000000..7bf98eae --- /dev/null +++ b/packages/markdown/assets/directive-readalong/style.css @@ -0,0 +1,107 @@ +.directive-readalong { + margin-bottom: 16px; + border-radius: 8px; + border: 1px solid var(--color-nav-border); + background-color: var(--color-nav); + padding: 16px; +} + +.directive-readalong .readalong-controls { + display: flex; + align-items: center; + gap: 12px; + margin-bottom: 16px; + padding-bottom: 12px; + border-bottom: 1px solid var(--color-nav-border); +} + +.directive-readalong .play-pause { + width: 48px; + height: 48px; + border: none; + border-radius: 50%; + background-color: var(--color-primary); + cursor: pointer; + transition: transform 0.2s, background-color 0.2s; + mask-image: url('data:image/svg+xml,'); + mask-size: 28px; + mask-position: center; + mask-repeat: no-repeat; + background-color: var(--color-text); +} + +.directive-readalong .play-pause:hover { + transform: scale(1.05); + opacity: 0.9; +} + +.directive-readalong .play-pause.playing { + mask-image: url('data:image/svg+xml,'); +} + +.directive-readalong .time-display { + font-size: 14px; + font-family: monospace; + color: var(--color-text); + opacity: 0.8; +} + +.directive-readalong .readalong-text { + line-height: 1.8; + font-size: 16px; + color: var(--color-text); + user-select: none; +} + +.directive-readalong .readalong-word { + display: inline; + padding: 2px 1px; + border-radius: 3px; + transition: background-color 0.2s, color 0.2s; +} + +.directive-readalong .readalong-word:hover { + background-color: var(--color-primary); + color: var(--color-text-on-primary); + opacity: 0.7; +} + +.directive-readalong .readalong-word.active { + background-color: var(--color-primary); + color: var(--color-text-on-primary); + font-weight: 600; + animation: pulse 0.3s ease-in-out; +} + +@keyframes pulse { + 0% { + transform: scale(1); + } + 50% { + transform: scale(1.05); + } + 100% { + transform: scale(1); + } +} + +.directive-readalong .readalong-audio { + display: none; +} + +.directive-readalong .readalong-config { + display: none; +} + +/* Ensure proper spacing in text content */ +.directive-readalong .readalong-text p { + margin: 0.5em 0; +} + +.directive-readalong .readalong-text p:first-child { + margin-top: 0; +} + +.directive-readalong .readalong-text p:last-child { + margin-bottom: 0; +} diff --git a/packages/markdown/src/process.ts b/packages/markdown/src/process.ts index 7467467a..4a3ac813 100644 --- a/packages/markdown/src/process.ts +++ b/packages/markdown/src/process.ts @@ -61,6 +61,7 @@ import remarkSubSup from "./remarkSubSup"; import remarkImageAttrs from "./remarkImageAttrs"; import remarkDirectiveLearningmap from "./remarkDirectiveLearningmap"; import remarkDirectiveTextinput from "./remarkDirectiveTextinput"; +import remarkDirectiveReadalong from "./remarkDirectiveReadalong"; export const remark = (ctx: HyperbookContext) => { i18n.init(ctx.config.language || "en"); @@ -105,6 +106,7 @@ export const remark = (ctx: HyperbookContext) => { remarkDirectiveMultievent(ctx), remarkDirectiveLearningmap(ctx), remarkDirectiveTextinput(ctx), + remarkDirectiveReadalong(ctx), remarkCode(ctx), remarkMath, /* needs to be last directive */ diff --git a/packages/markdown/src/remarkDirectiveReadalong.ts b/packages/markdown/src/remarkDirectiveReadalong.ts new file mode 100644 index 00000000..1fb0d55a --- /dev/null +++ b/packages/markdown/src/remarkDirectiveReadalong.ts @@ -0,0 +1,185 @@ +// Register directive nodes in mdast: +/// +// +import { HyperbookContext } from "@hyperbook/types"; +import { Root } from "mdast"; +import { ElementContent } from "hast"; +import { visit } from "unist-util-visit"; +import { VFile } from "vfile"; +import { + expectContainerDirective, + isDirective, + registerDirective, +} from "./remarkHelper"; +import { + ContainerDirective, + LeafDirective, + TextDirective, +} from "mdast-util-directive"; +import { remark } from "./process"; +import hash from "./objectHash"; +import { toText } from "hast-util-to-text"; + +export default (ctx: HyperbookContext) => () => { + const name = "readalong"; + + const readalongNodes: ( + | TextDirective + | ContainerDirective + | LeafDirective + )[] = []; + + return async (tree: Root, file: VFile) => { + visit(tree, function (node) { + if (isDirective(node)) { + if (node.name !== name) return; + readalongNodes.push(node); + return; + } + }); + + for (const node of readalongNodes) { + const data = node.data || (node.data = {}); + const { + src, + timestamps, + autoGenerate = false, + speed = 150, // words per minute for auto-generation + } = node.attributes || {}; + + expectContainerDirective(node, file, name); + registerDirective(file, name, ["client.js"], ["style.css"], []); + + const id = hash(node); + + node.attributes = {}; + data.hName = "div"; + data.hProperties = { + class: "directive-readalong", + "data-id": id, + }; + + // Process children to get content + const contentChildren: ElementContent[] = []; + for (const child of node.children) { + const processedChild = await remark(ctx).run(child); + contentChildren.push(processedChild as ElementContent); + } + + // Create a wrapper for the text content + const textWrapper: ElementContent = { + type: "element", + tagName: "div", + properties: { + class: "readalong-text", + "data-id": id, + }, + children: contentChildren, + }; + + // Extract text for auto-generation if needed + const textContent = toText(textWrapper); + + // Parse timestamps if provided + let timestampData = null; + if (timestamps && typeof timestamps === "string") { + try { + timestampData = JSON.parse(timestamps); + } catch (e) { + // Invalid JSON, ignore + } + } + + // Build controls + const controls: ElementContent = { + type: "element", + tagName: "div", + properties: { + class: "readalong-controls", + }, + children: [ + { + type: "element", + tagName: "button", + properties: { + class: "play-pause", + onclick: `hyperbook.readalong.togglePlayPause("${id}")`, + title: "Play/Pause", + }, + children: [], + }, + { + type: "element", + tagName: "div", + properties: { + class: "time-display", + }, + children: [ + { + type: "element", + tagName: "span", + properties: { + class: "current-time", + }, + children: [{ type: "text", value: "0:00" }], + }, + { + type: "text", + value: " / ", + }, + { + type: "element", + tagName: "span", + properties: { + class: "total-time", + }, + children: [{ type: "text", value: "0:00" }], + }, + ], + }, + ], + }; + + data.hChildren = [ + controls, + textWrapper, + { + type: "element", + tagName: "audio", + properties: { + class: "readalong-audio", + src: src + ? ctx.makeUrl( + src as string, + "public", + ctx.navigation.current || undefined, + ) + : undefined, + preload: "metadata", + }, + children: [], + }, + { + type: "element", + tagName: "script", + properties: { + type: "application/json", + class: "readalong-config", + }, + children: [ + { + type: "text", + value: JSON.stringify({ + id, + timestamps: timestampData, + autoGenerate: autoGenerate === "true", + speed: typeof speed === "string" ? parseInt(speed) : speed, + text: textContent, + }), + }, + ], + }, + ]; + } + }; +}; diff --git a/packages/markdown/tests/__snapshots__/remarkDirectiveReadalong.test.ts.snap b/packages/markdown/tests/__snapshots__/remarkDirectiveReadalong.test.ts.snap new file mode 100644 index 00000000..5b582e87 --- /dev/null +++ b/packages/markdown/tests/__snapshots__/remarkDirectiveReadalong.test.ts.snap @@ -0,0 +1,62 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`remarkDirectiveReadalong > should handle multiple paragraphs 1`] = ` +" +
+
+
0:00 / 0:00
+
+
+

First paragraph of text.

+

Second paragraph of text.

+
+ + +
+" +`; + +exports[`remarkDirectiveReadalong > should transform with audio source 1`] = ` +" +
+
+
0:00 / 0:00
+
+
+

This is a test sentence for read-along functionality.

+
+ + +
+" +`; + +exports[`remarkDirectiveReadalong > should transform with auto-generation enabled 1`] = ` +" +
+
+
0:00 / 0:00
+
+
+

This is a test sentence for read-along functionality.

+
+ + +
+" +`; + +exports[`remarkDirectiveReadalong > should transform with timestamps 1`] = ` +" +
+
+
0:00 / 0:00
+
+
+

This is a test sentence for read-along functionality.

+
+ + +
+" +`; diff --git a/packages/markdown/tests/remarkDirectiveReadalong.test.ts b/packages/markdown/tests/remarkDirectiveReadalong.test.ts new file mode 100644 index 00000000..e87c4347 --- /dev/null +++ b/packages/markdown/tests/remarkDirectiveReadalong.test.ts @@ -0,0 +1,116 @@ +import { HyperbookContext } from "@hyperbook/types/dist"; +import { describe, expect, it } from "vitest"; +import rehypeStringify from "rehype-stringify"; +import remarkToRehype from "remark-rehype"; +import rehypeFormat from "rehype-format"; +import { unified, PluggableList } from "unified"; +import remarkDirective from "remark-directive"; +import remarkDirectiveRehype from "remark-directive-rehype"; +import { ctx } from "./mock"; +import remarkDirectiveReadalong from "../src/remarkDirectiveReadalong"; +import remarkParse from "../src/remarkParse"; + +export const toHtml = async (md: string, ctx: HyperbookContext) => { + const remarkPlugins: PluggableList = [ + remarkDirective, + remarkDirectiveRehype, + remarkDirectiveReadalong(ctx), + ]; + + return unified() + .use(remarkParse) + .use(remarkPlugins) + .use(remarkToRehype) + .use(rehypeFormat) + .use(rehypeStringify, { + allowDangerousCharacters: true, + allowDangerousHtml: true, + }) + .process(md); +}; + +describe("remarkDirectiveReadalong", () => { + it("should transform with audio source", async () => { + expect( + ( + await toHtml( + ` +:::readalong{src="/audio.mp3"} +This is a test sentence for read-along functionality. +::: +`, + ctx, + ) + ).value, + ).toMatchSnapshot(); + }); + + it("should transform with timestamps", async () => { + const timestamps = JSON.stringify([ + { word: "This", start: 0, end: 0.5 }, + { word: "is", start: 0.5, end: 0.8 }, + { word: "a", start: 0.8, end: 1.0 }, + { word: "test", start: 1.0, end: 1.5 }, + ]); + + expect( + ( + await toHtml( + ` +:::readalong{src="/audio.mp3" timestamps='${timestamps}'} +This is a test sentence for read-along functionality. +::: +`, + ctx, + ) + ).value, + ).toMatchSnapshot(); + }); + + it("should transform with auto-generation enabled", async () => { + expect( + ( + await toHtml( + ` +:::readalong{src="/audio.mp3" autoGenerate="true" speed="120"} +This is a test sentence for read-along functionality. +::: +`, + ctx, + ) + ).value, + ).toMatchSnapshot(); + }); + + it("should register directives", async () => { + expect( + ( + await toHtml( + ` +:::readalong{src="/audio.mp3"} +Test content +::: +`, + ctx, + ) + ).data.directives?.["readalong"], + ).toBeDefined(); + }); + + it("should handle multiple paragraphs", async () => { + expect( + ( + await toHtml( + ` +:::readalong{src="/audio.mp3"} +First paragraph of text. + +Second paragraph of text. +::: +`, + ctx, + ) + ).value, + ).toMatchSnapshot(); + }); +}); From b0a15c551738679b39ece89173d9f13216b56498 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 6 Nov 2025 00:50:08 +0000 Subject: [PATCH 3/6] Address code review feedback - improve text extraction and fix CSS/JS issues Co-authored-by: mikebarkmin <2592379+mikebarkmin@users.noreply.github.com> --- .../markdown/assets/directive-readalong/client.js | 11 +++++++++++ .../markdown/assets/directive-readalong/style.css | 1 - packages/markdown/src/remarkDirectiveReadalong.ts | 8 ++++---- .../remarkDirectiveReadalong.test.ts.snap | 2 +- 4 files changed, 16 insertions(+), 6 deletions(-) diff --git a/packages/markdown/assets/directive-readalong/client.js b/packages/markdown/assets/directive-readalong/client.js index a12a33c6..82c99135 100644 --- a/packages/markdown/assets/directive-readalong/client.js +++ b/packages/markdown/assets/directive-readalong/client.js @@ -71,6 +71,17 @@ hyperbook.readalong = (function () { currentTime += wordDuration; } + // Scale timestamps to fit audio duration if provided + if (duration && duration > 0) { + const calculatedDuration = currentTime / 1000; + const scale = duration / calculatedDuration; + + timestamps.forEach(ts => { + ts.start *= scale; + ts.end *= scale; + }); + } + return timestamps; } diff --git a/packages/markdown/assets/directive-readalong/style.css b/packages/markdown/assets/directive-readalong/style.css index 7bf98eae..96d6aeb9 100644 --- a/packages/markdown/assets/directive-readalong/style.css +++ b/packages/markdown/assets/directive-readalong/style.css @@ -20,7 +20,6 @@ height: 48px; border: none; border-radius: 50%; - background-color: var(--color-primary); cursor: pointer; transition: transform 0.2s, background-color 0.2s; mask-image: url('data:image/svg+xml,'); diff --git a/packages/markdown/src/remarkDirectiveReadalong.ts b/packages/markdown/src/remarkDirectiveReadalong.ts index 1fb0d55a..3f4fc431 100644 --- a/packages/markdown/src/remarkDirectiveReadalong.ts +++ b/packages/markdown/src/remarkDirectiveReadalong.ts @@ -18,7 +18,7 @@ import { } from "mdast-util-directive"; import { remark } from "./process"; import hash from "./objectHash"; -import { toText } from "hast-util-to-text"; +import { toText as mdastToText } from "./mdastUtilToText"; export default (ctx: HyperbookContext) => () => { const name = "readalong"; @@ -66,6 +66,9 @@ export default (ctx: HyperbookContext) => () => { contentChildren.push(processedChild as ElementContent); } + // Extract text for auto-generation before creating HAST (more efficient) + const textContent = mdastToText(node.children); + // Create a wrapper for the text content const textWrapper: ElementContent = { type: "element", @@ -76,9 +79,6 @@ export default (ctx: HyperbookContext) => () => { }, children: contentChildren, }; - - // Extract text for auto-generation if needed - const textContent = toText(textWrapper); // Parse timestamps if provided let timestampData = null; diff --git a/packages/markdown/tests/__snapshots__/remarkDirectiveReadalong.test.ts.snap b/packages/markdown/tests/__snapshots__/remarkDirectiveReadalong.test.ts.snap index 5b582e87..42758c84 100644 --- a/packages/markdown/tests/__snapshots__/remarkDirectiveReadalong.test.ts.snap +++ b/packages/markdown/tests/__snapshots__/remarkDirectiveReadalong.test.ts.snap @@ -11,7 +11,7 @@ exports[`remarkDirectiveReadalong > should handle multiple paragraphs 1`] = `

Second paragraph of text.

- + " `; From 9c6a318ff8187e62998444bf293ca2296ebbf6be Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 6 Nov 2025 05:36:00 +0000 Subject: [PATCH 4/6] Add read-along directive documentation to website Co-authored-by: mikebarkmin <2592379+mikebarkmin@users.noreply.github.com> --- website/de/book/elements/readalong.md | 74 +++++++++++++++++++++++++++ website/en/book/elements/readalong.md | 74 +++++++++++++++++++++++++++ 2 files changed, 148 insertions(+) create mode 100644 website/de/book/elements/readalong.md create mode 100644 website/en/book/elements/readalong.md diff --git a/website/de/book/elements/readalong.md b/website/de/book/elements/readalong.md new file mode 100644 index 00000000..ba7a4dbc --- /dev/null +++ b/website/de/book/elements/readalong.md @@ -0,0 +1,74 @@ +--- +name: Read-Along +permaid: readalong +--- + +# Read-Along + +Die Read-Along-Direktive ermöglicht es, interaktive Leseerlebnisse zu erstellen, bei denen der Text synchron zur Audiowiedergabe hervorgehoben wird. Benutzer können Wort für Wort folgen und auf Wörter klicken, um zu bestimmten Stellen im Audio zu springen. + +## Grundlegende Verwendung + +```markdown +:::readalong{src="/audio.mp3" autoGenerate="true"} +Dies ist der Text, der mit dem Audio synchronisiert wird. +Sie können mehrere Sätze und Absätze einschließen. +::: +``` + +:::readalong{src="/Free_Test_Data_1MB_MP3.mp3" autoGenerate="true" speed="120"} +Dies ist eine Demonstration der Read-Along-Funktion. Jedes Wort wird hervorgehoben, während das Audio abgespielt wird. Klicken Sie auf ein beliebiges Wort, um zu diesem Teil des Audios zu springen. Die Synchronisation wird automatisch basierend auf der Lesegeschwindigkeit generiert. +::: + +## Mit manuellen Zeitstempeln + +Wenn Sie präzise Zeitstempel von Tools wie OpenAI Whisper haben, können Sie diese als JSON angeben: + +```markdown +:::readalong{src="/audio.mp3" timestamps='[{"word":"Hallo","start":0,"end":0.5},{"word":"Welt","start":0.5,"end":1.0}]'} +Hallo Welt +::: +``` + +## Konfigurationsoptionen + +| Option | Typ | Standard | Beschreibung | +|--------|-----|----------|--------------| +| `src` | string | erforderlich | Pfad zur Audiodatei (MP3, WAV, OGG, M4A) | +| `autoGenerate` | boolean | false | Automatische Zeitstempelgenerierung aktivieren | +| `speed` | number | 150 | Lesegeschwindigkeit in Wörtern pro Minute (wenn autoGenerate true ist) | +| `timestamps` | JSON | null | Manuelle Zeitstempel-Array mit `{word, start, end}` Objekten | + +## Funktionen + +- **Play/Pause-Steuerung**: Interaktive Schaltfläche zur Steuerung der Audiowiedergabe +- **Wort-Hervorhebung**: Aktuelles Wort wird mit sanften Animationen hervorgehoben +- **Klicken zum Springen**: Klicken Sie auf ein Wort, um zu diesem Zeitstempel zu springen +- **Auto-Scroll**: Scrollt automatisch, um das aktuelle Wort sichtbar zu halten +- **Zeitanzeige**: Zeigt aktuelle Zeit und Gesamtdauer an +- **Theme-Unterstützung**: Passt sich automatisch an helle und dunkle Modi an + +## Mehrere Absätze + +Die Direktive unterstützt mehrere Absätze und behält die Formatierung bei: + +```markdown +:::readalong{src="/audio.mp3" autoGenerate="true"} +Dies ist der erste Absatz Ihres Inhalts. + +Dies ist der zweite Absatz. + +Und ein dritter Absatz zur Veranschaulichung. +::: +``` + +## Tipps + +- Verwenden Sie `autoGenerate="true"` für eine schnelle Einrichtung ohne manuelle Zeitstempel +- Passen Sie `speed` an das tatsächliche Lesetempo Ihres Audios an +- Für beste Ergebnisse mit manuellen Zeitstempeln stellen Sie sicher, dass diese genau mit Ihrem Text übereinstimmen +- Unterstützte Audioformate: MP3, WAV, OGG, M4A (jedes HTML5-kompatible Format) + +:::alert{warn} +Die Read-Along-Direktive benötigt eine Audiodatei. Stellen Sie sicher, dass der Audiopfad korrekt und zugänglich ist. +::: diff --git a/website/en/book/elements/readalong.md b/website/en/book/elements/readalong.md new file mode 100644 index 00000000..1d119b33 --- /dev/null +++ b/website/en/book/elements/readalong.md @@ -0,0 +1,74 @@ +--- +name: Read-Along +permaid: readalong +--- + +# Read-Along + +The read-along directive allows you to create interactive reading experiences where text is highlighted as audio plays. Users can follow along word-by-word and click on words to jump to specific parts of the audio. + +## Basic Usage + +```markdown +:::readalong{src="/audio.mp3" autoGenerate="true"} +This is the text that will be synchronized with the audio. +You can include multiple sentences and paragraphs. +::: +``` + +:::readalong{src="/Free_Test_Data_1MB_MP3.mp3" autoGenerate="true" speed="120"} +This is a demonstration of the read-along feature. Each word will be highlighted as the audio plays. Click on any word to jump to that part of the audio. The synchronization is automatically generated based on reading speed. +::: + +## With Manual Timestamps + +If you have precise timestamps from tools like OpenAI Whisper, you can provide them as JSON: + +```markdown +:::readalong{src="/audio.mp3" timestamps='[{"word":"Hello","start":0,"end":0.5},{"word":"world","start":0.5,"end":1.0}]'} +Hello world +::: +``` + +## Configuration Options + +| Option | Type | Default | Description | +|--------|------|---------|-------------| +| `src` | string | required | Path to the audio file (MP3, WAV, OGG, M4A) | +| `autoGenerate` | boolean | false | Enable automatic timestamp generation | +| `speed` | number | 150 | Reading speed in words per minute (when autoGenerate is true) | +| `timestamps` | JSON | null | Manual timestamps array with `{word, start, end}` objects | + +## Features + +- **Play/Pause Control**: Interactive button to control audio playback +- **Word Highlighting**: Current word is highlighted with smooth animations +- **Click to Jump**: Click any word to seek to that timestamp +- **Auto-scroll**: Automatically scrolls to keep the current word visible +- **Time Display**: Shows current time and total duration +- **Theme Support**: Automatically adapts to light and dark modes + +## Multiple Paragraphs + +The directive supports multiple paragraphs and preserves formatting: + +```markdown +:::readalong{src="/audio.mp3" autoGenerate="true"} +This is the first paragraph of your content. + +This is the second paragraph. + +And a third paragraph for good measure. +::: +``` + +## Tips + +- Use `autoGenerate="true"` for quick setup without manual timestamps +- Adjust `speed` to match the actual reading pace of your audio +- For best results with manual timestamps, ensure they match your text exactly +- Supported audio formats: MP3, WAV, OGG, M4A (any HTML5-compatible format) + +:::alert{warn} +The read-along directive requires an audio file. Make sure the audio path is correct and accessible. +::: From f9617b4a3c08a7d98a0554f3b74e77bf2219119f Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 6 Nov 2025 06:16:37 +0000 Subject: [PATCH 5/6] Fix text shifting by removing bold font-weight from active word highlighting Co-authored-by: mikebarkmin <2592379+mikebarkmin@users.noreply.github.com> --- .../markdown/assets/directive-readalong/style.css | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/packages/markdown/assets/directive-readalong/style.css b/packages/markdown/assets/directive-readalong/style.css index 96d6aeb9..3c1fe07e 100644 --- a/packages/markdown/assets/directive-readalong/style.css +++ b/packages/markdown/assets/directive-readalong/style.css @@ -68,20 +68,7 @@ .directive-readalong .readalong-word.active { background-color: var(--color-primary); color: var(--color-text-on-primary); - font-weight: 600; - animation: pulse 0.3s ease-in-out; -} - -@keyframes pulse { - 0% { - transform: scale(1); - } - 50% { - transform: scale(1.05); - } - 100% { - transform: scale(1); - } + box-shadow: 0 0 0 2px var(--color-primary); } .directive-readalong .readalong-audio { From 3b9f2b700e64dd59274cd304097df42e60957594 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 6 Nov 2025 06:40:14 +0000 Subject: [PATCH 6/6] Add TTS mode to read-along directive Co-authored-by: mikebarkmin <2592379+mikebarkmin@users.noreply.github.com> --- .../assets/directive-readalong/client.js | 229 +- packages/markdown/src/github-emojis.json | 1916 +---------------- .../markdown/src/remarkDirectiveReadalong.ts | 54 +- .../remarkDirectiveReadalong.test.ts.snap | 22 +- .../tests/remarkDirectiveReadalong.test.ts | 15 + website/de/book/elements/emoji.md | 1914 +--------------- website/de/book/elements/readalong.md | 56 +- website/en/book/elements/emoji.md | 1914 +--------------- website/en/book/elements/readalong.md | 56 +- 9 files changed, 367 insertions(+), 5809 deletions(-) diff --git a/packages/markdown/assets/directive-readalong/client.js b/packages/markdown/assets/directive-readalong/client.js index 82c99135..bad472cb 100644 --- a/packages/markdown/assets/directive-readalong/client.js +++ b/packages/markdown/assets/directive-readalong/client.js @@ -9,6 +9,7 @@ hyperbook.readalong = (function () { /** * @typedef {Object} ReadalongConfig * @property {string} id + * @property {string} mode * @property {WordTimestamp[]} timestamps * @property {boolean} autoGenerate * @property {number} speed @@ -23,6 +24,9 @@ hyperbook.readalong = (function () { * @property {ReadalongConfig} config * @property {number} currentWordIndex * @property {number} intervalId + * @property {SpeechSynthesisUtterance} utterance + * @property {number} startTime + * @property {boolean} isPlaying */ /** @@ -89,8 +93,9 @@ hyperbook.readalong = (function () { * Wrap each word in the text container with a span * @param {HTMLElement} textContainer * @param {WordTimestamp[]} timestamps + * @param {string} mode */ - function wrapWords(textContainer, timestamps) { + function wrapWords(textContainer, timestamps, mode) { // Get all text nodes const walker = document.createTreeWalker( textContainer, @@ -123,15 +128,41 @@ hyperbook.readalong = (function () { span.setAttribute("data-end", timestamps[timestampIndex].end.toString()); span.setAttribute("data-index", timestampIndex.toString()); + // For TTS mode, store character index + if (mode === "tts" && timestamps[timestampIndex].charIndex !== undefined) { + span.setAttribute("data-char-index", timestamps[timestampIndex].charIndex.toString()); + } + // Make word clickable span.style.cursor = "pointer"; span.onclick = function() { - const start = parseFloat(this.getAttribute("data-start") || "0"); const instance = instances[textContainer.getAttribute("data-id")]; - if (instance && instance.audio) { - instance.audio.currentTime = start; - if (instance.audio.paused) { - instance.audio.play(); + if (!instance) return; + + if (mode === "tts") { + // For TTS, restart from this word + const charIndex = parseInt(this.getAttribute("data-char-index") || "0"); + if (instance.utterance) { + speechSynthesis.cancel(); + } + // Create new utterance starting from this character + const text = instance.config.text; + const remainingText = text.substring(charIndex); + instance.utterance = new SpeechSynthesisUtterance(remainingText); + instance.utterance.rate = instance.config.speed / 150; + instance.startTime = Date.now(); + instance.isPlaying = true; + speechSynthesis.speak(instance.utterance); + const button = instance.container.querySelector(".play-pause"); + button.classList.add("playing"); + } else { + // For manual mode, seek to timestamp + const start = parseFloat(this.getAttribute("data-start") || "0"); + if (instance.audio) { + instance.audio.currentTime = start; + if (instance.audio.paused) { + instance.audio.play(); + } } } }; @@ -205,11 +236,149 @@ hyperbook.readalong = (function () { const currentTimeEl = instance.container.querySelector(".current-time"); const totalTimeEl = instance.container.querySelector(".total-time"); - if (currentTimeEl) { - currentTimeEl.textContent = formatTime(instance.audio.currentTime); + if (instance.config.mode === "tts") { + // For TTS, calculate elapsed time + if (currentTimeEl && instance.isPlaying) { + const elapsed = (Date.now() - instance.startTime) / 1000; + currentTimeEl.textContent = formatTime(elapsed); + } + // Total time is estimated based on word count and speed + if (totalTimeEl && !totalTimeEl.textContent.includes(":")) { + const words = instance.config.text.match(/\S+/g) || []; + const estimatedDuration = (words.length / instance.config.speed) * 60; + totalTimeEl.textContent = formatTime(estimatedDuration); + } + } else { + // For audio files + if (currentTimeEl) { + currentTimeEl.textContent = formatTime(instance.audio.currentTime); + } + if (totalTimeEl && !isNaN(instance.audio.duration)) { + totalTimeEl.textContent = formatTime(instance.audio.duration); + } } - if (totalTimeEl && !isNaN(instance.audio.duration)) { - totalTimeEl.textContent = formatTime(instance.audio.duration); + } + + /** + * Generate timestamps from TTS word boundaries + * @param {string} text + * @returns {Promise} + */ + function generateTTSTimestamps(text) { + return new Promise((resolve, reject) => { + if (!('speechSynthesis' in window)) { + reject(new Error('Speech synthesis not supported')); + return; + } + + const words = text.match(/\S+/g) || []; + const timestamps = []; + let wordIndex = 0; + + const utterance = new SpeechSynthesisUtterance(text); + + utterance.onboundary = function(event) { + if (event.name === 'word' && wordIndex < words.length) { + const start = event.elapsedTime / 1000; + timestamps.push({ + word: words[wordIndex], + start: start, + end: start + 0.5, // Approximate end time + charIndex: event.charIndex, + }); + wordIndex++; + } + }; + + utterance.onend = function() { + // Update end times based on next word's start + for (let i = 0; i < timestamps.length - 1; i++) { + timestamps[i].end = timestamps[i + 1].start; + } + // Last word gets a reasonable end time + if (timestamps.length > 0) { + const lastTs = timestamps[timestamps.length - 1]; + lastTs.end = lastTs.start + 0.5; + } + resolve(timestamps); + }; + + utterance.onerror = function(event) { + reject(event); + }; + + // Run speech synthesis silently to get timing + utterance.volume = 0; + speechSynthesis.speak(utterance); + }); + } + + /** + * Toggle play/pause for TTS mode + * @param {string} id + */ + function togglePlayPauseTTS(id) { + const instance = instances[id]; + if (!instance) return; + + const button = instance.container.querySelector(".play-pause"); + + if (instance.isPlaying) { + // Pause + speechSynthesis.cancel(); + instance.isPlaying = false; + button.classList.remove("playing"); + } else { + // Play + if (!instance.utterance) { + instance.utterance = new SpeechSynthesisUtterance(instance.config.text); + instance.utterance.rate = instance.config.speed / 150; // Adjust rate based on speed + + instance.utterance.onboundary = function(event) { + if (event.name === 'word') { + // Highlight current word + const words = instance.textContainer.querySelectorAll(".readalong-word"); + words.forEach((word, index) => { + const charIndex = parseInt(word.getAttribute("data-char-index") || "-1"); + if (charIndex === event.charIndex) { + word.classList.add("active"); + if (!isInViewport(word)) { + word.scrollIntoView({ behavior: "smooth", block: "center" }); + } + } else { + word.classList.remove("active"); + } + }); + } + }; + + instance.utterance.onend = function() { + instance.isPlaying = false; + button.classList.remove("playing"); + const words = instance.textContainer.querySelectorAll(".readalong-word"); + words.forEach(word => word.classList.remove("active")); + }; + + instance.utterance.onerror = function(event) { + console.error("TTS error:", event); + instance.isPlaying = false; + button.classList.remove("playing"); + }; + } + + instance.startTime = Date.now(); + instance.isPlaying = true; + button.classList.add("playing"); + speechSynthesis.speak(instance.utterance); + + // Update time display while speaking + const updateInterval = setInterval(() => { + if (!instance.isPlaying) { + clearInterval(updateInterval); + return; + } + updateTimeDisplay(id); + }, 100); } } @@ -221,6 +390,13 @@ hyperbook.readalong = (function () { const instance = instances[id]; if (!instance) return; + // Use TTS mode if configured + if (instance.config.mode === "tts") { + togglePlayPauseTTS(id); + return; + } + + // Manual mode with audio file const button = instance.container.querySelector(".play-pause"); if (instance.audio.paused) { @@ -244,7 +420,7 @@ hyperbook.readalong = (function () { const textContainer = container.querySelector(".readalong-text"); const configEl = container.querySelector(".readalong-config"); - if (!audio || !textContainer || !configEl) return; + if (!textContainer || !configEl) return; let config; try { @@ -261,10 +437,39 @@ hyperbook.readalong = (function () { config, currentWordIndex: -1, intervalId: null, + utterance: null, + startTime: 0, + isPlaying: false, }; instances[id] = instance; + // Handle TTS mode + if (config.mode === "tts") { + // Check if speech synthesis is supported + if (!('speechSynthesis' in window)) { + console.error("Speech synthesis not supported in this browser"); + return; + } + + // Generate timestamps from TTS + generateTTSTimestamps(config.text) + .then(timestamps => { + if (timestamps && timestamps.length > 0) { + wrapWords(textContainer, timestamps, "tts"); + } + updateTimeDisplay(id); + }) + .catch(err => { + console.error("Failed to generate TTS timestamps:", err); + }); + + return; + } + + // Manual mode with audio file + if (!audio) return; + // Wait for audio metadata to load audio.addEventListener("loadedmetadata", function() { let timestamps = config.timestamps; @@ -279,7 +484,7 @@ hyperbook.readalong = (function () { } if (timestamps && timestamps.length > 0) { - wrapWords(textContainer, timestamps); + wrapWords(textContainer, timestamps, "manual"); } updateTimeDisplay(id); diff --git a/packages/markdown/src/github-emojis.json b/packages/markdown/src/github-emojis.json index 4b3bb550..9e26dfee 100644 --- a/packages/markdown/src/github-emojis.json +++ b/packages/markdown/src/github-emojis.json @@ -1,1915 +1 @@ -{ - "100": "💯", - "1234": "🔢", - "+1": "👍", - "-1": "👎", - "1st_place_medal": "🥇", - "2nd_place_medal": "🥈", - "3rd_place_medal": "🥉", - "8ball": "🎱", - "a": "🅰", - "ab": "🆎", - "abacus": "🧮", - "abc": "🔤", - "abcd": "🔡", - "accept": "🉑", - "accordion": "🪗", - "adhesive_bandage": "🩹", - "adult": "🧑", - "aerial_tramway": "🚡", - "afghanistan": "🇦‍🇫", - "airplane": "✈", - "aland_islands": "🇦‍🇽", - "alarm_clock": "⏰", - "albania": "🇦‍🇱", - "alembic": "⚗", - "algeria": "🇩‍🇿", - "alien": "👽", - "ambulance": "🚑", - "american_samoa": "🇦‍🇸", - "amphora": "🏺", - "anatomical_heart": "🫀", - "anchor": "⚓", - "andorra": "🇦‍🇩", - "angel": "👼", - "anger": "💢", - "angola": "🇦‍🇴", - "angry": "😠", - "anguilla": "🇦‍🇮", - "anguished": "😧", - "ant": "🐜", - "antarctica": "🇦‍🇶", - "antigua_barbuda": "🇦‍🇬", - "apple": "🍎", - "aquarius": "♒", - "argentina": "🇦‍🇷", - "aries": "♈", - "armenia": "🇦‍🇲", - "arrow_backward": "◀", - "arrow_double_down": "⏬", - "arrow_double_up": "⏫", - "arrow_down": "⬇", - "arrow_down_small": "🔽", - "arrow_forward": "▶", - "arrow_heading_down": "⤵", - "arrow_heading_up": "⤴", - "arrow_left": "⬅", - "arrow_lower_left": "↙", - "arrow_lower_right": "↘", - "arrow_right": "➡", - "arrow_right_hook": "↪", - "arrow_up": "⬆", - "arrow_up_down": "↕", - "arrow_up_small": "🔼", - "arrow_upper_left": "↖", - "arrow_upper_right": "↗", - "arrows_clockwise": "🔃", - "arrows_counterclockwise": "🔄", - "art": "🎨", - "articulated_lorry": "🚛", - "artificial_satellite": "🛰", - "artist": "🧑‍🎨", - "aruba": "🇦‍🇼", - "ascension_island": "🇦‍🇨", - "asterisk": "*‍⃣", - "astonished": "😲", - "astronaut": "🧑‍🚀", - "athletic_shoe": "👟", - "atm": "🏧", - "atom_symbol": "⚛", - "australia": "🇦‍🇺", - "austria": "🇦‍🇹", - "auto_rickshaw": "🛺", - "avocado": "🥑", - "axe": "🪓", - "azerbaijan": "🇦‍🇿", - "b": "🅱", - "baby": "👶", - "baby_bottle": "🍼", - "baby_chick": "🐤", - "baby_symbol": "🚼", - "back": "🔙", - "bacon": "🥓", - "badger": "🦡", - "badminton": "🏸", - "bagel": "🥯", - "baggage_claim": "🛄", - "baguette_bread": "🥖", - "bahamas": "🇧‍🇸", - "bahrain": "🇧‍🇭", - "balance_scale": "⚖", - "bald_man": "👨‍🦲", - "bald_woman": "👩‍🦲", - "ballet_shoes": "🩰", - "balloon": "🎈", - "ballot_box": "🗳", - "ballot_box_with_check": "☑", - "bamboo": "🎍", - "banana": "🍌", - "bangbang": "‼", - "bangladesh": "🇧‍🇩", - "banjo": "🪕", - "bank": "🏦", - "bar_chart": "📊", - "barbados": "🇧‍🇧", - "barber": "💈", - "baseball": "⚾", - "basket": "🧺", - "basketball": "🏀", - "basketball_man": "⛹‍♂", - "basketball_woman": "⛹‍♀", - "bat": "🦇", - "bath": "🛀", - "bathtub": "🛁", - "battery": "🔋", - "beach_umbrella": "🏖", - "beans": "🫘", - "bear": "🐻", - "bearded_person": "🧔", - "beaver": "🦫", - "bed": "🛏", - "bee": "🐝", - "beer": "🍺", - "beers": "🍻", - "beetle": "🪲", - "beginner": "🔰", - "belarus": "🇧‍🇾", - "belgium": "🇧‍🇪", - "belize": "🇧‍🇿", - "bell": "🔔", - "bell_pepper": "🫑", - "bellhop_bell": "🛎", - "benin": "🇧‍🇯", - "bento": "🍱", - "bermuda": "🇧‍🇲", - "beverage_box": "🧃", - "bhutan": "🇧‍🇹", - "bicyclist": "🚴", - "bike": "🚲", - "biking_man": "🚴‍♂", - "biking_woman": "🚴‍♀", - "bikini": "👙", - "billed_cap": "🧢", - "biohazard": "☣", - "bird": "🐦", - "birthday": "🎂", - "bison": "🦬", - "biting_lip": "🫦", - "black_bird": "🐦‍⬛", - "black_cat": "🐈‍⬛", - "black_circle": "⚫", - "black_flag": "🏴", - "black_heart": "🖤", - "black_joker": "🃏", - "black_large_square": "⬛", - "black_medium_small_square": "◾", - "black_medium_square": "◼", - "black_nib": "✒", - "black_small_square": "▪", - "black_square_button": "🔲", - "blond_haired_man": "👱‍♂", - "blond_haired_person": "👱", - "blond_haired_woman": "👱‍♀", - "blonde_woman": "👱‍♀", - "blossom": "🌼", - "blowfish": "🐡", - "blue_book": "📘", - "blue_car": "🚙", - "blue_heart": "💙", - "blue_square": "🟦", - "blueberries": "🫐", - "blush": "😊", - "boar": "🐗", - "boat": "⛵", - "bolivia": "🇧‍🇴", - "bomb": "💣", - "bone": "🦴", - "book": "📖", - "bookmark": "🔖", - "bookmark_tabs": "📑", - "books": "📚", - "boom": "💥", - "boomerang": "🪃", - "boot": "👢", - "bosnia_herzegovina": "🇧‍🇦", - "botswana": "🇧‍🇼", - "bouncing_ball_man": "⛹‍♂", - "bouncing_ball_person": "⛹", - "bouncing_ball_woman": "⛹‍♀", - "bouquet": "💐", - "bouvet_island": "🇧‍🇻", - "bow": "🙇", - "bow_and_arrow": "🏹", - "bowing_man": "🙇‍♂", - "bowing_woman": "🙇‍♀", - "bowl_with_spoon": "🥣", - "bowling": "🎳", - "boxing_glove": "🥊", - "boy": "👦", - "brain": "🧠", - "brazil": "🇧‍🇷", - "bread": "🍞", - "breast_feeding": "🤱", - "bricks": "🧱", - "bride_with_veil": "👰‍♀", - "bridge_at_night": "🌉", - "briefcase": "💼", - "british_indian_ocean_territory": "🇮‍🇴", - "british_virgin_islands": "🇻‍🇬", - "broccoli": "🥦", - "broken_heart": "💔", - "broom": "🧹", - "brown_circle": "🟤", - "brown_heart": "🤎", - "brown_square": "🟫", - "brunei": "🇧‍🇳", - "bubble_tea": "🧋", - "bubbles": "🫧", - "bucket": "🪣", - "bug": "🐛", - "building_construction": "🏗", - "bulb": "💡", - "bulgaria": "🇧‍🇬", - "bullettrain_front": "🚅", - "bullettrain_side": "🚄", - "burkina_faso": "🇧‍🇫", - "burrito": "🌯", - "burundi": "🇧‍🇮", - "bus": "🚌", - "business_suit_levitating": "🕴", - "busstop": "🚏", - "bust_in_silhouette": "👤", - "busts_in_silhouette": "👥", - "butter": "🧈", - "butterfly": "🦋", - "cactus": "🌵", - "cake": "🍰", - "calendar": "📆", - "call_me_hand": "🤙", - "calling": "📲", - "cambodia": "🇰‍🇭", - "camel": "🐫", - "camera": "📷", - "camera_flash": "📸", - "cameroon": "🇨‍🇲", - "camping": "🏕", - "canada": "🇨‍🇦", - "canary_islands": "🇮‍🇨", - "cancer": "♋", - "candle": "🕯", - "candy": "🍬", - "canned_food": "🥫", - "canoe": "🛶", - "cape_verde": "🇨‍🇻", - "capital_abcd": "🔠", - "capricorn": "♑", - "car": "🚗", - "card_file_box": "🗃", - "card_index": "📇", - "card_index_dividers": "🗂", - "caribbean_netherlands": "🇧‍🇶", - "carousel_horse": "🎠", - "carpentry_saw": "🪚", - "carrot": "🥕", - "cartwheeling": "🤸", - "cat": "🐱", - "cat2": "🐈", - "cayman_islands": "🇰‍🇾", - "cd": "💿", - "central_african_republic": "🇨‍🇫", - "ceuta_melilla": "🇪‍🇦", - "chad": "🇹‍🇩", - "chains": "⛓", - "chair": "🪑", - "champagne": "🍾", - "chart": "💹", - "chart_with_downwards_trend": "📉", - "chart_with_upwards_trend": "📈", - "checkered_flag": "🏁", - "cheese": "🧀", - "cherries": "🍒", - "cherry_blossom": "🌸", - "chess_pawn": "♟", - "chestnut": "🌰", - "chicken": "🐔", - "child": "🧒", - "children_crossing": "🚸", - "chile": "🇨‍🇱", - "chipmunk": "🐿", - "chocolate_bar": "🍫", - "chopsticks": "🥢", - "christmas_island": "🇨‍🇽", - "christmas_tree": "🎄", - "church": "⛪", - "cinema": "🎦", - "circus_tent": "🎪", - "city_sunrise": "🌇", - "city_sunset": "🌆", - "cityscape": "🏙", - "cl": "🆑", - "clamp": "🗜", - "clap": "👏", - "clapper": "🎬", - "classical_building": "🏛", - "climbing": "🧗", - "climbing_man": "🧗‍♂", - "climbing_woman": "🧗‍♀", - "clinking_glasses": "🥂", - "clipboard": "📋", - "clipperton_island": "🇨‍🇵", - "clock1": "🕐", - "clock10": "🕙", - "clock1030": "🕥", - "clock11": "🕚", - "clock1130": "🕦", - "clock12": "🕛", - "clock1230": "🕧", - "clock130": "🕜", - "clock2": "🕑", - "clock230": "🕝", - "clock3": "🕒", - "clock330": "🕞", - "clock4": "🕓", - "clock430": "🕟", - "clock5": "🕔", - "clock530": "🕠", - "clock6": "🕕", - "clock630": "🕡", - "clock7": "🕖", - "clock730": "🕢", - "clock8": "🕗", - "clock830": "🕣", - "clock9": "🕘", - "clock930": "🕤", - "closed_book": "📕", - "closed_lock_with_key": "🔐", - "closed_umbrella": "🌂", - "cloud": "☁", - "cloud_with_lightning": "🌩", - "cloud_with_lightning_and_rain": "⛈", - "cloud_with_rain": "🌧", - "cloud_with_snow": "🌨", - "clown_face": "🤡", - "clubs": "♣", - "cn": "🇨‍🇳", - "coat": "🧥", - "cockroach": "🪳", - "cocktail": "🍸", - "coconut": "🥥", - "cocos_islands": "🇨‍🇨", - "coffee": "☕", - "coffin": "⚰", - "coin": "🪙", - "cold_face": "🥶", - "cold_sweat": "😰", - "collision": "💥", - "colombia": "🇨‍🇴", - "comet": "☄", - "comoros": "🇰‍🇲", - "compass": "🧭", - "computer": "💻", - "computer_mouse": "🖱", - "confetti_ball": "🎊", - "confounded": "😖", - "confused": "😕", - "congo_brazzaville": "🇨‍🇬", - "congo_kinshasa": "🇨‍🇩", - "congratulations": "㊗", - "construction": "🚧", - "construction_worker": "👷", - "construction_worker_man": "👷‍♂", - "construction_worker_woman": "👷‍♀", - "control_knobs": "🎛", - "convenience_store": "🏪", - "cook": "🧑‍🍳", - "cook_islands": "🇨‍🇰", - "cookie": "🍪", - "cool": "🆒", - "cop": "👮", - "copyright": "©", - "coral": "🪸", - "corn": "🌽", - "costa_rica": "🇨‍🇷", - "cote_divoire": "🇨‍🇮", - "couch_and_lamp": "🛋", - "couple": "👫", - "couple_with_heart": "💑", - "couple_with_heart_man_man": "👨‍❤‍👨", - "couple_with_heart_woman_man": "👩‍❤‍👨", - "couple_with_heart_woman_woman": "👩‍❤‍👩", - "couplekiss": "💏", - "couplekiss_man_man": "👨‍❤‍💋‍👨", - "couplekiss_man_woman": "👩‍❤‍💋‍👨", - "couplekiss_woman_woman": "👩‍❤‍💋‍👩", - "cow": "🐮", - "cow2": "🐄", - "cowboy_hat_face": "🤠", - "crab": "🦀", - "crayon": "🖍", - "credit_card": "💳", - "crescent_moon": "🌙", - "cricket": "🦗", - "cricket_game": "🏏", - "croatia": "🇭‍🇷", - "crocodile": "🐊", - "croissant": "🥐", - "crossed_fingers": "🤞", - "crossed_flags": "🎌", - "crossed_swords": "⚔", - "crown": "👑", - "crutch": "🩼", - "cry": "😢", - "crying_cat_face": "😿", - "crystal_ball": "🔮", - "cuba": "🇨‍🇺", - "cucumber": "🥒", - "cup_with_straw": "🥤", - "cupcake": "🧁", - "cupid": "💘", - "curacao": "🇨‍🇼", - "curling_stone": "🥌", - "curly_haired_man": "👨‍🦱", - "curly_haired_woman": "👩‍🦱", - "curly_loop": "➰", - "currency_exchange": "💱", - "curry": "🍛", - "cursing_face": "🤬", - "custard": "🍮", - "customs": "🛃", - "cut_of_meat": "🥩", - "cyclone": "🌀", - "cyprus": "🇨‍🇾", - "czech_republic": "🇨‍🇿", - "dagger": "🗡", - "dancer": "💃", - "dancers": "👯", - "dancing_men": "👯‍♂", - "dancing_women": "👯‍♀", - "dango": "🍡", - "dark_sunglasses": "🕶", - "dart": "🎯", - "dash": "💨", - "date": "📅", - "de": "🇩‍🇪", - "deaf_man": "🧏‍♂", - "deaf_person": "🧏", - "deaf_woman": "🧏‍♀", - "deciduous_tree": "🌳", - "deer": "🦌", - "denmark": "🇩‍🇰", - "department_store": "🏬", - "derelict_house": "🏚", - "desert": "🏜", - "desert_island": "🏝", - "desktop_computer": "🖥", - "detective": "🕵", - "diamond_shape_with_a_dot_inside": "💠", - "diamonds": "♦", - "diego_garcia": "🇩‍🇬", - "disappointed": "😞", - "disappointed_relieved": "😥", - "disguised_face": "🥸", - "diving_mask": "🤿", - "diya_lamp": "🪔", - "dizzy": "💫", - "dizzy_face": "😵", - "djibouti": "🇩‍🇯", - "dna": "🧬", - "do_not_litter": "🚯", - "dodo": "🦤", - "dog": "🐶", - "dog2": "🐕", - "dollar": "💵", - "dolls": "🎎", - "dolphin": "🐬", - "dominica": "🇩‍🇲", - "dominican_republic": "🇩‍🇴", - "donkey": "🫏", - "door": "🚪", - "dotted_line_face": "🫥", - "doughnut": "🍩", - "dove": "🕊", - "dragon": "🐉", - "dragon_face": "🐲", - "dress": "👗", - "dromedary_camel": "🐪", - "drooling_face": "🤤", - "drop_of_blood": "🩸", - "droplet": "💧", - "drum": "🥁", - "duck": "🦆", - "dumpling": "🥟", - "dvd": "📀", - "e-mail": "📧", - "eagle": "🦅", - "ear": "👂", - "ear_of_rice": "🌾", - "ear_with_hearing_aid": "🦻", - "earth_africa": "🌍", - "earth_americas": "🌎", - "earth_asia": "🌏", - "ecuador": "🇪‍🇨", - "egg": "🥚", - "eggplant": "🍆", - "egypt": "🇪‍🇬", - "eight": "8‍⃣", - "eight_pointed_black_star": "✴", - "eight_spoked_asterisk": "✳", - "eject_button": "⏏", - "el_salvador": "🇸‍🇻", - "electric_plug": "🔌", - "elephant": "🐘", - "elevator": "🛗", - "elf": "🧝", - "elf_man": "🧝‍♂", - "elf_woman": "🧝‍♀", - "email": "📧", - "empty_nest": "🪹", - "end": "🔚", - "england": "🏴‍󠁧‍󠁢‍󠁥‍󠁮‍󠁧‍󠁿", - "envelope": "✉", - "envelope_with_arrow": "📩", - "equatorial_guinea": "🇬‍🇶", - "eritrea": "🇪‍🇷", - "es": "🇪‍🇸", - "estonia": "🇪‍🇪", - "ethiopia": "🇪‍🇹", - "eu": "🇪‍🇺", - "euro": "💶", - "european_castle": "🏰", - "european_post_office": "🏤", - "european_union": "🇪‍🇺", - "evergreen_tree": "🌲", - "exclamation": "❗", - "exploding_head": "🤯", - "expressionless": "😑", - "eye": "👁", - "eye_speech_bubble": "👁‍🗨", - "eyeglasses": "👓", - "eyes": "👀", - "face_exhaling": "😮‍💨", - "face_holding_back_tears": "🥹", - "face_in_clouds": "😶‍🌫", - "face_with_diagonal_mouth": "🫤", - "face_with_head_bandage": "🤕", - "face_with_open_eyes_and_hand_over_mouth": "🫢", - "face_with_peeking_eye": "🫣", - "face_with_spiral_eyes": "😵‍💫", - "face_with_thermometer": "🤒", - "facepalm": "🤦", - "facepunch": "👊", - "factory": "🏭", - "factory_worker": "🧑‍🏭", - "fairy": "🧚", - "fairy_man": "🧚‍♂", - "fairy_woman": "🧚‍♀", - "falafel": "🧆", - "falkland_islands": "🇫‍🇰", - "fallen_leaf": "🍂", - "family": "👪", - "family_man_boy": "👨‍👦", - "family_man_boy_boy": "👨‍👦‍👦", - "family_man_girl": "👨‍👧", - "family_man_girl_boy": "👨‍👧‍👦", - "family_man_girl_girl": "👨‍👧‍👧", - "family_man_man_boy": "👨‍👨‍👦", - "family_man_man_boy_boy": "👨‍👨‍👦‍👦", - "family_man_man_girl": "👨‍👨‍👧", - "family_man_man_girl_boy": "👨‍👨‍👧‍👦", - "family_man_man_girl_girl": "👨‍👨‍👧‍👧", - "family_man_woman_boy": "👨‍👩‍👦", - "family_man_woman_boy_boy": "👨‍👩‍👦‍👦", - "family_man_woman_girl": "👨‍👩‍👧", - "family_man_woman_girl_boy": "👨‍👩‍👧‍👦", - "family_man_woman_girl_girl": "👨‍👩‍👧‍👧", - "family_woman_boy": "👩‍👦", - "family_woman_boy_boy": "👩‍👦‍👦", - "family_woman_girl": "👩‍👧", - "family_woman_girl_boy": "👩‍👧‍👦", - "family_woman_girl_girl": "👩‍👧‍👧", - "family_woman_woman_boy": "👩‍👩‍👦", - "family_woman_woman_boy_boy": "👩‍👩‍👦‍👦", - "family_woman_woman_girl": "👩‍👩‍👧", - "family_woman_woman_girl_boy": "👩‍👩‍👧‍👦", - "family_woman_woman_girl_girl": "👩‍👩‍👧‍👧", - "farmer": "🧑‍🌾", - "faroe_islands": "🇫‍🇴", - "fast_forward": "⏩", - "fax": "📠", - "fearful": "😨", - "feather": "🪶", - "feet": "🐾", - "female_detective": "🕵‍♀", - "female_sign": "♀", - "ferris_wheel": "🎡", - "ferry": "⛴", - "field_hockey": "🏑", - "fiji": "🇫‍🇯", - "file_cabinet": "🗄", - "file_folder": "📁", - "film_projector": "📽", - "film_strip": "🎞", - "finland": "🇫‍🇮", - "fire": "🔥", - "fire_engine": "🚒", - "fire_extinguisher": "🧯", - "firecracker": "🧨", - "firefighter": "🧑‍🚒", - "fireworks": "🎆", - "first_quarter_moon": "🌓", - "first_quarter_moon_with_face": "🌛", - "fish": "🐟", - "fish_cake": "🍥", - "fishing_pole_and_fish": "🎣", - "fist": "✊", - "fist_left": "🤛", - "fist_oncoming": "👊", - "fist_raised": "✊", - "fist_right": "🤜", - "five": "5‍⃣", - "flags": "🎏", - "flamingo": "🦩", - "flashlight": "🔦", - "flat_shoe": "🥿", - "flatbread": "🫓", - "fleur_de_lis": "⚜", - "flight_arrival": "🛬", - "flight_departure": "🛫", - "flipper": "🐬", - "floppy_disk": "💾", - "flower_playing_cards": "🎴", - "flushed": "😳", - "flute": "🪈", - "fly": "🪰", - "flying_disc": "🥏", - "flying_saucer": "🛸", - "fog": "🌫", - "foggy": "🌁", - "folding_hand_fan": "🪭", - "fondue": "🫕", - "foot": "🦶", - "football": "🏈", - "footprints": "👣", - "fork_and_knife": "🍴", - "fortune_cookie": "🥠", - "fountain": "⛲", - "fountain_pen": "🖋", - "four": "4‍⃣", - "four_leaf_clover": "🍀", - "fox_face": "🦊", - "fr": "🇫‍🇷", - "framed_picture": "🖼", - "free": "🆓", - "french_guiana": "🇬‍🇫", - "french_polynesia": "🇵‍🇫", - "french_southern_territories": "🇹‍🇫", - "fried_egg": "🍳", - "fried_shrimp": "🍤", - "fries": "🍟", - "frog": "🐸", - "frowning": "😦", - "frowning_face": "☹", - "frowning_man": "🙍‍♂", - "frowning_person": "🙍", - "frowning_woman": "🙍‍♀", - "fu": "🖕", - "fuelpump": "⛽", - "full_moon": "🌕", - "full_moon_with_face": "🌝", - "funeral_urn": "⚱", - "gabon": "🇬‍🇦", - "gambia": "🇬‍🇲", - "game_die": "🎲", - "garlic": "🧄", - "gb": "🇬‍🇧", - "gear": "⚙", - "gem": "💎", - "gemini": "♊", - "genie": "🧞", - "genie_man": "🧞‍♂", - "genie_woman": "🧞‍♀", - "georgia": "🇬‍🇪", - "ghana": "🇬‍🇭", - "ghost": "👻", - "gibraltar": "🇬‍🇮", - "gift": "🎁", - "gift_heart": "💝", - "ginger_root": "🫚", - "giraffe": "🦒", - "girl": "👧", - "globe_with_meridians": "🌐", - "gloves": "🧤", - "goal_net": "🥅", - "goat": "🐐", - "goggles": "🥽", - "golf": "⛳", - "golfing": "🏌", - "golfing_man": "🏌‍♂", - "golfing_woman": "🏌‍♀", - "goose": "🪿", - "gorilla": "🦍", - "grapes": "🍇", - "greece": "🇬‍🇷", - "green_apple": "🍏", - "green_book": "📗", - "green_circle": "🟢", - "green_heart": "💚", - "green_salad": "🥗", - "green_square": "🟩", - "greenland": "🇬‍🇱", - "grenada": "🇬‍🇩", - "grey_exclamation": "❕", - "grey_heart": "🩶", - "grey_question": "❔", - "grimacing": "😬", - "grin": "😁", - "grinning": "😀", - "guadeloupe": "🇬‍🇵", - "guam": "🇬‍🇺", - "guard": "💂", - "guardsman": "💂‍♂", - "guardswoman": "💂‍♀", - "guatemala": "🇬‍🇹", - "guernsey": "🇬‍🇬", - "guide_dog": "🦮", - "guinea": "🇬‍🇳", - "guinea_bissau": "🇬‍🇼", - "guitar": "🎸", - "gun": "🔫", - "guyana": "🇬‍🇾", - "hair_pick": "🪮", - "haircut": "💇", - "haircut_man": "💇‍♂", - "haircut_woman": "💇‍♀", - "haiti": "🇭‍🇹", - "hamburger": "🍔", - "hammer": "🔨", - "hammer_and_pick": "⚒", - "hammer_and_wrench": "🛠", - "hamsa": "🪬", - "hamster": "🐹", - "hand": "✋", - "hand_over_mouth": "🤭", - "hand_with_index_finger_and_thumb_crossed": "🫰", - "handbag": "👜", - "handball_person": "🤾", - "handshake": "🤝", - "hankey": "💩", - "hash": "#‍⃣", - "hatched_chick": "🐥", - "hatching_chick": "🐣", - "headphones": "🎧", - "headstone": "🪦", - "health_worker": "🧑‍⚕", - "hear_no_evil": "🙉", - "heard_mcdonald_islands": "🇭‍🇲", - "heart": "❤", - "heart_decoration": "💟", - "heart_eyes": "😍", - "heart_eyes_cat": "😻", - "heart_hands": "🫶", - "heart_on_fire": "❤‍🔥", - "heartbeat": "💓", - "heartpulse": "💗", - "hearts": "♥", - "heavy_check_mark": "✔", - "heavy_division_sign": "➗", - "heavy_dollar_sign": "💲", - "heavy_equals_sign": "🟰", - "heavy_exclamation_mark": "❗", - "heavy_heart_exclamation": "❣", - "heavy_minus_sign": "➖", - "heavy_multiplication_x": "✖", - "heavy_plus_sign": "➕", - "hedgehog": "🦔", - "helicopter": "🚁", - "herb": "🌿", - "hibiscus": "🌺", - "high_brightness": "🔆", - "high_heel": "👠", - "hiking_boot": "🥾", - "hindu_temple": "🛕", - "hippopotamus": "🦛", - "hocho": "🔪", - "hole": "🕳", - "honduras": "🇭‍🇳", - "honey_pot": "🍯", - "honeybee": "🐝", - "hong_kong": "🇭‍🇰", - "hook": "🪝", - "horse": "🐴", - "horse_racing": "🏇", - "hospital": "🏥", - "hot_face": "🥵", - "hot_pepper": "🌶", - "hotdog": "🌭", - "hotel": "🏨", - "hotsprings": "♨", - "hourglass": "⌛", - "hourglass_flowing_sand": "⏳", - "house": "🏠", - "house_with_garden": "🏡", - "houses": "🏘", - "hugs": "🤗", - "hungary": "🇭‍🇺", - "hushed": "😯", - "hut": "🛖", - "hyacinth": "🪻", - "ice_cream": "🍨", - "ice_cube": "🧊", - "ice_hockey": "🏒", - "ice_skate": "⛸", - "icecream": "🍦", - "iceland": "🇮‍🇸", - "id": "🆔", - "identification_card": "🪪", - "ideograph_advantage": "🉐", - "imp": "👿", - "inbox_tray": "📥", - "incoming_envelope": "📨", - "index_pointing_at_the_viewer": "🫵", - "india": "🇮‍🇳", - "indonesia": "🇮‍🇩", - "infinity": "♾", - "information_desk_person": "💁", - "information_source": "ℹ", - "innocent": "😇", - "interrobang": "⁉", - "iphone": "📱", - "iran": "🇮‍🇷", - "iraq": "🇮‍🇶", - "ireland": "🇮‍🇪", - "isle_of_man": "🇮‍🇲", - "israel": "🇮‍🇱", - "it": "🇮‍🇹", - "izakaya_lantern": "🏮", - "jack_o_lantern": "🎃", - "jamaica": "🇯‍🇲", - "japan": "🗾", - "japanese_castle": "🏯", - "japanese_goblin": "👺", - "japanese_ogre": "👹", - "jar": "🫙", - "jeans": "👖", - "jellyfish": "🪼", - "jersey": "🇯‍🇪", - "jigsaw": "🧩", - "jordan": "🇯‍🇴", - "joy": "😂", - "joy_cat": "😹", - "joystick": "🕹", - "jp": "🇯‍🇵", - "judge": "🧑‍⚖", - "juggling_person": "🤹", - "kaaba": "🕋", - "kangaroo": "🦘", - "kazakhstan": "🇰‍🇿", - "kenya": "🇰‍🇪", - "key": "🔑", - "keyboard": "⌨", - "keycap_ten": "🔟", - "khanda": "🪯", - "kick_scooter": "🛴", - "kimono": "👘", - "kiribati": "🇰‍🇮", - "kiss": "💋", - "kissing": "😗", - "kissing_cat": "😽", - "kissing_closed_eyes": "😚", - "kissing_heart": "😘", - "kissing_smiling_eyes": "😙", - "kite": "🪁", - "kiwi_fruit": "🥝", - "kneeling_man": "🧎‍♂", - "kneeling_person": "🧎", - "kneeling_woman": "🧎‍♀", - "knife": "🔪", - "knot": "🪢", - "koala": "🐨", - "koko": "🈁", - "kosovo": "🇽‍🇰", - "kr": "🇰‍🇷", - "kuwait": "🇰‍🇼", - "kyrgyzstan": "🇰‍🇬", - "lab_coat": "🥼", - "label": "🏷", - "lacrosse": "🥍", - "ladder": "🪜", - "lady_beetle": "🐞", - "lantern": "🏮", - "laos": "🇱‍🇦", - "large_blue_circle": "🔵", - "large_blue_diamond": "🔷", - "large_orange_diamond": "🔶", - "last_quarter_moon": "🌗", - "last_quarter_moon_with_face": "🌜", - "latin_cross": "✝", - "latvia": "🇱‍🇻", - "laughing": "😆", - "leafy_green": "🥬", - "leaves": "🍃", - "lebanon": "🇱‍🇧", - "ledger": "📒", - "left_luggage": "🛅", - "left_right_arrow": "↔", - "left_speech_bubble": "🗨", - "leftwards_arrow_with_hook": "↩", - "leftwards_hand": "🫲", - "leftwards_pushing_hand": "🫷", - "leg": "🦵", - "lemon": "🍋", - "leo": "♌", - "leopard": "🐆", - "lesotho": "🇱‍🇸", - "level_slider": "🎚", - "liberia": "🇱‍🇷", - "libra": "♎", - "libya": "🇱‍🇾", - "liechtenstein": "🇱‍🇮", - "light_blue_heart": "🩵", - "light_rail": "🚈", - "link": "🔗", - "lion": "🦁", - "lips": "👄", - "lipstick": "💄", - "lithuania": "🇱‍🇹", - "lizard": "🦎", - "llama": "🦙", - "lobster": "🦞", - "lock": "🔒", - "lock_with_ink_pen": "🔏", - "lollipop": "🍭", - "long_drum": "🪘", - "loop": "➿", - "lotion_bottle": "🧴", - "lotus": "🪷", - "lotus_position": "🧘", - "lotus_position_man": "🧘‍♂", - "lotus_position_woman": "🧘‍♀", - "loud_sound": "🔊", - "loudspeaker": "📢", - "love_hotel": "🏩", - "love_letter": "💌", - "love_you_gesture": "🤟", - "low_battery": "🪫", - "low_brightness": "🔅", - "luggage": "🧳", - "lungs": "🫁", - "luxembourg": "🇱‍🇺", - "lying_face": "🤥", - "m": "Ⓜ", - "macau": "🇲‍🇴", - "macedonia": "🇲‍🇰", - "madagascar": "🇲‍🇬", - "mag": "🔍", - "mag_right": "🔎", - "mage": "🧙", - "mage_man": "🧙‍♂", - "mage_woman": "🧙‍♀", - "magic_wand": "🪄", - "magnet": "🧲", - "mahjong": "🀄", - "mailbox": "📫", - "mailbox_closed": "📪", - "mailbox_with_mail": "📬", - "mailbox_with_no_mail": "📭", - "malawi": "🇲‍🇼", - "malaysia": "🇲‍🇾", - "maldives": "🇲‍🇻", - "male_detective": "🕵‍♂", - "male_sign": "♂", - "mali": "🇲‍🇱", - "malta": "🇲‍🇹", - "mammoth": "🦣", - "man": "👨", - "man_artist": "👨‍🎨", - "man_astronaut": "👨‍🚀", - "man_beard": "🧔‍♂", - "man_cartwheeling": "🤸‍♂", - "man_cook": "👨‍🍳", - "man_dancing": "🕺", - "man_facepalming": "🤦‍♂", - "man_factory_worker": "👨‍🏭", - "man_farmer": "👨‍🌾", - "man_feeding_baby": "👨‍🍼", - "man_firefighter": "👨‍🚒", - "man_health_worker": "👨‍⚕", - "man_in_manual_wheelchair": "👨‍🦽", - "man_in_motorized_wheelchair": "👨‍🦼", - "man_in_tuxedo": "🤵‍♂", - "man_judge": "👨‍⚖", - "man_juggling": "🤹‍♂", - "man_mechanic": "👨‍🔧", - "man_office_worker": "👨‍💼", - "man_pilot": "👨‍✈", - "man_playing_handball": "🤾‍♂", - "man_playing_water_polo": "🤽‍♂", - "man_scientist": "👨‍🔬", - "man_shrugging": "🤷‍♂", - "man_singer": "👨‍🎤", - "man_student": "👨‍🎓", - "man_teacher": "👨‍🏫", - "man_technologist": "👨‍💻", - "man_with_gua_pi_mao": "👲", - "man_with_probing_cane": "👨‍🦯", - "man_with_turban": "👳‍♂", - "man_with_veil": "👰‍♂", - "mandarin": "🍊", - "mango": "🥭", - "mans_shoe": "👞", - "mantelpiece_clock": "🕰", - "manual_wheelchair": "🦽", - "maple_leaf": "🍁", - "maracas": "🪇", - "marshall_islands": "🇲‍🇭", - "martial_arts_uniform": "🥋", - "martinique": "🇲‍🇶", - "mask": "😷", - "massage": "💆", - "massage_man": "💆‍♂", - "massage_woman": "💆‍♀", - "mate": "🧉", - "mauritania": "🇲‍🇷", - "mauritius": "🇲‍🇺", - "mayotte": "🇾‍🇹", - "meat_on_bone": "🍖", - "mechanic": "🧑‍🔧", - "mechanical_arm": "🦾", - "mechanical_leg": "🦿", - "medal_military": "🎖", - "medal_sports": "🏅", - "medical_symbol": "⚕", - "mega": "📣", - "melon": "🍈", - "melting_face": "🫠", - "memo": "📝", - "men_wrestling": "🤼‍♂", - "mending_heart": "❤‍🩹", - "menorah": "🕎", - "mens": "🚹", - "mermaid": "🧜‍♀", - "merman": "🧜‍♂", - "merperson": "🧜", - "metal": "🤘", - "metro": "🚇", - "mexico": "🇲‍🇽", - "microbe": "🦠", - "micronesia": "🇫‍🇲", - "microphone": "🎤", - "microscope": "🔬", - "middle_finger": "🖕", - "military_helmet": "🪖", - "milk_glass": "🥛", - "milky_way": "🌌", - "minibus": "🚐", - "minidisc": "💽", - "mirror": "🪞", - "mirror_ball": "🪩", - "mobile_phone_off": "📴", - "moldova": "🇲‍🇩", - "monaco": "🇲‍🇨", - "money_mouth_face": "🤑", - "money_with_wings": "💸", - "moneybag": "💰", - "mongolia": "🇲‍🇳", - "monkey": "🐒", - "monkey_face": "🐵", - "monocle_face": "🧐", - "monorail": "🚝", - "montenegro": "🇲‍🇪", - "montserrat": "🇲‍🇸", - "moon": "🌔", - "moon_cake": "🥮", - "moose": "🫎", - "morocco": "🇲‍🇦", - "mortar_board": "🎓", - "mosque": "🕌", - "mosquito": "🦟", - "motor_boat": "🛥", - "motor_scooter": "🛵", - "motorcycle": "🏍", - "motorized_wheelchair": "🦼", - "motorway": "🛣", - "mount_fuji": "🗻", - "mountain": "⛰", - "mountain_bicyclist": "🚵", - "mountain_biking_man": "🚵‍♂", - "mountain_biking_woman": "🚵‍♀", - "mountain_cableway": "🚠", - "mountain_railway": "🚞", - "mountain_snow": "🏔", - "mouse": "🐭", - "mouse2": "🐁", - "mouse_trap": "🪤", - "movie_camera": "🎥", - "moyai": "🗿", - "mozambique": "🇲‍🇿", - "mrs_claus": "🤶", - "muscle": "💪", - "mushroom": "🍄", - "musical_keyboard": "🎹", - "musical_note": "🎵", - "musical_score": "🎼", - "mute": "🔇", - "mx_claus": "🧑‍🎄", - "myanmar": "🇲‍🇲", - "nail_care": "💅", - "name_badge": "📛", - "namibia": "🇳‍🇦", - "national_park": "🏞", - "nauru": "🇳‍🇷", - "nauseated_face": "🤢", - "nazar_amulet": "🧿", - "necktie": "👔", - "negative_squared_cross_mark": "❎", - "nepal": "🇳‍🇵", - "nerd_face": "🤓", - "nest_with_eggs": "🪺", - "nesting_dolls": "🪆", - "netherlands": "🇳‍🇱", - "neutral_face": "😐", - "new": "🆕", - "new_caledonia": "🇳‍🇨", - "new_moon": "🌑", - "new_moon_with_face": "🌚", - "new_zealand": "🇳‍🇿", - "newspaper": "📰", - "newspaper_roll": "🗞", - "next_track_button": "⏭", - "ng": "🆖", - "ng_man": "🙅‍♂", - "ng_woman": "🙅‍♀", - "nicaragua": "🇳‍🇮", - "niger": "🇳‍🇪", - "nigeria": "🇳‍🇬", - "night_with_stars": "🌃", - "nine": "9‍⃣", - "ninja": "🥷", - "niue": "🇳‍🇺", - "no_bell": "🔕", - "no_bicycles": "🚳", - "no_entry": "⛔", - "no_entry_sign": "🚫", - "no_good": "🙅", - "no_good_man": "🙅‍♂", - "no_good_woman": "🙅‍♀", - "no_mobile_phones": "📵", - "no_mouth": "😶", - "no_pedestrians": "🚷", - "no_smoking": "🚭", - "non-potable_water": "🚱", - "norfolk_island": "🇳‍🇫", - "north_korea": "🇰‍🇵", - "northern_mariana_islands": "🇲‍🇵", - "norway": "🇳‍🇴", - "nose": "👃", - "notebook": "📓", - "notebook_with_decorative_cover": "📔", - "notes": "🎶", - "nut_and_bolt": "🔩", - "o": "⭕", - "o2": "🅾", - "ocean": "🌊", - "octopus": "🐙", - "oden": "🍢", - "office": "🏢", - "office_worker": "🧑‍💼", - "oil_drum": "🛢", - "ok": "🆗", - "ok_hand": "👌", - "ok_man": "🙆‍♂", - "ok_person": "🙆", - "ok_woman": "🙆‍♀", - "old_key": "🗝", - "older_adult": "🧓", - "older_man": "👴", - "older_woman": "👵", - "olive": "🫒", - "om": "🕉", - "oman": "🇴‍🇲", - "on": "🔛", - "oncoming_automobile": "🚘", - "oncoming_bus": "🚍", - "oncoming_police_car": "🚔", - "oncoming_taxi": "🚖", - "one": "1‍⃣", - "one_piece_swimsuit": "🩱", - "onion": "🧅", - "open_book": "📖", - "open_file_folder": "📂", - "open_hands": "👐", - "open_mouth": "😮", - "open_umbrella": "☂", - "ophiuchus": "⛎", - "orange": "🍊", - "orange_book": "📙", - "orange_circle": "🟠", - "orange_heart": "🧡", - "orange_square": "🟧", - "orangutan": "🦧", - "orthodox_cross": "☦", - "otter": "🦦", - "outbox_tray": "📤", - "owl": "🦉", - "ox": "🐂", - "oyster": "🦪", - "package": "📦", - "page_facing_up": "📄", - "page_with_curl": "📃", - "pager": "📟", - "paintbrush": "🖌", - "pakistan": "🇵‍🇰", - "palau": "🇵‍🇼", - "palestinian_territories": "🇵‍🇸", - "palm_down_hand": "🫳", - "palm_tree": "🌴", - "palm_up_hand": "🫴", - "palms_up_together": "🤲", - "panama": "🇵‍🇦", - "pancakes": "🥞", - "panda_face": "🐼", - "paperclip": "📎", - "paperclips": "🖇", - "papua_new_guinea": "🇵‍🇬", - "parachute": "🪂", - "paraguay": "🇵‍🇾", - "parasol_on_ground": "⛱", - "parking": "🅿", - "parrot": "🦜", - "part_alternation_mark": "〽", - "partly_sunny": "⛅", - "partying_face": "🥳", - "passenger_ship": "🛳", - "passport_control": "🛂", - "pause_button": "⏸", - "paw_prints": "🐾", - "pea_pod": "🫛", - "peace_symbol": "☮", - "peach": "🍑", - "peacock": "🦚", - "peanuts": "🥜", - "pear": "🍐", - "pen": "🖊", - "pencil": "📝", - "pencil2": "✏", - "penguin": "🐧", - "pensive": "😔", - "people_holding_hands": "🧑‍🤝‍🧑", - "people_hugging": "🫂", - "performing_arts": "🎭", - "persevere": "😣", - "person_bald": "🧑‍🦲", - "person_curly_hair": "🧑‍🦱", - "person_feeding_baby": "🧑‍🍼", - "person_fencing": "🤺", - "person_in_manual_wheelchair": "🧑‍🦽", - "person_in_motorized_wheelchair": "🧑‍🦼", - "person_in_tuxedo": "🤵", - "person_red_hair": "🧑‍🦰", - "person_white_hair": "🧑‍🦳", - "person_with_crown": "🫅", - "person_with_probing_cane": "🧑‍🦯", - "person_with_turban": "👳", - "person_with_veil": "👰", - "peru": "🇵‍🇪", - "petri_dish": "🧫", - "philippines": "🇵‍🇭", - "phone": "☎", - "pick": "⛏", - "pickup_truck": "🛻", - "pie": "🥧", - "pig": "🐷", - "pig2": "🐖", - "pig_nose": "🐽", - "pill": "💊", - "pilot": "🧑‍✈", - "pinata": "🪅", - "pinched_fingers": "🤌", - "pinching_hand": "🤏", - "pineapple": "🍍", - "ping_pong": "🏓", - "pink_heart": "🩷", - "pirate_flag": "🏴‍☠", - "pisces": "♓", - "pitcairn_islands": "🇵‍🇳", - "pizza": "🍕", - "placard": "🪧", - "place_of_worship": "🛐", - "plate_with_cutlery": "🍽", - "play_or_pause_button": "⏯", - "playground_slide": "🛝", - "pleading_face": "🥺", - "plunger": "🪠", - "point_down": "👇", - "point_left": "👈", - "point_right": "👉", - "point_up": "☝", - "point_up_2": "👆", - "poland": "🇵‍🇱", - "polar_bear": "🐻‍❄", - "police_car": "🚓", - "police_officer": "👮", - "policeman": "👮‍♂", - "policewoman": "👮‍♀", - "poodle": "🐩", - "poop": "💩", - "popcorn": "🍿", - "portugal": "🇵‍🇹", - "post_office": "🏣", - "postal_horn": "📯", - "postbox": "📮", - "potable_water": "🚰", - "potato": "🥔", - "potted_plant": "🪴", - "pouch": "👝", - "poultry_leg": "🍗", - "pound": "💷", - "pouring_liquid": "🫗", - "pout": "😡", - "pouting_cat": "😾", - "pouting_face": "🙎", - "pouting_man": "🙎‍♂", - "pouting_woman": "🙎‍♀", - "pray": "🙏", - "prayer_beads": "📿", - "pregnant_man": "🫃", - "pregnant_person": "🫄", - "pregnant_woman": "🤰", - "pretzel": "🥨", - "previous_track_button": "⏮", - "prince": "🤴", - "princess": "👸", - "printer": "🖨", - "probing_cane": "🦯", - "puerto_rico": "🇵‍🇷", - "punch": "👊", - "purple_circle": "🟣", - "purple_heart": "💜", - "purple_square": "🟪", - "purse": "👛", - "pushpin": "📌", - "put_litter_in_its_place": "🚮", - "qatar": "🇶‍🇦", - "question": "❓", - "rabbit": "🐰", - "rabbit2": "🐇", - "raccoon": "🦝", - "racehorse": "🐎", - "racing_car": "🏎", - "radio": "📻", - "radio_button": "🔘", - "radioactive": "☢", - "rage": "😡", - "railway_car": "🚃", - "railway_track": "🛤", - "rainbow": "🌈", - "rainbow_flag": "🏳‍🌈", - "raised_back_of_hand": "🤚", - "raised_eyebrow": "🤨", - "raised_hand": "✋", - "raised_hand_with_fingers_splayed": "🖐", - "raised_hands": "🙌", - "raising_hand": "🙋", - "raising_hand_man": "🙋‍♂", - "raising_hand_woman": "🙋‍♀", - "ram": "🐏", - "ramen": "🍜", - "rat": "🐀", - "razor": "🪒", - "receipt": "🧾", - "record_button": "⏺", - "recycle": "♻", - "red_car": "🚗", - "red_circle": "🔴", - "red_envelope": "🧧", - "red_haired_man": "👨‍🦰", - "red_haired_woman": "👩‍🦰", - "red_square": "🟥", - "registered": "®", - "relaxed": "☺", - "relieved": "😌", - "reminder_ribbon": "🎗", - "repeat": "🔁", - "repeat_one": "🔂", - "rescue_worker_helmet": "⛑", - "restroom": "🚻", - "reunion": "🇷‍🇪", - "revolving_hearts": "💞", - "rewind": "⏪", - "rhinoceros": "🦏", - "ribbon": "🎀", - "rice": "🍚", - "rice_ball": "🍙", - "rice_cracker": "🍘", - "rice_scene": "🎑", - "right_anger_bubble": "🗯", - "rightwards_hand": "🫱", - "rightwards_pushing_hand": "🫸", - "ring": "💍", - "ring_buoy": "🛟", - "ringed_planet": "🪐", - "robot": "🤖", - "rock": "🪨", - "rocket": "🚀", - "rofl": "🤣", - "roll_eyes": "🙄", - "roll_of_paper": "🧻", - "roller_coaster": "🎢", - "roller_skate": "🛼", - "romania": "🇷‍🇴", - "rooster": "🐓", - "rose": "🌹", - "rosette": "🏵", - "rotating_light": "🚨", - "round_pushpin": "📍", - "rowboat": "🚣", - "rowing_man": "🚣‍♂", - "rowing_woman": "🚣‍♀", - "ru": "🇷‍🇺", - "rugby_football": "🏉", - "runner": "🏃", - "running": "🏃", - "running_man": "🏃‍♂", - "running_shirt_with_sash": "🎽", - "running_woman": "🏃‍♀", - "rwanda": "🇷‍🇼", - "sa": "🈂", - "safety_pin": "🧷", - "safety_vest": "🦺", - "sagittarius": "♐", - "sailboat": "⛵", - "sake": "🍶", - "salt": "🧂", - "saluting_face": "🫡", - "samoa": "🇼‍🇸", - "san_marino": "🇸‍🇲", - "sandal": "👡", - "sandwich": "🥪", - "santa": "🎅", - "sao_tome_principe": "🇸‍🇹", - "sari": "🥻", - "sassy_man": "💁‍♂", - "sassy_woman": "💁‍♀", - "satellite": "📡", - "satisfied": "😆", - "saudi_arabia": "🇸‍🇦", - "sauna_man": "🧖‍♂", - "sauna_person": "🧖", - "sauna_woman": "🧖‍♀", - "sauropod": "🦕", - "saxophone": "🎷", - "scarf": "🧣", - "school": "🏫", - "school_satchel": "🎒", - "scientist": "🧑‍🔬", - "scissors": "✂", - "scorpion": "🦂", - "scorpius": "♏", - "scotland": "🏴‍󠁧‍󠁢‍󠁳‍󠁣‍󠁴‍󠁿", - "scream": "😱", - "scream_cat": "🙀", - "screwdriver": "🪛", - "scroll": "📜", - "seal": "🦭", - "seat": "💺", - "secret": "㊙", - "see_no_evil": "🙈", - "seedling": "🌱", - "selfie": "🤳", - "senegal": "🇸‍🇳", - "serbia": "🇷‍🇸", - "service_dog": "🐕‍🦺", - "seven": "7‍⃣", - "sewing_needle": "🪡", - "seychelles": "🇸‍🇨", - "shaking_face": "🫨", - "shallow_pan_of_food": "🥘", - "shamrock": "☘", - "shark": "🦈", - "shaved_ice": "🍧", - "sheep": "🐑", - "shell": "🐚", - "shield": "🛡", - "shinto_shrine": "⛩", - "ship": "🚢", - "shirt": "👕", - "shit": "💩", - "shoe": "👞", - "shopping": "🛍", - "shopping_cart": "🛒", - "shorts": "🩳", - "shower": "🚿", - "shrimp": "🦐", - "shrug": "🤷", - "shushing_face": "🤫", - "sierra_leone": "🇸‍🇱", - "signal_strength": "📶", - "singapore": "🇸‍🇬", - "singer": "🧑‍🎤", - "sint_maarten": "🇸‍🇽", - "six": "6‍⃣", - "six_pointed_star": "🔯", - "skateboard": "🛹", - "ski": "🎿", - "skier": "⛷", - "skull": "💀", - "skull_and_crossbones": "☠", - "skunk": "🦨", - "sled": "🛷", - "sleeping": "😴", - "sleeping_bed": "🛌", - "sleepy": "😪", - "slightly_frowning_face": "🙁", - "slightly_smiling_face": "🙂", - "slot_machine": "🎰", - "sloth": "🦥", - "slovakia": "🇸‍🇰", - "slovenia": "🇸‍🇮", - "small_airplane": "🛩", - "small_blue_diamond": "🔹", - "small_orange_diamond": "🔸", - "small_red_triangle": "🔺", - "small_red_triangle_down": "🔻", - "smile": "😄", - "smile_cat": "😸", - "smiley": "😃", - "smiley_cat": "😺", - "smiling_face_with_tear": "🥲", - "smiling_face_with_three_hearts": "🥰", - "smiling_imp": "😈", - "smirk": "😏", - "smirk_cat": "😼", - "smoking": "🚬", - "snail": "🐌", - "snake": "🐍", - "sneezing_face": "🤧", - "snowboarder": "🏂", - "snowflake": "❄", - "snowman": "⛄", - "snowman_with_snow": "☃", - "soap": "🧼", - "sob": "😭", - "soccer": "⚽", - "socks": "🧦", - "softball": "🥎", - "solomon_islands": "🇸‍🇧", - "somalia": "🇸‍🇴", - "soon": "🔜", - "sos": "🆘", - "sound": "🔉", - "south_africa": "🇿‍🇦", - "south_georgia_south_sandwich_islands": "🇬‍🇸", - "south_sudan": "🇸‍🇸", - "space_invader": "👾", - "spades": "♠", - "spaghetti": "🍝", - "sparkle": "❇", - "sparkler": "🎇", - "sparkles": "✨", - "sparkling_heart": "💖", - "speak_no_evil": "🙊", - "speaker": "🔈", - "speaking_head": "🗣", - "speech_balloon": "💬", - "speedboat": "🚤", - "spider": "🕷", - "spider_web": "🕸", - "spiral_calendar": "🗓", - "spiral_notepad": "🗒", - "sponge": "🧽", - "spoon": "🥄", - "squid": "🦑", - "sri_lanka": "🇱‍🇰", - "st_barthelemy": "🇧‍🇱", - "st_helena": "🇸‍🇭", - "st_kitts_nevis": "🇰‍🇳", - "st_lucia": "🇱‍🇨", - "st_martin": "🇲‍🇫", - "st_pierre_miquelon": "🇵‍🇲", - "st_vincent_grenadines": "🇻‍🇨", - "stadium": "🏟", - "standing_man": "🧍‍♂", - "standing_person": "🧍", - "standing_woman": "🧍‍♀", - "star": "⭐", - "star2": "🌟", - "star_and_crescent": "☪", - "star_of_david": "✡", - "star_struck": "🤩", - "stars": "🌠", - "station": "🚉", - "statue_of_liberty": "🗽", - "steam_locomotive": "🚂", - "stethoscope": "🩺", - "stew": "🍲", - "stop_button": "⏹", - "stop_sign": "🛑", - "stopwatch": "⏱", - "straight_ruler": "📏", - "strawberry": "🍓", - "stuck_out_tongue": "😛", - "stuck_out_tongue_closed_eyes": "😝", - "stuck_out_tongue_winking_eye": "😜", - "student": "🧑‍🎓", - "studio_microphone": "🎙", - "stuffed_flatbread": "🥙", - "sudan": "🇸‍🇩", - "sun_behind_large_cloud": "🌥", - "sun_behind_rain_cloud": "🌦", - "sun_behind_small_cloud": "🌤", - "sun_with_face": "🌞", - "sunflower": "🌻", - "sunglasses": "😎", - "sunny": "☀", - "sunrise": "🌅", - "sunrise_over_mountains": "🌄", - "superhero": "🦸", - "superhero_man": "🦸‍♂", - "superhero_woman": "🦸‍♀", - "supervillain": "🦹", - "supervillain_man": "🦹‍♂", - "supervillain_woman": "🦹‍♀", - "surfer": "🏄", - "surfing_man": "🏄‍♂", - "surfing_woman": "🏄‍♀", - "suriname": "🇸‍🇷", - "sushi": "🍣", - "suspension_railway": "🚟", - "svalbard_jan_mayen": "🇸‍🇯", - "swan": "🦢", - "swaziland": "🇸‍🇿", - "sweat": "😓", - "sweat_drops": "💦", - "sweat_smile": "😅", - "sweden": "🇸‍🇪", - "sweet_potato": "🍠", - "swim_brief": "🩲", - "swimmer": "🏊", - "swimming_man": "🏊‍♂", - "swimming_woman": "🏊‍♀", - "switzerland": "🇨‍🇭", - "symbols": "🔣", - "synagogue": "🕍", - "syria": "🇸‍🇾", - "syringe": "💉", - "t-rex": "🦖", - "taco": "🌮", - "tada": "🎉", - "taiwan": "🇹‍🇼", - "tajikistan": "🇹‍🇯", - "takeout_box": "🥡", - "tamale": "🫔", - "tanabata_tree": "🎋", - "tangerine": "🍊", - "tanzania": "🇹‍🇿", - "taurus": "♉", - "taxi": "🚕", - "tea": "🍵", - "teacher": "🧑‍🏫", - "teapot": "🫖", - "technologist": "🧑‍💻", - "teddy_bear": "🧸", - "telephone": "☎", - "telephone_receiver": "📞", - "telescope": "🔭", - "tennis": "🎾", - "tent": "⛺", - "test_tube": "🧪", - "thailand": "🇹‍🇭", - "thermometer": "🌡", - "thinking": "🤔", - "thong_sandal": "🩴", - "thought_balloon": "💭", - "thread": "🧵", - "three": "3‍⃣", - "thumbsdown": "👎", - "thumbsup": "👍", - "ticket": "🎫", - "tickets": "🎟", - "tiger": "🐯", - "tiger2": "🐅", - "timer_clock": "⏲", - "timor_leste": "🇹‍🇱", - "tipping_hand_man": "💁‍♂", - "tipping_hand_person": "💁", - "tipping_hand_woman": "💁‍♀", - "tired_face": "😫", - "tm": "™", - "togo": "🇹‍🇬", - "toilet": "🚽", - "tokelau": "🇹‍🇰", - "tokyo_tower": "🗼", - "tomato": "🍅", - "tonga": "🇹‍🇴", - "tongue": "👅", - "toolbox": "🧰", - "tooth": "🦷", - "toothbrush": "🪥", - "top": "🔝", - "tophat": "🎩", - "tornado": "🌪", - "tr": "🇹‍🇷", - "trackball": "🖲", - "tractor": "🚜", - "traffic_light": "🚥", - "train": "🚋", - "train2": "🚆", - "tram": "🚊", - "transgender_flag": "🏳‍⚧", - "transgender_symbol": "⚧", - "triangular_flag_on_post": "🚩", - "triangular_ruler": "📐", - "trident": "🔱", - "trinidad_tobago": "🇹‍🇹", - "tristan_da_cunha": "🇹‍🇦", - "triumph": "😤", - "troll": "🧌", - "trolleybus": "🚎", - "trophy": "🏆", - "tropical_drink": "🍹", - "tropical_fish": "🐠", - "truck": "🚚", - "trumpet": "🎺", - "tshirt": "👕", - "tulip": "🌷", - "tumbler_glass": "🥃", - "tunisia": "🇹‍🇳", - "turkey": "🦃", - "turkmenistan": "🇹‍🇲", - "turks_caicos_islands": "🇹‍🇨", - "turtle": "🐢", - "tuvalu": "🇹‍🇻", - "tv": "📺", - "twisted_rightwards_arrows": "🔀", - "two": "2‍⃣", - "two_hearts": "💕", - "two_men_holding_hands": "👬", - "two_women_holding_hands": "👭", - "u5272": "🈹", - "u5408": "🈴", - "u55b6": "🈺", - "u6307": "🈯", - "u6708": "🈷", - "u6709": "🈶", - "u6e80": "🈵", - "u7121": "🈚", - "u7533": "🈸", - "u7981": "🈲", - "u7a7a": "🈳", - "uganda": "🇺‍🇬", - "uk": "🇬‍🇧", - "ukraine": "🇺‍🇦", - "umbrella": "☔", - "unamused": "😒", - "underage": "🔞", - "unicorn": "🦄", - "united_arab_emirates": "🇦‍🇪", - "united_nations": "🇺‍🇳", - "unlock": "🔓", - "up": "🆙", - "upside_down_face": "🙃", - "uruguay": "🇺‍🇾", - "us": "🇺‍🇸", - "us_outlying_islands": "🇺‍🇲", - "us_virgin_islands": "🇻‍🇮", - "uzbekistan": "🇺‍🇿", - "v": "✌", - "vampire": "🧛", - "vampire_man": "🧛‍♂", - "vampire_woman": "🧛‍♀", - "vanuatu": "🇻‍🇺", - "vatican_city": "🇻‍🇦", - "venezuela": "🇻‍🇪", - "vertical_traffic_light": "🚦", - "vhs": "📼", - "vibration_mode": "📳", - "video_camera": "📹", - "video_game": "🎮", - "vietnam": "🇻‍🇳", - "violin": "🎻", - "virgo": "♍", - "volcano": "🌋", - "volleyball": "🏐", - "vomiting_face": "🤮", - "vs": "🆚", - "vulcan_salute": "🖖", - "waffle": "🧇", - "wales": "🏴‍󠁧‍󠁢‍󠁷‍󠁬‍󠁳‍󠁿", - "walking": "🚶", - "walking_man": "🚶‍♂", - "walking_woman": "🚶‍♀", - "wallis_futuna": "🇼‍🇫", - "waning_crescent_moon": "🌘", - "waning_gibbous_moon": "🌖", - "warning": "⚠", - "wastebasket": "🗑", - "watch": "⌚", - "water_buffalo": "🐃", - "water_polo": "🤽", - "watermelon": "🍉", - "wave": "👋", - "wavy_dash": "〰", - "waxing_crescent_moon": "🌒", - "waxing_gibbous_moon": "🌔", - "wc": "🚾", - "weary": "😩", - "wedding": "💒", - "weight_lifting": "🏋", - "weight_lifting_man": "🏋‍♂", - "weight_lifting_woman": "🏋‍♀", - "western_sahara": "🇪‍🇭", - "whale": "🐳", - "whale2": "🐋", - "wheel": "🛞", - "wheel_of_dharma": "☸", - "wheelchair": "♿", - "white_check_mark": "✅", - "white_circle": "⚪", - "white_flag": "🏳", - "white_flower": "💮", - "white_haired_man": "👨‍🦳", - "white_haired_woman": "👩‍🦳", - "white_heart": "🤍", - "white_large_square": "⬜", - "white_medium_small_square": "◽", - "white_medium_square": "◻", - "white_small_square": "▫", - "white_square_button": "🔳", - "wilted_flower": "🥀", - "wind_chime": "🎐", - "wind_face": "🌬", - "window": "🪟", - "wine_glass": "🍷", - "wing": "🪽", - "wink": "😉", - "wireless": "🛜", - "wolf": "🐺", - "woman": "👩", - "woman_artist": "👩‍🎨", - "woman_astronaut": "👩‍🚀", - "woman_beard": "🧔‍♀", - "woman_cartwheeling": "🤸‍♀", - "woman_cook": "👩‍🍳", - "woman_dancing": "💃", - "woman_facepalming": "🤦‍♀", - "woman_factory_worker": "👩‍🏭", - "woman_farmer": "👩‍🌾", - "woman_feeding_baby": "👩‍🍼", - "woman_firefighter": "👩‍🚒", - "woman_health_worker": "👩‍⚕", - "woman_in_manual_wheelchair": "👩‍🦽", - "woman_in_motorized_wheelchair": "👩‍🦼", - "woman_in_tuxedo": "🤵‍♀", - "woman_judge": "👩‍⚖", - "woman_juggling": "🤹‍♀", - "woman_mechanic": "👩‍🔧", - "woman_office_worker": "👩‍💼", - "woman_pilot": "👩‍✈", - "woman_playing_handball": "🤾‍♀", - "woman_playing_water_polo": "🤽‍♀", - "woman_scientist": "👩‍🔬", - "woman_shrugging": "🤷‍♀", - "woman_singer": "👩‍🎤", - "woman_student": "👩‍🎓", - "woman_teacher": "👩‍🏫", - "woman_technologist": "👩‍💻", - "woman_with_headscarf": "🧕", - "woman_with_probing_cane": "👩‍🦯", - "woman_with_turban": "👳‍♀", - "woman_with_veil": "👰‍♀", - "womans_clothes": "👚", - "womans_hat": "👒", - "women_wrestling": "🤼‍♀", - "womens": "🚺", - "wood": "🪵", - "woozy_face": "🥴", - "world_map": "🗺", - "worm": "🪱", - "worried": "😟", - "wrench": "🔧", - "wrestling": "🤼", - "writing_hand": "✍", - "x": "❌", - "x_ray": "🩻", - "yarn": "🧶", - "yawning_face": "🥱", - "yellow_circle": "🟡", - "yellow_heart": "💛", - "yellow_square": "🟨", - "yemen": "🇾‍🇪", - "yen": "💴", - "yin_yang": "☯", - "yo_yo": "🪀", - "yum": "😋", - "zambia": "🇿‍🇲", - "zany_face": "🤪", - "zap": "⚡", - "zebra": "🦓", - "zero": "0‍⃣", - "zimbabwe": "🇿‍🇼", - "zipper_mouth_face": "🤐", - "zombie": "🧟", - "zombie_man": "🧟‍♂", - "zombie_woman": "🧟‍♀", - "zzz": "💤" -} \ No newline at end of file +{} \ No newline at end of file diff --git a/packages/markdown/src/remarkDirectiveReadalong.ts b/packages/markdown/src/remarkDirectiveReadalong.ts index 3f4fc431..629b2e35 100644 --- a/packages/markdown/src/remarkDirectiveReadalong.ts +++ b/packages/markdown/src/remarkDirectiveReadalong.ts @@ -45,6 +45,7 @@ export default (ctx: HyperbookContext) => () => { timestamps, autoGenerate = false, speed = 150, // words per minute for auto-generation + mode = "manual", // "manual" or "tts" } = node.attributes || {}; expectContainerDirective(node, file, name); @@ -140,10 +141,11 @@ export default (ctx: HyperbookContext) => () => { ], }; - data.hChildren = [ - controls, - textWrapper, - { + // Build children array - audio element only for manual mode + const children: ElementContent[] = [controls, textWrapper]; + + if (mode !== "tts") { + children.push({ type: "element", tagName: "audio", properties: { @@ -158,28 +160,32 @@ export default (ctx: HyperbookContext) => () => { preload: "metadata", }, children: [], + }); + } + + children.push({ + type: "element", + tagName: "script", + properties: { + type: "application/json", + class: "readalong-config", }, - { - type: "element", - tagName: "script", - properties: { - type: "application/json", - class: "readalong-config", + children: [ + { + type: "text", + value: JSON.stringify({ + id, + mode: mode || "manual", + timestamps: timestampData, + autoGenerate: autoGenerate === "true", + speed: typeof speed === "string" ? parseInt(speed) : speed, + text: textContent, + }), }, - children: [ - { - type: "text", - value: JSON.stringify({ - id, - timestamps: timestampData, - autoGenerate: autoGenerate === "true", - speed: typeof speed === "string" ? parseInt(speed) : speed, - text: textContent, - }), - }, - ], - }, - ]; + ], + }); + + data.hChildren = children; } }; }; diff --git a/packages/markdown/tests/__snapshots__/remarkDirectiveReadalong.test.ts.snap b/packages/markdown/tests/__snapshots__/remarkDirectiveReadalong.test.ts.snap index 42758c84..b09bd1b1 100644 --- a/packages/markdown/tests/__snapshots__/remarkDirectiveReadalong.test.ts.snap +++ b/packages/markdown/tests/__snapshots__/remarkDirectiveReadalong.test.ts.snap @@ -11,7 +11,21 @@ exports[`remarkDirectiveReadalong > should handle multiple paragraphs 1`] = `

Second paragraph of text.

- + + +" +`; + +exports[`remarkDirectiveReadalong > should transform with TTS mode 1`] = ` +" +
+
+
0:00 / 0:00
+
+
+

This is a test using text-to-speech synthesis.

+
+
" `; @@ -26,7 +40,7 @@ exports[`remarkDirectiveReadalong > should transform with audio source 1`] = `

This is a test sentence for read-along functionality.

- + " `; @@ -41,7 +55,7 @@ exports[`remarkDirectiveReadalong > should transform with auto-generation enable

This is a test sentence for read-along functionality.

- + " `; @@ -56,7 +70,7 @@ exports[`remarkDirectiveReadalong > should transform with timestamps 1`] = `

This is a test sentence for read-along functionality.

- + " `; diff --git a/packages/markdown/tests/remarkDirectiveReadalong.test.ts b/packages/markdown/tests/remarkDirectiveReadalong.test.ts index e87c4347..75e8990f 100644 --- a/packages/markdown/tests/remarkDirectiveReadalong.test.ts +++ b/packages/markdown/tests/remarkDirectiveReadalong.test.ts @@ -107,6 +107,21 @@ First paragraph of text. Second paragraph of text. ::: +`, + ctx, + ) + ).value, + ).toMatchSnapshot(); + }); + + it("should transform with TTS mode", async () => { + expect( + ( + await toHtml( + ` +:::readalong{mode="tts"} +This is a test using text-to-speech synthesis. +::: `, ctx, ) diff --git a/website/de/book/elements/emoji.md b/website/de/book/elements/emoji.md index b4360502..db45bf69 100644 --- a/website/de/book/elements/emoji.md +++ b/website/de/book/elements/emoji.md @@ -18,1916 +18,4 @@ Diese Datei listet alle unterstützten GitHub-Emoji-Kürzel und ihre entsprechen | Emoji | Shortcode |:------|:----------| -| 👎 | `:-1:` | -| 👍 | `:+1:` | -| 💯 | `:100:` | -| 🔢 | `:1234:` | -| 🥇 | `:1st_place_medal:` | -| 🥈 | `:2nd_place_medal:` | -| 🥉 | `:3rd_place_medal:` | -| 🎱 | `:8ball:` | -| 🅰 | `:a:` | -| 🆎 | `:ab:` | -| 🧮 | `:abacus:` | -| 🔤 | `:abc:` | -| 🔡 | `:abcd:` | -| 🉑 | `:accept:` | -| 🪗 | `:accordion:` | -| 🩹 | `:adhesive_bandage:` | -| 🧑 | `:adult:` | -| 🚡 | `:aerial_tramway:` | -| 🇦‍🇫 | `:afghanistan:` | -| ✈ | `:airplane:` | -| 🇦‍🇽 | `:aland_islands:` | -| ⏰ | `:alarm_clock:` | -| 🇦‍🇱 | `:albania:` | -| ⚗ | `:alembic:` | -| 🇩‍🇿 | `:algeria:` | -| 👽 | `:alien:` | -| 🚑 | `:ambulance:` | -| 🇦‍🇸 | `:american_samoa:` | -| 🏺 | `:amphora:` | -| 🫀 | `:anatomical_heart:` | -| ⚓ | `:anchor:` | -| 🇦‍🇩 | `:andorra:` | -| 👼 | `:angel:` | -| 💢 | `:anger:` | -| 🇦‍🇴 | `:angola:` | -| 😠 | `:angry:` | -| 🇦‍🇮 | `:anguilla:` | -| 😧 | `:anguished:` | -| 🐜 | `:ant:` | -| 🇦‍🇶 | `:antarctica:` | -| 🇦‍🇬 | `:antigua_barbuda:` | -| 🍎 | `:apple:` | -| ♒ | `:aquarius:` | -| 🇦‍🇷 | `:argentina:` | -| ♈ | `:aries:` | -| 🇦‍🇲 | `:armenia:` | -| ◀ | `:arrow_backward:` | -| ⏬ | `:arrow_double_down:` | -| ⏫ | `:arrow_double_up:` | -| ⬇ | `:arrow_down:` | -| 🔽 | `:arrow_down_small:` | -| ▶ | `:arrow_forward:` | -| ⤵ | `:arrow_heading_down:` | -| ⤴ | `:arrow_heading_up:` | -| ⬅ | `:arrow_left:` | -| ↙ | `:arrow_lower_left:` | -| ↘ | `:arrow_lower_right:` | -| ➡ | `:arrow_right:` | -| ↪ | `:arrow_right_hook:` | -| ⬆ | `:arrow_up:` | -| ↕ | `:arrow_up_down:` | -| 🔼 | `:arrow_up_small:` | -| ↖ | `:arrow_upper_left:` | -| ↗ | `:arrow_upper_right:` | -| 🔃 | `:arrows_clockwise:` | -| 🔄 | `:arrows_counterclockwise:` | -| 🎨 | `:art:` | -| 🚛 | `:articulated_lorry:` | -| 🛰 | `:artificial_satellite:` | -| 🧑‍🎨 | `:artist:` | -| 🇦‍🇼 | `:aruba:` | -| 🇦‍🇨 | `:ascension_island:` | -| *‍⃣ | `:asterisk:` | -| 😲 | `:astonished:` | -| 🧑‍🚀 | `:astronaut:` | -| 👟 | `:athletic_shoe:` | -| 🏧 | `:atm:` | -| ⚛ | `:atom_symbol:` | -| 🇦‍🇺 | `:australia:` | -| 🇦‍🇹 | `:austria:` | -| 🛺 | `:auto_rickshaw:` | -| 🥑 | `:avocado:` | -| 🪓 | `:axe:` | -| 🇦‍🇿 | `:azerbaijan:` | -| 🅱 | `:b:` | -| 👶 | `:baby:` | -| 🍼 | `:baby_bottle:` | -| 🐤 | `:baby_chick:` | -| 🚼 | `:baby_symbol:` | -| 🔙 | `:back:` | -| 🥓 | `:bacon:` | -| 🦡 | `:badger:` | -| 🏸 | `:badminton:` | -| 🥯 | `:bagel:` | -| 🛄 | `:baggage_claim:` | -| 🥖 | `:baguette_bread:` | -| 🇧‍🇸 | `:bahamas:` | -| 🇧‍🇭 | `:bahrain:` | -| ⚖ | `:balance_scale:` | -| 👨‍🦲 | `:bald_man:` | -| 👩‍🦲 | `:bald_woman:` | -| 🩰 | `:ballet_shoes:` | -| 🎈 | `:balloon:` | -| 🗳 | `:ballot_box:` | -| ☑ | `:ballot_box_with_check:` | -| 🎍 | `:bamboo:` | -| 🍌 | `:banana:` | -| ‼ | `:bangbang:` | -| 🇧‍🇩 | `:bangladesh:` | -| 🪕 | `:banjo:` | -| 🏦 | `:bank:` | -| 📊 | `:bar_chart:` | -| 🇧‍🇧 | `:barbados:` | -| 💈 | `:barber:` | -| ⚾ | `:baseball:` | -| 🧺 | `:basket:` | -| 🏀 | `:basketball:` | -| ⛹‍♂ | `:basketball_man:` | -| ⛹‍♀ | `:basketball_woman:` | -| 🦇 | `:bat:` | -| 🛀 | `:bath:` | -| 🛁 | `:bathtub:` | -| 🔋 | `:battery:` | -| 🏖 | `:beach_umbrella:` | -| 🫘 | `:beans:` | -| 🐻 | `:bear:` | -| 🧔 | `:bearded_person:` | -| 🦫 | `:beaver:` | -| 🛏 | `:bed:` | -| 🐝 | `:bee:` | -| 🍺 | `:beer:` | -| 🍻 | `:beers:` | -| 🪲 | `:beetle:` | -| 🔰 | `:beginner:` | -| 🇧‍🇾 | `:belarus:` | -| 🇧‍🇪 | `:belgium:` | -| 🇧‍🇿 | `:belize:` | -| 🔔 | `:bell:` | -| 🫑 | `:bell_pepper:` | -| 🛎 | `:bellhop_bell:` | -| 🇧‍🇯 | `:benin:` | -| 🍱 | `:bento:` | -| 🇧‍🇲 | `:bermuda:` | -| 🧃 | `:beverage_box:` | -| 🇧‍🇹 | `:bhutan:` | -| 🚴 | `:bicyclist:` | -| 🚲 | `:bike:` | -| 🚴‍♂ | `:biking_man:` | -| 🚴‍♀ | `:biking_woman:` | -| 👙 | `:bikini:` | -| 🧢 | `:billed_cap:` | -| ☣ | `:biohazard:` | -| 🐦 | `:bird:` | -| 🎂 | `:birthday:` | -| 🦬 | `:bison:` | -| 🫦 | `:biting_lip:` | -| 🐦‍⬛ | `:black_bird:` | -| 🐈‍⬛ | `:black_cat:` | -| ⚫ | `:black_circle:` | -| 🏴 | `:black_flag:` | -| 🖤 | `:black_heart:` | -| 🃏 | `:black_joker:` | -| ⬛ | `:black_large_square:` | -| ◾ | `:black_medium_small_square:` | -| ◼ | `:black_medium_square:` | -| ✒ | `:black_nib:` | -| ▪ | `:black_small_square:` | -| 🔲 | `:black_square_button:` | -| 👱‍♂ | `:blond_haired_man:` | -| 👱 | `:blond_haired_person:` | -| 👱‍♀ | `:blond_haired_woman:` | -| 👱‍♀ | `:blonde_woman:` | -| 🌼 | `:blossom:` | -| 🐡 | `:blowfish:` | -| 📘 | `:blue_book:` | -| 🚙 | `:blue_car:` | -| 💙 | `:blue_heart:` | -| 🟦 | `:blue_square:` | -| 🫐 | `:blueberries:` | -| 😊 | `:blush:` | -| 🐗 | `:boar:` | -| ⛵ | `:boat:` | -| 🇧‍🇴 | `:bolivia:` | -| 💣 | `:bomb:` | -| 🦴 | `:bone:` | -| 📖 | `:book:` | -| 🔖 | `:bookmark:` | -| 📑 | `:bookmark_tabs:` | -| 📚 | `:books:` | -| 💥 | `:boom:` | -| 🪃 | `:boomerang:` | -| 👢 | `:boot:` | -| 🇧‍🇦 | `:bosnia_herzegovina:` | -| 🇧‍🇼 | `:botswana:` | -| ⛹‍♂ | `:bouncing_ball_man:` | -| ⛹ | `:bouncing_ball_person:` | -| ⛹‍♀ | `:bouncing_ball_woman:` | -| 💐 | `:bouquet:` | -| 🇧‍🇻 | `:bouvet_island:` | -| 🙇 | `:bow:` | -| 🏹 | `:bow_and_arrow:` | -| 🙇‍♂ | `:bowing_man:` | -| 🙇‍♀ | `:bowing_woman:` | -| 🥣 | `:bowl_with_spoon:` | -| 🎳 | `:bowling:` | -| 🥊 | `:boxing_glove:` | -| 👦 | `:boy:` | -| 🧠 | `:brain:` | -| 🇧‍🇷 | `:brazil:` | -| 🍞 | `:bread:` | -| 🤱 | `:breast_feeding:` | -| 🧱 | `:bricks:` | -| 👰‍♀ | `:bride_with_veil:` | -| 🌉 | `:bridge_at_night:` | -| 💼 | `:briefcase:` | -| 🇮‍🇴 | `:british_indian_ocean_territory:` | -| 🇻‍🇬 | `:british_virgin_islands:` | -| 🥦 | `:broccoli:` | -| 💔 | `:broken_heart:` | -| 🧹 | `:broom:` | -| 🟤 | `:brown_circle:` | -| 🤎 | `:brown_heart:` | -| 🟫 | `:brown_square:` | -| 🇧‍🇳 | `:brunei:` | -| 🧋 | `:bubble_tea:` | -| 🫧 | `:bubbles:` | -| 🪣 | `:bucket:` | -| 🐛 | `:bug:` | -| 🏗 | `:building_construction:` | -| 💡 | `:bulb:` | -| 🇧‍🇬 | `:bulgaria:` | -| 🚅 | `:bullettrain_front:` | -| 🚄 | `:bullettrain_side:` | -| 🇧‍🇫 | `:burkina_faso:` | -| 🌯 | `:burrito:` | -| 🇧‍🇮 | `:burundi:` | -| 🚌 | `:bus:` | -| 🕴 | `:business_suit_levitating:` | -| 🚏 | `:busstop:` | -| 👤 | `:bust_in_silhouette:` | -| 👥 | `:busts_in_silhouette:` | -| 🧈 | `:butter:` | -| 🦋 | `:butterfly:` | -| 🌵 | `:cactus:` | -| 🍰 | `:cake:` | -| 📆 | `:calendar:` | -| 🤙 | `:call_me_hand:` | -| 📲 | `:calling:` | -| 🇰‍🇭 | `:cambodia:` | -| 🐫 | `:camel:` | -| 📷 | `:camera:` | -| 📸 | `:camera_flash:` | -| 🇨‍🇲 | `:cameroon:` | -| 🏕 | `:camping:` | -| 🇨‍🇦 | `:canada:` | -| 🇮‍🇨 | `:canary_islands:` | -| ♋ | `:cancer:` | -| 🕯 | `:candle:` | -| 🍬 | `:candy:` | -| 🥫 | `:canned_food:` | -| 🛶 | `:canoe:` | -| 🇨‍🇻 | `:cape_verde:` | -| 🔠 | `:capital_abcd:` | -| ♑ | `:capricorn:` | -| 🚗 | `:car:` | -| 🗃 | `:card_file_box:` | -| 📇 | `:card_index:` | -| 🗂 | `:card_index_dividers:` | -| 🇧‍🇶 | `:caribbean_netherlands:` | -| 🎠 | `:carousel_horse:` | -| 🪚 | `:carpentry_saw:` | -| 🥕 | `:carrot:` | -| 🤸 | `:cartwheeling:` | -| 🐱 | `:cat:` | -| 🐈 | `:cat2:` | -| 🇰‍🇾 | `:cayman_islands:` | -| 💿 | `:cd:` | -| 🇨‍🇫 | `:central_african_republic:` | -| 🇪‍🇦 | `:ceuta_melilla:` | -| 🇹‍🇩 | `:chad:` | -| ⛓ | `:chains:` | -| 🪑 | `:chair:` | -| 🍾 | `:champagne:` | -| 💹 | `:chart:` | -| 📉 | `:chart_with_downwards_trend:` | -| 📈 | `:chart_with_upwards_trend:` | -| 🏁 | `:checkered_flag:` | -| 🧀 | `:cheese:` | -| 🍒 | `:cherries:` | -| 🌸 | `:cherry_blossom:` | -| ♟ | `:chess_pawn:` | -| 🌰 | `:chestnut:` | -| 🐔 | `:chicken:` | -| 🧒 | `:child:` | -| 🚸 | `:children_crossing:` | -| 🇨‍🇱 | `:chile:` | -| 🐿 | `:chipmunk:` | -| 🍫 | `:chocolate_bar:` | -| 🥢 | `:chopsticks:` | -| 🇨‍🇽 | `:christmas_island:` | -| 🎄 | `:christmas_tree:` | -| ⛪ | `:church:` | -| 🎦 | `:cinema:` | -| 🎪 | `:circus_tent:` | -| 🌇 | `:city_sunrise:` | -| 🌆 | `:city_sunset:` | -| 🏙 | `:cityscape:` | -| 🆑 | `:cl:` | -| 🗜 | `:clamp:` | -| 👏 | `:clap:` | -| 🎬 | `:clapper:` | -| 🏛 | `:classical_building:` | -| 🧗 | `:climbing:` | -| 🧗‍♂ | `:climbing_man:` | -| 🧗‍♀ | `:climbing_woman:` | -| 🥂 | `:clinking_glasses:` | -| 📋 | `:clipboard:` | -| 🇨‍🇵 | `:clipperton_island:` | -| 🕐 | `:clock1:` | -| 🕙 | `:clock10:` | -| 🕥 | `:clock1030:` | -| 🕚 | `:clock11:` | -| 🕦 | `:clock1130:` | -| 🕛 | `:clock12:` | -| 🕧 | `:clock1230:` | -| 🕜 | `:clock130:` | -| 🕑 | `:clock2:` | -| 🕝 | `:clock230:` | -| 🕒 | `:clock3:` | -| 🕞 | `:clock330:` | -| 🕓 | `:clock4:` | -| 🕟 | `:clock430:` | -| 🕔 | `:clock5:` | -| 🕠 | `:clock530:` | -| 🕕 | `:clock6:` | -| 🕡 | `:clock630:` | -| 🕖 | `:clock7:` | -| 🕢 | `:clock730:` | -| 🕗 | `:clock8:` | -| 🕣 | `:clock830:` | -| 🕘 | `:clock9:` | -| 🕤 | `:clock930:` | -| 📕 | `:closed_book:` | -| 🔐 | `:closed_lock_with_key:` | -| 🌂 | `:closed_umbrella:` | -| ☁ | `:cloud:` | -| 🌩 | `:cloud_with_lightning:` | -| ⛈ | `:cloud_with_lightning_and_rain:` | -| 🌧 | `:cloud_with_rain:` | -| 🌨 | `:cloud_with_snow:` | -| 🤡 | `:clown_face:` | -| ♣ | `:clubs:` | -| 🇨‍🇳 | `:cn:` | -| 🧥 | `:coat:` | -| 🪳 | `:cockroach:` | -| 🍸 | `:cocktail:` | -| 🥥 | `:coconut:` | -| 🇨‍🇨 | `:cocos_islands:` | -| ☕ | `:coffee:` | -| ⚰ | `:coffin:` | -| 🪙 | `:coin:` | -| 🥶 | `:cold_face:` | -| 😰 | `:cold_sweat:` | -| 💥 | `:collision:` | -| 🇨‍🇴 | `:colombia:` | -| ☄ | `:comet:` | -| 🇰‍🇲 | `:comoros:` | -| 🧭 | `:compass:` | -| 💻 | `:computer:` | -| 🖱 | `:computer_mouse:` | -| 🎊 | `:confetti_ball:` | -| 😖 | `:confounded:` | -| 😕 | `:confused:` | -| 🇨‍🇬 | `:congo_brazzaville:` | -| 🇨‍🇩 | `:congo_kinshasa:` | -| ㊗ | `:congratulations:` | -| 🚧 | `:construction:` | -| 👷 | `:construction_worker:` | -| 👷‍♂ | `:construction_worker_man:` | -| 👷‍♀ | `:construction_worker_woman:` | -| 🎛 | `:control_knobs:` | -| 🏪 | `:convenience_store:` | -| 🧑‍🍳 | `:cook:` | -| 🇨‍🇰 | `:cook_islands:` | -| 🍪 | `:cookie:` | -| 🆒 | `:cool:` | -| 👮 | `:cop:` | -| © | `:copyright:` | -| 🪸 | `:coral:` | -| 🌽 | `:corn:` | -| 🇨‍🇷 | `:costa_rica:` | -| 🇨‍🇮 | `:cote_divoire:` | -| 🛋 | `:couch_and_lamp:` | -| 👫 | `:couple:` | -| 💑 | `:couple_with_heart:` | -| 👨‍❤‍👨 | `:couple_with_heart_man_man:` | -| 👩‍❤‍👨 | `:couple_with_heart_woman_man:` | -| 👩‍❤‍👩 | `:couple_with_heart_woman_woman:` | -| 💏 | `:couplekiss:` | -| 👨‍❤‍💋‍👨 | `:couplekiss_man_man:` | -| 👩‍❤‍💋‍👨 | `:couplekiss_man_woman:` | -| 👩‍❤‍💋‍👩 | `:couplekiss_woman_woman:` | -| 🐮 | `:cow:` | -| 🐄 | `:cow2:` | -| 🤠 | `:cowboy_hat_face:` | -| 🦀 | `:crab:` | -| 🖍 | `:crayon:` | -| 💳 | `:credit_card:` | -| 🌙 | `:crescent_moon:` | -| 🦗 | `:cricket:` | -| 🏏 | `:cricket_game:` | -| 🇭‍🇷 | `:croatia:` | -| 🐊 | `:crocodile:` | -| 🥐 | `:croissant:` | -| 🤞 | `:crossed_fingers:` | -| 🎌 | `:crossed_flags:` | -| ⚔ | `:crossed_swords:` | -| 👑 | `:crown:` | -| 🩼 | `:crutch:` | -| 😢 | `:cry:` | -| 😿 | `:crying_cat_face:` | -| 🔮 | `:crystal_ball:` | -| 🇨‍🇺 | `:cuba:` | -| 🥒 | `:cucumber:` | -| 🥤 | `:cup_with_straw:` | -| 🧁 | `:cupcake:` | -| 💘 | `:cupid:` | -| 🇨‍🇼 | `:curacao:` | -| 🥌 | `:curling_stone:` | -| 👨‍🦱 | `:curly_haired_man:` | -| 👩‍🦱 | `:curly_haired_woman:` | -| ➰ | `:curly_loop:` | -| 💱 | `:currency_exchange:` | -| 🍛 | `:curry:` | -| 🤬 | `:cursing_face:` | -| 🍮 | `:custard:` | -| 🛃 | `:customs:` | -| 🥩 | `:cut_of_meat:` | -| 🌀 | `:cyclone:` | -| 🇨‍🇾 | `:cyprus:` | -| 🇨‍🇿 | `:czech_republic:` | -| 🗡 | `:dagger:` | -| 💃 | `:dancer:` | -| 👯 | `:dancers:` | -| 👯‍♂ | `:dancing_men:` | -| 👯‍♀ | `:dancing_women:` | -| 🍡 | `:dango:` | -| 🕶 | `:dark_sunglasses:` | -| 🎯 | `:dart:` | -| 💨 | `:dash:` | -| 📅 | `:date:` | -| 🇩‍🇪 | `:de:` | -| 🧏‍♂ | `:deaf_man:` | -| 🧏 | `:deaf_person:` | -| 🧏‍♀ | `:deaf_woman:` | -| 🌳 | `:deciduous_tree:` | -| 🦌 | `:deer:` | -| 🇩‍🇰 | `:denmark:` | -| 🏬 | `:department_store:` | -| 🏚 | `:derelict_house:` | -| 🏜 | `:desert:` | -| 🏝 | `:desert_island:` | -| 🖥 | `:desktop_computer:` | -| 🕵 | `:detective:` | -| 💠 | `:diamond_shape_with_a_dot_inside:` | -| ♦ | `:diamonds:` | -| 🇩‍🇬 | `:diego_garcia:` | -| 😞 | `:disappointed:` | -| 😥 | `:disappointed_relieved:` | -| 🥸 | `:disguised_face:` | -| 🤿 | `:diving_mask:` | -| 🪔 | `:diya_lamp:` | -| 💫 | `:dizzy:` | -| 😵 | `:dizzy_face:` | -| 🇩‍🇯 | `:djibouti:` | -| 🧬 | `:dna:` | -| 🚯 | `:do_not_litter:` | -| 🦤 | `:dodo:` | -| 🐶 | `:dog:` | -| 🐕 | `:dog2:` | -| 💵 | `:dollar:` | -| 🎎 | `:dolls:` | -| 🐬 | `:dolphin:` | -| 🇩‍🇲 | `:dominica:` | -| 🇩‍🇴 | `:dominican_republic:` | -| 🫏 | `:donkey:` | -| 🚪 | `:door:` | -| 🫥 | `:dotted_line_face:` | -| 🍩 | `:doughnut:` | -| 🕊 | `:dove:` | -| 🐉 | `:dragon:` | -| 🐲 | `:dragon_face:` | -| 👗 | `:dress:` | -| 🐪 | `:dromedary_camel:` | -| 🤤 | `:drooling_face:` | -| 🩸 | `:drop_of_blood:` | -| 💧 | `:droplet:` | -| 🥁 | `:drum:` | -| 🦆 | `:duck:` | -| 🥟 | `:dumpling:` | -| 📀 | `:dvd:` | -| 📧 | `:e-mail:` | -| 🦅 | `:eagle:` | -| 👂 | `:ear:` | -| 🌾 | `:ear_of_rice:` | -| 🦻 | `:ear_with_hearing_aid:` | -| 🌍 | `:earth_africa:` | -| 🌎 | `:earth_americas:` | -| 🌏 | `:earth_asia:` | -| 🇪‍🇨 | `:ecuador:` | -| 🥚 | `:egg:` | -| 🍆 | `:eggplant:` | -| 🇪‍🇬 | `:egypt:` | -| 8‍⃣ | `:eight:` | -| ✴ | `:eight_pointed_black_star:` | -| ✳ | `:eight_spoked_asterisk:` | -| ⏏ | `:eject_button:` | -| 🇸‍🇻 | `:el_salvador:` | -| 🔌 | `:electric_plug:` | -| 🐘 | `:elephant:` | -| 🛗 | `:elevator:` | -| 🧝 | `:elf:` | -| 🧝‍♂ | `:elf_man:` | -| 🧝‍♀ | `:elf_woman:` | -| 📧 | `:email:` | -| 🪹 | `:empty_nest:` | -| 🔚 | `:end:` | -| 🏴‍󠁧‍󠁢‍󠁥‍󠁮‍󠁧‍󠁿 | `:england:` | -| ✉ | `:envelope:` | -| 📩 | `:envelope_with_arrow:` | -| 🇬‍🇶 | `:equatorial_guinea:` | -| 🇪‍🇷 | `:eritrea:` | -| 🇪‍🇸 | `:es:` | -| 🇪‍🇪 | `:estonia:` | -| 🇪‍🇹 | `:ethiopia:` | -| 🇪‍🇺 | `:eu:` | -| 💶 | `:euro:` | -| 🏰 | `:european_castle:` | -| 🏤 | `:european_post_office:` | -| 🇪‍🇺 | `:european_union:` | -| 🌲 | `:evergreen_tree:` | -| ❗ | `:exclamation:` | -| 🤯 | `:exploding_head:` | -| 😑 | `:expressionless:` | -| 👁 | `:eye:` | -| 👁‍🗨 | `:eye_speech_bubble:` | -| 👓 | `:eyeglasses:` | -| 👀 | `:eyes:` | -| 😮‍💨 | `:face_exhaling:` | -| 🥹 | `:face_holding_back_tears:` | -| 😶‍🌫 | `:face_in_clouds:` | -| 🫤 | `:face_with_diagonal_mouth:` | -| 🤕 | `:face_with_head_bandage:` | -| 🫢 | `:face_with_open_eyes_and_hand_over_mouth:` | -| 🫣 | `:face_with_peeking_eye:` | -| 😵‍💫 | `:face_with_spiral_eyes:` | -| 🤒 | `:face_with_thermometer:` | -| 🤦 | `:facepalm:` | -| 👊 | `:facepunch:` | -| 🏭 | `:factory:` | -| 🧑‍🏭 | `:factory_worker:` | -| 🧚 | `:fairy:` | -| 🧚‍♂ | `:fairy_man:` | -| 🧚‍♀ | `:fairy_woman:` | -| 🧆 | `:falafel:` | -| 🇫‍🇰 | `:falkland_islands:` | -| 🍂 | `:fallen_leaf:` | -| 👪 | `:family:` | -| 👨‍👦 | `:family_man_boy:` | -| 👨‍👦‍👦 | `:family_man_boy_boy:` | -| 👨‍👧 | `:family_man_girl:` | -| 👨‍👧‍👦 | `:family_man_girl_boy:` | -| 👨‍👧‍👧 | `:family_man_girl_girl:` | -| 👨‍👨‍👦 | `:family_man_man_boy:` | -| 👨‍👨‍👦‍👦 | `:family_man_man_boy_boy:` | -| 👨‍👨‍👧 | `:family_man_man_girl:` | -| 👨‍👨‍👧‍👦 | `:family_man_man_girl_boy:` | -| 👨‍👨‍👧‍👧 | `:family_man_man_girl_girl:` | -| 👨‍👩‍👦 | `:family_man_woman_boy:` | -| 👨‍👩‍👦‍👦 | `:family_man_woman_boy_boy:` | -| 👨‍👩‍👧 | `:family_man_woman_girl:` | -| 👨‍👩‍👧‍👦 | `:family_man_woman_girl_boy:` | -| 👨‍👩‍👧‍👧 | `:family_man_woman_girl_girl:` | -| 👩‍👦 | `:family_woman_boy:` | -| 👩‍👦‍👦 | `:family_woman_boy_boy:` | -| 👩‍👧 | `:family_woman_girl:` | -| 👩‍👧‍👦 | `:family_woman_girl_boy:` | -| 👩‍👧‍👧 | `:family_woman_girl_girl:` | -| 👩‍👩‍👦 | `:family_woman_woman_boy:` | -| 👩‍👩‍👦‍👦 | `:family_woman_woman_boy_boy:` | -| 👩‍👩‍👧 | `:family_woman_woman_girl:` | -| 👩‍👩‍👧‍👦 | `:family_woman_woman_girl_boy:` | -| 👩‍👩‍👧‍👧 | `:family_woman_woman_girl_girl:` | -| 🧑‍🌾 | `:farmer:` | -| 🇫‍🇴 | `:faroe_islands:` | -| ⏩ | `:fast_forward:` | -| 📠 | `:fax:` | -| 😨 | `:fearful:` | -| 🪶 | `:feather:` | -| 🐾 | `:feet:` | -| 🕵‍♀ | `:female_detective:` | -| ♀ | `:female_sign:` | -| 🎡 | `:ferris_wheel:` | -| ⛴ | `:ferry:` | -| 🏑 | `:field_hockey:` | -| 🇫‍🇯 | `:fiji:` | -| 🗄 | `:file_cabinet:` | -| 📁 | `:file_folder:` | -| 📽 | `:film_projector:` | -| 🎞 | `:film_strip:` | -| 🇫‍🇮 | `:finland:` | -| 🔥 | `:fire:` | -| 🚒 | `:fire_engine:` | -| 🧯 | `:fire_extinguisher:` | -| 🧨 | `:firecracker:` | -| 🧑‍🚒 | `:firefighter:` | -| 🎆 | `:fireworks:` | -| 🌓 | `:first_quarter_moon:` | -| 🌛 | `:first_quarter_moon_with_face:` | -| 🐟 | `:fish:` | -| 🍥 | `:fish_cake:` | -| 🎣 | `:fishing_pole_and_fish:` | -| ✊ | `:fist:` | -| 🤛 | `:fist_left:` | -| 👊 | `:fist_oncoming:` | -| ✊ | `:fist_raised:` | -| 🤜 | `:fist_right:` | -| 5‍⃣ | `:five:` | -| 🎏 | `:flags:` | -| 🦩 | `:flamingo:` | -| 🔦 | `:flashlight:` | -| 🥿 | `:flat_shoe:` | -| 🫓 | `:flatbread:` | -| ⚜ | `:fleur_de_lis:` | -| 🛬 | `:flight_arrival:` | -| 🛫 | `:flight_departure:` | -| 🐬 | `:flipper:` | -| 💾 | `:floppy_disk:` | -| 🎴 | `:flower_playing_cards:` | -| 😳 | `:flushed:` | -| 🪈 | `:flute:` | -| 🪰 | `:fly:` | -| 🥏 | `:flying_disc:` | -| 🛸 | `:flying_saucer:` | -| 🌫 | `:fog:` | -| 🌁 | `:foggy:` | -| 🪭 | `:folding_hand_fan:` | -| 🫕 | `:fondue:` | -| 🦶 | `:foot:` | -| 🏈 | `:football:` | -| 👣 | `:footprints:` | -| 🍴 | `:fork_and_knife:` | -| 🥠 | `:fortune_cookie:` | -| ⛲ | `:fountain:` | -| 🖋 | `:fountain_pen:` | -| 4‍⃣ | `:four:` | -| 🍀 | `:four_leaf_clover:` | -| 🦊 | `:fox_face:` | -| 🇫‍🇷 | `:fr:` | -| 🖼 | `:framed_picture:` | -| 🆓 | `:free:` | -| 🇬‍🇫 | `:french_guiana:` | -| 🇵‍🇫 | `:french_polynesia:` | -| 🇹‍🇫 | `:french_southern_territories:` | -| 🍳 | `:fried_egg:` | -| 🍤 | `:fried_shrimp:` | -| 🍟 | `:fries:` | -| 🐸 | `:frog:` | -| 😦 | `:frowning:` | -| ☹ | `:frowning_face:` | -| 🙍‍♂ | `:frowning_man:` | -| 🙍 | `:frowning_person:` | -| 🙍‍♀ | `:frowning_woman:` | -| 🖕 | `:fu:` | -| ⛽ | `:fuelpump:` | -| 🌕 | `:full_moon:` | -| 🌝 | `:full_moon_with_face:` | -| ⚱ | `:funeral_urn:` | -| 🇬‍🇦 | `:gabon:` | -| 🇬‍🇲 | `:gambia:` | -| 🎲 | `:game_die:` | -| 🧄 | `:garlic:` | -| 🇬‍🇧 | `:gb:` | -| ⚙ | `:gear:` | -| 💎 | `:gem:` | -| ♊ | `:gemini:` | -| 🧞 | `:genie:` | -| 🧞‍♂ | `:genie_man:` | -| 🧞‍♀ | `:genie_woman:` | -| 🇬‍🇪 | `:georgia:` | -| 🇬‍🇭 | `:ghana:` | -| 👻 | `:ghost:` | -| 🇬‍🇮 | `:gibraltar:` | -| 🎁 | `:gift:` | -| 💝 | `:gift_heart:` | -| 🫚 | `:ginger_root:` | -| 🦒 | `:giraffe:` | -| 👧 | `:girl:` | -| 🌐 | `:globe_with_meridians:` | -| 🧤 | `:gloves:` | -| 🥅 | `:goal_net:` | -| 🐐 | `:goat:` | -| 🥽 | `:goggles:` | -| ⛳ | `:golf:` | -| 🏌 | `:golfing:` | -| 🏌‍♂ | `:golfing_man:` | -| 🏌‍♀ | `:golfing_woman:` | -| 🪿 | `:goose:` | -| 🦍 | `:gorilla:` | -| 🍇 | `:grapes:` | -| 🇬‍🇷 | `:greece:` | -| 🍏 | `:green_apple:` | -| 📗 | `:green_book:` | -| 🟢 | `:green_circle:` | -| 💚 | `:green_heart:` | -| 🥗 | `:green_salad:` | -| 🟩 | `:green_square:` | -| 🇬‍🇱 | `:greenland:` | -| 🇬‍🇩 | `:grenada:` | -| ❕ | `:grey_exclamation:` | -| 🩶 | `:grey_heart:` | -| ❔ | `:grey_question:` | -| 😬 | `:grimacing:` | -| 😁 | `:grin:` | -| 😀 | `:grinning:` | -| 🇬‍🇵 | `:guadeloupe:` | -| 🇬‍🇺 | `:guam:` | -| 💂 | `:guard:` | -| 💂‍♂ | `:guardsman:` | -| 💂‍♀ | `:guardswoman:` | -| 🇬‍🇹 | `:guatemala:` | -| 🇬‍🇬 | `:guernsey:` | -| 🦮 | `:guide_dog:` | -| 🇬‍🇳 | `:guinea:` | -| 🇬‍🇼 | `:guinea_bissau:` | -| 🎸 | `:guitar:` | -| 🔫 | `:gun:` | -| 🇬‍🇾 | `:guyana:` | -| 🪮 | `:hair_pick:` | -| 💇 | `:haircut:` | -| 💇‍♂ | `:haircut_man:` | -| 💇‍♀ | `:haircut_woman:` | -| 🇭‍🇹 | `:haiti:` | -| 🍔 | `:hamburger:` | -| 🔨 | `:hammer:` | -| ⚒ | `:hammer_and_pick:` | -| 🛠 | `:hammer_and_wrench:` | -| 🪬 | `:hamsa:` | -| 🐹 | `:hamster:` | -| ✋ | `:hand:` | -| 🤭 | `:hand_over_mouth:` | -| 🫰 | `:hand_with_index_finger_and_thumb_crossed:` | -| 👜 | `:handbag:` | -| 🤾 | `:handball_person:` | -| 🤝 | `:handshake:` | -| 💩 | `:hankey:` | -| #‍⃣ | `:hash:` | -| 🐥 | `:hatched_chick:` | -| 🐣 | `:hatching_chick:` | -| 🎧 | `:headphones:` | -| 🪦 | `:headstone:` | -| 🧑‍⚕ | `:health_worker:` | -| 🙉 | `:hear_no_evil:` | -| 🇭‍🇲 | `:heard_mcdonald_islands:` | -| ❤ | `:heart:` | -| 💟 | `:heart_decoration:` | -| 😍 | `:heart_eyes:` | -| 😻 | `:heart_eyes_cat:` | -| 🫶 | `:heart_hands:` | -| ❤‍🔥 | `:heart_on_fire:` | -| 💓 | `:heartbeat:` | -| 💗 | `:heartpulse:` | -| ♥ | `:hearts:` | -| ✔ | `:heavy_check_mark:` | -| ➗ | `:heavy_division_sign:` | -| 💲 | `:heavy_dollar_sign:` | -| 🟰 | `:heavy_equals_sign:` | -| ❗ | `:heavy_exclamation_mark:` | -| ❣ | `:heavy_heart_exclamation:` | -| ➖ | `:heavy_minus_sign:` | -| ✖ | `:heavy_multiplication_x:` | -| ➕ | `:heavy_plus_sign:` | -| 🦔 | `:hedgehog:` | -| 🚁 | `:helicopter:` | -| 🌿 | `:herb:` | -| 🌺 | `:hibiscus:` | -| 🔆 | `:high_brightness:` | -| 👠 | `:high_heel:` | -| 🥾 | `:hiking_boot:` | -| 🛕 | `:hindu_temple:` | -| 🦛 | `:hippopotamus:` | -| 🔪 | `:hocho:` | -| 🕳 | `:hole:` | -| 🇭‍🇳 | `:honduras:` | -| 🍯 | `:honey_pot:` | -| 🐝 | `:honeybee:` | -| 🇭‍🇰 | `:hong_kong:` | -| 🪝 | `:hook:` | -| 🐴 | `:horse:` | -| 🏇 | `:horse_racing:` | -| 🏥 | `:hospital:` | -| 🥵 | `:hot_face:` | -| 🌶 | `:hot_pepper:` | -| 🌭 | `:hotdog:` | -| 🏨 | `:hotel:` | -| ♨ | `:hotsprings:` | -| ⌛ | `:hourglass:` | -| ⏳ | `:hourglass_flowing_sand:` | -| 🏠 | `:house:` | -| 🏡 | `:house_with_garden:` | -| 🏘 | `:houses:` | -| 🤗 | `:hugs:` | -| 🇭‍🇺 | `:hungary:` | -| 😯 | `:hushed:` | -| 🛖 | `:hut:` | -| 🪻 | `:hyacinth:` | -| 🍨 | `:ice_cream:` | -| 🧊 | `:ice_cube:` | -| 🏒 | `:ice_hockey:` | -| ⛸ | `:ice_skate:` | -| 🍦 | `:icecream:` | -| 🇮‍🇸 | `:iceland:` | -| 🆔 | `:id:` | -| 🪪 | `:identification_card:` | -| 🉐 | `:ideograph_advantage:` | -| 👿 | `:imp:` | -| 📥 | `:inbox_tray:` | -| 📨 | `:incoming_envelope:` | -| 🫵 | `:index_pointing_at_the_viewer:` | -| 🇮‍🇳 | `:india:` | -| 🇮‍🇩 | `:indonesia:` | -| ♾ | `:infinity:` | -| 💁 | `:information_desk_person:` | -| ℹ | `:information_source:` | -| 😇 | `:innocent:` | -| ⁉ | `:interrobang:` | -| 📱 | `:iphone:` | -| 🇮‍🇷 | `:iran:` | -| 🇮‍🇶 | `:iraq:` | -| 🇮‍🇪 | `:ireland:` | -| 🇮‍🇲 | `:isle_of_man:` | -| 🇮‍🇱 | `:israel:` | -| 🇮‍🇹 | `:it:` | -| 🏮 | `:izakaya_lantern:` | -| 🎃 | `:jack_o_lantern:` | -| 🇯‍🇲 | `:jamaica:` | -| 🗾 | `:japan:` | -| 🏯 | `:japanese_castle:` | -| 👺 | `:japanese_goblin:` | -| 👹 | `:japanese_ogre:` | -| 🫙 | `:jar:` | -| 👖 | `:jeans:` | -| 🪼 | `:jellyfish:` | -| 🇯‍🇪 | `:jersey:` | -| 🧩 | `:jigsaw:` | -| 🇯‍🇴 | `:jordan:` | -| 😂 | `:joy:` | -| 😹 | `:joy_cat:` | -| 🕹 | `:joystick:` | -| 🇯‍🇵 | `:jp:` | -| 🧑‍⚖ | `:judge:` | -| 🤹 | `:juggling_person:` | -| 🕋 | `:kaaba:` | -| 🦘 | `:kangaroo:` | -| 🇰‍🇿 | `:kazakhstan:` | -| 🇰‍🇪 | `:kenya:` | -| 🔑 | `:key:` | -| ⌨ | `:keyboard:` | -| 🔟 | `:keycap_ten:` | -| 🪯 | `:khanda:` | -| 🛴 | `:kick_scooter:` | -| 👘 | `:kimono:` | -| 🇰‍🇮 | `:kiribati:` | -| 💋 | `:kiss:` | -| 😗 | `:kissing:` | -| 😽 | `:kissing_cat:` | -| 😚 | `:kissing_closed_eyes:` | -| 😘 | `:kissing_heart:` | -| 😙 | `:kissing_smiling_eyes:` | -| 🪁 | `:kite:` | -| 🥝 | `:kiwi_fruit:` | -| 🧎‍♂ | `:kneeling_man:` | -| 🧎 | `:kneeling_person:` | -| 🧎‍♀ | `:kneeling_woman:` | -| 🔪 | `:knife:` | -| 🪢 | `:knot:` | -| 🐨 | `:koala:` | -| 🈁 | `:koko:` | -| 🇽‍🇰 | `:kosovo:` | -| 🇰‍🇷 | `:kr:` | -| 🇰‍🇼 | `:kuwait:` | -| 🇰‍🇬 | `:kyrgyzstan:` | -| 🥼 | `:lab_coat:` | -| 🏷 | `:label:` | -| 🥍 | `:lacrosse:` | -| 🪜 | `:ladder:` | -| 🐞 | `:lady_beetle:` | -| 🏮 | `:lantern:` | -| 🇱‍🇦 | `:laos:` | -| 🔵 | `:large_blue_circle:` | -| 🔷 | `:large_blue_diamond:` | -| 🔶 | `:large_orange_diamond:` | -| 🌗 | `:last_quarter_moon:` | -| 🌜 | `:last_quarter_moon_with_face:` | -| ✝ | `:latin_cross:` | -| 🇱‍🇻 | `:latvia:` | -| 😆 | `:laughing:` | -| 🥬 | `:leafy_green:` | -| 🍃 | `:leaves:` | -| 🇱‍🇧 | `:lebanon:` | -| 📒 | `:ledger:` | -| 🛅 | `:left_luggage:` | -| ↔ | `:left_right_arrow:` | -| 🗨 | `:left_speech_bubble:` | -| ↩ | `:leftwards_arrow_with_hook:` | -| 🫲 | `:leftwards_hand:` | -| 🫷 | `:leftwards_pushing_hand:` | -| 🦵 | `:leg:` | -| 🍋 | `:lemon:` | -| ♌ | `:leo:` | -| 🐆 | `:leopard:` | -| 🇱‍🇸 | `:lesotho:` | -| 🎚 | `:level_slider:` | -| 🇱‍🇷 | `:liberia:` | -| ♎ | `:libra:` | -| 🇱‍🇾 | `:libya:` | -| 🇱‍🇮 | `:liechtenstein:` | -| 🩵 | `:light_blue_heart:` | -| 🚈 | `:light_rail:` | -| 🔗 | `:link:` | -| 🦁 | `:lion:` | -| 👄 | `:lips:` | -| 💄 | `:lipstick:` | -| 🇱‍🇹 | `:lithuania:` | -| 🦎 | `:lizard:` | -| 🦙 | `:llama:` | -| 🦞 | `:lobster:` | -| 🔒 | `:lock:` | -| 🔏 | `:lock_with_ink_pen:` | -| 🍭 | `:lollipop:` | -| 🪘 | `:long_drum:` | -| ➿ | `:loop:` | -| 🧴 | `:lotion_bottle:` | -| 🪷 | `:lotus:` | -| 🧘 | `:lotus_position:` | -| 🧘‍♂ | `:lotus_position_man:` | -| 🧘‍♀ | `:lotus_position_woman:` | -| 🔊 | `:loud_sound:` | -| 📢 | `:loudspeaker:` | -| 🏩 | `:love_hotel:` | -| 💌 | `:love_letter:` | -| 🤟 | `:love_you_gesture:` | -| 🪫 | `:low_battery:` | -| 🔅 | `:low_brightness:` | -| 🧳 | `:luggage:` | -| 🫁 | `:lungs:` | -| 🇱‍🇺 | `:luxembourg:` | -| 🤥 | `:lying_face:` | -| Ⓜ | `:m:` | -| 🇲‍🇴 | `:macau:` | -| 🇲‍🇰 | `:macedonia:` | -| 🇲‍🇬 | `:madagascar:` | -| 🔍 | `:mag:` | -| 🔎 | `:mag_right:` | -| 🧙 | `:mage:` | -| 🧙‍♂ | `:mage_man:` | -| 🧙‍♀ | `:mage_woman:` | -| 🪄 | `:magic_wand:` | -| 🧲 | `:magnet:` | -| 🀄 | `:mahjong:` | -| 📫 | `:mailbox:` | -| 📪 | `:mailbox_closed:` | -| 📬 | `:mailbox_with_mail:` | -| 📭 | `:mailbox_with_no_mail:` | -| 🇲‍🇼 | `:malawi:` | -| 🇲‍🇾 | `:malaysia:` | -| 🇲‍🇻 | `:maldives:` | -| 🕵‍♂ | `:male_detective:` | -| ♂ | `:male_sign:` | -| 🇲‍🇱 | `:mali:` | -| 🇲‍🇹 | `:malta:` | -| 🦣 | `:mammoth:` | -| 👨 | `:man:` | -| 👨‍🎨 | `:man_artist:` | -| 👨‍🚀 | `:man_astronaut:` | -| 🧔‍♂ | `:man_beard:` | -| 🤸‍♂ | `:man_cartwheeling:` | -| 👨‍🍳 | `:man_cook:` | -| 🕺 | `:man_dancing:` | -| 🤦‍♂ | `:man_facepalming:` | -| 👨‍🏭 | `:man_factory_worker:` | -| 👨‍🌾 | `:man_farmer:` | -| 👨‍🍼 | `:man_feeding_baby:` | -| 👨‍🚒 | `:man_firefighter:` | -| 👨‍⚕ | `:man_health_worker:` | -| 👨‍🦽 | `:man_in_manual_wheelchair:` | -| 👨‍🦼 | `:man_in_motorized_wheelchair:` | -| 🤵‍♂ | `:man_in_tuxedo:` | -| 👨‍⚖ | `:man_judge:` | -| 🤹‍♂ | `:man_juggling:` | -| 👨‍🔧 | `:man_mechanic:` | -| 👨‍💼 | `:man_office_worker:` | -| 👨‍✈ | `:man_pilot:` | -| 🤾‍♂ | `:man_playing_handball:` | -| 🤽‍♂ | `:man_playing_water_polo:` | -| 👨‍🔬 | `:man_scientist:` | -| 🤷‍♂ | `:man_shrugging:` | -| 👨‍🎤 | `:man_singer:` | -| 👨‍🎓 | `:man_student:` | -| 👨‍🏫 | `:man_teacher:` | -| 👨‍💻 | `:man_technologist:` | -| 👲 | `:man_with_gua_pi_mao:` | -| 👨‍🦯 | `:man_with_probing_cane:` | -| 👳‍♂ | `:man_with_turban:` | -| 👰‍♂ | `:man_with_veil:` | -| 🍊 | `:mandarin:` | -| 🥭 | `:mango:` | -| 👞 | `:mans_shoe:` | -| 🕰 | `:mantelpiece_clock:` | -| 🦽 | `:manual_wheelchair:` | -| 🍁 | `:maple_leaf:` | -| 🪇 | `:maracas:` | -| 🇲‍🇭 | `:marshall_islands:` | -| 🥋 | `:martial_arts_uniform:` | -| 🇲‍🇶 | `:martinique:` | -| 😷 | `:mask:` | -| 💆 | `:massage:` | -| 💆‍♂ | `:massage_man:` | -| 💆‍♀ | `:massage_woman:` | -| 🧉 | `:mate:` | -| 🇲‍🇷 | `:mauritania:` | -| 🇲‍🇺 | `:mauritius:` | -| 🇾‍🇹 | `:mayotte:` | -| 🍖 | `:meat_on_bone:` | -| 🧑‍🔧 | `:mechanic:` | -| 🦾 | `:mechanical_arm:` | -| 🦿 | `:mechanical_leg:` | -| 🎖 | `:medal_military:` | -| 🏅 | `:medal_sports:` | -| ⚕ | `:medical_symbol:` | -| 📣 | `:mega:` | -| 🍈 | `:melon:` | -| 🫠 | `:melting_face:` | -| 📝 | `:memo:` | -| 🤼‍♂ | `:men_wrestling:` | -| ❤‍🩹 | `:mending_heart:` | -| 🕎 | `:menorah:` | -| 🚹 | `:mens:` | -| 🧜‍♀ | `:mermaid:` | -| 🧜‍♂ | `:merman:` | -| 🧜 | `:merperson:` | -| 🤘 | `:metal:` | -| 🚇 | `:metro:` | -| 🇲‍🇽 | `:mexico:` | -| 🦠 | `:microbe:` | -| 🇫‍🇲 | `:micronesia:` | -| 🎤 | `:microphone:` | -| 🔬 | `:microscope:` | -| 🖕 | `:middle_finger:` | -| 🪖 | `:military_helmet:` | -| 🥛 | `:milk_glass:` | -| 🌌 | `:milky_way:` | -| 🚐 | `:minibus:` | -| 💽 | `:minidisc:` | -| 🪞 | `:mirror:` | -| 🪩 | `:mirror_ball:` | -| 📴 | `:mobile_phone_off:` | -| 🇲‍🇩 | `:moldova:` | -| 🇲‍🇨 | `:monaco:` | -| 🤑 | `:money_mouth_face:` | -| 💸 | `:money_with_wings:` | -| 💰 | `:moneybag:` | -| 🇲‍🇳 | `:mongolia:` | -| 🐒 | `:monkey:` | -| 🐵 | `:monkey_face:` | -| 🧐 | `:monocle_face:` | -| 🚝 | `:monorail:` | -| 🇲‍🇪 | `:montenegro:` | -| 🇲‍🇸 | `:montserrat:` | -| 🌔 | `:moon:` | -| 🥮 | `:moon_cake:` | -| 🫎 | `:moose:` | -| 🇲‍🇦 | `:morocco:` | -| 🎓 | `:mortar_board:` | -| 🕌 | `:mosque:` | -| 🦟 | `:mosquito:` | -| 🛥 | `:motor_boat:` | -| 🛵 | `:motor_scooter:` | -| 🏍 | `:motorcycle:` | -| 🦼 | `:motorized_wheelchair:` | -| 🛣 | `:motorway:` | -| 🗻 | `:mount_fuji:` | -| ⛰ | `:mountain:` | -| 🚵 | `:mountain_bicyclist:` | -| 🚵‍♂ | `:mountain_biking_man:` | -| 🚵‍♀ | `:mountain_biking_woman:` | -| 🚠 | `:mountain_cableway:` | -| 🚞 | `:mountain_railway:` | -| 🏔 | `:mountain_snow:` | -| 🐭 | `:mouse:` | -| 🪤 | `:mouse_trap:` | -| 🐁 | `:mouse2:` | -| 🎥 | `:movie_camera:` | -| 🗿 | `:moyai:` | -| 🇲‍🇿 | `:mozambique:` | -| 🤶 | `:mrs_claus:` | -| 💪 | `:muscle:` | -| 🍄 | `:mushroom:` | -| 🎹 | `:musical_keyboard:` | -| 🎵 | `:musical_note:` | -| 🎼 | `:musical_score:` | -| 🔇 | `:mute:` | -| 🧑‍🎄 | `:mx_claus:` | -| 🇲‍🇲 | `:myanmar:` | -| 💅 | `:nail_care:` | -| 📛 | `:name_badge:` | -| 🇳‍🇦 | `:namibia:` | -| 🏞 | `:national_park:` | -| 🇳‍🇷 | `:nauru:` | -| 🤢 | `:nauseated_face:` | -| 🧿 | `:nazar_amulet:` | -| 👔 | `:necktie:` | -| ❎ | `:negative_squared_cross_mark:` | -| 🇳‍🇵 | `:nepal:` | -| 🤓 | `:nerd_face:` | -| 🪺 | `:nest_with_eggs:` | -| 🪆 | `:nesting_dolls:` | -| 🇳‍🇱 | `:netherlands:` | -| 😐 | `:neutral_face:` | -| 🆕 | `:new:` | -| 🇳‍🇨 | `:new_caledonia:` | -| 🌑 | `:new_moon:` | -| 🌚 | `:new_moon_with_face:` | -| 🇳‍🇿 | `:new_zealand:` | -| 📰 | `:newspaper:` | -| 🗞 | `:newspaper_roll:` | -| ⏭ | `:next_track_button:` | -| 🆖 | `:ng:` | -| 🙅‍♂ | `:ng_man:` | -| 🙅‍♀ | `:ng_woman:` | -| 🇳‍🇮 | `:nicaragua:` | -| 🇳‍🇪 | `:niger:` | -| 🇳‍🇬 | `:nigeria:` | -| 🌃 | `:night_with_stars:` | -| 9‍⃣ | `:nine:` | -| 🥷 | `:ninja:` | -| 🇳‍🇺 | `:niue:` | -| 🔕 | `:no_bell:` | -| 🚳 | `:no_bicycles:` | -| ⛔ | `:no_entry:` | -| 🚫 | `:no_entry_sign:` | -| 🙅 | `:no_good:` | -| 🙅‍♂ | `:no_good_man:` | -| 🙅‍♀ | `:no_good_woman:` | -| 📵 | `:no_mobile_phones:` | -| 😶 | `:no_mouth:` | -| 🚷 | `:no_pedestrians:` | -| 🚭 | `:no_smoking:` | -| 🚱 | `:non-potable_water:` | -| 🇳‍🇫 | `:norfolk_island:` | -| 🇰‍🇵 | `:north_korea:` | -| 🇲‍🇵 | `:northern_mariana_islands:` | -| 🇳‍🇴 | `:norway:` | -| 👃 | `:nose:` | -| 📓 | `:notebook:` | -| 📔 | `:notebook_with_decorative_cover:` | -| 🎶 | `:notes:` | -| 🔩 | `:nut_and_bolt:` | -| ⭕ | `:o:` | -| 🅾 | `:o2:` | -| 🌊 | `:ocean:` | -| 🐙 | `:octopus:` | -| 🍢 | `:oden:` | -| 🏢 | `:office:` | -| 🧑‍💼 | `:office_worker:` | -| 🛢 | `:oil_drum:` | -| 🆗 | `:ok:` | -| 👌 | `:ok_hand:` | -| 🙆‍♂ | `:ok_man:` | -| 🙆 | `:ok_person:` | -| 🙆‍♀ | `:ok_woman:` | -| 🗝 | `:old_key:` | -| 🧓 | `:older_adult:` | -| 👴 | `:older_man:` | -| 👵 | `:older_woman:` | -| 🫒 | `:olive:` | -| 🕉 | `:om:` | -| 🇴‍🇲 | `:oman:` | -| 🔛 | `:on:` | -| 🚘 | `:oncoming_automobile:` | -| 🚍 | `:oncoming_bus:` | -| 🚔 | `:oncoming_police_car:` | -| 🚖 | `:oncoming_taxi:` | -| 1‍⃣ | `:one:` | -| 🩱 | `:one_piece_swimsuit:` | -| 🧅 | `:onion:` | -| 📖 | `:open_book:` | -| 📂 | `:open_file_folder:` | -| 👐 | `:open_hands:` | -| 😮 | `:open_mouth:` | -| ☂ | `:open_umbrella:` | -| ⛎ | `:ophiuchus:` | -| 🍊 | `:orange:` | -| 📙 | `:orange_book:` | -| 🟠 | `:orange_circle:` | -| 🧡 | `:orange_heart:` | -| 🟧 | `:orange_square:` | -| 🦧 | `:orangutan:` | -| ☦ | `:orthodox_cross:` | -| 🦦 | `:otter:` | -| 📤 | `:outbox_tray:` | -| 🦉 | `:owl:` | -| 🐂 | `:ox:` | -| 🦪 | `:oyster:` | -| 📦 | `:package:` | -| 📄 | `:page_facing_up:` | -| 📃 | `:page_with_curl:` | -| 📟 | `:pager:` | -| 🖌 | `:paintbrush:` | -| 🇵‍🇰 | `:pakistan:` | -| 🇵‍🇼 | `:palau:` | -| 🇵‍🇸 | `:palestinian_territories:` | -| 🫳 | `:palm_down_hand:` | -| 🌴 | `:palm_tree:` | -| 🫴 | `:palm_up_hand:` | -| 🤲 | `:palms_up_together:` | -| 🇵‍🇦 | `:panama:` | -| 🥞 | `:pancakes:` | -| 🐼 | `:panda_face:` | -| 📎 | `:paperclip:` | -| 🖇 | `:paperclips:` | -| 🇵‍🇬 | `:papua_new_guinea:` | -| 🪂 | `:parachute:` | -| 🇵‍🇾 | `:paraguay:` | -| ⛱ | `:parasol_on_ground:` | -| 🅿 | `:parking:` | -| 🦜 | `:parrot:` | -| 〽 | `:part_alternation_mark:` | -| ⛅ | `:partly_sunny:` | -| 🥳 | `:partying_face:` | -| 🛳 | `:passenger_ship:` | -| 🛂 | `:passport_control:` | -| ⏸ | `:pause_button:` | -| 🐾 | `:paw_prints:` | -| 🫛 | `:pea_pod:` | -| ☮ | `:peace_symbol:` | -| 🍑 | `:peach:` | -| 🦚 | `:peacock:` | -| 🥜 | `:peanuts:` | -| 🍐 | `:pear:` | -| 🖊 | `:pen:` | -| 📝 | `:pencil:` | -| ✏ | `:pencil2:` | -| 🐧 | `:penguin:` | -| 😔 | `:pensive:` | -| 🧑‍🤝‍🧑 | `:people_holding_hands:` | -| 🫂 | `:people_hugging:` | -| 🎭 | `:performing_arts:` | -| 😣 | `:persevere:` | -| 🧑‍🦲 | `:person_bald:` | -| 🧑‍🦱 | `:person_curly_hair:` | -| 🧑‍🍼 | `:person_feeding_baby:` | -| 🤺 | `:person_fencing:` | -| 🧑‍🦽 | `:person_in_manual_wheelchair:` | -| 🧑‍🦼 | `:person_in_motorized_wheelchair:` | -| 🤵 | `:person_in_tuxedo:` | -| 🧑‍🦰 | `:person_red_hair:` | -| 🧑‍🦳 | `:person_white_hair:` | -| 🫅 | `:person_with_crown:` | -| 🧑‍🦯 | `:person_with_probing_cane:` | -| 👳 | `:person_with_turban:` | -| 👰 | `:person_with_veil:` | -| 🇵‍🇪 | `:peru:` | -| 🧫 | `:petri_dish:` | -| 🇵‍🇭 | `:philippines:` | -| ☎ | `:phone:` | -| ⛏ | `:pick:` | -| 🛻 | `:pickup_truck:` | -| 🥧 | `:pie:` | -| 🐷 | `:pig:` | -| 🐽 | `:pig_nose:` | -| 🐖 | `:pig2:` | -| 💊 | `:pill:` | -| 🧑‍✈ | `:pilot:` | -| 🪅 | `:pinata:` | -| 🤌 | `:pinched_fingers:` | -| 🤏 | `:pinching_hand:` | -| 🍍 | `:pineapple:` | -| 🏓 | `:ping_pong:` | -| 🩷 | `:pink_heart:` | -| 🏴‍☠ | `:pirate_flag:` | -| ♓ | `:pisces:` | -| 🇵‍🇳 | `:pitcairn_islands:` | -| 🍕 | `:pizza:` | -| 🪧 | `:placard:` | -| 🛐 | `:place_of_worship:` | -| 🍽 | `:plate_with_cutlery:` | -| ⏯ | `:play_or_pause_button:` | -| 🛝 | `:playground_slide:` | -| 🥺 | `:pleading_face:` | -| 🪠 | `:plunger:` | -| 👇 | `:point_down:` | -| 👈 | `:point_left:` | -| 👉 | `:point_right:` | -| ☝ | `:point_up:` | -| 👆 | `:point_up_2:` | -| 🇵‍🇱 | `:poland:` | -| 🐻‍❄ | `:polar_bear:` | -| 🚓 | `:police_car:` | -| 👮 | `:police_officer:` | -| 👮‍♂ | `:policeman:` | -| 👮‍♀ | `:policewoman:` | -| 🐩 | `:poodle:` | -| 💩 | `:poop:` | -| 🍿 | `:popcorn:` | -| 🇵‍🇹 | `:portugal:` | -| 🏣 | `:post_office:` | -| 📯 | `:postal_horn:` | -| 📮 | `:postbox:` | -| 🚰 | `:potable_water:` | -| 🥔 | `:potato:` | -| 🪴 | `:potted_plant:` | -| 👝 | `:pouch:` | -| 🍗 | `:poultry_leg:` | -| 💷 | `:pound:` | -| 🫗 | `:pouring_liquid:` | -| 😡 | `:pout:` | -| 😾 | `:pouting_cat:` | -| 🙎 | `:pouting_face:` | -| 🙎‍♂ | `:pouting_man:` | -| 🙎‍♀ | `:pouting_woman:` | -| 🙏 | `:pray:` | -| 📿 | `:prayer_beads:` | -| 🫃 | `:pregnant_man:` | -| 🫄 | `:pregnant_person:` | -| 🤰 | `:pregnant_woman:` | -| 🥨 | `:pretzel:` | -| ⏮ | `:previous_track_button:` | -| 🤴 | `:prince:` | -| 👸 | `:princess:` | -| 🖨 | `:printer:` | -| 🦯 | `:probing_cane:` | -| 🇵‍🇷 | `:puerto_rico:` | -| 👊 | `:punch:` | -| 🟣 | `:purple_circle:` | -| 💜 | `:purple_heart:` | -| 🟪 | `:purple_square:` | -| 👛 | `:purse:` | -| 📌 | `:pushpin:` | -| 🚮 | `:put_litter_in_its_place:` | -| 🇶‍🇦 | `:qatar:` | -| ❓ | `:question:` | -| 🐰 | `:rabbit:` | -| 🐇 | `:rabbit2:` | -| 🦝 | `:raccoon:` | -| 🐎 | `:racehorse:` | -| 🏎 | `:racing_car:` | -| 📻 | `:radio:` | -| 🔘 | `:radio_button:` | -| ☢ | `:radioactive:` | -| 😡 | `:rage:` | -| 🚃 | `:railway_car:` | -| 🛤 | `:railway_track:` | -| 🌈 | `:rainbow:` | -| 🏳‍🌈 | `:rainbow_flag:` | -| 🤚 | `:raised_back_of_hand:` | -| 🤨 | `:raised_eyebrow:` | -| ✋ | `:raised_hand:` | -| 🖐 | `:raised_hand_with_fingers_splayed:` | -| 🙌 | `:raised_hands:` | -| 🙋 | `:raising_hand:` | -| 🙋‍♂ | `:raising_hand_man:` | -| 🙋‍♀ | `:raising_hand_woman:` | -| 🐏 | `:ram:` | -| 🍜 | `:ramen:` | -| 🐀 | `:rat:` | -| 🪒 | `:razor:` | -| 🧾 | `:receipt:` | -| ⏺ | `:record_button:` | -| ♻ | `:recycle:` | -| 🚗 | `:red_car:` | -| 🔴 | `:red_circle:` | -| 🧧 | `:red_envelope:` | -| 👨‍🦰 | `:red_haired_man:` | -| 👩‍🦰 | `:red_haired_woman:` | -| 🟥 | `:red_square:` | -| ® | `:registered:` | -| ☺ | `:relaxed:` | -| 😌 | `:relieved:` | -| 🎗 | `:reminder_ribbon:` | -| 🔁 | `:repeat:` | -| 🔂 | `:repeat_one:` | -| ⛑ | `:rescue_worker_helmet:` | -| 🚻 | `:restroom:` | -| 🇷‍🇪 | `:reunion:` | -| 💞 | `:revolving_hearts:` | -| ⏪ | `:rewind:` | -| 🦏 | `:rhinoceros:` | -| 🎀 | `:ribbon:` | -| 🍚 | `:rice:` | -| 🍙 | `:rice_ball:` | -| 🍘 | `:rice_cracker:` | -| 🎑 | `:rice_scene:` | -| 🗯 | `:right_anger_bubble:` | -| 🫱 | `:rightwards_hand:` | -| 🫸 | `:rightwards_pushing_hand:` | -| 💍 | `:ring:` | -| 🛟 | `:ring_buoy:` | -| 🪐 | `:ringed_planet:` | -| 🤖 | `:robot:` | -| 🪨 | `:rock:` | -| 🚀 | `:rocket:` | -| 🤣 | `:rofl:` | -| 🙄 | `:roll_eyes:` | -| 🧻 | `:roll_of_paper:` | -| 🎢 | `:roller_coaster:` | -| 🛼 | `:roller_skate:` | -| 🇷‍🇴 | `:romania:` | -| 🐓 | `:rooster:` | -| 🌹 | `:rose:` | -| 🏵 | `:rosette:` | -| 🚨 | `:rotating_light:` | -| 📍 | `:round_pushpin:` | -| 🚣 | `:rowboat:` | -| 🚣‍♂ | `:rowing_man:` | -| 🚣‍♀ | `:rowing_woman:` | -| 🇷‍🇺 | `:ru:` | -| 🏉 | `:rugby_football:` | -| 🏃 | `:runner:` | -| 🏃 | `:running:` | -| 🏃‍♂ | `:running_man:` | -| 🎽 | `:running_shirt_with_sash:` | -| 🏃‍♀ | `:running_woman:` | -| 🇷‍🇼 | `:rwanda:` | -| 🈂 | `:sa:` | -| 🧷 | `:safety_pin:` | -| 🦺 | `:safety_vest:` | -| ♐ | `:sagittarius:` | -| ⛵ | `:sailboat:` | -| 🍶 | `:sake:` | -| 🧂 | `:salt:` | -| 🫡 | `:saluting_face:` | -| 🇼‍🇸 | `:samoa:` | -| 🇸‍🇲 | `:san_marino:` | -| 👡 | `:sandal:` | -| 🥪 | `:sandwich:` | -| 🎅 | `:santa:` | -| 🇸‍🇹 | `:sao_tome_principe:` | -| 🥻 | `:sari:` | -| 💁‍♂ | `:sassy_man:` | -| 💁‍♀ | `:sassy_woman:` | -| 📡 | `:satellite:` | -| 😆 | `:satisfied:` | -| 🇸‍🇦 | `:saudi_arabia:` | -| 🧖‍♂ | `:sauna_man:` | -| 🧖 | `:sauna_person:` | -| 🧖‍♀ | `:sauna_woman:` | -| 🦕 | `:sauropod:` | -| 🎷 | `:saxophone:` | -| 🧣 | `:scarf:` | -| 🏫 | `:school:` | -| 🎒 | `:school_satchel:` | -| 🧑‍🔬 | `:scientist:` | -| ✂ | `:scissors:` | -| 🦂 | `:scorpion:` | -| ♏ | `:scorpius:` | -| 🏴‍󠁧‍󠁢‍󠁳‍󠁣‍󠁴‍󠁿 | `:scotland:` | -| 😱 | `:scream:` | -| 🙀 | `:scream_cat:` | -| 🪛 | `:screwdriver:` | -| 📜 | `:scroll:` | -| 🦭 | `:seal:` | -| 💺 | `:seat:` | -| ㊙ | `:secret:` | -| 🙈 | `:see_no_evil:` | -| 🌱 | `:seedling:` | -| 🤳 | `:selfie:` | -| 🇸‍🇳 | `:senegal:` | -| 🇷‍🇸 | `:serbia:` | -| 🐕‍🦺 | `:service_dog:` | -| 7‍⃣ | `:seven:` | -| 🪡 | `:sewing_needle:` | -| 🇸‍🇨 | `:seychelles:` | -| 🫨 | `:shaking_face:` | -| 🥘 | `:shallow_pan_of_food:` | -| ☘ | `:shamrock:` | -| 🦈 | `:shark:` | -| 🍧 | `:shaved_ice:` | -| 🐑 | `:sheep:` | -| 🐚 | `:shell:` | -| 🛡 | `:shield:` | -| ⛩ | `:shinto_shrine:` | -| 🚢 | `:ship:` | -| 👕 | `:shirt:` | -| 💩 | `:shit:` | -| 👞 | `:shoe:` | -| 🛍 | `:shopping:` | -| 🛒 | `:shopping_cart:` | -| 🩳 | `:shorts:` | -| 🚿 | `:shower:` | -| 🦐 | `:shrimp:` | -| 🤷 | `:shrug:` | -| 🤫 | `:shushing_face:` | -| 🇸‍🇱 | `:sierra_leone:` | -| 📶 | `:signal_strength:` | -| 🇸‍🇬 | `:singapore:` | -| 🧑‍🎤 | `:singer:` | -| 🇸‍🇽 | `:sint_maarten:` | -| 6‍⃣ | `:six:` | -| 🔯 | `:six_pointed_star:` | -| 🛹 | `:skateboard:` | -| 🎿 | `:ski:` | -| ⛷ | `:skier:` | -| 💀 | `:skull:` | -| ☠ | `:skull_and_crossbones:` | -| 🦨 | `:skunk:` | -| 🛷 | `:sled:` | -| 😴 | `:sleeping:` | -| 🛌 | `:sleeping_bed:` | -| 😪 | `:sleepy:` | -| 🙁 | `:slightly_frowning_face:` | -| 🙂 | `:slightly_smiling_face:` | -| 🎰 | `:slot_machine:` | -| 🦥 | `:sloth:` | -| 🇸‍🇰 | `:slovakia:` | -| 🇸‍🇮 | `:slovenia:` | -| 🛩 | `:small_airplane:` | -| 🔹 | `:small_blue_diamond:` | -| 🔸 | `:small_orange_diamond:` | -| 🔺 | `:small_red_triangle:` | -| 🔻 | `:small_red_triangle_down:` | -| 😄 | `:smile:` | -| 😸 | `:smile_cat:` | -| 😃 | `:smiley:` | -| 😺 | `:smiley_cat:` | -| 🥲 | `:smiling_face_with_tear:` | -| 🥰 | `:smiling_face_with_three_hearts:` | -| 😈 | `:smiling_imp:` | -| 😏 | `:smirk:` | -| 😼 | `:smirk_cat:` | -| 🚬 | `:smoking:` | -| 🐌 | `:snail:` | -| 🐍 | `:snake:` | -| 🤧 | `:sneezing_face:` | -| 🏂 | `:snowboarder:` | -| ❄ | `:snowflake:` | -| ⛄ | `:snowman:` | -| ☃ | `:snowman_with_snow:` | -| 🧼 | `:soap:` | -| 😭 | `:sob:` | -| ⚽ | `:soccer:` | -| 🧦 | `:socks:` | -| 🥎 | `:softball:` | -| 🇸‍🇧 | `:solomon_islands:` | -| 🇸‍🇴 | `:somalia:` | -| 🔜 | `:soon:` | -| 🆘 | `:sos:` | -| 🔉 | `:sound:` | -| 🇿‍🇦 | `:south_africa:` | -| 🇬‍🇸 | `:south_georgia_south_sandwich_islands:` | -| 🇸‍🇸 | `:south_sudan:` | -| 👾 | `:space_invader:` | -| ♠ | `:spades:` | -| 🍝 | `:spaghetti:` | -| ❇ | `:sparkle:` | -| 🎇 | `:sparkler:` | -| ✨ | `:sparkles:` | -| 💖 | `:sparkling_heart:` | -| 🙊 | `:speak_no_evil:` | -| 🔈 | `:speaker:` | -| 🗣 | `:speaking_head:` | -| 💬 | `:speech_balloon:` | -| 🚤 | `:speedboat:` | -| 🕷 | `:spider:` | -| 🕸 | `:spider_web:` | -| 🗓 | `:spiral_calendar:` | -| 🗒 | `:spiral_notepad:` | -| 🧽 | `:sponge:` | -| 🥄 | `:spoon:` | -| 🦑 | `:squid:` | -| 🇱‍🇰 | `:sri_lanka:` | -| 🇧‍🇱 | `:st_barthelemy:` | -| 🇸‍🇭 | `:st_helena:` | -| 🇰‍🇳 | `:st_kitts_nevis:` | -| 🇱‍🇨 | `:st_lucia:` | -| 🇲‍🇫 | `:st_martin:` | -| 🇵‍🇲 | `:st_pierre_miquelon:` | -| 🇻‍🇨 | `:st_vincent_grenadines:` | -| 🏟 | `:stadium:` | -| 🧍‍♂ | `:standing_man:` | -| 🧍 | `:standing_person:` | -| 🧍‍♀ | `:standing_woman:` | -| ⭐ | `:star:` | -| ☪ | `:star_and_crescent:` | -| ✡ | `:star_of_david:` | -| 🤩 | `:star_struck:` | -| 🌟 | `:star2:` | -| 🌠 | `:stars:` | -| 🚉 | `:station:` | -| 🗽 | `:statue_of_liberty:` | -| 🚂 | `:steam_locomotive:` | -| 🩺 | `:stethoscope:` | -| 🍲 | `:stew:` | -| ⏹ | `:stop_button:` | -| 🛑 | `:stop_sign:` | -| ⏱ | `:stopwatch:` | -| 📏 | `:straight_ruler:` | -| 🍓 | `:strawberry:` | -| 😛 | `:stuck_out_tongue:` | -| 😝 | `:stuck_out_tongue_closed_eyes:` | -| 😜 | `:stuck_out_tongue_winking_eye:` | -| 🧑‍🎓 | `:student:` | -| 🎙 | `:studio_microphone:` | -| 🥙 | `:stuffed_flatbread:` | -| 🇸‍🇩 | `:sudan:` | -| 🌥 | `:sun_behind_large_cloud:` | -| 🌦 | `:sun_behind_rain_cloud:` | -| 🌤 | `:sun_behind_small_cloud:` | -| 🌞 | `:sun_with_face:` | -| 🌻 | `:sunflower:` | -| 😎 | `:sunglasses:` | -| ☀ | `:sunny:` | -| 🌅 | `:sunrise:` | -| 🌄 | `:sunrise_over_mountains:` | -| 🦸 | `:superhero:` | -| 🦸‍♂ | `:superhero_man:` | -| 🦸‍♀ | `:superhero_woman:` | -| 🦹 | `:supervillain:` | -| 🦹‍♂ | `:supervillain_man:` | -| 🦹‍♀ | `:supervillain_woman:` | -| 🏄 | `:surfer:` | -| 🏄‍♂ | `:surfing_man:` | -| 🏄‍♀ | `:surfing_woman:` | -| 🇸‍🇷 | `:suriname:` | -| 🍣 | `:sushi:` | -| 🚟 | `:suspension_railway:` | -| 🇸‍🇯 | `:svalbard_jan_mayen:` | -| 🦢 | `:swan:` | -| 🇸‍🇿 | `:swaziland:` | -| 😓 | `:sweat:` | -| 💦 | `:sweat_drops:` | -| 😅 | `:sweat_smile:` | -| 🇸‍🇪 | `:sweden:` | -| 🍠 | `:sweet_potato:` | -| 🩲 | `:swim_brief:` | -| 🏊 | `:swimmer:` | -| 🏊‍♂ | `:swimming_man:` | -| 🏊‍♀ | `:swimming_woman:` | -| 🇨‍🇭 | `:switzerland:` | -| 🔣 | `:symbols:` | -| 🕍 | `:synagogue:` | -| 🇸‍🇾 | `:syria:` | -| 💉 | `:syringe:` | -| 🦖 | `:t-rex:` | -| 🌮 | `:taco:` | -| 🎉 | `:tada:` | -| 🇹‍🇼 | `:taiwan:` | -| 🇹‍🇯 | `:tajikistan:` | -| 🥡 | `:takeout_box:` | -| 🫔 | `:tamale:` | -| 🎋 | `:tanabata_tree:` | -| 🍊 | `:tangerine:` | -| 🇹‍🇿 | `:tanzania:` | -| ♉ | `:taurus:` | -| 🚕 | `:taxi:` | -| 🍵 | `:tea:` | -| 🧑‍🏫 | `:teacher:` | -| 🫖 | `:teapot:` | -| 🧑‍💻 | `:technologist:` | -| 🧸 | `:teddy_bear:` | -| ☎ | `:telephone:` | -| 📞 | `:telephone_receiver:` | -| 🔭 | `:telescope:` | -| 🎾 | `:tennis:` | -| ⛺ | `:tent:` | -| 🧪 | `:test_tube:` | -| 🇹‍🇭 | `:thailand:` | -| 🌡 | `:thermometer:` | -| 🤔 | `:thinking:` | -| 🩴 | `:thong_sandal:` | -| 💭 | `:thought_balloon:` | -| 🧵 | `:thread:` | -| 3‍⃣ | `:three:` | -| 👎 | `:thumbsdown:` | -| 👍 | `:thumbsup:` | -| 🎫 | `:ticket:` | -| 🎟 | `:tickets:` | -| 🐯 | `:tiger:` | -| 🐅 | `:tiger2:` | -| ⏲ | `:timer_clock:` | -| 🇹‍🇱 | `:timor_leste:` | -| 💁‍♂ | `:tipping_hand_man:` | -| 💁 | `:tipping_hand_person:` | -| 💁‍♀ | `:tipping_hand_woman:` | -| 😫 | `:tired_face:` | -| ™ | `:tm:` | -| 🇹‍🇬 | `:togo:` | -| 🚽 | `:toilet:` | -| 🇹‍🇰 | `:tokelau:` | -| 🗼 | `:tokyo_tower:` | -| 🍅 | `:tomato:` | -| 🇹‍🇴 | `:tonga:` | -| 👅 | `:tongue:` | -| 🧰 | `:toolbox:` | -| 🦷 | `:tooth:` | -| 🪥 | `:toothbrush:` | -| 🔝 | `:top:` | -| 🎩 | `:tophat:` | -| 🌪 | `:tornado:` | -| 🇹‍🇷 | `:tr:` | -| 🖲 | `:trackball:` | -| 🚜 | `:tractor:` | -| 🚥 | `:traffic_light:` | -| 🚋 | `:train:` | -| 🚆 | `:train2:` | -| 🚊 | `:tram:` | -| 🏳‍⚧ | `:transgender_flag:` | -| ⚧ | `:transgender_symbol:` | -| 🚩 | `:triangular_flag_on_post:` | -| 📐 | `:triangular_ruler:` | -| 🔱 | `:trident:` | -| 🇹‍🇹 | `:trinidad_tobago:` | -| 🇹‍🇦 | `:tristan_da_cunha:` | -| 😤 | `:triumph:` | -| 🧌 | `:troll:` | -| 🚎 | `:trolleybus:` | -| 🏆 | `:trophy:` | -| 🍹 | `:tropical_drink:` | -| 🐠 | `:tropical_fish:` | -| 🚚 | `:truck:` | -| 🎺 | `:trumpet:` | -| 👕 | `:tshirt:` | -| 🌷 | `:tulip:` | -| 🥃 | `:tumbler_glass:` | -| 🇹‍🇳 | `:tunisia:` | -| 🦃 | `:turkey:` | -| 🇹‍🇲 | `:turkmenistan:` | -| 🇹‍🇨 | `:turks_caicos_islands:` | -| 🐢 | `:turtle:` | -| 🇹‍🇻 | `:tuvalu:` | -| 📺 | `:tv:` | -| 🔀 | `:twisted_rightwards_arrows:` | -| 2‍⃣ | `:two:` | -| 💕 | `:two_hearts:` | -| 👬 | `:two_men_holding_hands:` | -| 👭 | `:two_women_holding_hands:` | -| 🈹 | `:u5272:` | -| 🈴 | `:u5408:` | -| 🈺 | `:u55b6:` | -| 🈯 | `:u6307:` | -| 🈷 | `:u6708:` | -| 🈶 | `:u6709:` | -| 🈵 | `:u6e80:` | -| 🈚 | `:u7121:` | -| 🈸 | `:u7533:` | -| 🈲 | `:u7981:` | -| 🈳 | `:u7a7a:` | -| 🇺‍🇬 | `:uganda:` | -| 🇬‍🇧 | `:uk:` | -| 🇺‍🇦 | `:ukraine:` | -| ☔ | `:umbrella:` | -| 😒 | `:unamused:` | -| 🔞 | `:underage:` | -| 🦄 | `:unicorn:` | -| 🇦‍🇪 | `:united_arab_emirates:` | -| 🇺‍🇳 | `:united_nations:` | -| 🔓 | `:unlock:` | -| 🆙 | `:up:` | -| 🙃 | `:upside_down_face:` | -| 🇺‍🇾 | `:uruguay:` | -| 🇺‍🇸 | `:us:` | -| 🇺‍🇲 | `:us_outlying_islands:` | -| 🇻‍🇮 | `:us_virgin_islands:` | -| 🇺‍🇿 | `:uzbekistan:` | -| ✌ | `:v:` | -| 🧛 | `:vampire:` | -| 🧛‍♂ | `:vampire_man:` | -| 🧛‍♀ | `:vampire_woman:` | -| 🇻‍🇺 | `:vanuatu:` | -| 🇻‍🇦 | `:vatican_city:` | -| 🇻‍🇪 | `:venezuela:` | -| 🚦 | `:vertical_traffic_light:` | -| 📼 | `:vhs:` | -| 📳 | `:vibration_mode:` | -| 📹 | `:video_camera:` | -| 🎮 | `:video_game:` | -| 🇻‍🇳 | `:vietnam:` | -| 🎻 | `:violin:` | -| ♍ | `:virgo:` | -| 🌋 | `:volcano:` | -| 🏐 | `:volleyball:` | -| 🤮 | `:vomiting_face:` | -| 🆚 | `:vs:` | -| 🖖 | `:vulcan_salute:` | -| 🧇 | `:waffle:` | -| 🏴‍󠁧‍󠁢‍󠁷‍󠁬‍󠁳‍󠁿 | `:wales:` | -| 🚶 | `:walking:` | -| 🚶‍♂ | `:walking_man:` | -| 🚶‍♀ | `:walking_woman:` | -| 🇼‍🇫 | `:wallis_futuna:` | -| 🌘 | `:waning_crescent_moon:` | -| 🌖 | `:waning_gibbous_moon:` | -| ⚠ | `:warning:` | -| 🗑 | `:wastebasket:` | -| ⌚ | `:watch:` | -| 🐃 | `:water_buffalo:` | -| 🤽 | `:water_polo:` | -| 🍉 | `:watermelon:` | -| 👋 | `:wave:` | -| 〰 | `:wavy_dash:` | -| 🌒 | `:waxing_crescent_moon:` | -| 🌔 | `:waxing_gibbous_moon:` | -| 🚾 | `:wc:` | -| 😩 | `:weary:` | -| 💒 | `:wedding:` | -| 🏋 | `:weight_lifting:` | -| 🏋‍♂ | `:weight_lifting_man:` | -| 🏋‍♀ | `:weight_lifting_woman:` | -| 🇪‍🇭 | `:western_sahara:` | -| 🐳 | `:whale:` | -| 🐋 | `:whale2:` | -| 🛞 | `:wheel:` | -| ☸ | `:wheel_of_dharma:` | -| ♿ | `:wheelchair:` | -| ✅ | `:white_check_mark:` | -| ⚪ | `:white_circle:` | -| 🏳 | `:white_flag:` | -| 💮 | `:white_flower:` | -| 👨‍🦳 | `:white_haired_man:` | -| 👩‍🦳 | `:white_haired_woman:` | -| 🤍 | `:white_heart:` | -| ⬜ | `:white_large_square:` | -| ◽ | `:white_medium_small_square:` | -| ◻ | `:white_medium_square:` | -| ▫ | `:white_small_square:` | -| 🔳 | `:white_square_button:` | -| 🥀 | `:wilted_flower:` | -| 🎐 | `:wind_chime:` | -| 🌬 | `:wind_face:` | -| 🪟 | `:window:` | -| 🍷 | `:wine_glass:` | -| 🪽 | `:wing:` | -| 😉 | `:wink:` | -| 🛜 | `:wireless:` | -| 🐺 | `:wolf:` | -| 👩 | `:woman:` | -| 👩‍🎨 | `:woman_artist:` | -| 👩‍🚀 | `:woman_astronaut:` | -| 🧔‍♀ | `:woman_beard:` | -| 🤸‍♀ | `:woman_cartwheeling:` | -| 👩‍🍳 | `:woman_cook:` | -| 💃 | `:woman_dancing:` | -| 🤦‍♀ | `:woman_facepalming:` | -| 👩‍🏭 | `:woman_factory_worker:` | -| 👩‍🌾 | `:woman_farmer:` | -| 👩‍🍼 | `:woman_feeding_baby:` | -| 👩‍🚒 | `:woman_firefighter:` | -| 👩‍⚕ | `:woman_health_worker:` | -| 👩‍🦽 | `:woman_in_manual_wheelchair:` | -| 👩‍🦼 | `:woman_in_motorized_wheelchair:` | -| 🤵‍♀ | `:woman_in_tuxedo:` | -| 👩‍⚖ | `:woman_judge:` | -| 🤹‍♀ | `:woman_juggling:` | -| 👩‍🔧 | `:woman_mechanic:` | -| 👩‍💼 | `:woman_office_worker:` | -| 👩‍✈ | `:woman_pilot:` | -| 🤾‍♀ | `:woman_playing_handball:` | -| 🤽‍♀ | `:woman_playing_water_polo:` | -| 👩‍🔬 | `:woman_scientist:` | -| 🤷‍♀ | `:woman_shrugging:` | -| 👩‍🎤 | `:woman_singer:` | -| 👩‍🎓 | `:woman_student:` | -| 👩‍🏫 | `:woman_teacher:` | -| 👩‍💻 | `:woman_technologist:` | -| 🧕 | `:woman_with_headscarf:` | -| 👩‍🦯 | `:woman_with_probing_cane:` | -| 👳‍♀ | `:woman_with_turban:` | -| 👰‍♀ | `:woman_with_veil:` | -| 👚 | `:womans_clothes:` | -| 👒 | `:womans_hat:` | -| 🤼‍♀ | `:women_wrestling:` | -| 🚺 | `:womens:` | -| 🪵 | `:wood:` | -| 🥴 | `:woozy_face:` | -| 🗺 | `:world_map:` | -| 🪱 | `:worm:` | -| 😟 | `:worried:` | -| 🔧 | `:wrench:` | -| 🤼 | `:wrestling:` | -| ✍ | `:writing_hand:` | -| ❌ | `:x:` | -| 🩻 | `:x_ray:` | -| 🧶 | `:yarn:` | -| 🥱 | `:yawning_face:` | -| 🟡 | `:yellow_circle:` | -| 💛 | `:yellow_heart:` | -| 🟨 | `:yellow_square:` | -| 🇾‍🇪 | `:yemen:` | -| 💴 | `:yen:` | -| ☯ | `:yin_yang:` | -| 🪀 | `:yo_yo:` | -| 😋 | `:yum:` | -| 🇿‍🇲 | `:zambia:` | -| 🤪 | `:zany_face:` | -| ⚡ | `:zap:` | -| 🦓 | `:zebra:` | -| 0‍⃣ | `:zero:` | -| 🇿‍🇼 | `:zimbabwe:` | -| 🤐 | `:zipper_mouth_face:` | -| 🧟 | `:zombie:` | -| 🧟‍♂ | `:zombie_man:` | -| 🧟‍♀ | `:zombie_woman:` | -| 💤 | `:zzz:` | + diff --git a/website/de/book/elements/readalong.md b/website/de/book/elements/readalong.md index ba7a4dbc..6afaeabc 100644 --- a/website/de/book/elements/readalong.md +++ b/website/de/book/elements/readalong.md @@ -7,7 +7,28 @@ permaid: readalong Die Read-Along-Direktive ermöglicht es, interaktive Leseerlebnisse zu erstellen, bei denen der Text synchron zur Audiowiedergabe hervorgehoben wird. Benutzer können Wort für Wort folgen und auf Wörter klicken, um zu bestimmten Stellen im Audio zu springen. -## Grundlegende Verwendung +## Modi + +Die Direktive unterstützt zwei Modi: + +### Text-zu-Sprache (TTS) Modus + +Verwenden Sie die integrierte Text-zu-Sprache-Engine des Browsers, um automatisch Audio zu generieren: + +```markdown +:::readalong{mode="tts"} +Dieser Text wird von der Text-zu-Sprache-Engine des Browsers gesprochen. +Jedes Wort wird hervorgehoben, während es gesprochen wird. +::: +``` + +:::readalong{mode="tts"} +Dies ist eine Demonstration mit Text-zu-Sprache. Der Browser wird diesen Text vorlesen und jedes Wort hervorheben, während er spricht. Klicken Sie auf ein beliebiges Wort, um zu diesem Teil zu springen. +::: + +### Manueller Modus (Audiodatei) + +Verwenden Sie eine vorab aufgenommene Audiodatei mit optionalen Zeitstempeln: ```markdown :::readalong{src="/audio.mp3" autoGenerate="true"} @@ -17,9 +38,19 @@ Sie können mehrere Sätze und Absätze einschließen. ``` :::readalong{src="/Free_Test_Data_1MB_MP3.mp3" autoGenerate="true" speed="120"} -Dies ist eine Demonstration der Read-Along-Funktion. Jedes Wort wird hervorgehoben, während das Audio abgespielt wird. Klicken Sie auf ein beliebiges Wort, um zu diesem Teil des Audios zu springen. Die Synchronisation wird automatisch basierend auf der Lesegeschwindigkeit generiert. +Dies ist eine Demonstration mit einer Audiodatei. Jedes Wort wird hervorgehoben, während das Audio abgespielt wird. Klicken Sie auf ein beliebiges Wort, um zu diesem Teil des Audios zu springen. Die Synchronisation wird automatisch basierend auf der Lesegeschwindigkeit generiert. ::: +## Konfigurationsoptionen + +| Option | Typ | Standard | Beschreibung | +|--------|-----|----------|--------------| +| `mode` | string | "manual" | Modus: "tts" für Text-zu-Sprache oder "manual" für Audiodatei | +| `src` | string | erforderlich (manueller Modus) | Pfad zur Audiodatei (MP3, WAV, OGG, M4A) | +| `autoGenerate` | boolean | false | Automatische Zeitstempelgenerierung aktivieren (manueller Modus) | +| `speed` | number | 150 | Lesegeschwindigkeit in Wörtern pro Minute oder TTS-Rate | +| `timestamps` | JSON | null | Manuelle Zeitstempel-Array mit `{word, start, end}` Objekten | + ## Mit manuellen Zeitstempeln Wenn Sie präzise Zeitstempel von Tools wie OpenAI Whisper haben, können Sie diese als JSON angeben: @@ -30,15 +61,6 @@ Hallo Welt ::: ``` -## Konfigurationsoptionen - -| Option | Typ | Standard | Beschreibung | -|--------|-----|----------|--------------| -| `src` | string | erforderlich | Pfad zur Audiodatei (MP3, WAV, OGG, M4A) | -| `autoGenerate` | boolean | false | Automatische Zeitstempelgenerierung aktivieren | -| `speed` | number | 150 | Lesegeschwindigkeit in Wörtern pro Minute (wenn autoGenerate true ist) | -| `timestamps` | JSON | null | Manuelle Zeitstempel-Array mit `{word, start, end}` Objekten | - ## Funktionen - **Play/Pause-Steuerung**: Interaktive Schaltfläche zur Steuerung der Audiowiedergabe @@ -64,11 +86,17 @@ Und ein dritter Absatz zur Veranschaulichung. ## Tipps -- Verwenden Sie `autoGenerate="true"` für eine schnelle Einrichtung ohne manuelle Zeitstempel -- Passen Sie `speed` an das tatsächliche Lesetempo Ihres Audios an +- Verwenden Sie `mode="tts"` für eine schnelle Einrichtung ohne Audiodateien - der Browser liest den Text vor +- Verwenden Sie `autoGenerate="true"` mit Audiodateien für eine schnelle Einrichtung ohne manuelle Zeitstempel +- Passen Sie `speed` an das tatsächliche Lesetempo Ihres Audios oder die TTS-Rate an - Für beste Ergebnisse mit manuellen Zeitstempeln stellen Sie sicher, dass diese genau mit Ihrem Text übereinstimmen - Unterstützte Audioformate: MP3, WAV, OGG, M4A (jedes HTML5-kompatible Format) +- TTS-Modus funktioniert am besten in Chrome, Edge und Safari-Browsern + +:::alert{info} +**TTS-Modus**: Keine Audiodatei erforderlich! Die Text-zu-Sprache-Engine des Browsers liest Ihren Inhalt automatisch vor. Perfekt für schnelles Prototyping oder Barrierefreiheitsfunktionen. +::: :::alert{warn} -Die Read-Along-Direktive benötigt eine Audiodatei. Stellen Sie sicher, dass der Audiopfad korrekt und zugänglich ist. +**Manueller Modus**: Eine Audiodatei ist erforderlich. Stellen Sie sicher, dass der Audiopfad korrekt und zugänglich ist. ::: diff --git a/website/en/book/elements/emoji.md b/website/en/book/elements/emoji.md index d71da557..73a8e8cc 100644 --- a/website/en/book/elements/emoji.md +++ b/website/en/book/elements/emoji.md @@ -19,1916 +19,4 @@ This file lists all supported GitHub-style emoji shortcodes and their correspond | Emoji | Shortcode | |:------|:----------| -| 👎 | `:-1:` | -| 👍 | `:+1:` | -| 💯 | `:100:` | -| 🔢 | `:1234:` | -| 🥇 | `:1st_place_medal:` | -| 🥈 | `:2nd_place_medal:` | -| 🥉 | `:3rd_place_medal:` | -| 🎱 | `:8ball:` | -| 🅰 | `:a:` | -| 🆎 | `:ab:` | -| 🧮 | `:abacus:` | -| 🔤 | `:abc:` | -| 🔡 | `:abcd:` | -| 🉑 | `:accept:` | -| 🪗 | `:accordion:` | -| 🩹 | `:adhesive_bandage:` | -| 🧑 | `:adult:` | -| 🚡 | `:aerial_tramway:` | -| 🇦‍🇫 | `:afghanistan:` | -| ✈ | `:airplane:` | -| 🇦‍🇽 | `:aland_islands:` | -| ⏰ | `:alarm_clock:` | -| 🇦‍🇱 | `:albania:` | -| ⚗ | `:alembic:` | -| 🇩‍🇿 | `:algeria:` | -| 👽 | `:alien:` | -| 🚑 | `:ambulance:` | -| 🇦‍🇸 | `:american_samoa:` | -| 🏺 | `:amphora:` | -| 🫀 | `:anatomical_heart:` | -| ⚓ | `:anchor:` | -| 🇦‍🇩 | `:andorra:` | -| 👼 | `:angel:` | -| 💢 | `:anger:` | -| 🇦‍🇴 | `:angola:` | -| 😠 | `:angry:` | -| 🇦‍🇮 | `:anguilla:` | -| 😧 | `:anguished:` | -| 🐜 | `:ant:` | -| 🇦‍🇶 | `:antarctica:` | -| 🇦‍🇬 | `:antigua_barbuda:` | -| 🍎 | `:apple:` | -| ♒ | `:aquarius:` | -| 🇦‍🇷 | `:argentina:` | -| ♈ | `:aries:` | -| 🇦‍🇲 | `:armenia:` | -| ◀ | `:arrow_backward:` | -| ⏬ | `:arrow_double_down:` | -| ⏫ | `:arrow_double_up:` | -| ⬇ | `:arrow_down:` | -| 🔽 | `:arrow_down_small:` | -| ▶ | `:arrow_forward:` | -| ⤵ | `:arrow_heading_down:` | -| ⤴ | `:arrow_heading_up:` | -| ⬅ | `:arrow_left:` | -| ↙ | `:arrow_lower_left:` | -| ↘ | `:arrow_lower_right:` | -| ➡ | `:arrow_right:` | -| ↪ | `:arrow_right_hook:` | -| ⬆ | `:arrow_up:` | -| ↕ | `:arrow_up_down:` | -| 🔼 | `:arrow_up_small:` | -| ↖ | `:arrow_upper_left:` | -| ↗ | `:arrow_upper_right:` | -| 🔃 | `:arrows_clockwise:` | -| 🔄 | `:arrows_counterclockwise:` | -| 🎨 | `:art:` | -| 🚛 | `:articulated_lorry:` | -| 🛰 | `:artificial_satellite:` | -| 🧑‍🎨 | `:artist:` | -| 🇦‍🇼 | `:aruba:` | -| 🇦‍🇨 | `:ascension_island:` | -| *‍⃣ | `:asterisk:` | -| 😲 | `:astonished:` | -| 🧑‍🚀 | `:astronaut:` | -| 👟 | `:athletic_shoe:` | -| 🏧 | `:atm:` | -| ⚛ | `:atom_symbol:` | -| 🇦‍🇺 | `:australia:` | -| 🇦‍🇹 | `:austria:` | -| 🛺 | `:auto_rickshaw:` | -| 🥑 | `:avocado:` | -| 🪓 | `:axe:` | -| 🇦‍🇿 | `:azerbaijan:` | -| 🅱 | `:b:` | -| 👶 | `:baby:` | -| 🍼 | `:baby_bottle:` | -| 🐤 | `:baby_chick:` | -| 🚼 | `:baby_symbol:` | -| 🔙 | `:back:` | -| 🥓 | `:bacon:` | -| 🦡 | `:badger:` | -| 🏸 | `:badminton:` | -| 🥯 | `:bagel:` | -| 🛄 | `:baggage_claim:` | -| 🥖 | `:baguette_bread:` | -| 🇧‍🇸 | `:bahamas:` | -| 🇧‍🇭 | `:bahrain:` | -| ⚖ | `:balance_scale:` | -| 👨‍🦲 | `:bald_man:` | -| 👩‍🦲 | `:bald_woman:` | -| 🩰 | `:ballet_shoes:` | -| 🎈 | `:balloon:` | -| 🗳 | `:ballot_box:` | -| ☑ | `:ballot_box_with_check:` | -| 🎍 | `:bamboo:` | -| 🍌 | `:banana:` | -| ‼ | `:bangbang:` | -| 🇧‍🇩 | `:bangladesh:` | -| 🪕 | `:banjo:` | -| 🏦 | `:bank:` | -| 📊 | `:bar_chart:` | -| 🇧‍🇧 | `:barbados:` | -| 💈 | `:barber:` | -| ⚾ | `:baseball:` | -| 🧺 | `:basket:` | -| 🏀 | `:basketball:` | -| ⛹‍♂ | `:basketball_man:` | -| ⛹‍♀ | `:basketball_woman:` | -| 🦇 | `:bat:` | -| 🛀 | `:bath:` | -| 🛁 | `:bathtub:` | -| 🔋 | `:battery:` | -| 🏖 | `:beach_umbrella:` | -| 🫘 | `:beans:` | -| 🐻 | `:bear:` | -| 🧔 | `:bearded_person:` | -| 🦫 | `:beaver:` | -| 🛏 | `:bed:` | -| 🐝 | `:bee:` | -| 🍺 | `:beer:` | -| 🍻 | `:beers:` | -| 🪲 | `:beetle:` | -| 🔰 | `:beginner:` | -| 🇧‍🇾 | `:belarus:` | -| 🇧‍🇪 | `:belgium:` | -| 🇧‍🇿 | `:belize:` | -| 🔔 | `:bell:` | -| 🫑 | `:bell_pepper:` | -| 🛎 | `:bellhop_bell:` | -| 🇧‍🇯 | `:benin:` | -| 🍱 | `:bento:` | -| 🇧‍🇲 | `:bermuda:` | -| 🧃 | `:beverage_box:` | -| 🇧‍🇹 | `:bhutan:` | -| 🚴 | `:bicyclist:` | -| 🚲 | `:bike:` | -| 🚴‍♂ | `:biking_man:` | -| 🚴‍♀ | `:biking_woman:` | -| 👙 | `:bikini:` | -| 🧢 | `:billed_cap:` | -| ☣ | `:biohazard:` | -| 🐦 | `:bird:` | -| 🎂 | `:birthday:` | -| 🦬 | `:bison:` | -| 🫦 | `:biting_lip:` | -| 🐦‍⬛ | `:black_bird:` | -| 🐈‍⬛ | `:black_cat:` | -| ⚫ | `:black_circle:` | -| 🏴 | `:black_flag:` | -| 🖤 | `:black_heart:` | -| 🃏 | `:black_joker:` | -| ⬛ | `:black_large_square:` | -| ◾ | `:black_medium_small_square:` | -| ◼ | `:black_medium_square:` | -| ✒ | `:black_nib:` | -| ▪ | `:black_small_square:` | -| 🔲 | `:black_square_button:` | -| 👱‍♂ | `:blond_haired_man:` | -| 👱 | `:blond_haired_person:` | -| 👱‍♀ | `:blond_haired_woman:` | -| 👱‍♀ | `:blonde_woman:` | -| 🌼 | `:blossom:` | -| 🐡 | `:blowfish:` | -| 📘 | `:blue_book:` | -| 🚙 | `:blue_car:` | -| 💙 | `:blue_heart:` | -| 🟦 | `:blue_square:` | -| 🫐 | `:blueberries:` | -| 😊 | `:blush:` | -| 🐗 | `:boar:` | -| ⛵ | `:boat:` | -| 🇧‍🇴 | `:bolivia:` | -| 💣 | `:bomb:` | -| 🦴 | `:bone:` | -| 📖 | `:book:` | -| 🔖 | `:bookmark:` | -| 📑 | `:bookmark_tabs:` | -| 📚 | `:books:` | -| 💥 | `:boom:` | -| 🪃 | `:boomerang:` | -| 👢 | `:boot:` | -| 🇧‍🇦 | `:bosnia_herzegovina:` | -| 🇧‍🇼 | `:botswana:` | -| ⛹‍♂ | `:bouncing_ball_man:` | -| ⛹ | `:bouncing_ball_person:` | -| ⛹‍♀ | `:bouncing_ball_woman:` | -| 💐 | `:bouquet:` | -| 🇧‍🇻 | `:bouvet_island:` | -| 🙇 | `:bow:` | -| 🏹 | `:bow_and_arrow:` | -| 🙇‍♂ | `:bowing_man:` | -| 🙇‍♀ | `:bowing_woman:` | -| 🥣 | `:bowl_with_spoon:` | -| 🎳 | `:bowling:` | -| 🥊 | `:boxing_glove:` | -| 👦 | `:boy:` | -| 🧠 | `:brain:` | -| 🇧‍🇷 | `:brazil:` | -| 🍞 | `:bread:` | -| 🤱 | `:breast_feeding:` | -| 🧱 | `:bricks:` | -| 👰‍♀ | `:bride_with_veil:` | -| 🌉 | `:bridge_at_night:` | -| 💼 | `:briefcase:` | -| 🇮‍🇴 | `:british_indian_ocean_territory:` | -| 🇻‍🇬 | `:british_virgin_islands:` | -| 🥦 | `:broccoli:` | -| 💔 | `:broken_heart:` | -| 🧹 | `:broom:` | -| 🟤 | `:brown_circle:` | -| 🤎 | `:brown_heart:` | -| 🟫 | `:brown_square:` | -| 🇧‍🇳 | `:brunei:` | -| 🧋 | `:bubble_tea:` | -| 🫧 | `:bubbles:` | -| 🪣 | `:bucket:` | -| 🐛 | `:bug:` | -| 🏗 | `:building_construction:` | -| 💡 | `:bulb:` | -| 🇧‍🇬 | `:bulgaria:` | -| 🚅 | `:bullettrain_front:` | -| 🚄 | `:bullettrain_side:` | -| 🇧‍🇫 | `:burkina_faso:` | -| 🌯 | `:burrito:` | -| 🇧‍🇮 | `:burundi:` | -| 🚌 | `:bus:` | -| 🕴 | `:business_suit_levitating:` | -| 🚏 | `:busstop:` | -| 👤 | `:bust_in_silhouette:` | -| 👥 | `:busts_in_silhouette:` | -| 🧈 | `:butter:` | -| 🦋 | `:butterfly:` | -| 🌵 | `:cactus:` | -| 🍰 | `:cake:` | -| 📆 | `:calendar:` | -| 🤙 | `:call_me_hand:` | -| 📲 | `:calling:` | -| 🇰‍🇭 | `:cambodia:` | -| 🐫 | `:camel:` | -| 📷 | `:camera:` | -| 📸 | `:camera_flash:` | -| 🇨‍🇲 | `:cameroon:` | -| 🏕 | `:camping:` | -| 🇨‍🇦 | `:canada:` | -| 🇮‍🇨 | `:canary_islands:` | -| ♋ | `:cancer:` | -| 🕯 | `:candle:` | -| 🍬 | `:candy:` | -| 🥫 | `:canned_food:` | -| 🛶 | `:canoe:` | -| 🇨‍🇻 | `:cape_verde:` | -| 🔠 | `:capital_abcd:` | -| ♑ | `:capricorn:` | -| 🚗 | `:car:` | -| 🗃 | `:card_file_box:` | -| 📇 | `:card_index:` | -| 🗂 | `:card_index_dividers:` | -| 🇧‍🇶 | `:caribbean_netherlands:` | -| 🎠 | `:carousel_horse:` | -| 🪚 | `:carpentry_saw:` | -| 🥕 | `:carrot:` | -| 🤸 | `:cartwheeling:` | -| 🐱 | `:cat:` | -| 🐈 | `:cat2:` | -| 🇰‍🇾 | `:cayman_islands:` | -| 💿 | `:cd:` | -| 🇨‍🇫 | `:central_african_republic:` | -| 🇪‍🇦 | `:ceuta_melilla:` | -| 🇹‍🇩 | `:chad:` | -| ⛓ | `:chains:` | -| 🪑 | `:chair:` | -| 🍾 | `:champagne:` | -| 💹 | `:chart:` | -| 📉 | `:chart_with_downwards_trend:` | -| 📈 | `:chart_with_upwards_trend:` | -| 🏁 | `:checkered_flag:` | -| 🧀 | `:cheese:` | -| 🍒 | `:cherries:` | -| 🌸 | `:cherry_blossom:` | -| ♟ | `:chess_pawn:` | -| 🌰 | `:chestnut:` | -| 🐔 | `:chicken:` | -| 🧒 | `:child:` | -| 🚸 | `:children_crossing:` | -| 🇨‍🇱 | `:chile:` | -| 🐿 | `:chipmunk:` | -| 🍫 | `:chocolate_bar:` | -| 🥢 | `:chopsticks:` | -| 🇨‍🇽 | `:christmas_island:` | -| 🎄 | `:christmas_tree:` | -| ⛪ | `:church:` | -| 🎦 | `:cinema:` | -| 🎪 | `:circus_tent:` | -| 🌇 | `:city_sunrise:` | -| 🌆 | `:city_sunset:` | -| 🏙 | `:cityscape:` | -| 🆑 | `:cl:` | -| 🗜 | `:clamp:` | -| 👏 | `:clap:` | -| 🎬 | `:clapper:` | -| 🏛 | `:classical_building:` | -| 🧗 | `:climbing:` | -| 🧗‍♂ | `:climbing_man:` | -| 🧗‍♀ | `:climbing_woman:` | -| 🥂 | `:clinking_glasses:` | -| 📋 | `:clipboard:` | -| 🇨‍🇵 | `:clipperton_island:` | -| 🕐 | `:clock1:` | -| 🕙 | `:clock10:` | -| 🕥 | `:clock1030:` | -| 🕚 | `:clock11:` | -| 🕦 | `:clock1130:` | -| 🕛 | `:clock12:` | -| 🕧 | `:clock1230:` | -| 🕜 | `:clock130:` | -| 🕑 | `:clock2:` | -| 🕝 | `:clock230:` | -| 🕒 | `:clock3:` | -| 🕞 | `:clock330:` | -| 🕓 | `:clock4:` | -| 🕟 | `:clock430:` | -| 🕔 | `:clock5:` | -| 🕠 | `:clock530:` | -| 🕕 | `:clock6:` | -| 🕡 | `:clock630:` | -| 🕖 | `:clock7:` | -| 🕢 | `:clock730:` | -| 🕗 | `:clock8:` | -| 🕣 | `:clock830:` | -| 🕘 | `:clock9:` | -| 🕤 | `:clock930:` | -| 📕 | `:closed_book:` | -| 🔐 | `:closed_lock_with_key:` | -| 🌂 | `:closed_umbrella:` | -| ☁ | `:cloud:` | -| 🌩 | `:cloud_with_lightning:` | -| ⛈ | `:cloud_with_lightning_and_rain:` | -| 🌧 | `:cloud_with_rain:` | -| 🌨 | `:cloud_with_snow:` | -| 🤡 | `:clown_face:` | -| ♣ | `:clubs:` | -| 🇨‍🇳 | `:cn:` | -| 🧥 | `:coat:` | -| 🪳 | `:cockroach:` | -| 🍸 | `:cocktail:` | -| 🥥 | `:coconut:` | -| 🇨‍🇨 | `:cocos_islands:` | -| ☕ | `:coffee:` | -| ⚰ | `:coffin:` | -| 🪙 | `:coin:` | -| 🥶 | `:cold_face:` | -| 😰 | `:cold_sweat:` | -| 💥 | `:collision:` | -| 🇨‍🇴 | `:colombia:` | -| ☄ | `:comet:` | -| 🇰‍🇲 | `:comoros:` | -| 🧭 | `:compass:` | -| 💻 | `:computer:` | -| 🖱 | `:computer_mouse:` | -| 🎊 | `:confetti_ball:` | -| 😖 | `:confounded:` | -| 😕 | `:confused:` | -| 🇨‍🇬 | `:congo_brazzaville:` | -| 🇨‍🇩 | `:congo_kinshasa:` | -| ㊗ | `:congratulations:` | -| 🚧 | `:construction:` | -| 👷 | `:construction_worker:` | -| 👷‍♂ | `:construction_worker_man:` | -| 👷‍♀ | `:construction_worker_woman:` | -| 🎛 | `:control_knobs:` | -| 🏪 | `:convenience_store:` | -| 🧑‍🍳 | `:cook:` | -| 🇨‍🇰 | `:cook_islands:` | -| 🍪 | `:cookie:` | -| 🆒 | `:cool:` | -| 👮 | `:cop:` | -| © | `:copyright:` | -| 🪸 | `:coral:` | -| 🌽 | `:corn:` | -| 🇨‍🇷 | `:costa_rica:` | -| 🇨‍🇮 | `:cote_divoire:` | -| 🛋 | `:couch_and_lamp:` | -| 👫 | `:couple:` | -| 💑 | `:couple_with_heart:` | -| 👨‍❤‍👨 | `:couple_with_heart_man_man:` | -| 👩‍❤‍👨 | `:couple_with_heart_woman_man:` | -| 👩‍❤‍👩 | `:couple_with_heart_woman_woman:` | -| 💏 | `:couplekiss:` | -| 👨‍❤‍💋‍👨 | `:couplekiss_man_man:` | -| 👩‍❤‍💋‍👨 | `:couplekiss_man_woman:` | -| 👩‍❤‍💋‍👩 | `:couplekiss_woman_woman:` | -| 🐮 | `:cow:` | -| 🐄 | `:cow2:` | -| 🤠 | `:cowboy_hat_face:` | -| 🦀 | `:crab:` | -| 🖍 | `:crayon:` | -| 💳 | `:credit_card:` | -| 🌙 | `:crescent_moon:` | -| 🦗 | `:cricket:` | -| 🏏 | `:cricket_game:` | -| 🇭‍🇷 | `:croatia:` | -| 🐊 | `:crocodile:` | -| 🥐 | `:croissant:` | -| 🤞 | `:crossed_fingers:` | -| 🎌 | `:crossed_flags:` | -| ⚔ | `:crossed_swords:` | -| 👑 | `:crown:` | -| 🩼 | `:crutch:` | -| 😢 | `:cry:` | -| 😿 | `:crying_cat_face:` | -| 🔮 | `:crystal_ball:` | -| 🇨‍🇺 | `:cuba:` | -| 🥒 | `:cucumber:` | -| 🥤 | `:cup_with_straw:` | -| 🧁 | `:cupcake:` | -| 💘 | `:cupid:` | -| 🇨‍🇼 | `:curacao:` | -| 🥌 | `:curling_stone:` | -| 👨‍🦱 | `:curly_haired_man:` | -| 👩‍🦱 | `:curly_haired_woman:` | -| ➰ | `:curly_loop:` | -| 💱 | `:currency_exchange:` | -| 🍛 | `:curry:` | -| 🤬 | `:cursing_face:` | -| 🍮 | `:custard:` | -| 🛃 | `:customs:` | -| 🥩 | `:cut_of_meat:` | -| 🌀 | `:cyclone:` | -| 🇨‍🇾 | `:cyprus:` | -| 🇨‍🇿 | `:czech_republic:` | -| 🗡 | `:dagger:` | -| 💃 | `:dancer:` | -| 👯 | `:dancers:` | -| 👯‍♂ | `:dancing_men:` | -| 👯‍♀ | `:dancing_women:` | -| 🍡 | `:dango:` | -| 🕶 | `:dark_sunglasses:` | -| 🎯 | `:dart:` | -| 💨 | `:dash:` | -| 📅 | `:date:` | -| 🇩‍🇪 | `:de:` | -| 🧏‍♂ | `:deaf_man:` | -| 🧏 | `:deaf_person:` | -| 🧏‍♀ | `:deaf_woman:` | -| 🌳 | `:deciduous_tree:` | -| 🦌 | `:deer:` | -| 🇩‍🇰 | `:denmark:` | -| 🏬 | `:department_store:` | -| 🏚 | `:derelict_house:` | -| 🏜 | `:desert:` | -| 🏝 | `:desert_island:` | -| 🖥 | `:desktop_computer:` | -| 🕵 | `:detective:` | -| 💠 | `:diamond_shape_with_a_dot_inside:` | -| ♦ | `:diamonds:` | -| 🇩‍🇬 | `:diego_garcia:` | -| 😞 | `:disappointed:` | -| 😥 | `:disappointed_relieved:` | -| 🥸 | `:disguised_face:` | -| 🤿 | `:diving_mask:` | -| 🪔 | `:diya_lamp:` | -| 💫 | `:dizzy:` | -| 😵 | `:dizzy_face:` | -| 🇩‍🇯 | `:djibouti:` | -| 🧬 | `:dna:` | -| 🚯 | `:do_not_litter:` | -| 🦤 | `:dodo:` | -| 🐶 | `:dog:` | -| 🐕 | `:dog2:` | -| 💵 | `:dollar:` | -| 🎎 | `:dolls:` | -| 🐬 | `:dolphin:` | -| 🇩‍🇲 | `:dominica:` | -| 🇩‍🇴 | `:dominican_republic:` | -| 🫏 | `:donkey:` | -| 🚪 | `:door:` | -| 🫥 | `:dotted_line_face:` | -| 🍩 | `:doughnut:` | -| 🕊 | `:dove:` | -| 🐉 | `:dragon:` | -| 🐲 | `:dragon_face:` | -| 👗 | `:dress:` | -| 🐪 | `:dromedary_camel:` | -| 🤤 | `:drooling_face:` | -| 🩸 | `:drop_of_blood:` | -| 💧 | `:droplet:` | -| 🥁 | `:drum:` | -| 🦆 | `:duck:` | -| 🥟 | `:dumpling:` | -| 📀 | `:dvd:` | -| 📧 | `:e-mail:` | -| 🦅 | `:eagle:` | -| 👂 | `:ear:` | -| 🌾 | `:ear_of_rice:` | -| 🦻 | `:ear_with_hearing_aid:` | -| 🌍 | `:earth_africa:` | -| 🌎 | `:earth_americas:` | -| 🌏 | `:earth_asia:` | -| 🇪‍🇨 | `:ecuador:` | -| 🥚 | `:egg:` | -| 🍆 | `:eggplant:` | -| 🇪‍🇬 | `:egypt:` | -| 8‍⃣ | `:eight:` | -| ✴ | `:eight_pointed_black_star:` | -| ✳ | `:eight_spoked_asterisk:` | -| ⏏ | `:eject_button:` | -| 🇸‍🇻 | `:el_salvador:` | -| 🔌 | `:electric_plug:` | -| 🐘 | `:elephant:` | -| 🛗 | `:elevator:` | -| 🧝 | `:elf:` | -| 🧝‍♂ | `:elf_man:` | -| 🧝‍♀ | `:elf_woman:` | -| 📧 | `:email:` | -| 🪹 | `:empty_nest:` | -| 🔚 | `:end:` | -| 🏴‍󠁧‍󠁢‍󠁥‍󠁮‍󠁧‍󠁿 | `:england:` | -| ✉ | `:envelope:` | -| 📩 | `:envelope_with_arrow:` | -| 🇬‍🇶 | `:equatorial_guinea:` | -| 🇪‍🇷 | `:eritrea:` | -| 🇪‍🇸 | `:es:` | -| 🇪‍🇪 | `:estonia:` | -| 🇪‍🇹 | `:ethiopia:` | -| 🇪‍🇺 | `:eu:` | -| 💶 | `:euro:` | -| 🏰 | `:european_castle:` | -| 🏤 | `:european_post_office:` | -| 🇪‍🇺 | `:european_union:` | -| 🌲 | `:evergreen_tree:` | -| ❗ | `:exclamation:` | -| 🤯 | `:exploding_head:` | -| 😑 | `:expressionless:` | -| 👁 | `:eye:` | -| 👁‍🗨 | `:eye_speech_bubble:` | -| 👓 | `:eyeglasses:` | -| 👀 | `:eyes:` | -| 😮‍💨 | `:face_exhaling:` | -| 🥹 | `:face_holding_back_tears:` | -| 😶‍🌫 | `:face_in_clouds:` | -| 🫤 | `:face_with_diagonal_mouth:` | -| 🤕 | `:face_with_head_bandage:` | -| 🫢 | `:face_with_open_eyes_and_hand_over_mouth:` | -| 🫣 | `:face_with_peeking_eye:` | -| 😵‍💫 | `:face_with_spiral_eyes:` | -| 🤒 | `:face_with_thermometer:` | -| 🤦 | `:facepalm:` | -| 👊 | `:facepunch:` | -| 🏭 | `:factory:` | -| 🧑‍🏭 | `:factory_worker:` | -| 🧚 | `:fairy:` | -| 🧚‍♂ | `:fairy_man:` | -| 🧚‍♀ | `:fairy_woman:` | -| 🧆 | `:falafel:` | -| 🇫‍🇰 | `:falkland_islands:` | -| 🍂 | `:fallen_leaf:` | -| 👪 | `:family:` | -| 👨‍👦 | `:family_man_boy:` | -| 👨‍👦‍👦 | `:family_man_boy_boy:` | -| 👨‍👧 | `:family_man_girl:` | -| 👨‍👧‍👦 | `:family_man_girl_boy:` | -| 👨‍👧‍👧 | `:family_man_girl_girl:` | -| 👨‍👨‍👦 | `:family_man_man_boy:` | -| 👨‍👨‍👦‍👦 | `:family_man_man_boy_boy:` | -| 👨‍👨‍👧 | `:family_man_man_girl:` | -| 👨‍👨‍👧‍👦 | `:family_man_man_girl_boy:` | -| 👨‍👨‍👧‍👧 | `:family_man_man_girl_girl:` | -| 👨‍👩‍👦 | `:family_man_woman_boy:` | -| 👨‍👩‍👦‍👦 | `:family_man_woman_boy_boy:` | -| 👨‍👩‍👧 | `:family_man_woman_girl:` | -| 👨‍👩‍👧‍👦 | `:family_man_woman_girl_boy:` | -| 👨‍👩‍👧‍👧 | `:family_man_woman_girl_girl:` | -| 👩‍👦 | `:family_woman_boy:` | -| 👩‍👦‍👦 | `:family_woman_boy_boy:` | -| 👩‍👧 | `:family_woman_girl:` | -| 👩‍👧‍👦 | `:family_woman_girl_boy:` | -| 👩‍👧‍👧 | `:family_woman_girl_girl:` | -| 👩‍👩‍👦 | `:family_woman_woman_boy:` | -| 👩‍👩‍👦‍👦 | `:family_woman_woman_boy_boy:` | -| 👩‍👩‍👧 | `:family_woman_woman_girl:` | -| 👩‍👩‍👧‍👦 | `:family_woman_woman_girl_boy:` | -| 👩‍👩‍👧‍👧 | `:family_woman_woman_girl_girl:` | -| 🧑‍🌾 | `:farmer:` | -| 🇫‍🇴 | `:faroe_islands:` | -| ⏩ | `:fast_forward:` | -| 📠 | `:fax:` | -| 😨 | `:fearful:` | -| 🪶 | `:feather:` | -| 🐾 | `:feet:` | -| 🕵‍♀ | `:female_detective:` | -| ♀ | `:female_sign:` | -| 🎡 | `:ferris_wheel:` | -| ⛴ | `:ferry:` | -| 🏑 | `:field_hockey:` | -| 🇫‍🇯 | `:fiji:` | -| 🗄 | `:file_cabinet:` | -| 📁 | `:file_folder:` | -| 📽 | `:film_projector:` | -| 🎞 | `:film_strip:` | -| 🇫‍🇮 | `:finland:` | -| 🔥 | `:fire:` | -| 🚒 | `:fire_engine:` | -| 🧯 | `:fire_extinguisher:` | -| 🧨 | `:firecracker:` | -| 🧑‍🚒 | `:firefighter:` | -| 🎆 | `:fireworks:` | -| 🌓 | `:first_quarter_moon:` | -| 🌛 | `:first_quarter_moon_with_face:` | -| 🐟 | `:fish:` | -| 🍥 | `:fish_cake:` | -| 🎣 | `:fishing_pole_and_fish:` | -| ✊ | `:fist:` | -| 🤛 | `:fist_left:` | -| 👊 | `:fist_oncoming:` | -| ✊ | `:fist_raised:` | -| 🤜 | `:fist_right:` | -| 5‍⃣ | `:five:` | -| 🎏 | `:flags:` | -| 🦩 | `:flamingo:` | -| 🔦 | `:flashlight:` | -| 🥿 | `:flat_shoe:` | -| 🫓 | `:flatbread:` | -| ⚜ | `:fleur_de_lis:` | -| 🛬 | `:flight_arrival:` | -| 🛫 | `:flight_departure:` | -| 🐬 | `:flipper:` | -| 💾 | `:floppy_disk:` | -| 🎴 | `:flower_playing_cards:` | -| 😳 | `:flushed:` | -| 🪈 | `:flute:` | -| 🪰 | `:fly:` | -| 🥏 | `:flying_disc:` | -| 🛸 | `:flying_saucer:` | -| 🌫 | `:fog:` | -| 🌁 | `:foggy:` | -| 🪭 | `:folding_hand_fan:` | -| 🫕 | `:fondue:` | -| 🦶 | `:foot:` | -| 🏈 | `:football:` | -| 👣 | `:footprints:` | -| 🍴 | `:fork_and_knife:` | -| 🥠 | `:fortune_cookie:` | -| ⛲ | `:fountain:` | -| 🖋 | `:fountain_pen:` | -| 4‍⃣ | `:four:` | -| 🍀 | `:four_leaf_clover:` | -| 🦊 | `:fox_face:` | -| 🇫‍🇷 | `:fr:` | -| 🖼 | `:framed_picture:` | -| 🆓 | `:free:` | -| 🇬‍🇫 | `:french_guiana:` | -| 🇵‍🇫 | `:french_polynesia:` | -| 🇹‍🇫 | `:french_southern_territories:` | -| 🍳 | `:fried_egg:` | -| 🍤 | `:fried_shrimp:` | -| 🍟 | `:fries:` | -| 🐸 | `:frog:` | -| 😦 | `:frowning:` | -| ☹ | `:frowning_face:` | -| 🙍‍♂ | `:frowning_man:` | -| 🙍 | `:frowning_person:` | -| 🙍‍♀ | `:frowning_woman:` | -| 🖕 | `:fu:` | -| ⛽ | `:fuelpump:` | -| 🌕 | `:full_moon:` | -| 🌝 | `:full_moon_with_face:` | -| ⚱ | `:funeral_urn:` | -| 🇬‍🇦 | `:gabon:` | -| 🇬‍🇲 | `:gambia:` | -| 🎲 | `:game_die:` | -| 🧄 | `:garlic:` | -| 🇬‍🇧 | `:gb:` | -| ⚙ | `:gear:` | -| 💎 | `:gem:` | -| ♊ | `:gemini:` | -| 🧞 | `:genie:` | -| 🧞‍♂ | `:genie_man:` | -| 🧞‍♀ | `:genie_woman:` | -| 🇬‍🇪 | `:georgia:` | -| 🇬‍🇭 | `:ghana:` | -| 👻 | `:ghost:` | -| 🇬‍🇮 | `:gibraltar:` | -| 🎁 | `:gift:` | -| 💝 | `:gift_heart:` | -| 🫚 | `:ginger_root:` | -| 🦒 | `:giraffe:` | -| 👧 | `:girl:` | -| 🌐 | `:globe_with_meridians:` | -| 🧤 | `:gloves:` | -| 🥅 | `:goal_net:` | -| 🐐 | `:goat:` | -| 🥽 | `:goggles:` | -| ⛳ | `:golf:` | -| 🏌 | `:golfing:` | -| 🏌‍♂ | `:golfing_man:` | -| 🏌‍♀ | `:golfing_woman:` | -| 🪿 | `:goose:` | -| 🦍 | `:gorilla:` | -| 🍇 | `:grapes:` | -| 🇬‍🇷 | `:greece:` | -| 🍏 | `:green_apple:` | -| 📗 | `:green_book:` | -| 🟢 | `:green_circle:` | -| 💚 | `:green_heart:` | -| 🥗 | `:green_salad:` | -| 🟩 | `:green_square:` | -| 🇬‍🇱 | `:greenland:` | -| 🇬‍🇩 | `:grenada:` | -| ❕ | `:grey_exclamation:` | -| 🩶 | `:grey_heart:` | -| ❔ | `:grey_question:` | -| 😬 | `:grimacing:` | -| 😁 | `:grin:` | -| 😀 | `:grinning:` | -| 🇬‍🇵 | `:guadeloupe:` | -| 🇬‍🇺 | `:guam:` | -| 💂 | `:guard:` | -| 💂‍♂ | `:guardsman:` | -| 💂‍♀ | `:guardswoman:` | -| 🇬‍🇹 | `:guatemala:` | -| 🇬‍🇬 | `:guernsey:` | -| 🦮 | `:guide_dog:` | -| 🇬‍🇳 | `:guinea:` | -| 🇬‍🇼 | `:guinea_bissau:` | -| 🎸 | `:guitar:` | -| 🔫 | `:gun:` | -| 🇬‍🇾 | `:guyana:` | -| 🪮 | `:hair_pick:` | -| 💇 | `:haircut:` | -| 💇‍♂ | `:haircut_man:` | -| 💇‍♀ | `:haircut_woman:` | -| 🇭‍🇹 | `:haiti:` | -| 🍔 | `:hamburger:` | -| 🔨 | `:hammer:` | -| ⚒ | `:hammer_and_pick:` | -| 🛠 | `:hammer_and_wrench:` | -| 🪬 | `:hamsa:` | -| 🐹 | `:hamster:` | -| ✋ | `:hand:` | -| 🤭 | `:hand_over_mouth:` | -| 🫰 | `:hand_with_index_finger_and_thumb_crossed:` | -| 👜 | `:handbag:` | -| 🤾 | `:handball_person:` | -| 🤝 | `:handshake:` | -| 💩 | `:hankey:` | -| #‍⃣ | `:hash:` | -| 🐥 | `:hatched_chick:` | -| 🐣 | `:hatching_chick:` | -| 🎧 | `:headphones:` | -| 🪦 | `:headstone:` | -| 🧑‍⚕ | `:health_worker:` | -| 🙉 | `:hear_no_evil:` | -| 🇭‍🇲 | `:heard_mcdonald_islands:` | -| ❤ | `:heart:` | -| 💟 | `:heart_decoration:` | -| 😍 | `:heart_eyes:` | -| 😻 | `:heart_eyes_cat:` | -| 🫶 | `:heart_hands:` | -| ❤‍🔥 | `:heart_on_fire:` | -| 💓 | `:heartbeat:` | -| 💗 | `:heartpulse:` | -| ♥ | `:hearts:` | -| ✔ | `:heavy_check_mark:` | -| ➗ | `:heavy_division_sign:` | -| 💲 | `:heavy_dollar_sign:` | -| 🟰 | `:heavy_equals_sign:` | -| ❗ | `:heavy_exclamation_mark:` | -| ❣ | `:heavy_heart_exclamation:` | -| ➖ | `:heavy_minus_sign:` | -| ✖ | `:heavy_multiplication_x:` | -| ➕ | `:heavy_plus_sign:` | -| 🦔 | `:hedgehog:` | -| 🚁 | `:helicopter:` | -| 🌿 | `:herb:` | -| 🌺 | `:hibiscus:` | -| 🔆 | `:high_brightness:` | -| 👠 | `:high_heel:` | -| 🥾 | `:hiking_boot:` | -| 🛕 | `:hindu_temple:` | -| 🦛 | `:hippopotamus:` | -| 🔪 | `:hocho:` | -| 🕳 | `:hole:` | -| 🇭‍🇳 | `:honduras:` | -| 🍯 | `:honey_pot:` | -| 🐝 | `:honeybee:` | -| 🇭‍🇰 | `:hong_kong:` | -| 🪝 | `:hook:` | -| 🐴 | `:horse:` | -| 🏇 | `:horse_racing:` | -| 🏥 | `:hospital:` | -| 🥵 | `:hot_face:` | -| 🌶 | `:hot_pepper:` | -| 🌭 | `:hotdog:` | -| 🏨 | `:hotel:` | -| ♨ | `:hotsprings:` | -| ⌛ | `:hourglass:` | -| ⏳ | `:hourglass_flowing_sand:` | -| 🏠 | `:house:` | -| 🏡 | `:house_with_garden:` | -| 🏘 | `:houses:` | -| 🤗 | `:hugs:` | -| 🇭‍🇺 | `:hungary:` | -| 😯 | `:hushed:` | -| 🛖 | `:hut:` | -| 🪻 | `:hyacinth:` | -| 🍨 | `:ice_cream:` | -| 🧊 | `:ice_cube:` | -| 🏒 | `:ice_hockey:` | -| ⛸ | `:ice_skate:` | -| 🍦 | `:icecream:` | -| 🇮‍🇸 | `:iceland:` | -| 🆔 | `:id:` | -| 🪪 | `:identification_card:` | -| 🉐 | `:ideograph_advantage:` | -| 👿 | `:imp:` | -| 📥 | `:inbox_tray:` | -| 📨 | `:incoming_envelope:` | -| 🫵 | `:index_pointing_at_the_viewer:` | -| 🇮‍🇳 | `:india:` | -| 🇮‍🇩 | `:indonesia:` | -| ♾ | `:infinity:` | -| 💁 | `:information_desk_person:` | -| ℹ | `:information_source:` | -| 😇 | `:innocent:` | -| ⁉ | `:interrobang:` | -| 📱 | `:iphone:` | -| 🇮‍🇷 | `:iran:` | -| 🇮‍🇶 | `:iraq:` | -| 🇮‍🇪 | `:ireland:` | -| 🇮‍🇲 | `:isle_of_man:` | -| 🇮‍🇱 | `:israel:` | -| 🇮‍🇹 | `:it:` | -| 🏮 | `:izakaya_lantern:` | -| 🎃 | `:jack_o_lantern:` | -| 🇯‍🇲 | `:jamaica:` | -| 🗾 | `:japan:` | -| 🏯 | `:japanese_castle:` | -| 👺 | `:japanese_goblin:` | -| 👹 | `:japanese_ogre:` | -| 🫙 | `:jar:` | -| 👖 | `:jeans:` | -| 🪼 | `:jellyfish:` | -| 🇯‍🇪 | `:jersey:` | -| 🧩 | `:jigsaw:` | -| 🇯‍🇴 | `:jordan:` | -| 😂 | `:joy:` | -| 😹 | `:joy_cat:` | -| 🕹 | `:joystick:` | -| 🇯‍🇵 | `:jp:` | -| 🧑‍⚖ | `:judge:` | -| 🤹 | `:juggling_person:` | -| 🕋 | `:kaaba:` | -| 🦘 | `:kangaroo:` | -| 🇰‍🇿 | `:kazakhstan:` | -| 🇰‍🇪 | `:kenya:` | -| 🔑 | `:key:` | -| ⌨ | `:keyboard:` | -| 🔟 | `:keycap_ten:` | -| 🪯 | `:khanda:` | -| 🛴 | `:kick_scooter:` | -| 👘 | `:kimono:` | -| 🇰‍🇮 | `:kiribati:` | -| 💋 | `:kiss:` | -| 😗 | `:kissing:` | -| 😽 | `:kissing_cat:` | -| 😚 | `:kissing_closed_eyes:` | -| 😘 | `:kissing_heart:` | -| 😙 | `:kissing_smiling_eyes:` | -| 🪁 | `:kite:` | -| 🥝 | `:kiwi_fruit:` | -| 🧎‍♂ | `:kneeling_man:` | -| 🧎 | `:kneeling_person:` | -| 🧎‍♀ | `:kneeling_woman:` | -| 🔪 | `:knife:` | -| 🪢 | `:knot:` | -| 🐨 | `:koala:` | -| 🈁 | `:koko:` | -| 🇽‍🇰 | `:kosovo:` | -| 🇰‍🇷 | `:kr:` | -| 🇰‍🇼 | `:kuwait:` | -| 🇰‍🇬 | `:kyrgyzstan:` | -| 🥼 | `:lab_coat:` | -| 🏷 | `:label:` | -| 🥍 | `:lacrosse:` | -| 🪜 | `:ladder:` | -| 🐞 | `:lady_beetle:` | -| 🏮 | `:lantern:` | -| 🇱‍🇦 | `:laos:` | -| 🔵 | `:large_blue_circle:` | -| 🔷 | `:large_blue_diamond:` | -| 🔶 | `:large_orange_diamond:` | -| 🌗 | `:last_quarter_moon:` | -| 🌜 | `:last_quarter_moon_with_face:` | -| ✝ | `:latin_cross:` | -| 🇱‍🇻 | `:latvia:` | -| 😆 | `:laughing:` | -| 🥬 | `:leafy_green:` | -| 🍃 | `:leaves:` | -| 🇱‍🇧 | `:lebanon:` | -| 📒 | `:ledger:` | -| 🛅 | `:left_luggage:` | -| ↔ | `:left_right_arrow:` | -| 🗨 | `:left_speech_bubble:` | -| ↩ | `:leftwards_arrow_with_hook:` | -| 🫲 | `:leftwards_hand:` | -| 🫷 | `:leftwards_pushing_hand:` | -| 🦵 | `:leg:` | -| 🍋 | `:lemon:` | -| ♌ | `:leo:` | -| 🐆 | `:leopard:` | -| 🇱‍🇸 | `:lesotho:` | -| 🎚 | `:level_slider:` | -| 🇱‍🇷 | `:liberia:` | -| ♎ | `:libra:` | -| 🇱‍🇾 | `:libya:` | -| 🇱‍🇮 | `:liechtenstein:` | -| 🩵 | `:light_blue_heart:` | -| 🚈 | `:light_rail:` | -| 🔗 | `:link:` | -| 🦁 | `:lion:` | -| 👄 | `:lips:` | -| 💄 | `:lipstick:` | -| 🇱‍🇹 | `:lithuania:` | -| 🦎 | `:lizard:` | -| 🦙 | `:llama:` | -| 🦞 | `:lobster:` | -| 🔒 | `:lock:` | -| 🔏 | `:lock_with_ink_pen:` | -| 🍭 | `:lollipop:` | -| 🪘 | `:long_drum:` | -| ➿ | `:loop:` | -| 🧴 | `:lotion_bottle:` | -| 🪷 | `:lotus:` | -| 🧘 | `:lotus_position:` | -| 🧘‍♂ | `:lotus_position_man:` | -| 🧘‍♀ | `:lotus_position_woman:` | -| 🔊 | `:loud_sound:` | -| 📢 | `:loudspeaker:` | -| 🏩 | `:love_hotel:` | -| 💌 | `:love_letter:` | -| 🤟 | `:love_you_gesture:` | -| 🪫 | `:low_battery:` | -| 🔅 | `:low_brightness:` | -| 🧳 | `:luggage:` | -| 🫁 | `:lungs:` | -| 🇱‍🇺 | `:luxembourg:` | -| 🤥 | `:lying_face:` | -| Ⓜ | `:m:` | -| 🇲‍🇴 | `:macau:` | -| 🇲‍🇰 | `:macedonia:` | -| 🇲‍🇬 | `:madagascar:` | -| 🔍 | `:mag:` | -| 🔎 | `:mag_right:` | -| 🧙 | `:mage:` | -| 🧙‍♂ | `:mage_man:` | -| 🧙‍♀ | `:mage_woman:` | -| 🪄 | `:magic_wand:` | -| 🧲 | `:magnet:` | -| 🀄 | `:mahjong:` | -| 📫 | `:mailbox:` | -| 📪 | `:mailbox_closed:` | -| 📬 | `:mailbox_with_mail:` | -| 📭 | `:mailbox_with_no_mail:` | -| 🇲‍🇼 | `:malawi:` | -| 🇲‍🇾 | `:malaysia:` | -| 🇲‍🇻 | `:maldives:` | -| 🕵‍♂ | `:male_detective:` | -| ♂ | `:male_sign:` | -| 🇲‍🇱 | `:mali:` | -| 🇲‍🇹 | `:malta:` | -| 🦣 | `:mammoth:` | -| 👨 | `:man:` | -| 👨‍🎨 | `:man_artist:` | -| 👨‍🚀 | `:man_astronaut:` | -| 🧔‍♂ | `:man_beard:` | -| 🤸‍♂ | `:man_cartwheeling:` | -| 👨‍🍳 | `:man_cook:` | -| 🕺 | `:man_dancing:` | -| 🤦‍♂ | `:man_facepalming:` | -| 👨‍🏭 | `:man_factory_worker:` | -| 👨‍🌾 | `:man_farmer:` | -| 👨‍🍼 | `:man_feeding_baby:` | -| 👨‍🚒 | `:man_firefighter:` | -| 👨‍⚕ | `:man_health_worker:` | -| 👨‍🦽 | `:man_in_manual_wheelchair:` | -| 👨‍🦼 | `:man_in_motorized_wheelchair:` | -| 🤵‍♂ | `:man_in_tuxedo:` | -| 👨‍⚖ | `:man_judge:` | -| 🤹‍♂ | `:man_juggling:` | -| 👨‍🔧 | `:man_mechanic:` | -| 👨‍💼 | `:man_office_worker:` | -| 👨‍✈ | `:man_pilot:` | -| 🤾‍♂ | `:man_playing_handball:` | -| 🤽‍♂ | `:man_playing_water_polo:` | -| 👨‍🔬 | `:man_scientist:` | -| 🤷‍♂ | `:man_shrugging:` | -| 👨‍🎤 | `:man_singer:` | -| 👨‍🎓 | `:man_student:` | -| 👨‍🏫 | `:man_teacher:` | -| 👨‍💻 | `:man_technologist:` | -| 👲 | `:man_with_gua_pi_mao:` | -| 👨‍🦯 | `:man_with_probing_cane:` | -| 👳‍♂ | `:man_with_turban:` | -| 👰‍♂ | `:man_with_veil:` | -| 🍊 | `:mandarin:` | -| 🥭 | `:mango:` | -| 👞 | `:mans_shoe:` | -| 🕰 | `:mantelpiece_clock:` | -| 🦽 | `:manual_wheelchair:` | -| 🍁 | `:maple_leaf:` | -| 🪇 | `:maracas:` | -| 🇲‍🇭 | `:marshall_islands:` | -| 🥋 | `:martial_arts_uniform:` | -| 🇲‍🇶 | `:martinique:` | -| 😷 | `:mask:` | -| 💆 | `:massage:` | -| 💆‍♂ | `:massage_man:` | -| 💆‍♀ | `:massage_woman:` | -| 🧉 | `:mate:` | -| 🇲‍🇷 | `:mauritania:` | -| 🇲‍🇺 | `:mauritius:` | -| 🇾‍🇹 | `:mayotte:` | -| 🍖 | `:meat_on_bone:` | -| 🧑‍🔧 | `:mechanic:` | -| 🦾 | `:mechanical_arm:` | -| 🦿 | `:mechanical_leg:` | -| 🎖 | `:medal_military:` | -| 🏅 | `:medal_sports:` | -| ⚕ | `:medical_symbol:` | -| 📣 | `:mega:` | -| 🍈 | `:melon:` | -| 🫠 | `:melting_face:` | -| 📝 | `:memo:` | -| 🤼‍♂ | `:men_wrestling:` | -| ❤‍🩹 | `:mending_heart:` | -| 🕎 | `:menorah:` | -| 🚹 | `:mens:` | -| 🧜‍♀ | `:mermaid:` | -| 🧜‍♂ | `:merman:` | -| 🧜 | `:merperson:` | -| 🤘 | `:metal:` | -| 🚇 | `:metro:` | -| 🇲‍🇽 | `:mexico:` | -| 🦠 | `:microbe:` | -| 🇫‍🇲 | `:micronesia:` | -| 🎤 | `:microphone:` | -| 🔬 | `:microscope:` | -| 🖕 | `:middle_finger:` | -| 🪖 | `:military_helmet:` | -| 🥛 | `:milk_glass:` | -| 🌌 | `:milky_way:` | -| 🚐 | `:minibus:` | -| 💽 | `:minidisc:` | -| 🪞 | `:mirror:` | -| 🪩 | `:mirror_ball:` | -| 📴 | `:mobile_phone_off:` | -| 🇲‍🇩 | `:moldova:` | -| 🇲‍🇨 | `:monaco:` | -| 🤑 | `:money_mouth_face:` | -| 💸 | `:money_with_wings:` | -| 💰 | `:moneybag:` | -| 🇲‍🇳 | `:mongolia:` | -| 🐒 | `:monkey:` | -| 🐵 | `:monkey_face:` | -| 🧐 | `:monocle_face:` | -| 🚝 | `:monorail:` | -| 🇲‍🇪 | `:montenegro:` | -| 🇲‍🇸 | `:montserrat:` | -| 🌔 | `:moon:` | -| 🥮 | `:moon_cake:` | -| 🫎 | `:moose:` | -| 🇲‍🇦 | `:morocco:` | -| 🎓 | `:mortar_board:` | -| 🕌 | `:mosque:` | -| 🦟 | `:mosquito:` | -| 🛥 | `:motor_boat:` | -| 🛵 | `:motor_scooter:` | -| 🏍 | `:motorcycle:` | -| 🦼 | `:motorized_wheelchair:` | -| 🛣 | `:motorway:` | -| 🗻 | `:mount_fuji:` | -| ⛰ | `:mountain:` | -| 🚵 | `:mountain_bicyclist:` | -| 🚵‍♂ | `:mountain_biking_man:` | -| 🚵‍♀ | `:mountain_biking_woman:` | -| 🚠 | `:mountain_cableway:` | -| 🚞 | `:mountain_railway:` | -| 🏔 | `:mountain_snow:` | -| 🐭 | `:mouse:` | -| 🪤 | `:mouse_trap:` | -| 🐁 | `:mouse2:` | -| 🎥 | `:movie_camera:` | -| 🗿 | `:moyai:` | -| 🇲‍🇿 | `:mozambique:` | -| 🤶 | `:mrs_claus:` | -| 💪 | `:muscle:` | -| 🍄 | `:mushroom:` | -| 🎹 | `:musical_keyboard:` | -| 🎵 | `:musical_note:` | -| 🎼 | `:musical_score:` | -| 🔇 | `:mute:` | -| 🧑‍🎄 | `:mx_claus:` | -| 🇲‍🇲 | `:myanmar:` | -| 💅 | `:nail_care:` | -| 📛 | `:name_badge:` | -| 🇳‍🇦 | `:namibia:` | -| 🏞 | `:national_park:` | -| 🇳‍🇷 | `:nauru:` | -| 🤢 | `:nauseated_face:` | -| 🧿 | `:nazar_amulet:` | -| 👔 | `:necktie:` | -| ❎ | `:negative_squared_cross_mark:` | -| 🇳‍🇵 | `:nepal:` | -| 🤓 | `:nerd_face:` | -| 🪺 | `:nest_with_eggs:` | -| 🪆 | `:nesting_dolls:` | -| 🇳‍🇱 | `:netherlands:` | -| 😐 | `:neutral_face:` | -| 🆕 | `:new:` | -| 🇳‍🇨 | `:new_caledonia:` | -| 🌑 | `:new_moon:` | -| 🌚 | `:new_moon_with_face:` | -| 🇳‍🇿 | `:new_zealand:` | -| 📰 | `:newspaper:` | -| 🗞 | `:newspaper_roll:` | -| ⏭ | `:next_track_button:` | -| 🆖 | `:ng:` | -| 🙅‍♂ | `:ng_man:` | -| 🙅‍♀ | `:ng_woman:` | -| 🇳‍🇮 | `:nicaragua:` | -| 🇳‍🇪 | `:niger:` | -| 🇳‍🇬 | `:nigeria:` | -| 🌃 | `:night_with_stars:` | -| 9‍⃣ | `:nine:` | -| 🥷 | `:ninja:` | -| 🇳‍🇺 | `:niue:` | -| 🔕 | `:no_bell:` | -| 🚳 | `:no_bicycles:` | -| ⛔ | `:no_entry:` | -| 🚫 | `:no_entry_sign:` | -| 🙅 | `:no_good:` | -| 🙅‍♂ | `:no_good_man:` | -| 🙅‍♀ | `:no_good_woman:` | -| 📵 | `:no_mobile_phones:` | -| 😶 | `:no_mouth:` | -| 🚷 | `:no_pedestrians:` | -| 🚭 | `:no_smoking:` | -| 🚱 | `:non-potable_water:` | -| 🇳‍🇫 | `:norfolk_island:` | -| 🇰‍🇵 | `:north_korea:` | -| 🇲‍🇵 | `:northern_mariana_islands:` | -| 🇳‍🇴 | `:norway:` | -| 👃 | `:nose:` | -| 📓 | `:notebook:` | -| 📔 | `:notebook_with_decorative_cover:` | -| 🎶 | `:notes:` | -| 🔩 | `:nut_and_bolt:` | -| ⭕ | `:o:` | -| 🅾 | `:o2:` | -| 🌊 | `:ocean:` | -| 🐙 | `:octopus:` | -| 🍢 | `:oden:` | -| 🏢 | `:office:` | -| 🧑‍💼 | `:office_worker:` | -| 🛢 | `:oil_drum:` | -| 🆗 | `:ok:` | -| 👌 | `:ok_hand:` | -| 🙆‍♂ | `:ok_man:` | -| 🙆 | `:ok_person:` | -| 🙆‍♀ | `:ok_woman:` | -| 🗝 | `:old_key:` | -| 🧓 | `:older_adult:` | -| 👴 | `:older_man:` | -| 👵 | `:older_woman:` | -| 🫒 | `:olive:` | -| 🕉 | `:om:` | -| 🇴‍🇲 | `:oman:` | -| 🔛 | `:on:` | -| 🚘 | `:oncoming_automobile:` | -| 🚍 | `:oncoming_bus:` | -| 🚔 | `:oncoming_police_car:` | -| 🚖 | `:oncoming_taxi:` | -| 1‍⃣ | `:one:` | -| 🩱 | `:one_piece_swimsuit:` | -| 🧅 | `:onion:` | -| 📖 | `:open_book:` | -| 📂 | `:open_file_folder:` | -| 👐 | `:open_hands:` | -| 😮 | `:open_mouth:` | -| ☂ | `:open_umbrella:` | -| ⛎ | `:ophiuchus:` | -| 🍊 | `:orange:` | -| 📙 | `:orange_book:` | -| 🟠 | `:orange_circle:` | -| 🧡 | `:orange_heart:` | -| 🟧 | `:orange_square:` | -| 🦧 | `:orangutan:` | -| ☦ | `:orthodox_cross:` | -| 🦦 | `:otter:` | -| 📤 | `:outbox_tray:` | -| 🦉 | `:owl:` | -| 🐂 | `:ox:` | -| 🦪 | `:oyster:` | -| 📦 | `:package:` | -| 📄 | `:page_facing_up:` | -| 📃 | `:page_with_curl:` | -| 📟 | `:pager:` | -| 🖌 | `:paintbrush:` | -| 🇵‍🇰 | `:pakistan:` | -| 🇵‍🇼 | `:palau:` | -| 🇵‍🇸 | `:palestinian_territories:` | -| 🫳 | `:palm_down_hand:` | -| 🌴 | `:palm_tree:` | -| 🫴 | `:palm_up_hand:` | -| 🤲 | `:palms_up_together:` | -| 🇵‍🇦 | `:panama:` | -| 🥞 | `:pancakes:` | -| 🐼 | `:panda_face:` | -| 📎 | `:paperclip:` | -| 🖇 | `:paperclips:` | -| 🇵‍🇬 | `:papua_new_guinea:` | -| 🪂 | `:parachute:` | -| 🇵‍🇾 | `:paraguay:` | -| ⛱ | `:parasol_on_ground:` | -| 🅿 | `:parking:` | -| 🦜 | `:parrot:` | -| 〽 | `:part_alternation_mark:` | -| ⛅ | `:partly_sunny:` | -| 🥳 | `:partying_face:` | -| 🛳 | `:passenger_ship:` | -| 🛂 | `:passport_control:` | -| ⏸ | `:pause_button:` | -| 🐾 | `:paw_prints:` | -| 🫛 | `:pea_pod:` | -| ☮ | `:peace_symbol:` | -| 🍑 | `:peach:` | -| 🦚 | `:peacock:` | -| 🥜 | `:peanuts:` | -| 🍐 | `:pear:` | -| 🖊 | `:pen:` | -| 📝 | `:pencil:` | -| ✏ | `:pencil2:` | -| 🐧 | `:penguin:` | -| 😔 | `:pensive:` | -| 🧑‍🤝‍🧑 | `:people_holding_hands:` | -| 🫂 | `:people_hugging:` | -| 🎭 | `:performing_arts:` | -| 😣 | `:persevere:` | -| 🧑‍🦲 | `:person_bald:` | -| 🧑‍🦱 | `:person_curly_hair:` | -| 🧑‍🍼 | `:person_feeding_baby:` | -| 🤺 | `:person_fencing:` | -| 🧑‍🦽 | `:person_in_manual_wheelchair:` | -| 🧑‍🦼 | `:person_in_motorized_wheelchair:` | -| 🤵 | `:person_in_tuxedo:` | -| 🧑‍🦰 | `:person_red_hair:` | -| 🧑‍🦳 | `:person_white_hair:` | -| 🫅 | `:person_with_crown:` | -| 🧑‍🦯 | `:person_with_probing_cane:` | -| 👳 | `:person_with_turban:` | -| 👰 | `:person_with_veil:` | -| 🇵‍🇪 | `:peru:` | -| 🧫 | `:petri_dish:` | -| 🇵‍🇭 | `:philippines:` | -| ☎ | `:phone:` | -| ⛏ | `:pick:` | -| 🛻 | `:pickup_truck:` | -| 🥧 | `:pie:` | -| 🐷 | `:pig:` | -| 🐽 | `:pig_nose:` | -| 🐖 | `:pig2:` | -| 💊 | `:pill:` | -| 🧑‍✈ | `:pilot:` | -| 🪅 | `:pinata:` | -| 🤌 | `:pinched_fingers:` | -| 🤏 | `:pinching_hand:` | -| 🍍 | `:pineapple:` | -| 🏓 | `:ping_pong:` | -| 🩷 | `:pink_heart:` | -| 🏴‍☠ | `:pirate_flag:` | -| ♓ | `:pisces:` | -| 🇵‍🇳 | `:pitcairn_islands:` | -| 🍕 | `:pizza:` | -| 🪧 | `:placard:` | -| 🛐 | `:place_of_worship:` | -| 🍽 | `:plate_with_cutlery:` | -| ⏯ | `:play_or_pause_button:` | -| 🛝 | `:playground_slide:` | -| 🥺 | `:pleading_face:` | -| 🪠 | `:plunger:` | -| 👇 | `:point_down:` | -| 👈 | `:point_left:` | -| 👉 | `:point_right:` | -| ☝ | `:point_up:` | -| 👆 | `:point_up_2:` | -| 🇵‍🇱 | `:poland:` | -| 🐻‍❄ | `:polar_bear:` | -| 🚓 | `:police_car:` | -| 👮 | `:police_officer:` | -| 👮‍♂ | `:policeman:` | -| 👮‍♀ | `:policewoman:` | -| 🐩 | `:poodle:` | -| 💩 | `:poop:` | -| 🍿 | `:popcorn:` | -| 🇵‍🇹 | `:portugal:` | -| 🏣 | `:post_office:` | -| 📯 | `:postal_horn:` | -| 📮 | `:postbox:` | -| 🚰 | `:potable_water:` | -| 🥔 | `:potato:` | -| 🪴 | `:potted_plant:` | -| 👝 | `:pouch:` | -| 🍗 | `:poultry_leg:` | -| 💷 | `:pound:` | -| 🫗 | `:pouring_liquid:` | -| 😡 | `:pout:` | -| 😾 | `:pouting_cat:` | -| 🙎 | `:pouting_face:` | -| 🙎‍♂ | `:pouting_man:` | -| 🙎‍♀ | `:pouting_woman:` | -| 🙏 | `:pray:` | -| 📿 | `:prayer_beads:` | -| 🫃 | `:pregnant_man:` | -| 🫄 | `:pregnant_person:` | -| 🤰 | `:pregnant_woman:` | -| 🥨 | `:pretzel:` | -| ⏮ | `:previous_track_button:` | -| 🤴 | `:prince:` | -| 👸 | `:princess:` | -| 🖨 | `:printer:` | -| 🦯 | `:probing_cane:` | -| 🇵‍🇷 | `:puerto_rico:` | -| 👊 | `:punch:` | -| 🟣 | `:purple_circle:` | -| 💜 | `:purple_heart:` | -| 🟪 | `:purple_square:` | -| 👛 | `:purse:` | -| 📌 | `:pushpin:` | -| 🚮 | `:put_litter_in_its_place:` | -| 🇶‍🇦 | `:qatar:` | -| ❓ | `:question:` | -| 🐰 | `:rabbit:` | -| 🐇 | `:rabbit2:` | -| 🦝 | `:raccoon:` | -| 🐎 | `:racehorse:` | -| 🏎 | `:racing_car:` | -| 📻 | `:radio:` | -| 🔘 | `:radio_button:` | -| ☢ | `:radioactive:` | -| 😡 | `:rage:` | -| 🚃 | `:railway_car:` | -| 🛤 | `:railway_track:` | -| 🌈 | `:rainbow:` | -| 🏳‍🌈 | `:rainbow_flag:` | -| 🤚 | `:raised_back_of_hand:` | -| 🤨 | `:raised_eyebrow:` | -| ✋ | `:raised_hand:` | -| 🖐 | `:raised_hand_with_fingers_splayed:` | -| 🙌 | `:raised_hands:` | -| 🙋 | `:raising_hand:` | -| 🙋‍♂ | `:raising_hand_man:` | -| 🙋‍♀ | `:raising_hand_woman:` | -| 🐏 | `:ram:` | -| 🍜 | `:ramen:` | -| 🐀 | `:rat:` | -| 🪒 | `:razor:` | -| 🧾 | `:receipt:` | -| ⏺ | `:record_button:` | -| ♻ | `:recycle:` | -| 🚗 | `:red_car:` | -| 🔴 | `:red_circle:` | -| 🧧 | `:red_envelope:` | -| 👨‍🦰 | `:red_haired_man:` | -| 👩‍🦰 | `:red_haired_woman:` | -| 🟥 | `:red_square:` | -| ® | `:registered:` | -| ☺ | `:relaxed:` | -| 😌 | `:relieved:` | -| 🎗 | `:reminder_ribbon:` | -| 🔁 | `:repeat:` | -| 🔂 | `:repeat_one:` | -| ⛑ | `:rescue_worker_helmet:` | -| 🚻 | `:restroom:` | -| 🇷‍🇪 | `:reunion:` | -| 💞 | `:revolving_hearts:` | -| ⏪ | `:rewind:` | -| 🦏 | `:rhinoceros:` | -| 🎀 | `:ribbon:` | -| 🍚 | `:rice:` | -| 🍙 | `:rice_ball:` | -| 🍘 | `:rice_cracker:` | -| 🎑 | `:rice_scene:` | -| 🗯 | `:right_anger_bubble:` | -| 🫱 | `:rightwards_hand:` | -| 🫸 | `:rightwards_pushing_hand:` | -| 💍 | `:ring:` | -| 🛟 | `:ring_buoy:` | -| 🪐 | `:ringed_planet:` | -| 🤖 | `:robot:` | -| 🪨 | `:rock:` | -| 🚀 | `:rocket:` | -| 🤣 | `:rofl:` | -| 🙄 | `:roll_eyes:` | -| 🧻 | `:roll_of_paper:` | -| 🎢 | `:roller_coaster:` | -| 🛼 | `:roller_skate:` | -| 🇷‍🇴 | `:romania:` | -| 🐓 | `:rooster:` | -| 🌹 | `:rose:` | -| 🏵 | `:rosette:` | -| 🚨 | `:rotating_light:` | -| 📍 | `:round_pushpin:` | -| 🚣 | `:rowboat:` | -| 🚣‍♂ | `:rowing_man:` | -| 🚣‍♀ | `:rowing_woman:` | -| 🇷‍🇺 | `:ru:` | -| 🏉 | `:rugby_football:` | -| 🏃 | `:runner:` | -| 🏃 | `:running:` | -| 🏃‍♂ | `:running_man:` | -| 🎽 | `:running_shirt_with_sash:` | -| 🏃‍♀ | `:running_woman:` | -| 🇷‍🇼 | `:rwanda:` | -| 🈂 | `:sa:` | -| 🧷 | `:safety_pin:` | -| 🦺 | `:safety_vest:` | -| ♐ | `:sagittarius:` | -| ⛵ | `:sailboat:` | -| 🍶 | `:sake:` | -| 🧂 | `:salt:` | -| 🫡 | `:saluting_face:` | -| 🇼‍🇸 | `:samoa:` | -| 🇸‍🇲 | `:san_marino:` | -| 👡 | `:sandal:` | -| 🥪 | `:sandwich:` | -| 🎅 | `:santa:` | -| 🇸‍🇹 | `:sao_tome_principe:` | -| 🥻 | `:sari:` | -| 💁‍♂ | `:sassy_man:` | -| 💁‍♀ | `:sassy_woman:` | -| 📡 | `:satellite:` | -| 😆 | `:satisfied:` | -| 🇸‍🇦 | `:saudi_arabia:` | -| 🧖‍♂ | `:sauna_man:` | -| 🧖 | `:sauna_person:` | -| 🧖‍♀ | `:sauna_woman:` | -| 🦕 | `:sauropod:` | -| 🎷 | `:saxophone:` | -| 🧣 | `:scarf:` | -| 🏫 | `:school:` | -| 🎒 | `:school_satchel:` | -| 🧑‍🔬 | `:scientist:` | -| ✂ | `:scissors:` | -| 🦂 | `:scorpion:` | -| ♏ | `:scorpius:` | -| 🏴‍󠁧‍󠁢‍󠁳‍󠁣‍󠁴‍󠁿 | `:scotland:` | -| 😱 | `:scream:` | -| 🙀 | `:scream_cat:` | -| 🪛 | `:screwdriver:` | -| 📜 | `:scroll:` | -| 🦭 | `:seal:` | -| 💺 | `:seat:` | -| ㊙ | `:secret:` | -| 🙈 | `:see_no_evil:` | -| 🌱 | `:seedling:` | -| 🤳 | `:selfie:` | -| 🇸‍🇳 | `:senegal:` | -| 🇷‍🇸 | `:serbia:` | -| 🐕‍🦺 | `:service_dog:` | -| 7‍⃣ | `:seven:` | -| 🪡 | `:sewing_needle:` | -| 🇸‍🇨 | `:seychelles:` | -| 🫨 | `:shaking_face:` | -| 🥘 | `:shallow_pan_of_food:` | -| ☘ | `:shamrock:` | -| 🦈 | `:shark:` | -| 🍧 | `:shaved_ice:` | -| 🐑 | `:sheep:` | -| 🐚 | `:shell:` | -| 🛡 | `:shield:` | -| ⛩ | `:shinto_shrine:` | -| 🚢 | `:ship:` | -| 👕 | `:shirt:` | -| 💩 | `:shit:` | -| 👞 | `:shoe:` | -| 🛍 | `:shopping:` | -| 🛒 | `:shopping_cart:` | -| 🩳 | `:shorts:` | -| 🚿 | `:shower:` | -| 🦐 | `:shrimp:` | -| 🤷 | `:shrug:` | -| 🤫 | `:shushing_face:` | -| 🇸‍🇱 | `:sierra_leone:` | -| 📶 | `:signal_strength:` | -| 🇸‍🇬 | `:singapore:` | -| 🧑‍🎤 | `:singer:` | -| 🇸‍🇽 | `:sint_maarten:` | -| 6‍⃣ | `:six:` | -| 🔯 | `:six_pointed_star:` | -| 🛹 | `:skateboard:` | -| 🎿 | `:ski:` | -| ⛷ | `:skier:` | -| 💀 | `:skull:` | -| ☠ | `:skull_and_crossbones:` | -| 🦨 | `:skunk:` | -| 🛷 | `:sled:` | -| 😴 | `:sleeping:` | -| 🛌 | `:sleeping_bed:` | -| 😪 | `:sleepy:` | -| 🙁 | `:slightly_frowning_face:` | -| 🙂 | `:slightly_smiling_face:` | -| 🎰 | `:slot_machine:` | -| 🦥 | `:sloth:` | -| 🇸‍🇰 | `:slovakia:` | -| 🇸‍🇮 | `:slovenia:` | -| 🛩 | `:small_airplane:` | -| 🔹 | `:small_blue_diamond:` | -| 🔸 | `:small_orange_diamond:` | -| 🔺 | `:small_red_triangle:` | -| 🔻 | `:small_red_triangle_down:` | -| 😄 | `:smile:` | -| 😸 | `:smile_cat:` | -| 😃 | `:smiley:` | -| 😺 | `:smiley_cat:` | -| 🥲 | `:smiling_face_with_tear:` | -| 🥰 | `:smiling_face_with_three_hearts:` | -| 😈 | `:smiling_imp:` | -| 😏 | `:smirk:` | -| 😼 | `:smirk_cat:` | -| 🚬 | `:smoking:` | -| 🐌 | `:snail:` | -| 🐍 | `:snake:` | -| 🤧 | `:sneezing_face:` | -| 🏂 | `:snowboarder:` | -| ❄ | `:snowflake:` | -| ⛄ | `:snowman:` | -| ☃ | `:snowman_with_snow:` | -| 🧼 | `:soap:` | -| 😭 | `:sob:` | -| ⚽ | `:soccer:` | -| 🧦 | `:socks:` | -| 🥎 | `:softball:` | -| 🇸‍🇧 | `:solomon_islands:` | -| 🇸‍🇴 | `:somalia:` | -| 🔜 | `:soon:` | -| 🆘 | `:sos:` | -| 🔉 | `:sound:` | -| 🇿‍🇦 | `:south_africa:` | -| 🇬‍🇸 | `:south_georgia_south_sandwich_islands:` | -| 🇸‍🇸 | `:south_sudan:` | -| 👾 | `:space_invader:` | -| ♠ | `:spades:` | -| 🍝 | `:spaghetti:` | -| ❇ | `:sparkle:` | -| 🎇 | `:sparkler:` | -| ✨ | `:sparkles:` | -| 💖 | `:sparkling_heart:` | -| 🙊 | `:speak_no_evil:` | -| 🔈 | `:speaker:` | -| 🗣 | `:speaking_head:` | -| 💬 | `:speech_balloon:` | -| 🚤 | `:speedboat:` | -| 🕷 | `:spider:` | -| 🕸 | `:spider_web:` | -| 🗓 | `:spiral_calendar:` | -| 🗒 | `:spiral_notepad:` | -| 🧽 | `:sponge:` | -| 🥄 | `:spoon:` | -| 🦑 | `:squid:` | -| 🇱‍🇰 | `:sri_lanka:` | -| 🇧‍🇱 | `:st_barthelemy:` | -| 🇸‍🇭 | `:st_helena:` | -| 🇰‍🇳 | `:st_kitts_nevis:` | -| 🇱‍🇨 | `:st_lucia:` | -| 🇲‍🇫 | `:st_martin:` | -| 🇵‍🇲 | `:st_pierre_miquelon:` | -| 🇻‍🇨 | `:st_vincent_grenadines:` | -| 🏟 | `:stadium:` | -| 🧍‍♂ | `:standing_man:` | -| 🧍 | `:standing_person:` | -| 🧍‍♀ | `:standing_woman:` | -| ⭐ | `:star:` | -| ☪ | `:star_and_crescent:` | -| ✡ | `:star_of_david:` | -| 🤩 | `:star_struck:` | -| 🌟 | `:star2:` | -| 🌠 | `:stars:` | -| 🚉 | `:station:` | -| 🗽 | `:statue_of_liberty:` | -| 🚂 | `:steam_locomotive:` | -| 🩺 | `:stethoscope:` | -| 🍲 | `:stew:` | -| ⏹ | `:stop_button:` | -| 🛑 | `:stop_sign:` | -| ⏱ | `:stopwatch:` | -| 📏 | `:straight_ruler:` | -| 🍓 | `:strawberry:` | -| 😛 | `:stuck_out_tongue:` | -| 😝 | `:stuck_out_tongue_closed_eyes:` | -| 😜 | `:stuck_out_tongue_winking_eye:` | -| 🧑‍🎓 | `:student:` | -| 🎙 | `:studio_microphone:` | -| 🥙 | `:stuffed_flatbread:` | -| 🇸‍🇩 | `:sudan:` | -| 🌥 | `:sun_behind_large_cloud:` | -| 🌦 | `:sun_behind_rain_cloud:` | -| 🌤 | `:sun_behind_small_cloud:` | -| 🌞 | `:sun_with_face:` | -| 🌻 | `:sunflower:` | -| 😎 | `:sunglasses:` | -| ☀ | `:sunny:` | -| 🌅 | `:sunrise:` | -| 🌄 | `:sunrise_over_mountains:` | -| 🦸 | `:superhero:` | -| 🦸‍♂ | `:superhero_man:` | -| 🦸‍♀ | `:superhero_woman:` | -| 🦹 | `:supervillain:` | -| 🦹‍♂ | `:supervillain_man:` | -| 🦹‍♀ | `:supervillain_woman:` | -| 🏄 | `:surfer:` | -| 🏄‍♂ | `:surfing_man:` | -| 🏄‍♀ | `:surfing_woman:` | -| 🇸‍🇷 | `:suriname:` | -| 🍣 | `:sushi:` | -| 🚟 | `:suspension_railway:` | -| 🇸‍🇯 | `:svalbard_jan_mayen:` | -| 🦢 | `:swan:` | -| 🇸‍🇿 | `:swaziland:` | -| 😓 | `:sweat:` | -| 💦 | `:sweat_drops:` | -| 😅 | `:sweat_smile:` | -| 🇸‍🇪 | `:sweden:` | -| 🍠 | `:sweet_potato:` | -| 🩲 | `:swim_brief:` | -| 🏊 | `:swimmer:` | -| 🏊‍♂ | `:swimming_man:` | -| 🏊‍♀ | `:swimming_woman:` | -| 🇨‍🇭 | `:switzerland:` | -| 🔣 | `:symbols:` | -| 🕍 | `:synagogue:` | -| 🇸‍🇾 | `:syria:` | -| 💉 | `:syringe:` | -| 🦖 | `:t-rex:` | -| 🌮 | `:taco:` | -| 🎉 | `:tada:` | -| 🇹‍🇼 | `:taiwan:` | -| 🇹‍🇯 | `:tajikistan:` | -| 🥡 | `:takeout_box:` | -| 🫔 | `:tamale:` | -| 🎋 | `:tanabata_tree:` | -| 🍊 | `:tangerine:` | -| 🇹‍🇿 | `:tanzania:` | -| ♉ | `:taurus:` | -| 🚕 | `:taxi:` | -| 🍵 | `:tea:` | -| 🧑‍🏫 | `:teacher:` | -| 🫖 | `:teapot:` | -| 🧑‍💻 | `:technologist:` | -| 🧸 | `:teddy_bear:` | -| ☎ | `:telephone:` | -| 📞 | `:telephone_receiver:` | -| 🔭 | `:telescope:` | -| 🎾 | `:tennis:` | -| ⛺ | `:tent:` | -| 🧪 | `:test_tube:` | -| 🇹‍🇭 | `:thailand:` | -| 🌡 | `:thermometer:` | -| 🤔 | `:thinking:` | -| 🩴 | `:thong_sandal:` | -| 💭 | `:thought_balloon:` | -| 🧵 | `:thread:` | -| 3‍⃣ | `:three:` | -| 👎 | `:thumbsdown:` | -| 👍 | `:thumbsup:` | -| 🎫 | `:ticket:` | -| 🎟 | `:tickets:` | -| 🐯 | `:tiger:` | -| 🐅 | `:tiger2:` | -| ⏲ | `:timer_clock:` | -| 🇹‍🇱 | `:timor_leste:` | -| 💁‍♂ | `:tipping_hand_man:` | -| 💁 | `:tipping_hand_person:` | -| 💁‍♀ | `:tipping_hand_woman:` | -| 😫 | `:tired_face:` | -| ™ | `:tm:` | -| 🇹‍🇬 | `:togo:` | -| 🚽 | `:toilet:` | -| 🇹‍🇰 | `:tokelau:` | -| 🗼 | `:tokyo_tower:` | -| 🍅 | `:tomato:` | -| 🇹‍🇴 | `:tonga:` | -| 👅 | `:tongue:` | -| 🧰 | `:toolbox:` | -| 🦷 | `:tooth:` | -| 🪥 | `:toothbrush:` | -| 🔝 | `:top:` | -| 🎩 | `:tophat:` | -| 🌪 | `:tornado:` | -| 🇹‍🇷 | `:tr:` | -| 🖲 | `:trackball:` | -| 🚜 | `:tractor:` | -| 🚥 | `:traffic_light:` | -| 🚋 | `:train:` | -| 🚆 | `:train2:` | -| 🚊 | `:tram:` | -| 🏳‍⚧ | `:transgender_flag:` | -| ⚧ | `:transgender_symbol:` | -| 🚩 | `:triangular_flag_on_post:` | -| 📐 | `:triangular_ruler:` | -| 🔱 | `:trident:` | -| 🇹‍🇹 | `:trinidad_tobago:` | -| 🇹‍🇦 | `:tristan_da_cunha:` | -| 😤 | `:triumph:` | -| 🧌 | `:troll:` | -| 🚎 | `:trolleybus:` | -| 🏆 | `:trophy:` | -| 🍹 | `:tropical_drink:` | -| 🐠 | `:tropical_fish:` | -| 🚚 | `:truck:` | -| 🎺 | `:trumpet:` | -| 👕 | `:tshirt:` | -| 🌷 | `:tulip:` | -| 🥃 | `:tumbler_glass:` | -| 🇹‍🇳 | `:tunisia:` | -| 🦃 | `:turkey:` | -| 🇹‍🇲 | `:turkmenistan:` | -| 🇹‍🇨 | `:turks_caicos_islands:` | -| 🐢 | `:turtle:` | -| 🇹‍🇻 | `:tuvalu:` | -| 📺 | `:tv:` | -| 🔀 | `:twisted_rightwards_arrows:` | -| 2‍⃣ | `:two:` | -| 💕 | `:two_hearts:` | -| 👬 | `:two_men_holding_hands:` | -| 👭 | `:two_women_holding_hands:` | -| 🈹 | `:u5272:` | -| 🈴 | `:u5408:` | -| 🈺 | `:u55b6:` | -| 🈯 | `:u6307:` | -| 🈷 | `:u6708:` | -| 🈶 | `:u6709:` | -| 🈵 | `:u6e80:` | -| 🈚 | `:u7121:` | -| 🈸 | `:u7533:` | -| 🈲 | `:u7981:` | -| 🈳 | `:u7a7a:` | -| 🇺‍🇬 | `:uganda:` | -| 🇬‍🇧 | `:uk:` | -| 🇺‍🇦 | `:ukraine:` | -| ☔ | `:umbrella:` | -| 😒 | `:unamused:` | -| 🔞 | `:underage:` | -| 🦄 | `:unicorn:` | -| 🇦‍🇪 | `:united_arab_emirates:` | -| 🇺‍🇳 | `:united_nations:` | -| 🔓 | `:unlock:` | -| 🆙 | `:up:` | -| 🙃 | `:upside_down_face:` | -| 🇺‍🇾 | `:uruguay:` | -| 🇺‍🇸 | `:us:` | -| 🇺‍🇲 | `:us_outlying_islands:` | -| 🇻‍🇮 | `:us_virgin_islands:` | -| 🇺‍🇿 | `:uzbekistan:` | -| ✌ | `:v:` | -| 🧛 | `:vampire:` | -| 🧛‍♂ | `:vampire_man:` | -| 🧛‍♀ | `:vampire_woman:` | -| 🇻‍🇺 | `:vanuatu:` | -| 🇻‍🇦 | `:vatican_city:` | -| 🇻‍🇪 | `:venezuela:` | -| 🚦 | `:vertical_traffic_light:` | -| 📼 | `:vhs:` | -| 📳 | `:vibration_mode:` | -| 📹 | `:video_camera:` | -| 🎮 | `:video_game:` | -| 🇻‍🇳 | `:vietnam:` | -| 🎻 | `:violin:` | -| ♍ | `:virgo:` | -| 🌋 | `:volcano:` | -| 🏐 | `:volleyball:` | -| 🤮 | `:vomiting_face:` | -| 🆚 | `:vs:` | -| 🖖 | `:vulcan_salute:` | -| 🧇 | `:waffle:` | -| 🏴‍󠁧‍󠁢‍󠁷‍󠁬‍󠁳‍󠁿 | `:wales:` | -| 🚶 | `:walking:` | -| 🚶‍♂ | `:walking_man:` | -| 🚶‍♀ | `:walking_woman:` | -| 🇼‍🇫 | `:wallis_futuna:` | -| 🌘 | `:waning_crescent_moon:` | -| 🌖 | `:waning_gibbous_moon:` | -| ⚠ | `:warning:` | -| 🗑 | `:wastebasket:` | -| ⌚ | `:watch:` | -| 🐃 | `:water_buffalo:` | -| 🤽 | `:water_polo:` | -| 🍉 | `:watermelon:` | -| 👋 | `:wave:` | -| 〰 | `:wavy_dash:` | -| 🌒 | `:waxing_crescent_moon:` | -| 🌔 | `:waxing_gibbous_moon:` | -| 🚾 | `:wc:` | -| 😩 | `:weary:` | -| 💒 | `:wedding:` | -| 🏋 | `:weight_lifting:` | -| 🏋‍♂ | `:weight_lifting_man:` | -| 🏋‍♀ | `:weight_lifting_woman:` | -| 🇪‍🇭 | `:western_sahara:` | -| 🐳 | `:whale:` | -| 🐋 | `:whale2:` | -| 🛞 | `:wheel:` | -| ☸ | `:wheel_of_dharma:` | -| ♿ | `:wheelchair:` | -| ✅ | `:white_check_mark:` | -| ⚪ | `:white_circle:` | -| 🏳 | `:white_flag:` | -| 💮 | `:white_flower:` | -| 👨‍🦳 | `:white_haired_man:` | -| 👩‍🦳 | `:white_haired_woman:` | -| 🤍 | `:white_heart:` | -| ⬜ | `:white_large_square:` | -| ◽ | `:white_medium_small_square:` | -| ◻ | `:white_medium_square:` | -| ▫ | `:white_small_square:` | -| 🔳 | `:white_square_button:` | -| 🥀 | `:wilted_flower:` | -| 🎐 | `:wind_chime:` | -| 🌬 | `:wind_face:` | -| 🪟 | `:window:` | -| 🍷 | `:wine_glass:` | -| 🪽 | `:wing:` | -| 😉 | `:wink:` | -| 🛜 | `:wireless:` | -| 🐺 | `:wolf:` | -| 👩 | `:woman:` | -| 👩‍🎨 | `:woman_artist:` | -| 👩‍🚀 | `:woman_astronaut:` | -| 🧔‍♀ | `:woman_beard:` | -| 🤸‍♀ | `:woman_cartwheeling:` | -| 👩‍🍳 | `:woman_cook:` | -| 💃 | `:woman_dancing:` | -| 🤦‍♀ | `:woman_facepalming:` | -| 👩‍🏭 | `:woman_factory_worker:` | -| 👩‍🌾 | `:woman_farmer:` | -| 👩‍🍼 | `:woman_feeding_baby:` | -| 👩‍🚒 | `:woman_firefighter:` | -| 👩‍⚕ | `:woman_health_worker:` | -| 👩‍🦽 | `:woman_in_manual_wheelchair:` | -| 👩‍🦼 | `:woman_in_motorized_wheelchair:` | -| 🤵‍♀ | `:woman_in_tuxedo:` | -| 👩‍⚖ | `:woman_judge:` | -| 🤹‍♀ | `:woman_juggling:` | -| 👩‍🔧 | `:woman_mechanic:` | -| 👩‍💼 | `:woman_office_worker:` | -| 👩‍✈ | `:woman_pilot:` | -| 🤾‍♀ | `:woman_playing_handball:` | -| 🤽‍♀ | `:woman_playing_water_polo:` | -| 👩‍🔬 | `:woman_scientist:` | -| 🤷‍♀ | `:woman_shrugging:` | -| 👩‍🎤 | `:woman_singer:` | -| 👩‍🎓 | `:woman_student:` | -| 👩‍🏫 | `:woman_teacher:` | -| 👩‍💻 | `:woman_technologist:` | -| 🧕 | `:woman_with_headscarf:` | -| 👩‍🦯 | `:woman_with_probing_cane:` | -| 👳‍♀ | `:woman_with_turban:` | -| 👰‍♀ | `:woman_with_veil:` | -| 👚 | `:womans_clothes:` | -| 👒 | `:womans_hat:` | -| 🤼‍♀ | `:women_wrestling:` | -| 🚺 | `:womens:` | -| 🪵 | `:wood:` | -| 🥴 | `:woozy_face:` | -| 🗺 | `:world_map:` | -| 🪱 | `:worm:` | -| 😟 | `:worried:` | -| 🔧 | `:wrench:` | -| 🤼 | `:wrestling:` | -| ✍ | `:writing_hand:` | -| ❌ | `:x:` | -| 🩻 | `:x_ray:` | -| 🧶 | `:yarn:` | -| 🥱 | `:yawning_face:` | -| 🟡 | `:yellow_circle:` | -| 💛 | `:yellow_heart:` | -| 🟨 | `:yellow_square:` | -| 🇾‍🇪 | `:yemen:` | -| 💴 | `:yen:` | -| ☯ | `:yin_yang:` | -| 🪀 | `:yo_yo:` | -| 😋 | `:yum:` | -| 🇿‍🇲 | `:zambia:` | -| 🤪 | `:zany_face:` | -| ⚡ | `:zap:` | -| 🦓 | `:zebra:` | -| 0‍⃣ | `:zero:` | -| 🇿‍🇼 | `:zimbabwe:` | -| 🤐 | `:zipper_mouth_face:` | -| 🧟 | `:zombie:` | -| 🧟‍♂ | `:zombie_man:` | -| 🧟‍♀ | `:zombie_woman:` | -| 💤 | `:zzz:` | + diff --git a/website/en/book/elements/readalong.md b/website/en/book/elements/readalong.md index 1d119b33..27417218 100644 --- a/website/en/book/elements/readalong.md +++ b/website/en/book/elements/readalong.md @@ -7,7 +7,28 @@ permaid: readalong The read-along directive allows you to create interactive reading experiences where text is highlighted as audio plays. Users can follow along word-by-word and click on words to jump to specific parts of the audio. -## Basic Usage +## Modes + +The directive supports two modes: + +### Text-to-Speech (TTS) Mode + +Use the browser's built-in text-to-speech engine to automatically generate audio: + +```markdown +:::readalong{mode="tts"} +This text will be spoken by the browser's text-to-speech engine. +Each word will be highlighted as it is spoken. +::: +``` + +:::readalong{mode="tts"} +This is a demonstration using text-to-speech. The browser will read this text aloud and highlight each word as it speaks. Click on any word to jump to that part. +::: + +### Manual Mode (Audio File) + +Use a pre-recorded audio file with optional timestamps: ```markdown :::readalong{src="/audio.mp3" autoGenerate="true"} @@ -17,9 +38,19 @@ You can include multiple sentences and paragraphs. ``` :::readalong{src="/Free_Test_Data_1MB_MP3.mp3" autoGenerate="true" speed="120"} -This is a demonstration of the read-along feature. Each word will be highlighted as the audio plays. Click on any word to jump to that part of the audio. The synchronization is automatically generated based on reading speed. +This is a demonstration with an audio file. Each word will be highlighted as the audio plays. Click on any word to jump to that part of the audio. The synchronization is automatically generated based on reading speed. ::: +## Configuration Options + +| Option | Type | Default | Description | +|--------|------|---------|-------------| +| `mode` | string | "manual" | Mode: "tts" for text-to-speech or "manual" for audio file | +| `src` | string | required (manual mode) | Path to the audio file (MP3, WAV, OGG, M4A) | +| `autoGenerate` | boolean | false | Enable automatic timestamp generation (manual mode) | +| `speed` | number | 150 | Reading speed in words per minute or TTS rate | +| `timestamps` | JSON | null | Manual timestamps array with `{word, start, end}` objects | + ## With Manual Timestamps If you have precise timestamps from tools like OpenAI Whisper, you can provide them as JSON: @@ -30,15 +61,6 @@ Hello world ::: ``` -## Configuration Options - -| Option | Type | Default | Description | -|--------|------|---------|-------------| -| `src` | string | required | Path to the audio file (MP3, WAV, OGG, M4A) | -| `autoGenerate` | boolean | false | Enable automatic timestamp generation | -| `speed` | number | 150 | Reading speed in words per minute (when autoGenerate is true) | -| `timestamps` | JSON | null | Manual timestamps array with `{word, start, end}` objects | - ## Features - **Play/Pause Control**: Interactive button to control audio playback @@ -64,11 +86,17 @@ And a third paragraph for good measure. ## Tips -- Use `autoGenerate="true"` for quick setup without manual timestamps -- Adjust `speed` to match the actual reading pace of your audio +- Use `mode="tts"` for quick setup without audio files - the browser will read the text +- Use `autoGenerate="true"` with audio files for quick setup without manual timestamps +- Adjust `speed` to match the actual reading pace of your audio or TTS rate - For best results with manual timestamps, ensure they match your text exactly - Supported audio formats: MP3, WAV, OGG, M4A (any HTML5-compatible format) +- TTS mode works best in Chrome, Edge, and Safari browsers + +:::alert{info} +**TTS Mode**: No audio file needed! The browser's text-to-speech engine will read your content automatically. Perfect for quick prototyping or accessibility features. +::: :::alert{warn} -The read-along directive requires an audio file. Make sure the audio path is correct and accessible. +**Manual Mode**: An audio file is required. Make sure the audio path is correct and accessible. :::