JoveLang

encoding english text to experiment with human-readable compression techniques

by not important

HTML

<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.1.1/css/bootstrap.min.css">
<script src="//code.jquery.com/jquery-1.11.0.js"></script>
<script src="//netdna.bootstrapcdn.com/bootstrap/3.1.1/js/bootstrap.min.js"></script>
<script src="//gist.githubusercontent.com/clindsey/4f2a1e9072ab08262fcf/raw/ad17c3e22c1de29c68c2ea78e9aa99e85ce36d2e/JoveLang.js"></script>
<div class="container">
     <h1>JoveLang <small>Encoder</small></h1>
    <p class="lead">Experimenting with encoding english text.</p>

    <div class="row">
        <div class="col-md-12">
            <div class="form-group">
                <label class="control-label">Input Text:</label>
                <textarea class="form-control" id="inputBuffer"></textarea>
            </div>
            <div class="form-group">
                <label class="control-label">Output Text:</label>
                <p class="bs-callout-info bs-callout form-control-static" id="outputBuffer"></p>
            </div>
            <div class="form-group">
                <label class="control-label">Compression Factor:</label>
                <p class="form-control-static" id="compressionRatio">0%</p>
            </div>
        </div>
    </div>
</div>

CSS

body {
    margin: 40px 0;
}
.bs-callout {
    padding: 15px 30px 15px 15px;
    border-left: 5px solid #eee;
}
.bs-callout p:last-child {
    margin-bottom: 0;
}
.bs-callout-info {
    background-color: #f0f7fd;
    border-color: #d0e3f0;
}

JavaScript

var $inputBuffer = $('#inputBuffer'),
    $outputBuffer = $('#outputBuffer'),
    $compressionRatio = $('#compressionRatio'),
    timeoutId = undefined,
    joveLang = new JoveLang;

$('body').on('keydown', '#inputBuffer', function () {
    if (timeoutId) {
        clearTimeout(timeoutId);
    }

    timeoutId = setTimeout(function () {
        var inputVal = $inputBuffer.val(),
            outputVal = joveLang.parse(inputVal),
            ratio = Math.floor((1 - outputVal.length / inputVal.length) * 100) || 0;

        $outputBuffer.html(outputVal);
        $compressionRatio.html(ratio + '%');
    }, 1000 / 4);
});

function JoveLang () {
};

JoveLang.alphabet = "БГДЖИЙЛПфЦЧЩЮЯαβγδεζηθκλμξπρςτΨΩΛΔΣٻکجص᚛᚜ᚕᚇㅊㄹ오庁旧万ꃊꃋꌺꈤꄣꈞᎦᏗᎲᎸちにスワシイへうえひとㇽㇹメミアニヒヰのナꎨꃳㄅㄓㄔㄠㄢㄣㄥㄩהאלסשףזוجႠႵもルこゝそッ・んマヵヺろみゐいめれしあ";

JoveLang.prototype.parse = function (inputString) {
    if (inputString.length < 2) {
        return inputString;
    }

    var parsedString = inputString.toLowerCase(),
        pairs = parsedString.match(/[bcdfghjklmnpqrstvwxz][aeiouy]/g);

    if (pairs === null) {
        return inputString;
    }

    for (var i = 0, il = pairs.length; i < il; i += 1) {
        var pair = pairs[i],
            pairParts = pair.split(''),
            consonantIndex = 'bcdfghjklmnpqrstvwxz'.indexOf(pairParts[0]),
            vowelIndex = 'aeiouy'.indexOf(pairParts[1]),
            characterIndex = vowelIndex * 20 + consonantIndex,
            pairMask = JoveLang.alphabet.charAt(characterIndex);

        parsedString = parsedString.split(pair).join(pairMask);
    }

    return parsedString;
};