resources/asciidoctor/lib/alternative_language_lookup/extension.rb (72 lines of code) (raw):
# frozen_string_literal: true
require 'asciidoctor/extensions'
require 'csv'
require 'digest/murmurhash'
require_relative '../log_util'
require_relative '../scaffold'
require_relative 'converter'
require_relative 'listing'
require_relative 'lookup'
require_relative 'report'
require_relative 'summary'
##
# Extension to add "alternative" languages to language examples.
module AlternativeLanguageLookup
def self.activate(registry)
registry.treeprocessor AlternativeLanguageLookup
DelegatingConverter.setup(registry.document) { |d| Converter.new d }
end
##
# TreeProcessor extension find alternative languages for snippets.
class AlternativeLanguageLookup < TreeProcessorScaffold
include LogUtil
def process(document)
lookups_string = document.attr 'alternative_language_lookups'
return unless lookups_string
if lookups_string.is_a? String
document.attributes['alternative_language_lookups'] =
parse_lookups lookups_string
end
summary = setup_summary document
handle_report(document) { super }
summary&.save
end
def parse_lookups(lookups_string)
lookups = {}
CSV.parse lookups_string do |source_lang, alternative_lang, dir|
lookup = Lookup.new(source_lang, alternative_lang, dir)
next unless lookup.valid
next if duplicate_lookup? lookups, lookup
lookups[source_lang] ||= []
lookups[source_lang] << lookup
end
lookups
end
def duplicate_lookup?(lookups, lookup)
alts = lookups[lookup.source_lang]&.map(&:alternative_lang)
return false unless alts&.include? lookup.alternative_lang
error message: <<~LOG.strip
invalid alternative_language_lookups, duplicate alternative_lang [#{lookup.alternative_lang}]
LOG
true
end
def setup_summary(document)
summary_path = document.attr 'alternative_language_summary'
return unless summary_path.is_a? String
lookups = document.attr 'alternative_language_lookups'
summary = Summary.new summary_path, lookups
document.attributes['alternative_language_summary'] = summary
summary
end
def handle_report(document)
report_path = document.attr 'alternative_language_report'
if report_path&.is_a? String
Report.open report_path do |report|
document.attributes['alternative_language_report'] = report
yield
end
else
yield
end
end
def process_block(block)
return unless block.context == :listing && block.style == 'source'
Listing.new(block).process
end
end
end