package markup import ( "bytes" "database/sql" "net/url" "regexp" "strconv" "strings" "opennamu/route/tool" "github.com/yuin/goldmark" "github.com/yuin/goldmark/extension" "github.com/yuin/goldmark/renderer/html" ) func Markdown(db *sql.DB, data map[string]string) map[string]any { backlink := map[string]map[string]string{} link_count := 0 raw_input := data["data"] r := regexp.MustCompile(`\[\]\(([^\(\)]+)\)`) raw_input = r.ReplaceAllStringFunc(raw_input, func(m string) string { match := r.FindStringSubmatch(m) return "[" + match[1] + "](" + match[1] + ")" }) r = regexp.MustCompile(`\[([^\[\]]+)\]\(\)`) raw_input = r.ReplaceAllStringFunc(raw_input, func(m string) string { match := r.FindStringSubmatch(m) return "[" + match[1] + "](" + match[1] + ")" }) input := []byte(raw_input) markdown := goldmark.New( goldmark.WithExtensions( extension.Strikethrough, extension.Table, ), goldmark.WithRendererOptions( html.WithHardWraps(), ), ) var buf bytes.Buffer if err := markdown.Convert(input, &buf); err != nil { panic(err) } string_data := buf.String() code_stack := []int{} code_stack_idx := 0 code_stack_end := map[string]string{} r = regexp.MustCompile(`(]*>|<\/code>)`) for idx := r.FindStringIndex(string_data); len(idx) != 0; idx = r.FindStringIndex(string_data) { if string_data[idx[0]:idx[0] + 5] == "" + string_data[idx[1]:] } else { if len(code_stack) == 0 { string_data = strings.Replace(string_data, "", "</code>", 1) continue } string_data = strings.Replace(string_data, "<0001>", "", 1) code_stack_idx_str := strconv.Itoa(code_stack_idx) code_stack_end["code_" + code_stack_idx_str] = string_data[code_stack[0]:idx[1]] code_stack_idx++ string_data = string_data[:code_stack[0]] + "" + string_data[idx[1]:] } } // p := bluemonday.UGCPolicy() // string_data := p.Sanitize(string_data) r = regexp.MustCompile(`\[([^\[\]]+)\]\(([^\(\)]*)\)`) string_data = r.ReplaceAllStringFunc(string_data, func(m string) string { match := r.FindStringSubmatch(m) link := match[2] if link == "" { link = match[1] } return "" + match[1] + "" }) r = regexp.MustCompile(``) string_data = r.ReplaceAllStringFunc(string_data, func(m string) string { m = strings.Replace(m, "<", "", 1) m = strings.Replace(m, ">", "", 1) return code_stack_end[m] }) r = regexp.MustCompile(`