mirror of
https://github.com/jesseduffield/lazygit.git
synced 2024-11-26 09:00:57 +02:00
Switched back to github.com/mgutz/str instaid of a copy of ToArgv
This commit is contained in:
parent
500267417b
commit
834e42897d
@ -11,6 +11,7 @@ import (
|
||||
"unicode/utf8"
|
||||
|
||||
"github.com/kr/pty"
|
||||
"github.com/mgutz/str"
|
||||
)
|
||||
|
||||
// RunCommandWithOutputLiveWrapper runs a command and return every word that gets written in stdout
|
||||
@ -21,7 +22,7 @@ import (
|
||||
func RunCommandWithOutputLiveWrapper(c *OSCommand, command string, output func(string) string) (errorMessage string, codeError error) {
|
||||
cmdOutput := []string{}
|
||||
|
||||
splitCmd := ToArgv(command)
|
||||
splitCmd := str.ToArgv(command)
|
||||
cmd := exec.Command(splitCmd[0], splitCmd[1:]...)
|
||||
|
||||
cmd.Env = os.Environ()
|
||||
|
@ -9,6 +9,7 @@ import (
|
||||
|
||||
"github.com/jesseduffield/lazygit/pkg/config"
|
||||
"github.com/jesseduffield/lazygit/pkg/utils"
|
||||
"github.com/mgutz/str"
|
||||
"github.com/sirupsen/logrus"
|
||||
gitconfig "github.com/tcnksm/go-gitconfig"
|
||||
)
|
||||
@ -49,7 +50,7 @@ func NewOSCommand(log *logrus.Entry, config config.AppConfigurer) *OSCommand {
|
||||
// RunCommandWithOutput wrapper around commands returning their output and error
|
||||
func (c *OSCommand) RunCommandWithOutput(command string) (string, error) {
|
||||
c.Log.WithField("command", command).Info("RunCommand")
|
||||
splitCmd := ToArgv(command)
|
||||
splitCmd := str.ToArgv(command)
|
||||
c.Log.Info(splitCmd)
|
||||
return sanitisedCommandOutput(
|
||||
c.command(splitCmd[0], splitCmd[1:]...).CombinedOutput(),
|
||||
|
@ -1,114 +0,0 @@
|
||||
// ToArgv is copied from github.com/mgutz/str
|
||||
|
||||
package commands
|
||||
|
||||
import "runtime"
|
||||
|
||||
// ToArgv converts string s into an argv for exec.
|
||||
func ToArgv(s string) []string {
|
||||
const (
|
||||
InArg = iota
|
||||
InArgQuote
|
||||
OutOfArg
|
||||
)
|
||||
currentState := OutOfArg
|
||||
currentQuoteChar := "\x00" // to distinguish between ' and " quotations
|
||||
// this allows to use "foo'bar"
|
||||
currentArg := ""
|
||||
argv := []string{}
|
||||
|
||||
isQuote := func(c string) bool {
|
||||
return c == `"` || c == `'`
|
||||
}
|
||||
|
||||
isEscape := func(c string) bool {
|
||||
return c == `\`
|
||||
}
|
||||
|
||||
isWhitespace := func(c string) bool {
|
||||
return c == " " || c == "\t"
|
||||
}
|
||||
|
||||
L := len(s)
|
||||
for i := 0; i < L; i++ {
|
||||
c := s[i : i+1]
|
||||
|
||||
//fmt.Printf("c %s state %v arg %s argv %v i %d\n", c, currentState, currentArg, args, i)
|
||||
if isQuote(c) {
|
||||
switch currentState {
|
||||
case OutOfArg:
|
||||
currentArg = ""
|
||||
fallthrough
|
||||
case InArg:
|
||||
currentState = InArgQuote
|
||||
currentQuoteChar = c
|
||||
|
||||
case InArgQuote:
|
||||
if c == currentQuoteChar {
|
||||
currentState = InArg
|
||||
} else {
|
||||
currentArg += c
|
||||
}
|
||||
}
|
||||
|
||||
} else if isWhitespace(c) {
|
||||
switch currentState {
|
||||
case InArg:
|
||||
argv = append(argv, currentArg)
|
||||
currentState = OutOfArg
|
||||
case InArgQuote:
|
||||
currentArg += c
|
||||
case OutOfArg:
|
||||
// nothing
|
||||
}
|
||||
|
||||
} else if isEscape(c) {
|
||||
switch currentState {
|
||||
case OutOfArg:
|
||||
currentArg = ""
|
||||
currentState = InArg
|
||||
fallthrough
|
||||
case InArg:
|
||||
fallthrough
|
||||
case InArgQuote:
|
||||
if i == L-1 {
|
||||
if runtime.GOOS == "windows" {
|
||||
// just add \ to end for windows
|
||||
currentArg += c
|
||||
} else {
|
||||
panic("Escape character at end string")
|
||||
}
|
||||
} else {
|
||||
if runtime.GOOS == "windows" {
|
||||
peek := s[i+1 : i+2]
|
||||
if peek != `"` {
|
||||
currentArg += c
|
||||
}
|
||||
} else {
|
||||
i++
|
||||
c = s[i : i+1]
|
||||
currentArg += c
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
switch currentState {
|
||||
case InArg, InArgQuote:
|
||||
currentArg += c
|
||||
|
||||
case OutOfArg:
|
||||
currentArg = ""
|
||||
currentArg += c
|
||||
currentState = InArg
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if currentState == InArg {
|
||||
argv = append(argv, currentArg)
|
||||
} else if currentState == InArgQuote {
|
||||
panic("Starting quote has no ending quote.")
|
||||
}
|
||||
|
||||
return argv
|
||||
}
|
5
vendor/github.com/mgutz/str/CREDITS
generated
vendored
Normal file
5
vendor/github.com/mgutz/str/CREDITS
generated
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
* [string.js](http://stringjs.com) - I contributed several
|
||||
functions to this project.
|
||||
|
||||
* [bbgen.net](http://bbgen.net/blog/2011/06/string-to-argc-argv/)
|
||||
|
21
vendor/github.com/mgutz/str/LICENSE
generated
vendored
Normal file
21
vendor/github.com/mgutz/str/LICENSE
generated
vendored
Normal file
@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2013-2014 Mario L. Gutierrez <mario@mgutz.com>
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
this software and associated documentation files (the "Software"), to deal in
|
||||
the Software without restriction, including without limitation the rights to
|
||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||
of the Software, and to permit persons to whom the Software is furnished to do
|
||||
so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
649
vendor/github.com/mgutz/str/README.md
generated
vendored
Normal file
649
vendor/github.com/mgutz/str/README.md
generated
vendored
Normal file
@ -0,0 +1,649 @@
|
||||
# str
|
||||
|
||||
import "github.com/mgutz/str"
|
||||
|
||||
Package str is a comprehensive set of string functions to build more Go
|
||||
awesomeness. Str complements Go's standard packages and does not duplicate
|
||||
functionality found in `strings` or `strconv`.
|
||||
|
||||
Str is based on plain functions instead of object-based methods, consistent with
|
||||
Go standard string packages.
|
||||
|
||||
str.Between("<a>foo</a>", "<a>", "</a>") == "foo"
|
||||
|
||||
Str supports pipelining instead of chaining
|
||||
|
||||
s := str.Pipe("\nabcdef\n", Clean, BetweenF("a", "f"), ChompLeftF("bc"))
|
||||
|
||||
User-defined filters can be added to the pipeline by inserting a function or
|
||||
closure that returns a function with this signature
|
||||
|
||||
func(string) string
|
||||
|
||||
### Index
|
||||
|
||||
* [Variables](#variables)
|
||||
* [func Between](#func
|
||||
[godoc](https://godoc.org/github.com/mgutz/str)
|
||||
between)
|
||||
* [func BetweenF](#func--betweenf)
|
||||
* [func Camelize](#func--camelize)
|
||||
* [func Capitalize](#func--capitalize)
|
||||
* [func CharAt](#func--charat)
|
||||
* [func CharAtF](#func--charatf)
|
||||
* [func ChompLeft](#func--chompleft)
|
||||
* [func ChompLeftF](#func--chompleftf)
|
||||
* [func ChompRight](#func--chompright)
|
||||
* [func ChompRightF](#func--chomprightf)
|
||||
* [func Classify](#func--classify)
|
||||
* [func ClassifyF](#func--classifyf)
|
||||
* [func Clean](#func--clean)
|
||||
* [func Dasherize](#func--dasherize)
|
||||
* [func DecodeHTMLEntities](#func--decodehtmlentities)
|
||||
* [func EnsurePrefix](#func--ensureprefix)
|
||||
* [func EnsurePrefixF](#func--ensureprefixf)
|
||||
* [func EnsureSuffix](#func--ensuresuffix)
|
||||
* [func EnsureSuffixF](#func--ensuresuffixf)
|
||||
* [func EscapeHTML](#func--escapehtml)
|
||||
* [func Humanize](#func--humanize)
|
||||
* [func Iif](#func--iif)
|
||||
* [func IndexOf](#func--indexof)
|
||||
* [func IsAlpha](#func--isalpha)
|
||||
* [func IsAlphaNumeric](#func--isalphanumeric)
|
||||
* [func IsEmpty](#func--isempty)
|
||||
* [func IsLower](#func--islower)
|
||||
* [func IsNumeric](#func--isnumeric)
|
||||
* [func IsUpper](#func--isupper)
|
||||
* [func Left](#func--left)
|
||||
* [func LeftF](#func--leftf)
|
||||
* [func LeftOf](#func--leftof)
|
||||
* [func Letters](#func--letters)
|
||||
* [func Lines](#func--lines)
|
||||
* [func Map](#func--map)
|
||||
* [func Match](#func--match)
|
||||
* [func Pad](#func--pad)
|
||||
* [func PadF](#func--padf)
|
||||
* [func PadLeft](#func--padleft)
|
||||
* [func PadLeftF](#func--padleftf)
|
||||
* [func PadRight](#func--padright)
|
||||
* [func PadRightF](#func--padrightf)
|
||||
* [func Pipe](#func--pipe)
|
||||
* [func QuoteItems](#func--quoteitems)
|
||||
* [func ReplaceF](#func--replacef)
|
||||
* [func ReplacePattern](#func--replacepattern)
|
||||
* [func ReplacePatternF](#func--replacepatternf)
|
||||
* [func Reverse](#func--reverse)
|
||||
* [func Right](#func--right)
|
||||
* [func RightF](#func--rightf)
|
||||
* [func RightOf](#func--rightof)
|
||||
* [func SetTemplateDelimiters](#func--settemplatedelimiters)
|
||||
* [func Slice](#func--slice)
|
||||
* [func SliceContains](#func--slicecontains)
|
||||
* [func SliceF](#func--slicef)
|
||||
* [func SliceIndexOf](#func--sliceindexof)
|
||||
* [func Slugify](#func--slugify)
|
||||
* [func StripPunctuation](#func--strippunctuation)
|
||||
* [func StripTags](#func--striptags)
|
||||
* [func Substr](#func--substr)
|
||||
* [func SubstrF](#func--substrf)
|
||||
* [func Template](#func--template)
|
||||
* [func TemplateDelimiters](#func--templatedelimiters)
|
||||
* [func TemplateWithDelimiters](#func--templatewithdelimiters)
|
||||
* [func ToArgv](#func--toargv)
|
||||
* [func ToBool](#func--tobool)
|
||||
* [func ToBoolOr](#func--toboolor)
|
||||
* [func ToFloat32Or](#func--tofloat32or)
|
||||
* [func ToFloat64Or](#func--tofloat64or)
|
||||
* [func ToIntOr](#func--tointor)
|
||||
* [func Underscore](#func--underscore)
|
||||
* [func UnescapeHTML](#func--unescapehtml)
|
||||
* [func WrapHTML](#func--wraphtml)
|
||||
* [func WrapHTMLF](#func--wraphtmlf)
|
||||
|
||||
|
||||
#### Variables
|
||||
|
||||
```go
|
||||
var ToFloatOr = ToFloat64Or
|
||||
```
|
||||
ToFloatOr parses as a float64 or returns defaultValue.
|
||||
|
||||
```go
|
||||
var Verbose = false
|
||||
```
|
||||
Verbose flag enables console output for those functions that have counterparts
|
||||
in Go's excellent stadard packages.
|
||||
|
||||
#### func [Between](#between)
|
||||
|
||||
```go
|
||||
func Between(s, left, right string) string
|
||||
```
|
||||
Between extracts a string between left and right strings.
|
||||
|
||||
#### func [BetweenF](#betweenf)
|
||||
|
||||
```go
|
||||
func BetweenF(left, right string) func(string) string
|
||||
```
|
||||
BetweenF is the filter form for Between.
|
||||
|
||||
#### func [Camelize](#camelize)
|
||||
|
||||
```go
|
||||
func Camelize(s string) string
|
||||
```
|
||||
Camelize return new string which removes any underscores or dashes and convert a
|
||||
string into camel casing.
|
||||
|
||||
#### func [Capitalize](#capitalize)
|
||||
|
||||
```go
|
||||
func Capitalize(s string) string
|
||||
```
|
||||
Capitalize uppercases the first char of s and lowercases the rest.
|
||||
|
||||
#### func [CharAt](#charat)
|
||||
|
||||
```go
|
||||
func CharAt(s string, index int) string
|
||||
```
|
||||
CharAt returns a string from the character at the specified position.
|
||||
|
||||
#### func [CharAtF](#charatf)
|
||||
|
||||
```go
|
||||
func CharAtF(index int) func(string) string
|
||||
```
|
||||
CharAtF is the filter form of CharAt.
|
||||
|
||||
#### func [ChompLeft](#chompleft)
|
||||
|
||||
```go
|
||||
func ChompLeft(s, prefix string) string
|
||||
```
|
||||
ChompLeft removes prefix at the start of a string.
|
||||
|
||||
#### func [ChompLeftF](#chompleftf)
|
||||
|
||||
```go
|
||||
func ChompLeftF(prefix string) func(string) string
|
||||
```
|
||||
ChompLeftF is the filter form of ChompLeft.
|
||||
|
||||
#### func [ChompRight](#chompright)
|
||||
|
||||
```go
|
||||
func ChompRight(s, suffix string) string
|
||||
```
|
||||
ChompRight removes suffix from end of s.
|
||||
|
||||
#### func [ChompRightF](#chomprightf)
|
||||
|
||||
```go
|
||||
func ChompRightF(suffix string) func(string) string
|
||||
```
|
||||
ChompRightF is the filter form of ChompRight.
|
||||
|
||||
#### func [Classify](#classify)
|
||||
|
||||
```go
|
||||
func Classify(s string) string
|
||||
```
|
||||
Classify returns a camelized string with the first letter upper cased.
|
||||
|
||||
#### func [ClassifyF](#classifyf)
|
||||
|
||||
```go
|
||||
func ClassifyF(s string) func(string) string
|
||||
```
|
||||
ClassifyF is the filter form of Classify.
|
||||
|
||||
#### func [Clean](#clean)
|
||||
|
||||
```go
|
||||
func Clean(s string) string
|
||||
```
|
||||
Clean compresses all adjacent whitespace to a single space and trims s.
|
||||
|
||||
#### func [Dasherize](#dasherize)
|
||||
|
||||
```go
|
||||
func Dasherize(s string) string
|
||||
```
|
||||
Dasherize converts a camel cased string into a string delimited by dashes.
|
||||
|
||||
#### func [DecodeHTMLEntities](#decodehtmlentities)
|
||||
|
||||
```go
|
||||
func DecodeHTMLEntities(s string) string
|
||||
```
|
||||
DecodeHTMLEntities decodes HTML entities into their proper string
|
||||
representation. DecodeHTMLEntities is an alias for html.UnescapeString
|
||||
|
||||
#### func [EnsurePrefix](#ensureprefix)
|
||||
|
||||
```go
|
||||
func EnsurePrefix(s, prefix string) string
|
||||
```
|
||||
EnsurePrefix ensures s starts with prefix.
|
||||
|
||||
#### func [EnsurePrefixF](#ensureprefixf)
|
||||
|
||||
```go
|
||||
func EnsurePrefixF(prefix string) func(string) string
|
||||
```
|
||||
EnsurePrefixF is the filter form of EnsurePrefix.
|
||||
|
||||
#### func [EnsureSuffix](#ensuresuffix)
|
||||
|
||||
```go
|
||||
func EnsureSuffix(s, suffix string) string
|
||||
```
|
||||
EnsureSuffix ensures s ends with suffix.
|
||||
|
||||
#### func [EnsureSuffixF](#ensuresuffixf)
|
||||
|
||||
```go
|
||||
func EnsureSuffixF(suffix string) func(string) string
|
||||
```
|
||||
EnsureSuffixF is the filter form of EnsureSuffix.
|
||||
|
||||
#### func [EscapeHTML](#escapehtml)
|
||||
|
||||
```go
|
||||
func EscapeHTML(s string) string
|
||||
```
|
||||
EscapeHTML is alias for html.EscapeString.
|
||||
|
||||
#### func [Humanize](#humanize)
|
||||
|
||||
```go
|
||||
func Humanize(s string) string
|
||||
```
|
||||
Humanize transforms s into a human friendly form.
|
||||
|
||||
#### func [Iif](#iif)
|
||||
|
||||
```go
|
||||
func Iif(condition bool, truthy string, falsey string) string
|
||||
```
|
||||
Iif is short for immediate if. If condition is true return truthy else falsey.
|
||||
|
||||
#### func [IndexOf](#indexof)
|
||||
|
||||
```go
|
||||
func IndexOf(s string, needle string, start int) int
|
||||
```
|
||||
IndexOf finds the index of needle in s starting from start.
|
||||
|
||||
#### func [IsAlpha](#isalpha)
|
||||
|
||||
```go
|
||||
func IsAlpha(s string) bool
|
||||
```
|
||||
IsAlpha returns true if a string contains only letters from ASCII (a-z,A-Z).
|
||||
Other letters from other languages are not supported.
|
||||
|
||||
#### func [IsAlphaNumeric](#isalphanumeric)
|
||||
|
||||
```go
|
||||
func IsAlphaNumeric(s string) bool
|
||||
```
|
||||
IsAlphaNumeric returns true if a string contains letters and digits.
|
||||
|
||||
#### func [IsEmpty](#isempty)
|
||||
|
||||
```go
|
||||
func IsEmpty(s string) bool
|
||||
```
|
||||
IsEmpty returns true if the string is solely composed of whitespace.
|
||||
|
||||
#### func [IsLower](#islower)
|
||||
|
||||
```go
|
||||
func IsLower(s string) bool
|
||||
```
|
||||
IsLower returns true if s comprised of all lower case characters.
|
||||
|
||||
#### func [IsNumeric](#isnumeric)
|
||||
|
||||
```go
|
||||
func IsNumeric(s string) bool
|
||||
```
|
||||
IsNumeric returns true if a string contains only digits from 0-9. Other digits
|
||||
not in Latin (such as Arabic) are not currently supported.
|
||||
|
||||
#### func [IsUpper](#isupper)
|
||||
|
||||
```go
|
||||
func IsUpper(s string) bool
|
||||
```
|
||||
IsUpper returns true if s contains all upper case chracters.
|
||||
|
||||
#### func [Left](#left)
|
||||
|
||||
```go
|
||||
func Left(s string, n int) string
|
||||
```
|
||||
Left returns the left substring of length n.
|
||||
|
||||
#### func [LeftF](#leftf)
|
||||
|
||||
```go
|
||||
func LeftF(n int) func(string) string
|
||||
```
|
||||
LeftF is the filter form of Left.
|
||||
|
||||
#### func [LeftOf](#leftof)
|
||||
|
||||
```go
|
||||
func LeftOf(s string, needle string) string
|
||||
```
|
||||
LeftOf returns the substring left of needle.
|
||||
|
||||
#### func [Letters](#letters)
|
||||
|
||||
```go
|
||||
func Letters(s string) []string
|
||||
```
|
||||
Letters returns an array of runes as strings so it can be indexed into.
|
||||
|
||||
#### func [Lines](#lines)
|
||||
|
||||
```go
|
||||
func Lines(s string) []string
|
||||
```
|
||||
Lines convert windows newlines to unix newlines then convert to an Array of
|
||||
lines.
|
||||
|
||||
#### func [Map](#map)
|
||||
|
||||
```go
|
||||
func Map(arr []string, iterator func(string) string) []string
|
||||
```
|
||||
Map maps an array's iitem through an iterator.
|
||||
|
||||
#### func [Match](#match)
|
||||
|
||||
```go
|
||||
func Match(s, pattern string) bool
|
||||
```
|
||||
Match returns true if patterns matches the string
|
||||
|
||||
#### func [Pad](#pad)
|
||||
|
||||
```go
|
||||
func Pad(s, c string, n int) string
|
||||
```
|
||||
Pad pads string s on both sides with c until it has length of n.
|
||||
|
||||
#### func [PadF](#padf)
|
||||
|
||||
```go
|
||||
func PadF(c string, n int) func(string) string
|
||||
```
|
||||
PadF is the filter form of Pad.
|
||||
|
||||
#### func [PadLeft](#padleft)
|
||||
|
||||
```go
|
||||
func PadLeft(s, c string, n int) string
|
||||
```
|
||||
PadLeft pads s on left side with c until it has length of n.
|
||||
|
||||
#### func [PadLeftF](#padleftf)
|
||||
|
||||
```go
|
||||
func PadLeftF(c string, n int) func(string) string
|
||||
```
|
||||
PadLeftF is the filter form of PadLeft.
|
||||
|
||||
#### func [PadRight](#padright)
|
||||
|
||||
```go
|
||||
func PadRight(s, c string, n int) string
|
||||
```
|
||||
PadRight pads s on right side with c until it has length of n.
|
||||
|
||||
#### func [PadRightF](#padrightf)
|
||||
|
||||
```go
|
||||
func PadRightF(c string, n int) func(string) string
|
||||
```
|
||||
PadRightF is the filter form of Padright
|
||||
|
||||
#### func [Pipe](#pipe)
|
||||
|
||||
```go
|
||||
func Pipe(s string, funcs ...func(string) string) string
|
||||
```
|
||||
Pipe pipes s through one or more string filters.
|
||||
|
||||
#### func [QuoteItems](#quoteitems)
|
||||
|
||||
```go
|
||||
func QuoteItems(arr []string) []string
|
||||
```
|
||||
QuoteItems quotes all items in array, mostly for debugging.
|
||||
|
||||
#### func [ReplaceF](#replacef)
|
||||
|
||||
```go
|
||||
func ReplaceF(old, new string, n int) func(string) string
|
||||
```
|
||||
ReplaceF is the filter form of strings.Replace.
|
||||
|
||||
#### func [ReplacePattern](#replacepattern)
|
||||
|
||||
```go
|
||||
func ReplacePattern(s, pattern, repl string) string
|
||||
```
|
||||
ReplacePattern replaces string with regexp string. ReplacePattern returns a copy
|
||||
of src, replacing matches of the Regexp with the replacement string repl. Inside
|
||||
repl, $ signs are interpreted as in Expand, so for instance $1 represents the
|
||||
text of the first submatch.
|
||||
|
||||
#### func [ReplacePatternF](#replacepatternf)
|
||||
|
||||
```go
|
||||
func ReplacePatternF(pattern, repl string) func(string) string
|
||||
```
|
||||
ReplacePatternF is the filter form of ReplaceRegexp.
|
||||
|
||||
#### func [Reverse](#reverse)
|
||||
|
||||
```go
|
||||
func Reverse(s string) string
|
||||
```
|
||||
Reverse a string
|
||||
|
||||
#### func [Right](#right)
|
||||
|
||||
```go
|
||||
func Right(s string, n int) string
|
||||
```
|
||||
Right returns the right substring of length n.
|
||||
|
||||
#### func [RightF](#rightf)
|
||||
|
||||
```go
|
||||
func RightF(n int) func(string) string
|
||||
```
|
||||
RightF is the Filter version of Right.
|
||||
|
||||
#### func [RightOf](#rightof)
|
||||
|
||||
```go
|
||||
func RightOf(s string, prefix string) string
|
||||
```
|
||||
RightOf returns the substring to the right of prefix.
|
||||
|
||||
#### func [SetTemplateDelimiters](#settemplatedelimiters)
|
||||
|
||||
```go
|
||||
func SetTemplateDelimiters(opening, closing string)
|
||||
```
|
||||
SetTemplateDelimiters sets the delimiters for Template function. Defaults to
|
||||
"{{" and "}}"
|
||||
|
||||
#### func [Slice](#slice)
|
||||
|
||||
```go
|
||||
func Slice(s string, start, end int) string
|
||||
```
|
||||
Slice slices a string. If end is negative then it is the from the end of the
|
||||
string.
|
||||
|
||||
#### func [SliceContains](#slicecontains)
|
||||
|
||||
```go
|
||||
func SliceContains(slice []string, val string) bool
|
||||
```
|
||||
SliceContains determines whether val is an element in slice.
|
||||
|
||||
#### func [SliceF](#slicef)
|
||||
|
||||
```go
|
||||
func SliceF(start, end int) func(string) string
|
||||
```
|
||||
SliceF is the filter for Slice.
|
||||
|
||||
#### func [SliceIndexOf](#sliceindexof)
|
||||
|
||||
```go
|
||||
func SliceIndexOf(slice []string, val string) int
|
||||
```
|
||||
SliceIndexOf gets the indx of val in slice. Returns -1 if not found.
|
||||
|
||||
#### func [Slugify](#slugify)
|
||||
|
||||
```go
|
||||
func Slugify(s string) string
|
||||
```
|
||||
Slugify converts s into a dasherized string suitable for URL segment.
|
||||
|
||||
#### func [StripPunctuation](#strippunctuation)
|
||||
|
||||
```go
|
||||
func StripPunctuation(s string) string
|
||||
```
|
||||
StripPunctuation strips puncation from string.
|
||||
|
||||
#### func [StripTags](#striptags)
|
||||
|
||||
```go
|
||||
func StripTags(s string, tags ...string) string
|
||||
```
|
||||
StripTags strips all of the html tags or tags specified by the parameters
|
||||
|
||||
#### func [Substr](#substr)
|
||||
|
||||
```go
|
||||
func Substr(s string, index int, n int) string
|
||||
```
|
||||
Substr returns a substring of s starting at index of length n.
|
||||
|
||||
#### func [SubstrF](#substrf)
|
||||
|
||||
```go
|
||||
func SubstrF(index, n int) func(string) string
|
||||
```
|
||||
SubstrF is the filter form of Substr.
|
||||
|
||||
#### func [Template](#template)
|
||||
|
||||
```go
|
||||
func Template(s string, values map[string]interface{}) string
|
||||
```
|
||||
Template is a string template which replaces template placeholders delimited by
|
||||
"{{" and "}}" with values from map. The global delimiters may be set with
|
||||
SetTemplateDelimiters.
|
||||
|
||||
#### func [TemplateDelimiters](#templatedelimiters)
|
||||
|
||||
```go
|
||||
func TemplateDelimiters() (opening string, closing string)
|
||||
```
|
||||
TemplateDelimiters is the getter for the opening and closing delimiters for
|
||||
Template.
|
||||
|
||||
#### func [TemplateWithDelimiters](#templatewithdelimiters)
|
||||
|
||||
```go
|
||||
func TemplateWithDelimiters(s string, values map[string]interface{}, opening, closing string) string
|
||||
```
|
||||
TemplateWithDelimiters is string template with user-defineable opening and
|
||||
closing delimiters.
|
||||
|
||||
#### func [ToArgv](#toargv)
|
||||
|
||||
```go
|
||||
func ToArgv(s string) []string
|
||||
```
|
||||
ToArgv converts string s into an argv for exec.
|
||||
|
||||
#### func [ToBool](#tobool)
|
||||
|
||||
```go
|
||||
func ToBool(s string) bool
|
||||
```
|
||||
ToBool fuzzily converts truthy values.
|
||||
|
||||
#### func [ToBoolOr](#toboolor)
|
||||
|
||||
```go
|
||||
func ToBoolOr(s string, defaultValue bool) bool
|
||||
```
|
||||
ToBoolOr parses s as a bool or returns defaultValue.
|
||||
|
||||
#### func [ToFloat32Or](#tofloat32or)
|
||||
|
||||
```go
|
||||
func ToFloat32Or(s string, defaultValue float32) float32
|
||||
```
|
||||
ToFloat32Or parses as a float32 or returns defaultValue on error.
|
||||
|
||||
#### func [ToFloat64Or](#tofloat64or)
|
||||
|
||||
```go
|
||||
func ToFloat64Or(s string, defaultValue float64) float64
|
||||
```
|
||||
ToFloat64Or parses s as a float64 or returns defaultValue.
|
||||
|
||||
#### func [ToIntOr](#tointor)
|
||||
|
||||
```go
|
||||
func ToIntOr(s string, defaultValue int) int
|
||||
```
|
||||
ToIntOr parses s as an int or returns defaultValue.
|
||||
|
||||
#### func [Underscore](#underscore)
|
||||
|
||||
```go
|
||||
func Underscore(s string) string
|
||||
```
|
||||
Underscore returns converted camel cased string into a string delimited by
|
||||
underscores.
|
||||
|
||||
#### func [UnescapeHTML](#unescapehtml)
|
||||
|
||||
```go
|
||||
func UnescapeHTML(s string) string
|
||||
```
|
||||
UnescapeHTML is an alias for html.UnescapeString.
|
||||
|
||||
#### func [WrapHTML](#wraphtml)
|
||||
|
||||
```go
|
||||
func WrapHTML(s string, tag string, attrs map[string]string) string
|
||||
```
|
||||
WrapHTML wraps s within HTML tag having attributes attrs. Note, WrapHTML does
|
||||
not escape s value.
|
||||
|
||||
#### func [WrapHTMLF](#wraphtmlf)
|
||||
|
||||
```go
|
||||
func WrapHTMLF(tag string, attrs map[string]string) func(string) string
|
||||
```
|
||||
WrapHTMLF is the filter form of WrapHTML.
|
1
vendor/github.com/mgutz/str/VERSION
generated
vendored
Normal file
1
vendor/github.com/mgutz/str/VERSION
generated
vendored
Normal file
@ -0,0 +1 @@
|
||||
1.1.0
|
19
vendor/github.com/mgutz/str/doc.go
generated
vendored
Normal file
19
vendor/github.com/mgutz/str/doc.go
generated
vendored
Normal file
@ -0,0 +1,19 @@
|
||||
// Package str is a comprehensive set of string functions to build more
|
||||
// Go awesomeness. Str complements Go's standard packages and does not duplicate
|
||||
// functionality found in `strings` or `strconv`.
|
||||
//
|
||||
// Str is based on plain functions instead of object-based methods,
|
||||
// consistent with Go standard string packages.
|
||||
//
|
||||
// str.Between("<a>foo</a>", "<a>", "</a>") == "foo"
|
||||
//
|
||||
// Str supports pipelining instead of chaining
|
||||
//
|
||||
// s := str.Pipe("\nabcdef\n", Clean, BetweenF("a", "f"), ChompLeftF("bc"))
|
||||
//
|
||||
// User-defined filters can be added to the pipeline by inserting a function
|
||||
// or closure that returns a function with this signature
|
||||
//
|
||||
// func(string) string
|
||||
//
|
||||
package str
|
337
vendor/github.com/mgutz/str/funcsAO.go
generated
vendored
Normal file
337
vendor/github.com/mgutz/str/funcsAO.go
generated
vendored
Normal file
@ -0,0 +1,337 @@
|
||||
package str
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"html"
|
||||
//"log"
|
||||
"regexp"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// Verbose flag enables console output for those functions that have
|
||||
// counterparts in Go's excellent stadard packages.
|
||||
var Verbose = false
|
||||
var templateOpen = "{{"
|
||||
var templateClose = "}}"
|
||||
|
||||
var beginEndSpacesRe = regexp.MustCompile("^\\s+|\\s+$")
|
||||
var camelizeRe = regexp.MustCompile(`(\-|_|\s)+(.)?`)
|
||||
var camelizeRe2 = regexp.MustCompile(`(\-|_|\s)+`)
|
||||
var capitalsRe = regexp.MustCompile("([A-Z])")
|
||||
var dashSpaceRe = regexp.MustCompile(`[-\s]+`)
|
||||
var dashesRe = regexp.MustCompile("-+")
|
||||
var isAlphaNumericRe = regexp.MustCompile(`[^0-9a-z\xC0-\xFF]`)
|
||||
var isAlphaRe = regexp.MustCompile(`[^a-z\xC0-\xFF]`)
|
||||
var nWhitespaceRe = regexp.MustCompile(`\s+`)
|
||||
var notDigitsRe = regexp.MustCompile(`[^0-9]`)
|
||||
var slugifyRe = regexp.MustCompile(`[^\w\s\-]`)
|
||||
var spaceUnderscoreRe = regexp.MustCompile("[_\\s]+")
|
||||
var spacesRe = regexp.MustCompile("[\\s\\xA0]+")
|
||||
var stripPuncRe = regexp.MustCompile(`[^\w\s]|_`)
|
||||
var templateRe = regexp.MustCompile(`([\-\[\]()*\s])`)
|
||||
var templateRe2 = regexp.MustCompile(`\$`)
|
||||
var underscoreRe = regexp.MustCompile(`([a-z\d])([A-Z]+)`)
|
||||
var whitespaceRe = regexp.MustCompile(`^[\s\xa0]*$`)
|
||||
|
||||
func min(a, b int) int {
|
||||
if a < b {
|
||||
return a
|
||||
}
|
||||
return b
|
||||
}
|
||||
|
||||
func max(a, b int) int {
|
||||
if a > b {
|
||||
return a
|
||||
}
|
||||
return b
|
||||
}
|
||||
|
||||
// Between extracts a string between left and right strings.
|
||||
func Between(s, left, right string) string {
|
||||
l := len(left)
|
||||
startPos := strings.Index(s, left)
|
||||
if startPos < 0 {
|
||||
return ""
|
||||
}
|
||||
endPos := IndexOf(s, right, startPos+l)
|
||||
//log.Printf("%s: left %s right %s start %d end %d", s, left, right, startPos+l, endPos)
|
||||
if endPos < 0 {
|
||||
return ""
|
||||
} else if right == "" {
|
||||
return s[endPos:]
|
||||
} else {
|
||||
return s[startPos+l : endPos]
|
||||
}
|
||||
}
|
||||
|
||||
// BetweenF is the filter form for Between.
|
||||
func BetweenF(left, right string) func(string) string {
|
||||
return func(s string) string {
|
||||
return Between(s, left, right)
|
||||
}
|
||||
}
|
||||
|
||||
// Camelize return new string which removes any underscores or dashes and convert a string into camel casing.
|
||||
func Camelize(s string) string {
|
||||
return camelizeRe.ReplaceAllStringFunc(s, func(val string) string {
|
||||
val = strings.ToUpper(val)
|
||||
val = camelizeRe2.ReplaceAllString(val, "")
|
||||
return val
|
||||
})
|
||||
}
|
||||
|
||||
// Capitalize uppercases the first char of s and lowercases the rest.
|
||||
func Capitalize(s string) string {
|
||||
return strings.ToUpper(s[0:1]) + strings.ToLower(s[1:])
|
||||
}
|
||||
|
||||
// CharAt returns a string from the character at the specified position.
|
||||
func CharAt(s string, index int) string {
|
||||
l := len(s)
|
||||
shortcut := index < 0 || index > l-1 || l == 0
|
||||
if shortcut {
|
||||
return ""
|
||||
}
|
||||
return s[index : index+1]
|
||||
}
|
||||
|
||||
// CharAtF is the filter form of CharAt.
|
||||
func CharAtF(index int) func(string) string {
|
||||
return func(s string) string {
|
||||
return CharAt(s, index)
|
||||
}
|
||||
}
|
||||
|
||||
// ChompLeft removes prefix at the start of a string.
|
||||
func ChompLeft(s, prefix string) string {
|
||||
if strings.HasPrefix(s, prefix) {
|
||||
return s[len(prefix):]
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
||||
// ChompLeftF is the filter form of ChompLeft.
|
||||
func ChompLeftF(prefix string) func(string) string {
|
||||
return func(s string) string {
|
||||
return ChompLeft(s, prefix)
|
||||
}
|
||||
}
|
||||
|
||||
// ChompRight removes suffix from end of s.
|
||||
func ChompRight(s, suffix string) string {
|
||||
if strings.HasSuffix(s, suffix) {
|
||||
return s[:len(s)-len(suffix)]
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
||||
// ChompRightF is the filter form of ChompRight.
|
||||
func ChompRightF(suffix string) func(string) string {
|
||||
return func(s string) string {
|
||||
return ChompRight(s, suffix)
|
||||
}
|
||||
}
|
||||
|
||||
// Classify returns a camelized string with the first letter upper cased.
|
||||
func Classify(s string) string {
|
||||
return Camelize("-" + s)
|
||||
}
|
||||
|
||||
// ClassifyF is the filter form of Classify.
|
||||
func ClassifyF(s string) func(string) string {
|
||||
return func(s string) string {
|
||||
return Classify(s)
|
||||
}
|
||||
}
|
||||
|
||||
// Clean compresses all adjacent whitespace to a single space and trims s.
|
||||
func Clean(s string) string {
|
||||
s = spacesRe.ReplaceAllString(s, " ")
|
||||
s = beginEndSpacesRe.ReplaceAllString(s, "")
|
||||
return s
|
||||
}
|
||||
|
||||
// Dasherize converts a camel cased string into a string delimited by dashes.
|
||||
func Dasherize(s string) string {
|
||||
s = strings.TrimSpace(s)
|
||||
s = spaceUnderscoreRe.ReplaceAllString(s, "-")
|
||||
s = capitalsRe.ReplaceAllString(s, "-$1")
|
||||
s = dashesRe.ReplaceAllString(s, "-")
|
||||
s = strings.ToLower(s)
|
||||
return s
|
||||
}
|
||||
|
||||
// EscapeHTML is alias for html.EscapeString.
|
||||
func EscapeHTML(s string) string {
|
||||
if Verbose {
|
||||
fmt.Println("Use html.EscapeString instead of EscapeHTML")
|
||||
}
|
||||
return html.EscapeString(s)
|
||||
}
|
||||
|
||||
// DecodeHTMLEntities decodes HTML entities into their proper string representation.
|
||||
// DecodeHTMLEntities is an alias for html.UnescapeString
|
||||
func DecodeHTMLEntities(s string) string {
|
||||
if Verbose {
|
||||
fmt.Println("Use html.UnescapeString instead of DecodeHTMLEntities")
|
||||
}
|
||||
return html.UnescapeString(s)
|
||||
}
|
||||
|
||||
// EnsurePrefix ensures s starts with prefix.
|
||||
func EnsurePrefix(s, prefix string) string {
|
||||
if strings.HasPrefix(s, prefix) {
|
||||
return s
|
||||
}
|
||||
return prefix + s
|
||||
}
|
||||
|
||||
// EnsurePrefixF is the filter form of EnsurePrefix.
|
||||
func EnsurePrefixF(prefix string) func(string) string {
|
||||
return func(s string) string {
|
||||
return EnsurePrefix(s, prefix)
|
||||
}
|
||||
}
|
||||
|
||||
// EnsureSuffix ensures s ends with suffix.
|
||||
func EnsureSuffix(s, suffix string) string {
|
||||
if strings.HasSuffix(s, suffix) {
|
||||
return s
|
||||
}
|
||||
return s + suffix
|
||||
}
|
||||
|
||||
// EnsureSuffixF is the filter form of EnsureSuffix.
|
||||
func EnsureSuffixF(suffix string) func(string) string {
|
||||
return func(s string) string {
|
||||
return EnsureSuffix(s, suffix)
|
||||
}
|
||||
}
|
||||
|
||||
// Humanize transforms s into a human friendly form.
|
||||
func Humanize(s string) string {
|
||||
if s == "" {
|
||||
return s
|
||||
}
|
||||
s = Underscore(s)
|
||||
var humanizeRe = regexp.MustCompile(`_id$`)
|
||||
s = humanizeRe.ReplaceAllString(s, "")
|
||||
s = strings.Replace(s, "_", " ", -1)
|
||||
s = strings.TrimSpace(s)
|
||||
s = Capitalize(s)
|
||||
return s
|
||||
}
|
||||
|
||||
// Iif is short for immediate if. If condition is true return truthy else falsey.
|
||||
func Iif(condition bool, truthy string, falsey string) string {
|
||||
if condition {
|
||||
return truthy
|
||||
}
|
||||
return falsey
|
||||
}
|
||||
|
||||
// IndexOf finds the index of needle in s starting from start.
|
||||
func IndexOf(s string, needle string, start int) int {
|
||||
l := len(s)
|
||||
if needle == "" {
|
||||
if start < 0 {
|
||||
return 0
|
||||
} else if start < l {
|
||||
return start
|
||||
} else {
|
||||
return l
|
||||
}
|
||||
}
|
||||
if start < 0 || start > l-1 {
|
||||
return -1
|
||||
}
|
||||
pos := strings.Index(s[start:], needle)
|
||||
if pos == -1 {
|
||||
return -1
|
||||
}
|
||||
return start + pos
|
||||
}
|
||||
|
||||
// IsAlpha returns true if a string contains only letters from ASCII (a-z,A-Z). Other letters from other languages are not supported.
|
||||
func IsAlpha(s string) bool {
|
||||
return !isAlphaRe.MatchString(strings.ToLower(s))
|
||||
}
|
||||
|
||||
// IsAlphaNumeric returns true if a string contains letters and digits.
|
||||
func IsAlphaNumeric(s string) bool {
|
||||
return !isAlphaNumericRe.MatchString(strings.ToLower(s))
|
||||
}
|
||||
|
||||
// IsLower returns true if s comprised of all lower case characters.
|
||||
func IsLower(s string) bool {
|
||||
return IsAlpha(s) && s == strings.ToLower(s)
|
||||
}
|
||||
|
||||
// IsNumeric returns true if a string contains only digits from 0-9. Other digits not in Latin (such as Arabic) are not currently supported.
|
||||
func IsNumeric(s string) bool {
|
||||
return !notDigitsRe.MatchString(s)
|
||||
}
|
||||
|
||||
// IsUpper returns true if s contains all upper case chracters.
|
||||
func IsUpper(s string) bool {
|
||||
return IsAlpha(s) && s == strings.ToUpper(s)
|
||||
}
|
||||
|
||||
// IsEmpty returns true if the string is solely composed of whitespace.
|
||||
func IsEmpty(s string) bool {
|
||||
if s == "" {
|
||||
return true
|
||||
}
|
||||
return whitespaceRe.MatchString(s)
|
||||
}
|
||||
|
||||
// Left returns the left substring of length n.
|
||||
func Left(s string, n int) string {
|
||||
if n < 0 {
|
||||
return Right(s, -n)
|
||||
}
|
||||
return Substr(s, 0, n)
|
||||
}
|
||||
|
||||
// LeftF is the filter form of Left.
|
||||
func LeftF(n int) func(string) string {
|
||||
return func(s string) string {
|
||||
return Left(s, n)
|
||||
}
|
||||
}
|
||||
|
||||
// LeftOf returns the substring left of needle.
|
||||
func LeftOf(s string, needle string) string {
|
||||
return Between(s, "", needle)
|
||||
}
|
||||
|
||||
// Letters returns an array of runes as strings so it can be indexed into.
|
||||
func Letters(s string) []string {
|
||||
result := []string{}
|
||||
for _, r := range s {
|
||||
result = append(result, string(r))
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
// Lines convert windows newlines to unix newlines then convert to an Array of lines.
|
||||
func Lines(s string) []string {
|
||||
s = strings.Replace(s, "\r\n", "\n", -1)
|
||||
return strings.Split(s, "\n")
|
||||
}
|
||||
|
||||
// Map maps an array's iitem through an iterator.
|
||||
func Map(arr []string, iterator func(string) string) []string {
|
||||
r := []string{}
|
||||
for _, item := range arr {
|
||||
r = append(r, iterator(item))
|
||||
}
|
||||
return r
|
||||
}
|
||||
|
||||
// Match returns true if patterns matches the string
|
||||
func Match(s, pattern string) bool {
|
||||
r := regexp.MustCompile(pattern)
|
||||
return r.MatchString(s)
|
||||
}
|
534
vendor/github.com/mgutz/str/funcsPZ.go
generated
vendored
Normal file
534
vendor/github.com/mgutz/str/funcsPZ.go
generated
vendored
Normal file
@ -0,0 +1,534 @@
|
||||
package str
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"html"
|
||||
//"log"
|
||||
"math"
|
||||
"regexp"
|
||||
"runtime"
|
||||
"strconv"
|
||||
"strings"
|
||||
"unicode/utf8"
|
||||
)
|
||||
|
||||
// Pad pads string s on both sides with c until it has length of n.
|
||||
func Pad(s, c string, n int) string {
|
||||
L := len(s)
|
||||
if L >= n {
|
||||
return s
|
||||
}
|
||||
n -= L
|
||||
|
||||
left := strings.Repeat(c, int(math.Ceil(float64(n)/2)))
|
||||
right := strings.Repeat(c, int(math.Floor(float64(n)/2)))
|
||||
return left + s + right
|
||||
}
|
||||
|
||||
// PadF is the filter form of Pad.
|
||||
func PadF(c string, n int) func(string) string {
|
||||
return func(s string) string {
|
||||
return Pad(s, c, n)
|
||||
}
|
||||
}
|
||||
|
||||
// PadLeft pads s on left side with c until it has length of n.
|
||||
func PadLeft(s, c string, n int) string {
|
||||
L := len(s)
|
||||
if L > n {
|
||||
return s
|
||||
}
|
||||
return strings.Repeat(c, (n-L)) + s
|
||||
}
|
||||
|
||||
// PadLeftF is the filter form of PadLeft.
|
||||
func PadLeftF(c string, n int) func(string) string {
|
||||
return func(s string) string {
|
||||
return PadLeft(s, c, n)
|
||||
}
|
||||
}
|
||||
|
||||
// PadRight pads s on right side with c until it has length of n.
|
||||
func PadRight(s, c string, n int) string {
|
||||
L := len(s)
|
||||
if L > n {
|
||||
return s
|
||||
}
|
||||
return s + strings.Repeat(c, n-L)
|
||||
}
|
||||
|
||||
// PadRightF is the filter form of Padright
|
||||
func PadRightF(c string, n int) func(string) string {
|
||||
return func(s string) string {
|
||||
return PadRight(s, c, n)
|
||||
}
|
||||
}
|
||||
|
||||
// Pipe pipes s through one or more string filters.
|
||||
func Pipe(s string, funcs ...func(string) string) string {
|
||||
for _, fn := range funcs {
|
||||
s = fn(s)
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
||||
// QuoteItems quotes all items in array, mostly for debugging.
|
||||
func QuoteItems(arr []string) []string {
|
||||
return Map(arr, func(s string) string {
|
||||
return strconv.Quote(s)
|
||||
})
|
||||
}
|
||||
|
||||
// ReplaceF is the filter form of strings.Replace.
|
||||
func ReplaceF(old, new string, n int) func(string) string {
|
||||
return func(s string) string {
|
||||
return strings.Replace(s, old, new, n)
|
||||
}
|
||||
}
|
||||
|
||||
// ReplacePattern replaces string with regexp string.
|
||||
// ReplacePattern returns a copy of src, replacing matches of the Regexp with the replacement string repl. Inside repl, $ signs are interpreted as in Expand, so for instance $1 represents the text of the first submatch.
|
||||
func ReplacePattern(s, pattern, repl string) string {
|
||||
r := regexp.MustCompile(pattern)
|
||||
return r.ReplaceAllString(s, repl)
|
||||
}
|
||||
|
||||
// ReplacePatternF is the filter form of ReplaceRegexp.
|
||||
func ReplacePatternF(pattern, repl string) func(string) string {
|
||||
return func(s string) string {
|
||||
return ReplacePattern(s, pattern, repl)
|
||||
}
|
||||
}
|
||||
|
||||
// Reverse a string
|
||||
func Reverse(s string) string {
|
||||
cs := make([]rune, utf8.RuneCountInString(s))
|
||||
i := len(cs)
|
||||
for _, c := range s {
|
||||
i--
|
||||
cs[i] = c
|
||||
}
|
||||
return string(cs)
|
||||
}
|
||||
|
||||
// Right returns the right substring of length n.
|
||||
func Right(s string, n int) string {
|
||||
if n < 0 {
|
||||
return Left(s, -n)
|
||||
}
|
||||
return Substr(s, len(s)-n, n)
|
||||
}
|
||||
|
||||
// RightF is the Filter version of Right.
|
||||
func RightF(n int) func(string) string {
|
||||
return func(s string) string {
|
||||
return Right(s, n)
|
||||
}
|
||||
}
|
||||
|
||||
// RightOf returns the substring to the right of prefix.
|
||||
func RightOf(s string, prefix string) string {
|
||||
return Between(s, prefix, "")
|
||||
}
|
||||
|
||||
// SetTemplateDelimiters sets the delimiters for Template function. Defaults to "{{" and "}}"
|
||||
func SetTemplateDelimiters(opening, closing string) {
|
||||
templateOpen = opening
|
||||
templateClose = closing
|
||||
}
|
||||
|
||||
// Slice slices a string. If end is negative then it is the from the end
|
||||
// of the string.
|
||||
func Slice(s string, start, end int) string {
|
||||
if end > -1 {
|
||||
return s[start:end]
|
||||
}
|
||||
L := len(s)
|
||||
if L+end > 0 {
|
||||
return s[start : L-end]
|
||||
}
|
||||
return s[start:]
|
||||
}
|
||||
|
||||
// SliceF is the filter for Slice.
|
||||
func SliceF(start, end int) func(string) string {
|
||||
return func(s string) string {
|
||||
return Slice(s, start, end)
|
||||
}
|
||||
}
|
||||
|
||||
// SliceContains determines whether val is an element in slice.
|
||||
func SliceContains(slice []string, val string) bool {
|
||||
if slice == nil {
|
||||
return false
|
||||
}
|
||||
|
||||
for _, it := range slice {
|
||||
if it == val {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// SliceIndexOf gets the indx of val in slice. Returns -1 if not found.
|
||||
func SliceIndexOf(slice []string, val string) int {
|
||||
if slice == nil {
|
||||
return -1
|
||||
}
|
||||
|
||||
for i, it := range slice {
|
||||
if it == val {
|
||||
return i
|
||||
}
|
||||
}
|
||||
return -1
|
||||
}
|
||||
|
||||
// Slugify converts s into a dasherized string suitable for URL segment.
|
||||
func Slugify(s string) string {
|
||||
sl := slugifyRe.ReplaceAllString(s, "")
|
||||
sl = strings.ToLower(sl)
|
||||
sl = Dasherize(sl)
|
||||
return sl
|
||||
}
|
||||
|
||||
// StripPunctuation strips puncation from string.
|
||||
func StripPunctuation(s string) string {
|
||||
s = stripPuncRe.ReplaceAllString(s, "")
|
||||
s = nWhitespaceRe.ReplaceAllString(s, " ")
|
||||
return s
|
||||
}
|
||||
|
||||
// StripTags strips all of the html tags or tags specified by the parameters
|
||||
func StripTags(s string, tags ...string) string {
|
||||
if len(tags) == 0 {
|
||||
tags = append(tags, "")
|
||||
}
|
||||
for _, tag := range tags {
|
||||
stripTagsRe := regexp.MustCompile(`(?i)<\/?` + tag + `[^<>]*>`)
|
||||
s = stripTagsRe.ReplaceAllString(s, "")
|
||||
}
|
||||
return s
|
||||
}
|
||||
|
||||
// Substr returns a substring of s starting at index of length n.
|
||||
func Substr(s string, index int, n int) string {
|
||||
L := len(s)
|
||||
if index < 0 || index >= L || s == "" {
|
||||
return ""
|
||||
}
|
||||
end := index + n
|
||||
if end >= L {
|
||||
end = L
|
||||
}
|
||||
if end <= index {
|
||||
return ""
|
||||
}
|
||||
return s[index:end]
|
||||
}
|
||||
|
||||
// SubstrF is the filter form of Substr.
|
||||
func SubstrF(index, n int) func(string) string {
|
||||
return func(s string) string {
|
||||
return Substr(s, index, n)
|
||||
}
|
||||
}
|
||||
|
||||
// Template is a string template which replaces template placeholders delimited
|
||||
// by "{{" and "}}" with values from map. The global delimiters may be set with
|
||||
// SetTemplateDelimiters.
|
||||
func Template(s string, values map[string]interface{}) string {
|
||||
return TemplateWithDelimiters(s, values, templateOpen, templateClose)
|
||||
}
|
||||
|
||||
// TemplateDelimiters is the getter for the opening and closing delimiters for Template.
|
||||
func TemplateDelimiters() (opening string, closing string) {
|
||||
return templateOpen, templateClose
|
||||
}
|
||||
|
||||
// TemplateWithDelimiters is string template with user-defineable opening and closing delimiters.
|
||||
func TemplateWithDelimiters(s string, values map[string]interface{}, opening, closing string) string {
|
||||
escapeDelimiter := func(delim string) string {
|
||||
result := templateRe.ReplaceAllString(delim, "\\$1")
|
||||
return templateRe2.ReplaceAllString(result, "\\$")
|
||||
}
|
||||
|
||||
openingDelim := escapeDelimiter(opening)
|
||||
closingDelim := escapeDelimiter(closing)
|
||||
r := regexp.MustCompile(openingDelim + `(.+?)` + closingDelim)
|
||||
matches := r.FindAllStringSubmatch(s, -1)
|
||||
for _, submatches := range matches {
|
||||
match := submatches[0]
|
||||
key := submatches[1]
|
||||
//log.Printf("match %s key %s\n", match, key)
|
||||
if values[key] != nil {
|
||||
v := fmt.Sprintf("%v", values[key])
|
||||
s = strings.Replace(s, match, v, -1)
|
||||
}
|
||||
}
|
||||
|
||||
return s
|
||||
}
|
||||
|
||||
// ToArgv converts string s into an argv for exec.
|
||||
func ToArgv(s string) []string {
|
||||
const (
|
||||
InArg = iota
|
||||
InArgQuote
|
||||
OutOfArg
|
||||
)
|
||||
currentState := OutOfArg
|
||||
currentQuoteChar := "\x00" // to distinguish between ' and " quotations
|
||||
// this allows to use "foo'bar"
|
||||
currentArg := ""
|
||||
argv := []string{}
|
||||
|
||||
isQuote := func(c string) bool {
|
||||
return c == `"` || c == `'`
|
||||
}
|
||||
|
||||
isEscape := func(c string) bool {
|
||||
return c == `\`
|
||||
}
|
||||
|
||||
isWhitespace := func(c string) bool {
|
||||
return c == " " || c == "\t"
|
||||
}
|
||||
|
||||
L := len(s)
|
||||
for i := 0; i < L; i++ {
|
||||
c := s[i : i+1]
|
||||
|
||||
//fmt.Printf("c %s state %v arg %s argv %v i %d\n", c, currentState, currentArg, args, i)
|
||||
if isQuote(c) {
|
||||
switch currentState {
|
||||
case OutOfArg:
|
||||
currentArg = ""
|
||||
fallthrough
|
||||
case InArg:
|
||||
currentState = InArgQuote
|
||||
currentQuoteChar = c
|
||||
|
||||
case InArgQuote:
|
||||
if c == currentQuoteChar {
|
||||
currentState = InArg
|
||||
} else {
|
||||
currentArg += c
|
||||
}
|
||||
}
|
||||
|
||||
} else if isWhitespace(c) {
|
||||
switch currentState {
|
||||
case InArg:
|
||||
argv = append(argv, currentArg)
|
||||
currentState = OutOfArg
|
||||
case InArgQuote:
|
||||
currentArg += c
|
||||
case OutOfArg:
|
||||
// nothing
|
||||
}
|
||||
|
||||
} else if isEscape(c) {
|
||||
switch currentState {
|
||||
case OutOfArg:
|
||||
currentArg = ""
|
||||
currentState = InArg
|
||||
fallthrough
|
||||
case InArg:
|
||||
fallthrough
|
||||
case InArgQuote:
|
||||
if i == L-1 {
|
||||
if runtime.GOOS == "windows" {
|
||||
// just add \ to end for windows
|
||||
currentArg += c
|
||||
} else {
|
||||
panic("Escape character at end string")
|
||||
}
|
||||
} else {
|
||||
if runtime.GOOS == "windows" {
|
||||
peek := s[i+1 : i+2]
|
||||
if peek != `"` {
|
||||
currentArg += c
|
||||
}
|
||||
} else {
|
||||
i++
|
||||
c = s[i : i+1]
|
||||
currentArg += c
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
switch currentState {
|
||||
case InArg, InArgQuote:
|
||||
currentArg += c
|
||||
|
||||
case OutOfArg:
|
||||
currentArg = ""
|
||||
currentArg += c
|
||||
currentState = InArg
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if currentState == InArg {
|
||||
argv = append(argv, currentArg)
|
||||
} else if currentState == InArgQuote {
|
||||
panic("Starting quote has no ending quote.")
|
||||
}
|
||||
|
||||
return argv
|
||||
}
|
||||
|
||||
// ToBool fuzzily converts truthy values.
|
||||
func ToBool(s string) bool {
|
||||
s = strings.ToLower(s)
|
||||
return s == "true" || s == "yes" || s == "on" || s == "1"
|
||||
}
|
||||
|
||||
// ToBoolOr parses s as a bool or returns defaultValue.
|
||||
func ToBoolOr(s string, defaultValue bool) bool {
|
||||
b, err := strconv.ParseBool(s)
|
||||
if err != nil {
|
||||
return defaultValue
|
||||
}
|
||||
return b
|
||||
}
|
||||
|
||||
// ToIntOr parses s as an int or returns defaultValue.
|
||||
func ToIntOr(s string, defaultValue int) int {
|
||||
n, err := strconv.Atoi(s)
|
||||
if err != nil {
|
||||
return defaultValue
|
||||
}
|
||||
return n
|
||||
}
|
||||
|
||||
// ToFloat32Or parses as a float32 or returns defaultValue on error.
|
||||
func ToFloat32Or(s string, defaultValue float32) float32 {
|
||||
f, err := strconv.ParseFloat(s, 32)
|
||||
if err != nil {
|
||||
return defaultValue
|
||||
}
|
||||
return float32(f)
|
||||
}
|
||||
|
||||
// ToFloat64Or parses s as a float64 or returns defaultValue.
|
||||
func ToFloat64Or(s string, defaultValue float64) float64 {
|
||||
f, err := strconv.ParseFloat(s, 64)
|
||||
if err != nil {
|
||||
return defaultValue
|
||||
}
|
||||
return f
|
||||
}
|
||||
|
||||
// ToFloatOr parses as a float64 or returns defaultValue.
|
||||
var ToFloatOr = ToFloat64Or
|
||||
|
||||
// TODO This is not working yet. Go's regexp package does not have some
|
||||
// of the niceities in JavaScript
|
||||
//
|
||||
// Truncate truncates the string, accounting for word placement and chars count
|
||||
// adding a morestr (defaults to ellipsis)
|
||||
// func Truncate(s, morestr string, n int) string {
|
||||
// L := len(s)
|
||||
// if L <= n {
|
||||
// return s
|
||||
// }
|
||||
//
|
||||
// if morestr == "" {
|
||||
// morestr = "..."
|
||||
// }
|
||||
//
|
||||
// tmpl := func(c string) string {
|
||||
// if strings.ToUpper(c) != strings.ToLower(c) {
|
||||
// return "A"
|
||||
// }
|
||||
// return " "
|
||||
// }
|
||||
// template := s[0 : n+1]
|
||||
// var truncateRe = regexp.MustCompile(`.(?=\W*\w*$)`)
|
||||
// truncateRe.ReplaceAllStringFunc(template, tmpl) // 'Hello, world' -> 'HellAA AAAAA'
|
||||
// var wwRe = regexp.MustCompile(`\w\w`)
|
||||
// var whitespaceRe2 = regexp.MustCompile(`\s*\S+$`)
|
||||
// if wwRe.MatchString(template[len(template)-2:]) {
|
||||
// template = whitespaceRe2.ReplaceAllString(template, "")
|
||||
// } else {
|
||||
// template = strings.TrimRight(template, " \t\n")
|
||||
// }
|
||||
//
|
||||
// if len(template+morestr) > L {
|
||||
// return s
|
||||
// }
|
||||
// return s[0:len(template)] + morestr
|
||||
// }
|
||||
//
|
||||
// truncate: function(length, pruneStr) { //from underscore.string, author: github.com/rwz
|
||||
// var str = this.s;
|
||||
//
|
||||
// length = ~~length;
|
||||
// pruneStr = pruneStr || '...';
|
||||
//
|
||||
// if (str.length <= length) return new this.constructor(str);
|
||||
//
|
||||
// var tmpl = function(c){ return c.toUpperCase() !== c.toLowerCase() ? 'A' : ' '; },
|
||||
// template = str.slice(0, length+1).replace(/.(?=\W*\w*$)/g, tmpl); // 'Hello, world' -> 'HellAA AAAAA'
|
||||
//
|
||||
// if (template.slice(template.length-2).match(/\w\w/))
|
||||
// template = template.replace(/\s*\S+$/, '');
|
||||
// else
|
||||
// template = new S(template.slice(0, template.length-1)).trimRight().s;
|
||||
//
|
||||
// return (template+pruneStr).length > str.length ? new S(str) : new S(str.slice(0, template.length)+pruneStr);
|
||||
// },
|
||||
|
||||
// Underscore returns converted camel cased string into a string delimited by underscores.
|
||||
func Underscore(s string) string {
|
||||
if s == "" {
|
||||
return ""
|
||||
}
|
||||
u := strings.TrimSpace(s)
|
||||
|
||||
u = underscoreRe.ReplaceAllString(u, "${1}_$2")
|
||||
u = dashSpaceRe.ReplaceAllString(u, "_")
|
||||
u = strings.ToLower(u)
|
||||
if IsUpper(s[0:1]) {
|
||||
return "_" + u
|
||||
}
|
||||
return u
|
||||
}
|
||||
|
||||
// UnescapeHTML is an alias for html.UnescapeString.
|
||||
func UnescapeHTML(s string) string {
|
||||
if Verbose {
|
||||
fmt.Println("Use html.UnescapeString instead of UnescapeHTML")
|
||||
}
|
||||
return html.UnescapeString(s)
|
||||
}
|
||||
|
||||
// WrapHTML wraps s within HTML tag having attributes attrs. Note,
|
||||
// WrapHTML does not escape s value.
|
||||
func WrapHTML(s string, tag string, attrs map[string]string) string {
|
||||
escapeHTMLAttributeQuotes := func(v string) string {
|
||||
v = strings.Replace(v, "<", "<", -1)
|
||||
v = strings.Replace(v, "&", "&", -1)
|
||||
v = strings.Replace(v, "\"", """, -1)
|
||||
return v
|
||||
}
|
||||
if tag == "" {
|
||||
tag = "div"
|
||||
}
|
||||
el := "<" + tag
|
||||
for name, val := range attrs {
|
||||
el += " " + name + "=\"" + escapeHTMLAttributeQuotes(val) + "\""
|
||||
}
|
||||
el += ">" + s + "</" + tag + ">"
|
||||
return el
|
||||
}
|
||||
|
||||
// WrapHTMLF is the filter form of WrapHTML.
|
||||
func WrapHTMLF(tag string, attrs map[string]string) func(string) string {
|
||||
return func(s string) string {
|
||||
return WrapHTML(s, tag, attrs)
|
||||
}
|
||||
}
|
696
vendor/github.com/mgutz/str/str_test.go
generated
vendored
Normal file
696
vendor/github.com/mgutz/str/str_test.go
generated
vendored
Normal file
@ -0,0 +1,696 @@
|
||||
package str
|
||||
|
||||
//import "testing"
|
||||
import "fmt"
|
||||
|
||||
//import "strings"
|
||||
|
||||
func ExampleBetween() {
|
||||
eg(1, Between("<a>foo</a>", "<a>", "</a>"))
|
||||
eg(2, Between("<a>foo</a></a>", "<a>", "</a>"))
|
||||
eg(3, Between("<a><a>foo</a></a>", "<a>", "</a>"))
|
||||
eg(4, Between("<a><a>foo</a></a>", "<a>", "</a>"))
|
||||
eg(5, Between("<a>foo", "<a>", "</a>"))
|
||||
eg(6, Between("Some strings } are very {weird}, dont you think?", "{", "}"))
|
||||
eg(7, Between("This is ateststring", "", "test"))
|
||||
eg(8, Between("This is ateststring", "test", ""))
|
||||
// Output:
|
||||
// 1: foo
|
||||
// 2: foo
|
||||
// 3: <a>foo
|
||||
// 4: <a>foo
|
||||
// 5:
|
||||
// 6: weird
|
||||
// 7: This is a
|
||||
// 8: string
|
||||
}
|
||||
|
||||
func ExampleBetweenF() {
|
||||
eg(1, Pipe("abc", BetweenF("a", "c")))
|
||||
// Output:
|
||||
// 1: b
|
||||
}
|
||||
|
||||
func ExampleCamelize() {
|
||||
eg(1, Camelize("data_rate"))
|
||||
eg(2, Camelize("background-color"))
|
||||
eg(3, Camelize("-moz-something"))
|
||||
eg(4, Camelize("_car_speed_"))
|
||||
eg(5, Camelize("yes_we_can"))
|
||||
// Output:
|
||||
// 1: dataRate
|
||||
// 2: backgroundColor
|
||||
// 3: MozSomething
|
||||
// 4: CarSpeed
|
||||
// 5: yesWeCan
|
||||
}
|
||||
|
||||
func ExampleCapitalize() {
|
||||
eg(1, Capitalize("abc"))
|
||||
eg(2, Capitalize("ABC"))
|
||||
// Output:
|
||||
// 1: Abc
|
||||
// 2: Abc
|
||||
}
|
||||
|
||||
func ExampleCharAt() {
|
||||
eg(1, CharAt("abc", 1))
|
||||
eg(2, CharAt("", -1))
|
||||
eg(3, CharAt("", 0))
|
||||
eg(4, CharAt("", 10))
|
||||
eg(5, CharAt("abc", -1))
|
||||
eg(6, CharAt("abc", 10))
|
||||
// Output:
|
||||
// 1: b
|
||||
// 2:
|
||||
// 3:
|
||||
// 4:
|
||||
// 5:
|
||||
// 6:
|
||||
}
|
||||
|
||||
func ExampleCharAtF() {
|
||||
eg(1, Pipe("abc", CharAtF(1)))
|
||||
// Output:
|
||||
// 1: b
|
||||
}
|
||||
|
||||
func ExampleChompLeft() {
|
||||
eg(1, ChompLeft("foobar", "foo"))
|
||||
eg(2, ChompLeft("foobar", "bar"))
|
||||
eg(3, ChompLeft("", "foo"))
|
||||
eg(4, ChompLeft("", ""))
|
||||
eg(5, ChompLeft("foo", ""))
|
||||
// Output:
|
||||
// 1: bar
|
||||
// 2: foobar
|
||||
// 3:
|
||||
// 4:
|
||||
// 5: foo
|
||||
}
|
||||
|
||||
func ExampleChompLeftF() {
|
||||
eg(1, Pipe("abc", ChompLeftF("ab")))
|
||||
// Output:
|
||||
// 1: c
|
||||
}
|
||||
|
||||
func ExampleChompRight() {
|
||||
eg(1, ChompRight("foobar", "foo"))
|
||||
eg(2, ChompRight("foobar", "bar"))
|
||||
eg(3, ChompRight("", "foo"))
|
||||
eg(4, ChompRight("", ""))
|
||||
// Output:
|
||||
// 1: foobar
|
||||
// 2: foo
|
||||
// 3:
|
||||
// 4:
|
||||
}
|
||||
|
||||
func ExampleChompRightF() {
|
||||
eg(1, Pipe("abc", ChompRightF("bc")))
|
||||
// Output:
|
||||
// 1: a
|
||||
}
|
||||
|
||||
func ExampleClassify() {
|
||||
eg(1, Classify("data_rate"))
|
||||
eg(2, Classify("background-color"))
|
||||
eg(3, Classify("-moz-something"))
|
||||
eg(4, Classify("_car_speed_"))
|
||||
eg(5, Classify("yes_we_can"))
|
||||
// Output:
|
||||
// 1: DataRate
|
||||
// 2: BackgroundColor
|
||||
// 3: MozSomething
|
||||
// 4: CarSpeed
|
||||
// 5: YesWeCan
|
||||
}
|
||||
|
||||
func ExampleClean() {
|
||||
eg(1, Clean("clean"))
|
||||
eg(2, Clean(""))
|
||||
eg(3, Clean(" please\t clean \t \n me "))
|
||||
// Output:
|
||||
// 1: clean
|
||||
// 2:
|
||||
// 3: please clean me
|
||||
}
|
||||
|
||||
func ExampleDasherize() {
|
||||
eg(1, Dasherize("dataRate"))
|
||||
eg(2, Dasherize("CarSpeed"))
|
||||
eg(3, Dasherize("yesWeCan"))
|
||||
eg(4, Dasherize(""))
|
||||
eg(5, Dasherize("ABC"))
|
||||
// Output:
|
||||
// 1: data-rate
|
||||
// 2: -car-speed
|
||||
// 3: yes-we-can
|
||||
// 4:
|
||||
// 5: -a-b-c
|
||||
}
|
||||
|
||||
func ExampleDecodeHTMLEntities() {
|
||||
eg(1, DecodeHTMLEntities("Ken Thompson & Dennis Ritchie"))
|
||||
eg(2, DecodeHTMLEntities("3 < 4"))
|
||||
eg(3, DecodeHTMLEntities("http://"))
|
||||
// Output:
|
||||
// 1: Ken Thompson & Dennis Ritchie
|
||||
// 2: 3 < 4
|
||||
// 3: http://
|
||||
}
|
||||
|
||||
func ExampleEnsurePrefix() {
|
||||
eg(1, EnsurePrefix("foobar", "foo"))
|
||||
eg(2, EnsurePrefix("bar", "foo"))
|
||||
eg(3, EnsurePrefix("", ""))
|
||||
eg(4, EnsurePrefix("foo", ""))
|
||||
eg(5, EnsurePrefix("", "foo"))
|
||||
// Output:
|
||||
// 1: foobar
|
||||
// 2: foobar
|
||||
// 3:
|
||||
// 4: foo
|
||||
// 5: foo
|
||||
}
|
||||
|
||||
func ExampleEnsurePrefixF() {
|
||||
eg(1, Pipe("dir", EnsurePrefixF("./")))
|
||||
// Output:
|
||||
// 1: ./dir
|
||||
}
|
||||
|
||||
func ExampleEnsureSuffix() {
|
||||
eg(1, EnsureSuffix("foobar", "bar"))
|
||||
eg(2, EnsureSuffix("foo", "bar"))
|
||||
eg(3, EnsureSuffix("", ""))
|
||||
eg(4, EnsureSuffix("foo", ""))
|
||||
eg(5, EnsureSuffix("", "bar"))
|
||||
// Output:
|
||||
// 1: foobar
|
||||
// 2: foobar
|
||||
// 3:
|
||||
// 4: foo
|
||||
// 5: bar
|
||||
}
|
||||
|
||||
func ExampleHumanize() {
|
||||
eg(1, Humanize("the_humanize_string_method"))
|
||||
eg(2, Humanize("ThehumanizeStringMethod"))
|
||||
eg(3, Humanize("the humanize string method"))
|
||||
// Output:
|
||||
// 1: The humanize string method
|
||||
// 2: Thehumanize string method
|
||||
// 3: The humanize string method
|
||||
}
|
||||
|
||||
func ExampleIif() {
|
||||
eg(1, Iif(true, "T", "F"))
|
||||
eg(2, Iif(false, "T", "F"))
|
||||
// Output:
|
||||
// 1: T
|
||||
// 2: F
|
||||
}
|
||||
|
||||
func ExampleIndexOf() {
|
||||
eg(1, IndexOf("abcdef", "a", 0))
|
||||
eg(2, IndexOf("abcdef", "a", 3))
|
||||
eg(3, IndexOf("abcdef", "a", -2))
|
||||
eg(4, IndexOf("abcdef", "a", 10))
|
||||
eg(5, IndexOf("", "a", 0))
|
||||
eg(6, IndexOf("abcdef", "", 2))
|
||||
eg(7, IndexOf("abcdef", "", 1000))
|
||||
// Output:
|
||||
// 1: 0
|
||||
// 2: -1
|
||||
// 3: -1
|
||||
// 4: -1
|
||||
// 5: -1
|
||||
// 6: 2
|
||||
// 7: 6
|
||||
}
|
||||
|
||||
func ExampleIsAlpha() {
|
||||
eg(1, IsAlpha("afaf"))
|
||||
eg(2, IsAlpha("FJslfjkasfs"))
|
||||
eg(3, IsAlpha("áéúóúÁÉÍÓÚãõÃÕàèìòùÀÈÌÒÙâêîôûÂÊÎÔÛäëïöüÄËÏÖÜçÇ"))
|
||||
eg(4, IsAlpha("adflj43faljsdf"))
|
||||
eg(5, IsAlpha("33"))
|
||||
eg(6, IsAlpha("TT....TTTafafetstYY"))
|
||||
eg(7, IsAlpha("-áéúóúÁÉÍÓÚãõÃÕàèìòùÀÈÌÒÙâêîôûÂÊÎÔÛäëïöüÄËÏÖÜçÇ"))
|
||||
// Output:
|
||||
// 1: true
|
||||
// 2: true
|
||||
// 3: true
|
||||
// 4: false
|
||||
// 5: false
|
||||
// 6: false
|
||||
// 7: false
|
||||
}
|
||||
|
||||
func eg(index int, example interface{}) {
|
||||
output := fmt.Sprintf("%d: %v", index, example)
|
||||
fmt.Printf("%s\n", Clean(output))
|
||||
}
|
||||
|
||||
func ExampleIsAlphaNumeric() {
|
||||
eg(1, IsAlphaNumeric("afaf35353afaf"))
|
||||
eg(2, IsAlphaNumeric("FFFF99fff"))
|
||||
eg(3, IsAlphaNumeric("99"))
|
||||
eg(4, IsAlphaNumeric("afff"))
|
||||
eg(5, IsAlphaNumeric("Infinity"))
|
||||
eg(6, IsAlphaNumeric("áéúóúÁÉÍÓÚãõÃÕàèìòùÀÈÌÒÙâêîôûÂÊÎÔÛäëïöüÄËÏÖÜçÇ1234567890"))
|
||||
eg(7, IsAlphaNumeric("-Infinity"))
|
||||
eg(8, IsAlphaNumeric("-33"))
|
||||
eg(9, IsAlphaNumeric("aaff.."))
|
||||
eg(10, IsAlphaNumeric(".áéúóúÁÉÍÓÚãõÃÕàèìòùÀÈÌÒÙâêîôûÂÊÎÔÛäëïöüÄËÏÖÜçÇ1234567890"))
|
||||
// Output:
|
||||
// 1: true
|
||||
// 2: true
|
||||
// 3: true
|
||||
// 4: true
|
||||
// 5: true
|
||||
// 6: true
|
||||
// 7: false
|
||||
// 8: false
|
||||
// 9: false
|
||||
// 10: false
|
||||
}
|
||||
|
||||
func ExampleIsEmpty() {
|
||||
eg(1, IsEmpty(" "))
|
||||
eg(2, IsEmpty("\t\t\t "))
|
||||
eg(3, IsEmpty("\t\n "))
|
||||
eg(4, IsEmpty("hi"))
|
||||
// Output:
|
||||
// 1: true
|
||||
// 2: true
|
||||
// 3: true
|
||||
// 4: false
|
||||
}
|
||||
|
||||
func ExampleIsLower() {
|
||||
eg(1, IsLower("a"))
|
||||
eg(2, IsLower("A"))
|
||||
eg(3, IsLower("abc"))
|
||||
eg(4, IsLower("aBc"))
|
||||
eg(5, IsLower("áéúóúãõàèìòùâêîôûäëïöüç"))
|
||||
eg(6, IsLower("hi jp"))
|
||||
eg(7, IsLower("ÁÉÍÓÚÃÕÀÈÌÒÙÂÊÎÔÛÄËÏÖÜÇ"))
|
||||
eg(8, IsLower("áéúóúãõàèìòùâêîôûäëïöüçÁ"))
|
||||
eg(9, IsLower("áéúóúãõàèìòùâêîôû äëïöüç"))
|
||||
// Output:
|
||||
// 1: true
|
||||
// 2: false
|
||||
// 3: true
|
||||
// 4: false
|
||||
// 5: true
|
||||
// 6: false
|
||||
// 7: false
|
||||
// 8: false
|
||||
// 9: false
|
||||
}
|
||||
|
||||
func ExampleIsNumeric() {
|
||||
eg(1, IsNumeric("3"))
|
||||
eg(2, IsNumeric("34.22"))
|
||||
eg(3, IsNumeric("-22.33"))
|
||||
eg(4, IsNumeric("NaN"))
|
||||
eg(5, IsNumeric("Infinity"))
|
||||
eg(6, IsNumeric("-Infinity"))
|
||||
eg(7, IsNumeric("JP"))
|
||||
eg(8, IsNumeric("-5"))
|
||||
eg(9, IsNumeric("00099242424"))
|
||||
// Output:
|
||||
// 1: true
|
||||
// 2: false
|
||||
// 3: false
|
||||
// 4: false
|
||||
// 5: false
|
||||
// 6: false
|
||||
// 7: false
|
||||
// 8: false
|
||||
// 9: true
|
||||
}
|
||||
|
||||
func ExampleIsUpper() {
|
||||
eg(1, IsUpper("a"))
|
||||
eg(2, IsUpper("A"))
|
||||
eg(3, IsUpper("ABC"))
|
||||
eg(4, IsUpper("aBc"))
|
||||
eg(5, IsUpper("áéúóúãõàèìòùâêîôûäëïöüç"))
|
||||
eg(6, IsUpper("HI JP"))
|
||||
eg(7, IsUpper("ÁÉÍÓÚÃÕÀÈÌÒÙÂÊÎÔÛÄËÏÖÜÇ"))
|
||||
eg(8, IsUpper("áéúóúãõàèìòùâêîôûäëïöüçÁ"))
|
||||
eg(9, IsUpper("ÁÉÍÓÚÃÕÀÈÌÒÙÂÊÎ ÔÛÄËÏÖÜÇ"))
|
||||
// Output:
|
||||
// 1: false
|
||||
// 2: true
|
||||
// 3: true
|
||||
// 4: false
|
||||
// 5: false
|
||||
// 6: false
|
||||
// 7: true
|
||||
// 8: false
|
||||
// 9: false
|
||||
}
|
||||
|
||||
func ExampleLeft() {
|
||||
eg(1, Left("abcdef", 0))
|
||||
eg(2, Left("abcdef", 1))
|
||||
eg(3, Left("abcdef", 4))
|
||||
eg(4, Left("abcdef", -2))
|
||||
// Output:
|
||||
// 1:
|
||||
// 2: a
|
||||
// 3: abcd
|
||||
// 4: ef
|
||||
}
|
||||
|
||||
func ExampleLeftOf() {
|
||||
eg(1, LeftOf("abcdef", "def"))
|
||||
eg(2, LeftOf("abcdef", "abc"))
|
||||
eg(3, LeftOf("abcdef", ""))
|
||||
eg(4, LeftOf("", "abc"))
|
||||
eg(5, LeftOf("abcdef", "xyz"))
|
||||
// Output:
|
||||
// 1: abc
|
||||
// 2:
|
||||
// 3: abcdef
|
||||
// 4:
|
||||
// 5:
|
||||
}
|
||||
|
||||
func ExampleLines() {
|
||||
eg(1, Lines("a\r\nb\nc\r\n"))
|
||||
eg(2, Lines("a\r\nb\nc\r\nd"))
|
||||
// Output:
|
||||
// 1: [a b c ]
|
||||
// 2: [a b c d]
|
||||
}
|
||||
|
||||
func ExampleMatch() {
|
||||
eg(1, Match("foobar", `^fo.*r$`))
|
||||
eg(2, Match("foobar", `^fo.*x$`))
|
||||
eg(3, Match("", `^fo.*x$`))
|
||||
// Output:
|
||||
// 1: true
|
||||
// 2: false
|
||||
// 3: false
|
||||
}
|
||||
|
||||
func ExamplePad() {
|
||||
eg(1, Pad("hello", "x", 5))
|
||||
eg(2, Pad("hello", "x", 10))
|
||||
eg(3, Pad("hello", "x", 11))
|
||||
eg(4, Pad("hello", "x", 6))
|
||||
eg(5, Pad("hello", "x", 1))
|
||||
// Output:
|
||||
// 1: hello
|
||||
// 2: xxxhelloxx
|
||||
// 3: xxxhelloxxx
|
||||
// 4: xhello
|
||||
// 5: hello
|
||||
}
|
||||
|
||||
func ExamplePadLeft() {
|
||||
eg(1, PadLeft("hello", "x", 5))
|
||||
eg(2, PadLeft("hello", "x", 10))
|
||||
eg(3, PadLeft("hello", "x", 11))
|
||||
eg(4, PadLeft("hello", "x", 6))
|
||||
eg(5, PadLeft("hello", "x", 1))
|
||||
// Output:
|
||||
// 1: hello
|
||||
// 2: xxxxxhello
|
||||
// 3: xxxxxxhello
|
||||
// 4: xhello
|
||||
// 5: hello
|
||||
}
|
||||
|
||||
func ExamplePadRight() {
|
||||
eg(1, PadRight("hello", "x", 5))
|
||||
eg(2, PadRight("hello", "x", 10))
|
||||
eg(3, PadRight("hello", "x", 11))
|
||||
eg(4, PadRight("hello", "x", 6))
|
||||
eg(5, PadRight("hello", "x", 1))
|
||||
// Output:
|
||||
// 1: hello
|
||||
// 2: helloxxxxx
|
||||
// 3: helloxxxxxx
|
||||
// 4: hellox
|
||||
// 5: hello
|
||||
}
|
||||
|
||||
func ExamplePipe() {
|
||||
eg(1, Pipe("\nabcdef \n", Clean, BetweenF("a", "f"), ChompLeftF("bc")))
|
||||
// Output:
|
||||
// 1: de
|
||||
}
|
||||
|
||||
func ExampleReplaceF() {
|
||||
eg(1, Pipe("abcdefab", ReplaceF("ab", "x", -1)))
|
||||
eg(2, Pipe("abcdefab", ReplaceF("ab", "x", 1)))
|
||||
eg(3, Pipe("abcdefab", ReplaceF("ab", "x", 0)))
|
||||
// Output:
|
||||
// 1: xcdefx
|
||||
// 2: xcdefab
|
||||
// 3: abcdefab
|
||||
}
|
||||
|
||||
func ExampleReplacePattern() {
|
||||
eg(1, ReplacePattern("aabbcc", `a`, "x"))
|
||||
// Output:
|
||||
// 1: xxbbcc
|
||||
}
|
||||
|
||||
func ExampleReplacePatternF() {
|
||||
eg(1, Pipe("aabbcc", ReplacePatternF(`a`, "x")))
|
||||
// Output:
|
||||
// 1: xxbbcc
|
||||
}
|
||||
|
||||
func ExampleReverse() {
|
||||
eg(1, Reverse("abc"))
|
||||
eg(2, Reverse("中文"))
|
||||
// Output:
|
||||
// 1: cba
|
||||
// 2: 文中
|
||||
}
|
||||
|
||||
func ExampleRight() {
|
||||
eg(1, Right("abcdef", 0))
|
||||
eg(2, Right("abcdef", 1))
|
||||
eg(3, Right("abcdef", 4))
|
||||
eg(4, Right("abcdef", -2))
|
||||
// Output:
|
||||
// 1:
|
||||
// 2: f
|
||||
// 3: cdef
|
||||
// 4: ab
|
||||
}
|
||||
|
||||
func ExampleRightOf() {
|
||||
eg(1, RightOf("abcdef", "abc"))
|
||||
eg(2, RightOf("abcdef", "def"))
|
||||
eg(3, RightOf("abcdef", ""))
|
||||
eg(4, RightOf("", "abc"))
|
||||
eg(5, RightOf("abcdef", "xyz"))
|
||||
// Output:
|
||||
// 1: def
|
||||
// 2:
|
||||
// 3: abcdef
|
||||
// 4:
|
||||
// 5:
|
||||
}
|
||||
|
||||
func ExampleRightF() {
|
||||
eg(1, Pipe("abcdef", RightF(3)))
|
||||
// Output:
|
||||
// 1: def
|
||||
}
|
||||
|
||||
func ExampleSliceContains() {
|
||||
eg(1, SliceContains([]string{"foo", "bar"}, "foo"))
|
||||
eg(2, SliceContains(nil, "foo"))
|
||||
eg(3, SliceContains([]string{"foo", "bar"}, "bah"))
|
||||
eg(4, SliceContains([]string{"foo", "bar"}, ""))
|
||||
// Output:
|
||||
// 1: true
|
||||
// 2: false
|
||||
// 3: false
|
||||
// 4: false
|
||||
}
|
||||
|
||||
func ExampleSliceIndexOf() {
|
||||
eg(1, SliceIndexOf([]string{"foo", "bar"}, "foo"))
|
||||
eg(2, SliceIndexOf(nil, "foo"))
|
||||
eg(3, SliceIndexOf([]string{"foo", "bar"}, "bah"))
|
||||
eg(4, SliceIndexOf([]string{"foo", "bar"}, ""))
|
||||
eg(5, SliceIndexOf([]string{"foo", "bar"}, "bar"))
|
||||
// Output:
|
||||
// 1: 0
|
||||
// 2: -1
|
||||
// 3: -1
|
||||
// 4: -1
|
||||
// 5: 1
|
||||
}
|
||||
|
||||
func ExampleSlugify() {
|
||||
eg(1, Slugify("foo bar"))
|
||||
eg(2, Slugify("foo/bar bah"))
|
||||
eg(3, Slugify("foo-bar--bah"))
|
||||
// Output:
|
||||
// 1: foo-bar
|
||||
// 2: foobar-bah
|
||||
// 3: foo-bar-bah
|
||||
}
|
||||
|
||||
func ExampleStripPunctuation() {
|
||||
eg(1, StripPunctuation("My, st[ring] *full* of %punct)"))
|
||||
// Output:
|
||||
// 1: My string full of punct
|
||||
}
|
||||
|
||||
func ExampleStripTags() {
|
||||
eg(1, StripTags("<p>just <b>some</b> text</p>"))
|
||||
eg(2, StripTags("<p>just <b>some</b> text</p>", "p"))
|
||||
eg(3, StripTags("<a><p>just <b>some</b> text</p></a>", "a", "p"))
|
||||
eg(4, StripTags("<a><p>just <b>some</b> text</p></a>", "b"))
|
||||
// Output:
|
||||
// 1: just some text
|
||||
// 2: just <b>some</b> text
|
||||
// 3: just <b>some</b> text
|
||||
// 4: <a><p>just some text</p></a>
|
||||
}
|
||||
|
||||
func ExampleSubstr() {
|
||||
eg(1, Substr("abcdef", 2, -1))
|
||||
eg(2, Substr("abcdef", 2, 0))
|
||||
eg(3, Substr("abcdef", 2, 1))
|
||||
eg(4, Substr("abcdef", 2, 3))
|
||||
eg(5, Substr("abcdef", 2, 4))
|
||||
eg(6, Substr("abcdef", 2, 100))
|
||||
eg(7, Substr("abcdef", 0, 1))
|
||||
// Output:
|
||||
// 1:
|
||||
// 2:
|
||||
// 3: c
|
||||
// 4: cde
|
||||
// 5: cdef
|
||||
// 6: cdef
|
||||
// 7: a
|
||||
}
|
||||
|
||||
func ExampleTemplateWithDelimiters() {
|
||||
eg(1, TemplateWithDelimiters("Hello {{name}} at {{date-year}}", map[string]interface{}{"name": "foo", "date-year": 2014}, "{{", "}}"))
|
||||
eg(2, TemplateWithDelimiters("Hello #{name} at #{date-year}", map[string]interface{}{"name": "foo", "date-year": 2014}, "#{", "}"))
|
||||
eg(3, TemplateWithDelimiters("Hello (name) at (date-year)", map[string]interface{}{"name": "foo", "date-year": 2014}, "(", ")"))
|
||||
eg(4, TemplateWithDelimiters("Hello [name] at [date-year]", map[string]interface{}{"name": "foo", "date-year": 2014}, "[", "]"))
|
||||
eg(5, TemplateWithDelimiters("Hello *name* at *date-year*", map[string]interface{}{"name": "foo", "date-year": 2014}, "*", "*"))
|
||||
eg(6, TemplateWithDelimiters("Hello $name$ at $date-year$", map[string]interface{}{"name": "foo", "date-year": 2014}, "$", "$"))
|
||||
// Output:
|
||||
// 1: Hello foo at 2014
|
||||
// 2: Hello foo at 2014
|
||||
// 3: Hello foo at 2014
|
||||
// 4: Hello foo at 2014
|
||||
// 5: Hello foo at 2014
|
||||
// 6: Hello foo at 2014
|
||||
}
|
||||
|
||||
func ExampleTemplate() {
|
||||
eg(1, Template("Hello {{name}} at {{date-year}}", map[string]interface{}{"name": "foo", "date-year": 2014}))
|
||||
eg(2, Template("Hello {{name}}", map[string]interface{}{"name": ""}))
|
||||
SetTemplateDelimiters("{", "}")
|
||||
eg(3, Template("Hello {name} at {date-year}", map[string]interface{}{"name": "foo", "date-year": 2014}))
|
||||
// Output:
|
||||
// 1: Hello foo at 2014
|
||||
// 2: Hello
|
||||
// 3: Hello foo at 2014
|
||||
}
|
||||
|
||||
func ExampleToArgv() {
|
||||
eg(1, QuoteItems(ToArgv(`GO_ENV=test gosu --watch foo@release "some quoted string 'inside'"`)))
|
||||
eg(2, QuoteItems(ToArgv(`gosu foo\ bar`)))
|
||||
eg(3, QuoteItems(ToArgv(`gosu --test="some arg" -w -s a=123`)))
|
||||
// Output:
|
||||
// 1: ["GO_ENV=test" "gosu" "--watch" "foo@release" "some quoted string 'inside'"]
|
||||
// 2: ["gosu" "foo bar"]
|
||||
// 3: ["gosu" "--test=some arg" "-w" "-s" "a=123"]
|
||||
}
|
||||
|
||||
func ExampleToBool() {
|
||||
eg(1, ToBool("true"))
|
||||
eg(2, ToBool("yes"))
|
||||
eg(3, ToBool("1"))
|
||||
eg(4, ToBool("on"))
|
||||
eg(5, ToBool("false"))
|
||||
eg(6, ToBool("no"))
|
||||
eg(7, ToBool("0"))
|
||||
eg(8, ToBool("off"))
|
||||
eg(9, ToBool(""))
|
||||
eg(10, ToBool("?"))
|
||||
// Output:
|
||||
// 1: true
|
||||
// 2: true
|
||||
// 3: true
|
||||
// 4: true
|
||||
// 5: false
|
||||
// 6: false
|
||||
// 7: false
|
||||
// 8: false
|
||||
// 9: false
|
||||
// 10: false
|
||||
}
|
||||
|
||||
func ExampleToBoolOr() {
|
||||
eg(1, ToBoolOr("foo", true))
|
||||
eg(2, ToBoolOr("foo", false))
|
||||
eg(3, ToBoolOr("true", false))
|
||||
eg(4, ToBoolOr("", true))
|
||||
// Output:
|
||||
// 1: true
|
||||
// 2: false
|
||||
// 3: true
|
||||
// 4: true
|
||||
}
|
||||
|
||||
func ExampleToIntOr() {
|
||||
eg(1, ToIntOr("foo", 0))
|
||||
eg(2, ToIntOr("", 1))
|
||||
eg(3, ToIntOr("100", 0))
|
||||
eg(4, ToIntOr("-1", 1))
|
||||
// Output:
|
||||
// 1: 0
|
||||
// 2: 1
|
||||
// 3: 100
|
||||
// 4: -1
|
||||
}
|
||||
|
||||
func ExampleUnderscore() {
|
||||
eg(1, Underscore("fooBar"))
|
||||
eg(2, Underscore("FooBar"))
|
||||
eg(3, Underscore(""))
|
||||
eg(4, Underscore("x"))
|
||||
// Output:
|
||||
// 1: foo_bar
|
||||
// 2: _foo_bar
|
||||
// 3:
|
||||
// 4: x
|
||||
}
|
||||
|
||||
func ExampleWrapHTML() {
|
||||
eg(1, WrapHTML("foo", "span", nil))
|
||||
eg(2, WrapHTML("foo", "", nil))
|
||||
eg(3, WrapHTML("foo", "", map[string]string{"class": "bar"}))
|
||||
// Output:
|
||||
// 1: <span>foo</span>
|
||||
// 2: <div>foo</div>
|
||||
// 3: <div class="bar">foo</div>
|
||||
}
|
||||
|
||||
func ExampleWrapHTMLF() {
|
||||
eg(1, Pipe("foo", WrapHTMLF("div", nil)))
|
||||
// Output:
|
||||
// 1: <div>foo</div>
|
||||
}
|
6
vendor/vendor.json
vendored
6
vendor/vendor.json
vendored
@ -13,6 +13,12 @@
|
||||
"path": "github.com/kr/pty",
|
||||
"revision": "fa756f09eeb418bf1cc6268c66ceaad9bb98f598",
|
||||
"revisionTime": "2018-06-20T15:12:22Z"
|
||||
},
|
||||
{
|
||||
"checksumSHA1": "vUGW1FVEUqtyx20qMHuSZS4i4rU=",
|
||||
"path": "github.com/mgutz/str",
|
||||
"revision": "968bf66e3da857419e4f6e71b2d5c9ae95682dc4",
|
||||
"revisionTime": "2015-06-23T15:38:27Z"
|
||||
}
|
||||
],
|
||||
"rootPath": "github.com/jesseduffield/lazygit"
|
||||
|
Loading…
Reference in New Issue
Block a user