Change the filter interface to allow configuring with parameters.
Chris Pressey
10 years ago
20 | 20 | |
21 | 21 | So, for example, |
22 | 22 | |
23 | lexeduct.js upper <input.txt | |
23 | echo 'Hello!' | lexeduct.js upper | |
24 | 24 | |
25 | and an uppercased version of the contents of `input.txt` will be dumped to | |
26 | the standard output. | |
25 | will dump the string `HELLO!` to standard output. | |
27 | 26 | |
28 | 27 | You can of course use shell pipelines to compose filters: |
29 | 28 | |
41 | 40 | of possible text filters that can be composed. Or at least, more than four. |
42 | 41 | |
43 | 42 | Each filter is in a seperate Javascript file in the `src/filter` directory |
44 | which exports, node-style, a single function called `filter` which takes | |
45 | two arguments. For example, here is the source of the `upper` filter, found | |
43 | which exports, node-style, a single function called `makeFilter` which takes | |
44 | a configuration object and returns a filter function. The filter function | |
45 | takes two arguments: the current string of text to process, and (optionally) | |
46 | an object which can be used to store ancillary state. It should return | |
47 | either a string, or null (not yet supported), or an array of strings (not yet | |
48 | supported.) | |
49 | ||
50 | As a simple example, here is the source of the `upper` filter, found | |
46 | 51 | in `src/filter/upper.js`: |
47 | 52 | |
48 | 53 | module.exports = { |
49 | filter: function(line, state) { | |
50 | return line.toUpperCase(); | |
54 | makeFilter: function(cfg) { | |
55 | return function(line, state) { | |
56 | return line.toUpperCase(); | |
57 | }; | |
51 | 58 | } |
52 | 59 | }; |
53 | 60 | |
54 | 61 | `state` is an object whose members may be read or written to store ancillary |
55 | 62 | state. (Doing so will make it an 'impure' pipeline.) |
56 | ||
57 | **NOTE**: this interface is likely to change real soon now, to support passing | |
58 | parameters to filters. | |
59 | 63 | |
60 | 64 | TODO |
61 | 65 | ---- |
0 | 0 | module.exports = { |
1 | filter: function(line, state) { | |
2 | var s = ""; | |
3 | for (var i = 0; i < line.length; i++) { | |
4 | s += line.charAt(i) + " "; | |
5 | } | |
6 | return s; | |
1 | makeFilter: function(cfg) { | |
2 | return function(line, state) { | |
3 | var s = ""; | |
4 | for (var i = 0; i < line.length; i++) { | |
5 | s += line.charAt(i) + " "; | |
6 | } | |
7 | return s; | |
8 | }; | |
7 | 9 | } |
8 | 10 | }; |
0 | 0 | module.exports = { |
1 | filter: function(line, state) { | |
2 | var s = ""; | |
3 | var vowels = "aeiou"; | |
4 | for (var i = 0; i < line.length; i++) { | |
5 | s += line.charAt(i) + vowels.charAt(Math.floor(Math.random() * vowels.length)); | |
6 | } | |
7 | return s; | |
1 | makeFilter: function(cfg) { | |
2 | return function(line, state) { | |
3 | var s = ""; | |
4 | var vowels = "aeiou"; | |
5 | for (var i = 0; i < line.length; i++) { | |
6 | s += line.charAt(i) + vowels.charAt(Math.floor(Math.random() * vowels.length)); | |
7 | } | |
8 | return s; | |
9 | }; | |
8 | 10 | } |
9 | 11 | }; |
0 | 0 | module.exports = { |
1 | filter: function(line, state) { | |
2 | return line.toLowerCase(); | |
1 | makeFilter: function(cfg) { | |
2 | return function(line, state) { | |
3 | return line.toLowerCase(); | |
4 | }; | |
3 | 5 | } |
4 | 6 | }; |
0 | 0 | module.exports = { |
1 | filter: function(line, state) { | |
2 | return line.toUpperCase(); | |
1 | makeFilter: function(cfg) { | |
2 | return function(line, state) { | |
3 | return line.toUpperCase(); | |
4 | }; | |
3 | 5 | } |
4 | 6 | }; |
15 | 15 | }; |
16 | 16 | }; |
17 | 17 | |
18 | /* | |
19 | * Load the filters that were specified on the command line. | |
20 | */ | |
18 | 21 | for (var i = 0; i < args.length; i++) { |
22 | // TODO: parse filter parameters off end of args[i] | |
19 | 23 | var module = require('./filter/' + args[i]); |
24 | var loadedFilter = module.makeFilter({}); | |
20 | 25 | if (filter === undefined) { |
21 | filter = module.filter; | |
26 | filter = loadedFilter; | |
22 | 27 | } else { |
23 | filter = compose(module.filter, filter); | |
28 | filter = compose(loadedFilter, filter); | |
24 | 29 | } |
25 | 30 | } |
26 | 31 |