public void UpdateArchivePages(Wiki wiki)
{
ParameterCollection parameters = new ParameterCollection();
parameters.Add("generator", "categorymembers");
parameters.Add("gcmtitle", _l10i.Category);
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 prefix = _l10i.MainPage + "/";
string pageName = page.Attributes["title"].Value;
string date = pageName.Substring(prefix.Length);
DateTime day;
if (DateTime.TryParse(date,
_l10i.Culture,
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 = _l10i.ArchivePage + 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(_l10i.ArchivePage.Length);
DateTime archiveDate;
if (!DateTime.TryParse(date,
_l10i.Culture,
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",
_l10i.Culture);
string prefix = _l10i.MainPage + "/";
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 prefix = _l10i.MainPage + "/";
string pageName = page.Attributes["title"].Value;
string dateString = pageName.Substring(prefix.Length);
string pageFileName = _cacheDir + dateString + ".bin";
Day day = new Day();
day.Archived = doc.SelectSingleNode("//page[@title=\"" + pageName + "\"]") == null;
if (!DateTime.TryParse(dateString,
_l10i.Culture,
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(_l10i.ArchiveHeader);
StringBuilder sb = new StringBuilder();
foreach (Day day in days)
{
sb.Append("{{" + _l10i.Template + "|" + day.Date.ToString("yyyy-M-d") + "|\n");
if (!day.Exists)
{
sb.Append("''" + _l10i.EmptyArchive + "''}}\n\n");
continue;
}
List<string> sectionTitles = new List<string>();
foreach (WikiPageSection section in day.Page.Sections)
{
string result = section.Reduce("", SubsectionsList);
if (result.Length > 0)
{
result = " • <small>" + result.Substring(3) + "</small>";
}
string title;
if (_l10i.Processor != null)
{
title = _l10i.Processor(section).Trim();
}
else
{
title = section.Title.Trim();
}
sectionTitles.Add(title + result);
}
sb.Append(string.Join(" • ", 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(_l10i.ArchiveFooter);
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(),
_l10i.MainPageUpdateComment);
using (StreamWriter sw =
new StreamWriter(fileName))
{
sw.Write(textBuilder.ToString());
}
}
}