# coding: utf-8 require 'asciidoctor/extensions' require_relative 'translator' module Asciidoctor module I18n class Processor < Extensions::Treeprocessor def process(document) translator = Translator.new(document.attributes) process_document(document, translator) translator.save end def process_document(document, translator) document.find_by.each do |src| process_abstract_block(src, translator) if src.is_a?(Asciidoctor::AbstractBlock) process_block(src, translator) if src.is_a?(Asciidoctor::Block) process_table(src, translator) if src.is_a?(Asciidoctor::Table) process_list_item(src, translator) if src.is_a?(Asciidoctor::ListItem) end end private def process_abstract_block(src, translator) return unless src.title src.title = translator.translate(src.title) end def process_block(src, translator) src.lines = translator.translate(concatenated_lines(src, src.lines)) end def process_table(src, translator) (src.rows.head + src.rows.body).each do |row| row.each do |cell| process_table_cell(cell, translator) end end end def process_list_item(src, translator) raw = src.instance_variable_get(:@text) return unless raw text = concatenated_lines(src, raw.split("\n")).join("\n") src.text = translator.translate(text) end def process_table_cell(src, translator) if src.style != :asciidoc text = src.instance_variable_get(:@text) return unless text src.text = translator.translate(text) else process_document(src.inner_document, translator) end end # concat continuous lines if no hard line break exists def concatenated_lines(src, lines) return lines if skip_concatenate?(src, lines) result = [lines.first] lines.drop(1).each do |line| if line_break?(src, result.last, line) result.push(line) else result[-1] = result[-1] + " #{line}" end end result end def skip_concatenate?(src, lines) lines.empty? || !%i[simple compound].include?(src.content_model) end def line_break?(src, prev_line, next_line) content = src.apply_subs("#{prev_line}\n#{next_line}", src.subs) content.gsub(/
\s*$/).include?('
') end end end end