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

buffer[RW]
errors[RW]
files[RW]
glue[RW]
lastkey[RW]
options[RW]
trans[RW]
values[RW]

Public Class Methods

new(files, glue = "|") click to toggle source
# File lib/po_to_json.rb, line 40
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 80
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 45
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))

  [
    "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 57
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))

  fail "Not implemented yet, current value is #{generated}!"
end
parse_document() click to toggle source
# File lib/po_to_json.rb, line 66
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 89
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 100
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 170
def assign_trans
  values[detect_ctxt] = trans if trans.size > 0
end
build_header_for(line) click to toggle source
# File lib/po_to_json.rb, line 207
def build_header_for(line)
  if line =~ /(.*?):(.*)/
    key, value = $1, $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 231
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 223
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 162
def build_trans
  buffer.each do |key, string|
    trans[$1.to_i] = string if key.to_s.match(/^msgstr_(\d+)/)
  end

  # trans.unshift(detect_plural) if detect_plural
end
detect_ctxt() click to toggle source
# File lib/po_to_json.rb, line 146
def detect_ctxt
  msgctxt = buffer[:msgctxt]
  msgid = buffer[:msgid]

  if msgctxt && msgctxt.size > 0
    [msgctxt, glue, msgid].join("")
  else
    msgid
  end
end
detect_plural() click to toggle source
# File lib/po_to_json.rb, line 157
def detect_plural
  plural = buffer[:msgid_plural]
  plural if plural && plural.size > 0
end
generic_detects?(line) click to toggle source
# File lib/po_to_json.rb, line 275
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 267
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 127
def headers
  @headers ||= {}
end
inject_meta(hash) click to toggle source
# File lib/po_to_json.rb, line 199
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 249
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
matches_values_for(line) click to toggle source
# File lib/po_to_json.rb, line 240
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 189
def parse_options(options)
  defaults = {
    pretty: false,
    domain: "app",
    variable: "locales"
  }

  defaults.merge(options)
end
push_buffer(value, key = nil) click to toggle source
# File lib/po_to_json.rb, line 174
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 140
def reset_buffer
  @buffer = {}
  @trans = []
  @lastkey = ""
end
reset_result() click to toggle source
# File lib/po_to_json.rb, line 135
def reset_result
  @values = {}
  @errors = []
end
specific_detects() click to toggle source
# File lib/po_to_json.rb, line 290
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