Class: UIC::Asset

Inherits:
Object
  • Object
show all
Defined in:
lib/ruic/assets.rb

Defined Under Namespace

Classes: Root

Constant Summary collapse

HIER =
{}

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(xml) ⇒ Asset

Returns a new instance of Asset.



142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
# File 'lib/ruic/assets.rb', line 142

def initialize(xml)
	@by_name = {'Root'=>Root}

	doc = Nokogiri.XML(xml)
	hack_in_slide_names!(doc)

	HIER.each do |class_name,parent_class_name|
		parent_class = @by_name[parent_class_name]
		el = doc.root.at(class_name)
		@by_name[class_name] = create_class(el,parent_class,el.name)
		UIC::Asset.const_set( el.name, @by_name[class_name] ) # give the class instance a name by pointing a constant to it :/
	end

	# Extend well-known classes with script interfaces after they are created
	@by_name['State'] = @by_name['Slide']
	@by_name['Slide'].instance_eval do
		attr_accessor :index, :name
		define_method :inspect do
			"<slide ##{index} of #{@el['component'] || @el.parent['component']}>"
		end
		define_method(:slide?){ true }
	end

	refmat = @by_name['ReferencedMaterial']
	@by_name['MaterialBase'].instance_eval do
		define_method :replace_with_referenced_material do
			type=='ReferencedMaterial' ? self : presentation.replace_asset( self, 'ReferencedMaterial', name:name )
		end
	end
end

Instance Attribute Details

#by_nameObject (readonly)

Returns the value of attribute by_name.



134
135
136
# File 'lib/ruic/assets.rb', line 134

def by_name
  @by_name
end

Instance Method Details

#create_class(el, parent_class, name = 'CustomAsset') ⇒ Object

Creates a class from MetaData.xml with accessors for the <Property> listed. Instances of the class are associated with a presentation and know how to get/set values in that XML based on value types, slides, defaults. Also used to create classes from effects, materials, and behavior preambles.



177
178
179
180
181
182
183
184
185
186
187
# File 'lib/ruic/assets.rb', line 177

def create_class(el,parent_class,name='CustomAsset')
	Class.new(parent_class) do
		@name = name
		@properties = Hash[ el.css("Property").map do |e|
			type = e['type'] || (e['list'] ? 'String' : 'Float')
			type = "Float" if type=="float"
			property = UIC::Property.const_get(type).new(e)
			[ property.name, UIC::Property.const_get(type).new(e) ]
		end ]
	end
end

#hack_in_slide_names!(doc) ⇒ Object



193
194
195
# File 'lib/ruic/assets.rb', line 193

def hack_in_slide_names!(doc)
	doc.at('Slide') << '<Property name="name" formalName="Name" type="String" default="Slide" hidden="True" />'
end

#new_instance(presentation, el) ⇒ Object



189
190
191
# File 'lib/ruic/assets.rb', line 189

def new_instance(presentation,el)
	@by_name[el.name].new(presentation,el)
end