94 lines
2.9 KiB
Ruby

# frozen_string_literal: true
module Jekyll
module Algolia
# Display helpful error messages
module Logger
# Public: Silence all Jekyll log output in this block
# Usage:
# Logger.silence do
# # whatever Jekyll code here
# end
#
# This is especially useful when Jekyll is too talkative about what is
# loggued. It works by redefining Jekyll.logger.write to a noop
# temporarily and re-attributing the original method once finished.
def self.silent
initial_method = Jekyll.logger.method(:write)
Utils.monkey_patch(Jekyll.logger, :write, proc { |*args| })
begin
yield
ensure
Utils.monkey_patch(Jekyll.logger, :write, initial_method)
end
end
# Public: Displays a log line
#
# line - Line to display. Expected to be of the following format:
# "X:Your content"
# Where X is either I, W or E for marking respectively an info, warning or
# error display
def self.log(line)
type, content = /^(I|W|E):(.*)/.match(line).captures
logger_mapping = {
'E' => :error,
'I' => :info,
'W' => :warn
}
# Jekyll logger tries to center log lines, so we force a consistent
# width of 80 chars
content = content.ljust(80, ' ')
Jekyll.logger.send(logger_mapping[type], content)
end
# Public: Only display a log line if verbose mode is enabled
#
# line - The line to display, following the same format as .log
def self.verbose(line)
return unless Configurator.verbose?
log(line)
end
# Public: Write the specified content to a file in the source directory
#
# filename - the file basename
# content - the actual content of the file
def self.write_to_file(filename, content)
filepath = File.join(Configurator.get('source'), filename)
File.write(filepath, content)
filepath
end
# Public: Displays a helpful error message for one of the knows errors
#
# message_id: A string identifying a know message
# metadata: Hash of variables that can be used in the final text
#
# It will read files in ./errors/*.txt with the matching error and
# display them using Jekyll internal logger.
def self.known_message(message_id, metadata = {})
file = File.expand_path(
File.join(
__dir__, '../..', 'errors', "#{message_id}.txt"
)
)
# Convert all variables
content = File.open(file).read
metadata.each do |key, value|
content = content.gsub("{#{key}}", value)
end
# Display each line differently
lines = content.each_line.map(&:chomp)
lines.each do |line|
log(line)
end
end
end
end
end