// Copyright (C) 2017 Marius Schellenberger package main import ( "html/template" "regexp" "strconv" "strings" "github.com/blevesearch/bleve/analysis" htmlFilter "github.com/blevesearch/bleve/analysis/char_filters/html_char_filter" "github.com/russross/blackfriday" ) var filter = makeFilter() func makeFilter() analysis.CharFilter { f, _ := htmlFilter.CharFilterConstructor(nil, nil) return f } var ( reHeader = regexp.MustCompile("((.+)()") reLink = regexp.MustCompile(`id="(.+)">`) whiteSpace = regexp.MustCompile(`\s+`) reIndex = regexp.MustCompile("(.+)") titleRe = regexp.MustCompile("[^a-zA-Z0-9 -]+") ) type rendered struct { Index template.HTML Text template.HTML MD string Raw []byte } func (r *rendered) Article() *Article { return &Article{ Index: r.Index, Text: r.Text, MD: r.MD, Search: whiteSpace.ReplaceAllString(string(filter.Filter(r.Raw)), " "), } } func (r *rendered) Snippet() *Snippet { return &Snippet{ Index: r.Index, Text: r.Text, MD: r.MD, } } func render(text string) *rendered { rend := blackfriday.MarkdownCommon([]byte(text)) index, html := buildIndex(string(rend)) html = strings.Replace(html, "", `
`, -1) html = strings.Replace(html, "", `
`, -1) html = strings.Replace(html, "${2}${3}`) html = reLink.ReplaceAllStringFunc(html, spaceReplace) for k, v := range hn { link, _ := makeLinkTitle(v[2]) i := m[link] m[link] = i + 1 newLink := link + strconv.Itoa(i) html = strings.Replace(html, link+`"`, newLink+`"`, 1) ret += before(hn, k) ret += `
  • ` + v[2] + "" ret += after(hn, k) } return ret, html } func before(arr [][]string, i int) string { c, _ := strconv.Atoi(arr[i][1]) if c == 1 { return `
      ` } return "" } func after(arr [][]string, i int) string { c, _ := strconv.Atoi(arr[i][1]) if len(arr) <= i+1 { return closeTag(c-1) + "
    " } n, _ := strconv.Atoi(arr[i+1][1]) if n == 1 { return closeTag(c-n) + "" } else if n < c { return closeTag(c - n) } else if n > c { return openTag(n - c) } else if n == c { return "
  • " } return "" } func openTag(j int) (ret string) { for i := 0; i < j; i++ { ret += `
    • ` } if j > 1 { ret = strings.Replace(ret, "circle", "none", j-1) } ret = ret[0 : len(ret)-4] return } func closeTag(j int) (ret string) { for i := 0; i < j; i++ { ret += "
    " } if j > 1 { ret = strings.Replace(ret, "", "", -1) } return }