Bigmoji

name

Bigmoji

description

Insert big emojis into your notes. Supports custom emojis.

icon

emoji_emotions

instructions

This plugin allows users to insert big emojis into their notes. It supports custom emojis and has size selection.

To insert an emoji, select the "Insert emoji" option from the expression menu.



To modify an emoji, select the "Modify emoji" option from the expression menu.


Demo video: https://vimeo.com/1028142650


linkBigmoji (v1.0.0)


linkCode

/***
* Source Code: https://github.com/debanjandhar12/my-amplenote-plugins-v2
* Author: debajandhar12
* Build: production
* Character Count: 51652 (0.052 M)
* Target Folder: src-bigmoji
***/
(() => {
// common-utils/embed-comunication.js
var COMMON_EMBED_COMMANDS = {
navigate: async (app, url) => {
if (await app.navigate(url)) return !0;
try {
return window.open(url, "_blank") != null;
} catch {
return !1;
}
},
prompt: async (app, ...args) => await app.prompt(...args),
alert: async (app, ...args) => await app.alert(...args),
getSettings: async (app) => app.settings,
setSetting: async (app, key, value) => app.setSetting(key, value),
getNoteTitleByUUID: async (app, noteUUID) => {
var _a;
return (_a = await app.notes.find(noteUUID)) == null ? void 0 : _a.name;
},
getNoteContentByUUID: async (app, noteUUID) => await app.notes.find(noteUUID) ? await app.getNoteContent({ uuid: noteUUID }) : null,
getNoteBacklinksByUUID: async (app, noteUUID) => {
var _a;
return await ((_a = await app.notes.find(noteUUID)) == null ? void 0 : _a.backlinks());
},
getNoteTagsByUUID: async (app, noteUUID) => {
var _a;
return (_a = await app.notes.find(noteUUID)) == null ? void 0 : _a.tags;
},
getNoteSections: async (app, ...args) => await app.getNoteSections(...args),
insertTask: async (app, ...args) => await app.insertTask(...args),
updateTask: async (app, ...args) => await app.updateTask(...args),
createNote: async (app, ...args) => await app.createNote(...args),
deleteNote: async (app, ...args) => await app.deleteNote(...args),
replaceNoteContent: async (app, ...args) => await app.replaceNoteContent(...args),
setNoteName: async (app, ...args) => await app.setNoteName(...args),
addNoteTag: async (app, ...args) => await app.addNoteTag(...args),
removeNoteTag: async (app, ...args) => await app.removeNoteTag(...args),
insertNoteContent: async (app, ...args) => await app.insertNoteContent(...args),
getTaskDomains: async (app) => await app.getTaskDomains(),
getTaskDomainTasks: async (app, ...args) => await app.getTaskDomainTasks(...args),
getTask: async (app, ...args) => await app.getTask(...args),
findNote: async (app, ...args) => await app.findNote(...args),
filterNotes: async (app, ...args) => await app.filterNotes(...args),
saveFile: async (app, ...args) => {
try {
let { name, data } = args[0];
return data.startsWith("data:") && (data = await (await fetch(data)).blob()), await app.saveFile(data, name);
} catch (e) {
throw e.message;
}
}
};
function createOnEmbedCallHandler(embedCommands = {}, logBlacklistedCommands = []) {
return async function(app, commandName, ...args) {
try {
if (commandName in embedCommands) {
let result = await embedCommands[commandName](app, ...args);
return logBlacklistedCommands.includes(commandName) || console.log("onEmbedCall:", commandName, args, result), result;
}
} catch (e) {
throw app.alert("Error:", e.message || e), console.error("onEmbedCall:", commandName, args, e), e;
}
throw new Error(`Unknown command: ${commandName}`);
};
}
 
// common-utils/embed-helpers.js
var addScriptToHtmlString = (htmlString, scriptContent) => {
let doc = new DOMParser().parseFromString(htmlString, "text/html"), script = doc.createElement("script");
script.textContent = scriptContent;
let head = doc.head;
return head.firstChild ? head.insertBefore(script, head.firstChild) : head.appendChild(script), doc.documentElement.outerHTML.replaceAll("\\x3Cscript>", () => "<script>");
}, addWindowVariableToHtmlString = (htmlString, variableName, variableValue) => {
let scriptContent = `window.${variableName} = ${JSON.stringify(variableValue)};`;
return addScriptToHtmlString(htmlString, scriptContent);
};
 
// inline-html:/home/deban/Documents/Projects/my-amplenote-plugins-v2/src-bigmoji/embed/emoji.html
var emoji_default = `<html lang="en">
<head>
<title>Emoji</title>
</head>
<body>
<div class="app-container"></div>
<script>(() => {
// package.json
var package_default = {
name: "amplenote-plugin-dev-env",
author: "debajandhar12",
version: "1.0.0",
type: "module",
repository: "https://github.com/debanjandhar12/my-amplenote-plugins-v2",
dependencies: {
"@ai-sdk/anthropic": "1.2.10",
"@ai-sdk/fireworks": "0.2.13",
"@ai-sdk/google": "1.2.14",
"@ai-sdk/groq": "1.2.8",
"@ai-sdk/openai": "1.3.21",
"@assistant-ui/react": "0.7.65",
"@assistant-ui/react-markdown": "0.7.16",
"@debanjandhar12/markmap-lib": "0.17.0-mod.3",
"@debanjandhar12/markmap-toolbar": "0.17.0-mod.3",
"@debanjandhar12/markmap-view": "0.17.0-mod.3",
"@duckdb/duckdb-wasm": "1.29.1-dev269.0",
"@emoji-mart/data": "^1.2.1",
"@emoji-mart/react": "^1.1.1",
"@huggingface/transformers": "3.2.4",
"@omnivore-app/api": "^1.0.4",
"@pinecone-database/pinecone": "4.1.0",
"@radix-ui/react-icons": "1.3.2",
"@radix-ui/themes": "3.2.0",
"@yiuayiu/telegram-markdown-escape": "^0.0.2-1",
ai: "4.3.13",
"apache-arrow": "^20.0.0",
"async-mutex": "0.5.0",
"chart.js": "^4.4.3",
"d3-svg-to-png": "^0.3.1",
"date-fns": "^3.6.0",
dayjs: "1.11.13",
"easy-web-worker": "7.0.2",
"emoji-mart": "^5.6.0",
"fast-dotproduct": "1.3.0",
fflate: "0.8.2",
fparser: "^3.1.0",
"fuse.js": "7.0.0",
idb: "8.0.2",
"iconv-lite": "^0.6.3",
"lodash-es": "^4.17.21",
luxon: "^3.4.4",
"markdown-it": "^14.1.0",
"mdast-util-to-string": "4.0.0",
"my-ample-plugin-external": "1.0.29",
nanoid: "^5.0.7",
"ollama-ai-provider": "1.2.0",
"parquetjs-lite": "^0.8.7",
react: "18.2.0",
"react-dom": "18.2.0",
"react-error-boundary": "5.0.0",
"react-string-diff": "0.2.0",
"react-virtuoso": "4.12.5",
"react-window": "1.8.11",
"remark-frontmatter": "5.0.0",
"remark-gfm": "4.0.0",
"remark-parse": "11.0.0",
"scheduler-polyfill": "^1.3.0",
stopword: "^3.1.5",
tributejs: "5.1.3",
unified: "11.0.0",
"unist-util-visit": "5.0.0",
"unist-util-visit-parents": "6.0.1",
zod: "3.23.8"
},
devDependencies: {
"@huggingface/transformers": "3.2.4",
"@playwright/test": "^1.49.1",
"@testing-library/jest-dom": "^6.5.0",
"@testing-library/react": "^16.0.1",
"@types/jest": "^29.5.0",
"core-js": "^3.38.1",
cors: "^2.8.5",
"cross-fetch": "^4.0.0",
dotenv: "^16.0.3",
esbuild: "0.25.3",
"esbuild-jest2": "0.6.7",
"esbuild-plugin-external-global": "^1.0.1",
"esbuild-plugins-node-modules-polyfill": "1.7.0",
express: "^5.0.1",
"isomorphic-fetch": "^3.0.0",
jest: "^29.5.0",
"jest-environment-jsdom": "^29.5.0",
"jest-html-reporter": "^4.1.0",
jsdom: "^24.1.0",
"make-synchronous": "^1.0.0",
"node-fetch": "4.0.0-beta.4",
"p-retry": "6.2.1",
playwright: "^1.49.1"
},
scripts: {
test: "jest --testPathPattern=src-bigmoji",
"test:watch": "jest --testPathPattern=src-bigmoji --watch",
"build:prod": "NODE_ENV=production node esbuild.js $(pwd)/src-bigmoji",
"build:dev": "node esbuild.js $(pwd)/src-bigmoji --watch --server"
}
};
 
// common-utils/dynamic-import-esm.js
var dynamicImportExternalPluginBundle = async (fileName) => {
let packageVersion = package_default.dependencies["my-ample-plugin-external"], pkg = \`my-ample-plugin-external/dist/\${fileName}\`, cdnList = getCDNList(pkg), abortController = new AbortController(), importPromises = cdnList.map(async (cdn, index) => {
let url = buildCDNUrl(cdn, pkg, packageVersion);
if (index > 0 && await new Promise((resolve) => setTimeout(resolve, 1e3)), abortController.signal.aborted)
throw new Error(\`Terminating as \${pkg} has already been imported\`);
return import(url).then((module) => {
if (abortController.signal.aborted)
throw new Error(\`Terminating as \${pkg} has already been imported\`);
return { module, url };
}).catch((e) => {
throw console.warn(\`Failed to import \${pkg} from \${cdn}: \${e.message}\`), e;
});
});
try {
let result = await Promise.any(importPromises);
abortController.abort();
let module = result.module;
if (!module.versions)
throw new Error(\`Failed to import module: \${fileName}. Returned bundle does not have version property.\`);
for (let [key, value] of Object.entries(module.versions))
if (value !== package_default.dependencies[key])
throw new Error(\`Failed to import module: \${fileName}. Version mismatch for \${key} (expected: \${package_default.dependencies[key]}, actual: \${value})\`);
return console.log(\`Imported \${pkg}@\${packageVersion} from \${result.url}\`), module.default;
} catch {
throw new Error(\`Failed to import \${pkg} from all available CDNs\`);
}
};
function getBasePackage(pkg) {
if (pkg.startsWith("@")) {
let [scope, name] = pkg.split("/");
return \`\${scope}/\${name}\`;
}
return pkg.split("/")[0];
}
function getPackageFolderString(pkg) {
let folders = [];
return pkg.startsWith("@") ? [, , ...folders] = pkg.split("/") : [, ...folders] = pkg.split("/"), folders && folders.length > 0 ? \`/\${folders.join("/")}\` : "";
}
function getCDNList(pkg) {
let basePkg = getBasePackage(pkg);
return basePkg.includes("react") || basePkg.includes("radix") || basePkg.includes("build") || basePkg.includes("dotenv") ? ["https://esm.sh/", "https://legacy.esm.sh/"] : ["https://cdn.jsdelivr.net/npm/", "https://esm.sh/"];
}
function buildCDNUrl(cdn, pkg, version) {
let basePkg = getBasePackage(pkg), versionString = version !== "latest" ? \`@\${version}\` : "", folderString = getPackageFolderString(pkg), url = new URL(\`\${cdn}\${basePkg}\${versionString}\${folderString}\`);
if (cdn !== "https://esm.sh/" && (basePkg.includes("react") || basePkg.includes("radix")) && !pkg.endsWith(".css"))
throw new Error(\`React based js packages is not supported in \${cdn}\`);
if (cdn !== "https://legacy.esm.sh/" && basePkg.includes("build"))
throw new Error(\`Build API package is not supported in \${cdn}\`);
cdn === "https://esm.sh/" && (basePkg !== "react-dom" && basePkg !== "react" && url.searchParams.set("bundle-deps", !1), !pkg.endsWith(".css") && pkg !== "build" && url.searchParams.set("deps", \`react@\${package_default.dependencies.react},react-dom@\${package_default.dependencies["react-dom"]}\`));
let urlString = url.toString();
return cdn === "https://cdn.jsdelivr.net/npm/" && !pkg.endsWith(".css") && (urlString += "/+esm"), urlString;
}
 
// common-utils/embed-comunication.js
function createCallAmplenotePluginMock(embedCommandsMock) {
return async (commandName, ...args) => {
if (commandName in embedCommandsMock)
return await embedCommandsMock[commandName](...args);
throw new Error(\`Unknown command: \${commandName}\`);
};
}
function deserializeWithFunctions(str) {
return JSON.parse(str, (key, value) => {
if (typeof value == "string" && value.startsWith("__FUNCTION:")) {
let functionBody = value.slice(11);
return new Function(\`return \${functionBody}\`)();
}
return value;
});
}
 
// src-bigmoji/embed/pages/EmojiPickerPage.jsx
var EmojiPickerPage = ({ onSelectEmoji, onAddCustomEmoji, initialSearch }) => {
let [data, setData] = React.useState(null);
setTimeout(() => setData(window.EmojiData), 1);
let [customEmojis, setCustomEmojis] = React.useState([]), pickerRef = React.useRef(), fetchCustomEmojis = async () => {
let customEmojis2 = await window.callAmplenotePlugin("getCustomEmojis");
if (setCustomEmojis(customEmojis2), pickerRef.current) {
let searchElement = document.getElementsByTagName("em-emoji-picker")[0].shadowRoot.querySelector(".search > input[type=search]");
searchElement && (await new Promise((resolve) => setTimeout(resolve, 320)), searchElement.dispatchEvent(new Event("input")));
}
}, handleAddCustomEmojiAndRefresh = async (emoji) => {
await onAddCustomEmoji(emoji), await fetchCustomEmojis();
}, addCustomEmojiInsertButton = async () => {
if (pickerRef.current) {
let searchContainer = document.getElementsByTagName("em-emoji-picker")[0].shadowRoot.querySelector(".search");
if (searchContainer && !document.getElementsByTagName("em-emoji-picker")[0].shadowRoot.querySelector("#custom-emoji-insert")) {
let button = document.createElement("button");
button.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512"><path d="M240 120v120H120c-8.8 0-16 7.2-16 16s7.2 16 16 16h120v120c0 8.8 7.2 16 16 16s16-7.2 16-16V272h120c8.8 0 16-7.2 16-16s-7.2-16-16-16H272V120c0-8.8-7.2-16-16-16s-16 7.2-16 16z"></path></svg>', button.style.marginLeft = "8px", button.title = "Add custom emoji", button.id = "custom-emoji-insert", button.onclick = async () => {
await handleAddCustomEmojiAndRefresh();
}, searchContainer.parentElement.appendChild(button);
}
}
}, setDefaultSearchValue = async () => {
if (pickerRef.current && initialSearch) {
let searchElement = document.getElementsByTagName("em-emoji-picker")[0].shadowRoot.querySelector(".search > input[type=search]");
searchElement && (searchElement.value = initialSearch, searchElement.dispatchEvent(new Event("input")));
}
};
return window.React.useEffect(() => {
fetchCustomEmojis();
}, []), window.React.useEffect(() => {
addCustomEmojiInsertButton(), setDefaultSearchValue(), setTimeout(addCustomEmojiInsertButton, 320), setTimeout(setDefaultSearchValue, 320);
}, [data, pickerRef]), window.Picker && /* @__PURE__ */ React.createElement("div", { ref: pickerRef }, /* @__PURE__ */ React.createElement(
window.Picker,
{
data,
defaultValue: initialSearch,
onEmojiSelect: onSelectEmoji,
theme: "dark",
onAddCustomEmoji: handleAddCustomEmojiAndRefresh,
set: "google",
emojiSize: 36,
skinTonePosition: "none",
emojiButtonSize: 48,
previewPosition: "none",
maxFrequentRows: 1,
dynamicWidth: !0,
custom: [{
id: "custom",
name: "Custom",
emojis: [
...customEmojis
]
}]
}
));
};
 
// src-bigmoji/embed/hooks/useCustomStyles.jsx
var useCustomStyles = () => {
window.React.useEffect(() => {
let style = document.createElement("style");
return style.textContent = \`
body {
margin: 0;
display: grid;
padding: 0;
min-height: 100%;
min-width: 100%;
--em-rgb-background: rgb(21, 22, 23);
}
.app-container {
position: relative;
}
 
/* Emoji Picker Page */
em-emoji-picker {
min-width: 100%;
max-width: 100%;
width: 100%;
min-height: 100vh;
max-height: 100vh;
height: 100%;
--border-radius: 0px;
}
 
/* Emoji Size Page */
.emoji-size-page {
background-color: var(--em-rgb-background);
color: rgb(222, 222, 221);
}
 
.emoji-size-page > h1 {
font-size: 24px;
font-weight: bold;
margin: 0;
padding: 10px;
}
 
.emoji-size-page-container {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
color: white;
}
 
.emoji-size-page-container > div {
display: flex;
flex-direction: column;
align-items: center;
gap: 20px;
margin-bottom: 20px;
}
 
.emoji-size-page-container input[type="radio"] {
display: none;
}
 
.emoji-size-page-container label {
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
}
 
.emoji-size-page-container label img,
.emoji-size-page-container label span {
border: 1px solid transparent;
border-radius: 10%;
padding: 5px;
transition: all 0.2s ease;
}
 
.emoji-size-page-container input[type="radio"]:checked + label img,
.emoji-size-page-container input[type="radio"]:checked + label span {
border-radius: 50%;
background-color: rgba(255, 255, 255, .2);
}
 
.emoji-size-page-container button {
padding: 10px 30px;
background-color: #007bff;
color: white;
border: none;
border-radius: 5px;
cursor: pointer;
font-size: 16px;
margin-top: 20px;
}
 
.emoji-size-page-container button:hover {
background-color: #0056b3;
}
\`, document.head.append(style), () => {
document.head.removeChild(style);
};
}, []);
};
 
// src-bigmoji/embed/utils/getURLFromEmojiCode.jsx
var getURLFromEmojiObj = (emojiObj) => emojiObj.type === "default" ? \`https://cdn.jsdelivr.net/gh/iamcal/emoji-data@15.1.2/img-google-136/\${emojiObj.emojiCode}.png\` : emojiObj.url;
 
// src-bigmoji/embed/pages/EmojiSizePage.jsx
var EmojiSizePage = ({ selectedEmoji, onSubmit, setCurrentPage, setSelectedEmoji }) => {
let [isImageLoaded, setIsImageLoaded] = React.useState(!1), [selectedSize, setSelectedSize] = React.useState(null), [submitButtonName, setSubmitButtonName] = React.useState("Submit");
React.useEffect(() => {
let oldEmojiObj = window.emojiData, newDefaultSize = null;
oldEmojiObj && setSubmitButtonName("Update"), oldEmojiObj && !selectedEmoji.size ? newDefaultSize = oldEmojiObj.size : newDefaultSize = selectedEmoji.size || "32", newDefaultSize === "15" && !selectedEmoji.native && (newDefaultSize = "32"), setSelectedSize(newDefaultSize);
}, []), React.useEffect(() => {
let image = new Image();
image.onload = () => {
setIsImageLoaded(!0);
}, image.src = getURLFromEmojiObj(selectedEmoji);
}, [selectedEmoji]);
let handleSizeChange = (event) => {
setSelectedSize(event.target.value);
};
React.useEffect(() => {
setSelectedEmoji((prevEmoji) => ({
...prevEmoji,
size: selectedSize
}));
}, [selectedSize]);
let handleSubmit = () => {
onSubmit();
};
return /* @__PURE__ */ React.createElement("div", { className: "emoji-size-page" }, /* @__PURE__ */ React.createElement("div", { style: { display: "flex", justifyContent: "space-between", alignItems: "center" } }, /* @__PURE__ */ React.createElement("h1", null, "Select emoji size"), /* @__PURE__ */ React.createElement(
"a",
{
href: "#",
className: "emoji-size-page-back-button",
onClick: (e) => {
e.preventDefault(), setCurrentPage("emoji-picker");
},
style: { textDecoration: "none", color: "#4a90e2", fontSize: "16px", fontWeight: "500", marginRight: "10px" }
},
"\\u2190 Back"
)), isImageLoaded && /* @__PURE__ */ React.createElement("div", { className: "emoji-size-page-container" }, /* @__PURE__ */ React.createElement("div", null, /* @__PURE__ */ React.createElement("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between" } }, selectedEmoji.native ? /* @__PURE__ */ React.createElement(React.Fragment, null, /* @__PURE__ */ React.createElement("input", { type: "radio", name: "size", value: "15", id: "size-15px", onChange: handleSizeChange, checked: selectedSize === "15" }), /* @__PURE__ */ React.createElement("label", { htmlFor: "size-15px" }, /* @__PURE__ */ React.createElement("span", { style: { padding: "10px", marginRight: "10px" } }, selectedEmoji.native))) : null, /* @__PURE__ */ React.createElement("input", { type: "radio", name: "size", value: "32", id: "size-32px", onChange: handleSizeChange, checked: selectedSize === "32" }), /* @__PURE__ */ React.createElement("label", { htmlFor: "size-32px" }, /* @__PURE__ */ React.createElement("img", { src: getURLFromEmojiObj(selectedEmoji), style: { padding: "10px", marginRight: "10px" }, alt: selectedEmoji, width: "32", height: "32" })), /* @__PURE__ */ React.createElement("input", { type: "radio", name: "size", value: "64", id: "size-64px", onChange: handleSizeChange, checked: selectedSize === "64" }), /* @__PURE__ */ React.createElement("label", { htmlFor: "size-64px" }, /* @__PURE__ */ React.createElement("img", { src: getURLFromEmojiObj(selectedEmoji), style: { marginLeft: "10px" }, alt: selectedEmoji, width: "64", height: "64" }))), /* @__PURE__ */ React.createElement("div", { style: { marginTop: "10px" } }, /* @__PURE__ */ React.createElement("input", { type: "radio", name: "size", value: "128", id: "size-128px", onChange: handleSizeChange, checked: selectedSize === "128" }), /* @__PURE__ */ React.createElement("label", { htmlFor: "size-128px" }, /* @__PURE__ */ React.createElement("img", { src: getURLFromEmojiObj(selectedEmoji), alt: selectedEmoji, width: "128", height: "128" })))), /* @__PURE__ */ React.createElement(
"button",
{
className: "emoji-size-page-submit-button",
onClick: handleSubmit
},
submitButtonName
)));
};
 
// common-utils/embed-ui.js
function showEmbedLoader() {
window.LoadingStartTime = performance.now();
let overlay = document.createElement("div");
overlay.id = "embed-loader-overlay", overlay.style.cssText = \`
position: fixed;
top: 0;
left: 0;
width: 100%;
/*height: 100%;*/
background-color: rgba(0, 0, 0, 0.5);
z-index: 9998;
animation: fadeIn 0.3s ease-in-out;
\`;
let loader = document.createElement("div");
loader.id = "embed-loader", loader.style.cssText = \`
position: fixed;
left: 50%;
transform: translate(-50%, 0%);
width: 50px;
height: 50px;
border: 5px solid #f3f3f3;
border-top: 5px solid #3498db;
border-radius: 50%;
animation: spin 1s linear infinite;
z-index: 9999;
\`;
let keyframes = document.createElement("style");
keyframes.textContent = \`
@keyframes spin {
0% { transform: translate(-50%, -50%) rotate(0deg); }
100% { transform: translate(-50%, -50%) rotate(360deg); }
}
@keyframes fadeIn {
from { opacity: 0; }
to { opacity: 1; }
}
\`, document.head.appendChild(keyframes), document.body.appendChild(overlay), document.body.appendChild(loader), overlay.style.display = "none", loader.style.display = "none", setTimeout(() => {
document.getElementById("embed-loader") && (loader.style.display = "block"), document.getElementById("embed-loader-overlay") && (overlay.style.display = "block");
}, 240);
}
function hideEmbedLoader() {
window.LoadingEndTime = performance.now(), console.log("Loading time:", window.LoadingEndTime - window.LoadingStartTime);
let loader = document.getElementById("embed-loader"), overlay = document.getElementById("embed-loader-overlay");
loader && loader.remove(), overlay && overlay.remove();
}
 
// src-bigmoji/embed/emoji.jsx
window.INJECTED_EMBED_COMMANDS_MOCK && (window.callAmplenotePlugin = createCallAmplenotePluginMock(deserializeWithFunctions(window.INJECTED_EMBED_COMMANDS_MOCK))), window.INJECTED_EMOJI_DATA_MOCK && (window.emojiData = deserializeWithFunctions(window.INJECTED_EMOJI_DATA_MOCK));
window.appConnector = new Proxy({}, {
get: function(target, prop, receiver) {
return prop in target ? target[prop] : async function(...args) {
return await window.callAmplenotePlugin(prop, ...args);
};
}
});
window.appSettings = window.appSettings || {};
setInterval(async () => {
document.querySelector(".app-container") && (await window.appConnector.refreshTimeout() || showCloseWindowPage());
}, 100);
var body = document.body, html = document.documentElement;
window.addEventListener("resize", function() {
let iframeHeight = Math.min(html.clientHeight, html.scrollHeight);
body.style.height = iframeHeight - 24 + "px";
});
(async () => {
showEmbedLoader();
let [React2, ReactDOM, Picker, EmojiData] = await dynamicImportExternalPluginBundle("bigmojiUIBundle.js");
if (hideEmbedLoader(), window.React = React2, window.ReactDOM = ReactDOM, window.Picker = Picker.default, window.EmojiData = EmojiData.default, !window.React || !window.ReactDOM)
throw new Error("Failed to load React or ReactDOM");
document.querySelector(".app-container") && window.ReactDOM.createRoot(document.querySelector(".app-container")).render(React2.createElement(App));
})();
var showCloseWindowPage = () => {
document.body.style.backgroundColor = "#192025", document.body.innerHTML = '<span style="color: aliceblue">Please close this window.</span>', window.ReactDOM.unmountComponentAtNode(document.querySelector(".app-container"));
}, App = () => {
let [currentPage, setCurrentPage] = React.useState("emoji-picker"), [emojiObj, setEmojiObj] = React.useState(null);
useCustomStyles();
let getInitialSearch = () => {
var _a, _b;
return emojiObj != null && emojiObj.native ? emojiObj.native : (_a = window.emojiData) != null && _a.native ? window.emojiData.native : (emojiObj == null ? void 0 : emojiObj.emojiCode) || ((_b = window.emojiData) == null ? void 0 : _b.emojiCode);
}, handleEmojiSelect = (emoji) => {
console.log(emoji), setEmojiObj({
emojiUUID: Math.random().toString(36).substring(7),
type: emoji.unified ? "default" : "custom",
emojiCode: emoji.unified || emoji.id,
url: emoji.src,
// will be null if emoji is default
native: emoji.native,
// can be null
size: emojiObj == null ? void 0 : emojiObj.size,
skin: emoji.skin
// this can be null
}), setCurrentPage("emoji-size");
}, handleAddCustomEmoji = async () => new Promise((resolve, reject) => {
let input = document.createElement("input");
input.type = "file", input.accept = ".png, .jpeg", input.style.display = "none", document.body.appendChild(input), input.addEventListener("change", function(event) {
let file = event.target.files[0];
if (file) {
let reader = new FileReader();
reader.onload = async function(e) {
try {
let imageBase64 = e.target.result, emojiId = await appConnector.prompt("Enter emoji name:", {
inputs: [
{ label: "Emoji name", type: "text", value: file.name.replace(/\\.[^/.]+$/, "").replaceAll(" ", "_") }
]
});
(!emojiId || emojiId.trim() === "") && app.alert("Emoji name cannot be empty"), await appConnector.addCustomEmoji(emojiId.replaceAll(/\\s+/g, "_"), imageBase64), resolve();
} catch (error) {
reject(error);
}
}, reader.readAsDataURL(file);
} else
resolve();
}), input.click();
});
return currentPage === "emoji-picker" ? /* @__PURE__ */ React.createElement(
EmojiPickerPage,
{
initialSearch: getInitialSearch(),
onSelectEmoji: handleEmojiSelect,
onAddCustomEmoji: handleAddCustomEmoji
}
) : /* @__PURE__ */ React.createElement(
EmojiSizePage,
{
selectedEmoji: emojiObj,
setSelectedEmoji: setEmojiObj,
onSubmit: () => {
window.appConnector.setEmbedResult({
...emojiObj
}), showCloseWindowPage();
},
setCurrentPage
}
);
};
return plugin;
})()
<\/script>
</body>
</html>`;
 
// src-bigmoji/embed/utils/getURLFromEmojiCode.jsx
var getURLFromEmojiObj = (emojiObj) => emojiObj.type === "default" ? `https://cdn.jsdelivr.net/gh/iamcal/emoji-data@15.1.2/img-google-136/${emojiObj.emojiCode}.png` : emojiObj.url;
 
// node_modules/unist-util-is/lib/index.js
var convert = (
// Note: overloads in JSDoc can’t yet use different `@template`s.
/**
* @type {(
* (<Condition extends string>(test: Condition) => (node: unknown, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) => node is Node & {type: Condition}) &
* (<Condition extends Props>(test: Condition) => (node: unknown, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) => node is Node & Condition) &
* (<Condition extends TestFunction>(test: Condition) => (node: unknown, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) => node is Node & Predicate<Condition, Node>) &
* ((test?: null | undefined) => (node?: unknown, index?: number | null | undefined, parent?: Parent | null | undefined, context?: unknown) => node is Node) &
* ((test?: Test) => Check)
* )}
*/
/**
* @param {Test} [test]
* @returns {Check}
*/
function(test) {
if (test == null)
return ok;
if (typeof test == "function")
return castFactory(test);
if (typeof test == "object")
return Array.isArray(test) ? anyFactory(test) : propsFactory(test);
if (typeof test == "string")
return typeFactory(test);
throw new Error("Expected function, string, or object as test");
}
);
function anyFactory(tests) {
let checks = [], index = -1;
for (; ++index < tests.length; )
checks[index] = convert(tests[index]);
return castFactory(any);
function any(...parameters) {
let index2 = -1;
for (; ++index2 < checks.length; )
if (checks[index2].apply(this, parameters)) return !0;
return !1;
}
}
function propsFactory(check) {
let checkAsRecord = (
/** @type {Record<string, unknown>} */
check
);
return castFactory(all);
function all(node) {
let nodeAsRecord = (
/** @type {Record<string, unknown>} */
/** @type {unknown} */
node
), key;
for (key in check)
if (nodeAsRecord[key] !== checkAsRecord[key]) return !1;
return !0;
}
}
function typeFactory(check) {
return castFactory(type);
function type(node) {
return node && node.type === check;
}
}
function castFactory(testFunction) {
return check;
function check(value, index, parent) {
return !!(looksLikeANode(value) && testFunction.call(
this,
value,
typeof index == "number" ? index : void 0,
parent || void 0
));
}
}
function ok() {
return !0;
}
function looksLikeANode(value) {
return value !== null && typeof value == "object" && "type" in value;
}
 
// node_modules/unist-util-visit-parents/lib/index.js
var empty = [], CONTINUE = !0, EXIT = !1, SKIP = "skip";
function visitParents(tree, test, visitor, reverse) {
let check;
typeof test == "function" && typeof visitor != "function" ? (reverse = visitor, visitor = test) : check = test;
let is2 = convert(check), step = reverse ? -1 : 1;
factory(tree, void 0, [])();
function factory(node, index, parents) {
let value = (
/** @type {Record<string, unknown>} */
node && typeof node == "object" ? node : {}
);
if (typeof value.type == "string") {
let name = (
// `hast`
typeof value.tagName == "string" ? value.tagName : (
// `xast`
typeof value.name == "string" ? value.name : void 0
)
);
Object.defineProperty(visit2, "name", {
value: "node (" + (node.type + (name ? "<" + name + ">" : "")) + ")"
});
}
return visit2;
function visit2() {
let result = empty, subresult, offset, grandparents;
if ((!test || is2(node, index, parents[parents.length - 1] || void 0)) && (result = toResult(visitor(node, parents)), result[0] === EXIT))
return result;
if ("children" in node && node.children) {
let nodeAsParent = (
/** @type {UnistParent} */
node
);
if (nodeAsParent.children && result[0] !== SKIP)
for (offset = (reverse ? nodeAsParent.children.length : -1) + step, grandparents = parents.concat(nodeAsParent); offset > -1 && offset < nodeAsParent.children.length; ) {
let child = nodeAsParent.children[offset];
if (subresult = factory(child, offset, grandparents)(), subresult[0] === EXIT)
return subresult;
offset = typeof subresult[1] == "number" ? subresult[1] : offset + step;
}
}
return result;
}
}
}
function toResult(value) {
return Array.isArray(value) ? value : typeof value == "number" ? [CONTINUE, value] : value == null ? empty : [value];
}
 
// node_modules/unist-util-visit/lib/index.js
function visit(tree, testOrVisitor, visitorOrReverse, maybeReverse) {
let reverse, test, visitor;
typeof testOrVisitor == "function" && typeof visitorOrReverse != "function" ? (test = void 0, visitor = testOrVisitor, reverse = visitorOrReverse) : (test = testOrVisitor, visitor = visitorOrReverse, reverse = maybeReverse), visitParents(tree, test, overload, reverse);
function overload(node, parents) {
let parent = parents[parents.length - 1], index = parent ? parent.children.indexOf(node) : void 0;
return visitor(node, index, parent);
}
}
 
// package.json
var package_default = {
name: "amplenote-plugin-dev-env",
author: "debajandhar12",
version: "1.0.0",
type: "module",
repository: "https://github.com/debanjandhar12/my-amplenote-plugins-v2",
dependencies: {
"@ai-sdk/anthropic": "1.2.10",
"@ai-sdk/fireworks": "0.2.13",
"@ai-sdk/google": "1.2.14",
"@ai-sdk/groq": "1.2.8",
"@ai-sdk/openai": "1.3.21",
"@assistant-ui/react": "0.7.65",
"@assistant-ui/react-markdown": "0.7.16",
"@debanjandhar12/markmap-lib": "0.17.0-mod.3",
"@debanjandhar12/markmap-toolbar": "0.17.0-mod.3",
"@debanjandhar12/markmap-view": "0.17.0-mod.3",
"@duckdb/duckdb-wasm": "1.29.1-dev269.0",
"@emoji-mart/data": "^1.2.1",
"@emoji-mart/react": "^1.1.1",
"@huggingface/transformers": "3.2.4",
"@omnivore-app/api": "^1.0.4",
"@pinecone-database/pinecone": "4.1.0",
"@radix-ui/react-icons": "1.3.2",
"@radix-ui/themes": "3.2.0",
"@yiuayiu/telegram-markdown-escape": "^0.0.2-1",
ai: "4.3.13",
"apache-arrow": "^20.0.0",
"async-mutex": "0.5.0",
"chart.js": "^4.4.3",
"d3-svg-to-png": "^0.3.1",
"date-fns": "^3.6.0",
dayjs: "1.11.13",
"easy-web-worker": "7.0.2",
"emoji-mart": "^5.6.0",
"fast-dotproduct": "1.3.0",
fflate: "0.8.2",
fparser: "^3.1.0",
"fuse.js": "7.0.0",
idb: "8.0.2",
"iconv-lite": "^0.6.3",
"lodash-es": "^4.17.21",
luxon: "^3.4.4",
"markdown-it": "^14.1.0",
"mdast-util-to-string": "4.0.0",
"my-ample-plugin-external": "1.0.29",
nanoid: "^5.0.7",
"ollama-ai-provider": "1.2.0",
"parquetjs-lite": "^0.8.7",
react: "18.2.0",
"react-dom": "18.2.0",
"react-error-boundary": "5.0.0",
"react-string-diff": "0.2.0",
"react-virtuoso": "4.12.5",
"react-window": "1.8.11",
"remark-frontmatter": "5.0.0",
"remark-gfm": "4.0.0",
"remark-parse": "11.0.0",
"scheduler-polyfill": "^1.3.0",
stopword: "^3.1.5",
tributejs: "5.1.3",
unified: "11.0.0",
"unist-util-visit": "5.0.0",
"unist-util-visit-parents": "6.0.1",
zod: "3.23.8"
},
devDependencies: {
"@huggingface/transformers": "3.2.4",
"@playwright/test": "^1.49.1",
"@testing-library/jest-dom": "^6.5.0",
"@testing-library/react": "^16.0.1",
"@types/jest": "^29.5.0",
"core-js": "^3.38.1",
cors: "^2.8.5",
"cross-fetch": "^4.0.0",
dotenv: "^16.0.3",
esbuild: "0.25.3",
"esbuild-jest2": "0.6.7",
"esbuild-plugin-external-global": "^1.0.1",
"esbuild-plugins-node-modules-polyfill": "1.7.0",
express: "^5.0.1",
"isomorphic-fetch": "^3.0.0",
jest: "^29.5.0",
"jest-environment-jsdom": "^29.5.0",
"jest-html-reporter": "^4.1.0",
jsdom: "^24.1.0",
"make-synchronous": "^1.0.0",
"node-fetch": "4.0.0-beta.4",
"p-retry": "6.2.1",
playwright: "^1.49.1"
},
scripts: {
test: "jest --testPathPattern=src-bigmoji",
"test:watch": "jest --testPathPattern=src-bigmoji --watch",
"build:prod": "NODE_ENV=production node esbuild.js $(pwd)/src-bigmoji",
"build:dev": "node esbuild.js $(pwd)/src-bigmoji --watch --server"
}
};
 
// common-utils/dynamic-import-esm.js
var dynamicImportExternalPluginBundle = async (fileName) => {
let packageVersion = package_default.dependencies["my-ample-plugin-external"], pkg = `my-ample-plugin-external/dist/${fileName}`, cdnList = getCDNList(pkg), abortController = new AbortController(), importPromises = cdnList.map(async (cdn, index) => {
let url = buildCDNUrl(cdn, pkg, packageVersion);
if (index > 0 && await new Promise((resolve) => setTimeout(resolve, 1e3)), abortController.signal.aborted)
throw new Error(`Terminating as ${pkg} has already been imported`);
return import(url).then((module) => {
if (abortController.signal.aborted)
throw new Error(`Terminating as ${pkg} has already been imported`);
return { module, url };
}).catch((e) => {
throw console.warn(`Failed to import ${pkg} from ${cdn}: ${e.message}`), e;
});
});
try {
let result = await Promise.any(importPromises);
abortController.abort();
let module = result.module;
if (!module.versions)
throw new Error(`Failed to import module: ${fileName}. Returned bundle does not have version property.`);
for (let [key, value] of Object.entries(module.versions))
if (value !== package_default.dependencies[key])
throw new Error(`Failed to import module: ${fileName}. Version mismatch for ${key} (expected: ${package_default.dependencies[key]}, actual: ${value})`);
return console.log(`Imported ${pkg}@${packageVersion} from ${result.url}`), module.default;
} catch {
throw new Error(`Failed to import ${pkg} from all available CDNs`);
}
};
var dynamicImportESM = async (pkg, pkgVersion = null) => {
let cdnList = getCDNList(pkg), resolvedVersion = resolvePackageVersion(pkg, pkgVersion), abortController = new AbortController(), importPromises = cdnList.map(async (cdn, index) => {
let url = buildCDNUrl(cdn, pkg, resolvedVersion);
if (index > 0 && await new Promise((resolve) => setTimeout(resolve, 1e3)), abortController.signal.aborted)
throw new Error(`Terminating as ${pkg} has already been imported`);
return import(url).then((module) => {
if (abortController.signal.aborted)
throw new Error(`Terminating as ${pkg} has already been imported`);
return { module, url };
}).catch((e) => {
throw console.warn(`Failed to import ${pkg} from ${cdn}: ${e.message}`), e;
});
});
try {
let result = await Promise.any(importPromises);
return abortController.abort(), console.log(`Imported ${pkg}@${resolvedVersion} from ${result.url}`), result.module;
} catch {
throw new Error(`Failed to import ${pkg} from all available CDNs`);
}
};
function getBasePackage(pkg) {
if (pkg.startsWith("@")) {
let [scope, name] = pkg.split("/");
return `${scope}/${name}`;
}
return pkg.split("/")[0];
}
function resolvePackageVersion(pkg, pkgVersion) {
let basePkg = getBasePackage(pkg), version = pkgVersion || package_default.dependencies[basePkg] || package_default.devDependencies[basePkg] || "latest";
return version.startsWith("^") || version.startsWith("~") ? version.substring(1) : version;
}
function getPackageFolderString(pkg) {
let folders = [];
return pkg.startsWith("@") ? [, , ...folders] = pkg.split("/") : [, ...folders] = pkg.split("/"), folders && folders.length > 0 ? `/${folders.join("/")}` : "";
}
function getCDNList(pkg) {
let basePkg = getBasePackage(pkg);
return basePkg.includes("react") || basePkg.includes("radix") || basePkg.includes("build") || basePkg.includes("dotenv") ? ["https://esm.sh/", "https://legacy.esm.sh/"] : ["https://cdn.jsdelivr.net/npm/", "https://esm.sh/"];
}
function buildCDNUrl(cdn, pkg, version) {
let basePkg = getBasePackage(pkg), versionString = version !== "latest" ? `@${version}` : "", folderString = getPackageFolderString(pkg), url = new URL(`${cdn}${basePkg}${versionString}${folderString}`);
if (cdn !== "https://esm.sh/" && (basePkg.includes("react") || basePkg.includes("radix")) && !pkg.endsWith(".css"))
throw new Error(`React based js packages is not supported in ${cdn}`);
if (cdn !== "https://legacy.esm.sh/" && basePkg.includes("build"))
throw new Error(`Build API package is not supported in ${cdn}`);
cdn === "https://esm.sh/" && (basePkg !== "react-dom" && basePkg !== "react" && url.searchParams.set("bundle-deps", !1), !pkg.endsWith(".css") && pkg !== "build" && url.searchParams.set("deps", `react@${package_default.dependencies.react},react-dom@${package_default.dependencies["react-dom"]}`));
let urlString = url.toString();
return cdn === "https://cdn.jsdelivr.net/npm/" && !pkg.endsWith(".css") && (urlString += "/+esm"), urlString;
}
var dynamic_import_esm_default = dynamicImportESM;
 
// src-bigmoji/markdown/parser.js
var remarkGfm, unified, remarkParse, pipe;
async function parse(markdownText) {
return (!remarkGfm || !unified || !remarkParse) && ([remarkGfm, unified, , remarkParse] = await dynamicImportExternalPluginBundle("remarkBundle.js"), unified = unified.unified, remarkGfm = remarkGfm.default, remarkParse = remarkParse.default), pipe || (pipe = unified().use(remarkParse).use(remarkGfm)), await pipe.parse(markdownText);
}
 
// src-bigmoji/markdown/parseMarkdownTable.js
async function parseMarkdownTable(markdownText) {
let result = [], tree = await parse(markdownText);
return visit(tree, "table", (node) => (node.children.forEach((row) => {
let rowData = [];
row.children.forEach((cell) => {
let cellText = "";
visit(cell, "text", (textNode) => {
cellText += textNode.value;
}), visit(cell, "image", (imageNode) => {
cellText += `![](${imageNode.url})`;
}), rowData.push(cellText.trim());
}), result.push(rowData);
}), !1)), result.filter((row) => !row.every((cell) => cell.trim() === ""));
}
 
// src-bigmoji/markdown/getMarkdownFrom2dArray.js
function getMarkdownFrom2dArray(array2d) {
if (!array2d || array2d.length === 0) return "";
let tableHeaders = array2d[0], columnWidths = tableHeaders.map((_, index) => Math.max(...array2d.map((row) => String(row[index]).length))), createRow = (row) => "| " + row.map((cell, index) => {
let cellStr = String(cell);
return cellStr + " ".repeat(columnWidths[index] - cellStr.length);
}).join(" | ") + " |", separatorRow = "| " + columnWidths.map((width) => "-".repeat(width)).join(" | ") + " |";
return [
createRow(tableHeaders),
separatorRow,
...array2d.slice(1).map(createRow)
].join(`
`);
}
 
// src-bigmoji/plugin.js
var plugin = {
embedResult: !1,
waitTimeout: null,
insertText: {
"Insert emoji": async function(app) {
let isSidebarOpenSuccess = await app.openSidebarEmbed(1, null, "sidebar");
isSidebarOpenSuccess || await app.context.replaceSelection(`<object data="plugin://${app.context.pluginUUID}" data-aspect-ratio="1" />`), await plugin._waitForEmbedResult(app), await plugin._handlePluginEmbedResult(app, isSidebarOpenSuccess);
}
},
imageOption: {
"Modify emoji": {
check: (app, image) => {
try {
return !!JSON.parse(decodeURIComponent(image.src.split("?")[1]));
} catch {
}
return !1;
},
run: async (app, image) => {
let emojiObj = JSON.parse(decodeURIComponent(image.src.split("?")[1])), isSidebarOpenSuccess = await app.openSidebarEmbed(1, emojiObj, "sidebar");
isSidebarOpenSuccess || await app.context.replaceSelection(`<object data="plugin://${app.context.pluginUUID}?${encodeURIComponent(JSON.stringify(emojiObj))}" data-aspect-ratio="1" />`), await plugin._waitForEmbedResult(app), await plugin._handlePluginEmbedResult(app, isSidebarOpenSuccess);
}
}
},
replaceText: {
"Modify emoji": {
check: async (app, text) => {
try {
if (!plugin.getEmojiDataFromNative) {
let emojiMartData = (await dynamic_import_esm_default("@emoji-mart/data")).default, { init, getEmojiDataFromNative } = await dynamic_import_esm_default("emoji-mart");
await init({ data: emojiMartData }), plugin.getEmojiDataFromNative = getEmojiDataFromNative;
}
let emojiData = await plugin.getEmojiDataFromNative(text.trim());
return !(!emojiData || !emojiData.unified);
} catch {
}
return !1;
},
run: async (app, text) => {
let emojiObj = {
emojiUUID: Math.random().toString(36).substring(7),
type: "default",
native: (await plugin.getEmojiDataFromNative(text.trim())).native,
emojiCode: (await plugin.getEmojiDataFromNative(text.trim())).unified,
size: "15"
// 15 means native size
}, isSidebarOpenSuccess = await app.openSidebarEmbed(1, emojiObj, "sidebar");
isSidebarOpenSuccess || await app.context.replaceSelection(`<object data="plugin://${app.context.pluginUUID}?${encodeURIComponent(JSON.stringify(emojiObj))}" data-aspect-ratio="1" />`), await plugin._waitForEmbedResult(app), await plugin._handlePluginEmbedResult(app, isSidebarOpenSuccess);
}
}
},
_handlePluginEmbedResult: async function(app, isSidebarOpenSuccess) {
if (plugin.embedResult && isSidebarOpenSuccess)
await app.context.replaceSelection(plugin._getImageMarkdown(plugin.embedResult)) || await app.alert("Failed to insert emoji. Possibly due to user moving selection or note.");
else if (plugin.embedResult && !isSidebarOpenSuccess) {
let currentNote = await app.findNote({ uuid: app.context.noteUUID }), currentNoteContent = await app.getNoteContent({ uuid: currentNote.uuid }), objectTagRegex = new RegExp(`<object data="plugin://${app.context.pluginUUID}.*?" />`, "g");
if (currentNoteContent.match(objectTagRegex)) {
let newNoteContent = currentNoteContent.replace(objectTagRegex, plugin._getImageMarkdown(plugin.embedResult));
await app.replaceNoteContent({ uuid: currentNote.uuid }, newNoteContent);
} else throw new Error("Failed to replace selection with emoji. Possibly due to invalid note content.");
}
},
_waitForEmbedResult: async function(app) {
for (plugin.embedResult = null, plugin.waitTimeout = 1e3; !(plugin.embedResult != null || plugin.waitTimeout <= 0); )
plugin.waitTimeout -= 100, await new Promise((resolve) => setTimeout(resolve, 100));
},
renderEmbed(app, args, source = "embed") {
try {
let emojiObj = args;
return source !== "sidebar" && args && (emojiObj = JSON.parse(decodeURIComponent(args))), addWindowVariableToHtmlString(emoji_default, "emojiData", emojiObj);
} catch (e) {
return console.error(e), "Error parsing object tag";
}
},
_getImageMarkdown: function(emojiObj) {
if (emojiObj.size === "15")
return emojiObj.native;
let url = getURLFromEmojiObj(emojiObj);
return `![|${emojiObj.size}](${url}?${encodeURIComponent(JSON.stringify(emojiObj))}) <!-- dummy comment -->`;
},
_findOrCreateCustomEmojisNote: async function(app) {
let customEmojisNoteTitle = "Custom Bigmojis", customEmojisNote = await app.findNote({ name: customEmojisNoteTitle });
if (!customEmojisNote && (customEmojisNote = await app.notes.create(customEmojisNoteTitle, []), !customEmojisNote || !customEmojisNote.uuid))
throw new Error(`Failed to create dashboard note: ${dashboardNoteTitle}`);
return customEmojisNote = await app.notes.find(customEmojisNote.uuid), customEmojisNote;
},
onEmbedCall: createOnEmbedCallHandler({
...COMMON_EMBED_COMMANDS,
refreshTimeout: async function(app) {
return plugin.waitTimeout > 0 ? (plugin.waitTimeout = 400, !0) : !1;
},
setEmbedResult: async function(app, emojiCode) {
try {
plugin.embedResult = emojiCode;
} catch (e) {
console.error(e), await app.alert(e);
}
},
getCustomEmojis: async function(app) {
let customEmojisNote = await plugin._findOrCreateCustomEmojisNote(app), customEmojis = await app.getNoteContent({ uuid: customEmojisNote.uuid });
return (await parseMarkdownTable(customEmojis)).map((row) => {
row.length !== 2 && console.error(`Possible invalid custom emoji row: ${row}. Will try to proceed.`);
let emojiId = row[0], emojiUrlMatch = row[1].match(/!\[.*?\]\((.*?)\)/), emojiUrl = emojiUrlMatch ? emojiUrlMatch[1] : null;
return !emojiId || !emojiUrl || emojiUrl.trim() === "" || emojiUrl.trim() === "" ? (console.error(`Emoji Id or Emoji URL is missing in row: ${row}.`), null) : emojiUrl.match(/^https?:\/\//) ? {
id: emojiId,
name: emojiId,
skins: [{ src: emojiUrl }]
} : (console.error(`Invalid emoji URL in row: ${row}.`), null);
}).filter((emoji) => emoji);
},
addCustomEmoji: async function(app, emojiId, emojiImgBase64) {
try {
let customEmojisNote = await plugin._findOrCreateCustomEmojisNote(app), customEmojis = await app.getNoteContent({ uuid: customEmojisNote.uuid }), customEmojis2dArray = await parseMarkdownTable(customEmojis), emojiUrl = await app.attachNoteMedia(customEmojisNote.uuid, emojiImgBase64), newEmojis2dArray = [...customEmojis2dArray, [emojiId, `![](${emojiUrl})`]];
newEmojis2dArray[0][0].trim() !== "Emoji ID" && newEmojis2dArray[0][1].trim() !== "Image" && newEmojis2dArray.unshift(["Emoji ID", "Emoji"]);
let newCustomEmojis = getMarkdownFrom2dArray(newEmojis2dArray);
await app.replaceNoteContent({ uuid: customEmojisNote.uuid }, newCustomEmojis);
} catch (e) {
console.error(e), await app.alert(e);
}
}
}, ["refreshTimeout"])
}, plugin_default = plugin;
return plugin;
})()
//# sourceMappingURL=plugin.js.map
 


linkChangelog

13/10/2024 - Initial release
10/11/2024 - UI improvements, unicode emoji support, mobile support

29/03/2025 - Bug fixes