skeleton and readme
This commit is contained in:
commit
57896f7dcd
2 changed files with 105 additions and 0 deletions
19
README.md
Normal file
19
README.md
Normal file
|
@ -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
|
86
main.go
Normal file
86
main.go
Normal file
|
@ -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())
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue