diff options
| author | YAVIIGI <118232419+YAVIIGI@users.noreply.github.com> | 2023-12-27 20:57:43 +0900 |
|---|---|---|
| committer | Marie <marie@kaifa.ch> | 2023-12-28 09:47:14 +0100 |
| commit | b0301dd2fbd48ada9c48be398e9b41865e6fef1f (patch) | |
| tree | 445891770c8b7b94bec73a73723ac9cdb229623c /packages/frontend/src/scripts/mfm-function-picker.ts | |
| parent | Fix(frontend): MFMでfgとbgに長い単語を使うと改行されない問... (diff) | |
| download | sharkey-b0301dd2fbd48ada9c48be398e9b41865e6fef1f.tar.gz sharkey-b0301dd2fbd48ada9c48be398e9b41865e6fef1f.tar.bz2 sharkey-b0301dd2fbd48ada9c48be398e9b41865e6fef1f.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/mfm-function-picker.ts')
| -rw-r--r-- | packages/frontend/src/scripts/mfm-function-picker.ts | 61 |
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); + }); +} |