Go to file
Rongjian Zhang 535d536742 chore: soft link readme 2020-07-21 17:00:24 +08:00
.github/workflows ci: rename to showcase 2020-07-19 21:03:09 +08:00
assets docs: add technical details 2020-07-21 16:22:47 +08:00
examples feat(example): add mode switch 2020-07-19 14:49:56 +08:00
packages chore: soft link readme 2020-07-21 17:00:24 +08:00
scripts feat: add info link 2020-07-19 15:21:14 +08:00
.gitignore fix: type errors 2020-07-03 21:08:42 +08:00
.prettierignore build: fix readme generation of hyphen name 2020-03-31 19:20:35 +08:00
.prettierrc style: prettier write 2020-05-11 21:20:52 +08:00
LICENSE Initial commit 2020-02-10 20:32:52 +08:00
README.md chore: soft link readme 2020-07-21 17:00:24 +08:00
babel.config.js test: add editor cases 2020-07-11 19:23:33 +08:00
jest-setup.ts test: add editor cases 2020-07-11 19:23:33 +08:00
jest.config.js test: add editor cases 2020-07-11 19:23:33 +08:00
package.json test: add editor cases 2020-07-11 19:23:33 +08:00
rollup.config.js refactor: scroll sync plugin 2020-07-16 20:35:58 +08:00
tsconfig-base.json test: add editor cases 2020-07-11 19:23:33 +08:00
tsconfig.json refactor: scroll sync plugin 2020-07-16 20:35:58 +08:00

README.md

ByteMD

npm showcase test

ByteMD is a Markdown editor component built with Svelte. It could also be used in other libraries/frameworks such as React, Vue and Angular.

Features

  1. Lightweight and framework agnostic: ByteMD is built with Svelte. It compiles to vanilla JS DOM manipulation without importing any UI Framework runtime bundle, which makes it lightweight, and easily adapted to other libraries/frameworks.
  2. Easy to extend: ByteMD has a plugin system to extend the basic Markdown syntax, which makes it easy to add additional features such as code syntax highlight, math equation and Mermaid flowcharts. You can also write your own plugin if these ones don't meet your needs.
  3. Secure by default: Cross-site scripting(XSS) attack such as <script> and <img onerror> have been correctly handled by ByteMD. No need to introduce extra DOM sanitize steps.
  4. SSR compatiable: ByteMD could be used in the Server-side rendering(SSR) environment without extra config. SSR is widely used in some cases due to its better SEO and fast time-to-content in slow network connection.

Installation

npm install bytemd
# or
yarn add bytemd

Usage

There are two components: Editor and Viewer. Editor is the Markdown editor, as the name suggests; Viewer is commonly used to display rendered Markdown results without editing.

Svelte

<template>
  <Editor {value} on:change={handleChange} />
</template>
<script>
import { Editor, Viewer } from 'bytemd'

let value;
function handleChange(e) {
  value = e.detail.value
}
</script>

React

import { Editor, Viewer } from 'bytemd/react';

const App = () => {
  const [value, setValue] = useState('');

  return (
    <Editor
      value={value}
      onChange={(v) => {
        setValue(v);
      }}
    />
  );
};

Vue

<template>
  <Editor :value="value" @change="handleChange" />
</template>

<script>
import { Editor, Viewer } from 'bytemd/vue';

export default {
  components: {
    Editor,
  },
  data() {
    return {
      value: '',
    };
  },
  methods: {
    handleChange(v) {
      value = v;
    },
  },
};
</script>

Vanilla JS

import { Editor, Viewer } from 'bytemd';

const instance = new Editor({
  target: document.body, // DOM to render
  props: {},
});

instance.on('change', (e) => {
  const value = e.detail.value;
  console.log(value);
  // ...
});

Technical details

ByteMD uses remark and rehype ecosystem to process Markdown. The complete process is as follows:

  1. The markdown text is parsed to an AST
  2. The Markdown AST could be manipulated by several remark plugins
  3. The Markdown AST is transformed to a HTML AST
  4. The HTML AST is sanitized for security reason
  5. The HTML AST could be manipulated by several rehype plugins
  6. The HTML AST is stringified to HTML
  7. Some extra DOM manipulation after the HTML being rendered

It could also be described as a flowchart:

process

The 2,5,7 steps are designed for user customization via ByteMD plugin API.

Plugins

Package Version Description
@bytemd/plugin-footnotes npm support footnotes
@bytemd/plugin-highlight npm highlight code blocks
@bytemd/plugin-math npm support math equation
@bytemd/plugin-mermaid npm support mermaid diagram and flowchart

Write a plugin

TODO

License

MIT