From 2d8a7161936e5a1e9235ecb47256919ba6462292 Mon Sep 17 00:00:00 2001 From: pavelpower Date: Sun, 9 Jun 2013 11:55:46 +0300 Subject: [PATCH 1/7] added gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .gitignore diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..9f11b75 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea/ From 0d99a421ba7c619d03817e52583c214cbefcb005 Mon Sep 17 00:00:00 2001 From: pavelpower Date: Sun, 9 Jun 2013 11:56:26 +0300 Subject: [PATCH 2/7] added derective require --- lib/JossyParser.js | 191 ++++++++++++++++++++++++--------------------- 1 file changed, 103 insertions(+), 88 deletions(-) diff --git a/lib/JossyParser.js b/lib/JossyParser.js index 5222beb..f9dca1c 100644 --- a/lib/JossyParser.js +++ b/lib/JossyParser.js @@ -1,16 +1,88 @@ -module.exports = JossyParser; +(function() { + var FileStructure, JossyError, fileExists; -var FileStructure = require('./FileStructure'); -var JossyError = require('./JossyError'); + FileStructure = require('./FileStructure'); + JossyError = require('./JossyError'); + fileExists = require('fs').exists || require('path').exists; -var fileExists = require('fs').exists || require('path').exists; + function _include(file, params, callback) { + var paramsParts = params.split('::'); + var includeFileName = paramsParts.shift(); + if (includeFileName) { + var absFileName = file.getRelativePathOf(includeFileName); + this.parseFile(absFileName, function(err, includeFile) { + if (err) { + callback(err); + return; + } + file.addInclude(includeFile, paramsParts); + callback(); + }); + } else { + try { + file.addInclude(file, paramsParts); + callback(); + } catch (err) { + callback(err); + } + } + } -function JossyParser() { - this._cache = {}; -} + function _without(file, params, callback) { + var paramsParts = params.split('::'); + var includeFname = file.getRelativePathOf(paramsParts.shift()); + this.parseFile(includeFname, function(err, includeFile) { + if (err) { + callback(err); + return; + } + file.addWithout(includeFile, paramsParts); + callback(); + }); + } + + function _label(file, label) { + file.beginLabel(label); + } + + function _endlabel(file) { + file.endLabel(); + } + + function _if(file, params) { + if (!params.trim()) { + throw new Error('Bad "if" directive'); + } + var args = params.split(/\s+/); + var value = true; + if (args.length > 1 && args[0] == 'not') { + value = false; + args.shift(); + } + file.beginIf(args[0], value); + } + + function _endif(file) { + file.endIf(); + } + + function _set(file, params) { + if (!params.trim()) { + throw new Error('Bad set directive'); + } + var args = params.split(/\s+/); + file.addSet(args[0]); + } + + function _unset(file, params) { + if (!params.trim()) { + throw new Error('Bad unset directive'); + } + var args = params.split(/\s+/); + file.addUnset(args[0]); + } -JossyParser.prototype = { - parseFile: function(fname, callback) { + function parseFile(fname, callback) { var that = this; normalizePath(fname, function(err, fname) { if (err) { @@ -76,88 +148,28 @@ JossyParser.prototype = { })(0); }); }); - }, - - _include: function(file, params, callback) { - var paramsParts = params.split('::'); - var includeFileName = paramsParts.shift(); - if (includeFileName) { - var absFileName = file.getRelativePathOf(includeFileName); - this.parseFile(absFileName, function(err, includeFile) { - if (err) { - callback(err); - return; - } - file.addInclude(includeFile, paramsParts); - callback(); - }); - } else { - try { - file.addInclude(file, paramsParts); - callback(); - } catch (err) { - callback(err); - } - } - }, - - _without: function(file, params, callback) { - var paramsParts = params.split('::'); - var includeFname = file.getRelativePathOf(paramsParts.shift()); - this.parseFile(includeFname, function(err, includeFile) { - if (err) { - callback(err); - return; - } - file.addWithout(includeFile, paramsParts); - callback(); - }); - }, - - _label: function(file, label) { - file.beginLabel(label); - }, - - _endlabel: function(file) { - file.endLabel(); - }, - - _if: function(file, params) { - if (!params.trim()) { - throw new Error('Bad "if" directive'); - } - var args = params.split(/\s+/); - var value = true; - if (args.length > 1 && args[0] == 'not') { - value = false; - args.shift(); - } - file.beginIf(args[0], value); - }, - - _endif: function(file) { - file.endIf(); - }, - - _set: function(file, params) { - if (!params.trim()) { - throw new Error('Bad set directive'); - } - var args = params.split(/\s+/); - file.addSet(args[0]); - }, + } - _unset: function(file, params) { - if (!params.trim()) { - throw new Error('Bad unset directive'); - } - var args = params.split(/\s+/); - file.addUnset(args[0]); + function JossyParser() { + this._cache = {}; } -}; -var realpathCache = {}; -function normalizePath(fname, callback) { + JossyParser.prototype = { + parseFile: parseFile, + + _include: _include, + _require: _include, + _without: _without, + _label: _label, + _endlabel: _endlabel, + _if: _if, + _endif: _endif, + _set: _set, + _unset: _unset + }; + + var realpathCache = {}; + function normalizePath(fname, callback) { if (realpathCache[fname]) { callback(null, realpathCache[fname]); } else { @@ -188,3 +200,6 @@ function normalizePath(fname, callback) { }); } } + + this.JossyParser = JossyParser; +}).call(this); \ No newline at end of file From 3cf30bff80c656d78ae95810e2b020dcf917d915 Mon Sep 17 00:00:00 2001 From: pavelpower Date: Sun, 9 Jun 2013 12:20:23 +0300 Subject: [PATCH 3/7] added contributor pavelpower, change package.js --- package.json | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index f643516..c90e677 100644 --- a/package.json +++ b/package.json @@ -1,9 +1,9 @@ { - "author": { - "name": "Kolyaj", - "email": "kolyaj@yandex.ru", - "url": "https://github.com/Kolyaj" - }, + "author": "Kolyaj (https://github.com/Kolyaj)", + "contributors": [ + "Kolyaj (https://github.com/Kolyaj)", + "Pavel Akhmetchanov (http://github.com/pavelpower)" + ], "name": "jossy", "description": "JavaScript files builder", "version": "0.0.2", From 02eb6f7d3b40b1605b4da76f9577098b5041e386 Mon Sep 17 00:00:00 2001 From: pavelpower Date: Sun, 9 Jun 2013 12:35:49 +0300 Subject: [PATCH 4/7] added test for directive require --- tests/require/result.js | 5 +++++ tests/require/test-1.js | 1 + tests/require/test.js | 5 +++++ 3 files changed, 11 insertions(+) create mode 100644 tests/require/result.js create mode 100644 tests/require/test-1.js create mode 100644 tests/require/test.js diff --git a/tests/require/result.js b/tests/require/result.js new file mode 100644 index 0000000..6f17f69 --- /dev/null +++ b/tests/require/result.js @@ -0,0 +1,5 @@ +alert(1); + +alert(2); + +alert(3); \ No newline at end of file diff --git a/tests/require/test-1.js b/tests/require/test-1.js new file mode 100644 index 0000000..881eccf --- /dev/null +++ b/tests/require/test-1.js @@ -0,0 +1 @@ +alert(2); diff --git a/tests/require/test.js b/tests/require/test.js new file mode 100644 index 0000000..25c944f --- /dev/null +++ b/tests/require/test.js @@ -0,0 +1,5 @@ +alert(1); + +// @require test-1.js + +alert(3); \ No newline at end of file From e62724568d6de4446ba6a22be36ec0776170dfbd Mon Sep 17 00:00:00 2001 From: pavelpower Date: Sun, 9 Jun 2013 12:37:07 +0300 Subject: [PATCH 5/7] Added handling of the directive "// @requires" --- lib/JossyParser.js | 330 ++++++++++++++++++++++----------------------- package.json | 2 +- readme.md | 4 + 3 files changed, 169 insertions(+), 167 deletions(-) diff --git a/lib/JossyParser.js b/lib/JossyParser.js index f9dca1c..876e6e7 100644 --- a/lib/JossyParser.js +++ b/lib/JossyParser.js @@ -1,205 +1,203 @@ -(function() { - var FileStructure, JossyError, fileExists; - - FileStructure = require('./FileStructure'); - JossyError = require('./JossyError'); - fileExists = require('fs').exists || require('path').exists; - - function _include(file, params, callback) { - var paramsParts = params.split('::'); - var includeFileName = paramsParts.shift(); - if (includeFileName) { - var absFileName = file.getRelativePathOf(includeFileName); - this.parseFile(absFileName, function(err, includeFile) { - if (err) { - callback(err); - return; - } - file.addInclude(includeFile, paramsParts); - callback(); - }); - } else { - try { - file.addInclude(file, paramsParts); - callback(); - } catch (err) { - callback(err); - } - } - } - - function _without(file, params, callback) { - var paramsParts = params.split('::'); - var includeFname = file.getRelativePathOf(paramsParts.shift()); - this.parseFile(includeFname, function(err, includeFile) { +var FileStructure, JossyError, fileExists; + +FileStructure = require('./FileStructure'); +JossyError = require('./JossyError'); +fileExists = require('fs').exists || require('path').exists; + +function _include(file, params, callback) { + var paramsParts = params.split('::'); + var includeFileName = paramsParts.shift(); + if (includeFileName) { + var absFileName = file.getRelativePathOf(includeFileName); + this.parseFile(absFileName, function(err, includeFile) { if (err) { callback(err); return; } - file.addWithout(includeFile, paramsParts); + file.addInclude(includeFile, paramsParts); callback(); }); + } else { + try { + file.addInclude(file, paramsParts); + callback(); + } catch (err) { + callback(err); + } } +} - function _label(file, label) { - file.beginLabel(label); - } +function _without(file, params, callback) { + var paramsParts = params.split('::'); + var includeFname = file.getRelativePathOf(paramsParts.shift()); + this.parseFile(includeFname, function(err, includeFile) { + if (err) { + callback(err); + return; + } + file.addWithout(includeFile, paramsParts); + callback(); + }); +} - function _endlabel(file) { - file.endLabel(); - } +function _label(file, label) { + file.beginLabel(label); +} - function _if(file, params) { - if (!params.trim()) { - throw new Error('Bad "if" directive'); - } - var args = params.split(/\s+/); - var value = true; - if (args.length > 1 && args[0] == 'not') { - value = false; - args.shift(); - } - file.beginIf(args[0], value); - } +function _endlabel(file) { + file.endLabel(); +} - function _endif(file) { - file.endIf(); +function _if(file, params) { + if (!params.trim()) { + throw new Error('Bad "if" directive'); } + var args = params.split(/\s+/); + var value = true; + if (args.length > 1 && args[0] == 'not') { + value = false; + args.shift(); + } + file.beginIf(args[0], value); +} - function _set(file, params) { - if (!params.trim()) { - throw new Error('Bad set directive'); - } - var args = params.split(/\s+/); - file.addSet(args[0]); +function _endif(file) { + file.endIf(); +} + +function _set(file, params) { + if (!params.trim()) { + throw new Error('Bad set directive'); } + var args = params.split(/\s+/); + file.addSet(args[0]); +} - function _unset(file, params) { - if (!params.trim()) { - throw new Error('Bad unset directive'); - } - var args = params.split(/\s+/); - file.addUnset(args[0]); +function _unset(file, params) { + if (!params.trim()) { + throw new Error('Bad unset directive'); } + var args = params.split(/\s+/); + file.addUnset(args[0]); +} - function parseFile(fname, callback) { - var that = this; - normalizePath(fname, function(err, fname) { +function parseFile(fname, callback) { + var that = this; + normalizePath(fname, function(err, fname) { + if (err) { + callback(err); + return; + } + if (that._cache[fname]) { + callback(null, that._cache[fname]); + return; + } + require('fs').readFile(fname, 'utf8', function(err, content) { if (err) { callback(err); return; } - if (that._cache[fname]) { - callback(null, that._cache[fname]); - return; - } - require('fs').readFile(fname, 'utf8', function(err, content) { - if (err) { - callback(err); - return; - } - var fileStructure = new FileStructure(fname); - that._cache[fname] = fileStructure; - var lines = content.split(/\r?\n/); - (function parseLines(start) { - var i; - var errors = []; - - var appendError = function(err) { - var msg = err.message; - var line = i + 1; - errors.push(new JossyError(msg, fname, line)); - fileStructure.error(msg); - }; - - var asyncParseCallback = function(err) { - if (err) { - appendError(err); - } - parseLines(i + 1); - }; - - for (i = start; i < lines.length; i++) { - var line = lines[i]; - if (line.match(/^\s*\/\/#([\s\S]*)$/)) { - if (RegExp.$1) { - var command = RegExp.$1.split(' '); - var directive = command.shift(); - var params = command.join(' '); - if (/^(include|without)$/.test(directive)) { - that['_' + directive](fileStructure, params, asyncParseCallback); - return; - } else if (/^(label|endlabel|if|endif|set|unset)$/.test(directive)) { - try { - that['_' + directive](fileStructure, params); - } catch (err) { - appendError(err); - } - } else { - appendError(new Error('Unknown directive ' + directive)); + var fileStructure = new FileStructure(fname); + that._cache[fname] = fileStructure; + var lines = content.split(/\r?\n/); + (function parseLines(start) { + var i; + var errors = []; + + var appendError = function(err) { + var msg = err.message; + var line = i + 1; + errors.push(new JossyError(msg, fname, line)); + fileStructure.error(msg); + }; + + var asyncParseCallback = function(err) { + if (err) { + appendError(err); + } + parseLines(i + 1); + }; + + for (i = start; i < lines.length; i++) { + var line = lines[i]; + if (line.match(/^\s*\/\/(#|\s*@)([\s\S]*)$/)) { + if (RegExp.$2) { + var command = RegExp.$2.split(' '); + var directive = command.shift(); + var params = command.join(' '); + if (/^(require|include|without)$/.test(directive)) { + that['_' + directive](fileStructure, params, asyncParseCallback); + return; + } else if (/^(label|endlabel|if|endif|set|unset)$/.test(directive)) { + try { + that['_' + directive](fileStructure, params); + } catch (err) { + appendError(err); } + } else { + appendError(new Error('Unknown directive ' + directive)); } - } else { - fileStructure.addCode(line + (i < lines.length - 1 ? '\n' : '')); } + } else { + fileStructure.addCode(line + (i < lines.length - 1 ? '\n' : '')); } + } - callback(null, fileStructure); - })(0); - }); + callback(null, fileStructure); + })(0); }); - } + }); +} - function JossyParser() { - this._cache = {}; - } +function JossyParser() { + this._cache = {}; +} - JossyParser.prototype = { - parseFile: parseFile, - - _include: _include, - _require: _include, - _without: _without, - _label: _label, - _endlabel: _endlabel, - _if: _if, - _endif: _endif, - _set: _set, - _unset: _unset - }; - - var realpathCache = {}; - function normalizePath(fname, callback) { - if (realpathCache[fname]) { - callback(null, realpathCache[fname]); - } else { - fileExists(fname, function(exists) { - if (!exists) { - callback(new Error('File ' + fname + ' not found')); +JossyParser.prototype = { + parseFile: parseFile, + + _include: _include, + _require: _include, + _without: _without, + _label: _label, + _endlabel: _endlabel, + _if: _if, + _endif: _endif, + _set: _set, + _unset: _unset +}; + +var realpathCache = {}; +function normalizePath(fname, callback) { +if (realpathCache[fname]) { + callback(null, realpathCache[fname]); +} else { + fileExists(fname, function(exists) { + if (!exists) { + callback(new Error('File ' + fname + ' not found')); + return; + } + require('fs').realpath(fname, function(err, absFname) { + if (err) { + callback(err); return; } - require('fs').realpath(fname, function(err, absFname) { + require('fs').stat(fname, function(err, stat) { if (err) { callback(err); return; } - require('fs').stat(fname, function(err, stat) { - if (err) { - callback(err); - return; - } - if (!stat.isFile()) { - callback(new Error('File ' + fname + ' not found')); - return; - } - absFname = absFname.replace(/\\/g, '/'); - realpathCache[fname] = absFname; - callback(null, absFname); - }); + if (!stat.isFile()) { + callback(new Error('File ' + fname + ' not found')); + return; + } + absFname = absFname.replace(/\\/g, '/'); + realpathCache[fname] = absFname; + callback(null, absFname); }); }); - } + }); +} } - this.JossyParser = JossyParser; -}).call(this); \ No newline at end of file +module.exports = JossyParser; diff --git a/package.json b/package.json index c90e677..b0df845 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ ], "name": "jossy", "description": "JavaScript files builder", - "version": "0.0.2", + "version": "0.0.3", "homepage": "https://github.com/Kolyaj/Jossy", "repository": { "type": "git", diff --git a/readme.md b/readme.md index a06e03b..e4a35cf 100644 --- a/readme.md +++ b/readme.md @@ -18,6 +18,10 @@ Jossy необходим только на этапе разработки, по //#include file.js +Альтернативная декларация аналог `#include`: + + // @require file.js + Путь к файлу указывается относительно расположения текущего файла. Технически, вместо строки с директивой просто вставляется содержимое указанного файла. Однако, если указанный файл уже подключен в текущем модуле ранее, то повторно он включен не будет. Например, файл f1.js alert(1); From 3632a424331a83aee9a77d2ae8bc834716fb4ade Mon Sep 17 00:00:00 2001 From: pavelpower Date: Sun, 9 Jun 2013 12:42:33 +0300 Subject: [PATCH 6/7] small refactoring --- lib/JossyParser.js | 42 +++++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/lib/JossyParser.js b/lib/JossyParser.js index 876e6e7..e9fa05e 100644 --- a/lib/JossyParser.js +++ b/lib/JossyParser.js @@ -169,35 +169,35 @@ JossyParser.prototype = { var realpathCache = {}; function normalizePath(fname, callback) { -if (realpathCache[fname]) { - callback(null, realpathCache[fname]); -} else { - fileExists(fname, function(exists) { - if (!exists) { - callback(new Error('File ' + fname + ' not found')); - return; - } - require('fs').realpath(fname, function(err, absFname) { - if (err) { - callback(err); + if (realpathCache[fname]) { + callback(null, realpathCache[fname]); + } else { + fileExists(fname, function(exists) { + if (!exists) { + callback(new Error('File ' + fname + ' not found')); return; } - require('fs').stat(fname, function(err, stat) { + require('fs').realpath(fname, function(err, absFname) { if (err) { callback(err); return; } - if (!stat.isFile()) { - callback(new Error('File ' + fname + ' not found')); - return; - } - absFname = absFname.replace(/\\/g, '/'); - realpathCache[fname] = absFname; - callback(null, absFname); + require('fs').stat(fname, function(err, stat) { + if (err) { + callback(err); + return; + } + if (!stat.isFile()) { + callback(new Error('File ' + fname + ' not found')); + return; + } + absFname = absFname.replace(/\\/g, '/'); + realpathCache[fname] = absFname; + callback(null, absFname); + }); }); }); - }); -} + } } module.exports = JossyParser; From 5772f8bff2a526859ea047e2ef177f3f555d7a7f Mon Sep 17 00:00:00 2001 From: pavelpower Date: Sun, 9 Jun 2013 13:11:57 +0300 Subject: [PATCH 7/7] do not take into account other than the declaration @require --- index.js | 0 lib/JossyParser.js | 2 +- tests/require/test.js | 1 + 3 files changed, 2 insertions(+), 1 deletion(-) mode change 100644 => 100755 index.js diff --git a/index.js b/index.js old mode 100644 new mode 100755 diff --git a/lib/JossyParser.js b/lib/JossyParser.js index e9fa05e..37493db 100644 --- a/lib/JossyParser.js +++ b/lib/JossyParser.js @@ -134,7 +134,7 @@ function parseFile(fname, callback) { } catch (err) { appendError(err); } - } else { + } else if (RegExp.$1.indexOf('@') === -1) { appendError(new Error('Unknown directive ' + directive)); } } diff --git a/tests/require/test.js b/tests/require/test.js index 25c944f..d31d6c3 100644 --- a/tests/require/test.js +++ b/tests/require/test.js @@ -1,5 +1,6 @@ alert(1); +// @decl test-1.js // @require test-1.js alert(3); \ No newline at end of file