import 'package:html/dom.dart' as dom; import 'package:html/parser.dart' as parser; import 'package:html_unescape/html_unescape.dart'; abstract class HtmlUtil { static String? getTitle(dynamic input) => parser.parse(input).head?.querySelector('title')?.text; static dom.Element? getBody(dynamic input) => parser.parse(input).body; static bool hasMatch(dom.Element? element, {required String selector}) => element?.querySelector(selector) != null; static Iterable? getIds( dom.Element? element, { required String selector, }) => element ?.querySelectorAll(selector) .map((dom.Element element) => element.id); static Map? getHiddenFormValues(dynamic input) { final Iterable? hiddenInputs = getBody(input) ?.getElementsByTagName('form') .first .querySelectorAll("input[type='hidden']"); return { if (hiddenInputs != null) for (final dom.Element hiddenInput in hiddenInputs) hiddenInput.attributes['name']!: hiddenInput.attributes['value']!, }; } static String parseHtml(String text) { return HtmlUnescape() .convert(text) .replaceAll('

', '\n') .replaceAllMapped( RegExp(r'\(.*?)\<\/i\>'), (Match match) => '*${match[1]}*', ) .replaceAllMapped( RegExp(r'\\(.*?)\<\/code\>\<\/pre\>', dotAll: true), (Match match) => match[1]?.trimRight() ?? '', ) .replaceAllMapped( RegExp(r'\.*?\<\/a\>'), (Match match) => match[1] ?? '', ) .replaceAll('\n', '\n\n'); } }