@curvenote/schema
Version:
Schema and markdown parser for @curvenote/editor
125 lines (98 loc) • 4.83 kB
Markdown
# @curvenote/schema
[](https://www.npmjs.com/package/@curvenote/schema)
[](https://github.com/curvenote/editor/blob/main/LICENSE)

Schema for interactive scientific writing, with translations to [MyST flavoured markdown](https://myst-parser.readthedocs.io/en/latest/), LaTeX, and HTML.

## Overview & Goals
- Provide a typed schema for writing reactive scientific documents using [@curvenote/components](https://curvenote.dev)
- Uses [Web Components](https://developer.mozilla.org/en-US/docs/Web/Web_Components) in the rendered HTML output for non-standard components
- Uses standard html for all other compnents, with no styling enforced
- Interoperability with CommonMark markdown and [MyST](https://github.com/executablebooks/markdown-it-myst)
- Through `fromMarkdown` and `toMarkdown` methods
- Provide components for [WYSIWYG](https://en.wikipedia.org/wiki/WYSIWYG) editing of reactive documents
- See [`@curvenote/editor`](https://github.com/curvenote/editor) or [curvenote.com](Curvenote.com) for the editor!
## Choices
- The internal representation for the library is a [ProseMirror Document](https://prosemirror.net/docs/guide/#doc) structure (that can be rendered as JSON)
- [markdown-it](https://github.com/markdown-it/markdown-it) is used parse and tokenize markdown content
## Schema
The schema has `Nodes` and `Marks` where `Nodes` are basically a block of content (paragraph, code, etc.), and `Marks` are inline modifications to the content (bold, emphasis, links, etc.). See the ProseMirror docs for a [visual explanation](https://prosemirror.net/docs/guide/#doc).
**Overview of `Nodes`**
- Basic Markdown
- text
- paragraph
- heading
- blockquote
- code_block
- image
- horizontal_rule
- hard_break
- ordered_list
- bullet_list
- list_item
- Presentational Components
- [callout](https://curvenote.dev/article/callout)
- [aside](https://curvenote.dev/article/aside)
- [math](https://curvenote.dev/article/math)
- [equation](https://curvenote.dev/article/equation)
- Reactive Components
- [variable](https://curvenote.dev/components/variable)
- [display](https://curvenote.dev/components/display)
- [dynamic](https://curvenote.dev/components/dynamic)
- [range](https://curvenote.dev/components/range)
- [switch](https://curvenote.dev/components/switch)
**Overview of `Marks`**
- link
- code
- em
- strong
- superscript
- subscript
- strikethrough
- underline
- abbr
## Simple Example
This moves from markdown --> JSON --> HTML. The JSON is the intermediate representation for `@curvenote/editor`.
```javascript
import { Schema, nodes, marks, fromMarkdown, toHTML } from '@curvenote/schema';
import { JSDOM } from 'jsdom';
const schema = new Schema({ nodes, marks });
const content = '# Hello `@curvenote/schema`!';
const doc = fromMarkdown(content, schema);
console.log(doc.toJSON());
>> {
"type": "doc",
"content": [
{
"type": "heading",
"attrs": { "level": 1 },
"content": [
{ "type": "text", "text": "Hello " },
{
"type": "text",
"marks": [ { "type": "code" } ],
"text": "@curvenote/schema"
},
{ "type": "text", "text": "!" }
]
}
]
}
// Assuming we are in node, just use `document` if in a browser!
const { document } = new JSDOM('').window;
// Now move the document back out to html
const html = toHTML(doc, schema, document);
console.log(html);
>> "<h1>Hello <code>@curvenote/schema</code>!</h1>"
```
### Roadmap
- Integrate other `@curvenote/components` as nodes
- Improve equation and start to go to/from various MyST syntax for this
- Add figure properties (name, width, caption etc.)
- Provide citations, probably bring in a bibtex parser
- Introduce citation and reference component to curvenote/components or article
- Add overlaping roles/directives with MyST (e.g. see [executablebooks/meta#70](https://github.com/executablebooks/meta/issues/70)) for pointers
- Add the necessary pieces to curvenote/components that are not basic html (MyST uses sphinx for the heavy lifting, cross-refs etc.)
- Provide other sereializers from the document strucutre (e.g. latex or simple html without curvenote/components, possibly idyll)
## See also:
- [Idyll Lang](https://idyll-lang.org/) has a different markdown-like serialization with very similar base components to curvenote - see [curvenote/article#8](https://github.com/curvenote/article/issues/8) for a comparison.