mcpField
U
umbraco-monaco-markdown-editor-action

umbraco-monaco-markdown-editor-action

github.com/umbraco开发27384 次安装6 周前更新
代码仓库

关于 umbraco-monaco-markdown-editor-action

umbraco-monaco-markdown-editor-action 是用于扩展 Umbraco Markdown 编辑器的编码技能,可添加工具栏操作和快捷键,并提供操作清单及实现示例,包括打开模态框。

主要功能

  1. 01添加自定义工具栏按钮
  2. 02注册键盘快捷键
  3. 03插入自定义 Markdown 语法
  4. 04从编辑器操作打开模态框

适用场景

  1. 01添加插入链接的操作
  2. 02为自定义 Markdown 创建快捷键
  3. 03从编辑器工具栏打开对话框

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/umbraco/umbraco-cms-backoffice-skills --skill umbraco-monaco-markdown-editor-action

安装后在 Claude Code 中输入/umbraco-monaco-markdown-editor-action确认已加载。

详细介绍

Umbraco Monaco Markdown 编辑器操作

这是什么?

Monaco Markdown 编辑器操作可为 Umbraco 中的 Markdown 编辑器添加自定义工具栏按钮和键盘快捷键。它们让你可以通过插入链接、图片或自定义 Markdown 语法等功能,扩展编辑体验。操作会显示在编辑器工具栏中,也可以响应键盘快捷键。

文档

实现前始终获取最新文档:

相关 Foundation 技能

  • 模态框:从操作中打开模态对话框时使用

    • 参考技能:umbraco-modals
  • 本地化:提供本地化标签时使用

    • 参考技能:umbraco-localization

工作流

  1. 获取文档——对以上 URL 使用 WebFetch
  2. 提出问题——需要什么功能?使用什么键盘快捷键?使用什么图标?
  3. 生成文件——根据最新文档创建清单和操作类
  4. 说明——展示创建的内容以及测试方法

最小示例

清单(manifests.ts)
export const manifests: Array<UmbExtensionManifest> = [
  {
    type: 'monacoMarkdownEditorAction',
    alias: 'My.MonacoMarkdownEditorAction.Custom',
    name: 'Custom Monaco Markdown Editor Action',
    api: () => import('./my-markdown-action.js'),
    meta: {
      label: 'Insert Custom',
      icon: 'icon-favorite',
    },
  },
];
操作实现(my-markdown-action.ts)
import { monaco } from '@umbraco-cms/backoffice/external/monaco-editor';
import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api';
import type { UmbControllerHost } from '@umbraco-cms/backoffice/controller-api';
import type { UUIModalSidebarSize } from '@umbraco-cms/backoffice/external/uui';

export class MyMarkdownAction extends UmbControllerBase {
  constructor(host: UmbControllerHost) {
    super(host);
  }

  getUnique() {
    return 'My.MonacoMarkdownEditorAction.Custom';
  }

  getLabel() {
    return 'Insert Custom';
  }

  getKeybindings() {
    // Ctrl/Cmd + Shift + C
    return [monaco.KeyMod.CtrlCmd | monaco.KeyMod.Shift | monaco.KeyCode.KeyC];
  }

  async execute({ editor, overlaySize }: { editor: any; overlaySize: UUIModalSidebarSize }) {
    if (!editor) throw new Error('Editor not found');

    const selection = editor.getSelections()[0];
    if (!selection) return;

    const selectedValue = editor.getValueInRange(selection);

    // Insert custom markdown
    editor.monacoEditor?.executeEdits('', [
      { range: selection, text: `**${selectedValue || 'custom'}**` },
    ]);

    editor.monacoEditor?.focus();
  }
}

export { MyMarkdownAction as api };
带模态框的操作
import { monaco } from '@umbraco-cms/backoffice/external/monaco-editor';
import { UmbControllerBase } from '@umbraco-cms/backoffice/class-api';
import { UMB_MODAL_MANAGER_CONTEXT } from '@umbraco-cms/backoffice/modal';

export class MyModalMarkdownAction extends UmbControllerBase {
  getUnique() {
    return 'My.MonacoMarkdownEditorAction.Modal';
  }

  getLabel() {
    return 'Insert with Modal';
  }

  getKeybindings() {
    return [monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyM];
  }

  async execute({ editor, overlaySize }) {
    const modalManager = await this.getContext(UMB_MODAL_MANAGER_CONTEXT);
    if (!modalManager) throw new Error('Modal manager not found');

    const selection = editor?.getSelections()[0];
    if (!selection) return;

    // Open a modal and use the result
    const modalContext = modalManager.open(this, MY_CUSTOM_MODAL, {
      modal: { size: overlaySize },
    });

    modalContext?.onSubmit().then((value) => {
      if (!value) return;
      editor.monacoEditor?.executeEdits('', [
        { range: selection, text: value.text },
      ]);
    });
  }
}

export { MyModalMarkdownAction as api };

接口参考

interface ManifestMonacoMarkdownEditorAction extends ManifestApi<any> {
  type: 'monacoMarkdownEditorAction';
  meta?: MetaMonacoMarkdownEditorAction;
}

interface MetaMonacoMarkdownEditorAction {
  icon?: string | null;
  label?: string | null;  // Can use localization key like '#buttons_linkInsert'
}

常用按键绑定

// Single key
monaco.KeyCode.Enter

// Ctrl/Cmd combinations
monaco.KeyMod.CtrlCmd | monaco.KeyCode.KeyK  // Ctrl+K or Cmd+K
monaco.KeyMod.CtrlCmd | monaco.KeyMod.Shift | monaco.KeyCode.KeyC  // Ctrl+Shift+C
monaco.KeyMod.Alt | monaco.KeyCode.KeyI  // Alt+I

就是这样!始终获取最新文档,保持示例简洁,并生成完整可运行的代码。

评论

支持 Markdown