Module: MODL::UTIL

Defined in:
lib/modl/util/functions.rb

Overview

Helper functions for MODL.generate

Constant Summary collapse

SHOULD_BE_GRAVE_QUOTED =
/.*[()\[\];{}="].*/.freeze
IS_NUMERIC =
/^-?[0-9]*\.?[0-9]+(?:[Ee][+-]?[0-9]+)?$/.freeze

Class Method Summary collapse

Class Method Details

.double_quote_if_necessary(str) ⇒ Object



44
45
46
47
48
49
50
# File 'lib/modl/util/functions.rb', line 44

def self.double_quote_if_necessary(str)
  if str && str.include?('~`')
    "\"#{str}\""
  else
    str
  end
end

.escape_and_quote(str) ⇒ Object



56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/modl/util/functions.rb', line 56

def self.escape_and_quote(str)
  double_quote_if_necessary(
    grave_quote_if_necessary(
      escape_graves(
        UNICODE.escape(
          replace_nbsp(
            escape_double_quotes(str)
          )
        )
      )
    )
  )
end

.escape_double_quotes(str) ⇒ Object



15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/modl/util/functions.rb', line 15

def self.escape_double_quotes(str)
  return str unless str

  i = str.index('"', 1) # ignore the initial quote
  result = str
  # Don't affect the final quote in the string
  while !i.nil? && i < (result.length - 1)
    result = result.slice(0..(i - 1)) + '~u0022' + result.slice((i + 1)..)
    i = result.index('"', 1)
  end
  result
end

.escape_graves(str) ⇒ Object



9
10
11
12
13
# File 'lib/modl/util/functions.rb', line 9

def self.escape_graves(str)
  return str unless str

  str.gsub(/`/, '~`')
end

.grave_quote_if_necessary(str) ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/modl/util/functions.rb', line 28

def self.grave_quote_if_necessary(str)
  return str unless str

  if str.match?(SHOULD_BE_GRAVE_QUOTED) ||
     (str.match?(IS_NUMERIC) && str != '00' && str != '01' && str != '000') ||
     (str.strip.empty? ||
      str.match?(IS_NUMERIC) ||
      str == 'true' ||
      str == 'false' ||
      str == 'null')
    "`#{str}`"
  else
    str
  end
end

.non_string_primitive?(str) ⇒ Boolean

Returns:

  • (Boolean)


70
71
72
# File 'lib/modl/util/functions.rb', line 70

def self.non_string_primitive?(str)
  str == 'true' || str == 'false' || str == 'null' || str.match?(IS_NUMERIC)
end

.replace_nbsp(str) ⇒ Object



52
53
54
# File 'lib/modl/util/functions.rb', line 52

def self.replace_nbsp(str)
  str.gsub('\u00a0', ' ')
end