This repository has been archived on 2023-07-22. You can view files and clone it, but cannot push or open issues or pull requests.
nord-for-org/web/dart/parse_sitemap.dart

64 lines
2.0 KiB
Dart
Raw Normal View History

import 'dart:html' show HttpRequest, Element, querySelector;
2020-05-10 10:37:22 +00:00
final excluded_keywords = {'index', 'CONTRIBUTING', 'LICENSE', 'README'};
// Get the sitemap content
Future<String> fetchRemoteSitemap() async {
2020-05-26 00:13:48 +00:00
const path = '/sitemap.html';
try {
return await HttpRequest.getString(path);
} catch (e) {
print('Couldnt open $path');
}
return 'Error';
}
// Parse the list of elements and detect pages from this list
Map<String, String> detectPages(List<Element> t_sitemap,
[String? t_prefix, Map<String, String>? t_links]) {
t_links ??= <String, String>{};
// parse each element in sitemap
2020-05-26 00:13:48 +00:00
for (var elem in t_sitemap) {
// if its a link
if (elem.innerHtml!.startsWith('<a')) {
elem = elem.children[0];
final url = elem.attributes['href']!;
final text = elem.children[0].text;
2020-05-26 00:13:48 +00:00
if (excluded_keywords.contains(text) ||
excluded_keywords.contains(url.substring(0, url.length - 5))) {
continue;
}
t_links!['/$url'] = ((t_prefix == null) ? text : '$text ($t_prefix)')!;
} else {
final prefix = (t_prefix == null)
? elem.firstChild!.text!.replaceAll('\n', '')
: '$t_prefix / ${elem.firstChild!.text}'.replaceAll('\n', '');
t_links = detectPages(elem.children[0].children, prefix, t_links);
}
}
return t_links!;
}
// This function returns a Map which contains all links to languages detected
// from the sitemap.
Future<Map<String, String>> parseSitemap() async {
final content = await fetchRemoteSitemap();
final sitemap = Element.ul()..innerHtml = content;
final sitemapNodes = sitemap.querySelector('ul')!.children;
return detectPages(sitemapNodes);
}
Future<void> createSitemap() async {
final sitemap = await parseSitemap();
final pages = querySelector('#drop-page')!;
sitemap.forEach((url, name) {
final link = Element.li()
..classes.add('dropdown-item')
..append(Element.a()
..attributes['href'] = url
..innerText = name);
pages.append(link);
});
}