package main // TODO: read a file line by line // use heading struct with // line content // line number // heading level import ( "fmt" "log" "os" "strings" ) type heading struct { text string level int line int } func is_heading(line string) bool { if strings.HasPrefix(line, "#") { return true } else { return false } } func get_heading_level(heading_text string) int { level := 0 for i := 0; heading_text[i] == '#'; i++ { level += 1 } return level } func print_toc(headings []heading) { tab_count := 0 for index, _ := range headings { if index > 0 { prev_level := get_heading_level(headings[index-1].text) cur_level := get_heading_level(headings[index].text) headings[index].level = cur_level if cur_level > prev_level { tab_count += (cur_level - prev_level) } else if cur_level < prev_level { tab_count -= (prev_level - cur_level) } for i := 0; i < tab_count; i++ { fmt.Printf("\t") } } fmt.Printf("%v\n", headings[index]) } } func main() { file_content_raw, err := os.ReadFile(os.Args[1]) var headings []heading = nil if err != nil { log.Fatal(err) } var file_content string = string(file_content_raw) file_lines := strings.Split(file_content, "\n") for index, value := range file_lines { if is_heading(value) { headings = append(headings, heading{value, 0, (index + 1)}) } } print_toc(headings) }