1 | var render = require('./lib/render')
|
2 | var requireView = require('./lib/require')
|
3 | var parse = require('./lib/parse')
|
4 | var dump = require('./lib/dump')
|
5 | var getLocals = require('./lib/get_locals')
|
6 | var resolve = require('resolve')
|
7 | var caller = require('resolve/lib/caller')
|
8 | var path = require('path')
|
9 |
|
10 | module.exports = function(view, opts){
|
11 |
|
12 |
|
13 | if (isPackageRequire(view)){
|
14 | view = resolve.sync(view, { basedir: path.dirname(caller()) })
|
15 | }
|
16 |
|
17 | view = getView(view, opts)
|
18 |
|
19 | var func = function(context){
|
20 | context = context || {}
|
21 | context.views = view.views
|
22 | context.locals = getLocals(view)
|
23 | return render(view.c, context)
|
24 | }
|
25 |
|
26 | func.getCompiledView = function(){
|
27 | return view
|
28 | }
|
29 |
|
30 | func.stringify = function(root){
|
31 | return dump(view, root || process.cwd())
|
32 | }
|
33 |
|
34 | func.getExternal = function(){
|
35 | var externalRequires = []
|
36 | addExt(view, externalRequires)
|
37 | return externalRequires
|
38 | }
|
39 |
|
40 | func.addView = function(name, v){
|
41 | view.views = view.views || {}
|
42 | view.views[name] = getView(v)
|
43 | }
|
44 |
|
45 | return func
|
46 | }
|
47 |
|
48 | function addExt(template, externalRefs, processed){
|
49 | processed = processed || []
|
50 | processed.push(template)
|
51 |
|
52 | Object.keys(template.views).forEach(function(key){
|
53 | var view = template.views[key]
|
54 | if (view.require){
|
55 | if (!~externalRefs.indexOf(view.require)){
|
56 | externalRefs.push(view.require)
|
57 | }
|
58 | } else if (!~processed.indexOf(view)) {
|
59 |
|
60 | addExt(view, externalRefs, processed)
|
61 | }
|
62 | })
|
63 | }
|
64 |
|
65 | function getView(view, opts){
|
66 | if (typeof view == 'string'){
|
67 | view = requireView(view, opts)
|
68 | } else if (view.parse) {
|
69 | view = parse(view.parse)
|
70 | }
|
71 | return view
|
72 | }
|
73 |
|
74 |
|
75 | function isPackageRequire(file){
|
76 | return typeof file === 'string' && !!/^[^\/\\]/.exec(file)
|
77 | } |
\ | No newline at end of file |