implement user bangs

This commit is contained in:
Fabian Freund
2025-11-21 05:27:44 +01:00
parent d764149759
commit 23b758e729
32 changed files with 3428 additions and 67 deletions
@@ -21,6 +21,7 @@ import 'package:copy_with_extension/copy_with_extension.dart';
import 'package:drift/drift.dart' show Expression, Insertable, Value;
import 'package:fast_equatable/fast_equatable.dart';
import 'package:json_annotation/json_annotation.dart';
import 'package:weblibre/extensions/uri.dart';
import 'package:weblibre/features/bangs/data/database/definitions.drift.dart';
import 'package:weblibre/features/bangs/data/models/bang_group.dart';
@@ -83,6 +84,8 @@ class Bang with FastEquatable implements Insertable<Bang> {
@JsonKey(name: 'ts')
final Set<String>? additionalTriggers;
final bool searxngApi;
String formatQuery(String input) {
return (format == null ||
format!.contains(BangFormat.urlEncodePlaceholder) == true)
@@ -92,6 +95,7 @@ class Bang with FastEquatable implements Insertable<Bang> {
: Uri.encodeComponent(input)
: input;
}
Uri getDefaultUrl() {
return getTemplateUrl('');
}
@@ -108,6 +112,10 @@ class Bang with FastEquatable implements Insertable<Bang> {
).replace(path: template.path, query: template.query);
}
if (format?.contains(BangFormat.openBasePath) == true) {
return template.base;
}
return template;
}
@@ -124,6 +132,7 @@ class Bang with FastEquatable implements Insertable<Bang> {
required this.domain,
required this.trigger,
required this.urlTemplate,
required this.searxngApi,
this.group,
this.category,
this.subCategory,
@@ -146,6 +155,7 @@ class Bang with FastEquatable implements Insertable<Bang> {
subCategory,
format,
additionalTriggers,
searxngApi,
];
@override
@@ -15,6 +15,8 @@ abstract class _$BangCWProxy {
Bang urlTemplate(String urlTemplate);
Bang searxngApi(bool searxngApi);
Bang group(BangGroup? group);
Bang category(String? category);
@@ -37,6 +39,7 @@ abstract class _$BangCWProxy {
String domain,
String trigger,
String urlTemplate,
bool searxngApi,
BangGroup? group,
String? category,
String? subCategory,
@@ -64,6 +67,9 @@ class _$BangCWProxyImpl implements _$BangCWProxy {
@override
Bang urlTemplate(String urlTemplate) => call(urlTemplate: urlTemplate);
@override
Bang searxngApi(bool searxngApi) => call(searxngApi: searxngApi);
@override
Bang group(BangGroup? group) => call(group: group);
@@ -93,6 +99,7 @@ class _$BangCWProxyImpl implements _$BangCWProxy {
Object? domain = const $CopyWithPlaceholder(),
Object? trigger = const $CopyWithPlaceholder(),
Object? urlTemplate = const $CopyWithPlaceholder(),
Object? searxngApi = const $CopyWithPlaceholder(),
Object? group = const $CopyWithPlaceholder(),
Object? category = const $CopyWithPlaceholder(),
Object? subCategory = const $CopyWithPlaceholder(),
@@ -118,6 +125,11 @@ class _$BangCWProxyImpl implements _$BangCWProxy {
? _value.urlTemplate
// ignore: cast_nullable_to_non_nullable
: urlTemplate as String,
searxngApi:
searxngApi == const $CopyWithPlaceholder() || searxngApi == null
? _value.searxngApi
// ignore: cast_nullable_to_non_nullable
: searxngApi as bool,
group: group == const $CopyWithPlaceholder()
? _value.group
// ignore: cast_nullable_to_non_nullable
@@ -158,6 +170,7 @@ Bang _$BangFromJson(Map<String, dynamic> json) => Bang(
domain: json['d'] as String,
trigger: json['t'] as String,
urlTemplate: json['u'] as String,
searxngApi: json['searxngApi'] as bool,
category: json['c'] as String?,
subCategory: json['sc'] as String?,
format: (json['fmt'] as List<dynamic>?)
@@ -177,6 +190,7 @@ Map<String, dynamic> _$BangToJson(Bang instance) => <String, dynamic>{
'sc': instance.subCategory,
'fmt': instance.format?.map((e) => _$BangFormatEnumMap[e]!).toList(),
'ts': instance.additionalTriggers?.toList(),
'searxngApi': instance.searxngApi,
};
const _$BangFormatEnumMap = {
@@ -41,6 +41,7 @@ class BangData extends Bang {
required super.trigger,
required super.urlTemplate,
required super.group,
required super.searxngApi,
super.category,
super.subCategory,
super.format,
@@ -56,6 +57,7 @@ class BangData extends Bang {
required super.domain,
required super.trigger,
required super.urlTemplate,
required super.searxngApi,
super.category,
super.subCategory,
super.format,
@@ -15,6 +15,8 @@ abstract class _$BangDataCWProxy {
BangData urlTemplate(String urlTemplate);
BangData searxngApi(bool searxngApi);
BangData category(String? category);
BangData subCategory(String? subCategory);
@@ -41,6 +43,7 @@ abstract class _$BangDataCWProxy {
String domain,
String trigger,
String urlTemplate,
bool searxngApi,
String? category,
String? subCategory,
Set<BangFormat>? format,
@@ -70,6 +73,9 @@ class _$BangDataCWProxyImpl implements _$BangDataCWProxy {
@override
BangData urlTemplate(String urlTemplate) => call(urlTemplate: urlTemplate);
@override
BangData searxngApi(bool searxngApi) => call(searxngApi: searxngApi);
@override
BangData category(String? category) => call(category: category);
@@ -105,6 +111,7 @@ class _$BangDataCWProxyImpl implements _$BangDataCWProxy {
Object? domain = const $CopyWithPlaceholder(),
Object? trigger = const $CopyWithPlaceholder(),
Object? urlTemplate = const $CopyWithPlaceholder(),
Object? searxngApi = const $CopyWithPlaceholder(),
Object? category = const $CopyWithPlaceholder(),
Object? subCategory = const $CopyWithPlaceholder(),
Object? format = const $CopyWithPlaceholder(),
@@ -132,6 +139,11 @@ class _$BangDataCWProxyImpl implements _$BangDataCWProxy {
? _value.urlTemplate
// ignore: cast_nullable_to_non_nullable
: urlTemplate as String,
searxngApi:
searxngApi == const $CopyWithPlaceholder() || searxngApi == null
? _value.searxngApi
// ignore: cast_nullable_to_non_nullable
: searxngApi as bool,
category: category == const $CopyWithPlaceholder()
? _value.category
// ignore: cast_nullable_to_non_nullable
@@ -33,14 +33,10 @@ enum BangGroup {
'https://raw.githubusercontent.com/FaFre/bangs/main/data/kagi_bangs.json',
bundled: 'assets/bangs/kagi_bangs.json',
),
custom(
remote:
'https://raw.githubusercontent.com/FaFre/bangs/refs/heads/custom/data/custom.json',
bundled: 'assets/bangs/custom.json',
);
user(remote: null, bundled: null);
final String bundled;
final String remote;
final String? bundled;
final String? remote;
const BangGroup({required this.bundled, required this.remote});
}