commit 7f49aac0cc566c679804b96288f8193410d92894 Author: bjt-user Date: Mon Apr 29 09:30:05 2024 +0200 initial commit diff --git a/main b/main new file mode 100755 index 0000000..ec2ed2b Binary files /dev/null and b/main differ diff --git a/main.go b/main.go new file mode 100644 index 0000000..62edd39 --- /dev/null +++ b/main.go @@ -0,0 +1,72 @@ +package main + +// TODO: read a file line by line +// use heading struct with +// line content +// line number +// heading level + +import ( + "fmt" + "log" + "os" + "strings" +) + +func is_heading(line string) bool { + if strings.HasPrefix(line, "#") { + return true + } else { + return false + } +} + +func get_heading_level(heading string) int { + level := 0 + for i := 0; heading[i] == '#'; i++ { + level += 1 + } + return level +} + +func print_toc(headings []string) { + tab_count := 0 + for index, value := range headings { + if index > 0 { + prev_level := get_heading_level(headings[index-1]) + cur_level := get_heading_level(headings[index]) + + 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("%s\n", value) + } +} + +func main() { + file_content_raw, err := os.ReadFile(os.Args[1]) + + var headings []string = 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, value) + } + } + + print_toc(headings) +} diff --git a/test.md b/test.md new file mode 100644 index 0000000..de8c530 --- /dev/null +++ b/test.md @@ -0,0 +1,31 @@ +# test markdown doc + +## header2 + +#### header4 + +some text. + +```bash +echo 'hi' +``` + +#### another header4 + +more text. + +####third header4 + +####fourth #header4 + + ## this is not a header anymore + +##### header5 + +## a second header2 + +#### testing + +``` +cool code +``` diff --git a/tests/README.md b/tests/README.md new file mode 100644 index 0000000..104b2d8 --- /dev/null +++ b/tests/README.md @@ -0,0 +1,57 @@ +# yamlfmt + +`yamlfmt` is an extensible command line tool or library to format yaml files. + +## Goals + +* Create a command line yaml formatting tool that is easy to distribute (single binary) +* Make it simple to extend with new custom formatters +* Enable alternative use as a library, providing a foundation for users to create a tool that meets specific needs + +## Maintainers + +This tool is not yet officially supported by Google. It is currently maintained solely by @braydonk, and unless something changes primarily in spare time. + +## Blog + +I'm going to use these links to GitHub Discussions as a blog of sorts, until I can set up something more proper: +* yamlfmt's recent slow development [#149](https://github.com/google/yamlfmt/discussions/149) +* Issues related to the yaml.v3 library [#148](https://github.com/google/yamlfmt/discussions/148) + +## Installation + +To download the `yamlfmt` command, you can download the desired binary from releases or install the module directly: +``` +go install github.com/google/yamlfmt/cmd/yamlfmt@latest +``` +This currently requires Go version 1.18 or greater. + +NOTE: Recommended setup if this is your first time installing Go would be in [this DigitalOcean blog post](https://www.digitalocean.com/community/tutorials/how-to-build-and-install-go-programs). + +You can also download the binary you want from releases. The binary is self-sufficient with no dependencies, and can simply be put somewhere on your PATH and run with the command `yamlfmt`. + +You can also install the command as a [pre-commit](https://pre-commit.com/) hook. See the [pre-commit hook](./docs/pre-commit.md) docs for instructions. + +## Basic Usage + +See [Command Usage](./docs/command-usage.md) for in-depth information and available flags. + +To run the tool with all default settings, run the command with a path argument: +```bash +yamlfmt x.yaml y.yaml <...> +``` +You can specify as many paths as you want. You can also specify a directory which will be searched recursively for any files with the extension `.yaml` or `.yml`. +```bash +yamlfmt . +``` + +You can also use an alternate mode that will search paths with doublestar globs by supplying the `-dstar` flag. +```bash +yamlfmt -dstar **/*.{yaml,yml} +``` +See the [doublestar](https://github.com/bmatcuk/doublestar) package for more information on this format. + +# Configuration File + +The `yamlfmt` command can be configured through a yaml file called `.yamlfmt`. This file can live in your working directory, a path specified through a [CLI flag](./docs/command-usage.md#operation-flags), or in the standard global config path on your system (see docs for specifics). +For in-depth configuration documentation see [Config](docs/config-file.md).