1- using System ;
2- using System . Collections . Generic ;
3- using System . IO ;
4- using System . Linq ;
5- using System . Net . Http ;
1+ using System . Net . Http . Json ;
62using System . Text ;
7- using System . Threading . Tasks ;
3+ using System . Text . Json . Nodes ;
84using MwParserFromScratch ;
95using MwParserFromScratch . Nodes ;
10- using Newtonsoft . Json ;
11- using Newtonsoft . Json . Linq ;
126
13- namespace ConsoleTestApplication1
7+ namespace ConsoleTestApplication1 ;
8+
9+ static class Program
1410{
15- static class Program
11+ private static string ReadInput ( )
1612 {
17- private static string ReadInput ( )
13+ var sb = new StringBuilder ( ) ;
14+ int c ;
15+ while ( ( c = Console . Read ( ) ) >= 0 )
1816 {
19- var sb = new StringBuilder ( ) ;
20- int c ;
21- while ( ( c = Console . Read ( ) ) >= 0 )
22- {
23- sb . Append ( ( char ) c ) ;
24- }
25- return sb . ToString ( ) ;
17+ sb . Append ( ( char ) c ) ;
2618 }
19+ return sb . ToString ( ) ;
20+ }
2721
28- private static string Escapse ( string expr )
29- {
30- return expr . Replace ( "\r " , "\\ r" ) . Replace ( "\n " , "\\ n" ) ;
31- }
22+ private static string Escapse ( string expr )
23+ {
24+ return expr . Replace ( "\r " , "\\ r" ) . Replace ( "\n " , "\\ n" ) ;
25+ }
3226
33- private static void PrintAst ( Node node , int level )
34- {
35- var indension = new string ( '.' , level ) ;
36- var ns = node . ToString ( ) ;
37- Console . WriteLine ( "{0,-20} [{1}]" , indension + node . GetType ( ) . Name ,
38- Escapse ( ns . Substring ( 0 , Math . Min ( 20 , ns . Length ) ) ) ) ;
39- foreach ( var child in node . EnumChildren ( ) )
40- PrintAst ( child , level + 1 ) ;
41- }
27+ private static void PrintAst ( Node node , int level )
28+ {
29+ var indension = new string ( '.' , level ) ;
30+ var ns = node . ToString ( ) ;
31+ Console . WriteLine ( "{0,-20} [{1}]" , indension + node . GetType ( ) . Name ,
32+ Escapse ( ns . Substring ( 0 , Math . Min ( 20 , ns . Length ) ) ) ) ;
33+ foreach ( var child in node . EnumChildren ( ) )
34+ PrintAst ( child , level + 1 ) ;
35+ }
4236
43- static void Main ( string [ ] args )
44- {
45- SimpleDemo ( ) ;
46- // ParseAndPrint();
47- //FetchAndParse ();
48- // LoadAndParse();
49- }
37+ static async Task Main ( string [ ] args )
38+ {
39+ SimpleDemo ( ) ;
40+ // ParseAndPrint();
41+ // await FetchAndParseAsync ();
42+ // LoadAndParse();
43+ }
5044
51- static void SimpleDemo ( )
52- {
53- // Fills the missing template parameters.
54- var parser = new WikitextParser ( ) ;
55- var templateNames = new [ ] { "Expand section" , "Cleanup" } ;
56- var text = @"==Hello==<!--comment-->
45+ static void SimpleDemo ( )
46+ {
47+ // Fills the missing template parameters.
48+ var parser = new WikitextParser ( ) ;
49+ var templateNames = new [ ] { "Expand section" , "Cleanup" } ;
50+ var text = @"==Hello==<!--comment-->
5751{{Expand section|
5852 date=2010-10-05
5953}}
@@ -62,102 +56,101 @@ This is a nice '''paragraph'''.
6256==References==
6357{{Reflist}}
6458" ;
65- var ast = parser . Parse ( text ) ;
66- // Convert the code snippets to nodes
67- var dateName = parser . Parse ( "date" ) ;
68- var dateValue = parser . Parse ( DateTime . Now . ToString ( "yyyy-MM-dd" ) ) ;
69- Console . WriteLine ( "Issues:" ) ;
70- // Search and set
71- foreach ( var t in ast . EnumDescendants ( ) . OfType < Template > ( )
72- . Where ( t => templateNames . Contains ( MwParserUtility . NormalizeTemplateArgumentName ( t . Name ) ) ) )
59+ var ast = parser . Parse ( text ) ;
60+ // Convert the code snippets to nodes
61+ var dateName = parser . Parse ( "date" ) ;
62+ var dateValue = parser . Parse ( DateTime . Now . ToString ( "yyyy-MM-dd" ) ) ;
63+ Console . WriteLine ( "Issues:" ) ;
64+ // Search and set
65+ foreach ( var t in ast . EnumDescendants ( ) . OfType < Template > ( )
66+ . Where ( t => templateNames . Contains ( MwParserUtility . NormalizeTemplateArgumentName ( t . Name ) ) ) )
67+ {
68+ // Get the argument by name.
69+ var date = t . Arguments [ "date" ] ;
70+ if ( date != null )
7371 {
74- // Get the argument by name.
75- var date = t . Arguments [ "date" ] ;
76- if ( date != null )
77- {
78- // To print the wikitext instead of user-friendly text, use ToString()
79- Console . WriteLine ( "{0} ({1})" , t . Name . ToPlainText ( ) , date . Value . ToPlainText ( ) ) ;
80- }
81- // Update/Add the argument
82- t . Arguments . SetValue ( dateName , dateValue ) ;
72+ // To print the wikitext instead of user-friendly text, use ToString()
73+ Console . WriteLine ( "{0} ({1})" , t . Name . ToPlainText ( ) , date . Value . ToPlainText ( ) ) ;
8374 }
84- Console . WriteLine ( ) ;
85- Console . WriteLine ( "Wikitext:" ) ;
86- Console . WriteLine ( ast . ToString ( ) ) ;
75+ // Update/Add the argument
76+ t . Arguments . SetValue ( dateName , dateValue ) ;
8777 }
78+ Console . WriteLine ( ) ;
79+ Console . WriteLine ( "Wikitext:" ) ;
80+ Console . WriteLine ( ast . ToString ( ) ) ;
81+ }
8882
89- private static void ParseAndPrint ( )
90- {
91- var parser = new WikitextParser ( ) ;
92- Console . WriteLine ( "Please input the wikitext to parse; use EOF (Ctrl+Z) to accept:" ) ;
93- var ast = parser . Parse ( ReadInput ( ) ) ;
94- Console . WriteLine ( "Parsed AST" ) ;
95- PrintAst ( ast , 0 ) ;
96- Console . WriteLine ( "Plain text" ) ;
97- Console . WriteLine ( ast . ToPlainText ( ) ) ;
98- }
83+ private static void ParseAndPrint ( )
84+ {
85+ var parser = new WikitextParser ( ) ;
86+ Console . WriteLine ( "Please input the wikitext to parse; use EOF (Ctrl+Z) to accept:" ) ;
87+ var ast = parser . Parse ( ReadInput ( ) ) ;
88+ Console . WriteLine ( "Parsed AST" ) ;
89+ PrintAst ( ast , 0 ) ;
90+ Console . WriteLine ( "Plain text" ) ;
91+ Console . WriteLine ( ast . ToPlainText ( ) ) ;
92+ }
9993
100- private static void FetchAndParse ( )
94+ private static async Task FetchAndParseAsync ( )
95+ {
96+ Console . WriteLine ( "Please input the title of the Wikipedia page to parse:" ) ;
97+ var title = Console . ReadLine ( ) ;
98+ Console . WriteLine ( ) ;
99+ var ast = await FetchAndParseAsync ( title ) ;
100+ Console . WriteLine ( "Headings:" ) ;
101+ // Show all headings
102+ foreach ( var h in ast . EnumDescendants ( ) . OfType < Heading > ( ) )
101103 {
102- Console . WriteLine ( "Please input the title of the Wikipedia page to parse:" ) ;
103- var title = Console . ReadLine ( ) ;
104- Console . WriteLine ( ) ;
105- var ast = FetchAndParse ( title ) ;
106- Console . WriteLine ( "Headings:" ) ;
107- // Show all headings
108- foreach ( var h in ast . EnumDescendants ( ) . OfType < Heading > ( ) )
109- {
110- Console . WriteLine ( h . ToString ( ) ) ;
111- }
104+ Console . WriteLine ( h . ToString ( ) ) ;
112105 }
106+ }
113107
114- private static void LoadAndParse ( )
108+ private static void LoadAndParse ( )
109+ {
110+ Console . WriteLine ( "Please input the path of the file to parse:" ) ;
111+ var fileName = Console . ReadLine ( ) ;
112+ Console . WriteLine ( ) ;
113+ var ast = LoadAndParse ( fileName . Trim ( ' ' , '\t ' , '"' ) ) ;
114+ PrintAst ( ast , 0 ) ;
115+ Console . WriteLine ( "Headings:" ) ;
116+ // Show all headings
117+ foreach ( var h in ast . EnumDescendants ( ) . OfType < Heading > ( ) )
115118 {
116- Console . WriteLine ( "Please input the path of the file to parse:" ) ;
117- var fileName = Console . ReadLine ( ) ;
118- Console . WriteLine ( ) ;
119- var ast = LoadAndParse ( fileName . Trim ( ' ' , '\t ' , '"' ) ) ;
120- PrintAst ( ast , 0 ) ;
121- Console . WriteLine ( "Headings:" ) ;
122- // Show all headings
123- foreach ( var h in ast . EnumDescendants ( ) . OfType < Heading > ( ) )
124- {
125- Console . WriteLine ( h . ToString ( ) ) ;
126- }
119+ Console . WriteLine ( h . ToString ( ) ) ;
127120 }
121+ }
128122
129- /// <summary>
130- /// Fetches a page from en Wikipedia, and parse it.
131- /// </summary>
132- private static Wikitext FetchAndParse ( string title )
123+ /// <summary>
124+ /// Fetches a page from en Wikipedia, and parse it.
125+ /// </summary>
126+ private static async Task < Wikitext > FetchAndParseAsync ( string title )
127+ {
128+ if ( title == null ) throw new ArgumentNullException ( nameof ( title ) ) ;
129+ const string endPointUrl = "https://en.wikipedia.org/w/api.php" ;
130+ var client = new HttpClient ( ) ;
131+ var requestContent = new Dictionary < string , string >
133132 {
134- if ( title == null ) throw new ArgumentNullException ( nameof ( title ) ) ;
135- const string EndPointUrl = "https://en.wikipedia.org/w/api.php" ;
136- var client = new HttpClient ( ) ;
137- var requestContent = new Dictionary < string , string >
138- {
139- { "format" , "json" } ,
140- { "action" , "query" } ,
141- { "prop" , "revisions" } ,
142- { "rvlimit" , "1" } ,
143- { "rvprop" , "content" } ,
144- { "titles" , title }
145- } ;
146- var response = client . PostAsync ( EndPointUrl , new FormUrlEncodedContent ( requestContent ) ) . Result ;
147- var root = JObject . Parse ( response . Content . ReadAsStringAsync ( ) . Result ) ;
148- var content = ( string ) root [ "query" ] [ "pages" ] . Children < JProperty > ( ) . First ( ) . Value [ "revisions" ] [ 0 ] [ "*" ] ;
149- var parser = new WikitextParser ( ) ;
150- return parser . Parse ( content ) ;
151- }
133+ { "format" , "json" } ,
134+ { "action" , "query" } ,
135+ { "prop" , "revisions" } ,
136+ { "rvlimit" , "1" } ,
137+ { "rvprop" , "content" } ,
138+ { "titles" , title }
139+ } ;
140+ var response = await client . PostAsync ( endPointUrl , new FormUrlEncodedContent ( requestContent ) ) ;
141+ var root = await response . Content . ReadFromJsonAsync < JsonObject > ( ) ;
142+ var content = ( string ) root [ "query" ] [ "pages" ] . AsObject ( ) . First ( ) . Value [ "revisions" ] [ 0 ] [ "*" ] ;
143+ var parser = new WikitextParser ( ) ;
144+ return parser . Parse ( content ) ;
145+ }
152146
153- /// <summary>
154- /// Loads a page from file and parse it.
155- /// </summary>
156- private static Wikitext LoadAndParse ( string fileName )
157- {
158- var content = File . ReadAllText ( fileName ) ;
159- var parser = new WikitextParser ( ) ;
160- return parser . Parse ( content ) ;
161- }
147+ /// <summary>
148+ /// Loads a page from file and parse it.
149+ /// </summary>
150+ private static Wikitext LoadAndParse ( string fileName )
151+ {
152+ var content = File . ReadAllText ( fileName ) ;
153+ var parser = new WikitextParser ( ) ;
154+ return parser . Parse ( content ) ;
162155 }
163156}
0 commit comments