JSFiddle - React, Tailwind, and code Playground
HTML
<table>
<tr>
<th>DogeON</th>
<th>JSON</th>
<th>Test</th>
</tr>
<tr class="test">
<td class="input">such "foo" is "bar" wow</td>
<td class="output"></td>
<td><span class="expected">{"foo":"bar"}</span><span class="result"></span></td>
</tr>
<tr class="test">
<td class="input">such "foo" is so "bar" and "baz" also "fizzbuzz" many wow</td>
<td class="output"></td>
<td><span class="expected">{"foo":["bar","baz","fizzbuzz"]}</span><span class="result"></span></td>
</tr>
<tr class="test">
<td class="input">such "foo" is 42very3 wow</td>
<td class="output"></td>
<td><span class="expected">{"foo":42000}</span><span class="result"></span></td>
</tr>
<tr class="test">
<td class="input">such " \"such " is "bar" wow</td>
<td class="output"></td>
<td><span class="expected">{" \"such ":"bar"}</span><span class="result"></span></td>
</tr>
<tr class="test">
<td><pre class="input">such
" such " is "very bar" wow
</pre></td>
<td class="output"></td>
<td><span class="expected">{" such ":"very bar"}</span><span class="result"></span></td>
</tr>
<tr class="test">
<td class="input">such "foo" is empty wow</td>
<td class="output"></td>
<td><span class="expected">{"foo":null}</span><span class="result"></span></td>
</tr>
<tr class="test">
<td class="input">such "foo" is so no and yes many wow</td>
<td class="output"></td>
<td><span class="expected">{"foo":[false,true]}</span><span class="result"></span></td>
</tr>
<tr class="test">
<td class="input">such "foo" is so "yes" and "no" many wow</td>
<td class="output"></td>
<td><span class="expected">{"foo":["yes","no"]}</span><span class="result"></span></td>
</tr>
<tr class="test">
<td class="input">such "foo" is...
CSS
.expected { display: none }
table { border-collapse: collapse }
table td, th { border: 1px solid #ddd }
JavaScript
// Version 3very-1
// such yes, many no. and also empty? so very wow!
var dogeONtoJSON = (function () {
var keywords = {
"such" : "{",
"wow" : "}",
"is" : ":",
"so" : "[",
"and" : ",",
"also" : ",",
"many" : "]",
"yes" : "true",
"no" : "false",
"empty" : "null",
"." : ",",
"," : ",",
"!" : ",",
"?" : ","
};
return function (dogeon) {
if (!dogeon) return {};
var tokens = [];
var i = 0;
var inString = false;
var stringQuote = '"';
var currentToken = "";
var currentChar = "";
var testNumeric = "";
var dogeIsEscaping = false;
while (i < dogeon.length) {
currentChar = dogeon[i];
if (!inString && currentChar == '"') {
inString = true;
stringQuote = currentChar;
currentToken += currentChar;
} else if (inString) {
if (!dogeIsEscaping && currentChar == stringQuote) {
currentToken += currentChar;
tokens.push(currentToken);
inString = false;
currentToken = "";
} else if (currentChar == "\\") {
dogeIsEscaping = true;
currentToken += currentChar;
} else {
currentToken += currentChar;
dogeIsEscaping = false;
}
} else if (currentChar === " " ||
currentChar === "\n" ||
currentChar === "\r" ||
currentChar === "\t") {
if (currentToken !== "") {
tokens.push(currentToken);
currentToken = "";
}
} else if (currentChar === "," ||
...