imcuttle / live-markd

📝Github Favorite Markdown preview with live rendering & location and highlight changed block.
MIT License
9 stars 0 forks source link
gfm github live markdown preview

live-markd

Build status Test coverage NPM version NPM Downloads Prettier Conventional Commits

📝Github Favorite Markdown(gfm) preview with live rendering & location and highlight changed block.

Table of Contents

Installation

npm install live-markd -g

live-markd .

Usage

Standalone

const liveMarkd = require('live-markd')

// Returns express app instance listened port 8080
const app = liveMarkd('path/to/dir', {
  port: 8080,
  baseUrl: '/www'
})

Use with express

const app = require('express')()
const liveMarkd = require('live-markd')

const middleware = liveMarkd('path/to/dir', {
  heartBeatDelay: 4 * 1000, // 4s
  gssOptions: {}
})

app.use(middleware)
// or
app.use('/base-url', middleware)

CLI

npm i live-markd -g
live-markd <path>

API

liveMarkd(root [, options])

root

The markdown files' root folder or exact file.

Options

port

The server's port

baseUrl

The server's baseUrl (only works on port is assigned)

heartBeatDelay

The heartbeat detection's interval millisecond

gssOptions

Except port, basePath, rest options extends github-similar-server

templateParameters

NOTE: Expect preset parameters from github-similar-server

live-markd has injected follow parameters

name description
baseUrl the base url from app.use('/baseUrl', lived(...))
markdownTemplate

The path of markdown's template, It's useful for customizing your suitable markdown style.

How it works?

Data Flow

Fs Watcher -> Event Stream -> Client
                   |
   markdown diff   |   heartbeat & data
                   |
      [ Server ]   |   [ Browser ]

Markdown Diff

I use remark for treating markdown text as markdown abstract syntax tree(MDAST), then new MDAST comparing with old one.

For example

# hi
world
# hi
world!
{
  type: 'root',
  children: [
    {
      type: 'heading',
      depth: 1,
      children: [{
        type: 'paragraph',
        children: [{ type: 'text', value: 'world' }]
      }]
    }
  ]
}
{
  type: 'root',
  children: [
    {
      type: 'heading',
      depth: 1,
      children: [{
        type: 'paragraph',
        // This node is different with `old.md`
        children: [{ type: 'text', value: 'world!' }]
      }]
    }
  ]
}

Related

Contributing

Authors

This library is written and maintained by imcuttle, moyuyc95@gmail.com.

License

MIT - imcuttle 🐟