//MakeDat makes dat lines of 2ch from cache. func MakeDat(ca *thread.Cache, board, host string) []string { recs := ca.LoadRecords(record.Alive) dat := make([]string, len(recs)) table := mch.NewResTable(ca) i := 0 for _, datfile := range recs.Keys() { rec := recs[datfile] err := rec.Load() if err != nil { log.Println(err) continue } name := rec.GetBodyValue("name", "") if name == "" { name = "名無しさん" } if rec.GetBodyValue("pubkey", "") != "" { name += "◆" + rec.GetBodyValue("pubkey", "")[:10] } comment := fmt.Sprintf("%s<>%s<>%s<>%s<>", name, rec.GetBodyValue("main", ""), util.Datestr2ch(rec.Stamp), MakeBody(rec, host, board, table)) if i == 0 { comment += util.FileDecode(ca.Datfile) } dat[i] = comment i++ } return dat }
//postCommentApp checks posted data and replaces >> links to html links, //and saves it as record. func (m *mchCGI) postCommentApp() { if m.Req.Method != http.MethodPost { m.WR.Header().Set("Content-Type", "text/plain") m.WR.WriteHeader(404) fmt.Fprintf(m.WR, "404 Not Found") return } info := m.getCommentData() info["host"] = m.Req.Host key := m.checkInfo(info) if key == "" { return } referer := m.getCP932("Referer") reg := regexp.MustCompile("/2ch_([^/]+)/") var tag string if ma := reg.FindStringSubmatch(referer); ma != nil && m.HasAuth() { tag = util.FileDecode("dummy_" + ma[1]) } table := mch.NewResTable(thread.NewCache(key)) reg = regexp.MustCompile(">>([1-9][0-9]*)") body := reg.ReplaceAllStringFunc(info["body"], func(str string) string { noStr := reg.FindStringSubmatch(str)[1] no, err := strconv.Atoi(noStr) if err != nil { log.Fatal(err) } return ">>" + table.Num2id[no] }) name := info["name"] var passwd string if strings.ContainsRune(name, '#') { ary := strings.Split(name, "#") name = ary[0] passwd = ary[1] } if passwd != "" && !m.IsAdmin() { m.errorResp("自ノード以外で署名機能は使えません", info) } err := m.postComment(key, name, info["mail"], body, passwd, tag) if err == errSpamM { m.errorResp("スパムとみなされました", info) } m.WR.Header().Set("Content-Type", "text/html; charset=Shift_JIS") fmt.Fprintln(m.WR, util.ToSJIS(`<html lang="ja"><head><meta http-equiv="Content-Type" content="text/html"><title>書きこみました。</title></head><body>書きこみが終わりました。<br><br></body></html>`)) }
//MakeBracketLink changes str in brackets to the html links format. func MakeBracketLink(body, datHost, board string, table *mch.ResTable) string { regs := []*regexp.Regexp{ regexp.MustCompile("^(?P<title>[^/]+)$"), regexp.MustCompile("^/(?P<type>[a-z]+)/(?P<title>[^/]+)$"), regexp.MustCompile("^(?P<title>[^/]+)/(?P<id>[0-9a-f]{8})$"), regexp.MustCompile("^/(?P<type>[a-z]+)/(?P<title>[^/]+)/(?P<id>[0-9a-f]{8})$"), } reg := regexp.MustCompile(`\[\[([^<>]+?)\]\]`) return reg.ReplaceAllStringFunc(body, func(str string) string { link := reg.FindStringSubmatch(str)[1] result := make(map[string]string) for _, r := range regs { if match := r.FindStringSubmatch(link); match != nil { for i, name := range r.SubexpNames() { result[name] = match[i] } break } } if result["title"] == "" { return result["body"] } if result["type"] == "" { result["type"] = "thread" } file := util.FileEncode(result["type"], result["title"]) datkey, err := GetDatkey(file) if err != nil { log.Println(err) return body } if result["id"] == "" { url := fmt.Sprintf("http://%s/test/read.cgi/%s/%d/", datHost, board, datkey) return fmt.Sprintf("[[%s(%s)]]", result["title"], url) } ca := thread.NewCache(file) table = mch.NewResTable(ca) no := table.ID2num[result["id"]] url := fmt.Sprintf("http://%s/test/read.cgi/%s/%d/%d", datHost, board, datkey, no) return fmt.Sprintf("[[%s(>>%d %s)]]", result["title"], no, url) }) }