mirror of
				https://codeberg.org/forgejo/forgejo.git
				synced 2025-10-31 06:21:11 +00:00 
			
		
		
		
	Signed-off-by: PJ Eby <pje@telecommunity.com>
This commit is contained in:
		
					parent
					
						
							
								76106ab080
							
						
					
				
			
			
				commit
				
					
						fc36567ee1
					
				
			
		
					 9 changed files with 292 additions and 110 deletions
				
			
		
							
								
								
									
										67
									
								
								vendor/github.com/russross/blackfriday/block.go
									
										
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										67
									
								
								vendor/github.com/russross/blackfriday/block.go
									
										
									
										generated
									
									
										vendored
									
									
								
							|  | @ -15,8 +15,8 @@ package blackfriday | |||
| 
 | ||||
| import ( | ||||
| 	"bytes" | ||||
| 
 | ||||
| 	"github.com/shurcooL/sanitized_anchor_name" | ||||
| 	"strings" | ||||
| 	"unicode" | ||||
| ) | ||||
| 
 | ||||
| // Parse block-level data. | ||||
|  | @ -93,7 +93,7 @@ func (p *parser) block(out *bytes.Buffer, data []byte) { | |||
| 
 | ||||
| 		// fenced code block: | ||||
| 		// | ||||
| 		// ``` go | ||||
| 		// ``` go info string here | ||||
| 		// func fact(n int) int { | ||||
| 		//     if n <= 1 { | ||||
| 		//         return n | ||||
|  | @ -243,7 +243,7 @@ func (p *parser) prefixHeader(out *bytes.Buffer, data []byte) int { | |||
| 	} | ||||
| 	if end > i { | ||||
| 		if id == "" && p.flags&EXTENSION_AUTO_HEADER_IDS != 0 { | ||||
| 			id = sanitized_anchor_name.Create(string(data[i:end])) | ||||
| 			id = SanitizedAnchorName(string(data[i:end])) | ||||
| 		} | ||||
| 		work := func() bool { | ||||
| 			p.inline(out, data[i:end]) | ||||
|  | @ -563,7 +563,7 @@ func (*parser) isHRule(data []byte) bool { | |||
| // and returns the end index if so, or 0 otherwise. It also returns the marker found. | ||||
| // If syntax is not nil, it gets set to the syntax specified in the fence line. | ||||
| // A final newline is mandatory to recognize the fence line, unless newlineOptional is true. | ||||
| func isFenceLine(data []byte, syntax *string, oldmarker string, newlineOptional bool) (end int, marker string) { | ||||
| func isFenceLine(data []byte, info *string, oldmarker string, newlineOptional bool) (end int, marker string) { | ||||
| 	i, size := 0, 0 | ||||
| 
 | ||||
| 	// skip up to three spaces | ||||
|  | @ -599,9 +599,9 @@ func isFenceLine(data []byte, syntax *string, oldmarker string, newlineOptional | |||
| 	} | ||||
| 
 | ||||
| 	// TODO(shurcooL): It's probably a good idea to simplify the 2 code paths here | ||||
| 	// into one, always get the syntax, and discard it if the caller doesn't care. | ||||
| 	if syntax != nil { | ||||
| 		syn := 0 | ||||
| 	// into one, always get the info string, and discard it if the caller doesn't care. | ||||
| 	if info != nil { | ||||
| 		infoLength := 0 | ||||
| 		i = skipChar(data, i, ' ') | ||||
| 
 | ||||
| 		if i >= len(data) { | ||||
|  | @ -611,14 +611,14 @@ func isFenceLine(data []byte, syntax *string, oldmarker string, newlineOptional | |||
| 			return 0, "" | ||||
| 		} | ||||
| 
 | ||||
| 		syntaxStart := i | ||||
| 		infoStart := i | ||||
| 
 | ||||
| 		if data[i] == '{' { | ||||
| 			i++ | ||||
| 			syntaxStart++ | ||||
| 			infoStart++ | ||||
| 
 | ||||
| 			for i < len(data) && data[i] != '}' && data[i] != '\n' { | ||||
| 				syn++ | ||||
| 				infoLength++ | ||||
| 				i++ | ||||
| 			} | ||||
| 
 | ||||
|  | @ -628,24 +628,24 @@ func isFenceLine(data []byte, syntax *string, oldmarker string, newlineOptional | |||
| 
 | ||||
| 			// strip all whitespace at the beginning and the end | ||||
| 			// of the {} block | ||||
| 			for syn > 0 && isspace(data[syntaxStart]) { | ||||
| 				syntaxStart++ | ||||
| 				syn-- | ||||
| 			for infoLength > 0 && isspace(data[infoStart]) { | ||||
| 				infoStart++ | ||||
| 				infoLength-- | ||||
| 			} | ||||
| 
 | ||||
| 			for syn > 0 && isspace(data[syntaxStart+syn-1]) { | ||||
| 				syn-- | ||||
| 			for infoLength > 0 && isspace(data[infoStart+infoLength-1]) { | ||||
| 				infoLength-- | ||||
| 			} | ||||
| 
 | ||||
| 			i++ | ||||
| 		} else { | ||||
| 			for i < len(data) && !isspace(data[i]) { | ||||
| 				syn++ | ||||
| 			for i < len(data) && !isverticalspace(data[i]) { | ||||
| 				infoLength++ | ||||
| 				i++ | ||||
| 			} | ||||
| 		} | ||||
| 
 | ||||
| 		*syntax = string(data[syntaxStart : syntaxStart+syn]) | ||||
| 		*info = strings.TrimSpace(string(data[infoStart : infoStart+infoLength])) | ||||
| 	} | ||||
| 
 | ||||
| 	i = skipChar(data, i, ' ') | ||||
|  | @ -663,8 +663,8 @@ func isFenceLine(data []byte, syntax *string, oldmarker string, newlineOptional | |||
| // or 0 otherwise. It writes to out if doRender is true, otherwise it has no side effects. | ||||
| // If doRender is true, a final newline is mandatory to recognize the fenced code block. | ||||
| func (p *parser) fencedCodeBlock(out *bytes.Buffer, data []byte, doRender bool) int { | ||||
| 	var syntax string | ||||
| 	beg, marker := isFenceLine(data, &syntax, "", false) | ||||
| 	var infoString string | ||||
| 	beg, marker := isFenceLine(data, &infoString, "", false) | ||||
| 	if beg == 0 || beg >= len(data) { | ||||
| 		return 0 | ||||
| 	} | ||||
|  | @ -698,7 +698,7 @@ func (p *parser) fencedCodeBlock(out *bytes.Buffer, data []byte, doRender bool) | |||
| 	} | ||||
| 
 | ||||
| 	if doRender { | ||||
| 		p.r.BlockCode(out, work.Bytes(), syntax) | ||||
| 		p.r.BlockCode(out, work.Bytes(), infoString) | ||||
| 	} | ||||
| 
 | ||||
| 	return beg | ||||
|  | @ -1364,7 +1364,7 @@ func (p *parser) paragraph(out *bytes.Buffer, data []byte) int { | |||
| 
 | ||||
| 				id := "" | ||||
| 				if p.flags&EXTENSION_AUTO_HEADER_IDS != 0 { | ||||
| 					id = sanitized_anchor_name.Create(string(data[prev:eol])) | ||||
| 					id = SanitizedAnchorName(string(data[prev:eol])) | ||||
| 				} | ||||
| 
 | ||||
| 				p.r.Header(out, work, level, id) | ||||
|  | @ -1428,3 +1428,24 @@ func (p *parser) paragraph(out *bytes.Buffer, data []byte) int { | |||
| 	p.renderParagraph(out, data[:i]) | ||||
| 	return i | ||||
| } | ||||
| 
 | ||||
| // SanitizedAnchorName returns a sanitized anchor name for the given text. | ||||
| // | ||||
| // It implements the algorithm specified in the package comment. | ||||
| func SanitizedAnchorName(text string) string { | ||||
| 	var anchorName []rune | ||||
| 	futureDash := false | ||||
| 	for _, r := range text { | ||||
| 		switch { | ||||
| 		case unicode.IsLetter(r) || unicode.IsNumber(r): | ||||
| 			if futureDash && len(anchorName) > 0 { | ||||
| 				anchorName = append(anchorName, '-') | ||||
| 			} | ||||
| 			futureDash = false | ||||
| 			anchorName = append(anchorName, unicode.ToLower(r)) | ||||
| 		default: | ||||
| 			futureDash = true | ||||
| 		} | ||||
| 	} | ||||
| 	return string(anchorName) | ||||
| } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue