You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

154 lines
5.1 KiB

#!/bin/bash
#
# datum_tabulka.sh
# Vykresli ramecek s aktualnim datem/casem v cestine.
#
# Kompatibilita: bash 3.2+ (RHEL 5), coreutils/GNU sed jak jsou
# soucasti RHEL 5 a Debian Squeeze a novejsich. Nepouziva se zadny
# bashismus specificky pro bash 4+ (asociativni pole, ${var,,}, ...).
#
# POUZITI:
# 1) Spusteni jako samostatny skript:
# bash datum_tabulka.sh
#
# 2) "Nasourcovani" do interaktivniho shellu (napr. z ~/.bashrc),
# cimz se ziska prikaz "datum":
# echo 'source /cesta/k/datum_tabulka.sh' >> ~/.bashrc
# Po novem prihlaseni (nebo "source ~/.bashrc") pak staci
# napsat v terminalu:
# datum
#
# Pri sourcovani se nic samo nespusti - jen se definuje funkce
# "datum". Pri primem spusteni ("bash datum_tabulka.sh") se funkce
# rovnou i zavola.
# Pomocne funkce jsou prefixovany "_datum_", aby pri sourcovani do
# interaktivniho shellu nekolidovaly se jmeny jinych funkci/prikazu.
# Delka retezce v "znacich" (ne bajtech), nezavisla na locale:
# odstranime UTF-8 pokracovaci bajty (0x80-0xBF) a spocitame bajty,
# ktere zbyly - to odpovida poctu znaku bez ohledu na nastaveni LANG.
_datum_mb_len() {
printf '%s' "$1" | LC_ALL=C sed 's/[\x80-\xBF]//g' | LC_ALL=C wc -c | tr -d ' '
}
# Zopakuje znak $1 celkem $2 krat
_datum_repeat_char() {
local ch="$1"
local count="$2"
local out=""
local i=0
while [ "$i" -lt "$count" ]; do
out="${out}${ch}"
i=$((i + 1))
done
printf '%s' "$out"
}
# Hlavni funkce - vypise tabulku s aktualnim datem/casem
datum() {
# --- Ceske nazvy mesicu (2. pad) a dnu v tydnu -------------------
# index 0 je jen vycpavka, aby indexy odpovidaly cislu mesice/dne
local mesice
mesice=(x ledna února března dubna května června července srpna září října listopadu prosince)
local dny
dny=(x Pondělí Úterý Středa Čtvrtek Pátek Sobota Neděle)
# --- Nacteni zivych dat jednim volanim date, aby byla konzistentni
# %Y rok, %m mesic, %d den, %H hodina, %M minuta, %Z zkratka pasma,
# %u den v tydnu (1=po..7=ne), %V ISO tyden, %j den v roce, %s epoch
local rok mesic den hod min pasmo dow tyden denroku epoch
set -- $(date +"%Y %m %d %H %M %Z %u %V %j %s")
rok=$1
mesic=$2
den=$3
hod=$4
min=$5
pasmo=$6
dow=$7
tyden=$8
denroku=$9
epoch=${10}
# --- Prevod cisel bez uvodnich nul (aby se neinterpretovaly jako 8)
local den_n mesic_n dow_n tyden_n denroku_n
den_n=$((10#$den))
mesic_n=$((10#$mesic))
dow_n=$((10#$dow))
tyden_n=$((10#$tyden))
denroku_n=$((10#$denroku))
# --- Kvartal --------------------------------------------------------
local kvartal
kvartal=$(( (mesic_n - 1) / 3 + 1 ))
# --- Obsahove radky tabulky ------------------------------------------
local radek1 radek2 radek3 radek4 radek5 radek6 radek7
radek1="${den_n}. ${mesice[$mesic_n]} ${rok}"
radek2="${dny[$dow_n]}, ${tyden_n}. týden"
radek3="${hod}:${min} ${pasmo}"
radek4=""
radek5="Q${kvartal}, ${denroku_n}. den v roce"
radek6=""
radek7="Unix čas: ${epoch}"
# --- Vypocet sirky tabulky (podle nejdelsiho radku + fixni pridani) -
# Sirka je vypoctena z nejdelsiho radku a pak natrvalo rozsirena o 5
# znaku. Protoze extra_sirka je konstanta, je vysledna sirka tabulky
# fixni napric spustenimi (meni se jen kvuli delce textu samotneho).
local extra_sirka=5
local max=0
local radek l
for radek in "$radek1" "$radek2" "$radek3" "$radek4" "$radek5" "$radek6" "$radek7"; do
l=$(_datum_mb_len "$radek")
if [ "$l" -gt "$max" ]; then
max=$l
fi
done
max=$((max + extra_sirka))
# --- Vykreslovaci funkce (lokalni pres subshell, aby nezustaly) ------
_datum_print_border() {
local left="$1"
local right="$2"
printf '%s' "$left"
_datum_repeat_char "─" $((max + 2))
printf '%s\n' "$right"
}
_datum_print_line() {
local text="$1"
local len
len=$(_datum_mb_len "$text")
local pad=$((max - len))
printf '│ %s' "$text"
_datum_repeat_char " " "$pad"
printf ' │\n'
}
# --- Vykresleni tabulky ---------------------------------------------------
_datum_print_border "┌" "┐"
_datum_print_line "$radek1"
_datum_print_border "├" "┤"
_datum_print_line "$radek2"
_datum_print_line "$radek3"
_datum_print_line "$radek4"
_datum_print_line "$radek5"
_datum_print_line "$radek6"
_datum_print_border "├" "┤"
_datum_print_line "$radek7"
_datum_print_border "└" "┘"
# uklid pomocnych funkci definovanych uvnitr datum(), aby se
# neplichtily do jmenneho prostoru interaktivniho shellu
unset -f _datum_print_border _datum_print_line
}
# --- Spusteni jen pri primem volani skriptu, ne pri sourcovani -----------
# Pokud je soubor sourcovan (napr. z ~/.bashrc), pouze se definuje
# funkce "datum" a nic se nevypisuje. Pokud je soubor spusten primo
# (bash datum_tabulka.sh), funkce se rovnou zavola.
if [ "${BASH_SOURCE[0]}" = "${0}" ]; then
datum
fi