User:JarektBot/AWB Modules

From Wikimedia Commons, the free media repository
Jump to: navigation, search

Samples of C#2.0 source code used by JarektBot. The code is compiled as AWB Custom Modules. Code below is mostly not usable as-is and need to be modified each time for specific tasks.

Add date subcategory based on date found[edit]

        public string ProcessArticle(string ArticleText, string ArticleTitle, int wikiNamespace, out string Summary, out bool Skip)
        {
            String Name = "Eugen Nosko";
            Skip = true;
            Summary = "Add date category";
            Match m = Regex.Match(ArticleText, @"5064\s*=\s*(19\d\d)");
            if (m.Success) {
              Skip = false;
              String cat1 = @"\[\[Category:Photographs by " + Name + @"\]\]";
              String cat2 = "[[Category:Photographs by " + Name + " from " + m.Result("$1") + "]]";
              ArticleText = Regex.Replace(ArticleText, cat1, cat2);
            }
            return ArticleText;
        }

Add date subcategory based on date found and correct date format[edit]

        public string ProcessArticle(string ArticleText, string ArticleTitle, int wikiNamespace, out string Summary, out bool Skip)
        {
            String Name = "Roger and Renate Rössing";
            Skip = false;
            Summary = "Add date category";
            Match m = Regex.Match(ArticleText, @"8450_1_8494\s*=\s*(19\d\d)");
            if (m.Success) {
              Skip = false;
              String cat1 = @"\[\[Category:Photographs by " + Name + @"\]\]";
              String cat2 = "[[Category:Photographs by " + Name +  m.Result(" from $1]]");
              ArticleText = Regex.Replace(ArticleText, cat1, cat2);
             }
            m = Regex.Match(ArticleText, @"8450_1_8494\s*=\s*(19\d\d)\.(\d\d)\.(\d\d)-(19\d\d)\.(\d\d)\.(\d\d)");
            if (m.Success) {
              Skip = false;
              String cat2 = m.Result("date = {{other date|between|$1-$2-$3|$4-$5-$6}}");
              ArticleText = Regex.Replace(ArticleText, "date =", cat2);
             } else {
              m = Regex.Match(ArticleText, @"8450_1_8494\s*=\s*(19\d\d)\.(\d\d)\.(\d\d)");
              if (m.Success) {
                Skip = false;
                String cat2 =  m.Result("date = $1-$2-$3");
                ArticleText = Regex.Replace(ArticleText, "date =", cat2);
               }
            }
            return ArticleText;
        }

Add date subcategory based on date found and correct date format 2[edit]

        public string ProcessArticle(string ArticleText, string ArticleTitle, int wikiNamespace, out string Summary, out bool Skip)
        {
            String Name = "Richard Peter";
            Skip = false;
            Summary = "Add date category";
            Match m = Regex.Match(ArticleText, @"8450_\d_8494\s*=\s*um (19\d\d)");
            if (m.Success) {
                String cat1 = @"\[\[Category:Photographs by " + Name + @"\]\]";
                String cat2 = "[[Category:Photographs by " + Name +  m.Result(" from $1]]");
                ArticleText = Regex.Replace(ArticleText, cat1, cat2);
            } else {
              m = Regex.Match(ArticleText, @"8450_\d_8494\s*=\s*(19\d\d)");
              if (m.Success) {
                String cat1 = @"\[\[Category:Photographs by " + Name + @"\]\]";
                String cat2 = "[[Category:Photographs by " + Name +  m.Result(" from $1]]");
                ArticleText = Regex.Replace(ArticleText, cat1, cat2);
              }
            }
            m = Regex.Match(ArticleText, @"{{other date\|");
            if (!m.Success) {
            m = Regex.Match(ArticleText, @"8450_\d_8494\s*=\s*(19\d\d)\.(\d\d)\.(\d\d)-(19\d\d)\.(\d\d)\.(\d\d)");
            if (m.Success) {
              String cat2 = m.Result("date = {{other date|between|$1-$2-$3|$4-$5-$6}}");
              ArticleText = Regex.Replace(ArticleText, "date =", cat2);
            } else {
              m = Regex.Match(ArticleText, @"8450_\d_8494\s*=\s*nach (19\d\d)\.(\d\d)\.(\d\d)");
              if (m.Success) {
                String cat2 =  m.Result("date = {{other date|after|$1-$2-$3}}");
                ArticleText = Regex.Replace(ArticleText, "date =", cat2);
              } else {
                m = Regex.Match(ArticleText, @"8450_\d_8494\s*=\s*um (19\d\d)");
                if (m.Success) {
                  String cat2 =  m.Result("date = {{other date|ca|$1}}");
                  ArticleText = Regex.Replace(ArticleText, "date =", cat2);
                } else {
                  m = Regex.Match(ArticleText, @"8450_\d_8494\s*=\s*(19\d\d)\.(\d\d)\.(\d\d)");
                  if (m.Success) {
                    String cat2 =  m.Result("date = $1-$2-$3");
                    ArticleText = Regex.Replace(ArticleText, "date =", cat2);
                  }
                }
              }
            }
            }
            return ArticleText;
        }

Change name format[edit]

Replace:

  • Name = [[??:FirstName(s) Surname|Surname, FirstName(s)]]

Like

  • Name = [[w:FirstName(s) Surname|Surname, FirstName(s)]]
  • Name = [[:en:FirstName(s) Surname|Surname, FirstName(s)]]
  • Name = [[:Category:FirstName(s) Surname|Surname, FirstName(s)]]

With

  • Name = [[??:FirstName(s) Surname|FirstName(s) Surname]]

Also, replace

  • Name = [[FirstName(s) Surname|Surname, FirstName(s)]]
  • Name = [[FirstName(s) Surname|FirstName(s) Surname]]

With

  • Name = [[FirstName(s) Surname]]
       public string ProcessArticle(string ArticleText, string ArticleTitle, int wikiNamespace, out string Summary, out bool Skip)
       {
           Skip = false;
           Summary = "";
           String str1 = @"Name\s*=\s*\[\[([^\]|]+)\|([^\]|]+), ([^\]|]+)\]\]";
           Match m  = Regex.Match(ArticleText, str1);
           if (m.Success) {
             String str2 = m.Result("Name = [[$1|$3 $2]]");
             ArticleText = Regex.Replace(ArticleText, str1, str2);
           }
           str1 = @"Name\s*=\s*\[\[([^\]|]+)\|([^\]|]+)\]\]";
           m  = Regex.Match(ArticleText, str1);
           if (m.Success) {
             if (m.Result("$1")==m.Result("$2")) {
               String str2 = m.Result("Name = [[$1]]");
               ArticleText = Regex.Replace(ArticleText, str1, str2);
             }
           }

Add Creator template to a category[edit]

        public string ProcessArticle(string ArticleText, string ArticleTitle, int wikiNamespace, out string Summary, out bool Skip)
        {
            Skip = false;
            Summary = "test";
            String str = "{{Creator:" + ArticleTitle.Replace("Category:","") + "}}";
            int m  = ArticleText.IndexOf(str);
            if (m<0) ArticleText = str + "\r\n" + ArticleText;           
            str = "[[Category:People by alphabet]]";
            m  = ArticleText.IndexOf(str);
            if (m<0) ArticleText = ArticleText + "\r\n" + str;           
            return ArticleText;
        }

Add categories extracted from creator name[edit]

      public string ProcessArticle(string ArticleText, string ArticleTitle, int wikiNamespace, out string Summary, out bool Skip)
      {
          Skip = false;
          Summary = "";
          String ArticleTextLow = ArticleText.ToLower();   // lower case version of the article
          ArticleTextLow = ArticleTextLow.Replace('_',' ');// _ to space
          String str = @"{{[Cc]reator:\s*([^}]+)}}";
          Match m  = Regex.Match(ArticleTextLow, str);     // search for creator template
          if (m.Success) {                                 // if found
            String cat = m.Result("[[category:$1");        // build category name
            int n  = ArticleTextLow.IndexOf(cat);          // look for the category in the article
            if (n<0) {                                     // if cat not found
              m   = Regex.Match(ArticleText, str);         // get case dependent creator name 
              if (m.Success) 
                ArticleText = ArticleText + "\r\n" + m.Result("<nowiki>[[Category:$1]]</nowiki>");  
            }
          }
        return ArticleText;
      }

Add creator templates based on the authors name[edit]

        public string ProcessArticle(string ArticleText, string ArticleTitle, int wikiNamespace, out string Summary, out bool Skip)
        {
           Skip = false;
           bool SkipVal = true;
           Summary = "";
           String author;
           int n  = ArticleText.IndexOf("{{Painting");              // Painting or Information template
           if (n<0) author = "Author"; else author = "Artist";
           String str1 = "(" + author + @"\s*=\s*([^\r\n]+))";      
           Match m  = Regex.Match(ArticleText, str1);
           if (m.Success) {
             String name     = m.Result("$2");    // Save creator name
             String nameLine = m.Result("$1");    // Save the whole original line
             // Skip to the next image if Name contains one of the words: "Attributed", "Follower", "School", "After", 
             // "Circle", "Workshop", "Anonymous" and "Unknown" or is name is less than 5 characters long
             if (name.IndexOf("attributed")>=0 || name.IndexOf("Attributed")>=0 ||
                 name.IndexOf("follower")>=0   || name.IndexOf("Follower")>=0 ||
                 name.IndexOf("school")>=0     || name.IndexOf("School")>=0 ||
                 name.IndexOf("after") >=0     || name.IndexOf("After") >=0 ||
                 name.IndexOf("circle") >=0    || name.IndexOf("Circle") >=0 ||
                 name.IndexOf("workshop") >=0  || name.IndexOf("Workshop") >=0 ||
                 name.IndexOf("nonymous") >=0  || name.IndexOf("nknown")>=0 ||
                 name.Length<5 ) { Skip=SkipVal; return ArticleText; }
             m = Regex.Match(name, @"\[\[([^\]]+)\]\].*");
             if (m.Success) {                     // strip [[]] brackets
               name = m.Result("$1");
               n = name.LastIndexOf(":");         // trim :en:, w:, Category:, etc. in front of the name
               if (n>=0) name = name.Substring(n+1);
               n = name.IndexOf("|");             // trim string after | on the end of the name
               if (n>=0) name = name.Substring(0,n);
             }
             m = Regex.Match(name, "([^,]+), (.*)");  // reverse names like: SURNAME, NAME
             if (m.Success) name = m.Result("$2 $1"); // to NAME SURNAME
             n = name.IndexOfAny(new char[]{'{', '}', '|', '[', ']', '(', ')', '<', '>', '-', '\n'});
             if (n>=0) { Skip=SkipVal; return ArticleText; } // Skip to the next file if any brackets are still left in the name
             //ArticleText = ArticleText + "<!-- Name = " + name + "; " +n+ "-->" ;
             n = name.Length;
             if (n<5 || n>30) { Skip=SkipVal; return ArticleText; } // Skip to the next file if too long or too short
             String str2 = "{{subst:#ifexist: creator:" +name+ " |" +author+ " = {{creator:" +name+ "}} |" +nameLine+ "}}";
             ArticleText = Regex.Replace(ArticleText, str1, str2);
           }
           return ArticleText;
        }

Create a Gallery with descriptions pulled out of file descriptions[edit]

      public string ProcessArticle(string ArticleText, string ArticleTitle, int wikiNamespace, out string Summary, out bool Skip)
      {
          Skip = false;
          Summary = "";
          int m1  = ArticleText.IndexOf("|Description=");
          int m2  = ArticleText.IndexOf("|Source=");
          int m3  = ArticleText.IndexOf("|Date=");
          int m4  = ArticleText.IndexOf("|Author");
          System.IO.StreamWriter sw = System.IO.File.AppendText("C:Projects/WikiGallery.txt");
          sw.WriteLine("File:{{PAGENAME}}|");
          sw.WriteLine(ArticleText.Substring(m3, m4-m3));
          sw.WriteLine(" - ");
          sw.WriteLine(ArticleText.Substring(m1, m2-m1));
          sw.Close();
          return ArticleText;
      }

Extract image names from polish wikipedia articles[edit]

        public string ProcessArticle(string ArticleText, string ArticleTitle, int wikiNamespace, out string Summary, out bool Skip)
        {
            Skip = false;
            Summary = "test";
            String outStr = "";
            Match m = Regex.Match(ArticleText, @"[Pp]lik\:([^\|\]]+)\|");
            while (m.Success) {
              outStr = outStr + m.Result("$1") + "\r\n";
              m = m.NextMatch();
            }
            m = Regex.Match(ArticleText, @"[Ff]ile\:([^\|\]]+)\|");
            while (m.Success) {
              outStr = outStr + m.Result("$1") + "\r\n";
              m = m.NextMatch();
            }
            m = Regex.Match(ArticleText, @"[Gg]rafika\:([^\|\]]+)\|");
            while (m.Success) {
              outStr = outStr + m.Result("$1") + "\r\n";
              m = m.NextMatch();
            }
            m = Regex.Match(ArticleText, @"=\s*(.+\.[Jj][Pp][Ee]?[Gg])");
            while (m.Success) {
              outStr = outStr + m.Result("$1") + "\r\n";
              m = m.NextMatch();
            }
            if (outStr.Length>0) {
              System.IO.StreamWriter sw = System.IO.File.AppendText("C:/Projects/WikiPliks2.txt");
              sw.WriteLine(outStr);
              sw.Close();
           } 
           return ArticleText;
       }

Extract page number from file name and create description page[edit]

        public string ProcessArticle(string ArticleText, string ArticleTitle, int wikiNamespace, out string Summary, out bool Skip)
        {
            Skip = false;
            Summary = "";
            Match m = Regex.Match(ArticleText, @"Title=Słownik języka polskiego T.1 Cz.(\d)");
            if (m.Success) {
              string vol = m.Result("$1");
              string str = ArticleTitle.Substring(ArticleTitle.Length-7,3);
              int num; 
              bool res = int.TryParse(str, out num);
              if (res == false)
              {
                Skip = true;
              } else {
                int num1 = num-1;
                int num2 = num+1;
                ArticleText = "{{Linde Samuel Bogumił - Słownik języka polskiego|volume="+vol+"|prev="+num1.ToString("D3")+"|next="+num2.ToString("D3")+"}}\r\n";
                ArticleText = ArticleText + "{{PD-old-100}}\r\n";
                ArticleText = ArticleText + "[[Category:Linde Samuel Bogumił - Słownik języka polskiego T.1 Cz."+vol+"|"+num.ToString("D3")+"]]";
              }
            }
            return ArticleText;
        }
        public string ProcessArticle(string ArticleText, string ArticleTitle, int wikiNamespace, out string Summary, out bool Skip)
        {
            Skip = false;
            Summary = "";
            string str = ArticleTitle.Substring(ArticleTitle.Length-7,3);
            int num; 
            bool res = int.TryParse(str, out num);
            if (res == false)
            {
              Skip = true;
            } else {
              int num1 = num-1;
              int num2 = num+1;
              ArticleText = "{{Uwagi nad budownictwem w starożytności by Johann Joachim Winckelmann|"+num1.ToString("D3")+"|"+num2.ToString("D3")+"}}\r\n";
              ArticleText = ArticleText + "{{PD-old-100}}\r\n";
              ArticleText = ArticleText + "[[Category:Uwagi nad budownictwem w starożytności by Johann Joachim Winckelmann]]";
            }
            return ArticleText;
        }
        public string ProcessArticle(string ArticleText, string ArticleTitle, int wikiNamespace, out string Summary, out bool Skip)
        {
            Skip = false;
            Summary = "";
            string str = ArticleTitle.Substring(ArticleTitle.Length-7,3);
            int num; 
            bool res = int.TryParse(str, out num);
            if (res == false)
            {
              Skip = false;
            } else {
              int num1 = num-1;
              int num2 = num+1;
              ArticleText = "=={{int:filedesc}}==\r\n{{Русский энциклопедический словарь Березина|volume=4.2|prev="+num1.ToString("D3")+"|next="+num2.ToString("D3")+"}}\r\n\r\n";
              ArticleText = ArticleText + "=={{int:license-header}}==\r\n{{PD-anon-1923}}\r\n\r\n";
              ArticleText = ArticleText + "[[Category:Русский энциклопедический словарь Березина том 4.2]]";
            }
            return ArticleText;
        }

Extract interwiki links and save them to the file[edit]

        public string ProcessArticle(string ArticleText, string ArticleTitle, int wikiNamespace, out string Summary, out bool Skip)
        {
            Skip = false;
            Summary = "test";
            String outStr = "";

            Match m = Regex.Match(ArticleText, @"\[\[en:([^\]]*)\]\]");
            while (m.Success) {
              outStr = outStr + m.Result("$1") + "\r\n";
              m = m.NextMatch();
            }
            if (outStr.Length>0) {
              System.IO.StreamWriter sw = System.IO.File.AppendText("C:/Projects/WikiPliks6.txt");
              sw.WriteLine(outStr);
              sw.Close();
           } 

            return ArticleText;
        }

Extract categories and save them to the file[edit]

        public string ProcessArticle(string ArticleText, string ArticleTitle, int wikiNamespace, out string Summary, out bool Skip)
        {
            Skip = true;
            Summary = "test";
            String outStr = ArticleTitle;
            bool found = false;
 
            Match m = Regex.Match(ArticleText, @"\[\[[Cc]ategory:([^\]\|]*)\]\]");
            while (m.Success) {
              outStr = outStr + m.Result("; $1");
              m = m.NextMatch();
              found = true;
            }
            if (found) {
              outStr = outStr.Replace("\r","");
              outStr = outStr.Replace("\n","");
              System.IO.StreamWriter sw = System.IO.File.AppendText("C:/Projects/WikiPliks11.txt");
              sw.WriteLine(outStr);
              sw.Close();
           } 
 
            return ArticleText;
        }

Populate template fields based on External CSV file[edit]

        public string ProcessArticle(string ArticleText, string ArticleTitle, int wikiNamespace, out string Summary, out bool Skip)
        {
            Skip = false;
            Summary = "test";
            
            string CreatorText = System.IO.File.ReadAllText("C:/Projects/Creators.csv");
 
            Match m1 = Regex.Match(CreatorText, ArticleTitle+@",([^,]*),([^,]*),@");
            Match m2 = Regex.Match(ArticleText, @"Nationality\s*= *");
            if (m1.Success && m2.Success) {
              ArticleText = Regex.Replace(ArticleText, @"Nationality\s*= *", "Nationality       = "+m1.Result("$2"));
            }
 
            return ArticleText;
        }


        public string ProcessArticle(string ArticleText, string ArticleTitle, int wikiNamespace, out string Summary, out bool Skip)
        {
            Skip = false;
            Summary = "test";
            string found = " 0";
            string line = " ";
            
            string CreatorText = System.IO.File.ReadAllText("C:/Projects/Creators.csv",System.Text.Encoding.UTF7  );

            ASCIIEncoding ascii = new ASCIIEncoding();
            byte[] byteArray = System.Text.Encoding.UTF8.GetBytes( ArticleTitle);
            byte[] asciiArray = System.Text.Encoding.Convert(System.Text.Encoding.UTF8, System.Text.Encoding.ASCII, byteArray);
            string name = ascii.GetString(asciiArray);
            byteArray = System.Text.Encoding.UTF8.GetBytes( CreatorText);
            asciiArray = System.Text.Encoding.Convert(System.Text.Encoding.UTF8, System.Text.Encoding.ASCII, byteArray);
            string CreatorText2 = ascii.GetString(asciiArray);
            CreatorText2 = Regex.Replace(CreatorText2,@"\?",";");
            name = Regex.Replace(name,@"\?",";");

            Match m1 = Regex.Match(CreatorText2, name+@",([^,]*),([^,]*),@");
            if (m1.Success) {
              Match m2 = Regex.Match(ArticleText, @"Occupation\s*=[ \t\v\f]*[\r\n]");
              if (m2.Success) {
                ArticleText = Regex.Replace(ArticleText, @"Occupation\s*=[ \t\v\f]*", "Occupation        = "+m1.Result("$1"));
                found = " 1";
              }
              m2 = Regex.Match(ArticleText, @"Nationality\s*=[ \t\v\f]*[\r\n]");
              if (m2.Success) {
                ArticleText = Regex.Replace(ArticleText, @"Nationality\s*=[ \t\v\f]*", "Nationality       = "+m1.Result("$2"));
                found = " 1";
              }
              line = m1.Result("<!-- $1 $2 -->\n");
            }
            string str = line+"<!--" + name + found+"-->\n";

            //str = str+CreatorText2;  

            return ArticleText;
        }

Scrape creator data off from EN Wikipedia articles[edit]

      public string ProcessArticle(string ArticleText, string ArticleTitle, int wikiNamespace, out string Summary, out bool Skip)
      {
          Skip = false;
          Summary = "";
          
          String image="!";      
          Match m  = Regex.Match(ArticleText, @"image\s*=\s*([^\r\n\|]+)");
          if (m.Success) image = m.Result("!$1");

          String birthdate="!";      
          m  = Regex.Match(ArticleText, @"birthdate\s*=\s*([^\r\n]+)");
          if (m.Success) birthdate = m.Result("!$1");

          String deathdate="!";      
          m  = Regex.Match(ArticleText, @"deathdate\s*=\s*([^\r\n]+)");
          if (m.Success) deathdate = m.Result("!$1");

          String birthplace="!";      
          m  = Regex.Match(ArticleText, @"birthplace\s*=\s*([^\r\n]+)");
          if (m.Success) birthplace = m.Result("!$1");

          String deathplace="!";      
          m  = Regex.Match(ArticleText, @"deathplace\s*=\s*([^\r\n]+)");
          if (m.Success) deathplace = m.Result("!$1");

          String birthdate2="!";      
          m  = Regex.Match(ArticleText, @"DATE OF BIRTH\s*=\s*([^\r\n\|]+)");
          if (m.Success) birthdate2 = m.Result("!$1");

          String deathdate2="!";      
          m  = Regex.Match(ArticleText, @"DATE OF DEATH\s*=\s*([^\r\n\|]+)");
          if (m.Success) deathdate2 = m.Result("!$1");

          String birthplace2="!";      
          m  = Regex.Match(ArticleText, @"PLACE OF BIRTH\s*=\s*([^\r\n\|]+)");
          if (m.Success) birthplace2 = m.Result("!$1");

          String deathplace2="!";      
          m  = Regex.Match(ArticleText, @"PLACE OF DEATH\s*=\s*([^\r\n\|]+)");
          if (m.Success) deathplace2 = m.Result("!$1");

          String nationality="!";      
          m  = Regex.Match(ArticleText, @"nationality\s*=\s*([^\r\n]+)");
          if (m.Success) nationality = m.Result("!$1");

          String description="!";      
          m  = Regex.Match(ArticleText, @"SHORT DESCRIPTION\s*=\s*([^\r\n\|]+)");
          if (m.Success) description = m.Result("!$1");

          String alternative="!";      
          m  = Regex.Match(ArticleText, @"ALTERNATIVE NAMES\s*=\s*([^\r\n\|]+)");
          if (m.Success) alternative = m.Result("!$1");

          String field="!";      
          m  = Regex.Match(ArticleText, @"field\s*=\s*([^\r\n]+)");
          if (m.Success) field = m.Result("!$1");

          String sortkey="!";      
          m  = Regex.Match(ArticleText, @"\{\{DEFAULTSORT:([^\}]+)\}\}");
          if (m.Success) sortkey = m.Result("!$1");

          String es="!";      
          m  = Regex.Match(ArticleText, @"\[\[es:([^\]]*)\]\]");
          if (m.Success) es = m.Result("!$1");

          String de="!";      
          m  = Regex.Match(ArticleText, @"\[\[de:([^\]]*)\]\]");
          if (m.Success) de = m.Result("!$1");

          String fr="!";      
          m  = Regex.Match(ArticleText, @"\[\[fr:([^\]]*)\]\]");
          if (m.Success) fr = m.Result("!$1");

          String pl="!";      
          m  = Regex.Match(ArticleText, @"\[\[pl:([^\]]*)\]\]");
          if (m.Success) pl = m.Result("!$1");

          String en="!";      
          m  = Regex.Match(ArticleTitle, @"([^\r\n]*)");
          if (m.Success) en = m.Result("!$1");

          System.IO.StreamWriter sw = System.IO.File.AppendText("C:/Projects/PersonData.txt");
          sw.WriteLine(ArticleTitle + image + birthdate + birthdate2 + deathdate + deathdate2 + 
                birthplace + birthplace2 + deathplace + deathplace2 + nationality+description+alternative+field+sortkey+
                de+es+fr+pl);
          sw.Close();
          return ArticleText;
      }

Scrape creator data off from Category:People by name[edit]

      public string ProcessArticle(string ArticleText, string ArticleTitle, int wikiNamespace, out string Summary, out bool Skip)
      {
          Skip = false;
          Summary = "";
 
          String birthdate="!";      
          Match m  = Regex.Match(ArticleText, @"\[\[[Cc]ategory:(\d\d\d\d) births\]\]");
          if (m.Success) birthdate = m.Result("!$1");
 
          String deathdate="!";      
          m  = Regex.Match(ArticleText, @"\[\[[Cc]ategory:(\d\d\d\d) deaths\]\]");
          if (m.Success) deathdate = m.Result("!$1");
 
          String sortkey="!";      
          m  = Regex.Match(ArticleText, @"\{\{DEFAULTSORT:([^\}]+)\}\}");
          if (m.Success) sortkey = m.Result("!$1");
          String de="!";      
          m  = Regex.Match(ArticleText, @"\[\[de:([^\]]*)\]\]");
          if (m.Success) de = m.Result("!$1");
 
          String en="!";      
          m  = Regex.Match(ArticleText, @"\[\[en:([^\]]*)\]\]");
          if (m.Success) en = m.Result("!$1");
          String str = ArticleTitle + birthdate + deathdate + sortkey + de + en;
          str = str.Replace("\r","");
          str = str.Replace("\n","");
 
          System.IO.StreamWriter sw = System.IO.File.AppendText("C:/Projects/PersonData5.txt");
          sw.WriteLine(str);
          sw.Close();
          return ArticleText;
      }

Format categories in Category:Users by language[edit]

        public string ProcessArticle(string ArticleText, string ArticleTitle, int wikiNamespace, out string Summary, out bool Skip)
        { 
            Skip = false;
            Summary = "";
            Match m = Regex.Match(ArticleTitle, @"User (.*)\-([N012345])");
            String code = "";
            String level = "";
            String lang = "";
            bool ok = true;
            if (m.Success) {
                code  = m.Result("$1");
                level = m.Result("$2");
            } else {
               m = Regex.Match(ArticleTitle, @"User (.*)");
               if (m.Success) {
                 code = m.Result("$1");
                 level = "*";
               } else {
                 ok=false;
               }
            }
            m = Regex.Match(ArticleText, @"language ([^\.]*)");
            if (m.Success) {
                lang = m.Result("$1");
            } else {
                ok=false;
            }
            if (ok) {
              ArticleText = "{{UsersSpeak|" + code + "|" + level + "|" + lang + "|link=}}";
            } else {
              //ArticleText = ArticleText+"{{UsersSpeak|" + code + "|" + level + "|" + lang + "|link=}}";
            }
            return ArticleText;
        }

Add taxon category based on image description[edit]

        public string ProcessArticle(string ArticleText, string ArticleTitle, int wikiNamespace, out string Summary, out bool Skip)
        {
            Skip = true;
            Summary = "";
            Match m = Regex.Match(ArticleText, @"Description\s*=\s*''([^']*)''");
            if (m.Success) {
              Skip = false;
              Summary = m.Result("Add scientific name category: [[Category:$1]]");
              String cat = "[[Category:Photos by Jason Hollinger (uncategorized)]]";
              String str = m.Result("{{subst:#ifexist:Category:$1|[[Category:$1]]|[[Category:Photos by Jason Hollinger (uncategorized)]]}}");
              ArticleText = ArticleText.Replace(cat,str);
            }
            return ArticleText;
        }

Capitalize repeated fields in Pages using duplicate arguments in template calls[edit]

        public string ProcessArticle(string ArticleText, string ArticleTitle, int wikiNamespace, out string Summary, out bool Skip)
        {
            Skip = false;
            Summary = "test";
            String outStr = "";
            String field = "";

            Match m = Regex.Match(ArticleText, @"(\|\s*([\w ]*)\s*=)");
            string[] fields = new string[50];
            for(int i=0; m.Success && i<50; i++) {
              fields[i] = m.Result("$2");
              field     = m.Result("$1");
              m = m.NextMatch();
              for (int j=0; j<i; j++) {
                if (fields[i]==fields[j]) {
                  ArticleText = ArticleText.Replace(field, field.ToUpper());
                }
              }
            }
            return ArticleText;
        }

See Also[edit]