markup.go (3479B)
1 // Copyright 2019 The Hugo Authors. All rights reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // http://www.apache.org/licenses/LICENSE-2.0 7 // 8 // Unless required by applicable law or agreed to in writing, software 9 // distributed under the License is distributed on an "AS IS" BASIS, 10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 // See the License for the specific language governing permissions and 12 // limitations under the License. 13 14 package markup 15 16 import ( 17 "fmt" 18 "strings" 19 20 "github.com/gohugoio/hugo/markup/highlight" 21 22 "github.com/gohugoio/hugo/markup/markup_config" 23 24 "github.com/gohugoio/hugo/markup/goldmark" 25 26 "github.com/gohugoio/hugo/markup/org" 27 28 "github.com/gohugoio/hugo/markup/asciidocext" 29 "github.com/gohugoio/hugo/markup/converter" 30 "github.com/gohugoio/hugo/markup/pandoc" 31 "github.com/gohugoio/hugo/markup/rst" 32 ) 33 34 func NewConverterProvider(cfg converter.ProviderConfig) (ConverterProvider, error) { 35 converters := make(map[string]converter.Provider) 36 37 markupConfig, err := markup_config.Decode(cfg.Cfg) 38 if err != nil { 39 return nil, err 40 } 41 42 if cfg.Highlighter == nil { 43 cfg.Highlighter = highlight.New(markupConfig.Highlight) 44 } 45 46 cfg.MarkupConfig = markupConfig 47 defaultHandler := cfg.MarkupConfig.DefaultMarkdownHandler 48 var defaultFound bool 49 50 add := func(p converter.ProviderProvider, aliases ...string) error { 51 c, err := p.New(cfg) 52 if err != nil { 53 return err 54 } 55 56 name := c.Name() 57 58 aliases = append(aliases, name) 59 60 if strings.EqualFold(name, defaultHandler) { 61 aliases = append(aliases, "markdown") 62 defaultFound = true 63 } 64 65 addConverter(converters, c, aliases...) 66 return nil 67 } 68 69 if err := add(goldmark.Provider); err != nil { 70 return nil, err 71 } 72 if err := add(asciidocext.Provider, "ad", "adoc"); err != nil { 73 return nil, err 74 } 75 if err := add(rst.Provider); err != nil { 76 return nil, err 77 } 78 if err := add(pandoc.Provider, "pdc"); err != nil { 79 return nil, err 80 } 81 if err := add(org.Provider); err != nil { 82 return nil, err 83 } 84 85 if !defaultFound { 86 msg := "markup: Configured defaultMarkdownHandler %q not found." 87 if defaultHandler == "blackfriday" { 88 msg += " Did you mean to use goldmark? Blackfriday was removed in Hugo v0.100.0." 89 } 90 return nil, fmt.Errorf(msg, defaultHandler) 91 } 92 93 return &converterRegistry{ 94 config: cfg, 95 converters: converters, 96 }, nil 97 } 98 99 type ConverterProvider interface { 100 Get(name string) converter.Provider 101 // Default() converter.Provider 102 GetMarkupConfig() markup_config.Config 103 GetHighlighter() highlight.Highlighter 104 } 105 106 type converterRegistry struct { 107 // Maps name (md, markdown, goldmark etc.) to a converter provider. 108 // Note that this is also used for aliasing, so the same converter 109 // may be registered multiple times. 110 // All names are lower case. 111 converters map[string]converter.Provider 112 113 config converter.ProviderConfig 114 } 115 116 func (r *converterRegistry) Get(name string) converter.Provider { 117 return r.converters[strings.ToLower(name)] 118 } 119 120 func (r *converterRegistry) GetHighlighter() highlight.Highlighter { 121 return r.config.Highlighter 122 } 123 124 func (r *converterRegistry) GetMarkupConfig() markup_config.Config { 125 return r.config.MarkupConfig 126 } 127 128 func addConverter(m map[string]converter.Provider, c converter.Provider, aliases ...string) { 129 for _, alias := range aliases { 130 m[alias] = c 131 } 132 }