about summary refs log tree commit diff
path: root/Functions
diff options
context:
space:
mode:
authorPaul Ackersviller <packersv@users.sourceforge.net>2007-11-24 23:05:31 +0000
committerPaul Ackersviller <packersv@users.sourceforge.net>2007-11-24 23:05:31 +0000
commit6f11d4ea0de1f41b495ef5fabfb0a53d08ed5b88 (patch)
tree743d137a354085ad4c30ca17a22cb26a8127f000 /Functions
parenta82e0c770fb9543b0d9eb0ce36d9e4d0feb59356 (diff)
downloadzsh-6f11d4ea0de1f41b495ef5fabfb0a53d08ed5b88.tar.gz
zsh-6f11d4ea0de1f41b495ef5fabfb0a53d08ed5b88.tar.xz
zsh-6f11d4ea0de1f41b495ef5fabfb0a53d08ed5b88.zip
Merge of 23759: a few improvements to pick-web-browser.
Diffstat (limited to 'Functions')
-rw-r--r--Functions/MIME/pick-web-browser166
1 files changed, 166 insertions, 0 deletions
diff --git a/Functions/MIME/pick-web-browser b/Functions/MIME/pick-web-browser
new file mode 100644
index 000000000..fe42c0bf5
--- /dev/null
+++ b/Functions/MIME/pick-web-browser
@@ -0,0 +1,166 @@
+# Function to find a web browser to run on a URL or file.
+# Can also be run as a script.  It is suitable for use as
+# a suffix alias:
+#   alias -s html=pick-web-browser
+#
+# The single argument is the URL or file name which may be of any type.
+# The only processing which occurs is that if the argument is a file,
+# it is converted into a URL.  As the function takes account of
+# any necessary conversions to the file name (for example, if it
+# contains spaces), it is generally preferable to pass in raw file
+# names rather than convert them to URLs elsewhere.
+#
+# The function takes account of the fact that many X Windows browsers
+# which are already running on the current display can take a command
+# to pass the URL to that process for handling.  A typical sign
+# that this has happened is that apparently nothing happens --- you
+# need to check the browser window.
+#
+# If no $DISPLAY is set, the function tries to start a terminal-based
+# browser instead.
+
+emulate -L zsh
+setopt extendedglob cbases nonomatch warncreateglobal
+
+zmodload -i zsh/zutil
+
+local -a xbrowsers ttybrowsers
+
+# X Windows browsers which might be running and can accept
+# a remote URL.
+zstyle -a :mime: x-browsers xbrowsers ||
+  xbrowsers=(firefox mozilla netscape opera konqueror)
+# Preferred command line browsers.
+zstyle -a :mime: tty-browsers ttybrowsers ||
+  ttybrowsers=(elinks links lynx)
+# Characters in addition to alphanumerics which can appear literally
+# in a URL.  `-' should be the first if it appears, so append others
+# to the end.
+local litc="-_./"
+
+local -a windows remoteargs match mbegin mend
+local url browser command
+
+url=$1
+if [[ -f $url ]]; then
+  if [[ $url = *[^-_[:alnum:]]* ]]; then
+    # Convert special characters into hex escapes.
+    local sofar
+    while [[ $url = (#b)([${litc}[:alnum:]]#)([^${litc}[:alnum:]])(*) ]]
+      do
+      sofar+="$match[1]%${$(( [#16] ##$match[2] ))##0x}"
+      url=$match[3]
+    done
+    url="$sofar$url"
+  fi
+
+  # Turn this into a local URL
+  if [[ $url = /* ]]; then
+      url=file://$url
+  else
+      url=file://$PWD/$url
+  fi
+fi
+
+local bstyle
+local -a bstyles
+zstyle -a :mime: browser-styles bstyles || bstyles=(running x tty)
+
+for bstyle in $bstyles; do
+  case $bstyle in
+    (running)
+    [[ -z $DISPLAY ]] && continue
+    # X Windows running
+
+    # Get the name of all windows running; use the internal name, not
+    # the friendly name, which is less useful.
+    #
+    # The nasty but portable version.
+    # The nice but non-portable version uses Perl, even though perl
+    # is more portable.
+    #    windows=(${(f)"$(xwininfo -root -all | 
+    #	sed -ne 's/.*".*": ("\(.*\)" ".*").*/\1/p' |sort | uniq)"})
+
+    windows=(${(f)"$(xwininfo -root -all | 
+         perl -ne '/.*"(.*)": \("(.*)" "(.*)"\).*/ and $w{$2} = 1;
+                   END { print join("\n", keys %w), "\n" }')"})
+
+    # Is any browser we've heard of running?
+    for browser in $xbrowsers; do
+      # Some browser executables call themselves <browser>-bin
+      if [[ $windows[(I)(#i)$browser(|[.-]bin)] -ne 0 ]]; then
+	if zstyle -s ":mime:browser:running:${browser}:" command command; then
+	  # The (q)'s here and below are pure paranoia:  no browser
+	  # name is going to include metacharacters, and we already
+	  # converted difficult characters in the URL to hex.
+	  zformat -f command $command b:${(q)browser} u:${(q)url}
+	  eval $command
+	else
+	  case $browser in
+	    (konqueror)
+	    # kfmclient is less hairy and better supported than direct
+	    # use of dcop.  Run kfmclient --commands
+	    # for more information.  Note that as konqueror is a fully
+	    # featured file manager, this will actually do complete
+	    # MIME handling, not just web pages.
+	    kfmclient openURL $url ||
+	    dcop $(dcop|grep konqueror) default openBrowserWindow $url
+	    ;;
+
+	    (firefox)
+	    # open in new tab
+	    $browser -new-tab $url
+	    ;;
+
+	    (opera)
+	    $browser -newpage $url
+	    ;;
+
+	    (*)
+	    # Mozilla bells and whistles are described at:
+	    # http://www.mozilla.org/unix/remote.html
+	    $browser -remote "openURL($url)"
+	    ;;
+	  esac
+	fi
+	return
+      fi
+    done
+    ;;
+
+    (x)
+    [[ -z $DISPLAY ]] && continue
+    # Start our preferred X Windows browser in the background.
+    for browser in $xbrowsers; do
+      if eval "[[ =$browser != \\=$browser ]]"; then
+	if zstyle -s ":mime:browser:new:${browser}:" command command; then
+	  zformat -f command $command b:${(q)browser} u:${(q)url}
+	  eval $command "&"
+	else
+	  # The following is to make the job text more readable.
+	  eval ${(q)browser} ${(q)url} "&"
+	fi
+	return
+      fi
+    done
+    ;;
+
+    (tty)
+    # Start up dumb terminal browser.
+    for browser in $ttybrowsers; do
+      if eval "[[ =$browser != \\=$browser ]]"; then
+	if zstyle -s ":mime:browser:new:${browser}" command command; then
+	  zformat -f command $command b:${(q)browser} u:${(q)url}
+	  eval $command
+	else
+	  $browser $url
+	fi
+	return
+      fi
+    done
+    ;;
+  esac
+done
+
+# No eligible browser.
+return 255