namespace LAview { namespace Parsers { delegate Parser ParserDelegate (Array links); class Link { public string[] begin { get; set; } public string[] end { get; set; } public unowned ParserDelegate create { get; set; } public Link (string[] begin, string[] end, ParserDelegate? create = null) { this.begin = begin; this.end = end; this.create = create; } } class ParserFactory { public Array group { get; set; default = new Array (); } public virtual TextParser make_text_parser (Array links) { return new TextParser (links); } public virtual LongtableParser make_longtable_parser (Array links) { return new LongtableParser (links); } public virtual GraphicsParser make_graphics_parser (Array links) { return new GraphicsParser (links); } public virtual TabularParser make_tabular_parser (Array links) { return new TabularParser (links); } public ParserFactory () { group.append_val (new Link ({}, {}, links => { return make_text_parser (links); })); group.append_val (new Link ({"\\", "\\begin", "{", "longtable", "}"}, {"\\", "\\end", "{", "longtable", "}"}, links => { return make_longtable_parser (links); })); group.append_val (new Link ({"\\", "\\includegraphics"}, {}, links => { return make_graphics_parser (links); })); group.append_val (new Link ({"\\", "\\begin", "{", "tabular", "}"}, {"\\", "\\end", "{", "tabular", "}"}, links => { return make_tabular_parser (links); })); group.append_val (new Link ({"\\", "\\begin", "{", "tabular", "*", "}"}, {"\\", "\\end", "{", "tabular", "*", "}"}, links => { return make_tabular_parser (links); })); } } } }