RbYAML 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|