9778ada128
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.
58 lines
1.8 KiB
Go
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
|
|
}
|