From 57896f7dcdf947119c856a8a892b497df2c62d5a Mon Sep 17 00:00:00 2001 From: dre Date: Sat, 3 Jul 2021 23:26:27 +0800 Subject: [PATCH] skeleton and readme --- README.md | 19 ++++++++++++ main.go | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 README.md create mode 100644 main.go diff --git a/README.md b/README.md new file mode 100644 index 0000000..ce69417 --- /dev/null +++ b/README.md @@ -0,0 +1,19 @@ +## md2gmi + +Convert Markdown to Gemini Gemini "gemtext" markup with Go. + +### Usage + +``` +Usage of ./md2gmi: + -in string + specify a .md (Markdown) file to read from, otherwise stdin (default) + -out string + specify a .gmi (gemtext) file to write to, otherwise stdout (default) +``` + +### Example + + go get github.com/n0x1m/md2gmi + cat file.md | md2gmi + md2gmi -in file.md -out file.gmi diff --git a/main.go b/main.go new file mode 100644 index 0000000..dbece47 --- /dev/null +++ b/main.go @@ -0,0 +1,86 @@ +package main + +import ( + "bufio" + "flag" + "fmt" + "io" + "os" +) + +func read(in string, data chan<- []byte) error { + if in != "" { + file, err := os.Open(in) + if err != nil { + return err + } + defer file.Close() + + s := bufio.NewScanner(file) + for s.Scan() { + data <- s.Bytes() + } + + return nil + } + + s := bufio.NewScanner(os.Stdin) + for s.Scan() { + data <- s.Bytes() + } + + return nil +} + +func writer(out string) (io.Writer, error) { + if out != "" { + file, err := os.Open(out) + if err != nil { + return nil, err + } + + return file, nil + } + + return os.Stdout, nil +} + +func write(out string, data <-chan []byte, quit chan struct{}) error { + w, err := writer(out) + if err != nil { + return fmt.Errorf("writer: %w", err) + } + + NewParser(data, w, quit).Parse() + + for { + select { + case <-quit: + return nil + case b := <-data: + fmt.Fprintf(w, string(b)+"\n") + } + } +} + +func main() { + var in, out string + + flag.StringVar(&in, "in", "", "specify a .md (Markdown) file to read from, otherwise stdin (default)") + flag.StringVar(&out, "out", "", "specify a .gmi (gemtext) file to write to, otherwise stdout (default)") + flag.Parse() + + quit := make(chan struct{}) + data := make(chan []byte) + + go func() { + if err := read(in, data); err != nil { + fmt.Fprintf(os.Stderr, err.Error()) + } + close(quit) + }() + + if err := write(out, data, quit); err != nil { + fmt.Fprintf(os.Stderr, err.Error()) + } +}