commit 69613f361efe6a9189b2b02444205d5b212f49b0
parent 947f19fa1bc919f9a5625ba43fc2dc9d78e9a317
Author: Peter Kosyh <p.kosyh@gmail.com>
Date: Fri, 5 Feb 2021 11:10:36 +0300
ii-gemini
Diffstat:
| A | ii-gemini/main.go | | | 177 | +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ |
| M | ii-tool/main.go | | | 68 | +------------------------------------------------------------------- |
2 files changed, 178 insertions(+), 67 deletions(-)
diff --git a/ii-gemini/main.go b/ii-gemini/main.go
@@ -0,0 +1,177 @@
+package main
+
+import (
+ "../ii"
+ "bufio"
+ "flag"
+ "fmt"
+ "io"
+ "io/ioutil"
+ "os"
+ "sort"
+ "strings"
+ "time"
+)
+
+func open_db(path string) *ii.DB {
+ db := ii.OpenDB(path)
+ if db == nil {
+ fmt.Printf("Can no open db: %s\n", path)
+ os.Exit(1)
+ }
+ return db
+}
+
+func GetFile(path string) string {
+ var file *os.File
+ var err error
+ if path == "-" {
+ file = os.Stdin
+ } else {
+ file, err = os.Open(path)
+ if err != nil {
+ fmt.Printf("Can not open file %s: %s\n", path, err)
+ os.Exit(1)
+ }
+ defer file.Close()
+ }
+ b, err := ioutil.ReadAll(file)
+ if err != nil {
+ fmt.Printf("Can not read file %s: %s\n", path, err)
+ os.Exit(1)
+ }
+ return string(b)
+}
+
+func gemini(f io.Writer, m *ii.Msg) {
+ fmt.Fprintln(f, "# " + m.Subj)
+ if m.To != "All" {
+ fmt.Fprintf(f, "To: %s\n\n", m.To)
+ }
+ d := time.Unix(m.Date, 0).Format("2006-01-02 15:04:05")
+ fmt.Fprintf(f, "by %s on %s\n\n", m.From, d)
+ temp := strings.Split(m.Text, "\n")
+ pre := false
+ xpm := false
+ for _, l := range temp {
+ l = strings.Replace(l, "\r", "", -1)
+ if pre {
+ if l == "====\r" {
+ l = "````\r"
+ pre = false
+ }
+ } else if xpm {
+ if strings.HasSuffix(l, "};\r") {
+ xpm = false
+ fmt.Fprintln(f, l)
+ fmt.Fprintln(f, "```\r")
+ continue
+ }
+ } else {
+ if l == "====\r" {
+ l = "```"
+ pre = true
+ } else if strings.HasPrefix(l, "/* XPM */") {
+ fmt.Fprintln(f, "```\r")
+ xpm = true
+ }
+ }
+ fmt.Fprintln(f, l)
+ }
+ fmt.Fprintln(f, "")
+ fmt.Fprintf(f, "=> https://hugeping.tk/"+m.MsgId + " Ссылка на статью на станции ping\n")
+}
+
+func str_esc(l string) string {
+ l = strings.Replace(l, "&", "&", -1)
+ l = strings.Replace(l, "<", "<", -1)
+ l = strings.Replace(l, ">", ">", -1)
+ return l
+}
+
+func main() {
+ ii.OpenLog(ioutil.Discard, os.Stdout, os.Stderr)
+
+ db_opt := flag.String("db", "./db", "II database path (directory)")
+ data_opt := flag.String("data", "./data", "Output path (directory)")
+ url_opt := flag.String("url", "localhost", "Url of station")
+ verbose_opt := flag.Bool("v", false, "Verbose")
+ title_opt := flag.String("title", "ii/idec networks", "Title")
+ author_opt := flag.String("author", "anonymous", "Author")
+ flag.Parse()
+ if *verbose_opt {
+ ii.OpenLog(os.Stdout, os.Stdout, os.Stderr)
+ }
+
+ args := flag.Args()
+ if len(args) < 1 {
+ fmt.Printf(`Help: %s [options] command [arguments]
+Commands:
+ -data <path> gemini - generate gemini data
+Options:
+ -db=<path> - database path
+`, os.Args[0])
+ os.Exit(1)
+ }
+ switch cmd := args[0]; cmd {
+ case "gemini":
+ db := open_db(*db_opt)
+ db.Lock()
+ defer db.Unlock()
+ db.LoadIndex()
+
+ scanner := bufio.NewScanner(os.Stdin)
+ var mis []*ii.Msg
+ for scanner.Scan() {
+ mi := db.LookupFast(scanner.Text(), false)
+ if mi != nil {
+ mis = append(mis, db.Get(mi.Id))
+ }
+ }
+ sort.SliceStable(mis, func(i, j int) bool {
+ return mis[i].Date > mis[j].Date
+ })
+ data := strings.TrimSuffix(*data_opt, "/")
+ atom, err := os.Create(data + "/atom.xml")
+ if err != nil {
+ return
+ }
+ defer atom.Close()
+ fmt.Fprintf(atom, `<?xml version="1.0" encoding="utf-8"?>
+<feed xmlns="http://www.w3.org/2005/Atom">
+ <title>%s</title>
+ <link href="gemini://%s/atom.xml" rel="self"/>
+ <link href="gemini://%s/" rel="alternate"/>
+ <updated>%s</updated>
+ <author>
+ <name>%s</name>
+ </author>
+ <id>gemini://%s/</id>
+`, *title_opt, *url_opt, *url_opt, time.Now().Format(time.RFC3339), *author_opt, *url_opt)
+ for _, v := range mis {
+ m := v
+ if m != nil {
+ f, err := os.Create(data + "/" + m.MsgId + ".gmi")
+ if err == nil {
+ gemini(f, m)
+ d := time.Unix(m.Date, 0).Format("2006-01-02")
+ fmt.Println("=> /"+ m.MsgId + ".gmi " + d + " - " + m.Subj)
+ }
+ f.Close()
+ fmt.Fprintf(atom, `<entry>
+<title>%s</title>
+<link href="gemini://%s/%s.gmi" rel="alternate"/>
+<id>gemini://%s/%s.gmi</id>
+<updated>%s</updated>
+</entry>
+`, str_esc(m.Subj), *url_opt, m.MsgId,
+ *url_opt, m.MsgId, time.Unix(m.Date, 0).Format(time.RFC3339))
+ }
+ }
+ fmt.Fprintf(atom, `</feed>
+`)
+ default:
+ fmt.Printf("Wrong cmd: %s\n", cmd)
+ os.Exit(1)
+ }
+}
diff --git a/ii-tool/main.go b/ii-tool/main.go
@@ -8,9 +8,7 @@ import (
"io"
"io/ioutil"
"os"
- "sort"
"strings"
- "time"
)
func open_db(path string) *ii.DB {
@@ -52,45 +50,6 @@ func GetFile(path string) string {
return string(b)
}
-func gemini(m *ii.Msg) {
- fmt.Println("# " + m.Subj)
- if m.To != "All" {
- fmt.Printf("To: %s\n\n", m.To)
- }
- d := time.Unix(m.Date, 0).Format("2006-01-02 15:04:05")
- fmt.Printf("by %s on %s\n\n", m.From, d)
- temp := strings.Split(m.Text, "\n")
- pre := false
- xpm := false
- for _, l := range temp {
- l = strings.Replace(l, "\r", "", -1)
- l = l + "\r"
- if pre {
- if l == "====\r" {
- l = "````\r"
- pre = false
- }
- } else if xpm {
- if strings.HasSuffix(l, "};\r") {
- xpm = false
- fmt.Println(l)
- fmt.Println("```\r")
- continue
- }
- } else {
- if l == "====\r" {
- l = "```"
- pre = true
- } else if strings.HasPrefix(l, "/* XPM */") {
- fmt.Println("```\r")
- xpm = true
- }
- }
- fmt.Println(l)
- }
- fmt.Println("")
-}
-
func main() {
ii.OpenLog(ioutil.Discard, os.Stdout, os.Stderr)
@@ -101,7 +60,6 @@ func main() {
users_opt := flag.String("u", "points.txt", "Users database")
conns_opt := flag.Int("j", 6, "Maximum parallel jobs")
topics_opt := flag.Bool("t", false, "Select topics only")
- gemini_opt := flag.Bool("g", false, "Gemini format")
flag.Parse()
ii.MaxConnections = *conns_opt
@@ -398,31 +356,7 @@ Options:
m := db.Get(args[1])
if m != nil {
- if *gemini_opt {
- gemini(m)
- } else {
- fmt.Println(m)
- }
- }
- case "sort":
- db := open_db(*db_opt)
- db.Lock()
- defer db.Unlock()
- db.LoadIndex()
-
- scanner := bufio.NewScanner(os.Stdin)
- var mis []*ii.MsgInfo
- for scanner.Scan() {
- mi := db.LookupFast(scanner.Text(), false)
- if mi != nil {
- mis = append(mis, mi)
- }
- }
- sort.SliceStable(mis, func(i, j int) bool {
- return mis[i].Num > mis[j].Num
- })
- for _, v := range mis {
- fmt.Println(v.Id)
+ fmt.Println(m)
}
case "cc":
if len(args) < 2 {