1.1.7 • Published 3 years ago

react-start-editor v1.1.7

Weekly downloads
7
License
MIT
Repository
-
Last release
3 years ago

react-ritch-markdown

基于 React 和 antd 的编辑器(同时支持富文本和 markdown,基于 braft-editor 和 react-markdown-editor-lite 的在封装)

基本使用

1. 编辑器的基本使用

下载

npm i react-start-editor

引入

import Editors from "react-start-editor/lib"

使用

// 编辑器
<Editors.Editors />

1.1支持参数

1.1.1 公共参数
名称描述类型默认备注
onChange获取编辑器的值function必传
isRich是否显示富文本Booleanfalsetrue:显示富文本;false:显示 markdown
defaultValue默认值stringnull
imgUrl图片上传地址string/api/site/image
IUpName图片上传名stringfile
IUpData图片上传额外参数objectundefind
fillUrl文件上传地址string/api/site/annex
FUpName文件上传名stringfile
FUpData文件上传额外参数objectundefind
1.1.2 markdown参数
名称描述类型默认备注
mdRendermarkdown 渲染规则markdown-it需要传入整个markdown-it
mdStylemarkdown样式object{height:'500px'}
mdPasteImgmarkdown复制图片上传函数functionundefind
mdImgChange图片上传回调函数functionundefind
mdFillChange文件上传回调函数functionundefind
1.1.3 富文本参数
名称描述类型默认备注
richPasetImg富文本复制图片上传函数functionundefind
richImgChange图片上传回调函数functionundefind必须返回拼接后的值
richFillChange文件上传回调函数functionundefind必须返回拼接后的值
richXssOption富文本xss配置对象objectxssOption
let xssOption = {
      whiteList: {
        a: ["href", "title", "target"],
        img: ["src", "alt", "target", "id", "title"],
        video: ["src", "control"],
        audio: ["src", "control"],
        span: ["style"],
        p: ["style"],
        div: ["style", "class", "id"],
        strong: [],
        em: [],
        u: [],
        hr: [],
        sup: [],
        sub: [],
        ul: [],
        ol: [],
        li: [],
        b: [],
        table: ["border", "style", "collapse"],
        tr: [],
        td: ["colspan", "rowspan"],
        blockquote: [],
        code: [],
        pre: [],
        br: [],
        font:["face"],
      },
    };

1.2 方法实例

1.2.1 onChange 实例

获取编辑器的值

onChange(value) {
	console.log(value)
}
1.2.2 mdPasteImg实例
// 粘贴图片上传
  myUploadFn = (file) => {
    const { IUpData, IUpName, imgUrl } = this.props;
    return new Promise((resolve) => {
      const reader = new FileReader();
      reader.onload = () => {
        let obj = new FormData();
        if (IUpData) {
          for (let key in IUpData) {
            obj.append(key, IUpData[key]);
          }
        }
        obj.append(IUpName, file);
        Axios.post(imgUrl, obj).then((res) => {
          let { data } = res;
          resolve(data.url);
        });
      };
      reader.readAsDataURL(file);
    });
  };
1.2.3 richPasetImg实例
// 粘贴图片上传
  myUploadFn = (param) => {
    const { IUpData, IUpName, imgUrl } = this.props;
    let obj = new FormData();
    if (IUpData) {
      for (let key in IUpData) {
        obj.append(key, IUpData[key]);
      }
    }
    obj.append(IUpName, param.file);
    Axios.post(imgUrl, obj)
      .then((res) => {
        if (res.data && res.data.code === 0) {
          let data = res.data.data;
          param.success({
            url: data.url,
            meta: {
              id: data.id,
              title: data.name,
              alt: data.name,
            },
          });
        }
      })
      .catch((err) => {
        param.error({
          msg: "上传失败!",
        });
      });
  };
1.2.4 mdImgChange实例
const mdImgChange = (info, set) => {
    if (info.file.status === 'done') {
      set.setFieldsValue({
        url: info.file.response.data.url,
      });
    } else if (info.file.status === 'error') {
      message.error('图片上传失败');
    }
  };
1.2.5 mdFillChange实例
const mdImgChange = (info, set) => {
    if (info.file.status === 'done') {
       // 插入Markdown
        let str = `[${info.file.response.data.file_name}](${info.file.response.data.url})`;
       set.insertText(str);
    } else if (info.file.status === 'error') {
      message.error('图片上传失败');
    }
  };
1.2.6 richImgChange 实例
//图片上传回调
  const richImgChange = (info, value, set) => {
    if (info.file.status === 'done') {
      // 富文本图片上传成功,将图片地址加入富文本内容
      let data = set.insertMedias(value, [{ type: 'IMAGE', url: info.file.response.data.url }]);
      return data; // 必须返回拼接的值
    } else if (info.file.status === 'error') {
      message.error('图片上传失败');
    }
  };
1.2.7 richFillChange实例
//文件上传回调
 const  uploadFileChange = (info, value,set) => {
      if (info.file.status === "done") {
        // 富文本文件上传成功,将图片地址加入富文本内容
        let data = set.insertHTML(
          value,
          `<a target="_blank" href="${info.file.response.data.url}">${info.file.response.data.file_name}</a>`
        )
        return data // 必须返回拼接的值
      } else if (info.file.status === "error") {
        message.error("文件上传失败");
      }
  };

1.3 Muse 实例

挂载 markdown 插件

Editors.Editors.Muse(插件, 配置)

1.4 基本使用示例

const mdParser = new MarkdownIt({
  breaks: true, // 转换段落里的 '\n' 到 <br>。
  linkify: true, // 将类似 URL 的文本自动转换为链接。
  typographer: true, // 启用一些语言中立的替换 + 引号美化
  html: true,
  highlight: function(str, lang) {
    if (lang && hljs.getLanguage(lang)) {
      try {
        return hljs.highlight(lang, str).value;
      } catch (__) {}
    }
    return ""; // 使用额外的默认转义
  },
})
  .use(require("markdown-it-toc"))
  .use(require("markdown-it-xss"), {
    xss: {
      escapeHtml(html) {
        return html;
      },
    },
  })
  .use(require('@liradb2000/markdown-it-mermaid'));

class App extends React.Component {
    constructor(props) {
        super(props)
        this.state = {
            defaultValue: '',
        }
    }

    // 获取编辑器的内容
    onChange = (value) => {
        console.log(value)
    }

    refadd = React.createRef();

	// 设置默认值
    componentDidMount() {
        this.setState({ defaultValue: '1236' })
    }

    handleClickLastValue = async () => {
        this.setState({ defaultValue: '7896' })
    }

    // 清空编辑器
    handleClear = () => {
        this.refadd.current.clearContent()
    }

    render() {
        const { defaultValue } = this.state
        return <div>
            <Button onClick={() => this.handleClickLastValue()}>
                恢复上一次内容
            </Button>
            <Button onClick={() => this.handleClear()}>
                清除内容
            </Button>
            <Editors.Editors
                ref={this.refadd}
                onChange={this.onChange}
                isRich={true}
                defaultValue={defaultValue}
                imgUrl= "/api/site/image",
                fillUrl= "/api/site/annex",
                mdStyle={{height:'500px'}}
                mdRender= {mdParser}
            />
        </div>
    }
}

2. 展示器的使用

2.1 支持参数

名称描述类型默认备注
isRich是否显示富文本Booleanfalsetrue:显示富文本;false:显示 markdown
value内容stringnull
mdRendermarkdown 渲染规则markdown-it需要传入整个markdown-it

2.2 基本使用实例

const mdParser = new MarkdownIt({
  breaks: true, // 转换段落里的 '\n' 到 <br>。
  linkify: true, // 将类似 URL 的文本自动转换为链接。
  typographer: true, // 启用一些语言中立的替换 + 引号美化
  html: true,
  highlight: function(str, lang) {
    if (lang && hljs.getLanguage(lang)) {
      try {
        return hljs.highlight(lang, str).value;
      } catch (__) {}
    }
    return ""; // 使用额外的默认转义
  },
})
  .use(require("markdown-it-toc"))
  .use(markdownItMermaid)
  .use(require("markdown-it-xss"), {
    xss: {
      whiteList: {
        a: ["href", "title", "target"],
        img: ["src"],
      },
    },
  });

class ShowEditors extends React.Component {
  constructor(props) {
    super(props);
  }
render() {
    return (
        <Editors.ShowEditors isRich={true}  value="hhhhhhhhh" mdRender={mdParser} />
    )
  }
}