diff --git a/.obsidian/app.json b/.obsidian/app.json
index f8039b1..0676041 100644
--- a/.obsidian/app.json
+++ b/.obsidian/app.json
@@ -1,5 +1,16 @@
{
"legacyEditor": false,
"livePreview": true,
- "attachmentFolderPath": "attachment"
+ "attachmentFolderPath": "attachment",
+ "alwaysUpdateLinks": true,
+ "communityThemeSortOrder": "alphabeticalReverse",
+ "trashOption": "local",
+ "readableLineLength": true,
+ "showLineNumber": true,
+ "rightToLeft": false,
+ "spellcheck": true,
+ "spellcheckLanguages": [
+ "en-GB",
+ "de"
+ ]
}
\ No newline at end of file
diff --git a/.obsidian/appearance.json b/.obsidian/appearance.json
index 2ac78be..4a67afa 100644
--- a/.obsidian/appearance.json
+++ b/.obsidian/appearance.json
@@ -1,3 +1,6 @@
{
- "translucency": true
+ "translucency": true,
+ "baseFontSize": 20,
+ "cssTheme": "",
+ "theme": "obsidian"
}
\ No newline at end of file
diff --git a/.obsidian/community-plugins.json b/.obsidian/community-plugins.json
index 78bdbb6..431e842 100644
--- a/.obsidian/community-plugins.json
+++ b/.obsidian/community-plugins.json
@@ -1,4 +1,5 @@
[
"obsidian-git",
- "table-editor-obsidian"
+ "table-editor-obsidian",
+ "obsidian-image-toolkit"
]
\ No newline at end of file
diff --git a/.obsidian/graph.json b/.obsidian/graph.json
new file mode 100644
index 0000000..f3a92cd
--- /dev/null
+++ b/.obsidian/graph.json
@@ -0,0 +1,22 @@
+{
+ "collapse-filter": true,
+ "search": "",
+ "showTags": false,
+ "showAttachments": false,
+ "hideUnresolved": false,
+ "showOrphans": true,
+ "collapse-color-groups": true,
+ "colorGroups": [],
+ "collapse-display": true,
+ "showArrow": false,
+ "textFadeMultiplier": 0,
+ "nodeSizeMultiplier": 1,
+ "lineSizeMultiplier": 1,
+ "collapse-forces": true,
+ "centerStrength": 0.518713248970312,
+ "repelStrength": 10,
+ "linkStrength": 1,
+ "linkDistance": 250,
+ "scale": 0.4159979812034997,
+ "close": true
+}
\ No newline at end of file
diff --git a/.obsidian/page-preview.json b/.obsidian/page-preview.json
index 1ff1fe9..9e26dfe 100644
--- a/.obsidian/page-preview.json
+++ b/.obsidian/page-preview.json
@@ -1,3 +1 @@
-{
- "editor": false
-}
\ No newline at end of file
+{}
\ No newline at end of file
diff --git a/.obsidian/plugins/obsidian-git/data.json b/.obsidian/plugins/obsidian-git/data.json
index 134ec76..43668d3 100644
--- a/.obsidian/plugins/obsidian-git/data.json
+++ b/.obsidian/plugins/obsidian-git/data.json
@@ -2,7 +2,7 @@
"commitMessage": "vault backup: {{date}}",
"autoCommitMessage": "vault auto-backup: {{date}}",
"commitDateFormat": "DD.MM.YYYY - HH:mm:ss",
- "autoSaveInterval": 5,
+ "autoSaveInterval": 1,
"autoPushInterval": 0,
"autoPullInterval": 5,
"autoPullOnBoot": true,
@@ -14,8 +14,8 @@
"updateSubmodules": false,
"syncMethod": "merge",
"gitPath": "",
- "customMessageOnAutoBackup": true,
- "autoBackupAfterFileChange": false,
+ "customMessageOnAutoBackup": false,
+ "autoBackupAfterFileChange": true,
"treeStructure": false,
"refreshSourceControl": true,
"basePath": "",
diff --git a/.obsidian/plugins/obsidian-image-toolkit/main.js b/.obsidian/plugins/obsidian-image-toolkit/main.js
new file mode 100644
index 0000000..40cc1f4
--- /dev/null
+++ b/.obsidian/plugins/obsidian-image-toolkit/main.js
@@ -0,0 +1,3192 @@
+'use strict';
+
+var obsidian = require('obsidian');
+
+/*! *****************************************************************************
+Copyright (c) Microsoft Corporation.
+
+Permission to use, copy, modify, and/or distribute this software for any
+purpose with or without fee is hereby granted.
+
+THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
+REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
+INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
+OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+PERFORMANCE OF THIS SOFTWARE.
+***************************************************************************** */
+
+function __awaiter(thisArg, _arguments, P, generator) {
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
+ return new (P || (P = Promise))(function (resolve, reject) {
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
+ });
+}
+
+// العربية
+var ar = {};
+
+// čeština
+var cz = {};
+
+// Dansk
+var da = {};
+
+// Deutsch
+var de = {};
+
+// English
+var en = {
+ // settings
+ IMAGE_TOOLKIT_SETTINGS_TITLE: "Image Toolkit Settings",
+ // >>>View Trigger Settings:
+ VIEW_TRIGGER_SETTINGS: 'View Trigger Settings:',
+ VIEW_IMAGE_GLOBAL_NAME: 'Click and view an image globally',
+ VIEW_IMAGE_GLOBAL_DESC: 'You can zoom, rotate, drag, and invert it on the popup layer when clicking an image.',
+ VIEW_IMAGE_EDITOR_NAME: 'Click and view an image in the Editor Area',
+ VIEW_IMAGE_EDITOR_DESC: 'Turn on this option if you want to click and view an image in the Editor Area.',
+ // CPB = COMMUNITY_PLUGINS_BROWSER
+ VIEW_IMAGE_IN_CPB_NAME: 'Click and view an image in the Community Plugins browser',
+ VIEW_IMAGE_IN_CPB_DESC: 'Turn on this option if you want to click and view an image in the Community Plugins browser.',
+ VIEW_IMAGE_WITH_A_LINK_NAME: 'Click and view an image with a link',
+ VIEW_IMAGE_WITH_A_LINK_DESC: 'Turn on this option if you want to click and view an image with a link. (NOTE: The browser will be opened for you to visit the link and the image will be popped up for being viewed at the same time when you click the image.)',
+ VIEW_IMAGE_OTHER_NAME: 'Click and view in the other areas except the above',
+ VIEW_IMAGE_OTHER_DESC: 'Except for the above mentioned, it also supports other areas, e.g. flashcards.',
+ // >>> PIN_MODE_SETTINGS
+ PIN_MODE_SETTINGS: "Pin Mode Settings:",
+ PIN_MODE_NAME: "📌 Pin an image",
+ PIN_MODE_DESC: "You can pin an image onto the top of the screen. And have more options by right click. (press Esc to close the image where your mouse cursor is hovering)",
+ PIN_MAXIMUM_NAME: "The maximum image you can pin",
+ PIN_COVER_NAME: "Cover mode",
+ PIN_COVER_DESC: "After those pinned images reach maximum, you can cover the earliest pinned image when you click an image once again.",
+ // >>>View Detail Settings:
+ VIEW_DETAILS_SETTINGS: 'View Detail Settings:',
+ IMAGE_MOVE_SPEED_NAME: 'Set the moving speed of the image',
+ IMAGE_MOVE_SPEED_DESC: 'When you move an image on the popup layer by keyboard (up, down, left, right), the moving speed of the image can be set here.',
+ IMAGE_TIP_TOGGLE_NAME: "Display the image's zoom number",
+ IMAGE_TIP_TOGGLE_DESC: "Turn on this option if you want to display the zoom number when you zoom the image.",
+ IMG_FULL_SCREEN_MODE_NAME: 'Full-screen preview mode',
+ // preview mode options:
+ FIT: 'Fit',
+ FILL: 'Fill',
+ STRETCH: 'Stretch',
+ IMG_VIEW_BACKGROUND_COLOR_NAME: "Set the background color of the previewed image (Only support the image with transparent background)",
+ // >>>Image Border Settings:
+ IMAGE_BORDER_SETTINGS: 'Image Border Settings:',
+ IMAGE_BORDER_TOGGLE_NAME: "Display the image's border",
+ IMAGE_BORDER_TOGGLE_DESC: "The clicked image's border can be displayed after you exit previewing and close the popup layer.",
+ IMAGE_BORDER_WIDTH_NAME: "Set the image's border width",
+ IMAGE_BORDER_STYLE_NAME: "Set the image's border style",
+ IMAGE_BORDER_COLOR_NAME: "Set the image's border color",
+ // IMG_BORDER_WIDTH options:
+ THIN: 'thin',
+ MEDIUM: 'medium',
+ THICK: 'thick',
+ // IMG_BORDER_STYLE options:
+ //HIDDEN: 'hidden',
+ DOTTED: 'dotted',
+ DASHED: 'dashed',
+ SOLID: 'solid',
+ DOUBLE: 'double',
+ GROOVE: 'groove',
+ RIDGE: 'ridge',
+ INSET: 'inset',
+ OUTSET: 'outset',
+ // IMAGE_BORDER_COLOR_NAME options:
+ BLACK: 'black',
+ BLUE: 'blue',
+ DARK_GREEN: 'dark green',
+ GREEN: 'green',
+ LIME: 'lime',
+ STEEL_BLUE: 'steel blue',
+ INDIGO: 'indigo',
+ PURPLE: 'purple',
+ GRAY: 'gray',
+ DARK_RED: 'dark red',
+ LIGHT_GREEN: 'light green',
+ BROWN: 'brown',
+ LIGHT_BLUE: 'light blue',
+ SILVER: 'silver',
+ RED: 'red',
+ PINK: 'pink',
+ ORANGE: 'orange',
+ GOLD: 'gold',
+ YELLOW: 'yellow',
+ // >>>Gallery Navbar Settings:
+ GALLERY_NAVBAR_SETTINGS: 'Gallery Navbar Settings (Experimental):',
+ GALLERY_NAVBAR_TOGGLE_NAME: "Display gallery navbar",
+ GALLERY_NAVBAR_TOGGLE_DESC: "All of the images in the current pane view can be displayed at the bottom of the popup layer.",
+ GALLERY_NAVBAR_DEFAULT_COLOR_NAME: "Set the background color of the gallery navbar (default state)",
+ GALLERY_NAVBAR_HOVER_COLOR_NAME: "Set the background color of the gallery navbar (hovering state)",
+ GALLERY_IMG_BORDER_TOGGLE_NAME: "Display the selected image on the gallery navbar",
+ GALLERY_IMG_BORDER_TOGGLE_DESC: "When you select an image, the image's border will be displayed, so you can know which image is currently active.",
+ GALLERY_IMG_BORDER_ACTIVE_COLOR_NAME: 'Set the border color of the selected image',
+ // >>>HOTKEYS_SETTINGS:
+ HOTKEY_SETTINGS: "Hotkey Settings:",
+ HOTKEY_SETTINGS_DESC: "📢 You cannot set the same hotkey for 'Move the image' and 'Switch the image' at the same time. (NOT SUPPORT in Pin Mode)",
+ MOVE_THE_IMAGE_NAME: "Set the hotkey for moving the image",
+ MOVE_THE_IMAGE_DESC: "You can move the image on the popup layer by hotkey.",
+ SWITCH_THE_IMAGE_NAME: "Set the hotkey for switching the image",
+ SWITCH_THE_IMAGE_DESC: "You can switch to the previous/next image on the gallery navbar by hotkey. (NOTE: You need to turn on 'Display gallery navbar' first, if you wanna use this hotkey.)",
+ DOUBLE_CLICK_TOOLBAR_NAME: "Double click",
+ VIEW_TRIGGER_HOTKEY_NAME: "Set the hotkey for triggering viewing an image",
+ VIEW_TRIGGER_HOTKEY_DESC: "When you set 'None', you can directly click and preview an image without holding any modifier keys; otherwise, you must hold the configured modifier keys to click and preview an image.",
+ // MODIFIER_HOTKEYS
+ NONE: "None",
+ CTRL: "Ctrl",
+ ALT: "Alt",
+ SHIFT: "Shift",
+ CTRL_ALT: "Ctrl+Alt",
+ CTRL_SHIFT: "Ctrl+Shift",
+ SHIFT_ALT: "Shift+Alt",
+ CTRL_SHIFT_ALT: "Ctrl+Shift+Alt",
+ // toolbar icon title
+ ZOOM_TO_100: "zoom to 100%",
+ ZOOM_IN: "zoom in",
+ ZOOM_OUT: "zoom out",
+ FULL_SCREEN: 'full screen',
+ REFRESH: "refresh",
+ ROTATE_LEFT: "rotate left",
+ ROTATE_RIGHT: "rotate right",
+ SCALE_X: 'flip along x-axis',
+ SCALE_Y: 'flip along y-axis',
+ INVERT_COLOR: 'invert color',
+ COPY: 'copy',
+ CLOSE: 'close',
+ // tip:
+ COPY_IMAGE_SUCCESS: 'Copy the image successfully!',
+ COPY_IMAGE_ERROR: 'Fail to copy the image!'
+};
+
+// British English
+var enGB = {};
+
+// Español
+var es = {};
+
+// français
+var fr = {};
+
+// हिन्दी
+var hi = {};
+
+// Bahasa Indonesia
+var id = {};
+
+// Italiano
+var it = {};
+
+// 日本語
+var ja = {};
+
+// 한국어
+var ko = {};
+
+// Nederlands
+var nl = {};
+
+// Norsk
+var no = {};
+
+// język polski
+var pl = {};
+
+// Português
+var pt = {};
+
+// Português do Brasil
+// Brazilian Portuguese
+var ptBR = {};
+
+// Română
+var ro = {};
+
+// русский
+var ru = {};
+
+// Türkçe
+var tr = {};
+
+// 简体中文
+var zhCN = {
+ // settings
+ IMAGE_TOOLKIT_SETTINGS_TITLE: "Image Toolkit 插件设置",
+ // >>> 预览触发配置:
+ VIEW_TRIGGER_SETTINGS: '预览触发配置:',
+ VIEW_IMAGE_GLOBAL_NAME: '支持全局预览图片',
+ VIEW_IMAGE_GLOBAL_DESC: '开启后,在任何地方点击图片都可以弹出预览界面,可对图片进行缩放、旋转、拖动、和反色等。',
+ VIEW_IMAGE_EDITOR_NAME: '支持在编辑区域预览图片',
+ VIEW_IMAGE_EDITOR_DESC: '开启后,支持在编辑区域,点击图片预览。',
+ // CPB = COMMUNITY_PLUGINS_BROWSER
+ VIEW_IMAGE_IN_CPB_NAME: '支持在社区插件页面预览图片',
+ VIEW_IMAGE_IN_CPB_DESC: '开启后,支持在社区插件页面,点击图片预览。',
+ VIEW_IMAGE_WITH_A_LINK_NAME: '支持预览带链接的图片',
+ VIEW_IMAGE_WITH_A_LINK_DESC: '开启后,支持点击带链接的图片(注意:点击该图片,会同时打开浏览器访问指定地址和弹出预览图片)',
+ VIEW_IMAGE_OTHER_NAME: '支持除上述其他地方来预览图片',
+ VIEW_IMAGE_OTHER_DESC: '除上述支持范围外,还支持一些其他区域,如flashcards。',
+ // >>> PIN_MODE_SETTINGS
+ PIN_MODE_SETTINGS: "贴图模式设置:",
+ PIN_MODE_NAME: "📌 将所点击的图片贴到屏幕上",
+ PIN_MODE_DESC: "你可以将当前所点击的图片贴到屏幕上,并且可以通过右击图片选择更多操作(按 Esc 关闭已贴图片的展示)",
+ PIN_MAXIMUM_NAME: "最大贴图数量",
+ PIN_COVER_NAME: "覆盖模式",
+ PIN_COVER_DESC: "当贴图数量达到最大值后,此时再次点击图片,该图片会覆盖最早弹出的那个贴图。",
+ // >>>查看细节设置:
+ VIEW_DETAILS_SETTINGS: '查看细节设置:',
+ IMAGE_MOVE_SPEED_NAME: '图片移动速度设置',
+ IMAGE_MOVE_SPEED_DESC: '当使用键盘(上、下、左、右)移动图片时,可对图片移动速度进行设置。',
+ IMAGE_TIP_TOGGLE_NAME: "展示缩放比例提示",
+ IMAGE_TIP_TOGGLE_DESC: "开启后,当你缩放图片时会展示当前缩放的比例。",
+ IMG_FULL_SCREEN_MODE_NAME: '全屏预览模式',
+ // 全屏预览模式 下拉:
+ FIT: '自适应',
+ FILL: '填充',
+ STRETCH: '拉伸',
+ IMG_VIEW_BACKGROUND_COLOR_NAME: "设置预览图片的背景色(仅对透明背景的图片生效)",
+ // >>>图片边框设置:
+ IMAGE_BORDER_SETTINGS: '图片边框设置:',
+ IMAGE_BORDER_TOGGLE_NAME: "展示被点击图片的边框",
+ IMAGE_BORDER_TOGGLE_DESC: "当离开图片预览和关闭弹出层后,突出展示被点击图片的边框。",
+ IMAGE_BORDER_WIDTH_NAME: "设置图片边框宽度",
+ IMAGE_BORDER_STYLE_NAME: "设置图片边框样式",
+ IMAGE_BORDER_COLOR_NAME: "设置图片边框颜色",
+ // IMG_BORDER_WIDTH 下拉:
+ THIN: '较细',
+ MEDIUM: '正常',
+ THICK: '较粗',
+ // IMG_BORDER_STYLE 下拉:
+ //HIDDEN: '隐藏',
+ DOTTED: '点状',
+ DASHED: '虚线',
+ SOLID: '实线',
+ DOUBLE: '双线',
+ GROOVE: '凹槽',
+ RIDGE: ' 垄状',
+ INSET: '凹边',
+ OUTSET: '凸边',
+ // IMAGE_BORDER_COLOR_NAME 下拉:
+ BLACK: '黑色',
+ BLUE: '蓝色',
+ DARK_GREEN: '深绿色',
+ GREEN: '绿色',
+ LIME: '淡黄绿色',
+ STEEL_BLUE: '钢青色',
+ INDIGO: '靛蓝色',
+ PURPLE: '紫色',
+ GRAY: '灰色',
+ DARK_RED: '深红色',
+ LIGHT_GREEN: '浅绿色',
+ BROWN: '棕色',
+ LIGHT_BLUE: '浅蓝色',
+ SILVER: '银色',
+ RED: '红色',
+ PINK: '粉红色',
+ ORANGE: '橘黄色',
+ GOLD: '金色',
+ YELLOW: '黄色',
+ // >>>Gallery Navbar Settings:
+ GALLERY_NAVBAR_SETTINGS: '图片导航设置 (体验版):',
+ GALLERY_NAVBAR_TOGGLE_NAME: "展示图片导航",
+ GALLERY_NAVBAR_TOGGLE_DESC: "当前文档的所有图片会展示在弹出层的底部,可随意切换展示不同图片。",
+ GALLERY_NAVBAR_DEFAULT_COLOR_NAME: "设置图片导航底栏背景色(默认展示)",
+ GALLERY_NAVBAR_HOVER_COLOR_NAME: "设置图片导航底栏背景色(鼠标悬浮时)",
+ GALLERY_IMG_BORDER_TOGGLE_NAME: "展示图片导航上被选中的图片",
+ GALLERY_IMG_BORDER_TOGGLE_DESC: "当你选中正查看某一图片,对应图片导航底栏上将突出显示该缩略图片的边框。",
+ GALLERY_IMG_BORDER_ACTIVE_COLOR_NAME: '设置被选中图片的边框色',
+ // >>>HOTKEYS_SETTINGS:
+ HOTKEY_SETTINGS: "快捷键设置:",
+ HOTKEY_SETTINGS_DESC: "📢 你无法为'移动图片'和'切换图片'设置相同的快捷键。(不支持贴图模式)",
+ MOVE_THE_IMAGE_NAME: "为移动图片设置快捷键",
+ MOVE_THE_IMAGE_DESC: "你可以利用快捷键来移动弹出层上的图片。",
+ SWITCH_THE_IMAGE_NAME: "为切换图片设置快捷键",
+ SWITCH_THE_IMAGE_DESC: "你可以利用快捷键来切换在图片导航栏上的图片至上一张/下一张。(注意: 仅当开启“展示图片导航”后,才能使用该快捷键来控制切换图片。)",
+ DOUBLE_CLICK_TOOLBAR_NAME: "双击",
+ VIEW_TRIGGER_HOTKEY_NAME: "为触发弹出查看图片设置快捷键",
+ VIEW_TRIGGER_HOTKEY_DESC: "当你设置为“无”,你可以直接点击预览图片;否则,须按住已配置的修改键(Ctrl、Alt、Shift)才能点击查看某个图片。",
+ // MODIFIER_HOTKEYS
+ NONE: "无",
+ // toolbar icon title
+ ZOOM_TO_100: "缩放至100%",
+ ZOOM_IN: "放大",
+ ZOOM_OUT: "缩小",
+ FULL_SCREEN: "全屏",
+ REFRESH: "刷新",
+ ROTATE_LEFT: "左旋",
+ ROTATE_RIGHT: "右旋",
+ SCALE_X: 'x轴翻转',
+ SCALE_Y: 'y轴翻转',
+ INVERT_COLOR: '反色',
+ COPY: '复制',
+ CLOSE: '关闭',
+ // tip:
+ COPY_IMAGE_SUCCESS: '拷贝图片成功!',
+ COPY_IMAGE_ERROR: '拷贝图片失败!'
+};
+
+// 繁體中文
+var zhTW = {
+ // settings
+ IMAGE_TOOLKIT_SETTINGS_TITLE: "image toolkit 設定",
+ // toolbar icon title
+ ZOOM_IN: "放大",
+ ZOOM_OUT: "縮小",
+ FULL_SCREEN: '全螢幕',
+ REFRESH: "重整",
+ ROTATE_LEFT: "向左旋轉",
+ ROTATE_RIGHT: "向右旋轉",
+ SCALE_X: 'x 軸縮放',
+ SCALE_Y: 'y 軸縮放',
+ INVERT_COLOR: '色彩反轉',
+ COPY: '複製',
+ COPY_IMAGE_SUCCESS: '成功複製圖片!'
+};
+
+const localeMap = {
+ ar,
+ cs: cz,
+ da,
+ de,
+ en,
+ "en-gb": enGB,
+ es,
+ fr,
+ hi,
+ id,
+ it,
+ ja,
+ ko,
+ nl,
+ nn: no,
+ pl,
+ pt,
+ "pt-br": ptBR,
+ ro,
+ ru,
+ tr,
+ "zh-cn": zhCN,
+ "zh-tw": zhTW,
+};
+const locale = localeMap[obsidian.moment.locale()];
+function t(str) {
+ if (!locale) {
+ console.error("Error: Image toolkit locale not found", obsidian.moment.locale());
+ }
+ return (locale && locale[str]) || en[str];
+}
+
+const ZOOM_FACTOR = 0.8;
+const IMG_VIEW_MIN = 30;
+const ICONS = [{
+ id: 'zoom-to-100',
+ svg: `1:1`
+ }];
+const SEPARATOR_SYMBOL = "---";
+const TOOLBAR_CONF = [{
+ title: "ZOOM_TO_100",
+ class: 'toolbar_zoom_to_100',
+ icon: 'zoom-to-100',
+ enableToolbarIcon: true,
+ enableMenu: true,
+ enableHotKey: true
+ }, {
+ title: "ZOOM_IN",
+ class: 'toolbar_zoom_in',
+ icon: 'zoom-in',
+ enableToolbarIcon: true,
+ enableMenu: false,
+ enableHotKey: true
+ }, {
+ title: "ZOOM_OUT",
+ class: 'toolbar_zoom_out',
+ icon: 'zoom-out',
+ enableToolbarIcon: true,
+ enableMenu: false,
+ enableHotKey: true
+ }, {
+ title: "FULL_SCREEN",
+ class: 'toolbar_full_screen',
+ icon: 'expand',
+ enableToolbarIcon: true,
+ enableMenu: true,
+ enableHotKey: true
+ }, {
+ title: "REFRESH",
+ class: 'toolbar_refresh',
+ icon: 'refresh-ccw',
+ enableToolbarIcon: true,
+ enableMenu: true,
+ enableHotKey: true
+ }, {
+ title: "ROTATE_LEFT",
+ class: 'toolbar_rotate_left',
+ icon: 'rotate-ccw',
+ enableToolbarIcon: true,
+ enableMenu: true,
+ enableHotKey: true
+ }, {
+ title: "ROTATE_RIGHT",
+ class: 'toolbar_rotate_right',
+ icon: 'rotate-cw',
+ enableToolbarIcon: true,
+ enableMenu: true,
+ enableHotKey: true
+ }, {
+ title: "SCALE_X",
+ class: 'toolbar_scale_x',
+ icon: 'move-horizontal',
+ enableToolbarIcon: true,
+ enableMenu: true,
+ enableHotKey: true
+ }, {
+ title: "SCALE_Y",
+ class: 'toolbar_scale_y',
+ icon: 'move-vertical',
+ enableToolbarIcon: true,
+ enableMenu: true,
+ enableHotKey: true
+ }, {
+ title: "INVERT_COLOR",
+ class: 'toolbar_invert_color',
+ icon: 'droplet',
+ enableToolbarIcon: true,
+ enableMenu: true,
+ enableHotKey: true
+ }, {
+ title: "COPY",
+ class: 'toolbar_copy',
+ icon: 'copy',
+ enableToolbarIcon: true,
+ enableMenu: true,
+ enableHotKey: true
+ }, {
+ title: SEPARATOR_SYMBOL,
+ enableToolbarIcon: false,
+ enableMenu: true,
+ enableHotKey: false
+ }, {
+ title: "CLOSE",
+ class: 'toolbar_close',
+ icon: 'trash',
+ enableToolbarIcon: false,
+ enableMenu: true,
+ enableHotKey: true
+ }];
+const IMG_FULL_SCREEN_MODE = {
+ FIT: 'FIT',
+ FILL: 'FILL',
+ STRETCH: 'STRETCH'
+};
+const VIEW_IMG_SELECTOR = {
+ EDITOR_AREAS: `.workspace-leaf-content[data-type='markdown'] img,.workspace-leaf-content[data-type='image'] img`,
+ EDITOR_AREAS_NO_LINK: `.workspace-leaf-content[data-type='markdown'] img:not(a img),.workspace-leaf-content[data-type='image'] img:not(a img)`,
+ CPB: `.community-plugin-readme img`,
+ CPB_NO_LINK: `.community-plugin-readme img:not(a img)`,
+ OTHER: `#sr-flashcard-view img`,
+ OTHER_NO_LINK: `#sr-flashcard-view img:not(a img)`,
+};
+const IMG_BORDER_WIDTH = {
+ THIN: 'thin',
+ MEDIUM: 'medium',
+ THICK: 'thick'
+};
+const IMG_BORDER_STYLE = {
+ // HIDDEN: 'hidden',
+ DOTTED: 'dotted',
+ DASHED: 'dashed',
+ SOLID: 'solid',
+ DOUBLE: 'double',
+ GROOVE: 'groove',
+ RIDGE: 'ridge',
+ INSET: 'inset',
+ OUTSET: 'outset'
+};
+// https://www.runoob.com/cssref/css-colorsfull.html
+const IMG_BORDER_COLOR = {
+ BLACK: 'black',
+ BLUE: 'blue',
+ DARK_GREEN: 'darkgreen',
+ GREEN: 'green',
+ LIME: 'lime',
+ STEEL_BLUE: 'steelblue',
+ INDIGO: 'indigo',
+ PURPLE: 'purple',
+ GRAY: 'gray',
+ DARK_RED: 'darkred',
+ LIGHT_GREEN: 'lightgreen',
+ BROWN: 'brown',
+ LIGHT_BLUE: 'lightblue',
+ SILVER: 'silver',
+ RED: 'red',
+ PINK: 'pink',
+ ORANGE: 'orange',
+ GOLD: 'gold',
+ YELLOW: 'yellow'
+};
+const GALLERY_NAVBAR_DEFAULT_COLOR = '#0000001A'; // rgba(0, 0, 0, 0.1)
+const GALLERY_NAVBAR_HOVER_COLOR = '#0000004D'; // rgba(0, 0, 0, 0.3)
+const GALLERY_IMG_BORDER_ACTIVE_COLOR = '#FF0000'; // red
+const MODIFIER_HOTKEYS = {
+ NONE: "NONE",
+ CTRL: "CTRL",
+ ALT: "ALT",
+ SHIFT: "SHIFT",
+ CTRL_ALT: "CTRL_ALT",
+ CTRL_SHIFT: "CTRL_SHIFT",
+ SHIFT_ALT: "SHIFT_ALT",
+ CTRL_SHIFT_ALT: "CTRL_SHIFT_ALT"
+};
+const MOVE_THE_IMAGE = {
+ CODE: "MOVE_THE_IMAGE",
+ DEFAULT_HOTKEY: MODIFIER_HOTKEYS.NONE,
+ SVG: ``
+};
+const SWITCH_THE_IMAGE = {
+ CODE: "SWITCH_THE_IMAGE",
+ DEFAULT_HOTKEY: MODIFIER_HOTKEYS.CTRL,
+ SVG: ``
+};
+const IMG_DEFAULT_BACKGROUND_COLOR = '#00000000';
+
+function getDefaultExportFromCjs (x) {
+ return x && x.__esModule && Object.prototype.hasOwnProperty.call(x, 'default') ? x['default'] : x;
+}
+
+function createCommonjsModule(fn) {
+ var module = { exports: {} };
+ return fn(module, module.exports), module.exports;
+}
+
+/*! Pickr 1.8.2 MIT | https://github.com/Simonwep/pickr */
+
+var pickr_min = createCommonjsModule(function (module, exports) {
+!function(t,e){module.exports=e();}(self,(function(){return (()=>{var t={d:(e,o)=>{for(var n in o)t.o(o,n)&&!t.o(e,n)&&Object.defineProperty(e,n,{enumerable:!0,get:o[n]});},o:(t,e)=>Object.prototype.hasOwnProperty.call(t,e),r:t=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0});}},e={};t.d(e,{default:()=>L});var o={};function n(t,e,o,n,i={}){e instanceof HTMLCollection||e instanceof NodeList?e=Array.from(e):Array.isArray(e)||(e=[e]),Array.isArray(o)||(o=[o]);for(const s of e)for(const e of o)s[t](e,n,{capture:!1,...i});return Array.prototype.slice.call(arguments,1)}t.r(o),t.d(o,{adjustableInputNumbers:()=>p,createElementFromString:()=>r,createFromTemplate:()=>a,eventPath:()=>l,off:()=>s,on:()=>i,resolveElement:()=>c});const i=n.bind(null,"addEventListener"),s=n.bind(null,"removeEventListener");function r(t){const e=document.createElement("div");return e.innerHTML=t.trim(),e.firstElementChild}function a(t){const e=(t,e)=>{const o=t.getAttribute(e);return t.removeAttribute(e),o},o=(t,n={})=>{const i=e(t,":obj"),s=e(t,":ref"),r=i?n[i]={}:n;s&&(n[s]=t);for(const n of Array.from(t.children)){const t=e(n,":arr"),i=o(n,t?{}:r);t&&(r[t]||(r[t]=[])).push(Object.keys(i).length?i:n);}return n};return o(r(t))}function l(t){let e=t.path||t.composedPath&&t.composedPath();if(e)return e;let o=t.target.parentElement;for(e=[t.target,o];o=o.parentElement;)e.push(o);return e.push(document,window),e}function c(t){return t instanceof Element?t:"string"==typeof t?t.split(/>>/g).reduce(((t,e,o,n)=>(t=t.querySelector(e),ot)){function o(o){const n=[.001,.01,.1][Number(o.shiftKey||2*o.ctrlKey)]*(o.deltaY<0?1:-1);let i=0,s=t.selectionStart;t.value=t.value.replace(/[\d.]+/g,((t,o)=>o<=s&&o+t.length>=s?(s=o,e(Number(t),n,i)):(i++,t))),t.focus(),t.setSelectionRange(s,s),o.preventDefault(),t.dispatchEvent(new Event("input"));}i(t,"focus",(()=>i(window,"wheel",o,{passive:!1}))),i(t,"blur",(()=>s(window,"wheel",o)));}const{min:u,max:h,floor:d,round:m}=Math;function f(t,e,o){e/=100,o/=100;const n=d(t=t/360*6),i=t-n,s=o*(1-e),r=o*(1-i*e),a=o*(1-(1-i)*e),l=n%6;return [255*[o,r,s,s,a,o][l],255*[a,o,o,r,s,s][l],255*[s,s,a,o,o,r][l]]}function v(t,e,o){const n=(2-(e/=100))*(o/=100)/2;return 0!==n&&(e=1===n?0:n<.5?e*o/(2*n):e*o/(2-2*n)),[t,100*e,100*n]}function b(t,e,o){const n=u(t/=255,e/=255,o/=255),i=h(t,e,o),s=i-n;let r,a;if(0===s)r=a=0;else {a=s/i;const n=((i-t)/6+s/2)/s,l=((i-e)/6+s/2)/s,c=((i-o)/6+s/2)/s;t===i?r=c-l:e===i?r=1/3+n-c:o===i&&(r=2/3+l-n),r<0?r+=1:r>1&&(r-=1);}return [360*r,100*a,100*i]}function y(t,e,o,n){e/=100,o/=100;return [...b(255*(1-u(1,(t/=100)*(1-(n/=100))+n)),255*(1-u(1,e*(1-n)+n)),255*(1-u(1,o*(1-n)+n)))]}function g(t,e,o){e/=100;const n=2*(e*=(o/=100)<.5?o:1-o)/(o+e)*100,i=100*(o+e);return [t,isNaN(n)?0:n,i]}function _(t){return b(...t.match(/.{2}/g).map((t=>parseInt(t,16))))}function w(t){t=t.match(/^[a-zA-Z]+$/)?function(t){if("black"===t.toLowerCase())return "#000";const e=document.createElement("canvas").getContext("2d");return e.fillStyle=t,"#000"===e.fillStyle?null:e.fillStyle}(t):t;const e={cmyk:/^cmyk[\D]+([\d.]+)[\D]+([\d.]+)[\D]+([\d.]+)[\D]+([\d.]+)/i,rgba:/^((rgba)|rgb)[\D]+([\d.]+)[\D]+([\d.]+)[\D]+([\d.]+)[\D]*?([\d.]+|$)/i,hsla:/^((hsla)|hsl)[\D]+([\d.]+)[\D]+([\d.]+)[\D]+([\d.]+)[\D]*?([\d.]+|$)/i,hsva:/^((hsva)|hsv)[\D]+([\d.]+)[\D]+([\d.]+)[\D]+([\d.]+)[\D]*?([\d.]+|$)/i,hexa:/^#?(([\dA-Fa-f]{3,4})|([\dA-Fa-f]{6})|([\dA-Fa-f]{8}))$/i},o=t=>t.map((t=>/^(|\d+)\.\d+|\d+$/.test(t)?Number(t):void 0));let n;t:for(const i in e){if(!(n=e[i].exec(t)))continue;const s=t=>!!n[2]==("number"==typeof t);switch(i){case"cmyk":{const[,t,e,s,r]=o(n);if(t>100||e>100||s>100||r>100)break t;return {values:y(t,e,s,r),type:i}}case"rgba":{const[,,,t,e,r,a]=o(n);if(t>255||e>255||r>255||a<0||a>1||!s(a))break t;return {values:[...b(t,e,r),a],a,type:i}}case"hexa":{let[,t]=n;4!==t.length&&3!==t.length||(t=t.split("").map((t=>t+t)).join(""));const e=t.substring(0,6);let o=t.substring(6);return o=o?parseInt(o,16)/255:void 0,{values:[..._(e),o],a:o,type:i}}case"hsla":{const[,,,t,e,r,a]=o(n);if(t>360||e>100||r>100||a<0||a>1||!s(a))break t;return {values:[...g(t,e,r),a],a,type:i}}case"hsva":{const[,,,t,e,r,a]=o(n);if(t>360||e>100||r>100||a<0||a>1||!s(a))break t;return {values:[t,e,r,a],a,type:i}}}}return {values:null,type:null}}function A(t=0,e=0,o=0,n=1){const i=(t,e)=>(o=-1)=>e(~o?t.map((t=>Number(t.toFixed(o)))):t),s={h:t,s:e,v:o,a:n,toHSVA(){const t=[s.h,s.s,s.v,s.a];return t.toString=i(t,(t=>`hsva(${t[0]}, ${t[1]}%, ${t[2]}%, ${s.a})`)),t},toHSLA(){const t=[...v(s.h,s.s,s.v),s.a];return t.toString=i(t,(t=>`hsla(${t[0]}, ${t[1]}%, ${t[2]}%, ${s.a})`)),t},toRGBA(){const t=[...f(s.h,s.s,s.v),s.a];return t.toString=i(t,(t=>`rgba(${t[0]}, ${t[1]}, ${t[2]}, ${s.a})`)),t},toCMYK(){const t=function(t,e,o){const n=f(t,e,o),i=n[0]/255,s=n[1]/255,r=n[2]/255,a=u(1-i,1-s,1-r);return [100*(1===a?0:(1-i-a)/(1-a)),100*(1===a?0:(1-s-a)/(1-a)),100*(1===a?0:(1-r-a)/(1-a)),100*a]}(s.h,s.s,s.v);return t.toString=i(t,(t=>`cmyk(${t[0]}%, ${t[1]}%, ${t[2]}%, ${t[3]}%)`)),t},toHEXA(){const t=function(t,e,o){return f(t,e,o).map((t=>m(t).toString(16).padStart(2,"0")))}(s.h,s.s,s.v),e=s.a>=1?"":Number((255*s.a).toFixed(0)).toString(16).toUpperCase().padStart(2,"0");return e&&t.push(e),t.toString=()=>`#${t.join("").toUpperCase()}`,t},clone:()=>A(s.h,s.s,s.v,s.a)};return s}const C=t=>Math.max(Math.min(t,1),0);function $(t){const e={options:Object.assign({lock:null,onchange:()=>0,onstop:()=>0},t),_keyboard(t){const{options:o}=e,{type:n,key:i}=t;if(document.activeElement===o.wrapper){const{lock:o}=e.options,s="ArrowUp"===i,r="ArrowRight"===i,a="ArrowDown"===i,l="ArrowLeft"===i;if("keydown"===n&&(s||r||a||l)){let n=0,i=0;"v"===o?n=s||r?1:-1:"h"===o?n=s||r?-1:1:(i=s?-1:a?1:0,n=l?-1:r?1:0),e.update(C(e.cache.x+.01*n),C(e.cache.y+.01*i)),t.preventDefault();}else i.startsWith("Arrow")&&(e.options.onstop(),t.preventDefault());}},_tapstart(t){i(document,["mouseup","touchend","touchcancel"],e._tapstop),i(document,["mousemove","touchmove"],e._tapmove),t.cancelable&&t.preventDefault(),e._tapmove(t);},_tapmove(t){const{options:o,cache:n}=e,{lock:i,element:s,wrapper:r}=o,a=r.getBoundingClientRect();let l=0,c=0;if(t){const e=t&&t.touches&&t.touches[0];l=t?(e||t).clientX:0,c=t?(e||t).clientY:0,la.left+a.width&&(l=a.left+a.width),ca.top+a.height&&(c=a.top+a.height),l-=a.left,c-=a.top;}else n&&(l=n.x*a.width,c=n.y*a.height);"h"!==i&&(s.style.left=`calc(${l/a.width*100}% - ${s.offsetWidth/2}px)`),"v"!==i&&(s.style.top=`calc(${c/a.height*100}% - ${s.offsetHeight/2}px)`),e.cache={x:l/a.width,y:c/a.height};const p=C(l/a.width),u=C(c/a.height);switch(i){case"v":return o.onchange(p);case"h":return o.onchange(u);default:return o.onchange(p,u)}},_tapstop(){e.options.onstop(),s(document,["mouseup","touchend","touchcancel"],e._tapstop),s(document,["mousemove","touchmove"],e._tapmove);},trigger(){e._tapmove();},update(t=0,o=0){const{left:n,top:i,width:s,height:r}=e.options.wrapper.getBoundingClientRect();"h"===e.options.lock&&(o=t),e._tapmove({clientX:n+s*t,clientY:i+r*o});},destroy(){const{options:t,_tapstart:o,_keyboard:n}=e;s(document,["keydown","keyup"],n),s([t.wrapper,t.element],"mousedown",o),s([t.wrapper,t.element],"touchstart",o,{passive:!1});}},{options:o,_tapstart:n,_keyboard:r}=e;return i([o.wrapper,o.element],"mousedown",n),i([o.wrapper,o.element],"touchstart",n,{passive:!1}),i(document,["keydown","keyup"],r),e}function k(t={}){t=Object.assign({onchange:()=>0,className:"",elements:[]},t);const e=i(t.elements,"click",(e=>{t.elements.forEach((o=>o.classList[e.target===o?"add":"remove"](t.className))),t.onchange(e),e.stopPropagation();}));return {destroy:()=>s(...e)}}const S={variantFlipOrder:{start:"sme",middle:"mse",end:"ems"},positionFlipOrder:{top:"tbrl",right:"rltb",bottom:"btrl",left:"lrbt"},position:"bottom",margin:8},O=(t,e,o)=>{const{container:n,margin:i,position:s,variantFlipOrder:r,positionFlipOrder:a}={container:document.documentElement.getBoundingClientRect(),...S,...o},{left:l,top:c}=e.style;e.style.left="0",e.style.top="0";const p=t.getBoundingClientRect(),u=e.getBoundingClientRect(),h={t:p.top-u.height-i,b:p.bottom+i,r:p.right+i,l:p.left-u.width-i},d={vs:p.left,vm:p.left+p.width/2+-u.width/2,ve:p.left+p.width-u.width,hs:p.top,hm:p.bottom-p.height/2-u.height/2,he:p.bottom-u.height},[m,f="middle"]=s.split("-"),v=a[m],b=r[f],{top:y,left:g,bottom:_,right:w}=n;for(const t of v){const o="t"===t||"b"===t,n=h[t],[i,s]=o?["top","left"]:["left","top"],[r,a]=o?[u.height,u.width]:[u.width,u.height],[l,c]=o?[_,w]:[w,_],[p,m]=o?[y,g]:[g,y];if(!(n
l))for(const r of b){const l=d[(o?"v":"h")+r];if(!(lc))return e.style[s]=l-u[s]+"px",e.style[i]=n-u[i]+"px",t+r}}return e.style.left=l,e.style.top=c,null};function E(t,e,o){return e in t?Object.defineProperty(t,e,{value:o,enumerable:!0,configurable:!0,writable:!0}):t[e]=o,t}class L{constructor(t){E(this,"_initializingActive",!0),E(this,"_recalc",!0),E(this,"_nanopop",null),E(this,"_root",null),E(this,"_color",A()),E(this,"_lastColor",A()),E(this,"_swatchColors",[]),E(this,"_setupAnimationFrame",null),E(this,"_eventListener",{init:[],save:[],hide:[],show:[],clear:[],change:[],changestop:[],cancel:[],swatchselect:[]}),this.options=t=Object.assign({...L.DEFAULT_OPTIONS},t);const{swatches:e,components:o,theme:n,sliders:i,lockOpacity:s,padding:r}=t;["nano","monolith"].includes(n)&&!i&&(t.sliders="h"),o.interaction||(o.interaction={});const{preview:a,opacity:l,hue:c,palette:p}=o;o.opacity=!s&&l,o.palette=p||a||l||c,this._preBuild(),this._buildComponents(),this._bindEvents(),this._finalBuild(),e&&e.length&&e.forEach((t=>this.addSwatch(t)));const{button:u,app:h}=this._root;this._nanopop=((t,e,o)=>{const n="object"!=typeof t||t instanceof HTMLElement?{reference:t,popper:e,...o}:t;return {update(t=n){const{reference:e,popper:o}=Object.assign(n,t);if(!o||!e)throw new Error("Popper- or reference-element missing.");return O(e,o,n)}}})(u,h,{margin:r}),u.setAttribute("role","button"),u.setAttribute("aria-label",this._t("btn:toggle"));const d=this;this._setupAnimationFrame=requestAnimationFrame((function e(){if(!h.offsetWidth)return requestAnimationFrame(e);d.setColor(t.default),d._rePositioningPicker(),t.defaultRepresentation&&(d._representation=t.defaultRepresentation,d.setColorRepresentation(d._representation)),t.showAlways&&d.show(),d._initializingActive=!1,d._emit("init");}));}_preBuild(){const{options:t}=this;for(const e of ["el","container"])t[e]=c(t[e]);this._root=(t=>{const{components:e,useAsButton:o,inline:n,appClass:i,theme:s,lockOpacity:r}=t.options,l=t=>t?"":'style="display:none" hidden',c=e=>t._t(e),p=a(`\n