Fast Link Checker for Markdown and HTML in Go
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

75 lines
1.2 KiB

package main
import (
"bytes"
"io/ioutil"
"strings"
"time"
"golang.org/x/net/html"
"gopkg.in/russross/blackfriday.v2"
)
type fileChecker struct {
urlChecker urlChecker
}
func newFileChecker(timeout time.Duration, verbose bool) fileChecker {
return fileChecker{newURLChecker(timeout, verbose)}
}
func (c fileChecker) Check(f string) ([]urlResult, error) {
bs, err := ioutil.ReadFile(f)
if err != nil {
return nil, err
}
n, err := html.Parse(bytes.NewReader(blackfriday.Run(bs)))
if err != nil {
return nil, err
}
us := extractURLs(n)
rc := make(chan urlResult, len(us))
rs := make([]urlResult, 0, len(us))
go c.urlChecker.CheckMany(us, rc)
for r := range rc {
rs = append(rs, r)
}
return rs, nil
}
type fileResult struct {
filename string
urlResults []urlResult
err error
}
func (r fileResult) String() string {
ss := make([]string, 0, len(r.urlResults))
for _, r := range r.urlResults {
ss = append(ss, "\t"+r.String())
}
return strings.Join(append([]string{r.filename}, ss...), "\n")
}
func (r fileResult) Ok() bool {
if r.err != nil {
return false
}
for _, r := range r.urlResults {
if r.err != nil {
return false
}
}
return true
}