mirror of
https://codeberg.org/tacerus/teddit.git
synced 2024-11-26 00:59:24 +01:00
248 lines
11 KiB
JavaScript
248 lines
11 KiB
JavaScript
/* Copyright 2013 Google Inc. All Rights Reserved.
|
|
|
|
Licensed under the Apache License, Version 2.0 (the "License");
|
|
you may not use this file except in compliance with the License.
|
|
You may obtain a copy of the License at
|
|
|
|
http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
Unless required by applicable law or agreed to in writing, software
|
|
distributed under the License is distributed on an "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
See the License for the specific language governing permissions and
|
|
limitations under the License.
|
|
|
|
Transformations on dictionary words.
|
|
*/
|
|
|
|
var BrotliDictionary = require('./dictionary');
|
|
|
|
var kIdentity = 0;
|
|
var kOmitLast1 = 1;
|
|
var kOmitLast2 = 2;
|
|
var kOmitLast3 = 3;
|
|
var kOmitLast4 = 4;
|
|
var kOmitLast5 = 5;
|
|
var kOmitLast6 = 6;
|
|
var kOmitLast7 = 7;
|
|
var kOmitLast8 = 8;
|
|
var kOmitLast9 = 9;
|
|
var kUppercaseFirst = 10;
|
|
var kUppercaseAll = 11;
|
|
var kOmitFirst1 = 12;
|
|
var kOmitFirst2 = 13;
|
|
var kOmitFirst3 = 14;
|
|
var kOmitFirst4 = 15;
|
|
var kOmitFirst5 = 16;
|
|
var kOmitFirst6 = 17;
|
|
var kOmitFirst7 = 18;
|
|
var kOmitFirst8 = 19;
|
|
var kOmitFirst9 = 20;
|
|
|
|
function Transform(prefix, transform, suffix) {
|
|
this.prefix = new Uint8Array(prefix.length);
|
|
this.transform = transform;
|
|
this.suffix = new Uint8Array(suffix.length);
|
|
|
|
for (var i = 0; i < prefix.length; i++)
|
|
this.prefix[i] = prefix.charCodeAt(i);
|
|
|
|
for (var i = 0; i < suffix.length; i++)
|
|
this.suffix[i] = suffix.charCodeAt(i);
|
|
}
|
|
|
|
var kTransforms = [
|
|
new Transform( "", kIdentity, "" ),
|
|
new Transform( "", kIdentity, " " ),
|
|
new Transform( " ", kIdentity, " " ),
|
|
new Transform( "", kOmitFirst1, "" ),
|
|
new Transform( "", kUppercaseFirst, " " ),
|
|
new Transform( "", kIdentity, " the " ),
|
|
new Transform( " ", kIdentity, "" ),
|
|
new Transform( "s ", kIdentity, " " ),
|
|
new Transform( "", kIdentity, " of " ),
|
|
new Transform( "", kUppercaseFirst, "" ),
|
|
new Transform( "", kIdentity, " and " ),
|
|
new Transform( "", kOmitFirst2, "" ),
|
|
new Transform( "", kOmitLast1, "" ),
|
|
new Transform( ", ", kIdentity, " " ),
|
|
new Transform( "", kIdentity, ", " ),
|
|
new Transform( " ", kUppercaseFirst, " " ),
|
|
new Transform( "", kIdentity, " in " ),
|
|
new Transform( "", kIdentity, " to " ),
|
|
new Transform( "e ", kIdentity, " " ),
|
|
new Transform( "", kIdentity, "\"" ),
|
|
new Transform( "", kIdentity, "." ),
|
|
new Transform( "", kIdentity, "\">" ),
|
|
new Transform( "", kIdentity, "\n" ),
|
|
new Transform( "", kOmitLast3, "" ),
|
|
new Transform( "", kIdentity, "]" ),
|
|
new Transform( "", kIdentity, " for " ),
|
|
new Transform( "", kOmitFirst3, "" ),
|
|
new Transform( "", kOmitLast2, "" ),
|
|
new Transform( "", kIdentity, " a " ),
|
|
new Transform( "", kIdentity, " that " ),
|
|
new Transform( " ", kUppercaseFirst, "" ),
|
|
new Transform( "", kIdentity, ". " ),
|
|
new Transform( ".", kIdentity, "" ),
|
|
new Transform( " ", kIdentity, ", " ),
|
|
new Transform( "", kOmitFirst4, "" ),
|
|
new Transform( "", kIdentity, " with " ),
|
|
new Transform( "", kIdentity, "'" ),
|
|
new Transform( "", kIdentity, " from " ),
|
|
new Transform( "", kIdentity, " by " ),
|
|
new Transform( "", kOmitFirst5, "" ),
|
|
new Transform( "", kOmitFirst6, "" ),
|
|
new Transform( " the ", kIdentity, "" ),
|
|
new Transform( "", kOmitLast4, "" ),
|
|
new Transform( "", kIdentity, ". The " ),
|
|
new Transform( "", kUppercaseAll, "" ),
|
|
new Transform( "", kIdentity, " on " ),
|
|
new Transform( "", kIdentity, " as " ),
|
|
new Transform( "", kIdentity, " is " ),
|
|
new Transform( "", kOmitLast7, "" ),
|
|
new Transform( "", kOmitLast1, "ing " ),
|
|
new Transform( "", kIdentity, "\n\t" ),
|
|
new Transform( "", kIdentity, ":" ),
|
|
new Transform( " ", kIdentity, ". " ),
|
|
new Transform( "", kIdentity, "ed " ),
|
|
new Transform( "", kOmitFirst9, "" ),
|
|
new Transform( "", kOmitFirst7, "" ),
|
|
new Transform( "", kOmitLast6, "" ),
|
|
new Transform( "", kIdentity, "(" ),
|
|
new Transform( "", kUppercaseFirst, ", " ),
|
|
new Transform( "", kOmitLast8, "" ),
|
|
new Transform( "", kIdentity, " at " ),
|
|
new Transform( "", kIdentity, "ly " ),
|
|
new Transform( " the ", kIdentity, " of " ),
|
|
new Transform( "", kOmitLast5, "" ),
|
|
new Transform( "", kOmitLast9, "" ),
|
|
new Transform( " ", kUppercaseFirst, ", " ),
|
|
new Transform( "", kUppercaseFirst, "\"" ),
|
|
new Transform( ".", kIdentity, "(" ),
|
|
new Transform( "", kUppercaseAll, " " ),
|
|
new Transform( "", kUppercaseFirst, "\">" ),
|
|
new Transform( "", kIdentity, "=\"" ),
|
|
new Transform( " ", kIdentity, "." ),
|
|
new Transform( ".com/", kIdentity, "" ),
|
|
new Transform( " the ", kIdentity, " of the " ),
|
|
new Transform( "", kUppercaseFirst, "'" ),
|
|
new Transform( "", kIdentity, ". This " ),
|
|
new Transform( "", kIdentity, "," ),
|
|
new Transform( ".", kIdentity, " " ),
|
|
new Transform( "", kUppercaseFirst, "(" ),
|
|
new Transform( "", kUppercaseFirst, "." ),
|
|
new Transform( "", kIdentity, " not " ),
|
|
new Transform( " ", kIdentity, "=\"" ),
|
|
new Transform( "", kIdentity, "er " ),
|
|
new Transform( " ", kUppercaseAll, " " ),
|
|
new Transform( "", kIdentity, "al " ),
|
|
new Transform( " ", kUppercaseAll, "" ),
|
|
new Transform( "", kIdentity, "='" ),
|
|
new Transform( "", kUppercaseAll, "\"" ),
|
|
new Transform( "", kUppercaseFirst, ". " ),
|
|
new Transform( " ", kIdentity, "(" ),
|
|
new Transform( "", kIdentity, "ful " ),
|
|
new Transform( " ", kUppercaseFirst, ". " ),
|
|
new Transform( "", kIdentity, "ive " ),
|
|
new Transform( "", kIdentity, "less " ),
|
|
new Transform( "", kUppercaseAll, "'" ),
|
|
new Transform( "", kIdentity, "est " ),
|
|
new Transform( " ", kUppercaseFirst, "." ),
|
|
new Transform( "", kUppercaseAll, "\">" ),
|
|
new Transform( " ", kIdentity, "='" ),
|
|
new Transform( "", kUppercaseFirst, "," ),
|
|
new Transform( "", kIdentity, "ize " ),
|
|
new Transform( "", kUppercaseAll, "." ),
|
|
new Transform( "\xc2\xa0", kIdentity, "" ),
|
|
new Transform( " ", kIdentity, "," ),
|
|
new Transform( "", kUppercaseFirst, "=\"" ),
|
|
new Transform( "", kUppercaseAll, "=\"" ),
|
|
new Transform( "", kIdentity, "ous " ),
|
|
new Transform( "", kUppercaseAll, ", " ),
|
|
new Transform( "", kUppercaseFirst, "='" ),
|
|
new Transform( " ", kUppercaseFirst, "," ),
|
|
new Transform( " ", kUppercaseAll, "=\"" ),
|
|
new Transform( " ", kUppercaseAll, ", " ),
|
|
new Transform( "", kUppercaseAll, "," ),
|
|
new Transform( "", kUppercaseAll, "(" ),
|
|
new Transform( "", kUppercaseAll, ". " ),
|
|
new Transform( " ", kUppercaseAll, "." ),
|
|
new Transform( "", kUppercaseAll, "='" ),
|
|
new Transform( " ", kUppercaseAll, ". " ),
|
|
new Transform( " ", kUppercaseFirst, "=\"" ),
|
|
new Transform( " ", kUppercaseAll, "='" ),
|
|
new Transform( " ", kUppercaseFirst, "='" )
|
|
];
|
|
|
|
exports.kTransforms = kTransforms;
|
|
exports.kNumTransforms = kTransforms.length;
|
|
|
|
function ToUpperCase(p, i) {
|
|
if (p[i] < 0xc0) {
|
|
if (p[i] >= 97 && p[i] <= 122) {
|
|
p[i] ^= 32;
|
|
}
|
|
return 1;
|
|
}
|
|
|
|
/* An overly simplified uppercasing model for utf-8. */
|
|
if (p[i] < 0xe0) {
|
|
p[i + 1] ^= 32;
|
|
return 2;
|
|
}
|
|
|
|
/* An arbitrary transform for three byte characters. */
|
|
p[i + 2] ^= 5;
|
|
return 3;
|
|
}
|
|
|
|
exports.transformDictionaryWord = function(dst, idx, word, len, transform) {
|
|
var prefix = kTransforms[transform].prefix;
|
|
var suffix = kTransforms[transform].suffix;
|
|
var t = kTransforms[transform].transform;
|
|
var skip = t < kOmitFirst1 ? 0 : t - (kOmitFirst1 - 1);
|
|
var i = 0;
|
|
var start_idx = idx;
|
|
var uppercase;
|
|
|
|
if (skip > len) {
|
|
skip = len;
|
|
}
|
|
|
|
var prefix_pos = 0;
|
|
while (prefix_pos < prefix.length) {
|
|
dst[idx++] = prefix[prefix_pos++];
|
|
}
|
|
|
|
word += skip;
|
|
len -= skip;
|
|
|
|
if (t <= kOmitLast9) {
|
|
len -= t;
|
|
}
|
|
|
|
for (i = 0; i < len; i++) {
|
|
dst[idx++] = BrotliDictionary.dictionary[word + i];
|
|
}
|
|
|
|
uppercase = idx - len;
|
|
|
|
if (t === kUppercaseFirst) {
|
|
ToUpperCase(dst, uppercase);
|
|
} else if (t === kUppercaseAll) {
|
|
while (len > 0) {
|
|
var step = ToUpperCase(dst, uppercase);
|
|
uppercase += step;
|
|
len -= step;
|
|
}
|
|
}
|
|
|
|
var suffix_pos = 0;
|
|
while (suffix_pos < suffix.length) {
|
|
dst[idx++] = suffix[suffix_pos++];
|
|
}
|
|
|
|
return idx - start_idx;
|
|
}
|