package tool
import (
"database/sql"
"html"
"log"
"regexp"
"strconv"
"strings"
"github.com/dlclark/regexp2"
)
type namumark struct {
db *sql.DB
db_set map[string]string
data map[string]string
render_data string
render_data_js string
temp_data map[string]string
temp_data_raw map[string]string
temp_data_count int
backlink [][]string
link_count int
}
func Namumark_new(db *sql.DB, db_set map[string]string, data map[string]string) *namumark {
data_string := data["data"]
data_string = html.EscapeString(data_string)
data_string = strings.Replace(data_string, "\r", "", -1)
data_string = "\n" + data_string + "\n"
return &namumark{
db,
db_set,
data,
data_string,
"",
map[string]string{},
map[string]string{},
0,
[][]string{},
0,
}
}
func (class *namumark) func_temp_save(data string, data_raw string) string {
name := ""
class.temp_data[name] = data
class.temp_data_raw[name] = data_raw
class.temp_data_count += 1
return name
}
func (class namumark) func_temp_restore(data string, to_raw bool) string {
string_data := data
if to_raw {
for k, v := range class.temp_data_raw {
string_data = strings.Replace(string_data, k, v, 1)
}
} else {
for k, v := range class.temp_data {
string_data = strings.Replace(string_data, k, v, 1)
}
}
return string_data
}
func (class *namumark) render_text() {
string_data := class.render_data
r := regexp2.MustCompile(`'''((?:(?!''').)+)'''`, 0)
for {
if m, _ := r.FindStringMatch(string_data); m != nil {
gps := m.Groups()
m_string := m.String()
temp_name := class.func_temp_save(""+gps[1].Captures[0].String()+"", m_string)
string_data = strings.Replace(string_data, m_string, temp_name, 1)
} else {
break
}
}
r = regexp2.MustCompile(`''((?:(?!'').)+)''`, 0)
for {
if m, _ := r.FindStringMatch(string_data); m != nil {
gps := m.Groups()
m_string := m.String()
temp_name := class.func_temp_save(""+gps[1].Captures[0].String()+"", m_string)
string_data = strings.Replace(string_data, m_string, temp_name, 1)
} else {
break
}
}
r = regexp2.MustCompile(`__((?:(?!__).)+)__`, 0)
for {
if m, _ := r.FindStringMatch(string_data); m != nil {
gps := m.Groups()
m_string := m.String()
temp_name := class.func_temp_save(""+gps[1].Captures[0].String()+"", m_string)
string_data = strings.Replace(string_data, m_string, temp_name, 1)
} else {
break
}
}
r_list := []string{`\^\^\^((?:(?!\^\^\^).)+)\^\^\^`, `\^\^((?:(?!\^\^).)+)\^\^`}
for for_a := 0; for_a < len(r_list); for_a++ {
r = regexp2.MustCompile(r_list[for_a], 0)
for {
if m, _ := r.FindStringMatch(string_data); m != nil {
gps := m.Groups()
m_string := m.String()
temp_name := class.func_temp_save(""+gps[1].Captures[0].String()+"", m_string)
string_data = strings.Replace(string_data, m_string, temp_name, 1)
} else {
break
}
}
}
r_list = []string{`,,,((?:(?!,,,).)+),,,`, `,,((?:(?!,,).)+),,`}
for for_a := 0; for_a < len(r_list); for_a++ {
r = regexp2.MustCompile(r_list[for_a], 0)
for {
if m, _ := r.FindStringMatch(string_data); m != nil {
gps := m.Groups()
m_string := m.String()
temp_name := class.func_temp_save(""+gps[1].Captures[0].String()+"", m_string)
string_data = strings.Replace(string_data, m_string, temp_name, 1)
} else {
break
}
}
}
r_list = []string{`--((?:(?!--).)+)--`, `~~((?:(?!~~).)+)~~`}
for for_a := 0; for_a < len(r_list); for_a++ {
r = regexp2.MustCompile(r_list[for_a], 0)
for {
if m, _ := r.FindStringMatch(string_data); m != nil {
gps := m.Groups()
m_string := m.String()
temp_name := class.func_temp_save(""+gps[1].Captures[0].String()+"", m_string)
string_data = strings.Replace(string_data, m_string, temp_name, 1)
} else {
break
}
}
}
class.render_data = string_data
}
func (class *namumark) render_last() {
string_data := class.render_data
string_data = class.func_temp_restore(string_data, false)
r := regexp.MustCompile(`(\n| )+$`)
string_data = r.ReplaceAllString(string_data, "")
r = regexp.MustCompile(`^(\n| )+`)
string_data = r.ReplaceAllString(string_data, "")
r = regexp.MustCompile(`\n?`)
string_data = r.ReplaceAllString(string_data, "")
r = regexp.MustCompile(`\n?`)
string_data = r.ReplaceAllString(string_data, "")
string_data = strings.Replace(string_data, "\n", "
", -1)
class.render_data = string_data
class.render_data_js += "opennamu_do_toc();"
}
func (class *namumark) render_heading() {
string_data := class.render_data
r := regexp.MustCompile(`\n(?:(={1,6})(#?) ?([^\n]+))\n`)
string_data = r.ReplaceAllStringFunc(string_data, func(m string) string {
match := r.FindStringSubmatch(m)
r = regexp.MustCompile(` ?(#?={1,6}[^=]*)$`)
heading_data := r.ReplaceAllString(match[3], "")
heading_len := strconv.Itoa(len(match[1]))
heading_render := "" + heading_data + ""
temp_name := class.func_temp_save(heading_render, match[0])
return temp_name
})
class.render_data = string_data
}
func (class namumark) main() map[string]interface{} {
class.render_text()
class.render_heading()
class.render_last()
log.Default().Println(class.render_data)
end_data := make(map[string]interface{})
end_data["data"] = class.render_data
end_data["js_data"] = class.render_data_js
end_data["backlink"] = class.backlink
end_data["link_count"] = class.link_count
return end_data
}