diff options
author | Aaron Patterson <aaron.patterson@gmail.com> | 2009-09-28 20:53:06 -0700 |
---|---|---|
committer | Aaron Patterson <aaron.patterson@gmail.com> | 2009-09-28 20:53:06 -0700 |
commit | 780b789a2fb985ac8ae24eab21eb939293524542 (patch) | |
tree | 4eb755e1731e8773edf521fd3f5175aff15048a1 | |
parent | b8e82a04568ec154154af68614f077d7a754bf8a (diff) | |
download | psych-780b789a2fb985ac8ae24eab21eb939293524542.zip |
adding emitter codes
-rw-r--r-- | ext/psych/emitter.c | 59 | ||||
-rw-r--r-- | lib/psych/visitors/emitter.rb | 6 | ||||
-rw-r--r-- | test/visitors/test_emitter.rb | 26 |
3 files changed, 91 insertions, 0 deletions
diff --git a/ext/psych/emitter.c b/ext/psych/emitter.c index c48a8b5..1199a31 100644 --- a/ext/psych/emitter.c +++ b/ext/psych/emitter.c @@ -40,6 +40,62 @@ static VALUE start_stream(VALUE self, VALUE encoding) yaml_event_t event; yaml_stream_start_event_initialize(&event, NUM2INT(encoding)); + yaml_emitter_emit(emitter, &event); + return self; +} + +static VALUE end_stream(VALUE self) +{ + yaml_emitter_t * emitter; + Data_Get_Struct(self, yaml_emitter_t, emitter); + + yaml_event_t event; + yaml_stream_end_event_initialize(&event); + yaml_emitter_emit(emitter, &event); + return self; +} + +static VALUE start_document(VALUE self, VALUE version, VALUE tags, VALUE imp) +{ + yaml_emitter_t * emitter; + Data_Get_Struct(self, yaml_emitter_t, emitter); + + yaml_version_directive_t version_directive; + + if(RARRAY_LEN(version) > 0) { + VALUE major = rb_ary_entry(version, 0); + VALUE minor = rb_ary_entry(version, 1); + + version_directive.major = NUM2INT(major); + version_directive.minor = NUM2INT(minor); + } + + yaml_event_t event; + yaml_document_start_event_initialize( + &event, + &version_directive, + NULL, + NULL, + imp == Qtrue ? 1 : 0 + ); + + yaml_emitter_emit(emitter, &event); + + return self; +} + +static VALUE end_document(VALUE self, VALUE imp) +{ + yaml_emitter_t * emitter; + Data_Get_Struct(self, yaml_emitter_t, emitter); + + yaml_version_directive_t version_directive; + + yaml_event_t event; + yaml_document_end_event_initialize(&event, imp == Qtrue ? 1 : 0); + + yaml_emitter_emit(emitter, &event); + return self; } @@ -53,4 +109,7 @@ void Init_psych_emitter() rb_define_method(cPsychEmitter, "initialize", initialize, 1); rb_define_method(cPsychEmitter, "start_stream", start_stream, 1); + rb_define_method(cPsychEmitter, "end_stream", end_stream, 0); + rb_define_method(cPsychEmitter, "start_document", start_document, 3); + rb_define_method(cPsychEmitter, "end_document", end_document, 1); } diff --git a/lib/psych/visitors/emitter.rb b/lib/psych/visitors/emitter.rb index ff3832b..d71ce2a 100644 --- a/lib/psych/visitors/emitter.rb +++ b/lib/psych/visitors/emitter.rb @@ -10,6 +10,12 @@ module Psych o.children.each { |c| c.accept self } @handler.end_stream end + + visitor_for(Nodes::Document) do |o| + @handler.start_document o.version, o.tag_directives, o.implicit + o.children.each { |c| c.accept self } + @handler.end_document o.implicit + end end end end diff --git a/test/visitors/test_emitter.rb b/test/visitors/test_emitter.rb new file mode 100644 index 0000000..a6b8f25 --- /dev/null +++ b/test/visitors/test_emitter.rb @@ -0,0 +1,26 @@ +require 'minitest/autorun' +require 'psych' + +module Psych + module Visitors + class TestEmitter < MiniTest::Unit::TestCase + def setup + @io = StringIO.new + @visitor = Visitors::Emitter.new @io + end + + def test_stream + s = Nodes::Stream.new + @visitor.accept s + assert_equal '', @io.string + end + + def test_document + s = Nodes::Stream.new + s.children << Nodes::Document.new([1,1]) + @visitor.accept s + assert_equal '', @io.string + end + end + end +end |