/// <summary> /// Fully processes a page, applying all needed changes /// </summary> /// <param name="theArticle">Page to process</param> /// <param name="mainProcess">True if the page is being processed for save as usual, /// otherwise (Re-parse in context menu, prefetch, etc) false</param> private void ProcessPage(ArticleEX theArticle, bool mainProcess) { bool process = true; typoStats = null; #if DEBUG Variables.Profiler.Start("ProcessPage(\"" + theArticle.Name + "\")"); #endif try { if (noParse.Contains(theArticle.Name)) process = false; if (!IgnoreNoBots && !Parsers.CheckNoBots(theArticle.ArticleText, Variables.User.Name)) { theArticle.AWBSkip("Restricted by {{bots}}/{{nobots}}"); return; } Variables.Profiler.Profile("Initial skip checks"); if (cModule.ModuleEnabled && cModule.Module != null) { theArticle.SendPageToCustomModule(cModule.Module); if (theArticle.SkipArticle) return; } Variables.Profiler.Profile("Custom module"); if (externalProgram.ModuleEnabled) { theArticle.SendPageToCustomModule(externalProgram); if (theArticle.SkipArticle) return; } Variables.Profiler.Profile("External Program"); if (Plugin.Items.Count > 0) { foreach (KeyValuePair<string, IAWBPlugin> a in Plugin.Items) { theArticle.SendPageToPlugin(a.Value, this); if (theArticle.SkipArticle) return; } } Variables.Profiler.Profile("Plugins"); // unicodify whole article if (chkUnicodifyWhole.Checked && process) { theArticle.HideMoreText(RemoveText); Variables.Profiler.Profile("HideMoreText"); theArticle.Unicodify(Skip.SkipNoUnicode, parsers); Variables.Profiler.Profile("Unicodify"); theArticle.UnHideMoreText(RemoveText); Variables.Profiler.Profile("UnHideMoreText"); } // find and replace before general fixes if (chkFindandReplace.Checked && !findAndReplace.AfterOtherFixes) { theArticle.PerformFindAndReplace(findAndReplace, substTemplates, replaceSpecial, chkSkipWhenNoFAR.Checked); Variables.Profiler.Profile("F&R"); if (theArticle.SkipArticle) return; } // RegexTypoFix if (chkRegExTypo.Checked && RegexTypos != null && !BotMode && !Tools.IsTalkPage(theArticle.NameSpaceKey)) { theArticle.PerformTypoFixes(RegexTypos, chkSkipIfNoRegexTypo.Checked); Variables.Profiler.Profile("Typos"); typoStats = RegexTypos.GetStatistics(); if (theArticle.SkipArticle) { if (mainProcess) { // update stats only if not called from e.g. 'Re-parse' than could be clicked repeatedly OverallTypoStats.UpdateStats(typoStats, true); UpdateTypoCount(); } return; } } // replace/add/remove categories if (cmboCategorise.SelectedIndex != 0) { theArticle.Categorisation((WikiFunctions.Options.CategorisationOptions) cmboCategorise.SelectedIndex, parsers, chkSkipNoCatChange.Checked, txtNewCategory.Text.Trim(), txtNewCategory2.Text.Trim()); if (theArticle.SkipArticle) return; else if (!chkGeneralFixes.Checked) theArticle.AWBChangeArticleText("Fix categories", Parsers.FixCategories(theArticle.ArticleText), true); } Variables.Profiler.Profile("Categories"); if (theArticle.CanDoGeneralFixes) { // auto tag if (process && chkAutoTagger.Checked) { theArticle.AutoTag(parsers, Skip.SkipNoTag); if (theArticle.SkipArticle) return; } Variables.Profiler.Profile("Auto-tagger"); if (process && chkGeneralFixes.Checked) { theArticle.PerformGeneralFixes(parsers, RemoveText, Skip, replaceReferenceTagsToolStripMenuItem.Checked); } } else if (process && chkGeneralFixes.Checked && theArticle.NameSpaceKey == 3) { if (!userTalkWarningsLoaded) { LoadUserTalkWarnings(); Variables.Profiler.Profile("loadUserTalkWarnings"); } theArticle.PerformUserTalkGeneralFixes(RemoveText, userTalkTemplatesRegex, Skip.SkipNoUserTalkTemplatesSubstd); } // find and replace after general fixes if (chkFindandReplace.Checked && findAndReplace.AfterOtherFixes) { theArticle.PerformFindAndReplace(findAndReplace, substTemplates, replaceSpecial, chkSkipWhenNoFAR.Checked); Variables.Profiler.Profile("F&R (2nd)"); if (theArticle.SkipArticle) return; } // append/prepend text if (chkAppend.Checked) { // customized number of newlines String newlines = ""; for (int i = 0; i < (int)udNewlineChars.Value; i++) newlines += "\r\n"; if (rdoAppend.Checked) theArticle.AWBChangeArticleText("Appended your message", theArticle.ArticleText + newlines + Tools.ApplyKeyWords(theArticle.Name, txtAppendMessage.Text), false); else theArticle.AWBChangeArticleText("Prepended your message", Tools.ApplyKeyWords(theArticle.Name, txtAppendMessage.Text) + newlines + theArticle.ArticleText, false); } // replace/remove/comment out images if (cmboImages.SelectedIndex != 0) { theArticle.UpdateImages((WikiFunctions.Options.ImageReplaceOptions)cmboImages.SelectedIndex, parsers, txtImageReplace.Text, txtImageWith.Text, chkSkipNoImgChange.Checked); if (theArticle.SkipArticle) return; } Variables.Profiler.Profile("Images"); // disambiguation if (chkEnableDab.Checked && txtDabLink.Text.Trim().Length > 0 && txtDabVariants.Text.Trim().Length > 0) { if (theArticle.Disambiguate(txtDabLink.Text.Trim(), txtDabVariants.Lines, BotMode, (int)udContextChars.Value, chkSkipNoDab.Checked)) { if (theArticle.SkipArticle) return; } else { Abort = true; Stop(); return; } } } catch (Exception ex) { ErrorHandler.Handle(ex); theArticle.Trace.AWBSkipped("Exception:" + ex.Message); } finally { Variables.Profiler.Flush(); } }