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;
};