lib/defmastership/change_ref_modifier.rb in defmastership-1.0.17 vs lib/defmastership/change_ref_modifier.rb in defmastership-1.0.18

- old
+ new

@@ -1,17 +1,99 @@ # Copyright (c) 2020 Jerome Arbez-Gindre # frozen_string_literal: true -require 'defmastership/modifier_base' +require 'defmastership/constants' +require 'defmastership/modifier' module DefMastership - # Change all refs of a given project - class ChangeRefModifier < ModifierBase - def replacements + # Change references from temporary to definitive with multiple RefChangers + class ChangeRefModifier + include Modifier + + REGEXP_FROM = { + definition: { + before: DMRegexp::DEF_BEFORE_REF, + after: DMRegexp::DEF_AFTER_REF + }, + iref: { + before: DMRegexp::IREF_DEF_BEF, + after: DMRegexp::IREF_DEF_AFT + } + }.freeze + + private_constant :REGEXP_FROM + + def self.replacement_methods %i[replace_refdef replace_irefs] end - def new_line_modifier(config, _adoc_texts) - ChangeRefLineModifier.from_config(config) + def self.default_config + { + from_regexp: '', + to_template: '', + next_ref: 0 + } + end + + def initialize(config) + @parsing_state = ParsingState.new + + setup_modifier_module(config) + end + + def replace(method, line) + public_send(:"replace_#{method}", line) + end + + def replace_refdef(line) + if @parsing_state.enabled?(line) + do_replace_refdef(line) + else + line + end + end + + def replace_irefs(line) + changes.reduce(line) do |res_line, (from, to)| + res_line.gsub(Helper.regexp_from(:iref, from)) do + Helper.text_with(Regexp.last_match, to) + end + end + end + + private + + def do_replace_refdef(line) + line.sub(Helper.regexp_from(:definition, from_regexp)) do + replacement_from(Regexp.last_match) + end + end + + def replacement_from(match) + replacement = to_template % hmerge(match) + changes << [match[:from], replacement] + config[:next_ref] += 1 + Helper.text_with(match, replacement) + end + + def hmerge(match) + config.merge(match.named_captures.transform_keys(&:to_sym)) + end + + # Helper functions + module Helper + def self.regexp_from(const, from) + regexps = REGEXP_FROM.fetch(const) + regexp_str = + "(?<before>#{regexps[:before]})" \ + "(?<from>#{from})" \ + "#{DMRegexp::DEF_VERSION_AND_CHECKSUM}" \ + "(?<after>#{regexps[:after]})" + Regexp.new(regexp_str, Regexp::EXTENDED) + end + + def self.text_with(match, replacement) + match[:before] + replacement + (match[:version_and_checksum] || '') + match[:after] + end end end end