コード例 #1
0
 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;
 }
コード例 #2
0
 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;
     }
 }
コード例 #3
0
 public FeatParser(Feat feat, WikiPage wikiPage, WikiExport export)
 {
     this.feat = feat;
     this.wikiPage = wikiPage;
     this.export = export;
 }
コード例 #4
0
            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;
            }
コード例 #5
0
            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};
            }
コード例 #6
0
 public SpellListParser(WikiExport wiki, ILog log)
 {
     this.wiki = wiki;
     this.log = log ?? NullLog.Instance;
 }