konjac 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.md +4 -4
- data/konjac.gemspec +5 -3
- data/lib/konjac/cli.rb +92 -72
- data/lib/konjac/dictionary.rb +38 -11
- data/lib/konjac/exception.rb +0 -1
- data/lib/konjac/translator.rb +24 -6
- data/lib/konjac/utils.rb +12 -0
- data/lib/konjac/version.rb +1 -1
- data/lib/konjac/word.rb +84 -80
- data/spec/cli_spec.rb +7 -17
- data/spec/dictionary_spec.rb +3 -3
- data/spec/language_spec.rb +6 -0
- data/spec/utils_spec.rb +49 -0
- metadata +44 -24
- data/lib/konjac/cli/sub_command.rb +0 -20
- data/lib/konjac/cli/sub_command_manager.rb +0 -77
    
        data/README.md
    CHANGED
    
    | @@ -53,20 +53,20 @@ Usage | |
| 53 53 |  | 
| 54 54 | 
             
            Translate all text files in the current directory from Japanese into English:
         | 
| 55 55 |  | 
| 56 | 
            -
                konjac translate *.txt from japanese to english
         | 
| 56 | 
            +
                konjac translate *.txt --from japanese --to english
         | 
| 57 57 |  | 
| 58 58 | 
             
            Utilize a document's implied language (English) and translate into Japanese:
         | 
| 59 59 |  | 
| 60 | 
            -
                konjac translate test_en.txt  | 
| 60 | 
            +
                konjac translate test_en.txt --to japanese
         | 
| 61 61 |  | 
| 62 62 | 
             
            Use multiple dictionaries:
         | 
| 63 63 |  | 
| 64 | 
            -
                konjac translate financial_report_en.txt  | 
| 64 | 
            +
                konjac translate financial_report_en.txt --to japanese --using finance
         | 
| 65 65 |  | 
| 66 66 | 
             
            Extract text from a DOCX document (creates a plain-text `test.konjac` file from
         | 
| 67 67 | 
             
            `test.docx`):
         | 
| 68 68 |  | 
| 69 | 
            -
                konjac  | 
| 69 | 
            +
                konjac export test
         | 
| 70 70 |  | 
| 71 71 | 
             
            Import tags file back into DOCX document (file created is named
         | 
| 72 72 | 
             
            `test_imported.docx`):
         | 
    
        data/konjac.gemspec
    CHANGED
    
    | @@ -19,10 +19,12 @@ Gem::Specification.new do |s| | |
| 19 19 | 
             
              s.require_paths = ["lib"]
         | 
| 20 20 |  | 
| 21 21 | 
             
              s.add_runtime_dependency "nokogiri"
         | 
| 22 | 
            -
              s. | 
| 23 | 
            -
              s. | 
| 24 | 
            -
              s.add_development_dependency "sdoc"
         | 
| 22 | 
            +
              s.add_runtime_dependency "term-ansicolor"
         | 
| 23 | 
            +
              s.add_runtime_dependency "trollop"
         | 
| 25 24 | 
             
              s.add_development_dependency "autotest"
         | 
| 26 25 | 
             
              s.add_development_dependency "autotest-fsevent"
         | 
| 27 26 | 
             
              s.add_development_dependency "autotest-growl"
         | 
| 27 | 
            +
              s.add_development_dependency "bundler"
         | 
| 28 | 
            +
              s.add_development_dependency "rspec"
         | 
| 29 | 
            +
              s.add_development_dependency "sdoc"
         | 
| 28 30 | 
             
            end
         | 
    
        data/lib/konjac/cli.rb
    CHANGED
    
    | @@ -1,94 +1,114 @@ | |
| 1 | 
            +
            require "term/ansicolor"
         | 
| 2 | 
            +
            require "trollop"
         | 
| 3 | 
            +
             | 
| 1 4 | 
             
            module Konjac
         | 
| 2 5 | 
             
              module CLI
         | 
| 3 | 
            -
                 | 
| 4 | 
            -
             | 
| 6 | 
            +
                class Color
         | 
| 7 | 
            +
                  extend Term::ANSIColor
         | 
| 8 | 
            +
                end
         | 
| 5 9 |  | 
| 6 10 | 
             
                class << self
         | 
| 7 | 
            -
                   | 
| 8 | 
            -
                     | 
| 9 | 
            -
                     | 
| 10 | 
            -
             | 
| 11 | 
            -
                     | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
                    @valid_commands.add :import, [:i, :m], "Import text back into a DOCX file" do
         | 
| 16 | 
            -
                      Word.import_docx_tags(ARGV)
         | 
| 17 | 
            -
                    end
         | 
| 18 | 
            -
                    @valid_commands.add :translate, [:t], "Translate a file" do
         | 
| 19 | 
            -
                      translate
         | 
| 20 | 
            -
                    end
         | 
| 21 | 
            -
                  end
         | 
| 11 | 
            +
                  SUB_COMMANDS = {
         | 
| 12 | 
            +
                    "edit"      => "Edit the tags file for a .docx file",
         | 
| 13 | 
            +
                    "export"    => "Export text tags from a .docx file",
         | 
| 14 | 
            +
                    "import"    => "Import text tags into a .docx file",
         | 
| 15 | 
            +
                    "translate" => "Translate a file according to ~/.konjac/dict.yml"
         | 
| 16 | 
            +
                  }
         | 
| 17 | 
            +
                  BANNER = <<-eos
         | 
| 18 | 
            +
            #{Color.bold "%s"}
         | 
| 22 19 |  | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 20 | 
            +
            #{Color.bold "Usage:"}
         | 
| 21 | 
            +
                   konjac %s [#{Color.underscore "options"}] <filenames>+%s
         | 
| 22 | 
            +
            where [#{Color.underscore "options"}] are:
         | 
| 23 | 
            +
            eos
         | 
| 26 24 |  | 
| 27 | 
            -
             | 
| 28 | 
            -
                     | 
| 29 | 
            -
             | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 32 | 
            -
             | 
| 33 | 
            -
             | 
| 25 | 
            +
                  def start
         | 
| 26 | 
            +
                    global_opts = Trollop::options do
         | 
| 27 | 
            +
                      version "konjac #{Konjac::VERSION} (c) 2012 Bryan McKelvey"
         | 
| 28 | 
            +
                      banner BANNER % [
         | 
| 29 | 
            +
                        "konjac is a Ruby command-line utility for translating files " +
         | 
| 30 | 
            +
                          "using a YAML wordlist",
         | 
| 31 | 
            +
                        "[#{Color.underscore "subcommand"}]",
         | 
| 32 | 
            +
                        "\n\nwhere [#{Color.underscore "subcommand"}] is any one of:\n%s\n" %
         | 
| 33 | 
            +
                          Konjac::CLI.describe_subcommands
         | 
| 34 | 
            +
                      ]
         | 
| 35 | 
            +
                      opt :dry_run, "Don't actually do anything", :short => "n"
         | 
| 36 | 
            +
                      opt :quiet, "Suppress error messages"
         | 
| 37 | 
            +
                      stop_on SUB_COMMANDS.keys
         | 
| 34 38 | 
             
                    end
         | 
| 35 39 |  | 
| 36 | 
            -
                     | 
| 40 | 
            +
                    # Get subcommand
         | 
| 41 | 
            +
                    cmd = ARGV.shift
         | 
| 42 | 
            +
                    sc_banner = BANNER % [SUB_COMMANDS[cmd], cmd, ""]
         | 
| 43 | 
            +
                    cmd_opts = case cmd
         | 
| 44 | 
            +
                      when "edit"
         | 
| 45 | 
            +
                        Trollop::options do
         | 
| 46 | 
            +
                          banner sc_banner
         | 
| 47 | 
            +
                          opt :editor, "A command indicating which editor to use (e.g. vi %s)"
         | 
| 48 | 
            +
                        end
         | 
| 49 | 
            +
                        Word.edit_docx_tags ARGV, opts
         | 
| 50 | 
            +
                      when "extract", "export"
         | 
| 51 | 
            +
                        Trollop::options do
         | 
| 52 | 
            +
                          banner sc_banner
         | 
| 53 | 
            +
                        end
         | 
| 54 | 
            +
                        Word.extract_docx_tags ARGV
         | 
| 55 | 
            +
                      when "import"
         | 
| 56 | 
            +
                        Trollop::options do
         | 
| 57 | 
            +
                          banner sc_banner
         | 
| 58 | 
            +
                        end
         | 
| 59 | 
            +
                        Word.import_docx_tags ARGV
         | 
| 60 | 
            +
                      when "translate"
         | 
| 61 | 
            +
                        opts = Trollop::options do
         | 
| 62 | 
            +
                          banner sc_banner
         | 
| 63 | 
            +
                          opt :from, "The language from which to translate", :type => :string
         | 
| 64 | 
            +
                          opt :to, "The language into which to translate", :type => :string
         | 
| 65 | 
            +
                          opt :using, "The names of dictionaries to use", :type => :string,
         | 
| 66 | 
            +
                            :default => "dict", :multi => true
         | 
| 67 | 
            +
                          opt :use_cache, "Use cached dictionary", :default => false
         | 
| 68 | 
            +
                          opt :word, "Translate a word or phrase", :default => false
         | 
| 69 | 
            +
                        end
         | 
| 70 | 
            +
                        result = translate(ARGV, opts)
         | 
| 71 | 
            +
                        puts result if opts[:word]
         | 
| 72 | 
            +
                      else
         | 
| 73 | 
            +
                        Trollop::die "unknown subcommand #{cmd.inspect}"
         | 
| 74 | 
            +
                    end
         | 
| 37 75 | 
             
                  end
         | 
| 38 76 |  | 
| 39 | 
            -
                   | 
| 40 | 
            -
             | 
| 77 | 
            +
                  # Describe the subcommands available to the command line interface
         | 
| 78 | 
            +
                  def describe_subcommands
         | 
| 79 | 
            +
                    text = []
         | 
| 80 | 
            +
                    leftcol_width = SUB_COMMANDS.keys.map(&:length).max
         | 
| 81 | 
            +
                    SUB_COMMANDS.each do |sc, desc|
         | 
| 82 | 
            +
                      text << "  %#{leftcol_width}s:   %s" % [sc, desc]
         | 
| 83 | 
            +
                    end
         | 
| 84 | 
            +
                    text.join "\n"
         | 
| 41 85 | 
             
                  end
         | 
| 42 86 |  | 
| 43 87 | 
             
                  private
         | 
| 88 | 
            +
                  
         | 
| 89 | 
            +
                  def translate(files, opts = {})
         | 
| 90 | 
            +
                    to_lang = Language.find(opts[:to]).to_s
         | 
| 44 91 |  | 
| 45 | 
            -
             | 
| 46 | 
            -
             | 
| 47 | 
            -
             | 
| 48 | 
            -
                    unless using_index.nil?
         | 
| 49 | 
            -
                      ARGV.delete_at using_index
         | 
| 50 | 
            -
                      dictionaries = []
         | 
| 51 | 
            -
                      while ARGV.length > using_index && !["from", "to", "into"].include?(ARGV[using_index])
         | 
| 52 | 
            -
                        dictionaries << ARGV.delete_at(using_index)
         | 
| 53 | 
            -
                      end
         | 
| 54 | 
            -
                    end
         | 
| 55 | 
            -
                    
         | 
| 56 | 
            -
                    # Get from language
         | 
| 57 | 
            -
                    from_index = ARGV.index("from")
         | 
| 58 | 
            -
                    unless from_index.nil?
         | 
| 59 | 
            -
                      ARGV.delete_at from_index
         | 
| 60 | 
            -
                      from_lang = ARGV.delete_at(from_index)
         | 
| 61 | 
            -
                    end
         | 
| 62 | 
            -
                    
         | 
| 63 | 
            -
                    # Get to language
         | 
| 64 | 
            -
                    to_index = ARGV.index("to") || ARGV.index("into")
         | 
| 65 | 
            -
                    if to_index.nil?
         | 
| 66 | 
            -
                      raise InvalidLanguageError.new("You must supply a to language")
         | 
| 92 | 
            +
                    if opts[:word]
         | 
| 93 | 
            +
                      from_lang = Language.find(opts[:from]).to_s
         | 
| 94 | 
            +
                      Translator.translate_word ARGV[0].dup, from_lang, to_lang, opts
         | 
| 67 95 | 
             
                    else
         | 
| 68 | 
            -
                       | 
| 69 | 
            -
                       | 
| 70 | 
            -
             | 
| 71 | 
            -
             | 
| 72 | 
            -
                    # Get a list of files to translate
         | 
| 73 | 
            -
                    files = []
         | 
| 74 | 
            -
                    while !ARGV.empty?
         | 
| 75 | 
            -
                      files += Dir.glob(File.expand_path(ARGV.shift))
         | 
| 76 | 
            -
                    end
         | 
| 77 | 
            -
                    raise FileNotFoundError.new("File not found") if files.empty?
         | 
| 78 | 
            -
                    files.uniq!
         | 
| 96 | 
            +
                      # Get a list of files to translate
         | 
| 97 | 
            +
                      parsed_files = Utils.parse_files(files)
         | 
| 98 | 
            +
                      raise FileNotFoundError.new("File not found") if parsed_files.empty?
         | 
| 79 99 |  | 
| 80 | 
            -
             | 
| 81 | 
            -
             | 
| 82 | 
            -
             | 
| 83 | 
            -
             | 
| 84 | 
            -
             | 
| 100 | 
            +
                      # Determine from language from first filename if not supplied
         | 
| 101 | 
            +
                      if opts[:from].nil?
         | 
| 102 | 
            +
                        opts[:from] = Utils.extract_language_code_from_filename(parsed_files[0])
         | 
| 103 | 
            +
                        if opts[:from].nil?
         | 
| 104 | 
            +
                          raise InvalidLanguageError.new("You must supply a from language")
         | 
| 105 | 
            +
                        end
         | 
| 85 106 | 
             
                      end
         | 
| 86 | 
            -
                    end
         | 
| 87 107 |  | 
| 88 | 
            -
             | 
| 89 | 
            -
                    to_lang   = Language.find(to_lang).to_s
         | 
| 108 | 
            +
                      from_lang = Language.find(opts[:from]).to_s
         | 
| 90 109 |  | 
| 91 | 
            -
             | 
| 110 | 
            +
                      Translator.translate_files parsed_files, from_lang, to_lang, opts
         | 
| 111 | 
            +
                    end
         | 
| 92 112 | 
             
                  end
         | 
| 93 113 | 
             
                end
         | 
| 94 114 | 
             
              end
         | 
    
        data/lib/konjac/dictionary.rb
    CHANGED
    
    | @@ -7,28 +7,29 @@ module Konjac | |
| 7 7 |  | 
| 8 8 | 
             
                  BLANK = /^\s*$/
         | 
| 9 9 |  | 
| 10 | 
            -
                  def load(from_lang, to_lang,  | 
| 11 | 
            -
                    # Set defaults for optional arguments
         | 
| 12 | 
            -
                    opts = { :force => false }.merge(opts)
         | 
| 13 | 
            -
                    dictionaries = ["dict"] if dictionaries.nil?
         | 
| 14 | 
            -
                    
         | 
| 10 | 
            +
                  def load(from_lang, to_lang, opts = {})
         | 
| 15 11 | 
             
                    # Allow both symbol and string arguments for languages
         | 
| 16 12 | 
             
                    from_lang = from_lang.to_s
         | 
| 17 13 | 
             
                    to_lang   = to_lang.to_s
         | 
| 18 14 |  | 
| 19 15 | 
             
                    # Ignore everything if we've been here before
         | 
| 20 | 
            -
                    return @pairs if loaded?(from_lang, to_lang,  | 
| 16 | 
            +
                    return @pairs if loaded?(from_lang, to_lang, opts[:using])
         | 
| 17 | 
            +
             | 
| 18 | 
            +
                    if opts[:use_cache]
         | 
| 19 | 
            +
                      @pairs = load_serialized(from_lang, to_lang, opts[:using])
         | 
| 20 | 
            +
                      return @pairs unless @pairs.nil?
         | 
| 21 | 
            +
                    end
         | 
| 21 22 |  | 
| 22 23 | 
             
                    # Build a regex template for the from language
         | 
| 23 24 | 
             
                    from_template = build_regex_template(from_lang)
         | 
| 24 25 | 
             
                    to_template   = build_replacement_template(from_lang, to_lang)
         | 
| 25 26 |  | 
| 26 27 | 
             
                    # Save variables to cache so we can avoid repetitive requests
         | 
| 27 | 
            -
                    cache_load from_lang, to_lang,  | 
| 28 | 
            +
                    cache_load from_lang, to_lang, opts[:using]
         | 
| 28 29 |  | 
| 29 30 | 
             
                    # Make sure dictionary exists and load
         | 
| 30 31 | 
             
                    @dictionary = []
         | 
| 31 | 
            -
                     | 
| 32 | 
            +
                    opts[:using].each do |dict|
         | 
| 32 33 | 
             
                      if dict =~ /[\/.]/
         | 
| 33 34 | 
             
                        sub_dictionaries = Dir.glob(File.expand_path(dict))
         | 
| 34 35 | 
             
                      else
         | 
| @@ -49,6 +50,7 @@ module Konjac | |
| 49 50 | 
             
                      @pairs << pair unless pair.nil?
         | 
| 50 51 | 
             
                    end
         | 
| 51 52 |  | 
| 53 | 
            +
                    save_serialized from_lang, to_lang, dictionaries, @pairs
         | 
| 52 54 | 
             
                    @pairs
         | 
| 53 55 | 
             
                  end
         | 
| 54 56 |  | 
| @@ -104,9 +106,10 @@ module Konjac | |
| 104 106 | 
             
                  # Tests whether the same from language, to language and dictionary path
         | 
| 105 107 | 
             
                  # have been loaded before
         | 
| 106 108 | 
             
                  def loaded?(from_lang, to_lang, dictionaries)
         | 
| 107 | 
            -
                    (@from_lang    == from_lang) &&
         | 
| 108 | 
            -
                    (@to_lang      == to_lang | 
| 109 | 
            -
                    (@dictionaries == dictionaries)
         | 
| 109 | 
            +
                    (@from_lang    == from_lang   ) &&
         | 
| 110 | 
            +
                    (@to_lang      == to_lang     ) &&
         | 
| 111 | 
            +
                    (@dictionaries == dictionaries) &&
         | 
| 112 | 
            +
                    !@pairs.nil?
         | 
| 110 113 | 
             
                  end
         | 
| 111 114 |  | 
| 112 115 | 
             
                  # Builds a regular expression template for the language depending on
         | 
| @@ -152,6 +155,30 @@ module Konjac | |
| 152 155 | 
             
                    @to_lang      = to_lang
         | 
| 153 156 | 
             
                    @dictionaries = dictionaries
         | 
| 154 157 | 
             
                  end
         | 
| 158 | 
            +
                  
         | 
| 159 | 
            +
                  def load_serialized(from_lang, to_lang, dictionaries)
         | 
| 160 | 
            +
                    file_name = File.expand_path("~/.konjac/marshal/%s_%s_%s" %
         | 
| 161 | 
            +
                      [from_lang, to_lang, dictionaries.join("_")])
         | 
| 162 | 
            +
                    if File.exists?(file_name)
         | 
| 163 | 
            +
                      Marshal.load file_name
         | 
| 164 | 
            +
                    else
         | 
| 165 | 
            +
                      nil
         | 
| 166 | 
            +
                    end
         | 
| 167 | 
            +
                  end
         | 
| 168 | 
            +
             | 
| 169 | 
            +
                  def save_serialized(from_lang, to_lang, dictionaries, pairs)
         | 
| 170 | 
            +
                    file_name = File.expand_path("~/.konjac/marshal/%s_%s_%s" %
         | 
| 171 | 
            +
                      [from_lang, to_lang, dictionaries.join("_")])
         | 
| 172 | 
            +
             | 
| 173 | 
            +
                    # Create directory structure if necessary
         | 
| 174 | 
            +
                    unless File.exists?(file_name)
         | 
| 175 | 
            +
                      FileUtils.mkdir_p File.dirname(file_name)
         | 
| 176 | 
            +
                    end
         | 
| 177 | 
            +
             | 
| 178 | 
            +
                    File.open(file_name, "w") do |file|
         | 
| 179 | 
            +
                      Marshal.dump(pairs, file)
         | 
| 180 | 
            +
                    end
         | 
| 181 | 
            +
                  end
         | 
| 155 182 | 
             
                end
         | 
| 156 183 | 
             
              end
         | 
| 157 184 | 
             
            end
         | 
    
        data/lib/konjac/exception.rb
    CHANGED
    
    
    
        data/lib/konjac/translator.rb
    CHANGED
    
    | @@ -2,16 +2,13 @@ | |
| 2 2 | 
             
            module Konjac
         | 
| 3 3 | 
             
              module Translator
         | 
| 4 4 | 
             
                class << self
         | 
| 5 | 
            -
                  def  | 
| 6 | 
            -
                     | 
| 5 | 
            +
                  def translate_files(files, from_lang, to_lang, opts = {})
         | 
| 6 | 
            +
                    load_dictionary from_lang, to_lang, opts
         | 
| 7 7 |  | 
| 8 8 | 
             
                    files.each do |source|
         | 
| 9 9 | 
             
                      # Read in file and replace matches in content
         | 
| 10 10 | 
             
                      content = File.read(source)
         | 
| 11 | 
            -
                       | 
| 12 | 
            -
                        search, replace = pair
         | 
| 13 | 
            -
                        content.gsub! search, replace
         | 
| 14 | 
            -
                      end
         | 
| 11 | 
            +
                      content = translate_content(content)
         | 
| 15 12 |  | 
| 16 13 | 
             
                      # Write changed content to file
         | 
| 17 14 | 
             
                      File.open(Utils.build_converted_file_name(source, from_lang, to_lang), "w") do |file|
         | 
| @@ -19,6 +16,27 @@ module Konjac | |
| 19 16 | 
             
                      end
         | 
| 20 17 | 
             
                    end
         | 
| 21 18 | 
             
                  end
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                  def translate_word(word, from_lang, to_lang, opts = {})
         | 
| 21 | 
            +
                    load_dictionary from_lang, to_lang, opts
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                    translate_content word
         | 
| 24 | 
            +
                  end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                  def translate_content(content)
         | 
| 27 | 
            +
                    @pairs.each do |pair|
         | 
| 28 | 
            +
                      search, replace = pair
         | 
| 29 | 
            +
                      content.gsub! search, replace
         | 
| 30 | 
            +
                    end
         | 
| 31 | 
            +
             | 
| 32 | 
            +
                    content
         | 
| 33 | 
            +
                  end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                  private
         | 
| 36 | 
            +
             | 
| 37 | 
            +
                  def load_dictionary(from_lang, to_lang, opts)
         | 
| 38 | 
            +
                    @pairs = Dictionary.load(from_lang, to_lang, opts)
         | 
| 39 | 
            +
                  end
         | 
| 22 40 | 
             
                end
         | 
| 23 41 | 
             
              end
         | 
| 24 42 | 
             
            end
         | 
    
        data/lib/konjac/utils.rb
    CHANGED
    
    | @@ -24,6 +24,18 @@ module Konjac | |
| 24 24 |  | 
| 25 25 | 
             
                    "#{dirname}/#{basename}_#{to_lang}#{extname}"
         | 
| 26 26 | 
             
                  end
         | 
| 27 | 
            +
                  
         | 
| 28 | 
            +
                  # Parses a list of files
         | 
| 29 | 
            +
                  def parse_files(files, ext = nil)
         | 
| 30 | 
            +
                    files = [files] unless files.is_a?(Array)
         | 
| 31 | 
            +
                    parsed_files = []
         | 
| 32 | 
            +
                    while !files.empty?
         | 
| 33 | 
            +
                      file = files.shift
         | 
| 34 | 
            +
                      file = file.sub(/\.[^\\\/]*$/, "") + ext unless ext.nil?
         | 
| 35 | 
            +
                      parsed_files += Dir.glob(File.expand_path(file))
         | 
| 36 | 
            +
                    end
         | 
| 37 | 
            +
                    parsed_files.uniq
         | 
| 38 | 
            +
                  end
         | 
| 27 39 | 
             
                end
         | 
| 28 40 | 
             
              end
         | 
| 29 41 | 
             
            end
         | 
    
        data/lib/konjac/version.rb
    CHANGED
    
    
    
        data/lib/konjac/word.rb
    CHANGED
    
    | @@ -5,103 +5,107 @@ module Konjac | |
| 5 5 | 
             
                class << self
         | 
| 6 6 | 
             
                  # Extracts the text content from a Microsoft Word 2003+ Document
         | 
| 7 7 | 
             
                  def import_docx_tags(files)
         | 
| 8 | 
            -
                    files. | 
| 9 | 
            -
             | 
| 10 | 
            -
                       | 
| 11 | 
            -
             | 
| 12 | 
            -
             | 
| 13 | 
            -
             | 
| 14 | 
            -
             | 
| 15 | 
            -
             | 
| 16 | 
            -
             | 
| 17 | 
            -
             | 
| 18 | 
            -
             | 
| 19 | 
            -
             | 
| 20 | 
            -
             | 
| 21 | 
            -
             | 
| 22 | 
            -
             | 
| 23 | 
            -
             | 
| 24 | 
            -
             | 
| 25 | 
            -
             | 
| 26 | 
            -
                         | 
| 27 | 
            -
                           | 
| 28 | 
            -
                            nodes[tag.index].content = tag.translated
         | 
| 29 | 
            -
                          end
         | 
| 8 | 
            +
                    sub_files = Utils.force_extension(files, ".docx")
         | 
| 9 | 
            +
                    sub_files.each do |sub_file|
         | 
| 10 | 
            +
                      # Build the list of paths we need to work with
         | 
| 11 | 
            +
                      dirname   = File.dirname(sub_file)
         | 
| 12 | 
            +
                      basename  = File.basename(sub_file, ".*")
         | 
| 13 | 
            +
                      orig_docx = "#{dirname}/#{basename}.docx"
         | 
| 14 | 
            +
                      new_path  = "#{dirname}/#{basename}_imported.docx"
         | 
| 15 | 
            +
                      xml_path  = "#{dirname}/#{basename}.xml"
         | 
| 16 | 
            +
                      tags_path = "#{dirname}/#{basename}.konjac"
         | 
| 17 | 
            +
                      out_path  = "#{dirname}/word/document.xml"
         | 
| 18 | 
            +
             | 
| 19 | 
            +
                      # Open the original XML file and the updated tags
         | 
| 20 | 
            +
                      writer = Nokogiri::XML(File.read(xml_path))
         | 
| 21 | 
            +
                      nodes  = writer.xpath("//w:t")
         | 
| 22 | 
            +
                      tags   = TagManager.new(tags_path)
         | 
| 23 | 
            +
             | 
| 24 | 
            +
                      # Overwrite each <w:t> tag's content with the new tag
         | 
| 25 | 
            +
                      tags.all.each do |tag|
         | 
| 26 | 
            +
                        if tag.translated?
         | 
| 27 | 
            +
                          nodes[tag.index].content = tag.translated
         | 
| 30 28 | 
             
                        end
         | 
| 29 | 
            +
                      end
         | 
| 31 30 |  | 
| 32 | 
            -
             | 
| 33 | 
            -
             | 
| 34 | 
            -
             | 
| 35 | 
            -
             | 
| 31 | 
            +
                      # Create a directory for word/document.xml if necessary
         | 
| 32 | 
            +
                      unless File.directory?("#{dirname}/word")
         | 
| 33 | 
            +
                        FileUtils.mkdir "#{dirname}/word"
         | 
| 34 | 
            +
                      end
         | 
| 36 35 |  | 
| 37 | 
            -
             | 
| 38 | 
            -
             | 
| 39 | 
            -
             | 
| 40 | 
            -
             | 
| 36 | 
            +
                      # Write the modified XML to a file
         | 
| 37 | 
            +
                      File.open(out_path, "w") do |file|
         | 
| 38 | 
            +
                        file.write writer.to_xml.gsub(/\n\s*/, "").sub(/\?></, "?>\n<")
         | 
| 39 | 
            +
                      end
         | 
| 41 40 |  | 
| 42 | 
            -
             | 
| 43 | 
            -
             | 
| 41 | 
            +
                      # Copy the original file
         | 
| 42 | 
            +
                      FileUtils.cp orig_docx, new_path
         | 
| 44 43 |  | 
| 45 | 
            -
             | 
| 46 | 
            -
             | 
| 47 | 
            -
                      end
         | 
| 44 | 
            +
                      # Add the new document XML to the copied file
         | 
| 45 | 
            +
                      system "cd #{dirname} && zip -q #{new_path} word/document.xml"
         | 
| 48 46 | 
             
                    end
         | 
| 49 47 | 
             
                  end
         | 
| 50 48 |  | 
| 51 49 | 
             
                  # Extracts the text content from a Microsoft Word 2003+ Document
         | 
| 52 50 | 
             
                  def extract_docx_tags(files)
         | 
| 53 | 
            -
                    files. | 
| 54 | 
            -
             | 
| 55 | 
            -
                       | 
| 56 | 
            -
             | 
| 57 | 
            -
             | 
| 58 | 
            -
             | 
| 59 | 
            -
             | 
| 60 | 
            -
             | 
| 61 | 
            -
             | 
| 62 | 
            -
             | 
| 63 | 
            -
             | 
| 64 | 
            -
             | 
| 65 | 
            -
             | 
| 66 | 
            -
             | 
| 67 | 
            -
             | 
| 68 | 
            -
             | 
| 69 | 
            -
             | 
| 70 | 
            -
                         | 
| 71 | 
            -
             | 
| 72 | 
            -
             | 
| 73 | 
            -
             | 
| 74 | 
            -
             | 
| 75 | 
            -
             | 
| 76 | 
            -
                           | 
| 77 | 
            -
                             | 
| 78 | 
            -
                               | 
| 79 | 
            -
                                 | 
| 80 | 
            -
                                  node.at_xpath("w:t").content | 
| 81 | 
            -
             | 
| 82 | 
            -
             | 
| 83 | 
            -
                                rescue
         | 
| 84 | 
            -
                                end
         | 
| 51 | 
            +
                    sub_files = Utils.force_extension(files, ".docx")
         | 
| 52 | 
            +
                    sub_files.each do |sub_file|
         | 
| 53 | 
            +
                      # Build a list of all the paths we're working with
         | 
| 54 | 
            +
                      dirname    = File.dirname(sub_file)
         | 
| 55 | 
            +
                      basename   = File.basename(sub_file, ".*")
         | 
| 56 | 
            +
                      orig_docx  = "#{dirname}/#{basename}.docx"
         | 
| 57 | 
            +
                      xml_path   = "#{dirname}/#{basename}_orig.xml"
         | 
| 58 | 
            +
                      clean_path = "#{dirname}/#{basename}.xml"
         | 
| 59 | 
            +
                      tags_path  = "#{dirname}/#{basename}.konjac"
         | 
| 60 | 
            +
             | 
| 61 | 
            +
                      # Unzip the DOCX's word/document.xml file and pipe the output into
         | 
| 62 | 
            +
                      # an XML with the same base name as the DOCX
         | 
| 63 | 
            +
                      system "unzip -p #{orig_docx} word/document.xml > #{xml_path}"
         | 
| 64 | 
            +
             | 
| 65 | 
            +
                      # Read in the XML file and extract the content from each <w:t> tag
         | 
| 66 | 
            +
                      cleaner = Nokogiri::XML(File.read(xml_path))
         | 
| 67 | 
            +
                      File.open(tags_path, "w") do |tags_file|
         | 
| 68 | 
            +
                        # Remove all grammar and spellcheck tags
         | 
| 69 | 
            +
                        cleaner.xpath("//w:proofErr").remove
         | 
| 70 | 
            +
             | 
| 71 | 
            +
                        nodes = cleaner.xpath("//w:r")
         | 
| 72 | 
            +
                        prev = nil
         | 
| 73 | 
            +
                        nodes.each do |node|
         | 
| 74 | 
            +
                          unless prev.nil?
         | 
| 75 | 
            +
                            if (prev.next_sibling == node) && compare_nodes(prev, node)
         | 
| 76 | 
            +
                              begin
         | 
| 77 | 
            +
                                node.at_xpath("w:t").content = prev.at_xpath("w:t").content +
         | 
| 78 | 
            +
                                  node.at_xpath("w:t").content
         | 
| 79 | 
            +
                                prev.remove
         | 
| 80 | 
            +
                              rescue
         | 
| 85 81 | 
             
                              end
         | 
| 86 82 | 
             
                            end
         | 
| 87 | 
            -
                            
         | 
| 88 | 
            -
                            prev = node
         | 
| 89 | 
            -
                          end
         | 
| 90 | 
            -
             | 
| 91 | 
            -
                          # Write the tags file
         | 
| 92 | 
            -
                          index = 0
         | 
| 93 | 
            -
                          cleaner.xpath("//w:t").each do |node|
         | 
| 94 | 
            -
                            tags_file.puts "[[KJ-%i]]%s" % [index, additional_info(node)]
         | 
| 95 | 
            -
                            tags_file.puts "> %s" % node.content
         | 
| 96 | 
            -
                            index += 1
         | 
| 97 83 | 
             
                          end
         | 
| 84 | 
            +
                          
         | 
| 85 | 
            +
                          prev = node
         | 
| 98 86 | 
             
                        end
         | 
| 99 87 |  | 
| 100 | 
            -
                        # Write the  | 
| 101 | 
            -
                         | 
| 102 | 
            -
             | 
| 88 | 
            +
                        # Write the tags file
         | 
| 89 | 
            +
                        index = 0
         | 
| 90 | 
            +
                        cleaner.xpath("//w:t").each do |node|
         | 
| 91 | 
            +
                          tags_file.puts "[[KJ-%i]]%s" % [index, additional_info(node)]
         | 
| 92 | 
            +
                          tags_file.puts "> %s" % node.content
         | 
| 93 | 
            +
                          index += 1
         | 
| 103 94 | 
             
                        end
         | 
| 104 95 | 
             
                      end
         | 
| 96 | 
            +
             | 
| 97 | 
            +
                      # Write the cleaned-up XML to a file for inspection
         | 
| 98 | 
            +
                      File.open(clean_path, "w") do |xml|
         | 
| 99 | 
            +
                        xml.puts cleaner.to_xml
         | 
| 100 | 
            +
                      end
         | 
| 101 | 
            +
                    end
         | 
| 102 | 
            +
                  end
         | 
| 103 | 
            +
             | 
| 104 | 
            +
                  # Opens the .konjac tag files for the specified DOCX files
         | 
| 105 | 
            +
                  def edit_docx_tags(files)
         | 
| 106 | 
            +
                    sub_files = Utils.force_extension(files, ".konjac")
         | 
| 107 | 
            +
                    sub_files.each do |sub_file|
         | 
| 108 | 
            +
                      system "$EDITOR #{sub_file}"
         | 
| 105 109 | 
             
                    end
         | 
| 106 110 | 
             
                  end
         | 
| 107 111 |  | 
    
        data/spec/cli_spec.rb
    CHANGED
    
    | @@ -12,7 +12,7 @@ describe CLI do | |
| 12 12 |  | 
| 13 13 | 
             
              it "should fail on an invalid subcommand" do
         | 
| 14 14 | 
             
                set_argv "invalid"
         | 
| 15 | 
            -
                lambda { CLI.start }.should raise_error  | 
| 15 | 
            +
                lambda { CLI.start }.should raise_error SystemExit
         | 
| 16 16 | 
             
              end
         | 
| 17 17 |  | 
| 18 18 | 
             
              describe "temporary files" do
         | 
| @@ -32,25 +32,15 @@ describe CLI do | |
| 32 32 | 
             
                  @english.rewind
         | 
| 33 33 |  | 
| 34 34 | 
             
                  # Set ARGV
         | 
| 35 | 
            -
                  set_argv "translate",  | 
| 36 | 
            -
                    @ | 
| 35 | 
            +
                  set_argv "translate", "-t", "japanese", "-u", @dictionary.path,
         | 
| 36 | 
            +
                    @english.path
         | 
| 37 37 | 
             
                end
         | 
| 38 38 |  | 
| 39 39 | 
             
                it "should correctly translate English text" do
         | 
| 40 | 
            -
                   | 
| 41 | 
            -
             | 
| 42 | 
            -
             | 
| 43 | 
            -
             | 
| 44 | 
            -
                    File.read(converted_path).should == "I like 犬.\n"
         | 
| 45 | 
            -
                  ensure
         | 
| 46 | 
            -
                    @dictionary.close!
         | 
| 47 | 
            -
                    @english.close!
         | 
| 48 | 
            -
                    File.delete converted_path
         | 
| 49 | 
            -
                  end
         | 
| 50 | 
            -
                end
         | 
| 51 | 
            -
             | 
| 52 | 
            -
                it "should return the name of the sub_command" do
         | 
| 53 | 
            -
                  CLI.start.should == :translate
         | 
| 40 | 
            +
                  CLI.start
         | 
| 41 | 
            +
                  converted_path = Utils.build_converted_file_name(@english.path, "en", "ja")
         | 
| 42 | 
            +
                  File.read(@english.path).should == "I like dogs."
         | 
| 43 | 
            +
                  File.read(converted_path).should == "I like 犬.\n"
         | 
| 54 44 | 
             
                end
         | 
| 55 45 | 
             
              end
         | 
| 56 46 | 
             
            end
         | 
    
        data/spec/dictionary_spec.rb
    CHANGED
    
    | @@ -37,7 +37,7 @@ describe Dictionary do | |
| 37 37 |  | 
| 38 38 | 
             
              describe "when converting from English to Japanese" do
         | 
| 39 39 | 
             
                before :each do
         | 
| 40 | 
            -
                  Dictionary.load "en", "ja", [@dictionary.path]
         | 
| 40 | 
            +
                  Dictionary.load "en", "ja", { :using => [@dictionary.path] }
         | 
| 41 41 | 
             
                end
         | 
| 42 42 |  | 
| 43 43 | 
             
                it "should correctly load a simple term" do
         | 
| @@ -68,7 +68,7 @@ describe Dictionary do | |
| 68 68 |  | 
| 69 69 | 
             
              describe "when converting from Japanese to English" do
         | 
| 70 70 | 
             
                before :each do
         | 
| 71 | 
            -
                  Dictionary.load "ja", "en", [@dictionary.path]
         | 
| 71 | 
            +
                  Dictionary.load "ja", "en", { :using => [@dictionary.path] }
         | 
| 72 72 | 
             
                end
         | 
| 73 73 |  | 
| 74 74 | 
             
                it "should add whitespace to term replacement" do
         | 
| @@ -78,7 +78,7 @@ describe Dictionary do | |
| 78 78 |  | 
| 79 79 | 
             
              describe "when converting from English to Spanish" do
         | 
| 80 80 | 
             
                before :each do
         | 
| 81 | 
            -
                  Dictionary.load "en", "es", [@dictionary.path]
         | 
| 81 | 
            +
                  Dictionary.load "en", "es", { :using => [@dictionary.path] }
         | 
| 82 82 | 
             
                end
         | 
| 83 83 |  | 
| 84 84 | 
             
                it "should not add whitespace to term replacement" do
         | 
    
        data/spec/language_spec.rb
    CHANGED
    
    | @@ -6,6 +6,12 @@ describe Language do | |
| 6 6 | 
             
                Language.find(:eng).should == :en
         | 
| 7 7 | 
             
              end
         | 
| 8 8 |  | 
| 9 | 
            +
              it "should find French" do
         | 
| 10 | 
            +
                Language.find(:french).should == :fr
         | 
| 11 | 
            +
                Language.find(:fre).should == :fr
         | 
| 12 | 
            +
                Language.find(:fra).should == :fr
         | 
| 13 | 
            +
              end
         | 
| 14 | 
            +
             | 
| 9 15 | 
             
              it "should find Japanese" do
         | 
| 10 16 | 
             
                Language.find(:japanese).should == :ja
         | 
| 11 17 | 
             
                Language.find(:jpn).should == :ja
         | 
    
        data/spec/utils_spec.rb
    CHANGED
    
    | @@ -1,4 +1,5 @@ | |
| 1 1 | 
             
            require File.dirname(__FILE__) + "/spec_helper"
         | 
| 2 | 
            +
            require "tempfile"
         | 
| 2 3 |  | 
| 3 4 | 
             
            describe Utils do
         | 
| 4 5 | 
             
              it "should extract the correct language from a filename" do
         | 
| @@ -10,4 +11,52 @@ describe Utils do | |
| 10 11 | 
             
                Utils.build_converted_file_name("./test.txt", "en", "ja").should == "./test_ja.txt"
         | 
| 11 12 | 
             
                Utils.build_converted_file_name("./test_fr.txt", "en", "ja").should == "./test_fr_ja.txt"
         | 
| 12 13 | 
             
              end
         | 
| 14 | 
            +
             | 
| 15 | 
            +
              describe "when forcing an extension" do
         | 
| 16 | 
            +
                before :each do
         | 
| 17 | 
            +
                  @konjac = Tempfile.new(["test", ".konjac"])
         | 
| 18 | 
            +
                  @kon2   = Tempfile.new(["test2", ".konjac"])
         | 
| 19 | 
            +
                  @docx   = Tempfile.new(["test", ".docx"])
         | 
| 20 | 
            +
                  @doc2   = Tempfile.new(["test2", ".docx"])
         | 
| 21 | 
            +
                end
         | 
| 22 | 
            +
             | 
| 23 | 
            +
                it "should work when the user does not specify an extension" do
         | 
| 24 | 
            +
                  files_found = Utils.parse_files("#{Dir.tmpdir}/*", ".konjac")
         | 
| 25 | 
            +
                  files_found.should include @konjac.path
         | 
| 26 | 
            +
                  files_found.should include @kon2.path
         | 
| 27 | 
            +
                  files_found.should_not include @docx.path
         | 
| 28 | 
            +
                  files_found.should_not include @doc2.path
         | 
| 29 | 
            +
                  files_found = Utils.parse_files("#{Dir.tmpdir}/*", ".docx")
         | 
| 30 | 
            +
                  files_found.should include @docx.path
         | 
| 31 | 
            +
                  files_found.should include @doc2.path
         | 
| 32 | 
            +
                  files_found.should_not include @konjac.path
         | 
| 33 | 
            +
                  files_found.should_not include @kon2.path
         | 
| 34 | 
            +
                end
         | 
| 35 | 
            +
             | 
| 36 | 
            +
                it "should work when the user does specify an extension" do
         | 
| 37 | 
            +
                  files_found = Utils.parse_files("#{Dir.tmpdir}/*.docx", ".konjac")
         | 
| 38 | 
            +
                  files_found.should include @konjac.path
         | 
| 39 | 
            +
                  files_found.should include @kon2.path
         | 
| 40 | 
            +
                  files_found.should_not include @docx.path
         | 
| 41 | 
            +
                  files_found.should_not include @doc2.path
         | 
| 42 | 
            +
                  files_found = Utils.parse_files("#{Dir.tmpdir}/*.docx", ".docx")
         | 
| 43 | 
            +
                  files_found.should include @docx.path
         | 
| 44 | 
            +
                  files_found.should include @doc2.path
         | 
| 45 | 
            +
                  files_found.should_not include @konjac.path
         | 
| 46 | 
            +
                  files_found.should_not include @kon2.path
         | 
| 47 | 
            +
                end
         | 
| 48 | 
            +
             | 
| 49 | 
            +
                it "should work when the user supplies wildcards" do
         | 
| 50 | 
            +
                  files_found = Utils.parse_files("#{Dir.tmpdir}/*.*", ".konjac")
         | 
| 51 | 
            +
                  files_found.should include @konjac.path
         | 
| 52 | 
            +
                  files_found.should include @kon2.path
         | 
| 53 | 
            +
                  files_found.should_not include @docx.path
         | 
| 54 | 
            +
                  files_found.should_not include @doc2.path
         | 
| 55 | 
            +
                  files_found = Utils.parse_files("#{Dir.tmpdir}/*.*", ".docx")
         | 
| 56 | 
            +
                  files_found.should include @docx.path
         | 
| 57 | 
            +
                  files_found.should include @doc2.path
         | 
| 58 | 
            +
                  files_found.should_not include @konjac.path
         | 
| 59 | 
            +
                  files_found.should_not include @kon2.path
         | 
| 60 | 
            +
                end
         | 
| 61 | 
            +
              end
         | 
| 13 62 | 
             
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: konjac
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 0.1. | 
| 4 | 
            +
              version: 0.1.5
         | 
| 5 5 | 
             
              prerelease: 
         | 
| 6 6 | 
             
            platform: ruby
         | 
| 7 7 | 
             
            authors:
         | 
| @@ -9,11 +9,11 @@ authors: | |
| 9 9 | 
             
            autorequire: 
         | 
| 10 10 | 
             
            bindir: bin
         | 
| 11 11 | 
             
            cert_chain: []
         | 
| 12 | 
            -
            date: 2012-01- | 
| 12 | 
            +
            date: 2012-01-15 00:00:00.000000000 Z
         | 
| 13 13 | 
             
            dependencies:
         | 
| 14 14 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 15 15 | 
             
              name: nokogiri
         | 
| 16 | 
            -
              requirement: & | 
| 16 | 
            +
              requirement: &70250662109380 !ruby/object:Gem::Requirement
         | 
| 17 17 | 
             
                none: false
         | 
| 18 18 | 
             
                requirements:
         | 
| 19 19 | 
             
                - - ! '>='
         | 
| @@ -21,10 +21,32 @@ dependencies: | |
| 21 21 | 
             
                    version: '0'
         | 
| 22 22 | 
             
              type: :runtime
         | 
| 23 23 | 
             
              prerelease: false
         | 
| 24 | 
            -
              version_requirements: * | 
| 24 | 
            +
              version_requirements: *70250662109380
         | 
| 25 25 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 26 | 
            -
              name:  | 
| 27 | 
            -
              requirement: & | 
| 26 | 
            +
              name: term-ansicolor
         | 
| 27 | 
            +
              requirement: &70250662108960 !ruby/object:Gem::Requirement
         | 
| 28 | 
            +
                none: false
         | 
| 29 | 
            +
                requirements:
         | 
| 30 | 
            +
                - - ! '>='
         | 
| 31 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 32 | 
            +
                    version: '0'
         | 
| 33 | 
            +
              type: :runtime
         | 
| 34 | 
            +
              prerelease: false
         | 
| 35 | 
            +
              version_requirements: *70250662108960
         | 
| 36 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 37 | 
            +
              name: trollop
         | 
| 38 | 
            +
              requirement: &70250662108540 !ruby/object:Gem::Requirement
         | 
| 39 | 
            +
                none: false
         | 
| 40 | 
            +
                requirements:
         | 
| 41 | 
            +
                - - ! '>='
         | 
| 42 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 43 | 
            +
                    version: '0'
         | 
| 44 | 
            +
              type: :runtime
         | 
| 45 | 
            +
              prerelease: false
         | 
| 46 | 
            +
              version_requirements: *70250662108540
         | 
| 47 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 48 | 
            +
              name: autotest
         | 
| 49 | 
            +
              requirement: &70250662124620 !ruby/object:Gem::Requirement
         | 
| 28 50 | 
             
                none: false
         | 
| 29 51 | 
             
                requirements:
         | 
| 30 52 | 
             
                - - ! '>='
         | 
| @@ -32,10 +54,10 @@ dependencies: | |
| 32 54 | 
             
                    version: '0'
         | 
| 33 55 | 
             
              type: :development
         | 
| 34 56 | 
             
              prerelease: false
         | 
| 35 | 
            -
              version_requirements: * | 
| 57 | 
            +
              version_requirements: *70250662124620
         | 
| 36 58 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 37 | 
            -
              name:  | 
| 38 | 
            -
              requirement: & | 
| 59 | 
            +
              name: autotest-fsevent
         | 
| 60 | 
            +
              requirement: &70250662124060 !ruby/object:Gem::Requirement
         | 
| 39 61 | 
             
                none: false
         | 
| 40 62 | 
             
                requirements:
         | 
| 41 63 | 
             
                - - ! '>='
         | 
| @@ -43,10 +65,10 @@ dependencies: | |
| 43 65 | 
             
                    version: '0'
         | 
| 44 66 | 
             
              type: :development
         | 
| 45 67 | 
             
              prerelease: false
         | 
| 46 | 
            -
              version_requirements: * | 
| 68 | 
            +
              version_requirements: *70250662124060
         | 
| 47 69 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 48 | 
            -
              name:  | 
| 49 | 
            -
              requirement: & | 
| 70 | 
            +
              name: autotest-growl
         | 
| 71 | 
            +
              requirement: &70250662123300 !ruby/object:Gem::Requirement
         | 
| 50 72 | 
             
                none: false
         | 
| 51 73 | 
             
                requirements:
         | 
| 52 74 | 
             
                - - ! '>='
         | 
| @@ -54,10 +76,10 @@ dependencies: | |
| 54 76 | 
             
                    version: '0'
         | 
| 55 77 | 
             
              type: :development
         | 
| 56 78 | 
             
              prerelease: false
         | 
| 57 | 
            -
              version_requirements: * | 
| 79 | 
            +
              version_requirements: *70250662123300
         | 
| 58 80 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 59 | 
            -
              name:  | 
| 60 | 
            -
              requirement: & | 
| 81 | 
            +
              name: bundler
         | 
| 82 | 
            +
              requirement: &70250662122840 !ruby/object:Gem::Requirement
         | 
| 61 83 | 
             
                none: false
         | 
| 62 84 | 
             
                requirements:
         | 
| 63 85 | 
             
                - - ! '>='
         | 
| @@ -65,10 +87,10 @@ dependencies: | |
| 65 87 | 
             
                    version: '0'
         | 
| 66 88 | 
             
              type: :development
         | 
| 67 89 | 
             
              prerelease: false
         | 
| 68 | 
            -
              version_requirements: * | 
| 90 | 
            +
              version_requirements: *70250662122840
         | 
| 69 91 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 70 | 
            -
              name:  | 
| 71 | 
            -
              requirement: & | 
| 92 | 
            +
              name: rspec
         | 
| 93 | 
            +
              requirement: &70250662122420 !ruby/object:Gem::Requirement
         | 
| 72 94 | 
             
                none: false
         | 
| 73 95 | 
             
                requirements:
         | 
| 74 96 | 
             
                - - ! '>='
         | 
| @@ -76,10 +98,10 @@ dependencies: | |
| 76 98 | 
             
                    version: '0'
         | 
| 77 99 | 
             
              type: :development
         | 
| 78 100 | 
             
              prerelease: false
         | 
| 79 | 
            -
              version_requirements: * | 
| 101 | 
            +
              version_requirements: *70250662122420
         | 
| 80 102 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 81 | 
            -
              name:  | 
| 82 | 
            -
              requirement: & | 
| 103 | 
            +
              name: sdoc
         | 
| 104 | 
            +
              requirement: &70250662121920 !ruby/object:Gem::Requirement
         | 
| 83 105 | 
             
                none: false
         | 
| 84 106 | 
             
                requirements:
         | 
| 85 107 | 
             
                - - ! '>='
         | 
| @@ -87,7 +109,7 @@ dependencies: | |
| 87 109 | 
             
                    version: '0'
         | 
| 88 110 | 
             
              type: :development
         | 
| 89 111 | 
             
              prerelease: false
         | 
| 90 | 
            -
              version_requirements: * | 
| 112 | 
            +
              version_requirements: *70250662121920
         | 
| 91 113 | 
             
            description: A Ruby command-line utility for translating files using a YAML wordlist
         | 
| 92 114 | 
             
            email:
         | 
| 93 115 | 
             
            - bryan.mckelvey@gmail.com
         | 
| @@ -107,8 +129,6 @@ files: | |
| 107 129 | 
             
            - konjac.gemspec
         | 
| 108 130 | 
             
            - lib/konjac.rb
         | 
| 109 131 | 
             
            - lib/konjac/cli.rb
         | 
| 110 | 
            -
            - lib/konjac/cli/sub_command.rb
         | 
| 111 | 
            -
            - lib/konjac/cli/sub_command_manager.rb
         | 
| 112 132 | 
             
            - lib/konjac/dictionary.rb
         | 
| 113 133 | 
             
            - lib/konjac/exception.rb
         | 
| 114 134 | 
             
            - lib/konjac/language.rb
         | 
| @@ -1,20 +0,0 @@ | |
| 1 | 
            -
            module Konjac
         | 
| 2 | 
            -
              module CLI
         | 
| 3 | 
            -
                class SubCommand
         | 
| 4 | 
            -
                  attr :name, :aliases, :description
         | 
| 5 | 
            -
             | 
| 6 | 
            -
                  def initialize(name, aliases, description, &block)
         | 
| 7 | 
            -
                    @name, @aliases, @description = name, aliases, description
         | 
| 8 | 
            -
                    @block = block
         | 
| 9 | 
            -
                  end
         | 
| 10 | 
            -
             | 
| 11 | 
            -
                  def alias_text
         | 
| 12 | 
            -
                    @aliases.join ", "
         | 
| 13 | 
            -
                  end
         | 
| 14 | 
            -
             | 
| 15 | 
            -
                  def execute
         | 
| 16 | 
            -
                    @block.call
         | 
| 17 | 
            -
                  end
         | 
| 18 | 
            -
                end
         | 
| 19 | 
            -
              end
         | 
| 20 | 
            -
            end
         | 
| @@ -1,77 +0,0 @@ | |
| 1 | 
            -
            module Konjac
         | 
| 2 | 
            -
              module CLI
         | 
| 3 | 
            -
                class SubCommandManager
         | 
| 4 | 
            -
                  def initialize
         | 
| 5 | 
            -
                    @sub_commands ||= []
         | 
| 6 | 
            -
                  end
         | 
| 7 | 
            -
             | 
| 8 | 
            -
                  def add(name, aliases, description, &block)
         | 
| 9 | 
            -
                    @sub_commands << SubCommand.new(name, aliases, description, &block)
         | 
| 10 | 
            -
                  end
         | 
| 11 | 
            -
             | 
| 12 | 
            -
                  def execute(sub_command)
         | 
| 13 | 
            -
                    sub_command = sub_command.to_sym
         | 
| 14 | 
            -
             | 
| 15 | 
            -
                    @sub_commands.each do |sc|
         | 
| 16 | 
            -
                      if sc.name == sub_command || sc.aliases.include?(sub_command)
         | 
| 17 | 
            -
                        sc.execute
         | 
| 18 | 
            -
                        return sc.name
         | 
| 19 | 
            -
                      end
         | 
| 20 | 
            -
                    end
         | 
| 21 | 
            -
             | 
| 22 | 
            -
                    return nil
         | 
| 23 | 
            -
                  end
         | 
| 24 | 
            -
             | 
| 25 | 
            -
                  def all
         | 
| 26 | 
            -
                    @sub_commands
         | 
| 27 | 
            -
                  end
         | 
| 28 | 
            -
             | 
| 29 | 
            -
                  def get_lengths
         | 
| 30 | 
            -
                    @lengths = { :name => 8, :aliases => 7, :description => 11 }
         | 
| 31 | 
            -
             | 
| 32 | 
            -
                    @sub_commands.each do |sc|
         | 
| 33 | 
            -
                      if sc.name.length > @lengths[:name]
         | 
| 34 | 
            -
                        @lengths[:name] = sc.name.length
         | 
| 35 | 
            -
                      end
         | 
| 36 | 
            -
                      if sc.alias_text.length > @lengths[:aliases]
         | 
| 37 | 
            -
                        @lengths[:aliases] = sc.alias_text.length
         | 
| 38 | 
            -
                      end
         | 
| 39 | 
            -
                      if sc.description.length > @lengths[:description]
         | 
| 40 | 
            -
                        @lengths[:description] = sc.description.length
         | 
| 41 | 
            -
                      end
         | 
| 42 | 
            -
                    end
         | 
| 43 | 
            -
                  end
         | 
| 44 | 
            -
             | 
| 45 | 
            -
                  def to_s
         | 
| 46 | 
            -
                    get_lengths
         | 
| 47 | 
            -
                    text = "\n"
         | 
| 48 | 
            -
             | 
| 49 | 
            -
                    header_lines = "%s  %s  %s\n" % [
         | 
| 50 | 
            -
                      "-" * @lengths[:name],
         | 
| 51 | 
            -
                      "-" * @lengths[:aliases],
         | 
| 52 | 
            -
                      "-" * @lengths[:description]
         | 
| 53 | 
            -
                    ]
         | 
| 54 | 
            -
             | 
| 55 | 
            -
                    # Create headers
         | 
| 56 | 
            -
                    text << header_lines
         | 
| 57 | 
            -
                    text << "%s  %s  %s\n" % [
         | 
| 58 | 
            -
                      "Commands".ljust(@lengths[:name]),
         | 
| 59 | 
            -
                      "Aliases".ljust(@lengths[:aliases]),
         | 
| 60 | 
            -
                      "Description".ljust(@lengths[:description])
         | 
| 61 | 
            -
                    ]
         | 
| 62 | 
            -
                    text << header_lines
         | 
| 63 | 
            -
             | 
| 64 | 
            -
                    # Write descriptions of each subcommand
         | 
| 65 | 
            -
                    @sub_commands.each do |sc|
         | 
| 66 | 
            -
                      text << "%s  %s  %s\n" % [
         | 
| 67 | 
            -
                        sc.name.to_s.ljust(@lengths[:name]),
         | 
| 68 | 
            -
                        sc.alias_text.to_s.ljust(@lengths[:aliases]),
         | 
| 69 | 
            -
                        sc.description.to_s.ljust(@lengths[:description])
         | 
| 70 | 
            -
                      ]
         | 
| 71 | 
            -
                    end
         | 
| 72 | 
            -
             | 
| 73 | 
            -
                    text
         | 
| 74 | 
            -
                  end
         | 
| 75 | 
            -
                end
         | 
| 76 | 
            -
              end
         | 
| 77 | 
            -
            end
         |