RbYAML 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/rbyaml.rb +14 -256
- data/lib/rbyaml.rb.~1.2.~ +383 -0
- data/lib/rbyaml/composer.rb +9 -11
- data/lib/rbyaml/{composer.rb.~1.2.~ → composer.rb.~1.3.~} +28 -25
- data/lib/rbyaml/constants.rb +95 -0
- data/lib/rbyaml/constructor.rb +180 -89
- data/lib/rbyaml/{constructor.rb.~1.2.~ → constructor.rb.~1.9.~} +137 -95
- data/lib/rbyaml/dumper.rb +12 -9
- data/lib/rbyaml/dumper.rb.~1.3.~ +36 -0
- data/lib/rbyaml/emitter.rb +14 -28
- data/lib/rbyaml/{emitter.rb.~1.2.~ → emitter.rb.~1.6.~} +22 -33
- data/lib/rbyaml/error.rb +4 -57
- data/lib/rbyaml/error.rb.~1.2.~ +75 -0
- data/lib/rbyaml/events.rb +8 -14
- data/lib/rbyaml/{events.rb.~1.2.~ → events.rb.~1.4.~} +29 -6
- data/lib/rbyaml/nodes.rb +5 -5
- data/lib/rbyaml/{nodes.rb.~1.2.~ → nodes.rb.~1.3.~} +13 -9
- data/lib/rbyaml/parser.rb +70 -108
- data/lib/rbyaml/parser.rb.~1.4.~ +632 -0
- data/lib/rbyaml/representer.rb +19 -157
- data/lib/rbyaml/representer.rb.old +317 -0
- data/lib/rbyaml/{representer.rb.~1.2.~ → representer.rb.~1.5.~} +60 -26
- data/lib/rbyaml/resolver.rb +6 -6
- data/lib/rbyaml/{resolver.rb.~1.1.~ → resolver.rb.~1.6.~} +20 -20
- data/lib/rbyaml/rubytypes.rb +391 -0
- data/lib/rbyaml/scanner.rb +123 -225
- data/lib/rbyaml/{scanner.rb.~1.2.~ → scanner.rb.~1.5.~} +466 -378
- data/lib/rbyaml/serializer.rb +9 -9
- data/lib/rbyaml/{serializer.rb.~1.2.~ → serializer.rb.~1.4.~} +19 -17
- data/lib/rbyaml/stream.rb +48 -0
- data/lib/rbyaml/tag.rb +72 -0
- data/lib/rbyaml/tokens.rb +22 -16
- data/lib/rbyaml/{tokens.rb.~1.2.~ → tokens.rb.~1.3.~} +44 -4
- data/lib/rbyaml/types.rb +146 -0
- data/lib/rbyaml/util.rb.~1.3.~ +38 -0
- data/lib/rbyaml/yaml.rb +22 -32
- data/lib/rbyaml/{yaml.rb.~1.2.~ → yaml.rb.~1.5.~} +17 -17
- data/test/load_one.rb +6 -0
- data/test/load_one_yaml.rb +6 -0
- data/test/output_events.rb +9 -0
- data/test/test_add_ctor.rb +51 -0
- data/test/test_add_ctor.rb.~1.1.~ +30 -0
- data/test/test_bm.rb +2 -2
- data/test/test_bm.rb.~1.1.~ +28 -0
- data/test/test_gems.rb +10 -0
- data/test/test_one.rb.~1.1.~ +5 -0
- data/test/test_one_syck.rb +5 -0
- data/test/test_rbyaml.rb +63 -32
- data/test/test_rbyaml.rb.~1.6.~ +59 -0
- data/test/{test_rbyaml.rb.~1.2.~ → test_rbyaml_old.rb} +13 -4
- data/test/test_time_events.rb +24 -0
- data/test/test_time_nodes.rb +24 -0
- data/test/test_time_tokens.rb +24 -0
- data/test/yaml/gems_new.yml +147456 -0
- data/test/yaml/test1.rb +8 -0
- data/test/yaml/test10.rb +14 -0
- data/test/yaml/test11.rb +13 -0
- data/test/yaml/test12.rb +9 -0
- data/test/yaml/test13.rb +9 -0
- data/test/yaml/test14.rb +13 -0
- data/test/yaml/test15.rb +12 -0
- data/test/yaml/test16.rb +11 -0
- data/test/yaml/test16.rb.~1.1.~ +11 -0
- data/test/yaml/test17.rb +10 -0
- data/test/yaml/test18.rb +13 -0
- data/test/yaml/test19.rb +9 -0
- data/test/yaml/test19.yml +1 -1
- data/test/yaml/test2.rb +8 -0
- data/test/yaml/test20.rb +11 -0
- data/test/yaml/test20.rb.~1.1.~ +9 -0
- data/test/yaml/test20.yml +1 -1
- data/test/yaml/test3.rb +13 -0
- data/test/yaml/test4.rb +13 -0
- data/test/yaml/test5.rb +8 -0
- data/test/yaml/test6.rb +10 -0
- data/test/yaml/test7.rb +15 -0
- data/test/yaml/test8.rb +15 -0
- data/test/yaml/test9.rb +13 -0
- metadata +61 -16
- data/lib/rbyaml/dumper.rb.~1.2.~ +0 -43
- data/lib/rbyaml/parser.rb.~1.2.~ +0 -494
data/lib/rbyaml/scanner.rb
CHANGED
@@ -26,9 +26,10 @@
|
|
26
26
|
require 'rbyaml/util'
|
27
27
|
require 'rbyaml/error'
|
28
28
|
require 'rbyaml/tokens'
|
29
|
+
require 'rbyaml/constants'
|
29
30
|
|
30
31
|
module RbYAML
|
31
|
-
class ScannerError <
|
32
|
+
class ScannerError < YAMLError
|
32
33
|
end
|
33
34
|
class ReaderError < YAMLError
|
34
35
|
def initialize(name, position, character, encoding, reason)
|
@@ -48,10 +49,10 @@ module RbYAML
|
|
48
49
|
end
|
49
50
|
end
|
50
51
|
|
51
|
-
SimpleKey = Struct.new(:token_number, :required, :
|
52
|
+
SimpleKey = Struct.new(:token_number, :required, :column)
|
52
53
|
|
53
54
|
class Scanner
|
54
|
-
attr_reader :column, :stream, :stream_pointer, :eof, :buffer, :pointer
|
55
|
+
attr_reader :column, :stream, :stream_pointer, :eof, :buffer, :pointer
|
55
56
|
def initialize(stream)
|
56
57
|
# Had we reached the end of the stream?
|
57
58
|
@done = false
|
@@ -185,8 +186,6 @@ module RbYAML
|
|
185
186
|
update(1) unless @pointer1 < @buffer_length
|
186
187
|
end
|
187
188
|
|
188
|
-
LINE_BR = "\n\x85"
|
189
|
-
|
190
189
|
def forward1
|
191
190
|
update(2) unless @pointer1+1 < @buffer_length
|
192
191
|
buff = @buffer[@pointer...@pointer1+1]
|
@@ -241,7 +240,6 @@ module RbYAML
|
|
241
240
|
@pointer1 += 6
|
242
241
|
end
|
243
242
|
|
244
|
-
LINE_BR_REG = /[\n\x85]|(?:\r[^\n])/
|
245
243
|
def forwardn(length)
|
246
244
|
update(length + 1) unless @pointer1+length < @buffer_length
|
247
245
|
buff = @buffer[@pointer...@pointer+length]
|
@@ -251,17 +249,8 @@ module RbYAML
|
|
251
249
|
@pointer1 += length
|
252
250
|
end
|
253
251
|
|
254
|
-
def get_mark
|
255
|
-
if @stream.nil?
|
256
|
-
Mark.new(@name,@column,@buffer,@pointer)
|
257
|
-
else
|
258
|
-
Mark.new(@name,@column,nil,nil)
|
259
|
-
end
|
260
|
-
end
|
261
|
-
|
262
|
-
NON_PRINTABLE = /[^\x09\x0A\x0D\x20-\x7E\x85\xA0-\xFF]/
|
263
252
|
def check_printable(data)
|
264
|
-
if
|
253
|
+
if NON_PRINTABLE_RE =~ data
|
265
254
|
position = @buffer.length-@pointer+($~.offset(0)[0])
|
266
255
|
raise ReaderError.new(@name, position, $&,"unicode","special characters are not allowed"),"special characters are not allowed"
|
267
256
|
end
|
@@ -341,10 +330,6 @@ module RbYAML
|
|
341
330
|
@tokens.empty? || next_possible_simple_key == @tokens_taken
|
342
331
|
end
|
343
332
|
|
344
|
-
ENDING = /^---[\0 \t\r\n\x85]$/
|
345
|
-
START = /^\.\.\.[\0 \t\r\n\x85]$/
|
346
|
-
NULL_OR_OTHER = "\0 \t\r\n\x85"
|
347
|
-
BEG = /^([^\0 \t\r\n\x85\-?:,\[\]{}#&*!|>'"%@`]|([\-?:][^\0 \t\r\n\x85]))/
|
348
333
|
def fetch_more_tokens
|
349
334
|
# Eat whitespaces and comments until we reach the next token.
|
350
335
|
scan_to_next_token
|
@@ -381,7 +366,7 @@ module RbYAML
|
|
381
366
|
when ?>: if @flow_zero: return fetch_folded end
|
382
367
|
end
|
383
368
|
return fetch_plain if BEG =~ prefix(2)
|
384
|
-
raise ScannerError.new("while scanning for the next token",
|
369
|
+
raise ScannerError.new("while scanning for the next token","found character #{ch.chr}(#{ch}) that cannot start any token")
|
385
370
|
end
|
386
371
|
|
387
372
|
# Simple keys treatment.
|
@@ -399,7 +384,7 @@ module RbYAML
|
|
399
384
|
# ALIAS, ANCHOR, TAG, SCALAR(flow), '[', and '{'.
|
400
385
|
# The next token might be a simple key. Let's save it's number and
|
401
386
|
# position.
|
402
|
-
@possible_simple_keys[@flow_level] = SimpleKey.new(@tokens_taken+@tokens.length, @flow_zero && @indent == @column,
|
387
|
+
@possible_simple_keys[@flow_level] = SimpleKey.new(@tokens_taken+@tokens.length, @flow_zero && @indent == @column,column) if @allow_simple_key
|
403
388
|
end
|
404
389
|
|
405
390
|
# Indentation functions.
|
@@ -421,17 +406,16 @@ module RbYAML
|
|
421
406
|
return nil if !@flow_zero
|
422
407
|
# In block context, we may need to issue the BLOCK-END tokens.
|
423
408
|
while @indent > col
|
424
|
-
mark = get_mark
|
425
409
|
@indent = @indents.pop
|
426
|
-
@tokens <<
|
410
|
+
@tokens << BLOCK_END
|
427
411
|
end
|
428
412
|
end
|
429
413
|
|
430
|
-
def add_indent(
|
414
|
+
def add_indent(col)
|
431
415
|
# Check if we need to increase indentation.
|
432
|
-
if @indent <
|
416
|
+
if @indent < col
|
433
417
|
@indents << @indent
|
434
|
-
@indent =
|
418
|
+
@indent = col
|
435
419
|
return true
|
436
420
|
end
|
437
421
|
return false
|
@@ -443,9 +427,8 @@ module RbYAML
|
|
443
427
|
# We always add STREAM-START as the first token and STREAM-END as the
|
444
428
|
# last token.
|
445
429
|
# Read the token.
|
446
|
-
mark = get_mark
|
447
430
|
# Add STREAM-START.
|
448
|
-
@tokens <<
|
431
|
+
@tokens << STREAM_START
|
449
432
|
end
|
450
433
|
|
451
434
|
|
@@ -456,9 +439,8 @@ module RbYAML
|
|
456
439
|
@allow_simple_key = false
|
457
440
|
@possible_simple_keys = {}
|
458
441
|
# Read the token.
|
459
|
-
mark = get_mark
|
460
442
|
# Add STREAM-END.
|
461
|
-
@tokens <<
|
443
|
+
@tokens << STREAM_END
|
462
444
|
# The stream is finished.
|
463
445
|
@done = true
|
464
446
|
end
|
@@ -473,11 +455,11 @@ module RbYAML
|
|
473
455
|
end
|
474
456
|
|
475
457
|
def fetch_document_start
|
476
|
-
fetch_document_indicator(
|
458
|
+
fetch_document_indicator(DOCUMENT_START)
|
477
459
|
end
|
478
460
|
|
479
461
|
def fetch_document_end
|
480
|
-
fetch_document_indicator(
|
462
|
+
fetch_document_indicator(DOCUMENT_END)
|
481
463
|
end
|
482
464
|
|
483
465
|
def fetch_document_indicator(token)
|
@@ -487,18 +469,16 @@ module RbYAML
|
|
487
469
|
# after '---'.
|
488
470
|
@allow_simple_key = false
|
489
471
|
# Add DOCUMENT-START or DOCUMENT-END.
|
490
|
-
start_mark = get_mark
|
491
472
|
forward3
|
492
|
-
|
493
|
-
@tokens << token.new(start_mark, end_mark)
|
473
|
+
@tokens << token
|
494
474
|
end
|
495
475
|
|
496
476
|
def fetch_flow_sequence_start
|
497
|
-
fetch_flow_collection_start(
|
477
|
+
fetch_flow_collection_start(FLOW_SEQUENCE_START)
|
498
478
|
end
|
499
479
|
|
500
480
|
def fetch_flow_mapping_start
|
501
|
-
fetch_flow_collection_start(
|
481
|
+
fetch_flow_collection_start(FLOW_MAPPING_START)
|
502
482
|
end
|
503
483
|
|
504
484
|
def fetch_flow_collection_start(token)
|
@@ -510,18 +490,16 @@ module RbYAML
|
|
510
490
|
# Simple keys are allowed after '[' and '{'.
|
511
491
|
@allow_simple_key = true
|
512
492
|
# Add FLOW-SEQUENCE-START or FLOW-MAPPING-START.
|
513
|
-
start_mark = get_mark
|
514
493
|
forward1
|
515
|
-
|
516
|
-
@tokens << token.new(start_mark, end_mark)
|
494
|
+
@tokens << token
|
517
495
|
end
|
518
496
|
|
519
497
|
def fetch_flow_sequence_end
|
520
|
-
fetch_flow_collection_end(
|
498
|
+
fetch_flow_collection_end(FLOW_SEQUENCE_END)
|
521
499
|
end
|
522
500
|
|
523
501
|
def fetch_flow_mapping_end
|
524
|
-
fetch_flow_collection_end(
|
502
|
+
fetch_flow_collection_end(FLOW_MAPPING_END)
|
525
503
|
end
|
526
504
|
|
527
505
|
def fetch_flow_collection_end(token)
|
@@ -533,30 +511,25 @@ module RbYAML
|
|
533
511
|
# No simple keys after ']' or '}'.
|
534
512
|
@allow_simple_key = false
|
535
513
|
# Add FLOW-SEQUENCE-END or FLOW-MAPPING-END.
|
536
|
-
start_mark = get_mark
|
537
514
|
forward1
|
538
|
-
|
539
|
-
@tokens << token.new(start_mark, end_mark)
|
515
|
+
@tokens << token
|
540
516
|
end
|
541
517
|
|
542
518
|
def fetch_flow_entry
|
543
519
|
# Simple keys are allowed after ','.
|
544
520
|
@allow_simple_key = true
|
545
521
|
# Add FLOW-ENTRY.
|
546
|
-
start_mark = get_mark
|
547
522
|
forward1
|
548
|
-
|
549
|
-
@tokens << FlowEntryToken.new(start_mark, end_mark)
|
523
|
+
@tokens << FLOW_ENTRY
|
550
524
|
end
|
551
525
|
|
552
526
|
def fetch_block_entry
|
553
527
|
# Block context needs additional checks.
|
554
528
|
if @flow_zero
|
555
|
-
raise ScannerError.new(nil,
|
529
|
+
raise ScannerError.new(nil,"sequence entries are not allowed here") if !@allow_simple_key
|
556
530
|
# We may need to add BLOCK-SEQUENCE-START.
|
557
531
|
if add_indent(column)
|
558
|
-
|
559
|
-
@tokens << BlockSequenceStartToken.new(mark, mark)
|
532
|
+
@tokens << BLOCK_SEQUENCE_START
|
560
533
|
end
|
561
534
|
# It's an error for the block entry to occur in the flow context,
|
562
535
|
# but we let the parser detect this.
|
@@ -564,30 +537,25 @@ module RbYAML
|
|
564
537
|
# Simple keys are allowed after '-'.
|
565
538
|
@allow_simple_key = true
|
566
539
|
# Add BLOCK-ENTRY.
|
567
|
-
start_mark = get_mark
|
568
540
|
forward1
|
569
|
-
|
570
|
-
@tokens << BlockEntryToken.new(start_mark, end_mark)
|
541
|
+
@tokens << BLOCK_ENTRY
|
571
542
|
end
|
572
543
|
|
573
544
|
def fetch_key
|
574
545
|
# Block context needs additional checks.
|
575
546
|
if @flow_zero
|
576
547
|
# Are we allowed to start a key (not nessesary a simple)?
|
577
|
-
raise ScannerError.new(nil,
|
548
|
+
raise ScannerError.new(nil,"mapping keys are not allowed here") if !@allow_simple_key
|
578
549
|
# We may need to add BLOCK-MAPPING-START.
|
579
550
|
if add_indent(column)
|
580
|
-
|
581
|
-
@tokens << BlockMappingStartToken.new(mark, mark)
|
551
|
+
@tokens << BLOCK_MAPPING_START
|
582
552
|
end
|
583
553
|
end
|
584
554
|
# Simple keys are allowed after '?' in the block context.
|
585
555
|
@allow_simple_key = @flow_zero
|
586
556
|
# Add KEY.
|
587
|
-
start_mark = get_mark
|
588
557
|
forward1
|
589
|
-
|
590
|
-
@tokens << KeyToken.new(start_mark, end_mark)
|
558
|
+
@tokens << KEY
|
591
559
|
end
|
592
560
|
|
593
561
|
def fetch_value
|
@@ -600,7 +568,7 @@ module RbYAML
|
|
600
568
|
if @flow_zero
|
601
569
|
# We are allowed to start a complex value if and only if
|
602
570
|
# we can start a simple key.
|
603
|
-
raise ScannerError.new(nil,
|
571
|
+
raise ScannerError.new(nil,"mapping values are not allowed here") if !@allow_simple_key
|
604
572
|
# Simple keys are allowed after ':' in the block context.
|
605
573
|
@allow_simple_key = true
|
606
574
|
end
|
@@ -610,18 +578,16 @@ module RbYAML
|
|
610
578
|
|
611
579
|
# If this key starts a new block mapping, we need to add
|
612
580
|
# BLOCK-MAPPING-START.
|
613
|
-
se = (@flow_zero && add_indent(key.column)) ? [
|
614
|
-
se <<
|
581
|
+
se = (@flow_zero && add_indent(key.column)) ? [BLOCK_MAPPING_START] : []
|
582
|
+
se << KEY
|
615
583
|
@tokens.insert(key.token_number-@tokens_taken,*se)
|
616
584
|
# There cannot be two simple keys one after another.
|
617
585
|
@allow_simple_key = false
|
618
586
|
# It must be a part of a complex key.
|
619
587
|
end
|
620
588
|
# Add VALUE.
|
621
|
-
start_mark = get_mark
|
622
589
|
forward1
|
623
|
-
|
624
|
-
@tokens << ValueToken.new(start_mark, end_mark)
|
590
|
+
@tokens << VALUE
|
625
591
|
end
|
626
592
|
|
627
593
|
def fetch_alias
|
@@ -696,7 +662,6 @@ module RbYAML
|
|
696
662
|
|
697
663
|
|
698
664
|
# Scanners.
|
699
|
-
NULL_OR_LINEBR = "\0\r\n\x85"
|
700
665
|
def scan_to_next_token
|
701
666
|
# We ignore spaces, line breaks and comments.
|
702
667
|
# If we find a line break in the block context, we set the flag
|
@@ -713,15 +678,12 @@ module RbYAML
|
|
713
678
|
# `unwind_indent` before issuing BLOCK-END.
|
714
679
|
# Scanners for block, flow, and plain scalars need to be modified.
|
715
680
|
while true
|
716
|
-
|
717
|
-
while peek_0 == 32
|
681
|
+
while peek0 == 32
|
718
682
|
forward1
|
719
|
-
peek_0 = peek0
|
720
683
|
end
|
721
|
-
if
|
684
|
+
if peek0 == ?#
|
722
685
|
while !NULL_OR_LINEBR.include?(peek0)
|
723
686
|
forward1
|
724
|
-
peek_0 = peek0
|
725
687
|
end
|
726
688
|
end
|
727
689
|
|
@@ -735,60 +697,53 @@ module RbYAML
|
|
735
697
|
|
736
698
|
def scan_directive
|
737
699
|
# See the specification for details.
|
738
|
-
start_mark = get_mark
|
739
700
|
forward1
|
740
|
-
name = scan_directive_name
|
701
|
+
name = scan_directive_name
|
741
702
|
value = nil
|
742
703
|
if name == "YAML"
|
743
|
-
value = scan_yaml_directive_value
|
744
|
-
end_mark = get_mark
|
704
|
+
value = scan_yaml_directive_value
|
745
705
|
elsif name == "TAG"
|
746
|
-
value = scan_tag_directive_value
|
747
|
-
end_mark = get_mark
|
706
|
+
value = scan_tag_directive_value
|
748
707
|
else
|
749
|
-
end_mark = get_mark
|
750
708
|
forward1 while !NULL_OR_LINEBR.include?(peek0)
|
751
709
|
end
|
752
|
-
scan_directive_ignored_line
|
753
|
-
DirectiveToken.new(name, value
|
710
|
+
scan_directive_ignored_line
|
711
|
+
DirectiveToken.new(name, value)
|
754
712
|
end
|
755
713
|
|
756
|
-
|
757
|
-
NULL_BL_LINEBR = "\0 \r\n\x85"
|
758
|
-
NULL_BL_T_LINEBR = "\0 \t\r\n\x85"
|
759
|
-
def scan_directive_name(start_mark)
|
714
|
+
def scan_directive_name
|
760
715
|
# See the specification for details.
|
761
716
|
length = 0
|
762
717
|
ch = peek(length)
|
763
|
-
zlen =
|
718
|
+
zlen = true
|
764
719
|
while ALPHA_REG =~ ch.chr
|
765
|
-
zlen =
|
720
|
+
zlen = false
|
766
721
|
length += 1
|
767
722
|
ch = peek(length)
|
768
723
|
end
|
769
|
-
raise ScannerError.new("while scanning a directive",
|
724
|
+
raise ScannerError.new("while scanning a directive","expected alphabetic or numeric character, but found #{ch.to_s}") if zlen
|
770
725
|
value = prefix(length)
|
771
726
|
forward(length)
|
772
727
|
ch = peek0
|
773
|
-
raise ScannerError.new("while scanning a directive",
|
728
|
+
raise ScannerError.new("while scanning a directive","expected alphabetic or numeric character, but found #{ch.to_s}") if !NULL_BL_LINEBR.include?(ch)
|
774
729
|
value
|
775
730
|
end
|
776
731
|
|
777
|
-
def scan_yaml_directive_value
|
732
|
+
def scan_yaml_directive_value
|
778
733
|
# See the specification for details.
|
779
734
|
forward1 while peek0 == 32
|
780
|
-
major = scan_yaml_directive_number
|
781
|
-
raise ScannerError.new("while scanning a directive",
|
735
|
+
major = scan_yaml_directive_number
|
736
|
+
raise ScannerError.new("while scanning a directive","expected a digit or '.', but found #{peek.to_s}") if peek0 != ?.
|
782
737
|
forward1
|
783
|
-
minor = scan_yaml_directive_number
|
784
|
-
raise ScannerError.new("while scanning a directive",
|
738
|
+
minor = scan_yaml_directive_number
|
739
|
+
raise ScannerError.new("while scanning a directive","expected a digit or ' ', but found #{peek.to_s}") if !NULL_BL_LINEBR.include?(peek0)
|
785
740
|
[major, minor]
|
786
741
|
end
|
787
742
|
|
788
|
-
def scan_yaml_directive_number
|
743
|
+
def scan_yaml_directive_number
|
789
744
|
# See the specification for details.
|
790
745
|
ch = peek0
|
791
|
-
raise ScannerError.new("while scanning a directive",
|
746
|
+
raise ScannerError.new("while scanning a directive","expected a digit, but found #{ch.to_s}") if !(ch.__is_ascii_num)
|
792
747
|
length = 0
|
793
748
|
length += 1 while (peek(length).__is_ascii_num)
|
794
749
|
value = prefix(length)
|
@@ -796,42 +751,40 @@ module RbYAML
|
|
796
751
|
value
|
797
752
|
end
|
798
753
|
|
799
|
-
def scan_tag_directive_value
|
754
|
+
def scan_tag_directive_value
|
800
755
|
# See the specification for details.
|
801
756
|
forward1 while peek0 == 32
|
802
|
-
handle = scan_tag_directive_handle
|
757
|
+
handle = scan_tag_directive_handle
|
803
758
|
forward1 while peek0 == 32
|
804
|
-
prefix = scan_tag_directive_prefix
|
759
|
+
prefix = scan_tag_directive_prefix
|
805
760
|
[handle, prefix]
|
806
761
|
end
|
807
762
|
|
808
|
-
def scan_tag_directive_handle
|
763
|
+
def scan_tag_directive_handle
|
809
764
|
# See the specification for details.
|
810
|
-
value = scan_tag_handle("directive"
|
811
|
-
raise ScannerError.new("while scanning a directive",
|
765
|
+
value = scan_tag_handle("directive")
|
766
|
+
raise ScannerError.new("while scanning a directive","expected ' ', but found #{peek0}") if peek0 != 32
|
812
767
|
value
|
813
768
|
end
|
814
769
|
|
815
|
-
def scan_tag_directive_prefix
|
770
|
+
def scan_tag_directive_prefix
|
816
771
|
# See the specification for details.
|
817
|
-
value = scan_tag_uri("directive"
|
818
|
-
raise ScannerError.new("while scanning a directive",
|
772
|
+
value = scan_tag_uri("directive")
|
773
|
+
raise ScannerError.new("while scanning a directive","expected ' ', but found #{peek0}") if !NULL_BL_LINEBR.include?(peek0)
|
819
774
|
value
|
820
775
|
end
|
821
776
|
|
822
|
-
def scan_directive_ignored_line
|
777
|
+
def scan_directive_ignored_line
|
823
778
|
# See the specification for details.
|
824
779
|
forward1 while peek0 == 32
|
825
780
|
if peek0 == ?#
|
826
781
|
forward1 while !NULL_OR_LINEBR.include?(peek0)
|
827
782
|
end
|
828
783
|
ch = peek0
|
829
|
-
raise ScannerError.new("while scanning a directive",
|
784
|
+
raise ScannerError.new("while scanning a directive","expected a comment or a line break, but found #{peek0.to_s}") if !NULL_OR_LINEBR.include?(peek0)
|
830
785
|
scan_line_break
|
831
786
|
end
|
832
787
|
|
833
|
-
NON_ALPHA = /[^-0-9A-Za-z_]/
|
834
|
-
NON_ALPHA_OR_NUM = "\0 \t\r\n\x85?:,]}%@`"
|
835
788
|
def scan_anchor(token)
|
836
789
|
# The specification does not restrict characters for anchors and
|
837
790
|
# aliases. This may lead to problems, for instance, the document:
|
@@ -841,9 +794,7 @@ module RbYAML
|
|
841
794
|
# and
|
842
795
|
# [ *alias , "value" ]
|
843
796
|
# Therefore we restrict aliases to numbers and ASCII letters.
|
844
|
-
|
845
|
-
indicator = peek0
|
846
|
-
name = (indicator == ?*) ? "alias":"anchor"
|
797
|
+
name = (peek0 == ?*) ? "alias":"anchor"
|
847
798
|
forward1
|
848
799
|
length = 0
|
849
800
|
chunk_size = 16
|
@@ -854,26 +805,23 @@ module RbYAML
|
|
854
805
|
end
|
855
806
|
chunk_size += 16
|
856
807
|
end
|
857
|
-
raise ScannerError.new("while scanning an #{name}",
|
808
|
+
raise ScannerError.new("while scanning an #{name}","expected alphabetic or numeric character, but found something else...") if length==0
|
858
809
|
value = prefix(length)
|
859
810
|
forward(length)
|
860
811
|
if !NON_ALPHA_OR_NUM.include?(peek0)
|
861
|
-
raise ScannerError.new("while scanning an #{name}",
|
812
|
+
raise ScannerError.new("while scanning an #{name}","expected alphabetic or numeric character, but found #{peek0}")
|
862
813
|
end
|
863
|
-
|
864
|
-
token.new(value, start_mark, end_mark)
|
814
|
+
token.new(value)
|
865
815
|
end
|
866
816
|
|
867
|
-
NULL_T_BL_LINEBR = "\0 \t\r\n\x85"
|
868
817
|
def scan_tag
|
869
818
|
# See the specification for details.
|
870
|
-
start_mark = get_mark
|
871
819
|
ch = peek1
|
872
820
|
if ch == ?<
|
873
821
|
handle = nil
|
874
822
|
forward2
|
875
|
-
suffix = scan_tag_uri("tag"
|
876
|
-
raise ScannerError.new("while parsing a tag",
|
823
|
+
suffix = scan_tag_uri("tag")
|
824
|
+
raise ScannerError.new("while parsing a tag","expected '>', but found #{peek.to_s}") if peek0 != ?>
|
877
825
|
forward1
|
878
826
|
elsif NULL_T_BL_LINEBR.include?(ch)
|
879
827
|
handle = nil
|
@@ -892,38 +840,35 @@ module RbYAML
|
|
892
840
|
end
|
893
841
|
handle = "!"
|
894
842
|
if use_handle
|
895
|
-
handle = scan_tag_handle("tag"
|
843
|
+
handle = scan_tag_handle("tag")
|
896
844
|
else
|
897
845
|
handle = "!"
|
898
846
|
forward1
|
899
847
|
end
|
900
|
-
suffix = scan_tag_uri("tag"
|
848
|
+
suffix = scan_tag_uri("tag")
|
901
849
|
end
|
902
|
-
raise ScannerError.new("while scanning a tag",
|
850
|
+
raise ScannerError.new("while scanning a tag","expected ' ', but found #{peek0}") if !NULL_BL_LINEBR.include?(peek0)
|
903
851
|
value = [handle, suffix]
|
904
|
-
|
905
|
-
TagToken.new(value, start_mark, end_mark)
|
852
|
+
TagToken.new(value)
|
906
853
|
end
|
907
854
|
|
908
|
-
BLANK_T = " \t"
|
909
855
|
def scan_block_scalar(style)
|
910
856
|
# See the specification for details.
|
911
857
|
folded = style== ?>
|
912
858
|
chunks = []
|
913
|
-
start_mark = get_mark
|
914
859
|
# Scan the header.
|
915
860
|
forward1
|
916
|
-
chomping, increment = scan_block_scalar_indicators
|
917
|
-
scan_block_scalar_ignored_line
|
861
|
+
chomping, increment = scan_block_scalar_indicators
|
862
|
+
scan_block_scalar_ignored_line
|
918
863
|
# Determine the indentation level and go to the first non-empty line.
|
919
864
|
min_indent = @indent+1
|
920
865
|
min_indent = 1 if min_indent < 1
|
921
866
|
if increment.nil?
|
922
|
-
breaks, max_indent
|
867
|
+
breaks, max_indent = scan_block_scalar_indentation
|
923
868
|
indent = [min_indent, max_indent].max
|
924
869
|
else
|
925
870
|
indent = min_indent+increment-1
|
926
|
-
breaks
|
871
|
+
breaks = scan_block_scalar_breaks(indent)
|
927
872
|
end
|
928
873
|
line_break = ''
|
929
874
|
# Scan the inner part of the block scalar.
|
@@ -935,12 +880,12 @@ module RbYAML
|
|
935
880
|
chunks << prefix(length)
|
936
881
|
forward(length)
|
937
882
|
line_break = scan_line_break
|
938
|
-
breaks
|
883
|
+
breaks = scan_block_scalar_breaks(indent)
|
939
884
|
if column == indent && peek0 != 0
|
940
885
|
# Unfortunately, folding rules are ambiguous.
|
941
886
|
#
|
942
887
|
# This is the folding according to the specification:
|
943
|
-
if folded && line_break ==
|
888
|
+
if folded && line_break == "\n" && leading_non_space && !BLANK_T.include?(peek0)
|
944
889
|
chunks << ' ' if breaks.empty?
|
945
890
|
else
|
946
891
|
chunks << line_break
|
@@ -968,11 +913,10 @@ module RbYAML
|
|
968
913
|
end
|
969
914
|
|
970
915
|
# We are done.
|
971
|
-
ScalarToken.new(chunks.to_s, false,
|
916
|
+
ScalarToken.new(chunks.to_s, false, style)
|
972
917
|
end
|
973
918
|
|
974
|
-
|
975
|
-
def scan_block_scalar_indicators(start_mark)
|
919
|
+
def scan_block_scalar_indicators
|
976
920
|
# See the specification for details.
|
977
921
|
chomping = nil
|
978
922
|
increment = nil
|
@@ -982,13 +926,13 @@ module RbYAML
|
|
982
926
|
forward1
|
983
927
|
ch = peek0
|
984
928
|
if ch.__is_ascii_num
|
985
|
-
increment = ch.to_i
|
986
|
-
raise ScannerError.new("while scanning a block scalar",
|
929
|
+
increment = ch.chr.to_i
|
930
|
+
raise ScannerError.new("while scanning a block scalar","expected indentation indicator in the range 1-9, but found 0") if increment == 0
|
987
931
|
forward1
|
988
932
|
end
|
989
933
|
elsif ch.__is_ascii_num
|
990
|
-
increment = ch
|
991
|
-
raise ScannerError.new("while scanning a block scalar",
|
934
|
+
increment = ch.chr.to_i
|
935
|
+
raise ScannerError.new("while scanning a block scalar","expected indentation indicator in the range 1-9, but found 0") if increment == 0
|
992
936
|
forward1
|
993
937
|
ch = peek0
|
994
938
|
if PLUS_MIN =~ ch.chr
|
@@ -996,50 +940,44 @@ module RbYAML
|
|
996
940
|
forward1
|
997
941
|
end
|
998
942
|
end
|
999
|
-
raise ScannerError.new("while scanning a block scalar",
|
943
|
+
raise ScannerError.new("while scanning a block scalar","expected chomping or indentation indicators, but found #{peek0}") if !NULL_BL_LINEBR.include?(peek0)
|
1000
944
|
[chomping, increment]
|
1001
945
|
end
|
1002
946
|
|
1003
|
-
def scan_block_scalar_ignored_line
|
947
|
+
def scan_block_scalar_ignored_line
|
1004
948
|
# See the specification for details.
|
1005
949
|
forward1 while peek0 == 32
|
1006
950
|
if peek0 == ?#
|
1007
951
|
forward1 while !NULL_OR_LINEBR.include?(peek0)
|
1008
952
|
end
|
1009
|
-
raise ScannerError.new("while scanning a block scalar",
|
953
|
+
raise ScannerError.new("while scanning a block scalar","expected a comment or a line break, but found #{peek0}") if !NULL_OR_LINEBR.include?(peek0)
|
1010
954
|
scan_line_break
|
1011
955
|
end
|
1012
956
|
|
1013
|
-
BLANK_OR_LINEBR = " \r\n\x85"
|
1014
957
|
def scan_block_scalar_indentation
|
1015
958
|
# See the specification for details.
|
1016
959
|
chunks = []
|
1017
960
|
max_indent = 0
|
1018
|
-
end_mark = get_mark
|
1019
961
|
while BLANK_OR_LINEBR.include?(peek0)
|
1020
962
|
if peek0 != 32
|
1021
963
|
chunks << scan_line_break
|
1022
|
-
end_mark = get_mark
|
1023
964
|
else
|
1024
965
|
forward1
|
1025
966
|
max_indent = column if column > max_indent
|
1026
967
|
end
|
1027
968
|
end
|
1028
|
-
[chunks, max_indent
|
969
|
+
[chunks, max_indent]
|
1029
970
|
end
|
1030
971
|
|
1031
|
-
FULL_LINEBR = "\r\n\x85"
|
1032
972
|
def scan_block_scalar_breaks(indent)
|
1033
973
|
# See the specification for details.
|
1034
974
|
chunks = []
|
1035
|
-
end_mark = get_mark
|
1036
975
|
forward1 while @column < indent && peek0 == 32
|
1037
976
|
while FULL_LINEBR.include?(peek0)
|
1038
977
|
chunks << scan_line_break
|
1039
|
-
end_mark = get_mark
|
1040
978
|
forward1 while @column < indent && peek0 == 32
|
1041
979
|
end
|
1042
|
-
|
980
|
+
chunks
|
1043
981
|
end
|
1044
982
|
|
1045
983
|
def scan_flow_scalar(style)
|
@@ -1051,45 +989,18 @@ module RbYAML
|
|
1051
989
|
# that document separators are not included in scalars.
|
1052
990
|
double = style == ?"
|
1053
991
|
chunks = []
|
1054
|
-
start_mark = get_mark
|
1055
992
|
quote = peek0
|
1056
993
|
forward1
|
1057
|
-
chunks += scan_flow_scalar_non_spaces(double
|
994
|
+
chunks += scan_flow_scalar_non_spaces(double)
|
1058
995
|
while peek0 != quote
|
1059
|
-
chunks += scan_flow_scalar_spaces(double
|
1060
|
-
chunks += scan_flow_scalar_non_spaces(double
|
996
|
+
chunks += scan_flow_scalar_spaces(double)
|
997
|
+
chunks += scan_flow_scalar_non_spaces(double)
|
1061
998
|
end
|
1062
999
|
forward1
|
1063
|
-
|
1064
|
-
ScalarToken.new(chunks.to_s, false, start_mark, end_mark,style)
|
1000
|
+
ScalarToken.new(chunks.to_s, false, style)
|
1065
1001
|
end
|
1066
1002
|
|
1067
|
-
|
1068
|
-
"0" => "\0",
|
1069
|
-
"a" => "\x07",
|
1070
|
-
"b" => "\x08",
|
1071
|
-
"t" => "\x09",
|
1072
|
-
"\t" => "\x09",
|
1073
|
-
"n" => "\x0A",
|
1074
|
-
"v" => "\x0B",
|
1075
|
-
"f" => "\x0C",
|
1076
|
-
"r" => "\x0D",
|
1077
|
-
"e" => "\x1B",
|
1078
|
-
" " => "\x20",
|
1079
|
-
'"' => '"',
|
1080
|
-
"\\" => "\\",
|
1081
|
-
"N" => "\x85",
|
1082
|
-
"_" => "\xA0"
|
1083
|
-
}
|
1084
|
-
|
1085
|
-
ESCAPE_CODES = {
|
1086
|
-
'x' => 2
|
1087
|
-
}
|
1088
|
-
|
1089
|
-
SPACES_AND_STUFF = "'\"\\\0 \t\r\n\x85"
|
1090
|
-
DOUBLE_ESC = "\"\\"
|
1091
|
-
NOT_HEXA = /[^0-9A-Fa-f]/
|
1092
|
-
def scan_flow_scalar_non_spaces(double, start_mark)
|
1003
|
+
def scan_flow_scalar_non_spaces(double)
|
1093
1004
|
# See the specification for details.
|
1094
1005
|
chunks = []
|
1095
1006
|
while true
|
@@ -1109,24 +1020,23 @@ module RbYAML
|
|
1109
1020
|
elsif double && ch == ?\\
|
1110
1021
|
forward1
|
1111
1022
|
ch = peek0
|
1112
|
-
if
|
1113
|
-
chunks <<
|
1023
|
+
if UNESCAPES.member?(ch.chr)
|
1024
|
+
chunks << UNESCAPES[ch.chr]
|
1114
1025
|
forward1
|
1115
1026
|
elsif ESCAPE_CODES.member?(ch.chr)
|
1116
1027
|
length = ESCAPE_CODES[ch.chr]
|
1117
1028
|
forward1
|
1118
1029
|
if NOT_HEXA =~ prefix(length)
|
1119
|
-
raise ScannerError.new("while scanning a double-quoted scalar",
|
1120
|
-
"expected escape sequence of #{length} hexdecimal numbers, but found something else: #{prefix(length)}}",get_mark)
|
1030
|
+
raise ScannerError.new("while scanning a double-quoted scalar","expected escape sequence of #{length} hexdecimal numbers, but found something else: #{prefix(length)}}")
|
1121
1031
|
end
|
1122
|
-
code = prefix(length).to_i
|
1032
|
+
code = prefix(length).to_i(16).to_s
|
1123
1033
|
chunks << code
|
1124
1034
|
forward(length)
|
1125
1035
|
elsif FULL_LINEBR.include?(ch)
|
1126
1036
|
scan_line_break
|
1127
|
-
chunks += scan_flow_scalar_breaks(double
|
1037
|
+
chunks += scan_flow_scalar_breaks(double)
|
1128
1038
|
else
|
1129
|
-
raise ScannerError.new("while scanning a double-quoted scalar",
|
1039
|
+
raise ScannerError.new("while scanning a double-quoted scalar","found unknown escape character #{ch}")
|
1130
1040
|
end
|
1131
1041
|
else
|
1132
1042
|
return chunks
|
@@ -1134,7 +1044,7 @@ module RbYAML
|
|
1134
1044
|
end
|
1135
1045
|
end
|
1136
1046
|
|
1137
|
-
def scan_flow_scalar_spaces(double
|
1047
|
+
def scan_flow_scalar_spaces(double)
|
1138
1048
|
# See the specification for details.
|
1139
1049
|
chunks = []
|
1140
1050
|
length = 0
|
@@ -1143,11 +1053,11 @@ module RbYAML
|
|
1143
1053
|
forward(length)
|
1144
1054
|
ch = peek0
|
1145
1055
|
if ch == ?\0
|
1146
|
-
raise ScannerError.new("while scanning a quoted scalar",
|
1056
|
+
raise ScannerError.new("while scanning a quoted scalar","found unexpected end of stream")
|
1147
1057
|
elsif FULL_LINEBR.include?(ch)
|
1148
1058
|
line_break = scan_line_break
|
1149
|
-
breaks = scan_flow_scalar_breaks(double
|
1150
|
-
if line_break !=
|
1059
|
+
breaks = scan_flow_scalar_breaks(double)
|
1060
|
+
if line_break != "\n"
|
1151
1061
|
chunks << line_break
|
1152
1062
|
elsif breaks.empty?
|
1153
1063
|
chunks << ' '
|
@@ -1159,7 +1069,7 @@ module RbYAML
|
|
1159
1069
|
chunks
|
1160
1070
|
end
|
1161
1071
|
|
1162
|
-
def scan_flow_scalar_breaks(double
|
1072
|
+
def scan_flow_scalar_breaks(double)
|
1163
1073
|
# See the specification for details.
|
1164
1074
|
chunks = []
|
1165
1075
|
while true
|
@@ -1167,7 +1077,7 @@ module RbYAML
|
|
1167
1077
|
# separators.
|
1168
1078
|
prefix = prefix(3)
|
1169
1079
|
if (prefix == "---" || prefix == "...") &&NULL_BL_T_LINEBR.include?(peek3)
|
1170
|
-
raise ScannerError.new("while scanning a quoted scalar",
|
1080
|
+
raise ScannerError.new("while scanning a quoted scalar","found unexpected document separator")
|
1171
1081
|
end
|
1172
1082
|
forward1 while BLANK_T.include?(peek0)
|
1173
1083
|
if FULL_LINEBR.include?(peek0)
|
@@ -1178,11 +1088,6 @@ module RbYAML
|
|
1178
1088
|
end
|
1179
1089
|
end
|
1180
1090
|
|
1181
|
-
|
1182
|
-
R_flowzero = /[\0 \t\r\n\x85]|(:[\0 \t\r\n\x28])/
|
1183
|
-
R_flownonzero = /[\0 \t\r\n\x85\[\]{},:?]/
|
1184
|
-
S4 = "\0 \t\r\n\x28[]{}"
|
1185
|
-
|
1186
1091
|
def scan_plain
|
1187
1092
|
# See the specification for details.
|
1188
1093
|
# We add an additional restriction for the flow context:
|
@@ -1190,7 +1095,6 @@ module RbYAML
|
|
1190
1095
|
# We also keep track of the `allow_simple_key` flag here.
|
1191
1096
|
# Indentation rules are loosed for the flow context.
|
1192
1097
|
chunks = []
|
1193
|
-
end_mark = start_mark = get_mark
|
1194
1098
|
indent = @indent+1
|
1195
1099
|
# We allow zero indentation for scalars, but then we need to check for
|
1196
1100
|
# document separators at the beginning of the line.
|
@@ -1210,22 +1114,20 @@ module RbYAML
|
|
1210
1114
|
ch = peek(length)
|
1211
1115
|
if f_nzero && ch == ?: && !S4.include?(peek(length+1))
|
1212
1116
|
forward(length)
|
1213
|
-
raise ScannerError.new("while scanning a plain scalar",
|
1117
|
+
raise ScannerError.new("while scanning a plain scalar","found unexpected ':'","Please check http://pyyaml.org/wiki/YAMLColonInFlowContext for details.")
|
1214
1118
|
end
|
1215
1119
|
break if length == 0
|
1216
1120
|
@allow_simple_key = false
|
1217
1121
|
chunks += spaces
|
1218
1122
|
chunks << prefix(length)
|
1219
1123
|
forward(length)
|
1220
|
-
|
1221
|
-
spaces = scan_plain_spaces(indent, start_mark)
|
1124
|
+
spaces = scan_plain_spaces(indent)
|
1222
1125
|
break if !spaces || (@flow_zero && @column < indent)
|
1223
1126
|
end
|
1224
|
-
return ScalarToken.new(chunks.to_s, true
|
1127
|
+
return ScalarToken.new(chunks.to_s, true)
|
1225
1128
|
end
|
1226
1129
|
|
1227
|
-
|
1228
|
-
def scan_plain_spaces(indent, start_mark)
|
1130
|
+
def scan_plain_spaces(indent)
|
1229
1131
|
# See the specification for details.
|
1230
1132
|
# The specification is really confusing about tabs in plain scalars.
|
1231
1133
|
# We just forbid them completely. Do not use tabs in YAML!
|
@@ -1248,10 +1150,10 @@ module RbYAML
|
|
1248
1150
|
return if END_OR_START =~ prefix(4)
|
1249
1151
|
end
|
1250
1152
|
end
|
1251
|
-
if line_break !=
|
1153
|
+
if line_break != "\n"
|
1252
1154
|
chunks << line_break
|
1253
|
-
elsif breaks.empty?
|
1254
|
-
chunks <<
|
1155
|
+
elsif breaks.nil? || breaks.empty?
|
1156
|
+
chunks << " "
|
1255
1157
|
end
|
1256
1158
|
chunks += breaks
|
1257
1159
|
else
|
@@ -1261,12 +1163,12 @@ module RbYAML
|
|
1261
1163
|
end
|
1262
1164
|
|
1263
1165
|
|
1264
|
-
def scan_tag_handle(name
|
1166
|
+
def scan_tag_handle(name)
|
1265
1167
|
# See the specification for details.
|
1266
1168
|
# For some strange reasons, the specification does not allow '_' in
|
1267
1169
|
# tag handles. I have allowed it anyway.
|
1268
1170
|
ch = peek0
|
1269
|
-
raise ScannerError.new("while scanning a #{name}",
|
1171
|
+
raise ScannerError.new("while scanning a #{name}","expected '!', but found #{ch}") if ch != ?!
|
1270
1172
|
length = 1
|
1271
1173
|
ch = peek(length)
|
1272
1174
|
if ch != 32
|
@@ -1276,7 +1178,7 @@ module RbYAML
|
|
1276
1178
|
end
|
1277
1179
|
if ch != ?!
|
1278
1180
|
forward(length)
|
1279
|
-
raise ScannerError.new("while scanning a #{name}",
|
1181
|
+
raise ScannerError.new("while scanning a #{name}","expected '!', but found #{ch}")
|
1280
1182
|
end
|
1281
1183
|
length += 1
|
1282
1184
|
end
|
@@ -1285,8 +1187,7 @@ module RbYAML
|
|
1285
1187
|
value
|
1286
1188
|
end
|
1287
1189
|
|
1288
|
-
|
1289
|
-
def scan_tag_uri(name, start_mark)
|
1190
|
+
def scan_tag_uri(name)
|
1290
1191
|
# See the specification for details.
|
1291
1192
|
# Note: we do not check if URI is well-formed.
|
1292
1193
|
chunks = []
|
@@ -1297,7 +1198,7 @@ module RbYAML
|
|
1297
1198
|
chunks << prefix(length)
|
1298
1199
|
forward(length)
|
1299
1200
|
length = 0
|
1300
|
-
chunks << scan_uri_escapes(name
|
1201
|
+
chunks << scan_uri_escapes(name)
|
1301
1202
|
else
|
1302
1203
|
length += 1
|
1303
1204
|
end
|
@@ -1306,22 +1207,19 @@ module RbYAML
|
|
1306
1207
|
if length!=0
|
1307
1208
|
chunks << prefix(length)
|
1308
1209
|
forward(length)
|
1309
|
-
length = 0
|
1310
1210
|
end
|
1311
1211
|
|
1312
|
-
raise ScannerError.new("while parsing a #{name}",
|
1212
|
+
raise ScannerError.new("while parsing a #{name}","expected URI, but found #{ch}") if chunks.empty?
|
1313
1213
|
chunks.to_s
|
1314
1214
|
end
|
1315
1215
|
|
1316
|
-
|
1317
|
-
def scan_uri_escapes(name, start_mark)
|
1216
|
+
def scan_uri_escapes(name)
|
1318
1217
|
# See the specification for details.
|
1319
1218
|
bytes = []
|
1320
|
-
mark = get_mark
|
1321
1219
|
while peek0 == ?%
|
1322
1220
|
forward1
|
1323
|
-
raise ScannerError.new("while scanning a #{name}",
|
1324
|
-
bytes << prefix(2).to_i
|
1221
|
+
raise ScannerError.new("while scanning a #{name}","expected URI escape sequence of 2 hexdecimal numbers, but found #{peek1} and #{peek2}") if HEXA_REG !~ peek1.chr || HEXA_REG !~ peek2.chr
|
1222
|
+
bytes << prefix(2).to_i(16).to_s
|
1325
1223
|
forward2
|
1326
1224
|
end
|
1327
1225
|
bytes.to_s
|