Send to your Kindle using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Text.RegularExpressions; using System.Diagnostics; using System.Reflection; namespace X03.PageElements.Notations { abstract public class NotNestable : PageElements.Notation, Plugin.PageElement { public List<PageElements.Plains.Plaintext> ChildrenAsPlaintext { get { return this.Children.Cast<PageElements.Plains.Plaintext>().ToList(); } protected set { this.Children = value.Cast<PageElement>().ToList(); } } new static public IEnumerable<Type> GetPluginClasses() { return Utils.GetPluginClasses(typeof(PageElements.Notations.NotNestable)); } private static PageElement createNotNestableElement(Type notationClass, PageElement parent, List<PageElements.Plains.Plaintext> children) { return (PageElement)Assembly.GetAssembly(notationClass).CreateInstance(notationClass.FullName, false, BindingFlags.CreateInstance, null, new object[] { parent, children }, null, null); } public static List<PageElement> Generate(Type notationClass, PageElement parent, List<PageElement> elements, HashSet<Type> targetClasses) { var ret = new List<PageElement>(elements); var pattern = notationClass.GetField("Pattern", BindingFlags.Static | BindingFlags.Public).GetValue(null) as string; if (pattern == null) return ret; PageElement mergeTarget = null; Match m = null; var idx = 0; while (idx <= ret.Count - 1) { if (ret[idx] is PageElements.Wikitext) { PageElements.Wikitext wikitext = ret[idx] as PageElements.Wikitext; m = Regex.Match(wikitext.ToWikitext(), pattern, RegexOptions.Singleline | RegexOptions.IgnoreCase); if (m.Success) { var subs = new string[] { wikitext.ToWikitext().Substring(0, (m.Index + 1) - 1), m.Value, wikitext.ToWikitext().Substring(m.Index + m.Length) }; var additions = new List<PageElement>(); if (subs[0].Length > 0) additions.Add(new PageElements.Wikitext(subs[0])); // create PageElement if (notationClass.GetMethod("Merge") != null) { // 連結可能Notation Debug.Assert(notationClass.Name != null); if (m.Index == 0 && mergeTarget != null && mergeTarget.GetType().Name == notationClass.Name) { // 連結(既存インスタンスと統合)。新しいインスタンスは生成しない。 notationClass.GetMethod("Merge").Invoke(null, new object[] { parent, new List<PageElements.Plains.Plaintext>() { new PageElements.Plains.Plaintext(parent, subs[1]) }, mergeTarget }); } else { mergeTarget = createNotNestableElement(notationClass, parent, new List<PageElements.Plains.Plaintext>() { new PageElements.Plains.Plaintext(parent, subs[1]) }); additions.Add(mergeTarget); } } else { // 連結しないNotation // 子Elementを持たないのでTokenize不要 additions.Add(createNotNestableElement(notationClass, parent, new List<PageElements.Plains.Plaintext>() { new PageElements.Plains.Plaintext(parent, subs[1]) })); } if (subs[2].Length > 0) additions.Add(new PageElements.Wikitext(subs[2])); ret.RemoveAt(idx); ret.InsertRange(idx, additions); idx += additions.Count - 1 - 1; // 追加された最後の要素を指すように、直後に実行されるidx++に合わせて調整 break; } } else { } idx++; } return ret; } public static string Pattern; public NotNestable(PageElement parent, List<PageElements.Plains.Plaintext> children) : this(parent, children.Cast<PageElement>().ToList()) { } public NotNestable(PageElement parent, List<PageElement> children) : base(parent, children) { } } } using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Text.RegularExpressions; using System.Diagnostics; using System.Reflection; namespace X03.PageElements.Notations { abstract public class NotNestable : PageElements.Notation, Plugin.PageElement { public List<PageElements.Plains.Plaintext> ChildrenAsPlaintext { get { return this.Children.Cast<PageElements.Plains.Plaintext>().ToList(); } protected set { this.Children = value.Cast<PageElement>().ToList(); } } new static public IEnumerable<Type> GetPluginClasses() { return Utils.GetPluginClasses(typeof(PageElements.Notations.NotNestable)); } private static PageElement createNotNestableElement(Type notationClass, PageElement parent, List<PageElements.Plains.Plaintext> children) { return (PageElement)Assembly.GetAssembly(notationClass).CreateInstance(notationClass.FullName, false, BindingFlags.CreateInstance, null, new object[] { parent, children }, null, null); } public static List<PageElement> Generate(Type notationClass, PageElement parent, List<PageElement> elements, HashSet<Type> targetClasses) { var ret = new List<PageElement>(elements); var pattern = notationClass.GetField("Pattern", BindingFlags.Static | BindingFlags.Public).GetValue(null) as string; if (pattern == null) return ret; PageElement mergeTarget = null; Match m = null; var idx = 0; while (idx <= ret.Count - 1) { if (ret[idx] is PageElements.Wikitext) { PageElements.Wikitext wikitext = ret[idx] as PageElements.Wikitext; m = Regex.Match(wikitext.ToWikitext(), pattern, RegexOptions.Singleline | RegexOptions.IgnoreCase); if (m.Success) { var subs = new string[] { wikitext.ToWikitext().Substring(0, (m.Index + 1) - 1), m.Value, wikitext.ToWikitext().Substring(m.Index + m.Length) }; var additions = new List<PageElement>(); if (subs[0].Length > 0) additions.Add(new PageElements.Wikitext(subs[0])); // create PageElement if (notationClass.GetMethod("Merge") != null) { // 連結可能Notation Debug.Assert(notationClass.Name != null); if (m.Index == 0 && mergeTarget != null && mergeTarget.GetType().Name == notationClass.Name) { // 連結(既存インスタンスと統合)。新しいインスタンスは生成しない。 notationClass.GetMethod("Merge").Invoke(null, new object[] { parent, new List<PageElements.Plains.Plaintext>() { new PageElements.Plains.Plaintext(parent, subs[1]) }, mergeTarget }); } else { mergeTarget = createNotNestableElement(notationClass, parent, new List<PageElements.Plains.Plaintext>() { new PageElements.Plains.Plaintext(parent, subs[1]) }); additions.Add(mergeTarget); } } else { // 連結しないNotation // 子Elementを持たないのでTokenize不要 additions.Add(createNotNestableElement(notationClass, parent, new List<PageElements.Plains.Plaintext>() { new PageElements.Plains.Plaintext(parent, subs[1]) })); } if (subs[2].Length > 0) additions.Add(new PageElements.Wikitext(subs[2])); ret.RemoveAt(idx); ret.InsertRange(idx, additions); idx += additions.Count - 1 - 1; // 追加された最後の要素を指すように、直後に実行されるidx++に合わせて調整 break; } } else { } idx++; } return ret; } public static string Pattern; public NotNestable(PageElement parent, List<PageElements.Plains.Plaintext> children) : this(parent, children.Cast<PageElement>().ToList()) { } public NotNestable(PageElement parent, List<PageElement> children) : base(parent, children) { } } }