diff --git a/main.go b/main.go index 45ea7ff..795d4de 100644 --- a/main.go +++ b/main.go @@ -17,36 +17,87 @@ func main() { os.Exit(1) } - text_slice := SplitBySpace(string(input_text)) + // fmt.Println(string(input_text)) - text_slice = FindTriggers(text_slice) + input_text = []byte(FixPunctuation(string(input_text))) // initial punctuation edits - output_text := strings.Join(text_slice, " ") + text_slice := SplitBySpace(string(input_text)) // string to slice of strings - output_text = FixPunctuation(output_text) + text_slice = FindTriggers(text_slice) // find and correct formatting/converting - // os.WriteFile(os.Args[2], output_text, os.ModePerm) + output_text := RemoveDoubleSpaces(strings.Join(text_slice, " ")) // slice back to single string - fmt.Println(string(output_text)) + output_text = FixApostrophes(output_text) // function dealing with apostrophes + + output_text = FixPunctuation(output_text) // final punctuation control + + os.WriteFile(string(os.Args[2]), []byte(string(output_text)), os.ModePerm) + + // fmt.Println(string(output_text)) +} + +func RemoveDoubleSpaces(text string) string { + for x := 0; x < len(text)-1; x++ { + if x < len(text)-1 && rune(text[x]) == 32 && rune(text[x+1]) == 32 { + text = text[:x] + text[x+1:] + x = 0 + } + } + return text } func FixPunctuation(text string) string { - apostrophe_pair := true + text = RemoveDoubleSpaces(text) for i := 0; i < len(text); i++ { + if string(text[i]) == "." || string(text[i]) == "," || string(text[i]) == "!" || + string(text[i]) == "?" || string(text[i]) == ":" || string(text[i]) == ";" { - if strings.ContainsAny(string(text[i]), ".,!?:;") && i > 0 && i > len(text)-1 { - fmt.Println("found sth") - text = strings.TrimPrefix(text[i-1:i+1], " ") // removes single space before punctuation + if i > 0 && string(text[i-1]) == " " { + text = text[:(i-1)] + text[i:] + } + } else if string(text[i]) != " " { + if i > 0 && (string(text[i-1]) == "." || string(text[i-1]) == "," || string(text[i-1]) == "!" || + string(text[i-1]) == "?" || string(text[i-1]) == ":" || string(text[i-1]) == ";") { + text = text[:i] + " " + text[i:] + } + } + } + return text +} + +func FixApostrophes(text string) string { + pair_count := true // after finding first apostrophe will turn false, after second back to true + + for i := 0; i < len(text); i++ { + if string(text[i]) == "'" { - if strings.ContainsAny(string(text[i+1]), ".,!?:;") { + if i > 0 && i < len(text)-1 && string(text[i-1]) != " " && string(text[i+1]) != " " { continue } - if string(text[i+1]) != " " { - text = text[:i+1] + " " + text[i+1:] + + if i < len(text)-2 && string(text[i+1]) == " " && pair_count { + text = text[:i+1] + text[i+2:] + pair_count = false + continue + } + if pair_count { + pair_count = false + continue } + if i > 1 && string(text[i-1]) == " " && !pair_count { + text = text[:i-1] + text[i:] + pair_count = true + } + if !pair_count { + pair_count = true + } + } + } + // if string(text[i]) == "'" && + /* if string(text[i]) == "'" && apostrophe_pair && i > len(text)-1 { fmt.Println("found first apostrophe") text = strings.TrimSuffix(text[i:i+2], " ") @@ -56,33 +107,58 @@ func FixPunctuation(text string) string { fmt.Println("found second apostrophe") text = strings.TrimPrefix(text[i-1:i+1], " ") apostrophe_pair = true - } - } + }*/ return text } -func FindTriggers(slice []string) []string { +func FindTriggers(slice []string) []string { // all of those add extra space when completed (fix implemented) var x int + var z int // how many words to modify for i := range slice { - if slice[i] == "(bin)" || slice[i] == "(hex)" { // ok, except one additional space added + if slice[i] == "(bin)" || slice[i] == "(hex)" { x = Converter(slice[i-1], slice[i]) slice[i-1] = strconv.Itoa(x) slice[i] = "" } - if slice[i] == "(up)" { + + if strings.Contains(string(slice[i]), "(up)") { slice[i-1] = strings.ToUpper(slice[i-1]) - slice[i] = "" + slice[i] = strings.TrimPrefix(slice[i], "(up)") + } + if strings.Contains(string(slice[i]), "(up,") { + z = int(slice[i][5]) - 48 + for a := i - z; a < i; a++ { + slice[a] = strings.ToUpper(slice[a]) + } + slice[i] = slice[i][7:] } - if slice[i] == "(low)" { + + if strings.Contains(string(slice[i]), "(low)") { slice[i-1] = strings.ToLower(slice[i-1]) - slice[i] = "" + slice[i] = strings.TrimPrefix(slice[i], "(low)") } - if slice[i] == "(cap)" { + if strings.Contains(string(slice[i]), "(low,") { + z = int(slice[i][6]) - 48 + for b := i - z; b < i; b++ { + slice[b] = strings.ToLower(slice[b]) + } + slice[i] = slice[i][8:] + } + + if strings.Contains(string(slice[i]), "(cap)") { slice[i-1] = strings.ToUpper(string(slice[i-1][0])) + slice[i-1][1:] - slice[i] = "" + slice[i] = strings.TrimPrefix(slice[i], "(cap)") + } + if strings.Contains(string(slice[i]), "(cap,") { + z = int(slice[i][6]) - 48 + for c := i - z; c < i; c++ { + slice[c] = strings.ToUpper(string(slice[c][0])) + slice[c][1:] + } + slice[i] = slice[i][8:] } - if i+1 != len(slice) && (slice[i] == "a" || slice[i] == "A") { // ok + + if i+1 != len(slice) && (slice[i] == "a" || slice[i] == "A") { if strings.ContainsAny(string(slice[i+1][0]), "aeiouh") { slice[i] += "n" } @@ -102,6 +178,7 @@ func SplitBySpace(text string) []string { if string(text[i]) != separator { str_temp += string(text[i]) } else if str_temp == "(low," || str_temp == "(up," || str_temp == "(cap," { + str_temp += string(text[i]) continue } else { text_slice = append(text_slice, str_temp) @@ -114,7 +191,7 @@ func SplitBySpace(text string) []string { return text_slice } -func Converter(str, system string) int { +func Converter(str, system string) int { // converting ok (input check missing) var x int var base string