mirror of
				https://gitee.com/gitea/gitea
				synced 2025-11-04 16:40:24 +08:00 
			
		
		
		
	Fix copy/paste of empty lines (#19798)
* Fix copy/paste of empty newlines again Fixes: https://github.com/go-gitea/gitea/issues/19331 Regressed by: https://github.com/go-gitea/gitea/pull/18270 Needed to do another newline addition to the Chroma output HTML to get copy/paste work again. The previous replacement conditions are probably obsolete, but as I'm not 100% sure, I opted to keep them. Specifically, the Chroma HTML change mentioned in https://github.com/go-gitea/gitea/pull/18270#issuecomment-1013350246 broke our previous newline replacement for such empty lines. Also included are a few changes to make the test more pleasant to work with. * run go mod tidy * add util.Dedent * copy in the code Co-authored-by: techknowlogick <techknowlogick@gitea.io> Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com> Co-authored-by: Lauris BH <lauris@nix.lv>
This commit is contained in:
		@@ -9,6 +9,7 @@ import (
 | 
			
		||||
	"crypto/rand"
 | 
			
		||||
	"errors"
 | 
			
		||||
	"math/big"
 | 
			
		||||
	"regexp"
 | 
			
		||||
	"strconv"
 | 
			
		||||
	"strings"
 | 
			
		||||
 | 
			
		||||
@@ -191,3 +192,35 @@ var titleCaser = cases.Title(language.English)
 | 
			
		||||
func ToTitleCase(s string) string {
 | 
			
		||||
	return titleCaser.String(s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var (
 | 
			
		||||
	whitespaceOnly    = regexp.MustCompile("(?m)^[ \t]+$")
 | 
			
		||||
	leadingWhitespace = regexp.MustCompile("(?m)(^[ \t]*)(?:[^ \t\n])")
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// Dedent removes common indentation of a multi-line string along with whitespace around it
 | 
			
		||||
// Based on https://github.com/lithammer/dedent
 | 
			
		||||
func Dedent(s string) string {
 | 
			
		||||
	var margin string
 | 
			
		||||
 | 
			
		||||
	s = whitespaceOnly.ReplaceAllString(s, "")
 | 
			
		||||
	indents := leadingWhitespace.FindAllStringSubmatch(s, -1)
 | 
			
		||||
 | 
			
		||||
	for i, indent := range indents {
 | 
			
		||||
		if i == 0 {
 | 
			
		||||
			margin = indent[1]
 | 
			
		||||
		} else if strings.HasPrefix(indent[1], margin) {
 | 
			
		||||
			continue
 | 
			
		||||
		} else if strings.HasPrefix(margin, indent[1]) {
 | 
			
		||||
			margin = indent[1]
 | 
			
		||||
		} else {
 | 
			
		||||
			margin = ""
 | 
			
		||||
			break
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if margin != "" {
 | 
			
		||||
		s = regexp.MustCompile("(?m)^"+margin).ReplaceAllString(s, "")
 | 
			
		||||
	}
 | 
			
		||||
	return strings.TrimSpace(s)
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user