package tool import ( "bytes" "database/sql" "log" "net/url" "regexp" "strconv" "strings" "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]interface{} { 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[1]] == "" { code_stack = []int{idx[0], idx[1]} string_data = strings.Replace(string_data, "", "<0001>", 1) } else { 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(`