Categorygithub.com/seanblong/embedmd
modulepackage
0.2.7
Repository: https://github.com/seanblong/embedmd.git
Documentation: pkg.go.dev

# README

embedmd

Coverage CI Go Report Card pre-commit.ci status

Are you tired of copy pasting your code into your README.md file, just to forget about it later on and have unsynced copies? Or even worse, code that does not even compile?

Then embedmd is for you!

embedmd embeds files or fractions of files into Markdown files. It does so by searching embedmd commands, which are a subset of the Markdown syntax for comments. This means they are invisible when Markdown is rendered, so they can be kept in the file as pointers to the origin of the embedded text.

The command receives a list of Markdown files. If no list is given, the command reads from the standard input.

The format of an embedmd command is:

[embedmd]:# (pathOrURL language /start regexp/ /end regexp/)

The embedded code will be extracted from the file at pathOrURL, which can either be a relative path to a file in the local file system (using always forward slashes as directory separator) or a URL starting with http:// or https://. If the pathOrURL is a URL the tool will fetch the content in that URL. The embedded content starts at the first line that matches /start regexp/ and finishes at the first line matching /end regexp/.

[!TIP] If the URL is part of a private repository, you can use a personal access token to authenticate by saving the token to environment variable GITHUB_TOKEN.

Omitting the the second regular expression will embed only the piece of text that matches /regexp/:

[embedmd]:# (pathOrURL language /regexp/)

To embed the whole line matching a regular expression you can use:

[embedmd]:# (pathOrURL language /.*regexp.*/)

To embed from a point to the end you should use:

[embedmd]:# (pathOrURL language /start regexp/ $)

To embed a whole file, omit both regular expressions:

[embedmd]:# (pathOrURL language)

You can omit the language in any of the previous commands, and the extension of the file will be used for the snippet syntax highlighting.

This works when the file extensions matches the name of the language (like Go files, since .go matches go). However, this will fail with other files like .md whose language name is markdown.

[embedmd]:# (file.ext)

If you want to remove code fencing altogether, you can explicitly use none as the language. This can be useful when composing large, rendered Markdown files out of smaller Markdown files that contain fenced code blocks themselves.

[embedmd]:# (file.md none)

Installation

You can install Go by following these instructions.

embedmd is written in Go, so if you have Go installed you can install it with go install:

go install github.com/seanblong/embedmd

This will download the code, compile it, and leave an embedmd binary in $GOPATH/bin.

Usage

Given the two files in sample:

hello.go:

// Copyright 2016 Google Inc. All rights reserved.
// Use of this source code is governed by the Apache 2.0
// license that can be found in the LICENSE file.

package main

import (
	"fmt"
	"time"
)

func main() {
	fmt.Println("Hello, there, it is", time.Now())
}

docs.md:

# A hello world in Go

Go is very simple, here you can see a whole "hello, world" program.

[embedmd]:# (hello.go)

We can try to embed a file from a directory.

[embedmd]:# (test/hello.go /func main/ $)

You always start with a `package` statement like:

[embedmd]:# (hello.go /package.*/)

Followed by an `import` statement:

[embedmd]:# (hello.go /import/ /\)/)

You can also see how to get the current time:

[embedmd]:# (hello.go /time\.[^)]*\)/)

You can render the docs.md file with the embedded code snippets by running:

embedmd docs.md

You can redirect this output to a file:

embedmd docs.md > rendered.md

Conversely output can be rendered in place or diffed with the -w and -d respectively. See flags below for more details.

Flags

  • -w: Executing embedmd -w docs.md will modify docs.md and add the corresponding code snippets, as shown in sample/result.md.

  • -d: Executing embedmd -d docs.md will display the difference between the contents of docs.md and the output of embedmd docs.md.

Pre-commit

Hooks for pre-commit have been provided to easily integrate embedmd into your CI workflow. By default it will run a check with -d and fail a commit if there are differences, i.e., drift between what a file has currently rendered and its source. Below is an example .pre-commit-config.yaml:

repos:
  - repo: https://github.com/seanblong/embedmd
    rev: v0.2.3
    hooks:
      - id: embedmd
        # uncomment to have hook perform in-place update
        # args: [-w]
        # uncomment to exclude subdirectories
        # exclude: sample/

# Packages

Package embedmd provides a single function, Process, that parses markdown searching for markdown comments.
No description provided by the author