diff options
Diffstat (limited to 'markup/org')
-rw-r--r-- | markup/org/convert.go | 69 | ||||
-rw-r--r-- | markup/org/convert_test.go | 35 |
2 files changed, 104 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 +} diff --git a/markup/org/convert_test.go b/markup/org/convert_test.go new file mode 100644 index 000000000..94fcdf836 --- /dev/null +++ b/markup/org/convert_test.go @@ -0,0 +1,35 @@ +// 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 + +import ( + "testing" + + "github.com/gohugoio/hugo/common/loggers" + + "github.com/gohugoio/hugo/markup/converter" + + qt "github.com/frankban/quicktest" +) + +func TestConvert(t *testing.T) { + c := qt.New(t) + p, err := Provider.New(converter.ProviderConfig{Logger: loggers.NewErrorLogger()}) + c.Assert(err, qt.IsNil) + conv, err := p.New(converter.DocumentContext{}) + c.Assert(err, qt.IsNil) + b, err := conv.Convert(converter.RenderContext{Src: []byte("testContent")}) + c.Assert(err, qt.IsNil) + c.Assert(string(b.Bytes()), qt.Equals, "<p>\ntestContent\n</p>\n") +} |