Plist to Json

by stevetranby

HTML

<h2>PLIST -> JSON Converter</h2>
<div>
    <textarea id="input" rows="15" cols="70">
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>background</key>
    <string>nav-galaxy.png</string>
    <key>galaxies</key>
    <array>
        <dict>
            <key>location</key>
            <string>{140,130}</string>
            <key>name</key>
            <string>Sol</string>
            <key>systems</key>
            <array>
                <dict>
                    <key>background</key>
                    <string>nav-system-earth.png</string>
                    <key>locations</key>
                    <array>
                        <string>{}</string>
                    </array>
                    <key>missions</key>
                    <array>
                        <dict>
                            <key>difficulty</key>
                            <string>easy</string>
                            <key>location</key>
                            <string>{80,240}</string>
                            <key>locked</key>
                            <false/>
                            <key>missionETA</key>
                            <integer>240</integer>
                            <key>missionTitle</key>
                            <string>Touch the Sun</string>
                            <key>objectives</key>
                            <array/>
                            <key>planetTitle</key>
                            <string>Sun</string>
                        </dict>
                        <dict>
                            <key>difficulty</key>
                            <string>easy</string>
                            <key>location</key>
                            <string>{130,160}</string>
                            <key>locked</key>
                            <false/>
                           ...

CSS

#output { background:gray; }

JavaScript

$(document).ready(function() {
    $('#convert').click(function() {

        var input = $('#input').val();
        var plist = $.parseXML(input);
        console.log("before:" + plist);
        plist = cleanWhitespace(plist);
        console.log("after:" + plist);
        var json = parsePlist(plist);
        console.log("json:" + json);
        var formatted = JSON.stringify(json, null, 4);
        $('#output').text(formatted);
    });
});

cleanWhitespace = function(element) {
    console.log(element);
    console.log(element.childNodes);
    if (element.childNodes !== undefined) {
        for (var i = 0; i < element.childNodes.length; i++) {
            var node = element.childNodes[i];
            console.log("n:" + node);
            if (node.nodeType == 3 && !/\S/.test(node.nodeValue)) {
                console.log("removing node");
                element.remove(node);
            }
        }
    }
    return element;
}

parsePlist = function(plistDoc) {
    var doc = plistDoc.childNodes[1];
    // main dict
    var dict = doc.childNodes[1];
    console.log(dict);

    for (i in dict.childNodes) {
        node = dict.childNodes[i];
        console.log("n:" + node);
    }

    return parsePlistValue(dict);
}

parsePlistDict = function(dictNode) {
    var result = new Object();
    var keyNodes = dictNode.getElementsByTagName("key");
    for (var i = 0, n = keyNodes.length; i < n; i++) {
        var key = keyNodes[i].firstChild.nodeValue;
        var val = parsePlistValue(keyNodes[i].nextSibling.nextSibling);
        result[key] = val;
    }
    return result;
}

parsePlistValue = function(valueNode) {
    var result = null;
    switch (valueNode.nodeName) {
    case "true":
        result = true;
        break;
    case "false":
        result = false;
        break;
    case "string":
        if (valueNode.firstChild != undefined) {
            result = valueNode.firstChild.nodeValue;
            // result = unescape(result);
            // result =...