mirror of
https://github.com/yuin/goldmark
synced 2025-03-04 23:04:52 +00:00
Fixes a bug related to escaped pipes in a table cell
This commit is contained in:
parent
56bbdf0370
commit
2913ca2902
1 changed files with 27 additions and 14 deletions
|
|
@ -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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue