bv 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. #!/bin/sh
  2. # bv, short for bible verse, is a simple program for helping to learn and
  3. # remember bible verses from a minimal X environment and the command line.
  4. # make sure needed dirs exist
  5. conf="${XDG_CONFIG_DIR:-$HOME/.config}/bv"
  6. cache="${XDG_CACHE_DIR:-$HOME/.cache}/bv"
  7. [ -d "$conf" ] || mkdir -p "$conf"
  8. [ -d "$cache" ] || mkdir -p "$cache"
  9. help_msg() {
  10. printf "Usage:\\n\
  11. -s \t set new bible verse to given string or path to file\\n\
  12. -l \t list current bible verse \\n\
  13. -u \t update media (do this after changing your wallpaper)\\n\
  14. -a \t ask for bible verse via stdin and mark mistakes if found\\n\
  15. -h \t show this help message\\n"
  16. }
  17. generate_assets() {
  18. # fetch infos
  19. bgpath="$(tail -n 1 "${XDG_CACHE_DIR:-$HOME/.cache}/.fehbg" | rev | \
  20. awk '{print $1}' | rev | sed 's/.$//;s/^.//' )"
  21. dim="$(mediainfo "$bgpath" | grep "Width\|Height" | sed 's/^.*\: //;s/pixels//' \
  22. | tr -d ' ' | tr '\n' x | sed s'/x$/\n/')"
  23. width="$(echo "$dim" | sed 's/x.*//')"
  24. #height="$(echo "$dim" | sed 's/.*x//')"
  25. bgext="${bgpath##*.}"
  26. savedpath="$(cat "$cache/bg-orig.path")"
  27. savedext="${savedpath##*.}"
  28. # clunky path parsing ...
  29. [ -f "$cache/bg-orig.path" ] || echo "$bgpath" > "$cache/bg-orig.path"
  30. if ! echo "${bgpath##*/}" | grep -q "bv-bg.png"; then
  31. echo "$bgpath" > "$cache/bg-orig.path"
  32. fi
  33. echo "$savedpath" | grep -q "bv-bg.png" && savedpath=""
  34. if [ ! -s "$savedpath" ]; then
  35. if [ -n "$savedpath" ]; then
  36. cp "$cache/bg-orig.$savedext" "$savedpath" &&
  37. echo "original file moved or deleted: restoring ..."
  38. fi
  39. fi
  40. # check if new background should be generated
  41. if diff "$cache/bg-orig.$savedext" "$(cat "$cache/bg-orig.path")" > /dev/null 2> /dev/null &&
  42. diff "$cache/verse" "$conf/verse" > /dev/null 2> /dev/null; then
  43. echo "Everything already up to date, skipping Asset Generation ..."
  44. else
  45. # cache new bg incl. its source path
  46. cp "$bgpath" "$cache/bg-orig.$bgext"
  47. echo "$bgpath" > "$cache/bg-orig.path"
  48. # cache new verse
  49. cat "$conf/verse" > "$cache/verse"
  50. echo "Generating Background ..."
  51. # calculate text scaling accordingly to the resolution
  52. : $((scal = width / 128))
  53. : $((dens = 300 * 15 / scal))
  54. : $((pntr = scal * scal * 16 / 225))
  55. : $((strk = scal * 2 / 15))
  56. # generate text and merge w/ background
  57. magick -gravity center -background transparent -density "$dens" \
  58. -pointsize "$pntr" -fill white -size "$dim" -stroke black -strokewidth "$strk" \
  59. -font "/usr/share/fonts/adobe-source-code-pro/SourceCodePro-BlackIt.otf" \
  60. caption:@- "$cache/bv-verse.png" < "$conf/verse"
  61. composite -gravity center "$cache/bv-verse.png" \
  62. "$bgpath" "$cache/bv-bg.png"
  63. fi
  64. }
  65. update_assets() {
  66. # set bg
  67. echo "Setting Background ..."
  68. feh --bg-scale "$cache/bv-bg.png"
  69. mv "$HOME/.fehbg" "${XDG_CACHE_DIR:-$HOME/.cache}"
  70. }
  71. exit_when_no_verse() {
  72. [ ! -s "$conf/verse" ] && echo "Error: No bible verse set." && exit 1
  73. }
  74. verse_diff() {
  75. git -c color.diff.new='bold reverse green' \
  76. -c color.diff.old='bold reverse red' diff --no-index -U0 --no-color \
  77. --word-diff=color --word-diff-regex=. \
  78. "$cache/guessed-verse" "$cache/stripped-verse" | tail -n +3 |
  79. grep -v '\-\-\-\|+++'
  80. }
  81. # parse arguments
  82. while getopts ":s:ahlu" option; do case "${option}" in
  83. h) help_msg; exit 0;;
  84. s) newbv="${OPTARG}"
  85. if [ -s "$newbv" ]; then
  86. cat "$newbv" > "$conf/verse"
  87. cp "$conf/verse" "$cache/verse"
  88. elif [ -n "$newbv" ]; then
  89. echo "$newbv" > "$conf/verse"
  90. cp "$conf/verse" "$cache/verse"
  91. fi
  92. generate_assets; update_assets; exit 0;;
  93. l) exit_when_no_verse; cat "$conf/verse"; exit 0;;
  94. u) generate_assets; update_assets; exit 0;;
  95. a) exit_when_no_verse; printf "bible verse: "; read -r ask_input
  96. echo "$ask_input" > "$cache/guessed-verse"
  97. tr '\n' ' ' < "$conf/verse" | sed 's/.$/\n/; s/ / /g' > "$cache/stripped-verse"
  98. verse_diff; exit 0;;
  99. *) printf "Invalid option: -%s\\n\\n" "$OPTARG"; help_msg; exit 1 ;;
  100. esac done
  101. # when no arguments are given, print help message
  102. help_msg