mirror of
				https://codeberg.org/forgejo/forgejo.git
				synced 2025-11-04 00:11:04 +00:00 
			
		
		
		
	[BUG] Don't color dot literal color names
- Colordots are generated for colors in inline code, such as `red`, `rgb(255, 0, 124)`, `#ffaabb` and `hsl(124, 52%, 50%)`. However this shouldn't be doon for literal color names as these can be too common assiocated with non-color related stuff _and matches the behavior of some other forge_. - Move the regexes from bluemonday to Forgejo and do the checking ourselves. - Adds unit tests. - Resolves https://codeberg.org/Codeberg/Community/issues/1510
This commit is contained in:
		
					parent
					
						
							
								03df59ec95
							
						
					
				
			
			
				commit
				
					
						e428231b38
					
				
			
		
					 3 changed files with 70 additions and 2 deletions
				
			
		
							
								
								
									
										19
									
								
								modules/markup/markdown/color_util.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								modules/markup/markdown/color_util.go
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,19 @@
 | 
				
			||||||
 | 
					// Copyright 2024 The Forgejo Authors. All rights reserved.
 | 
				
			||||||
 | 
					// SPDX-License-Identifier: MIT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package markdown
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import "regexp"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					var (
 | 
				
			||||||
 | 
						hexRGB = regexp.MustCompile(`^#([0-9a-f]{3}|[0-9a-f]{6}|[0-9a-f]{8})$`)
 | 
				
			||||||
 | 
						hsl    = regexp.MustCompile(`^hsl\([ ]*([012]?[0-9]{1,2}|3[0-5][0-9]|360),[ ]*([0-9]{0,2}|100)\%,[ ]*([0-9]{0,2}|100)\%\)$`)
 | 
				
			||||||
 | 
						hsla   = regexp.MustCompile(`^hsla\(([ ]*[012]?[0-9]{1,2}|3[0-5][0-9]|360),[ ]*([0-9]{0,2}|100)\%,[ ]*([0-9]{0,2}|100)\%,[ ]*(1|1\.0|0|(0\.[0-9]+))\)$`)
 | 
				
			||||||
 | 
						rgb    = regexp.MustCompile(`^rgb\(([ ]*((([0-9]{1,2}|100)\%)|(([01]?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]))),){2}([ ]*((([0-9]{1,2}|100)\%)|(([01]?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]))))\)$`)
 | 
				
			||||||
 | 
						rgba   = regexp.MustCompile(`^rgba\(([ ]*((([0-9]{1,2}|100)\%)|(([01]?[0-9]{1,2})|(2[0-4][0-9])|(25[0-5]))),){3}[ ]*(1(\.0)?|0|(0\.[0-9]+))\)$`)
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// matchColor return if color is in the form of hex RGB, HSL(A) or RGB(A).
 | 
				
			||||||
 | 
					func matchColor(color string) bool {
 | 
				
			||||||
 | 
						return hexRGB.MatchString(color) || rgb.MatchString(color) || rgba.MatchString(color) || hsl.MatchString(color) || hsla.MatchString(color)
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										50
									
								
								modules/markup/markdown/color_util_test.go
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								modules/markup/markdown/color_util_test.go
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,50 @@
 | 
				
			||||||
 | 
					// Copyright 2024 The Forgejo Authors. All rights reserved.
 | 
				
			||||||
 | 
					// SPDX-License-Identifier: MIT
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					package markdown
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import (
 | 
				
			||||||
 | 
						"testing"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						"github.com/stretchr/testify/assert"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					func TestMatchColor(t *testing.T) {
 | 
				
			||||||
 | 
						testCases := []struct {
 | 
				
			||||||
 | 
							input    string
 | 
				
			||||||
 | 
							expected bool
 | 
				
			||||||
 | 
						}{
 | 
				
			||||||
 | 
							{"#ddeeffa0", true},
 | 
				
			||||||
 | 
							{"#ddeefe", true},
 | 
				
			||||||
 | 
							{"#abcdef", true},
 | 
				
			||||||
 | 
							{"#abcdeg", false},
 | 
				
			||||||
 | 
							{"#abcdefg0", false},
 | 
				
			||||||
 | 
							{"black", false},
 | 
				
			||||||
 | 
							{"violet", false},
 | 
				
			||||||
 | 
							{"rgb(255, 255, 255)", true},
 | 
				
			||||||
 | 
							{"rgb(0, 0, 0)", true},
 | 
				
			||||||
 | 
							{"rgb(256, 0, 0)", false},
 | 
				
			||||||
 | 
							{"rgb(0, 256, 0)", false},
 | 
				
			||||||
 | 
							{"rgb(0, 0, 256)", false},
 | 
				
			||||||
 | 
							{"rgb(0, 0, 0, 1)", false},
 | 
				
			||||||
 | 
							{"rgba(0, 0, 0)", false},
 | 
				
			||||||
 | 
							{"rgba(0, 255, 0, 1)", true},
 | 
				
			||||||
 | 
							{"rgba(32, 255, 12, 0.55)", true},
 | 
				
			||||||
 | 
							{"rgba(32, 256, 12, 0.55)", false},
 | 
				
			||||||
 | 
							{"hsl(0, 0%, 0%)", true},
 | 
				
			||||||
 | 
							{"hsl(360, 100%, 100%)", true},
 | 
				
			||||||
 | 
							{"hsl(361, 100%, 50%)", false},
 | 
				
			||||||
 | 
							{"hsl(360, 101%, 50%)", false},
 | 
				
			||||||
 | 
							{"hsl(360, 100%, 101%)", false},
 | 
				
			||||||
 | 
							{"hsl(0, 0%, 0%, 0)", false},
 | 
				
			||||||
 | 
							{"hsla(0, 0%, 0%)", false},
 | 
				
			||||||
 | 
							{"hsla(0, 0%, 0%, 0)", true},
 | 
				
			||||||
 | 
							{"hsla(0, 0%, 0%, 1)", true},
 | 
				
			||||||
 | 
							{"hsla(0, 0%, 0%, 0.5)", true},
 | 
				
			||||||
 | 
							{"hsla(0, 0%, 0%, 1.5)", false},
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						for _, testCase := range testCases {
 | 
				
			||||||
 | 
							actual := matchColor(testCase.input)
 | 
				
			||||||
 | 
							assert.Equal(t, testCase.expected, actual)
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -16,7 +16,6 @@ import (
 | 
				
			||||||
	"code.gitea.io/gitea/modules/setting"
 | 
						"code.gitea.io/gitea/modules/setting"
 | 
				
			||||||
	giteautil "code.gitea.io/gitea/modules/util"
 | 
						giteautil "code.gitea.io/gitea/modules/util"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	"github.com/microcosm-cc/bluemonday/css"
 | 
					 | 
				
			||||||
	"github.com/yuin/goldmark/ast"
 | 
						"github.com/yuin/goldmark/ast"
 | 
				
			||||||
	east "github.com/yuin/goldmark/extension/ast"
 | 
						east "github.com/yuin/goldmark/extension/ast"
 | 
				
			||||||
	"github.com/yuin/goldmark/parser"
 | 
						"github.com/yuin/goldmark/parser"
 | 
				
			||||||
| 
						 | 
					@ -199,7 +198,7 @@ func (g *ASTTransformer) Transform(node *ast.Document, reader text.Reader, pc pa
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		case *ast.CodeSpan:
 | 
							case *ast.CodeSpan:
 | 
				
			||||||
			colorContent := n.Text(reader.Source())
 | 
								colorContent := n.Text(reader.Source())
 | 
				
			||||||
			if css.ColorHandler(strings.ToLower(string(colorContent))) {
 | 
								if matchColor(strings.ToLower(string(colorContent))) {
 | 
				
			||||||
				v.AppendChild(v, NewColorPreview(colorContent))
 | 
									v.AppendChild(v, NewColorPreview(colorContent))
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue