diff options
author | Péter Szilágyi <peterke@gmail.com> | 2016-06-09 20:42:17 +0800 |
---|---|---|
committer | Péter Szilágyi <peterke@gmail.com> | 2016-06-09 20:42:17 +0800 |
commit | 6886913fdf7feaf39c49f1afebae1ef8ea10b514 (patch) | |
tree | ec094a0083ac6747a38be2d5757f5a76b788f3cf /console/console.go | |
parent | c75d3b0ede005afc30aaa61f27bb5bbe2cf6a3f1 (diff) | |
parent | dbcdf83ed8aca3f0b84d67b944fff2f3a8bc7769 (diff) | |
download | dexon-6886913fdf7feaf39c49f1afebae1ef8ea10b514.tar dexon-6886913fdf7feaf39c49f1afebae1ef8ea10b514.tar.gz dexon-6886913fdf7feaf39c49f1afebae1ef8ea10b514.tar.bz2 dexon-6886913fdf7feaf39c49f1afebae1ef8ea10b514.tar.lz dexon-6886913fdf7feaf39c49f1afebae1ef8ea10b514.tar.xz dexon-6886913fdf7feaf39c49f1afebae1ef8ea10b514.tar.zst dexon-6886913fdf7feaf39c49f1afebae1ef8ea10b514.zip |
Merge pull request #2670 from bas-vk/indent
Ignore round and curly brackets in strings for indentation level
Diffstat (limited to 'console/console.go')
-rw-r--r-- | console/console.go | 47 |
1 files changed, 45 insertions, 2 deletions
diff --git a/console/console.go b/console/console.go index ab0c1ea58..00d1fea1d 100644 --- a/console/console.go +++ b/console/console.go @@ -331,11 +331,11 @@ func (c *Console) Interactive() { // Append the line to the input and check for multi-line interpretation input += line + "\n" - indents = strings.Count(input, "{") + strings.Count(input, "(") - strings.Count(input, "}") - strings.Count(input, ")") + indents = countIndents(input) if indents <= 0 { prompt = c.prompt } else { - prompt = strings.Repeat("..", indents*2) + " " + prompt = strings.Repeat(".", indents*3) + " " } // If all the needed lines are present, save the command and run if indents <= 0 { @@ -354,6 +354,49 @@ func (c *Console) Interactive() { } } +// countIndents returns the number of identations for the given input. +// In case of invalid input such as var a = } the result can be negative. +func countIndents(input string) int { + var ( + indents = 0 + inString = false + strOpenChar = ' ' // keep track of the string open char to allow var str = "I'm ...."; + charEscaped = false // keep track if the previous char was the '\' char, allow var str = "abc\"def"; + ) + + for _, c := range input { + switch c { + case '\\': + // indicate next char as escaped when in string and previous char isn't escaping this backslash + if !charEscaped && inString { + charEscaped = true + } + case '\'', '"': + if inString && !charEscaped && strOpenChar == c { // end string + inString = false + } else if !inString && !charEscaped { // begin string + inString = true + strOpenChar = c + } + charEscaped = false + case '{', '(': + if !inString { // ignore brackets when in string, allow var str = "a{"; without indenting + indents++ + } + charEscaped = false + case '}', ')': + if !inString { + indents-- + } + charEscaped = false + default: + charEscaped = false + } + } + + return indents +} + // Execute runs the JavaScript file specified as the argument. func (c *Console) Execute(path string) error { return c.jsre.Exec(path) |