public static Feat Parse(WikiPage page, WikiExport export, ILog log = null) { var feat = new Feat(); var parser = new FeatParser(feat, page, export); parser.Execute(log); return feat; }
public static bool TryParse(WikiPage page, WikiExport export, out Feat feat, ILog log = null) { feat = null; try { feat = Parse(page, export, log); return true; } catch (ParseException e) { log.Error("{0}: {1}", page.Title, e.Message); return false; } }
public FeatParser(Feat feat, WikiPage wikiPage, WikiExport export) { this.feat = feat; this.wikiPage = wikiPage; this.export = export; }
public IFeatPrerequisiteItem Parse(string markup, WikiExport export, bool hasSemiColons) { if (markup.EndsWith(".")) { // Si le prérequis se termine par un point on le supprime markup = markup.Substring(0, markup.Length - 1); } if (markup.IndexOf(" ou ") == -1) { // Condition unique var prerequisite = CreateInstance(markup, export); prerequisite.Description = MarkupUtil.RemoveMarkup(markup); return prerequisite; } // Condition composée (ou) var choiceContainer = new FeatPrerequisiteChoice(); // Si les conditions étaient séparées par un ";", on découpe la chaîne selon "," et "ou" // Si les conditions n'étaient pas séparées par un ";", on découpé la chaîne selon "ou" uniquement var separators = hasSemiColons ? new[] {",", " ou "} : new[] {" ou "}; var choiceMarkup = markup.Split(separators, StringSplitOptions.RemoveEmptyEntries).Select(m => m.Trim()).ToArray(); var items = new List<FeatPrerequisite>(choiceMarkup.Length); foreach (var itemMarkup in choiceMarkup) { var item = CreateInstance(itemMarkup, export); item.Description = MarkupUtil.RemoveMarkup(itemMarkup); items.Add(item); } choiceContainer.Items = items.ToArray(); return choiceContainer; }
private FeatPrerequisite CreateInstance(string markup, WikiExport export) { var lower = markup.ToLowerInvariant(); Match match; if (IsMatch(lower, AttributePattern, out match)) { return AsAttribute(match); } if (IsMatch(lower, AttributeShortPattern, out match)) { return AsAttribute(match); } if (IsMatch(lower, MarkupUtil.LinkOnlyPattern, out match)) { var target = MarkupUtil.ExtractLinkTargetName(match); var targetName = new WikiName(WikiName.DefaultNamespace, target); var targetPage = export.FindPage(targetName); if (targetPage == null) { log.Warning("{0}: Impossible de trouver la page nommée '{1}' désignée par le lien '{2}'", page.Title, target, markup); return new FeatPrerequisite {Type = FeatPrerequisiteType.Other}; } string subValue; int number; FeatPrerequisiteType targetType = ResolveTypeFromPageCategories(targetPage, out subValue, out number); if (targetType == FeatPrerequisiteType.Other) { log.Warning( "{3}: Impossible de déterminer le type de lien pour la page '{0}' désignée par le lien '{1}' avec les catégories '{2}'", targetPage.Title, markup, string.Join(", ", targetPage.Categories.Select(c => c.Name)), page.Title ); return new FeatPrerequisite {Type = FeatPrerequisiteType.Other}; } return new FeatPrerequisite { Type = targetType, Value = WikiName.IdFromTitle(target), SubValue = subValue, Number = number }; } if (IsMatch(markup, BbaPattern, out match)) { return new FeatPrerequisite { Type = FeatPrerequisiteType.BBA, Number = int.Parse(match.Groups["Value"].Value) }; } if (IsMatch(markup, SpellCasterLevelPatterns, out match)) { return new FeatPrerequisite { Type = FeatPrerequisiteType.SpellcasterLevel, Number = int.Parse(match.Groups["Level"].Value) }; } if (IsMatch(markup, SkillRankLevelPatterns, out match)) { return new FeatPrerequisite { Type = FeatPrerequisiteType.SkillRank, Value = WikiName.IdFromTitle(match.Groups["Skill"].Value), SubValue = WikiName.IdFromTitle(match.Groups["Speciality"].Value).EmptyAsNull(), Number = int.Parse(match.Groups["Ranks"].Value) }; } if (IsMatch(markup, ClassLevelPatterns, out match)) { return new FeatPrerequisite { Type = FeatPrerequisiteType.ClassLevel, Value = WikiName.IdFromTitle(match.Groups["Class"].Value), Number = int.Parse(match.Groups["Level"].Value) }; } if (IsMatch(markup, ClassPowerPatterns, out match)) { return new FeatPrerequisite { Type = FeatPrerequisiteType.Other, OtherType = FeatPrerequisiteOtherTypes.ClassPower, Value = WikiName.IdFromTitle(match.Groups["Name"].Value) }; } if (IsMatch(markup, SpellCastPatterns, out match)) { return new FeatPrerequisite { Type = FeatPrerequisiteType.SpellCast, Value = WikiName.IdFromTitle(MarkupUtil.ExtractLinkTargetName(match)) }; } if (otherTypes.Contains(markup)) { return new FeatPrerequisite {Type = FeatPrerequisiteType.Other}; } switch (lower) { case "pouvoir de classe ancrage": return new FeatPrerequisite {Type = FeatPrerequisiteType.Other, OtherType = FeatPrerequisiteOtherTypes.ClassPower, Value = WikiName.IdFromTitle("Ancrage")}; case "pouvoir de classe [[oracle#mystere|mystère]]": return new FeatPrerequisite {Type = FeatPrerequisiteType.Other, OtherType = FeatPrerequisiteOtherTypes.ClassPower, Value = WikiName.IdFromTitle("Mystère")}; case "[[maniement dune arme exotique|maniement d'une arme exotique]] (filet)": return new FeatPrerequisite {Type = FeatPrerequisiteType.Other, OtherType = FeatPrerequisiteOtherTypes.ExoticWeaponProficiency, Value = WikiName.IdFromTitle("filet")}; case "[[arme de prédilection]] pour l’arme choisie": return new FeatPrerequisite {Type = FeatPrerequisiteType.Feat, Value = WikiName.IdFromTitle("arme de prédilection")}; case "[[arme de prédilection]] (bâton)": return new FeatPrerequisite {Type = FeatPrerequisiteType.Feat, Value = WikiName.IdFromTitle("arme de prédilection"), SubValue = WikiName.IdFromTitle("bâton")}; case "aptitude de classe de [[représentation bardique]]": return new FeatPrerequisite {Type = FeatPrerequisiteType.Other, OtherType = FeatPrerequisiteOtherTypes.ClassPower, Value = WikiName.IdFromTitle("représentation bardique")}; case "capacité de classe de [[canalisation|canalisation d’énergie]]": case "capacité de classe permettant de [[canalisation|canaliser de l’énergie négative]]": case "capacité de [[classe]] à [[canalisation|canaliser de l’énergie]]": case "capacité de [[classe]] permettant de [[canalisation|canaliser de l’énergie]]": case "Capacité de classe permettant de canaliser de l’énergie": return new FeatPrerequisite {Type = FeatPrerequisiteType.Other, OtherType = FeatPrerequisiteOtherTypes.ClassPower, Value = WikiName.IdFromTitle("canalisation")}; } log.Warning(string.Format("{1}: Condition '{0}' non reconnue", markup, page.Title)); return new FeatPrerequisite {Type = FeatPrerequisiteType.Other}; }
public SpellListParser(WikiExport wiki, ILog log) { this.wiki = wiki; this.log = log ?? NullLog.Instance; }