class BibTeX::Bibliography

Public Instance Methods

unify_interactively(field) { || ... } click to toggle source
# File lib/bibtex_cleaner.rb, line 64
def unify_interactively(field)
  elements = entries.values
  todo = elements.clone

  elements.each do |prime|
    next unless todo.include?(prime)
    if prime.respond_to?(field) && prime.send(field)
      primevalue = prime.send(field).to_s
      todo.delete(prime)

      es = todo.select do |e|
        e.respond_to?(field) && Levenshtein.normalized_distance(
          e.send(field).to_s.downcase.gsub(/[^A-Za-z]/, "").split.sort.join(" "),
          primevalue.downcase.gsub(/[^A-Za-z]/, "").split.sort.join(" ")) < 0.4
      end

      if (es + [prime]).uniq { |e| e.send(field).to_s }.size > 1
        puts "#{field}: #{primevalue}"
        puts "These seem similar -- write (comma separated) which entries do belong in this list (or press return to skip all)"
        es.each_with_index do |e, i|
          puts "[#{i}] #{e.send(field)}"
        end
        answer = Readline.readline.strip
        unless answer.empty?
          rejects = answer.strip.split(",").map(&:strip).map(&:to_i)
          es = es.each_with_index.select do |(e, idx)|
            rejects.include? idx
          end.map(&:first)
        else
          es = []
        end
      end

      puts "Now, enter the desired common writing for this, press return to keep all values as they are, enter '.' to apply the prime writing"
      puts "#{primevalue}"
      es.each_with_index do |e, i|
        puts "#{e.send(field)}"
      end
      answer = Readline.readline("", true).strip
      unless answer.empty?
        if answer == "."
          answer = primevalue
        else
          prime.send("#{field}=", answer)
        end
        es.each do |e|
          e.send("#{field}=", answer)
          todo.delete(e)
        end
      end
      puts "\n\n"
      yield if block_given?
    end
  end
end