This repository has been archived by the owner on Aug 11, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 3k
/
ini-parser.js
60 lines (54 loc) · 1.61 KB
/
ini-parser.js
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
var sys = require('sys')
exports.parse = function parse (d) {
var ini = {'-':{}}
, section = '-'
, lines = d.split('\n')
for (var i = 0, l = lines.length; i < l; i++ ) {
var line = lines[i].trim()
, rem = line.indexOf(";")
if (rem !== -1) line = line.substr(0, rem)
var re = /^\[([^\]]*)\]$|^([^=]+)(=(.*))?$/i
, match = line.match(re)
if (match) {
if (match[1] !== undefined) {
section = match[1].trim()
ini[section] = {}
} else {
var key = match[2].trim()
, value = (match[3]) ? (match[4] || "").trim() : true
ini[section][key] = value
}
}
}
return ini
}
function safe (val) { return (val+"").replace(/[\n\r]+/g, " ") }
// ForEaches over an object. The only thing faster is to inline this function.
function objectEach(obj, fn, thisObj) {
var keys = Object.keys(obj)
for (var i = 0, l = keys.length; i < l; i++) {
var key = keys[i]
fn.call(thisObj, obj[key], key, obj)
}
}
exports.stringify = function stringify (obj) {
// if the obj has a "-" section, then do that first.
var ini = []
if ("-" in obj) {
objectEach(obj["-"], function (value, key) {
ini[ini.length] = safe(key) + " = " + safe(value) + "\n"
})
}
objectEach(obj, function (section, name) {
if (name === "-") return undefined
ini[ini.length] = "[" + safe(name) + "]\n"
objectEach(section, function (value, key) {
ini[ini.length] = safe(key) + ((value === true)
? "\n"
: " = "+safe(value)+"\n")
})
})
return ini.join("")
}
exports.encode = exports.stringify
exports.decode = exports.parse