/prosemirror-go

A port in Go of ProseMirror for writing a collaborative editing server

Primary LanguageGoGNU Affero General Public License v3.0AGPL-3.0

ProseMirror in Go

go.dev reference Build Status Go Report Card

Introduction

ProseMirror is a well-behaved rich semantic content editor based on contentEditable, with support for collaborative editing and custom document schemas. This repository contains a port in Go of prosemirror-model and prosemirror-transform in order to have the server part of the collaborative editing in Go.

Notes

  1. Only the code necessary for writing a server for collaborative editing will be ported, not things like translating a document to/from a DOM representation which are only useful on the clients.

  2. In go, the maps don't preserve the order of the key (and even the JSON spec doesn't say that there is an order for object fields). OrderedMap in the JS schema needs to be serialized in JSON to an array of tuples [key, value] to keep the order:

[
  ["em", { "inclusive": true, "group": "fontStyle" }],
  ["strong", { "inclusive": true, "group": "fontStyle" }]
]
  1. Go doesn't support optional arguments like JS does. We are emulating this with variadic arguments:
  // :: (number, number, (node: Node, pos: number, parent: Node, index: number) → ?bool, ?number)
  nodesBetween(from, to, f, startPos = 0) {
    this.content.nodesBetween(from, to, f, startPos, this)
  }
func (n *Node) NodesBetween(from, to int, fn NBCallback, startPos ...int) {
	s := 0
	if len(startPos) > 0 {
		s = startPos[0]
	}
	n.Content.NodesBetween(from, to, fn, s, n)
}
  1. Exceptions in JS can be manager in Go by returning an error, or with a panic. We have tried to panic only for logic bugs and out of bounds access, and returning an error everywhere else.

License

The port in Go of ProseMirror has been developed by Cozy Cloud and is distributed under the AGPL v3 license.