diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..c9c636a
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+Tests/Experimental
\ No newline at end of file
diff --git a/README.md b/README.md
index 9c78e1c..973a669 100644
--- a/README.md
+++ b/README.md
@@ -1,2 +1,17 @@
-**Work In Progress**
+# HJSON [![Badge License]][License]
+
+*A parser / stringifier for @hjson.*
+
+
+
+
+
+
+
+[License]: LICENSE
+
+
+
+
+[Badge License]: https://img.shields.io/badge/License-AGPL3-015d93.svg?style=for-the-badge&labelColor=blue
\ No newline at end of file
diff --git a/Source/Decode.js b/Source/Decode.js
index 8799419..159fbe4 100644
--- a/Source/Decode.js
+++ b/Source/Decode.js
@@ -9,7 +9,7 @@ const { log } = console;
export default function decode(string){
- log([ ... normalize(new Tokenizer(string).iterator()) ]);
+ // log([ ... normalize(new Tokenizer(string).iterator()) ]);
const tokens = normalize(new Tokenizer(string).iterator());
@@ -28,7 +28,7 @@ export default function decode(string){
function object(state){
- log('\nObject\n')
+ // log('\nObject\n')
const { object , tokens } = state;
@@ -58,7 +58,7 @@ function object(state){
function member(state){
- log('\nMember\n')
+ // log('\nMember\n')
const { tokens , parent , key } = state;
@@ -158,7 +158,7 @@ function member(state){
function array(state){
- log('\nArray\n')
+ // log('\nArray\n')
const { array , tokens } = state;
@@ -218,6 +218,8 @@ function array(state){
return;
case 'Newline' :
break;
+ case 'Comma' :
+ break;
default:
throw `Invalid Array Value Token ${ token.value.type }`;
}
@@ -232,14 +234,14 @@ function array(state){
const { type } = token.value;
- if(type === 'Comma')
- break;
+ if(
+ type === 'Comma' ||
+ type === 'Newline'
+ ) break;
switch(type){
case 'ArrayEnd' :
return;
- case 'Newline' :
- break;
default:
throw `Invalid Array Seperator Token ${ token.value.type }`;
}
diff --git a/Source/Normalize.js b/Source/Normalize.js
index a3a67af..92dd268 100644
--- a/Source/Normalize.js
+++ b/Source/Normalize.js
@@ -164,10 +164,16 @@ function * forwardCombine(tokens){
if(
nowType === 'Newline' ||
- nowType === 'Space' ||
- nowType === 'Comma'
+ nowType === 'Space'
) continue;
+ if(
+ nowType === 'Comma'
+ ){
+ before = { type : 'Comma' }
+ continue;
+ }
+
break;
case 'Space' :
diff --git a/Source/Parse.js b/Source/Parse.js
index feef11f..39f3007 100644
--- a/Source/Parse.js
+++ b/Source/Parse.js
@@ -14,7 +14,7 @@ export default function parse(object){
object[key] = string(value);
continue;
case 'array' :
- array(value);
+ parse(value);
continue;
case 'object' :
parse(value);
@@ -36,7 +36,7 @@ function string(value){
switch(true){
case is_bool.test(value):
- return Boolean(value);
+ return value === 'true';
case is_number.test(value):
return parseFloat(value);
default:
@@ -48,8 +48,3 @@ function string(value){
return value;
}
}
-
-function array(value){
-
-
-}
\ No newline at end of file
diff --git a/Source/README.md b/Source/README.md
index 0372be2..ebff050 100644
--- a/Source/README.md
+++ b/Source/README.md
@@ -1,2 +1,66 @@
-**Work In Progress**
\ No newline at end of file
+# HJSON [![Badge License]][License]
+
+*A parser / stringifier for **[HJSON]**.*
+
+
+
+## Import
+
+```JavaScript
+import HJson from 'https://deno.land/x/hjson/mod.ts'
+```
+
+
+
+
+## Parsing
+
+```JavaScript
+import { parse } from 'https://deno.land/x/hjson/mod.ts'
+
+const { log } = console;
+
+const hjson = `{
+ some : 3
+ variables : [
+ with ,
+ a
+ lot
+ ]
+ inside : {
+ them : 9
+ }
+}`
+
+log(parse(hjson));
+
+
+/*
+ * {
+ * some : 3 ,
+ * variables : [ 'with' , 'a' , 'lot' ] ,
+ * inside : { them : 9 }
+ * }
+ */
+```
+
+
+
+
+## Stringification
+
+**Work In Progress**
+
+
+
+
+
+
+[License]: LICENSE
+[HJSON]: https://hjson.github.io/
+
+
+
+
+[Badge License]: https://img.shields.io/badge/License-AGPL3-015d93.svg?style=for-the-badge&labelColor=blue
\ No newline at end of file
diff --git a/Source/mod.ts b/Source/mod.ts
index 4b61b9b..886e73d 100644
--- a/Source/mod.ts
+++ b/Source/mod.ts
@@ -4,4 +4,6 @@ import decode from './Decode.js'
export function parse ( text : string ) : object {
return decode(text);
-}
\ No newline at end of file
+}
+
+export default { parse }
\ No newline at end of file
diff --git a/Tests/Array.test.js b/Tests/Array.test.js
new file mode 100644
index 0000000..3d6ea78
--- /dev/null
+++ b/Tests/Array.test.js
@@ -0,0 +1,33 @@
+
+const raw = `{
+
+ AnArray : [
+ 10,
+ 2
+
+ 3
+
+ 4,
+
+ 5
+ ]
+}
+
+
+`
+
+const model = {
+ AnArray : [ 10 , 2 , 3 , 4 , 5 ]
+}
+
+
+import { assertEquals } from 'Assert';
+import { parse } from '../Source/mod.ts'
+
+
+Deno.test('Array Parsing Test',() => {
+
+ const parsed = parse(raw);
+
+ assertEquals(parsed,model);
+});
\ No newline at end of file
diff --git a/Tests/Basic.test.js b/Tests/Basic.test.js
index 92e86c6..a12241f 100644
--- a/Tests/Basic.test.js
+++ b/Tests/Basic.test.js
@@ -49,15 +49,14 @@ const model = {
}
-import { assertEquals } from 'https://deno.land/std@0.149.0/testing/asserts.ts';
-import { parse } from '../Source/mod.ts'
+import { assertEquals } from 'Assert';
+// import { parse } from '../Source/mod.ts'
+import HJSON from '../Source/mod.ts'
Deno.test('Generic Parsing Test',() => {
- const parsed = parse(raw);
-
- console.log(parsed);
+ const parsed = HJSON.parse(raw);
assertEquals(parsed,model);
});
\ No newline at end of file
diff --git a/Tests/Example.test.js b/Tests/Example.test.js
new file mode 100644
index 0000000..dd932ed
--- /dev/null
+++ b/Tests/Example.test.js
@@ -0,0 +1,30 @@
+
+const raw = `{
+ some : 3
+ variables : [
+ with ,
+ a
+ lot
+ ]
+ inside : {
+ them : 9
+ }
+}`
+
+const model = {
+ some : 3 ,
+ variables : [ 'with' , 'a' , 'lot' ] ,
+ inside : { them : 9 }
+}
+
+
+import { assertEquals } from 'Assert';
+import { parse } from '../Source/mod.ts'
+
+
+Deno.test('Example Parsing Test',() => {
+
+ const parsed = parse(raw);
+
+ assertEquals(parsed,model);
+});
\ No newline at end of file