7ed05abdb8
- Introduced modularity by splitting Beam into new projects: Beam.Abstractions, Beam.Models, and Beam.Downloaders. - Refactored existing classes into appropriate namespaces and projects. - Replaced specific implementations with abstractions (e.g., SourceLinkBuilder to LinkBuilder, State to IState, etc.). - Updated interfaces: added ITemplate, IArticleData, IDownloadReport, and others for improved extensibility. - Removed deprecated classes like SourceLinkBuilder and StateChangerFactory. - Enhanced link handling in downloaders by refactoring to use `string` over `SourceLink`. - Consolidated shared logic under Beam.Abstractions.
521 lines
27 KiB
C#
521 lines
27 KiB
C#
//
|
||
//
|
||
// using aeqw89.DataKeys;
|
||
// using Beam.Dynamic;
|
||
// using System;
|
||
// using System.Collections.Generic;
|
||
// using System.Linq;
|
||
// using System.Runtime.CompilerServices;
|
||
// using System.Text;
|
||
// using System.Threading.Tasks;
|
||
// using Beam.Data;
|
||
// using Beam.Fluent;
|
||
// using Beam.Models;
|
||
// using Beam.Models.Public_Concrete;
|
||
//
|
||
// namespace Beam.Temporary.Cli {
|
||
//
|
||
// public static class NovelStatics {
|
||
// //public static void Define_LightNovelWorld_Novel_TheLegendaryMechanic(SharedDataDictionary sdd) {
|
||
// // var lnwAggregator = new DataKey<WebResource>("aeqw89:document:aggregators:light_novel_world");
|
||
// // var lnwAuxiliary = new DataKey<WebResource>("aeqw89:document:auxillaries:light_novel_world");
|
||
// // var novel = new TextResource() {
|
||
// // Key = new DataKey<TextResource>("novels:the_legendary_mechanic"),
|
||
// // AssociatedSource = lnwAggregator,
|
||
// // AssociatedMetaSource = lnwAuxiliary,
|
||
// // TemplateInitialData = ["the-legendary-mechanic-245", "1"],
|
||
// // MetaTemplateInitialData = ["the-legendary-mechanic"]
|
||
// // };
|
||
// // sdd.Novels.TryAdd(novel.Key, novel);
|
||
//
|
||
// // sdd.AggregatorNovels.TryAdd(lnwAggregator, [novel.Key]);
|
||
// //}
|
||
//
|
||
// //public static void Define_LightNovelWorl_Novel_IAloneLevelUp(SharedDataDictionary sdd) {
|
||
// // var lnwAggregator = new DataKey("light_novel_world").ToAggregator().As<WebResource>();
|
||
// // var lnwAuxiliary = new DataKey("light_novel_world").ToAuxiliary().As<WebResource>();
|
||
// // var novel = new TextResource() {
|
||
// // Key = new DataKey<TextResource>("novels:i_alone_level_up"),
|
||
// // AssociatedSource = lnwAggregator,
|
||
// // AssociatedMetaSource = lnwAuxiliary,
|
||
// // TemplateInitialData = ["i-alone-level-up-236", "1"],
|
||
// // MetaTemplateInitialData = ["i-alone-level-up-solo-leveling-05122225"]
|
||
// // };
|
||
//
|
||
// // sdd.Novels.TryAdd(novel.Key, novel);
|
||
//
|
||
// // sdd.AggregatorNovels.TryAdd(lnwAggregator, [novel.Key]);
|
||
// //}
|
||
//
|
||
// //// -----------------------------------------------------------------------------
|
||
// //// Helper: same as in the WoDuShu file
|
||
// //private static (DataKey<T>, DataKey<T>) CreateKeyPair<T>(
|
||
// // string pref1, string pref2, string common, string @namespace) {
|
||
// // return (
|
||
// // new DataKey<T>($"{pref1}:{common}").WithNamespace(@namespace),
|
||
// // new DataKey<T>($"{pref2}:{common}").WithNamespace(@namespace)
|
||
// // );
|
||
// //}
|
||
//
|
||
// // -----------------------------------------------------------------------------
|
||
// // 1) Site-wide definition – YeBiQuge (m.yebiquge.com)
|
||
// public static void Define_YeBiQuge(BeamDataContext sdd) {
|
||
// // ---------- keys ----------
|
||
// var yb = new DataKey<WebResource>("aeqw89:yebiquge");
|
||
//
|
||
// var bindings = new DataKey<DataBindings>($"aeqw89:yebiquge:{nameof(IDocument).ToLower()}:bindings");
|
||
// var bindings_info = new DataKey<DataBindings>($"aeqw89:yebiquge:{nameof(ArticleData).ToLower()}:bindings");
|
||
// var bindings_toc = new DataKey<DataBindings>($"aeqw89:yebiquge:{nameof(TableOfContentsData).ToLower()}:bindings");
|
||
//
|
||
// // ---------- web resources ----------
|
||
// var aggregator = new WebResource(yb.InsertEnd(nameof(IDocument).ToLower())) {
|
||
// Name = "YeBiQuge – Chapters",
|
||
// Description = "Chapter pages (mobile)",
|
||
// Domain = "https://m.yebiquge.com",
|
||
// Bindings = bindings
|
||
// };
|
||
//
|
||
// var bookInfo = new WebResource(yb.InsertEnd(nameof(ArticleData).ToLower())) {
|
||
// Name = "YeBiQuge – Book Info",
|
||
// Description = "Book information / latest updates page",
|
||
// Domain = "https://m.yebiquge.com",
|
||
// Bindings = bindings_info
|
||
// };
|
||
//
|
||
// var tocPage = new WebResource(yb.InsertEnd(nameof(TableOfContentsData).ToLower())) {
|
||
// Name = "YeBiQuge – TOC",
|
||
// Description = "Full chapter list (index*.html)",
|
||
// Domain = "https://m.yebiquge.com",
|
||
// Bindings = bindings_toc
|
||
// };
|
||
//
|
||
// sdd.Resources.TryAdd(aggregator.Key, aggregator);
|
||
// sdd.Resources.TryAdd(bookInfo.Key, bookInfo);
|
||
// sdd.Resources.TryAdd(tocPage.Key, tocPage);
|
||
//
|
||
// // ---------- URL templates ----------
|
||
// // 1-a) Chapter page /{catId}/{bookId}/{chapterId}.html
|
||
// sdd.Templates.TryAdd(aggregator.Key, new() {
|
||
// Factory = new(StateChangerFactory.LastAsNumber),
|
||
// Builder = new LinkBuilder("m.yebiquge.com")
|
||
// .WithSegments("", "", "") // /<cat>/<book>/<chap>
|
||
// .WithParameters(0, "")
|
||
// .WithParameters(1, "")
|
||
// .WithParameters(2, (".html", Position.After)) // chapId.html
|
||
// });
|
||
//
|
||
// // 1-b) Book-info page /{catId}/{bookId}/
|
||
// sdd.Templates.TryAdd(bookInfo.Key, new() {
|
||
// Factory = new(StateChangerFactory.Constant),
|
||
// Builder = new LinkBuilder("m.yebiquge.com")
|
||
// .WithSegments("", "") // /<cat>/<book>/
|
||
// .WithParameters(0, "")
|
||
// .WithParameters(1, "")
|
||
// });
|
||
//
|
||
// // 1-c) TOC page /{catId}/{bookId}/index.html (first page)
|
||
// sdd.Templates.TryAdd(tocPage.Key, new() {
|
||
// Factory = new(StateChangerFactory.Constant),
|
||
// Builder = new LinkBuilder("m.yebiquge.com")
|
||
// .WithSegments("", "", "index.html") // /<cat>/<book>/index.html
|
||
// .WithParameters(0, "")
|
||
// .WithParameters(1, "")
|
||
// });
|
||
//
|
||
// // ---------- bindings ----------
|
||
// // ── chapter page ────────────────────────────────────────────────
|
||
// sdd.Bindings.Add(bindings, new() {
|
||
// Title = new ContentsDataProvider {
|
||
// Content = new Binding { XPath = "//*[@id='nr_title']" }
|
||
// },
|
||
// Content = new ParagraphedContentDataProvider {
|
||
// Content = new Binding { XPath = "//*[@id='chaptercontent']" }
|
||
// },
|
||
// });
|
||
//
|
||
// // ── book-info page ──────────────────────────────────────────────
|
||
// sdd.Bindings.Add(bindings_info, new() {
|
||
// Title = new ContentsDataProvider {
|
||
// Content = new Binding { XPath = "//div[@class='book_info']//dt[@class='name']" }
|
||
// },
|
||
// Authors = new ContentsArrayDataProvider {
|
||
// Content = new Binding {
|
||
// XPath = "//div[@class='book_info']//span[contains(text(),'作者')]"
|
||
// }
|
||
// },
|
||
// Description = new ParagraphedContentDataProvider {
|
||
// Content = new Binding { XPath = "//div[@class='book_about']/dl/dd" }
|
||
// }
|
||
// });
|
||
//
|
||
// // ── TOC page ────────────────────────────────────────────────────
|
||
// sdd.Bindings.Add(bindings_toc, new() {
|
||
// PagesDropDown = new DropDownDataProvider {
|
||
// Content = new Binding { XPath = "//div[@class='fenye']//select" },
|
||
// RelativeTo = tocPage.Domain
|
||
// },
|
||
// TableOfContents = new AnchorCollectionDataProvider {
|
||
// Content = new Binding { XPath = "//div[@class='book_last']/dl" },
|
||
// RelativeTo = tocPage.Domain
|
||
// }
|
||
// });
|
||
// }
|
||
//
|
||
// // -----------------------------------------------------------------------------
|
||
// // 2) Concrete novel – 《诡秘之主》 / Lord of the Mysteries
|
||
// public static void Define_YeBiQuge_LordOfMysteries(BeamDataContext sdd) {
|
||
// var yb = new DataKey<WebResource>("aeqw89:yebiquge:novels:lord_of_the_mysteries");
|
||
// var ybAgg = yb.InsertEnd(nameof(IDocument).ToLower());
|
||
// var ybInfo = yb.InsertEnd(nameof(ArticleData).ToLower());
|
||
// var ybToc = yb.InsertEnd(nameof(TableOfContentsData).ToLower());
|
||
//
|
||
// var novel = new ResourceDictionary {
|
||
// Key = yb.To<ResourceDictionary>(),
|
||
// FriendlyName = "Lord of the Mysteries",
|
||
// Resources = {
|
||
// { nameof(IDocument) , ybAgg }, // chapters
|
||
// { nameof(ArticleData) , ybInfo }, // book info
|
||
// { nameof(TableOfContentsData), ybToc } // full TOC
|
||
// },
|
||
//
|
||
// // catId = 2 , bookId = 2958 , sample chapterId = 8699808
|
||
// InitialStates = new Dictionary<DataKey<WebResource>, ImmutableState> {
|
||
// { ybAgg, new ImmutableState(["2","2958","8699808"]) },
|
||
// { ybInfo, new ImmutableState(["2","2958"]) },
|
||
// { ybToc, new ImmutableState(["2","2958"]) },
|
||
// }
|
||
// };
|
||
//
|
||
// sdd.ResourceDictionaries.TryAdd(novel.Key, novel);
|
||
// sdd.AggregatorNovels.TryAdd(ybAgg, [novel.Key]);
|
||
// }
|
||
//
|
||
//
|
||
// // -----------------------------------------------------------------------------
|
||
// // 1) Site-wide definition – KuaiShu5 (www.kuaishu5.com)
|
||
// public static void Define_KuaiShu5(BeamDataContext sdd) {
|
||
// // ---------- keys ----------
|
||
// var ks = new DataKey<WebResource>("aeqw89:kuaishu5");
|
||
//
|
||
// var bindings_chapter = new DataKey<DataBindings>($"aeqw89:kuaishu5:{nameof(IDocument).ToLower()}:bindings");
|
||
// var bindings_info = new DataKey<DataBindings>($"aeqw89:kuaishu5:{nameof(ArticleData).ToLower()}:bindings");
|
||
// var bindings_toc = new DataKey<DataBindings>($"aeqw89:kuaishu5:{nameof(TableOfContentsData).ToLower()}:bindings");
|
||
//
|
||
// // ---------- web resources ----------
|
||
// var chapters = new WebResource(ks.InsertEnd(nameof(IDocument).ToLower())) {
|
||
// Name = "KuaiShu5 – Chapters",
|
||
// Description = "Chapter pages",
|
||
// Domain = "https://www.kuaishu5.com",
|
||
// Bindings = bindings_chapter
|
||
// };
|
||
//
|
||
// var bookInfo = new WebResource(ks.InsertEnd(nameof(ArticleData).ToLower())) {
|
||
// Name = "KuaiShu5 – Book Info",
|
||
// Description = "Book information / landing page",
|
||
// Domain = "https://www.kuaishu5.com",
|
||
// Bindings = bindings_info
|
||
// };
|
||
//
|
||
// var tocPage = new WebResource(ks.InsertEnd(nameof(TableOfContentsData).ToLower())) {
|
||
// Name = "KuaiShu5 – TOC",
|
||
// Description = "Full chapter list (index page)",
|
||
// Domain = "https://www.kuaishu5.com",
|
||
// Bindings = bindings_toc
|
||
// };
|
||
//
|
||
// sdd.Resources.TryAdd(chapters.Key, chapters);
|
||
// sdd.Resources.TryAdd(bookInfo.Key, bookInfo);
|
||
// sdd.Resources.TryAdd(tocPage.Key, tocPage);
|
||
//
|
||
// // ---------- URL templates ----------
|
||
// // 1-a) Chapter page /b{bookId}/{chapterId}.html
|
||
// sdd.Templates.TryAdd(chapters.Key, new() {
|
||
// Factory = new(StateChangerFactory.LastAsNumber),
|
||
// Builder = new LinkBuilder("www.kuaishu5.com")
|
||
// .WithSegments("", "") // /<seg0>/<seg1>
|
||
// .WithParameters(0, ("b", Position.Before)) // seg0: b{bookId}
|
||
// .WithParameters(1, (".html", Position.After)) // seg1: {chapterId}.html
|
||
// });
|
||
//
|
||
// // 1-b) Book-info page /b{bookId}/
|
||
// sdd.Templates.TryAdd(bookInfo.Key, new() {
|
||
// Factory = new(StateChangerFactory.Constant),
|
||
// Builder = new LinkBuilder("www.kuaishu5.com")
|
||
// .WithSegments("") // /<seg0>
|
||
// .WithParameters(0, ("b", Position.Before)) // seg0: b{bookId}
|
||
// });
|
||
//
|
||
// // 1-c) TOC page /b{bookId}/ (same as book-info)
|
||
// sdd.Templates.TryAdd(tocPage.Key, new() {
|
||
// Factory = new(StateChangerFactory.Constant),
|
||
// Builder = new LinkBuilder("www.kuaishu5.com")
|
||
// .WithSegments("") // /<seg0>
|
||
// .WithParameters(0, ("b", Position.Before)) // seg0: b{bookId}
|
||
// });
|
||
//
|
||
// // ---------- bindings ----------
|
||
// // ── chapter page ────────────────────────────────────────────────
|
||
// sdd.Bindings.Add(bindings_chapter, new() {
|
||
// Title = new ContentsDataProvider {
|
||
// Content = new Binding { XPath = "//h1[@class='bookname']" }
|
||
// },
|
||
// Content = new ParagraphedContentDataProvider {
|
||
// Content = new Binding { XPath = "//*[@id='booktxt']" }
|
||
// }
|
||
// });
|
||
//
|
||
// // ── book-info page ──────────────────────────────────────────────
|
||
// sdd.Bindings.Add(bindings_info, new() {
|
||
// Title = new ContentsDataProvider {
|
||
// Content = new Binding { XPath = "//*[@id='info']/h1" }
|
||
// },
|
||
// Authors = new ContentsArrayDataProvider {
|
||
// Content = new Binding {
|
||
// XPath = "//*[@id='info']//p[contains(text(),'作者')]/a"
|
||
// }
|
||
// },
|
||
// Description = new ParagraphedContentDataProvider {
|
||
// Content = new Binding { XPath = "//*[@id='intro']" }
|
||
// }
|
||
// });
|
||
//
|
||
// // ── TOC page ────────────────────────────────────────────────────
|
||
// sdd.Bindings.Add(bindings_toc, new() {
|
||
// PagesDropDown = new DropDownDataProvider {
|
||
// Content = new Binding { XPath = "//*[@id='indexselect']" },
|
||
// RelativeTo = tocPage.Domain
|
||
// },
|
||
// TableOfContents = new AnchorCollectionDataProvider {
|
||
// Content = new Binding { XPath = "//*[@id='content_1']" },
|
||
// RelativeTo = tocPage.Domain
|
||
// }
|
||
// });
|
||
// }
|
||
//
|
||
// // -----------------------------------------------------------------------------
|
||
// // 2) Concrete novel – 《诡秘之主》 / Lord of the Mysteries
|
||
// public static void Define_KuaiShu5_LordOfMysteries(BeamDataContext sdd) {
|
||
// var ks = new DataKey<WebResource>("aeqw89:kuaishu5");
|
||
// var ksChapters = ks.InsertEnd(nameof(IDocument).ToLower());
|
||
// var ksInfo = ks.InsertEnd(nameof(ArticleData).ToLower());
|
||
// var ksToc = ks.InsertEnd(nameof(TableOfContentsData).ToLower());
|
||
//
|
||
// var novel = new ResourceDictionary {
|
||
// Key = new DataKey<ResourceDictionary>("kuaishu5:novels:lord_of_the_mysteries"),
|
||
// FriendlyName = "Lord of the Mysteries",
|
||
// Resources =
|
||
// {
|
||
// { nameof(IDocument) , ksChapters },
|
||
// { nameof(ArticleData) , ksInfo },
|
||
// { nameof(TableOfContentsData), ksToc }
|
||
// }
|
||
// };
|
||
//
|
||
// // bookId = 122722 , sample chapterId = 288372
|
||
// sdd.InitialStates = new Dictionary<DataKey<ImmutableState>, ImmutableState>
|
||
// {
|
||
// { ksChapters.To<ImmutableState>(), new ImmutableState(["122722", "288372"]) },
|
||
// { ksInfo .To<ImmutableState>(), new ImmutableState(["122722"]) },
|
||
// { ksToc .To<ImmutableState>(), new ImmutableState(["122722"]) }
|
||
// };
|
||
//
|
||
// sdd.ResourceDictionaries.TryAdd(novel.Key, novel);
|
||
// sdd.AggregatorNovels.TryAdd(ksChapters, [novel.Key]);
|
||
// }
|
||
// //public static void Define_WoDuShu_HouseOfHorrors(BeamDataDictionary sdd) {
|
||
// // var (wdsAgg, wdsAux) = CreateKeyPair<WebResource>("aggregators", "auxillaries", "wodushu", "aeqw89:document");
|
||
// // var novel = new ResourceDictionary() {
|
||
// // Key = new DataKey<ResourceDictionary>("novels:house_of_horrors"),
|
||
// // FriendlyName = "My House Of Horrors",
|
||
// // AssociatedSource = wdsAgg,
|
||
// // AssociatedMetaSource = wdsAux,
|
||
// // TemplateInitialData = new ImmutableState(["24349", "2896325"]),
|
||
// // MetaTemplateInitialData = new ImmutableState(["24349"])
|
||
// // };
|
||
//
|
||
// // sdd.ResourceDictionaries.TryAdd(novel.Key, novel);
|
||
//
|
||
// // sdd.AggregatorNovels.TryAdd(wdsAgg, [novel.Key]);
|
||
// //}
|
||
//
|
||
// private static (DataKey<T>, DataKey<T>) CreateKeyPair<T>(string pref1, string pref2, string common, string @namespace) {
|
||
// return (
|
||
// new DataKey<T>(pref1 + ":" + common).InsertStart(@namespace),
|
||
// new DataKey<T>(pref2 + ":" + common).InsertStart(@namespace)
|
||
// );
|
||
// }
|
||
//
|
||
// //public static void Define_WoDuShu(BeamDataDictionary sdd) {
|
||
// // var (wdsAgg, wdsAux) = CreateKeyPair<WebResource>("aggregators", "auxillaries", "wodushu", "aeqw89:document");
|
||
// // var bindings = new DataKey<DataBindings>("aeqw89:bindings:wodushu");
|
||
// // var aggregator = new WebResource(wdsAgg) {
|
||
// // Name = "WoDuShu.com",
|
||
// // Description = "A Chinese novel aggregator site",
|
||
// // Domain = "https://wodushu.com",
|
||
// // Bindings = bindings
|
||
// // };
|
||
// // var auxiliary = new WebResource(wdsAux) {
|
||
// // Name = "WoDuShu.com",
|
||
// // Description = "A Chinese novel aggregator site",
|
||
// // Domain = "https://wodushu.com",
|
||
// // Bindings = bindings.WithSuffix("_aux")
|
||
// // };
|
||
//
|
||
// // sdd.Templates.TryAdd(wdsAgg, new() {
|
||
// // Factory = new(StateChangerFactory.LastAsNumber),
|
||
// // Builder = new SourceLinkBuilder("www.wodushu.com")
|
||
// // .WithSegments("read", "", "")
|
||
// // .WithParameters(1, "")
|
||
// // .WithParameters(2, (".html", Position.After))
|
||
// // });
|
||
// // sdd.Templates.TryAdd(wdsAux, new() {
|
||
// // Factory = new(StateChangerFactory.Constant),
|
||
// // Builder = new SourceLinkBuilder("www.wodushu.com")
|
||
// // .WithSegments("book", "")
|
||
// // .WithParameters(1, "")
|
||
// // });
|
||
//
|
||
// // sdd.Resources.TryAdd(wdsAgg, aggregator);
|
||
// // sdd.Auxillaries.TryAdd(wdsAux, auxiliary);
|
||
//
|
||
// // var binding_agg = new DataKey<DataBindings>("aeqw89:bindings:wodushu");
|
||
// // var binding_aux = new DataKey<DataBindings>("aeqw89:bindings:wodushu_aux");
|
||
//
|
||
// // sdd.Bindings.Add(binding_agg, new() {
|
||
// // Title = new ContentsDataProvider() {
|
||
// // Content = new Binding() {
|
||
// // XPath = "/html/body/div[4]/div/div/div[2]/h1"
|
||
// // }
|
||
// // },
|
||
//
|
||
// // Content = new ParagraphedContentDataProvider() {
|
||
// // Content = new Binding() {
|
||
// // XPath = "//*[@id=\"content\"]"
|
||
// // }
|
||
// // },
|
||
// // });
|
||
//
|
||
// // sdd.Bindings.Add(binding_aux, new() {
|
||
// // Title = new ContentsDataProvider() {
|
||
// // Content = new Binding() {
|
||
// // XPath = "/html/body/div[3]/div[1]/div/div/div[2]/div[1]/h1"
|
||
// // }
|
||
// // },
|
||
// // Authors = new ContentsArrayDataProvider() {
|
||
// // Content = new Binding() {
|
||
// // XPath = "/html/body/div[3]/div[1]/div/div/div[2]/div[1]/div/p[1]/a"
|
||
// // }
|
||
// // },
|
||
// // Description = new ParagraphedContentDataProvider() {
|
||
// // Content = new Binding() {
|
||
// // XPath = "/html/body/div[3]/div[1]/div/div/div[2]/div[2]"
|
||
// // }
|
||
// // },
|
||
// // });
|
||
// //}
|
||
//
|
||
// //public static void Define_NovelFull(SharedDataDictionary sdd) {
|
||
// // var docNamespace = "aeqw89:document";
|
||
// // var nfAgg = new DataKey<WebResource>("aggregators:novel_full").WithNamespace(docNamespace);
|
||
// // var nfAux = new DataKey<WebResource>("auxillaries:novel_full").WithNamespace(docNamespace);
|
||
// // var nfBindings = new DataKey<DataBindings>("aeqw89:bindings:light_novel_world");
|
||
// // var aggregator = new WebResource(nfAgg) {
|
||
// // Name = "Novel Full",
|
||
// // Description = "A novel aggregator site",
|
||
// // Domain = "https://novelfull.net",
|
||
// // Bindings = nfBindings
|
||
// // };
|
||
// // var auxiliary = new WebResource(nfAux) {
|
||
// // Name = "Novel Full",
|
||
// // Description = "A novel aggregator site",
|
||
// // Domain = "https://novelfull.net",
|
||
// // Bindings = nfBindings.WithSuffix("_aux")
|
||
// // };
|
||
//
|
||
// // sdd.Templates.TryAdd(nfAux, new(StateChangerFactory.LastAsNumberPrefixed));
|
||
//
|
||
// // sdd.Aggregators.TryAdd(nfAgg, aggregator);
|
||
// // sdd.Auxillaries.TryAdd(nfAux, auxiliary);
|
||
//
|
||
// // var binding_agg = new DataKey<DataBindings>("aeqw89:bindings:be")
|
||
//
|
||
// //}
|
||
//
|
||
// //public static void Define_LightNovelWorld(SharedDataDictionary sdd) {
|
||
// // var lnwAggregator = new DataKey<WebResource>("aeqw89:document:aggregators:light_novel_world");
|
||
// // var lnwAuxiliary = new DataKey<WebResource>("aeqw89:document:auxillaries:light_novel_world");
|
||
// // const string lnwBindingsA = "aeqw89:bindings:light_novel_world";
|
||
// // var aggregator = new WebResource(lnwAggregator) {
|
||
// // Name = "Light Novel World",
|
||
// // Description = "A novel aggregator site maintained by NetherClaw",
|
||
// // Domain = "https://www.lightnovelworld.co",
|
||
// // Bindings = new DataKey<DataBindings>(lnwBindingsA)
|
||
// // };
|
||
// // const string lnwBindingsB = "aeqw89:bindings:light_novel_world_aux";
|
||
// // var auxiliary = new WebResource(lnwAuxiliary) {
|
||
// // Name = "Light Novel World",
|
||
// // Description = "A novel aggregator site maintained by NetherClaw",
|
||
// // Domain = "https://www.lightnovelworld.co",
|
||
// // Bindings = new DataKey<DataBindings>(lnwBindingsB)
|
||
// // };
|
||
//
|
||
// // sdd.Templates.TryAdd(lnwAuxiliary, new() {
|
||
// // Template = "https://www.lightnovelworld.co/novel/{0}",
|
||
// // IndexOfChapterIndex = -1
|
||
// // });
|
||
// // sdd.Templates.TryAdd(lnwAggregator, new() {
|
||
// // Template = "https://www.lightnovelworld.co/novel/{0}/chapter-{1}",
|
||
// // IndexOfChapterIndex = 1
|
||
// // });
|
||
//
|
||
// // sdd.Aggregators.TryAdd(aggregator.Key, aggregator);
|
||
// // sdd.Auxillaries.TryAdd(auxiliary.Key, auxiliary);
|
||
//
|
||
// // var lnwBindings = new DataKey<DataBindings>(lnwBindingsA);
|
||
// // var lnwBindingsAux = new DataKey<DataBindings>(lnwBindingsB);
|
||
// // sdd.Bindings.TryAdd(lnwBindings, new DataBindings() {
|
||
// // Title = new Binding("aeqw89:binding:light_novel_world:title") {
|
||
// // XPath = "/html/body/main/article/section/div[1]/h1/span[2]",
|
||
// // Type = BindingType.Single
|
||
// // },
|
||
// // Content = new("aeqw89:binding:light_novel_world:content") {
|
||
// // Provider = new ParagraphedContentDataProvider() {
|
||
// // Content = new Binding() {
|
||
// // XPath = "//*[@id=\"chapter-container\"]"
|
||
// // }
|
||
// // },
|
||
// // Type = BindingType.UseProvider
|
||
// // },
|
||
// // });
|
||
// // sdd.Bindings.TryAdd(lnwBindingsAux, new DataBindings() {
|
||
// // Title = new("aeqw89:binding:light_novel_world_aux:title") {
|
||
// // XPath = "/html/body/main/article/header/div[2]/div[2]/div[1]/h1",
|
||
// // Type = BindingType.Single
|
||
// // },
|
||
// // Authors = new("aeqw89:binding:light_novel_world_aux:authors") {
|
||
// // XPath = "/html/body/main/article/header/div[2]/div[2]/div[1]/div[1]/a",
|
||
// // Type = BindingType.Single
|
||
// // },
|
||
// // Description = new("aeqw89:binding:light_novel_world_aux:description") {
|
||
// // Provider = new ParagraphedContentDataProvider() {
|
||
// // Content = new() {
|
||
// // XPath = "/html/body/main/article/div/section/div[1]/div"
|
||
// // }
|
||
// // },
|
||
// // Type = BindingType.UseProvider
|
||
// // },
|
||
// // Tags = new("aeqw89:binding:light_novel_world_aux:tags") {
|
||
// // Provider = new ListContentDataProvider() {
|
||
// // Content = new() {
|
||
// // XPath = "/html/body/main/article/header/div[2]/div[2]/div[3]/ul"
|
||
// // }
|
||
// // },
|
||
// // Type = BindingType.UseProvider
|
||
// // }
|
||
// // });
|
||
// //}
|
||
//
|
||
//
|
||
// }
|
||
// }
|