/script-kiddie/002_script_kiddie/script-kiddie/node_modules/ini/README.md |
@@ -0,0 +1,102 @@ |
An ini format parser and serializer for node. |
|
Sections are treated as nested objects. Items before the first |
heading are saved on the object directly. |
|
## Usage |
|
Consider an ini-file `config.ini` that looks like this: |
|
; this comment is being ignored |
scope = global |
|
[database] |
user = dbuser |
password = dbpassword |
database = use_this_database |
|
[paths.default] |
datadir = /var/lib/data |
array[] = first value |
array[] = second value |
array[] = third value |
|
You can read, manipulate and write the ini-file like so: |
|
var fs = require('fs') |
, ini = require('ini') |
|
var config = ini.parse(fs.readFileSync('./config.ini', 'utf-8')) |
|
config.scope = 'local' |
config.database.database = 'use_another_database' |
config.paths.default.tmpdir = '/tmp' |
delete config.paths.default.datadir |
config.paths.default.array.push('fourth value') |
|
fs.writeFileSync('./config_modified.ini', ini.stringify(config, { section: 'section' })) |
|
This will result in a file called `config_modified.ini` being written |
to the filesystem with the following content: |
|
[section] |
scope=local |
[section.database] |
user=dbuser |
password=dbpassword |
database=use_another_database |
[section.paths.default] |
tmpdir=/tmp |
array[]=first value |
array[]=second value |
array[]=third value |
array[]=fourth value |
|
|
## API |
|
### decode(inistring) |
|
Decode the ini-style formatted `inistring` into a nested object. |
|
### parse(inistring) |
|
Alias for `decode(inistring)` |
|
### encode(object, [options]) |
|
Encode the object `object` into an ini-style formatted string. If the |
optional parameter `section` is given, then all top-level properties |
of the object are put into this section and the `section`-string is |
prepended to all sub-sections, see the usage example above. |
|
The `options` object may contain the following: |
|
* `section` A string which will be the first `section` in the encoded |
ini data. Defaults to none. |
* `whitespace` Boolean to specify whether to put whitespace around the |
`=` character. By default, whitespace is omitted, to be friendly to |
some persnickety old parsers that don't tolerate it well. But some |
find that it's more human-readable and pretty with the whitespace. |
|
For backwards compatibility reasons, if a `string` options is passed |
in, then it is assumed to be the `section` value. |
|
### stringify(object, [options]) |
|
Alias for `encode(object, [options])` |
|
### safe(val) |
|
Escapes the string `val` such that it is safe to be used as a key or |
value in an ini-file. Basically escapes quotes. For example |
|
ini.safe('"unsafe string"') |
|
would result in |
|
"\"unsafe string\"" |
|
### unsafe(val) |
|
Unescapes the string `val` |
/script-kiddie/002_script_kiddie/script-kiddie/node_modules/ini/ini.js |
@@ -0,0 +1,190 @@ |
|
exports.parse = exports.decode = decode |
exports.stringify = exports.encode = encode |
|
exports.safe = safe |
exports.unsafe = unsafe |
|
var eol = process.platform === "win32" ? "\r\n" : "\n" |
|
function encode (obj, opt) { |
var children = [] |
, out = "" |
|
if (typeof opt === "string") { |
opt = { |
section: opt, |
whitespace: false |
} |
} else { |
opt = opt || {} |
opt.whitespace = opt.whitespace === true |
} |
|
var separator = opt.whitespace ? " = " : "=" |
|
Object.keys(obj).forEach(function (k, _, __) { |
var val = obj[k] |
if (val && Array.isArray(val)) { |
val.forEach(function(item) { |
out += safe(k + "[]") + separator + safe(item) + "\n" |
}) |
} |
else if (val && typeof val === "object") { |
children.push(k) |
} else { |
out += safe(k) + separator + safe(val) + eol |
} |
}) |
|
if (opt.section && out.length) { |
out = "[" + safe(opt.section) + "]" + eol + out |
} |
|
children.forEach(function (k, _, __) { |
var nk = dotSplit(k).join('\\.') |
var section = (opt.section ? opt.section + "." : "") + nk |
var child = encode(obj[k], { |
section: section, |
whitespace: opt.whitespace |
}) |
if (out.length && child.length) { |
out += eol |
} |
out += child |
}) |
|
return out |
} |
|
function dotSplit (str) { |
return str.replace(/\1/g, '\u0002LITERAL\\1LITERAL\u0002') |
.replace(/\\\./g, '\u0001') |
.split(/\./).map(function (part) { |
return part.replace(/\1/g, '\\.') |
.replace(/\2LITERAL\\1LITERAL\2/g, '\u0001') |
}) |
} |
|
function decode (str) { |
var out = {} |
, p = out |
, section = null |
, state = "START" |
// section |key = value |
, re = /^\[([^\]]*)\]$|^([^=]+)(=(.*))?$/i |
, lines = str.split(/[\r\n]+/g) |
, section = null |
|
lines.forEach(function (line, _, __) { |
if (!line || line.match(/^\s*[;#]/)) return |
var match = line.match(re) |
if (!match) return |
if (match[1] !== undefined) { |
section = unsafe(match[1]) |
p = out[section] = out[section] || {} |
return |
} |
var key = unsafe(match[2]) |
, value = match[3] ? unsafe((match[4] || "")) : true |
switch (value) { |
case 'true': |
case 'false': |
case 'null': value = JSON.parse(value) |
} |
|
// Convert keys with '[]' suffix to an array |
if (key.length > 2 && key.slice(-2) === "[]") { |
key = key.substring(0, key.length - 2) |
if (!p[key]) { |
p[key] = [] |
} |
else if (!Array.isArray(p[key])) { |
p[key] = [p[key]] |
} |
} |
|
// safeguard against resetting a previously defined |
// array by accidentally forgetting the brackets |
if (Array.isArray(p[key])) { |
p[key].push(value) |
} |
else { |
p[key] = value |
} |
}) |
|
// {a:{y:1},"a.b":{x:2}} --> {a:{y:1,b:{x:2}}} |
// use a filter to return the keys that have to be deleted. |
Object.keys(out).filter(function (k, _, __) { |
if (!out[k] || typeof out[k] !== "object" || Array.isArray(out[k])) return false |
// see if the parent section is also an object. |
// if so, add it to that, and mark this one for deletion |
var parts = dotSplit(k) |
, p = out |
, l = parts.pop() |
, nl = l.replace(/\\\./g, '.') |
parts.forEach(function (part, _, __) { |
if (!p[part] || typeof p[part] !== "object") p[part] = {} |
p = p[part] |
}) |
if (p === out && nl === l) return false |
p[nl] = out[k] |
return true |
}).forEach(function (del, _, __) { |
delete out[del] |
}) |
|
return out |
} |
|
function isQuoted (val) { |
return (val.charAt(0) === "\"" && val.slice(-1) === "\"") |
|| (val.charAt(0) === "'" && val.slice(-1) === "'") |
} |
|
function safe (val) { |
return ( typeof val !== "string" |
|| val.match(/[=\r\n]/) |
|| val.match(/^\[/) |
|| (val.length > 1 |
&& isQuoted(val)) |
|| val !== val.trim() ) |
? JSON.stringify(val) |
: val.replace(/;/g, '\\;').replace(/#/g, "\\#") |
} |
|
function unsafe (val, doUnesc) { |
val = (val || "").trim() |
if (isQuoted(val)) { |
// remove the single quotes before calling JSON.parse |
if (val.charAt(0) === "'") { |
val = val.substr(1, val.length - 2); |
} |
try { val = JSON.parse(val) } catch (_) {} |
} else { |
// walk the val to find the first not-escaped ; character |
var esc = false |
var unesc = ""; |
for (var i = 0, l = val.length; i < l; i++) { |
var c = val.charAt(i) |
if (esc) { |
if ("\\;#".indexOf(c) !== -1) |
unesc += c |
else |
unesc += "\\" + c |
esc = false |
} else if (";#".indexOf(c) !== -1) { |
break |
} else if (c === "\\") { |
esc = true |
} else { |
unesc += c |
} |
} |
if (esc) |
unesc += "\\" |
return unesc |
} |
return val |
} |
/script-kiddie/002_script_kiddie/script-kiddie/node_modules/ini/package.json |
@@ -0,0 +1,89 @@ |
{ |
"_args": [ |
[ |
{ |
"raw": "ini@^1.3.4", |
"scope": null, |
"escapedName": "ini", |
"name": "ini", |
"rawSpec": "^1.3.4", |
"spec": ">=1.3.4 <2.0.0", |
"type": "range" |
}, |
"/Users/evacomaroski/Documents/Development/corrade-nucleus-nucleons/script-kiddie/002_script_kiddie/script-kiddie/node_modules/config-chain" |
] |
], |
"_from": "ini@>=1.3.4 <2.0.0", |
"_id": "ini@1.3.4", |
"_inCache": true, |
"_location": "/ini", |
"_nodeVersion": "2.0.1", |
"_npmUser": { |
"name": "isaacs", |
"email": "isaacs@npmjs.com" |
}, |
"_npmVersion": "2.10.1", |
"_phantomChildren": {}, |
"_requested": { |
"raw": "ini@^1.3.4", |
"scope": null, |
"escapedName": "ini", |
"name": "ini", |
"rawSpec": "^1.3.4", |
"spec": ">=1.3.4 <2.0.0", |
"type": "range" |
}, |
"_requiredBy": [ |
"/config-chain" |
], |
"_resolved": "http://grimore.org:4873/ini/-/ini-1.3.4.tgz", |
"_shasum": "0537cb79daf59b59a1a517dff706c86ec039162e", |
"_shrinkwrap": null, |
"_spec": "ini@^1.3.4", |
"_where": "/Users/evacomaroski/Documents/Development/corrade-nucleus-nucleons/script-kiddie/002_script_kiddie/script-kiddie/node_modules/config-chain", |
"author": { |
"name": "Isaac Z. Schlueter", |
"email": "i@izs.me", |
"url": "http://blog.izs.me/" |
}, |
"bugs": { |
"url": "https://github.com/isaacs/ini/issues" |
}, |
"dependencies": {}, |
"description": "An ini encoder/decoder for node", |
"devDependencies": { |
"tap": "^1.2.0" |
}, |
"directories": {}, |
"dist": { |
"shasum": "0537cb79daf59b59a1a517dff706c86ec039162e", |
"tarball": "http://grimore.org:4873/ini/-/ini-1.3.4.tgz" |
}, |
"engines": { |
"node": "*" |
}, |
"files": [ |
"ini.js" |
], |
"gitHead": "4a3001abc4c608e51add9f1d2b2cadf02b8e6dea", |
"homepage": "https://github.com/isaacs/ini#readme", |
"license": "ISC", |
"main": "ini.js", |
"maintainers": [ |
{ |
"name": "isaacs", |
"email": "i@izs.me" |
} |
], |
"name": "ini", |
"optionalDependencies": {}, |
"readme": "ERROR: No README data found!", |
"repository": { |
"type": "git", |
"url": "git://github.com/isaacs/ini.git" |
}, |
"scripts": { |
"test": "tap test/*.js" |
}, |
"version": "1.3.4" |
} |