packages feed

hablo-1.0.0.0: share/js/navigation.js

function Navigation(modules) {
	var articles = modules.cache.make(function(key) {
		var url = ["", blog.path.articlesPath, key + '.md'].join('/');
		return modules.async.bind(
			modules.async.http({method: 'GET', url: url}),
			function(queryResult) {
				if(queryResult.status == 200) {
					return modules.async.wrap(queryResult.responseText);
				} else {
					return modules.async.fail(
						"Could not load article " + url + " (" + queryResult.status + " " + queryResult.statusText + ")"
					);
				}
			}
		);
	});
	window.addEventListener('popstate', function(e) {
		if(e.state != undefined) {
			navigate(e.state.url);
		}
	});
	history.replaceState({url: window.location.pathname}, 'Blog - title', window.location.pathname);
	return {
		hijackLinks: hijackLinks
	};

	function hijackLinks(domElem) {
		domElem = domElem || document;
		var links = domElem.getElementsByTagName('a');
		for(var i = 0; i < links.length; i++) {
			var a = links[i];
			var href = a.getAttribute("href");
			if((href[0] == "/" && href.slice(-3) != ".md") || href[0] == "#") {
				a.addEventListener('click', visit(a.getAttribute("href")));
			}
		}
	}

	function visit(url) {
		return function(e) {
			e.preventDefault();
			if(url[0] == '#') {
				window.location = url;
				history.replaceState({url: window.location.pathname}, 'Blog - title', url);
			} else {
				navigate(url);
				history.pushState({url: url}, 'Blog - title', url);
			}
		};
	}

	function navigate(url) {
		var path = decodeURI(url).split("/").slice(1);
		if(blog.tags[path[0]] != undefined) {
			show(getArticlesList(path[0], path[1] == "all.html"));
		} else if(path[0] == blog.path.articlesPath) {
			show(getArticle(path[1].replace(/\.html$/, '')));
		} else {
			show(getArticlesList(null, path[0] == "all.html"));
		}
	}

	function getArticle(key) {
		return modules.async.bind(
			articles.get(key),
			modules.async.map(
				function(contents) {return [modules.domRenderer.article(key, contents)];}
			)
		);
	}

	function preview(key) {
		return modules.async.bind(
			articles.get(key),
			function(contents) {
				return modules.async.wrap(
					modules.domRenderer.article(
						key,
						contents,
						blog.skin.previewLinesCount
					)
				);
			}
		);
	}

	function articleIds(tag, all) {
		var ids = tag != undefined ? blog.tags[tag] : Object.keys(blog.articles);
		var reverseDate = function (id) {return -blog.articles[id].metadata.date;};
		ids.sort(modules.fun.compare(reverseDate));
		return ids.slice(0, all ? undefined : blog.skin.previewArticlesCount);
	}

	function getArticlesList(tag, all) {
		return modules.async.bind(
			modules.async.parallel.apply(null, articleIds(tag, all).map(preview)),
			modules.async.map(modules.domRenderer.articlesList(tag, all))
		);
	}

	function show(contents) {
		modules.async.run(
			modules.async.bind(
				contents,
				modules.async.map(function (domElems) {
					domElems = domElems.filter(modules.fun.defined);
					var div = document.getElementById('contents');
					modules.dom.clear(div);
					for(var i = 0; i < domElems.length; i++) {
						div.appendChild(domElems[i]);
					}
					hijackLinks(div);
				})
			)
		);
	}
}