aboutsummaryrefslogtreecommitdiff
path: root/mardown
diff options
context:
space:
mode:
authorAnhgelus Morhtuuzh <william@herges.fr>2025-09-30 17:33:31 +0200
committerAnhgelus Morhtuuzh <william@herges.fr>2025-09-30 17:33:31 +0200
commitc40941359d46468ecd0b71919e34a1c481c7bee2 (patch)
tree15a96ebf103c2d861f8a93f23ad96c66ecf4eb35 /mardown
parentde803487db3f02946eee753d50db00e625888049 (diff)
feat(markdown): simple ast with header base
Diffstat (limited to 'mardown')
-rw-r--r--mardown/ast.go51
-rw-r--r--mardown/ast_header.go25
-rw-r--r--mardown/lexer.go6
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]
}