slide deck presentation tool written in pure bash

Compare changes

Choose any two refs to compare.

Changed files
+146 -24
+14 -2
readme.md
··· 1 1 # shlide 2 2 > a slide deck presentation tool written in pure bash 3 3 4 - ![scrot](https://files.nerdypepper.tech/k7.png) 4 + ![scrot](https://u.peppe.rs/k7.png) 5 5 6 6 ## Features 7 7 8 8 - All slides are plain-text files. 9 - - Navigation using `j` / `k` or `n` / `p`. 9 + - Vim like navigation. 10 10 - Text color and style formatting. 11 11 - Pure bash. 12 12 ··· 27 27 # so on 28 28 ``` 29 29 30 + **Note**: Make sure to prefix the first 9 slides with a `0` (`01-foo.txt`, `02-bar.txt` ...), 31 + if you have more than 10 slides. 32 + 30 33 Finally, run: 31 34 32 35 ```shell 33 36 $ shlide deck/ 34 37 ``` 38 + 39 + ## Controls 40 + 41 + - Next slide: `j`, `n`, `;`, `space`, `enter` 42 + - Previous slide: `k`, `p`, `,`, `backspace` 43 + - Jump to first slide: `0` 44 + - Jump to last slide: `G` 45 + - Reload: `r` 46 + - Quit: `q` 35 47 36 48 ## Formatting 37 49
+27 -22
shlide
··· 51 51 } 52 52 53 53 # Filter out color sequences. 54 - shopt -s extglob 55 54 ansi_filter() { 55 + shopt -s extglob 56 56 local IFS= 57 57 printf '%s' "${1//$'\e'[\[(]*([0-9;])[@-n]/}" 58 58 #" A little fix to prevent vim syntax highlighting from breaking. 59 + shopt -u extglob 59 60 } 60 61 61 62 ··· 74 75 printf '\e[2J' 75 76 76 77 # Get screen size. 77 - read -r LINES COLUMNS < <(stty -F /dev/tty size) 78 + shopt -s checkwinsize; (:;:) 78 79 79 80 # Write slide number at bottom left. 80 81 printf '\e[H' ··· 110 111 die() { 111 112 printf '\e[2J' 112 113 printf '\e[?25h' 114 + printf '\e[0H' 113 115 exit 0 114 116 } 115 117 ··· 125 127 126 128 slides_dir="${1:-./}" 127 129 slides=("$slides_dir"/[0-9]*.txt) 130 + total="${#slides[@]}" 128 131 i=0 129 - while true; do 132 + while :; do 130 133 # Clear the screen. 131 134 printf '\e[2J' 132 135 133 136 # Capture Ctrl+C. 134 137 trap 'die' INT 135 138 139 + # Don't go below 0. 140 + [[ "$i" -lt 0 ]] && i=0 141 + 136 142 # Display END reached prompt, and then exit. 137 - [[ "$i" -eq "${#slides[@]}" ]] && { 143 + if [[ "$i" -eq "$total" ]]; then 138 144 display_end 139 - read -rsn1 input 140 - case "$input" in 141 - "j"|"n"|"q") 142 - die 143 - ;; 144 - *) 145 - ((--i)) 146 - ;; 147 - esac 148 - } 145 + else 146 + display "$(<"${slides[$i]}")" "${slides[$i]}" "$i" "$total" 147 + fi 149 148 150 - # Don't go below 0. 151 - [[ "$i" -lt 0 ]] && i=0 152 - 153 - # Navigate on j/k/n/p and quit on q. 154 - display "$(<"${slides[$i]}")" "${slides[$i]}" "$i" "${#slides[@]}" 149 + # Navigation 155 150 read -rsn1 input 156 - case "$input" in 157 - "j"|"n") 151 + case "$input" in 152 + "j"|"n"|""|";") 153 + [[ "$i" -eq "$total" ]] && die 158 154 ((++i)) 159 155 ;; 160 - "k"|"p") 156 + "k"|"p"|""|",") 161 157 ((--i)) 162 158 ;; 159 + "0") 160 + ((i=0)) 161 + ;; 162 + "G") 163 + ((i=total-1)) 164 + ;; 163 165 "q") 164 166 # Return the cursor on exit. 165 167 die 168 + ;; 169 + *) 170 + # Reloads the slide 166 171 ;; 167 172 esac 168 173 done
+105
shlide.1.scd
··· 1 + shlide(1) ["Version 1.0"] 2 + 3 + # NAME 4 + 5 + shlide - a slide deck presentation tool written in pure bash 6 + 7 + # SYNOPSIS 8 + 9 + shlide _deck-directory/_ 10 + 11 + # DESCRIPTION 12 + 13 + Create a directory for your slides. Name each slide starting with 14 + a number and a hyphen, like so: 15 + 16 + $ mkdir deck++ 17 + $ touch deck/1-first-slide.txt++ 18 + $ touch deck/2-another.txt 19 + 20 + *Note*: Make sure to prefix the first 9 slides with a *0* (e.g. 01-foo.txt, 02-bar.txt ...), if you have more than 10 slides. 21 + 22 + Finally, run: 23 + 24 + $ shlide deck/ 25 + 26 + # CONTROLS 27 + 28 + Next slide: 29 + *j*, *n*, *;*, *space*, *enter* 30 + 31 + Previous slide: 32 + *k*, *p*, *,*, *backspace* 33 + 34 + Jump to first slide: 35 + *0* 36 + 37 + Jump to last slide: 38 + *G* 39 + 40 + Reload: 41 + *r* 42 + 43 + Quit: 44 + *q* 45 + 46 + # FORMATTING 47 + 48 + Slide content can be formatted like so: 49 + 50 + Welcome to ${GRN}shlide${RST}. ${STR}Here${RST} are a few bullet points: 51 + 52 + \- first point++ 53 + \- second point++ 54 + \* ${ITA}sub point${RST}++ 55 + \* ${BLD}another${RST} sub point 56 + 57 + *Note*: Make sure to add ${RST} (reset) at the end. 58 + 59 + A full list of formatting options are below: 60 + 61 + ## Colors 62 + 63 + [[ *Key* 64 + :- *Effect* 65 + |- BLK 66 + :- black 67 + |- RED 68 + :- red 69 + |- GRN 70 + :- green 71 + |- YLW 72 + :- yellow 73 + |- BLU 74 + :- blue 75 + |- PUR 76 + :- purple 77 + |- CYN 78 + :- cyan 79 + |- RST 80 + :- reset 81 + 82 + ## Styles 83 + 84 + [[ *Key* 85 + :- *Effect* 86 + |- BLD 87 + :- bold 88 + |- DIM 89 + :- dim 90 + |- ITA 91 + :- italics 92 + |- UND 93 + :- underline 94 + |- FLS 95 + :- flashing 96 + |- REV 97 + :- reverse 98 + |- INV 99 + :- invert 100 + |- STR 101 + :- strikethrough 102 + 103 + # LICENSES 104 + 105 + shlide is licensed under the MIT license.