hugo-to-gemini/render.go
Timur Demin 9778ada128
Parse metadata in all Hugo formats
This makes gmnhg parse TOML/YAML/JSON/org-mode front matter in Hugo posts.

This also makes the library no longer render metadata in posts, removing
the API to do so. The metadata parsing code itself moves to
internal/gmnhg.

As the library no longer has a preset to include metadata in rendered
document, md2gmn will from now on silently discard front matter if it
encounters any.

Fixes #28. Unblocks #13.
2021-09-17 22:34:03 +05:00

58 lines
1.8 KiB
Go

// This file is part of gmnhg.
// gmnhg is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
// gmnhg is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
// You should have received a copy of the GNU General Public License
// along with gmnhg. If not, see <https://www.gnu.org/licenses/>.
// Package gemini provides functions to convert Markdown files to
// Gemtext.
package gemini
import (
"bytes"
"github.com/gomarkdown/markdown"
"github.com/gomarkdown/markdown/parser"
"github.com/tdemin/gmnhg/internal/renderer"
)
// Settings is a bitmask for renderer preferences.
type Settings uint
// Has returns true if a flag or a set of flags are all set.
func (s Settings) Has(setting Settings) bool {
return (s & setting) == setting
}
const (
// Defaults simply renders the document.
Defaults Settings = 0
)
var trailing = []byte("\n\n")
// RenderMarkdown converts Markdown text to Gemtext using gomarkdown. It
// ignores front matter if any has been provided in the text.
func RenderMarkdown(md []byte, settings Settings) (geminiText []byte, err error) {
ast := markdown.Parse(md, parser.NewWithExtensions(parser.CommonExtensions|
parser.NoEmptyLineBeforeBlock|
parser.Footnotes))
content := markdown.Render(ast, renderer.NewRenderer())
// strip trailing newlines if any
for li := bytes.LastIndex(content, trailing); li != -1; li = bytes.LastIndex(content, trailing) {
if li != len(content)-len(trailing) {
break
}
content = content[:len(content)-1]
}
return content, nil
}