require "forwardable"
require "yaml"
require "htmlentities"
require "relaton_bib/version"
require "relaton_bib/deep_dup"
require "relaton_bib/localized_string"
require "relaton_bib/bibliographic_item"
require "relaton_bib/hit_collection"
require "relaton_bib/hit"
require "relaton_bib/bibxml_parser"
module RelatonBib
class Error < StandardError; end
class RequestError < StandardError; end
class << self
# @param date [String, Integer, Date] date
# @param str [Boolean] return string or Date
# @return [Date, String, nil] date
def parse_date(date, str = true) # rubocop:disable Metrics/CyclomaticComplexity,Metrics/MethodLength,Metrics/PerceivedComplexity,Metrics/AbcSize
return date if date.is_a?(Date)
case date.to_s
when /(?\w+\s\d{4})/ # February 2012
format_date $~[:date], "%B %Y", str, "%Y-%m"
when /(?\w+\s\d{1,2},\s\d{4})/ # February 11, 2012
format_date $~[:date], "%B %d, %Y", str, "%Y-%m-%d"
when /(?\d{4}-\d{1,2}-\d{1,2})/ # 2012-02-03 or 2012-2-3
format_date $~[:date], "%Y-%m-%d", str
when /(?\d{4}-\d{1,2})/ # 2012-02 or 2012-2
format_date $~[:date], "%Y-%m", str
when /(?\d{4})/ # 2012
format_date $~[:date], "%Y", str
end
end
#
# Parse date string to Date object and format it
#
# @param [String] date date string
# @param [String] format format string
# @param [Boolean] str return string or Date if true
#
# @return [Date, String] date object or formatted date string
#
def format_date(date, format, str, outformat = nil)
date = Date.strptime(date, format)
str ? date.strftime(outformat || format) : date
end
# @param arr [NilClass, Array, #is_a?]
# @return [Array]
def array(arr)
return [] unless arr
return [arr] unless arr.is_a?(Array)
arr
end
#
# Parse yaml content
#
# @param [String] yaml content
#
# @return [Hash] data
#
def parse_yaml(yaml, classes = [])
# Newer versions of Psych uses the `permitted_classes:` parameter
if YAML.method(:safe_load).parameters.map(&:last).include? :permitted_classes
YAML.safe_load(yaml, permitted_classes: classes)
else
YAML.safe_load(yaml, classes)
end
end
end
private
# @param array [Array]
# @return [Array, String]
def single_element_array(array)
# if array.size > 1
array.map { |e| e.is_a?(String) ? e : e.to_hash }
# else
# array.first.is_a?(String) ? array[0] : array.first&.to_hash
# end
end
end