86 lines
2.3 KiB
Plaintext
86 lines
2.3 KiB
Plaintext
declare
|
|
[HTTPClient] = {Module.link ['x-ozlib://mesaros/net/HTTPClient.ozf']}
|
|
[XMLParser] = {Module.link ['x-oz://system/xml/Parser.ozf']}
|
|
[StringX] = {Module.link ['x-oz://system/String.ozf']}
|
|
[Regex] = {Module.link ['x-oz://contrib/regex']}
|
|
|
|
AllTasksUrl = "http://rosettacode.org/mw/api.php?action=query&list="#
|
|
"categorymembers&cmtitle=Category:Programming_Tasks&cmlimit=500&format=xml"
|
|
|
|
proc {Main}
|
|
AllTasks = {Parse {GetPage AllTasksUrl}}
|
|
TaskTitles = {GetTitles AllTasks}
|
|
Total = {NewCell 0}
|
|
in
|
|
for Task in TaskTitles do
|
|
TaskPage = {GetPage {TaskUrl Task}}
|
|
RE = {Regex.compile "{{header\\|" [extended newline icase]}
|
|
NumMatches = {Length {Regex.allMatches RE TaskPage}}
|
|
in
|
|
{System.showInfo Task#": "#NumMatches#" examples."}
|
|
Total := @Total + NumMatches
|
|
end
|
|
{System.showInfo "Total: "#@Total#" examples."}
|
|
end
|
|
|
|
fun {TaskUrl Task}
|
|
"http://rosettacode.org/mw/index.php?"#
|
|
"title="#{PercentEncode {StringX.replace Task " " "_"}}#
|
|
"&action=raw"
|
|
end
|
|
|
|
%% GetPage
|
|
local
|
|
Client = {New HTTPClient.urlGET init(inPrms(toFile:false toStrm:true) _)}
|
|
in
|
|
fun {GetPage RawUrl}
|
|
Url = {VirtualString.toString RawUrl}
|
|
OutParams
|
|
HttpResponseParams
|
|
in
|
|
{Client getService(Url ?OutParams ?HttpResponseParams)}
|
|
OutParams.sOut
|
|
end
|
|
end
|
|
|
|
%% Parse
|
|
local
|
|
Parser = {New XMLParser.parser init}
|
|
in
|
|
fun {Parse Xs} {Parser parseVS(Xs $)} end
|
|
end
|
|
|
|
fun {GetTitles Doc}
|
|
CMs = Doc.2.1.children.1.children.1.children
|
|
fun {Attributes element(attributes:As ...)} As end
|
|
fun {IsTitle attribute(name:N ...)} N == title end
|
|
in
|
|
{Map {Filter {Flatten {Map CMs Attributes}} IsTitle}
|
|
fun {$ A} {Atom.toString A.value} end}
|
|
end
|
|
|
|
fun {PercentEncode Xs}
|
|
case Xs of nil then nil
|
|
[] X|Xr then
|
|
if {Char.isDigit X} orelse {Member X [&- &_ &. &~]}
|
|
orelse X >= &a andthen X =< &z
|
|
orelse X >= &z andthen X =< &Z then
|
|
X|{PercentEncode Xr}
|
|
else
|
|
{Append &%|{ToHex2 X} {PercentEncode Xr}}
|
|
end
|
|
end
|
|
end
|
|
|
|
fun {ToHex2 X}
|
|
[{ToHex1 X div 16} {ToHex1 X mod 16}]
|
|
end
|
|
|
|
fun {ToHex1 X}
|
|
if X >= 0 andthen X =< 9 then &0 + X
|
|
elseif X >= 10 andthen X =< 15 then &A + X - 10
|
|
end
|
|
end
|
|
in
|
|
{Main}
|