surf_linkselect.sh - sites - public wiki contents of suckless.org
 (HTM) git clone git://git.suckless.org/sites
 (DIR) Log
 (DIR) Files
 (DIR) Refs
       ---
       surf_linkselect.sh (1974B)
       ---
            1 #!/usr/bin/env sh
            2 # surf_linkselect.sh:
            3 #   Usage: curl somesite.com | surf_linkselect [SURFWINDOWID] [PROMPT]
            4 #   Deps: xmllint, dmenu
            5 #   Info:
            6 #     Designed to be used w/ surf externalpipe patch. Enables keyboard-only
            7 #     link selection via dmenu. Given HTML stdin, extracts links one per line
            8 #     Selected link is normalized based on current URI and printed to STDOUT.
            9 #     Pipe the result to a new surf or xprop _SURF_URI accordingly.
           10 SURF_WINDOW="${1:-$(xprop -root | sed -n '/^_NET_ACTIVE_WINDOW/ s/.* //p')}"
           11 DMENU_PROMPT="${2:-Link}"
           12 
           13 dump_links_with_titles() {
           14   awk '{
           15     input = $0;
           16 
           17     $0 = input;
           18     gsub("<[^>]*>", "");
           19     gsub(/[ ]+/, " ");
           20     gsub("&amp;", "\\&");
           21     gsub("&lt;", "<");
           22     gsub("&gt;", ">");
           23     $1 = $1;
           24     title = ($0 == "" ? "None" : $0);
           25 
           26     $0 = input;
           27     match($0, /\<[ ]*[aA][^>]* [hH][rR][eE][fF]=["]([^"]+)["]/, linkextract);
           28     $0 = linkextract[1];
           29     gsub(/^[ \t]+/,"");
           30     gsub(/[ \t]+$/,"");
           31     gsub("[ ]", "%20");
           32     link = $0;
           33 
           34     if (link != "") {
           35       print title ": " link;
           36     }
           37   }'
           38 }
           39 
           40 link_normalize() {
           41   URI=$1
           42   awk -v uri=$URI '{
           43     gsub("&amp;", "\\&");
           44 
           45     if ($0 ~ /^https?:\/\//  || $0 ~ /^\/\/.+$/) {
           46       print $0;
           47     } else if ($0 ~/^#/) {
           48       gsub(/[#?][^#?]+/, "", uri);
           49       print uri $0;
           50     } else if ($0 ~/^\//) {
           51       split(uri, uri_parts, "/");
           52       print uri_parts[3] $0;
           53     } else {
           54       gsub(/[#][^#]+/, "", uri);
           55       uri_parts_size = split(uri, uri_parts, "/");
           56       delete uri_parts[uri_parts_size];
           57       for (v in uri_parts) {
           58         uri_pagestripped = uri_pagestripped uri_parts[v] "/"
           59       }
           60       print uri_pagestripped $0;
           61     }
           62   }'
           63 }
           64 
           65 link_select() {
           66   tr '\n\r' ' ' |
           67     xmllint --html --xpath "//a" - |
           68     dump_links_with_titles |
           69     awk '!x[$0]++' |
           70     # sort | uniq
           71     dmenu -p "$DMENU_PROMPT" -l 10 -i -w $SURF_WINDOW |
           72     awk -F' ' '{print $NF}' |
           73     link_normalize $(xprop -id $SURF_WINDOW _SURF_URI | cut -d '"' -f 2)
           74 }
           75 
           76 link_select