+44
-24
@@ -14,8 +14,8 @@ import (
|
||||
|
||||
// Renderer defines an interface for rendering markup file to HTML
|
||||
type Renderer interface {
|
||||
Name() string // markup format name
|
||||
Extensions() []string
|
||||
Name() string // markup format name, also the renderer type, also the external tool name
|
||||
FileNamePatterns() []string
|
||||
SanitizerRules() []setting.MarkupSanitizerRule
|
||||
Render(ctx *RenderContext, input io.Reader, output io.Writer) error
|
||||
}
|
||||
@@ -43,26 +43,52 @@ type RendererContentDetector interface {
|
||||
}
|
||||
|
||||
var (
|
||||
extRenderers = make(map[string]Renderer)
|
||||
renderers = make(map[string]Renderer)
|
||||
fileNameRenderers = make(map[string]Renderer)
|
||||
renderers = make(map[string]Renderer)
|
||||
)
|
||||
|
||||
// RegisterRenderer registers a new markup file renderer
|
||||
func RegisterRenderer(renderer Renderer) {
|
||||
// TODO: need to handle conflicts
|
||||
renderers[renderer.Name()] = renderer
|
||||
for _, ext := range renderer.Extensions() {
|
||||
extRenderers[strings.ToLower(ext)] = renderer
|
||||
}
|
||||
|
||||
func RefreshFileNamePatterns() {
|
||||
// TODO: need to handle conflicts
|
||||
fileNameRenderers = make(map[string]Renderer)
|
||||
for _, renderer := range renderers {
|
||||
for _, ext := range renderer.FileNamePatterns() {
|
||||
fileNameRenderers[strings.ToLower(ext)] = renderer
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// GetRendererByFileName get renderer by filename
|
||||
func GetRendererByFileName(filename string) Renderer {
|
||||
extension := strings.ToLower(path.Ext(filename))
|
||||
return extRenderers[extension]
|
||||
func DetectRendererTypeByFilename(filename string) Renderer {
|
||||
basename := path.Base(strings.ToLower(filename))
|
||||
ext1 := path.Ext(basename)
|
||||
if renderer := fileNameRenderers[basename]; renderer != nil {
|
||||
return renderer
|
||||
}
|
||||
if renderer := fileNameRenderers["*"+ext1]; renderer != nil {
|
||||
return renderer
|
||||
}
|
||||
if basename, ok := strings.CutSuffix(basename, ext1); ok {
|
||||
ext2 := path.Ext(basename)
|
||||
if renderer := fileNameRenderers["*"+ext2+ext1]; renderer != nil {
|
||||
return renderer
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// DetectRendererType detects the markup type of the content
|
||||
func DetectRendererType(filename string, sniffedType typesniffer.SniffedType, prefetchBuf []byte) string {
|
||||
// DetectRendererTypeByPrefetch detects the markup type of the content
|
||||
func DetectRendererTypeByPrefetch(filename string, sniffedType typesniffer.SniffedType, prefetchBuf []byte) string {
|
||||
if filename != "" {
|
||||
byExt := DetectRendererTypeByFilename(filename)
|
||||
if byExt != nil {
|
||||
return byExt.Name()
|
||||
}
|
||||
}
|
||||
for _, renderer := range renderers {
|
||||
if detector, ok := renderer.(RendererContentDetector); ok && detector.CanRender(filename, sniffedType, prefetchBuf) {
|
||||
return renderer.Name()
|
||||
@@ -71,18 +97,12 @@ func DetectRendererType(filename string, sniffedType typesniffer.SniffedType, pr
|
||||
return ""
|
||||
}
|
||||
|
||||
// DetectMarkupTypeByFileName returns the possible markup format type via the filename
|
||||
func DetectMarkupTypeByFileName(filename string) string {
|
||||
if parser := GetRendererByFileName(filename); parser != nil {
|
||||
return parser.Name()
|
||||
}
|
||||
return ""
|
||||
}
|
||||
|
||||
func PreviewableExtensions() []string {
|
||||
extensions := make([]string, 0, len(extRenderers))
|
||||
for extension := range extRenderers {
|
||||
extensions = append(extensions, extension)
|
||||
exts := make([]string, 0, len(fileNameRenderers))
|
||||
for p := range fileNameRenderers {
|
||||
if s, ok := strings.CutPrefix(p, "*"); ok {
|
||||
exts = append(exts, s)
|
||||
}
|
||||
}
|
||||
return extensions
|
||||
return exts
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user