public void Analyse(Wiki wiki)
{
Directory.CreateDirectory(_cacheDir);
Regex wikiLinkRE = new Regex(@"\[{2}(.+?)(\|.+?)?]{2}");
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");
List<Day> days = new List<Day>();
foreach (XmlNode page in pages)
{
string prefix = _l10i.MainPage + "/";
string pageName = page.Attributes["title"].Value;
if (pageName.Length < prefix.Length)
{
continue;
}
string date = pageName.Substring(prefix.Length);
Day day = new Day();
if (!DateTime.TryParse(date, CultureInfo.CreateSpecificCulture(_l10i.Culture),
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);
}
}
day.Page = WikiPage.Parse(pageName, text);
days.Add(day);
}
days.Sort(CompareDays);
using (StreamWriter sw =
new StreamWriter(_cacheDir + "Main.txt"))
{
sw.WriteLine("{{" + _l10i.TopTemplate + "}}\n");
foreach (Day day in days)
{
sw.Write("{{" + _l10i.Template + "|" + day.Date.ToString("yyyy-M-d") + "|");
List<string> titles = new List<string>();
foreach (WikiPageSection section in day.Page.Sections)
{
ReplaceEmptyResults(section);
RemoveStrikeOut(section);
StrikeOutSection(section);
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();
}
titles.Add(title + result);
}
sw.Write(string.Join(" • ", titles.ConvertAll(c => c).ToArray()));
sw.Write("}}\n\n");
}
sw.WriteLine("{{" + _l10i.BottomTemplate + "}}");
}
List<string> dates = new List<string>();
DateTime today = DateTime.Today;
DateTime currentMonth = new DateTime(today.Year, today.Month, 1);
for (int i = 0; i < 2; ++i)
{
DateTime start = currentMonth.AddMonths(-i);
DateTime end = start.AddMonths(1);
while (start < end)
{
string date = start.ToString("d MMMM yyyy",
CultureInfo.CreateSpecificCulture(_l10i.Culture));
string prefix = _l10i.MainPage + "/";
string pageName = prefix + date;
dates.Add(pageName);
start = start.AddDays(1);
}
}
parameters.Clear();
parameters.Add("prop", "info");
XmlDocument xml = wiki.Query(QueryBy.Titles, parameters, dates);
days.Clear();
foreach (string pageName in dates)
{
string prefix = _l10i.MainPage + "/";
string date = pageName.Substring(prefix.Length);
string fileName = _cacheDir + date + ".bin";
bool archived = doc.SelectSingleNode("//page[@title=\"" + pageName + "\"]") == null;
XmlNode page = xml.SelectSingleNode("//page[@title=\"" + pageName + "\"]");
Day day = new Day();
day.Archived = archived;
if (!DateTime.TryParse(date, CultureInfo.CreateSpecificCulture(_l10i.Culture),
DateTimeStyles.AssumeUniversal, out day.Date))
{
continue;
}
if (page.Attributes["missing"] != null)
{
day.Exists = false;
days.Add(day);
continue;
}
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);
}
}
day.Exists = true;
day.Page = WikiPage.Parse(pageName, text);
days.Add(day);
}
days.Sort(CompareDays);
for (int i = 0; i < 2; ++i)
{
DateTime start = currentMonth.AddMonths(-i);
DateTime end = start.AddMonths(1);
string archiveDate = start.ToString("yyyy-MM");
IEnumerable<Day> daysInMonth = days.Where(d => d.Date >= start &&
d.Date < end);
using (StreamWriter sw =
new StreamWriter(_cacheDir + "Archive-" + archiveDate + ".txt"))
{
sw.WriteLine(_l10i.ArchiveHeader);
StringBuilder sb = new StringBuilder();
foreach (Day day in daysInMonth)
{
sb.Append("{{" + _l10i.Template + "|" + day.Date.ToString("yyyy-M-d") + "|");
if (!day.Exists)
{
sb.Append("''" + _l10i.EmptyArchive + "''}}\n\n");
continue;
}
List<string> titles = 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();
}
titles.Add(title + result);
}
sb.Append(string.Join(" • ", titles.ConvertAll(c => c).ToArray()));
sb.Append("}}\n\n");
}
sb.Replace("<s>", "");
sb.Replace("</s>", "");
sb.Replace("<strike>", "");
sb.Replace("</strike>", "");
sw.Write(sb.ToString());
sw.WriteLine(_l10i.ArchiveFooter);
}
}
}