diff options
author | bptato <nincsnevem662@gmail.com> | 2023-06-29 13:39:58 +0200 |
---|---|---|
committer | bptato <nincsnevem662@gmail.com> | 2023-06-29 13:51:55 +0200 |
commit | 19068fd7d803a157de671e189e01731bc903ba9e (patch) | |
tree | aae00bec40a00b67586373199cfe6d9789e19013 | |
parent | 1dd9eba6aba9760339fbef9bbd4244108fac2eab (diff) | |
download | chawan-19068fd7d803a157de671e189e01731bc903ba9e.tar.gz |
Factor out map search, remove sugar
-rw-r--r-- | src/data/idna.nim | 12 | ||||
-rw-r--r-- | src/encoding/encoderstream.nim | 8 | ||||
-rw-r--r-- | src/io/lineedit.nim | 12 | ||||
-rw-r--r-- | src/types/color.nim | 313 | ||||
-rw-r--r-- | src/utils/map.nim | 21 | ||||
-rw-r--r-- | src/utils/opt.nim | 7 | ||||
-rw-r--r-- | src/utils/twtstr.nim | 14 |
7 files changed, 200 insertions, 187 deletions
diff --git a/src/data/idna.nim b/src/data/idna.nim index 451792a2..a067a66f 100644 --- a/src/data/idna.nim +++ b/src/data/idna.nim @@ -2,9 +2,10 @@ import algorithm import unicode import sets import tables -import sugar import strutils +import utils/map + type IDNATableStatus* = enum IDNA_VALID, IDNA_IGNORED, IDNA_MAPPED, IDNA_DEVIATION, IDNA_DISALLOWED @@ -141,15 +142,6 @@ const (MappedMap, Ignored, Deviation) = loadStuff(IdnaMappingTable) -func searchInMap[U, T](a: openarray[(U, T)], u: U): int = - binarySearch(a, u, (x, y) => cmp(x[0], y)) - -func isInMap[U, T](a: openarray[(U, T)], u: U): bool = - a.searchInMap(u) != -1 - -func isInRange[U](a: openarray[(U, U)], u: U): bool = - binarySearch(a, u, (x, y) => (if x[0] < y: -1 elif x[1] > y: 1 else: 0)) != -1 - func getIdnaTableStatus*(r: Rune): IDNATableStatus = let i = uint32(r) {.cast(noSideEffect).}: diff --git a/src/encoding/encoderstream.nim b/src/encoding/encoderstream.nim index 57f27dd1..56d4c3da 100644 --- a/src/encoding/encoderstream.nim +++ b/src/encoding/encoderstream.nim @@ -5,6 +5,7 @@ import streams import unicode import data/charset +import utils/map # EncoderStream encodes utf-32 to the specified encoding. type @@ -57,12 +58,7 @@ template append_byte(stream: EncoderStream, c: int, stream.append_byte cast[uint8](c), oq, olen, n func findPair[U, V](map: seq[(U, V)], c: uint32): int = - when not (typeof(c) is U): - if c > cast[typeof(c)](high(U)): - return -1 - return binarySearch(map, cast[U](c), - proc(a: tuple[ucs: U, val: V], b: U): int = - cmp(a.ucs, b)) + return searchInMap(map, cast[U](c)) proc handleError(stream: EncoderStream, oq: ptr UncheckedArray[uint8], olen: int, n: var int, c: uint32) = diff --git a/src/io/lineedit.nim b/src/io/lineedit.nim index 83f98ccb..51bf7cd9 100644 --- a/src/io/lineedit.nim +++ b/src/io/lineedit.nim @@ -1,7 +1,6 @@ import unicode import strutils import sequtils -import sugar import bindings/quickjs import buffer/cell @@ -153,7 +152,16 @@ proc drawPrompt*(edit: LineEdit) = proc insertCharseq(edit: LineEdit, cs: var seq[Rune]) = let escNext = edit.escNext - cs.keepIf((r) => (escNext or not r.isControlChar) and not (r.isAscii and char(r) in edit.disallowed)) + var i = 0 + for j in 0 ..< cs.len: + if cs[i].isAscii(): + let c = cast[char](cs[i]) + if not escNext and c in Controls or c in edit.disallowed: + continue + if i != j: + cs[i] = cs[j] + inc i + edit.escNext = false if cs.len == 0: return diff --git a/src/types/color.nim b/src/types/color.nim index a22ce1e5..d917569a 100644 --- a/src/types/color.nim +++ b/src/types/color.nim @@ -1,8 +1,6 @@ import math import options -import sequtils import strutils -import sugar import tables import utils/twtstr @@ -62,156 +60,161 @@ const ANSI_CYAN* = ANSIColor(6u8) ANSI_WHITE* = ANSIColor(7u8) -const ColorsRGB* = { - "aliceblue": 0xf0f8ff, - "antiquewhite": 0xfaebd7, - "aqua": 0x00ffff, - "aquamarine": 0x7fffd4, - "azure": 0xf0ffff, - "beige": 0xf5f5dc, - "bisque": 0xffe4c4, - "black": 0x000000, - "blanchedalmond": 0xffebcd, - "blue": 0x0000ff, - "blueviolet": 0x8a2be2, - "brown": 0xa52a2a, - "burlywood": 0xdeb887, - "cadetblue": 0x5f9ea0, - "chartreuse": 0x7fff00, - "chocolate": 0xd2691e, - "coral": 0xff7f50, - "cornflowerblue": 0x6495ed, - "cornsilk": 0xfff8dc, - "crimson": 0xdc143c, - "cyan": 0x00ffff, - "darkblue": 0x00008b, - "darkcyan": 0x008b8b, - "darkgoldenrod": 0xb8860b, - "darkgray": 0xa9a9a9, - "darkgreen": 0x006400, - "darkgrey": 0xa9a9a9, - "darkkhaki": 0xbdb76b, - "darkmagenta": 0x8b008b, - "darkolivegreen": 0x556b2f, - "darkorange": 0xff8c00, - "darkorchid": 0x9932cc, - "darkred": 0x8b0000, - "darksalmon": 0xe9967a, - "darkseagreen": 0x8fbc8f, - "darkslateblue": 0x483d8b, - "darkslategray": 0x2f4f4f, - "darkslategrey": 0x2f4f4f, - "darkturquoise": 0x00ced1, - "darkviolet": 0x9400d3, - "deeppink": 0xff1493, - "deepskyblue": 0x00bfff, - "dimgray": 0x696969, - "dimgrey": 0x696969, - "dodgerblue": 0x1e90ff, - "firebrick": 0xb22222, - "floralwhite": 0xfffaf0, - "forestgreen": 0x228b22, - "fuchsia": 0xff00ff, - "gainsboro": 0xdcdcdc, - "ghostwhite": 0xf8f8ff, - "gold": 0xffd700, - "goldenrod": 0xdaa520, - "gray": 0x808080, - "green": 0x008000, - "greenyellow": 0xadff2f, - "grey": 0x808080, - "honeydew": 0xf0fff0, - "hotpink": 0xff69b4, - "indianred": 0xcd5c5c, - "indigo": 0x4b0082, - "ivory": 0xfffff0, - "khaki": 0xf0e68c, - "lavender": 0xe6e6fa, - "lavenderblush": 0xfff0f5, - "lawngreen": 0x7cfc00, - "lemonchiffon": 0xfffacd, - "lightblue": 0xadd8e6, - "lightcoral": 0xf08080, - "lightcyan": 0xe0ffff, - "lightgoldenrodyellow": 0xfafad2, - "lightgray": 0xd3d3d3, - "lightgreen": 0x90ee90, - "lightgrey": 0xd3d3d3, - "lightpink": 0xffb6c1, - "lightsalmon": 0xffa07a, - "lightseagreen": 0x20b2aa, - "lightskyblue": 0x87cefa, - "lightslategray": 0x778899, - "lightslategrey": 0x778899, - "lightsteelblue": 0xb0c4de, - "lightyellow": 0xffffe0, - "lime": 0x00ff00, - "limegreen": 0x32cd32, - "linen": 0xfaf0e6, - "magenta": 0xff00ff, - "maroon": 0x800000, - "mediumaquamarine": 0x66cdaa, - "mediumblue": 0x0000cd, - "mediumorchid": 0xba55d3, - "mediumpurple": 0x9370db, - "mediumseagreen": 0x3cb371, - "mediumslateblue": 0x7b68ee, - "mediumspringgreen": 0x00fa9a, - "mediumturquoise": 0x48d1cc, - "mediumvioletred": 0xc71585, - "midnightblue": 0x191970, - "mintcream": 0xf5fffa, - "mistyrose": 0xffe4e1, - "moccasin": 0xffe4b5, - "navajowhite": 0xffdead, - "navy": 0x000080, - "oldlace": 0xfdf5e6, - "olive": 0x808000, - "olivedrab": 0x6b8e23, - "orange": 0xffa500, - "orangered": 0xff4500, - "orchid": 0xda70d6, - "palegoldenrod": 0xeee8aa, - "palegreen": 0x98fb98, - "paleturquoise": 0xafeeee, - "palevioletred": 0xdb7093, - "papayawhip": 0xffefd5, - "peachpuff": 0xffdab9, - "peru": 0xcd853f, - "pink": 0xffc0cb, - "plum": 0xdda0dd, - "powderblue": 0xb0e0e6, - "purple": 0x800080, - "red": 0xff0000, - "rosybrown": 0xbc8f8f, - "royalblue": 0x4169e1, - "saddlebrown": 0x8b4513, - "salmon": 0xfa8072, - "sandybrown": 0xf4a460, - "seagreen": 0x2e8b57, - "seashell": 0xfff5ee, - "sienna": 0xa0522d, - "silver": 0xc0c0c0, - "skyblue": 0x87ceeb, - "slateblue": 0x6a5acd, - "slategray": 0x708090, - "slategrey": 0x708090, - "snow": 0xfffafa, - "springgreen": 0x00ff7f, - "steelblue": 0x4682b4, - "tan": 0xd2b48c, - "teal": 0x008080, - "thistle": 0xd8bfd8, - "tomato": 0xff6347, - "turquoise": 0x40e0d0, - "violet": 0xee82ee, - "wheat": 0xf5deb3, - "white": 0xffffff, - "whitesmoke": 0xf5f5f5, - "yellow": 0xffff00, - "yellowgreen": 0x9acd32, - "rebeccapurple": 0x663399, -}.map((a) => (a[0], RGBColor(a[1]))).toTable() +const ColorsRGB* = block: + const ColorsRGBMap = { + "aliceblue": 0xf0f8ff, + "antiquewhite": 0xfaebd7, + "aqua": 0x00ffff, + "aquamarine": 0x7fffd4, + "azure": 0xf0ffff, + "beige": 0xf5f5dc, + "bisque": 0xffe4c4, + "black": 0x000000, + "blanchedalmond": 0xffebcd, + "blue": 0x0000ff, + "blueviolet": 0x8a2be2, + "brown": 0xa52a2a, + "burlywood": 0xdeb887, + "cadetblue": 0x5f9ea0, + "chartreuse": 0x7fff00, + "chocolate": 0xd2691e, + "coral": 0xff7f50, + "cornflowerblue": 0x6495ed, + "cornsilk": 0xfff8dc, + "crimson": 0xdc143c, + "cyan": 0x00ffff, + "darkblue": 0x00008b, + "darkcyan": 0x008b8b, + "darkgoldenrod": 0xb8860b, + "darkgray": 0xa9a9a9, + "darkgreen": 0x006400, + "darkgrey": 0xa9a9a9, + "darkkhaki": 0xbdb76b, + "darkmagenta": 0x8b008b, + "darkolivegreen": 0x556b2f, + "darkorange": 0xff8c00, + "darkorchid": 0x9932cc, + "darkred": 0x8b0000, + "darksalmon": 0xe9967a, + "darkseagreen": 0x8fbc8f, + "darkslateblue": 0x483d8b, + "darkslategray": 0x2f4f4f, + "darkslategrey": 0x2f4f4f, + "darkturquoise": 0x00ced1, + "darkviolet": 0x9400d3, + "deeppink": 0xff1493, + "deepskyblue": 0x00bfff, + "dimgray": 0x696969, + "dimgrey": 0x696969, + "dodgerblue": 0x1e90ff, + "firebrick": 0xb22222, + "floralwhite": 0xfffaf0, + "forestgreen": 0x228b22, + "fuchsia": 0xff00ff, + "gainsboro": 0xdcdcdc, + "ghostwhite": 0xf8f8ff, + "gold": 0xffd700, + "goldenrod": 0xdaa520, + "gray": 0x808080, + "green": 0x008000, + "greenyellow": 0xadff2f, + "grey": 0x808080, + "honeydew": 0xf0fff0, + "hotpink": 0xff69b4, + "indianred": 0xcd5c5c, + "indigo": 0x4b0082, + "ivory": 0xfffff0, + "khaki": 0xf0e68c, + "lavender": 0xe6e6fa, + "lavenderblush": 0xfff0f5, + "lawngreen": 0x7cfc00, + "lemonchiffon": 0xfffacd, + "lightblue": 0xadd8e6, + "lightcoral": 0xf08080, + "lightcyan": 0xe0ffff, + "lightgoldenrodyellow": 0xfafad2, + "lightgray": 0xd3d3d3, + "lightgreen": 0x90ee90, + "lightgrey": 0xd3d3d3, + "lightpink": 0xffb6c1, + "lightsalmon": 0xffa07a, + "lightseagreen": 0x20b2aa, + "lightskyblue": 0x87cefa, + "lightslategray": 0x778899, + "lightslategrey": 0x778899, + "lightsteelblue": 0xb0c4de, + "lightyellow": 0xffffe0, + "lime": 0x00ff00, + "limegreen": 0x32cd32, + "linen": 0xfaf0e6, + "magenta": 0xff00ff, + "maroon": 0x800000, + "mediumaquamarine": 0x66cdaa, + "mediumblue": 0x0000cd, + "mediumorchid": 0xba55d3, + "mediumpurple": 0x9370db, + "mediumseagreen": 0x3cb371, + "mediumslateblue": 0x7b68ee, + "mediumspringgreen": 0x00fa9a, + "mediumturquoise": 0x48d1cc, + "mediumvioletred": 0xc71585, + "midnightblue": 0x191970, + "mintcream": 0xf5fffa, + "mistyrose": 0xffe4e1, + "moccasin": 0xffe4b5, + "navajowhite": 0xffdead, + "navy": 0x000080, + "oldlace": 0xfdf5e6, + "olive": 0x808000, + "olivedrab": 0x6b8e23, + "orange": 0xffa500, + "orangered": 0xff4500, + "orchid": 0xda70d6, + "palegoldenrod": 0xeee8aa, + "palegreen": 0x98fb98, + "paleturquoise": 0xafeeee, + "palevioletred": 0xdb7093, + "papayawhip": 0xffefd5, + "peachpuff": 0xffdab9, + "peru": 0xcd853f, + "pink": 0xffc0cb, + "plum": 0xdda0dd, + "powderblue": 0xb0e0e6, + "purple": 0x800080, + "red": 0xff0000, + "rosybrown": 0xbc8f8f, + "royalblue": 0x4169e1, + "saddlebrown": 0x8b4513, + "salmon": 0xfa8072, + "sandybrown": 0xf4a460, + "seagreen": 0x2e8b57, + "seashell": 0xfff5ee, + "sienna": 0xa0522d, + "silver": 0xc0c0c0, + "skyblue": 0x87ceeb, + "slateblue": 0x6a5acd, + "slategray": 0x708090, + "slategrey": 0x708090, + "snow": 0xfffafa, + "springgreen": 0x00ff7f, + "steelblue": 0x4682b4, + "tan": 0xd2b48c, + "teal": 0x008080, + "thistle": 0xd8bfd8, + "tomato": 0xff6347, + "turquoise": 0x40e0d0, + "violet": 0xee82ee, + "wheat": 0xf5deb3, + "white": 0xffffff, + "whitesmoke": 0xf5f5f5, + "yellow": 0xffff00, + "yellowgreen": 0x9acd32, + "rebeccapurple": 0x663399, + } + var res: Table[string, RGBColor] + for it in ColorsRGBMap: + res[it[0]] = RGBColor(it[1]) + res func r*(c: RGBAColor): uint8 = return cast[uint8]((uint32(c) shr 16) and 0xff) @@ -319,12 +322,6 @@ func blend*(c0, c1: RGBAColor): RGBAColor = let res = straight(pres) return res -#func blend*(c0, c1: RGBAColor): RGBAColor = -# const norm = 1f64 / 255f64 -# let c0a = float64(c0.a) * norm -# let c1a = float64(c1.a) * norm -# let a0 = c0a + c1a * (1 - c0a) - func rgb*(r, g, b: uint8): RGBColor = return RGBColor((uint32(r) shl 16) or (uint32(g) shl 8) or uint32(b)) diff --git a/src/utils/map.nim b/src/utils/map.nim new file mode 100644 index 00000000..526b9154 --- /dev/null +++ b/src/utils/map.nim @@ -0,0 +1,21 @@ +import algorithm + +func searchInMap*[U, T](a: openarray[(U, T)], u: U): int = + when not (typeof(u) is U): + if c > cast[typeof(c)](high(U)): + return -1 + binarySearch(a, u, proc(x: (U, T), y: U): int = cmp(x[0], y)) + +func isInMap*[U, T](a: openarray[(U, T)], u: U): bool = + a.searchInMap(u) != -1 + +func isInRange*[U](a: openarray[(U, U)], u: U): bool = + let res = binarySearch(a, u, proc(x: (U, U), y: U): int = + if x[0] < y: + -1 + elif x[1] > y: + 1 + else: + 0 + ) + return res != -1 diff --git a/src/utils/opt.nim b/src/utils/opt.nim index bcc4c595..7dd045af 100644 --- a/src/utils/opt.nim +++ b/src/utils/opt.nim @@ -100,10 +100,7 @@ template `?`*[T, E](res: Result[T, E]): auto = else: when typeof(result) is Result[T, E]: return x - elif typeof(result).errType is E: - when E is void: - return err() - else: - return err(x.error) + elif not (E is void) and typeof(result).errType is E: + return err(x.error) else: return err() diff --git a/src/utils/twtstr.nim b/src/utils/twtstr.nim index 35023290..0c37439a 100644 --- a/src/utils/twtstr.nim +++ b/src/utils/twtstr.nim @@ -3,7 +3,6 @@ import strutils import unicode import os import math -import sugar import sequtils import options import punycode @@ -12,6 +11,7 @@ import bindings/libunicode import data/idna import data/charwidth import utils/opt +import utils/map when defined(posix): import posix @@ -308,7 +308,8 @@ const romanNumbers = [ (40, "XL"), (10, "X"), (9, "IX"), (5, "V"), (4, "IV"), (1, "I") ] -const romanNumbers_lower = romanNumbers.map((x) => (x[0], x[1].tolower())) +const romanNumbers_lower = romanNumbers.map(proc(x: auto): auto = + (x[0], x[1].tolower())) func romanNumber*(i: int): string = return number_additive(i, 1..3999, romanNumbers) @@ -721,6 +722,7 @@ func unicodeToAscii*(s: string, checkhyphens, checkbidi, checkjoiners, transitio return none(string) #error return some(labels.join('.')) + # https://www.w3.org/TR/xml/#NT-Name const NameStartCharRanges = [ (0xC0, 0xD6), @@ -755,7 +757,7 @@ func matchNameProduction*(str: string): bool = inc i else: fastRuneAt(str, i, r) - if binarySearch(NameStartCharRanges, int32(r), (x, y) => cmp(x[0], y)) == -1: + if not isInRange(NameStartCharRanges, int32(r)): return false # NameChar while i < str.len: @@ -765,9 +767,9 @@ func matchNameProduction*(str: string): bool = inc i else: fastRuneAt(str, i, r) - if binarySearch(NameStartCharRanges, int32(r), (x, y) => cmp(x[0], y)) == -1: - if binarySearch(NameCharRanges, int32(r), (x, y) => cmp(x[0], y)) == -1: - return false + if not isInRange(NameStartCharRanges, int32(r)) and + not isInMap(NameCharRanges, int32(r)): + return false return true func matchQNameProduction*(s: string): bool = |