git clone https://git.lucas.co/fontpreview.git
fontpreview (8.2K)
1 #!/usr/bin/env bash
2 #
3 # Siddharth Dushantha 2020
4 #
5 # Dependencies: nsxiv, imagemagick, xdotool, fzf
6
7 VERSION=1.0.7
8
9 # Default values
10 SEARCH_PROMPT="❯ "
11 SIZE=1000x1000
12 POSITION="+0+0"
13 FONT_SIZE=38
14 BG_COLOR="#ffffff"
15 FG_COLOR="#000000"
16 PREVIEW_TEXT="ABCDEFGHIJKLM\nNOPQRSTUVWXYZ\nabcdefghijklm\nnopqrstuvwxyz\n1234567890\n!@$\%(){}[]\nالسلام عليكم"
17
18 show_help() {
19 printf "%s" "\
20 usage: fontpreview [-h] [--size \"px\"] [--position \"+x+y\"] [--search-prompt SEARCH_PROMPT]
21 [--font-size \"FONT_SIZE\"] [--bg-color \"BG_COLOR\"] [--fg-color \"FG_COLOR\"]
22 [--preview-text \"PREVIEW_TEXT\"] [-i font.otf] [-o preview.png] [--version]
23
24 ┌─┐┌─┐┌┐┌┌┬┐┌─┐┬─┐┌─┐┬ ┬┬┌─┐┬ ┬
25 ├┤ │ ││││ │ ├─┘├┬┘├┤ └┐┌┘│├┤ │││
26 └ └─┘┘└┘ ┴ ┴ ┴└─└─┘ └┘ ┴└─┘└┴┘
27 Very customizable and minimal font previewer written in bash
28
29 optional arguments:
30 -h, --help show this help message and exit
31 -i, --input filename of the input font (.otf, .ttf, .woff are supported)
32 -o, --output filename of the output preview image (input.png if not set)
33 --size size of the font preview window
34 --position the position where the font preview window should be displayed
35 --search-prompt input prompt of fuzzy searcher
36 --font-size font size
37 --bg-color background color of the font preview window
38 --fg-color foreground color of the font preview window
39 --preview-text preview text that should be displayed in the font preview window
40 --version show the version of fontpreview you are using
41 "
42 }
43
44 pre_exit() {
45 # Get the proccess ID of this script and kill it.
46 # We are dumping the output of kill to /dev/null
47 # because if the user quits nsxiv before they
48 # exit this script, an error will be shown
49 # from kill and we dont want that
50 kill -9 "$(cat "$PIDFILE" 2>/dev/null)" &> /dev/null
51
52 # Delete tempfiles, so we don't leave useless files behind.
53 rm -rf "$FONTPREVIEW_DIR"
54 }
55
56 generate_preview(){
57 # Credits: https://bit.ly/2UvLVhM
58 magick -size $SIZE xc:"$BG_COLOR" \
59 -gravity center \
60 -pointsize $FONT_SIZE \
61 -font "$1" \
62 -fill "$FG_COLOR" \
63 -annotate +0+0 "$PREVIEW_TEXT" \
64 -flatten "$2"
65 }
66
67 main(){
68 # Checkig if needed dependencies are installed
69 dependencies=(xdotool nsxiv magick fzf)
70 for dependency in "${dependencies[@]}"; do
71 type -p "$dependency" &>/dev/null || {
72 echo "error: Could not find '${dependency}', is it installed?" >&2
73 exit 1
74 }
75 done
76
77 # Checking for enviornment variables which the user might have set.
78 # This config file for fontpreview is pretty much the bashrc, zshrc, etc
79 # Majority of the variables in fontpreview can changed using the enviornment variables
80 # and this makes fontpreview very customizable
81 [[ $FONTPREVIEW_SEARCH_PROMPT != "" ]] && SEARCH_PROMPT=$FONTPREVIEW_SEARCH_PROMPT
82 [[ $FONTPREVIEW_SIZE != "" ]] && SIZE=$FONTPREVIEW_SIZE
83 [[ $FONTPREVIEW_POSITION != "" ]] && POSITION=$FONTPREVIEW_POSITION
84 [[ $FONTPREVIEW_FONT_SIZE != "" ]] && FONT_SIZE=$FONTPREVIEW_FONT_SIZE
85 [[ $FONTPREVIEW_BG_COLOR != "" ]] && BG_COLOR=$FONTPREVIEW_BG_COLOR
86 [[ $FONTPREVIEW_FG_COLOR != "" ]] && FG_COLOR=$FONTPREVIEW_FG_COLOR
87 [[ $FONTPREVIEW_PREVIEW_TEXT != "" ]] && PREVIEW_TEXT=$FONTPREVIEW_PREVIEW_TEXT
88
89 # Save the window ID of the terminal window fontpreview is executed in.
90 # This is so that when we open up nsxiv, we can change the focus back to
91 # the terminal window, so that the user can search for the fonts without
92 # having to manualy change the focus back to the terminal.
93 xdotool getactivewindow > "$TERMWIN_IDFILE"
94
95 # Flag to run some commands only once in the loop
96 FIRST_RUN=true
97
98 while true; do
99 # List out all the fonts which imagemagick is able to find, extract
100 # the font names and then pass them to fzf
101 font=$(magick -list font | awk -F: '/^[ ]*Font: /{print substr($NF,2)}' | fzf --prompt="$SEARCH_PROMPT")
102
103 # Exit if nothing is returned by fzf, which also means that the user
104 # has pressed [ESCAPE]
105 [[ -z $font ]] && return
106
107 generate_preview "$font" "$FONT_PREVIEW"
108
109 if [[ $FIRST_RUN == true ]]; then
110 FIRST_RUN=false
111
112 # Display the font preview using nsxiv
113 #nsxiv -g "$SIZE$POSITION" "$FONT_PREVIEW" -N "fontpreview" -b &
114 nsxiv -N "fontpreview" -b -g "$SIZE$POSITION" "$FONT_PREVIEW" &
115
116 # Change focus from nsxiv, back to the terminal window
117 # so that user can continue to search for fonts without
118 # having to manually change focus back to the terminal window
119 xdotool windowfocus "$(cat "$TERMWIN_IDFILE")"
120
121 # Save the process ID so that we can kill
122 # nsxiv when the user exits the script
123 echo $! >"$PIDFILE"
124
125 # Check for crashes of nsxiv
126 elif [[ -f $PIDFILE ]] ; then
127 if ! pgrep -F "$PIDFILE" >/dev/null 2>&1; then
128 echo "Restart nsxiv - You maybe using a obsolete version. " >&2
129 # Display the font preview using nsxiv
130 nsxiv -g "$SIZE$POSITION" -N "fontpreview" -b "$FONT_PREVIEW" &
131
132 # Change focus from nsxiv, back to the terminal window
133 # so that user can continue to search for fonts without
134 # having to manually change focus back to the terminal window
135 xdotool windowfocus "$(cat "$TERMWIN_IDFILE")"
136
137 # Save the process ID so that we can kill
138 # nsxiv when the user exits the script
139 echo $! >"$PIDFILE"
140 fi
141
142 fi
143 done
144 }
145
146 # Disable CTRL-Z because if we allowed this key press,
147 # then the script would exit but, nsxiv would still be
148 # running
149 trap "" SIGTSTP
150
151 trap pre_exit EXIT
152
153 # Use mktemp to create a temporary directory that won't
154 # collide with temporary files of other application.
155 FONTPREVIEW_DIR="$(mktemp -d "${TMPDIR:-/tmp}/fontpreview_dir.XXXXXXXX")" || exit
156 PIDFILE="$FONTPREVIEW_DIR/fontpreview.pid"
157 touch "$PIDFILE" || exit
158 FONT_PREVIEW="$FONTPREVIEW_DIR/fontpreview.png"
159 touch "$FONT_PREVIEW" || exit
160 TERMWIN_IDFILE="$FONTPREVIEW_DIR/fontpreview.termpid"
161 touch "$TERMWIN_IDFILE" || exit
162
163 font=$1
164
165
166 # Parse the arguments
167 options=$(getopt -o hi:o: --long position:,size:,version,search-prompt:,font-size:,bg-color:,fg-color:,preview-text:,input:,output:,help -- "$@")
168 eval set -- "$options"
169
170 while true; do
171 case "$1" in
172 --size)
173 shift
174 FONTPREVIEW_SIZE=$2
175 ;;
176 --position)
177 shift
178 FONTPREVIEW_POSITION=$2
179 ;;
180 -h|--help)
181 show_help
182 exit
183 ;;
184 --version)
185 echo $VERSION
186 exit
187 ;;
188 -i|--input)
189 input_file="$2"
190 ;;
191 -o|--output)
192 output_file="$2"
193 ;;
194 --search-prompt)
195 FONTPREVIEW_SEARCH_PROMPT=$2
196 ;;
197 --font-size)
198 FONTPREVIEW_FONT_SIZE=$2
199 ;;
200 --bg-color)
201 FONTPREVIEW_BG_COLOR=$2
202 ;;
203 --fg-color)
204 FONTPREVIEW_FG_COLOR=$2
205 ;;
206 --preview-text)
207 FONTPREVIEW_PREVIEW_TEXT=$2
208 ;;
209 --)
210 shift
211 break
212 ;;
213 esac
214 shift
215 done
216
217
218 # Point a font file to fontpreview and it will preview it.
219 # Example:
220 # $ fontpreview /path/to/fontFile.ttf
221 #
222 # This is useful because people can preview fonts which they have not
223 # installed onto their system. So if they want to preview a font file that
224 # is in their Downloads directory, then they can easily preview it.
225 if [ -f "$font" ]; then
226 generate_preview "$font" "$FONT_PREVIEW"
227
228 # Display the font preview using nsxiv
229 nsxiv -g "$SIZE$POSITION" -N "fontpreview" -b "$FONT_PREVIEW" &
230
231 # For some strange reason, nsxiv just doesnt have time to read the file
232 sleep 0.1
233 exit
234 fi
235
236 # Check if the user gave an input file if they did, then create a preview
237 # and then save the preview to the current working directory
238 if [ "$input_file" != "" ] ; then
239 [ -z "$output_file" ] && output_file="${input_file}.png"
240 generate_preview "$input_file" "$output_file"
241 exit
242 fi
243
244 main