Class: Krikri::Enrichments::TimespanSplit
- Inherits:
-
Object
- Object
- Krikri::Enrichments::TimespanSplit
- Includes:
- Audumbla::FieldEnrichment
- Defined in:
- lib/krikri/enrichments/timespan_split.rb
Overview
Splits edm:TimeSpan labels and populates ‘#begin` and `#end`. Any values generated from string values are left as strings to be normalized by another enrichment.
Ignores values that are neither a String or an edm:TimeSpan
Converts string values to a timespan with the value as providedLabel and enriches as below.
Populates the ‘#begin`, and `#end` properties of TimeSpan objects from `#providedLabel`. If a `#providedLabel` is present, but begin and end are missing, runs the `Krikri::Util::ExtendedDateParser`.
Once a begin and end date are recognized, the enrichment checks their validity (that the begin date comes before any existing end dates, or vice versa) and writes whichever value(s) it finds empty. The earliest/latest dates are used for begin/end, respectively.
If more than one ‘#providedLabel` is given, each is processed in turn and the widest possible range is used.
Returns the TimeSpan unaltered if both ‘#begin` and `#end` are present or valid values cannot be found for empty fields.
Instance Method Summary collapse
-
#enrich_value(value) ⇒ Object
Enrich a ‘DPLA::MAP::TimeSpan` object or string value with `begin` and `end` values.
- #parse_labels(labels) ⇒ Array<Date, EDTF::Interval>
-
#populate_timespan(timespan) ⇒ DPLA::MAP::TimeSpan
Populates a timespan with a begin and end date.
-
#reduce_to_largest_span(timespan) ⇒ DPLA::MAP::TimeSpan
Reduces a timespan with multiple begin or end dates to a single earliest begin date and a single latest end date.
-
#span_from_date(date) ⇒ Array<Date, DateTime>
Converts an EDTF date to a begin and end date.
-
#timespan_from_string(value) ⇒ DPLA::MAP::TimeSpan
Converts a string to a ‘DPLA::MAP::TimeSpan` with the string as `providedLabel`.
Instance Method Details
#enrich_value(value) ⇒ Object
Enrich a ‘DPLA::MAP::TimeSpan` object or string value with `begin` and `end` values.
40 41 42 43 44 |
# File 'lib/krikri/enrichments/timespan_split.rb', line 40 def enrich_value(value) value = timespan_from_string(value) if value.is_a? String return value unless value.is_a? DPLA::MAP::TimeSpan populate_timespan(value) end |
#parse_labels(labels) ⇒ Array<Date, EDTF::Interval>
82 83 84 |
# File 'lib/krikri/enrichments/timespan_split.rb', line 82 def parse_labels(labels) labels.map { |l| Krikri::Util::ExtendedDateParser.parse(l, true) }.compact end |
#populate_timespan(timespan) ⇒ DPLA::MAP::TimeSpan
Populates a timespan with a begin and end date.
65 66 67 68 69 70 71 72 73 74 75 76 77 78 |
# File 'lib/krikri/enrichments/timespan_split.rb', line 65 def populate_timespan(timespan) return timespan unless (timespan.begin.empty? || timespan.end.empty?) && !timespan.providedLabel.empty? parsed = parse_labels(timespan.providedLabel) return timespan if parsed.empty? parsed.each do |date| begin_date, end_date = span_from_date(date) timespan.begin << begin_date timespan.end << end_date end reduce_to_largest_span(timespan) return timespan end |
#reduce_to_largest_span(timespan) ⇒ DPLA::MAP::TimeSpan
Reduces a timespan with multiple begin or end dates to a single earliest begin date and a single latest end date.
111 112 113 114 115 |
# File 'lib/krikri/enrichments/timespan_split.rb', line 111 def reduce_to_largest_span(timespan) timespan.begin = timespan.begin.sort.first timespan.end = timespan.end.sort.last timespan end |
#span_from_date(date) ⇒ Array<Date, DateTime>
Converts an EDTF date to a begin and end date.
94 95 96 97 98 99 100 101 102 |
# File 'lib/krikri/enrichments/timespan_split.rb', line 94 def span_from_date(date) return [nil, nil] if date.nil? if date.is_a?(Date) return [date, date] if date.precision == :day return [date, (date.succ - 1)] end [(date.respond_to?(:first) ? date.first : date.from), (date.respond_to?(:last) ? date.last : date.to)] end |
#timespan_from_string(value) ⇒ DPLA::MAP::TimeSpan
Converts a string to a ‘DPLA::MAP::TimeSpan` with the string as `providedLabel`.
53 54 55 56 57 |
# File 'lib/krikri/enrichments/timespan_split.rb', line 53 def timespan_from_string(value) timespan = DPLA::MAP::TimeSpan.new timespan.providedLabel = value timespan end |