index.js
1.98 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
'use strict'
/*
* pope
*
* (c) Harminder Virk <virk@adonisjs.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
/*
|--------------------------------------------------------------------------
| ES5
|--------------------------------------------------------------------------
|
| Since I want this module to work as it is in browsers, I have used the
| possible plain Javascript
|
*/
/**
* @description get nested properties from a given
* object using dot notation
*
* @method prop
*
* @param {Object} obj
* @param {String} path
*
* @return {Mixed}
*/
var prop = function (obj, path) {
if (typeof (obj) !== 'object' || typeof path !== 'string') {
return obj
}
var pathArr = path.split('.')
for (var i = 0; i < pathArr.length; i++) {
var p = pathArr[i]
obj = obj.hasOwnProperty(p) ? obj[p] : null
if (obj === null) {
break
}
}
return obj
}
/**
* @description parses a given template string and
* replace dynamic placeholders with actual data.
*
* @method pope
*
* @param {String} string
* @param {Object} data
*
* @return {String}
*/
var pope = function (string, data, options) {
options = options || { skipUndefined: false, throwOnUndefined: false }
var regex = /{{2}(.+?)}{2}/g
var result
var formattedString = string
while ((result = regex.exec(string)) !== null) {
var item = result[1].trim()
if (item) {
var value = prop(data, item)
if (value !== undefined && value !== null) {
formattedString = formattedString.replace(result[0], value)
} else if (options.throwOnUndefined) {
var error = new Error('Missing value for ' + result[0])
error.key = item
error.code = 'E_MISSING_KEY'
throw error
} else if (!options.skipUndefined) {
formattedString = formattedString.replace(result[0], '')
}
}
}
return formattedString
}
module.exports = {
pope: pope,
prop: prop
}