11#! /usr/bin/env bash
2- # nbrowser v0.6
2+ # nbrowser v0.7
3+ # Requires bash 4+
34# author : odnar-dev <https://github.com/odnar-dev>
45# source : https://github.com/MyOS-ArchLinux/nbrowser
56# license: GPLv3 <https://gnu.org/licenses/gpl-3.0.html>
67# shellcheck disable=SC2190,SC2086,SC1091
78
89NBROWSER_CONFIG_DIR=" ${XDG_CONFIG_HOME:- $HOME / .config} /nbrowser"
910NBROWSER_DEFAULT_SEARCH=${NBROWSER_DEFAULT_SEARCH:- duckduckgo}
10- COPY_TO_CLIPBOARD_OPTION=true
11- NBROWSER_SIMPLE_URL_HANDLER=false
11+ COPY_TO_CLIPBOARD_OPTION=${COPY_TO_CLIPBOARD_OPTION :- true}
12+ NBROWSER_SIMPLE_URL_HANDLER=${NBROWSER_SIMPLE_URL_HANDLER :- false}
1213
1314declare -A ENGINES
1415
@@ -51,11 +52,12 @@ _choose(){
5152}
5253
5354_input (){
54- rofi -l 0 -width 50 -p " ${@:- input} " -dmenu
55+ [ -z " ${2} " ] || local ROFI_ADD_ARGS=" -mesg \" ${2// &/ &} \" "
56+ rofi -l 0 -width 50 -p " ${1:- input} " -dmenu ${ROFI_ADD_ARGS:- }
5557}
5658
5759listfiles (){
58- for file in ${NBROWSER_CONFIG_DIR} /$1 /* ; do
60+ for file in " ${NBROWSER_CONFIG_DIR} /$1 " /* ; do
5961 [ -e " $file " ] || [ -L " $file " ] || continue
6062 [ -s " $file " ] && printf ' %s\n' " ${file##*/ } "
6163 done
@@ -139,12 +141,6 @@ if ! has _copy_to_clipboard ;then
139141 }
140142fi
141143
142- if ! has _gemini_handler ; then
143- _gemini_handler (){
144- open_in_browser " https://proxy.vulpes.one/gemini/${1: 9} "
145- }
146- fi
147-
148144open_a_browser (){
149145 selected_browser=$( printf " %s\n" " ${installed_browsers[@]} " | awk ' BEGIN { RS="\n"; FS=" : " } { print $1 "\t : " $2 }' | column -t -s $' \t ' | rofi -dmenu -p ' nbrowser' -i -format " i s" -l " $(( browser_count- 1 )) " )
150146
@@ -228,7 +224,7 @@ open_in_browser(){
228224 COPY_TO_CLIPBOARD_OPTION=false
229225 fi
230226
231- selected_browser=$( printf " %s\n" " ${installed_browsers[@]} " | awk ' BEGIN { RS="\n"; FS=" : " } { print $1 "\t : " $2 }' | column -t -s $' \t ' | rofi -dmenu -p ' Open URL with' -mesg " ${@// &/ &} " -i -l " $browser_count " )
227+ selected_browser=$( printf " %s\n" " ${installed_browsers[@]} " | awk ' BEGIN { RS="\n"; FS=" : " } { print $1 "\t : " $2 }' | column -t -s $' \t ' | rofi -dmenu -p ' Open URL with' -mesg " ${@// &/ &} " -i -l " $(( browser_count- 1 )) " )
232228
233229 [ -z " ${selected_browser} " ] && exit 0
234230
@@ -253,8 +249,7 @@ open_in_browser(){
253249 ;;
254250 * )
255251 selected_browser=$( printf ' %s' " ${selected_browser} " | awk ' {split($0,a,": "); print a[2]}' )
256- echo " opening : $selected_browser "
257- { setsid -f $selected_browser " $* " > /dev/null 2>&1 ; }
252+ { setsid -f ${selected_browser} " $* " > /dev/null 2>&1 ; }
258253 ;;
259254 esac
260255}
@@ -285,115 +280,136 @@ url_handler(){
285280}
286281
287282main (){
288- case " $1 " in
289- gemini://* )
290- _gemini_handler " $@ "
291- ;;
292- http://* |https://* )
293- url_handler " $@ "
294- ;;
295- browser://* )
296- url_handler " ${1: 10} "
297- ;;
298- freetube://* )
299- open_video_with " ${1: 11} "
300- ;;
301- mpv://* |vlc://* )
302- open_video_with " ${1: 6} "
303- ;;
304- play://* )
305- open_video_with " ${1: 7} "
306- ;;
283+ [ -z " $1 " ] && return
307284
308- # my own shortcuts
309- " git/" * )
310- url_handler " https://github.com/${1: 4} "
311- ;;
312- " mal/" * )
313- url_handler " https://myanimelist.net/anime/${1: 4} "
314- ;;
315- " aur/" * )
316- url_handler " https://aur.archlinux.org/packages/${1: 4} "
317- ;;
318- " pypi/" * )
319- url_handler " https://pypi.org/project/${1: 5} "
320- ;;
321- " twitch/" * )
322- url_handler " https://www.twitch.tv/${1: 7} "
323- ;;
285+ local arg=" $* "
324286
325- # bangs
326- " !" * )
327- local bang=" ${1/ ?} "
328- shift
329- if [ ! -f " ${NBROWSER_CONFIG_DIR} /bangs/${bang} " ] ; then
330- bang=$( listfiles bangs | rofi -dmenu -p ' bangs' -i -mesg " bang '${bang} ' not found!" )
331- fi
332- [ -z " ${bang} " ] && exit
333- source " ${NBROWSER_CONFIG_DIR} /bangs/${bang} "
334- has nbrowser_bang || _pemx " couldn't find nbrowser_bang() function in ${NBROWSER_CONFIG_DIR} /bangs/${bang} "
335- nbrowser_bang " $* "
336- ;;
287+ # check if arg is a file or a dir
288+ if [[ -e " ${arg} " ]]; then
289+ case " ${arg} " in
290+ * .pdf)
291+ [ -z " ${NBROWSER_PDF_VIEWER} " ] || installed_browsers[0]=" PDF Reader : ${NBROWSER_PDF_VIEWER} "
292+ ;;
293+ * )
294+ [ -z " ${NBROWSER_HTML_EDITOR} " ] || installed_browsers[0]=" Text Editor : ${NBROWSER_HTML_EDITOR} "
295+ ;;
296+ esac
297+ open_in_browser " $* "
298+ return
299+ fi
337300
338- # engines
339- " ?" * )
340- local engine=" ${1/ ?} "
341- shift
342- local searchquery=" $* "
343- if [ -f " ${NBROWSER_CONFIG_DIR} /engines/${engine} " ] ; then
344- source " ${NBROWSER_CONFIG_DIR} /engines/${engine} "
345- has nbrowser_search || _pemx " couldn't find nbrowser_search() function in ${NBROWSER_CONFIG_DIR} /engines/${engine} "
346- [ -z " $searchquery " ] && searchquery=$( _input " $engine Search" )
347- [ -n " $searchquery " ] && url_handler " $( nbrowser_search $searchquery ) "
348- elif [ -n " ${ENGINES[${engine:- }]} " ]; then
349- [ -z " $searchquery " ] && searchquery=$( _input " $engine Search" )
350- [ -n " $searchquery " ] && url_handler " ${ENGINES[$engine]} $searchquery "
351- elif [ -f " $NBROWSER_CONFIG_DIR /engines.json" ]; then
352- local url=$( jq -r " .[]|select( .t == \" $engine \" )|.u" " $NBROWSER_CONFIG_DIR /engines.json" )
353- if [ ! -z " $url " ] ; then
354- [ -z " $searchquery " ] && searchquery=$( _input " $engine Search" )
355- [ -n " $searchquery " ] && url_handler " $( echo $url | sed " s/{{{s}}}/$searchquery /g" ) "
356- else
357- ENGINESLIST=" $( listfiles engines) "
358- ENGINESLIST+=" ${! ENGINES[@]} "
359- ENGINESLIST+=" $( jq -r " .[]|.t" " $NBROWSER_CONFIG_DIR /engines.json" ) "
360- engine=$( printf " %s\n" ${ENGINESLIST} | awk ' !a[$0]++' | rofi -dmenu -p ' engines' -i -mesg " engine '${engine} ' not found!" )
361- [ -z " $engine " ] && exit
362- main " ?" $engine $searchquery
363- fi
364- else
365- ENGINESLIST=" $( listfiles engines) "
366- ENGINESLIST+=" ${! ENGINES[@]} "
367- engine=$( printf " %s\n" ${ENGINESLIST} | awk ' !a[$0]++' | rofi -dmenu -p ' engines' -i -mesg " engine '${engine} ' not found!" )
368- [ -z " $engine " ] && exit
369- main " ?" $engine $searchquery
301+ # check for protocols
302+ if [[ " ${arg} " =~ ^([a-zA-Z0-9]+):(//| \? | \+ ) ]]; then
303+ local protocol=" ${BASH_REMATCH[1]} "
304+ local protocol_small=${protocol,,}
305+ if has " ${protocol} _protocolhandler" ; then
306+ " ${protocol} _protocolhandler" " ${arg/ " $protocol ://" } "
307+ elif has " ${protocol,,} _protocolhandler" ; then
308+ " ${protocol_small} _protocolhandler" " ${arg/ " $protocol ://" } "
309+ else
310+ case " ${protocol_small:- $protocol } " in
311+ mpv|vlc|freetube|play)
312+ open_video_with ${arg/ " $protocol ://" }
313+ ;;
314+ browser)
315+ url_handler ${arg/ " $protocol ://" }
316+ ;;
317+ nbrowser)
318+ nbrowser ${arg/ " $protocol ://" }
319+ ;;
320+ * )
321+ url_handler " ${arg} "
322+ ;;
323+ esac
324+ fi
325+ return
326+ fi
327+
328+ # check for bangs
329+ if [[ " ${arg} " =~ ^\! ([a-zA-Z0-9= ? -]* ) ]]; then
330+ local bang=" ${BASH_REMATCH[1]} "
331+ shift
332+ if [ ! -f " ${NBROWSER_CONFIG_DIR} /bangs/${bang} " ] ; then
333+ bang=$( listfiles bangs | rofi -dmenu -p ' bangs' -i -mesg " bang '${bang:- $arg } ' not found!" )
334+ fi
335+ [ -z " ${bang} " ] && exit
336+ source " ${NBROWSER_CONFIG_DIR} /bangs/${bang} "
337+ has nbrowser_bang || _pemx " couldn't find nbrowser_bang() function in ${NBROWSER_CONFIG_DIR} /bangs/${bang} "
338+ nbrowser_bang " $* "
339+ return
340+ fi
341+
342+ # check for engines
343+ if [[ " ${arg} " =~ ^\? ([a-zA-Z0-9-]* ) ]]; then
344+ local engine=" ${BASH_REMATCH[1]} "
345+ local engineURL=" "
346+ shift
347+ local searchQuery=" $* "
348+ # if engine in local file
349+ if [ -f " ${NBROWSER_CONFIG_DIR} /engines/${engine} " ] ; then
350+ source " ${NBROWSER_CONFIG_DIR} /engines/${engine} "
351+ has nbrowser_search || _pemx " couldn't find nbrowser_search() function in ${NBROWSER_CONFIG_DIR} /engines/${engine} "
352+ # if engine in config file
353+ elif [ -n " ${ENGINES[${engine:- }]} " ]; then
354+ engineURL=${ENGINES[$engine]}
355+ nbrowser_search (){
356+ echo " ${2:? }${1:? } "
357+ }
358+ # if engine in engines.json
359+ elif [ -f " ${NBROWSER_CONFIG_DIR} /engines.json" ]; then
360+ local engineURL=$( jq -r " .[]|select( .t == \" $engine \" )|.u" " $NBROWSER_CONFIG_DIR /engines.json" )
361+ local engineName=$( jq -r " .[]|select( .t == \" $engine \" )|.s" " $NBROWSER_CONFIG_DIR /engines.json" )
362+ if [ -n " ${engineURL} " ] ; then
363+ nbrowser_search (){
364+ echo " ${2:? } " | sed " s/{{{s}}}/${1:? } /g"
365+ }
370366 fi
371- ;;
367+ fi
372368
373- * )
374- if [ -f " $* " ] ; then
375- case $@ in
376- * .pdf)
377- # handle local pdf
378- [ -z " $NBROWSER_PDF_VIEWER " ] || installed_browsers[0]=" PDF Reader : ${NBROWSER_PDF_VIEWER} "
379- ;;
380- * )
381- # handle other local files
382- [ -z " $NBROWSER_HTML_EDITOR " ] || installed_browsers[0]=" Text Editor : ${NBROWSER_HTML_EDITOR} "
383- ;;
384- esac
385- open_in_browser " $* "
386- elif [ -f " ${NBROWSER_CONFIG_DIR} /engines/${NBROWSER_DEFAULT_SEARCH} " ] ; then
387- source " ${NBROWSER_CONFIG_DIR} /engines/${NBROWSER_DEFAULT_SEARCH} "
388- has nbrowser_search || _pemx " couldn't find nbrowser_search() function in ${NBROWSER_CONFIG_DIR} /engines/${NBROWSER_DEFAULT_SEARCH} "
389- [ -n " $1 " ] && url_handler " $( nbrowser_search $* ) "
390- elif [ -n " ${ENGINES[$NBROWSER_DEFAULT_SEARCH]} " ]; then
391- url_handler " ${ENGINES[$NBROWSER_DEFAULT_SEARCH]} $* "
369+ if has nbrowser_search; then
370+ [ -z " ${searchQuery} " ] && searchQuery=$( _input " ${engineName:- $engine } Search" " ${engineURL:- } " )
371+ [ -n " ${searchQuery} " ] || return
372+ if [ -z " ${engineURL} " ] ; then
373+ url_handler " $( nbrowser_search " ${searchQuery} " ) "
392374 else
393- url_handler " https://duckduckgo.com/?q= $* "
375+ url_handler " $( nbrowser_search " ${searchQuery} " " ${engineURL} " ) "
394376 fi
395- ;;
396- esac
377+ else
378+ local ENGINESLIST=" $( listfiles engines) "
379+ ENGINESLIST+=" ${! ENGINES[@]} "
380+ [ -f " ${NBROWSER_CONFIG_DIR} /engines.json" ] && ENGINESLIST+=" $( jq -r " .[]|.t" " $NBROWSER_CONFIG_DIR /engines.json" ) "
381+ engine=$( printf " %s\n" ${ENGINESLIST} | awk ' !a[$0]++' | rofi -dmenu -p ' engines' -i -mesg " engine '${engine} ' not found!" )
382+ [ -z " ${engine} " ] && return
383+ main " ?${engine} " " ${searchQuery} "
384+ fi
385+ return
386+ fi
387+
388+ # check for shortcuts
389+ if [[ " ${arg} " =~ ^([A-Za-z0-9-]+)/. ]]; then
390+ local shortcut=" ${BASH_REMATCH[1]} "
391+ if has " ${shortcut} _shortcut" ; then
392+ " ${shortcut} _shortcut" " ${arg/ " $shortcut /" } "
393+ return
394+ fi
395+ fi
396+
397+ # check for domain
398+ if [[ " ${arg} " =~ ^([A-Za-z0-9.-]{1,63}\. )+[A-Za-z0-9-]{1,}$ ]]; then
399+ url_handler " http://${arg} "
400+ return
401+ fi
402+
403+ # use dafault search engine
404+ if [ -f " ${NBROWSER_CONFIG_DIR} /engines/${NBROWSER_DEFAULT_SEARCH} " ] ; then
405+ source " ${NBROWSER_CONFIG_DIR} /engines/${NBROWSER_DEFAULT_SEARCH} "
406+ has nbrowser_search || _pemx " couldn't find nbrowser_search() function in ${NBROWSER_CONFIG_DIR} /engines/${NBROWSER_DEFAULT_SEARCH} "
407+ url_handler " $( nbrowser_search $* ) "
408+ elif [ -n " ${ENGINES[$NBROWSER_DEFAULT_SEARCH]} " ]; then
409+ url_handler " ${ENGINES[$NBROWSER_DEFAULT_SEARCH]} $* "
410+ else
411+ url_handler " https://duckduckgo.com/?q=$* "
412+ fi
397413}
398414
399415if [ -z " $1 " ]; then
0 commit comments