64 lines
1.4 KiB
Bash
64 lines
1.4 KiB
Bash
# Rolling anything what you want.
|
|
# arg1: text to roll.
|
|
# arg2: max length to display.
|
|
# arg3: roll speed in characters per second.
|
|
roll_text() {
|
|
local text="$1" # Text to print
|
|
|
|
if [ -z "$text" ]; then
|
|
return;
|
|
fi
|
|
|
|
local max_len="10" # Default max length.
|
|
|
|
if [ -n "$2" ]; then
|
|
max_len="$2"
|
|
fi
|
|
|
|
local speed="1" # Default roll speed in chars per second.
|
|
|
|
if [ -n "$3" ]; then
|
|
speed="$3"
|
|
fi
|
|
|
|
# Skip rolling if the output is less than max_len.
|
|
if [ "${#text}" -le "$max_len" ]; then
|
|
echo "$text"
|
|
return
|
|
fi
|
|
|
|
# Anything starting with 0 is an Octal number in Shell,C or Perl,
|
|
# so we must explicitly state the base of a number using base#number
|
|
local offset=$((10#$(date +%s) * ${speed} % ${#text}))
|
|
|
|
# Truncate text.
|
|
text=${text:offset}
|
|
|
|
local char # Character.
|
|
local bytes # The bytes of one character.
|
|
local index
|
|
|
|
for ((index=0; index < max_len; index++)); do
|
|
char=${text:index:1}
|
|
bytes=$(echo -n $char | wc -c)
|
|
# The character will takes twice space
|
|
# of an alphabet if (bytes > 1).
|
|
if ((bytes > 1)); then
|
|
max_len=$((max_len - 1))
|
|
fi
|
|
done
|
|
|
|
text=${text:0:max_len}
|
|
|
|
#echo "index=${index} max=${max_len} len=${#text}"
|
|
# How many spaces we need to fill to keep
|
|
# the length of text that will be shown?
|
|
local fill_count=$((${index} - ${#text}))
|
|
|
|
for ((index=0; index < fill_count; index++)); do
|
|
text="${text} "
|
|
done
|
|
|
|
echo "${text}"
|
|
}
|