@@ -209,6 +209,7 @@ pub struct Tokenizer<'a> {
209
209
current_line_number : u32 ,
210
210
var_functions : SeenStatus ,
211
211
viewport_percentages : SeenStatus ,
212
+ source_map_url : Option < & ' a str > ,
212
213
}
213
214
214
215
#[ derive( Copy , Clone , PartialEq , Eq ) ]
@@ -234,6 +235,7 @@ impl<'a> Tokenizer<'a> {
234
235
current_line_number : first_line_number,
235
236
var_functions : SeenStatus :: DontCare ,
236
237
viewport_percentages : SeenStatus :: DontCare ,
238
+ source_map_url : None ,
237
239
}
238
240
}
239
241
@@ -300,6 +302,11 @@ impl<'a> Tokenizer<'a> {
300
302
}
301
303
}
302
304
305
+ #[ inline]
306
+ pub fn current_source_map_url ( & self ) -> Option < & ' a str > {
307
+ self . source_map_url
308
+ }
309
+
303
310
#[ inline]
304
311
pub fn state ( & self ) -> ParserState {
305
312
ParserState {
@@ -597,6 +604,53 @@ fn consume_whitespace<'a>(tokenizer: &mut Tokenizer<'a>, newline: bool, is_cr: b
597
604
fn consume_comment < ' a > ( tokenizer : & mut Tokenizer < ' a > ) -> & ' a str {
598
605
tokenizer. advance ( 2 ) ; // consume "/*"
599
606
let start_position = tokenizer. position ( ) ;
607
+
608
+ // If there is a source map directive, extract the URL.
609
+ if tokenizer. starts_with ( b"#" ) || tokenizer. starts_with ( b"@" ) {
610
+ tokenizer. advance ( 1 ) ;
611
+ let directive_text = b" sourceMappingURL=" ;
612
+ if tokenizer. starts_with ( directive_text) {
613
+ tokenizer. advance ( directive_text. len ( ) ) ;
614
+
615
+ // Scan for the next whitespace.
616
+ let url_start_position = tokenizer. position ( ) ;
617
+ let mut url_end_position = tokenizer. position ( ) ;
618
+ while !tokenizer. is_eof ( ) {
619
+ match_byte ! { tokenizer. next_byte_unchecked( ) ,
620
+ b' ' | b'\t' => {
621
+ url_end_position = tokenizer. position( ) ;
622
+ tokenizer. advance( 1 ) ;
623
+ break
624
+ }
625
+ b'\n' | b'\x0C' => {
626
+ url_end_position = tokenizer. position( ) ;
627
+ tokenizer. advance( 1 ) ;
628
+ tokenizer. seen_newline( false ) ;
629
+ break
630
+ }
631
+ b'\r' => {
632
+ url_end_position = tokenizer. position( ) ;
633
+ tokenizer. advance( 1 ) ;
634
+ tokenizer. seen_newline( true ) ;
635
+ break
636
+ }
637
+ b'*' => {
638
+ if tokenizer. starts_with( b"*/" ) {
639
+ // End of comment, so let the later loop finish up.
640
+ url_end_position = tokenizer. position( ) ;
641
+ break
642
+ }
643
+ tokenizer. advance( 1 ) ;
644
+ }
645
+ _ => {
646
+ tokenizer. advance( 1 ) ;
647
+ }
648
+ }
649
+ }
650
+ tokenizer. source_map_url = Some ( tokenizer. slice ( url_start_position..url_end_position) )
651
+ }
652
+ }
653
+
600
654
while !tokenizer. is_eof ( ) {
601
655
match_byte ! { tokenizer. next_byte_unchecked( ) ,
602
656
b'*' => {
0 commit comments