84 lines
2.4 KiB
Awk
84 lines
2.4 KiB
Awk
function join(array, start, end, sep, result, i) {
|
|
result = array[start]
|
|
for (i = start + 1; i <= end; i++)
|
|
result = result sep array[i]
|
|
return result
|
|
}
|
|
|
|
function trim(str) {
|
|
gsub(/^[[:blank:]]+|[[:blank:]\n]+$/, "", str)
|
|
return str
|
|
}
|
|
|
|
function http2var( site,path,server,j,output) {
|
|
|
|
RS = ORS = "\r\n"
|
|
|
|
site = "rosettacode.org"
|
|
path = "/mw/api.php" \
|
|
"?action=query" \
|
|
"&generator=categorymembers" \
|
|
"&gcmtitle=Category:Programming%20Languages" \
|
|
"&gcmlimit=500" \
|
|
(gcmcontinue "" ? "&gcmcontinue=" gcmcontinue : "") \
|
|
"&prop=categoryinfo" \
|
|
"&format=txt"
|
|
|
|
server = "/inet/tcp/0/" site "/80"
|
|
print "GET " path " HTTP/1.0" |& server
|
|
print "Host: " site |& server
|
|
print "" |& server
|
|
while ((server |& getline) > 0) {
|
|
if($0 != 0) {
|
|
j++
|
|
output[j] = $0
|
|
}
|
|
}
|
|
close(server)
|
|
if(length(output) == 0)
|
|
return -1
|
|
else
|
|
return join(output, 1, j, "\n")
|
|
}
|
|
|
|
function parse(webpage ,c,a,i,b,e,pages) {
|
|
|
|
# Check for API continue code ie. a new page of results available
|
|
match(webpage, "gcmcontinue[]] =>[^)]+[^)]", a)
|
|
if(a[0] != "") {
|
|
split(a[0], b, ">")
|
|
gcmcontinue = trim(b[2])
|
|
} else gcmcontinue = ""
|
|
|
|
c = split(webpage, a, "[[][0-9]{1,7}[]]")
|
|
|
|
while(i++ < c) {
|
|
if(match(a[i], /[pages]/)) {
|
|
match(a[i], "pages[]] =>[^[]+[^[]", b)
|
|
split(b[0], e, ">")
|
|
pages = trim(e[2]) + 0
|
|
} else pages = 0
|
|
if(match(a[i], /[title]/)) {
|
|
match(a[i], "title[]] =>[^[]+[^[]", b)
|
|
split(b[0], e, ":")
|
|
e[2] = trim(e[2])
|
|
if ( substr(e[2], length(e[2]), 1) == ")" )
|
|
e[2] = trim( substr(e[2], 1, length(e[2]) - 1) )
|
|
if(length(e[2]) > 0)
|
|
G[e[2]] = pages
|
|
}
|
|
}
|
|
}
|
|
|
|
BEGIN {
|
|
|
|
parse( http2var() ) # First 500
|
|
while ( gcmcontinue != "" )
|
|
parse( http2var() ) # Next 500, etc
|
|
|
|
# https://www.gnu.org/software/gawk/manual/html_node/Controlling-Scanning.html
|
|
PROCINFO["sorted_in"] = "@val_type_desc"
|
|
for ( language in G )
|
|
print ++i ". " language " - " G[language]
|
|
|
|
}
|