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, "", lvl) // strings.write_string(&builder, text) // fmt.sbprintf(&builder, "", lvl) // } else { // strings.write_string(&builder, text) // strings.write_string(&builder, "
") // } // strings.write_string(&builder, "\n") } return token_tree }