forked from Persata/active-menu
-
Notifications
You must be signed in to change notification settings - Fork 0
/
index.js
145 lines (126 loc) · 2.74 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
/**
* Menu Node Class Requirement
*
* @type {ActiveMenuNode}
*/
var ActiveMenuNode = require('./active-menu-node');
/**
* Menu Instance Reference For This Menu (that = this)
* @type {module}
*/
var menuInstance = null;
/**
* Main Menu Class
*
* @param menuName
* @constructor
*/
var ActiveMenu = module.exports = function(menuName) {
// Assign Instance Reference
menuInstance = this;
// Menu Name
this.menuName = menuName;
/**
* List of Child Nodes
* @type {ActiveMenuNode[]}
*/
this.nodeList = [];
/**
* HTML Attributes Array
* @type {Array}
*/
this.htmlAttributes = [];
/**
* Current Request
* @type {request}
*/
this.currentRequest = null;
/**
* Depth
* @type {int}
*/
this.depth = -1;
/**
* HTML Sourcery Generator
*/
this.generator = require('html-sourcery');
};
/**
* Middleware Function
* @param req
* @param res
* @param next
*/
ActiveMenu.prototype.menu = function(req, res, next) {
// Assign Request
menuInstance.currentRequest = req;
// Assign To Local
res.locals[menuInstance.menuName] = menuInstance;
// Next
next();
};
/**
* Get Current Request Route Path
* @returns {String}
*/
ActiveMenu.prototype.getCurrentRequestRoute = function() {
return this.currentRequest.route.path;
};
/**
* Set HTML Attributes
*
* @param attributes
* @returns {exports}
*/
ActiveMenu.prototype.setAttributes = function(attributes) {
this.htmlAttributes = attributes;
return this;
};
/**
* Add a New Menu Node
*
* @param text
* @param route
* @returns {ActiveMenuNode}
*/
ActiveMenu.prototype.addMenuNode = function(text, route) {
// New Node
var newNode = new ActiveMenuNode(menuInstance, this);
// Assign Variables
newNode.text = text;
newNode.route = route;
newNode.elementType = 'li';
// Add to List
this.nodeList.push(newNode);
// Return
return newNode;
};
/**
* Render Menu to String
* Can be called separately or with something like Jade by calling the menuname
*
* @returns {String}
*/
ActiveMenu.prototype.toString = function() {
// Init Child Html
var childHtml = [];
// Node List for Reference Below
var nodeList = this.nodeList;
// Generate Children HTML Recursively
this.nodeList.forEach(function(childNode, key) {
// Handle First and Last
if (key == 0) {
childNode.isFirst = true;
}
if (key == (nodeList.length - 1)) {
childNode.isLast = true;
}
// Append
childHtml.push(childNode.toHtml());
});
// Wrap in Menu HTML, Compile and Return
return this.generator.ul(
this.htmlAttributes,
childHtml
).compile();
};