Files
TypoML/src/parser.odin
T
2026-07-13 14:26:07 +02:00

82 lines
1.5 KiB
Odin

package main
import "core:fmt"
import "core:strings"
TokenType :: enum {
Text,
Italics,
Bold,
BreakLine,
Heading,
}
TokenMode :: enum {
Start,
End,
}
TokenValue :: union {
string,
int,
TokenMode,
}
Token :: struct {
type: TokenType,
value: TokenValue,
child: [dynamic]Token,
}
token_tree := [dynamic]Token{}
replace_text :: proc(text: string, start: int, len_: int, repl: string) -> string {
builder := strings.builder_make(context.temp_allocator)
strings.write_string(&builder, text[:start])
strings.write_string(&builder, repl)
strings.write_string(&builder, text[start + len_:])
return strings.to_string(builder)
}
parse_header :: proc(line: string) -> (int, string) {
if len(line) == 0 {
return 0, line
}
lvl := 0
for lvl < len(line) && line[lvl] == '!' {
lvl += 1
}
if lvl == 0 || lvl >= len(line) || line[lvl] != ' ' {
return 0, line
}
return lvl, line[lvl + 1:]
}
parse :: proc(lines: []string, allocator := context.allocator) -> [dynamic]Token {
for untrimmed_line in lines {
line := strings.trim_space(untrimmed_line)
if len(line) == 0 {
append(&token_tree, Token{TokenType.BreakLine, TokenMode.Start, nil})
continue
}
// lvl, text := parse_header(trimmed)
// is_header := lvl > 0
// if is_header {
// fmt.sbprintf(&builder, "<h%d>", lvl)
// strings.write_string(&builder, text)
// fmt.sbprintf(&builder, "</h%d>", lvl)
// } else {
// strings.write_string(&builder, text)
// strings.write_string(&builder, "<br>")
// }
// strings.write_string(&builder, "\n")
}
return token_tree
}