namumark.go 5.6 KB

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