Make `user-content-* ` consistent with github (#26388)
Fix #26367 Related #19745 Thanks @lazyky for providing test cases
This commit is contained in:
		
							parent
							
								
									220f236ff5
								
							
						
					
					
						commit
						d41aee1d1e
					
				| 
						 | 
					@ -29,17 +29,12 @@ func CleanValue(value []byte) []byte {
 | 
				
			||||||
	value = bytes.TrimSpace(value)
 | 
						value = bytes.TrimSpace(value)
 | 
				
			||||||
	rs := bytes.Runes(value)
 | 
						rs := bytes.Runes(value)
 | 
				
			||||||
	result := make([]rune, 0, len(rs))
 | 
						result := make([]rune, 0, len(rs))
 | 
				
			||||||
	needsDash := false
 | 
					 | 
				
			||||||
	for _, r := range rs {
 | 
						for _, r := range rs {
 | 
				
			||||||
		switch {
 | 
							if unicode.IsLetter(r) || unicode.IsNumber(r) || r == '_' || r == '-' {
 | 
				
			||||||
		case unicode.IsLetter(r) || unicode.IsNumber(r) || r == '_':
 | 
					 | 
				
			||||||
			if needsDash && len(result) > 0 {
 | 
					 | 
				
			||||||
				result = append(result, '-')
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
			needsDash = false
 | 
					 | 
				
			||||||
			result = append(result, unicode.ToLower(r))
 | 
								result = append(result, unicode.ToLower(r))
 | 
				
			||||||
		default:
 | 
							}
 | 
				
			||||||
			needsDash = true
 | 
							if unicode.IsSpace(r) {
 | 
				
			||||||
 | 
								result = append(result, '-')
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	return []byte(string(result))
 | 
						return []byte(string(result))
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,60 @@
 | 
				
			||||||
 | 
					// Copyright 2023 The Gitea Authors. All rights reserved.
 | 
				
			||||||
 | 
					// SPDX-License-Identifier: MIT
 | 
				
			||||||
 | 
					package common
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"testing"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/stretchr/testify/assert"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestCleanValue(t *testing.T) {
 | 
				
			||||||
 | 
						tests := []struct {
 | 
				
			||||||
 | 
							param  string
 | 
				
			||||||
 | 
							expect string
 | 
				
			||||||
 | 
						}{
 | 
				
			||||||
 | 
							// Github behavior test cases
 | 
				
			||||||
 | 
							{"", ""},
 | 
				
			||||||
 | 
							{"test(0)", "test0"},
 | 
				
			||||||
 | 
							{"test!1", "test1"},
 | 
				
			||||||
 | 
							{"test:2", "test2"},
 | 
				
			||||||
 | 
							{"test*3", "test3"},
 | 
				
			||||||
 | 
							{"test!4", "test4"},
 | 
				
			||||||
 | 
							{"test:5", "test5"},
 | 
				
			||||||
 | 
							{"test*6", "test6"},
 | 
				
			||||||
 | 
							{"test:6 a", "test6-a"},
 | 
				
			||||||
 | 
							{"test:6 !b", "test6-b"},
 | 
				
			||||||
 | 
							{"test:ad # df", "testad--df"},
 | 
				
			||||||
 | 
							{"test:ad #23 df 2*/*", "testad-23-df-2"},
 | 
				
			||||||
 | 
							{"test:ad 23 df 2*/*", "testad-23-df-2"},
 | 
				
			||||||
 | 
							{"test:ad # 23 df 2*/*", "testad--23-df-2"},
 | 
				
			||||||
 | 
							{"Anchors in Markdown", "anchors-in-markdown"},
 | 
				
			||||||
 | 
							{"a_b_c", "a_b_c"},
 | 
				
			||||||
 | 
							{"a-b-c", "a-b-c"},
 | 
				
			||||||
 | 
							{"a-b-c----", "a-b-c----"},
 | 
				
			||||||
 | 
							{"test:6a", "test6a"},
 | 
				
			||||||
 | 
							{"test:a6", "testa6"},
 | 
				
			||||||
 | 
							{"tes a a   a  a", "tes-a-a---a--a"},
 | 
				
			||||||
 | 
							{"  tes a a   a  a  ", "tes-a-a---a--a"},
 | 
				
			||||||
 | 
							{"Header with \"double quotes\"", "header-with-double-quotes"},
 | 
				
			||||||
 | 
							{"Placeholder to force scrolling on link's click", "placeholder-to-force-scrolling-on-links-click"},
 | 
				
			||||||
 | 
							{"tes()", "tes"},
 | 
				
			||||||
 | 
							{"tes(0)", "tes0"},
 | 
				
			||||||
 | 
							{"tes{0}", "tes0"},
 | 
				
			||||||
 | 
							{"tes[0]", "tes0"},
 | 
				
			||||||
 | 
							{"test【0】", "test0"},
 | 
				
			||||||
 | 
							{"tes…@a", "tesa"},
 | 
				
			||||||
 | 
							{"tes¥& a", "tes-a"},
 | 
				
			||||||
 | 
							{"tes= a", "tes-a"},
 | 
				
			||||||
 | 
							{"tes|a", "tesa"},
 | 
				
			||||||
 | 
							{"tes\\a", "tesa"},
 | 
				
			||||||
 | 
							{"tes/a", "tesa"},
 | 
				
			||||||
 | 
							{"a啊啊b", "a啊啊b"},
 | 
				
			||||||
 | 
							{"c🤔️🤔️d", "cd"},
 | 
				
			||||||
 | 
							{"a⚡a", "aa"},
 | 
				
			||||||
 | 
							{"e.~f", "ef"},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						for _, test := range tests {
 | 
				
			||||||
 | 
							assert.Equal(t, []byte(test.expect), CleanValue([]byte(test.param)), test.param)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
		Loading…
	
		Reference in New Issue