view_list_recent_change.go 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202
  1. package route
  2. import (
  3. "database/sql"
  4. "html"
  5. "opennamu/route/tool"
  6. "regexp"
  7. "strconv"
  8. "strings"
  9. )
  10. var re_esc_a = regexp.MustCompile(`<a>\s*([^\r\n]*?)\s*</a>`)
  11. func Get_safe_send_data(data string) string {
  12. escaped_data := tool.HTML_escape(data)
  13. return re_esc_a.ReplaceAllStringFunc(escaped_data, func(match string) string {
  14. inner_esc := re_esc_a.FindStringSubmatch(match)[1]
  15. inner_text := strings.TrimSpace(html.UnescapeString(inner_esc))
  16. if inner_text == "" || strings.ContainsAny(inner_text, "<>") {
  17. return match
  18. }
  19. return `<a href="/w/` + tool.Url_parser(inner_text) + `">` + strings.TrimSpace(inner_esc) + `</a>`
  20. })
  21. }
  22. func Get_ui_history(db *sql.DB, config tool.Config, data_all [][]string) (string, string) {
  23. auth_name := tool.Get_user_auth(db, config.IP)
  24. auth_info := tool.Get_auth_group_info(db, auth_name)
  25. date_heading := ""
  26. data_html := ""
  27. data_select := ""
  28. for_count := 1
  29. for _, in_data := range data_all {
  30. for_count_str := strconv.Itoa(for_count)
  31. for_count += 1
  32. data_select = `<option value="` + for_count_str + `">` + for_count_str + `</option>` + data_select
  33. if in_data[6] != "" && in_data[1] == "" {
  34. if date_heading != "----" {
  35. data_html += "<h2>----</h2>"
  36. date_heading = "----"
  37. }
  38. data_html += tool.Get_list_ui("----", "", "", "")
  39. continue
  40. }
  41. doc_name := in_data[1]
  42. doc_name_url := tool.Url_parser(doc_name)
  43. rev_str := in_data[0]
  44. left := `<a href="/w/` + doc_name_url + `">` + tool.HTML_escape(doc_name) + `</a> `
  45. rev := ""
  46. if in_data[6] != "" {
  47. rev = `<span style="color: red;">r` + rev_str + `</span>`
  48. } else {
  49. rev = `r` + rev_str
  50. }
  51. rev_int := tool.Str_to_int(rev_str)
  52. if rev_int > 1 {
  53. before_rev := rev_int - 1
  54. before_rev_str := strconv.Itoa(before_rev)
  55. rev = `<a href="/diff/` + before_rev_str + `/` + rev_str + `/` + doc_name_url + `">` + rev + `</a>`
  56. }
  57. right := ""
  58. right += `<span id="opennamu_list_history_` + for_count_str + `_over">`
  59. right += `<a id="opennamu_list_history_` + for_count_str + `" href="javascript:void(0);">`
  60. right += `<span class="opennamu_svg opennamu_svg_tool">&nbsp;</span></a>`
  61. right += `<span class="opennamu_popup_footnote" id="opennamu_list_history_` + for_count_str + `_load" style="display: none;"></span>`
  62. right += `</span> | `
  63. right += rev + " | "
  64. diff_size := in_data[5]
  65. if diff_size == "0" {
  66. right += `<span style="color: gray;">` + diff_size + `</span>`
  67. } else if strings.Contains(diff_size, "+") {
  68. right += `<span style="color: green;">` + diff_size + `</span>`
  69. } else {
  70. right += `<span style="color: red;">` + diff_size + `</span>`
  71. }
  72. right += " | "
  73. right += in_data[7] + " | "
  74. edit_type := "edit"
  75. if in_data[8] != "" {
  76. edit_type = in_data[8]
  77. }
  78. right += tool.Get_language(db, edit_type, true) + " | "
  79. time_split := strings.Split(in_data[2], " ")
  80. if date_heading != time_split[0] {
  81. data_html += "<h2>" + time_split[0] + "</h2>"
  82. date_heading = time_split[0]
  83. }
  84. if len(time_split) > 1 {
  85. right += time_split[1]
  86. }
  87. right += `<span style="display: none;" id="opennamu_history_tool_` + for_count_str + `">`
  88. right += `<a href="/render/` + rev_str + `/` + doc_name_url + `">` + tool.Get_language(db, "view", true) + `</a>`
  89. right += ` | <a href="/raw_rev/` + rev_str + `/` + doc_name_url + `">` + tool.Get_language(db, "raw", true) + `</a>`
  90. right += ` | <a href="/revert/` + rev_str + `/` + doc_name_url + `">` + tool.Get_language(db, "revert", true) + ` (r` + rev_str + `)</a>`
  91. if rev_int > 1 {
  92. before_rev := rev_int - 1
  93. before_rev_str := strconv.Itoa(before_rev)
  94. right += ` | <a href="/revert/` + before_rev_str + `/` + doc_name_url + `">` + tool.Get_language(db, "revert", true) + ` (r` + before_rev_str + `)</a>`
  95. right += ` | <a href="/diff/` + before_rev_str + `/` + rev_str + `/` + doc_name_url + `">` + tool.Get_language(db, "compare", true) + `</a>`
  96. }
  97. right += ` | <a href="/history/` + doc_name_url + `">` + tool.Get_language(db, "history", true) + `</a>`
  98. if _, ok := auth_info["owner"]; ok {
  99. right += ` | <a href="/history_hidden/` + rev_str + `/` + doc_name_url + `">` + tool.Get_language(db, "hide", true) + `</a>`
  100. right += ` | <a href="/history_delete/` + rev_str + `/` + doc_name_url + `">` + tool.Get_language(db, "history_delete", true) + `</a>`
  101. right += ` | <a href="/history_send/` + rev_str + `/` + doc_name_url + `">` + tool.Get_language(db, "send_edit", true) + `</a>`
  102. } else if _, ok := auth_info["hidel"]; ok {
  103. right += ` | <a href="/history_hidden/` + rev_str + `/` + doc_name_url + `">` + tool.Get_language(db, "hide", true) + `</a>`
  104. }
  105. right += `</span>`
  106. bottom := ``
  107. if in_data[4] != "" {
  108. bottom = Get_safe_send_data(in_data[4])
  109. }
  110. data_html += tool.Get_list_ui(left, right, bottom, "")
  111. data_html += `<script>
  112. document.getElementById('opennamu_list_history_` + for_count_str + `').addEventListener("click", function() {{
  113. opennamu_do_footnote_popover('opennamu_list_history_` + for_count_str + `', '', 'opennamu_history_tool_` + for_count_str + `', 'open');
  114. }});
  115. document.addEventListener("click", function() {{
  116. opennamu_do_footnote_popover('opennamu_list_history_` + for_count_str + `', '', 'opennamu_history_tool_` + for_count_str + `', 'close');
  117. }});
  118. </script>`
  119. }
  120. return data_html, data_select
  121. }
  122. func View_list_recent_change(config tool.Config, set_type string, limit string, num string) string {
  123. db := tool.DB_connect()
  124. defer tool.DB_close(db)
  125. sub := ""
  126. if set_type == "" {
  127. set_type = "normal"
  128. } else {
  129. sub = "(" + tool.Get_language(db, set_type, true) + ")"
  130. }
  131. data_html := ""
  132. menu_option := []string{ "normal", "edit", "move", "delete", "revert", "r1", "edit_request", "user", "file", "category" }
  133. for _, option := range menu_option {
  134. label := tool.Get_language(db, option, true)
  135. data_html += `<a href="/recent_change/1/` + option + `">(` + label + `)</a> `
  136. }
  137. api_data := Api_list_recent_change(config, set_type, limit, num)
  138. api_data_list := api_data["data"].([][]string)
  139. history_ui, _ := Get_ui_history(db, config, api_data_list)
  140. data_html += history_ui
  141. data_html += tool.Get_page_control(
  142. db,
  143. tool.Str_to_int(num),
  144. len(api_data_list),
  145. tool.Str_to_int(limit),
  146. "/recent_change/{}/" + set_type,
  147. )
  148. out := tool.Get_template(
  149. db,
  150. config,
  151. tool.Get_language(db, "recent_change", true),
  152. data_html,
  153. []any{ sub },
  154. [][]any{},
  155. map[string]string{},
  156. )
  157. return out
  158. }