/// <summary> /// Processes parsed area. /// </summary> /// <param name="area">Area.</param> private void OnAreaParsed(ParsedArea area) { if (area != null) { Areas.Add(area); AreasCount += 1; if (Areas.Count >= Settings.ChunkSize) { OnParsing(new ParserResultEventArgs(Areas)); Areas.Clear(); } } }
/// <summary> /// Converts the given tree to areas. /// </summary> /// <param name="tree">Tree to convert.</param> /// <param name="tags">Parent tags, if any.</param> private void ConvertTreeToAreas(RockClimbingComWikiTree tree, IEnumerable<string> tags) { int order = 0; ParsedArea area = null; ParsedSector sector = null; IList<string> areaTags = null; IList<string> sectorTags = null; RockClimbingComWiki areaWiki = null; RockClimbingComWikiNodeBase accumulatedSector = null; Dictionary<string, ParsedArea> areas = new Dictionary<string, ParsedArea>(); if (tree != null && tree.SectorNodes.Any()) { // Traversing only sector nodes - nodes where we found routes foreach (RockClimbingComWikiNode actualSector in tree.SectorNodes) { // Accumulating details and routes accumulatedSector = actualSector.AccumulateAll(); // Accumulating details for area if (actualSector.Parent != null) areaWiki = actualSector.Parent.AccumulateWiki(); else areaWiki = actualSector.AccumulateWiki(); // Accumulating tags for area and sector sectorTags = actualSector.GetTags(tags); if (actualSector.Parent != null) areaTags = actualSector.Parent.GetTags(tags); else areaTags = new List<string>(sectorTags); if (accumulatedSector != null && areaWiki != null) { sector = new ParsedSector(); if (accumulatedSector.Info != null) { sector.Name = accumulatedSector.Info.Name; sector.Description = accumulatedSector.Info.Description; sector.Climbing = accumulatedSector.Info.Climbing; sector.Location = accumulatedSector.Info.Location; sector.Season = accumulatedSector.Info.Season; sector.Origin = "http://rockclimbing.com"; sector.Tags = sectorTags; sector.Order = (++order); } // Assigning all routes from the tree sector.Routes = accumulatedSector.Routes; // Getting image if (accumulatedSector.Contents != null && accumulatedSector.Contents.Any()) { foreach (string sectorContent in accumulatedSector.Contents) { sector.Image = ParseImage(sectorContent); if (sector.Image != null && sector.Image.Any()) break; } } if (!areas.ContainsKey(areaWiki.Name)) { area = new ParsedArea(); area.Name = areaWiki.Name; area.Description = areaWiki.Description; area.Climbing = areaWiki.Climbing; area.Location = areaWiki.Location; area.Season = areaWiki.Season; area.Origin = "http://rockclimbing.com"; area.Tags = areaTags; areas.Add(areaWiki.Name, area); } if (areas[areaWiki.Name].Sectors == null) areas[areaWiki.Name].Sectors = new List<ParsedSector>(); if (sector.Routes != null && sector.Routes.Any()) { // Adding sector to area areas[areaWiki.Name].Sectors.Add(sector); } } } foreach (ParsedArea a in areas.Values) { if (a.Sectors != null && a.Sectors.Any()) OnAreaParsed(a); } } }