104 lines
3.8 KiB
Text
104 lines
3.8 KiB
Text
Module RankLanguages {
|
|
Const Part1$="<a href="+""""+ "/wiki/Category", Part2$="member"
|
|
Const langHttp$="http://rosettacode.org/wiki/Category:Programming_Languages"
|
|
Const categoriesHttp$="http://www.rosettacode.org/mw/index.php?title=Special:Categories&limit=5000"
|
|
Def long m, i,j, tasks, counter, limit, T, t1
|
|
Def string LastLang$, job$
|
|
|
|
Document final$, languages$, categories$
|
|
httpGet$=lambda$ (url$, timeout=1000)->{
|
|
Declare htmldoc "Msxml2.ServerXMLHTTP"
|
|
With htmldoc , "readyState" as ready
|
|
Report "Download:"+url$
|
|
Method htmldoc "open","get", url$, True
|
|
Method htmldoc "send"
|
|
Profiler
|
|
While Ready<>4 {
|
|
Wait 20
|
|
Print Over format$("Wait: {0:3} sec", timecount/1000)
|
|
If timecount>timeout then Exit
|
|
}
|
|
If ready=4 Then With htmldoc, "responseText" as ready$ : =ready$
|
|
Declare htmldoc Nothing
|
|
print
|
|
}
|
|
|
|
languages$=httpGet$(langHttp$, 30000)
|
|
If Doc.Len(languages$)=0 then Error "File download failed (languages)"
|
|
|
|
Inventory Lang
|
|
|
|
m=Paragraph(languages$, 0)
|
|
If Forward(languages$,m) then {
|
|
While m {
|
|
job$=Paragraph$(languages$,(m))
|
|
If Instr(job$, part1$) Else Continue
|
|
i = Instr(job$, "</a>")
|
|
If i Else Continue ' same as If i=0 Then Continue
|
|
j = i
|
|
i=Rinstr(job$, ">", -i)
|
|
If i Else Continue
|
|
LastLang$=MID$(job$, i+1, j-i-1)
|
|
if Instr(job$, "Category:"+lastlang$) then Append lang, lastlang$:=0 : Print Over format$("Languages: {0}", len(lang))
|
|
}
|
|
}
|
|
Print
|
|
Document categories$=httpGet$(categoriesHttp$, 30000)
|
|
If Doc.Len(categories$)=0 then Error "File download failed (categories)"
|
|
limit=Doc.Par(categories$)
|
|
If limit<Len(Lang) then Error "Invalid data"
|
|
Refresh
|
|
set slow
|
|
m=Paragraph(categories$, 0)
|
|
counter=0
|
|
If Forward(categories$,m) then {
|
|
While m {
|
|
job$=Paragraph$(categories$,(m))
|
|
counter++
|
|
Print Over format$("{0:2:-6}%", counter/limit*100)
|
|
i=Instr(job$, part2$)
|
|
If i Else Continue
|
|
i=Rinstr(job$, "(", -i)
|
|
If i Else Continue
|
|
tasks=Val(Filter$(Mid$(job$, i+1),","))
|
|
If tasks Else Continue
|
|
i=Rinstr(job$, "<", -i)
|
|
If i Else Continue
|
|
j = i
|
|
i=Rinstr(job$, ">", -i)
|
|
If i Else Continue
|
|
LastLang$=MID$(job$, i+1, j-i-1)
|
|
If Exist(Lang, LastLang$) Then {
|
|
Return Lang, LastLang$:=Lang(LastLang$)+tasks
|
|
}
|
|
}
|
|
}
|
|
Print
|
|
\\ this type of inventory can get same keys
|
|
\\ also has stable sort
|
|
Report "Make Inventory list by Task"
|
|
Inventory queue ByTask
|
|
t1=Len(Lang)
|
|
T=Each(Lang)
|
|
While T {
|
|
Append ByTask, Eval(T):=Eval$(T!)
|
|
Print Over format$("Complete: {0} of {1}", T^+1, t1 )
|
|
}
|
|
Print
|
|
Report "Sort by task (stable sort, sort keys as numbers)"
|
|
Sort descending ByTask as number
|
|
Report "Make List"
|
|
T=Each(ByTask)
|
|
final$="Sample output on "+Date$(Today, 1033, "long date")+{:
|
|
|
|
}
|
|
While T {
|
|
final$=format$("rank:{0::-4}. {1:-5} entries - {2}", T^+1, Eval$(T!), Eval$(T))+{
|
|
}
|
|
}
|
|
Report "Copy to Clipboard"
|
|
clipboard final$
|
|
\\ present to console with 3/4 fill lines then stop for space bar or mouse click to continue
|
|
Report final$
|
|
}
|
|
RankLanguages
|