homemade
Version:
C-like JS preprocessor
151 lines (114 loc) • 3.52 kB
Markdown
#  Homemade.js
Cozy C-like preprocessor. Implements `include`, `exclude`, `define`, `put`, `if`, `elif`, `ifdef`.
#### a. Use in console
`node homemade.js path/to/source.js path/to/destination.js`
#### b. Use with grunt ★
See [grunt-homemade](https://github.com/dfcreative/grunt-homemade) task.
## API
Fully compatible with [preprocessor.js](https://github.com/dcodeIO/Preprocessor.js) syntax.
### `#exclude` — removes fragments of code
Source:
```js
//#exclude
console.log(a, b, c)
//#end
```
Result:
```js
```
Useful when you want to remove supporting code from the build, like helper functions etc.
### `#include` — inserts file
Source:
```js
//#include ./c.js
```
`c.js`:
```js
Hello world!
```
Result:
```
Hello world!
```
Files are inserted in a recursive way, so that inserted files will be handled also.
The current directory `.` is taken one of the current file. The current file is that where the current `#inline` directive is.
### `#define` — defines variable to use in preprocessor
Source:
```js
//#define name = "Hello world"
//#define dictToArray = function(dict){ var result = []; for (var key in dict){ result.push(key + " " + dict[key]) }; return result; }
```
Defined variables can be used later in `#put` or `#if`s.
### `#put` — places variable source (uses [tosource](https://github.com/marcello3d/node-tosource) for serialization)
Source:
```js
var projectName = //#put name
//#define a = {a:1, b:2, c:3}
//#put a;
//#put dictToArray(a);
//#put `var a = ` + projectName + `;`
```
Result:
```js
var projectName = 'Hello world'
{a:1, b:2, c:3}
["a 1", "b 2", "c 3"]
```
To output raw code, use markdown inline code notation, like `\`raw code\` + variable`
### `#if`, `#ifdef`, `#ifndef`, `#elif`, `#else`
Source:
```js
//#if DEV
console.log("debug:", result)
//#else
//#put "var projectName = '" + name + "'"
//#endif
```
Result with `DEV === true`:
```js
console.log("debug:", result)
```
Result with `DEV === false`:
```js
var projectName = 'Hello world'
```
For more examples see [test/before.js](https://github.com/dfcreative/homemade/blob/master/test/before.js).
## jQuery/Zepto/vanilla plugin boilerplate
`build.js`:
```js
(function($){
//#ifndef pluginName
var pluginName = "awesomePlugin"
//#else
/* #put `var pluginName = ` + pluginName */
//#endif
//#include "../src/utils.js"
//#include "../src/AwesomePlugin.js"
//jquery-plugin
if ($){
$['fn'][pluginName] = function (arg) {
return this['each'](function(i,e){
var $e = $(e);
var instance = new AwesomePlugin($e[0], arg);
$e.data(pluginName, instance);
})
};
} else {
window[pluginName] = AwesomePlugin;
}
})(window['jQuery'] || window['Zepto']);
```
## Motivation
This plugin was created as a fast replacement to [preprocessor.js](https://github.com/dcodeIO/Preprocessor.js) and alike, due to lack of necessary building features in them on that moment, like `define`, `put` etc.
For now *homemade* has some flaws:
* Insecure − context is defined in global scope, so that you have to beware of variable names in `#define`
* Nested conditions are not supported
* No decent syntax errors detection
## Projects which use _homemade_
* [sticky-js](https://github.com/dfcreative/sticky)
* [imagine-js](https://github.com/dfcreative/imagine)
* [rus-js](https://github.com/dfcreative/rus)
## License
Copyright Dmitry Ivanov.
Written by Dmitry Ivanov.
Licensed under the MIT license.