Fixes a bug related to escaped pipes in a table cell

This commit is contained in:
yuin 2021-03-20 17:07:23 +09:00
parent 56bbdf0370
commit 2913ca2902

View file

@ -18,8 +18,9 @@ import (
var escapedPipeCellListKey = parser.NewContextKey() var escapedPipeCellListKey = parser.NewContextKey()
type escapedPipeCell struct { type escapedPipeCell struct {
Cell *ast.TableCell Cell *ast.TableCell
Pos []int Pos []int
Transformed bool
} }
// TableCellAlignMethod indicates how are table cells aligned in HTML format.indicates how are table cells aligned in HTML format. // TableCellAlignMethod indicates how are table cells aligned in HTML format.indicates how are table cells aligned in HTML format.
@ -216,7 +217,7 @@ func (b *tableParagraphTransformer) parseRow(segment text.Segment, alignments []
break break
} else if hasBacktick { } else if hasBacktick {
if escapedCell == nil { if escapedCell == nil {
escapedCell = &escapedPipeCell{node, []int{}} escapedCell = &escapedPipeCell{node, []int{}, false}
escapedList := pc.ComputeIfAbsent(escapedPipeCellListKey, escapedList := pc.ComputeIfAbsent(escapedPipeCellListKey,
func() interface{} { func() interface{} {
return []*escapedPipeCell{} return []*escapedPipeCell{}
@ -288,22 +289,34 @@ func (a *tableASTTransformer) Transform(node *gast.Document, reader text.Reader,
} }
pc.Set(escapedPipeCellListKey, nil) pc.Set(escapedPipeCellListKey, nil)
for _, v := range lst.([]*escapedPipeCell) { for _, v := range lst.([]*escapedPipeCell) {
if v.Transformed {
continue
}
_ = gast.Walk(v.Cell, func(n gast.Node, entering bool) (gast.WalkStatus, error) { _ = gast.Walk(v.Cell, func(n gast.Node, entering bool) (gast.WalkStatus, error) {
if n.Kind() != gast.KindCodeSpan { if !entering || n.Kind() != gast.KindCodeSpan {
return gast.WalkContinue, nil return gast.WalkContinue, nil
} }
c := n.FirstChild()
for c != nil { for c := n.FirstChild(); c != nil; {
next := c.NextSibling() next := c.NextSibling()
if c.Kind() == gast.KindText { if c.Kind() != gast.KindText {
t := c.(*gast.Text) c = next
continue
}
parent := c.Parent()
ts := &c.(*gast.Text).Segment
n := c
for _, v := range lst.([]*escapedPipeCell) {
for _, pos := range v.Pos { for _, pos := range v.Pos {
if t.Segment.Start <= pos && t.Segment.Stop > pos { if ts.Start <= pos && pos < ts.Stop {
n1 := gast.NewRawTextSegment(t.Segment.WithStop(pos)) segment := n.(*gast.Text).Segment
n2 := gast.NewRawTextSegment(t.Segment.WithStart(pos + 1)) n1 := gast.NewRawTextSegment(segment.WithStop(pos))
n.InsertAfter(n, c, n1) n2 := gast.NewRawTextSegment(segment.WithStart(pos + 1))
n.InsertAfter(n, n1, n2) parent.InsertAfter(parent, n, n1)
n.RemoveChild(n, c) parent.InsertAfter(parent, n1, n2)
parent.RemoveChild(parent, n)
n = n2
v.Transformed = true
} }
} }
} }