mdtoc/main.go

85 lines
1.3 KiB
Go
Raw Normal View History

2024-04-29 09:30:05 +02:00
package main
// TODO: read a file line by line
import (
"fmt"
"log"
"os"
"strings"
)
2024-04-30 10:50:58 +02:00
type heading struct {
text string
level int
line int
}
2024-04-29 09:30:05 +02:00
func is_heading(line string) bool {
if strings.HasPrefix(line, "#") {
return true
} else {
return false
}
}
2024-04-30 10:50:58 +02:00
func get_heading_level(heading_text string) int {
2024-04-29 09:30:05 +02:00
level := 0
2024-04-30 10:50:58 +02:00
for i := 0; heading_text[i] == '#'; i++ {
2024-04-29 09:30:05 +02:00
level += 1
}
return level
}
func count_levels(headings []heading) map[int]int {
level_count := make(map[int]int)
for index, _ := range headings {
switch headings[index].level {
case 1:
level_count[1]++
case 2:
level_count[2]++
case 3:
level_count[3]++
case 4:
level_count[4]++
case 5:
level_count[5]++
case 6:
level_count[6]++
}
}
return level_count
}
2024-04-29 09:30:05 +02:00
func main() {
file_content_raw, err := os.ReadFile(os.Args[1])
2024-04-30 10:50:58 +02:00
var headings []heading = nil
2024-04-29 09:30:05 +02:00
if err != nil {
log.Fatal(err)
}
var file_content string = string(file_content_raw)
file_lines := strings.Split(file_content, "\n")
2024-04-30 10:59:47 +02:00
for index, value := range file_lines {
2024-04-29 09:30:05 +02:00
if is_heading(value) {
headings = append(
headings, heading{value, get_heading_level(value), (index + 1)})
2024-04-29 09:30:05 +02:00
}
}
fmt.Printf("%v\n", headings)
header_level_count := count_levels(headings)
for key, value := range header_level_count {
fmt.Printf("Header %d occurs %d times.\n", key, value)
}
2024-04-29 09:30:05 +02:00
}