namumark.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package tool
  2. import (
  3. "database/sql"
  4. "html"
  5. "strconv"
  6. "strings"
  7. "github.com/dlclark/regexp2"
  8. )
  9. type namumark struct {
  10. db *sql.DB
  11. db_set map[string]string
  12. data map[string]string
  13. render_data string
  14. render_data_js string
  15. temp_data map[string]string
  16. temp_data_count int
  17. backlink [][]string
  18. link_count int
  19. }
  20. func Namumark_new(db *sql.DB, db_set map[string]string, data map[string]string) *namumark {
  21. return &namumark{
  22. db,
  23. db_set,
  24. data,
  25. html.EscapeString(data["data"]),
  26. "",
  27. map[string]string{},
  28. 0,
  29. [][]string{},
  30. 0,
  31. }
  32. }
  33. func (class *namumark) func_temp_save(data string) string {
  34. name := "<temp_save_" + strconv.Itoa(class.temp_data_count) + ">"
  35. class.temp_data[name] = data
  36. class.temp_data_count += 1
  37. return name
  38. }
  39. func (class namumark) func_temp_restore(data string) string {
  40. string_data := data
  41. for k, v := range class.temp_data {
  42. string_data = strings.Replace(string_data, k, v, 1)
  43. }
  44. return string_data
  45. }
  46. func (class *namumark) render_text() {
  47. string_data := class.render_data
  48. r := regexp2.MustCompile(`&#39;&#39;&#39;((?:(?!&#39;&#39;&#39;).)+)&#39;&#39;&#39;`, 0)
  49. for {
  50. if m, _ := r.FindStringMatch(string_data); m != nil {
  51. gps := m.Groups()
  52. temp_name := class.func_temp_save("<b>" + gps[1].Captures[0].String() + "</b>")
  53. string_data = strings.Replace(string_data, m.String(), temp_name, 1)
  54. } else {
  55. break
  56. }
  57. }
  58. class.render_data = string_data
  59. }
  60. func (class *namumark) render_last() {
  61. string_data := class.render_data
  62. string_data = class.func_temp_restore(string_data)
  63. class.render_data = string_data
  64. }
  65. func (class namumark) main() map[string]interface{} {
  66. class.render_text()
  67. class.render_last()
  68. end_data := make(map[string]interface{})
  69. end_data["data"] = class.render_data
  70. end_data["js_data"] = class.render_data_js
  71. end_data["backlink"] = class.backlink
  72. end_data["link_count"] = class.link_count
  73. return end_data
  74. }