Made more robust against unwanted escaping
This commit is contained in:
+14
-13
@@ -40,6 +40,7 @@ fi
|
||||
|
||||
# styling used in the TUI
|
||||
ESC=$'\x1b' # use the ANSI literal syntax to support in read prompts as well
|
||||
LF=$'\x0a' # let's do this
|
||||
ERESET="${ESC}[0m" # reset the styling
|
||||
ERRCOLOR="${ESC}[31;1m" # red bold
|
||||
LINKCOLOR="${ESC}[36;1m" # cyan bold
|
||||
@@ -59,7 +60,7 @@ MOUSEOFF="${ESC}[?1000;1006l" # term command to stop sending mouse input events
|
||||
# button_attr;xcoord;ycoord[Mm]
|
||||
|
||||
clear_term() { # clear the terminal on Ctrl+C interrupt
|
||||
printf '%b' "$MOUSEOFF$ERESET$ALTBUFOFF"
|
||||
printf '%s' "$MOUSEOFF$ERESET$ALTBUFOFF"
|
||||
exit 0
|
||||
}
|
||||
trap clear_term INT
|
||||
@@ -174,12 +175,12 @@ amrender() {
|
||||
local action="${fields[0]}" # to display an AM entry, we only need two of its fields
|
||||
local desc="${fields[1]}"
|
||||
if [[ 'E' == "$action" ]]; then # plain text
|
||||
output="${output}$desc\n"
|
||||
output="${output}${desc}${LF}"
|
||||
else # not plain text
|
||||
if [[ "$idx" == "$FOCUSLINEINDEX" ]]; then # if the current link is focused, then...
|
||||
output="${output}$FOCUSATTR" # print the focus attribute (the link contains ERESET anyway)
|
||||
output="${output}${FOCUSATTR}" # print the focus attribute (the link contains ERESET anyway)
|
||||
fi
|
||||
output="${output}$LINKCOLOR=> ${desc}$ERESET\n"
|
||||
output="${output}${LINKCOLOR}=> ${desc}${ERESET}${LF}"
|
||||
fi
|
||||
done
|
||||
# final preparations:
|
||||
@@ -187,7 +188,7 @@ amrender() {
|
||||
# - output current resource to the status line
|
||||
# - reset the cursor once again
|
||||
output="${output}$BELOWCLR${ESC}[$TERMROWS;0H$FOCUSATTR$(amtogopher "$CURRENTAM")$ERESET${ESC}[$TERMROWS;0H"
|
||||
printf '%b' "$output" # finally, print the entire output with a single call
|
||||
printf '%s' "$output" # finally, print the entire output with a single call
|
||||
}
|
||||
trap 'amrender' WINCH # rerender on terminal size change
|
||||
|
||||
@@ -221,7 +222,7 @@ jumplink() { # args: delta (usually 1 or -1)
|
||||
|
||||
amload() { # args: AM line[, forcedl]
|
||||
CURRENTAM="$1" # update current AM value
|
||||
printf '%b' "${LINECLR}Loading..."
|
||||
printf '%s' "${LINECLR}Loading..."
|
||||
readarray -t SCREENBUF < <(amclick "$CURRENTAM" "$2") # populate screen buffer by loading the resource from the AM entry
|
||||
NAVIGABLES=() # reset the navigable indexes
|
||||
CURLINKINDEX=0 # reset the link number
|
||||
@@ -258,7 +259,7 @@ goback() { # remove the last AM line from history and go there
|
||||
stashlink() { # stash the link to the currently viewed resource
|
||||
local gopherlink="$(amtogopher "$CURRENTAM")"
|
||||
printf '[%s] %s\n' "$(date -u '+%F %T')" "$gopherlink" >> $BOPHER_LINKSTASH
|
||||
printf 'Stashed %s%b' "$gopherlink" "$ERESET${ESC}[$TERMROWS;0H" # just reset the cursor to the last line
|
||||
printf 'Stashed %s%s' "$gopherlink" "$ERESET${ESC}[$TERMROWS;0H" # just reset the cursor to the last line
|
||||
}
|
||||
|
||||
# Focus and click a link on a Gophermap
|
||||
@@ -296,7 +297,7 @@ readmouseinput() { # correctly read the remaining mouse input in semi-long mode
|
||||
|
||||
# entry point code starts here
|
||||
|
||||
printf '%b' "$ALTBUFON$CLS" # enter ALTBUF mode and clear the screen
|
||||
printf '%s' "$ALTBUFON$CLS" # enter ALTBUF mode and clear the screen
|
||||
|
||||
# now, load the resource provided from the command line and start the main loop
|
||||
|
||||
@@ -311,15 +312,15 @@ mouseY=''
|
||||
mouseStatus='M'
|
||||
while true; do
|
||||
mousecmd='' # mouse command buffer
|
||||
printf '%b' "$MOUSEON" # enable mouse events before reading
|
||||
printf '%s' "$MOUSEON" # enable mouse events before reading
|
||||
read -n 1 -s cmdbuf # read the character, tildas will be ignored
|
||||
if [[ "$cmdbuf" == $'\x1b' ]]; then # here's the control character
|
||||
read -n 2 -s cmdbuf # read 2 additional characters
|
||||
if [[ "$cmdbuf" == "[<" ]]; then # we have a mouse event, read the button attribute and the coordinates
|
||||
if [[ "$cmdbuf" == '[<' ]]; then # we have a mouse event, read the button attribute and the coordinates
|
||||
read -r -s mousecmd mouseX mouseY mouseStatus < <(readmouseinput)
|
||||
fi
|
||||
fi
|
||||
printf '%b' "$MOUSEOFF" # don't generate mouse events outside the input sequence
|
||||
printf '%s' "$MOUSEOFF" # don't generate mouse events outside the input sequence
|
||||
[[ "$mousecmd" == '2' && "$mouseStatus" == 'M' ]] && cmdbuf='b' # right click is automatically assigned to back command
|
||||
[[ "$cmdbuf" == '[A' || "$cmdbuf" == 'k' || "$mousecmd" == '64' ]] && scroll -1
|
||||
[[ "$cmdbuf" == '[B' || "$cmdbuf" == 'j' || "$mousecmd" == '65' ]] && scroll 1
|
||||
@@ -327,8 +328,8 @@ while true; do
|
||||
[[ "$cmdbuf" == '[6' || "$cmdbuf" == 'l' ]] && scroll $(( $TERMROWS - 1 )) # PgDn
|
||||
[[ "$cmdbuf" == 's' ]] && jumplink 1
|
||||
[[ "$cmdbuf" == 'w' ]] && jumplink -1
|
||||
[[ "$cmdbuf" == 'q' ]] && printf '%b' "$ERESET$ALTBUFOFF" && exit 0
|
||||
[[ "$cmdbuf" == $'\0a' ]] && clicklink
|
||||
[[ "$cmdbuf" == 'q' ]] && printf '%s' "$ERESET$ALTBUFOFF" && exit 0
|
||||
[[ "$cmdbuf" == '' ]] && clicklink # space or enter or tab
|
||||
[[ "$cmdbuf" == 'd' ]] && clicklink 1 # same as click but with force-download flag
|
||||
[[ "$cmdbuf" == 'b' ]] && goback
|
||||
[[ "$cmdbuf" == 'S' ]] && stashlink
|
||||
|
||||
Reference in New Issue
Block a user