Release RuleGel 1.0.1 with Realbooru

This commit is contained in:
2026-05-25 14:33:59 +03:00
parent 16e86fb9d5
commit ea39cf8567
28 changed files with 1217 additions and 263 deletions
+31
View File
@@ -55,6 +55,7 @@ class GelbooruMapper {
static List<dynamic> _extractItems(dynamic data) {
if (data is List) return data;
if (data is String) return _extractItemsFromText(data);
if (data is Map) {
final posts = data['post'] ?? data['posts'];
if (posts is List) return posts;
@@ -64,6 +65,26 @@ class GelbooruMapper {
return const [];
}
static List<Map<String, dynamic>> _extractItemsFromText(String text) {
final items = <Map<String, dynamic>>[];
for (final match
in RegExp(r'<post\b([^>]*)/?>', caseSensitive: false, dotAll: true)
.allMatches(text)) {
final attrs = _attributes(match.group(1) ?? '');
if (attrs.isNotEmpty) items.add(attrs);
}
return items;
}
static Map<String, dynamic> _attributes(String source) {
final result = <String, dynamic>{};
for (final match in RegExp(r'''([A-Za-z0-9_:-]+)\s*=\s*["']([^"']*)["']''')
.allMatches(source)) {
result[match.group(1)!] = _decodeEntities(match.group(2) ?? '');
}
return result;
}
static List<String> _tags(dynamic value) {
if (value is List) return value.map((tag) => tag.toString()).toList();
return _string(value)
@@ -128,4 +149,14 @@ class GelbooruMapper {
add('meta', json['tag_string_meta'] ?? json['tags_meta']);
return groups;
}
static String _decodeEntities(String value) {
return value
.replaceAll('&amp;', '&')
.replaceAll('&lt;', '<')
.replaceAll('&gt;', '>')
.replaceAll('&quot;', '"')
.replaceAll('&#039;', "'")
.replaceAll('&apos;', "'");
}
}