どのように言った目的の離れたメッセージを覚えておいてください:
Cmabrigde UinervtisyのrscheearchにAoccdrnigします。それは、wrodのltteersがそうであるように、mttaerではありません。rsetはtoatlmsesにすることができ、あなたはそれをwouthitporbelmでsitllraedすることができます。Tihsはbcuseaeであり、huamn mnid deosは、istlefによってervey lteterをレイドしたのではなく、wloheとしてのwrodです。
とにかく、私はページ全体にそれを行う関数を作ろうとしています。この関数にはいくつかのルールがあります。
- 4文字未満がそのままになります。
- 英数字以外の文字は単語の一部としてカウントされません。
- ハイフンでつながれた単語は実際には2つの単語です
- 長さが4以上の場合、単語は文字化けする必要があります(元の単語のようにすることはできません)
- 最初と最後の文字は同じままで、真ん中の文字だけが文字化けします(Hersheezyに感謝)
- テキストは常にランダムで、実行ごとに固有の文字化けを生成する必要があります
- 純粋なJavaScriptとすべてのテキストノードで反復
- 最短の甘いコードが勝ちます。
とにかく、実装するのは簡単なようですが、このタスクを実行するために誰が最もクリーンで明確なコードを作成できるかを確認するためにコンテストを開始するのはどうですか。私のコードから認識せずに自由に借りてください(私は持っています)
私が何かを逃した場合は、コメントに追加してください。とにかく私は非常にハックに取り組んだので、これが私の標準以下の仕事を示しています
var i, j, words, textNodes, punct = /[^a-zA-Z0-9]/;
Array.prototype.shuffle = function() {
for (var i = 0; i < this.length; i++) {
var j = i;
while (j == i) {
j = Math.floor(Math.random() * this.length);
}
var tmp = this[i];
this[i] = this[j];
this[j] = tmp;
}
return this;
};
String.prototype.shuffle = function() {
return this.split('').shuffle().join('');
};
function transverse(element, array) {
if (!array) array = [];
if (element.nodeType === 3) {
array.push(element);
} else {
for (var i = 0; i < element.childNodes.length; i++) {
transverse(element.childNodes[i], array);
}
}
return array;
}
function garble(str) {
if (!str) return '';
str = str.trim();
if (/-/.test(str)) {
str = str.split('-');
for (var i = 0; i < str.length; i++) {
str[i] = garble(str[i]);
}
return str.join('-')
}
if (punct.test(str.charAt(0))) {
return str.charAt(0) + garble(str.slice(1));
}
if (punct.test(str.charAt(str.length - 1))) {
return garble(str.slice(0, -1)) + str.charAt(str.length - 1);
}
if (str.length < 4) return str;
if (str.length === 4) return str.charAt(0) + str.charAt(2) + str.charAt(1) + str.charAt(3)
return str.charAt(0) + str.substr(1, str.length - 2).shuffle() +
str.charAt(str.length - 1);
}
window.onload = function() {
textNodes = transverse(document.documentElement);
for (i = 0; i < textNodes.length; i++) {
words = textNodes[i].data.split(' ');
for (j = 0; j < words.length; j++) {
words[j] = garble(words[j]);
}
textNodes[i].data = words.join(' ');
}
};