Skip to content

MyDramaList/prosemirror-go

 
 

Repository files navigation

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.

About

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

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Go 99.6%
  • Makefile 0.4%