md2gmi/main.go

110 lines
1.6 KiB
Go
Raw Normal View History

2021-07-03 18:26:27 +03:00
package main
import (
"bufio"
"flag"
"fmt"
"io"
"os"
)
2021-07-04 07:43:13 +03:00
func reader(in string) (io.Reader, error) {
2021-07-03 18:26:27 +03:00
if in != "" {
file, err := os.Open(in)
if err != nil {
2021-07-04 07:43:13 +03:00
return nil, err
2021-07-03 18:26:27 +03:00
}
2021-07-04 07:43:13 +03:00
return file, nil
2021-07-03 18:26:27 +03:00
}
2021-07-04 07:43:13 +03:00
return os.Stdin, nil
2021-07-03 18:26:27 +03:00
}
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
}
2021-07-04 07:31:51 +03:00
func write(w io.Writer, b []byte) {
fmt.Fprintf(w, string(b))
}
2021-07-04 07:43:13 +03:00
type ir struct {
r io.Reader
quit chan struct{}
}
func NewIr(r io.Reader, quit chan struct{}) *ir {
return &ir{r: r, quit: quit}
}
func (m *ir) Output() chan []byte {
data := make(chan []byte)
s := bufio.NewScanner(m.r)
go func() {
for s.Scan() {
data <- s.Bytes()
}
close(m.quit)
}()
return data
}
2021-07-04 07:31:51 +03:00
type ow struct {
w io.Writer
quit chan struct{}
}
func NewOw(w io.Writer, quit chan struct{}) *ow {
return &ow{w: w, quit: quit}
}
2021-07-04 07:43:13 +03:00
func (m *ow) Input(data chan []byte) {
2021-07-04 07:31:51 +03:00
for {
select {
case <-m.quit:
return
case b := <-data:
write(m.w, b)
}
}
}
2021-07-03 18:26:27 +03:00
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{})
2021-07-04 07:43:13 +03:00
r, err := reader(in)
if err != nil {
fmt.Fprint(os.Stderr, err.Error())
os.Exit(1)
}
2021-07-03 18:26:27 +03:00
2021-07-04 07:43:13 +03:00
w, err := writer(out)
if err != nil {
fmt.Fprint(os.Stderr, err.Error())
os.Exit(1)
2021-07-03 18:26:27 +03:00
}
2021-07-04 07:43:13 +03:00
source := NewIr(r, quit)
sink := NewOw(w, quit)
sink.Input(source.Output())
//NewParser(data, w, quit).Parse()
2021-07-03 18:26:27 +03:00
}