class PoToJson
Copyright © 2012-2015 Dropmysite.com <dropmyemail.com> Copyright © 2015 Webhippie <www.webhippie.de>
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Attributes
Public Class Methods
# File lib/po_to_json.rb, line 33 def initialize(files, glue = "|") @files = files @glue = glue end
Public Instance Methods
# File lib/po_to_json.rb, line 74 def flush_buffer return unless buffer[:msgid] build_trans assign_trans reset_buffer end
# File lib/po_to_json.rb, line 38 def generate_for_jed(language, overwrite = {}) @options = parse_options(overwrite.merge(language: language)) @parsed ||= inject_meta(parse_document) generated = build_json_for(build_jed_for(@parsed)) [ @options[:variable_locale_scope] ? "var" : "", "#{@options[:variable]} = #{@options[:variable]} || {};", "#{@options[:variable]}['#{@options[:language]}'] = #{generated};" ].join(" ") end
# File lib/po_to_json.rb, line 51 def generate_for_json(language, overwrite = {}) @options = parse_options(overwrite.merge(language: language)) @parsed ||= inject_meta(parse_document) generated = build_json_for(build_json_for(@parsed)) raise "Not implemented yet, current value is #{generated}!" end
# File lib/po_to_json.rb, line 60 def parse_document reset_buffer reset_result File.foreach(files) do |line| matches_values_for(line.chomp) end flush_buffer parse_header values end
# File lib/po_to_json.rb, line 83 def parse_header return if reject_header values[""][0].split("\\n").each do |line| next if line.empty? build_header_for(line) end values[""] = headers end
# File lib/po_to_json.rb, line 95 def reject_header if values[""].nil? || values[""][0].nil? values[""] = {} true else false end end
Protected Instance Methods
# File lib/po_to_json.rb, line 165 def assign_trans values[detect_ctxt] = trans unless trans.empty? end
# File lib/po_to_json.rb, line 118 def buffer @buffer ||= {} end
# File lib/po_to_json.rb, line 203 def build_header_for(line) if line =~ /(.*?):(.*)/ key = $1 value = $2 if headers.key? key errors.push "Duplicate header: #{line}" elsif key =~ /#-#-#-#-#/ errors.push "Marked header: #{line}" else headers[key] = value.strip end else errors.push "Malformed header: #{line}" end end
# File lib/po_to_json.rb, line 228 def build_jed_for(hash) { domain: options[:domain], locale_data: { options[:domain] => hash } } end
# File lib/po_to_json.rb, line 220 def build_json_for(hash) if options[:pretty] JSON.pretty_generate(hash) else JSON.generate(hash) end end
# File lib/po_to_json.rb, line 157 def build_trans buffer.each do |key, string| trans[$1.to_i] = string if key.to_s =~ /^msgstr_(\d+)/ end # trans.unshift(detect_plural) if detect_plural end
# File lib/po_to_json.rb, line 141 def detect_ctxt msgctxt = buffer[:msgctxt] msgid = buffer[:msgid] if msgctxt && !msgctxt.empty? [msgctxt, glue, msgid].join("") else msgid end end
# File lib/po_to_json.rb, line 152 def detect_plural plural = buffer[:msgid_plural] plural if plural && !plural.empty? end
# File lib/po_to_json.rb, line 110 def errors @errors ||= [] end
# File lib/po_to_json.rb, line 272 def generic_detects?(line) match = line.match(/^(?:#~ )?msgctxt\s+(.*)/) if match push_buffer( match[1], :msgctxt ) return true end false end
# File lib/po_to_json.rb, line 264 def generic_rejects?(line) if line.match(/^$/) || line.match(/^(#[^~]|\#$)/) flush_buffer && true else false end end
# File lib/po_to_json.rb, line 122 def headers @headers ||= {} end
# File lib/po_to_json.rb, line 195 def inject_meta(hash) hash[""]["lang"] ||= options[:language] hash[""]["domain"] ||= options[:domain] hash[""]["plural_forms"] ||= hash[""]["Plural-Forms"] hash end
# File lib/po_to_json.rb, line 246 def iterate_detects_for(line) specific_detects.each do |detect| match = line.match(detect[:regex]) if match if detect[:index] push_buffer(match[detect[:index]], detect[:key].call(match)) else push_buffer(line) end return true end end false end
# File lib/po_to_json.rb, line 126 def lastkey @lastkey ||= "" end
# File lib/po_to_json.rb, line 237 def matches_values_for(line) return if generic_rejects? line return if generic_detects? line return if iterate_detects_for(line) errors.push "Strange line #{line}" end
# File lib/po_to_json.rb, line 184 def parse_options(options) defaults = { pretty: false, domain: "app", variable: "locales", variable_locale_scope: true } defaults.merge(options) end
# File lib/po_to_json.rb, line 169 def push_buffer(value, key = nil) value = $1 if value =~ /^"(.*)"/ value.gsub(/\\"/, "\"") if key.nil? buffer[lastkey] = [ buffer[lastkey], value ].join("") else buffer[key] = value @lastkey = key end end
# File lib/po_to_json.rb, line 135 def reset_buffer @buffer = {} @trans = [] @lastkey = "" end
# File lib/po_to_json.rb, line 130 def reset_result @values = {} @errors = [] end
# File lib/po_to_json.rb, line 287 def specific_detects [{ regex: /^(?:#~ )?msgctxt\s+(.*)/, index: 1, key: proc { :msgctxt } }, { regex: /^(?:#~ )?msgid\s+(.*)/, index: 1, key: proc { :msgid } }, { regex: /^(?:#~ )?msgid_plural\s+(.*)/, index: 1, key: proc { :msgid_plural } }, { regex: /^(?:#~ )?msgstr\s+(.*)/, index: 1, key: proc { :msgstr_0 } }, { regex: /^(?:#~ )?msgstr\[0\]\s+(.*)/, index: 1, key: proc { :msgstr_0 } }, { regex: /^(?:#~ )?msgstr\[(\d+)\]\s+(.*)/, index: 2, key: proc { |m| "msgstr_#{m[1]}".to_sym } }, { regex: /^(?:#~ )?"/, index: nil }] end
# File lib/po_to_json.rb, line 106 def trans @trans ||= [] end
# File lib/po_to_json.rb, line 114 def values @values ||= {} end