/// <summary> /// Process a "find and replace" /// </summary> /// <param name="findAndReplace">A FindandReplace object</param> /// <param name="substTemplates">A SubstTemplates object</param> /// <param name="replaceSpecial">An MWB ReplaceSpecial object</param> /// <param name="SkipIfNoChange">True if the article should be skipped if no changes are made</param> public void PerformFindAndReplace(FindandReplace findAndReplace, SubstTemplates substTemplates, ReplaceSpecial.ReplaceSpecial replaceSpecial, bool SkipIfNoChange) { if (!findAndReplace.HasReplacements && !replaceSpecial.HasRules && !substTemplates.HasSubstitutions) { return; } string strTemp = mArticleText.Replace("\r\n", "\n"), testText = strTemp, tmpEditSummary = ""; strTemp = findAndReplace.MultipleFindAndReplace(strTemp, mName, ref tmpEditSummary); strTemp = replaceSpecial.ApplyRules(strTemp, mName); strTemp = substTemplates.SubstituteTemplates(strTemp, mName); if (testText == strTemp) { if (SkipIfNoChange) { Trace.AWBSkipped("No Find And Replace Changes"); } else { return; } } else { AWBChangeArticleText("Find and replace applied" + tmpEditSummary, strTemp.Replace("\n", "\r\n"), true); EditSummary += tmpEditSummary; } }
/// <summary> /// Fix header errors /// </summary> /// <param name="parsers"></param> /// <param name="LangCode">The wiki's language code</param> /// <param name="SkipIfNoChange">True if the article should be skipped if no changes are made</param> protected void FixHeaderErrors(Parsers parsers, LangCodeEnum LangCode, bool SkipIfNoChange) { if (LangCode == LangCodeEnum.en) { string strTemp = Parsers.Conversions(mArticleText); strTemp = parsers.FixDates(strTemp); strTemp = Parsers.FixLivingThingsRelatedDates(strTemp); strTemp = Parsers.LivingPeople(strTemp, out noChange); strTemp = Parsers.FixHeadings(strTemp, mName, out noChange); if (mArticleText == strTemp) { if (SkipIfNoChange) { Trace.AWBSkipped("No header errors"); } } else { if (!noChange) { AWBChangeArticleText("Fixed header errors", strTemp, true); } else { AWBChangeArticleText("Fixed minor formatting issues", strTemp, true); if (SkipIfNoChange) { Trace.AWBSkipped("No header errors"); } } } } }
/// <summary> /// Disambiguate /// </summary> /// <returns>True if OK to proceed, false to abort</returns> public bool Disambiguate(string dabLinkText, string[] dabVariantsLines, bool botMode, int Context, bool skipIfNoChange) { bool noChange; Disambiguation.DabForm df = new Disambiguation.DabForm(); string strTemp = df.Disambiguate(mArticleText, mName, dabLinkText, dabVariantsLines, Context, botMode, out noChange); if (df.Abort) { return(false); } if (noChange && skipIfNoChange) { Trace.AWBSkipped("No disambiguation"); } else if (!noChange) { AWBChangeArticleText("Disambiguated " + dabLinkText, strTemp, false); } return(true); }
/// <summary> /// Corrects common formatting errors in dates in external reference citation templates (doesn't link/delink dates) /// </summary> /// <param name="SkipIfNoChange">True if the article should be skipped if no changes are made</param> public void CiteTemplateDates(Parsers parsers, bool SkipIfNoChange) { string strTemp = parsers.CiteTemplateDates(mArticleText, out noChange); if (SkipIfNoChange && noChange) { Trace.AWBSkipped("No Citation template dates fixed"); } else if (!noChange) { AWBChangeArticleText("Citation template dates fixed", strTemp, true); } }
/// <summary> /// Fix link syntax /// </summary> /// <param name="SkipIfNoChange">True if the article should be skipped if no changes are made</param> public void FixLinks(bool SkipIfNoChange) { string strTemp = Parsers.FixLinks(mArticleText, out noChange); if (noChange && SkipIfNoChange) { Trace.AWBSkipped("No bad links"); } else if (!noChange) { AWBChangeArticleText("Fixed links", strTemp, false); } }
/// <summary> /// '''Emboldens''' the first occurence of the article title, if not already bold /// </summary> /// <param name="parsers"></param> /// <param name="SkipIfNoChange">True if the article should be skipped if no changes are made</param> public void EmboldenTitles(Parsers parsers, bool SkipIfNoChange) { string strTemp = parsers.BoldTitle(mArticleText, mName, out noChange); if (SkipIfNoChange && noChange) { Trace.AWBSkipped("No Titles to embolden"); } else if (!noChange) { AWBChangeArticleText("Emboldened titles", strTemp, false); } }
/// <summary> /// Convert HTML characters in the article to Unicode /// </summary> /// <param name="SkipIfNoChange">True if the article should be skipped if no changes are made</param> /// <param name="parsers">An initialised Parsers object</param> public void Unicodify(bool SkipIfNoChange, Parsers parsers) { string strTemp = parsers.Unicodify(mArticleText, out noChange); if (SkipIfNoChange && noChange) { Trace.AWBSkipped("No Unicodification"); } else if (!noChange) { AWBChangeArticleText("Page Unicodified", strTemp, false); } }
/// <summary> /// Add bulletpoints to external links, if necessary /// </summary> /// <param name="SkipIfNoChange">True if the article should be skipped if no changes are made</param> public void BulletExternalLinks(bool SkipIfNoChange) { string strTemp = Parsers.BulletExternalLinks(mArticleText, out noChange); if (SkipIfNoChange && noChange) { Trace.AWBSkipped("No missing bulleted links"); } else if (!noChange) { AWBChangeArticleText("Bulleted external links", strTemp, false); } }
/// <summary> /// Add, remove or replace a specified category /// </summary> /// <param name="option">The action to take</param> /// <param name="parsers">An initialised Parsers object</param> /// <param name="SkipIfNoChange">True if the article should be skipped if no changes are made</param> /// <param name="CategoryText">The category to add or remove; or, when replacing, the name of the old category</param> /// <param name="CategoryText2">The name of the replacement category (recat mode only)</param> public void Categorisation(CategorisationOptions option, Parsers parsers, bool SkipIfNoChange, string CategoryText, string CategoryText2) { bool noChange = false; string strTemp, action = ""; switch (option) { case CategorisationOptions.NoAction: return; case CategorisationOptions.AddCat: if (CategoryText.Length < 1) { return; } strTemp = parsers.AddCategory(CategoryText, mArticleText, mName); action = "Added " + CategoryText; break; case CategorisationOptions.ReCat: if (CategoryText.Length < 1 || CategoryText2.Length < 1) { return; } strTemp = parsers.ReCategoriser(CategoryText, CategoryText2, mArticleText, out noChange); break; case CategorisationOptions.RemoveCat: if (CategoryText.Length < 1) { return; } strTemp = parsers.RemoveCategory(CategoryText, mArticleText, out noChange); action = "Removed " + CategoryText; break; default: throw new ArgumentOutOfRangeException("option"); } if (noChange && SkipIfNoChange) { Trace.AWBSkipped("No Category Changed"); } else if (!noChange) { AWBChangeArticleText(action, strTemp, false); } }
/// <summary> /// Fix spelling mistakes /// </summary> /// <param name="RegexTypos">A RegExTypoFix object</param> /// <param name="SkipIfNoChange">True if the article should be skipped if no changes are made</param> public void PerformTypoFixes(RegExTypoFix RegexTypos, bool SkipIfNoChange) { string strTemp = RegexTypos.PerformTypoFixes(mArticleText, out noChange, out mPluginEditSummary, mName); if (noChange && SkipIfNoChange) { Trace.AWBSkipped("No typo fixes"); } else if (!noChange) { AWBChangeArticleText(mPluginEditSummary, strTemp, false); AppendPluginEditSummary(); } }
/// <summary> /// "Auto tag" (Adds/removes wikify or stub tags if necessary) /// </summary> /// <param name="parsers">An initialised Parsers object</param> /// <param name="SkipIfNoChange">True if the article should be skipped if no changes are made</param> public void AutoTag(Parsers parsers, bool SkipIfNoChange) { bool noChange; string tmpEditSummary = ""; string strTemp = parsers.Tagger(mArticleText, mName, out noChange, ref tmpEditSummary); if (SkipIfNoChange && noChange) { Trace.AWBSkipped("No Tag changed"); } else if (!noChange) { AWBChangeArticleText("Auto tagger changes applied" + tmpEditSummary, strTemp, false); EditSummary += tmpEditSummary; } }
/// <summary> /// Sets Default Sort on Article if Necessary / clean diacritics /// </summary> /// <param name="LangCode">The wiki's language code</param> /// <param name="SkipIfNoChange">True if the article should be skipped if no changes are made</param> public void SetDefaultSort(LangCodeEnum LangCode, bool SkipIfNoChange) { if (LangCode == LangCodeEnum.en) { string strTemp = Parsers.ChangeToDefaultSort(mArticleText, mName, out noChange); if (SkipIfNoChange && noChange) { Trace.AWBSkipped("No DefaultSort Added"); } else if (!noChange) { AWBChangeArticleText("DefaultSort Added/Diacritics cleaned", strTemp, true); } } }
/// <summary> /// Sets Default Sort on Article if Necessary /// </summary> /// <param name="parsers">An initialised Parsers object</param> /// <param name="LangCode">The wiki's language code</param> /// <param name="SkipIfNoChange">True if the article should be skipped if no changes are made</param> public void SetDefaultSort(Parsers parsers, LangCodeEnum LangCode, bool SkipIfNoChange) { if (LangCode == LangCodeEnum.en) { bool noChange; string strTemp = parsers.ChangeToDefaultSort(mArticleText, mName, out noChange); if (SkipIfNoChange && noChange) { Trace.AWBSkipped("No DefaultSort Added"); } else if (!noChange) { this.AWBChangeArticleText("DefaultSort Added", strTemp, true); } } }
/// <summary> /// Remove, replace or comment out a specified image /// </summary> /// <param name="option">The action to take</param> /// <param name="parsers">An initialised Parsers object</param> /// <param name="ImageReplaceText">The text (image name) to look for</param> /// <param name="ImageWithText">Replacement text (if applicable)</param> /// <param name="SkipIfNoChange">True if the article should be skipped if no changes are made</param> public void UpdateImages(ImageReplaceOptions option, Parsers parsers, string ImageReplaceText, string ImageWithText, bool SkipIfNoChange) { bool noChange = true; string strTemp = ""; ImageReplaceText = ImageReplaceText.Trim(); ImageWithText = ImageWithText.Trim(); if (ImageReplaceText.Length > 0) { switch (option) { case ImageReplaceOptions.NoAction: return; case ImageReplaceOptions.Replace: if (ImageWithText.Length > 0) { strTemp = parsers.ReplaceImage(ImageReplaceText, ImageWithText, mArticleText, out noChange); } break; case ImageReplaceOptions.Remove: strTemp = parsers.RemoveImage(ImageReplaceText, mArticleText, false, ImageWithText, out noChange); break; case ImageReplaceOptions.Comment: strTemp = parsers.RemoveImage(ImageReplaceText, mArticleText, true, ImageWithText, out noChange); break; default: throw new ArgumentOutOfRangeException("option"); } } if (noChange && SkipIfNoChange) { Trace.AWBSkipped("No File Changed"); } else if (!noChange) { AWBChangeArticleText("File replacement applied", strTemp, false); } }
/// <summary> /// Performs the general fixes for user talk pages (ie user talk template substitution) /// </summary> /// <param name="removeText"></param> /// <param name="userTalkTemplatesRegex">Regex of user talk templates to substitute</param> /// <param name="SkipIfNoChange"></param> public void PerformUserTalkGeneralFixes(HideText removeText, Regex userTalkTemplatesRegex, bool SkipIfNoChange) { string originalText = ArticleText; HideText(removeText); Variables.Profiler.Profile("HideText"); AWBChangeArticleText("Subst user talk warnings", Parsers.SubstUserTemplates(ArticleText, Name, userTalkTemplatesRegex), true); Variables.Profiler.Profile("SubstUserTemplates"); UnHideText(removeText); Variables.Profiler.Profile("UnHideText"); if (SkipIfNoChange && (originalText == ArticleText)) { Trace.AWBSkipped("No user talk templates subst'd"); } }
public void SendPageToCustomModule(IModule Module) { // TODO: Check this Skips properly if module tells us to. If not, we'll have to set the Skip property directly ProcessArticleEventArgs processArticleEventArgs = this; string strEditSummary = "", strTemp; bool skipArticle; strTemp = Module.ProcessArticle(processArticleEventArgs.ArticleText, processArticleEventArgs.ArticleTitle, NameSpaceKey, out strEditSummary, out skipArticle); if (!skipArticle) { processArticleEventArgs.EditSummary = strEditSummary; processArticleEventArgs.Skip = false; AWBChangeArticleText("Custom module", strTemp, true); AppendPluginEditSummary(); } else { Trace.AWBSkipped("Skipped by custom module"); } }
/// <summary> /// /// </summary> /// <param name="Module"></param> public void SendPageToCustomModule(IModule Module) { ProcessArticleEventArgs processArticleEventArgs = this; string strEditSummary; bool skipArticle; string strTemp = Module.ProcessArticle(processArticleEventArgs.ArticleText, processArticleEventArgs.ArticleTitle, NameSpaceKey, out strEditSummary, out skipArticle); if (!skipArticle) { processArticleEventArgs.EditSummary = strEditSummary; processArticleEventArgs.Skip = false; AWBChangeArticleText("Custom module", strTemp, true); AppendPluginEditSummary(); } else { Trace.AWBSkipped("Skipped by custom module"); } }
/// <summary> /// Adds [[Category:XXXX births]], [[Category:XXXX deaths]], [[Category:Living people]] etc. to articles about people where available, for en-wiki only /// </summary> /// <param name="parsers"></param> /// <param name="skipIfNoChange">True if the article should be skipped if no changes are made</param> public void FixPeopleCategories(Parsers parsers, bool skipIfNoChange) { bool noChange2; string strTemp = parsers.FixPeopleCategories(mArticleText, out noChange); strTemp = Parsers.LivingPeople(strTemp, out noChange2); if (!noChange2) { noChange = false; } if (skipIfNoChange && noChange) { Trace.AWBSkipped("No human category changes"); } else if (!noChange) { AWBChangeArticleText("Human category changes", strTemp, true); } }
/// <summary> /// Process a "find and replace" /// </summary> /// <param name="findAndReplace">A FindandReplace object</param> /// <param name="substTemplates">A SubstTemplates object</param> /// <param name="replaceSpecial">An MWB ReplaceSpecial object</param> /// <param name="SkipIfNoChange">True if the article should be skipped if no changes are made</param> public void PerformFindAndReplace(FindandReplace findAndReplace, SubstTemplates substTemplates, MWB.ReplaceSpecial replaceSpecial, bool SkipIfNoChange) { string strTemp = mArticleText.Replace("\r\n", "\n"), testText = strTemp, tmpEditSummary = ""; strTemp = findAndReplace.MultipleFindAndReplace(strTemp, mName, ref tmpEditSummary); strTemp = replaceSpecial.ApplyRules(strTemp, mName); strTemp = substTemplates.SubstituteTemplates(strTemp, mName); // TODO: Possible bug, this was "articleTitle" not "Name" if (SkipIfNoChange && (testText == strTemp)) // NoChange { Trace.AWBSkipped("No Find And Replace Changes"); } else { AWBChangeArticleText("Find and replace applied" + tmpEditSummary, strTemp.Replace("\n", "\r\n"), false); EditSummary += tmpEditSummary; } }
/// <summary> /// AWB skips the article; passed through to the underlying AWBLogListener object /// </summary> /// <param name="reason">The reason for skipping</param> public void AWBSkip(string reason) { Trace.AWBSkipped(reason); }