mods_display 0.3.3 → 0.3.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. checksums.yaml +4 -4
  2. data/.rubocop.yml +16 -0
  3. data/.rubocop_todo.yml +60 -0
  4. data/.travis.yml +2 -2
  5. data/Rakefile +10 -2
  6. data/lib/mods_display.rb +42 -42
  7. data/lib/mods_display/configuration.rb +69 -67
  8. data/lib/mods_display/configuration/access_condition.rb +17 -13
  9. data/lib/mods_display/configuration/base.rb +27 -24
  10. data/lib/mods_display/configuration/format.rb +8 -4
  11. data/lib/mods_display/configuration/genre.rb +8 -4
  12. data/lib/mods_display/configuration/imprint.rb +12 -7
  13. data/lib/mods_display/configuration/name.rb +8 -4
  14. data/lib/mods_display/configuration/note.rb +8 -4
  15. data/lib/mods_display/configuration/related_item.rb +8 -4
  16. data/lib/mods_display/configuration/subject.rb +11 -9
  17. data/lib/mods_display/configuration/title.rb +8 -4
  18. data/lib/mods_display/controller_extension.rb +24 -24
  19. data/lib/mods_display/country_codes.rb +385 -384
  20. data/lib/mods_display/fields/abstract.rb +7 -6
  21. data/lib/mods_display/fields/access_condition.rb +55 -55
  22. data/lib/mods_display/fields/audience.rb +7 -6
  23. data/lib/mods_display/fields/cartographics.rb +15 -14
  24. data/lib/mods_display/fields/collection.rb +32 -17
  25. data/lib/mods_display/fields/contact.rb +15 -13
  26. data/lib/mods_display/fields/contents.rb +7 -6
  27. data/lib/mods_display/fields/description.rb +21 -21
  28. data/lib/mods_display/fields/field.rb +164 -109
  29. data/lib/mods_display/fields/format.rb +36 -33
  30. data/lib/mods_display/fields/genre.rb +12 -11
  31. data/lib/mods_display/fields/identifier.rb +34 -34
  32. data/lib/mods_display/fields/imprint.rb +258 -214
  33. data/lib/mods_display/fields/language.rb +18 -16
  34. data/lib/mods_display/fields/location.rb +27 -26
  35. data/lib/mods_display/fields/name.rb +113 -118
  36. data/lib/mods_display/fields/note.rb +33 -34
  37. data/lib/mods_display/fields/related_item.rb +64 -66
  38. data/lib/mods_display/fields/resource_type.rb +13 -11
  39. data/lib/mods_display/fields/sub_title.rb +6 -4
  40. data/lib/mods_display/fields/subject.rb +92 -90
  41. data/lib/mods_display/fields/title.rb +54 -49
  42. data/lib/mods_display/fields/values.rb +7 -8
  43. data/lib/mods_display/html.rb +117 -96
  44. data/lib/mods_display/model_extension.rb +17 -16
  45. data/lib/mods_display/relator_codes.rb +269 -267
  46. data/lib/mods_display/version.rb +1 -1
  47. data/mods_display.gemspec +13 -12
  48. data/spec/configuration/access_condition_spec.rb +5 -5
  49. data/spec/configuration/base_spec.rb +24 -24
  50. data/spec/fields/abstract_spec.rb +24 -14
  51. data/spec/fields/access_condition_spec.rb +80 -55
  52. data/spec/fields/audience_spec.rb +15 -12
  53. data/spec/fields/cartographics_spec.rb +17 -18
  54. data/spec/fields/collection_spec.rb +65 -19
  55. data/spec/fields/contact_spec.rb +11 -9
  56. data/spec/fields/contents_spec.rb +15 -12
  57. data/spec/fields/description_spec.rb +40 -22
  58. data/spec/fields/format_spec.rb +28 -18
  59. data/spec/fields/genre_spec.rb +18 -16
  60. data/spec/fields/identifier_spec.rb +46 -34
  61. data/spec/fields/imprint_spec.rb +151 -125
  62. data/spec/fields/language_spec.rb +36 -20
  63. data/spec/fields/location_spec.rb +43 -27
  64. data/spec/fields/name_spec.rb +92 -92
  65. data/spec/fields/note_spec.rb +53 -40
  66. data/spec/fields/related_item_spec.rb +42 -40
  67. data/spec/fields/resource_type_spec.rb +20 -14
  68. data/spec/fields/sub_title_spec.rb +11 -9
  69. data/spec/fields/subject_spec.rb +61 -56
  70. data/spec/fields/title_spec.rb +53 -40
  71. data/spec/fixtures/access_condition_fixtures.rb +50 -0
  72. data/spec/fixtures/cartographics_fixtures.rb +1 -1
  73. data/spec/fixtures/imprint_fixtures.rb +49 -1
  74. data/spec/fixtures/name_fixtures.rb +195 -2
  75. data/spec/fixtures/related_item_fixtures.rb +107 -0
  76. data/spec/fixtures/subjects_fixtures.rb +15 -2
  77. data/spec/fixtures/title_fixtures.rb +101 -0
  78. data/spec/integration/configuration_spec.rb +23 -20
  79. data/spec/integration/html_spec.rb +40 -29
  80. data/spec/integration/installation_spec.rb +14 -14
  81. data/spec/spec_helper.rb +5 -8
  82. metadata +25 -3
@@ -1,8 +1,9 @@
1
- class ModsDisplay::Abstract < ModsDisplay::Field
1
+ module ModsDisplay
2
+ class Abstract < Field
3
+ private
2
4
 
3
- private
4
- def displayLabel(element)
5
- super(element) || I18n.t('mods_display.abstract')
5
+ def displayLabel(element)
6
+ super(element) || I18n.t('mods_display.abstract')
7
+ end
6
8
  end
7
-
8
- end
9
+ end
@@ -1,73 +1,73 @@
1
- class ModsDisplay::AccessCondition < ModsDisplay::Field
2
-
3
- def fields
4
- return_fields = @values.map do |value|
5
- ModsDisplay::Values.new(:label => displayLabel(value) || access_label(value), :values => [process_access_statement(value)])
1
+ module ModsDisplay
2
+ class AccessCondition < Field
3
+ def fields
4
+ return_fields = @values.map do |value|
5
+ ModsDisplay::Values.new(
6
+ label: displayLabel(value) || access_label(value),
7
+ values: [process_access_statement(value)]
8
+ )
9
+ end
10
+ collapse_fields(return_fields)
6
11
  end
7
- collapse_fields(return_fields)
8
- end
9
12
 
10
- private
13
+ private
11
14
 
12
- def process_access_statement(element)
13
- case normalize_type(element)
14
- when "copyright"
15
- copyright_statement(element)
16
- when "license"
17
- license_statement(element)
18
- else
19
- element.text
15
+ def process_access_statement(element)
16
+ case normalize_type(element)
17
+ when 'copyright'
18
+ copyright_statement(element)
19
+ when 'license'
20
+ license_statement(element)
21
+ else
22
+ element.text
23
+ end
20
24
  end
21
- end
22
25
 
23
- def copyright_statement(element)
24
- element.text.gsub(/\(c\) copyright/i, "&copy;").gsub(/\(c\)/i, "&copy;")
25
- end
26
+ def copyright_statement(element)
27
+ element.text.gsub(/\(c\) copyright/i, '&copy;').gsub(/\(c\)/i, '&copy;')
28
+ end
26
29
 
27
- def license_statement(element)
28
- element.text[/^(.*) (.*):(.*)$/]
29
- output = "<div class='#{[$1,$2].join('-').downcase}'>"
30
- if license_link($1, $2)
31
- output << "<a href='#{license_link($1, $2)}'>#{$3.strip}</a>"
30
+ def license_statement(element)
31
+ element.text[/^(.*) (.*):(.*)$/]
32
+ output = "<div class='#{[Regexp.last_match(1), Regexp.last_match(2)].join('-').downcase}'>"
33
+ if license_link(Regexp.last_match(1), Regexp.last_match(2))
34
+ link = "<a href='#{license_link(Regexp.last_match(1), Regexp.last_match(2))}'>#{Regexp.last_match(3).strip}</a>"
35
+ output << link
32
36
  else
33
- output << $3.strip
37
+ output << Regexp.last_match(3).strip
34
38
  end
35
- output << "</div>"
36
- end
39
+ output << '</div>'
40
+ end
37
41
 
38
- def license_code_urls
39
- {"cc" => "http://creativecommons.org/licenses/",
40
- "odc" => "http://opendatacommons.org/licenses/"}
41
- end
42
+ def license_code_urls
43
+ { 'cc' => 'http://creativecommons.org/licenses/',
44
+ 'odc' => 'http://opendatacommons.org/licenses/' }
45
+ end
42
46
 
43
- def license_link(code, type)
44
- code = code.downcase
45
- if license_code_urls.has_key?(code)
47
+ def license_link(code, type)
48
+ code = code.downcase
49
+ return unless license_code_urls.key?(code)
46
50
  "#{license_code_urls[code]}#{type.downcase}#{"/#{@config.cc_license_version}/" if code == 'cc'}"
47
51
  end
48
- end
49
52
 
50
- def access_label(element)
51
- type = normalize_type(element)
52
- if access_labels.has_key?(type)
53
- return access_labels[type]
53
+ def access_label(element)
54
+ type = normalize_type(element)
55
+ return access_labels[type] if access_labels.key?(type)
56
+ I18n.t('mods_display.access_condition')
54
57
  end
55
- I18n.t('mods_display.access_condition')
56
- end
57
58
 
58
- def normalize_type(element)
59
- type = element.attributes["type"]
60
- if type.respond_to?(:value)
61
- return type.value.strip.gsub(/\s*/, "").downcase
59
+ def normalize_type(element)
60
+ type = element.attributes['type']
61
+ return type.value.strip.gsub(/\s*/, '').downcase if type.respond_to?(:value)
62
+ ''
62
63
  end
63
- ""
64
- end
65
64
 
66
- def access_labels
67
- {"useandreproduction" => I18n.t('mods_display.use_and_reproduction'),
68
- "restrictiononaccess" => I18n.t('mods_display.restriction_on_access'),
69
- "copyright" => I18n.t('mods_display.copyright'),
70
- "license" => I18n.t('mods_display.license')
71
- }
65
+ def access_labels
66
+ { 'useandreproduction' => I18n.t('mods_display.use_and_reproduction'),
67
+ 'restrictiononaccess' => I18n.t('mods_display.restriction_on_access'),
68
+ 'copyright' => I18n.t('mods_display.copyright'),
69
+ 'license' => I18n.t('mods_display.license')
70
+ }
71
+ end
72
72
  end
73
- end
73
+ end
@@ -1,8 +1,9 @@
1
- class ModsDisplay::Audience < ModsDisplay::Field
1
+ module ModsDisplay
2
+ class Audience < Field
3
+ private
2
4
 
3
- private
4
- def displayLabel(element)
5
- super(element) || I18n.t('mods_display.target_audience')
5
+ def displayLabel(element)
6
+ super(element) || I18n.t('mods_display.target_audience')
7
+ end
6
8
  end
7
-
8
- end
9
+ end
@@ -1,21 +1,22 @@
1
- class ModsDisplay::Cartographics < ModsDisplay::Field
2
-
3
- def fields
4
- return nil if @values.nil?
5
- return_fields = []
6
- @values.each do |value|
7
- if value.respond_to?(:cartographics)
1
+ module ModsDisplay
2
+ class Cartographics < Field
3
+ def fields
4
+ return nil if @values.nil?
5
+ return_fields = []
6
+ @values.each do |value|
7
+ next unless value.respond_to?(:cartographics)
8
8
  value.cartographics.each do |field|
9
- scale = field.scale.empty? ? "Scale not given" : field.scale.text
9
+ scale = field.scale.empty? ? 'Scale not given' : field.scale.text
10
10
  projection = field.projection.empty? ? nil : field.projection.text
11
11
  coordinates = field.coordinates.empty? ? nil : field.coordinates.text
12
- post_scale = [projection, coordinates].compact.length > 0 ? [projection, coordinates].compact.join(" ") : nil
13
- return_fields << ModsDisplay::Values.new({:label => (displayLabel(field) || label || I18n.t('mods_display.map_data')),
14
- :values => [[scale, post_scale].compact.join(" ; ")]})
12
+ post_scale = [projection, coordinates].compact.length > 0 ? [projection, coordinates].compact.join(' ') : nil
13
+ return_fields << ModsDisplay::Values.new(
14
+ label: (displayLabel(field) || label || I18n.t('mods_display.map_data')),
15
+ values: [[scale, post_scale].compact.join(' ; ')]
16
+ )
15
17
  end
16
18
  end
19
+ collapse_fields(return_fields)
17
20
  end
18
- collapse_fields(return_fields)
19
21
  end
20
-
21
- end
22
+ end
@@ -1,21 +1,36 @@
1
- class ModsDisplay::Collection < ModsDisplay::Field
2
-
3
- def label
4
- super || I18n.t('mods_display.collection')
5
- end
1
+ module ModsDisplay
2
+ ###
3
+ # Collection class to parse collection data out of Mods relatedItem fields
4
+ ###
5
+ class Collection < Field
6
+ def collection_label(value)
7
+ displayLabel(value) || I18n.t('mods_display.collection')
8
+ end
6
9
 
7
- def fields
8
- return_fields = []
9
- @values.each do |value|
10
- if value.respond_to?(:titleInfo) and
11
- value.respond_to?(:typeOfResource) and
12
- value.typeOfResource.attributes.length > 0 and
13
- value.typeOfResource.attributes.first.has_key?("collection") and
14
- value.typeOfResource.attributes.first["collection"].value == "yes"
15
- return_fields << ModsDisplay::Values.new(:label => label, :values => [value.titleInfo.text.strip])
10
+ def fields
11
+ return_fields = []
12
+ @values.each do |value|
13
+ next unless related_item_is_a_collection?(value)
14
+ return_fields << ModsDisplay::Values.new(
15
+ label: collection_label(value),
16
+ values: [value.titleInfo.text.strip]
17
+ )
16
18
  end
19
+ collapse_fields(return_fields)
17
20
  end
18
- collapse_fields(return_fields)
19
- end
20
21
 
21
- end
22
+ private
23
+
24
+ def related_item_is_a_collection?(value)
25
+ value.respond_to?(:titleInfo) && resource_type_is_collection?(value)
26
+ end
27
+
28
+ def resource_type_is_collection?(value)
29
+ return unless value.respond_to?(:typeOfResource)
30
+ return unless value.typeOfResource.attributes.length > 0
31
+ value.typeOfResource.attributes.length > 0 &&
32
+ value.typeOfResource.attributes.first.key?('collection') &&
33
+ value.typeOfResource.attributes.first['collection'].value == 'yes'
34
+ end
35
+ end
36
+ end
@@ -1,17 +1,19 @@
1
- class ModsDisplay::Contact < ModsDisplay::Field
2
- def fields
3
- return_fields = contact_fields.map do |value|
4
- ModsDisplay::Values.new(:label => displayLabel(value) || I18n.t('mods_display.contact'), :values => [value.text])
1
+ module ModsDisplay
2
+ class Contact < Field
3
+ def fields
4
+ return_fields = contact_fields.map do |value|
5
+ ModsDisplay::Values.new(label: displayLabel(value) || I18n.t('mods_display.contact'), values: [value.text])
6
+ end
7
+ collapse_fields(return_fields)
5
8
  end
6
- collapse_fields(return_fields)
7
- end
8
9
 
9
- private
10
- def contact_fields
11
- @values.select do |value|
12
- value.attributes["type"].respond_to?(:value) and
13
- value.attributes["type"].value.downcase == "contact"
10
+ private
11
+
12
+ def contact_fields
13
+ @values.select do |value|
14
+ value.attributes['type'].respond_to?(:value) &&
15
+ value.attributes['type'].value.downcase == 'contact'
16
+ end
14
17
  end
15
18
  end
16
-
17
- end
19
+ end
@@ -1,8 +1,9 @@
1
- class ModsDisplay::Contents < ModsDisplay::Field
1
+ module ModsDisplay
2
+ class Contents < Field
3
+ private
2
4
 
3
- private
4
- def displayLabel(element)
5
- super(element) || I18n.t('mods_display.table_of_contents')
5
+ def displayLabel(element)
6
+ super(element) || I18n.t('mods_display.table_of_contents')
7
+ end
6
8
  end
7
-
8
- end
9
+ end
@@ -1,28 +1,28 @@
1
- class ModsDisplay::Description < ModsDisplay::Field
2
-
3
- def fields
4
- return_fields = description_fields.map do |value|
5
- ModsDisplay::Values.new(:label => description_label(value), :values => [value.text])
1
+ module ModsDisplay
2
+ class Description < Field
3
+ def fields
4
+ return_fields = description_fields.map do |value|
5
+ ModsDisplay::Values.new(label: description_label(value), values: [value.text])
6
+ end
7
+ collapse_fields(return_fields)
6
8
  end
7
- collapse_fields(return_fields)
8
- end
9
9
 
10
- def description_label(element)
11
- label || displayLabel(element) || labels[element.name.to_sym] || I18n.t('mods_display.physical_description')
12
- end
10
+ def description_label(element)
11
+ label || displayLabel(element) || labels[element.name.to_sym] || I18n.t('mods_display.physical_description')
12
+ end
13
13
 
14
- private
14
+ private
15
15
 
16
- def description_fields
17
- @values.children.select do |child|
18
- labels.keys.include?(child.name.to_sym)
16
+ def description_fields
17
+ @values.children.select do |child|
18
+ labels.keys.include?(child.name.to_sym)
19
+ end
19
20
  end
20
- end
21
21
 
22
- def labels
23
- {:digitalOrigin => I18n.t('mods_display.digital_origin'),
24
- :note => I18n.t('mods_display.note')
25
- }
22
+ def labels
23
+ { digitalOrigin: I18n.t('mods_display.digital_origin'),
24
+ note: I18n.t('mods_display.note')
25
+ }
26
+ end
26
27
  end
27
-
28
- end
28
+ end
@@ -1,140 +1,195 @@
1
1
  # encoding: utf-8
2
- class ModsDisplay::Field
3
- def initialize(values, config, klass)
4
- @values = values
5
- @config = config
6
- @klass = klass
7
- end
2
+ module ModsDisplay
3
+ class Field
4
+ def initialize(values, config, klass)
5
+ @values = values
6
+ @config = config
7
+ @klass = klass
8
+ end
8
9
 
9
- def fields
10
- return_fields = @values.map do |value|
11
- ModsDisplay::Values.new(:label => displayLabel(value) || label, :values => [displayForm(@values) || value.text].flatten)
10
+ def fields
11
+ return_fields = @values.map do |value|
12
+ ModsDisplay::Values.new(
13
+ label: displayLabel(value) || label,
14
+ values: [displayForm(@values) || value.text].flatten
15
+ )
16
+ end
17
+ collapse_fields(return_fields)
12
18
  end
13
- collapse_fields(return_fields)
14
- end
15
19
 
16
- def label
17
- return nil if @values.nil?
18
- displayLabel(@values.first)
19
- end
20
+ def label
21
+ return nil if @values.nil?
22
+ displayLabel(@values.first)
23
+ end
20
24
 
21
- def to_html
22
- return nil if fields.empty? or @config.ignore?
23
- output = ""
24
- fields.each do |field|
25
- if field.values.any?{|f| f && !f.empty? }
25
+ def to_html
26
+ return nil if fields.empty? || @config.ignore?
27
+ output = ''
28
+ fields.each do |field|
29
+ next unless field.values.any? { |f| f && !f.empty? }
26
30
  output << "<dt#{label_class} #{sanitized_field_title(field.label)}>#{field.label}</dt>"
27
31
  output << "<dd#{value_class}>"
28
- output << field.values.map do |val|
29
- @config.link ? link_to_value(val.to_s) : link_urls_and_email(val.to_s)
30
- end.join(@config.delimiter)
31
- output << "</dd>"
32
+ output << field.values.map do |val|
33
+ @config.link ? link_to_value(val.to_s) : link_urls_and_email(val.to_s)
34
+ end.join(@config.delimiter)
35
+ output << '</dd>'
32
36
  end
37
+ output
33
38
  end
34
- output
35
- end
36
39
 
37
- private
40
+ private
38
41
 
39
- def label_class
40
- " class='#{@config.label_class}'" unless @config.label_class == ""
41
- end
42
+ def compact_and_join_with_delimiter(values, delimiter)
43
+ compact_values = values.compact.reject { |v| v.strip.empty? }
44
+ return compact_values.join(delimiter) if compact_values.length == 1 ||
45
+ !ends_in_terminating_punctuation?(delimiter)
46
+ compact_values.each_with_index.map do |value, i|
47
+ if (compact_values.length - 1) == i || # last item?
48
+ ends_in_terminating_punctuation?(value)
49
+ value << ' '
50
+ else
51
+ value << delimiter
52
+ end
53
+ end.join.strip
54
+ end
42
55
 
43
- def value_class
44
- " class='#{@config.value_class}'" unless @config.value_class == ""
45
- end
56
+ def process_bc_ad_dates(date_fields)
57
+ date_fields.map do |date_field|
58
+ case
59
+ when date_is_bc_edtf?(date_field)
60
+ year = date_field.text.strip.gsub(/^-0*/, '').to_i - 1
61
+ date_field.content = "#{year} B.C."
62
+ when date_is_ad?(date_field)
63
+ date_field.content = "#{date_field.text.strip.gsub(/^0*/, '')} A.D."
64
+ end
65
+ date_field
66
+ end
67
+ end
46
68
 
47
- def link_to_value(link_text, link_href=nil)
48
- "<a href='#{@klass.send(@config.link[0], replace_tokens(@config.link[1], link_href || link_text))}'>#{link_text}</a>"
49
- end
69
+ def date_is_bc_edtf?(date_field)
70
+ date_field.text.strip.start_with?('-') && date_is_edtf?(date_field)
71
+ end
50
72
 
51
- def displayForm(element)
52
- return element unless element # basically return nil
53
- display = element.children.find{|c| c.name == "displayForm"}
54
- return display.text if display
55
- end
73
+ def date_is_ad?(date_field)
74
+ date_field.text.strip.gsub(/^0*/, '').length < 4
75
+ end
56
76
 
57
- def displayLabel(element)
58
- if (element.respond_to?(:attributes) and
59
- element.attributes["displayLabel"].respond_to?(:value))
60
- "#{element.attributes["displayLabel"].value}:"
77
+ def date_is_edtf?(date_field)
78
+ field_is_encoded?(date_field, 'edtf')
61
79
  end
62
- end
63
80
 
64
- def sanitized_field_title(label)
65
- "title='#{label.gsub(/:$/,'').strip}'"
66
- end
81
+ def field_is_encoded?(field, encoding)
82
+ field.attributes['encoding'] &&
83
+ field.attributes['encoding'].respond_to?(:value) &&
84
+ field.attributes['encoding'].value.downcase == encoding
85
+ end
67
86
 
68
- def replace_tokens(object, value)
69
- object = object.dup
70
- if object.is_a?(Hash)
71
- object.each do |k,v|
72
- object[k] = replace_token(v, value)
73
- end
74
- elsif object.is_a?(String)
75
- object = replace_token(object, value)
87
+ def ends_in_terminating_punctuation?(value)
88
+ value.strip.end_with?('.', ',', ':', ';')
76
89
  end
77
- object
78
- end
79
90
 
80
- def replace_token(string, value)
81
- string = string.dup
82
- tokens.each do |token|
83
- string.gsub!(token, value)
91
+ def label_class
92
+ " class='#{@config.label_class}'" unless @config.label_class == ''
84
93
  end
85
- string
86
- end
87
94
 
88
- def tokens
89
- ["%value%"]
90
- end
95
+ def value_class
96
+ " class='#{@config.value_class}'" unless @config.value_class == ''
97
+ end
91
98
 
92
- def link_urls_and_email(val)
93
- val = val.dup
94
- # http://daringfireball.net/2010/07/improved_regex_for_matching_urls
95
- url = /(?i)\b(?:https?:\/\/|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\([^\s()<>]+|\([^\s()<>]+\)*\))+(?:\([^\s()<>]+|\([^\s()<>]+\)*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’])/i
96
- # http://www.regular-expressions.info/email.html
97
- email = /[A-Z0-9_\.%\+\-\']+@(?:[A-Z0-9\-]+\.)+(?:[A-Z]{2,4}|museum|travel)/i
98
- matches = [val.scan(url), val.scan(email)].flatten
99
- unless val =~ /<a/ # we'll assume that linking has alraedy occured and we don't want to double link
100
- matches.each do |match|
101
- if match =~ email
102
- val = val.gsub(match, "<a href='mailto:#{match}'>#{match}</a>")
103
- else
104
- val = val.gsub(match, "<a href='#{match}'>#{match}</a>")
99
+ def link_to_value(link_text, link_href = nil)
100
+ href_or_text = link_href || link_text
101
+ "<a href='#{@klass.send(@config.link[0], replace_tokens(@config.link[1], href_or_text))}'>#{link_text}</a>"
102
+ end
103
+
104
+ def displayForm(element)
105
+ return element unless element # basically return nil
106
+ display = element.children.find { |c| c.name == 'displayForm' }
107
+ return display.text if display
108
+ end
109
+
110
+ def displayLabel(element)
111
+ return unless element.respond_to?(:attributes) &&
112
+ element.attributes['displayLabel'].respond_to?(:value)
113
+ "#{element.attributes['displayLabel'].value}:"
114
+ end
115
+
116
+ def sanitized_field_title(label)
117
+ "title='#{label.gsub(/:$/, '').strip}'"
118
+ end
119
+
120
+ def replace_tokens(object, value)
121
+ object = object.dup
122
+ if object.is_a?(Hash)
123
+ object.each do |k, v|
124
+ object[k] = replace_token(v, value)
105
125
  end
126
+ elsif object.is_a?(String)
127
+ object = replace_token(object, value)
106
128
  end
129
+ object
107
130
  end
108
- val
109
- end
110
131
 
111
- def collapse_fields(display_fields)
112
- return_values = []
113
- current_label = nil
114
- prev_label = nil
115
- buffer = []
116
- display_fields.each_with_index do |field, index|
117
- current_label = field.label
118
- current_values = field.values
119
- if display_fields.length == 1
120
- return_values << ModsDisplay::Values.new(:label => current_label, :values => current_values)
121
- elsif index == (display_fields.length-1)
122
- # need to deal w/ when we have a last element but we have separate labels in the buffer.
123
- if current_label != prev_label
124
- return_values << ModsDisplay::Values.new(:label => prev_label, :values => buffer.flatten)
125
- return_values << ModsDisplay::Values.new(:label => current_label, :values => current_values)
126
- else
127
- buffer.concat(current_values)
128
- return_values << ModsDisplay::Values.new(:label => current_label, :values => buffer.flatten)
132
+ def replace_token(string, value)
133
+ string = string.dup
134
+ tokens.each do |token|
135
+ string.gsub!(token, value)
136
+ end
137
+ string
138
+ end
139
+
140
+ def tokens
141
+ ['%value%']
142
+ end
143
+
144
+ # rubocop:disable Metrics/LineLength
145
+ # Disabling line length due to necessarily long regular expressions
146
+ def link_urls_and_email(val)
147
+ val = val.dup
148
+ # http://daringfireball.net/2010/07/improved_regex_for_matching_urls
149
+ url = %r{(?i)\b(?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)(?:[^\s()<>]+|\([^\s()<>]+|\([^\s()<>]+\)*\))+(?:\([^\s()<>]+|\([^\s()<>]+\)*\)|[^\s`!()\[\]{};:'".,<>?«»“”‘’])}i
150
+ # http://www.regular-expressions.info/email.html
151
+ email = /[A-Z0-9_\.%\+\-\']+@(?:[A-Z0-9\-]+\.)+(?:[A-Z]{2,4}|museum|travel)/i
152
+ matches = [val.scan(url), val.scan(email)].flatten
153
+ unless val =~ /<a/ # we'll assume that linking has alraedy occured and we don't want to double link
154
+ matches.each do |match|
155
+ if match =~ email
156
+ val = val.gsub(match, "<a href='mailto:#{match}'>#{match}</a>")
157
+ else
158
+ val = val.gsub(match, "<a href='#{match}'>#{match}</a>")
159
+ end
129
160
  end
130
- elsif prev_label and (current_label != prev_label)
131
- return_values << ModsDisplay::Values.new(:label => prev_label, :values => buffer.flatten)
132
- buffer = []
133
161
  end
134
- buffer.concat(current_values)
135
- prev_label = current_label
162
+ val
163
+ end
164
+ # rubocop:enable Metrics/LineLength
165
+
166
+ def collapse_fields(display_fields)
167
+ return_values = []
168
+ current_label = nil
169
+ prev_label = nil
170
+ buffer = []
171
+ display_fields.each_with_index do |field, index|
172
+ current_label = field.label
173
+ current_values = field.values
174
+ if display_fields.length == 1
175
+ return_values << ModsDisplay::Values.new(label: current_label, values: current_values)
176
+ elsif index == (display_fields.length - 1)
177
+ # need to deal w/ when we have a last element but we have separate labels in the buffer.
178
+ if current_label != prev_label
179
+ return_values << ModsDisplay::Values.new(label: prev_label, values: buffer.flatten)
180
+ return_values << ModsDisplay::Values.new(label: current_label, values: current_values)
181
+ else
182
+ buffer.concat(current_values)
183
+ return_values << ModsDisplay::Values.new(label: current_label, values: buffer.flatten)
184
+ end
185
+ elsif prev_label && (current_label != prev_label)
186
+ return_values << ModsDisplay::Values.new(label: prev_label, values: buffer.flatten)
187
+ buffer = []
188
+ end
189
+ buffer.concat(current_values)
190
+ prev_label = current_label
191
+ end
192
+ return_values
136
193
  end
137
- return_values
138
194
  end
139
-
140
- end
195
+ end