public void Analyze(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");
List<Day> days = new List<Day>();
foreach (XmlNode page in pages)
{
string prefix = _l10i.MainPage + "/";
string pageName = page.Attributes["title"].Value;
string date = pageName.Substring(prefix.Length);
Day day = new Day();
try
{
day.Date = DateTime.Parse(date,
_l10i.Culture,
DateTimeStyles.AssumeUniversal);
}
catch (FormatException)
{
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);
}
}
Match m = _l10i.closedRE.Match(text);
if (m.Success)
{
Console.Out.WriteLine("Closing " + pageName + "...");
text = _l10i.ClosePage(text);
wiki.Save(pageName,
text,
_l10i.CloseComment);
continue;
}
day.Page = WikiPage.Parse(pageName, text);
days.Add(day);
}
days.Sort(CompareDays);
using (StreamWriter sw =
new StreamWriter(_cacheDir + "MainPage.txt"))
{
if (!string.IsNullOrEmpty(_l10i.SectionTitle))
{
sw.WriteLine("== " + _l10i.SectionTitle + " ==\n");
}
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)
{
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 + "}}");
}
}