From aa4600b5884aee06a70660f34a7e20a4d296a2af Mon Sep 17 00:00:00 2001 From: Lucien Cartier-Tilet Date: Sun, 10 May 2020 12:00:47 +0200 Subject: [PATCH] Sitemap query now fully asynchronous Sitemap generation is now independent from the navbar generation, and it will be added to the navbar only once the navbar has been created. Also, better style for code. --- web/dart/main.dart | 6 +++--- web/dart/navbar.dart | 12 ------------ web/dart/parse_sitemap.dart | 37 ++++++++++++++++++++++++++++++------- 3 files changed, 33 insertions(+), 22 deletions(-) diff --git a/web/dart/main.dart b/web/dart/main.dart index 5b17663..ca703c1 100644 --- a/web/dart/main.dart +++ b/web/dart/main.dart @@ -1,9 +1,9 @@ import './reorganize_html.dart' show reorganizeHtml; import './theme.dart' show enableThemeChanger, setTheme; +import './parse_sitemap.dart' show getSitemap; Future main() async { await setTheme(); - await reorganizeHtml().then((_) { - enableThemeChanger(); - }); + await reorganizeHtml().then((_) => enableThemeChanger()); + await getSitemap(); } diff --git a/web/dart/navbar.dart b/web/dart/navbar.dart index 2ea1ec9..8eae5e9 100644 --- a/web/dart/navbar.dart +++ b/web/dart/navbar.dart @@ -28,18 +28,6 @@ Future makePages() async { var pages = Element.ul() ..attributes['id'] = 'drop-page' ..classes.add('dropdown'); - await parseSitemap().then((final sitemap) => { - sitemap.forEach((url, name) { - final link = Element.li() - ..classes.add('dropdown-item') - ..insertAdjacentElement( - 'afterBegin', - Element.a() - ..attributes['href'] = url - ..innerText = name); - pages.insertAdjacentElement('beforeEnd', link); - }) - }); return Element.li() ..append(Element.a() ..attributes['href'] = 'javascript:void(0)' diff --git a/web/dart/parse_sitemap.dart b/web/dart/parse_sitemap.dart index c0ca0d7..67dc69c 100644 --- a/web/dart/parse_sitemap.dart +++ b/web/dart/parse_sitemap.dart @@ -1,15 +1,15 @@ -import 'dart:html' show HttpRequest; +import 'dart:html' as html show HttpRequest, Element, querySelector; import 'package:html/parser.dart' show parse; -import 'package:html/dom.dart' show Element; +import 'package:html/dom.dart' as dom show Element; final excluded_keywords = ['index', 'CONTRIBUTING', 'LICENSE', 'README']; // Get the sitemap content -Future getSitemap() async { +Future fetchRemoteSitemap() async { const path = 'sitemap.html'; try { - return await HttpRequest.getString(path); + return await html.HttpRequest.getString(path); } catch (e) { print('Couldn’t open $path'); } @@ -17,10 +17,10 @@ Future getSitemap() async { } // Parse the list of elements and detect pages from this list -Map detectPages(List sitemap, [String prefix]) { +Map detectPages(List sitemap, [String prefix]) { final links = {}; for (var elem in sitemap) { - for(var kw in excluded_keywords) { + for (var kw in excluded_keywords) { if (elem.outerHtml.contains(kw)) { continue; } @@ -42,7 +42,30 @@ Map detectPages(List sitemap, [String prefix]) { // This function returns a Map which contains all links to languages detected // from the sitemap. Future> parseSitemap() async { - final content = await getSitemap(); + final content = await fetchRemoteSitemap(); final sitemap = parse(content).getElementsByClassName('org-ul')[0].children; return detectPages(sitemap); } + +Future sleep(Duration time) async { + return Future.delayed(time); +} + +Future getSitemap() async { + final sitemap = await parseSitemap(); + final pages = []; + sitemap.forEach((url, name) { + final link = html.Element.li() + ..classes.add('dropdown-item') + ..append(html.Element.a() + ..attributes['href'] = url + ..innerText = name); + pages.add(link); + }); + var drop_container; + do { + await sleep(Duration(seconds: 1)); + drop_container = html.querySelector('#drop-page'); + } while (drop_container != null); + pages.forEach((link) => drop_container.append(link)); +}