diff options
author | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2019-08-16 15:55:03 +0200 |
---|---|---|
committer | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2019-11-06 19:09:08 +0100 |
commit | 5f6b6ec68936ebbbf590894c02a1a3ecad30735f (patch) | |
tree | f6c91e225a3f24f51af1bde5cfb5b88515d0665d /markup/org/convert.go | |
parent | 366ee4d8da1c2b0c1751e9bf6d54638439735296 (diff) |
Prepare for Goldmark
This commmit prepares for the addition of Goldmark as the new Markdown renderer in Hugo.
This introduces a new `markup` package with some common interfaces and each implementation in its own package.
See #5963
Diffstat (limited to 'markup/org/convert.go')
-rw-r--r-- | markup/org/convert.go | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/markup/org/convert.go b/markup/org/convert.go new file mode 100644 index 000000000..a951e6fe1 --- /dev/null +++ b/markup/org/convert.go @@ -0,0 +1,69 @@ +// Copyright 2019 The Hugo Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Package org converts Emacs Org-Mode to HTML. +package org + +import ( + "bytes" + + "github.com/gohugoio/hugo/markup/converter" + "github.com/niklasfasching/go-org/org" + "github.com/spf13/afero" +) + +// Provider is the package entry point. +var Provider converter.NewProvider = provide{} + +type provide struct { +} + +func (p provide) New(cfg converter.ProviderConfig) (converter.Provider, error) { + var n converter.NewConverter = func(ctx converter.DocumentContext) (converter.Converter, error) { + return &orgConverter{ + ctx: ctx, + cfg: cfg, + }, nil + } + return n, nil +} + +type orgConverter struct { + ctx converter.DocumentContext + cfg converter.ProviderConfig +} + +func (c *orgConverter) Convert(ctx converter.RenderContext) (converter.Result, error) { + logger := c.cfg.Logger + config := org.New() + config.Log = logger.WARN + config.ReadFile = func(filename string) ([]byte, error) { + return afero.ReadFile(c.cfg.ContentFs, filename) + } + writer := org.NewHTMLWriter() + writer.HighlightCodeBlock = func(source, lang string) string { + highlightedSource, err := c.cfg.Highlight(source, lang, "") + if err != nil { + logger.ERROR.Printf("Could not highlight source as lang %s. Using raw source.", lang) + return source + } + return highlightedSource + } + + html, err := config.Parse(bytes.NewReader(ctx.Src), c.ctx.DocumentName).Write(writer) + if err != nil { + logger.ERROR.Printf("Could not render org: %s. Using unrendered content.", err) + return converter.Bytes(ctx.Src), nil + } + return converter.Bytes([]byte(html)), nil +} |