lumin dependency

This commit is contained in:
John Kerl 2022-01-30 11:57:44 -05:00
parent 2293b40912
commit dc45f80cc4
4 changed files with 74 additions and 479 deletions

7
go.mod
View file

@ -10,11 +10,14 @@ module github.com/johnkerl/miller
// * go build github.com/johnkerl/miller/cmd/mlr
// * go install github.com/johnkerl/miller/cmd/mlr
// go get github.com/johnkerl/lumin@v1.0.0
// Local development:
// replace github.com/johnkerl/lumin => /Users/kerl/git/johnkerl/lumin
go 1.15
require (
github.com/goccmack/gocc v0.0.0-20211213154817-7ea699349eca // indirect
github.com/johnkerl/lumin v0.0.0-20220129204714-283014bb72b1 // indirect
github.com/johnkerl/lumin v1.0.0 // indirect
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51
github.com/lestrrat-go/strftime v1.0.5
github.com/mattn/go-isatty v0.0.14

32
go.sum
View file

@ -1,9 +1,7 @@
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/goccmack/gocc v0.0.0-20211213154817-7ea699349eca h1:NuA6w6b01Ojdig+4K1l9p4Pp3unlv4owphbOiENm8m4=
github.com/goccmack/gocc v0.0.0-20211213154817-7ea699349eca/go.mod h1:c4Mb67Mg9+pl6OlxvnFBUiiQOSlXfh0QukINLl54OD0=
github.com/johnkerl/lumin v0.0.0-20220129204714-283014bb72b1 h1:FetY3jOiWueTvowAxPakTBsZpMEd7bGQF3ejoH2rycc=
github.com/johnkerl/lumin v0.0.0-20220129204714-283014bb72b1/go.mod h1:eLf5AdQOaLvzZ2zVy4REr/DSeEwG+CZreHwNLICqv9E=
github.com/johnkerl/lumin v1.0.0 h1:CV34cHZOJ92Y02RbQ0rd4gA0C06Qck9q8blOyaPoWpU=
github.com/johnkerl/lumin v1.0.0/go.mod h1:eLf5AdQOaLvzZ2zVy4REr/DSeEwG+CZreHwNLICqv9E=
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
github.com/lestrrat-go/envload v0.0.0-20180220234015-a3eb8ddeffcc h1:RKf14vYWi2ttpEmkA4aQ3j4u9dStX2t4M8UM6qqNsG8=
@ -22,38 +20,12 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/mod v0.5.1 h1:OJxoQ/rynoF0dcCdI7cLPktw/hR2cueqYfjm43oqK38=
golang.org/x/mod v0.5.1/go.mod h1:5OXOZSfqPIIbmVBIIKWRFfZjPR0E5r58TLhUjH0a2Ro=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c h1:F1jZWGFhYfh0Ci55sIpILtKKK8p3i2/krTr0H1rg74I=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20211019181941-9d821ace8654 h1:id054HUawV2/6IGm2IV8KZQjqtwAOo2CYlOToYqa0d0=
golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf h1:MZ2shdL+ZM/XzY3ZGOnh4Nlpnxz5GSOhOmtHo3iPU6M=
golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.1.8/go.mod h1:nABZi5QlRsZVlzPpHl034qft6wpY4eDcsTt5AaioBiU=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=

View file

@ -9,11 +9,9 @@
package colorizer
import (
"fmt"
"os"
"strconv"
"strings"
lumin "github.com/johnkerl/lumin/pkg/colors"
"github.com/mattn/go-isatty"
)
@ -36,49 +34,49 @@ func SetColorization(arg TOutputColorization) {
// For command-line flags like --pass-color 208 etc
func SetKeyColor(name string) bool {
escape, ok := makeANSIEscapesFromName(name)
escape, ok := lumin.MakeANSIEscapesFromName(name)
if ok {
keyColorString = escape
}
return ok
}
func SetValueColor(name string) bool {
escape, ok := makeANSIEscapesFromName(name)
escape, ok := lumin.MakeANSIEscapesFromName(name)
if ok {
valueColorString = escape
}
return ok
}
func SetPassColor(name string) bool {
escape, ok := makeANSIEscapesFromName(name)
escape, ok := lumin.MakeANSIEscapesFromName(name)
if ok {
passColorString = escape
}
return ok
}
func SetFailColor(name string) bool {
escape, ok := makeANSIEscapesFromName(name)
escape, ok := lumin.MakeANSIEscapesFromName(name)
if ok {
failColorString = escape
}
return ok
}
func SetREPLPS1Color(name string) bool {
escape, ok := makeANSIEscapesFromName(name)
escape, ok := lumin.MakeANSIEscapesFromName(name)
if ok {
replPS1ColorString = escape
}
return ok
}
func SetREPLPS2Color(name string) bool {
escape, ok := makeANSIEscapesFromName(name)
escape, ok := lumin.MakeANSIEscapesFromName(name)
if ok {
replPS2ColorString = escape
}
return ok
}
func SetHelpColor(name string) bool {
escape, ok := makeANSIEscapesFromName(name)
escape, ok := lumin.MakeANSIEscapesFromName(name)
if ok {
helpColorString = escape
}
@ -117,90 +115,61 @@ func MaybeColorizeHelp(text string, outputIsStdout bool) string {
// ListColorCodes shows codes in the range 0..255.
// For --list-color-codes command-line flag.
func ListColorCodes() {
fmt.Println("Available color codes:")
for i := 0; i <= 255; i++ {
fmt.Printf("%s%3d%s", makeColorString(i), i, defaultColorString)
if i%16 < 15 {
fmt.Print(" ")
} else {
fmt.Print("\n")
}
}
lumin.ListColorCodes()
}
// ListColorNames shows names for codes in the range 0..255.
// For --list-color-names command-line flag.
func ListColorNames() {
fmt.Println("Available color names:")
for _, pair := range namesAndCodes {
fmt.Printf(
"%s%-20s%s %d\n",
makeColorString(pair.code), pair.name, defaultColorString, pair.code,
)
}
lumin.ListColorNames()
}
// makeANSIEscapesFromName takes several pieces delimited by "-", e.g. "bold-red" or "red-bold" or
// "underline-236".
func makeANSIEscapesFromName(name string) (string, bool) {
namePieces := strings.Split(name, "-")
escapePieces := make([]string, len(namePieces))
for i := range namePieces {
escapePiece, ok := makeANSIEscapeFromName(namePieces[i])
if !ok {
return "", false
}
escapePieces[i] = escapePiece
}
return strings.Join(escapePieces, ""), true
}
// ================================================================
// Internal implementation
// makeANSIEscapesFromNameUnconditionally is for hard-coded defaults within this source file.
func makeANSIEscapesFromNameUnconditionally(name string) string {
escape, ok := makeANSIEscapesFromName(name)
if !ok {
fmt.Fprintf(os.Stderr, "mlr: internal coding error in colorizer initialization.\n")
}
return escape
}
// makeANSIEscapeFromName operates on a single piece from makeANSIEscapesFromName, e.g. the "bold",
// "red", etc.
func makeANSIEscapeFromName(name string) (string, bool) {
if name == "plain" {
return "", true
} else if name == "bold" || name == "bolded" {
return boldString, true
} else if name == "underline" || name == "underlined" {
return underlineString, true
} else if name == "reverse" || name == "reversed" {
return reversedString, true
} else {
code, ok := makeColorCodeFromName(name)
if ok {
return makeColorString(code), true
func maybeColorize(text string, colorString string, outputIsStdout bool) string {
if outputIsStdout && stdoutIsATTY {
if colorization == ColorizeOutputNever {
return text
} else {
return "", false
return colorize(text, colorString)
}
} else {
if colorization == ColorizeOutputAlways {
return colorize(text, colorString)
} else {
return text
}
}
}
// makeColorCodeFromName looks up a named code, if available: e.g. "orchid"
// maps to 170.
func makeColorCodeFromName(name string) (int, bool) {
// Things like "170"
code, err := strconv.Atoi(name)
if err == nil {
return code, true
}
func colorize(text string, colorString string) string {
return colorString + text + defaultColorString
}
// Things like "orchid"
for _, pair := range namesAndCodes {
if pair.name == name {
return pair.code, true
// GetColorization is for the CSV writer
func GetColorization(outputIsStdout bool, isKey bool) (string, string) {
if outputIsStdout && stdoutIsATTY {
if colorization == ColorizeOutputNever {
return "", ""
} else {
if isKey {
return keyColorString, defaultColorString
} else {
return valueColorString, defaultColorString
}
}
} else {
if colorization == ColorizeOutputAlways {
if isKey {
return keyColorString, defaultColorString
} else {
return valueColorString, defaultColorString
}
} else {
return "", ""
}
}
return -1, false
}
// ================================================================
@ -208,20 +177,16 @@ func makeColorCodeFromName(name string) (int, bool) {
// Default ANSI color codes
// 6.0.0:
// var keyColorString = makeANSIEscapesFromNameUnconditionally("orange")
// var valueColorString = makeANSIEscapesFromNameUnconditionally("blue")
// var keyColorString = lumin.MakeANSIEscapesFromNameUnconditionally("orange")
// var valueColorString = lumin.MakeANSIEscapesFromNameUnconditionally("blue")
// 6.1.0:
var keyColorString = makeANSIEscapesFromNameUnconditionally("bold")
var valueColorString = makeANSIEscapesFromNameUnconditionally("plain")
var passColorString = makeANSIEscapesFromNameUnconditionally("bold-lime")
var failColorString = makeANSIEscapesFromNameUnconditionally("bold-red")
var replPS1ColorString = makeANSIEscapesFromNameUnconditionally("bold-red")
var replPS2ColorString = makeANSIEscapesFromNameUnconditionally("red")
var helpColorString = makeANSIEscapesFromNameUnconditionally("bold-red")
const boldString = "\u001b[1m"
const underlineString = "\u001b[4m"
const reversedString = "\u001b[7m"
var keyColorString = lumin.MakeANSIEscapesFromNameUnconditionally("bold-underline")
var valueColorString = lumin.MakeANSIEscapesFromNameUnconditionally("plain")
var passColorString = lumin.MakeANSIEscapesFromNameUnconditionally("bold-lime")
var failColorString = lumin.MakeANSIEscapesFromNameUnconditionally("bold-red")
var replPS1ColorString = lumin.MakeANSIEscapesFromNameUnconditionally("bold-red")
var replPS2ColorString = lumin.MakeANSIEscapesFromNameUnconditionally("red")
var helpColorString = lumin.MakeANSIEscapesFromNameUnconditionally("bold-red")
// Used to switch back to default color
var defaultColorString = "\u001b[0m"
@ -272,6 +237,15 @@ func init() {
}
}
func makeColorStringFromEnv(envName string) (string, bool) {
envValue := os.Getenv(envName)
if envValue == "" {
return "", false
}
return lumin.MakeANSIEscapesFromName(envValue)
}
func getStdoutIsATTY() bool {
// Don't try ANSI color on Windows (except Cygwin)
if os.Getenv("TERM") == "" {
@ -285,359 +259,3 @@ func getStdoutIsATTY() bool {
}
return false
}
// make16ColorString constructs an ANSI-16-color-mode escape sequence
func make16ColorString(i int) string {
i &= 15
boldBit := (i >> 3) & 1
colorBits := i & 7
return fmt.Sprintf("\u001b[%d;%dm", boldBit, 30+colorBits)
}
// make256ColorString constructs an ANSI-256-color-mode escape sequence
func make256ColorString(i int) string {
i &= 255
return fmt.Sprintf("\u001b[1;38;5;%dm", i&255)
}
// makeColorString constructs an ANSI-16-color-mode escape sequence if arg is
// in 0..15, else ANSI-256-color-mode escape sequence
func makeColorString(i int) string {
if 0 <= i && i <= 15 {
return make16ColorString(i)
} else {
return make256ColorString(i)
}
}
func makeColorStringFromEnv(envName string) (string, bool) {
envValue := os.Getenv(envName)
if envValue == "" {
return "", false
}
return makeANSIEscapesFromName(envValue)
}
func maybeColorize(text string, colorString string, outputIsStdout bool) string {
if outputIsStdout && stdoutIsATTY {
if colorization == ColorizeOutputNever {
return text
} else {
return colorize(text, colorString)
}
} else {
if colorization == ColorizeOutputAlways {
return colorize(text, colorString)
} else {
return text
}
}
}
func colorize(text string, colorString string) string {
return colorString + text + defaultColorString
}
// GetColorization is for the CSV writer
func GetColorization(outputIsStdout bool, isKey bool) (string, string) {
if outputIsStdout && stdoutIsATTY {
if colorization == ColorizeOutputNever {
return "", ""
} else {
if isKey {
return keyColorString, defaultColorString
} else {
return valueColorString, defaultColorString
}
}
} else {
if colorization == ColorizeOutputAlways {
if isKey {
return keyColorString, defaultColorString
} else {
return valueColorString, defaultColorString
}
} else {
return "", ""
}
}
}
// ----------------------------------------------------------------
// Name-to-code lookup table.
//
// Source: https://jonasjacek.github.io/colors/
//
// This is intentionally an array, not a map.
//
// Map would be more efficient for lookup but maps do not preserve
// insertion-ordering in Go -- so, doing 'list colors' would print them in a
// random order. To do nice 'list colors' we'd have to put them in this kind of
// array and sort anyway. Also, lookups are done exactly once at program start
// -- so, it's more efficient to make this an array with lookup by search, than
// to populate a hash-map (computing hashcodes) for a use-once hash lookup.
type tNameAndCode struct {
name string
code int
}
var namesAndCodes = []tNameAndCode{
{"aqua", 14},
{"aquamarine1", 122},
// {"aquamarine1", 86}, // duplicate
{"aquamarine3", 79},
{"black", 0},
{"blue", 12},
{"blue1", 21},
{"blue3", 19},
// {"blue3", 20}, // duplicate
{"blueviolet", 57},
{"cadetblue", 72},
// {"cadetblue", 73}, // duplicate
{"chartreuse1", 118},
{"chartreuse2", 112},
// {"chartreuse2", 82}, // duplicate
{"chartreuse3", 70},
// {"chartreuse3", 76}, // duplicate
{"chartreuse4", 64},
{"cornflowerblue", 69},
{"cornsilk1", 230},
{"cyan1", 51},
{"cyan2", 50},
{"cyan3", 43},
{"darkblue", 18},
{"darkcyan", 36},
{"darkgoldenrod", 136},
{"darkgreen", 22},
{"darkkhaki", 143},
{"darkmagenta", 90},
// {"darkmagenta", 91}, // duplicate
{"darkolivegreen1", 191},
// {"darkolivegreen1", 192}, // duplicate
{"darkolivegreen2", 155},
{"darkolivegreen3", 107},
// {"darkolivegreen3", 113}, // duplicate
// {"darkolivegreen3", 149}, // duplicate
{"darkorange", 208},
{"darkorange3", 130},
// {"darkorange3", 166}, // duplicate
{"darkred", 52},
// {"darkred", 88}, // duplicate
{"darkseagreen", 108},
{"darkseagreen1", 158},
// {"darkseagreen1", 193}, // duplicate
{"darkseagreen2", 151},
// {"darkseagreen2", 157}, // duplicate
{"darkseagreen3", 115},
// {"darkseagreen3", 150}, // duplicate
{"darkseagreen4", 65},
// {"darkseagreen4", 71}, // duplicate
{"darkslategray1", 123},
{"darkslategray2", 87},
{"darkslategray3", 116},
{"darkturquoise", 44},
{"darkviolet", 128},
// {"darkviolet", 92}, // duplicate
{"deeppink1", 198},
// {"deeppink1", 199}, // duplicate
{"deeppink2", 197},
{"deeppink3", 161},
// {"deeppink3", 162}, // duplicate
{"deeppink4", 125},
// {"deeppink4", 53}, // duplicate
// {"deeppink4", 89}, // duplicate
{"deepskyblue1", 39},
{"deepskyblue2", 38},
{"deepskyblue3", 31},
// {"deepskyblue3", 32}, // duplicate
{"deepskyblue4", 23},
// {"deepskyblue4", 24}, // duplicate
// {"deepskyblue4", 25}, // duplicate
{"dodgerblue1", 33},
{"dodgerblue2", 27},
{"dodgerblue3", 26},
{"fuchsia", 13},
{"gold1", 220},
{"gold3", 142},
// {"gold3", 178}, // duplicate
{"green", 2},
{"green1", 46},
{"green3", 34},
// {"green3", 40}, // duplicate
{"green4", 28},
{"greenyellow", 154},
{"grey", 8},
{"grey0", 16},
{"grey100", 231},
{"grey11", 234},
{"grey15", 235},
{"grey19", 236},
{"grey23", 237},
{"grey27", 238},
{"grey3", 232},
{"grey30", 239},
{"grey35", 240},
{"grey37", 59},
{"grey39", 241},
{"grey42", 242},
{"grey46", 243},
{"grey50", 244},
{"grey53", 102},
{"grey54", 245},
{"grey58", 246},
{"grey62", 247},
{"grey63", 139},
{"grey66", 248},
{"grey69", 145},
{"grey7", 233},
{"grey70", 249},
{"grey74", 250},
{"grey78", 251},
{"grey82", 252},
{"grey84", 188},
{"grey85", 253},
{"grey89", 254},
{"grey93", 255},
{"honeydew2", 194},
{"hotpink", 205},
// {"hotpink", 206}, // duplicate
{"hotpink2", 169},
{"hotpink3", 132},
// {"hotpink3", 168}, // duplicate
{"indianred", 131},
// {"indianred", 167}, // duplicate
{"indianred1", 203},
// {"indianred1", 204}, // duplicate
{"khaki1", 228},
{"khaki3", 185},
{"lightcoral", 210},
{"lightcyan1", 195},
{"lightcyan3", 152},
{"lightgoldenrod1", 227},
{"lightgoldenrod2", 186},
// {"lightgoldenrod2", 221}, // duplicate
// {"lightgoldenrod2", 222}, // duplicate
{"lightgoldenrod3", 179},
{"lightgreen", 119},
// {"lightgreen", 120}, // duplicate
{"lightpink1", 217},
{"lightpink3", 174},
{"lightpink4", 95},
{"lightsalmon1", 216},
{"lightsalmon3", 137},
// {"lightsalmon3", 173}, // duplicate
{"lightseagreen", 37},
{"lightskyblue1", 153},
{"lightskyblue3", 109},
// {"lightskyblue3", 110}, // duplicate
{"lightslateblue", 105},
{"lightslategrey", 103},
{"lightsteelblue", 147},
{"lightsteelblue1", 189},
{"lightsteelblue3", 146},
{"lightyellow3", 187},
{"lime", 10},
{"magenta1", 201},
{"magenta2", 165},
//{"magenta2", 200}, // duplicate
{"magenta3", 127},
// {"magenta3", 163}, // duplicate
// {"magenta3", 164}, // duplicate
{"maroon", 1},
{"mediumorchid", 134},
{"mediumorchid1", 171},
// {"mediumorchid1", 207}, // duplicate
{"mediumorchid3", 133},
{"mediumpurple", 104},
{"mediumpurple1", 141},
{"mediumpurple2", 135},
// {"mediumpurple2", 140}, // duplicate
{"mediumpurple3", 97},
// {"mediumpurple3", 98}, // duplicate
{"mediumpurple4", 60},
{"mediumspringgreen", 49},
{"mediumturquoise", 80},
{"mediumvioletred", 126},
{"mistyrose1", 224},
{"mistyrose3", 181},
{"navajowhite1", 223},
{"navajowhite3", 144},
{"navy", 4},
{"navyblue", 17},
{"olive", 3},
{"orange1", 214},
{"orange3", 172},
{"orange4", 58},
// {"orange4", 94}, // duplicate
{"orangered1", 202},
{"orchid", 170},
{"orchid1", 213},
{"orchid2", 212},
{"palegreen1", 121},
// {"palegreen1", 156}, // duplicate
{"palegreen3", 114},
// {"palegreen3", 77}, // duplicate
{"paleturquoise1", 159},
{"paleturquoise4", 66},
{"palevioletred1", 211},
{"pink1", 218},
{"pink3", 175},
{"plum1", 219},
{"plum2", 183},
{"plum3", 176},
{"plum4", 96},
{"purple", 129},
//{"purple", 5}, // duplicate
//{"purple", 93}, // duplicate
{"purple3", 56},
{"purple4", 54},
//{"purple4", 55}, // duplicate
{"red", 9},
{"red1", 196},
{"red3", 124},
//{"red3", 160}, // duplicate
{"rosybrown", 138},
{"royalblue1", 63},
{"salmon1", 209},
{"sandybrown", 215},
{"seagreen1", 84},
//{"seagreen1", 85}, // duplicate
{"seagreen2", 83},
{"seagreen3", 78},
{"silver", 7},
{"skyblue1", 117},
{"skyblue2", 111},
{"skyblue3", 74},
{"slateblue1", 99},
{"slateblue3", 61},
//{"slateblue3", 62}, // duplicate
{"springgreen1", 48},
{"springgreen2", 42},
//{"springgreen2", 47}, // duplicate
{"springgreen3", 35},
//{"springgreen3", 41}, // duplicate
{"springgreen4", 29},
{"steelblue", 67},
{"steelblue1", 75},
//{"steelblue1", 81}, // duplicate
{"steelblue3", 68},
{"tan", 180},
{"teal", 6},
{"thistle1", 225},
{"thistle3", 182},
{"turquoise2", 45},
{"turquoise4", 30},
{"violet", 177},
{"wheat1", 229},
{"wheat4", 101},
{"white", 15},
{"yellow", 11},
{"yellow1", 226},
{"yellow2", 190},
{"yellow3", 148},
//{"yellow3", 184}, // duplicate
{"yellow4", 100},
//{"yellow4", 106}, // duplicate
}

View file

@ -26,6 +26,8 @@ FEATURES
* colors
o lumin import
- lumin verstag
- lumin needs bold/underline/reversed -> help; plus x-y-z syntax
- wup for local go.mod override
o RT w/ -C
o olh/webdocs x several