Huge News!Announcing our $40M Series B led by Abstract Ventures.Learn More
Socket
Sign inDemoInstall
Socket

bytemd

Package Overview
Dependencies
Maintainers
1
Versions
71
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

bytemd

Full-featured markdown editor and viewer

  • 1.0.3
  • Source
  • npm
  • Socket score

Version published
Weekly downloads
2.8K
increased by15.67%
Maintainers
1
Weekly downloads
 
Created
Source

ByteMD

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

PackageStatusDescription
bytemdnpm gzip sizeSvelte/Vanilla JS component
@bytemd/reactnpm gzip sizeReact component
@bytemd/vuenpm gzip sizeVue component

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.

Before using the component, remember to import CSS file to make styles correct:

import 'bytemd/dist/index.css';

Svelte

<script>
  import { Editor, Viewer } from 'bytemd';
  import gfm from '@bytemd/plugin-gfm';

  let value;
  const plugins = [
    gfm(),
    // Add more plugins here
  ];

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

<template>
  <Editor {value} {plugins} on:change={handleChange} />
</template>

React

import { Editor, Viewer } from '@bytemd/react';
import gfm from '@bytemd/plugin-gfm';

const plugins = [
  gfm(),
  // Add more plugins here
];

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

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

Vue

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

<script>
import { Editor, Viewer } from '@bytemd/vue';
import gfm from '@bytemd/plugin-gfm';

const plugins = [
  gfm(),
  // Add more plugins here
];

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

Vanilla JS

import { Editor, Viewer } from 'bytemd';
import gfm from '@bytemd/plugin-gfm';

const plugins = [
  gfm(),
  // Add more plugins here
];

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

editor.on('change', (e) => {
  editor.$set({ value: e.detail.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

PackageStatusDescription
@bytemd/plugin-breaksnpm gzip sizeSupport breaks
@bytemd/plugin-external-linksnpm gzip sizeOpen external links in new window
@bytemd/plugin-footnotesnpm gzip sizeSupport footnotes
@bytemd/plugin-frontmatternpm gzip sizeParse frontmatter
@bytemd/plugin-gemojinpm gzip sizeSupport Gemoji shortcodes
@bytemd/plugin-gfmnpm gzip sizeSupport GFM (autolink literals, strikethrough, tables, tasklists)
@bytemd/plugin-highlightnpm gzip sizeHighlight code blocks
@bytemd/plugin-highlight-ssrnpm gzip sizeHighlight code blocks (SSR compatible)
@bytemd/plugin-import-htmlnpm gzip sizeImport HTML by pasting or dropping
@bytemd/plugin-import-imagenpm gzip sizeImport image by pasting or dropping
@bytemd/plugin-inject-stylenpm gzip sizeInject style to markdown body
@bytemd/plugin-mathnpm gzip sizeSupport math equation
@bytemd/plugin-math-ssrnpm gzip sizeSupport math equation (SSR compatible)
@bytemd/plugin-medium-zoomnpm gzip sizeZoom images like Medium
@bytemd/plugin-mermaidnpm gzip sizeSupport Mermaid diagram and flowchart
@bytemd/plugin-veganpm gzip sizeSupport vega charts

Write a plugin

TODO

License

MIT

FAQs

Package last updated on 27 Oct 2020

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc