Documentation ¶
Overview ¶
Package blackfriday is a markdown processor.
It translates plain text with simple formatting rules into an AST, which can then be further processed to HTML (provided by Blackfriday itself) or other formats (provided by the community).
The simplest way to invoke Blackfriday is to call the Run function. It will take a text input and produce a text output in HTML (or other format).
A slightly more sophisticated way to use Blackfriday is to create a Markdown processor and to call Parse, which returns a syntax tree for the input document. You can leverage Blackfriday's parsing for content extraction from markdown documents. You can assign a custom renderer and set various options to the Markdown processor.
If you're interested in calling Blackfriday from command line, see https://github.com/gogather/blackfriday-tool.
Sanitized Anchor Names ¶
Blackfriday includes an algorithm for creating sanitized anchor names corresponding to a given input text. This algorithm is used to create anchors for headings when AutoHeadingIDs extension is enabled. The algorithm is specified below, so that other packages can create compatible anchor names and links to those anchors.
The algorithm iterates over the input text, interpreted as UTF-8, one Unicode code point (rune) at a time. All runes that are letters (category L) or numbers (category N) are considered valid characters. They are mapped to lower case, and included in the output. All other runes are considered invalid characters. Invalid characters that precede the first valid character, as well as invalid character that follow the last valid character are dropped completely. All other sequences of invalid characters between two valid characters are replaced with a single dash character '-'.
SanitizedAnchorName exposes this functionality, and can be used to create compatible links to the anchor names generated by blackfriday. This algorithm is also implemented in a small standalone package at github.com/shurcooL/sanitized_anchor_name. It can be useful for clients that want a small package and don't need full functionality of blackfriday.
Package blackfriday is a markdown processor.
Translates plain text with simple formatting rules into HTML or LaTeX.
Index ¶
- Constants
- Variables
- func Markdown(input []byte, renderer Renderer, options Options) []byte
- func MarkdownBasic(input []byte) []byte
- func MarkdownCommon(input []byte) []byte
- type CellAlignFlags
- type CodeBlockData
- type Extensions
- type HTMLFlags
- type HTMLRenderer
- type HTMLRendererParameters
- type HeaderData
- type Latex
- func (r *Latex) AutoLink(link []byte, kind autolinkType)
- func (r *Latex) BeginFootnotes()
- func (r *Latex) BeginHeader(level int, id string)
- func (r *Latex) BeginList(flags ListType)
- func (r *Latex) BeginParagraph()
- func (r *Latex) BlockCode(text []byte, lang string)
- func (r *Latex) BlockHtml(text []byte)
- func (r *Latex) BlockQuote(text []byte)
- func (r *Latex) CodeSpan(text []byte)
- func (r *Latex) DocumentFooter()
- func (r *Latex) DocumentHeader()
- func (r *Latex) DoubleEmphasis(text []byte)
- func (r *Latex) Emphasis(text []byte)
- func (r *Latex) EndFootnotes()
- func (r *Latex) EndHeader(level int, id string, header []byte)
- func (r *Latex) EndList(flags ListType)
- func (r *Latex) EndParagraph()
- func (r *Latex) Entity(entity []byte)
- func (r *Latex) FootnoteItem(name, text []byte, flags ListType)
- func (r *Latex) FootnoteRef(ref []byte, id int)
- func (r *Latex) HRule()
- func (r *Latex) Image(link []byte, title []byte, alt []byte)
- func (r *Latex) LineBreak()
- func (r *Latex) Link(link []byte, title []byte, content []byte)
- func (r *Latex) ListItem(text []byte, flags ListType)
- func (r *Latex) NormalText(text []byte)
- func (r *Latex) RawHtmlTag(tag []byte)
- func (r *Latex) Render(ast *Node) []byte
- func (r *Latex) RenderNode(w io.Writer, node *Node, entering bool) WalkStatus
- func (r *Latex) StrikeThrough(text []byte)
- func (r *Latex) Table(header []byte, body []byte, columnData []CellAlignFlags)
- func (r *Latex) TableCell(out *bytes.Buffer, text []byte, align CellAlignFlags)
- func (r *Latex) TableHeaderCell(out *bytes.Buffer, text []byte, align CellAlignFlags)
- func (r *Latex) TableRow(text []byte)
- func (r *Latex) TitleBlock(text []byte)
- func (r *Latex) TripleEmphasis(text []byte)
- type LinkData
- type ListData
- type ListType
- type Node
- type NodeType
- type NodeVisitor
- type Options
- type Reference
- type ReferenceOverrideFunc
- type Renderer
- type SPRenderer
- type TableCellData
- type WalkStatus
Constants ¶
const ( HTMLFlagsNone HTMLFlags = 0 SkipHTML HTMLFlags = 1 << iota // Skip preformatted HTML blocks SkipStyle // Skip embedded <style> elements SkipImages // Skip embedded images SkipLinks // Skip all links Safelink // Only link to trusted protocols NofollowLinks // Only link with rel="nofollow" NoreferrerLinks // Only link with rel="noreferrer" HrefTargetBlank // Add a blank target CompletePage // Generate a complete HTML page UseXHTML // Generate XHTML output instead of HTML FootnoteReturnLinks // Generate a link at the end of a footnote to return to the source TagName = "[A-Za-z][A-Za-z0-9-]*" AttributeName = "[a-zA-Z_:][a-zA-Z0-9:._-]*" UnquotedValue = "[^\"'=<>`\\x00-\\x20]+" SingleQuotedValue = "'[^']*'" DoubleQuotedValue = "\"[^\"]*\"" AttributeValue = "(?:" + UnquotedValue + "|" + SingleQuotedValue + "|" + DoubleQuotedValue + ")" AttributeValueSpec = "(?:" + "\\s*=" + "\\s*" + AttributeValue + ")" Attribute = "(?:" + "\\s+" + AttributeName + AttributeValueSpec + "?)" OpenTag = "<" + TagName + Attribute + "*" + "\\s*/?>" CloseTag = "</" + TagName + "\\s*[>]" HTMLComment = "<!---->|<!--(?:-?[^>-])(?:-?[^-])*-->" ProcessingInstruction = "[<][?].*?[?][>]" Declaration = "<![A-Z]+" + "\\s+[^>]*>" CDATA = "<!\\[CDATA\\[[\\s\\S]*?\\]\\]>" HTMLTag = "(?:" + OpenTag + "|" + CloseTag + "|" + HTMLComment + "|" + ProcessingInstruction + "|" + Declaration + "|" + CDATA + ")" )
HTML renderer configuration options.
const ( NoExtensions Extensions = 0 NoIntraEmphasis Extensions = 1 << iota // Ignore emphasis markers inside words Tables // Render tables FencedCode // Render fenced code blocks Autolink // Detect embedded URLs that are not explicitly marked Strikethrough // Strikethrough text using ~~test~~ LaxHTMLBlocks // Loosen up HTML block parsing rules SpaceHeaders // Be strict about prefix header rules HardLineBreak // Translate newlines into line breaks TabSizeEight // Expand tabs to eight spaces instead of four Footnotes // Pandoc-style footnotes NoEmptyLineBeforeBlock // No need to insert an empty line to start a (code, quote, ordered list, unordered list) block HeaderIDs // specify header IDs with {#id} Titleblock // Titleblock ala pandoc AutoHeaderIDs // Create the header ID from the text BackslashLineBreak // Translate trailing backslashes into line breaks DefinitionLists // Render definition lists Smartypants // Enable smart punctuation substitutions SmartypantsFractions // Enable smart fractions (with Smartypants) SmartypantsDashes // Enable smart dashes (with Smartypants) SmartypantsLatexDashes // Enable LaTeX-style dashes (with Smartypants) SmartypantsAngledQuotes // Enable angled double quotes (with Smartypants) for double quotes rendering TOC // Generate a table of contents OmitContents // Skip the main contents (for a standalone table of contents) LaTeXMath // LaTeX inline and display math surrounded by '$' or '$$' MermaidChart // mermaid chart CommonHTMLFlags HTMLFlags = UseXHTML CommonExtensions Extensions = NoIntraEmphasis | Tables | FencedCode | Autolink | Strikethrough | SpaceHeaders | HeaderIDs | BackslashLineBreak | DefinitionLists | Smartypants | SmartypantsFractions | SmartypantsDashes | SmartypantsLatexDashes )
These are the supported markdown parsing extensions. OR these values together to select multiple extensions.
const ( TableAlignmentLeft = 1 << iota TableAlignmentRight TableAlignmentCenter = (TableAlignmentLeft | TableAlignmentRight) )
These are the possible flag values for the table cell renderer. Only a single one of these values will be used; they are not ORed together. These are mostly of interest if you are writing a new output format.
const ( TabSizeDefault = 4 TabSizeDouble = 8 )
The size of a tab stop.
const Version = "2.0"
Version string of the package.
Variables ¶
var DefaultOptions = Options{ Extensions: CommonExtensions, }
DefaultOptions is a convenience variable with all the options that are enabled by default.
Functions ¶
func Markdown ¶
Markdown is the main rendering function. It parses and renders a block of markdown-encoded text. The supplied Renderer is used to format the output, and extensions dictates which non-standard extensions are enabled.
To use the supplied HTML or LaTeX renderers, see NewHTMLRenderer and NewLatexRenderer, respectively.
func MarkdownBasic ¶
MarkdownBasic is a convenience function for simple rendering. It processes markdown input with no extensions enabled.
func MarkdownCommon ¶
MarkdownCommon is a convenience function for simple rendering. It calls Markdown with most useful extensions enabled, including:
* Smartypants processing with smart fractions and LaTeX dashes
* Intra-word emphasis suppression
* Tables
* Fenced code blocks
* Autolinking
* Strikethrough support
* Strict header parsing
* Custom Header IDs
Types ¶
type CellAlignFlags ¶
type CellAlignFlags int
CellAlignFlags holds a type of alignment in a table cell.
type CodeBlockData ¶
type CodeBlockData struct { IsFenced bool // Specifies whether it's a fenced code block or an indented one Info []byte // This holds the info string FenceChar byte FenceLength int FenceOffset int }
CodeBlockData contains fields relevant to a CodeBlock node type.
type Extensions ¶
type Extensions int
Extensions is a bitwise or'ed collection of enabled Blackfriday's extensions.
type HTMLRenderer ¶
type HTMLRenderer struct { HTMLRendererParameters // contains filtered or unexported fields }
HTMLRenderer is a type that implements the Renderer interface for HTML output.
Do not create this directly, instead use the NewHTMLRenderer function.
func NewHTMLRenderer ¶
func NewHTMLRenderer(params HTMLRendererParameters) *HTMLRenderer
NewHTMLRenderer creates and configures an HTMLRenderer object, which satisfies the Renderer interface.
func (*HTMLRenderer) Render ¶
func (r *HTMLRenderer) Render(ast *Node) []byte
Render walks the specified syntax (sub)tree and returns a HTML document.
func (*HTMLRenderer) RenderNode ¶
func (r *HTMLRenderer) RenderNode(w io.Writer, node *Node, entering bool) WalkStatus
RenderNode is a default renderer of a single node of a syntax tree. For block nodes it will be called twice: first time with entering=true, second time with entering=false, so that it could know when it's working on an open tag and when on close. It writes the result to w.
The return value is a way to tell the calling walker to adjust its walk pattern: e.g. it can terminate the traversal by returning Terminate. Or it can ask the walker to skip a subtree of this node by returning SkipChildren. The typical behavior is to return GoToNext, which asks for the usual traversal to the next node.
type HTMLRendererParameters ¶
type HTMLRendererParameters struct { // Prepend this text to each relative URL. AbsolutePrefix string // Add this text to each footnote anchor, to ensure uniqueness. FootnoteAnchorPrefix string // Show this text inside the <a> tag for a footnote return link, if the // HTML_FOOTNOTE_RETURN_LINKS flag is enabled. If blank, the string // <sup>[return]</sup> is used. FootnoteReturnLinkContents string // If set, add this text to the front of each Header ID, to ensure // uniqueness. HeaderIDPrefix string // If set, add this text to the back of each Header ID, to ensure uniqueness. HeaderIDSuffix string Title string // Document title (used if CompletePage is set) CSS string // Optional CSS file URL (used if CompletePage is set) Flags HTMLFlags // Flags allow customizing this renderer's behavior Extensions Extensions // Extensions give Smartypants and HTML renderer access to Blackfriday's global extensions }
HTMLRendererParameters is a collection of supplementary parameters tweaking the behavior of various parts of HTML renderer.
type HeaderData ¶
type HeaderData struct { Level int // This holds the heading level number HeaderID string // This might hold header ID, if present IsTitleblock bool // Specifies whether it's a title block }
HeaderData contains fields relevant to a Header node type.
type Latex ¶
type Latex struct {
// contains filtered or unexported fields
}
Latex is a type that implements the Renderer interface for LaTeX output.
Do not create this directly, instead use the NewLatexRenderer function.
func NewLatexRenderer ¶
NewLatexRenderer creates and configures a Latex object, which satisfies the Renderer interface.
flags is a set of LATEX_* options ORed together (currently no such options are defined).
func (*Latex) BeginHeader ¶
func (*Latex) BeginParagraph ¶
func (r *Latex) BeginParagraph()
func (*Latex) BlockQuote ¶
func (*Latex) DocumentFooter ¶
func (r *Latex) DocumentFooter()
func (*Latex) DoubleEmphasis ¶
func (*Latex) EndParagraph ¶
func (r *Latex) EndParagraph()
func (*Latex) FootnoteItem ¶
func (*Latex) NormalText ¶
func (*Latex) RawHtmlTag ¶
func (*Latex) RenderNode ¶
func (*Latex) StrikeThrough ¶
func (*Latex) Table ¶
func (r *Latex) Table(header []byte, body []byte, columnData []CellAlignFlags)
func (*Latex) TableCell ¶
func (r *Latex) TableCell(out *bytes.Buffer, text []byte, align CellAlignFlags)
func (*Latex) TableHeaderCell ¶
func (r *Latex) TableHeaderCell(out *bytes.Buffer, text []byte, align CellAlignFlags)
func (*Latex) TitleBlock ¶
func (*Latex) TripleEmphasis ¶
type ListData ¶
type ListData struct { ListFlags ListType Tight bool // Skip <p>s around list item data if true BulletChar byte // '*', '+' or '-' in bullet lists Delimiter byte // '.' or ')' after the number in ordered lists RefLink []byte // If not nil, turns this list item into a footnote item and triggers different rendering }
ListData contains fields relevant to a List node type.
type ListType ¶
type ListType int
ListType contains bitwise or'ed flags for list and list item objects.
const ( ListTypeOrdered ListType = 1 << iota ListTypeDefinition ListTypeTerm ListItemContainsBlock ListItemBeginningOfList ListItemEndOfList )
These are the possible flag values for the ListItem renderer. Multiple flag values may be ORed together. These are mostly of interest if you are writing a new output format.
type Node ¶
type Node struct { Type NodeType // Determines the type of the node Parent *Node // Points to the parent FirstChild *Node // Points to the first child, if any LastChild *Node // Points to the last child, if any Prev *Node // Previous sibling; nil if it's the first child Next *Node // Next sibling; nil if it's the last child Literal []byte // Text contents of the leaf nodes HeaderData // Populated if Type is Header ListData // Populated if Type is List CodeBlockData // Populated if Type is CodeBlock LinkData // Populated if Type is Link TableCellData // Populated if Type is TableCell // contains filtered or unexported fields }
Node is a single element in the abstract syntax tree of the parsed document. It holds connections to the structurally neighboring nodes and, for certain types of nodes, additional information that might be needed when rendering.
func Parse ¶
Parse is an entry point to the parsing part of Blackfriday. It takes an input markdown document and produces a syntax tree for its contents. This tree can then be rendered with a default or custom renderer, or analyzed/transformed by the caller to whatever non-standard needs they have.
func (*Node) Walk ¶
func (n *Node) Walk(visitor NodeVisitor)
Walk is a convenience method that instantiates a walker and starts a traversal of subtree rooted at n.
type NodeType ¶
type NodeType int
NodeType specifies a type of a single node of a syntax tree. Usually one node (and its type) corresponds to a single markdown feature, e.g. emphasis or code block.
const ( Document NodeType = iota BlockQuote List Item Paragraph Header HorizontalRule Emph Strong Del Link Image Text HTMLBlock CodeBlock Softbreak Hardbreak Code HTMLSpan Table TableCell TableHead TableBody TableRow Math MathBlock Mermaid )
Constants for identifying different types of nodes. See NodeType.
type NodeVisitor ¶
type NodeVisitor func(node *Node, entering bool) WalkStatus
NodeVisitor is a callback to be called when traversing the syntax tree. Called twice for every node: once with entering=true when the branch is first visited, then with entering=false after all the children are done.
type Options ¶
type Options struct { // Extensions is a flag set of bit-wise ORed extension bits. See the // Extensions flags defined in this package. Extensions Extensions // ReferenceOverride is an optional function callback that is called every // time a reference is resolved. // // In Markdown, the link reference syntax can be made to resolve a link to // a reference instead of an inline URL, in one of the following ways: // // * [link text][refid] // * [refid][] // // Usually, the refid is defined at the bottom of the Markdown document. If // this override function is provided, the refid is passed to the override // function first, before consulting the defined refids at the bottom. If // the override function indicates an override did not occur, the refids at // the bottom will be used to fill in the link details. ReferenceOverride ReferenceOverrideFunc }
Options represents configurable overrides and callbacks (in addition to the extension flag set) for configuring a Markdown parse.
type Reference ¶
type Reference struct { // Link is usually the URL the reference points to. Link string // Title is the alternate text describing the link in more detail. Title string // Text is the optional text to override the ref with if the syntax used was // [refid][] Text string }
Reference represents the details of a link. See the documentation in Options for more details on use-case.
type ReferenceOverrideFunc ¶
ReferenceOverrideFunc is expected to be called with a reference string and return either a valid Reference type that the reference string maps to or nil. If overridden is false, the default reference logic will be executed. See the documentation in Options for more details on use-case.
type Renderer ¶
type Renderer interface { Render(ast *Node) []byte RenderNode(w io.Writer, node *Node, entering bool) WalkStatus }
Renderer is the rendering interface. This is mostly of interest if you are implementing a new rendering format.
When a byte slice is provided, it contains the (rendered) contents of the element.
When a callback is provided instead, it will write the contents of the respective element directly to the output buffer and return true on success. If the callback returns false, the rendering function should reset the output buffer as though it had never been called.
Currently HTML and Latex implementations are provided
type SPRenderer ¶
type SPRenderer struct {
// contains filtered or unexported fields
}
SPRenderer is a struct containing state of a Smartypants renderer.
func NewSmartypantsRenderer ¶
func NewSmartypantsRenderer(flags Extensions) *SPRenderer
NewSmartypantsRenderer constructs a Smartypants renderer object.
func (*SPRenderer) Process ¶
func (r *SPRenderer) Process(text []byte) []byte
Process is the entry point of the Smartypants renderer.
type TableCellData ¶
type TableCellData struct { IsHeader bool // This tells if it's under the header row Align CellAlignFlags // This holds the value for align attribute }
TableCellData contains fields relevant to a TableCell node type.
type WalkStatus ¶
type WalkStatus int
WalkStatus allows NodeVisitor to have some control over the tree traversal. It is returned from NodeVisitor and different values allow Node.Walk to decide which node to go to next.
const ( // GoToNext is the default traversal of every node. GoToNext WalkStatus = iota // SkipChildren tells walker to skip all children of current node. SkipChildren // Terminate tells walker to terminate the traversal. Terminate )