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