Moved out navbar-related code
This commit is contained in:
		
							parent
							
								
									d692d30ff8
								
							
						
					
					
						commit
						070e8b4ba1
					
				
							
								
								
									
										149
									
								
								web/dart/navbar.dart
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										149
									
								
								web/dart/navbar.dart
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,149 @@
 | 
				
			|||||||
 | 
					import 'dart:html';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import './parse_sitemap.dart' show parseSitemap;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Returns the title of the current webpage
 | 
				
			||||||
 | 
					String getPageTitle() {
 | 
				
			||||||
 | 
					  return querySelector('title').text;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Element makeIcon(List<String> classes, [String id]) {
 | 
				
			||||||
 | 
					  final icon = Element.tag('i')..classes.addAll(classes);
 | 
				
			||||||
 | 
					  if (id != null) {
 | 
				
			||||||
 | 
					    icon.attributes['id'] = id;
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					  return icon;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Future<Element> makeToc() async {
 | 
				
			||||||
 | 
					  return Element.li()
 | 
				
			||||||
 | 
					    ..attributes['id'] = 'toc-drop'
 | 
				
			||||||
 | 
					    ..classes.addAll(['nav-item', 'has-dropdown'])
 | 
				
			||||||
 | 
					    ..append(Element.a()
 | 
				
			||||||
 | 
					      ..attributes['href'] = 'javascript:void(0)'
 | 
				
			||||||
 | 
					      ..append(makeIcon(['fas', 'fa-list-ol'], 'tocBtn')));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Future<Element> 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)'
 | 
				
			||||||
 | 
					      ..append(makeIcon(['fas', 'fa-flag'])))
 | 
				
			||||||
 | 
					    ..classes.addAll(['nav-item', 'has-dropdown'])
 | 
				
			||||||
 | 
					    ..insertAdjacentElement('beforeEnd', pages);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Element makeShareLink(Element icon, String url) {
 | 
				
			||||||
 | 
					  return Element.li()
 | 
				
			||||||
 | 
					    ..classes.add('dropdown-item')
 | 
				
			||||||
 | 
					    ..append(Element.a()
 | 
				
			||||||
 | 
					      ..attributes['href'] = url
 | 
				
			||||||
 | 
					      ..attributes['target'] = '_blank'
 | 
				
			||||||
 | 
					      ..append(icon));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Future<Element> makeShare() async {
 | 
				
			||||||
 | 
					  return Element.li()
 | 
				
			||||||
 | 
					    ..classes.addAll(['nav-item', 'has-dropdown'])
 | 
				
			||||||
 | 
					    ..append(Element.a()
 | 
				
			||||||
 | 
					      ..attributes['href'] = 'javascript:void(0)'
 | 
				
			||||||
 | 
					      ..append(makeIcon(['fas', 'fa-share-alt'])))
 | 
				
			||||||
 | 
					    ..append(Element.ul()
 | 
				
			||||||
 | 
					      ..classes.add('dropdown')
 | 
				
			||||||
 | 
					      ..attributes['id'] = 'drop-share'
 | 
				
			||||||
 | 
					      ..append(makeShareLink(
 | 
				
			||||||
 | 
					          makeIcon(['fab', 'fa-twitter-square']),
 | 
				
			||||||
 | 
					          'https://twitter.com/share?text=${getPageTitle()}'
 | 
				
			||||||
 | 
					          '&url=${window.location.href}'))
 | 
				
			||||||
 | 
					      ..append(makeShareLink(makeIcon(['fab', 'fa-reddit-square']),
 | 
				
			||||||
 | 
					          'https://www.reddit.com/submit?title=${getPageTitle()}s&url=${window.location.href}'))
 | 
				
			||||||
 | 
					      ..append(makeShareLink(makeIcon(['fas', 'fa-envelope-square']),
 | 
				
			||||||
 | 
					          'mailto:?subject=${getPageTitle}&body=${window.location.href}'))
 | 
				
			||||||
 | 
					      ..append(makeShareLink(
 | 
				
			||||||
 | 
					          makeIcon(['fab', 'fa-linkedin']),
 | 
				
			||||||
 | 
					          'https://www.linkedin.com/shareArticle?mini=true&url=${window.location.href}'
 | 
				
			||||||
 | 
					          '&title=${getPageTitle()}'))
 | 
				
			||||||
 | 
					      ..append(makeShareLink(makeIcon(['fab', 'fa-facebook-square']),
 | 
				
			||||||
 | 
					          'https://www.facebook.com/sharer/sharer.php?u=${window.location.href}')));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Future<Element> makeThemeChanger() async {
 | 
				
			||||||
 | 
					  Element makeThemeItem(String t_btnId, Element t_icon, String t_text) {
 | 
				
			||||||
 | 
					    return Element.li()
 | 
				
			||||||
 | 
					      ..classes.add('dropdown-item')
 | 
				
			||||||
 | 
					      ..append(Element.span()
 | 
				
			||||||
 | 
					        ..attributes['id'] = t_btnId
 | 
				
			||||||
 | 
					        ..append(t_icon)
 | 
				
			||||||
 | 
					        ..appendText(' $t_text'));
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return Element.li()
 | 
				
			||||||
 | 
					    ..classes.addAll(['nav-item', 'has-dropdown'])
 | 
				
			||||||
 | 
					    ..append(Element.a()
 | 
				
			||||||
 | 
					      ..attributes['href'] = 'javascript:void(0)'
 | 
				
			||||||
 | 
					      ..append(Element.span()
 | 
				
			||||||
 | 
					        ..classes.add('fa-stack')
 | 
				
			||||||
 | 
					        ..style.verticalAlign = 'top'
 | 
				
			||||||
 | 
					        ..append(makeIcon(['fas', 'fa-sun', 'fa-stack-1x'])
 | 
				
			||||||
 | 
					          ..style.fontSize = '0.9em')
 | 
				
			||||||
 | 
					        ..append(makeIcon(['fas', 'fa-moon', 'fa-stack-1x']))))
 | 
				
			||||||
 | 
					    ..append(Element.ul()
 | 
				
			||||||
 | 
					      ..classes.add('dropdown')
 | 
				
			||||||
 | 
					      ..attributes['id'] = 'theme-dropdown'
 | 
				
			||||||
 | 
					      ..append(makeThemeItem('lightBtn', makeIcon(['fas', 'fa-sun']), 'Clair'))
 | 
				
			||||||
 | 
					      ..append(
 | 
				
			||||||
 | 
					          makeThemeItem('darkBtn', makeIcon(['fas', 'fa-lightbulb']), 'Sombre'))
 | 
				
			||||||
 | 
					      ..append(
 | 
				
			||||||
 | 
					          makeThemeItem('blackBtn', makeIcon(['fas', 'fa-moon']), 'Noir')));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Future<Element> makeHome() async {
 | 
				
			||||||
 | 
					  return Element.li()
 | 
				
			||||||
 | 
					    ..classes.add('nav-item')
 | 
				
			||||||
 | 
					    ..insertAdjacentElement(
 | 
				
			||||||
 | 
					        'afterBegin',
 | 
				
			||||||
 | 
					        Element.a()
 | 
				
			||||||
 | 
					          ..attributes['href'] = '/'
 | 
				
			||||||
 | 
					          ..append(makeIcon(['fas', 'fa-home'])));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Add a navbar atop of the HTML body, containing two buttons:
 | 
				
			||||||
 | 
					// - One back to home
 | 
				
			||||||
 | 
					// - A dropdown to each page detected in the sitemap
 | 
				
			||||||
 | 
					Future<Element> makeNavbar() async {
 | 
				
			||||||
 | 
					  final navbar_content = Element.ul()..classes.add('navbar-nav');
 | 
				
			||||||
 | 
					  final home           = await makeHome();
 | 
				
			||||||
 | 
					  final pages          = await makePages();
 | 
				
			||||||
 | 
					  final toc            = await makeToc();
 | 
				
			||||||
 | 
					  final share          = await makeShare();
 | 
				
			||||||
 | 
					  final theme          = await makeThemeChanger();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  navbar_content
 | 
				
			||||||
 | 
					    ..append(home)
 | 
				
			||||||
 | 
					    ..append(pages)
 | 
				
			||||||
 | 
					    ..append(toc)
 | 
				
			||||||
 | 
					    ..append(share)
 | 
				
			||||||
 | 
					    ..append(theme);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  // Navbar content added to navbar
 | 
				
			||||||
 | 
					  final navbar = Element.nav()
 | 
				
			||||||
 | 
					    ..classes.add('navbar')
 | 
				
			||||||
 | 
					    ..append(navbar_content);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					  return navbar;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
@ -1,164 +1,9 @@
 | 
				
			|||||||
import 'dart:html';
 | 
					import 'dart:html';
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import './parse_sitemap.dart' show parseSitemap;
 | 
					import './navbar.dart' show makeNavbar;
 | 
				
			||||||
 | 
					 | 
				
			||||||
// Returns the title of the current webpage
 | 
					 | 
				
			||||||
String getPageTitle() {
 | 
					 | 
				
			||||||
  return querySelector('title').text;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Element makeIcon(List<String> classes, [String id]) {
 | 
					 | 
				
			||||||
  final icon = Element.tag('i')..classes.addAll(classes);
 | 
					 | 
				
			||||||
  if (id != null) {
 | 
					 | 
				
			||||||
    icon.attributes['id'] = id;
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
  return icon;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Future<Element> makePages() async {
 | 
					 | 
				
			||||||
  // Pages
 | 
					 | 
				
			||||||
  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)'
 | 
					 | 
				
			||||||
      ..append(makeIcon(['fas', 'fa-flag'])))
 | 
					 | 
				
			||||||
    ..classes.addAll(['nav-item', 'has-dropdown'])
 | 
					 | 
				
			||||||
    ..insertAdjacentElement('beforeEnd', pages);
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Future<Element> makeTocDropDown() async {
 | 
					 | 
				
			||||||
  return Element.li()
 | 
					 | 
				
			||||||
    ..attributes['id'] = 'toc-drop'
 | 
					 | 
				
			||||||
    ..classes.addAll(['nav-item', 'has-dropdown'])
 | 
					 | 
				
			||||||
    ..append(Element.a()
 | 
					 | 
				
			||||||
      ..attributes['href'] = 'javascript:void(0)'
 | 
					 | 
				
			||||||
      ..append(makeIcon(['fas', 'fa-list-ol'], 'tocBtn')));
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Future<Element> makeThemeChanger() async {
 | 
					 | 
				
			||||||
  Element makeThemeItem(String t_btnId, Element t_icon, String t_text) {
 | 
					 | 
				
			||||||
    return Element.li()
 | 
					 | 
				
			||||||
      ..classes.add('dropdown-item')
 | 
					 | 
				
			||||||
      ..append(Element.span()
 | 
					 | 
				
			||||||
        ..attributes['id'] = t_btnId
 | 
					 | 
				
			||||||
        ..append(t_icon)
 | 
					 | 
				
			||||||
        ..appendText(' $t_text'));
 | 
					 | 
				
			||||||
  }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return Element.li()
 | 
					 | 
				
			||||||
    ..classes.addAll(['nav-item', 'has-dropdown'])
 | 
					 | 
				
			||||||
    ..append(Element.a()
 | 
					 | 
				
			||||||
      ..attributes['href'] = 'javascript:void(0)'
 | 
					 | 
				
			||||||
      ..append(Element.span()
 | 
					 | 
				
			||||||
        ..classes.add('fa-stack')
 | 
					 | 
				
			||||||
        ..style.verticalAlign = 'top'
 | 
					 | 
				
			||||||
        ..append(makeIcon(['fas', 'fa-sun', 'fa-stack-1x'])
 | 
					 | 
				
			||||||
          ..style.fontSize = '0.9em')
 | 
					 | 
				
			||||||
        ..append(makeIcon(['fas', 'fa-moon', 'fa-stack-1x']))))
 | 
					 | 
				
			||||||
    ..append(Element.ul()
 | 
					 | 
				
			||||||
      ..classes.add('dropdown')
 | 
					 | 
				
			||||||
      ..attributes['id'] = 'theme-dropdown'
 | 
					 | 
				
			||||||
      ..append(makeThemeItem('lightBtn', makeIcon(['fas', 'fa-sun']), 'Clair'))
 | 
					 | 
				
			||||||
      ..append(
 | 
					 | 
				
			||||||
          makeThemeItem('darkBtn', makeIcon(['fas', 'fa-lightbulb']), 'Sombre'))
 | 
					 | 
				
			||||||
      ..append(
 | 
					 | 
				
			||||||
          makeThemeItem('blackBtn', makeIcon(['fas', 'fa-moon']), 'Noir')));
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Element makeShareLink(Element icon, String url) {
 | 
					 | 
				
			||||||
  return Element.li()
 | 
					 | 
				
			||||||
    ..classes.add('dropdown-item')
 | 
					 | 
				
			||||||
    ..append(Element.a()
 | 
					 | 
				
			||||||
      ..attributes['href'] = url
 | 
					 | 
				
			||||||
      ..attributes['target'] = '_blank'
 | 
					 | 
				
			||||||
      ..append(icon));
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Future<Element> makeShare() async {
 | 
					 | 
				
			||||||
  return Element.li()
 | 
					 | 
				
			||||||
    ..classes.addAll(['nav-item', 'has-dropdown'])
 | 
					 | 
				
			||||||
    ..append(Element.a()
 | 
					 | 
				
			||||||
      ..attributes['href'] = 'javascript:void(0)'
 | 
					 | 
				
			||||||
      ..append(makeIcon(['fas', 'fa-share-alt'])))
 | 
					 | 
				
			||||||
    ..append(Element.ul()
 | 
					 | 
				
			||||||
      ..classes.add('dropdown')
 | 
					 | 
				
			||||||
      ..attributes['id'] = 'drop-share'
 | 
					 | 
				
			||||||
      ..append(makeShareLink(
 | 
					 | 
				
			||||||
          makeIcon(['fab', 'fa-twitter-square']),
 | 
					 | 
				
			||||||
          'https://twitter.com/share?text=${getPageTitle()}'
 | 
					 | 
				
			||||||
          '&url=${window.location.href}'))
 | 
					 | 
				
			||||||
      ..append(makeShareLink(makeIcon(['fab', 'fa-reddit-square']),
 | 
					 | 
				
			||||||
          'https://www.reddit.com/submit?title=${getPageTitle()}s&url=${window.location.href}'))
 | 
					 | 
				
			||||||
      ..append(makeShareLink(makeIcon(['fas', 'fa-envelope-square']),
 | 
					 | 
				
			||||||
          'mailto:?subject=${getPageTitle}&body=${window.location.href}'))
 | 
					 | 
				
			||||||
      ..append(makeShareLink(
 | 
					 | 
				
			||||||
          makeIcon(['fab', 'fa-linkedin']),
 | 
					 | 
				
			||||||
          'https://www.linkedin.com/shareArticle?mini=true&url=${window.location.href}'
 | 
					 | 
				
			||||||
          '&title=${getPageTitle()}'))
 | 
					 | 
				
			||||||
      ..append(makeShareLink(makeIcon(['fab', 'fa-facebook-square']),
 | 
					 | 
				
			||||||
          'https://www.facebook.com/sharer/sharer.php?u=${window.location.href}')));
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
// Add a navbar atop of the HTML body, containing two buttons:
 | 
					 | 
				
			||||||
// - One back to home
 | 
					 | 
				
			||||||
// - A dropdown to each page detected in the sitemap
 | 
					 | 
				
			||||||
Future<Element> makeNavbar() async {
 | 
					 | 
				
			||||||
  var navbar_content = Element.ul()..classes.add('navbar-nav');
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Home
 | 
					 | 
				
			||||||
  navbar_content.append(Element.li()
 | 
					 | 
				
			||||||
    ..classes.add('nav-item')
 | 
					 | 
				
			||||||
    ..insertAdjacentElement(
 | 
					 | 
				
			||||||
        'afterBegin',
 | 
					 | 
				
			||||||
        Element.a()
 | 
					 | 
				
			||||||
          ..attributes['href'] = '/'
 | 
					 | 
				
			||||||
          ..append(makeIcon(['fas', 'fa-home']))));
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Add pages
 | 
					 | 
				
			||||||
  navbar_content.append(await makePages());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // TOC icon
 | 
					 | 
				
			||||||
  navbar_content.append(await makeTocDropDown());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Share icon
 | 
					 | 
				
			||||||
  navbar_content.append(await makeShare());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Theme changer
 | 
					 | 
				
			||||||
  navbar_content.append(await makeThemeChanger());
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  // Navbar content added to navbar
 | 
					 | 
				
			||||||
  final navbar = Element.nav()
 | 
					 | 
				
			||||||
    ..classes.add('navbar')
 | 
					 | 
				
			||||||
    ..append(navbar_content);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
  return navbar;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
Element addIcon(Element navbar, List<String> classes, String id) {
 | 
					 | 
				
			||||||
  final icon = makeIcon(classes, id);
 | 
					 | 
				
			||||||
  navbar.append(Element.li()..append(icon));
 | 
					 | 
				
			||||||
  return navbar;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
Future<Element> makeHeader() async {
 | 
					Future<Element> makeHeader() async {
 | 
				
			||||||
  var header = Element.tag('header');
 | 
					  var header = Element.tag('header');
 | 
				
			||||||
 | 
					 | 
				
			||||||
  // querySelector('#container').append(Element.tag('header'));
 | 
					 | 
				
			||||||
  // var header = querySelector('header');
 | 
					 | 
				
			||||||
  header
 | 
					  header
 | 
				
			||||||
    ..append(Element.img()
 | 
					    ..append(Element.img()
 | 
				
			||||||
      ..attributes['src'] =
 | 
					      ..attributes['src'] =
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user