Refactor link parsing
This commit is contained in:
parent
623a3d0f3a
commit
1f6e2db2f2
89
main.go
89
main.go
@ -31,6 +31,58 @@ var (
|
|||||||
arg_link = kingpin.Flag("link", "Link").Int64()
|
arg_link = kingpin.Flag("link", "Link").Int64()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
func parseLink(db *sql.DB, oldPage, value string, req *http.Request) (htmlPage string, err error) {
|
||||||
|
url, err := req.URL.Parse(value)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
linkNo, err := storage.GetLinkID(db, url.String())
|
||||||
|
if err != nil {
|
||||||
|
linkNo, err = storage.AddLink(db, url.String())
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, s := range []string{value, html.EscapeString(value)} {
|
||||||
|
htmlPage = strings.Replace(oldPage, "\""+s+"\"",
|
||||||
|
"\""+fmt.Sprintf("%d", linkNo)+"\"", -1)
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseLinks(db *sql.DB, body []byte, req *http.Request) (htmlPage string, err error) {
|
||||||
|
htmlPage = string(body)
|
||||||
|
|
||||||
|
z := html.NewTokenizer(bytes.NewReader(body))
|
||||||
|
|
||||||
|
for {
|
||||||
|
tt := z.Next()
|
||||||
|
if tt == html.ErrorToken {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
for {
|
||||||
|
key, value, moreAttr := z.TagAttr()
|
||||||
|
|
||||||
|
if string(key) == "href" {
|
||||||
|
htmlPage, err = parseLink(db, htmlPage, string(value), req)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if !moreAttr {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func cmd_url(db *sql.DB, url string) {
|
func cmd_url(db *sql.DB, url string) {
|
||||||
client := &http.Client{}
|
client := &http.Client{}
|
||||||
|
|
||||||
@ -61,46 +113,11 @@ func cmd_url(db *sql.DB, url string) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
htmlPage := string(body)
|
htmlPage, err := parseLinks(db, body, req)
|
||||||
|
|
||||||
z := html.NewTokenizer(bytes.NewReader(body))
|
|
||||||
|
|
||||||
for {
|
|
||||||
tt := z.Next()
|
|
||||||
if tt == html.ErrorToken {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
for {
|
|
||||||
key, value, moreAttr := z.TagAttr()
|
|
||||||
|
|
||||||
if string(key) == "href" {
|
|
||||||
|
|
||||||
url, err := req.URL.Parse(string(value))
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
linkNo, err := storage.GetLinkID(db, url.String())
|
|
||||||
if err != nil {
|
|
||||||
linkNo, err = storage.AddLink(db, url.String())
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, s := range []string{string(value), html.EscapeString(string(value))} {
|
|
||||||
htmlPage = strings.Replace(htmlPage, "\""+s+"\"",
|
|
||||||
"\""+fmt.Sprintf("%d", linkNo)+"\"", -1)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if !moreAttr {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
text, err := html2text.FromString(htmlPage)
|
text, err := html2text.FromString(htmlPage)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
|
Loading…
Reference in New Issue
Block a user