diff options
author | Anthony Fok <foka@debian.org> | 2015-01-30 17:17:50 +0300 |
---|---|---|
committer | spf13 <steve.francia@gmail.com> | 2015-05-09 05:05:41 +0300 |
commit | 563a6302a0a27f1b8412d4ab621e336f83159727 (patch) | |
tree | 77ff47e3300e5140173971bf57fc0c3d1527138a /helpers | |
parent | d4acacd4f50a6c0c25c22e7cc989f196bd225fd5 (diff) |
Very experimental support for mmark
Either name the content files as `*.mmark`,
or add `markup = "mmark"` in the front matter
of your `*.md` content files.
Diffstat (limited to 'helpers')
-rw-r--r-- | helpers/content.go | 73 | ||||
-rw-r--r-- | helpers/general.go | 11 | ||||
-rw-r--r-- | helpers/general_test.go | 1 |
3 files changed, 81 insertions, 4 deletions
diff --git a/helpers/content.go b/helpers/content.go index a5f2a5608..0bb50f440 100644 --- a/helpers/content.go +++ b/helpers/content.go @@ -22,6 +22,7 @@ import ( "html/template" "os/exec" + "github.com/miekg/mmark" "github.com/russross/blackfriday" bp "github.com/spf13/hugo/bufferpool" jww "github.com/spf13/jwalterweatherman" @@ -74,6 +75,19 @@ var blackfridayExtensionMap = map[string]int{ var stripHTMLReplacer = strings.NewReplacer("\n", " ", "</p>", "\n", "<br>", "\n", "<br />", "\n") +var mmarkExtensionMap = map[string]int{ + "tables": mmark.EXTENSION_TABLES, + "fencedCode": mmark.EXTENSION_FENCED_CODE, + "autolink": mmark.EXTENSION_AUTOLINK, + "laxHtmlBlocks": mmark.EXTENSION_LAX_HTML_BLOCKS, + "spaceHeaders": mmark.EXTENSION_SPACE_HEADERS, + "hardLineBreak": mmark.EXTENSION_HARD_LINE_BREAK, + "footnotes": mmark.EXTENSION_FOOTNOTES, + "noEmptyLineBeforeBlock": mmark.EXTENSION_NO_EMPTY_LINE_BEFORE_BLOCK, + "headerIds": mmark.EXTENSION_HEADER_IDS, + "autoHeaderIds": mmark.EXTENSION_AUTO_HEADER_IDS, +} + // StripHTML accepts a string, strips out all HTML tags and returns it. func StripHTML(s string) string { @@ -174,6 +188,61 @@ func markdownRenderWithTOC(ctx *RenderingContext) []byte { getMarkdownExtensions(ctx)) } +// mmark +func GetMmarkHtmlRenderer(defaultFlags int, ctx *RenderingContext) mmark.Renderer { + renderParameters := mmark.HtmlRendererParameters{ + FootnoteAnchorPrefix: viper.GetString("FootnoteAnchorPrefix"), + FootnoteReturnLinkContents: viper.GetString("FootnoteReturnLinkContents"), + } + + b := len(ctx.DocumentID) != 0 + + if b && !ctx.getConfig().PlainIDAnchors { + renderParameters.FootnoteAnchorPrefix = ctx.DocumentID + ":" + renderParameters.FootnoteAnchorPrefix + // renderParameters.HeaderIDSuffix = ":" + ctx.DocumentId + } + + htmlFlags := defaultFlags + htmlFlags |= mmark.HTML_FOOTNOTE_RETURN_LINKS + + return mmark.HtmlRendererWithParameters(htmlFlags, "", "", renderParameters) +} + +func GetMmarkExtensions(ctx RenderingContext) int { + flags := 0 + flags |= mmark.EXTENSION_TABLES + flags |= mmark.EXTENSION_FENCED_CODE + flags |= mmark.EXTENSION_AUTOLINK + flags |= mmark.EXTENSION_SPACE_HEADERS + flags |= mmark.EXTENSION_CITATION + flags |= mmark.EXTENSION_TITLEBLOCK_TOML + flags |= mmark.EXTENSION_HEADER_IDS + flags |= mmark.EXTENSION_AUTO_HEADER_IDS + flags |= mmark.EXTENSION_UNIQUE_HEADER_IDS + flags |= mmark.EXTENSION_FOOTNOTES + flags |= mmark.EXTENSION_SHORT_REF + flags |= mmark.EXTENSION_NO_EMPTY_LINE_BEFORE_BLOCK + flags |= mmark.EXTENSION_INCLUDE + + for _, extension := range ctx.getConfig().Extensions { + if flag, ok := mmarkExtensionMap[extension]; ok { + flags |= flag + } + } + return flags +} + +func MmarkRender(ctx *RenderingContext) []byte { + return mmark.Parse(ctx.Content, GetMmarkHtmlRenderer(0, ctx), + GetMmarkExtensions(*ctx)).Bytes() +} + +func MmarkRenderWithTOC(ctx *RenderingContext) []byte { + return mmark.Parse(ctx.Content, + GetMmarkHtmlRenderer(0, ctx), + GetMmarkExtensions(*ctx)).Bytes() +} + // ExtractTOC extracts Table of Contents from content. func ExtractTOC(content []byte) (newcontent []byte, toc []byte) { origContent := make([]byte, len(content)) @@ -238,6 +307,8 @@ func RenderBytesWithTOC(ctx *RenderingContext) []byte { return markdownRenderWithTOC(ctx) case "asciidoc": return []byte(GetAsciidocContent(ctx.Content)) + case "mmark": + return MmarkRenderWithTOC(ctx) case "rst": return []byte(GetRstContent(ctx.Content)) } @@ -252,6 +323,8 @@ func RenderBytes(ctx *RenderingContext) []byte { return markdownRender(ctx) case "asciidoc": return []byte(GetAsciidocContent(ctx.Content)) + case "mmark": + return MmarkRender(ctx) case "rst": return []byte(GetRstContent(ctx.Content)) } diff --git a/helpers/general.go b/helpers/general.go index dc9029b06..97b1e7e83 100644 --- a/helpers/general.go +++ b/helpers/general.go @@ -19,16 +19,17 @@ import ( "encoding/hex" "errors" "fmt" - "github.com/spf13/cast" - bp "github.com/spf13/hugo/bufferpool" - jww "github.com/spf13/jwalterweatherman" - "github.com/spf13/viper" "io" "net" "path/filepath" "reflect" "strings" "sync" + + "github.com/spf13/cast" + bp "github.com/spf13/hugo/bufferpool" + jww "github.com/spf13/jwalterweatherman" + "github.com/spf13/viper" ) // Filepath separator defined by os.Separator. @@ -66,6 +67,8 @@ func GuessType(in string) string { return "markdown" case "asciidoc", "adoc", "ad": return "asciidoc" + case "mmark": + return "mmark" case "rst": return "rst" case "html", "htm": diff --git a/helpers/general_test.go b/helpers/general_test.go index 144f7a312..0147822c7 100644 --- a/helpers/general_test.go +++ b/helpers/general_test.go @@ -21,6 +21,7 @@ func TestGuessType(t *testing.T) { {"adoc", "asciidoc"}, {"ad", "asciidoc"}, {"rst", "rst"}, + {"mmark", "mmark"}, {"html", "html"}, {"htm", "html"}, {"excel", "unknown"}, |