diff --git a/kernel/model/export.go b/kernel/model/export.go index d84347b1c..ff6c4d161 100644 --- a/kernel/model/export.go +++ b/kernel/model/export.go @@ -1933,7 +1933,8 @@ func processKaTexMacros(n *ast.Node) { mathContent = escapeKaTexSupportedFunctions(mathContent) usedMacros := extractUsedMacros(mathContent, &keys) for _, usedMacro := range usedMacros { - expanded := resolveKaTexMacro(usedMacro, ¯os, &keys) + depth := 1 // Limit KaTex macro maximum recursive parsing depth is 16 https://github.com/siyuan-note/siyuan/issues/10484 + expanded := resolveKaTexMacro(usedMacro, ¯os, &keys, &depth) expanded = unescapeKaTexSupportedFunctions(expanded) mathContent = strings.ReplaceAll(mathContent, usedMacro, expanded) } diff --git a/kernel/model/export_katex.go b/kernel/model/export_katex.go index 638dc63fe..a6ddc92a4 100644 --- a/kernel/model/export_katex.go +++ b/kernel/model/export_katex.go @@ -908,16 +908,20 @@ func init() { sort.Slice(katexSupportedFunctions, func(i, j int) bool { return len(katexSupportedFunctions[i]) > len(katexSupportedFunctions[j]) }) } -func resolveKaTexMacro(macroName string, macros *map[string]string, keys *[]string) string { +func resolveKaTexMacro(macroName string, macros *map[string]string, keys *[]string, depth *int) string { v := (*macros)[macroName] sort.Slice(*keys, func(i, j int) bool { return len((*keys)[i]) > len((*keys)[j]) }) + *depth++ for _, k := range *keys { escaped := escapeKaTexSupportedFunctions(v) if strings.Contains(escaped, k) { - escaped = strings.ReplaceAll(escaped, k, resolveKaTexMacro(k, macros, keys)) + escaped = strings.ReplaceAll(escaped, k, resolveKaTexMacro(k, macros, keys, depth)) v = unescapeKaTexSupportedFunctions(escaped) (*macros)[macroName] = v } + if *depth > 16 { + return v + } } return v }