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