summaryrefslogtreecommitdiff
path: root/packages/frontend/src/scripts
diff options
context:
space:
mode:
authorYAVIIGI <118232419+YAVIIGI@users.noreply.github.com>2023-12-27 20:57:43 +0900
committerGitHub <noreply@github.com>2023-12-27 20:57:43 +0900
commit47558a6648ac6f53fb3c415fe353c45e21bb9b5d (patch)
treea61fe0b8c5576c8d372f9228bcb1fc45287c33cc /packages/frontend/src/scripts
parentFix(frontend): MFMでfgとbgに長い単語を使うと改行されない問... (diff)
downloadsharkey-47558a6648ac6f53fb3c415fe353c45e21bb9b5d.tar.gz
sharkey-47558a6648ac6f53fb3c415fe353c45e21bb9b5d.tar.bz2
sharkey-47558a6648ac6f53fb3c415fe353c45e21bb9b5d.zip
feat(frontend): 投稿ウインドウにMFM要素を追加するボタンの追加 (#12788)
* functionPicker の追加 * Update CHANGELOG.md * fix lint errors * Add addMfmFunction * add enableQuickAddMfmFunction setting * Update CHANGELOG.md issue 番号を追加 * Update index.d.ts * change 'functionPicker' to 'mfmFunctionPicker' * Change indent from 4 space to 1 tab --------- Co-authored-by: syuilo <Syuilotan@yahoo.co.jp>
Diffstat (limited to 'packages/frontend/src/scripts')
-rw-r--r--packages/frontend/src/scripts/mfm-function-picker.ts61
1 files changed, 61 insertions, 0 deletions
diff --git a/packages/frontend/src/scripts/mfm-function-picker.ts b/packages/frontend/src/scripts/mfm-function-picker.ts
new file mode 100644
index 0000000000..465926fe04
--- /dev/null
+++ b/packages/frontend/src/scripts/mfm-function-picker.ts
@@ -0,0 +1,61 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and other misskey contributors
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+import { Ref, nextTick } from 'vue';
+import * as os from '@/os.js';
+import { i18n } from '@/i18n.js';
+import { MFM_TAGS } from '@/const.js';
+
+/**
+ * MFMの装飾のリストを表示する
+ */
+export function mfmFunctionPicker(src: any, textArea: HTMLInputElement | HTMLTextAreaElement, textRef: Ref<string>) {
+ return new Promise((res, rej) => {
+ os.popupMenu([{
+ text: i18n.ts.addMfmFunction,
+ type: 'label',
+ }, ...getFunctionList(textArea, textRef)], src);
+ });
+}
+
+function getFunctionList(textArea: HTMLInputElement | HTMLTextAreaElement, textRef: Ref<string>) : object[] {
+ const ret: object[] = [];
+ MFM_TAGS.forEach(tag => {
+ ret.push({
+ text: tag,
+ icon: 'ti ti-icons',
+ action: () => add(textArea, textRef, tag),
+ });
+ });
+ return ret;
+}
+
+function add(textArea: HTMLInputElement | HTMLTextAreaElement, textRef: Ref<string>, type: string) {
+ const caretStart: number = textArea.selectionStart as number;
+ const caretEnd: number = textArea.selectionEnd as number;
+
+ MFM_TAGS.forEach(tag => {
+ if (type === tag) {
+ if (caretStart === caretEnd) {
+ // 単純にFunctionを追加
+ const trimmedText = `${textRef.value.substring(0, caretStart)}$[${type} ]${textRef.value.substring(caretEnd)}`;
+ textRef.value = trimmedText;
+ } else {
+ // 選択範囲を囲むようにFunctionを追加
+ const trimmedText = `${textRef.value.substring(0, caretStart)}$[${type} ${textRef.value.substring(caretStart, caretEnd)}]${textRef.value.substring(caretEnd)}`;
+ textRef.value = trimmedText;
+ }
+ }
+ });
+
+ const nextCaretStart: number = caretStart + 3 + type.length;
+ const nextCaretEnd: number = caretEnd + 3 + type.length;
+
+ // キャレットを戻す
+ nextTick(() => {
+ textArea.focus();
+ textArea.setSelectionRange(nextCaretStart, nextCaretEnd);
+ });
+}