diff --git a/README.tlm b/README.tlm index d57942d..c2db2bf 100644 --- a/README.tlm +++ b/README.tlm @@ -28,12 +28,12 @@ The **VARIABLE** is $(variable) - List item 1 . List item 2 -1. Ordered list item [#1] +1. Ordered list item [&1] > This is a sample blockquote > Bon apetit! -Text under a blockquote [#named] +Text under a blockquote [&named] **This *is* bold *and* italics *mixed** TOGETHER* @@ -56,8 +56,8 @@ Here is some __underlined__ text [Go to Top](#Heading) -[&1] Ordered list item 2 not included -[&named] This is the definition for a named footnote +[&&1] Ordered list item 2 not included +[&&named] This is the definition for a named footnote !! Variable demo diff --git a/src/html.odin b/src/html.odin index f063879..216453b 100644 --- a/src/html.odin +++ b/src/html.odin @@ -2,6 +2,7 @@ package main import "core:fmt" import "core:strings" +import "core:unicode" escape_html :: proc(s: string, allocator := context.temp_allocator) -> string { b := strings.builder_make(allocator) @@ -62,8 +63,30 @@ check_only_var_defs :: proc(token: ^Token) -> bool { } slugifyifyifyify :: proc(text: string) -> string { - lower := strings.to_lower(text, context.temp_allocator) - res, _ := strings.replace_all(lower, " ", "-", context.temp_allocator) + b := strings.builder_make(context.temp_allocator) + + for ch in text { + lower_ch := unicode.to_lower(ch) + + if unicode.is_letter(lower_ch) || unicode.is_digit(lower_ch) { + strings.write_rune(&b, lower_ch) + } else if lower_ch == ' ' || lower_ch == '_' || lower_ch == '-' { + strings.write_rune(&b, '-') + } + } + + res := strings.to_string(b) + + for { + new_res, replaced := strings.replace_all(res, "--", "-", context.temp_allocator) + if !replaced { + break + } + res = new_res + } + + res = strings.trim(res, "-") + return res } @@ -91,7 +114,7 @@ print_html :: proc(token: ^Token) { } slug := slugifyifyifyify(strings.to_string(b)) - fmt.printf("", level, slug) + fmt.printf("", level, escape_html(slug)) for child in token.children { print_html(child) } diff --git a/src/parser.odin b/src/parser.odin index debd893..3bd1f8c 100644 --- a/src/parser.odin +++ b/src/parser.odin @@ -1,6 +1,5 @@ package main -import "core:fmt" import "core:strconv" import "core:strings" @@ -161,10 +160,10 @@ parse_header :: proc(line: string) -> (int, string) { } parse_footnote_def :: proc(line: string) -> (string, string, bool) { - if strings.has_prefix(line, "[&") { + if strings.has_prefix(line, "[&&") { idx := strings.index_byte(line, ']') if idx != -1 { - id := line[2:idx] + id := line[3:idx] text := strings.trim_space(line[idx + 1:]) return id, text, true } @@ -335,7 +334,7 @@ parse_inline_footnotes :: proc(token: ^Token) { return } - start_idx := strings.index(str, "[#") + start_idx := strings.index(str, "[&") if start_idx == -1 { return } @@ -1042,10 +1041,10 @@ parse :: proc(lines: []string, allocator := context.allocator) -> Token { for token in root.children { parse_inline_code(token) + parse_inline_footnotes(token) parse_links(token) parse_variables(token) parse_embeds(token) - parse_inline_footnotes(token) pass_through_children(token) }