Example #1
0
        public static bool TryParse(WikiPage page,
                                    string directory,
                                    bool allowSource,
                                    L10i l10i,
                                    out IArchive archive)
        {
            archive = null;
            Dictionary<string, string> values;
            if (!TryParseTemplate(page.Text, out values))
            {
                return false;
            }

            int days = 14;
            if (values.ContainsKey("срок"))
            {
                int.TryParse(values["срок"], out days);
            }

            int forcedArchivationDelay = 0;
            if (values.ContainsKey("задержка принудительной архивации"))
            {
                int.TryParse(values["задержка принудительной архивации"], out forcedArchivationDelay);
            }

            int minimalSize = 3 * 1024;
            if (values.ContainsKey("размер правки"))
            {
                int.TryParse(values["размер правки"], out minimalSize);
            }

            int archiveSize = 70 * 1024;
            if (values.ContainsKey("размер архива"))
            {
                int.TryParse(values["размер архива"], out archiveSize);
            }

            bool checkForResult = false;
            if (values.ContainsKey("итог"))
            {
                string value = values["итог"].ToLower();
                if (value == "да")
                {
                    checkForResult = true;
                }
            }

            string pageName = page.Title;
            if (allowSource && values.ContainsKey("обрабатывать"))
            {
                pageName = values["обрабатывать"];
            }

            string removeFromText = "";
            if (values.ContainsKey("убирать из архива"))
            {
                removeFromText = values["убирать из архива"];
            }

            string accepted = "";
            if (values.ContainsKey("решения"))
            {
                accepted = values["решения"];
            }

            string rejected = "";
            if (values.ContainsKey("отклонённые заявки"))
            {
                rejected = values["отклонённые заявки"];
            }

            string format = pageName + "/Архив/%(номер)";
            if (values.ContainsKey("формат"))
            {
                format = pageName + "/" + values["формат"];
            }

            string header = "{{closed}}\n";
            if (values.ContainsKey("заголовок"))
            {
                header = values["заголовок"];
            }

            if (values.ContainsKey("страница"))
            {
                format = pageName + "/" + values["страница"];
            }

            if (allowSource && values.ContainsKey("абсолютный путь"))
            {
                format = values["формат"];
            }

            int topics = 0;
            if (values.ContainsKey("тем в архиве"))
            {
                int.TryParse(values["тем в архиве"], out topics);
            }
            bool newSectionsDown = true;
            if (values.ContainsKey("новые"))
            {
                if (values["новые"].ToLower() == "сверху")
                {
                    newSectionsDown = false;
                }
            }

            var onHold = new List<string>();
            if (values.ContainsKey("пропускать с"))
            {
                string[] separators;
                if (values["пропускать с"].Contains("\""))
                {
                    separators = new string[] { "\"," };
                }
                else
                {
                    separators = new string[] { "," };
                }
                string[] cats = values["пропускать с"].Split(separators,
                    StringSplitOptions.RemoveEmptyEntries);
                for (int i = 0; i < cats.Length; ++i)
                {
                    string cat = cats[i].Replace("\"", "").Trim();
                    if (!string.IsNullOrEmpty(cat))
                    {
                        onHold.Add(cat);
                    }
                }
            }

            var lookForLine = new List<string>();
            if (values.ContainsKey("архивировать с"))
            {
                string[] separators;
                if (values["архивировать с"].Contains("\""))
                {
                    separators = new string[] { "\"," };
                }
                else
                {
                    separators = new string[] { "," };
                }
                string[] cats = values["архивировать с"].Split(separators,
                    StringSplitOptions.RemoveEmptyEntries);
                for (int i = 0; i < cats.Length; ++i)
                {
                    string cat = cats[i].Replace("\"", "").Trim();
                    if (!string.IsNullOrEmpty(cat))
                    {
                        lookForLine.Add(cat);
                    }
                }
            }

            if (values.ContainsKey("тип"))
            {
                string t = values["тип"].ToLower();
                if (t == "страница")
                {
                    archive = new Archive(l10i,
                        pageName,
                        directory,
                        days,
                        format,
                        header,
                        lookForLine,
                        onHold,
                        removeFromText,
                        checkForResult,
                        newSectionsDown,
                        minimalSize,
                        forcedArchivationDelay);
                }
                else if (t == "месяц")
                {
                    archive = new ArchiveByMonth(l10i,
                        pageName,
                        directory,
                        days,
                        format,
                        header,
                        lookForLine,
                        onHold,
                        removeFromText,
                        checkForResult,
                        newSectionsDown,
                        minimalSize,
                        forcedArchivationDelay);
                }
                else if (t == "год")
                {
                    archive = new ArchiveByYear(l10i,
                        pageName,
                        directory,
                        days,
                        format,
                        header,
                        lookForLine,
                        onHold,
                        removeFromText,
                        checkForResult,
                        newSectionsDown,
                        minimalSize,
                        forcedArchivationDelay);
                }
                else if (t == "полгода")
                {
                    archive = new ArchiveByHalfYear(l10i,
                        pageName,
                        directory,
                        days,
                        format,
                        header,
                        lookForLine,
                        onHold,
                        removeFromText,
                        checkForResult,
                        newSectionsDown,
                        minimalSize,
                        forcedArchivationDelay);
                }
                else if (t == "квартал")
                {
                    archive = new ArchiveByQuarter(l10i,
                        pageName,
                        directory,
                        days,
                        format,
                        header,
                        lookForLine,
                        onHold,
                        removeFromText,
                        checkForResult,
                        newSectionsDown,
                        minimalSize,
                        forcedArchivationDelay);
                }
                else if (t == "нумерация" && topics > 0)
                {
                    archive = new ArchiveByTopicNumber(l10i,
                        pageName,
                        directory,
                        days,
                        format,
                        header,
                        lookForLine,
                        onHold,
                        removeFromText,
                        checkForResult,
                        newSectionsDown,
                        topics,
                        minimalSize,
                        forcedArchivationDelay);
                }
                else if (allowSource && t == "заявки на арбитраж")
                {
                    archive = new RequestsForArbitrationArchive(pageName,
                        accepted,
                        rejected,
                        days,
                        directory);
                }
            }
            if (archive != null)
            {
                Archive a = archive as Archive;
                if (a != null &&
                    values.ContainsKey("убирать ссылки") &&
                    values["убирать ссылки"].ToLower() == "да")
                {
                    a.Processor = RemoveHttp;
                }
                return true;
            }
            return false;
        }