diff --git a/lib/avm/image.rb b/lib/avm/image.rb
index 5065a52..dc2e45b 100644
--- a/lib/avm/image.rb
+++ b/lib/avm/image.rb
@@ -15,6 +15,24 @@ module AVM
creator.add_to_document(document)
+ document.get_refs do |refs|
+ [ :title, :description ].each do |field|
+ refs[:dublin_core].add_child(%{#{alt_li_tag(send(field))}})
+ end
+
+ refs[:photoshop].add_child(%{#{headline}})
+
+ {
+ 'Distance.Notes' => distance_notes,
+ 'ReferenceURL' => reference_url,
+ 'Credit' => credit,
+ 'Date' => string_date,
+ 'ID' => id,
+ }.each do |tag, value|
+ refs[:avm].add_child(%{#{value}}) if value
+ end
+ end
+
document.doc
end
@@ -27,7 +45,12 @@ module AVM
end
def date
- Time.parse(@options[:date])
+ (Time.parse(@options[:date]) rescue nil)
+ end
+
+ def string_date
+ return nil if !date
+ date.strftime('%Y-%m-%d')
end
def distance
@@ -45,6 +68,11 @@ module AVM
def method_missing(method)
@options[method]
end
+
+ private
+ def alt_li_tag(text)
+ %{#{text}}
+ end
end
end
diff --git a/lib/avm/xmp.rb b/lib/avm/xmp.rb
index 6ce82e9..cc1ed09 100644
--- a/lib/avm/xmp.rb
+++ b/lib/avm/xmp.rb
@@ -2,6 +2,12 @@ require 'nokogiri'
module AVM
class XMP
+ PREFIXES = {
+ 'dc' => 'Dublin Core',
+ 'Iptc4xmpCore' => 'IPTC',
+ 'Photoshop' => 'Photoshop'
+ }
+
attr_reader :doc
def initialize(doc = nil)
@@ -11,7 +17,7 @@ module AVM
end
def get_refs
- yield Hash[[ :dublin_core, :iptc ].collect { |key| [ key, send(key) ] }]
+ yield Hash[[ :dublin_core, :iptc, :photoshop, :avm ].collect { |key| [ key, send(key) ] }]
end
def self.from_string(string)
@@ -36,12 +42,7 @@ module AVM
doc.search('//rdf:Description').each do |description|
if first_child = description.first_element_child
if first_child.namespace
- case first_child.namespace.prefix
- when 'dc'
- description['about'] = 'Dublin Core'
- when 'Iptc4xmpCore'
- description['about'] = 'IPTC'
- end
+ description['about'] = PREFIXES[first_child.namespace.prefix]
end
end
end
@@ -55,6 +56,14 @@ module AVM
at_rdf_description "IPTC"
end
+ def avm
+ at_rdf_description "AVM"
+ end
+
+ def photoshop
+ at_rdf_description "Photoshop"
+ end
+
def at_rdf_description(about)
@doc.at_xpath(%{//rdf:Description[@about="#{about}"]})
end
@@ -63,12 +72,10 @@ module AVM
Nokogiri::XML(<<-XML)
-
-
-
-
-
-
+
+
+
+
XML
diff --git a/spec/avm/image_spec.rb b/spec/avm/image_spec.rb
index acda524..905cc42 100644
--- a/spec/avm/image_spec.rb
+++ b/spec/avm/image_spec.rb
@@ -7,9 +7,20 @@ describe AVM::Image do
subject { image }
- describe '#initialize' do
- it { should be_a_kind_of(AVM::Image) }
+ let(:title) { 'My title' }
+ let(:headline) { 'Headline' }
+ let(:description) { 'Description' }
+ let(:distance_notes) { 'Distance Notes' }
+ let(:reference_url) { 'Reference URL' }
+ let(:credit) { 'Credit' }
+ let(:date) { '2010-01-01' }
+ let(:id) { 'ID' }
+ let(:type) { 'Obvservation' }
+ let(:image_quality) { 'Good' }
+ let(:redshift) { 'Redshift' }
+ let(:light_years) { 'Light years' }
+ def self.with_all_options
let(:options) { {
:title => title,
:headline => headline,
@@ -24,19 +35,12 @@ describe AVM::Image do
:redshift => redshift,
:light_years => light_years
} }
+ end
- let(:title) { 'My title' }
- let(:headline) { 'Headline' }
- let(:description) { 'Description' }
- let(:distance_notes) { 'Distance Notes' }
- let(:reference_url) { 'Reference URL' }
- let(:credit) { 'Credit' }
- let(:date) { '2010-01-01' }
- let(:id) { 'ID' }
- let(:type) { 'Obvservation' }
- let(:image_quality) { 'Good' }
- let(:redshift) { 'Redshift' }
- let(:light_years) { 'Light years' }
+ describe '#initialize' do
+ with_all_options
+
+ it { should be_a_kind_of(AVM::Image) }
its(:creator) { should be_a_kind_of(AVM::Creator) }
its(:title) { should == title }
@@ -58,9 +62,50 @@ describe AVM::Image do
describe '#to_xml' do
let(:xml) { image.to_xml }
+ let(:dublin_core) { xml.at_xpath('//rdf:Description[@about="Dublin Core"]') }
+ let(:photoshop) { xml.at_xpath('//rdf:Description[@about="Photoshop"]') }
+ let(:avm) { xml.at_xpath('//rdf:Description[@about="AVM"]') }
+
context 'nothing in it' do
- subject { xml.at_xpath('//rdf:RDF').should_not be_nil }
- subject { xml.search('//rdf:RDF/rdf:Description').should be_empty }
+ it "should have basic tags" do
+ xml.at_xpath('//rdf:RDF').should_not be_nil
+ xml.search('//rdf:RDF/rdf:Description').should_not be_empty
+ avm.at_xpath('./avm:Date').should be_nil
+ end
+ end
+
+ context 'with basics' do
+ with_all_options
+
+ it "should have the image info tags" do
+ dublin_core.at_xpath('./dc:title/rdf:Alt/rdf:li').text.should == title
+ photoshop.at_xpath('./photoshop:Headline').text.should == headline
+ dublin_core.at_xpath('./dc:description/rdf:Alt/rdf:li').text.should == description
+
+ avm.at_xpath('./avm:Distance.Notes').text.should == distance_notes
+ avm.at_xpath('./avm:ReferenceURL').text.should == reference_url
+ avm.at_xpath('./avm:Credit').text.should == credit
+ avm.at_xpath('./avm:Date').text.should == date
+ avm.at_xpath('./avm:ID').text.should == id
+ end
+
+ context "distance" do
+ context "no distances" do
+
+ end
+
+ context "redshift only" do
+
+ end
+
+ context "light years only" do
+
+ end
+
+ context "redshift and light years" do
+
+ end
+ end
end
end
end
diff --git a/spec/avm/xmp_spec.rb b/spec/avm/xmp_spec.rb
index 9ddcb56..b0834e0 100644
--- a/spec/avm/xmp_spec.rb
+++ b/spec/avm/xmp_spec.rb
@@ -11,11 +11,14 @@ describe AVM::XMP do
xmp.get_refs do |refs|
refs[:dublin_core] << ""
refs[:iptc] << ""
+ refs[:photoshop] << ''
end
}
- specify { xmp.doc.at_xpath('//rdf:Description[@about="Dublin Core"]//rdf:addedToDublinCore').should_not be_nil }
- specify { xmp.doc.at_xpath('//rdf:Description[@about="IPTC"]//rdf:addedToIPTC').should_not be_nil }
+ it "should have gotten the refs correctly" do
+ xmp.doc.at_xpath('//rdf:Description[@about="Dublin Core"]//rdf:addedToDublinCore').should_not be_nil
+ xmp.doc.at_xpath('//rdf:Description[@about="IPTC"]//rdf:addedToIPTC').should_not be_nil
+ end
end
describe '.from_string' do