namumark.go 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. package tool
  2. import (
  3. "database/sql"
  4. "html"
  5. "log"
  6. "regexp"
  7. "strconv"
  8. "strings"
  9. "github.com/dlclark/regexp2"
  10. )
  11. type namumark struct {
  12. db *sql.DB
  13. data map[string]string
  14. render_data string
  15. render_data_js string
  16. temp_data map[string]string
  17. temp_data_raw map[string]string
  18. temp_data_count int
  19. backlink [][]string
  20. link_count int
  21. }
  22. func Namumark_new(db *sql.DB, data map[string]string) *namumark {
  23. data_string := data["data"]
  24. data_string = html.EscapeString(data_string)
  25. data_string = strings.Replace(data_string, "\r", "", -1)
  26. data_string = "\n" + data_string + "\n"
  27. return &namumark{
  28. db,
  29. data,
  30. data_string,
  31. "",
  32. map[string]string{},
  33. map[string]string{},
  34. 0,
  35. [][]string{},
  36. 0,
  37. }
  38. }
  39. func (class *namumark) func_temp_save(data string, data_raw string) string {
  40. name := "<temp_save_" + strconv.Itoa(class.temp_data_count) + ">"
  41. class.temp_data[name] = data
  42. class.temp_data_raw[name] = data_raw
  43. class.temp_data_count += 1
  44. return name
  45. }
  46. func (class namumark) func_temp_restore(data string, to_raw bool) string {
  47. string_data := data
  48. if to_raw {
  49. for k, v := range class.temp_data_raw {
  50. string_data = strings.Replace(string_data, k, v, 1)
  51. }
  52. } else {
  53. for k, v := range class.temp_data {
  54. string_data = strings.Replace(string_data, k, v, 1)
  55. }
  56. }
  57. return string_data
  58. }
  59. func (class *namumark) render_text() {
  60. string_data := class.render_data
  61. r := regexp2.MustCompile(`&#39;&#39;&#39;((?:(?!&#39;&#39;&#39;).)+)&#39;&#39;&#39;`, 0)
  62. for {
  63. if m, _ := r.FindStringMatch(string_data); m != nil {
  64. gps := m.Groups()
  65. m_string := m.String()
  66. temp_name := class.func_temp_save("<b>"+gps[1].Captures[0].String()+"</b>", m_string)
  67. string_data = strings.Replace(string_data, m_string, temp_name, 1)
  68. } else {
  69. break
  70. }
  71. }
  72. r = regexp2.MustCompile(`&#39;&#39;((?:(?!&#39;&#39;).)+)&#39;&#39;`, 0)
  73. for {
  74. if m, _ := r.FindStringMatch(string_data); m != nil {
  75. gps := m.Groups()
  76. m_string := m.String()
  77. temp_name := class.func_temp_save("<i>"+gps[1].Captures[0].String()+"</i>", m_string)
  78. string_data = strings.Replace(string_data, m_string, temp_name, 1)
  79. } else {
  80. break
  81. }
  82. }
  83. r = regexp2.MustCompile(`__((?:(?!__).)+)__`, 0)
  84. for {
  85. if m, _ := r.FindStringMatch(string_data); m != nil {
  86. gps := m.Groups()
  87. m_string := m.String()
  88. temp_name := class.func_temp_save("<u>"+gps[1].Captures[0].String()+"</u>", m_string)
  89. string_data = strings.Replace(string_data, m_string, temp_name, 1)
  90. } else {
  91. break
  92. }
  93. }
  94. r_list := []string{`\^\^\^((?:(?!\^\^\^).)+)\^\^\^`, `\^\^((?:(?!\^\^).)+)\^\^`}
  95. for for_a := 0; for_a < len(r_list); for_a++ {
  96. r = regexp2.MustCompile(r_list[for_a], 0)
  97. for {
  98. if m, _ := r.FindStringMatch(string_data); m != nil {
  99. gps := m.Groups()
  100. m_string := m.String()
  101. temp_name := class.func_temp_save("<sup>"+gps[1].Captures[0].String()+"</sup>", m_string)
  102. string_data = strings.Replace(string_data, m_string, temp_name, 1)
  103. } else {
  104. break
  105. }
  106. }
  107. }
  108. r_list = []string{`,,,((?:(?!,,,).)+),,,`, `,,((?:(?!,,).)+),,`}
  109. for for_a := 0; for_a < len(r_list); for_a++ {
  110. r = regexp2.MustCompile(r_list[for_a], 0)
  111. for {
  112. if m, _ := r.FindStringMatch(string_data); m != nil {
  113. gps := m.Groups()
  114. m_string := m.String()
  115. temp_name := class.func_temp_save("<sub>"+gps[1].Captures[0].String()+"</sub>", m_string)
  116. string_data = strings.Replace(string_data, m_string, temp_name, 1)
  117. } else {
  118. break
  119. }
  120. }
  121. }
  122. r_list = []string{`--((?:(?!--).)+)--`, `~~((?:(?!~~).)+)~~`}
  123. for for_a := 0; for_a < len(r_list); for_a++ {
  124. r = regexp2.MustCompile(r_list[for_a], 0)
  125. for {
  126. if m, _ := r.FindStringMatch(string_data); m != nil {
  127. gps := m.Groups()
  128. m_string := m.String()
  129. temp_name := class.func_temp_save("<s>"+gps[1].Captures[0].String()+"</s>", m_string)
  130. string_data = strings.Replace(string_data, m_string, temp_name, 1)
  131. } else {
  132. break
  133. }
  134. }
  135. }
  136. class.render_data = string_data
  137. }
  138. func (class *namumark) render_last() {
  139. string_data := class.render_data
  140. string_data = class.func_temp_restore(string_data, false)
  141. r := regexp.MustCompile(`(\n| )+$`)
  142. string_data = r.ReplaceAllString(string_data, "")
  143. r = regexp.MustCompile(`^(\n| )+`)
  144. string_data = r.ReplaceAllString(string_data, "")
  145. r = regexp.MustCompile(`\n?<front_br>`)
  146. string_data = r.ReplaceAllString(string_data, "")
  147. r = regexp.MustCompile(`<back_br>\n?`)
  148. string_data = r.ReplaceAllString(string_data, "")
  149. string_data = strings.Replace(string_data, "\n", "<br>", -1)
  150. class.render_data = string_data
  151. class.render_data_js += "opennamu_do_toc();"
  152. }
  153. func (class *namumark) render_heading() {
  154. string_data := class.render_data
  155. r := regexp.MustCompile(`\n(?:(={1,6})(#?) ?([^\n]+))\n`)
  156. string_data = r.ReplaceAllStringFunc(string_data, func(m string) string {
  157. match := r.FindStringSubmatch(m)
  158. r = regexp.MustCompile(` ?(#?={1,6}[^=]*)$`)
  159. heading_data := r.ReplaceAllString(match[3], "")
  160. heading_len := strconv.Itoa(len(match[1]))
  161. heading_render := "<h" + heading_len + ">" + heading_data + "</h" + heading_len + ">"
  162. temp_name := class.func_temp_save(heading_render, match[0])
  163. return temp_name
  164. })
  165. class.render_data = string_data
  166. }
  167. func (class namumark) main() map[string]interface{} {
  168. class.render_text()
  169. class.render_heading()
  170. class.render_last()
  171. log.Default().Println(class.render_data)
  172. end_data := make(map[string]interface{})
  173. end_data["data"] = class.render_data
  174. end_data["js_data"] = class.render_data_js
  175. end_data["backlink"] = class.backlink
  176. end_data["link_count"] = class.link_count
  177. return end_data
  178. }