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/markup.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/markup.go')
-rw-r--r-- | markup/markup.go | 83 |
1 files changed, 83 insertions, 0 deletions
diff --git a/markup/markup.go b/markup/markup.go new file mode 100644 index 000000000..54193aba3 --- /dev/null +++ b/markup/markup.go @@ -0,0 +1,83 @@ +// 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 markup + +import ( + "strings" + + "github.com/gohugoio/hugo/markup/org" + + "github.com/gohugoio/hugo/markup/asciidoc" + "github.com/gohugoio/hugo/markup/blackfriday" + "github.com/gohugoio/hugo/markup/converter" + "github.com/gohugoio/hugo/markup/mmark" + "github.com/gohugoio/hugo/markup/pandoc" + "github.com/gohugoio/hugo/markup/rst" +) + +func NewConverterProvider(cfg converter.ProviderConfig) (ConverterProvider, error) { + converters := make(map[string]converter.Provider) + + add := func(p converter.NewProvider, aliases ...string) error { + c, err := p.New(cfg) + if err != nil { + return err + } + addConverter(converters, c, aliases...) + return nil + } + + if err := add(blackfriday.Provider, "md", "markdown", "blackfriday"); err != nil { + return nil, err + } + if err := add(mmark.Provider, "mmark"); err != nil { + return nil, err + } + if err := add(asciidoc.Provider, "asciidoc"); err != nil { + return nil, err + } + if err := add(rst.Provider, "rst"); err != nil { + return nil, err + } + if err := add(pandoc.Provider, "pandoc"); err != nil { + return nil, err + } + if err := add(org.Provider, "org"); err != nil { + return nil, err + } + + return &converterRegistry{converters: converters}, nil +} + +type ConverterProvider interface { + Get(name string) converter.Provider +} + +type converterRegistry struct { + // Maps name (md, markdown, blackfriday etc.) to a converter provider. + // Note that this is also used for aliasing, so the same converter + // may be registered multiple times. + // All names are lower case. + converters map[string]converter.Provider +} + +func (r *converterRegistry) Get(name string) converter.Provider { + return r.converters[strings.ToLower(name)] +} + +func addConverter(m map[string]converter.Provider, c converter.Provider, aliases ...string) { + for _, alias := range aliases { + m[alias] = c + } +} |