-
Notifications
You must be signed in to change notification settings - Fork 84
/
engines.js
108 lines (88 loc) · 2.68 KB
/
engines.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
/** internal
* mixin Engines
*
* An internal mixin whose public methods are exposed on the [[Environment]]
* and [[Index]] classes.
*
* An engine is a type of processor that is bound to an filename
* extension. `application.js.coffee` indicates that the
* [[CoffeeEngine]] engine will be ran on the file.
*
* Extensions can be stacked and will be evaulated from right to
* left. `application.js.coffee.ejs` will first run `EjsEngine`
* then [[CoffeeEngine]].
*
* All `Engine`s must follow the [[Template]] interface. It is
* recommended to subclass [[Template]].
*
* Its recommended that you register engine changes on your local
* `Environment` instance.
*
* environment.registerEngine('.foo', FooProcessor);
*
* The global registry is exposed for plugins to register themselves.
*
* Mincer.registerEngine('.ejs', EjsEngine);
**/
// REQUIRED PROPERTIES /////////////////////////////////////////////////////////
//
// - `__engines__` (Object)
//
////////////////////////////////////////////////////////////////////////////////
'use strict';
// stdlib
var path = require('path');
// 3rd-party
var _ = require('lodash');
// internal
var getter = require('../common').getter;
////////////////////////////////////////////////////////////////////////////////
// Normalize extension with a leading `.`.
//
// js -> .js
// foo.js -> .js
// foo/bar.js -> .js
function normalizeExtension(extension) {
return path.extname('foobar.' + path.basename(extension));
}
/**
* Engines#getEngines(ext) -> Object|Function
*
* Returns an `Object` map of `extension => Engine`s registered on the
* `Environment`. If an `ext` argument is supplied, the `Engine` register
* under that extension will be returned.
*
* environment.getEngines()
* // -> { ".styl": StylusEngine, ... }
*
* environment.getEngines('.styl')
* // -> StylusEngine
**/
module.exports.getEngines = function (ext) {
if (ext) {
return this.__engines__[normalizeExtension(ext)];
}
return _.clone(this.__engines__);
};
/**
* Engines#engineExtensions -> Array
*
* Returns an `Array` of engine extension `String`s.
*
* environment.engineExtensions;
* // -> ['.coffee', '.sass', ...]
**/
getter(module.exports, 'engineExtensions', function () {
return _.keys(this.__engines__);
});
/**
* Engines#registerEngine(ext, klass) -> Void
*
* Registers a new Engine `klass` for `ext`. If the `ext` already
* has an engine registered, it will be overridden.
*
* environment.registerEngine('.coffee', CoffeeScriptTemplate);
**/
module.exports.registerEngine = function (ext, klass) {
this.__engines__[normalizeExtension(ext)] = klass;
};