diff --git a/iris-colorize/.gitignore b/iris-colorize/.gitignore new file mode 100644 index 0000000..2472346 --- /dev/null +++ b/iris-colorize/.gitignore @@ -0,0 +1 @@ +iris-colorize diff --git a/iris-colorize/main.go b/iris-colorize/main.go new file mode 100644 index 0000000..86d0909 --- /dev/null +++ b/iris-colorize/main.go @@ -0,0 +1,59 @@ +package main + +import ( + "fmt" + "io" + "log" + "os" + "regexp" + "sort" + "strings" +) + +var ( + delimRE = regexp.MustCompile(`\\\{|\{[niuvrgybmcw]+\s|\\\}|\}`) + colorMap = map[byte]byte{ + 'n': 0, + 'i': 1, + 'u': 4, + 'v': 7, + 'r': 31, + 'g': 32, + 'y': 33, + 'b': 34, + 'm': 35, + 'c': 36, + 'w': 37, + } +) + +func main() { + src, err := io.ReadAll(os.Stdin) + if err != nil { + log.Fatal(err) + } + + _, _ = os.Stdout.Write(delimRE.ReplaceAllFunc(src, func(b []byte) []byte { + switch b[0] { + case '\\': + return []byte{b[1]} + case '}': + return []byte("\033[0m") + case '{': + mods := make([]byte, len(b)-2) + for i, c := range b[1 : len(b)-1] { + mods[i] = colorMap[c] + } + sort.Slice(mods, func(i, j int) bool { return mods[i] < mods[j] }) + + codes := make([]string, len(mods)) + for i, c := range mods { + codes[i] = fmt.Sprintf("%d", c) + } + + return []byte("\033[" + strings.Join(codes, ";") + "m") + } + + panic("unreachable") + })) +} diff --git a/script/iris-slrn b/script/iris-slrn new file mode 100755 index 0000000..3b328fa --- /dev/null +++ b/script/iris-slrn @@ -0,0 +1,4 @@ +#!/usr/bin/env sh + +$(dirname $0)/with-iris-news \ + sh -c "$(echo 'exec /usr/bin/slrn -h "$NNTPSERVER"' "$@")" diff --git a/script/iris-tin b/script/iris-tin new file mode 100755 index 0000000..f21ad9a --- /dev/null +++ b/script/iris-tin @@ -0,0 +1,4 @@ +#!/usr/bin/env sh + +$(dirname $0)/with-iris-news \ + sh -c "$(echo 'exec /usr/bin/tin -r -g "$NNTPHOST" -p "$NNTPPORT"' "${@:-ctrl-c.iris}")" diff --git a/script/with-iris-news b/script/with-iris-news new file mode 100755 index 0000000..82e0160 --- /dev/null +++ b/script/with-iris-news @@ -0,0 +1,20 @@ +#!/usr/bin/env bash + +$(dirname $0)/iris-news >/dev/null 2>&1 & +serverpid="$!" + +sleep 1 +addr="$(cat ~/.iris-news-server)" + +function cleanup { + kill $serverpid + rm ~/.iris-news-server + tail --pid $serverpid -f /dev/null +} +trap cleanup EXIT + +env \ + NNTPSERVER="$addr" \ + NNTPHOST="${addr%%:*}" \ + NNTPPORT="${addr##*:}" \ + "$@"