Skip to content

Commit fdb62ef

Browse files
author
Borys Nebosenko
committed
Added customHeader method. Version is updated to 0.0.9
1 parent a628a83 commit fdb62ef

4 files changed

Lines changed: 131 additions & 99 deletions

File tree

README.md

Lines changed: 69 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,11 @@ This module allows to create console menu for your REPL application. It allows y
1313
var menu = require('node-menu');
1414
```
1515

16+
Each method returns reference on self object, so calls could be chained.
17+
1618
### menu.addItem(title, handler, owner, args)
1719

18-
Add item to the menu.
20+
Add item to the menu. Returns __menu__ for chaining calls.
1921

2022
- _title_ - title of the menu item;
2123
- _handler_ - item handler function;
@@ -46,7 +48,7 @@ menu.addItem(
4648

4749
### menu.addDelimiter(delimiter, cnt, title)
4850

49-
Adds delimiter to the menu.
51+
Adds delimiter to the menu. Returns __menu__ for chaining calls.
5052

5153
- _delimiter_ - delimiter character;
5254
- _cnt_ - delimiter's repetition count;
@@ -60,6 +62,32 @@ The output of the delimiter:
6062
menu.addDelimiter('*', 33)
6163
*********************************
6264

65+
### menu.enableDefaultHeader()
66+
67+
Turns on default header (turned on by default). Returns __menu__ for chaining calls.
68+
69+
```javascript
70+
menu.enableDefaultHeader()
71+
```
72+
73+
### menu.disableDefaultHeader()
74+
75+
Turns off default header. No header will be printed in this case. Returns __menu__ for chaining calls.
76+
77+
```javascript
78+
menu.disableDefaultHeader()
79+
```
80+
81+
### menu.customHeader(customHeaderFunc)
82+
83+
Turns off default header and prints custom header passed in __customHeaderFunc__. Returns __menu__ for chaining calls.
84+
85+
```javascript
86+
menu.customHeader(function() {
87+
process.stdout.write("Custom header\n");
88+
})
89+
```
90+
6391
### menu.start()
6492

6593
Start menu.
@@ -68,7 +96,7 @@ Start menu.
6896

6997
## Live Example
7098

71-
<a href="http://runnable.com/U1H42Un5ZlsFdb2x/console-menu-for-your-cool-repl-application-for-shell-and-cli" target="_blank"><img src="https://runnable.com/external/styles/assets/runnablebtn.png" style="width:67px;height:25px;"></a>
99+
<a href="http://runnable.com/U1H42Un5ZlsFdb2x/console-menu-for-your-cool-repl-application-for-shell-and-cli" target="_blank"><img src="https://code.runnable.com/external/styles/assets/runnablebtn.png" style="width:67px;height:25px;"></a>
72100

73101
## Source
74102

@@ -91,46 +119,43 @@ TestObject.prototype.printFieldB = function(arg) {
91119

92120
var testObject = new TestObject();
93121

94-
menu.addDelimiter('-', 40, 'Main Menu');
95-
96-
menu.addItem(
97-
'No parameters',
98-
function() {
99-
console.log('No parameters is invoked');
100-
});
101-
102-
menu.addItem(
103-
"Print Field A",
104-
testObject.printFieldA,
105-
testObject);
106-
107-
menu.addItem(
108-
'Print Field B concatenated with arg1',
109-
testObject.printFieldB,
110-
testObject,
111-
[{'name': 'arg1', 'type': 'string'}]);
112-
113-
menu.addItem(
114-
'Sum',
115-
function(op1, op2) {
116-
var sum = op1 + op2;
117-
console.log('Sum ' + op1 + '+' + op2 + '=' + sum);
118-
},
119-
null,
120-
[{'name': 'op1', 'type': 'numeric'}, {'name': 'op2', 'type': 'numeric'}]);
121-
122-
menu.addItem(
123-
'String and Bool parameters',
124-
function(str, b) {
125-
console.log("String is: " + str);
126-
console.log("Bool is: " + b);
127-
},
128-
null,
129-
[{'name': 'str', 'type': 'string'}, {'name': 'bool', 'type': 'bool'}]);
130-
131-
menu.addDelimiter('*', 40);
132-
133-
menu.start();
122+
menu.addDelimiter('-', 40, 'Main Menu')
123+
.addItem(
124+
'No parameters',
125+
function() {
126+
console.log('No parameters is invoked');
127+
})
128+
.addItem(
129+
"Print Field A",
130+
testObject.printFieldA,
131+
testObject)
132+
.addItem(
133+
'Print Field B concatenated with arg1',
134+
testObject.printFieldB,
135+
testObject,
136+
[{'name': 'arg1', 'type': 'string'}])
137+
.addItem(
138+
'Sum',
139+
function(op1, op2) {
140+
var sum = op1 + op2;
141+
console.log('Sum ' + op1 + '+' + op2 + '=' + sum);
142+
},
143+
null,
144+
[{'name': 'op1', 'type': 'numeric'}, {'name': 'op2', 'type': 'numeric'}])
145+
.addItem(
146+
'String and Bool parameters',
147+
function(str, b) {
148+
console.log("String is: " + str);
149+
console.log("Bool is: " + b);
150+
},
151+
null,
152+
[{'name': 'str', 'type': 'string'}, {'name': 'bool', 'type': 'bool'}])
153+
.addDelimiter('*', 40)
154+
// .customHeader(function() {
155+
// process.stdout.write("Hello\n");
156+
// })
157+
// .disableDefaultHeader()
158+
.start();
134159
```
135160

136161
Output of this example:
@@ -139,7 +164,7 @@ Output of this example:
139164
/ | / /____ ____/ /___ / |/ /___ ____ __ __
140165
/ |/ // __ \ / __ // _ \ / /|_/ // _ \ / __ \ / / / /
141166
/ /| // /_/ // /_/ // __// / / // __// / / // /_/ /
142-
/_/ |_/ \____/ \__,_/ \___//_/ /_/ \___//_/ /_/ \__,_/ v.0.0.8
167+
/_/ |_/ \____/ \__,_/ \___//_/ /_/ \___//_/ /_/ \__,_/ v.0.0.9
143168

144169
---------------Main Menu---------------
145170
1. No parameters
@@ -155,5 +180,3 @@ Output of this example:
155180
>>
156181

157182
To invoke item without arguments just type number and Enter. To invoke item with arguments, type number then arguments delimited with space. If string argument has spaces it must be double quoted.
158-
159-
## To be continued...

examples/sample_menu.js

Lines changed: 38 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
var menu = require('node-menu');
1+
var menu = require('../index');
22

33
var TestObject = function() {
44
var self = this;
@@ -16,43 +16,40 @@ TestObject.prototype.printFieldB = function(arg) {
1616

1717
var testObject = new TestObject();
1818

19-
menu.addDelimiter('-', 40, 'Main Menu');
20-
21-
menu.addItem(
22-
'No parameters',
23-
function() {
24-
console.log('No parameters is invoked');
25-
});
26-
27-
menu.addItem(
28-
"Print Field A",
29-
testObject.printFieldA,
30-
testObject);
31-
32-
menu.addItem(
33-
'Print Field B concatenated with arg1',
34-
testObject.printFieldB,
35-
testObject,
36-
[{'name': 'arg1', 'type': 'string'}]);
37-
38-
menu.addItem(
39-
'Sum',
40-
function(op1, op2) {
41-
var sum = op1 + op2;
42-
console.log('Sum ' + op1 + '+' + op2 + '=' + sum);
43-
},
44-
null,
45-
[{'name': 'op1', 'type': 'numeric'}, {'name': 'op2', 'type': 'numeric'}]);
46-
47-
menu.addItem(
48-
'String and Bool parameters',
49-
function(str, b) {
50-
console.log("String is: " + str);
51-
console.log("Bool is: " + b);
52-
},
53-
null,
54-
[{'name': 'str', 'type': 'string'}, {'name': 'bool', 'type': 'bool'}]);
55-
56-
menu.addDelimiter('*', 40);
57-
58-
menu.start();
19+
menu.addDelimiter('-', 40, 'Main Menu')
20+
.addItem(
21+
'No parameters',
22+
function() {
23+
console.log('No parameters is invoked');
24+
})
25+
.addItem(
26+
"Print Field A",
27+
testObject.printFieldA,
28+
testObject)
29+
.addItem(
30+
'Print Field B concatenated with arg1',
31+
testObject.printFieldB,
32+
testObject,
33+
[{'name': 'arg1', 'type': 'string'}])
34+
.addItem(
35+
'Sum',
36+
function(op1, op2) {
37+
var sum = op1 + op2;
38+
console.log('Sum ' + op1 + '+' + op2 + '=' + sum);
39+
},
40+
null,
41+
[{'name': 'op1', 'type': 'numeric'}, {'name': 'op2', 'type': 'numeric'}])
42+
.addItem(
43+
'String and Bool parameters',
44+
function(str, b) {
45+
console.log("String is: " + str);
46+
console.log("Bool is: " + b);
47+
},
48+
null,
49+
[{'name': 'str', 'type': 'string'}, {'name': 'bool', 'type': 'bool'}])
50+
.addDelimiter('*', 40)
51+
// .customHeader(function() {
52+
// process.stdout.write("Hello\n");
53+
// })
54+
// .disableDefaultHeader()
55+
.start();

lib/nodemenu.js

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
var util = require('util');
55
var MenuItem = require('./menuitem');
66
var MenuType = MenuItem.MenuType;
7+
var _ = require('underscore');
78

89
var NodeMenu = function() {
910
var self = this;
@@ -29,6 +30,13 @@ NodeMenu.prototype.disableDefaultHeader = function() {
2930
return self;
3031
};
3132

33+
NodeMenu.prototype.customHeader = function(customHeaderFunc) {
34+
var self = this;
35+
self.printDefaultHeader = false;
36+
self.customHeaderFunc = customHeaderFunc;
37+
return self;
38+
}
39+
3240
NodeMenu.prototype.addItem = function(title, handler, owner, args) {
3341
var self = this;
3442
self.menuItems.push(new MenuItem(MenuType.ACTION, ++self.itemNo, title, handler, owner, args));
@@ -126,24 +134,28 @@ NodeMenu.prototype._parseInput = function(text) {
126134
};
127135

128136
NodeMenu.prototype._printHeader = function() {
129-
process.stdout.write(" \n\
130-
_ __ __ __ ___ \n\
131-
/ | / /____ ____/ /___ / |/ /___ ____ __ __ \n\
132-
/ |/ // __ \\ / __ // _ \\ / /|_/ // _ \\ / __ \\ / / / / \n\
133-
/ /| // /_/ // /_/ // __// / / // __// / / // /_/ / \n\
134-
/_/ |_/ \\____/ \\__,_/ \\___//_/ /_/ \\___//_/ /_/ \\__,_/ v.0.0.8 \n\
135-
\n\
136-
\n");
137+
var self = this;
138+
139+
if (self.printDefaultHeader) {
140+
process.stdout.write(" \n\
141+
_ __ __ __ ___ \n\
142+
/ | / /____ ____/ /___ / |/ /___ ____ __ __ \n\
143+
/ |/ // __ \\ / __ // _ \\ / /|_/ // _ \\ / __ \\ / / / / \n\
144+
/ /| // /_/ // /_/ // __// / / // __// / / // /_/ / \n\
145+
/_/ |_/ \\____/ \\__,_/ \\___//_/ /_/ \\___//_/ /_/ \\__,_/ v.0.0.9 \n\
146+
\n\
147+
\n");
148+
} else if (_.isFunction(self.customHeaderFunc)) {
149+
self.customHeaderFunc();
150+
}
137151
};
138152

139153
NodeMenu.prototype._printMenu = function() {
140154
var self = this;
141155

142156
util.print(self.CLEAR_CODE);
143157
var self = this;
144-
if (self.printDefaultHeader) {
145-
self._printHeader();
146-
}
158+
self._printHeader();
147159
for (var i = 0; i < self.menuItems.length; ++i) {
148160
var menuItem = self.menuItems[i];
149161
printableMenu = menuItem.getPrintableString();

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "node-menu",
33
"description": "Allows to create command line menu for REPL applications",
4-
"version": "0.0.8",
4+
"version": "0.0.9",
55
"author": "Borys Nebosenko <borys.nebosenko@gmail.com>",
66
"keywords": [
77
"menu",

0 commit comments

Comments
 (0)