All Projects → inokawa → remark-slate-transformer

inokawa / remark-slate-transformer

Licence: MIT license
remark plugin to transform remark syntax tree (mdast) to Slate document tree, and vice versa. Made for WYSIWYG markdown editor.

Programming Languages

typescript
32286 projects
javascript
184084 projects - #8 most used programming language

Projects that are alternatives of or similar to remark-slate-transformer

svelte-slate
slate svelte view layer
Stars: ✭ 43 (-30.65%)
Mutual labels:  wysiwyg, slate, slatejs
remark-footnotes
Legacy plugin to add support for pandoc footnotes — please use `remark-gfm` instead
Stars: ✭ 38 (-38.71%)
Mutual labels:  remark, unified, remark-plugin
cache
A cache for @remark-embedder
Stars: ✭ 12 (-80.65%)
Mutual labels:  remark, remark-plugin
Remark
remark is a popular tool that transforms markdown with plugins. These plugins can inspect and change your markup. You can use remark on the server, the client, CLIs, deno, etc.
Stars: ✭ 4,746 (+7554.84%)
Mutual labels:  remark, unified
remark-directive
remark plugin to support directives
Stars: ✭ 137 (+120.97%)
Mutual labels:  remark, remark-plugin
slackify-markdown
Convert markdown into Slack-specific markdown
Stars: ✭ 80 (+29.03%)
Mutual labels:  remark, unified
remark-highlight.js
Legacy plugin to highlight code blocks with highlight.js — please use `rehype-highlight` instead
Stars: ✭ 58 (-6.45%)
Mutual labels:  remark, remark-plugin
slate-react-dnd-plugin
No description or website provided.
Stars: ✭ 35 (-43.55%)
Mutual labels:  slate, slatejs
awesome-remark
Curated list of awesome remark resources
Stars: ✭ 186 (+200%)
Mutual labels:  remark, unified
remark-autolink-headings
Legacy remark plugin to automatically add links to headings — please use `rehype-autolink-headings` instead
Stars: ✭ 63 (+1.61%)
Mutual labels:  remark, remark-plugin
remark-frontmatter
remark plugin to support frontmatter (YAML, TOML, and more)
Stars: ✭ 167 (+169.35%)
Mutual labels:  remark, remark-plugin
remark-man
plugin to compile markdown to man pages
Stars: ✭ 87 (+40.32%)
Mutual labels:  remark, remark-plugin
transformer-oembed
@remark-embedder transformer for oEmbed supported links
Stars: ✭ 25 (-59.68%)
Mutual labels:  remark, remark-plugin
strip-markdown
plugin remove Markdown formatting
Stars: ✭ 84 (+35.48%)
Mutual labels:  remark, remark-plugin
remark-rehype
plugin that turns markdown into HTML to support rehype
Stars: ✭ 118 (+90.32%)
Mutual labels:  remark, mdast
Mdx
Markdown for the component era
Stars: ✭ 11,948 (+19170.97%)
Mutual labels:  remark, unified
remark-admonitions
Add admonitions support to Remarkable
Stars: ✭ 90 (+45.16%)
Mutual labels:  remark, remark-plugin
twoslash
You take some Shiki, add a hint of TypeScript compiler, and 🎉 incredible static code samples
Stars: ✭ 596 (+861.29%)
Mutual labels:  remark, remark-plugin
react-remark
React component and hook to use remark to render markdown
Stars: ✭ 81 (+30.65%)
Mutual labels:  remark, unified
remark-bookmarks
plugin to manage links
Stars: ✭ 15 (-75.81%)
Mutual labels:  remark, remark-plugin

remark-slate-transformer

npm npm check demo

remark plugin to transform remark syntax tree (mdast) to Slate document tree, and vice versa. Made for WYSIWYG markdown editor.

remark is popular markdown parser/serializer which data structure can be converted to what used in rehype, retext and so on. Slate is fully customizable rich text editor built on React. Connect both 2 worlds should be great...

Support

This plugin supports slate 0.50+. The data structure is described here. And also support ~0.47.9 currently, but I don't know in the future.

All nodes in mdast syntax tree are supported, including nodes created with...

And also have experimental support for custom AST.

Demo

https://inokawa.github.io/remark-slate-transformer/

Install

npm install remark-slate-transformer

Supported unified versions

remark-slate-transformer unified
>=0.7.0 >=10.1.0
>=0.5.0 <0.7.0 >=10.0.0
<0.5.0 <10.0.0

Usage

Transform remark to slate

0.50+

import { unified } from "unified";
import markdown from "remark-parse";
import { remarkToSlate } from "remark-slate-transformer";

const processor = unified().use(markdown).use(remarkToSlate);

const text = "# hello world";

const value = processor.processSync(text).result;
console.log(value);

~0.47.9

import { Value } from "slate";
import { unified } from "unified";
import markdown from "remark-parse";
import { remarkToSlateLegacy } from "remark-slate-transformer";

const processor = unified().use(markdown).use(remarkToSlateLegacy);

const text = "# hello world";

const value = Value.fromJSON(processor.processSync(text).result);
console.log(value);

Transform slate to remark

0.50+

import { unified } from "unified";
import stringify from "remark-stringify";
import { slateToRemark } from "remark-slate-transformer";

const processor = unified().use(slateToRemark).use(stringify);

const value = ...; // value passed to slate editor

const ast = processor.runSync({
  type: "root",
  children: value,
});
const text = processor.stringify(ast);
console.log(text);

~0.47.9

import { unified } from "unified";
import stringify from "remark-stringify";
import { slateToRemarkLegacy } from "remark-slate-transformer";

const processor = unified().use(slateToRemarkLegacy).use(stringify);

const value = ...; // value passed to slate editor

const ast = processor.runSync({
  type: "root",
  children: value.toJSON().document.nodes,
});
const text = processor.stringify(ast);
console.log(text);

Support custom AST

import { unified } from "unified";
import markdown from "remark-parse";
import stringify from "remark-stringify";
import { remarkToSlate, slateToRemark } from "remark-slate-transformer";

const text = "# hello world";
const r2s = unified()
  .use(markdown)
  .use(remarkToSlate, {
    // If you use TypeScript, install `@types/mdast` for autocomplete.
    overrides: {
      // This overrides `type: "heading"` builder of remarkToSlate
      heading: (node, next) => ({
        type: "head",
        dep: node.depth,
        // You have to call next if the node have children
        children: next(node.children),
      }),
      // Unknown type from community plugins can be handled
      foo: (node, next) => ({ type: "foo", value: node.bar }),
    },
  });
const value = r2s.processSync(text).result;
console.log(value);

const s2r = unified()
  .use(slateToRemark, {
    overrides: {
      head: (node, next) => ({
        type: "heading",
        depth: node.dep,
        children: next(node.children),
      }),
      foo: (node, next) => ({ type: "foo", bar: node.value }),
    },
  })
  .use(stringify);
const ast = s2r.runSync({
  type: "root",
  children: value,
});
const text = s2r.stringify(ast);
console.log(text);

Utilities

Transformer utilities mdastToSlate and slateToMdast are also exported for more fine-tuned control.

Contribute

All contributions are welcome! If you have any feature requests or improvements, please create a issue or PR.

Making a Pull Request

  1. Clone this repo.
  2. Run npm install.
  3. Commit your fix.
  4. Make a PR and confirm all the CI checks passed.

Related projects

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].