diff --git a/mdbj-migrate/migrate.go b/mdbj-migrate/migrate.go new file mode 100644 index 0000000..8f0cea1 --- /dev/null +++ b/mdbj-migrate/migrate.go @@ -0,0 +1 @@ +package mdbj_migrate diff --git a/mdbj-summary/summary.go b/mdbj-summary/summary.go index 0a6d066..7b67c09 100644 --- a/mdbj-summary/summary.go +++ b/mdbj-summary/summary.go @@ -1,107 +1,32 @@ package main import ( - "io/ioutil" - "log" + "runtime" "os" - "bufio" - "strings" - "fmt" - "regexp" + "github.com/dballard/markdown-bullet-journal/process" ) +type processHandler struct { + File *os.File +} + +func (ph *processHandler) Writeln(line string) { + ph.File.WriteString(line + "\n") +} + func main() { - files, err := ioutil.ReadDir("./") - if err != nil { - log.Fatal(err) + ph := new(processHandler) + + if runtime.GOOS == "windows" { + + } else { + ph.File = os.Stdout } + files := process.GetFiles() for _, file := range files { - if file.Name()[len(file.Name())-3:] == ".md" { - genReport(file) - } + ph.Writeln("") + ph.Writeln(file) + process.ProcessFile(ph, file) } - -} - -func genReport(fileInfo os.FileInfo) { - file, err := os.Open(fileInfo.Name()) - if err != nil { - log.Fatal(err) - } - defer file.Close() - fmt.Println("") - fmt.Println(fileInfo.Name()) - - header := "" - headerPrinted := false - stack := make([]string, 0) - - total := 0 - doneCount := 0 - - scanner := bufio.NewScanner(file) - for scanner.Scan() { - if scanner.Text() == "# Daily Health" { - break - } - if strings.Trim(scanner.Text(), " \t\n\r") == "" { - continue - } - if scanner.Text()[0] == '#' { - header = scanner.Text()[2:] - headerPrinted = false; - continue - } - - startSpaces := regexp.MustCompile("^ *") - indentLevel := len(startSpaces.Find([]byte(scanner.Text())))/4 - todo := false - done := false - if indentLevel < len(stack)-1 { - stack = stack[: indentLevel+1] - } - if indentLevel == len(stack)-1 { - stack[len(stack)-1], todo, done = getText(scanner.Text(), indentLevel) - } - if indentLevel >= len(stack) { - line := "" - line, todo, done = getText(scanner.Text(), indentLevel) - stack = append(stack, line) - } - - if todo { - total += 1 - } - - if done { - if !headerPrinted { - fmt.Println(" # " + header) - headerPrinted = true - } - doneCount += 1 - fmt.Println(" " + strings.Join(stack, " / ")) - } - } - fmt.Println(doneCount, "/", total) -} - -func getText(str string, indentLevel int) (text string, todo bool, done bool) { - //fmt.Printf("indentLevel: %v str: '%s'\n", indentLevel, str ) - if len(str) < (indentLevel*4 +2) { - return "", false, false - } - text = str[indentLevel*4 +2:] - done = false - todo = false - if text[0] == '[' { - todo = true - if text[1] == 'x' || text[1] == 'X' { - done = true - } - if len(text) > 4 { - text = text[4:] - } - } - return } diff --git a/process/process.go b/process/process.go new file mode 100644 index 0000000..7745261 --- /dev/null +++ b/process/process.go @@ -0,0 +1,113 @@ +package process + +import ( + "os" + "log" + "bufio" + "strings" + "regexp" + "io/ioutil" + "strconv" +) + +type ProcessHandler interface { + Writeln(line string) +} + +func GetFiles() (filteredFiles []string) { + // open current directory + files, err := ioutil.ReadDir("./") + if err != nil { + log.Fatal(err) + } + + filteredFiles = []string{} + + // process files of '2*.md' + for _, file := range files { + if file.Name()[0] == '2' && file.Name()[len(file.Name())-3:] == ".md" { + filteredFiles = append(filteredFiles, file.Name()) + } + } + return +} + +func ProcessFile(ph ProcessHandler, fileName string) { + file, err := os.Open(fileName) + if err != nil { + log.Fatal(err) + } + defer file.Close() + + header := "" + headerPrinted := false + stack := make([]string, 0) + + total := 0 + doneCount := 0 + + scanner := bufio.NewScanner(file) + for scanner.Scan() { + if scanner.Text() == "# Daily Health" { + break + } + if strings.Trim(scanner.Text(), " \t\n\r") == "" { + continue + } + if scanner.Text()[0] == '#' { + header = scanner.Text()[2:] + headerPrinted = false; + continue + } + + startSpaces := regexp.MustCompile("^ *") + indentLevel := len(startSpaces.Find([]byte(scanner.Text())))/4 + todo := false + done := false + if indentLevel < len(stack)-1 { + stack = stack[: indentLevel+1] + } + if indentLevel == len(stack)-1 { + stack[len(stack)-1], todo, done = getText(scanner.Text(), indentLevel) + } + if indentLevel >= len(stack) { + line := "" + line, todo, done = getText(scanner.Text(), indentLevel) + stack = append(stack, line) + } + + if todo { + total += 1 + } + + if done { + if !headerPrinted { + ph.Writeln(" # " + header) + headerPrinted = true + } + doneCount += 1 + ph.Writeln(" " + strings.Join(stack, " / ")) + } + } + ph.Writeln(strconv.Itoa(doneCount) + " / " + strconv.Itoa(total)) +} + +func getText(str string, indentLevel int) (text string, todo bool, done bool) { + //fmt.Printf("indentLevel: %v str: '%s'\n", indentLevel, str ) + if len(str) < (indentLevel*4 +2) { + return "", false, false + } + text = str[indentLevel*4 +2:] + done = false + todo = false + if text[0] == '[' { + todo = true + if text[1] == 'x' || text[1] == 'X' { + done = true + } + if len(text) > 4 { + text = text[4:] + } + } + return +} \ No newline at end of file