|
|
- // 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 ""
- }
-
- // 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
- }
-
- // IsReadmeFile reports whether name looks like a README file
- // based on its name.
- func IsReadmeFile(name string) bool {
- name = strings.ToLower(name)
- if len(name) < 6 {
- return false
- } else if len(name) == 6 {
- return name == "readme"
- }
- return name[:7] == "readme."
- }
|