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

files[RW]
glue[RW]
options[RW]

Public Class Methods

new(files, glue = "|") click to toggle source
# File lib/po_to_json.rb, line 33
def initialize(files, glue = "|")
  @files = files
  @glue = glue
end

Public Instance Methods

flush_buffer() click to toggle source
# File lib/po_to_json.rb, line 74
def flush_buffer
  return unless buffer[:msgid]

  build_trans
  assign_trans

  reset_buffer
end
generate_for_jed(language, overwrite = {}) click to toggle source
# 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
generate_for_json(language, overwrite = {}) click to toggle source
# 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
parse_document() click to toggle source
# 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
parse_header() click to toggle source
# 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
reject_header() click to toggle source
# 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

assign_trans() click to toggle source
# File lib/po_to_json.rb, line 165
def assign_trans
  values[detect_ctxt] = trans unless trans.empty?
end
buffer() click to toggle source
# File lib/po_to_json.rb, line 118
def buffer
  @buffer ||= {}
end
build_header_for(line) click to toggle source
# 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
build_jed_for(hash) click to toggle source
# File lib/po_to_json.rb, line 228
def build_jed_for(hash)
  {
    domain: options[:domain],
    locale_data: {
      options[:domain] => hash
    }
  }
end
build_json_for(hash) click to toggle source
# 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
build_trans() click to toggle source
# 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
detect_ctxt() click to toggle source
# 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
detect_plural() click to toggle source
# File lib/po_to_json.rb, line 152
def detect_plural
  plural = buffer[:msgid_plural]
  plural if plural && !plural.empty?
end
errors() click to toggle source
# File lib/po_to_json.rb, line 110
def errors
  @errors ||= []
end
generic_detects?(line) click to toggle source
# 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
generic_rejects?(line) click to toggle source
# File lib/po_to_json.rb, line 264
def generic_rejects?(line)
  if line.match(/^$/) || line.match(/^(#[^~]|\#$)/)
    flush_buffer && true
  else
    false
  end
end
headers() click to toggle source
# File lib/po_to_json.rb, line 122
def headers
  @headers ||= {}
end
inject_meta(hash) click to toggle source
# 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
iterate_detects_for(line) click to toggle source
# 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
lastkey() click to toggle source
# File lib/po_to_json.rb, line 126
def lastkey
  @lastkey ||= ""
end
matches_values_for(line) click to toggle source
# 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
parse_options(options) click to toggle source
# 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
push_buffer(value, key = nil) click to toggle source
# 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
reset_buffer() click to toggle source
# File lib/po_to_json.rb, line 135
def reset_buffer
  @buffer = {}
  @trans = []
  @lastkey = ""
end
reset_result() click to toggle source
# File lib/po_to_json.rb, line 130
def reset_result
  @values = {}
  @errors = []
end
specific_detects() click to toggle source
# 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
trans() click to toggle source
# File lib/po_to_json.rb, line 106
def trans
  @trans ||= []
end
values() click to toggle source
# File lib/po_to_json.rb, line 114
def values
  @values ||= {}
end