public void Analyze(Wiki wiki)
{
ParameterCollection parameters = new ParameterCollection();
parameters.Add("generator", "categorymembers");
parameters.Add("gcmtitle", "Категория:Википедия:Незакрытые обсуждения восстановления страниц");
parameters.Add("gcmlimit", "max");
parameters.Add("gcmnamespace", "4");
parameters.Add("prop", "info|revisions");
parameters.Add("rvprop", "timestamp");
XmlDocument doc = wiki.Enumerate(parameters, true);
XmlNodeList pages = doc.SelectNodes("//page");
List<Day> days = new List<Day>();
DateTime start = DateTime.Today;
Regex closedRE = new Regex(@"({{ВПВУС-Навигация}}\s*{{(Закрыто|Closed|закрыто|closed)}})|({{(Закрыто|Closed|закрыто|closed)}}\s*{{ВПВУС-Навигация}})");
foreach (XmlNode page in pages)
{
string pageName = page.Attributes["title"].Value;
string date = pageName.Substring("Википедия:К восстановлению/".Length);
DateTime cutOffDate = new DateTime(2008, 11, 13);
Day day = new Day();
if (!DateTime.TryParse(date,
CultureInfo.CreateSpecificCulture("ru-RU"),
DateTimeStyles.AssumeUniversal, out day.Date))
{
continue;
}
string fileName = _cacheDir + date + ".bin";
string text = "";
if (File.Exists(fileName))
{
using (FileStream fs = new FileStream(fileName, FileMode.Open))
using (GZipStream gs = new GZipStream(fs, CompressionMode.Decompress))
using (TextReader sr = new StreamReader(gs))
{
string revid = sr.ReadLine();
if (revid == page.Attributes["lastrevid"].Value)
{
Console.Out.WriteLine("Loading " + pageName + "...");
text = sr.ReadToEnd();
}
}
}
if (string.IsNullOrEmpty(text))
{
Console.Out.WriteLine("Downloading " + pageName + "...");
text = wiki.LoadText(pageName);
using (FileStream fs = new FileStream(fileName, FileMode.Create))
using (GZipStream gs = new GZipStream(fs, CompressionMode.Compress))
using (StreamWriter sw = new StreamWriter(gs))
{
sw.WriteLine(page.Attributes["lastrevid"].Value);
sw.Write(text);
}
}
DateTime lastEdit = DateTime.Parse(page.FirstChild.FirstChild.Attributes["timestamp"].Value, null, DateTimeStyles.AssumeUniversal);
Match m = closedRE.Match(text);
if ((DateTime.Now - lastEdit).TotalDays > 2 && (m.Success || day.Date < cutOffDate))
{
Console.Out.WriteLine("Closing " + pageName + "...");
text = text.Replace("{{ВПВУС-Навигация}}", "{{ВПВУС-Навигация|nocat=1}}");
wiki.Save(pageName,
text,
"обсуждение закрыто");
continue;
}
day.Page = WikiPage.Parse(pageName, text);
days.Add(day);
}
days.Sort(CompareDays);
Regex wikiLinkRE = new Regex(@"\[{2}(.+?)(\|.+?)?]{2}");
List<string> sectionTitles = new List<string>();
foreach (Day day in days)
{
foreach (WikiPageSection section in day.Page.Sections)
{
RemoveStrikeOut(section);
StrikeOutSection(section);
if (section.Title.Contains("<s>"))
{
Match m = wikiLinkRE.Match(section.Title);
if (m.Success)
{
sectionTitles.Add(m.Groups[1].Value);
}
}
List<WikiPageSection> sections = new List<WikiPageSection>();
section.Reduce(sections, SubsectionsList);
foreach (WikiPageSection subsection in sections)
{
if (subsection.Title.Contains("<s>"))
{
Match m = wikiLinkRE.Match(subsection.Title);
if (m.Success)
{
sectionTitles.Add(m.Groups[1].Value);
}
}
}
}
}
parameters.Clear();
parameters.Add("prop", "info");
XmlDocument xml = wiki.Query(QueryBy.Titles, parameters, sectionTitles);
using (StreamWriter sw =
new StreamWriter(_cacheDir + "MainPage.txt"))
{
sw.WriteLine("== Текущие обсуждения ==\n");
sw.WriteLine("{{Восстановление статей/Статьи, вынесенные на обсуждение восстановления}}\n");
foreach (Day day in days)
{
sw.Write("{{Восстановление статей/День|" + day.Date.ToString("yyyy-M-d") + "|\n");
List<string> titles = new List<string>();
foreach (WikiPageSection section in day.Page.Sections)
{
string result = "";
string filler = "";
RemoveStrikeOut(section);
StrikeOutSection(section);
if (section.Title.Contains("<s>"))
{
Match m = wikiLinkRE.Match(section.Title);
if (m.Success)
{
string link = m.Groups[1].Value;
XmlNode node = xml.SelectSingleNode("//page[@title='" + link.Replace("'", @"'") + "']");
if (node != null)
{
if (node.Attributes["missing"] == null)
{
WikiPageSection autoresult = section.Subsections.FirstOrDefault(s => s.Title.Trim() == "Автоматический итог");
if (autoresult != null &&
autoresult.SectionText.Contains("Страница была создана заново"))
{
result = " ''(создана заново)''";
}
else
{
result = " ''(восстановлена)''";
}
}
else
{
result = " ''(не восстановлена)''";
}
}
}
}
for (int i = 0; i < section.Level - 1; ++i)
{
filler += "*";
}
titles.Add(filler + " " + section.Title.Trim() + result);
List<WikiPageSection> sections = new List<WikiPageSection>();
section.Reduce(sections, SubsectionsList);
foreach (WikiPageSection subsection in sections)
{
result = "";
if (subsection.Title.Contains("<s>"))
{
Match m = wikiLinkRE.Match(subsection.Title);
if (m.Success)
{
string link = m.Groups[1].Value;
XmlNode node = xml.SelectSingleNode("//page[@title='" + link + "']");
if (node != null)
{
if (node.Attributes["missing"] == null)
{
WikiPageSection autoresult = subsection.Subsections.FirstOrDefault(s => s.Title.Trim() == "Автоматический итог");
if (autoresult != null &&
autoresult.SectionText.Contains("Страница была создана заново"))
{
result = " ''(создана заново)''";
}
else
{
result = " ''(восстановлена)''";
}
}
else
{
result = " ''(не восстановлена)''";
}
}
}
}
filler = "";
for (int i = 0; i < subsection.Level - 1; ++i)
{
filler += "*";
}
titles.Add(filler + " " + subsection.Title.Trim());
}
}
if (titles.Count(s => s.Contains("=")) > 0)
{
titles[0] = "2=<div>" + titles[0].Substring(2);
}
sw.Write(string.Join("\n", titles.ConvertAll(c => c).ToArray()));
if (titles.Count(s => s.Contains("=")) > 0)
{
sw.Write("</div>");
}
sw.Write("}}\n\n");
}
sw.WriteLine("{{/Подвал}}");
}
}