Skip to content

Commit ad6015b

Browse files
authored
v0.7
- breaking changes ?? - use BASH_REMATCH (new requirement !! bash 4+ face_exhaling ) - _input() use the second argument for -mesg option in rofi - check for protocolhandler in config file : magnet:// , magnet_protocolhandler - remove hard-coded _gemini_handler - check for shortcuts in config file : git/ , git_shortcut - remove hard-coded shortcuts - add a basic check for domain regex: (typing google.com in search box , now well open the URL http://google.com)
1 parent bf66de3 commit ad6015b

File tree

1 file changed

+132
-116
lines changed

1 file changed

+132
-116
lines changed

nbrowser

Lines changed: 132 additions & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
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

89
NBROWSER_CONFIG_DIR="${XDG_CONFIG_HOME:-$HOME/.config}/nbrowser"
910
NBROWSER_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

1314
declare -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//&/&amp;}\""
56+
rofi -l 0 -width 50 -p "${1:-input}" -dmenu ${ROFI_ADD_ARGS:-}
5557
}
5658

5759
listfiles(){
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
}
140142
fi
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-
148144
open_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 "${@//&/&amp;}" -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 "${@//&/&amp;}" -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

287282
main(){
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

399415
if [ -z "$1" ]; then

0 commit comments

Comments
 (0)