aboutsummaryrefslogtreecommitdiff
path: root/lib/text_roll.sh
blob: e53247fe09f6f0eb4427ebdb1a0c7659dba8e860 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# 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}"
}