Data update
This commit is contained in:
parent
29a5eea0d4
commit
5c1bb7bfa9
2011 changed files with 35081 additions and 3229 deletions
|
|
@ -1,23 +1,28 @@
|
|||
pragma Ada_2022;
|
||||
|
||||
with Ada.Integer_Text_IO; use Ada.Integer_Text_IO;
|
||||
with Ada.Strings.Fixed; use Ada.Strings.Fixed;
|
||||
with Ada.Strings.Unbounded; use Ada.Strings.Unbounded;
|
||||
with Ada.Text_IO; use Ada.Text_IO;
|
||||
|
||||
with Ada.Containers.Ordered_Sets;
|
||||
with Ada.Strings.Less_Case_Insensitive;
|
||||
with Ada.Strings.Unbounded.Less_Case_Insensitive;
|
||||
with Ada.Characters.Handling; use Ada.Characters.Handling;
|
||||
|
||||
with AWS.Client;
|
||||
with AWS.Client; use AWS.Client;
|
||||
with AWS.Messages; use AWS.Messages;
|
||||
with AWS.Response;
|
||||
|
||||
procedure Test is
|
||||
procedure Rank_Languages_By_Popularity is
|
||||
|
||||
use Ada.Strings;
|
||||
|
||||
function "+" (S : String) return Unbounded_String renames To_Unbounded_String;
|
||||
function "+" (S : String) return Unbounded_String
|
||||
renames To_Unbounded_String;
|
||||
|
||||
type A_Language_Count is
|
||||
record
|
||||
Count : Integer := 0;
|
||||
Count : Natural := 0;
|
||||
Language : Unbounded_String;
|
||||
end record;
|
||||
|
||||
|
|
@ -28,11 +33,12 @@ procedure Test is
|
|||
|
||||
function "<" (L, R : A_Language_Count) return Boolean is
|
||||
begin
|
||||
-- Sort by 'Count' and then by Language name
|
||||
-- Sort by 'Count' and then by Language name
|
||||
return L.Count < R.Count
|
||||
or else (L.Count = R.Count
|
||||
and then Less_Case_Insensitive (Left => To_String (L.Language),
|
||||
Right => To_String (R.Language)));
|
||||
and then Less_Case_Insensitive
|
||||
(Left => L.Language,
|
||||
Right => R.Language));
|
||||
end "<";
|
||||
|
||||
package Sets is new Ada.Containers.Ordered_Sets (A_Language_Count);
|
||||
|
|
@ -41,30 +47,140 @@ procedure Test is
|
|||
Counts : Set;
|
||||
|
||||
procedure Find_Counts (S : String) is
|
||||
Title_Str : constant String := "title=""Category:";
|
||||
End_A_Str : constant String := "</a> (";
|
||||
|
||||
Title_At : constant Natural := Index (S, Title_Str);
|
||||
function Strip_Character (S : String; C : Character) return String is
|
||||
S_Copy_Str : String (1 .. S'Length);
|
||||
S_Copy_Index : Natural := 0;
|
||||
begin
|
||||
for I in S'Range loop
|
||||
if S (I) /= C then
|
||||
S_Copy_Index := S_Copy_Index + 1;
|
||||
S_Copy_Str (S_Copy_Index) := S (I);
|
||||
end if;
|
||||
end loop;
|
||||
|
||||
return S_Copy_Str (S_Copy_Str'First .. S_Copy_Index);
|
||||
end Strip_Character;
|
||||
|
||||
function Ignore_Category (L : String) return Boolean is
|
||||
type Unbounded_String_Array is array (Positive range <>)
|
||||
of Unbounded_String;
|
||||
-- This list is quite comprehensive, but not complete
|
||||
Categories_To_Ignore : Unbounded_String_Array := [
|
||||
+"Pages with syntax highlighting errors",
|
||||
+"Programming",
|
||||
+"Examples needing attention",
|
||||
+"Tasks needing attention",
|
||||
+"Language users",
|
||||
+"Implementations",
|
||||
+"Solutions by ",
|
||||
+"Maintenance/OmitCategoriesCreated",
|
||||
+"Collection Members",
|
||||
+"Pages with too many expensive parser function calls",
|
||||
+"Garbage collection",
|
||||
+" User",
|
||||
+"SQL User",
|
||||
+"Typing",
|
||||
+"Parameter passing",
|
||||
+"Execution method",
|
||||
+"Unimplemented tasks by language",
|
||||
+"Wolfram Language",
|
||||
+"/Omit",
|
||||
+"Wren-",
|
||||
+"WrenGo",
|
||||
+"Phix/",
|
||||
+"PhixClass",
|
||||
+"Basic language learning",
|
||||
+"Encyclopedia",
|
||||
+"RCTemplates",
|
||||
+"SysUtils",
|
||||
+"Action! ",
|
||||
+"Text processing",
|
||||
+"Image processing",
|
||||
+"Scala Digital Signal Processing",
|
||||
+"List processing",
|
||||
+"Digital signal processing",
|
||||
+"Processing Python",
|
||||
+"Classic CS problems and programs",
|
||||
+"Brainf*** related",
|
||||
+"Data Structures",
|
||||
+"Perl modules",
|
||||
+"Perl/",
|
||||
+"Perl:LWP",
|
||||
+"Perl 6 related",
|
||||
+"Flow control",
|
||||
+"Excessively difficult task",
|
||||
+"WikiStubs",
|
||||
+"Impl needed",
|
||||
+"Recursion"
|
||||
];
|
||||
begin
|
||||
for Category of Categories_To_Ignore loop
|
||||
declare
|
||||
Category_At : constant Natural :=
|
||||
Index (+To_Lower (L),
|
||||
To_Lower (To_String (Category)));
|
||||
begin
|
||||
if Category_At /= 0 then
|
||||
return True;
|
||||
end if;
|
||||
end;
|
||||
end loop;
|
||||
|
||||
return False;
|
||||
end Ignore_Category;
|
||||
|
||||
Title_Str : constant String := "title=""Category:";
|
||||
End_A_Tag_Str : constant String := "</a>";
|
||||
Space_Paren_Str : constant String := " (";
|
||||
|
||||
Title_At : constant Natural := Index (S, Title_Str);
|
||||
begin
|
||||
if Title_At /= 0 then
|
||||
declare
|
||||
Bracket_At : constant Natural := Index (S (Title_At + Title_Str'Length .. S'Last), ">");
|
||||
End_A_At : constant Natural := Index (S (Bracket_At + 1 .. S'Last), End_A_Str);
|
||||
Space_At : constant Natural := Index (S (End_A_At + End_A_Str'Length .. S'Last), " ");
|
||||
Count : constant Natural := Natural'Value (S (End_A_At + End_A_Str'Length .. Space_At - 1));
|
||||
Language : constant String := S (Title_At + Title_Str'Length .. Bracket_At - 2);
|
||||
Closing_Bracket_At : constant Natural :=
|
||||
Index (S (Title_At + Title_Str'Length .. S'Last), ">");
|
||||
|
||||
End_A_Tag_At : constant Natural :=
|
||||
Index (S (Closing_Bracket_At + 1 .. S'Last), End_A_Tag_Str);
|
||||
|
||||
Language : constant String :=
|
||||
S (Closing_Bracket_At + 1 .. End_A_Tag_At - 1);
|
||||
|
||||
Space_Paren_At : constant Natural :=
|
||||
Index (S (End_A_Tag_At + 1 .. S'Last), Space_Paren_Str);
|
||||
|
||||
Space_At : constant Natural :=
|
||||
Index (S (Space_Paren_At + Space_Paren_Str'Length + 1
|
||||
.. S'Last),
|
||||
" ");
|
||||
|
||||
Count : constant Natural :=
|
||||
Natural'Value (
|
||||
Strip_Character (
|
||||
S (Space_Paren_At +
|
||||
Space_Paren_Str'Length
|
||||
.. Space_At - 1),
|
||||
','));
|
||||
begin
|
||||
if Bracket_At /= 0 and then End_A_At /= 0 and then Space_At /= 0 then
|
||||
if Closing_Bracket_At /= 0
|
||||
and then End_A_Tag_At /= 0
|
||||
and then Space_Paren_At /= 0
|
||||
and then Space_At /= 0
|
||||
then
|
||||
begin
|
||||
Counts.Insert (New_Item => (Count, +Language));
|
||||
if Ignore_Category (Language) = False then
|
||||
Counts.Insert (New_Item => (Count, +Language));
|
||||
end if;
|
||||
exception
|
||||
when Constraint_Error =>
|
||||
Put_Line (Standard_Error, "Warning: repeated language: " & Language);
|
||||
-- Ignore repeated results.
|
||||
Put_Line (Standard_Error, "Warning: repeated language: " &
|
||||
Language);
|
||||
-- Ignore repeated results.
|
||||
null;
|
||||
end;
|
||||
end if;
|
||||
-- Recursively parse the string for languages and counts
|
||||
-- Recursively parse the string for languages and counts
|
||||
Find_Counts (S (Space_At + 1 .. S'Last));
|
||||
end;
|
||||
end if;
|
||||
|
|
@ -82,8 +198,26 @@ procedure Test is
|
|||
end Display;
|
||||
|
||||
Http_Source : constant AWS.Response.Data :=
|
||||
AWS.Client.Get ("http://rosettacode.org/mw/index.php?title=Special:Categories&limit=5000");
|
||||
AWS.Client.Get ("http://rosettacode.org/w/index.php?" &
|
||||
"title=Special:Categories&limit=5000",
|
||||
Follow_Redirection => True);
|
||||
Status : Status_Code;
|
||||
begin
|
||||
Put_Line ("Getting website data...");
|
||||
|
||||
Status := AWS.Response.Status_Code (Http_Source);
|
||||
if Status not in Success then
|
||||
Put_Line ("Unable to retrieve data => Status Code :" &
|
||||
Image (Status) &
|
||||
" Reason :" & Reason_Phrase (Status));
|
||||
raise Connection_Error;
|
||||
end if;
|
||||
|
||||
Put_Line ("Finding categories...");
|
||||
Find_Counts (AWS.Response.Message_Body (Http_Source));
|
||||
|
||||
Put_Line ("Displaying categories...");
|
||||
Counts.Reverse_Iterate (Display'Access);
|
||||
end Test;
|
||||
|
||||
Put_Line ("Process complete.");
|
||||
end Rank_Languages_By_Popularity;
|
||||
|
|
|
|||
|
|
@ -1,3 +1,4 @@
|
|||
import java.net.URI;
|
||||
import java.net.URL;
|
||||
import java.net.URLConnection;
|
||||
import java.io.*;
|
||||
|
|
@ -45,10 +46,8 @@ public class GetRCLanguages
|
|||
try
|
||||
{
|
||||
|
||||
URL url = new URL( path );
|
||||
URL url = new URI( path ).toURL();
|
||||
URLConnection rc = url.openConnection();
|
||||
// Rosetta Code objects to the default Java user agant so use a blank one
|
||||
rc.setRequestProperty( "User-Agent", "" );
|
||||
BufferedReader bfr = new BufferedReader( new InputStreamReader( rc.getInputStream() ) );
|
||||
|
||||
gcmcontinue[0] = "";
|
||||
|
|
@ -56,27 +55,27 @@ public class GetRCLanguages
|
|||
String line = bfr.readLine();
|
||||
while( line != null )
|
||||
{
|
||||
line = line.trim();
|
||||
if ( line.startsWith( "[title]" ) )
|
||||
line = line.trim().replaceAll( "[\",]", "" );
|
||||
if ( line.startsWith( "title" ) )
|
||||
{
|
||||
// have a programming language - should look like "[title] => Category:languageName"
|
||||
languageName = after( line, ':' ).trim();
|
||||
// have a programming language - should look like "title: Category:languageName"
|
||||
languageName = after( after( line, ':' ), ':' ).trim();
|
||||
}
|
||||
else if( line.startsWith( "[pages]" ) )
|
||||
else if( line.startsWith( "pages" ) )
|
||||
{
|
||||
// number of pages the language has (probably)
|
||||
String pageCount = after( line, '>' ).trim();
|
||||
if( pageCount.compareTo( "Array" ) != 0 )
|
||||
String pageCount = after( line, ':' ).trim();
|
||||
if( pageCount.compareTo( "{" ) != 0 )
|
||||
{
|
||||
// haven't got "[pages] => Array" - must be a number of pages
|
||||
// haven't got "pages: {" - must be a number of pages
|
||||
languageList.add( ( (char) Integer.parseInt( pageCount ) ) + languageName );
|
||||
languageName = "?";
|
||||
} // if [pageCount.compareTo( "Array" ) != 0
|
||||
} // if [pageCount.compareTo( "{" ) != 0
|
||||
}
|
||||
else if( line.startsWith( "[gcmcontinue]" ) )
|
||||
else if( line.startsWith( "gcmcontinue" ) )
|
||||
{
|
||||
// have an indication of wether there is more data or not
|
||||
gcmcontinue[0] = after( line, '>' ).trim();
|
||||
gcmcontinue[0] = after( line, ':' ).trim().replaceAll( "[|]", "%7C" );
|
||||
} // if various line starts
|
||||
line = bfr.readLine();
|
||||
} // while line != null
|
||||
|
|
@ -96,13 +95,13 @@ public class GetRCLanguages
|
|||
gcmcontinue[0] = "";
|
||||
do
|
||||
{
|
||||
String path = ( "http://www.rosettacode.org/mw/api.php?action=query"
|
||||
String path = ( "https://www.rosettacode.org/w/api.php?action=query"
|
||||
+ "&generator=categorymembers"
|
||||
+ "&gcmtitle=Category:Programming%20Languages"
|
||||
+ "&gcmlimit=500"
|
||||
+ ( gcmcontinue[0].compareTo( "" ) == 0 ? "" : ( "&gcmcontinue=" + gcmcontinue[0] ) )
|
||||
+ "&prop=categoryinfo"
|
||||
+ "&format=txt"
|
||||
+ "&format=jsonfm"
|
||||
);
|
||||
parseContent( path, gcmcontinue, languageList );
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,13 @@
|
|||
uses System.Net;
|
||||
|
||||
begin
|
||||
ServicePointManager.SecurityProtocol := SecurityProtocolType(3072);
|
||||
var wc := new WebClient;
|
||||
wc.Encoding := Encoding.UTF8;
|
||||
var s := wc.DownloadString('https://rosettacode.org/wiki/Special:Categories?limit=5000');
|
||||
s.Matches('([^><]+)</a>.+\(([\d,]+) member')
|
||||
.Select(x -> KV(x.Groups[1].Value,x.Groups[2].Value.Replace(',','').ToInteger))
|
||||
.Where(x -> not x.Key.StartsWith('Pages'))
|
||||
.OrderByDescending(pair -> pair.Value).Numerate.Take(10)
|
||||
.PrintLines(x -> $'Rank: {x[0],3} ({x[1].Value} entries) {x[1].Key}')
|
||||
end.
|
||||
Loading…
Add table
Add a link
Reference in a new issue