8 class RepresenterError < YAMLError
12 def initialize(serializer, opts={})
13 @serializer = serializer
14 @default_style = opts[:UseDouble] ? '"' : (opts[:UseSingle] ? "'" : nil)
15 @represented_objects = {}
19 node = represent_data(data)
20 @serializer.serialize(node)
21 represented_objects = {}
24 def represent_data(data)
25 if ignore_aliases(data)
28 alias_key = data.object_id
32 if @represented_objects.include?(alias_key)
33 node = @represented_objects[alias_key]
34 raise RepresenterError.new("recursive objects are not allowed: #{data}") if node.nil?
37 @represented_objects[alias_key] = nil
39 node = data.to_yaml_node(self)
40 @represented_objects[alias_key] = node if !alias_key.nil?
44 def scalar(tag, value, style=nil)
45 represent_scalar(tag,value,style)
48 def represent_scalar(tag, value, style=nil)
49 style ||= @default_style
50 ScalarNode.new(tag,value,style)
53 def seq(tag, sequence, flow_style=nil)
54 represent_sequence(tag,sequence,flow_style)
57 def represent_sequence(tag, sequence, flow_style=nil)
59 value = sequence.map {|item|
60 node_item = represent_data(item)
61 best_style = false if !node_item.__is_scalar && !node_item.flow_style
64 flow_style ||= (@flow_default_style || best_style)
65 SequenceNode.new(tag, value, flow_style)
69 mapping, flow_style = case args.length
72 def mapping.add(key, value) self[key] = value end
79 "wrong number of arguments (#{args.length})"
82 represent_mapping(tag,mapping,flow_style)
85 def represent_mapping(tag, mapping, flow_style=nil)
87 if mapping.respond_to?(:keys)
89 for item_key,item_value in mapping
90 node_key = represent_data(item_key)
91 node_value = represent_data(item_value)
92 best_style = false if !node_key.__is_scalar && !node_key.flow_style
93 best_style = false if !node_value.__is_scalar && !node_value.flow_style
94 value[node_key] = node_value
98 for item_key, item_value in mapping
99 node_key = represent_data(item_key)
100 node_value = represent_data(item_value)
101 best_style = false if !node_key.__is_scalar && !node_key.flow_style
102 best_style = false if !node_value.__is_scalar && !node_value.flow_style
103 value << [node_key, node_value]
106 flow_style ||= (@flow_default_style || best_style)
107 MappingNode.new(tag, value, flow_style)
110 def ignore_aliases(data)
115 class SafeRepresenter < BaseRepresenter
116 def ignore_aliases(data)
117 data.nil? || data.__is_str || TrueClass === data || FalseClass === data || data.__is_int || Float === data
121 class Representer < SafeRepresenter