Module: Sqm2Json

Defined in:
lib/sqm2json/version.rb,
lib/sqm2json/json2sqm.rb,
lib/sqm2json/sqm2json.rb

Defined Under Namespace

Modules: Reverse

Constant Summary collapse

VERSION =
'0.0.3'

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.get_supported_versionsObject



4
5
6
# File 'lib/sqm2json/version.rb', line 4

def self.get_supported_versions
  [12,51,52]
end

.is_version_supported?(version) ⇒ Boolean

Returns:

  • (Boolean)


8
9
10
# File 'lib/sqm2json/version.rb', line 8

def self.is_version_supported?(version)
  get_supported_versions.include?(version)
end

Instance Method Details

#to_json(sqm_document) ⇒ Hash

Parse a given SQM file to JSON document NOTICE: the implementation is far from being perfect but just works

Parameters:

  • sqm_document (String)

    valid and readable mission.sqm file path

Returns:

  • (Hash)

    JSON document



7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'lib/sqm2json/sqm2json.rb', line 7

def to_json(sqm_document)
  content = sqm_document.delete("\r\n").delete("\t")

  content.gsub!(/(?<key>\w*)(\s)*=(\s)*(?<val>"");/, '\k<key>="ʉ";') # replace empty string values
  content.gsub!('""', '\"') # 2x" in init fields replaced by \"

  content.gsub!(/(?<key>[\w]+)(\[\])?=(?<val>".{0,}?([^\\]\";))/) { |m|
    pairs = m.split('=', 2)
    "\"#{pairs[0]}\": #{pairs[1].gsub(/;/,'ʊ').gsub(/,/,'ʎ').chomp('ʊ').gsub('""','\"').gsub(/\\([^"])/, '\\\\\\\\\1')},"
  }

  content.gsub!(/class (?<val>\w+)\s*\{/, '"\k<val>" : {')
  content.gsub!(/(?<key>\w*)=(?<val>[\w#+\-0-9 .,]+);/, '"\k<key>" : \k<val>,')
  content.gsub!(/(?<key>\w*)\[\]\s*=\s*\{(?<val>[\w#\+\-0-9 .,"]+)\};/, '"\k<key>" : [\k<val>],')
  content.gsub!(/\};/, '},')
  content.gsub!(/,\}/, '}')
  content.gsub!(/\}[;,]\}/, '}}')
  content.gsub!(/ʊ/, ';') if content.include? 'ʊ'
  content.gsub!(/ʎ/, ',') if content.include? 'ʎ'
  content.gsub!(/ʉ/, '') if content.include? 'ʉ'
  content.gsub!(/ɣ/, '\'') if content.include? 'ɣ'
  content = "{#{content.chomp('"').chomp(',')}}"

  ::JSON.parse(content, symbolize_names: true)
end