mirror of
				https://github.com/go-gitea/gitea
				synced 2025-11-03 21:08:25 +00:00 
			
		
		
		
	Vendor Update Go Libs (#13166)
* update github.com/alecthomas/chroma v0.8.0 -> v0.8.1 * github.com/blevesearch/bleve v1.0.10 -> v1.0.12 * editorconfig-core-go v2.1.1 -> v2.3.7 * github.com/gliderlabs/ssh v0.2.2 -> v0.3.1 * migrate editorconfig.ParseBytes to Parse * github.com/shurcooL/vfsgen to 0d455de96546 * github.com/go-git/go-git/v5 v5.1.0 -> v5.2.0 * github.com/google/uuid v1.1.1 -> v1.1.2 * github.com/huandu/xstrings v1.3.0 -> v1.3.2 * github.com/klauspost/compress v1.10.11 -> v1.11.1 * github.com/markbates/goth v1.61.2 -> v1.65.0 * github.com/mattn/go-sqlite3 v1.14.0 -> v1.14.4 * github.com/mholt/archiver v3.3.0 -> v3.3.2 * github.com/microcosm-cc/bluemonday 4f7140c49acb -> v1.0.4 * github.com/minio/minio-go v7.0.4 -> v7.0.5 * github.com/olivere/elastic v7.0.9 -> v7.0.20 * github.com/urfave/cli v1.20.0 -> v1.22.4 * github.com/prometheus/client_golang v1.1.0 -> v1.8.0 * github.com/xanzy/go-gitlab v0.37.0 -> v0.38.1 * mvdan.cc/xurls v2.1.0 -> v2.2.0 Co-authored-by: Lauris BH <lauris@nix.lv>
This commit is contained in:
		
							
								
								
									
										14
									
								
								vendor/github.com/cpuguy83/go-md2man/v2/md2man/md2man.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								vendor/github.com/cpuguy83/go-md2man/v2/md2man/md2man.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,14 @@
 | 
			
		||||
package md2man
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"github.com/russross/blackfriday/v2"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Render converts a markdown document into a roff formatted document.
 | 
			
		||||
func Render(doc []byte) []byte {
 | 
			
		||||
	renderer := NewRoffRenderer()
 | 
			
		||||
 | 
			
		||||
	return blackfriday.Run(doc,
 | 
			
		||||
		[]blackfriday.Option{blackfriday.WithRenderer(renderer),
 | 
			
		||||
			blackfriday.WithExtensions(renderer.GetExtensions())}...)
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										345
									
								
								vendor/github.com/cpuguy83/go-md2man/v2/md2man/roff.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										345
									
								
								vendor/github.com/cpuguy83/go-md2man/v2/md2man/roff.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,345 @@
 | 
			
		||||
package md2man
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"os"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
	"github.com/russross/blackfriday/v2"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// roffRenderer implements the blackfriday.Renderer interface for creating
 | 
			
		||||
// roff format (manpages) from markdown text
 | 
			
		||||
type roffRenderer struct {
 | 
			
		||||
	extensions   blackfriday.Extensions
 | 
			
		||||
	listCounters []int
 | 
			
		||||
	firstHeader  bool
 | 
			
		||||
	defineTerm   bool
 | 
			
		||||
	listDepth    int
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const (
 | 
			
		||||
	titleHeader      = ".TH "
 | 
			
		||||
	topLevelHeader   = "\n\n.SH "
 | 
			
		||||
	secondLevelHdr   = "\n.SH "
 | 
			
		||||
	otherHeader      = "\n.SS "
 | 
			
		||||
	crTag            = "\n"
 | 
			
		||||
	emphTag          = "\\fI"
 | 
			
		||||
	emphCloseTag     = "\\fP"
 | 
			
		||||
	strongTag        = "\\fB"
 | 
			
		||||
	strongCloseTag   = "\\fP"
 | 
			
		||||
	breakTag         = "\n.br\n"
 | 
			
		||||
	paraTag          = "\n.PP\n"
 | 
			
		||||
	hruleTag         = "\n.ti 0\n\\l'\\n(.lu'\n"
 | 
			
		||||
	linkTag          = "\n\\[la]"
 | 
			
		||||
	linkCloseTag     = "\\[ra]"
 | 
			
		||||
	codespanTag      = "\\fB\\fC"
 | 
			
		||||
	codespanCloseTag = "\\fR"
 | 
			
		||||
	codeTag          = "\n.PP\n.RS\n\n.nf\n"
 | 
			
		||||
	codeCloseTag     = "\n.fi\n.RE\n"
 | 
			
		||||
	quoteTag         = "\n.PP\n.RS\n"
 | 
			
		||||
	quoteCloseTag    = "\n.RE\n"
 | 
			
		||||
	listTag          = "\n.RS\n"
 | 
			
		||||
	listCloseTag     = "\n.RE\n"
 | 
			
		||||
	arglistTag       = "\n.TP\n"
 | 
			
		||||
	tableStart       = "\n.TS\nallbox;\n"
 | 
			
		||||
	tableEnd         = ".TE\n"
 | 
			
		||||
	tableCellStart   = "T{\n"
 | 
			
		||||
	tableCellEnd     = "\nT}\n"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// NewRoffRenderer creates a new blackfriday Renderer for generating roff documents
 | 
			
		||||
// from markdown
 | 
			
		||||
func NewRoffRenderer() *roffRenderer { // nolint: golint
 | 
			
		||||
	var extensions blackfriday.Extensions
 | 
			
		||||
 | 
			
		||||
	extensions |= blackfriday.NoIntraEmphasis
 | 
			
		||||
	extensions |= blackfriday.Tables
 | 
			
		||||
	extensions |= blackfriday.FencedCode
 | 
			
		||||
	extensions |= blackfriday.SpaceHeadings
 | 
			
		||||
	extensions |= blackfriday.Footnotes
 | 
			
		||||
	extensions |= blackfriday.Titleblock
 | 
			
		||||
	extensions |= blackfriday.DefinitionLists
 | 
			
		||||
	return &roffRenderer{
 | 
			
		||||
		extensions: extensions,
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// GetExtensions returns the list of extensions used by this renderer implementation
 | 
			
		||||
func (r *roffRenderer) GetExtensions() blackfriday.Extensions {
 | 
			
		||||
	return r.extensions
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RenderHeader handles outputting the header at document start
 | 
			
		||||
func (r *roffRenderer) RenderHeader(w io.Writer, ast *blackfriday.Node) {
 | 
			
		||||
	// disable hyphenation
 | 
			
		||||
	out(w, ".nh\n")
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RenderFooter handles outputting the footer at the document end; the roff
 | 
			
		||||
// renderer has no footer information
 | 
			
		||||
func (r *roffRenderer) RenderFooter(w io.Writer, ast *blackfriday.Node) {
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// RenderNode is called for each node in a markdown document; based on the node
 | 
			
		||||
// type the equivalent roff output is sent to the writer
 | 
			
		||||
func (r *roffRenderer) RenderNode(w io.Writer, node *blackfriday.Node, entering bool) blackfriday.WalkStatus {
 | 
			
		||||
 | 
			
		||||
	var walkAction = blackfriday.GoToNext
 | 
			
		||||
 | 
			
		||||
	switch node.Type {
 | 
			
		||||
	case blackfriday.Text:
 | 
			
		||||
		r.handleText(w, node, entering)
 | 
			
		||||
	case blackfriday.Softbreak:
 | 
			
		||||
		out(w, crTag)
 | 
			
		||||
	case blackfriday.Hardbreak:
 | 
			
		||||
		out(w, breakTag)
 | 
			
		||||
	case blackfriday.Emph:
 | 
			
		||||
		if entering {
 | 
			
		||||
			out(w, emphTag)
 | 
			
		||||
		} else {
 | 
			
		||||
			out(w, emphCloseTag)
 | 
			
		||||
		}
 | 
			
		||||
	case blackfriday.Strong:
 | 
			
		||||
		if entering {
 | 
			
		||||
			out(w, strongTag)
 | 
			
		||||
		} else {
 | 
			
		||||
			out(w, strongCloseTag)
 | 
			
		||||
		}
 | 
			
		||||
	case blackfriday.Link:
 | 
			
		||||
		if !entering {
 | 
			
		||||
			out(w, linkTag+string(node.LinkData.Destination)+linkCloseTag)
 | 
			
		||||
		}
 | 
			
		||||
	case blackfriday.Image:
 | 
			
		||||
		// ignore images
 | 
			
		||||
		walkAction = blackfriday.SkipChildren
 | 
			
		||||
	case blackfriday.Code:
 | 
			
		||||
		out(w, codespanTag)
 | 
			
		||||
		escapeSpecialChars(w, node.Literal)
 | 
			
		||||
		out(w, codespanCloseTag)
 | 
			
		||||
	case blackfriday.Document:
 | 
			
		||||
		break
 | 
			
		||||
	case blackfriday.Paragraph:
 | 
			
		||||
		// roff .PP markers break lists
 | 
			
		||||
		if r.listDepth > 0 {
 | 
			
		||||
			return blackfriday.GoToNext
 | 
			
		||||
		}
 | 
			
		||||
		if entering {
 | 
			
		||||
			out(w, paraTag)
 | 
			
		||||
		} else {
 | 
			
		||||
			out(w, crTag)
 | 
			
		||||
		}
 | 
			
		||||
	case blackfriday.BlockQuote:
 | 
			
		||||
		if entering {
 | 
			
		||||
			out(w, quoteTag)
 | 
			
		||||
		} else {
 | 
			
		||||
			out(w, quoteCloseTag)
 | 
			
		||||
		}
 | 
			
		||||
	case blackfriday.Heading:
 | 
			
		||||
		r.handleHeading(w, node, entering)
 | 
			
		||||
	case blackfriday.HorizontalRule:
 | 
			
		||||
		out(w, hruleTag)
 | 
			
		||||
	case blackfriday.List:
 | 
			
		||||
		r.handleList(w, node, entering)
 | 
			
		||||
	case blackfriday.Item:
 | 
			
		||||
		r.handleItem(w, node, entering)
 | 
			
		||||
	case blackfriday.CodeBlock:
 | 
			
		||||
		out(w, codeTag)
 | 
			
		||||
		escapeSpecialChars(w, node.Literal)
 | 
			
		||||
		out(w, codeCloseTag)
 | 
			
		||||
	case blackfriday.Table:
 | 
			
		||||
		r.handleTable(w, node, entering)
 | 
			
		||||
	case blackfriday.TableCell:
 | 
			
		||||
		r.handleTableCell(w, node, entering)
 | 
			
		||||
	case blackfriday.TableHead:
 | 
			
		||||
	case blackfriday.TableBody:
 | 
			
		||||
	case blackfriday.TableRow:
 | 
			
		||||
		// no action as cell entries do all the nroff formatting
 | 
			
		||||
		return blackfriday.GoToNext
 | 
			
		||||
	default:
 | 
			
		||||
		fmt.Fprintln(os.Stderr, "WARNING: go-md2man does not handle node type "+node.Type.String())
 | 
			
		||||
	}
 | 
			
		||||
	return walkAction
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *roffRenderer) handleText(w io.Writer, node *blackfriday.Node, entering bool) {
 | 
			
		||||
	var (
 | 
			
		||||
		start, end string
 | 
			
		||||
	)
 | 
			
		||||
	// handle special roff table cell text encapsulation
 | 
			
		||||
	if node.Parent.Type == blackfriday.TableCell {
 | 
			
		||||
		if len(node.Literal) > 30 {
 | 
			
		||||
			start = tableCellStart
 | 
			
		||||
			end = tableCellEnd
 | 
			
		||||
		} else {
 | 
			
		||||
			// end rows that aren't terminated by "tableCellEnd" with a cr if end of row
 | 
			
		||||
			if node.Parent.Next == nil && !node.Parent.IsHeader {
 | 
			
		||||
				end = crTag
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	out(w, start)
 | 
			
		||||
	escapeSpecialChars(w, node.Literal)
 | 
			
		||||
	out(w, end)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *roffRenderer) handleHeading(w io.Writer, node *blackfriday.Node, entering bool) {
 | 
			
		||||
	if entering {
 | 
			
		||||
		switch node.Level {
 | 
			
		||||
		case 1:
 | 
			
		||||
			if !r.firstHeader {
 | 
			
		||||
				out(w, titleHeader)
 | 
			
		||||
				r.firstHeader = true
 | 
			
		||||
				break
 | 
			
		||||
			}
 | 
			
		||||
			out(w, topLevelHeader)
 | 
			
		||||
		case 2:
 | 
			
		||||
			out(w, secondLevelHdr)
 | 
			
		||||
		default:
 | 
			
		||||
			out(w, otherHeader)
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *roffRenderer) handleList(w io.Writer, node *blackfriday.Node, entering bool) {
 | 
			
		||||
	openTag := listTag
 | 
			
		||||
	closeTag := listCloseTag
 | 
			
		||||
	if node.ListFlags&blackfriday.ListTypeDefinition != 0 {
 | 
			
		||||
		// tags for definition lists handled within Item node
 | 
			
		||||
		openTag = ""
 | 
			
		||||
		closeTag = ""
 | 
			
		||||
	}
 | 
			
		||||
	if entering {
 | 
			
		||||
		r.listDepth++
 | 
			
		||||
		if node.ListFlags&blackfriday.ListTypeOrdered != 0 {
 | 
			
		||||
			r.listCounters = append(r.listCounters, 1)
 | 
			
		||||
		}
 | 
			
		||||
		out(w, openTag)
 | 
			
		||||
	} else {
 | 
			
		||||
		if node.ListFlags&blackfriday.ListTypeOrdered != 0 {
 | 
			
		||||
			r.listCounters = r.listCounters[:len(r.listCounters)-1]
 | 
			
		||||
		}
 | 
			
		||||
		out(w, closeTag)
 | 
			
		||||
		r.listDepth--
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *roffRenderer) handleItem(w io.Writer, node *blackfriday.Node, entering bool) {
 | 
			
		||||
	if entering {
 | 
			
		||||
		if node.ListFlags&blackfriday.ListTypeOrdered != 0 {
 | 
			
		||||
			out(w, fmt.Sprintf(".IP \"%3d.\" 5\n", r.listCounters[len(r.listCounters)-1]))
 | 
			
		||||
			r.listCounters[len(r.listCounters)-1]++
 | 
			
		||||
		} else if node.ListFlags&blackfriday.ListTypeDefinition != 0 {
 | 
			
		||||
			// state machine for handling terms and following definitions
 | 
			
		||||
			// since blackfriday does not distinguish them properly, nor
 | 
			
		||||
			// does it seperate them into separate lists as it should
 | 
			
		||||
			if !r.defineTerm {
 | 
			
		||||
				out(w, arglistTag)
 | 
			
		||||
				r.defineTerm = true
 | 
			
		||||
			} else {
 | 
			
		||||
				r.defineTerm = false
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			out(w, ".IP \\(bu 2\n")
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		out(w, "\n")
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *roffRenderer) handleTable(w io.Writer, node *blackfriday.Node, entering bool) {
 | 
			
		||||
	if entering {
 | 
			
		||||
		out(w, tableStart)
 | 
			
		||||
		//call walker to count cells (and rows?) so format section can be produced
 | 
			
		||||
		columns := countColumns(node)
 | 
			
		||||
		out(w, strings.Repeat("l ", columns)+"\n")
 | 
			
		||||
		out(w, strings.Repeat("l ", columns)+".\n")
 | 
			
		||||
	} else {
 | 
			
		||||
		out(w, tableEnd)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func (r *roffRenderer) handleTableCell(w io.Writer, node *blackfriday.Node, entering bool) {
 | 
			
		||||
	var (
 | 
			
		||||
		start, end string
 | 
			
		||||
	)
 | 
			
		||||
	if node.IsHeader {
 | 
			
		||||
		start = codespanTag
 | 
			
		||||
		end = codespanCloseTag
 | 
			
		||||
	}
 | 
			
		||||
	if entering {
 | 
			
		||||
		if node.Prev != nil && node.Prev.Type == blackfriday.TableCell {
 | 
			
		||||
			out(w, "\t"+start)
 | 
			
		||||
		} else {
 | 
			
		||||
			out(w, start)
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		// need to carriage return if we are at the end of the header row
 | 
			
		||||
		if node.IsHeader && node.Next == nil {
 | 
			
		||||
			end = end + crTag
 | 
			
		||||
		}
 | 
			
		||||
		out(w, end)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// because roff format requires knowing the column count before outputting any table
 | 
			
		||||
// data we need to walk a table tree and count the columns
 | 
			
		||||
func countColumns(node *blackfriday.Node) int {
 | 
			
		||||
	var columns int
 | 
			
		||||
 | 
			
		||||
	node.Walk(func(node *blackfriday.Node, entering bool) blackfriday.WalkStatus {
 | 
			
		||||
		switch node.Type {
 | 
			
		||||
		case blackfriday.TableRow:
 | 
			
		||||
			if !entering {
 | 
			
		||||
				return blackfriday.Terminate
 | 
			
		||||
			}
 | 
			
		||||
		case blackfriday.TableCell:
 | 
			
		||||
			if entering {
 | 
			
		||||
				columns++
 | 
			
		||||
			}
 | 
			
		||||
		default:
 | 
			
		||||
		}
 | 
			
		||||
		return blackfriday.GoToNext
 | 
			
		||||
	})
 | 
			
		||||
	return columns
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func out(w io.Writer, output string) {
 | 
			
		||||
	io.WriteString(w, output) // nolint: errcheck
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func needsBackslash(c byte) bool {
 | 
			
		||||
	for _, r := range []byte("-_&\\~") {
 | 
			
		||||
		if c == r {
 | 
			
		||||
			return true
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return false
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func escapeSpecialChars(w io.Writer, text []byte) {
 | 
			
		||||
	for i := 0; i < len(text); i++ {
 | 
			
		||||
		// escape initial apostrophe or period
 | 
			
		||||
		if len(text) >= 1 && (text[0] == '\'' || text[0] == '.') {
 | 
			
		||||
			out(w, "\\&")
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// directly copy normal characters
 | 
			
		||||
		org := i
 | 
			
		||||
 | 
			
		||||
		for i < len(text) && !needsBackslash(text[i]) {
 | 
			
		||||
			i++
 | 
			
		||||
		}
 | 
			
		||||
		if i > org {
 | 
			
		||||
			w.Write(text[org:i]) // nolint: errcheck
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		// escape a character
 | 
			
		||||
		if i >= len(text) {
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		w.Write([]byte{'\\', text[i]}) // nolint: errcheck
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user