From d5b609b6eac5d90f794f52e755109a3a7301a507 Mon Sep 17 00:00:00 2001 From: dre Date: Sat, 3 Jul 2021 23:58:03 +0800 Subject: [PATCH] start state machine parser --- main.go | 9 +-------- parser.go | 48 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+), 8 deletions(-) create mode 100644 parser.go diff --git a/main.go b/main.go index dbece47..051cb55 100644 --- a/main.go +++ b/main.go @@ -53,14 +53,7 @@ func write(out string, data <-chan []byte, quit chan struct{}) error { NewParser(data, w, quit).Parse() - for { - select { - case <-quit: - return nil - case b := <-data: - fmt.Fprintf(w, string(b)+"\n") - } - } + return nil } func main() { diff --git a/parser.go b/parser.go new file mode 100644 index 0000000..cb4757a --- /dev/null +++ b/parser.go @@ -0,0 +1,48 @@ +package main + +import ( + "fmt" + "io" +) + +// state function +type stateFn func(*fsm, []byte) stateFn + +// state machine +type fsm struct { + state stateFn + out io.Writer + quit chan struct{} + data <-chan []byte +} + +func NewParser(data <-chan []byte, writer io.Writer, quit chan struct{}) *fsm { + return &fsm{ + out: writer, + data: data, + quit: quit, + } +} + +func (m *fsm) Parse() { + var buffer []byte + for m.state = initial; m.state != nil; { + select { + case <-m.quit: + m.state = nil + case buffer = <-m.data: + m.state = m.state(m, buffer) + } + } +} + +func initial(m *fsm, data []byte) stateFn { + // TODO + // find linebreaks + // find code fences + // find links + // collapse lists + fmt.Fprintf(m.out, string(data)+"\n") + + return initial +}