Move out commands from main.go
This commit is contained in:
parent
80f2414c1e
commit
159907723b
165
commands/commands.go
Normal file
165
commands/commands.go
Normal file
@ -0,0 +1,165 @@
|
|||||||
|
/**
|
||||||
|
* @file commands.go
|
||||||
|
* @author Mikhail Klementyev jollheef<AT>riseup.net
|
||||||
|
* @license GNU GPLv3
|
||||||
|
* @date July, 2016
|
||||||
|
*/
|
||||||
|
|
||||||
|
package commands
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"database/sql"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/jollheef/wi/storage"
|
||||||
|
|
||||||
|
"github.com/jaytaylor/html2text"
|
||||||
|
"golang.org/x/net/html"
|
||||||
|
"golang.org/x/net/html/charset"
|
||||||
|
)
|
||||||
|
|
||||||
|
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 Get(db *sql.DB, url string) {
|
||||||
|
client := &http.Client{}
|
||||||
|
|
||||||
|
if !strings.Contains(url, "://") {
|
||||||
|
url = "http://" + url
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO Full url encoding
|
||||||
|
req, err := http.NewRequest("GET", strings.Replace(url, " ", "%20", -1), nil)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalln(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
req.Header.Set("User-Agent", "Wi 0.0")
|
||||||
|
|
||||||
|
resp, err := client.Do(req)
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalln(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
storage.AddHistoryURL(db, url)
|
||||||
|
|
||||||
|
defer resp.Body.Close()
|
||||||
|
|
||||||
|
utf8, err := charset.NewReader(resp.Body, resp.Header.Get("Content-Type"))
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("Encoding error:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
body, err := ioutil.ReadAll(utf8)
|
||||||
|
if err != nil {
|
||||||
|
fmt.Println("IO error:", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
htmlPage, err := parseLinks(db, body, req)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
text, err := html2text.FromString(htmlPage)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
text += ""
|
||||||
|
|
||||||
|
fmt.Println(text)
|
||||||
|
}
|
||||||
|
|
||||||
|
func Link(db *sql.DB, linkID int64) {
|
||||||
|
url, err := storage.GetLink(db, linkID)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
Get(db, url)
|
||||||
|
}
|
||||||
|
|
||||||
|
func History(db *sql.DB, argAmount, defaultAmount int64, all bool) {
|
||||||
|
history, err := storage.GetHistory(db)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
var amount int64
|
||||||
|
|
||||||
|
if all {
|
||||||
|
amount = int64(len(history))
|
||||||
|
} else if argAmount == 0 {
|
||||||
|
if int64(len(history)) < defaultAmount {
|
||||||
|
amount = int64(len(history))
|
||||||
|
} else {
|
||||||
|
amount = defaultAmount
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if amount > int64(len(history)) {
|
||||||
|
amount = int64(len(history))
|
||||||
|
} else {
|
||||||
|
amount = argAmount
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, h := range history[int64(len(history))-amount:] {
|
||||||
|
fmt.Println(h.ID, h.URL)
|
||||||
|
}
|
||||||
|
}
|
159
main.go
159
main.go
@ -9,20 +9,9 @@
|
|||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"github.com/jollheef/wi/commands"
|
||||||
"database/sql"
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"fmt"
|
|
||||||
"io/ioutil"
|
|
||||||
"log"
|
|
||||||
"net/http"
|
|
||||||
|
|
||||||
"github.com/jollheef/wi/storage"
|
"github.com/jollheef/wi/storage"
|
||||||
|
|
||||||
"github.com/jaytaylor/html2text"
|
|
||||||
"golang.org/x/net/html"
|
|
||||||
"golang.org/x/net/html/charset"
|
|
||||||
kingpin "gopkg.in/alecthomas/kingpin.v2"
|
kingpin "gopkg.in/alecthomas/kingpin.v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -38,146 +27,6 @@ var (
|
|||||||
historyListAll = historyList.Flag("all", "Show all items").Bool()
|
historyListAll = historyList.Flag("all", "Show all items").Bool()
|
||||||
)
|
)
|
||||||
|
|
||||||
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) {
|
|
||||||
client := &http.Client{}
|
|
||||||
|
|
||||||
if !strings.Contains(url, "://") {
|
|
||||||
url = "http://" + url
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO Full url encoding
|
|
||||||
req, err := http.NewRequest("GET", strings.Replace(url, " ", "%20", -1), nil)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
req.Header.Set("User-Agent", "Wi 0.0")
|
|
||||||
|
|
||||||
resp, err := client.Do(req)
|
|
||||||
if err != nil {
|
|
||||||
log.Fatalln(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
storage.AddHistoryURL(db, url)
|
|
||||||
|
|
||||||
defer resp.Body.Close()
|
|
||||||
|
|
||||||
utf8, err := charset.NewReader(resp.Body, resp.Header.Get("Content-Type"))
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println("Encoding error:", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
body, err := ioutil.ReadAll(utf8)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println("IO error:", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
htmlPage, err := parseLinks(db, body, req)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
text, err := html2text.FromString(htmlPage)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
text += ""
|
|
||||||
|
|
||||||
fmt.Println(text)
|
|
||||||
}
|
|
||||||
|
|
||||||
func cmd_link(db *sql.DB, linkID int64) {
|
|
||||||
url, err := storage.GetLink(db, linkID)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
cmd_url(db, url)
|
|
||||||
}
|
|
||||||
|
|
||||||
func cmd_history(db *sql.DB, argAmount, defaultAmount int64, all bool) {
|
|
||||||
history, err := storage.GetHistory(db)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
var amount int64
|
|
||||||
|
|
||||||
if all {
|
|
||||||
amount = int64(len(history))
|
|
||||||
} else if argAmount == 0 {
|
|
||||||
if int64(len(history)) < defaultAmount {
|
|
||||||
amount = int64(len(history))
|
|
||||||
} else {
|
|
||||||
amount = defaultAmount
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if amount > int64(len(history)) {
|
|
||||||
amount = int64(len(history))
|
|
||||||
} else {
|
|
||||||
amount = argAmount
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for _, h := range history[int64(len(history))-amount:] {
|
|
||||||
fmt.Println(h.ID, h.URL)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
db, err := storage.OpenDB("/tmp/wi.db")
|
db, err := storage.OpenDB("/tmp/wi.db")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -187,10 +36,10 @@ func main() {
|
|||||||
|
|
||||||
switch kingpin.Parse() {
|
switch kingpin.Parse() {
|
||||||
case "get":
|
case "get":
|
||||||
cmd_url(db, *getUrl)
|
commands.Get(db, *getUrl)
|
||||||
case "link":
|
case "link":
|
||||||
cmd_link(db, *linkNo)
|
commands.Link(db, *linkNo)
|
||||||
case "history":
|
case "history":
|
||||||
cmd_history(db, *historyListItems, 20, *historyListAll)
|
commands.History(db, *historyListItems, 20, *historyListAll)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user