savvy-js
Version:
Savvy - Style sheet documentation tool
227 lines (188 loc) • 5.59 kB
JavaScript
(function(){
'use strict';
function getLink(entity){
var text ='',
href = '',
type = '',
link = '<a href="#';
text = entity.class || entity.name;
if(entity.module){
href += entity.module;
}
if(entity.submodule){
href += href ? '/' : '';
href += entity.submodule;
}
if(entity.class){
href += href ? '/' : '';
href += entity.class;
href += '?t=class';
}
if(entity.name){
type = href ? '?t=submodule' : '?t=module';
href += href ? '/' : '';
href += entity.name;
href += type;
}
link += href;
link += '">' + text + '</a>';
return link;
}
function searchClass(name, moduleName, submoduleName){
var result,
submodule,
module;
function findClass(parent){
if(!parent.classes){
return;
}
parent.classes.every(function(classObject){
if(classObject.class === name){
result = classObject;
return false;
}
return true;
});
}
if(submoduleName){
submodule = searchSubmodules(submoduleName, moduleName);
if(submodule) {
findClass(submodule);
}
}
if(!result && moduleName){
module = searchModule(moduleName);
if(module) {
findClass(module);
}
}
if(!result && data.classes){
findClass(data);
}
if(!result){
data.modules.every(function(module){
findClass(module);
if(!result && module.submodules) {
module.submodules.every(function (submodule) {
findClass(submodule);
if(result){
return false;
}
});
}
else{
return false;
}
});
}
return result;
}
function searchSubmodules(name, moduleName){
var result,
module;
function findSubmodule(parent){
parent.submodules.every(function(submodule){
if(submodule.name === name){
result = submodule;
return false;
}
});
}
if(moduleName){
module = searchModule(moduleName);
if(module) {
findSubmodule(module);
}
}
if(!result){
data.module.every(function(module){
findSubmodule(module);
if(result){
return false;
}
});
}
return result;
}
function searchModule(name){
var result;
if(data.modules){
data.modules.every(function(module){
if(module.name === name){
result = module;
return false;
}
});
}
return result;
}
function navigate(hash){
var query,
entity,
className,
moduleName,
submoduleName;
if(hash[0] === '#'){
hash = hash.substr(1);
}
query = hash.split('?');
if(query.length > 1){
hash = query[0];
query = query[1];
}else{
query = null;
}
if(query === 't=class'){
hash = hash.split('/');
if(hash.length === 1){
className = hash[0];
}
else if(hash.length === 2){
className = hash[1];
moduleName = hash[0];
}
else if(hash.length === 3){
className = hash[2];
moduleName = hash[0];
submoduleName = hash[1];
}
entity = searchClass(className, moduleName, submoduleName);
if(entity) {
app.view.renderClass(entity);
}
}
if(query === 't=submodule'){
hash = hash.split('/');
if(hash.length === 1){
submoduleName = hash[0];
}
else if(hash.length === 2){
submoduleName = hash[1];
moduleName = hash[0];
}
entity = searchSubmodules(submoduleName, moduleName);
if(entity) {
app.view.renderSubmodule(entity);
}
}
if(query === 't=module'){
moduleName = hash;
entity = searchModule(moduleName);
if(entity) {
app.view.renderModule(entity);
}
}
}
function initNavigation(){
$(window).on('hashchange', function() {
navigate(window.location.hash);
});
if(window.location.hash){
navigate(window.location.hash);
}
}
app.navigation = {
init : initNavigation,
getLink : getLink
};
}());