Class: UIC::MetaData

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

Defined Under Namespace

Classes: AssetBase

Constant Summary collapse

HIER =
{}

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(xml) ⇒ MetaData

Returns a new instance of MetaData.



272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
# File 'lib/ruic/assets.rb', line 272

def initialize(xml)

	@by_name = {'AssetBase'=>AssetBase}

	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)
	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

	@by_name['Path'].instance_eval do
		define_method(:anchors){ find _type:'PathAnchorPoint' }
	end

end

Instance Attribute Details

#by_nameObject (readonly)

Returns the value of attribute by_name.



263
264
265
# File 'lib/ruic/assets.rb', line 263

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 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.



312
313
314
315
316
317
318
319
320
321
322
323
324
325
# File 'lib/ruic/assets.rb', line 312

def create_class(el,parent_class,name='CustomAsset')
	Class.new(parent_class) do
		@name = name.to_s
		@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 ]
		def self.inspect
			@name
		end
	end
end

#hack_in_slide_names!(doc) ⇒ Object



332
333
334
# File 'lib/ruic/assets.rb', line 332

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



327
328
329
330
# File 'lib/ruic/assets.rb', line 327

def new_instance(presentation,el)
	klass = @by_name[el.name] || create_class(el,@by_name['Asset'],el.name)
	klass.new(presentation,el)
end