2017-04-21 10:01:08 +03:00
// Copyright 2017 The Gitea Authors. All rights reserved.
// Use of this source code is governed by a MIT-style
// license that can be found in the LICENSE file.
package markup
import (
"path/filepath"
"strings"
)
// Parser defines an interface for parsering markup file to HTML
type Parser interface {
Name ( ) string // markup format name
Extensions ( ) [ ] string
Render ( rawBytes [ ] byte , urlPrefix string , metas map [ string ] string , isWiki bool ) [ ] byte
}
var (
parsers = make ( map [ string ] Parser )
)
// RegisterParser registers a new markup file parser
func RegisterParser ( parser Parser ) {
for _ , ext := range parser . Extensions ( ) {
parsers [ strings . ToLower ( ext ) ] = parser
}
}
// Render renders markup file to HTML with all specific handling stuff.
func Render ( filename string , rawBytes [ ] byte , urlPrefix string , metas map [ string ] string ) [ ] byte {
return render ( filename , rawBytes , urlPrefix , metas , false )
}
func render ( filename string , rawBytes [ ] byte , urlPrefix string , metas map [ string ] string , isWiki bool ) [ ] byte {
extension := strings . ToLower ( filepath . Ext ( filename ) )
if parser , ok := parsers [ extension ] ; ok {
return parser . Render ( rawBytes , urlPrefix , metas , isWiki )
}
return nil
}
// RenderString renders Markdown to HTML with special links and returns string type.
func RenderString ( filename string , raw , urlPrefix string , metas map [ string ] string ) string {
return string ( render ( filename , [ ] byte ( raw ) , urlPrefix , metas , false ) )
}
// RenderWiki renders markdown wiki page to HTML and return HTML string
func RenderWiki ( filename string , rawBytes [ ] byte , urlPrefix string , metas map [ string ] string ) string {
return string ( render ( filename , rawBytes , urlPrefix , metas , true ) )
}
// Type returns if markup format via the filename
func Type ( filename string ) string {
extension := strings . ToLower ( filepath . Ext ( filename ) )
if parser , ok := parsers [ extension ] ; ok {
return parser . Name ( )
}
return ""
}
2017-05-02 11:57:54 +03:00
// ReadmeFileType reports whether name looks like a README file
// based on its name and find the parser via its ext name
func ReadmeFileType ( name string ) ( string , bool ) {
if IsReadmeFile ( name ) {
return Type ( name ) , true
}
return "" , false
}
2017-04-21 10:01:08 +03:00
// IsReadmeFile reports whether name looks like a README file
// based on its name.
func IsReadmeFile ( name string ) bool {
if len ( name ) < 6 {
return false
2017-05-09 17:20:22 +03:00
}
name = strings . ToLower ( name )
if len ( name ) == 6 {
2017-04-21 10:01:08 +03:00
return name == "readme"
}
return name [ : 7 ] == "readme."
}