@@ -101,158 +101,161 @@ class TextModel {
101101 return this . _lines ;
102102 }
103103}
104- class XLF {
105- constructor ( project ) {
106- this . project = project ;
107- this . buffer = [ ] ;
108- this . files = Object . create ( null ) ;
109- this . numberOfMessages = 0 ;
110- }
111- toString ( ) {
112- this . appendHeader ( ) ;
113- for ( let file in this . files ) {
114- this . appendNewLine ( `<file original="${ file } " source-language="en" datatype="plaintext"><body>` , 2 ) ;
115- for ( let item of this . files [ file ] ) {
116- this . addStringItem ( file , item ) ;
117- }
118- this . appendNewLine ( '</body></file>' , 2 ) ;
119- }
120- this . appendFooter ( ) ;
121- return this . buffer . join ( '\r\n' ) ;
122- }
123- addFile ( original , keys , messages ) {
124- if ( keys . length === 0 ) {
125- console . log ( 'No keys in ' + original ) ;
126- return ;
104+ let XLF = /** @class */ ( ( ) => {
105+ class XLF {
106+ constructor ( project ) {
107+ this . project = project ;
108+ this . buffer = [ ] ;
109+ this . files = Object . create ( null ) ;
110+ this . numberOfMessages = 0 ;
127111 }
128- if ( keys . length !== messages . length ) {
129- throw new Error ( `Unmatching keys(${ keys . length } ) and messages(${ messages . length } ).` ) ;
112+ toString ( ) {
113+ this . appendHeader ( ) ;
114+ for ( let file in this . files ) {
115+ this . appendNewLine ( `<file original="${ file } " source-language="en" datatype="plaintext"><body>` , 2 ) ;
116+ for ( let item of this . files [ file ] ) {
117+ this . addStringItem ( file , item ) ;
118+ }
119+ this . appendNewLine ( '</body></file>' , 2 ) ;
120+ }
121+ this . appendFooter ( ) ;
122+ return this . buffer . join ( '\r\n' ) ;
130123 }
131- this . numberOfMessages += keys . length ;
132- this . files [ original ] = [ ] ;
133- let existingKeys = new Set ( ) ;
134- for ( let i = 0 ; i < keys . length ; i ++ ) {
135- let key = keys [ i ] ;
136- let realKey ;
137- let comment ;
138- if ( Is . string ( key ) ) {
139- realKey = key ;
140- comment = undefined ;
124+ addFile ( original , keys , messages ) {
125+ if ( keys . length === 0 ) {
126+ console . log ( 'No keys in ' + original ) ;
127+ return ;
128+ }
129+ if ( keys . length !== messages . length ) {
130+ throw new Error ( `Unmatching keys(${ keys . length } ) and messages(${ messages . length } ).` ) ;
141131 }
142- else if ( LocalizeInfo . is ( key ) ) {
143- realKey = key . key ;
144- if ( key . comment && key . comment . length > 0 ) {
145- comment = key . comment . map ( comment => encodeEntities ( comment ) ) . join ( '\r\n' ) ;
132+ this . numberOfMessages += keys . length ;
133+ this . files [ original ] = [ ] ;
134+ let existingKeys = new Set ( ) ;
135+ for ( let i = 0 ; i < keys . length ; i ++ ) {
136+ let key = keys [ i ] ;
137+ let realKey ;
138+ let comment ;
139+ if ( Is . string ( key ) ) {
140+ realKey = key ;
141+ comment = undefined ;
142+ }
143+ else if ( LocalizeInfo . is ( key ) ) {
144+ realKey = key . key ;
145+ if ( key . comment && key . comment . length > 0 ) {
146+ comment = key . comment . map ( comment => encodeEntities ( comment ) ) . join ( '\r\n' ) ;
147+ }
148+ }
149+ if ( ! realKey || existingKeys . has ( realKey ) ) {
150+ continue ;
146151 }
152+ existingKeys . add ( realKey ) ;
153+ let message = encodeEntities ( messages [ i ] ) ;
154+ this . files [ original ] . push ( { id : realKey , message : message , comment : comment } ) ;
155+ }
156+ }
157+ addStringItem ( file , item ) {
158+ if ( ! item . id || item . message === undefined || item . message === null ) {
159+ throw new Error ( `No item ID or value specified: ${ JSON . stringify ( item ) } . File: ${ file } ` ) ;
160+ }
161+ if ( item . message . length === 0 ) {
162+ log ( `Item with id ${ item . id } in file ${ file } has an empty message.` ) ;
147163 }
148- if ( ! realKey || existingKeys . has ( realKey ) ) {
149- continue ;
164+ this . appendNewLine ( `<trans-unit id="${ item . id } ">` , 4 ) ;
165+ this . appendNewLine ( `<source xml:lang="en">${ item . message } </source>` , 6 ) ;
166+ if ( item . comment ) {
167+ this . appendNewLine ( `<note>${ item . comment } </note>` , 6 ) ;
150168 }
151- existingKeys . add ( realKey ) ;
152- let message = encodeEntities ( messages [ i ] ) ;
153- this . files [ original ] . push ( { id : realKey , message : message , comment : comment } ) ;
169+ this . appendNewLine ( '</trans-unit>' , 4 ) ;
154170 }
155- }
156- addStringItem ( file , item ) {
157- if ( ! item . id || item . message === undefined || item . message === null ) {
158- throw new Error ( `No item ID or value specified: ${ JSON . stringify ( item ) } . File: ${ file } ` ) ;
171+ appendHeader ( ) {
172+ this . appendNewLine ( '<?xml version="1.0" encoding="utf-8"?>' , 0 ) ;
173+ this . appendNewLine ( '<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">' , 0 ) ;
159174 }
160- if ( item . message . length === 0 ) {
161- log ( `Item with id ${ item . id } in file ${ file } has an empty message.` ) ;
175+ appendFooter ( ) {
176+ this . appendNewLine ( '</xliff>' , 0 ) ;
162177 }
163- this . appendNewLine ( `<trans-unit id=" ${ item . id } ">` , 4 ) ;
164- this . appendNewLine ( `<source xml:lang="en"> ${ item . message } </source>` , 6 ) ;
165- if ( item . comment ) {
166- this . appendNewLine ( `<note> ${ item . comment } </note>` , 6 ) ;
178+ appendNewLine ( content , indent ) {
179+ let line = new Line ( indent ) ;
180+ line . append ( content ) ;
181+ this . buffer . push ( line . toString ( ) ) ;
167182 }
168- this . appendNewLine ( '</trans-unit>' , 4 ) ;
169183 }
170- appendHeader ( ) {
171- this . appendNewLine ( '<?xml version="1.0" encoding="utf-8"?>' , 0 ) ;
172- this . appendNewLine ( '<xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2">' , 0 ) ;
173- }
174- appendFooter ( ) {
175- this . appendNewLine ( '</xliff>' , 0 ) ;
176- }
177- appendNewLine ( content , indent ) {
178- let line = new Line ( indent ) ;
179- line . append ( content ) ;
180- this . buffer . push ( line . toString ( ) ) ;
181- }
182- }
183- exports . XLF = XLF ;
184- XLF . parsePseudo = function ( xlfString ) {
185- return new Promise ( ( resolve ) => {
186- let parser = new xml2js . Parser ( ) ;
187- let files = [ ] ;
188- parser . parseString ( xlfString , function ( _err , result ) {
189- const fileNodes = result [ 'xliff' ] [ 'file' ] ;
190- fileNodes . forEach ( file => {
191- const originalFilePath = file . $ . original ;
192- const messages = { } ;
193- const transUnits = file . body [ 0 ] [ 'trans-unit' ] ;
194- if ( transUnits ) {
195- transUnits . forEach ( ( unit ) => {
196- const key = unit . $ . id ;
197- const val = pseudify ( unit . source [ 0 ] [ '_' ] . toString ( ) ) ;
198- if ( key && val ) {
199- messages [ key ] = decodeEntities ( val ) ;
200- }
201- } ) ;
202- files . push ( { messages : messages , originalFilePath : originalFilePath , language : 'ps' } ) ;
203- }
184+ XLF . parsePseudo = function ( xlfString ) {
185+ return new Promise ( ( resolve ) => {
186+ let parser = new xml2js . Parser ( ) ;
187+ let files = [ ] ;
188+ parser . parseString ( xlfString , function ( _err , result ) {
189+ const fileNodes = result [ 'xliff' ] [ 'file' ] ;
190+ fileNodes . forEach ( file => {
191+ const originalFilePath = file . $ . original ;
192+ const messages = { } ;
193+ const transUnits = file . body [ 0 ] [ 'trans-unit' ] ;
194+ if ( transUnits ) {
195+ transUnits . forEach ( ( unit ) => {
196+ const key = unit . $ . id ;
197+ const val = pseudify ( unit . source [ 0 ] [ '_' ] . toString ( ) ) ;
198+ if ( key && val ) {
199+ messages [ key ] = decodeEntities ( val ) ;
200+ }
201+ } ) ;
202+ files . push ( { messages : messages , originalFilePath : originalFilePath , language : 'ps' } ) ;
203+ }
204+ } ) ;
205+ resolve ( files ) ;
204206 } ) ;
205- resolve ( files ) ;
206207 } ) ;
207- } ) ;
208- } ;
209- XLF . parse = function ( xlfString ) {
210- return new Promise ( ( resolve , reject ) => {
211- let parser = new xml2js . Parser ( ) ;
212- let files = [ ] ;
213- parser . parseString ( xlfString , function ( err , result ) {
214- if ( err ) {
215- reject ( new Error ( `XLF parsing error: Failed to parse XLIFF string. ${ err } ` ) ) ;
216- }
217- const fileNodes = result [ 'xliff' ] [ 'file' ] ;
218- if ( ! fileNodes ) {
219- reject ( new Error ( `XLF parsing error: XLIFF file does not contain "xliff" or "file" node(s) required for parsing.` ) ) ;
220- }
221- fileNodes . forEach ( ( file ) => {
222- const originalFilePath = file . $ . original ;
223- if ( ! originalFilePath ) {
224- reject ( new Error ( `XLF parsing error: XLIFF file node does not contain original attribute to determine the original location of the resource file.` ) ) ;
208+ } ;
209+ XLF . parse = function ( xlfString ) {
210+ return new Promise ( ( resolve , reject ) => {
211+ let parser = new xml2js . Parser ( ) ;
212+ let files = [ ] ;
213+ parser . parseString ( xlfString , function ( err , result ) {
214+ if ( err ) {
215+ reject ( new Error ( `XLF parsing error: Failed to parse XLIFF string. ${ err } ` ) ) ;
225216 }
226- let language = file . $ [ 'target-language' ] ;
227- if ( ! language ) {
228- reject ( new Error ( `XLF parsing error: XLIFF file node does not contain target-language attribute to determine translated language.` ) ) ;
229- }
230- const messages = { } ;
231- const transUnits = file . body [ 0 ] [ 'trans-unit' ] ;
232- if ( transUnits ) {
233- transUnits . forEach ( ( unit ) => {
234- const key = unit . $ . id ;
235- if ( ! unit . target ) {
236- return ; // No translation available
237- }
238- let val = unit . target [ 0 ] ;
239- if ( typeof val !== 'string' ) {
240- val = val . _ ;
241- }
242- if ( key && val ) {
243- messages [ key ] = decodeEntities ( val ) ;
244- }
245- else {
246- reject ( new Error ( `XLF parsing error: XLIFF file ${ originalFilePath } does not contain full localization data. ID or target translation for one of the trans-unit nodes is not present.` ) ) ;
247- }
248- } ) ;
249- files . push ( { messages : messages , originalFilePath : originalFilePath , language : language . toLowerCase ( ) } ) ;
217+ const fileNodes = result [ 'xliff' ] [ 'file' ] ;
218+ if ( ! fileNodes ) {
219+ reject ( new Error ( `XLF parsing error: XLIFF file does not contain "xliff" or "file" node(s) required for parsing.` ) ) ;
250220 }
221+ fileNodes . forEach ( ( file ) => {
222+ const originalFilePath = file . $ . original ;
223+ if ( ! originalFilePath ) {
224+ reject ( new Error ( `XLF parsing error: XLIFF file node does not contain original attribute to determine the original location of the resource file.` ) ) ;
225+ }
226+ let language = file . $ [ 'target-language' ] ;
227+ if ( ! language ) {
228+ reject ( new Error ( `XLF parsing error: XLIFF file node does not contain target-language attribute to determine translated language.` ) ) ;
229+ }
230+ const messages = { } ;
231+ const transUnits = file . body [ 0 ] [ 'trans-unit' ] ;
232+ if ( transUnits ) {
233+ transUnits . forEach ( ( unit ) => {
234+ const key = unit . $ . id ;
235+ if ( ! unit . target ) {
236+ return ; // No translation available
237+ }
238+ let val = unit . target [ 0 ] ;
239+ if ( typeof val !== 'string' ) {
240+ val = val . _ ;
241+ }
242+ if ( key && val ) {
243+ messages [ key ] = decodeEntities ( val ) ;
244+ }
245+ else {
246+ reject ( new Error ( `XLF parsing error: XLIFF file ${ originalFilePath } does not contain full localization data. ID or target translation for one of the trans-unit nodes is not present.` ) ) ;
247+ }
248+ } ) ;
249+ files . push ( { messages : messages , originalFilePath : originalFilePath , language : language . toLowerCase ( ) } ) ;
250+ }
251+ } ) ;
252+ resolve ( files ) ;
251253 } ) ;
252- resolve ( files ) ;
253254 } ) ;
254- } ) ;
255- } ;
255+ } ;
256+ return XLF ;
257+ } ) ( ) ;
258+ exports . XLF = XLF ;
256259class Limiter {
257260 constructor ( maxDegreeOfParalellism ) {
258261 this . maxDegreeOfParalellism = maxDegreeOfParalellism ;
0 commit comments