copy qmlfmt over from cwtch.im/ui/cmd/qmlfmt

This commit is contained in:
Dan Ballard 2020-05-20 14:44:58 -07:00
commit fbfe9d6edf
2 changed files with 94 additions and 0 deletions

3
README.md Normal file
View File

@ -0,0 +1,3 @@
# qmlfmt
`qmlfmt` in place edits the qml files specified on the command line applying fixed 4 space indent rules to them. This simple tool is aimed at projects working with QML but not using QT Creator so not benefiting from it's auto formating.

91
qmlfmt.go Normal file
View File

@ -0,0 +1,91 @@
package main
import (
"bufio"
"log"
"os"
"strings"
)
const (
indent = " "
)
func main() {
if len(os.Args) < 2 {
log.Fatal("Required argument(s): filename(s)")
}
for _, filename := range os.Args[1:] {
processFile(filename)
}
}
func processFile(filename string) {
file, err := os.Open(filename)
if err != nil {
log.Fatalf("Could not read file %v: %v\n", filename, err)
}
scanner := bufio.NewScanner(file)
var lines []string
for scanner.Scan() {
lines = append(lines, scanner.Text())
}
file.Close()
file, err = os.Create(filename)
defer file.Close()
if err != nil {
log.Fatalf("Could not write to file %v: %v\n", filename, err)
}
indentCount := 0
inMultiLineComment := false
for ln, line := range lines {
singleCommentPos := strings.Index(line, "//")
multiLineCommentStartPos := strings.Index(line, "/*")
multiLineCommentEndPos := strings.Index(line, "*/")
openPos := strings.Index(line, "{")
closePos := strings.Index(line, "}")
if !inMultiLineComment && closePos > -1 && (openPos == -1 || openPos > closePos) && (singleCommentPos == -1 || closePos < singleCommentPos) &&
(multiLineCommentStartPos == -1 || closePos < multiLineCommentStartPos) &&
(multiLineCommentEndPos == -1 || closePos > multiLineCommentEndPos) {
indentCount--
}
trimedLine := strings.Trim(line, " \t")
if trimedLine == "" {
file.Write([]byte("\n"))
} else {
if indentCount < 0 {
log.Fatalf("indent Count negative in %v at line %v\n", filename, ln)
}
file.Write([]byte(strings.Repeat(indent, indentCount) + trimedLine + "\n"))
}
if !inMultiLineComment && openPos > -1 && (closePos == -1 || openPos > closePos) && (singleCommentPos == -1 || openPos < singleCommentPos) &&
(multiLineCommentStartPos == -1 || openPos < multiLineCommentStartPos) &&
(multiLineCommentEndPos == -1 || openPos > multiLineCommentEndPos) {
indentCount++
}
if multiLineCommentStartPos > -1 {
inMultiLineComment = true
}
if multiLineCommentEndPos > -1 {
inMultiLineComment = false
}
}
}