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.
-
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.
-
In go, the
map
s 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 JSschema
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" }]
]
- 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)
}
- 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.
The port in Go of ProseMirror has been developed by Cozy Cloud and is distributed under the AGPL v3 license.