gitea源码

renderer.go 2.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. // Copyright 2017 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package markup
  4. import (
  5. "io"
  6. "path"
  7. "strings"
  8. "code.gitea.io/gitea/modules/setting"
  9. "code.gitea.io/gitea/modules/typesniffer"
  10. )
  11. // Renderer defines an interface for rendering markup file to HTML
  12. type Renderer interface {
  13. Name() string // markup format name
  14. Extensions() []string
  15. SanitizerRules() []setting.MarkupSanitizerRule
  16. Render(ctx *RenderContext, input io.Reader, output io.Writer) error
  17. }
  18. // PostProcessRenderer defines an interface for renderers who need post process
  19. type PostProcessRenderer interface {
  20. NeedPostProcess() bool
  21. }
  22. // ExternalRenderer defines an interface for external renderers
  23. type ExternalRenderer interface {
  24. // SanitizerDisabled disabled sanitize if return true
  25. SanitizerDisabled() bool
  26. // DisplayInIFrame represents whether render the content with an iframe
  27. DisplayInIFrame() bool
  28. }
  29. // RendererContentDetector detects if the content can be rendered
  30. // by specified renderer
  31. type RendererContentDetector interface {
  32. CanRender(filename string, sniffedType typesniffer.SniffedType, prefetchBuf []byte) bool
  33. }
  34. var (
  35. extRenderers = make(map[string]Renderer)
  36. renderers = make(map[string]Renderer)
  37. )
  38. // RegisterRenderer registers a new markup file renderer
  39. func RegisterRenderer(renderer Renderer) {
  40. renderers[renderer.Name()] = renderer
  41. for _, ext := range renderer.Extensions() {
  42. extRenderers[strings.ToLower(ext)] = renderer
  43. }
  44. }
  45. // GetRendererByFileName get renderer by filename
  46. func GetRendererByFileName(filename string) Renderer {
  47. extension := strings.ToLower(path.Ext(filename))
  48. return extRenderers[extension]
  49. }
  50. // DetectRendererType detects the markup type of the content
  51. func DetectRendererType(filename string, sniffedType typesniffer.SniffedType, prefetchBuf []byte) string {
  52. for _, renderer := range renderers {
  53. if detector, ok := renderer.(RendererContentDetector); ok && detector.CanRender(filename, sniffedType, prefetchBuf) {
  54. return renderer.Name()
  55. }
  56. }
  57. return ""
  58. }
  59. // DetectMarkupTypeByFileName returns the possible markup format type via the filename
  60. func DetectMarkupTypeByFileName(filename string) string {
  61. if parser := GetRendererByFileName(filename); parser != nil {
  62. return parser.Name()
  63. }
  64. return ""
  65. }
  66. func PreviewableExtensions() []string {
  67. extensions := make([]string, 0, len(extRenderers))
  68. for extension := range extRenderers {
  69. extensions = append(extensions, extension)
  70. }
  71. return extensions
  72. }