diff --git a/config.go b/config.go index 34c638f..421411b 100644 --- a/config.go +++ b/config.go @@ -8,39 +8,42 @@ import ( ) type Config struct { - configpath string - webpath string - datapath string - domain string + configpath, webpath, datapath, domain string } func getconf () Config { var payload map[string]interface{} var cnf Config + // バイナリ、データ、及びFreeBSDとNetBSDの場合、コンフィグ prefix := "/usr" + // BSDだけはただの/usrではない if runtime.GOOS == "freebsd" || runtime.GOOS == "openbsd" { prefix += "/local" } else if runtime.GOOS == "netbsd" { prefix += "/pkg" } + // コンフィグファイル cnf.configpath = "/etc/hozonsite/config.json" - //_, err = os.Stat(cnf.configpath) cnf.datapath = prefix + "/share/hozonsite" + // また、FreeBSDとNetBSDだけは違う場所だ。OpenBSDは正しい場所 + // FreeBSD = /usr/local/etc/hozonsite/config.json + // NetBSD = /usr/pkg/etc/hozonsite/config.json if runtime.GOOS == "freebsd" || runtime.GOOS == "netbsd" { cnf.configpath = prefix + cnf.configpath } + // コンフィグファイルがなければ、死ね data, err := os.ReadFile(cnf.configpath) if err != nil { fmt.Println("エラー:", err) } json.Unmarshal(data, &payload) - cnf.webpath = payload["webpath"].(string) - cnf.domain = payload["domain"].(string) - payload = nil + cnf.webpath = payload["webpath"].(string) // データパス + cnf.domain = payload["domain"].(string) // ドメイン名 + payload = nil // もういらなくなった return cnf } diff --git a/getpage.go b/getpage.go index 3575bea..a053308 100644 --- a/getpage.go +++ b/getpage.go @@ -8,6 +8,7 @@ import ( "strings" ) +// URLでパラメートル(?、=等)がある場合 func stripurl (url string) string { res := strings.ReplaceAll(url, "?", "") res = strings.ReplaceAll(res, "=", "") @@ -15,26 +16,30 @@ func stripurl (url string) string { } func getpage (url string, path string) { + // ページを読み込む curl, err := http.Get(url) if err != nil { fmt.Println("CURLエラー:", err) return } + defer curl.Body.Close() // ソフトの終了する時に実行する - defer curl.Body.Close() + // ページの内容を読み込む body, err2 := io.ReadAll(curl.Body) if err2 != nil { fmt.Println("読込エラー:", err2) return } + // 空index.htmlファイルを創作する fn, err3 := os.Create(path + "/index.html") if err3 != nil { fmt.Println("ファイルの創作エラー:", err3) return } + defer fn.Close() // ソフトの終了する時に実行する - defer fn.Close() + // あのindex.htmlファイルに内容をそのまま書き込む _, err4 := fn.WriteString(string(body)) if err4 != nil { fmt.Println("ファイル書込エラー:", err4) diff --git a/main.go b/main.go index 5ea02a7..44f3106 100644 --- a/main.go +++ b/main.go @@ -18,50 +18,50 @@ func help () { } func main () { - cnf := getconf() - args := os.Args + cnf := getconf() // コンフィグファイル + args := os.Args // コマンドラインのパラメートル if len(args) == 2 { - if args[1] == "-v" { + if args[1] == "-v" { // バージョンを表示 fmt.Println("hozonsite-" + version) return - } else if args[1] == "-s" { + } else if args[1] == "-s" { // :9920でウェブサーバーを実行 serv(cnf, 9920) - } else if args[1] == "-h" { + } else if args[1] == "-h" { // ヘルプを表示 help() return - } else { - if checkprefix(args[1]) { - eurl := stripurl(args[1]) - exist := checkexist(eurl, cnf.datapath) - var confirm string - if len(exist) > 0 { + } else { // コマンドラインでウェブサイトを保存 + if checkprefix(args[1]) { // プロトコールはあってるかどうか + eurl := stripurl(args[1]) // パラメートルの文字(?、=等)を削除 + exist := checkexist(eurl, cnf.datapath) // 既に/usr/share/hozonsite/archiveに存在するかどうか + var confirm string // 既に存在したら、使う + if len(exist) > 0 { // あ、既に存在する fmt.Println("このページが既に保存されているみたいです。") fmt.Println("本当に手続きましょうか? [y/N]") - for _, ex := range exist { + for _, ex := range exist { // 既に存在するページのURLを表示 fmt.Println(strings.Replace(ex, cnf.datapath, cnf.domain, 1)) } fmt.Scanf("%s", &confirm) } - if len(exist) == 0 || confirm == "y" || confirm == "Y" { + if len(exist) == 0 || confirm == "y" || confirm == "Y" { // 存在しない OR 「本当に手続きましょうか?」でYを入力した場合 path := mkdirs(eurl, cnf.datapath) - getpage(args[1], path) - scanpage(path, eurl, cnf.datapath) - fmt.Println(cnf.domain + strings.Replace(path, cnf.datapath, "", 1)) + getpage(args[1], path) // ページをダウンロード + scanpage(path, eurl, cnf.datapath) // 色々の必須な編集 + fmt.Println(cnf.domain + strings.Replace(path, cnf.datapath, "", 1)) // 新しいURLを表示 } return - } else { + } else { // 結局HTTPかHTTPSじゃないわね… fmt.Println("URLは不正です。終了…") return } } - } else if len(args) == 3 && args[1] == "-s" { - if port, err := strconv.Atoi(args[2]); err != nil { + } else if len(args) == 3 && args[1] == "-s" { // 好みなポート番号でウェブサーバーを実行 + if port, err := strconv.Atoi(args[2]); err != nil { // でも、数字じゃないかもしん fmt.Printf("%qは数字ではありません。\n", args[2]) return - } else { + } else { // OK、実行しよ〜 serv(cnf, port) } - } else { + } else { // パラメートルは不明の場合、ヘルプを表示 help() return } diff --git a/prep.go b/prep.go index 83c61b0..0076447 100644 --- a/prep.go +++ b/prep.go @@ -8,10 +8,12 @@ import ( "path/filepath" ) +// HTTPかHTTPSの確認 func checkprefix (url string) bool { return strings.HasPrefix(url, "http://") || strings.HasPrefix(url, "https://") } +// ページは既に存在するの? func checkexist (url string, prefix string) []string { res, err := filepath.Glob(prefix + "/archive/*" + url2path(url)) if err != nil { @@ -20,6 +22,7 @@ func checkexist (url string, prefix string) []string { return res } +// http:/かhttps:/はいらない。最後の「/」は必要 func url2path (url string) string { res := "" if strings.HasPrefix(url, "https:/") { @@ -35,6 +38,7 @@ func url2path (url string) string { return res } +// 必要なフォルダの創作 func mkdirs (url string, prefix string) string { rep := url2path(url) t := time.Now().Unix() diff --git a/scanpage.go b/scanpage.go index 51ed073..8e96752 100644 --- a/scanpage.go +++ b/scanpage.go @@ -13,25 +13,29 @@ import ( ) func scanpage (path string, domain string, thisdomain string) error { + // 先に保存したページを読み込む fn, err := os.ReadFile(path + "/index.html") if err != nil { return err } - /* 削除 */ + // 要らないタグを削除 var script = regexp.MustCompile(`()`).ReplaceAllString(string(fn), "") var noscript = regexp.MustCompile(`()`).ReplaceAllString(string(script), "") var audio = regexp.MustCompile(`()`).ReplaceAllString(string(noscript), "") var video = regexp.MustCompile(`()`).ReplaceAllString(string(audio), "") var iframe = regexp.MustCompile(`()`).ReplaceAllString(string(video), "") - /* 追加ダウンロード+ローカル化 */ + // 追加ダウンロード+ローカル化 var ass = regexp.MustCompile(`(