From a83b481abf467d9b45e7685306a450e32af6419f Mon Sep 17 00:00:00 2001 From: Yan Maniez Date: Wed, 11 Jul 2018 00:45:48 +0200 Subject: [PATCH] Test reverse --- .../AideDeJeu/Models/Conditions/Condition.cs | 6 + AideDeJeu/AideDeJeu/Models/HomeItem.cs | 6 + AideDeJeu/AideDeJeu/Models/Item.cs | 3 +- AideDeJeu/AideDeJeu/Models/Items.cs | 39 ++++++ .../AideDeJeu/Models/Monsters/MonsterHD.cs | 6 + .../AideDeJeu/Models/Monsters/MonsterVO.cs | 6 + AideDeJeu/AideDeJeu/Models/Spells/SpellHD.cs | 126 ++++++++++++++++++ AideDeJeu/AideDeJeu/Models/Spells/SpellVO.cs | 6 + .../AideDeJeu/Tools/MarkdownExtensions.cs | 33 +++++ .../ViewModels/ItemDetailViewModel.cs | 6 - .../AideDeJeu/ViewModels/ItemsViewModel.cs | 3 +- AideDeJeu/AideDeJeu/ViewModels/Navigator.cs | 2 - .../AideDeJeu/Views/MainNavigationPage.xaml | 2 +- Data/spells_hd.md | 4 + 14 files changed, 237 insertions(+), 11 deletions(-) create mode 100644 AideDeJeu/AideDeJeu/Models/Items.cs diff --git a/AideDeJeu/AideDeJeu/Models/Conditions/Condition.cs b/AideDeJeu/AideDeJeu/Models/Conditions/Condition.cs index 00b55fa0..71347fcc 100644 --- a/AideDeJeu/AideDeJeu/Models/Conditions/Condition.cs +++ b/AideDeJeu/AideDeJeu/Models/Conditions/Condition.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Text; +using Markdig.Syntax; namespace AideDeJeuLib.Conditions { @@ -18,5 +19,10 @@ namespace AideDeJeuLib.Conditions Text; } } + + public override void Parse(ref ContainerBlock.Enumerator enumerator) + { + throw new NotImplementedException(); + } } } diff --git a/AideDeJeu/AideDeJeu/Models/HomeItem.cs b/AideDeJeu/AideDeJeu/Models/HomeItem.cs index cf7e0722..581b9b48 100644 --- a/AideDeJeu/AideDeJeu/Models/HomeItem.cs +++ b/AideDeJeu/AideDeJeu/Models/HomeItem.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Text; +using Markdig.Syntax; namespace AideDeJeuLib.Models { @@ -19,5 +20,10 @@ namespace AideDeJeuLib.Models "# [Conditions](conditions_vo.md)\n\n"; } } + + public override void Parse(ref ContainerBlock.Enumerator enumerator) + { + throw new NotImplementedException(); + } } } diff --git a/AideDeJeu/AideDeJeu/Models/Item.cs b/AideDeJeu/AideDeJeu/Models/Item.cs index 807a8a57..ec4d25d0 100644 --- a/AideDeJeu/AideDeJeu/Models/Item.cs +++ b/AideDeJeu/AideDeJeu/Models/Item.cs @@ -28,8 +28,9 @@ namespace AideDeJeuLib } } - public Properties Properties { get; set; } + //public Properties Properties { get; set; } public abstract string Markdown { get; } + public abstract void Parse(ref Markdig.Syntax.ContainerBlock.Enumerator enumerator); } } diff --git a/AideDeJeu/AideDeJeu/Models/Items.cs b/AideDeJeu/AideDeJeu/Models/Items.cs new file mode 100644 index 00000000..9b4b8360 --- /dev/null +++ b/AideDeJeu/AideDeJeu/Models/Items.cs @@ -0,0 +1,39 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using Markdig.Syntax; + +namespace AideDeJeuLib +{ + public class Items : Item, IEnumerable + { + private IEnumerable _Items; + public override string Markdown => throw new NotImplementedException(); + + public IEnumerator GetEnumerator() + { + return _Items.GetEnumerator(); + } + + public override void Parse(ref ContainerBlock.Enumerator enumerator) + { + var items = new List(); + enumerator.MoveNext(); + while (enumerator.Current != null) + { + var item = new Spells.SpellHD(); + item.Parse(ref enumerator); + items.Add(item); + //enumerator.MoveNext(); + } + _Items = items; + } + + IEnumerator IEnumerable.GetEnumerator() + { + return _Items.GetEnumerator(); + } + } +} diff --git a/AideDeJeu/AideDeJeu/Models/Monsters/MonsterHD.cs b/AideDeJeu/AideDeJeu/Models/Monsters/MonsterHD.cs index 5baeefcf..fb262cfe 100644 --- a/AideDeJeu/AideDeJeu/Models/Monsters/MonsterHD.cs +++ b/AideDeJeu/AideDeJeu/Models/Monsters/MonsterHD.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using Markdig.Syntax; namespace AideDeJeuLib.Monsters { @@ -36,5 +37,10 @@ namespace AideDeJeuLib.Monsters (LegendaryActions != null ? $"## Actions Légendaires\n\n" + LegendaryActions.Aggregate((s1, s2) => s1 + "\n\n" + s2) : ""); } } + + public override void Parse(ref ContainerBlock.Enumerator enumerator) + { + throw new NotImplementedException(); + } } } \ No newline at end of file diff --git a/AideDeJeu/AideDeJeu/Models/Monsters/MonsterVO.cs b/AideDeJeu/AideDeJeu/Models/Monsters/MonsterVO.cs index 133f334d..2db8a4a3 100644 --- a/AideDeJeu/AideDeJeu/Models/Monsters/MonsterVO.cs +++ b/AideDeJeu/AideDeJeu/Models/Monsters/MonsterVO.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Text; +using Markdig.Syntax; namespace AideDeJeuLib.Monsters { @@ -36,5 +37,10 @@ namespace AideDeJeuLib.Monsters (LegendaryActions != null ? $"## Legendary Actions\n\n" + LegendaryActions.Aggregate((s1, s2) => s1 + "\n\n" + s2) : ""); } } + + public override void Parse(ref ContainerBlock.Enumerator enumerator) + { + throw new NotImplementedException(); + } } } diff --git a/AideDeJeu/AideDeJeu/Models/Spells/SpellHD.cs b/AideDeJeu/AideDeJeu/Models/Spells/SpellHD.cs index debf174c..f180047a 100644 --- a/AideDeJeu/AideDeJeu/Models/Spells/SpellHD.cs +++ b/AideDeJeu/AideDeJeu/Models/Spells/SpellHD.cs @@ -1,7 +1,10 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Text; using System.Text.RegularExpressions; +using AideDeJeu.Tools; +using Markdig.Syntax; namespace AideDeJeuLib.Spells { @@ -65,5 +68,128 @@ namespace AideDeJeuLib.Spells } } + public override void Parse(ref ContainerBlock.Enumerator enumerator) + { + while (enumerator.Current != null) + { + var block = enumerator.Current; + if (block is Markdig.Syntax.HeadingBlock) + { + var headingBlock = block as Markdig.Syntax.HeadingBlock; + //DumpHeadingBlock(headingBlock); + if (headingBlock.HeaderChar == '#' && headingBlock.Level == 1) + { + if(this.Name != null) + { + return; + } + this.Name = headingBlock.Inline.ToMarkdownString(); + //Console.WriteLine(spell.Name); + } + } + if (block is Markdig.Syntax.ParagraphBlock) + { + var paragraphBlock = block as Markdig.Syntax.ParagraphBlock; + this.DescriptionHtml += MarkdownExtensions.MarkdownToHtml(paragraphBlock.ToMarkdownString()) + "\n"; + ////DumpParagraphBlock(paragraphBlock); + //Console.WriteLine(paragraphBlock.IsBreakable); + //spell.DescriptionHtml += paragraphBlock.Inline.ToContainerString(); + //if(paragraphBlock.IsBreakable) + //{ + // spell.DescriptionHtml += "\n"; + //} + } + if (block is Markdig.Syntax.ListBlock) + { + var listBlock = block as Markdig.Syntax.ListBlock; + //DumpListBlock(listBlock); + if (listBlock.BulletType == '-') + { + this.Source = ""; + foreach (var inblock in listBlock) + { + //DumpBlock(inblock); + var regex = new Regex("(?.*?): (?.*)"); + if (inblock is Markdig.Syntax.ListItemBlock) + { + var listItemBlock = inblock as Markdig.Syntax.ListItemBlock; + foreach (var ininblock in listItemBlock) + { + //DumpBlock(ininblock); + if (ininblock is Markdig.Syntax.ParagraphBlock) + { + var paragraphBlock = ininblock as Markdig.Syntax.ParagraphBlock; + //DumpParagraphBlock(paragraphBlock); + var str = paragraphBlock.Inline.ToMarkdownString(); + + var properties = new List>>() + { + new Tuple>("NameVO: ", (m, s) => m.NameVO = s), + new Tuple>("CastingTime: ", (m, s) => m.CastingTime = s), + new Tuple>("Components: ", (m, s) => m.Components = s), + new Tuple>("Duration: ", (m, s) => m.Duration = s), + new Tuple>("LevelType: ", (m, s) => m.LevelType = s), + new Tuple>("Range: ", (m, s) => m.Range = s), + new Tuple>("Source: ", (m, s) => m.Source = s), + new Tuple>("Classes: ", (m, s) => m.Source += s), + new Tuple>("", (m,s) => + { + }) + }; + + foreach (var property in properties) + { + if (str.StartsWith(property.Item1)) + { + property.Item2.Invoke(this, str.Substring(property.Item1.Length)); + break; + } + } + } + } + } + } + } + else + { + foreach (var inblock in listBlock) + { + if (inblock is Markdig.Syntax.ListItemBlock) + { + var listItemBlock = inblock as Markdig.Syntax.ListItemBlock; + foreach (var ininblock in listItemBlock) + { + //DumpBlock(ininblock); + if (ininblock is Markdig.Syntax.ParagraphBlock) + { + var paragraphBlock = ininblock as Markdig.Syntax.ParagraphBlock; + this.DescriptionHtml += listBlock.BulletType + " " + MarkdownExtensions.MarkdownToHtml(paragraphBlock.ToMarkdownString()) + "\n"; + } + } + } + } + } + } + else if (block is Markdig.Extensions.Tables.Table) + { + var tableBlock = block as Markdig.Extensions.Tables.Table; + this.DescriptionHtml += "\n\n" + tableBlock.ToMarkdownString() + "\n\n"; + } + //if (enumerator.Current is Markdig.Syntax.LinkReferenceDefinitionGroup) + //{ + // var linkReferenceDefinitionGroup = enumerator.Current as Markdig.Syntax.LinkReferenceDefinitionGroup; + // var linkReferenceDefinition = linkReferenceDefinitionGroup.FirstOrDefault() as Markdig.Syntax.LinkReferenceDefinition; + // var label = linkReferenceDefinition.Label; + // var title = linkReferenceDefinition.Title; + // var url = linkReferenceDefinition.Url; + // if (label == "//") + // { + // return; + // } + //} + enumerator.MoveNext(); + } + + } } } diff --git a/AideDeJeu/AideDeJeu/Models/Spells/SpellVO.cs b/AideDeJeu/AideDeJeu/Models/Spells/SpellVO.cs index 92db8d15..40709454 100644 --- a/AideDeJeu/AideDeJeu/Models/Spells/SpellVO.cs +++ b/AideDeJeu/AideDeJeu/Models/Spells/SpellVO.cs @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Text; using System.Text.RegularExpressions; +using Markdig.Syntax; namespace AideDeJeuLib.Spells { @@ -47,5 +48,10 @@ namespace AideDeJeuLib.Spells } } + + public override void Parse(ref ContainerBlock.Enumerator enumerator) + { + throw new NotImplementedException(); + } } } diff --git a/AideDeJeu/AideDeJeu/Tools/MarkdownExtensions.cs b/AideDeJeu/AideDeJeu/Tools/MarkdownExtensions.cs index 25d54117..c1fefa30 100644 --- a/AideDeJeu/AideDeJeu/Tools/MarkdownExtensions.cs +++ b/AideDeJeu/AideDeJeu/Tools/MarkdownExtensions.cs @@ -43,6 +43,39 @@ namespace AideDeJeu.Tools return md; } + + public static Item ToItem(string md) + { + var pipeline = new MarkdownPipelineBuilder().UsePipeTables().Build(); + var document = Markdig.Parsers.MarkdownParser.Parse(md, pipeline); + var block = document.First(); + var enumerator = document.GetEnumerator(); + { + enumerator.MoveNext(); + while (enumerator.Current != null) + { + if(enumerator.Current is Markdig.Syntax.LinkReferenceDefinitionGroup) + { + var linkReferenceDefinitionGroup = enumerator.Current as Markdig.Syntax.LinkReferenceDefinitionGroup; + var linkReferenceDefinition = linkReferenceDefinitionGroup.FirstOrDefault() as Markdig.Syntax.LinkReferenceDefinition; + var label = linkReferenceDefinition.Label; + var title = linkReferenceDefinition.Title; + var url = linkReferenceDefinition.Url; + if (label == "//") + { + var name = $"AideDeJeuLib.{title}, AideDeJeu"; + var type = Type.GetType(name); + var instance = Activator.CreateInstance(type) as Item; + instance.Parse(ref enumerator); + return instance; + } + } + enumerator.MoveNext(); + } + } + return null; + } + public static IEnumerable ToSpells(this Markdig.Syntax.MarkdownDocument document) where TSpell : Spell, new() { var spells = new List(); diff --git a/AideDeJeu/AideDeJeu/ViewModels/ItemDetailViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/ItemDetailViewModel.cs index 864644cc..76a19e15 100644 --- a/AideDeJeu/AideDeJeu/ViewModels/ItemDetailViewModel.cs +++ b/AideDeJeu/AideDeJeu/ViewModels/ItemDetailViewModel.cs @@ -20,16 +20,10 @@ namespace AideDeJeu.ViewModels } } - public Command LoadItemCommand { get; set; } - public ItemDetailViewModel(Item item = null) { Title = item?.Name; Item = item; - LoadItemCommand = new Command(async () => await ExecuteLoadItemCommand()); - } - async Task ExecuteLoadItemCommand() - { } } diff --git a/AideDeJeu/AideDeJeu/ViewModels/ItemsViewModel.cs b/AideDeJeu/AideDeJeu/ViewModels/ItemsViewModel.cs index 6e3685f5..0d2dce01 100644 --- a/AideDeJeu/AideDeJeu/ViewModels/ItemsViewModel.cs +++ b/AideDeJeu/AideDeJeu/ViewModels/ItemsViewModel.cs @@ -65,7 +65,8 @@ namespace AideDeJeu.ViewModels resourceName = "AideDeJeu.Data.spells_hd.md"; //var md = await Tools.Helpers.GetStringFromUrl("https://raw.githubusercontent.com/Nioux/AideDeJeu/master/Data/spells_hd.md"); var md = await Tools.Helpers.GetResourceStringAsync(resourceName); - _AllItems = Tools.MarkdownExtensions.MarkdownToSpells(md); + _AllItems = Tools.MarkdownExtensions.ToItem(md) as IEnumerable; + //_AllItems = Tools.MarkdownExtensions.MarkdownToSpells(md); } break; case ItemSourceType.ConditionVO: diff --git a/AideDeJeu/AideDeJeu/ViewModels/Navigator.cs b/AideDeJeu/AideDeJeu/ViewModels/Navigator.cs index dc89f168..18658d54 100644 --- a/AideDeJeu/AideDeJeu/ViewModels/Navigator.cs +++ b/AideDeJeu/AideDeJeu/ViewModels/Navigator.cs @@ -36,7 +36,6 @@ namespace AideDeJeu.ViewModels return; var vm = new ItemDetailViewModel(item); - vm.LoadItemCommand.Execute(null); await Navigation.PushAsync(new ItemDetailPage(vm)); } @@ -46,7 +45,6 @@ namespace AideDeJeu.ViewModels // return; //var vm = new ItemDetailViewModel(item); - //vm.LoadItemCommand.Execute(null); await Navigation.PushAsync(new ItemsPage()); } diff --git a/AideDeJeu/AideDeJeu/Views/MainNavigationPage.xaml b/AideDeJeu/AideDeJeu/Views/MainNavigationPage.xaml index 4acc33c5..b14dd340 100644 --- a/AideDeJeu/AideDeJeu/Views/MainNavigationPage.xaml +++ b/AideDeJeu/AideDeJeu/Views/MainNavigationPage.xaml @@ -1,5 +1,5 @@  + x:Class="AideDeJeu.Views.MainNavigationPage" IsBusy="{Binding Main.IsBusy}"> \ No newline at end of file diff --git a/Data/spells_hd.md b/Data/spells_hd.md index 968c33f8..10a0ac16 100644 --- a/Data/spells_hd.md +++ b/Data/spells_hd.md @@ -1,4 +1,8 @@  +[//]: # (Items) + +[SpellHD] +[SpellHD]: # () # Agrandir/rétrécir - NameVO: [Enlarge/Reduce](spells_vo.md#enlargereduce) - CastingTime: 1 action