resources/asciidoctor/lib/alternative_language_lookup/lookup.rb (64 lines of code) (raw):
# frozen_string_literal: true
require_relative '../log_util'
module AlternativeLanguageLookup
##
# Configuration about where to lookup snippets for a particular
# alternative language.
class Lookup
include LogUtil
attr_reader :source_lang
attr_reader :alternative_lang
attr_reader :index
attr_reader :valid
def initialize(source_lang, alternative_lang, dir)
@source_lang = source_lang
@alternative_lang = alternative_lang
@dir = dir
@valid = true
validate_source_lang
validate_alternative_lang
validate_dir
@index = build_index if @valid
end
##
# The alternative language, modified if this is a result.
def alternative_lang_for(is_result)
if is_result
alternative_lang + '-result'
else
alternative_lang
end
end
##
# Build a hash indexing all `adoc` and `asciidoc` files in all
# subdirectories of @dir.
def build_index
to_index = [@dir]
index = {}
while (dir = to_index.shift)
Dir.new(dir).each { |entry| index_entry to_index, index, dir, entry }
end
index
end
def index_entry(to_index, index, dir, entry)
return if ['.', '..'].include? entry
path = File.join dir, entry
if File.directory? path
to_index << path
else
extension = File.extname path
return unless ['.asciidoc', '.adoc'].include? extension
basename = File.basename path, extension
index[basename] = { path: path }
end
end
def validate_source_lang
return if @source_lang
error message: 'invalid alternative_language_lookups, no source_lang'
@valid = false
end
def validate_alternative_lang
return if @alternative_lang
error message: 'invalid alternative_language_lookups, no alternative_lang'
@valid = false
end
def validate_dir
return if Dir.exist? @dir
error message: <<~ERR.strip
invalid alternative_language_lookups, [#{@dir}] doesn't exist
ERR
@valid = false
end
end
end