surf_linkselect.sh - sites - public wiki contents of suckless.org | |
git clone git://git.suckless.org/sites | |
Log | |
Files | |
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-o… | |
7 # link selection via dmenu. Given HTML stdin, extracts links one per… | |
8 # Selected link is normalized based on current URI and printed to ST… | |
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("&", "\\&"); | |
21 gsub("<", "<"); | |
22 gsub(">", ">"); | |
23 $1 = $1; | |
24 title = ($0 == "" ? "None" : $0); | |
25 | |
26 $0 = input; | |
27 match($0, /\<[ ]*[aA][^>]* [hH][rR][eE][fF]=["]([^"]+)["]/, linkextr… | |
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("&", "\\&"); | |
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 |