Thành viên:AlphamaBot/Code sửa lỗi chung

Bách khoa toàn thư mở Wikipedia
        WikiFunctions.Parse.Parsers parsers = new WikiFunctions.Parse.Parsers();
        WikiFunctions.Parse.HideText removeText = new WikiFunctions.Parse.HideText(false, true, false);
        WikiFunctions.Parse.HideText HiderHideExtLinksImages = new WikiFunctions.Parse.HideText(true, true, true);

        WikiFunctions.Parse.HideText HiderHideExtLinksImagesUnhideMeta = new WikiFunctions.Parse.HideText(true, false, true);

        /// <summary>
        /// Sửa lỗi chung của AWB
        /// </summary>
        /// <param name="ArticleText"></param>
        /// <param name="ArticleTitle"></param>
        /// <param name="wikiNamespace"></param>
        /// <param name="Summary"></param>
        /// <param name="Skip"></param>
        /// <returns></returns>
        public string ProcessArticle(string ArticleText, string ArticleTitle, int wikiNamespace, out string Summary, out bool Skip)
        {
            Skip = false;
            Summary = "";

            Article a = new Article(ArticleTitle, ArticleText);

            string zeroth = WikiRegexes.ZerothSection.Match(a.ArticleText).Value;
            bool CircaLink = WikiRegexes.CircaLinkTemplate.IsMatch(a.ArticleText), Floruit = (!zeroth.Contains(@"[[floruit|fl.]]") && WikiRegexes.UnlinkedFloruit.IsMatch(zeroth));

            /*a.HideMoreText(HiderHideExtLinksImages);

            // The two slashes below are inserted to disable the insertion of non-breaking spaces HTML markup (sample) 
            // a.AWBChangeArticleText("Fix non-breaking spaces", parsers.FixNonBreakingSpaces(a.ArticleText), true);

            a.AWBChangeArticleText("Mdashes", parsers.Mdashes(a.ArticleText, ArticleTitle), true);

            a.AWBChangeArticleText("Fix Date Ordinals/Of", parsers.FixDateOrdinalsAndOf(a.ArticleText, ArticleTitle), true, true);


            a.AWBChangeArticleText("FixBrParagraphs", parsers.FixBrParagraphs(a.ArticleText).Trim(), true);

            if (!Tools.IsRedirect(a.ArticleText))
            {
                a.AWBChangeArticleText("Fix dates 1", parsers.FixDatesB(a.ArticleText, CircaLink, Floruit).Trim(), true);
            }

            a.UnHideMoreText(HiderHideExtLinksImages);

            if (!Tools.IsRedirect(a.ArticleText))
            {
                // FixDates does its own hiding
                a.AWBChangeArticleText("Fix dates 2", parsers.FixDatesA(a.ArticleText).Trim(), true);
            }

            a.HideText(removeText);

            if (Tools.IsRedirect(a.ArticleText))
            {
                a.AWBChangeArticleText("Redirect tagger", WikiFunctions.Parse.Parsers.RedirectTagger(a.ArticleText, ArticleTitle), true);

                a.AWBChangeArticleText("Fix syntax redirects", WikiFunctions.Parse.Parsers.FixSyntaxRedirects(a.ArticleText), true);
            }
            else
            {
                a.AWBChangeArticleText("Template redirects", WikiFunctions.Parse.Parsers.TemplateRedirects(a.ArticleText, WikiRegexes.TemplateRedirects), true);

                a.AWBChangeArticleText("Fixes for {{Multiple issues}}", parsers.MultipleIssues(a.ArticleText), true);

                a.AWBChangeArticleText("Fix whitespace in links", WikiFunctions.Parse.Parsers.FixLinkWhitespace(a.ArticleText, ArticleTitle), true);

                a.AWBChangeArticleText("Fix syntax", WikiFunctions.Parse.Parsers.FixSyntax(a.ArticleText), true, true);

                a.AWBChangeArticleText("Rename Template Parameters", WikiFunctions.Parse.Parsers.RenameTemplateParameters(a.ArticleText, WikiRegexes.RenamedTemplateParameters), true);

                a.EmboldenTitles(parsers, false);

                a.AWBChangeArticleText("Conversions", WikiFunctions.Parse.Parsers.Conversions(a.ArticleText), true);
                a.AWBChangeArticleText("FixLivingThingsRelatedDates", WikiFunctions.Parse.Parsers.FixLivingThingsRelatedDates(a.ArticleText), true);
                a.AWBChangeArticleText("FixHeadings", WikiFunctions.Parse.Parsers.FixHeadings(a.ArticleText, ArticleTitle), true);

                a.FixPeopleCategories(parsers, false);

                a.SetDefaultSort(Variables.LangCode, false, false);

                a.AWBChangeArticleText("Fix categories", WikiFunctions.Parse.Parsers.FixCategories(a.ArticleText), true);

                a.AWBChangeArticleText("Fix images", WikiFunctions.Parse.Parsers.FixImages(a.ArticleText), true);

                a.BulletExternalLinks(false);

                a.CiteTemplateDates(parsers, false);

                a.AWBChangeArticleText("Fix citation templates", WikiFunctions.Parse.Parsers.FixCitationTemplates(a.ArticleText), true, true);

                a.AWBChangeArticleText("Fix temperatures", WikiFunctions.Parse.Parsers.FixTemperatures(a.ArticleText), true);

                a.AWBChangeArticleText("Fix main article", WikiFunctions.Parse.Parsers.FixMainArticle(a.ArticleText), true);

                if (a.IsMissingReferencesDisplay && !Variables.LangCode.Equals("de"))
                    a.AWBChangeArticleText("Fix reference tags", WikiFunctions.Parse.Parsers.FixReferenceListTags(a.ArticleText), true);

                a.AWBChangeArticleText("Fix empty links and templates", WikiFunctions.Parse.Parsers.FixEmptyLinksAndTemplates(a.ArticleText), true);

                a.AWBChangeArticleText("Fix empty references", WikiFunctions.Parse.Parsers.SimplifyReferenceTags(a.ArticleText), true);

                a.AWBChangeArticleText("DuplicateUnnamedReferences", WikiFunctions.Parse.Parsers.DuplicateUnnamedReferences(a.ArticleText), true);

                a.AWBChangeArticleText("DuplicateNamedReferences", WikiFunctions.Parse.Parsers.DuplicateNamedReferences(a.ArticleText), true);

                a.AWBChangeArticleText("SameRefDifferentName", WikiFunctions.Parse.Parsers.SameRefDifferentName(a.ArticleText), true);

                a.AWBChangeArticleText("Refs after punctuation", WikiFunctions.Parse.Parsers.RefsAfterPunctuation(a.ArticleText), true);

                a.AWBChangeArticleText("ReorderReferences", WikiFunctions.Parse.Parsers.ReorderReferences(a.ArticleText), true);

                a.AWBChangeArticleText("FixReferenceTags", WikiFunctions.Parse.Parsers.FixReferenceTags(a.ArticleText), true);

                //Module cho tiếng Anh
                //a.AWBChangeArticleText("Add missing {{reflist}}", WikiFunctions.Parse.Parsers.AddMissingReflist(a.ArticleText), true, true);

                //a.AWBChangeArticleText("PersonData", WikiFunctions.Parse.Parsers.PersonData(a.ArticleText, ArticleTitle), true);

                //int bracketLength;
                //string place = String.Empty;

                //if (WikiFunctions.Parse.Parsers.UnbalancedBrackets(a.ArticleText, out bracketLength) >= 0)
                //{
                //    place = a.ArticleText.Substring(bracketLength - 10, bracketLength + 10);
                //    a.AWBChangeArticleText("UnbalancedBrackets","{{thế:Mất cân bằng thẻ|" + place + "}}" + a.ArticleText, true);
                //}

             * 

                a.FixLinks(false);

                a.AWBChangeArticleText("Simplify links", WikiFunctions.Parse.Parsers.SimplifyLinks(a.ArticleText), true);
            }

            a.UnHideText(removeText);
            */

            //a.AWBChangeArticleText("Sort meta data", parsers.SortMetaData(a.ArticleText, ArticleTitle), true);

            a.AWBChangeArticleText("ViWikiFixes", ViWikiFixes(a.ArticleText, ArticleTitle, wikiNamespace), true);

            //a.HideText(HiderHideExtLinksImagesUnhideMeta);

            //a.AWBChangeArticleText("Sửa ngày giờ", TranslateDateTime(a.ArticleText), true);

            //a.UnHideText(HiderHideExtLinksImagesUnhideMeta);

            return a.ArticleText;
        }

        /// <summary>
        /// Sửa lỗi chung cho tiếng Việt
        /// </summary>
        /// <param name="ArticleText"></param>
        /// <param name="ArticleTitle"></param>
        /// <param name="wikiNamespace"></param>
        /// <returns></returns>
        public string ViWikiFixes(string ArticleText, string ArticleTitle, int wikiNamespace)
        {
            //cấu hình các phương thức để chạy bot, dùng 2 dấu gạch chéo để che đi các phương thức không cần chạy
            string originVersion = ArticleText;

            // Choose main & category namespaces only
            if (wikiNamespace != 0 && wikiNamespace != 14)
            {
                return ArticleText;
            }


            ArticleText = TranslateBirthsDeathsCategory(ArticleText); // chạy lần 1

            ArticleText = TranslateDateTime(ArticleText); // dịch ngày giờ sang tiếng Việt

            ArticleText = TranslateCommon(ArticleText); // chạy lỗi chung (đa số sửa lỗi thông thường ở đây)

            ArticleText = PunctuationFixes(ArticleText, ArticleTitle); // sửa khoảng trắng trước dấu câu

            ArticleText = TranslateBirthsDeathsCategory(ArticleText); // chạy lần 2 để khỏi bị sót

            ArticleText = RemoveEnWikiInternalLink(ArticleText); // bỏ các liên kết với tiếng Anh (do Content Translation gây ra)

            // ArticleText = SetStub(ArticleText); // đặt bản mẫu sơ khai, tạm che

            ArticleText = SetReference(ArticleText, wikiNamespace); // đặt mục "Tham khảo" nếu bài chưa có

            return ArticleText;
        }

        /// <summary>
        /// Loại bỏ liên kết trong từ tiếng Anh
        /// </summary>
        /// <param name="ArticleText"></param>
        /// <returns></returns>
        public string RemoveEnWikiInternalLink(string ArticleText)
        {

            ArticleText = Regex.Replace(ArticleText, @"\[\[:en:", "[[");

            return ArticleText;
        }

        /// <summary>
        /// Dịch định dạng ngày giờ từ tiếng Anh sang tiếng Việt
        /// </summary>
        /// <param name="ArticleText"></param>
        /// <returns></returns>
        public string TranslateDateTime(string ArticleText)
        {

            if (ArticleText.Contains("xếp hạng đĩa đơn") || ArticleText.Contains("Xếp hạng đĩa đơn") || ArticleText.Contains("Singlechart") || ArticleText.Contains("singlechart")) return ArticleText;



            string a = "";
            string b = "";
            string c = "";
            string result = "";
            DateTime dt = new DateTime();
            string convertDate = ArticleText;
            string convertDatetemp = ArticleText;


            int count = 0;

            while (true)
            {
                if (count >= 100) break;
                count++;

                Match mdatetime = Regex.Match(convertDate, @"([Jj]anuary|[Ff]ebruary|[Mm]arch|[Aa]pril|[Mm]ay|[Jj]une|[Jj]uly|[Aa]ugust|[Ss]eptember|[Oo]ctober|[Nn]ovember|[Dd]ecember)\s{1}\d+,\s{1}\d{4}");

                if (mdatetime.Success)
                {

                    Match mfile = Regex.Match(convertDate.Substring(mdatetime.Index), @".*\.(jpg|JPG|jpeg|JPEG|gif|ogg|OGG|GIF|flac|FLAC|svg|SVG)");
                    if (mfile.Success && mfile.Value.Contains(mdatetime.Value) == true)
                    {
                        convertDate = convertDate.Substring(mfile.Index + mfile.Value.Length);
                        convertDatetemp = convertDate;
                        continue;
                    }
                    else
                    {

                        try
                        {
                            dt = Convert.ToDateTime(mdatetime.Value);
                            a = dt.Month.ToString();
                            b = dt.Day.ToString();
                            c = dt.Year.ToString();
                            result = "ngày " + b + " tháng " + a + " năm " + c;
                            convertDate = convertDate.Replace(mdatetime.Value, result);
                            ArticleText = ArticleText.Replace(convertDatetemp, convertDate);
                            convertDatetemp = convertDate;


                        }
                        catch
                        {
                            break;
                        }

                    }
                }
                else break;

            }

            count = 0;
            while (true)
            {
                if (count >= 100) break;
                count++;

                Match mdatetime = Regex.Match(convertDate, @"\d+\s{1}([Jj]anuary|[Ff]ebruary|[Mm]arch|[Aa]pril|[Mm]ay|[Jj]une|[Jj]uly|[Aa]ugust|[Ss]eptember|[Oo]ctober|[Nn]ovember|[Dd]ecember)\s{1}\d{4}");

                if (mdatetime.Success)
                {

                    Match mfile = Regex.Match(convertDate.Substring(mdatetime.Index), @".*\.(jpg|JPG|jpeg|JPEG|gif|ogg|OGG|GIF|flac|FLAC|svg|SVG)");
                    if (mfile.Success && mfile.Value.Contains(mdatetime.Value) == true)
                    {
                        convertDate = convertDate.Substring(mfile.Index + mfile.Value.Length);
                        convertDatetemp = convertDate;
                        continue;
                    }
                    else
                    {

                        try
                        {
                            dt = Convert.ToDateTime(mdatetime.Value);
                            a = dt.Month.ToString();
                            b = dt.Day.ToString();
                            c = dt.Year.ToString();
                            result = "ngày " + b + " tháng " + a + " năm " + c;
                            convertDate = convertDate.Replace(mdatetime.Value, result);
                            ArticleText = ArticleText.Replace(convertDatetemp, convertDate);
                            convertDatetemp = convertDate;
                        }
                        catch
                        {
                            break;
                        }

                    }

                }
                else break;

            }

            count = 0;

            while (true)
            {
                if (count >= 100) break;
                count++;

                Match mdatetime = Regex.Match(convertDate, @"([Jj]anuary|[Ff]ebruary|[Mm]arch|[Aa]pril|[Mm]ay|[Jj]une|[Jj]uly|[Aa]ugust|[Ss]eptember|[Oo]ctober|[Nn]ovember|[Dd]ecember)\s{1}\d+\s{1}\d{4}");
                if (mdatetime.Success)
                {

                    Match mfile = Regex.Match(convertDate.Substring(mdatetime.Index), @".*\.(jpg|JPG|jpeg|JPEG|gif|ogg|OGG|GIF|flac|FLAC|svg|SVG)");
                    if (mfile.Success && mfile.Value.Contains(mdatetime.Value) == true)
                    {
                        convertDate = convertDate.Substring(mfile.Index + mfile.Value.Length);
                        convertDatetemp = convertDate;
                        continue;
                    }
                    else
                    {
                        try
                        {

                            dt = Convert.ToDateTime(char.ToUpper(mdatetime.Value[0]) + mdatetime.Value.Substring(1));
                            a = dt.Month.ToString();
                            b = dt.Day.ToString();
                            c = dt.Year.ToString();
                            result = "ngày " + b + " tháng " + a + " năm " + c;
                            convertDate = convertDate.Replace(mdatetime.Value, result);
                            ArticleText = ArticleText.Replace(convertDatetemp, convertDate);
                            convertDatetemp = convertDate;

                        }
                        catch
                        {
                            break;
                        }

                    }
                }
                else break;
            }

            //Fix lỗi ngày tháng "Kiểm tra giá trị ngày tháng"
            while (true)
            {
                if (count >= 100) break;
                count++;


                Match mdatetime = Regex.Match(convertDate, @"(access-date|date)\s*=\s*\d{4}\s*-\s*\d+\s*-\s*\d+\s*(\||})");
                if (mdatetime.Success)
                {

                    Match mfile = Regex.Match(convertDate.Substring(mdatetime.Index), @".*\.(jpg|JPG|jpeg|JPEG|gif|ogg|OGG|GIF|flac|FLAC|svg|SVG)");
                    if (mfile.Success && mfile.Value.Contains(mdatetime.Value) == true)
                    {
                        convertDate = convertDate.Substring(mfile.Index + mfile.Value.Length);
                        convertDatetemp = convertDate;
                        continue;
                    }
                    else
                    {
                        try
                        {

                            //int i = mdatetime.Value.IndexOf('=');
                            //int j = mdatetime.Value.IndexOf('|');
                            string temp = mdatetime.Value.Substring(mdatetime.Value.IndexOf('=') + 1).Trim();
                            if (mdatetime.Value.Contains("|"))
                            {
                                temp = temp.Substring(0, temp.IndexOf('|')).Trim();
                            }
                            else if (mdatetime.Value.Contains("}"))
                            {
                                temp = temp.Substring(0, temp.IndexOf('}')).Trim();
                            }

                            dt = Convert.ToDateTime(temp);
                            a = dt.Month.ToString();
                            b = dt.Day.ToString();
                            c = dt.Year.ToString();

                            if (mdatetime.Value.Contains("access-date"))
                            {
                                result = "access-date = ngày " + b + " tháng " + a + " năm " + c;
                            }
                            else
                            {
                                result = "date = ngày " + b + " tháng " + a + " năm " + c;
                            }

                            if (mdatetime.Value.Contains("}"))
                            {
                                result += "}";
                            }
                            else result += " |";

                            convertDate = convertDate.Replace(mdatetime.Value, result);
                            ArticleText = ArticleText.Replace(convertDatetemp, convertDate);
                            convertDatetemp = convertDate;

                        }
                        catch (Exception ex)
                        {
                            string s = ex.Message;
                            break;
                        }

                    }
                }
                else break;
            }

            while (true)
            {
                if (count >= 100) break;
                count++;

                Match mdatetime = Regex.Match(convertDate, @"(access-date|date)\s*=\s*\d+\s*-\s*\d+\s*-\s*\d{4}\s*(\||})");
                if (mdatetime.Success)
                {

                    Match mfile = Regex.Match(convertDate.Substring(mdatetime.Index), @".*\.(jpg|JPG|jpeg|JPEG|gif|ogg|OGG|GIF|flac|FLAC|svg|SVG)");
                    if (mfile.Success && mfile.Value.Contains(mdatetime.Value) == true)
                    {
                        convertDate = convertDate.Substring(mfile.Index + mfile.Value.Length);
                        convertDatetemp = convertDate;
                        continue;
                    }
                    else
                    {
                        try
                        {
                            string temp = mdatetime.Value.Substring(mdatetime.Value.IndexOf('=') + 1).Trim();
                            if (mdatetime.Value.Contains("|"))
                            {
                                temp = temp.Substring(0, temp.IndexOf('|')).Trim();
                            }
                            else if (mdatetime.Value.Contains("}"))
                            {
                                temp = temp.Substring(0, temp.IndexOf('}')).Trim();
                            }

                            string[] s = temp.Split('-');
                            dt = Convert.ToDateTime(s[2] + "-" + s[1] + "-" + s[0]);

                            a = dt.Month.ToString();
                            b = dt.Day.ToString();
                            c = dt.Year.ToString();

                            if (mdatetime.Value.Contains("access-date"))
                            {
                                result = "access-date = ngày " + b + " tháng " + a + " năm " + c;
                            }
                            else
                            {
                                result = "date = ngày " + b + " tháng " + a + " năm " + c;
                            }

                            if (mdatetime.Value.Contains("}"))
                            {
                                result += "}";
                            }
                            else result += " |";

                            convertDate = convertDate.Replace(mdatetime.Value, result);
                            ArticleText = ArticleText.Replace(convertDatetemp, convertDate);
                            convertDatetemp = convertDate;

                        }
                        catch
                        {
                            break;
                        }

                    }
                }
                else break;
            }

            #region Fix lỗi 2ngày 2 tháng 4 năm 2012
            while (true)
            {
                if (count >= 100) break;
                count++;

                Match mdatetime = Regex.Match(convertDate, @"\d+[Nn]gày\s{1}\d+\s{1}tháng");
                if (mdatetime.Success)
                {

                    Match mfile = Regex.Match(convertDate.Substring(mdatetime.Index), @".*\.(jpg|JPG|jpeg|JPEG|gif|ogg|OGG|GIF|flac|FLAC|svg|SVG)");
                    if (mfile.Success && mfile.Value.Contains(mdatetime.Value) == true)
                    {
                        convertDate = convertDate.Substring(mfile.Index + mfile.Value.Length);
                        convertDatetemp = convertDate;
                        continue;
                    }
                    else
                    {
                        try
                        {

                            //dt = Convert.ToDateTime(char.ToUpper(mdatetime.Value[0]) + mdatetime.Value.Substring(1));

                            b = mdatetime.Value.Substring(0, 1) + mdatetime.Value.Substring(mdatetime.Value.IndexOf("ngày ") + 5, 1);

                            result = "ngày " + b + " tháng";
                            convertDate = convertDate.Replace(mdatetime.Value, result);

                            ArticleText = ArticleText.Replace(convertDatetemp, convertDate);
                            convertDatetemp = convertDate;



                        }
                        catch
                        {
                            break;
                        }

                    }
                }
                else break;
            }
            #endregion
            return ArticleText;

        }

        /// <summary>
        /// Dịch tiếng Anh sang tiếng Việt các cụm từ phổ biến
        /// </summary>
        /// <param name="ArticleText"></param>
        /// <returns></returns>
        public string TranslateCommon(string ArticleText)
        {
            ArticleText = Regex.Replace(ArticleText, @"\{\{\s*[Tt]ham\s*_\s*[Kk]hảo", "{{tham khảo");
            ArticleText = Regex.Replace(ArticleText, @"\[\[[Cc]ategory\s*:", "[[Thể loại:");
            ArticleText = Regex.Replace(ArticleText, @"\{\{[Cc]ite book", "{{chú thích sách");
            ArticleText = Regex.Replace(ArticleText, @"\{\{[Cc]ite web", "{{chú thích web");
            ArticleText = Regex.Replace(ArticleText, @"\{\{[Cc]ite news", "{{chú thích báo");
            ArticleText = Regex.Replace(ArticleText, @"\{\{[Cc]ite journal", "{{chú thích tạp chí");
            ArticleText = Regex.Replace(ArticleText, @"\{\{[Cc]ite iucn", "{{chú thích IUCN");
            ArticleText = Regex.Replace(ArticleText, @"\{\{[Cc]ite doi", "{{chú thích DOI");
            ArticleText = Regex.Replace(ArticleText, @"\{\{[Cc]ite tweet", "{{chú thích tweet");
            ArticleText = Regex.Replace(ArticleText, @"\{\{[Rr]eflist", "{{tham khảo");
            ArticleText = Regex.Replace(ArticleText, @"\<[Rr]eferences\s*\/\>", "{{tham khảo}}");
            ArticleText = Regex.Replace(ArticleText, @"\[\[[Ff]ile\s*:", "[[Tập tin:");
            ArticleText = Regex.Replace(ArticleText, @"\[\[[Ii]mage\s*:", "[[Hình:");
            ArticleText = Regex.Replace(ArticleText, @"\{\{[Tt]axobox", "{{Bảng phân loại");
            ArticleText = Regex.Replace(ArticleText, @"\{\{[Cc]ommonscat-inline", "{{Thể loại Commons nội dòng");
            ArticleText = Regex.Replace(ArticleText, @"\{\{[Cc]ommons category-inline", "{{Thể loại Commons nội dòng");
            ArticleText = Regex.Replace(ArticleText, @"\{\{[Ww]ikispecies-inline", "{{Wikispecies nội dòng");
            ArticleText = Regex.Replace(ArticleText, @"\{\{[Cc]ommons category", "{{Thể loại Commons");
            ArticleText = Regex.Replace(ArticleText, @"\{\{[Cc]ommons\s*cat", "{{Thể loại Commons");
            //ArticleText = ArticleText.Replace("\n ", "\n");

            ArticleText = Regex.Replace(ArticleText, @"==\s*[Ee]xternal\s*links\s*==", "== Liên kết ngoài ==");
            ArticleText = Regex.Replace(ArticleText, @"==\s*[Rr]eferences\s*==", "== Tham khảo ==");
            ArticleText = Regex.Replace(ArticleText, @"==\s*[Ss]ee\s*also\s*==", "== Xem thêm ==");
            ArticleText = Regex.Replace(ArticleText, @"==\s*[Ff]urther\s*reading\s*==", "== Đọc thêm ==");
            ArticleText = Regex.Replace(ArticleText, @"==\s*Notes\s*==", "== Ghi chú ==");
            ArticleText = Regex.Replace(ArticleText, @"accessdate\s*=", "access-date =");

            // lặp 2 lần Thể loại: do công cụ Content Translation gây ra
            ArticleText = Regex.Replace(ArticleText, @"\[\[\s*Thể\s*loại\s*:\s*Category\s*:", "[[Thể loại:");
            ArticleText = Regex.Replace(ArticleText, @"\[\[\s*Thể\s*loại\s*:\s*Thể\s*loại\s*:", "[[Thể loại:");

            ArticleText = ArticleText.Replace(". Retrieved on", ". Truy cập");
            ArticleText = ArticleText.Replace(". Retrieved", ". Truy cập");
            ArticleText = ArticleText.Replace(". Accessed", ". Truy cập");
            ArticleText = ArticleText.Replace(":Living people]]", ":Nhân vật còn sống]]");

            ArticleText = Regex.Replace(ArticleText, @"\|\s*trans_title\s*=", "|trans-title=");
            ArticleText = Regex.Replace(ArticleText, @"\|\s*trans_chapter\s*=", "|trans-chapter=");
            ArticleText = Regex.Replace(ArticleText, @"\|\s*dead-url\s*=\s*yes", "|url-status=dead");
            ArticleText = Regex.Replace(ArticleText, @"\|\s*dead-url\s*=\s*no", "|url-status=live");
            ArticleText = Regex.Replace(ArticleText, @"\|\s*dead-url\s*=", "|url-status=");
            ArticleText = Regex.Replace(ArticleText, @"\|\s*subscription\s*=\s*yes", "|url-access=subscription");
            ArticleText = Regex.Replace(ArticleText, @"\|\s*registration\s*=\s*yes", "|url-access=registration");

            // Bỏ tham số coauthor trống (lỗi gây ra ở bản mẫu CS1)
            ArticleText = Regex.Replace(ArticleText, @"\|\s*coauthor\s*=\s*\|", "|");
            ArticleText = Regex.Replace(ArticleText, @"\|\s*coauthors\s*=\s*\|", "|");

       

            // Bỏ tham số |df= thì cần thời gian test

            //ArticleText = ArticleText.Replace("&nbsp;", " ");

            ////Tạm thời
            //if (ArticleText.Contains("{{Taxobox") || ArticleText.Contains("{{taxobox"))
            //{
            //    ArticleText = ArticleText.Replace("{{tham khảo}}", "");
            //    ArticleText = ArticleText.Replace("{{tham khảo|2}}", "");
            //    ArticleText = ArticleText.Replace("{{Tham khảo}}", "");
            //    ArticleText = ArticleText.Replace("{{Tham khảo|2}}", "");
            //}


            return ArticleText;
        }

        /// <summary>
        /// Sửa lỗi khoảng trắng trước, sau dấu câu
        /// </summary>
        /// <param name="ArticleText"></param>
        /// <param name="ArticleTitle"></param>
        /// <returns></returns>
        public string PunctuationFixes(string ArticleText, string ArticleTitle)
        {
            #region Punctuation

            string convertPunctuation = ArticleText;
            string convertPunctuationTemp = ArticleText;

            //Exclude internet domain articles
            Match domainname = Regex.Match(ArticleTitle, @"\.\w{2}");

            if (!ArticleText.Contains("Tên miền") && !domainname.Success)
            {


                int count = 0;
                // ArticleText = ArticleText + "_________";
                while (true)
                {
                    if (count >= 100) break;
                    count++;

                    Match punctuation = Regex.Match(convertPunctuation, @"\w{1}\s{1,2}[.,;:)]");
                    //[\p{P}-[{}(*-]]

                    if (punctuation.Success)
                    {
                        // Tạm bỏ ;: vì lỗi đầu dòng
                        Match error = Regex.Match(punctuation.Value, @"\w{1}\s{1,2}\n[.,;:)]");

                        if (error.Success)
                        {
                            convertPunctuation = convertPunctuation.Substring(error.Index + error.Value.Length);
                            convertPunctuationTemp = convertPunctuation;
                            continue;
                        }

                        Match mfile = Regex.Match(convertPunctuation.Substring(punctuation.Index), @".*\.(jpg|JPG|jpeg|JPEG|gif|ogg|OGG|GIF|flac|FLAC|svg|SVG)");
                        if (mfile.Success && mfile.Value.Contains(punctuation.Value) == true)
                        {
                            convertPunctuation = convertPunctuation.Substring(mfile.Index + mfile.Value.Length);
                            convertPunctuationTemp = convertPunctuation;
                            continue;
                        }
                        else
                        {
                            try
                            {

                                convertPunctuation = convertPunctuation.Replace(punctuation.Value, punctuation.Value.Substring(0, punctuation.Value.Length - 2) + punctuation.Value.Substring(punctuation.Value.Length - 1, 1));
                                ArticleText = ArticleText.Replace(convertPunctuationTemp, convertPunctuation);
                                convertPunctuationTemp = convertPunctuation;

                                //ArticleText = "_______: " + punctuation.Value;



                            }
                            catch
                            {

                                break;
                            }


                        }

                    }
                    else break;

                }
                convertPunctuation = ArticleText;
                convertPunctuationTemp = ArticleText;
                count = 0;
                while (true)
                {
                    if (count >= 100) break;
                    count++;

                    Match punctuation = Regex.Match(convertPunctuation, @"[(]\s{1,2}\w{1}");
                    //[\p{P}-[{}).,:;_*]]
                    if (punctuation.Success)
                    {

                        Match mfile = Regex.Match(convertPunctuation.Substring(punctuation.Index), @".*\.(jpg|JPG|jpeg|JPEG|gif|ogg|OGG|GIF|flac|FLAC|svg|SVG|svg|SVG)");
                        if (mfile.Success && mfile.Value.Contains(punctuation.Value) == true)
                        {
                            convertPunctuation = convertPunctuation.Substring(mfile.Index + mfile.Value.Length);
                            convertPunctuationTemp = convertPunctuation;
                            continue;
                        }
                        else
                        {
                            try
                            {

                                convertPunctuation = convertPunctuation.Replace(punctuation.Value, punctuation.Value.Substring(0, 1) + punctuation.Value.Substring(2));
                                ArticleText = ArticleText.Replace(convertPunctuationTemp, convertPunctuation);
                                convertPunctuationTemp = convertPunctuation;

                                //ArticleText = "_______: " + punctuation.Value;



                            }
                            catch
                            {

                                break;
                            }


                        }

                    }
                    else break;

                }

                count = 0;

                //Trường hợp ( [[abc]]) => ([[abc]])
                while (true)
                {
                    if (count >= 100) break;
                    count++;

                    Match punctuation = Regex.Match(convertPunctuation, @"[(]\s{1,2}\[\[\w{1}");
                    //[\p{P}-[{}).,:;_*]]
                    if (punctuation.Success)
                    {

                        Match mfile = Regex.Match(convertPunctuation.Substring(punctuation.Index), @".*\.(jpg|JPG|jpeg|JPEG|gif|ogg|OGG|GIF|flac|FLAC|svg|SVG|svg|SVG)");
                        if (mfile.Success && mfile.Value.Contains(punctuation.Value) == true)
                        {
                            convertPunctuation = convertPunctuation.Substring(mfile.Index + mfile.Value.Length);
                            convertPunctuationTemp = convertPunctuation;
                            continue;
                        }
                        else
                        {
                            try
                            {

                                convertPunctuation = convertPunctuation.Replace(punctuation.Value, punctuation.Value.Substring(0, 1) + punctuation.Value.Substring(2));
                                ArticleText = ArticleText.Replace(convertPunctuationTemp, convertPunctuation);
                                convertPunctuationTemp = convertPunctuation;

                                //ArticleText = "_______: " + punctuation.Value;



                            }
                            catch
                            {

                                break;
                            }


                        }

                    }
                    else break;

                }

                count = 0;

                while (true)
                {

                    if (count >= 100) break;
                    count++;

                    Match punctuation = Regex.Match(convertPunctuation, @"\w{1}\]\]\s{1,2}[.,;:)]");
                    //[\p{P}-[{}).,:;_*]]
                    if (punctuation.Success)
                    {
                        // Sửa ;: vì lỗi đầu dòng
                        Match error = Regex.Match(punctuation.Value, @"\w{1}\]\]\s{1,2}\n[.,;:)]");

                        if (error.Success)
                        {
                            convertPunctuation = convertPunctuation.Substring(error.Index + error.Value.Length);
                            convertPunctuationTemp = convertPunctuation;
                            continue;
                        }

                        Match mfile = Regex.Match(convertPunctuation.Substring(punctuation.Index), @".*\.(jpg|JPG|jpeg|JPEG|gif|ogg|OGG|GIF|flac|FLAC|svg|SVG)");
                        if (mfile.Success && mfile.Value.Contains(punctuation.Value) == true)
                        {
                            convertPunctuation = convertPunctuation.Substring(mfile.Index + mfile.Value.Length);
                            convertPunctuationTemp = convertPunctuation;
                            continue;
                        }
                        else
                        {
                            try
                            {

                                convertPunctuation = convertPunctuation.Replace(punctuation.Value, punctuation.Value.Substring(0, 3) + punctuation.Value.Substring(4));
                                ArticleText = ArticleText.Replace(convertPunctuationTemp, convertPunctuation);
                                convertPunctuationTemp = convertPunctuation;





                            }
                            catch
                            {

                                break;
                            }


                        }

                    }
                    else break;

                }

            }

            #endregion
            return ArticleText;
        }


        //public string SetStub(string ArticleText)
        //{

        //    if (ASCIIEncoding.Unicode.GetByteCount(ArticleText) <= 3000)
        //    {
        //        ArticleText += "\r\n" + "{{sơ khai}}";
        //    }

        //    return ArticleText;

        //}

        /// <summary>
        /// Kiểm tra và đặt mục ==Tham khảo== và thẻ {{tham khảo}} vào bài
        /// </summary>
        /// <param name="ArticleText"></param>
        /// <returns></returns>
        public string SetReference(string ArticleText, int wikiNamespace)
        {
            if (wikiNamespace != 0) return ArticleText;

            //Các bản mẫu định hướng, redirect
            Match dis = Regex.Match(ArticleText, @"\{\{\s*[Dd][Ii][Ss]");
            Match dab = Regex.Match(ArticleText, @"\{\{\s*[Dd][Aa][Bb]");
            Match dinhhuong = Regex.Match(ArticleText, @"\{\{\s*[Đđ][Ịị][Nn][Hh]\s*[Hh][Ưư][Ớớ][Nn][Gg]");
            Match trangdinhhuong = Regex.Match(ArticleText, @"\{\{[Tt]rang\s*[Đđ]ịnh\s*[Hh]ướng");
            Match TLAdisambig = Regex.Match(ArticleText, @"\{\{\s*[Tt][Ll][Aa]disambig");
            Match redirectvn = Regex.Match(ArticleText, @"\#\s*[Đđ][Ổổ][Ii]");
            Match redirect = Regex.Match(ArticleText, @"\#\s*[Rr][Ee][Dd][Ii][Rr][Ee][Cc][Tt]");


            if (dis.Success || dab.Success || dinhhuong.Success || TLAdisambig.Success || redirectvn.Success || redirect.Success || trangdinhhuong.Success) return ArticleText;

            //Bản mẫu chú thích
            Match reflist = Regex.Match(ArticleText, @"\{\{\s*[Rr][eé]f");
            Match thamkhao = Regex.Match(ArticleText, @"\{\{[Tt]ham\s*[Kk]hảo");
            Match references = Regex.Match(ArticleText, @"\<\s*[Rr]eferences");
            Match notes = Regex.Match(ArticleText, @"\{\{[Nn]ote");

            //Nguồn
            Match sfn = Regex.Match(ArticleText, @"\{\{\s*[Ss]fn");
            Match refTag = Regex.Match(ArticleText, @"\{\{\s*[Rr]efTag");
            Match refs = Regex.Match(ArticleText, @"\<\s*[Rr]ef");

            Match thamkhaosection = Regex.Match(ArticleText, @"==\s*[Tt]ham\s*[Kk]hảo\s*==");
            Match chuthichsection = Regex.Match(ArticleText, @"==\s*[Cc]hú\s*[Tt]hích\s*==");
            Match category = Regex.Match(ArticleText, @"\[\[[Tt]hể\s*[Ll]oại");
            Match externalLink = Regex.Match(ArticleText, @"==\s*[Ll]iên\s*[Kk]ết\s*[Nn]goài\s*==");
            Match stub = Regex.Match(ArticleText, @"\{\{[Ss]ơ\s*[Kk]hai");
            Match stubEnglish = Regex.Match(ArticleText, @"\{\{.*stub.*\}\}");
            Match verystub = Regex.Match(ArticleText, @"\{\{[Rr]ất\s*[Ss]ơ\s*[Kk]hai");
            Match taxobox = Regex.Match(ArticleText, @"\{\{[Tt]axobox");

            // Add nhãn sơ khai
            if (ASCIIEncoding.Unicode.GetByteCount(ArticleText) <= 5000 && !stub.Success && !verystub.Success && !stubEnglish.Success)
            {
                if (category.Success)
                {
                    if (taxobox.Success) return ArticleText.Insert(category.Index, "{{sơ khai sinh học}}\r\n");
                    else return ArticleText.Insert(category.Index, "{{sơ khai}}\r\n");
                }
                else
                {
                    if (taxobox.Success) ArticleText += "\r\n" + "{{sơ khai sinh học}}";
                    else ArticleText += "\r\n" + "{{sơ khai}}";

                }
                //Set lại vị trí nếu đã thêm bản mẫu Sơ khai
                stub = Regex.Match(ArticleText, @"\{\{[Ss]ơ\s*[Kk]hai");
            }

            // Add nhãn tham khảo
            if (!reflist.Success && !thamkhao.Success && !references.Success && !notes.Success)
            {
                if (thamkhaosection.Success) return ArticleText.Insert(thamkhaosection.Index + thamkhaosection.Value.Length, "\r\n{{tham khảo}}");
                if (chuthichsection.Success) return ArticleText.Insert(chuthichsection.Index + chuthichsection.Value.Length, "\r\n{{tham khảo}}");
                if (externalLink.Success) return ArticleText.Insert(externalLink.Index, "==Tham khảo==\r\n{{tham khảo}}\r\n");
                if (stub.Success) return ArticleText.Insert(stub.Index, "==Tham khảo==\r\n{{tham khảo}}\r\n");
                if (verystub.Success) return ArticleText.Insert(verystub.Index, "==Tham khảo==\r\n{{tham khảo}}\r\n");
                if (category.Success) return ArticleText.Insert(category.Index, "==Tham khảo==\r\n{{tham khảo}}\r\n");

                return ArticleText + "\r\n" + "==Tham khảo==\r\n{{tham khảo}}\r\n";
            }

            // Kiểm tra trang định hướng với tiêu đề bài viết

            return ArticleText;

        }