Class: Ddr::Models::YearFacet

Inherits:
Object
  • Object
show all
Defined in:
lib/ddr/models/year_facet.rb

Constant Summary collapse

EARLIEST_YEAR =
1000
BETWEEN =

Between 1965 and 1968

Regexp.new '\A([Bb]etween\s+)(\d{4})(\s+and\s+)(\d{4})\??\z'
IN_DECADE =

YYYx (192x) YYYX (192X) YYY? (192?) YYY- (192-) YYY-? (192-?)

Regexp.new '\A(\d{3})([xX\-]\??|\?)\z'
IN_CENTURY =

YYxx (19xx)

Regexp.new '\A(\d{2})xx\z'
DECADE =

YYY0s (1920s) YYY0s? (1920s?)

Regexp.new '\A(\d{3}0)s\??\z'
YEAR_MONTH =

YYYY-MM (2010-01) YYYY/MM (2010/01)

Regexp.new '\A(\d{4})[/-](0[1-9]|1[0-2])\z'
YEAR_RANGE =

YYYY-YYYY (1935-2010) YYYY/YYYY (1935/2010)

Regexp.new '\A(\d{4})[/-](\d{4})\z'
YEAR =

YYYY (1979)

Regexp.new '\A\d{4}\z'
SQUARE_BRACKETS =
Regexp.new '[\[\]]'
CIRCA =
  1. 1920

ca. 1920 c1920

Regexp.new '\b(circa\s+|ca?\.\s*|c(?=\d{4}[^\d]*))'

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(obj) ⇒ YearFacet

Returns a new instance of YearFacet.



51
52
53
54
55
# File 'lib/ddr/models/year_facet.rb', line 51

def initialize(obj)
  @obj = obj
  @values = []
  facet_values
end

Instance Attribute Details

#objObject (readonly)

Returns the value of attribute obj.



49
50
51
# File 'lib/ddr/models/year_facet.rb', line 49

def obj
  @obj
end

#valuesObject (readonly)

Returns the value of attribute values.



49
50
51
# File 'lib/ddr/models/year_facet.rb', line 49

def values
  @values
end

Class Method Details

.call(obj) ⇒ Object



44
45
46
# File 'lib/ddr/models/year_facet.rb', line 44

def call(obj)
  new(obj).values
end

Instance Method Details

#clean!(value) ⇒ Object



73
74
75
76
77
# File 'lib/ddr/models/year_facet.rb', line 73

def clean!(value)
  value.strip!
  value.gsub! SQUARE_BRACKETS, ""
  value.gsub! CIRCA, ""
end

#extract_years(value) ⇒ Object



68
69
70
71
# File 'lib/ddr/models/year_facet.rb', line 68

def extract_years(value)
  years = match_years(value) || parse_year(value)
  Array(years)
end

#facet_valuesObject



57
58
59
60
61
62
63
64
65
66
# File 'lib/ddr/models/year_facet.rb', line 57

def facet_values
  obj.date.each do |date|
    date.split(/;/).each do |value|
      clean! value
      years = extract_years(value)
      validate! years
      values.push *years
    end
  end
end

#latest_yearObject



93
94
95
# File 'lib/ddr/models/year_facet.rb', line 93

def latest_year
  Date.today.year + 100
end

#match_between(value) ⇒ Object



145
146
147
148
149
150
151
# File 'lib/ddr/models/year_facet.rb', line 145

def match_between(value)
  if m = BETWEEN.match(value)
    value.sub! m[1], ""  # [Bb]etween
    value.sub! m[3], "-" # and
    match_year_range(value)
  end
end

#match_decade(value) ⇒ Object



139
140
141
142
143
# File 'lib/ddr/models/year_facet.rb', line 139

def match_decade(value)
  if m = DECADE.match(value)
    [ m[1], m[1].sub(/0\z/, "9") ]
  end
end

#match_in_century(value) ⇒ Object



133
134
135
136
137
# File 'lib/ddr/models/year_facet.rb', line 133

def match_in_century(value)
  if m = IN_CENTURY.match(value)
    [ "#{m[1]}00", "#{m[1]}99" ]
  end
end

#match_in_decade(value) ⇒ Object



127
128
129
130
131
# File 'lib/ddr/models/year_facet.rb', line 127

def match_in_decade(value)
  if m = IN_DECADE.match(value)
    [ "#{m[1]}0", "#{m[1]}9" ]
  end
end

#match_year(value) ⇒ Object



121
122
123
124
125
# File 'lib/ddr/models/year_facet.rb', line 121

def match_year(value)
  if m = YEAR.match(value)
    value
  end
end

#match_year_month(value) ⇒ Object



115
116
117
118
119
# File 'lib/ddr/models/year_facet.rb', line 115

def match_year_month(value)
  if m = YEAR_MONTH.match(value)
    m[1]
  end
end

#match_year_range(value) ⇒ Object



109
110
111
112
113
# File 'lib/ddr/models/year_facet.rb', line 109

def match_year_range(value)
  if m = YEAR_RANGE.match(value)
    m[1, 2]
  end
end

#match_years(value) ⇒ Object



97
98
99
100
101
102
103
104
105
106
107
# File 'lib/ddr/models/year_facet.rb', line 97

def match_years(value)
  result = match_year_range(value) ||
           match_year_month(value) ||
           match_year(value) ||
           match_in_decade(value) ||
           match_in_century(value) ||
           match_decade(value) ||
           match_between(value)
  first_year, last_year = Array(result).map(&:to_i)
  last_year ? (first_year..last_year) : first_year
end

#parse_year(value) ⇒ Object



83
84
85
86
87
# File 'lib/ddr/models/year_facet.rb', line 83

def parse_year(value)
  Date.parse(value).year
rescue ArgumentError
  nil
end

#valid_yearsObject



89
90
91
# File 'lib/ddr/models/year_facet.rb', line 89

def valid_years
  (EARLIEST_YEAR..latest_year)
end

#validate!(years) ⇒ Object



79
80
81
# File 'lib/ddr/models/year_facet.rb', line 79

def validate!(years)
  years = years & valid_years.to_a
end