//extentions reads files with suffix in root dir and return them. //if __merged file exists return it when useMerged=true. func (c *CGI) extension(suffix string) []string { var filename []string d, err := util.AssetDir("www") if err != nil { log.Fatal(err) } for _, fname := range d { if util.HasExt(fname, suffix) { filename = append(filename, fname) } } if util.IsDir(cfg.Docroot) { err = util.EachFiles(cfg.Docroot, func(f os.FileInfo) error { i := f.Name() if util.HasExt(i, suffix) { if !util.HasString(filename, i) { filename = append(filename, i) } } return nil }) if err != nil { log.Println(err) } } sort.Strings(filename) return filename }
//NewListItem returns ListItem struct from caches. func NewListItem(caches []*thread.Cache, remove bool, target string, search bool, filter, tag string) *ListItem { li := &ListItem{Remove: remove} li.Caches = make([]*CacheInfo, 0, len(caches)) if search { li.StrOpts = "?search_new_file=yes" } for _, ca := range caches { x, ok := checkCache(ca, target, filter, tag) if !ok { continue } ci := &CacheInfo{Cache: ca} li.Caches = append(li.Caches, ci) ci.Title = util.EscapeSpace(x) if target == "recent" { strTags := make([]string, user.Len(ca.Datfile)) for i, v := range user.GetByThread(ca.Datfile) { strTags[i] = strings.ToLower(v.Tagstr) } for _, st := range suggest.Get(ca.Datfile, nil) { if !util.HasString(strTags, strings.ToLower(st.Tagstr)) { ci.Sugtags = append(ci.Sugtags, st) } } } ci.Tags = user.GetByThread(ca.Datfile) } return li }
//Parse parses one line in record file and response of /recent/ and set params to record r. func (r *Record) Parse(recstr string) error { var err error recstr = strings.TrimRight(recstr, "\r\n") tmp := strings.Split(recstr, "<>") if len(tmp) < 2 { errr := errors.New(recstr + ":bad format") log.Println(errr) return errr } stamp, err := strconv.ParseInt(tmp[0], 10, 64) if err != nil { log.Println(tmp[0], "bad format") return err } if r.Stamp == 0 { r.Stamp = stamp } if r.Stamp != stamp { log.Println("stamp unmatch") return errors.New("stamp unmatch") } if r.ID == "" { r.ID = tmp[1] } if r.ID != tmp[1] { log.Println("ID unmatch") return errors.New("stamp unmatch") } r.contents = make(map[string]string) r.keyOrder = nil //reposense of recentlist : stamp<>id<>thread_***<>tag:*** //record str : stamp<>id<>body:***<>... for _, kv := range tmp[2:] { buf := strings.SplitN(kv, ":", 2) if len(buf) < 2 { continue } buf[1] = strings.Replace(buf[1], "<br>", "\n", -1) buf[1] = strings.Replace(buf[1], "<", "<", -1) buf[1] = strings.Replace(buf[1], ">", ">", -1) buf[1] = strings.Replace(buf[1], "\n", "<br>", -1) if util.HasString(r.keyOrder, buf[0]) { err := errors.New("duplicate keys") log.Println(err) return err } r.keyOrder = append(r.keyOrder, buf[0]) r.contents[buf[0]] = buf[1] } return nil }
//Has returns true if ns has n. func (ns Slice) Has(n *Node) bool { return util.HasString(ns.GetNodestrSlice(), n.Nodestr) }