UNPKG

2.83 kBJavaScriptView Raw
1'use strict';
2
3const path = require('path');
4const fs = require('fs');
5const util = require('util');
6const jdfUtils = require('jdf-utils');
7const logger = require('jdf-log');
8const $ = jdfUtils.base;
9const f = jdfUtils.file;
10const jdf = require("./jdf");
11const velocity = require('velocityjs');
12const VFS = require('./VFS/VirtualFileSystem');
13const vm = module.exports;
14
15/**
16 * @rander data
17 * 格式:
18 * <!-- begin embed widget ./widget/myWidget -->
19 * <link src="" source="widget">
20 * <script href="" source="widget"></script>
21 * vm's content
22 * <!-- end embed widget ./widget/myWidget -->
23 * @{String} vmSource vm内容
24 * @{Object} dataObj vm对应的数据
25 * @{String} dirname vm的dirname
26 */
27vm.render = function(vmSource, options) {
28 let dataObj = options.dataObj;
29 let dirname = options.dirname;
30 let existMap = options.existMap;
31
32 if (!(vmSource && dataObj)) {
33 return '';
34 }
35
36 let macros = {
37 parse: function (name) {
38 let content = `<!-- begin embed widget ${name} -->\n`;
39 let vmpath = path.resolve(dirname, name);
40 let vmVfile = VFS.queryFile(vmpath);
41 if (!vmVfile) {
42 logger.error(`'#parse(${name})' in ${dirname}'s vm, path not exist or not a file`);
43 return name;
44 }
45
46 // TODO content不将js css放进去,只放到cssMap,jsMap中
47
48 // 添加#parse(vmpath)相应的css和js标签
49 let vmName = path.basename(vmpath).replace(path.extname(vmpath), '');
50 if (!existMap.cssMap[vmName]) {
51 // 获取vfile,没有就不添加css标签到html中
52 let csspath = vmpath.replace(path.extname(vmpath), '.css');
53 csspath = path.relative(VFS.originDir, csspath);
54 csspath = path.join(VFS.targetDir, csspath);
55 let cssVfile = VFS.queryFile(csspath, 'target');
56 if (cssVfile) {
57 existMap.cssMap.set(vmName, true);
58 }
59 }
60 if (!existMap.jsMap[vmName]) {
61 let jspath = vmpath.replace(path.extname(vmpath), '.js');
62 jspath = path.relative(VFS.originDir, jspath);
63 jspath = path.join(VFS.targetDir, jspath);
64 let jsVfile = VFS.queryFile(jspath, 'target');
65 if (jsVfile) {
66 existMap.jsMap.set(vmName, true);
67 }
68 }
69 // 递归解析
70 content += vm.render(vmVfile.targetContent, {
71 dataObj: dataObj,
72 dirname: path.dirname(vmpath),
73 existMap: existMap
74 });
75
76 content += `<!-- end embed widget ${name} -->`;
77
78 return content;
79 }
80 }
81
82 return velocity.render(vmSource, dataObj, macros);
83}