简单的浏览器框架:开源的语义丰富的浏览器端文本编辑器
简单的浏览器框架:开源的语义丰富的浏览器端文本编辑器import {EditorState} from "prosemirror-state" import {EditorView} from "prosemirror-view" import {schema DOMParser} from "prosemirror-model" import {schema} from "prosemirror-schema-basic" import {addListNodes} from "prosemirror-schema-list" import {exampleSetup} from "prosemirror-example-setup" // Mix the nodes from prosemirror-schema-list into the basic schema to // create a schema with list su
介绍prosemirror是一个用于在Web端构建富文本编辑器的工具包 理想的内容编辑器可以生成结构化,语义上有意义的文档,但这样做的方式很容易让用户理解。ProseMirror试图弥合Markdown文本编辑和经典WYSIWYG(所见即所得)编辑器之间的差距。它通过实现WYSIWYG风格的编辑界面来实现这一点,该界面比纯HTML更受约束和结构化。你可以自定义编辑器创建的文档的形状和结构,并根据应用程序的需要进行定制。所以还是值得尝试下的!
Github
https://github.com/prosemirror
相关特性- 协同编辑
ProseMirror具有内置的,可靠的支持,用于协作编辑,其中多个人实时处理同一文档。
- 可扩展的模式文档模式
允许使用自定义结构编辑文档,而无需从头开始编写自己的编辑器。
- 模块化
模块化架构确保您只加载所需的代码,并可根据需要替换系统的各个部分。
- 可插拔插件系统
允许您轻松启用其他功能,并以方便的格式打包您自己的扩展。
- 功能实用
强大且不可变的体系结构使ProseMirror可以轻松集成到现代Web应用程序中,并可以自信地实现复杂的行为。
- Unopinionated
核心库很小且通用,提供了可以构建非常不同类型的编辑器的基础。
实例Demo- 基本示例
import {EditorState} from "prosemirror-state" import {EditorView} from "prosemirror-view" import {schema DOMParser} from "prosemirror-model" import {schema} from "prosemirror-schema-basic" import {addListNodes} from "prosemirror-schema-list" import {exampleSetup} from "prosemirror-example-setup" // Mix the nodes from prosemirror-schema-list into the basic schema to // create a schema with list support. const mySchema = new Schema({ nodes: addListNodes(schema.spec.nodes "paragraph block*" "block") marks: schema.spec.marks }) window.view = new EditorView(document.querySelector("#editor") { state: EditorState.create({ doc: DOMParser.fromSchema(mySchema).parse(document.querySelector("#content")) plugins: exampleSetup({schema: mySchema}) }) })
- 图片上传
用户的本地文件系统插入图像时,在上传图像并为其创建URL之前,将无法访问实际图像。但是,你不希望让用户首先完成上传图像的动作,然后等待其完成,然后才将图像插入到文档中。理想情况下,选择图像后,可以开始上传,但也会立即在文档中插入占位符。然后,当上载完成时,该占位符将替换为最终图像。
- 自定义菜单
prosemirror允许自定义菜单,这样更加可控,灵活性更强
class MenuView { constructor(items editorView) { this.items = items this.editorView = editorView this.dom = document.createElement("div") this.dom.className = "menubar" items.forEach(({dom}) => this.dom.appendChild(dom)) this.update() this.dom.addEventListener("mousedown" e => { e.preventDefault() editorView.focus() items.forEach(({command dom}) => { if (dom.contains(e.target)) command(editorView.state editorView.dispatch editorView) }) }) } update() { this.items.forEach(({command dom}) => { let active = command(this.editorView.state null this.editorView) dom.style.display = active ? "" : "none" }) } destroy() { this.dom.remove() } }
- 嵌入代码编辑器
嵌入代码编辑器,使某个节点的文档内(例如代码块,数学公式或图像)显示为专门用于此类内容的自定义编辑器控件非常实用。节点视图是ProseMirror功能,可实现此功能。将此节点视图和键映射连接到编辑器中可以得到如下内容:
具体的代码实现比较多就不在此多占篇幅,感兴趣的可以根据示例去实践下
- Github介绍
github地址已经给出,实际上它是由很多个类似于插件的仓库组组成,一共多达20多个仓库,可见其灵活的插件模式
总结
这样一个浏览器内部语义丰富的编辑器是值得尝试的,你可以利用它来创建符合本身需求的编辑器,感兴趣的小伙伴可以直接去查看相关代码仓库学习使用,以及提供的相关使用文档!