| 
									
										
										
										
											2016-07-01 17:29:54 -07:00
										 |  |  | /** | 
					
						
							|  |  |  |  * @license | 
					
						
							|  |  |  |  * Copyright Google Inc. All Rights Reserved. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Use of this source code is governed by an MIT-style license that can be | 
					
						
							|  |  |  |  * found in the LICENSE file at https://angular.io/license
 | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-28 19:53:42 -07:00
										 |  |  | import {DEFAULT_INTERPOLATION_CONFIG, HtmlParser} from '@angular/compiler'; | 
					
						
							| 
									
										
										
										
											2016-07-01 17:29:54 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-28 19:53:42 -07:00
										 |  |  | import {digest, serializeNodes as serializeI18nNodes} from '../../src/i18n/digest'; | 
					
						
							| 
									
										
										
										
											2016-08-04 17:46:31 -07:00
										 |  |  | import {extractMessages, mergeTranslations} from '../../src/i18n/extractor_merger'; | 
					
						
							|  |  |  | import * as i18n from '../../src/i18n/i18n_ast'; | 
					
						
							| 
									
										
										
										
											2016-08-01 18:10:34 -07:00
										 |  |  | import {TranslationBundle} from '../../src/i18n/translation_bundle'; | 
					
						
							|  |  |  | import * as html from '../../src/ml_parser/ast'; | 
					
						
							| 
									
										
										
										
											2016-08-04 17:46:31 -07:00
										 |  |  | import {serializeNodes as serializeHtmlNodes} from '../ml_parser/ast_serializer_spec'; | 
					
						
							| 
									
										
										
										
											2016-07-01 17:29:54 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | export function main() { | 
					
						
							| 
									
										
										
										
											2016-08-01 18:10:34 -07:00
										 |  |  |   describe('Extractor', () => { | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |     describe('elements', () => { | 
					
						
							|  |  |  |       it('should extract from elements', () => { | 
					
						
							| 
									
										
										
										
											2016-08-01 11:33:35 -07:00
										 |  |  |         expect(extract('<div i18n="m|d|e">text<span>nested</span></div>')).toEqual([ | 
					
						
							| 
									
										
										
										
											2016-12-06 15:04:59 +01:00
										 |  |  |           [ | 
					
						
							|  |  |  |             ['text', '<ph tag name="START_TAG_SPAN">nested</ph name="CLOSE_TAG_SPAN">'], 'm', 'd|e', | 
					
						
							|  |  |  |             '' | 
					
						
							|  |  |  |           ], | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |         ]); | 
					
						
							| 
									
										
										
										
											2016-08-01 13:11:48 -07:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-04 17:46:31 -07:00
										 |  |  |       it('should extract from attributes', () => { | 
					
						
							| 
									
										
										
										
											2016-08-01 14:43:20 -07:00
										 |  |  |         expect( | 
					
						
							|  |  |  |             extract( | 
					
						
							| 
									
										
										
										
											2016-08-04 17:46:31 -07:00
										 |  |  |                 '<div i18n="m1|d1"><span i18n-title="m2|d2" title="single child">nested</span></div>')) | 
					
						
							| 
									
										
										
										
											2016-08-01 14:43:20 -07:00
										 |  |  |             .toEqual([ | 
					
						
							| 
									
										
										
										
											2016-12-06 15:04:59 +01:00
										 |  |  |               [['<ph tag name="START_TAG_SPAN">nested</ph name="CLOSE_TAG_SPAN">'], 'm1', 'd1', ''], | 
					
						
							|  |  |  |               [['single child'], 'm2', 'd2', ''], | 
					
						
							| 
									
										
										
										
											2016-08-01 14:43:20 -07:00
										 |  |  |             ]); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-12-06 15:04:59 +01:00
										 |  |  |       it('should extract from attributes with id', () => { | 
					
						
							|  |  |  |         expect( | 
					
						
							|  |  |  |             extract( | 
					
						
							|  |  |  |                 '<div i18n="m1|d1@@i1"><span i18n-title="m2|d2@@i2" title="single child">nested</span></div>')) | 
					
						
							|  |  |  |             .toEqual([ | 
					
						
							|  |  |  |               [ | 
					
						
							|  |  |  |                 ['<ph tag name="START_TAG_SPAN">nested</ph name="CLOSE_TAG_SPAN">'], 'm1', 'd1', | 
					
						
							|  |  |  |                 'i1' | 
					
						
							|  |  |  |               ], | 
					
						
							|  |  |  |               [['single child'], 'm2', 'd2', 'i2'], | 
					
						
							|  |  |  |             ]); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should extract from attributes without meaning and with id', () => { | 
					
						
							|  |  |  |         expect( | 
					
						
							|  |  |  |             extract( | 
					
						
							|  |  |  |                 '<div i18n="d1@@i1"><span i18n-title="d2@@i2" title="single child">nested</span></div>')) | 
					
						
							|  |  |  |             .toEqual([ | 
					
						
							|  |  |  |               [['<ph tag name="START_TAG_SPAN">nested</ph name="CLOSE_TAG_SPAN">'], '', 'd1', 'i1'], | 
					
						
							|  |  |  |               [['single child'], '', 'd2', 'i2'], | 
					
						
							|  |  |  |             ]); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should extract from attributes with id only', () => { | 
					
						
							|  |  |  |         expect( | 
					
						
							|  |  |  |             extract( | 
					
						
							|  |  |  |                 '<div i18n="@@i1"><span i18n-title="@@i2" title="single child">nested</span></div>')) | 
					
						
							|  |  |  |             .toEqual([ | 
					
						
							|  |  |  |               [['<ph tag name="START_TAG_SPAN">nested</ph name="CLOSE_TAG_SPAN">'], '', '', 'i1'], | 
					
						
							|  |  |  |               [['single child'], '', '', 'i2'], | 
					
						
							|  |  |  |             ]); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-04 17:46:31 -07:00
										 |  |  |       it('should extract from ICU messages', () => { | 
					
						
							| 
									
										
										
										
											2016-08-01 13:11:48 -07:00
										 |  |  |         expect( | 
					
						
							|  |  |  |             extract( | 
					
						
							|  |  |  |                 '<div i18n="m|d">{count, plural, =0 { <p i18n-title i18n-desc title="title" desc="desc"></p>}}</div>')) | 
					
						
							|  |  |  |             .toEqual([ | 
					
						
							|  |  |  |               [ | 
					
						
							|  |  |  |                 [ | 
					
						
							| 
									
										
										
										
											2016-08-04 17:46:31 -07:00
										 |  |  |                   '{count, plural, =0 {[<ph tag name="START_PARAGRAPH"></ph name="CLOSE_PARAGRAPH">]}}' | 
					
						
							| 
									
										
										
										
											2016-08-01 13:11:48 -07:00
										 |  |  |                 ], | 
					
						
							| 
									
										
										
										
											2016-12-06 15:04:59 +01:00
										 |  |  |                 'm', 'd', '' | 
					
						
							| 
									
										
										
										
											2016-08-01 13:11:48 -07:00
										 |  |  |               ], | 
					
						
							| 
									
										
										
										
											2016-12-06 15:04:59 +01:00
										 |  |  |               [['title'], '', '', ''], | 
					
						
							|  |  |  |               [['desc'], '', '', ''], | 
					
						
							| 
									
										
										
										
											2016-08-01 13:11:48 -07:00
										 |  |  |             ]); | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |       }); | 
					
						
							| 
									
										
										
										
											2016-07-01 17:29:54 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |       it('should not create a message for empty elements', | 
					
						
							|  |  |  |          () => { expect(extract('<div i18n="m|d"></div>')).toEqual([]); }); | 
					
						
							| 
									
										
										
										
											2016-08-05 14:45:47 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |       it('should ignore implicit elements in translatable elements', () => { | 
					
						
							|  |  |  |         expect(extract('<div i18n="m|d"><p></p></div>', ['p'])).toEqual([ | 
					
						
							| 
									
										
										
										
											2016-12-06 15:04:59 +01:00
										 |  |  |           [['<ph tag name="START_PARAGRAPH"></ph name="CLOSE_PARAGRAPH">'], 'm', 'd', ''] | 
					
						
							| 
									
										
										
										
											2016-08-05 14:45:47 -07:00
										 |  |  |         ]); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2016-07-01 17:29:54 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |     describe('blocks', () => { | 
					
						
							|  |  |  |       it('should extract from blocks', () => { | 
					
						
							|  |  |  |         expect(extract(`<!-- i18n: meaning1|desc1 -->message1<!-- /i18n -->
 | 
					
						
							| 
									
										
										
										
											2016-08-01 11:33:35 -07:00
										 |  |  |          <!-- i18n: desc2 -->message2<!-- /i18n --> | 
					
						
							| 
									
										
										
										
											2016-12-06 15:04:59 +01:00
										 |  |  |          <!-- i18n -->message3<!-- /i18n --> | 
					
						
							|  |  |  |          <!-- i18n: meaning4|desc4@@id4 -->message4<!-- /i18n --> | 
					
						
							|  |  |  |          <!-- i18n: @@id5 -->message5<!-- /i18n -->`))
 | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |             .toEqual([ | 
					
						
							| 
									
										
										
										
											2016-12-06 15:04:59 +01:00
										 |  |  |               [['message1'], 'meaning1', 'desc1', ''], [['message2'], '', 'desc2', ''], | 
					
						
							|  |  |  |               [['message3'], '', '', ''], [['message4'], 'meaning4', 'desc4', 'id4'], | 
					
						
							|  |  |  |               [['message5'], '', '', 'id5'] | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |             ]); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-05 14:45:47 -07:00
										 |  |  |       it('should ignore implicit elements in blocks', () => { | 
					
						
							|  |  |  |         expect(extract('<!-- i18n:m|d --><p></p><!-- /i18n -->', ['p'])).toEqual([ | 
					
						
							| 
									
										
										
										
											2016-12-06 15:04:59 +01:00
										 |  |  |           [['<ph tag name="START_PARAGRAPH"></ph name="CLOSE_PARAGRAPH">'], 'm', 'd', ''] | 
					
						
							| 
									
										
										
										
											2016-08-05 14:45:47 -07:00
										 |  |  |         ]); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |       it('should extract siblings', () => { | 
					
						
							|  |  |  |         expect( | 
					
						
							|  |  |  |             extract( | 
					
						
							|  |  |  |                 `<!-- i18n -->text<p>html<b>nested</b></p>{count, plural, =0 {<span>html</span>}}{{interp}}<!-- /i18n -->`)) | 
					
						
							|  |  |  |             .toEqual([ | 
					
						
							|  |  |  |               [ | 
					
						
							|  |  |  |                 [ | 
					
						
							| 
									
										
										
										
											2016-08-04 17:46:31 -07:00
										 |  |  |                   '{count, plural, =0 {[<ph tag name="START_TAG_SPAN">html</ph name="CLOSE_TAG_SPAN">]}}' | 
					
						
							|  |  |  |                 ], | 
					
						
							| 
									
										
										
										
											2016-12-06 15:04:59 +01:00
										 |  |  |                 '', '', '' | 
					
						
							| 
									
										
										
										
											2016-08-04 17:46:31 -07:00
										 |  |  |               ], | 
					
						
							|  |  |  |               [ | 
					
						
							|  |  |  |                 [ | 
					
						
							| 
									
										
										
										
											2016-11-02 17:40:15 -07:00
										 |  |  |                   'text', '<ph tag name="START_PARAGRAPH">html, <ph tag' + | 
					
						
							|  |  |  |                       ' name="START_BOLD_TEXT">nested</ph name="CLOSE_BOLD_TEXT"></ph name="CLOSE_PARAGRAPH">', | 
					
						
							|  |  |  |                   '<ph icu name="ICU">{count, plural, =0 {[<ph tag' + | 
					
						
							|  |  |  |                       ' name="START_TAG_SPAN">html</ph name="CLOSE_TAG_SPAN">]}}</ph>', | 
					
						
							| 
									
										
										
										
											2016-08-04 17:46:31 -07:00
										 |  |  |                   '[<ph name="INTERPOLATION">interp</ph>]' | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |                 ], | 
					
						
							| 
									
										
										
										
											2016-12-06 15:04:59 +01:00
										 |  |  |                 '', '', '' | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |               ], | 
					
						
							|  |  |  |             ]); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2016-07-01 17:29:54 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |       it('should ignore other comments', () => { | 
					
						
							| 
									
										
										
										
											2016-12-06 15:04:59 +01:00
										 |  |  |         expect(extract(`<!-- i18n: meaning1|desc1@@id1 --><!-- other -->message1<!-- /i18n -->`)) | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |             .toEqual([ | 
					
						
							| 
									
										
										
										
											2016-12-06 15:04:59 +01:00
										 |  |  |               [['message1'], 'meaning1', 'desc1', 'id1'], | 
					
						
							| 
									
										
										
										
											2016-07-01 17:29:54 -07:00
										 |  |  |             ]); | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |       }); | 
					
						
							| 
									
										
										
										
											2016-07-01 17:29:54 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |       it('should not create a message for empty blocks', | 
					
						
							|  |  |  |          () => { expect(extract(`<!-- i18n: meaning1|desc1 --><!-- /i18n -->`)).toEqual([]); }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe('ICU messages', () => { | 
					
						
							|  |  |  |       it('should extract ICU messages from translatable elements', () => { | 
					
						
							|  |  |  |         // single message when ICU is the only children
 | 
					
						
							|  |  |  |         expect(extract('<div i18n="m|d">{count, plural, =0 {text}}</div>')).toEqual([ | 
					
						
							| 
									
										
										
										
											2016-12-06 15:04:59 +01:00
										 |  |  |           [['{count, plural, =0 {[text]}}'], 'm', 'd', ''], | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |         ]); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-01 14:43:20 -07:00
										 |  |  |         // single message when ICU is the only (implicit) children
 | 
					
						
							|  |  |  |         expect(extract('<div>{count, plural, =0 {text}}</div>', ['div'])).toEqual([ | 
					
						
							| 
									
										
										
										
											2016-12-06 15:04:59 +01:00
										 |  |  |           [['{count, plural, =0 {[text]}}'], '', '', ''], | 
					
						
							| 
									
										
										
										
											2016-08-01 14:43:20 -07:00
										 |  |  |         ]); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |         // one message for the element content and one message for the ICU
 | 
					
						
							| 
									
										
										
										
											2016-12-06 15:04:59 +01:00
										 |  |  |         expect(extract('<div i18n="m|d@@i">before{count, plural, =0 {text}}after</div>')).toEqual([ | 
					
						
							|  |  |  |           [ | 
					
						
							|  |  |  |             ['before', '<ph icu name="ICU">{count, plural, =0 {[text]}}</ph>', 'after'], 'm', 'd', | 
					
						
							|  |  |  |             'i' | 
					
						
							|  |  |  |           ], | 
					
						
							|  |  |  |           [['{count, plural, =0 {[text]}}'], '', '', ''], | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |         ]); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should extract ICU messages from translatable block', () => { | 
					
						
							|  |  |  |         // single message when ICU is the only children
 | 
					
						
							|  |  |  |         expect(extract('<!-- i18n:m|d -->{count, plural, =0 {text}}<!-- /i18n -->')).toEqual([ | 
					
						
							| 
									
										
										
										
											2016-12-06 15:04:59 +01:00
										 |  |  |           [['{count, plural, =0 {[text]}}'], 'm', 'd', ''], | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |         ]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // one message for the block content and one message for the ICU
 | 
					
						
							|  |  |  |         expect(extract('<!-- i18n:m|d -->before{count, plural, =0 {text}}after<!-- /i18n -->')) | 
					
						
							|  |  |  |             .toEqual([ | 
					
						
							| 
									
										
										
										
											2016-12-06 15:04:59 +01:00
										 |  |  |               [['{count, plural, =0 {[text]}}'], '', '', ''], | 
					
						
							| 
									
										
										
										
											2016-08-04 17:46:31 -07:00
										 |  |  |               [ | 
					
						
							|  |  |  |                 ['before', '<ph icu name="ICU">{count, plural, =0 {[text]}}</ph>', 'after'], 'm', | 
					
						
							| 
									
										
										
										
											2016-12-06 15:04:59 +01:00
										 |  |  |                 'd', '' | 
					
						
							| 
									
										
										
										
											2016-08-04 17:46:31 -07:00
										 |  |  |               ], | 
					
						
							| 
									
										
										
										
											2016-07-01 17:29:54 -07:00
										 |  |  |             ]); | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |       }); | 
					
						
							| 
									
										
										
										
											2016-07-01 17:29:54 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |       it('should not extract ICU messages outside of i18n sections', | 
					
						
							|  |  |  |          () => { expect(extract('{count, plural, =0 {text}}')).toEqual([]); }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-05 14:45:47 -07:00
										 |  |  |       it('should ignore nested ICU messages', () => { | 
					
						
							| 
									
										
										
										
											2016-11-04 15:10:19 -07:00
										 |  |  |         expect(extract('<div i18n="m|d">{count, plural, =0 { {sex, select, male {m}} }}</div>')) | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |             .toEqual([ | 
					
						
							| 
									
										
										
										
											2016-12-06 15:04:59 +01:00
										 |  |  |               [['{count, plural, =0 {[{sex, select, male {[m]}},  ]}}'], 'm', 'd', ''], | 
					
						
							| 
									
										
										
										
											2016-07-01 17:29:54 -07:00
										 |  |  |             ]); | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |       }); | 
					
						
							| 
									
										
										
										
											2016-08-05 14:45:47 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |       it('should ignore implicit elements in non translatable ICU messages', () => { | 
					
						
							| 
									
										
										
										
											2016-12-06 15:04:59 +01:00
										 |  |  |         expect(extract( | 
					
						
							|  |  |  |                    '<div i18n="m|d@@i">{count, plural, =0 { {sex, select, male {<p>ignore</p>}}' + | 
					
						
							|  |  |  |                        ' }}</div>', | 
					
						
							|  |  |  |                    ['p'])) | 
					
						
							| 
									
										
										
										
											2016-08-05 14:45:47 -07:00
										 |  |  |             .toEqual([[ | 
					
						
							|  |  |  |               [ | 
					
						
							| 
									
										
										
										
											2016-11-04 15:10:19 -07:00
										 |  |  |                 '{count, plural, =0 {[{sex, select, male {[<ph tag name="START_PARAGRAPH">ignore</ph name="CLOSE_PARAGRAPH">]}},  ]}}' | 
					
						
							| 
									
										
										
										
											2016-08-05 14:45:47 -07:00
										 |  |  |               ], | 
					
						
							| 
									
										
										
										
											2016-12-06 15:04:59 +01:00
										 |  |  |               'm', 'd', 'i' | 
					
						
							| 
									
										
										
										
											2016-08-05 14:45:47 -07:00
										 |  |  |             ]]); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should ignore implicit elements in non translatable ICU messages', () => { | 
					
						
							| 
									
										
										
										
											2016-11-04 15:10:19 -07:00
										 |  |  |         expect(extract('{count, plural, =0 { {sex, select, male {<p>ignore</p>}} }}', ['p'])) | 
					
						
							| 
									
										
										
										
											2016-08-05 14:45:47 -07:00
										 |  |  |             .toEqual([]); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |     }); | 
					
						
							| 
									
										
										
										
											2016-07-01 17:29:54 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |     describe('attributes', () => { | 
					
						
							| 
									
										
										
										
											2016-08-01 18:10:34 -07:00
										 |  |  |       it('should extract from attributes outside of translatable sections', () => { | 
					
						
							| 
									
										
										
										
											2016-12-06 15:04:59 +01:00
										 |  |  |         expect(extract('<div i18n-title="m|d@@i" title="msg"></div>')).toEqual([ | 
					
						
							|  |  |  |           [['msg'], 'm', 'd', 'i'], | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |         ]); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-01 18:10:34 -07:00
										 |  |  |       it('should extract from attributes in translatable elements', () => { | 
					
						
							| 
									
										
										
										
											2016-12-06 15:04:59 +01:00
										 |  |  |         expect(extract('<div i18n><p><b i18n-title="m|d@@i" title="msg"></b></p></div>')).toEqual([ | 
					
						
							| 
									
										
										
										
											2016-08-04 17:46:31 -07:00
										 |  |  |           [ | 
					
						
							| 
									
										
										
										
											2016-11-02 17:40:15 -07:00
										 |  |  |             ['<ph tag name="START_PARAGRAPH"><ph tag name="START_BOLD_TEXT"></ph' + | 
					
						
							|  |  |  |              ' name="CLOSE_BOLD_TEXT"></ph name="CLOSE_PARAGRAPH">'], | 
					
						
							| 
									
										
										
										
											2016-12-06 15:04:59 +01:00
										 |  |  |             '', '', '' | 
					
						
							| 
									
										
										
										
											2016-08-04 17:46:31 -07:00
										 |  |  |           ], | 
					
						
							| 
									
										
										
										
											2016-12-06 15:04:59 +01:00
										 |  |  |           [['msg'], 'm', 'd', 'i'], | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |         ]); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2016-07-01 17:29:54 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-01 18:10:34 -07:00
										 |  |  |       it('should extract from attributes in translatable blocks', () => { | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |         expect(extract('<!-- i18n --><p><b i18n-title="m|d" title="msg"></b></p><!-- /i18n -->')) | 
					
						
							|  |  |  |             .toEqual([ | 
					
						
							| 
									
										
										
										
											2016-12-06 15:04:59 +01:00
										 |  |  |               [['msg'], 'm', 'd', ''], | 
					
						
							| 
									
										
										
										
											2016-08-04 17:46:31 -07:00
										 |  |  |               [ | 
					
						
							| 
									
										
										
										
											2016-11-02 17:40:15 -07:00
										 |  |  |                 ['<ph tag name="START_PARAGRAPH"><ph tag name="START_BOLD_TEXT"></ph' + | 
					
						
							|  |  |  |                  ' name="CLOSE_BOLD_TEXT"></ph name="CLOSE_PARAGRAPH">'], | 
					
						
							| 
									
										
										
										
											2016-12-06 15:04:59 +01:00
										 |  |  |                 '', '', '' | 
					
						
							| 
									
										
										
										
											2016-08-04 17:46:31 -07:00
										 |  |  |               ], | 
					
						
							| 
									
										
										
										
											2016-07-01 17:29:54 -07:00
										 |  |  |             ]); | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |       }); | 
					
						
							| 
									
										
										
										
											2016-07-01 17:29:54 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-01 18:10:34 -07:00
										 |  |  |       it('should extract from attributes in translatable ICUs', () => { | 
					
						
							| 
									
										
										
										
											2016-12-06 15:04:59 +01:00
										 |  |  |         expect(extract(`<!-- i18n -->{count, plural, =0 {<p><b i18n-title="m|d@@i" 
 | 
					
						
							|  |  |  |                  title="msg"></b></p>}}<!-- /i18n -->`))
 | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |             .toEqual([ | 
					
						
							| 
									
										
										
										
											2016-12-06 15:04:59 +01:00
										 |  |  |               [['msg'], 'm', 'd', 'i'], | 
					
						
							| 
									
										
										
										
											2016-08-04 17:46:31 -07:00
										 |  |  |               [ | 
					
						
							|  |  |  |                 [ | 
					
						
							| 
									
										
										
										
											2016-11-02 17:40:15 -07:00
										 |  |  |                   '{count, plural, =0 {[<ph tag name="START_PARAGRAPH"><ph tag' + | 
					
						
							|  |  |  |                   ' name="START_BOLD_TEXT"></ph name="CLOSE_BOLD_TEXT"></ph name="CLOSE_PARAGRAPH">]}}' | 
					
						
							| 
									
										
										
										
											2016-08-04 17:46:31 -07:00
										 |  |  |                 ], | 
					
						
							| 
									
										
										
										
											2016-12-06 15:04:59 +01:00
										 |  |  |                 '', '', '' | 
					
						
							| 
									
										
										
										
											2016-08-04 17:46:31 -07:00
										 |  |  |               ], | 
					
						
							| 
									
										
										
										
											2016-07-01 17:29:54 -07:00
										 |  |  |             ]); | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |       }); | 
					
						
							| 
									
										
										
										
											2016-07-01 17:29:54 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-01 18:10:34 -07:00
										 |  |  |       it('should extract from attributes in non translatable ICUs', () => { | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |         expect(extract('{count, plural, =0 {<p><b i18n-title="m|d" title="msg"></b></p>}}')) | 
					
						
							|  |  |  |             .toEqual([ | 
					
						
							| 
									
										
										
										
											2016-12-06 15:04:59 +01:00
										 |  |  |               [['msg'], 'm', 'd', ''], | 
					
						
							| 
									
										
										
										
											2016-07-01 17:29:54 -07:00
										 |  |  |             ]); | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should not create a message for empty attributes', | 
					
						
							|  |  |  |          () => { expect(extract('<div i18n-title="m|d" title></div>')).toEqual([]); }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe('implicit elements', () => { | 
					
						
							|  |  |  |       it('should extract from implicit elements', () => { | 
					
						
							|  |  |  |         expect(extract('<b>bold</b><i>italic</i>', ['b'])).toEqual([ | 
					
						
							| 
									
										
										
										
											2016-12-06 15:04:59 +01:00
										 |  |  |           [['bold'], '', '', ''], | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |         ]); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2016-08-05 14:14:31 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |       it('should allow nested implicit elements', () => { | 
					
						
							|  |  |  |         let result: any[]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-08 12:44:48 -07:00
										 |  |  |         expect(() => { | 
					
						
							|  |  |  |           result = extract('<div>outer<div>inner</div></div>', ['div']); | 
					
						
							|  |  |  |         }).not.toThrow(); | 
					
						
							| 
									
										
										
										
											2016-08-05 14:14:31 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |         expect(result).toEqual([ | 
					
						
							| 
									
										
										
										
											2016-12-06 15:04:59 +01:00
										 |  |  |           [['outer', '<ph tag name="START_TAG_DIV">inner</ph name="CLOSE_TAG_DIV">'], '', '', ''], | 
					
						
							| 
									
										
										
										
											2016-08-05 14:14:31 -07:00
										 |  |  |         ]); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe('implicit attributes', () => { | 
					
						
							|  |  |  |       it('should extract implicit attributes', () => { | 
					
						
							|  |  |  |         expect(extract('<b title="bb">bold</b><i title="ii">italic</i>', [], {'b': ['title']})) | 
					
						
							|  |  |  |             .toEqual([ | 
					
						
							| 
									
										
										
										
											2016-12-06 15:04:59 +01:00
										 |  |  |               [['bb'], '', '', ''], | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |             ]); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe('errors', () => { | 
					
						
							|  |  |  |       describe('elements', () => { | 
					
						
							|  |  |  |         it('should report nested translatable elements', () => { | 
					
						
							|  |  |  |           expect(extractErrors(`<p i18n><b i18n></b></p>`)).toEqual([ | 
					
						
							|  |  |  |             ['Could not mark an element as translatable inside a translatable section', '<b i18n>'], | 
					
						
							|  |  |  |           ]); | 
					
						
							| 
									
										
										
										
											2016-07-01 17:29:54 -07:00
										 |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |         it('should report translatable elements in implicit elements', () => { | 
					
						
							|  |  |  |           expect(extractErrors(`<p><b i18n></b></p>`, ['p'])).toEqual([ | 
					
						
							|  |  |  |             ['Could not mark an element as translatable inside a translatable section', '<b i18n>'], | 
					
						
							|  |  |  |           ]); | 
					
						
							| 
									
										
										
										
											2016-07-01 17:29:54 -07:00
										 |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |         it('should report translatable elements in translatable blocks', () => { | 
					
						
							|  |  |  |           expect(extractErrors(`<!-- i18n --><b i18n></b><!-- /i18n -->`)).toEqual([ | 
					
						
							|  |  |  |             ['Could not mark an element as translatable inside a translatable section', '<b i18n>'], | 
					
						
							|  |  |  |           ]); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2016-07-01 17:29:54 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |       describe('blocks', () => { | 
					
						
							|  |  |  |         it('should report nested blocks', () => { | 
					
						
							|  |  |  |           expect(extractErrors(`<!-- i18n --><!-- i18n --><!-- /i18n --><!-- /i18n -->`)).toEqual([ | 
					
						
							|  |  |  |             ['Could not start a block inside a translatable section', '<!--'], | 
					
						
							|  |  |  |             ['Trying to close an unopened block', '<!--'], | 
					
						
							|  |  |  |           ]); | 
					
						
							| 
									
										
										
										
											2016-07-01 17:29:54 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('should report unclosed blocks', () => { | 
					
						
							|  |  |  |           expect(extractErrors(`<!-- i18n -->`)).toEqual([ | 
					
						
							|  |  |  |             ['Unclosed block', '<!--'], | 
					
						
							|  |  |  |           ]); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('should report translatable blocks in translatable elements', () => { | 
					
						
							|  |  |  |           expect(extractErrors(`<p i18n><!-- i18n --><!-- /i18n --></p>`)).toEqual([ | 
					
						
							|  |  |  |             ['Could not start a block inside a translatable section', '<!--'], | 
					
						
							|  |  |  |             ['Trying to close an unopened block', '<!--'], | 
					
						
							|  |  |  |           ]); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('should report translatable blocks in implicit elements', () => { | 
					
						
							|  |  |  |           expect(extractErrors(`<p><!-- i18n --><!-- /i18n --></p>`, ['p'])).toEqual([ | 
					
						
							|  |  |  |             ['Could not start a block inside a translatable section', '<!--'], | 
					
						
							|  |  |  |             ['Trying to close an unopened block', '<!--'], | 
					
						
							|  |  |  |           ]); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         it('should report when start and end of a block are not at the same level', () => { | 
					
						
							|  |  |  |           expect(extractErrors(`<!-- i18n --><p><!-- /i18n --></p>`)).toEqual([ | 
					
						
							|  |  |  |             ['I18N blocks should not cross element boundaries', '<!--'], | 
					
						
							|  |  |  |             ['Unclosed block', '<p>'], | 
					
						
							|  |  |  |           ]); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |           expect(extractErrors(`<p><!-- i18n --></p><!-- /i18n -->`)).toEqual([ | 
					
						
							|  |  |  |             ['I18N blocks should not cross element boundaries', '<!--'], | 
					
						
							|  |  |  |             ['Unclosed block', '<!--'], | 
					
						
							|  |  |  |           ]); | 
					
						
							|  |  |  |         }); | 
					
						
							|  |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2016-08-01 18:10:34 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   describe('Merger', () => { | 
					
						
							|  |  |  |     describe('elements', () => { | 
					
						
							|  |  |  |       it('should merge elements', () => { | 
					
						
							|  |  |  |         const HTML = `<p i18n="m|d">foo</p>`; | 
					
						
							| 
									
										
										
										
											2016-08-04 17:46:31 -07:00
										 |  |  |         expect(fakeTranslate(HTML)).toEqual('<p>**foo**</p>'); | 
					
						
							| 
									
										
										
										
											2016-08-01 18:10:34 -07:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should merge nested elements', () => { | 
					
						
							|  |  |  |         const HTML = `<div>before<p i18n="m|d">foo</p><!-- comment --></div>`; | 
					
						
							| 
									
										
										
										
											2016-08-04 17:46:31 -07:00
										 |  |  |         expect(fakeTranslate(HTML)).toEqual('<div>before<p>**foo**</p></div>'); | 
					
						
							| 
									
										
										
										
											2016-08-01 18:10:34 -07:00
										 |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe('blocks', () => { | 
					
						
							|  |  |  |       it('should merge blocks', () => { | 
					
						
							|  |  |  |         const HTML = `before<!-- i18n --><p>foo</p><span><i>bar</i></span><!-- /i18n -->after`; | 
					
						
							| 
									
										
										
										
											2016-08-04 17:46:31 -07:00
										 |  |  |         expect(fakeTranslate(HTML)) | 
					
						
							|  |  |  |             .toEqual( | 
					
						
							| 
									
										
										
										
											2016-11-02 17:40:15 -07:00
										 |  |  |                 'before**[ph tag name="START_PARAGRAPH">foo[/ph name="CLOSE_PARAGRAPH">[ph tag' + | 
					
						
							|  |  |  |                 ' name="START_TAG_SPAN">[ph tag name="START_ITALIC_TEXT">bar[/ph' + | 
					
						
							|  |  |  |                 ' name="CLOSE_ITALIC_TEXT">[/ph name="CLOSE_TAG_SPAN">**after'); | 
					
						
							| 
									
										
										
										
											2016-08-01 18:10:34 -07:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       it('should merge nested blocks', () => { | 
					
						
							|  |  |  |         const HTML = | 
					
						
							|  |  |  |             `<div>before<!-- i18n --><p>foo</p><span><i>bar</i></span><!-- /i18n -->after</div>`; | 
					
						
							|  |  |  |         expect(fakeTranslate(HTML)) | 
					
						
							| 
									
										
										
										
											2016-08-04 17:46:31 -07:00
										 |  |  |             .toEqual( | 
					
						
							| 
									
										
										
										
											2016-11-02 17:40:15 -07:00
										 |  |  |                 '<div>before**[ph tag name="START_PARAGRAPH">foo[/ph name="CLOSE_PARAGRAPH">[ph' + | 
					
						
							|  |  |  |                 ' tag name="START_TAG_SPAN">[ph tag name="START_ITALIC_TEXT">bar[/ph' + | 
					
						
							|  |  |  |                 ' name="CLOSE_ITALIC_TEXT">[/ph name="CLOSE_TAG_SPAN">**after</div>'); | 
					
						
							| 
									
										
										
										
											2016-08-01 18:10:34 -07:00
										 |  |  |       }); | 
					
						
							|  |  |  |     }); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     describe('attributes', () => { | 
					
						
							|  |  |  |       it('should merge attributes', () => { | 
					
						
							|  |  |  |         const HTML = `<p i18n-title="m|d" title="foo"></p>`; | 
					
						
							| 
									
										
										
										
											2016-08-04 17:46:31 -07:00
										 |  |  |         expect(fakeTranslate(HTML)).toEqual('<p title="**foo**"></p>'); | 
					
						
							| 
									
										
										
										
											2016-08-01 18:10:34 -07:00
										 |  |  |       }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-11 21:00:35 -07:00
										 |  |  |       it('should merge nested attributes', () => { | 
					
						
							| 
									
										
										
										
											2016-08-01 18:10:34 -07:00
										 |  |  |         const HTML = `<div>{count, plural, =0 {<p i18n-title title="foo"></p>}}</div>`; | 
					
						
							| 
									
										
										
										
											2016-08-04 17:46:31 -07:00
										 |  |  |         expect(fakeTranslate(HTML)) | 
					
						
							|  |  |  |             .toEqual('<div>{count, plural, =0 {<p title="**foo**"></p>}}</div>'); | 
					
						
							| 
									
										
										
										
											2016-08-01 18:10:34 -07:00
										 |  |  |       }); | 
					
						
							| 
									
										
										
										
											2016-08-11 21:00:35 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |       it('should merge attributes without values', () => { | 
					
						
							|  |  |  |         const HTML = `<p i18n-title="m|d" title=""></p>`; | 
					
						
							|  |  |  |         expect(fakeTranslate(HTML)).toEqual('<p title=""></p>'); | 
					
						
							|  |  |  |       }); | 
					
						
							| 
									
										
										
										
											2016-08-01 18:10:34 -07:00
										 |  |  |     }); | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2016-07-01 17:29:54 -07:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2016-07-08 16:46:49 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-01 18:10:34 -07:00
										 |  |  | function parseHtml(html: string): html.Node[] { | 
					
						
							| 
									
										
										
										
											2016-07-08 16:46:49 -07:00
										 |  |  |   const htmlParser = new HtmlParser(); | 
					
						
							|  |  |  |   const parseResult = htmlParser.parse(html, 'extractor spec', true); | 
					
						
							|  |  |  |   if (parseResult.errors.length > 1) { | 
					
						
							| 
									
										
										
										
											2016-08-05 14:14:31 -07:00
										 |  |  |     throw new Error(`unexpected parse errors: ${parseResult.errors.join('\n')}`); | 
					
						
							| 
									
										
										
										
											2016-07-08 16:46:49 -07:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2016-08-01 18:10:34 -07:00
										 |  |  |   return parseResult.rootNodes; | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function fakeTranslate( | 
					
						
							|  |  |  |     content: string, implicitTags: string[] = [], | 
					
						
							|  |  |  |     implicitAttrs: {[k: string]: string[]} = {}): string { | 
					
						
							|  |  |  |   const htmlNodes: html.Node[] = parseHtml(content); | 
					
						
							| 
									
										
										
										
											2016-08-04 17:46:31 -07:00
										 |  |  |   const messages: i18n.Message[] = | 
					
						
							|  |  |  |       extractMessages(htmlNodes, DEFAULT_INTERPOLATION_CONFIG, implicitTags, implicitAttrs) | 
					
						
							|  |  |  |           .messages; | 
					
						
							| 
									
										
										
										
											2016-08-01 18:10:34 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-11-02 17:40:15 -07:00
										 |  |  |   const i18nMsgMap: {[id: string]: i18n.Node[]} = {}; | 
					
						
							| 
									
										
										
										
											2016-08-01 18:10:34 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-05 11:53:37 -07:00
										 |  |  |   messages.forEach(message => { | 
					
						
							| 
									
										
										
										
											2016-10-28 19:53:42 -07:00
										 |  |  |     const id = digest(message); | 
					
						
							| 
									
										
										
										
											2016-11-02 17:40:15 -07:00
										 |  |  |     const text = serializeI18nNodes(message.nodes).join('').replace(/</g, '['); | 
					
						
							|  |  |  |     i18nMsgMap[id] = [new i18n.Text(`**${text}**`, null)]; | 
					
						
							| 
									
										
										
										
											2016-08-01 18:10:34 -07:00
										 |  |  |   }); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-10-28 19:53:42 -07:00
										 |  |  |   const translations = new TranslationBundle(i18nMsgMap, digest); | 
					
						
							| 
									
										
										
										
											2016-08-01 18:10:34 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-11 15:31:36 -07:00
										 |  |  |   const translatedNodes = | 
					
						
							|  |  |  |       mergeTranslations( | 
					
						
							|  |  |  |           htmlNodes, translations, DEFAULT_INTERPOLATION_CONFIG, implicitTags, implicitAttrs) | 
					
						
							|  |  |  |           .rootNodes; | 
					
						
							| 
									
										
										
										
											2016-07-08 16:46:49 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2016-08-11 15:31:36 -07:00
										 |  |  |   return serializeHtmlNodes(translatedNodes).join(''); | 
					
						
							| 
									
										
										
										
											2016-07-08 16:46:49 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function extract( | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |     html: string, implicitTags: string[] = [], | 
					
						
							|  |  |  |     implicitAttrs: {[k: string]: string[]} = {}): [string[], string, string][] { | 
					
						
							| 
									
										
										
										
											2016-08-05 14:14:31 -07:00
										 |  |  |   const result = | 
					
						
							|  |  |  |       extractMessages(parseHtml(html), DEFAULT_INTERPOLATION_CONFIG, implicitTags, implicitAttrs); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   if (result.errors.length > 0) { | 
					
						
							|  |  |  |     throw new Error(`unexpected errors: ${result.errors.join('\n')}`); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2016-07-08 16:46:49 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // clang-format off
 | 
					
						
							|  |  |  |   // https://github.com/angular/clang-format/issues/35
 | 
					
						
							| 
									
										
										
										
											2016-08-05 14:14:31 -07:00
										 |  |  |   return result.messages.map( | 
					
						
							| 
									
										
										
										
											2016-12-06 15:04:59 +01:00
										 |  |  |     message => [serializeI18nNodes(message.nodes), message.meaning, message.description, message.id]) as [string[], string, string][]; | 
					
						
							| 
									
										
										
										
											2016-07-08 16:46:49 -07:00
										 |  |  |   // clang-format on
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function extractErrors( | 
					
						
							| 
									
										
										
										
											2016-07-21 13:56:58 -07:00
										 |  |  |     html: string, implicitTags: string[] = [], implicitAttrs: {[k: string]: string[]} = {}): any[] { | 
					
						
							| 
									
										
										
										
											2016-08-04 17:46:31 -07:00
										 |  |  |   const errors = | 
					
						
							|  |  |  |       extractMessages(parseHtml(html), DEFAULT_INTERPOLATION_CONFIG, implicitTags, implicitAttrs) | 
					
						
							|  |  |  |           .errors; | 
					
						
							| 
									
										
										
										
											2016-07-08 16:46:49 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  |   return errors.map((e): [string, string] => [e.msg, e.span.toString()]); | 
					
						
							|  |  |  | } |