diff --git a/node/amd2module.js b/node/amd2module.js index cd88589..8e3e3cc 100644 --- a/node/amd2module.js +++ b/node/amd2module.js @@ -63,6 +63,7 @@ function getDefineFactory(defineExpr) { function getDefineBlock(code) { var ast = getAst(code); var defineList = []; + var defineBlock; // require('fs').writeFileSync('ast.json', JSON.stringify(ast)); estraverse.traverse(ast, { enter: function (node, parent) { @@ -71,31 +72,57 @@ function getDefineBlock(code) { && node.expression.callee.name == 'define' ) { - var defineBlock = {}; - defineBlock.defineRange = node.range; - var factory = getDefineFactory(node.expression); + // define('xxx', {}) if (factory.type === SYNTAX.ObjectExpression) { - defineBlock.type = 'object'; - defineBlock.factoryRange = factory.range; + defineList.push({ + type: 'object', + defineRange: node.range, + factoryRange: factory.range + }); } // define(function() {}) else if (factory.type === SYNTAX.FunctionExpression){ - defineBlock.type = 'function'; + defineBlock = { + type: 'function', + defineRange: node.range, + factoryRange: factory.body.range + }; + var body = factory.body.body; - defineBlock.factoryRange = factory.body.range; - var returnList = defineBlock.returnRange = []; + var returnRange = defineBlock.returnRange = []; + // 替换return - for (var i = body.length - 1; i >=0; i--) { - if (body[i].type == SYNTAX.ReturnStatement) { - returnList.push(body[i].range); + for (var i = 0, l = body.length; i < l; i++) { + // 直接在函数体里的return + if (body[i].type === SYNTAX.ReturnStatement) { + returnRange.push(body[i].range); + } + // 在函数内部块里的return + else if (body[i].type !== SYNTAX.FunctionExpression) { + var functionEnter = 0; + estraverse.traverse(body[i], { + enter: function (returnNode) { + if ( + returnNode.type === SYNTAX.FunctionExpression + || returnNode.type === SYNTAX.FunctionDeclaration + ) { + this.skip(); + } + else if (returnNode.type === SYNTAX.ReturnStatement){ + returnRange.push(returnNode.range); + } + } + }); } } + + defineList.push(defineBlock); } - defineList.push(defineBlock); + this.skip(); } } @@ -124,15 +151,17 @@ function replaceDefine(code) { block.returnRange.forEach(function (range) { segments.push(code.slice(index, range[0])); - segments.push('module.exports = '); + segments.push('module.exports ='); segments.push(code.slice(range[0] + 6, range[1])); index = range[1]; }); + segments.push(code.slice(index, block.factoryRange[1] - 1)); + index = block.defineRange[1]; } else if (block.type === 'object'){ segments.push(code.slice(index, block.defineRange[0])); - segments.push('module.exports = '); + segments.push('module.exports ='); segments.push(code.slice(block.factoryRange[0], block.factoryRange[1]) + ';'); index = block.defineRange[1]; } diff --git a/node/generated.js b/node/generated.js new file mode 100644 index 0000000..4fcc2aa --- /dev/null +++ b/node/generated.js @@ -0,0 +1,71 @@ +/** + * @file test-define.js + * @author mengke01(kekee000@gmail.com) + */ + + +// 测试define函数 + + + module.exports = require('../common/test').test({ + test1: 'test1', + test2: 'test2' + }); + + + +// 测试 string + + + module.exports = 'test string'; + + + +// 测试commonjs wrapper + + + module.exports = { + test1: 'test1', + test2: 'test2' + }; + + + + + +// 测试object + +module.exports ={ + test1: 'test1', + test2: 'test2' +}; + + +// 测试多return + + + var string = require('../common/string'); + + if (string.pad) { + module.exports = string.pad; + } + else { + module.exports = function (str) { + return function () { + str; + }; + }; + } + + + +// 测试 nodejs兼容写法 + +if (typeof exports !== 'undefined') { + module.exports = exports = require('xmldom').DOMParser; +} +else { + + module.exports = window.DOMParser; + +} diff --git a/node/test.js b/node/test.js index 3072e5c..1fc8c0d 100644 --- a/node/test.js +++ b/node/test.js @@ -6,7 +6,7 @@ var fs = require('fs'); var amd2module = require('./amd2module'); function main() { - var code = fs.readFileSync('../src/fonteditor/data/online-font.js'); + var code = fs.readFileSync('./testcase-define.js'); fs.writeFileSync('./generated.js', amd2module(code, '../')); } diff --git a/node/testcase-define.js b/node/testcase-define.js new file mode 100644 index 0000000..d5684cd --- /dev/null +++ b/node/testcase-define.js @@ -0,0 +1,81 @@ +/** + * @file test-define.js + * @author mengke01(kekee000@gmail.com) + */ + + +// 测试define函数 +define( + function(require) { + + return require('common/test').test({ + test1: 'test1', + test2: 'test2' + }); + } +); + + +// 测试 string + +define( + function(require) { + return 'test string'; + } +); + + +// 测试commonjs wrapper + +define('test-module', ['test-module'], + function(require) { + return { + test1: 'test1', + test2: 'test2' + }; + } +); + + + + +// 测试object + +define('test-module', { + test1: 'test1', + test2: 'test2' +}); + + +// 测试多return +define( + function(require) { + + var string = require('common/string'); + + if (string.pad) { + return string.pad; + } + else { + return function (str) { + return function () { + str; + }; + }; + } + } +); + + +// 测试 nodejs兼容写法 + +if (typeof exports !== 'undefined') { + module.exports = exports = require('xmldom').DOMParser; +} +else { + define( + function (require) { + return window.DOMParser; + } + ); +}