94 lines
2.9 KiB
Ruby
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
|