Snippet finds code snippets delimited by comments in source code and expands templates that use these snippets.
The core use-case is to enable developers to test code snippets that they put into documentation in CI.
go install github.com/snamber/snippet/cmd/snippet
snippet
offers four command line parameters
-h --help Displays help with available flag, subcommand, and positional value parameters.
-s --snippets The file or directory in which snippets are defined.
-t --templates The file or directory containing the output template(s).
-o --output The directory where output file(s) will be written.
To generate this readme for example, clone this project, and execute the following command in the root directory
snippet -s example/testdata -t example/template/readme.md -o .
or
snippet -s example/testdata -t example/template -o .
Single-line comments like
// START SNIPPET tag
define the start of snippets, and associate the snippet with a tag.
Single-line comments like
// END SNIPPET
define the end of the respective snippet.
The prefix used to declare a comment depends on the language; in Python a snippet would be defined like this:
# START SNIPPET tag
# END SNIPPET
Tags can contain letters, digits, _
and -
. Spacing matters.
To mark a location into which a snippet should be expanded, write a line like
// PUT SNIPPET tag
Reference the respective tag. Markdown does not have comments: Use //
as a comment prefix in Markdown.
Snippet trims the indentation at the definition of a snippet, and replaces it with the indentation of the 'PUT' comment at the use of a snippet.
For the following definition
// START SNIPPET tag
func foo() {
var foo string
}
// END SNIPPET
and the following use
// PUT SNIPPET tag
would result in this expanded snippet
func foo() {
var foo string
}
Currently snippet supports the following file extensions, with the associated single-line comment prefixes
.c: "//"
.cpp: "//"
.go: "//"
.h: "//"
.java: "//"
.js: "//"
.kt: "//"
.md: "//"
.py: "#"
.ts: "//"
.sh: "//"
.txt: "//"
Contributions, specifically support for more languages, is appreciated.
To support another file extension modify language.go, provide a snippet for the readme by putting a file
of the respective language into example/testdata
, updating example/template
, re-generate the readme by using snippet
, and create a PR.
The folder test
contains an example where a snippet extracts part of a tested piece of code.
Here we see sample output of snippet
, with snippets defined in example/testdata
, and the template for this file defined in example/template
.
C
int main(void)
{
puts("Hello, world!");
}
C++
int main()
{
std::cout << "Hello, world!";
return 0;
}
Go
func main(){
fmt.Println("Hello, World!")
}
Java
System.out.println("Hello, World!");
Javascript
console.log("Hello, World!")
Kotlin
println("Hello World!")
Python
print("Hello, World!")
Text
Hello, World!
Typescript
let helloWorld = "Hello World";
// ^ = let helloWorld: string