gitea源码

transform_list.go 2.3KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. // Copyright 2024 The Gitea Authors. All rights reserved.
  2. // SPDX-License-Identifier: MIT
  3. package markdown
  4. import (
  5. "fmt"
  6. "code.gitea.io/gitea/modules/markup"
  7. "github.com/yuin/goldmark/ast"
  8. east "github.com/yuin/goldmark/extension/ast"
  9. "github.com/yuin/goldmark/renderer/html"
  10. "github.com/yuin/goldmark/util"
  11. )
  12. func (r *HTMLRenderer) renderTaskCheckBoxListItem(w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) {
  13. n := node.(*TaskCheckBoxListItem)
  14. if entering {
  15. if n.Attributes() != nil {
  16. _, _ = w.WriteString("<li")
  17. html.RenderAttributes(w, n, html.ListItemAttributeFilter)
  18. _ = w.WriteByte('>')
  19. } else {
  20. _, _ = w.WriteString("<li>")
  21. }
  22. fmt.Fprintf(w, `<input type="checkbox" disabled="" data-source-position="%d"`, n.SourcePosition)
  23. if n.IsChecked {
  24. _, _ = w.WriteString(` checked=""`)
  25. }
  26. if r.XHTML {
  27. _, _ = w.WriteString(` />`)
  28. } else {
  29. _ = w.WriteByte('>')
  30. }
  31. fc := n.FirstChild()
  32. if fc != nil {
  33. if _, ok := fc.(*ast.TextBlock); !ok {
  34. _ = w.WriteByte('\n')
  35. }
  36. }
  37. } else {
  38. _, _ = w.WriteString("</li>\n")
  39. }
  40. return ast.WalkContinue, nil
  41. }
  42. func (r *HTMLRenderer) renderTaskCheckBox(w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) {
  43. return ast.WalkContinue, nil
  44. }
  45. func (g *ASTTransformer) transformList(_ *markup.RenderContext, v *ast.List, rc *RenderConfig) {
  46. if v.HasChildren() {
  47. children := make([]ast.Node, 0, v.ChildCount())
  48. child := v.FirstChild()
  49. for child != nil {
  50. children = append(children, child)
  51. child = child.NextSibling()
  52. }
  53. v.RemoveChildren(v)
  54. for _, child := range children {
  55. listItem := child.(*ast.ListItem)
  56. if !child.HasChildren() || !child.FirstChild().HasChildren() {
  57. v.AppendChild(v, child)
  58. continue
  59. }
  60. taskCheckBox, ok := child.FirstChild().FirstChild().(*east.TaskCheckBox)
  61. if !ok {
  62. v.AppendChild(v, child)
  63. continue
  64. }
  65. newChild := NewTaskCheckBoxListItem(listItem)
  66. newChild.IsChecked = taskCheckBox.IsChecked
  67. newChild.SetAttributeString(g.renderInternal.SafeAttr("class"), []byte(g.renderInternal.SafeValue("task-list-item")))
  68. segments := newChild.FirstChild().Lines()
  69. if segments.Len() > 0 {
  70. segment := segments.At(0)
  71. newChild.SourcePosition = rc.metaLength + segment.Start
  72. }
  73. v.AppendChild(v, newChild)
  74. }
  75. }
  76. g.applyElementDir(v)
  77. }