mirror of https://github.com/Hilbis/Hilbish
152 lines
3.7 KiB
Go
152 lines
3.7 KiB
Go
|
package completers
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"strings"
|
||
|
|
||
|
"github.com/jessevdk/go-flags"
|
||
|
|
||
|
"github.com/maxlandon/readline"
|
||
|
)
|
||
|
|
||
|
// SyntaxHighlighter - Entrypoint to all input syntax highlighting in the Wiregost console
|
||
|
func (c *CommandCompleter) SyntaxHighlighter(input []rune) (line string) {
|
||
|
|
||
|
// Format and sanitize input
|
||
|
args, last, lastWord := formatInputHighlighter(input)
|
||
|
|
||
|
// Remain is all arguments that have not been highlighted, we need it for completing long commands
|
||
|
var remain = args
|
||
|
|
||
|
// Detect base command automatically
|
||
|
var command = c.detectedCommand(args)
|
||
|
|
||
|
// Return input as is
|
||
|
if noCommandOrEmpty(remain, last, command) {
|
||
|
return string(input)
|
||
|
}
|
||
|
|
||
|
// Base command
|
||
|
if commandFound(command) {
|
||
|
line, remain = highlightCommand(remain, command)
|
||
|
|
||
|
// SubCommand
|
||
|
if sub, ok := subCommandFound(lastWord, args, command); ok {
|
||
|
line, remain = highlightSubCommand(line, remain, sub)
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
line = processRemain(line, remain)
|
||
|
|
||
|
return
|
||
|
}
|
||
|
|
||
|
func highlightCommand(args []string, command *flags.Command) (line string, remain []string) {
|
||
|
line = readline.BOLD + args[0] + readline.RESET + " "
|
||
|
remain = args[1:]
|
||
|
return
|
||
|
}
|
||
|
|
||
|
func highlightSubCommand(input string, args []string, command *flags.Command) (line string, remain []string) {
|
||
|
line = input
|
||
|
line += readline.BOLD + args[0] + readline.RESET + " "
|
||
|
remain = args[1:]
|
||
|
return
|
||
|
}
|
||
|
|
||
|
func processRemain(input string, remain []string) (line string) {
|
||
|
|
||
|
// Check the last is not the last space in input
|
||
|
if len(remain) == 1 && remain[0] == " " {
|
||
|
return input
|
||
|
}
|
||
|
|
||
|
line = input + strings.Join(remain, " ")
|
||
|
// line = processEnvVars(input, remain)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// processEnvVars - Highlights environment variables. NOTE: Rewrite with logic from console/env.go
|
||
|
func processEnvVars(input string, remain []string) (line string) {
|
||
|
|
||
|
var processed []string
|
||
|
|
||
|
inputSlice := strings.Split(input, " ")
|
||
|
|
||
|
// Check already processed input
|
||
|
for _, arg := range inputSlice {
|
||
|
if arg == "" || arg == " " {
|
||
|
continue
|
||
|
}
|
||
|
if strings.HasPrefix(arg, "$") { // It is an env var.
|
||
|
if args := strings.Split(arg, "/"); len(args) > 1 {
|
||
|
for _, a := range args {
|
||
|
fmt.Println(a)
|
||
|
if strings.HasPrefix(a, "$") && a != " " { // It is an env var.
|
||
|
processed = append(processed, "\033[38;5;108m"+readline.DIM+a+readline.RESET)
|
||
|
continue
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
processed = append(processed, "\033[38;5;108m"+readline.DIM+arg+readline.RESET)
|
||
|
continue
|
||
|
}
|
||
|
processed = append(processed, arg)
|
||
|
}
|
||
|
|
||
|
// Check remaining args (non-processed)
|
||
|
for _, arg := range remain {
|
||
|
if arg == "" {
|
||
|
continue
|
||
|
}
|
||
|
if strings.HasPrefix(arg, "$") && arg != "$" { // It is an env var.
|
||
|
var full string
|
||
|
args := strings.Split(arg, "/")
|
||
|
if len(args) == 1 {
|
||
|
if strings.HasPrefix(args[0], "$") && args[0] != "" && args[0] != "$" { // It is an env var.
|
||
|
full += "\033[38;5;108m" + readline.DIM + args[0] + readline.RESET
|
||
|
continue
|
||
|
}
|
||
|
}
|
||
|
if len(args) > 1 {
|
||
|
var counter int
|
||
|
for _, arg := range args {
|
||
|
// If var is an env var
|
||
|
if strings.HasPrefix(arg, "$") && arg != "" && arg != "$" {
|
||
|
if counter < len(args)-1 {
|
||
|
full += "\033[38;5;108m" + readline.DIM + args[0] + readline.RESET + "/"
|
||
|
counter++
|
||
|
continue
|
||
|
}
|
||
|
if counter == len(args)-1 {
|
||
|
full += "\033[38;5;108m" + readline.DIM + args[0] + readline.RESET
|
||
|
counter++
|
||
|
continue
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Else, if we are not at the end of array
|
||
|
if counter < len(args)-1 && arg != "" {
|
||
|
full += arg + "/"
|
||
|
counter++
|
||
|
}
|
||
|
if counter == len(args)-1 {
|
||
|
full += arg
|
||
|
counter++
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
// Else add first var
|
||
|
processed = append(processed, full)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
line = strings.Join(processed, " ")
|
||
|
|
||
|
// Very important, keeps the line clear when erasing
|
||
|
// line += " "
|
||
|
|
||
|
return
|
||
|
}
|