82 lines
1.5 KiB
Odin
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
|
|
}
|