Comparing version 0.2.0 to 0.3.0
{ | ||
"name": "delims", | ||
"version": "0.2.0", | ||
"version": "0.3.0", | ||
"main": [ | ||
@@ -5,0 +5,0 @@ "index.js" |
89
index.js
@@ -11,13 +11,17 @@ /*! | ||
var utils = require('./lib/utils'); | ||
var arrayify = require('arrayify-compact'); | ||
var extend = require('xtend'); | ||
// Generate RegExp patterns dynamically. By default, patterns use | ||
// [\s\S] instead to avoid the need for multiline and dotall flags. | ||
var delims = module.exports = function (delims, options) { | ||
if(!Array.isArray(delims)) {options = delims; delims = ['---', '---'];} | ||
/** | ||
* Generate regular expressions for template delimiters. | ||
* | ||
* @param {Array} `delims` | ||
* @param {Object} `options` | ||
*/ | ||
// Defaults | ||
var opts = extend({}, { | ||
var Delimiters = function Delimiters (delims, options) { | ||
this.options = options || {}; | ||
this.delims = delims || []; | ||
this.defaults = extend({}, { | ||
beginning: '^', // '^' Matches beginning of input. | ||
@@ -27,8 +31,29 @@ matter: '([\\s\\S]+?)', // The "content" between the delims | ||
end: '$', // '$' Matches end of input. | ||
flags: '' // g, m, i | ||
flags: '' // RegExp flags: g, m, i | ||
}, options); | ||
}; | ||
/** | ||
* ## .create | ||
* | ||
* Build custom delimiter regex. | ||
* | ||
* @param {Array} `delims` | ||
* @param {Object} `options` | ||
* @return {Object} | ||
*/ | ||
Delimiters.prototype.create = function(delims, options) { | ||
if (!Array.isArray(delims)) { | ||
options = delims; | ||
delims = ['---', '---']; | ||
} | ||
// Defaults | ||
var opts = extend({}, this.defaults, options); | ||
opts.body = delims[2] || opts.body || ''; | ||
// Generate regex ections | ||
var open = utils.buildRegexGroup(delims[0], opts); | ||
var open = utils.buildRegexGroup(delims[0], opts); | ||
var close = utils.buildRegexGroup(delims[1], opts); | ||
@@ -38,11 +63,47 @@ var block = opts.matter + close + opts.body + opts.end; | ||
// "evaluate" is probably most suitable for most use cases | ||
return { | ||
return extend(opts, {open: open, close: close, delims: delims}, { | ||
evaluate: new RegExp(opts.beginning + open + block, opts.flags), | ||
interpolate: new RegExp(opts.beginning + open + '=' + block, opts.flags), | ||
escape: new RegExp(opts.beginning + open + '-' + block, opts.flags), | ||
}; | ||
}); | ||
}; | ||
delims.arrayify = arrayify; | ||
delims.escapeDelim = utils.escapeDelim; | ||
delims.buildRegexGroup = utils.buildRegexGroup; | ||
/** | ||
* ## .matter | ||
* | ||
* Convenience method for generating delimiter regex for front matter, | ||
* with the necessary options pre-defined. | ||
* | ||
* @param {Array} `delims` | ||
* @param {Object} `options` | ||
* @return {Object} | ||
*/ | ||
Delimiters.prototype.matter = function (delims, opts) { | ||
return this.create(delims, opts); | ||
}; | ||
/** | ||
* ## .templates | ||
* | ||
* Convenience method for generating delimiter regex for templates, | ||
* with the necessary options pre-defined. | ||
* | ||
* @param {Array} `delims` | ||
* @param {Object} `options` | ||
* @return {Object} | ||
*/ | ||
Delimiters.prototype.templates = function (delims, opts) { | ||
return this.create(delims, extend({ | ||
body: '', | ||
beginning: '', | ||
end: '', | ||
flags: 'g', | ||
noncapture: false | ||
}, opts)); | ||
}; | ||
module.exports = Delimiters; |
@@ -13,3 +13,3 @@ /*! | ||
var utils = module.exports = {}; | ||
var utils = module.exports; | ||
@@ -21,2 +21,3 @@ // Escape custom template delimiters | ||
// Build RegExp patterns for delimiters | ||
@@ -33,3 +34,5 @@ utils.buildRegexGroup = function (re, options) { | ||
re = (len > 0) ? re.join('|') : re; | ||
re = (opts.escape === true) ? utils.escapeDelim(re) : re; | ||
re = (opts.escape === true) | ||
? utils.escapeDelim(re) | ||
: re; | ||
@@ -36,0 +39,0 @@ if(opts.noncapture === true || len > 1) { |
{ | ||
"name": "delims", | ||
"description": "Generate RegExp for delimiters, to be used with templates, files or data streams.", | ||
"version": "0.2.0", | ||
"version": "0.3.0", | ||
"homepage": "https://github.com/jonschlinkert/delims", | ||
@@ -36,14 +36,21 @@ "author": { | ||
"keywords": [ | ||
"yfm", | ||
"yaml front matter", | ||
"front matter", | ||
"templates", | ||
"boundaries", | ||
"custom", | ||
"customize", | ||
"delimiters", | ||
"delims", | ||
"expressions", | ||
"front", | ||
"matter", | ||
"pattern", | ||
"patterns", | ||
"re", | ||
"regex", | ||
"regexp", | ||
"regular expressions", | ||
"custom delimiters", | ||
"delims", | ||
"delimiters", | ||
"boundaries" | ||
"regular", | ||
"template", | ||
"templates", | ||
"yaml", | ||
"yfm" | ||
] | ||
} | ||
} |
@@ -22,10 +22,82 @@ # delims [![NPM version](https://badge.fury.io/js/delims.png)](http://badge.fury.io/js/delims) | ||
```js | ||
var delims = require('delims'); | ||
var Delims = require('delims'); | ||
var delims = new Delims(); | ||
``` | ||
delims([delimiters], {options}); | ||
# API | ||
## .create | ||
```js | ||
delims.create(array, options); | ||
``` | ||
## Parameters | ||
* `array`: | ||
#### delimiter | ||
Build custom delimiter regex with the given `options`. | ||
**Example:** | ||
By default, if no options are defined `delims.create()` generates regex for front-matter: | ||
```js | ||
var matter = delims.create().evaluate; | ||
//=> '/^---([\\s\\S]+?)---([\\s\\S]+|\\s?)$/' | ||
``` | ||
**Customize:** | ||
To customize, pass the delimiters you want to use in the form of an array. Here a couple examples: | ||
```js | ||
var matter = delims.create(['~~~', '~~~']).evaluate; | ||
//=> '/^~~~([\\s\\S]+?)~~~([\\s\\S]+|\\s?)$/'; | ||
var matter = delims.create(['~{3}', '~{3}']).evaluate; | ||
//=> '/^~{3}([\\s\\S]+?)~{3}([\\s\\S]+|\\s?)$/'; | ||
``` | ||
Read [more about delimiters](#delimiters). | ||
## .templates | ||
Convenience method for generating delimiter regex for templates with the necessary options pre-defined. | ||
**Example:** | ||
Let's say you want to use curly braces as delimiters for Lo-Dash templates instead of angle brackes, e.g. `{%= name %}`. | ||
```js | ||
var settings = delims.templates(['{{', '}}']); | ||
// use it like this | ||
var tmpl = _.template('{%= name %}', {name: 'Jon'}, settings); | ||
console.log(tmpl); | ||
//=> Jon | ||
``` | ||
The full object returned looks something like: | ||
```js | ||
{ | ||
beginning: '', | ||
matter: '([\\s\\S]+?)', | ||
body: '', | ||
end: '', | ||
flags: 'g', | ||
noncapture: false, | ||
delims: [ '{%', '%}' ], | ||
open: '{%', | ||
close: '%}', | ||
evaluate: /{%([\s\S]+?)%}/g, | ||
interpolate: /{%=([\s\S]+?)%}/g, | ||
escape: /{%-([\s\S]+?)%}/g | ||
} | ||
``` | ||
## delimiters | ||
Type: `Array` | ||
@@ -55,3 +127,3 @@ | ||
## Options | ||
## options | ||
@@ -86,3 +158,3 @@ An object of options may be passed as a second parameter. Example: | ||
## RegExp Options | ||
### RegExp Options | ||
#### beginning | ||
@@ -95,3 +167,3 @@ Type: `Boolean` | ||
### end | ||
#### end | ||
Type: `Boolean` | ||
@@ -103,3 +175,3 @@ | ||
#### escape | ||
### escape | ||
Type: `Boolean` | ||
@@ -111,3 +183,3 @@ | ||
#### noncapture | ||
### noncapture | ||
Type: `Boolean` | ||
@@ -119,3 +191,3 @@ | ||
#### flags | ||
### flags | ||
Type: `Boolean` | ||
@@ -122,0 +194,0 @@ |
255
test/test.js
@@ -8,117 +8,192 @@ /*! | ||
const util = require('util'); | ||
const expect = require('chai').expect; | ||
const delims = require('../'); | ||
'use strict'; | ||
var util = require('util'); | ||
var expect = require('chai').expect; | ||
var Delimiters = require('..'); | ||
describe('create delims:', function () { | ||
it('should use the default delimiters for YAML front matter.', function () { | ||
var d = delims(); | ||
describe('delimiters:', function () { | ||
describe('.create():', function () { | ||
var delims = new Delimiters(); | ||
var actual = util.inspect(d.evaluate); | ||
var expected = '/^---([\\s\\S]+?)---([\\s\\S]+|\\s?)$/'; | ||
expect(actual).to.eql(expected); | ||
}); | ||
it('should use the default delimiters for YAML front matter.', function () { | ||
var d = delims.create(); | ||
var actual = util.inspect(d.evaluate); | ||
var expected = '/^---([\\s\\S]+?)---([\\s\\S]+|\\s?)$/'; | ||
expect(actual).to.eql(expected); | ||
}); | ||
it('should use and escape the default delimiters for YAML front matter.', function () { | ||
var d = delims({escape: true}); | ||
it('should use and escape the default delimiters for YAML front matter.', function () { | ||
var d = delims.create({escape: true}); | ||
var actual = util.inspect(d.evaluate); | ||
var expected = '/^\\-\\-\\-([\\s\\S]+?)\\-\\-\\-([\\s\\S]+|\\s?)$/'; | ||
expect(actual).to.eql(expected); | ||
}); | ||
var actual = util.inspect(d.evaluate); | ||
var expected = '/^\\-\\-\\-([\\s\\S]+?)\\-\\-\\-([\\s\\S]+|\\s?)$/'; | ||
expect(actual).to.eql(expected); | ||
}); | ||
it('should create escaped delimiters for YAML front matter.', function () { | ||
var d = delims.create(['~~~', '~~~'], {escape: true}); | ||
var actual = util.inspect(d.evaluate); | ||
var expected = '/^\\~\\~\\~([\\s\\S]+?)\\~\\~\\~([\\s\\S]+|\\s?)$/'; | ||
expect(actual).to.eql(expected); | ||
}); | ||
it('should create escaped delimiters for YAML front matter.', function () { | ||
var d = delims(['~~~', '~~~'], {escape: true}); | ||
it('should create non-escaped delimiters for YAML front matter.', function () { | ||
var d = delims.create(['~~~', '~~~']); | ||
var actual = util.inspect(d.evaluate); | ||
var expected = '/^~~~([\\s\\S]+?)~~~([\\s\\S]+|\\s?)$/'; | ||
expect(actual).to.eql(expected); | ||
}); | ||
var actual = util.inspect(d.evaluate); | ||
var expected = '/^\\~\\~\\~([\\s\\S]+?)\\~\\~\\~([\\s\\S]+|\\s?)$/'; | ||
expect(actual).to.eql(expected); | ||
}); | ||
it('should create non-escaped custom delimiters for YAML front matter.', function () { | ||
var d = delims.create(['-{3}', '-{3}']); | ||
var actual = util.inspect(d.evaluate); | ||
var expected = '/^-{3}([\\s\\S]+?)-{3}([\\s\\S]+|\\s?)$/'; | ||
expect(actual).to.eql(expected); | ||
}); | ||
it('should create non-escaped delimiters for YAML front matter.', function () { | ||
var d = delims(['~~~', '~~~']); | ||
it('should create non-escaped custom delimiters for YAML front matter.', function () { | ||
var d = delims.create(['-{3}', '~~~']); | ||
var actual = util.inspect(d.evaluate); | ||
var expected = '/^-{3}([\\s\\S]+?)~~~([\\s\\S]+|\\s?)$/'; | ||
expect(actual).to.eql(expected); | ||
}); | ||
var actual = util.inspect(d.evaluate); | ||
var expected = '/^~~~([\\s\\S]+?)~~~([\\s\\S]+|\\s?)$/'; | ||
expect(actual).to.eql(expected); | ||
}); | ||
it('should create non-escaped delimiters for YAML front matter with custom "body" regex.', function () { | ||
var d = delims.create(['---', '---', '([\\w\\W]+?)']); | ||
var actual = util.inspect(d.evaluate); | ||
var expected = '/^---([\\s\\S]+?)---([\\w\\W]+?)$/'; | ||
expect(actual).to.eql(expected); | ||
}); | ||
it('should create non-escaped custom delimiters for YAML front matter.', function () { | ||
var d = delims(['-{3}', '-{3}']); | ||
it('should create multiple non-escaped delimiters for YAML front matter.', function () { | ||
var d = delims.create([['---', '~~~', '= yaml ='], ['---', '~~~', '= yaml =']]); | ||
var actual = util.inspect(d.evaluate); | ||
var expected = '/^(?:---|~~~|= yaml =)([\\s\\S]+?)(?:---|~~~|= yaml =)([\\s\\S]+|\\s?)$/'; | ||
expect(actual).to.eql(expected); | ||
}); | ||
var actual = util.inspect(d.evaluate); | ||
var expected = '/^-{3}([\\s\\S]+?)-{3}([\\s\\S]+|\\s?)$/'; | ||
expect(actual).to.eql(expected); | ||
}); | ||
it('should create multiple non-escaped delimiters for YAML front matter with custom "body" regex.', function () { | ||
var d = delims.create([['---', '~~~', '= yaml ='], ['---', '~~~', '= yaml ='], '([\\w\\W]+?)']); | ||
var actual = util.inspect(d.evaluate); | ||
var expected = '/^(?:---|~~~|= yaml =)([\\s\\S]+?)(?:---|~~~|= yaml =)([\\w\\W]+?)$/'; | ||
expect(actual).to.eql(expected); | ||
}); | ||
it('should create non-escaped custom delimiters for YAML front matter.', function () { | ||
var d = delims(['-{3}', '~~~']); | ||
it('should create escaped delimiters for Lo-Dash templates.', function () { | ||
var opts = {body: '', beginning: '', end: '', flags: 'g', noncapture: false, escape: true}; | ||
var actual = delims.create(['{%', '%}'], opts); | ||
expect(actual).to.eql({ | ||
beginning: '', | ||
matter: '([\\s\\S]+?)', | ||
body: '', | ||
end: '', | ||
flags: 'g', | ||
noncapture: false, | ||
delims: [ '{%', '%}' ], | ||
open: '\\{\\%', | ||
close: '\\%\\}', | ||
escape: /\{\%-([\s\S]+?)\%\}/g, | ||
evaluate: /\{\%([\s\S]+?)\%\}/g, | ||
interpolate: /\{\%=([\s\S]+?)\%\}/g | ||
}); | ||
}); | ||
var actual = util.inspect(d.evaluate); | ||
var expected = '/^-{3}([\\s\\S]+?)~~~([\\s\\S]+|\\s?)$/'; | ||
expect(actual).to.eql(expected); | ||
}); | ||
it('should create escaped delimiters for Lo-Dash templates. empty value in array[2] should not throw an error.', function () { | ||
var opts = {body: '', beginning: '', end: '', flags: 'g', noncapture: false, escape: true}; | ||
var actual = delims.create(['<%', '%>', ''], opts); | ||
expect(actual).to.eql({ | ||
beginning: '', | ||
matter: '([\\s\\S]+?)', | ||
body: '', | ||
end: '', | ||
flags: 'g', | ||
noncapture: false, | ||
delims: ['<%', '%>', ''], | ||
open: '\\<\\%', | ||
close: '\\%\\>', | ||
escape: /\<\%-([\s\S]+?)\%\>/g, | ||
evaluate: /\<\%([\s\S]+?)\%\>/g, | ||
interpolate: /\<\%=([\s\S]+?)\%\>/g | ||
}); | ||
}); | ||
it('should create non-escaped delimiters for YAML front matter with custom "body" regex.', function () { | ||
var d = delims(['---', '---', '([\\w\\W]+?)']); | ||
var actual = util.inspect(d.evaluate); | ||
var expected = '/^---([\\s\\S]+?)---([\\w\\W]+?)$/'; | ||
expect(actual).to.eql(expected); | ||
it('should create non-escaped delimiters for Lo-Dash templates.', function () { | ||
var opts = {body: '', beginning: '', end: '', flags: 'g', noncapture: false}; | ||
var actual = delims.create(['{%', '%}'], opts); | ||
expect(actual).to.eql({ | ||
beginning: '', | ||
matter: '([\\s\\S]+?)', | ||
body: '', | ||
end: '', | ||
flags: 'g', | ||
noncapture: false, | ||
delims: [ '{%', '%}' ], | ||
open: '{%', | ||
close: '%}', | ||
evaluate: /{%([\s\S]+?)%}/g, | ||
interpolate: /{%=([\s\S]+?)%}/g, | ||
escape: /{%-([\s\S]+?)%}/g | ||
}); | ||
}); | ||
}); | ||
it('should create multiple non-escaped delimiters for YAML front matter.', function () { | ||
var d = delims([['---', '~~~', '= yaml ='], ['---', '~~~', '= yaml =']]); | ||
var actual = util.inspect(d.evaluate); | ||
var expected = '/^(?:---|~~~|= yaml =)([\\s\\S]+?)(?:---|~~~|= yaml =)([\\s\\S]+|\\s?)$/'; | ||
expect(actual).to.eql(expected); | ||
}); | ||
describe('.templates():', function () { | ||
var delims = new Delimiters(); | ||
it('should create multiple non-escaped delimiters for YAML front matter with custom "body" regex.', function () { | ||
var d = delims([['---', '~~~', '= yaml ='], ['---', '~~~', '= yaml ='], '([\\w\\W]+?)']); | ||
var actual = util.inspect(d.evaluate); | ||
var expected = '/^(?:---|~~~|= yaml =)([\\s\\S]+?)(?:---|~~~|= yaml =)([\\w\\W]+?)$/'; | ||
expect(actual).to.eql(expected); | ||
}); | ||
it('should create escaped delimiters for Lo-Dash templates.', function () { | ||
var opts = {body: '', beginning: '', end: '', flags: 'g', noncapture: false, escape: true}; | ||
var actual = util.inspect(delims(['{%', '%}'], opts)); | ||
var expected = util.inspect({ | ||
evaluate: new RegExp('\\{\\%([\\s\\S]+?)\\%\\}', 'g'), | ||
interpolate: new RegExp('\\{\\%=([\\s\\S]+?)\\%\\}', 'g'), | ||
escape: new RegExp('\\{\\%-([\\s\\S]+?)\\%\\}', 'g') | ||
it('should create escaped delimiters for Lo-Dash templates.', function () { | ||
var actual = delims.templates(['{%', '%}'], {escape: true}); | ||
expect(actual).to.eql({ | ||
beginning: '', | ||
matter: '([\\s\\S]+?)', | ||
body: '', | ||
end: '', | ||
flags: 'g', | ||
noncapture: false, | ||
delims: [ '{%', '%}' ], | ||
open: '\\{\\%', | ||
close: '\\%\\}', | ||
escape: /\{\%-([\s\S]+?)\%\}/g, | ||
evaluate: /\{\%([\s\S]+?)\%\}/g, | ||
interpolate: /\{\%=([\s\S]+?)\%\}/g | ||
}); | ||
}); | ||
expect(actual).to.eql(expected); | ||
}); | ||
it('should create escaped delimiters for Lo-Dash templates. empty value in array[2] should not throw an error.', function () { | ||
var opts = {body: '', beginning: '', end: '', flags: 'g', noncapture: false, escape: true}; | ||
var actual = util.inspect(delims(['<%', '%>', ''], opts)); | ||
var expected = util.inspect({ | ||
evaluate: new RegExp('\\<\\%([\\s\\S]+?)\\%\\>', 'g'), | ||
interpolate: new RegExp('\\<\\%=([\\s\\S]+?)\\%\\>', 'g'), | ||
escape: new RegExp('\\<\\%-([\\s\\S]+?)\\%\\>', 'g') | ||
it('should create escaped delimiters for Lo-Dash templates. empty value in array[2] should not throw an error.', function () { | ||
var actual = delims.templates(['<%', '%>', ''], {escape: true}); | ||
expect(actual).to.eql({ | ||
beginning: '', | ||
matter: '([\\s\\S]+?)', | ||
body: '', | ||
end: '', | ||
flags: 'g', | ||
noncapture: false, | ||
delims: ['<%', '%>', ''], | ||
open: '\\<\\%', | ||
close: '\\%\\>', | ||
escape: /\<\%-([\s\S]+?)\%\>/g, | ||
evaluate: /\<\%([\s\S]+?)\%\>/g, | ||
interpolate: /\<\%=([\s\S]+?)\%\>/g | ||
}); | ||
}); | ||
expect(actual).to.eql(expected); | ||
}); | ||
it('should create non-escaped delimiters for Lo-Dash templates.', function () { | ||
var opts = {body: '', beginning: '', end: '', flags: 'g', noncapture: false}; | ||
var actual = util.inspect(delims(['{%', '%}'], opts)); | ||
var expected = util.inspect({ | ||
evaluate: new RegExp('{%([\\s\\S]+?)%}', 'g'), | ||
interpolate: new RegExp('{%=([\\s\\S]+?)%}', 'g'), | ||
escape: new RegExp('{%-([\\s\\S]+?)%}', 'g') | ||
it('should create non-escaped delimiters for Lo-Dash templates.', function () { | ||
var actual = delims.templates(['{%', '%}']); | ||
expect(actual).to.eql({ | ||
beginning: '', | ||
matter: '([\\s\\S]+?)', | ||
body: '', | ||
end: '', | ||
flags: 'g', | ||
noncapture: false, | ||
delims: [ '{%', '%}' ], | ||
open: '{%', | ||
close: '%}', | ||
evaluate: /{%([\s\S]+?)%}/g, | ||
interpolate: /{%=([\s\S]+?)%}/g, | ||
escape: /{%-([\s\S]+?)%}/g | ||
}); | ||
}); | ||
expect(actual).to.eql(expected); | ||
}); | ||
}); |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
19300
10
299
227
1