module Jekyll::Algolia::Utils
def self.compact_empty(hash)
Public: Remove all keys with a nil value or an empty array from a hash
def self.compact_empty(hash) new_hash = {} hash.each do |key, value| next if value.nil? next if value.respond_to?(:empty?) && value.empty? new_hash[key] = value end new_hash end
def self.find_by_key(items, key, value)
value - The value of the key to filter
key - The key to search for
items - The array of hashes to search
Public: Find an item from an array based on the value of one of its key
def self.find_by_key(items, key, value) return nil if items.nil? items.find do |item| item[key] == value end end
def self.html_to_text(html)
Public: Convert an HTML string to its content only
def self.html_to_text(html) return nil if html.nil? text = Nokogiri::HTML(html).text text.tr("\n", ' ').squeeze(' ').strip end
def self.instance_of?(input, classname)
input - the variable to test
Public: Check if a variable is an instance of a specific class
def self.instance_of?(input, classname) return input.instance_of? Object.const_get(classname) rescue StandardError # The class might not even exist return false end
def self.keys_to_symbols(hash)
Public: Convert a hash with string keys to a hash with symbol keys
def self.keys_to_symbols(hash) Hash[hash.map { |key, value| [key.to_sym, value] }] end
def self.match?(string, regex)
Newer versions of Ruby have easy ways to test this, but a wrapper is
regex - The regex to match against
string - The string to test
Public: Check if a string matches a regex
def self.match?(string, regex) # Ruby 2.4 introduces .match? return regex.match?(string) if regex.respond_to?(:match?) # Older versions of Ruby have to deal with =~ returning nil if no match # is found !(string =~ regex).nil? end
def self.monkey_patch(instance, method, block)
Solution found on
block - The new block to use for replacing (as a proc)
method - The method symbol to overwrite
instance - The instance to overwrite
Public: Allow redefining an instance method on the fly with a new one
def self.monkey_patch(instance, method, block) metaclass = class << instance; self; end metaclass.send(:define_method, method, block) end