mead 0.0.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/.document ADDED
@@ -0,0 +1,5 @@
1
+ README.rdoc
2
+ lib/**/*.rb
3
+ bin/*
4
+ features/**/*.feature
5
+ LICENSE
data/Gemfile ADDED
@@ -0,0 +1,27 @@
1
+ source "http://rubygems.org"
2
+ # Add dependencies required to use your gem here.
3
+ # Example:
4
+ # gem "activesupport", ">= 2.3.5"
5
+
6
+ gem "rmagick", ">= 0"
7
+ gem "nokogiri", "= 1.4.3.1"
8
+ gem "json", ">= 0"
9
+ gem "trollop", ">= 0"
10
+
11
+ gem "fastercsv", ">= 0", :platforms => :ruby_18
12
+
13
+ gem "gbarcode", ">= 0.98.20", :platforms => :ruby_18
14
+
15
+
16
+ # Add dependencies to develop your gem here.
17
+ # Include everything needed to run rake, tests, features, etc.
18
+ group :development do
19
+ gem "shoulda", ">= 0"
20
+ gem "bundler", "~> 1.0.0"
21
+ gem "jeweler", "~> 1.5.1"
22
+ gem "rcov", ">= 0"
23
+ gem "reek", "~> 1.2.8"
24
+ gem "roodi", "~> 2.1.0"
25
+ gem "fakeweb", ">= 0"
26
+ gem "ruby-debug"
27
+ end
data/Gemfile.lock ADDED
@@ -0,0 +1,56 @@
1
+ GEM
2
+ remote: http://rubygems.org/
3
+ specs:
4
+ columnize (0.3.2)
5
+ fakeweb (1.3.0)
6
+ fastercsv (1.5.4)
7
+ gbarcode (0.98.20)
8
+ git (1.2.5)
9
+ jeweler (1.5.2)
10
+ bundler (~> 1.0.0)
11
+ git (>= 1.2.5)
12
+ rake
13
+ json (1.5.0)
14
+ linecache (0.43)
15
+ nokogiri (1.4.3.1)
16
+ rake (0.8.7)
17
+ rcov (0.9.9)
18
+ reek (1.2.8)
19
+ ruby2ruby (~> 1.2)
20
+ ruby_parser (~> 2.0)
21
+ sexp_processor (~> 3.0)
22
+ rmagick (2.13.1)
23
+ roodi (2.1.0)
24
+ ruby_parser
25
+ ruby-debug (0.10.4)
26
+ columnize (>= 0.1)
27
+ ruby-debug-base (~> 0.10.4.0)
28
+ ruby-debug-base (0.10.4)
29
+ linecache (>= 0.3)
30
+ ruby2ruby (1.2.5)
31
+ ruby_parser (~> 2.0)
32
+ sexp_processor (~> 3.0)
33
+ ruby_parser (2.0.5)
34
+ sexp_processor (~> 3.0)
35
+ sexp_processor (3.0.5)
36
+ shoulda (2.11.3)
37
+ trollop (1.16.2)
38
+
39
+ PLATFORMS
40
+ ruby
41
+
42
+ DEPENDENCIES
43
+ bundler (~> 1.0.0)
44
+ fakeweb
45
+ fastercsv
46
+ gbarcode (>= 0.98.20)
47
+ jeweler (~> 1.5.1)
48
+ json
49
+ nokogiri (= 1.4.3.1)
50
+ rcov
51
+ reek (~> 1.2.8)
52
+ rmagick
53
+ roodi (~> 2.1.0)
54
+ ruby-debug
55
+ shoulda
56
+ trollop
data/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2009 North Carolina State University
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining
4
+ a copy of this software and associated documentation files (the
5
+ "Software"), to deal in the Software without restriction, including
6
+ without limitation the rights to use, copy, modify, merge, publish,
7
+ distribute, sublicense, and/or sell copies of the Software, and to
8
+ permit persons to whom the Software is furnished to do so, subject to
9
+ the following conditions:
10
+
11
+ The above copyright notice and this permission notice shall be
12
+ included in all copies or substantial portions of the Software.
13
+
14
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.rdoc ADDED
@@ -0,0 +1,86 @@
1
+ = mead
2
+
3
+ Metadata from Encoded Archival Description.
4
+
5
+ The core of this code is an identifier which expresses the location of an object
6
+ in a physical collection. This identifier can be used as a filename for
7
+ digitized objects during scanning. Later descriptive metadata from EAD XML can
8
+ be extracted. This descriptive metadata can then be applied to stub records for
9
+ each digital object, which can quickly make digitized objects as discoverable as
10
+ the archival description makes the physical collections.
11
+
12
+ == Functionality
13
+
14
+ - Parse EAD XML and output all identifiers (with other metadata) for all the
15
+ component parts. This export can be CSV or JSON.
16
+ - Resolve a filename-identifier to a location in the physical collection and
17
+ extract related metadata up through the hierarchy
18
+ - Create barcodes based on an identifiers.
19
+ - Validate whether an identifier is well-formed and valid by resolving to a
20
+ component part in the EAD XML.
21
+ - Commandline tools for each of these functions.
22
+
23
+ == Installation
24
+
25
+ - clone from github and build the gem from source at this time
26
+
27
+ == Identifier specification in brief
28
+
29
+ These identifiers encode information about where original objects in the physical
30
+ collection are located. To make this work for as wide a range of encoded EAD XML
31
+ and archival arrangement and processing practice as we could, it includes many
32
+ pieces of information to help insure uniqueness within a collection.
33
+
34
+ Indentifiers are made up of 6 possible segments. Segments are separated by a
35
+ single dash - to aid in readability. Take the sample identifier
36
+ mc00240-001-ff0001-000-001_0001
37
+
38
+ 1. mc00240: Collection number.
39
+ The first section identifies the collection and
40
+ is usually the eadid of the collection. mc00240 refers to
41
+ http://www.lib.ncsu.edu/findingaids/mc00240
42
+
43
+ 2. 001: Series number.
44
+ This is the number of the series of which the physical
45
+ item is a part. It is a three digit, left zero padded number.
46
+
47
+ 3. ff0001: Container code & number.
48
+ The third segment is made up of a two letter
49
+ code for different container types. The list of current codes can be seen in
50
+ lib/mead.rb as Mead::CONTAINER_MAPPING. (These are the codes NCSU uses for
51
+ encoding containers in EAD XML.) The second part is a three digit, left zero
52
+ padded number. This example would be flatfolder 1.
53
+
54
+ 4. 000: Folder number.
55
+ In this case there is no second container, so the folder
56
+ number is 000. If there was a container with the "folder" value for the type
57
+ attribute and text content of "3", then this segment would be 003. In the case
58
+ where the value is other than "folder" the container code is used in front. So
59
+ a "mapcase" container could be "mc003" when the map case is the third map case
60
+ in the parent container.
61
+
62
+ 5. 001: Item number.
63
+ This is the number of the item in the container. It is an
64
+ arbitrary incremented number. Multiple pages of multipage document would
65
+ be considered as one item and so would get the same item number.
66
+
67
+ 6. _0001: Sequence number (optional).
68
+ If there is a multipage document then this
69
+ section can be used. This is the sequence or page number. It is preceded with
70
+ an underscore.
71
+
72
+
73
+ == TODO
74
+
75
+ - Test for use by other institutions. I'm happy to help make this code work for
76
+ the needs of other institutions.
77
+ - Get more examples for more tests.
78
+ - Better exceptions.
79
+
80
+ == Author
81
+
82
+ Jason Ronallo
83
+
84
+ == Copyright
85
+
86
+ Copyright (c) 2010 North Carolina State University. See LICENSE for details.
data/Rakefile ADDED
@@ -0,0 +1,67 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+ begin
4
+ Bundler.setup(:default, :development)
5
+ rescue Bundler::BundlerError => e
6
+ $stderr.puts e.message
7
+ $stderr.puts "Run `bundle install` to install missing gems"
8
+ exit e.status_code
9
+ end
10
+ require 'rake'
11
+
12
+ require 'jeweler'
13
+ Jeweler::Tasks.new do |gem|
14
+ # gem is a Gem::Specification... see http://docs.rubygems.org/read/chapter/20 for more options
15
+ gem.name = "mead"
16
+ gem.homepage = "http://github.com/jronallo/mead"
17
+ gem.license = "MIT"
18
+ gem.summary = %Q{Extract identifiers and metadata from EAD XML.}
19
+ gem.description = %Q{Extract identifiers and metadata from EAD XML.}
20
+ gem.email = "jronallo@gmail.com"
21
+ gem.authors = ["Jason Ronallo"]
22
+ # Include your dependencies below. Runtime dependencies are required when using your gem,
23
+ # and development dependencies are only needed for development (ie running rake tasks, tests, etc)
24
+ # gem.add_runtime_dependency 'jabber4r', '> 0.1'
25
+ # gem.add_development_dependency 'rspec', '> 1.2.3'
26
+ end
27
+ Jeweler::RubygemsDotOrgTasks.new
28
+
29
+ require 'rake/testtask'
30
+ Rake::TestTask.new(:test) do |test|
31
+ test.libs << 'lib' << 'test'
32
+ test.pattern = 'test/**/test_*.rb'
33
+ test.verbose = true
34
+ end
35
+
36
+ require 'rcov/rcovtask'
37
+ Rcov::RcovTask.new do |test|
38
+ test.libs << 'test'
39
+ test.pattern = 'test/**/test_*.rb'
40
+ test.verbose = true
41
+ end
42
+
43
+ require 'reek/rake/task'
44
+ Reek::Rake::Task.new do |t|
45
+ t.fail_on_error = true
46
+ t.verbose = false
47
+ t.source_files = 'lib/**/*.rb'
48
+ end
49
+
50
+ require 'roodi'
51
+ require 'roodi_task'
52
+ RoodiTask.new do |t|
53
+ t.verbose = false
54
+ end
55
+
56
+ task :default => :test
57
+
58
+ require 'rake/rdoctask'
59
+ Rake::RDocTask.new do |rdoc|
60
+ version = File.exist?('VERSION') ? File.read('VERSION') : ""
61
+
62
+ rdoc.rdoc_dir = 'rdoc'
63
+ rdoc.title = "mead #{version}"
64
+ rdoc.rdoc_files.include('README*')
65
+ rdoc.rdoc_files.include('lib/**/*.rb')
66
+ end
67
+
data/VERSION ADDED
@@ -0,0 +1 @@
1
+ 0.0.5
data/bin/automead ADDED
@@ -0,0 +1,53 @@
1
+ #!/usr/bin/env ruby
2
+ $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
3
+ require 'pp'
4
+ require 'rubygems'
5
+ require 'mead'
6
+ require 'mead/trollop'
7
+ require 'trollop'
8
+ include Mead::TrollopOptions
9
+
10
+ opts = Trollop::options do
11
+ banner <<-EOS
12
+ This script takes a mead (an identifier of a particular format) and returns
13
+ metadata for it.
14
+
15
+ Usage Example:
16
+ automead --mead mc00240-001-ff0052-000-001 --baseurl http://www.lib.ncsu.edu/findingaids --ruby [options]
17
+
18
+ Default output is pretty printed Ruby. Multiple outputs can be specified.
19
+
20
+ where options are:
21
+ EOS
22
+ opt :mead, "A mead-style identifier", :required => true, :type => String
23
+ opt :baseurl, 'Specify just the base URL for grabbing the EAD XML if it is of the format baseurl/eadid.xml.', :type => String
24
+ opt :url, 'Specify the whole URL for grabbing the EAD XML.', :type => String
25
+ opt :file, 'File path to EAD XML.', :type => String
26
+ opt :ruby, 'Output as pretty printed Ruby. Default.'
27
+ opt :json, 'Output as JSON'
28
+ end
29
+
30
+ check_options(opts)
31
+ location = get_location(opts)
32
+
33
+ mead = Mead::Identifier.new(opts[:mead], location)
34
+
35
+ if mead.valid?
36
+ pp mead.metadata if opts[:ruby]
37
+ puts mead.metadata.to_json if opts[:json]
38
+ if !opts[:ruby] and !opts[:json]
39
+ pp mead.metadata
40
+ end
41
+ else
42
+ response = {}
43
+ response[:status] = 'Invalid'
44
+ response.merge!(mead.errors)
45
+ pp response if opts[:ruby]
46
+ if opts[:json]
47
+ response[:mead] = response[:mead].map{|error| error.message }
48
+ puts response.to_json
49
+ end
50
+ if !opts[:ruby] and !opts[:json]
51
+ pp response
52
+ end
53
+ end
data/bin/ead2meads ADDED
@@ -0,0 +1,90 @@
1
+ #!/usr/bin/env ruby
2
+ $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
3
+ require 'pp'
4
+ require 'rubygems'
5
+ require 'mead'
6
+ require 'json'
7
+ require 'mead/trollop'
8
+ require 'trollop'
9
+ include Mead::TrollopOptions
10
+
11
+ #eadid, baseurl
12
+ opts = Trollop::options do
13
+ banner <<-EOS
14
+ This script takes an EAD XML document and returns mead identifiers and metadata
15
+ for it. It is possible to validate whether the parsed EAD XML provides unique
16
+ identifiers for all component parts.
17
+
18
+ Usage Example:
19
+ ead2meads --url http://www.lib.ncsu.edu/findingaids/mc00240.xml [options]
20
+
21
+ Default output is pretty printed Ruby. Multiple outputs can be specified.
22
+
23
+ where options are:
24
+ EOS
25
+ opt :eadid, 'Eadid of the EAD.', :type => String
26
+ opt :url, 'Specify the whole URL for grabbing the EAD XML.', :type => String
27
+ opt :file, 'File path to EAD XML.', :type => String
28
+ opt :ruby, 'Output as pretty printed Ruby.'
29
+ opt :json, 'Output as JSON'
30
+ opt :csv, 'Output as CSV. Default.'
31
+ opt :valid, 'Only outputs whether the EAD creates valid identifiers or not.'
32
+ opt :verbose, 'Outputs the list of invalid containers in cases where invalid.'
33
+ opt :meadsonly, 'Only output a list of mead identifiers.'
34
+ end
35
+
36
+ check_options(opts)
37
+ location = get_location_options(opts)
38
+
39
+ options = {}
40
+ options[:eadid] = opts[:eadid] if opts[:eadid]
41
+ options.merge!(location)
42
+
43
+ begin
44
+ ead = Mead::Ead.new(options)
45
+ rescue => e
46
+ puts e
47
+ puts e.backtrace
48
+ exit
49
+ end
50
+
51
+ if opts[:valid]
52
+ if ead.valid?
53
+ puts 'Valid.'
54
+ else
55
+ if opts[:verbose]
56
+ puts Mead::Ead.to_csv(ead.invalid) if opts[:csv]
57
+ pp ead.invalid if opts[:ruby]
58
+ puts ead.invalid.to_json if opts[:json]
59
+
60
+ if !opts[:csv] and !opts[:ruby] and !opts[:json]
61
+ puts Mead::Ead.to_csv(ead.invalid)
62
+ end
63
+ else
64
+ if opts[:json]
65
+ json_output = {:dups => ead.dups.length, :invalid => ead.invalid.length, :total => ead.containers.length}.to_json
66
+ puts json_output
67
+ else
68
+ puts 'Invalid!'
69
+ puts 'Number of duplicate meads: ' + ead.dups.length.to_s
70
+ puts 'Effected Containers: ' + ead.invalid.length.to_s
71
+ puts 'Short meads:' + ead.short_meads.length.to_s
72
+ end
73
+ end
74
+
75
+
76
+ end
77
+ else
78
+ if opts[:meadsonly]
79
+ puts ead.meads.join("\n")
80
+ else
81
+ puts ead.to_csv if opts[:csv]
82
+ pp ead.containers if opts[:ruby]
83
+ puts ead.containers.to_json if opts[:json]
84
+
85
+ if !opts[:csv] and !opts[:ruby] and !opts[:json]
86
+ puts ead.to_csv
87
+ end
88
+ end
89
+ end
90
+
data/bin/emv ADDED
@@ -0,0 +1,77 @@
1
+ #!/usr/bin/env ruby
2
+ require 'pp'
3
+ require 'rubygems'
4
+ require 'json'
5
+
6
+ # does an Mead::Ead validity check on a directory of EADs using the ead2meads tool
7
+ dir = ARGV[0] || (puts 'Give the path to a directory of EADs to validate!'; exit)
8
+
9
+ valid = []
10
+ invalid = []
11
+ invalid_responses = {}
12
+
13
+ files = Dir.glob(File.join(dir, '*.xml'))
14
+ puts files.length
15
+ files.each_with_index do |path, i|
16
+ begin
17
+ eadid = File.basename(path, '.xml')
18
+ cmd = File.join(File.dirname(__FILE__), 'ead2meads')
19
+ response = `#{cmd} --file #{path} --json --valid`.chomp
20
+ pp response
21
+ if response == 'Valid.'
22
+ puts i.to_s + ' ' + eadid + ': valid'
23
+ valid << eadid
24
+ elsif response.empty?
25
+ else
26
+ puts i.to_s + ' ' + eadid + ': !'
27
+ invalid << eadid
28
+ invalid_responses[eadid] = response
29
+ end
30
+ rescue => e
31
+ invalid_responses[eadid] = e.backtrace
32
+ end
33
+ end
34
+
35
+ puts 'Valid: ' + valid.length.to_s
36
+ puts 'Invalid: ' + invalid.length.to_s
37
+
38
+ puts 'Show all Invalid?'
39
+ answer = STDIN.gets
40
+ if answer.chomp == 'y'
41
+ pp invalid.sort
42
+ end
43
+
44
+ puts 'Show invalid responses?'
45
+ answer = STDIN.gets
46
+ if answer.chomp == 'y'
47
+ invalid_responses.each do |k,v|
48
+ puts k
49
+ puts v.sub("Invalid!\n", '')
50
+ puts
51
+ end
52
+ end
53
+
54
+ puts 'Show setdata?'
55
+ answer = STDIN.gets
56
+ if answer.chomp == 'y'
57
+ data = [%Q|google.load("visualization", "1", {packages:["corechart"]});
58
+ google.setOnLoadCallback(drawChart);
59
+ function drawChart() {
60
+ var data = new google.visualization.DataTable();","data.addColumn('string', 'eadid');|,
61
+ "data.addColumn('number', 'duplicates');",
62
+ "data.addColumn('number', 'invalid containers');"]
63
+ data << "data.addRows(#{invalid_responses.length});"
64
+ invalid_order = invalid_responses.keys.sort_by do |k|
65
+ invalid_response = JSON.parse(invalid_responses[k])
66
+ invalid_responses[k]["invalid"]
67
+ end
68
+ invalid_order.each_with_index do |key, i|
69
+ invalid_response = JSON.parse(invalid_responses[key])
70
+
71
+ data << "data.setValue(#{i}, 0, '#{key}');"
72
+ data << "data.setValue(#{i}, 1, #{invalid_response['dups']});"
73
+ data << "data.setValue(#{i}, 2, #{invalid_response['invalid']});"
74
+ end
75
+ puts data.join("\n")
76
+ end
77
+
data/bin/mead2barcode ADDED
@@ -0,0 +1,64 @@
1
+ #!/usr/bin/env ruby
2
+ $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
3
+ require 'pp'
4
+ require 'rubygems'
5
+ require 'mead'
6
+ require 'mead/trollop'
7
+ require 'trollop'
8
+ include Mead::TrollopOptions
9
+
10
+ opts = Trollop::options do
11
+ banner <<-EOS
12
+ This script takes a mead (an identifier of a particular format), creates a
13
+ barcode and returns the path to the barcode. Gbarcode and RMagick gems must be
14
+ installed for this to work.
15
+
16
+ Usage Example:
17
+ mead2barcode --mead mc00240-001-ff0052-000-001 --baseurl http://www.lib.ncsu.edu/findingaids --ruby [options]
18
+
19
+ where options are:
20
+ EOS
21
+ opt :mead, "A mead-style identifier", :type => String
22
+ opt :meadfile, "Path to text file with one mead identifier on each line.", :type => String
23
+ opt :baseurl, 'Specify just the base URL for grabbing the EAD XML if it is of the format baseurl/eadid.xml.', :type => String
24
+ opt :url, 'Specify the whole URL for grabbing the EAD XML.', :type => String
25
+ opt :file, 'File path to EAD XML.', :type => String
26
+ opt :dir, 'Directory to save the barcodes.', :type => String
27
+ end
28
+
29
+ unless opts[:mead] or opts[:meadfile]
30
+ Trollop::die 'You must specify either a single mead identifier or a file of identifiers'
31
+ end
32
+
33
+ check_options(opts)
34
+ location = get_location(opts)
35
+
36
+ if opts[:mead]
37
+ meads = [opts[:mead]]
38
+ else
39
+ Trollop::die 'meadfile must be a valid path' unless File.exists?(opts[:meadfile])
40
+ meads = File.open(opts[:meadfile], 'r').read.split
41
+ end
42
+
43
+ successful_paths = []
44
+ meads.each do |mead_identifier|
45
+ begin
46
+ mead = Mead::Identifier.new(mead_identifier, location).extract
47
+
48
+ barcode = Mead::Barcode.new(mead)
49
+
50
+ if opts[:dir]
51
+ Trollop::die 'Directory must exist!' unless File.exists?(opts[:dir])
52
+ end
53
+ directory = opts[:dir] || Dir.pwd
54
+
55
+ label_path = barcode.output_label(directory)
56
+ successful_paths << label_path
57
+ puts label_path
58
+ rescue => e
59
+ puts mead_identifier + ' ' + e
60
+ end
61
+ end
62
+
63
+ #`convert #{successful_paths.join(' ')} -append -antialias output.png`
64
+
data/bin/meadbfv ADDED
@@ -0,0 +1,27 @@
1
+ #!/usr/bin/env ruby
2
+ $LOAD_PATH.unshift File.join(File.dirname(__FILE__), '..', 'lib')
3
+ require 'pp'
4
+ require 'rubygems'
5
+ require 'mead'
6
+ require 'pp'
7
+
8
+
9
+ file = ARGV[0]
10
+
11
+ filenames = File.read(file).split
12
+
13
+ valid = []
14
+ invalid = []
15
+ filenames.each do |filename|
16
+ mead = Mead::Identifier.new(filename)
17
+ if mead.valid_format?
18
+ valid << filename
19
+ else
20
+ invalid << filename
21
+ end
22
+ end
23
+
24
+ puts "Total filenames " + filenames.length.to_s
25
+ puts "Unique filenames " + filenames.uniq.length.to_s
26
+ puts "Valid filenames " + valid.length.to_s unless valid.empty?
27
+ puts "Invalid filenames " + invalid.length.to_s unless invalid.empty?
@@ -0,0 +1,49 @@
1
+ module Mead
2
+ class Barcode
3
+ attr_accessor :mead
4
+
5
+ def initialize(identifier)
6
+ @mead = identifier
7
+ end
8
+
9
+ def output_barcode(directory)
10
+ bc = Gbarcode.barcode_create(@mead.mead)
11
+ bc.scalef = 0.5
12
+ bc.margin = 25
13
+ Gbarcode.barcode_encode(bc, Gbarcode::BARCODE_128)
14
+ #tempfile for eps version of barcode
15
+ eps_path = File.join(directory, @mead.mead + '.eps')
16
+ png_path = File.join(directory, @mead.mead + '-barcode.png')
17
+ eps = File.new(eps_path, 'w')
18
+ Gbarcode.barcode_print(bc, eps, Gbarcode::BARCODE_OUT_EPS)
19
+ eps.close
20
+ `convert +antialias #{eps_path} -background white -flatten #{png_path}`
21
+ File.delete(eps_path)
22
+ png_path
23
+ end
24
+
25
+ def output_label(directory)
26
+ text_path = File.join(directory, @mead.mead + '-text.png')
27
+ label_path = File.join(directory, @mead.mead + '-label.png')
28
+ `convert -font fixed -pointsize 14 -background white -fill black label:"#{label_text}" #{text_path}`
29
+ # convert *.png -resize 75% -append output.png
30
+ png_path = output_barcode(directory)
31
+ begin
32
+ `convert #{png_path} #{text_path} -append #{label_path}`
33
+ rescue
34
+ end
35
+ File.delete(png_path)
36
+ File.delete(text_path)
37
+ label_path
38
+ end
39
+
40
+ def label_text
41
+ text = [@mead.mead]
42
+ text << @mead.metadata.first[:unittitle][0,55]
43
+ text.last << '...' if @mead.metadata.first[:unittitle].length > 55
44
+ text << @mead.metadata.first[:item_location]
45
+ text.join('\n')
46
+ end
47
+
48
+ end
49
+ end
@@ -0,0 +1,21 @@
1
+ module Mead
2
+ class Container
3
+ attr_accessor :identifier, :type, :label, :text
4
+
5
+ def initialize(options={})
6
+ @type = options[:type]
7
+ @label = options[:label]
8
+ @identifier = options[:identifier]
9
+ @text = options[:text]
10
+ end
11
+
12
+ def ==(another_container)
13
+ self.identifier == another_container.identifier and
14
+ self.type == another_container.type and
15
+ self.label == another_container.label and
16
+ self.text == another_container.text
17
+ end
18
+
19
+
20
+ end
21
+ end