Utilisateur:ZX81-bot/AWB/Modules/Bandeaux

Une page de Wikipédia, l'encyclopédie libre.
using System;
using System.Collections.Generic;
using System.Text;
using System.Text.RegularExpressions;
using WikiFunctions;
 
namespace AutoWikiBrowser
{
    class Module1 : WikiFunctions.Plugin.IModule
    {
// à copier/coller dans le module à partir d'ici

        /*
         * Module AWB pour la maintenance des bandeaux :
         * - pose de bandeaux portail ;
         * - remplacement des modèles multi bandeau obsolètes par {{Multi bandeau}} ;
         * - regroupement des bandeaux ébauches ;
         * - regroupement des bandeaux portail ;
         * - suppression des bandeaux en double ;
         * - suppression du modèle {{Multi bandeau}} vide ou avec un seul bandeau ;
         * - nettoyage divers.
         *
         * Auteur : [[:fr:User:TiChou]]
         * Date création : mai 2007
         * Date révision : 18 août 2007
         */

        string portail = "<bandeau portail à ajouter>";
        string SummaryTemp;
        
        string[] BandeauxUniques;
        int nbBU;
        public string ProcessArticle(string ArticleText, string ArticleTitle, int wikiNamespace, out string Summary, out bool Skip)
        {
            Skip = false;
            Summary = "";

            string ArticleTextOld = ArticleText;
            SummaryTemp = "";

            BandeauxUniques = new string[100];
            nbBU = 0;

            // Remplacement des divers modèles de multi bandeaux par le modèle {{Multi bandeau}}
            ArticleText = Regex.Replace(ArticleText,
                @"\{\{ *(?:(?::? *fr *: *)?(?:Modèle|Template) *: *)?(?:Multi[ _]+bandeaux?|Multi-?bandeau|Multib) *(\|[^\}]*)?\}\}",
                "{{Multi bandeau$1}}",
                RegexOptions.IgnoreCase);
            if (ArticleText != ArticleTextOld)
            {
                Summary += ", rempl. modèle";
                ArticleTextOld = ArticleText;
            }

            // Suppression des modèles multi bandeaux ou des paramètres vides se trouvant à l'intérieur d'un modèle {{Multi bandeau}}
            ArticleText = Regex.Replace(ArticleText,
                @"(?<=\{\{Multi bandeau(?:\|[^\|\}]*)*?)\| *(?:(?::? *fr *: *)?(?:Modèle|Template) *: *)?(?:Multi[ _]+bandeaux?|Multi-?bandeau|Multib|) *(?=(?:\|[^\|\}]*)*\}\})",
                "",
                RegexOptions.IgnoreCase);
            if (ArticleText != ArticleTextOld)
            {
                Summary += ", suppr. modèle à l'intérieur";
                ArticleTextOld = ArticleText;
            }

            // Nettoyage des (multi-)bandeaux et suppression des doublons
            ArticleText = Regex.Replace(ArticleText,
                @"(\{\{(?:Multi bandeau\|)?)((?<=\{\{Multi bandeau\|)[^\}]+|(?<=\{\{) *(?:(?::? *fr *: *)?(?:Modèle|Template) *: *)?(?:Ébauche(?:s?|[ _]+[^\|\}]+)|Portail[ _]+[^\|\}]+))(\}\}(?s:\s*))",
                new MatchEvaluator(NettoyageBandeau),
                RegexOptions.IgnoreCase);
            if (ArticleText != ArticleTextOld)
            {
                Summary += ", net. modèle";
                Summary += SummaryTemp;
                SummaryTemp = "";
                ArticleTextOld = ArticleText;
            }

            // Groupement des bandeaux ébauches dans un unique modèle {{Multi bandeau}}
            ArticleText = Regex.Replace(ArticleText,
                @"(?:\{\{(?:Multi bandeau\|)?((?<=\{\{Multi bandeau\|)(?:[^\}]+\|)?Ébauche[s ][^\}]+|Ébauche(?:s?| [^\|\}]+))\}\}(\s*)){2,}",
                new MatchEvaluator(MultiBandeau),
                RegexOptions.Singleline);

            // Groupement des bandeaux portail dans un unique modèle {{Multi bandeau}}
            ArticleText = Regex.Replace(ArticleText,
                @"(?:\{\{(?:Multi bandeau\|)?((?<=\{\{Multi bandeau\|)(?:[^\}]+\|)?Portail [^\}]+|Portail [^\|\}]+)\}\}(\s*)){2,}",
                new MatchEvaluator(MultiBandeau),
                RegexOptions.Singleline);

            if (ArticleText != ArticleTextOld)
            {
                Summary += ", group. bandeaux";
                ArticleTextOld = ArticleText;
            }

            // Ajout portail
            portail = portail.Trim();
            if (portail != String.Empty)
            {
                portail = Regex.Replace(portail, "_", " ");
                portail = Regex.Replace(portail, " +", " ");
                portail = Regex.Replace(portail, @"^(?:(?::? *fr *: *)?(?:Modèle|Template) *: *)?", "");
                portail = Tools.TurnFirstToUpper(portail);

                if (Array.IndexOf(BandeauxUniques, portail) == -1)
                {
                    if (Regex.IsMatch(ArticleText, @"\{\{(?:Multi bandeau\|(?:[^\}]+\|)?Portail [^\}]+|Portail [^\|\}]+)\}\}"))
                    {
                        ArticleText = Regex.Replace(ArticleText,
                            @"(.*\{\{)(?:Multi bandeau\|((?:[^\}]+\|)?Portail [^\}]+)|(Portail [^\|\}]+))(?=\}\})",
                            "$1Multi bandeau|$2$3|" + portail,
                            RegexOptions.Singleline | RegexOptions.Multiline);
                    }
                    else if (Regex.IsMatch(ArticleText, @"(?:\{\{ *DEFAULTSORT *:[^\}]+\}\}\s*)?\[\[ *Catégorie *:[^\]]+\]\]", RegexOptions.IgnoreCase))
                    {
                        ArticleText = Regex.Replace(ArticleText,
                            @"((?:\{\{ *DEFAULTSORT *:[^\}]+\}\}\s*)?\[\[ *Catégorie *:[^\]]+\]\].*)",
                            "{{" + portail + "}}\n\n$1",
                            RegexOptions.Singleline | RegexOptions.IgnoreCase);
                    }
                    else
                    {
                        Skip = true;
                        return ArticleText;
                    }
                }
                else
                {
                    Skip = true;
                    return ArticleText;
                }
            }
            if (ArticleText != ArticleTextOld)
            {
                Summary += ", ajout bandeau " + portail;
                ArticleTextOld = ArticleText;
            }

            // Suppression des modèles {{Multi bandeau}} vide ou avec un seul bandeau
            ArticleText = Regex.Replace(ArticleText,
                @"\{\{Multi bandeau\|?\}\}\s*|(?<=\{\{)Multi bandeau\|(?=[^\|\}]+\}\})",
                "");
            if (ArticleText != ArticleTextOld)
            {
                Summary += ", suppr. modèle inutile";
                ArticleTextOld = ArticleText;
            }

            // Correction des retours à la ligne entre bandeaux et catégories
            ArticleText = Regex.Replace(ArticleText,
                @"(?<=\{\{(?:Multi bandeau\|[^\}]+|Portail [^\|\}]+)\}\})\s*(?=(?:\{\{ *DEFAULTSORT *:[^\}]+\}\}\s*)?\[\[ *Catégorie *:[^\]]+\]\].*)",
                "\r\n\r\n",
                RegexOptions.Singleline);
            if (ArticleText != ArticleTextOld)
            {
                Summary += ", corr. \\r\\n";
                ArticleTextOld = ArticleText;
            }
            
            ArticleText = Regex.Replace(ArticleText, @"\[\[ *Cat(?:égorie|egory) *: *(?=[^\]]+\]\])", "[[Catégorie:", RegexOptions.IgnoreCase);
            ArticleText = Regex.Replace(ArticleText, @"\[\[Catégorie:(\p{Ll})", new MatchEvaluator(UpFirstChar));
            ArticleText = Regex.Replace(ArticleText, @"(?<=\{\{)(?::? *fr *: *)?(?:Modèle|Template) *: *(?=[^\}]+\}\})", "", RegexOptions.IgnoreCase);

            return ArticleText;
        }

        private string UpFirstChar(Match m)
        {
            return "[[Catégorie:" + m.Groups[1].ToString().ToUpper();
        }

        private string NettoyageBandeau(Match m)
        {
            string bandeau;
            string bandeaux = "";
            foreach (string b in m.Groups[2].Value.Split(new Char[] { '|' }))
            {
                bandeau = b.Trim();
                bandeau = Regex.Replace(bandeau, "_", " ");
                bandeau = Regex.Replace(bandeau, " +", " ");
                bandeau = Regex.Replace(bandeau, @"^(?:(?::? *fr *: *)?(?:Modèle|Template) *: *)?", "");
                bandeau = Tools.TurnFirstToUpper(bandeau);
                if (Regex.IsMatch(bandeau, @"^(?:Ébauche(?:s?| .+)|Portail .+)$", RegexOptions.IgnoreCase))
                {
                    if (Array.IndexOf(BandeauxUniques, bandeau) == -1)
                    {
                        BandeauxUniques[nbBU] = bandeau;
                        nbBU++;
                        bandeaux += bandeau + "|";
                    }
                    else
                    {
                        SummaryTemp += ", suppr. doublon " + bandeau;
                    }
                }
                else
                {
                    bandeaux += bandeau + "|";
                }
            }
            if (bandeaux == String.Empty)
            {
                return String.Empty;
            } else {
                return m.Groups[1].Value + bandeaux.Trim(new Char[] { '|' }) + m.Groups[3].Value;
            }
        }
        private string MultiBandeau(Match m)
        {
            string bandeaux = "";
            foreach (Capture c in m.Groups[1].Captures)
            {
                bandeaux += "|" + c.Value;
            }
            return "{{Multi bandeau" + bandeaux + "}}" + m.Groups[2].Captures[m.Groups[2].Captures.Count-1];
        }


// à copier/coller dans le module jusqu'ici
    }
}