mdtoc/main.go

81 lines
1.4 KiB
Go

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 _, value := range file_lines {
if is_heading(value) {
headings = append(headings, heading{value, 0, 0})
}
}
print_toc(headings)
}