Skip to content

Commit

Permalink
package vdf.js for npm; fix #8
Browse files Browse the repository at this point in the history
  • Loading branch information
rossengeorgiev committed Sep 15, 2016
1 parent f7a1024 commit 834a76e
Show file tree
Hide file tree
Showing 4 changed files with 181 additions and 1 deletion.
16 changes: 15 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,23 @@ Install via pypi: `pip install vdf`

### Javascript

Using `vdf.js`

```javascript
data = VDF.parse(vdf_text);
vdf_text = VDF.stringify(data)
vdf_text = VDF.stringify(data);
```

Or the version on `npm` (https://www.npmjs.com/package/simple-vdf)

```bash
npm install simple-vdf
```

```javascript
vdf = require('simple-vdf');
data = vdf.parse(vdf_text);
vdf_text = vdf.stringify(data);
```

### PHP
Expand Down
12 changes: 12 additions & 0 deletions javascript/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@

## simple-vdf

Package for (de)serialization of Valve's KeyValue format (VDF)

## methods

### parse(string)
Parse a string containing VDF and returnan object

### stringify(obj) / dump(obj)
Serializes an objected to VDF
128 changes: 128 additions & 0 deletions javascript/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,128 @@
// a simple parser for Valve's KeyValue format
// https://developer.valvesoftware.com/wiki/KeyValues
//
// author: Rossen Popov, 2014-2016

function parse(text) {
if(typeof text != "string") {
throw new TypeError("VDF.parse: Expecting parameter to be a string");
}

lines = text.split("\n");

var obj = {};
var stack = [obj];
var expect_bracket = false;
var name = "";

var re_kv = new RegExp(
'^("((?:\\\\.|[^\\\\"])+)"|([a-z0-9\\-\\_]+))' +
'([ \t]*(' +
'"((?:\\\\.|[^\\\\"])*)(")?' +
'|([a-z0-9\\-\\_]+)' +
'))?'
);

var i = 0, j = lines.length;
for(; i < j; i++) {
line = lines[i].trim();

// skip empty and comment lines
if( line == "" || line[0] == '/') { continue; }

// one level deeper
if( line[0] == "{" ) {
expect_bracket = false;
continue;
}

if(expect_bracket) {
throw new SyntaxError("VDF.parse: invalid syntax on line " + (i+1));
}

// one level back
if( line[0] == "}" ) {
stack.pop();
continue;
}

// parse keyvalue pairs
while(true) {
m = re_kv.exec(line);

if(m === null) {
throw new SyntaxError("VDF.parse: invalid syntax on line " + (i+1));
}

// qkey = 2
// key = 3
// qval = 6
// vq_end = 7
// val = 8
var key = (m[2] !== undefined) ? m[2] : m[3];
var val = (m[6] !== undefined) ? m[6] : m[8];

if(val === undefined) {
stack[stack.length-1][key] = {};
stack.push(stack[stack.length-1][key]);
expect_bracket = true;
}
else {
if(m[7] === undefined && m[8] === undefined) {
line += "\n" + lines[++i];
continue;
}

stack[stack.length-1][key] = val;
}

break;
}
}

if(stack.length != 1) throw new SyntaxError("VDF.parse: open parentheses somewhere");

return obj;
}

function stringify(obj,pretty) {
if( typeof obj != "object") {
throw new TypeError("VDF.stringify: First input parameter is not an object");
}

pretty = ( typeof pretty == "boolean" && pretty) ? true : false;

return _dump(obj,pretty,0);
}

function _dump(obj,pretty,level) {
if( typeof obj != "object" ) {
throw new TypeError("VDF.stringify: a key has value of type other than string or object");
}

var indent = "\t";
var buf = "";
var line_indent = "";


if(pretty) {
for(var i = 0; i < level; i++ ) {
line_indent += indent;
}
}

for(key in obj) {
if( typeof obj[key] == "object" ) {
buf += [line_indent, '"', key, '"\n', line_indent, '{\n', _dump(obj[key],pretty,level+1), line_indent, "}\n"].join('');
}
else {
buf += [line_indent, '"', key, '" "', String(obj[key]), '"\n'].join('');
}
}

return buf;
}

exports.parse = parse;
exports.stringify = stringify;
exports.dump = stringify;
26 changes: 26 additions & 0 deletions javascript/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
{
"author": "Rossen Georgiev <hello@rgp.io>",
"name": "simple-vdf",
"description": "Package for (de)serialization of Valve's KeyValue format (VDF)",
"version": "1.0.0",
"license": "MIT",
"homepage": "https://github.com/rossengeorgiev/vdf-parser",
"readmeFilename": "README.md",
"main": "index.js",
"repository": {
"type": "git",
"url": "git://github.com/rossengeorgiev/vdf-parser.git"
},
"bugs": {
"url": "https://github.com/rossengeorgiev/vdf-parser/issues"
},
"dependencies": {},
"devDependencies": {},
"optionalDependencies": {},
"keywords": [
"vdf",
"keyvalue",
"steam",
"valve"
]
}

0 comments on commit 834a76e

Please sign in to comment.