func fixRelativeLinks(user, repo, doc, ref, body string) (string, error) { hostname := getenv("HOSTNAME", "viewdocs.io") repoAndRef := repo if ref != "master" { repoAndRef += "~" + ref } n, err := html.Parse(strings.NewReader(string(body))) if err != nil { return "", err } var f func(*html.Node) f = func(n *html.Node) { if n.Type == html.ElementNode && n.Data == "a" { for i, a := range n.Attr { if a.Key == "href" { hrefValue := strings.TrimPrefix(a.Val, "http://"+user+"."+hostname+"") if strings.Index(hrefValue, "/"+repo+"/") == 0 { n.Attr[i].Val = "/" + repoAndRef + "/" + strings.TrimPrefix(hrefValue, "/"+repo+"/") continue } fs := strings.Index(hrefValue, "/") fc := strings.Index(hrefValue, ":") fh := strings.Index(hrefValue, "#") if fs == 0 || fh == 0 || (fc >= 0 && fc < fs) || (fh >= 0 && fh < fs) { continue } n.Attr[i].Val = "/" + repoAndRef + "/" + hrefValue } } } for c := n.FirstChild; c != nil; c = c.NextSibling { f(c) } } f(n) b := new(bytes.Buffer) if err := html.Render(b, n); err != nil { return "", err } return b.String(), nil }
func fixRelativeLinks(doc, repo, ref, body string) (string, error) { repoAndRef := repo if ref != "master" { repoAndRef += "~" + ref } n, err := html.Parse(strings.NewReader(string(body))) if err != nil { return "", err } var f func(*html.Node) f = func(n *html.Node) { if n.Type == html.ElementNode && n.Data == "a" { for i, a := range n.Attr { if a.Key == "href" { fs := strings.Index(a.Val, "/") fc := strings.Index(a.Val, ":") fh := strings.Index(a.Val, "#") if fs == 0 || fh == 0 || (fc >= 0 && fc < fs) || (fh >= 0 && fh < fs) { continue } n.Attr[i].Val = "/" + repoAndRef + "/" + a.Val } } } for c := n.FirstChild; c != nil; c = c.NextSibling { f(c) } } f(n) b := new(bytes.Buffer) if err := html.Render(b, n); err != nil { return "", err } return b.String(), nil }