markdown.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. package tool
  2. import (
  3. "bytes"
  4. "database/sql"
  5. "regexp"
  6. "github.com/yuin/goldmark"
  7. "github.com/yuin/goldmark/extension"
  8. "github.com/yuin/goldmark/renderer/html"
  9. )
  10. func Markdown(db *sql.DB, db_set map[string]string, data map[string]string) map[string]interface{} {
  11. input := []byte(data["data"])
  12. backlink := map[string]map[string]string{}
  13. link_count := 0
  14. markdown := goldmark.New(
  15. goldmark.WithExtensions(extension.Strikethrough, extension.Table),
  16. goldmark.WithRendererOptions(html.WithHardWraps()),
  17. )
  18. var buf bytes.Buffer
  19. if err := markdown.Convert(input, &buf); err != nil {
  20. panic(err)
  21. }
  22. string_data := buf.String()
  23. r := regexp.MustCompile(`\[([^\[\]]+)\]\(([^\(\)]*)\)`)
  24. string_data = r.ReplaceAllStringFunc(string_data, func(m string) string {
  25. match := r.FindStringSubmatch(m)
  26. return "<a href=\"" + match[2] + "\">" + match[1] + "</a>"
  27. })
  28. // p := bluemonday.UGCPolicy()
  29. // result := p.Sanitize(string_data)
  30. r = regexp.MustCompile(`<a href="([^"]+)"`)
  31. result := r.ReplaceAllStringFunc(string_data, func(m string) string {
  32. match := r.FindStringSubmatch(m)
  33. m1, _ := regexp.MatchString(`^https?:\/\/`, match[1])
  34. if m1 {
  35. return "<a href=\"" + match[1] + "\" class=\"opennamu_link_out\" target=\"_blank\""
  36. } else {
  37. if _, ok := backlink[match[1]]; !ok {
  38. backlink[match[1]] = map[string]string{}
  39. }
  40. var exist string
  41. stmt, err := db.Prepare(DB_change(db_set, "select title from data where title = ?"))
  42. if err != nil {
  43. exist = ""
  44. }
  45. defer stmt.Close()
  46. err = stmt.QueryRow(match[1]).Scan(&exist)
  47. if err != nil {
  48. exist = ""
  49. }
  50. backlink[match[1]][""] = ""
  51. link_count += 1
  52. class := ""
  53. if exist == "" {
  54. class = "opennamu_not_exist_link"
  55. }
  56. return "<a href=\"/w/" + match[1] + "\" class=\"" + class + "\""
  57. }
  58. })
  59. end_backlink := [][]string{}
  60. for k1, v1 := range backlink {
  61. for k2, v2 := range v1 {
  62. end_backlink = append(end_backlink, []string{
  63. data["doc_name"],
  64. k1,
  65. k2,
  66. v2,
  67. })
  68. }
  69. }
  70. end_data := make(map[string]interface{})
  71. end_data["data"] = result
  72. end_data["js_data"] = ""
  73. end_data["backlink"] = end_backlink
  74. end_data["link_count"] = link_count
  75. return end_data
  76. }