part of 'comic_source.dart'; class CategoryData { /// The title is displayed in the tab bar. final String title; /// 当使用中文语言时, 英文的分类标签将在构建页面时被翻译为中文 final List categories; final bool enableRankingPage; final String key; final List buttons; /// Data class for building category page. const CategoryData({ required this.title, required this.categories, required this.enableRankingPage, required this.key, this.buttons = const [], }); } class CategoryButtonData { final String label; final void Function() onTap; const CategoryButtonData({ required this.label, required this.onTap, }); } abstract class BaseCategoryPart { String get title; List get categories; List? get categoryParams => null; bool get enableRandom; String get categoryType; /// Data class for building a part of category page. const BaseCategoryPart(); } class FixedCategoryPart extends BaseCategoryPart { @override final List categories; @override bool get enableRandom => false; @override final String title; @override final String categoryType; @override final List? categoryParams; /// A [BaseCategoryPart] that show fixed tags on category page. const FixedCategoryPart(this.title, this.categories, this.categoryType, [this.categoryParams]); } class RandomCategoryPart extends BaseCategoryPart { final List tags; final int randomNumber; @override final String title; @override bool get enableRandom => true; @override final String categoryType; List _categories() { if (randomNumber >= tags.length) { return tags; } var start = math.Random().nextInt(tags.length - randomNumber); return tags.sublist(start, start + randomNumber); } @override List get categories => _categories(); /// A [BaseCategoryPart] that show random tags on category page. const RandomCategoryPart( this.title, this.tags, this.randomNumber, this.categoryType); } class RandomCategoryPartWithRuntimeData extends BaseCategoryPart { final Iterable Function() loadTags; final int randomNumber; @override final String title; @override bool get enableRandom => true; @override final String categoryType; static final random = math.Random(); List _categories() { var tags = loadTags(); if (randomNumber >= tags.length) { return tags.toList(); } final start = random.nextInt(tags.length - randomNumber); var res = List.filled(randomNumber, ''); int index = -1; for (var s in tags) { index++; if (start > index) { continue; } else if (index == start + randomNumber) { break; } res[index - start] = s; } return res; } @override List get categories => _categories(); /// A [BaseCategoryPart] that show random tags on category page. RandomCategoryPartWithRuntimeData( this.title, this.loadTags, this.randomNumber, this.categoryType); } CategoryData getCategoryDataWithKey(String key) { for (var source in ComicSource._sources) { if (source.categoryData?.key == key) { return source.categoryData!; } } throw "Unknown category key $key"; }