feat(i18n): switch to sha1 for message fingerprinting
This commit is contained in:

committed by
Alex Rickabaugh

parent
dd68ae3ef1
commit
b65f66feff
@ -7,32 +7,52 @@
|
||||
*/
|
||||
|
||||
import {beforeEach, ddescribe, describe, expect, iit, inject, it, xdescribe, xit} from '@angular/core/testing/testing_internal';
|
||||
import {strHash} from '../../src/i18n/digest';
|
||||
|
||||
import {sha1} from '../../src/i18n/digest';
|
||||
|
||||
export function main(): void {
|
||||
describe('strHash', () => {
|
||||
it('should return a hash value', () => {
|
||||
// https://github.com/google/closure-library/blob/1fb19a857b96b74e6523f3e9d33080baf25be046/closure/goog/string/string_test.js#L1115
|
||||
expectHash('', 0);
|
||||
expectHash('foo', 101574);
|
||||
expectHash('\uAAAAfoo', 1301670364);
|
||||
expectHash('a', 92567585, 5);
|
||||
expectHash('a', 2869595232, 6);
|
||||
expectHash('a', 3058106369, 7);
|
||||
expectHash('a', 312017024, 8);
|
||||
expectHash('a', 2929737728, 1024);
|
||||
describe('sha1', () => {
|
||||
it('should work on emnpty strings',
|
||||
() => { expect(sha1('')).toEqual('da39a3ee5e6b4b0d3255bfef95601890afd80709'); });
|
||||
|
||||
it('should returns the sha1 of "hello world"',
|
||||
() => { expect(sha1('abc')).toEqual('a9993e364706816aba3e25717850c26c9cd0d89d'); });
|
||||
|
||||
it('should returns the sha1 of unicode strings',
|
||||
() => { expect(sha1('你好,世界')).toEqual('3becb03b015ed48050611c8d7afe4b88f70d5a20'); });
|
||||
|
||||
it('should support arbitrary string size', () => {
|
||||
// node.js reference code:
|
||||
//
|
||||
// var crypto = require('crypto');
|
||||
//
|
||||
// function sha1(string) {
|
||||
// var shasum = crypto.createHash('sha1');
|
||||
// shasum.update(string, 'utf8');
|
||||
// return shasum.digest('hex', 'utf8');
|
||||
// }
|
||||
//
|
||||
// var prefix = `你好,世界`;
|
||||
// var result = sha1(prefix);
|
||||
// for (var size = prefix.length; size < 5000; size += 101) {
|
||||
// result = prefix + sha1(result);
|
||||
// while (result.length < size) {
|
||||
// result += result;
|
||||
// }
|
||||
// result = result.slice(-size);
|
||||
// }
|
||||
//
|
||||
// console.log(sha1(result));
|
||||
const prefix = `你好,世界`;
|
||||
let result = sha1(prefix);
|
||||
for (let size = prefix.length; size < 5000; size += 101) {
|
||||
result = prefix + sha1(result);
|
||||
while (result.length < size) {
|
||||
result += result;
|
||||
}
|
||||
result = result.slice(-size);
|
||||
}
|
||||
expect(sha1(result)).toEqual('24c2dae5c1ac6f604dbe670a60290d7ce6320b45');
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function expectHash(text: string, decimal: number, repeat: number = 1) {
|
||||
let acc = text;
|
||||
for (let i = 1; i < repeat; i++) {
|
||||
acc += text;
|
||||
}
|
||||
|
||||
const hash = strHash(acc);
|
||||
expect(typeof(hash)).toEqual('string');
|
||||
expect(hash.length > 0).toBe(true);
|
||||
expect(parseInt(hash, 16)).toEqual(decimal);
|
||||
}
|
@ -248,7 +248,9 @@ export function main() {
|
||||
it('should allow nested implicit elements', () => {
|
||||
let result: any[];
|
||||
|
||||
expect(() => {result = extract('<div>outer<div>inner</div></div>', ['div'])}).not.toThrow();
|
||||
expect(() => {
|
||||
result = extract('<div>outer<div>inner</div></div>', ['div']);
|
||||
}).not.toThrow();
|
||||
|
||||
expect(result).toEqual([
|
||||
[['outer', '<ph tag name="START_TAG_DIV">inner</ph name="CLOSE_TAG_DIV">'], '', ''],
|
||||
|
@ -26,7 +26,7 @@ export function main(): void {
|
||||
messages.updateFromTemplate(
|
||||
'<p i18n="m|d">Translate Me</p>', 'url', DEFAULT_INTERPOLATION_CONFIG);
|
||||
expect(humanizeMessages(messages)).toEqual([
|
||||
'a486901=Translate Me',
|
||||
'2e791a68a3324ecdd29e252198638dafacec46e9=Translate Me',
|
||||
]);
|
||||
});
|
||||
|
||||
@ -35,8 +35,8 @@ export function main(): void {
|
||||
'<p i18n="m|d">Translate Me</p><p i18n>Translate Me</p>', 'url',
|
||||
DEFAULT_INTERPOLATION_CONFIG);
|
||||
expect(humanizeMessages(messages)).toEqual([
|
||||
'a486901=Translate Me',
|
||||
'8475f2cc=Translate Me',
|
||||
'2e791a68a3324ecdd29e252198638dafacec46e9=Translate Me',
|
||||
'8ca133f957845af1b1868da1b339180d1f519644=Translate Me',
|
||||
]);
|
||||
});
|
||||
});
|
||||
|
@ -45,10 +45,10 @@ export function main(): void {
|
||||
<!ELEMENT ex (#PCDATA)>
|
||||
]>
|
||||
<messagebundle>
|
||||
<msg id="834fa53b">translatable element <ph name="START_BOLD_TEXT"><ex><b></ex></ph>with placeholders<ph name="CLOSE_BOLD_TEXT"><ex></b></ex></ph> <ph name="INTERPOLATION"/></msg>
|
||||
<msg id="7a2843db">{ count, plural, =0 {<ph name="START_PARAGRAPH"><ex><p></ex></ph>test<ph name="CLOSE_PARAGRAPH"><ex></p></ex></ph>}}</msg>
|
||||
<msg id="b45e58a5" desc="d" meaning="m">foo</msg>
|
||||
<msg id="18ea85bc">{ count, plural, =0 {{ sex, gender, other {<ph name="START_PARAGRAPH"><ex><p></ex></ph>deeply nested<ph name="CLOSE_PARAGRAPH"><ex></p></ex></ph>}} }}</msg>
|
||||
<msg id="ec1d033f2436133c14ab038286c4f5df4697484a">translatable element <ph name="START_BOLD_TEXT"><ex><b></ex></ph>with placeholders<ph name="CLOSE_BOLD_TEXT"><ex></b></ex></ph> <ph name="INTERPOLATION"/></msg>
|
||||
<msg id="e2ccf3d131b15f54aa1fcf1314b1ca77c14bfcc2">{ count, plural, =0 {<ph name="START_PARAGRAPH"><ex><p></ex></ph>test<ph name="CLOSE_PARAGRAPH"><ex></p></ex></ph>}}</msg>
|
||||
<msg id="db3e0a6a5a96481f60aec61d98c3eecddef5ac23" desc="d" meaning="m">foo</msg>
|
||||
<msg id="83dd87699b8c1779dd72277ef6e2d46ca58be042">{ count, plural, =0 {{ sex, gender, other {<ph name="START_PARAGRAPH"><ex><p></ex></ph>deeply nested<ph name="CLOSE_PARAGRAPH"><ex></p></ex></ph>}} }}</msg>
|
||||
</messagebundle>`;
|
||||
|
||||
it('should write a valid xmb file', () => { expect(toXmb(HTML)).toEqual(XMB); });
|
||||
|
Reference in New Issue
Block a user