Now all pages in sitemap are detected
Also made the code not language-related so it can be used as a backend for all my org-generated websites.
This commit is contained in:
parent
300c1dbee6
commit
d692d30ff8
@ -1,6 +1,7 @@
|
|||||||
import 'dart:html' show HttpRequest;
|
import 'dart:html' show HttpRequest;
|
||||||
|
|
||||||
import 'package:html/parser.dart' show parse;
|
import 'package:html/parser.dart' show parse;
|
||||||
|
import 'package:html/dom.dart' show Element;
|
||||||
|
|
||||||
// Get the sitemap content
|
// Get the sitemap content
|
||||||
Future<String> getSitemap() async {
|
Future<String> getSitemap() async {
|
||||||
@ -13,26 +14,30 @@ Future<String> getSitemap() async {
|
|||||||
return 'Error';
|
return 'Error';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Parse the list of elements and detect pages from this list
|
||||||
|
Map<String, String> detectPages(List<Element> sitemap, [String prefix]) {
|
||||||
|
final links = <String, String>{};
|
||||||
|
for (var elem in sitemap) {
|
||||||
|
if (elem.outerHtml.contains('index')) {
|
||||||
|
continue;
|
||||||
|
} else if (elem.innerHtml.startsWith('<a')) {
|
||||||
|
elem = elem.firstChild;
|
||||||
|
final url = elem.attributes['href'];
|
||||||
|
final text = elem.firstChild.text;
|
||||||
|
links[url] = (prefix == null) ? text : '$text ($prefix)';
|
||||||
|
} else {
|
||||||
|
final prefix = elem.firstChild.text;
|
||||||
|
final ul = elem.children[0].children;
|
||||||
|
links.addAll(detectPages(ul, prefix));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return links;
|
||||||
|
}
|
||||||
|
|
||||||
// This function returns a Map which contains all links to languages detected
|
// This function returns a Map which contains all links to languages detected
|
||||||
// from the sitemap.
|
// from the sitemap.
|
||||||
Future<Map<String, String>> parseSitemap() async {
|
Future<Map<String, String>> parseSitemap() async {
|
||||||
var links = <String, String>{};
|
final content = await getSitemap();
|
||||||
await getSitemap().then((String content) {
|
final sitemap = parse(content).getElementsByClassName('org-ul')[0].children;
|
||||||
final sitemap = parse(content).getElementsByClassName('org-ul')[0].children;
|
return detectPages(sitemap);
|
||||||
for (var elem in sitemap) {
|
|
||||||
// TODO: make this recursive so prefixes in nested folders can be added to
|
|
||||||
// each other
|
|
||||||
if (elem.innerHtml.startsWith('<a')) {
|
|
||||||
elem = elem.firstChild;
|
|
||||||
final text = elem.firstChild.text;
|
|
||||||
final url = elem.attributes['href'];
|
|
||||||
if (!url.contains('index')) {
|
|
||||||
links[url] = text;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
print('Sitemap folder:\n${elem.innerHtml}');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return links;
|
|
||||||
}
|
}
|
||||||
|
@ -15,10 +15,10 @@ Element makeIcon(List<String> classes, [String id]) {
|
|||||||
return icon;
|
return icon;
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<Element> makeLanguages() async {
|
Future<Element> makePages() async {
|
||||||
// Languages
|
// Pages
|
||||||
var languages = Element.ul()
|
var pages = Element.ul()
|
||||||
..attributes['id'] = 'drop-lang'
|
..attributes['id'] = 'drop-page'
|
||||||
..classes.add('dropdown');
|
..classes.add('dropdown');
|
||||||
await parseSitemap().then((final sitemap) => {
|
await parseSitemap().then((final sitemap) => {
|
||||||
sitemap.forEach((url, name) {
|
sitemap.forEach((url, name) {
|
||||||
@ -29,15 +29,15 @@ Future<Element> makeLanguages() async {
|
|||||||
Element.a()
|
Element.a()
|
||||||
..attributes['href'] = url
|
..attributes['href'] = url
|
||||||
..innerText = name);
|
..innerText = name);
|
||||||
languages.insertAdjacentElement('beforeEnd', link);
|
pages.insertAdjacentElement('beforeEnd', link);
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
return Element.li()
|
return Element.li()
|
||||||
..append(Element.a()
|
..append(Element.a()
|
||||||
..attributes['href'] = 'javascript:void(0)'
|
..attributes['href'] = 'javascript:void(0)'
|
||||||
..append(makeIcon(['fas', 'fa-language'])))
|
..append(makeIcon(['fas', 'fa-flag'])))
|
||||||
..classes.addAll(['nav-item', 'has-dropdown'])
|
..classes.addAll(['nav-item', 'has-dropdown'])
|
||||||
..insertAdjacentElement('beforeEnd', languages);
|
..insertAdjacentElement('beforeEnd', pages);
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<Element> makeTocDropDown() async {
|
Future<Element> makeTocDropDown() async {
|
||||||
@ -115,7 +115,7 @@ Future<Element> makeShare() async {
|
|||||||
|
|
||||||
// Add a navbar atop of the HTML body, containing two buttons:
|
// Add a navbar atop of the HTML body, containing two buttons:
|
||||||
// - One back to home
|
// - One back to home
|
||||||
// - A dropdown to each language detected in the sitemap
|
// - A dropdown to each page detected in the sitemap
|
||||||
Future<Element> makeNavbar() async {
|
Future<Element> makeNavbar() async {
|
||||||
var navbar_content = Element.ul()..classes.add('navbar-nav');
|
var navbar_content = Element.ul()..classes.add('navbar-nav');
|
||||||
|
|
||||||
@ -128,8 +128,8 @@ Future<Element> makeNavbar() async {
|
|||||||
..attributes['href'] = '/'
|
..attributes['href'] = '/'
|
||||||
..append(makeIcon(['fas', 'fa-home']))));
|
..append(makeIcon(['fas', 'fa-home']))));
|
||||||
|
|
||||||
// Add languages
|
// Add pages
|
||||||
navbar_content.append(await makeLanguages());
|
navbar_content.append(await makePages());
|
||||||
|
|
||||||
// TOC icon
|
// TOC icon
|
||||||
navbar_content.append(await makeTocDropDown());
|
navbar_content.append(await makeTocDropDown());
|
||||||
|
@ -381,7 +381,7 @@ header {
|
|||||||
transform: translateX(-75%);
|
transform: translateX(-75%);
|
||||||
}
|
}
|
||||||
|
|
||||||
#drop-lang {
|
#drop-page {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
transform: translateX(-40%);
|
transform: translateX(-40%);
|
||||||
li {
|
li {
|
||||||
|
Reference in New Issue
Block a user