package main import ( "fmt" "regexp" "strings" ) var ( inlineCodeRe = regexp.MustCompile("`[^`]+`") angleLinkRe = regexp.MustCompile(`]+>`) linkURLRe = regexp.MustCompile(`\[[^\]]*\]\(([^)]+)\)`) placeholderRe = regexp.MustCompile(`__OC_I18N_\d+__`) ) func maskMarkdown(text string, nextPlaceholder func() string, placeholders *[]string, mapping map[string]string) string { masked := maskMatches(text, inlineCodeRe, nextPlaceholder, placeholders, mapping) masked = maskMatches(masked, angleLinkRe, nextPlaceholder, placeholders, mapping) masked = maskLinkURLs(masked, nextPlaceholder, placeholders, mapping) return masked } func maskMatches(text string, re *regexp.Regexp, nextPlaceholder func() string, placeholders *[]string, mapping map[string]string) string { matches := re.FindAllStringIndex(text, -1) if len(matches) == 0 { return text } var out strings.Builder pos := 0 for _, span := range matches { start, end := span[0], span[1] if start < pos { continue } out.WriteString(text[pos:start]) placeholder := nextPlaceholder() mapping[placeholder] = text[start:end] *placeholders = append(*placeholders, placeholder) out.WriteString(placeholder) pos = end } out.WriteString(text[pos:]) return out.String() } func maskLinkURLs(text string, nextPlaceholder func() string, placeholders *[]string, mapping map[string]string) string { matches := linkURLRe.FindAllStringSubmatchIndex(text, -1) if len(matches) == 0 { return text } var out strings.Builder pos := 0 for _, span := range matches { fullStart := span[0] urlStart, urlEnd := span[2], span[3] if urlStart < 0 || urlEnd < 0 { continue } if fullStart < pos { continue } out.WriteString(text[pos:urlStart]) placeholder := nextPlaceholder() mapping[placeholder] = text[urlStart:urlEnd] *placeholders = append(*placeholders, placeholder) out.WriteString(placeholder) pos = urlEnd } out.WriteString(text[pos:]) return out.String() } func unmaskMarkdown(text string, placeholders []string, mapping map[string]string) string { out := text for _, placeholder := range placeholders { original := mapping[placeholder] out = strings.ReplaceAll(out, placeholder, original) } return out } func validatePlaceholders(text string, placeholders []string) error { for _, placeholder := range placeholders { if !strings.Contains(text, placeholder) { return fmt.Errorf("placeholder missing: %s", placeholder) } } return nil }