mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-26 12:27:06 +00:00 
			
		
		
		
	Add RTL rendering support to Markdown (#24816)
Support RTL content in Markdown:  Example document: https://try.gitea.io/silverwind/symlink-test/src/branch/master/bidi-text.md Same on GitHub: https://github.com/silverwind/symlink-test/blob/master/bidi-text.md `dir=auto` enables a browser heuristic that sets the text direction automatically. It is the only way to get automatic text direction. Ref: https://codeberg.org/Codeberg/Community/issues/1021 --------- Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
This commit is contained in:
		@@ -630,7 +630,7 @@ func mentionProcessor(ctx *RenderContext, node *html.Node) {
 | 
			
		||||
		}
 | 
			
		||||
		mentionedUsername := mention[1:]
 | 
			
		||||
 | 
			
		||||
		if processorHelper.IsUsernameMentionable != nil && processorHelper.IsUsernameMentionable(ctx.Ctx, mentionedUsername) {
 | 
			
		||||
		if DefaultProcessorHelper.IsUsernameMentionable != nil && DefaultProcessorHelper.IsUsernameMentionable(ctx.Ctx, mentionedUsername) {
 | 
			
		||||
			replaceContent(node, loc.Start, loc.End, createLink(util.URLJoin(setting.AppURL, mentionedUsername), mention, "mention"))
 | 
			
		||||
			node = node.NextSibling.NextSibling
 | 
			
		||||
		} else {
 | 
			
		||||
 
 | 
			
		||||
@@ -47,6 +47,12 @@ func (g *ASTTransformer) Transform(node *ast.Document, reader text.Reader, pc pa
 | 
			
		||||
		tocMode = rc.TOC
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	applyElementDir := func(n ast.Node) {
 | 
			
		||||
		if markup.DefaultProcessorHelper.ElementDir != "" {
 | 
			
		||||
			n.SetAttributeString("dir", []byte(markup.DefaultProcessorHelper.ElementDir))
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	attentionMarkedBlockquotes := make(container.Set[*ast.Blockquote])
 | 
			
		||||
	_ = ast.Walk(node, func(n ast.Node, entering bool) (ast.WalkStatus, error) {
 | 
			
		||||
		if !entering {
 | 
			
		||||
@@ -69,6 +75,9 @@ func (g *ASTTransformer) Transform(node *ast.Document, reader text.Reader, pc pa
 | 
			
		||||
				header.ID = util.BytesToReadOnlyString(id.([]byte))
 | 
			
		||||
			}
 | 
			
		||||
			tocList = append(tocList, header)
 | 
			
		||||
			applyElementDir(v)
 | 
			
		||||
		case *ast.Paragraph:
 | 
			
		||||
			applyElementDir(v)
 | 
			
		||||
		case *ast.Image:
 | 
			
		||||
			// Images need two things:
 | 
			
		||||
			//
 | 
			
		||||
@@ -171,6 +180,7 @@ func (g *ASTTransformer) Transform(node *ast.Document, reader text.Reader, pc pa
 | 
			
		||||
					v.AppendChild(v, newChild)
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			applyElementDir(v)
 | 
			
		||||
		case *ast.Text:
 | 
			
		||||
			if v.SoftLineBreak() && !v.HardLineBreak() {
 | 
			
		||||
				renderMetas := pc.Get(renderMetasKey).(map[string]string)
 | 
			
		||||
 
 | 
			
		||||
@@ -30,14 +30,16 @@ const (
 | 
			
		||||
 | 
			
		||||
type ProcessorHelper struct {
 | 
			
		||||
	IsUsernameMentionable func(ctx context.Context, username string) bool
 | 
			
		||||
 | 
			
		||||
	ElementDir string // the direction of the elements, eg: "ltr", "rtl", "auto", default to no direction attribute
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var processorHelper ProcessorHelper
 | 
			
		||||
var DefaultProcessorHelper ProcessorHelper
 | 
			
		||||
 | 
			
		||||
// Init initialize regexps for markdown parsing
 | 
			
		||||
func Init(ph *ProcessorHelper) {
 | 
			
		||||
	if ph != nil {
 | 
			
		||||
		processorHelper = *ph
 | 
			
		||||
		DefaultProcessorHelper = *ph
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	NewSanitizer()
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user