diff options
| author | Anhgelus Morhtuuzh <william@herges.fr> | 2025-09-30 17:33:31 +0200 |
|---|---|---|
| committer | Anhgelus Morhtuuzh <william@herges.fr> | 2025-09-30 17:33:31 +0200 |
| commit | c40941359d46468ecd0b71919e34a1c481c7bee2 (patch) | |
| tree | 15a96ebf103c2d861f8a93f23ad96c66ecf4eb35 | |
| parent | de803487db3f02946eee753d50db00e625888049 (diff) | |
feat(markdown): simple ast with header base
| -rw-r--r-- | mardown/ast.go | 51 | ||||
| -rw-r--r-- | mardown/ast_header.go | 25 | ||||
| -rw-r--r-- | mardown/lexer.go | 6 |
3 files changed, 81 insertions, 1 deletions
diff --git a/mardown/ast.go b/mardown/ast.go new file mode 100644 index 0000000..76328f4 --- /dev/null +++ b/mardown/ast.go @@ -0,0 +1,51 @@ +package mardown + +import ( + "errors" + "fmt" +) + +var ErrUnkownLexType = errors.New("unkown lex type") + +type block interface { + Eval() error +} + +type tree struct { + blocks []block +} + +func (t *tree) Eval() error { + return nil +} + +func ast(lxs lexers) (*tree, error) { + tr := new(tree) + for lxs.Next() { + b, err := getBlock(lxs) + if err != nil { + return nil, err + } + tr.blocks = append(tr.blocks, b) + } + return tr, nil +} + +func getBlock(lxs lexers) (block, error) { + var b block + var err error + switch lxs.Current().Type { + case lexerHeader: + b, err = header(lxs) + case lexerBreak: + case lexerExternal: + case lexerModifier: + case lexerCode: + case lexerEscape: + case lexerQuote: + case lexerLiteral: + default: + err = errors.Join(ErrUnkownLexType, fmt.Errorf("type received: %s", lxs.Current().Type)) + } + return b, err +} diff --git a/mardown/ast_header.go b/mardown/ast_header.go new file mode 100644 index 0000000..540f47f --- /dev/null +++ b/mardown/ast_header.go @@ -0,0 +1,25 @@ +package mardown + +type astHeader struct { + level uint + content []block +} + +func (a *astHeader) Eval() error { + return nil +} + +func header(lxs lexers) (block, error) { + b := &astHeader{level: uint(len(lxs.Current().Value))} + for lxs.Next() && lxs.Current().Type != lexerBreak { + bl, err := getBlock(lxs) + if err != nil { + return nil, err + } + if h, ok := bl.(*astHeader); ok { + //TODO: handle + } + b.content = append(b.content, bl) + } + return b, nil +} diff --git a/mardown/lexer.go b/mardown/lexer.go index 62978ab..afac4d7 100644 --- a/mardown/lexer.go +++ b/mardown/lexer.go @@ -32,8 +32,12 @@ type lexers struct { lexers []lexer } -func (l *lexers) Next() lexer { +func (l *lexers) Next() bool { l.current++ + return l.Finished() +} + +func (l *lexers) Current() lexer { return l.lexers[l.current] } |
