public void UpdateArchivePages(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");
XmlDocument doc = wiki.Enumerate(parameters, true);
XmlNodeList pages = doc.SelectNodes("//page");
DateTime minDate = DateTime.Now;
foreach (XmlNode page in pages)
{
string pageName = page.Attributes["title"].Value;
string date = pageName.Substring("Википедия:К восстановлению/".Length);
DateTime day;
if (DateTime.TryParse(date,
CultureInfo.CreateSpecificCulture("ru-RU"),
DateTimeStyles.AssumeUniversal, out day))
{
if (day < minDate)
{
minDate = day;
}
}
else
{
continue;
}
}
List<string> titles = new List<string>();
minDate = new DateTime(minDate.Year, minDate.Month, 1);
DateTime currentMonth = new DateTime(DateTime.Today.Year,
DateTime.Today.Month, 1);
DateTime start = minDate;
while (start <= currentMonth)
{
string date = start.ToString("yyyy-MM");
string pageName = "Википедия:Архив запросов на восстановление/" + date;
titles.Add(pageName);
start = start.AddMonths(1);
}
parameters.Clear();
parameters.Add("prop", "info");
XmlDocument archivesDoc = wiki.Query(QueryBy.Titles, parameters, titles);
pages = archivesDoc.SelectNodes("//page");
foreach (XmlNode archivePage in pages)
{
string archiveName = archivePage.Attributes["title"].Value;
string date = archiveName.Substring("Википедия:Архив запросов на восстановление/".Length);
DateTime archiveDate;
if (!DateTime.TryParse(date,
CultureInfo.CreateSpecificCulture("ru-RU"),
DateTimeStyles.AssumeUniversal, out archiveDate))
{
continue;
}
string fileName = _cacheDir + "Archive-" + date + ".txt";
start = archiveDate;
DateTime end = start.AddMonths(1);
titles.Clear();
while (start < end)
{
string pageDate = start.ToString("d MMMM yyyy",
CultureInfo.CreateSpecificCulture("ru-RU"));
string prefix = "Википедия:К восстановлению/";
string pageName = prefix + pageDate;
titles.Add(pageName);
start = start.AddDays(1);
}
parameters.Clear();
parameters.Add("prop", "info");
List<Day> days = new List<Day>();
XmlDocument xml = wiki.Query(QueryBy.Titles, parameters, titles);
XmlNodeList archives = xml.SelectNodes("//page");
foreach (XmlNode page in archives)
{
string pageName = page.Attributes["title"].Value;
string dateString = pageName.Substring("Википедия:К восстановлению/".Length);
string pageFileName = _cacheDir + dateString + ".bin";
Day day = new Day();
day.Archived = doc.SelectSingleNode("//page[@title=\"" + pageName + "\"]") == null;
if (!DateTime.TryParse(dateString,
CultureInfo.CreateSpecificCulture("ru-RU"),
DateTimeStyles.AssumeUniversal, out day.Date))
{
continue;
}
if (page.Attributes["missing"] != null)
{
day.Exists = false;
days.Add(day);
continue;
}
string text = LoadPageFromCache(pageFileName,
page.Attributes["lastrevid"].Value, pageName);
if (string.IsNullOrEmpty(text))
{
Console.Out.WriteLine("Downloading " + pageName + "...");
text = wiki.LoadText(pageName);
CachePage(pageFileName, page.Attributes["lastrevid"].Value, text);
}
day.Exists = true;
day.Page = WikiPage.Parse(pageName, text);
days.Add(day);
}
days.Sort(CompareDays);
StringBuilder textBuilder = new StringBuilder();
textBuilder.AppendLine("{{Навигация по архиву ВУС}}\n{{Восстановление статей/Начало}}");
StringBuilder sb = new StringBuilder();
foreach (Day day in days)
{
sb.Append("{{Восстановление статей/День|" + day.Date.ToString("yyyy-M-d") + "|\n");
if (!day.Exists)
{
sb.Append("''нет обсуждений''}}\n\n");
continue;
}
List<string> sectionTitles = new List<string>();
foreach (WikiPageSection section in day.Page.Sections)
{
string filler = "";
for (int i = 0; i < section.Level - 1; ++i)
{
filler += "*";
}
sectionTitles.Add(filler + " " + section.Title.Trim());
List<WikiPageSection> sections = new List<WikiPageSection>();
section.Reduce(sections, SubsectionsList);
foreach (WikiPageSection subsection in sections)
{
filler = "";
for (int i = 0; i < subsection.Level - 1; ++i)
{
filler += "*";
}
sectionTitles.Add(filler + " " + subsection.Title.Trim());
}
}
if (sectionTitles.Count(s => s.Contains("=")) > 0)
{
titles[0] = "2=<li>" + titles[0].Substring(2) + "</li>";
}
sb.Append(string.Join("\n", sectionTitles.ConvertAll(c => c).ToArray()));
sb.Append("}}\n\n");
}
sb.Replace("<s>", "");
sb.Replace("</s>", "");
sb.Replace("<strike>", "");
sb.Replace("</strike>", "");
textBuilder.Append(sb.ToString());
textBuilder.AppendLine("{{Восстановление статей/Конец}}");
if (File.Exists(fileName))
{
using (TextReader sr = new StreamReader(fileName))
{
string text = sr.ReadToEnd();
if (text == textBuilder.ToString())
{
continue;
}
}
}
Console.Out.WriteLine("Updating " + archiveName + "...");
wiki.Save(archiveName,
textBuilder.ToString(),
"обновление");
using (StreamWriter sw =
new StreamWriter(fileName))
{
sw.Write(textBuilder.ToString());
}
}
}