lib/i15r.rb in i15r-0.4.4 vs lib/i15r.rb in i15r-0.5.0

- old
+ new

@@ -1,6 +1,91 @@ -require 'i15r/base' require 'i15r/pattern_matcher' -require 'i15r/version' -module I15R +class I15R + class AppFolderNotFound < Exception; end + + class Config + def initialize(config) + @options = config + end + + def prefix + @options.fetch(:prefix, nil) + end + + def dry_run? + @options.fetch(:dry_run, false) + end + + def add_default + @options.fetch(:add_default, true) + end + end + + attr_reader :config + + def initialize(reader, writer, printer, config={}) + @reader = reader + @writer = writer + @printer = printer + @config = I15R::Config.new(config) + end + + def config=(hash) + @config = I15R::Config.new(hash) + end + + def file_path_to_message_prefix(file) + segments = File.expand_path(file).split('/').reject { |segment| segment.empty? } + subdir = %w(views helpers controllers models).find do |app_subdir| + segments.index(app_subdir) + end + if subdir.nil? + raise AppFolderNotFound, "No app. subfolders were found to determine prefix. Path is #{File.expand_path(file)}" + end + first_segment_index = segments.index(subdir) + 1 + file_name_without_extensions = segments.last.split('.').first + if file_name_without_extensions and file_name_without_extensions[0] == '_' + file_name_without_extensions = file_name_without_extensions[1..-1] + end + path_segments = segments.slice(first_segment_index...-1) + if path_segments.empty? + file_name_without_extensions + else + "#{path_segments.join('.')}.#{file_name_without_extensions}" + end + end + + def internationalize_file(path) + text = @reader.read(path) + prefix = config.prefix || file_path_to_message_prefix(path) + template_type = path[/(?:.*)\.(.*)$/, 1] + @printer.println("#{path}:") + @printer.println("") + i18ned_text = sub_plain_strings(text, prefix, template_type.to_sym) + @writer.write(path, i18ned_text) unless config.dry_run? + end + + def display_indented_header(prefix) + puts "en:" + prefix_parts = prefix.split(".").each_with_index do |p, i| + p = "#{p}:" + #TODO: perhaps " "*i is simpler + (0..i).each { |i| p = " " + p } + puts "#{p}" + end + end + + def sub_plain_strings(text, prefix, file_type) + pm = I15R::PatternMatcher.new(prefix, file_type, :add_default => config.add_default) + transformed_text = pm.run(text) do |old_line, new_line| + @printer.print_diff(old_line, new_line) + end + transformed_text + "\n" + end + + def internationalize!(path) + #TODO: Indicate if we're running in dry-run mode + files = File.directory?(path) ? Dir.glob("#{path}/**/*.{erb,haml}") : [path] + files.each { |file| internationalize_file(file) } + end end