diff --git a/go.mod b/go.mod index f6c3ae7b6..3017182ce 100644 --- a/go.mod +++ b/go.mod @@ -63,7 +63,7 @@ require ( github.com/uptrace/bun/dialect/sqlitedialect v1.2.1 github.com/uptrace/bun/extra/bunotel v1.2.1 github.com/wagslane/go-password-validator v0.3.0 - github.com/yuin/goldmark v1.7.6 + github.com/yuin/goldmark v1.7.8 go.opentelemetry.io/otel v1.29.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.29.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.29.0 diff --git a/go.sum b/go.sum index 7ca82121e..048f56a47 100644 --- a/go.sum +++ b/go.sum @@ -621,8 +621,8 @@ github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= -github.com/yuin/goldmark v1.7.6 h1:cZgJxVh5mL5cu8KOnwxvFJy5TFB0BHUskZZyq7TYbDg= -github.com/yuin/goldmark v1.7.6/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= +github.com/yuin/goldmark v1.7.8 h1:iERMLn0/QJeHFhxSt3p6PeN9mGnvIKSpG9YYorDMnic= +github.com/yuin/goldmark v1.7.8/go.mod h1:uzxRWxtg69N339t3louHJ7+O03ezfj6PlliRlaOzY1E= gitlab.com/NyaaaWhatsUpDoc/sqlite v1.33.1-concurrency-workaround h1:pFMJnlc1PuH+jcVz4vz53vcpnoZG+NqFBr3qikDmEB4= gitlab.com/NyaaaWhatsUpDoc/sqlite v1.33.1-concurrency-workaround/go.mod h1:pXV2xHxhzXZsgT/RtTFAPY6JJDEvOTcTdwADQCCWD4k= go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd80= diff --git a/vendor/github.com/yuin/goldmark/ast/ast.go b/vendor/github.com/yuin/goldmark/ast/ast.go index 67bb0da56..36ba606f7 100644 --- a/vendor/github.com/yuin/goldmark/ast/ast.go +++ b/vendor/github.com/yuin/goldmark/ast/ast.go @@ -123,6 +123,12 @@ type Node interface { Dump(source []byte, level int) // Text returns text values of this node. + // This method is valid only for some inline nodes. + // If this node is a block node, Text returns a text value as reasonable as possible. + // Notice that there are no 'correct' text values for the block nodes. + // Result for the block nodes may be different from your expectation. + // + // Deprecated: Use other properties of the node to get the text value(i.e. Pragraph.Lines, Text.Value). Text(source []byte) []byte // HasBlankPreviousLines returns true if the row before this node is blank, @@ -374,11 +380,18 @@ func (n *BaseNode) OwnerDocument() *Document { return nil } -// Text implements Node.Text . +// Text implements Node.Text . +// +// Deprecated: Use other properties of the node to get the text value(i.e. Pragraph.Lines, Text.Value). func (n *BaseNode) Text(source []byte) []byte { var buf bytes.Buffer for c := n.firstChild; c != nil; c = c.NextSibling() { buf.Write(c.Text(source)) + if sb, ok := c.(interface { + SoftLineBreak() bool + }); ok && sb.SoftLineBreak() { + buf.WriteByte('\n') + } } return buf.Bytes() } diff --git a/vendor/github.com/yuin/goldmark/ast/block.go b/vendor/github.com/yuin/goldmark/ast/block.go index 04d0d5443..eae7acdca 100644 --- a/vendor/github.com/yuin/goldmark/ast/block.go +++ b/vendor/github.com/yuin/goldmark/ast/block.go @@ -1,7 +1,6 @@ package ast import ( - "bytes" "fmt" "strings" @@ -48,15 +47,6 @@ func (b *BaseBlock) SetLines(v *textm.Segments) { b.lines = v } -// Text implements Node.Text. -func (b *BaseBlock) Text(source []byte) []byte { - var buf bytes.Buffer - for _, line := range b.Lines().Sliced(0, b.Lines().Len()) { - buf.Write(line.Value(source)) - } - return buf.Bytes() -} - // A Document struct is a root node of Markdown text. type Document struct { BaseBlock @@ -140,6 +130,13 @@ func (n *TextBlock) Kind() NodeKind { return KindTextBlock } +// Text implements Node.Text. +// +// Deprecated: Use other properties of the node to get the text value(i.e. TextBlock.Lines). +func (n *TextBlock) Text(source []byte) []byte { + return n.Lines().Value(source) +} + // NewTextBlock returns a new TextBlock node. func NewTextBlock() *TextBlock { return &TextBlock{ @@ -165,6 +162,13 @@ func (n *Paragraph) Kind() NodeKind { return KindParagraph } +// Text implements Node.Text. +// +// Deprecated: Use other properties of the node to get the text value(i.e. Paragraph.Lines). +func (n *Paragraph) Text(source []byte) []byte { + return n.Lines().Value(source) +} + // NewParagraph returns a new Paragraph node. func NewParagraph() *Paragraph { return &Paragraph{ @@ -259,6 +263,13 @@ func (n *CodeBlock) Kind() NodeKind { return KindCodeBlock } +// Text implements Node.Text. +// +// Deprecated: Use other properties of the node to get the text value(i.e. CodeBlock.Lines). +func (n *CodeBlock) Text(source []byte) []byte { + return n.Lines().Value(source) +} + // NewCodeBlock returns a new CodeBlock node. func NewCodeBlock() *CodeBlock { return &CodeBlock{ @@ -314,6 +325,13 @@ func (n *FencedCodeBlock) Kind() NodeKind { return KindFencedCodeBlock } +// Text implements Node.Text. +// +// Deprecated: Use other properties of the node to get the text value(i.e. FencedCodeBlock.Lines). +func (n *FencedCodeBlock) Text(source []byte) []byte { + return n.Lines().Value(source) +} + // NewFencedCodeBlock return a new FencedCodeBlock node. func NewFencedCodeBlock(info *Text) *FencedCodeBlock { return &FencedCodeBlock{ @@ -508,6 +526,17 @@ func (n *HTMLBlock) Kind() NodeKind { return KindHTMLBlock } +// Text implements Node.Text. +// +// Deprecated: Use other properties of the node to get the text value(i.e. HTMLBlock.Lines). +func (n *HTMLBlock) Text(source []byte) []byte { + ret := n.Lines().Value(source) + if n.HasClosure() { + ret = append(ret, n.ClosureLine.Value(source)...) + } + return ret +} + // NewHTMLBlock returns a new HTMLBlock node. func NewHTMLBlock(typ HTMLBlockType) *HTMLBlock { return &HTMLBlock{ diff --git a/vendor/github.com/yuin/goldmark/ast/inline.go b/vendor/github.com/yuin/goldmark/ast/inline.go index 7e4c51f23..613eb1edc 100644 --- a/vendor/github.com/yuin/goldmark/ast/inline.go +++ b/vendor/github.com/yuin/goldmark/ast/inline.go @@ -143,17 +143,25 @@ func (n *Text) Merge(node Node, source []byte) bool { } // Text implements Node.Text. +// +// Deprecated: Use other properties of the node to get the text value(i.e. Text.Value). func (n *Text) Text(source []byte) []byte { return n.Segment.Value(source) } +// Value returns a value of this node. +// SoftLineBreaks are not included in the returned value. +func (n *Text) Value(source []byte) []byte { + return n.Segment.Value(source) +} + // Dump implements Node.Dump. func (n *Text) Dump(source []byte, level int) { fs := textFlagsString(n.flags) if len(fs) != 0 { fs = "(" + fs + ")" } - fmt.Printf("%sText%s: \"%s\"\n", strings.Repeat(" ", level), fs, strings.TrimRight(string(n.Text(source)), "\n")) + fmt.Printf("%sText%s: \"%s\"\n", strings.Repeat(" ", level), fs, strings.TrimRight(string(n.Value(source)), "\n")) } // KindText is a NodeKind of the Text node. @@ -258,6 +266,8 @@ func (n *String) SetCode(v bool) { } // Text implements Node.Text. +// +// Deprecated: Use other properties of the node to get the text value(i.e. String.Value). func (n *String) Text(source []byte) []byte { return n.Value } @@ -492,15 +502,22 @@ func (n *AutoLink) URL(source []byte) []byte { ret := make([]byte, 0, len(n.Protocol)+s.Len()+3) ret = append(ret, n.Protocol...) ret = append(ret, ':', '/', '/') - ret = append(ret, n.value.Text(source)...) + ret = append(ret, n.value.Value(source)...) return ret } - return n.value.Text(source) + return n.value.Value(source) } // Label returns a label of this node. func (n *AutoLink) Label(source []byte) []byte { - return n.value.Text(source) + return n.value.Value(source) +} + +// Text implements Node.Text. +// +// Deprecated: Use other properties of the node to get the text value(i.e. AutoLink.Label). +func (n *AutoLink) Text(source []byte) []byte { + return n.value.Value(source) } // NewAutoLink returns a new AutoLink node. @@ -541,6 +558,13 @@ func (n *RawHTML) Kind() NodeKind { return KindRawHTML } +// Text implements Node.Text. +// +// Deprecated: Use other properties of the node to get the text value(i.e. RawHTML.Segments). +func (n *RawHTML) Text(source []byte) []byte { + return n.Segments.Value(source) +} + // NewRawHTML returns a new RawHTML node. func NewRawHTML() *RawHTML { return &RawHTML{ diff --git a/vendor/github.com/yuin/goldmark/parser/code_block.go b/vendor/github.com/yuin/goldmark/parser/code_block.go index 732f18c65..d99146c52 100644 --- a/vendor/github.com/yuin/goldmark/parser/code_block.go +++ b/vendor/github.com/yuin/goldmark/parser/code_block.go @@ -35,6 +35,7 @@ func (b *codeBlockParser) Open(parent ast.Node, reader text.Reader, pc Context) if segment.Padding != 0 { preserveLeadingTabInCodeBlock(&segment, reader, 0) } + segment.ForceNewline = true node.Lines().Append(segment) reader.Advance(segment.Len() - 1) return node, NoChildren @@ -59,6 +60,7 @@ func (b *codeBlockParser) Continue(node ast.Node, reader text.Reader, pc Context preserveLeadingTabInCodeBlock(&segment, reader, 0) } + segment.ForceNewline = true node.Lines().Append(segment) reader.Advance(segment.Len() - 1) return Continue | NoChildren diff --git a/vendor/github.com/yuin/goldmark/parser/fcode_block.go b/vendor/github.com/yuin/goldmark/parser/fcode_block.go index e51a35ace..953b8dcba 100644 --- a/vendor/github.com/yuin/goldmark/parser/fcode_block.go +++ b/vendor/github.com/yuin/goldmark/parser/fcode_block.go @@ -100,6 +100,7 @@ func (b *fencedCodeBlockParser) Continue(node ast.Node, reader text.Reader, pc C if padding != 0 { preserveLeadingTabInCodeBlock(&seg, reader, fdata.indent) } + seg.ForceNewline = true // EOF as newline node.Lines().Append(seg) reader.AdvanceAndSetPadding(segment.Stop-segment.Start-pos-1, padding) return Continue | NoChildren diff --git a/vendor/github.com/yuin/goldmark/parser/parser.go b/vendor/github.com/yuin/goldmark/parser/parser.go index b59666c6d..b05db1356 100644 --- a/vendor/github.com/yuin/goldmark/parser/parser.go +++ b/vendor/github.com/yuin/goldmark/parser/parser.go @@ -878,12 +878,6 @@ func (p *parser) Parse(reader text.Reader, opts ...ParseOption) ast.Node { blockReader := text.NewBlockReader(reader.Source(), nil) p.walkBlock(root, func(node ast.Node) { p.parseBlock(blockReader, node, pc) - lines := node.Lines() - if lines != nil && lines.Len() != 0 { - s := lines.At(lines.Len() - 1) - s.EOB = true - lines.Set(lines.Len()-1, s) - } }) for _, at := range p.astTransformers { at.Transform(root, reader, pc) diff --git a/vendor/github.com/yuin/goldmark/renderer/html/html.go b/vendor/github.com/yuin/goldmark/renderer/html/html.go index 9ebd0a371..aac8d2dd7 100644 --- a/vendor/github.com/yuin/goldmark/renderer/html/html.go +++ b/vendor/github.com/yuin/goldmark/renderer/html/html.go @@ -680,7 +680,7 @@ func (r *Renderer) renderImage(w util.BufWriter, source []byte, node ast.Node, e _, _ = w.Write(util.EscapeHTML(util.URLEscape(n.Destination, true))) } _, _ = w.WriteString(`" alt="`) - r.renderAttribute(w, source, n) + r.renderTexts(w, source, n) _ = w.WriteByte('"') if n.Title != nil { _, _ = w.WriteString(` title="`) @@ -737,7 +737,7 @@ func (r *Renderer) renderText(w util.BufWriter, source []byte, node ast.Node, en if r.EastAsianLineBreaks != EastAsianLineBreaksNone && len(value) != 0 { sibling := node.NextSibling() if sibling != nil && sibling.Kind() == ast.KindText { - if siblingText := sibling.(*ast.Text).Text(source); len(siblingText) != 0 { + if siblingText := sibling.(*ast.Text).Value(source); len(siblingText) != 0 { thisLastRune := util.ToRune(value, len(value)-1) siblingFirstRune, _ := utf8.DecodeRune(siblingText) if r.EastAsianLineBreaks.softLineBreak(thisLastRune, siblingFirstRune) { @@ -770,19 +770,14 @@ func (r *Renderer) renderString(w util.BufWriter, source []byte, node ast.Node, return ast.WalkContinue, nil } -func (r *Renderer) renderAttribute(w util.BufWriter, source []byte, n ast.Node) { +func (r *Renderer) renderTexts(w util.BufWriter, source []byte, n ast.Node) { for c := n.FirstChild(); c != nil; c = c.NextSibling() { if s, ok := c.(*ast.String); ok { _, _ = r.renderString(w, source, s, true) - } else if t, ok := c.(*ast.String); ok { + } else if t, ok := c.(*ast.Text); ok { _, _ = r.renderText(w, source, t, true) - } else if !c.HasChildren() { - r.Writer.Write(w, c.Text(source)) - if t, ok := c.(*ast.Text); ok && t.SoftLineBreak() { - _ = w.WriteByte('\n') - } } else { - r.renderAttribute(w, source, c) + r.renderTexts(w, source, c) } } } diff --git a/vendor/github.com/yuin/goldmark/text/segment.go b/vendor/github.com/yuin/goldmark/text/segment.go index 83c875bcb..93fbf1994 100644 --- a/vendor/github.com/yuin/goldmark/text/segment.go +++ b/vendor/github.com/yuin/goldmark/text/segment.go @@ -20,8 +20,19 @@ type Segment struct { // Padding is a padding length of the segment. Padding int - // EOB is true if the segment is end of the block. - EOB bool + // ForceNewline is true if the segment should be ended with a newline. + // Some elements(i.e. CodeBlock, FencedCodeBlock) does not trim trailing + // newlines. Spec defines that EOF is treated as a newline, so we need to + // add a newline to the end of the segment if it is not empty. + // + // i.e.: + // + // ```go + // const test = "test" + // + // This code does not close the code block and ends with EOF. In this case, + // we need to add a newline to the end of the last line like `const test = "test"\n`. + ForceNewline bool } // NewSegment return a new Segment. @@ -52,7 +63,7 @@ func (t *Segment) Value(buffer []byte) []byte { result = append(result, bytes.Repeat(space, t.Padding)...) result = append(result, buffer[t.Start:t.Stop]...) } - if t.EOB && len(result) > 0 && result[len(result)-1] != '\n' { + if t.ForceNewline && len(result) > 0 && result[len(result)-1] != '\n' { result = append(result, '\n') } return result @@ -217,3 +228,12 @@ func (s *Segments) Unshift(v Segment) { s.values = append(s.values[0:1], s.values[0:]...) s.values[0] = v } + +// Value returns a string value of the collection. +func (s *Segments) Value(buffer []byte) []byte { + var result []byte + for _, v := range s.values { + result = append(result, v.Value(buffer)...) + } + return result +} diff --git a/vendor/modules.txt b/vendor/modules.txt index d41601709..beef3741d 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -954,7 +954,7 @@ github.com/vmihailenco/tagparser/v2/internal/parser # github.com/wagslane/go-password-validator v0.3.0 ## explicit; go 1.16 github.com/wagslane/go-password-validator -# github.com/yuin/goldmark v1.7.6 +# github.com/yuin/goldmark v1.7.8 ## explicit; go 1.19 github.com/yuin/goldmark github.com/yuin/goldmark/ast