ByteMD实现markdown

1,758 阅读3分钟

image.png

介绍

ByteMD是一个使用Svelte构建的Markdown编辑器组件。它也可以用于其他库/框架,如React、Vue和Angular。

特性

  • 轻量级和框架无关:ByteMD是用Svelte构建的。它编译成普通的JS DOM操作,而不需要导入任何UI框架运行时包,这使得它轻量级,并且很容易适应其他库/框架。
  • 易于扩展:ByteMD有一个插件系统来扩展基本的Markdown语法,这使得它很容易添加额外的功能,如代码语法高亮,数学方程和美人鱼流程图。如果这些插件不能满足你的需要,你也可以编写自己的插件。
  • 默认安全:跨站点脚本(XSS)攻击,如<script><img onerror>已被ByteMD正确处理。不需要引入额外的DOM净化步骤。
  • SSR兼容:ByteMD可以在服务器端呈现(SSR)环境中使用,无需额外配置。SSR具有较好的搜索引擎优化和在慢速网络连接下快速访问内容的优点,在某些情况下得到了广泛的应用。

插件

ByteMD为定制提供了一个强大的插件系统。有几个官方插件支持的功能,如代码语法高亮,数学方程和流程图。

如果您有更多的定制需求,您也可以编写自己的插件来支持它们。

官方插件

image.png

安装

npm install --save bytemd
npm install --save @bytemd/react

使用

框架环境React。

引入编辑器

import React, {  useState } from 'react';
import styled from 'styled-components';
import { Editor } from '@bytemd/react';

function MarkDownEditor(props: PropsType) {
    const [value, setValue] = useState('');

    const onChange = (v: string) => {
        setValue(v)
    };
    return (
        <Wrap>
            <Editor value={value} onChange={onChange} {...props.editorProps} />
        </Wrap>
    );
}

export default MarkDownEditor;

效果图: image.png

引入默认布局样式

import 'bytemd/dist/index.css';

效果图:

image.png image.png

中文显示

import zh_Hans from 'bytemd/locales/zh_Hans.json';

function MarkDownEditor(props: PropsType) {
    return (
        <Wrap>
            <Editor
                locale={zh_Hans}
            />
        </Wrap>
    );
}

export default MarkDownEditor;

效果图:

image.png

支持GFM

image.png

安装插件:

# 支持GFM(自动链接文字、删除、表格、任务列表)
npm install --save @bytemd/plugin-gfm

使用:

import gfm from '@bytemd/plugin-gfm';

const plugins: BytemdPlugin[] = [
    gfm()
];

function MarkDownEditor(props: PropsType) {
    return (
        <Wrap>
            <Editor
                plugins={plugins}
            />
        </Wrap>
    );
}

export default MarkDownEditor;

效果图: image.png

高亮显示代码块

image.png 安装插件:

# 高亮显示代码块
npm install --save @bytemd/plugin-highlight

使用:

import highlight from '@bytemd/plugin-highlight';
import 'highlight.js/styles/monokai-sublime.css';

const plugins: BytemdPlugin[] = [
    highlight()
];

function MarkDownEditor(props: PropsType) {
    return (
        <Wrap>
            <Editor
                plugins={plugins}
            />
        </Wrap>
    );
}
export default MarkDownEditor;

效果图:

image.png

解析前辅文

image.png 安装插件:

# 高亮显示代码块
npm install --save @bytemd/plugin-frontmatter

使用:

import frontmatter from '@bytemd/plugin-frontmatter';

const plugins: BytemdPlugin[] = [
    frontmatter()
];

function MarkDownEditor(props: PropsType) {
    return (
        <Wrap>
            <Editor
                plugins={plugins}
            />
        </Wrap>
    );
}
export default MarkDownEditor;

效果图: image.png

支持数学公式

image.png 安装插件:

# 高亮显示代码块
npm install --save @bytemd/plugin-frontmatter

使用:

import math from '@bytemd/plugin-math';

const plugins: BytemdPlugin[] = [
    math()
];

function MarkDownEditor(props: PropsType) {
    return (
        <Wrap>
            <Editor
                plugins={plugins}
            />
        </Wrap>
    );
}
export default MarkDownEditor;

效果图:

image.png

支持流程图

image.png 安装插件:

# 高亮显示代码块
npm install --save @bytemd/plugin-frontmatter

使用:

import mermaid from '@bytemd/plugin-mermaid';

const plugins: BytemdPlugin[] = [
    mermaid()
];

function MarkDownEditor(props: PropsType) {
    return (
        <Wrap>
            <Editor
                plugins={plugins}
            />
        </Wrap>
    );
}
export default MarkDownEditor;

效果图:

image.png

支持Gemoji短码

image.png 安装插件:

# 高亮显示代码块
npm install --save @bytemd/plugin-frontmatter

使用:

import gemoji from '@bytemd/plugin-gemoji';

const plugins: BytemdPlugin[] = [
    gemoji()
];

function MarkDownEditor(props: PropsType) {
    return (
        <Wrap>
            <Editor
                plugins={plugins}
            />
        </Wrap>
    );
}
export default MarkDownEditor;

效果图: image.png

支持缩放图像和中断

安装插件:

npm install --save @bytemd/plugin-medium-zoom
npm install --save @bytemd/plugin-breaks

使用:

import breaks from '@bytemd/plugin-breaks';
import mediumZoom from '@bytemd/plugin-medium-zoom';

const plugins: BytemdPlugin[] = [
    breaks(),
    mediumZoom(),
];

function MarkDownEditor(props: PropsType) {
    return (
        <Wrap>
            <Editor
                plugins={plugins}
            />
        </Wrap>
    );
}
export default MarkDownEditor;

支持上传图片

image.png 默认没有上传图标,需指定uploadImages函数处理上传图像。如果设置,图像图标将出现在工具栏上。

image.png

代码实现:

import { onUploadImagesApi } from '@api/photosApi';

function MarkDownEditor(props: PropsType) {
    const onUploadImagesHandle = async (
        files: File[]
    ): Promise<Pick<any, 'title' | 'url'>[]> => {
        const list: { title: string; url: string }[] = [];
        const res = await onUploadImagesApi(files);
        const data = res?.data || {};
        if (data.code === 200) {
            (data.data || []).forEach((o: any,i:number) => {
                list.push({
                    title: o.filename,
                    url: o.fileURl,
                });
            });
        }
        return Promise.resolve(list);
    };
    return (
            <Editor
                uploadImages={onUploadImagesHandle}
            />
    );
}

效果图:

image.png

到这里常用的功能就可以使用啦。

资源连接