From 0c38c59dd225ffaa5005d587881cc8348a39251c Mon Sep 17 00:00:00 2001 From: davidovski Date: Wed, 27 Dec 2023 03:30:51 +0000 Subject: initial commit --- README.md | 3 +++ typr.sh | 83 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 README.md create mode 100755 typr.sh diff --git a/README.md b/README.md new file mode 100644 index 0000000..c05cf28 --- /dev/null +++ b/README.md @@ -0,0 +1,3 @@ +# typr + +a typing test for the terminal written in shell diff --git a/typr.sh b/typr.sh new file mode 100755 index 0000000..7177153 --- /dev/null +++ b/typr.sh @@ -0,0 +1,83 @@ +#!/bin/sh + +entered_text="" +text="the quick brown fox jumps over the lazy dog" + +tty_init () { + tput clear + export SAVED_TTY_SETTINGS=$(stty -g) + stty raw -echo + trap typr_cleanup 1 2 3 6 + + printf "[3 q" + +} + +tty_cleanup () { + tput clear + stty $SAVED_TTY_SETTINGS +} + +tty_readc () { + stty -echo -icanon min 1 time 0 + s="$(dd bs=1 count=1 of=/dev/stdout 2>/dev/null)" + stty -icanon min 0 time 0 + [ "$s" = "" ] && { + s="$s$(dd bs=1 count=2 of=/dev/stdout 2>/dev/null)" + } + printf "$s" +} + +typr_draw_text () { + tput civis + tput clear + printf "" + + t="$text" + e="$entered_text" + while [ "$t" ] ; do + ct=${t%${t#?}} + ce=${e%${e#?}} + t="${t#?}" + e="${e#?}" + + [ "$ct" = "$ce" ] \ + && printf "" \ + || { + [ "$e" ] \ + && printf "" \ + || printf "" + } + + printf "$ct" + done + printf "[1;$((${#entered_text} + 1))H" + tput cnorm +} + + +typr_main () { + while true; do + typr_draw_text + c="$(tty_readc)" + case "$c" in + ' ') break;; + '') + entered_text="${entered_text%?}" + ;; + *) + echo "$c" >> LOG + entered_text="$entered_text$c" + ;; + + esac + done +} + +typr_init () { + tty_init + typr_main + tty_cleanup +} + +typr_init -- cgit v1.2.1