Module: Liquidscript::Generator::Javascript::Literals

Included in:
Liquidscript::Generator::Javascript
Defined in:
lib/liquidscript/generator/javascript/literals.rb

Constant Summary collapse

BINOP_SWITCH =
{
  "=="  => "===",
  "===" => "==",
  "!="  => "!==",
  "!==" => "!=",
  "or"  => "||",
  "and" => "&&",
  "is"  => "===",
  "isnt"=> "!=="
}.freeze

Instance Method Summary collapse

Instance Method Details

#generate_action(code) ⇒ Object



85
86
87
# File 'lib/liquidscript/generator/javascript/literals.rb', line 85

def generate_action(code)
  code[1].value
end

#generate_array(code) ⇒ Object



221
222
223
224
225
226
227
228
229
230
231
# File 'lib/liquidscript/generator/javascript/literals.rb', line 221

def generate_array(code)

  array = buffer
  array.set_join! ', '

  code[1].inject(array) do |a, p|
    a << replace(p)
  end

  "[#{array}]"
end

#generate_binop(code) ⇒ Object



185
186
187
188
189
190
191
192
193
194
195
196
197
198
# File 'lib/liquidscript/generator/javascript/literals.rb', line 185

def generate_binop(code)
  op = BINOP_SWITCH.fetch(code[1].value) do
    case code[1].type
    when :minus
      '-'
    when :plus
      '+'
    else
      code[1].value
    end
  end

  "#{replace(code[2])} #{op} #{replace(code[3])}"
end

#generate_erange(code, options = {}, norep = false) ⇒ Object



66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/liquidscript/generator/javascript/literals.rb', line 66

def generate_erange(code, options = {}, norep = false)
  out = buffer
  a = norep ? code[1] : replace(code[1])
  b = norep ? code[2] : replace(code[2])
  out << "(function(a, b) {\n"                          <<
         indent!   << "var out, i, t;\n"                <<
         indent    << "out = [];\n"                     <<
         indent    << "if(a > b) {\n"                   <<
         indent!   << "t = a; a = b; b = t;\n"          <<
         unindent! << "}\n"                             <<
         indent    << "for(i = a; i < b; i++) {\n"      <<
         indent!   << "out.push(i);\n"                  <<
         unindent! << "};\n"                            <<
         indent    << "return t === undefined ? "       <<
                      "out : out.reverse();\n"          <<
         unindent! << "})(" << a << ", " << b << ")"
  out
end

#generate_for_in(code) ⇒ Object



108
109
110
111
112
113
114
115
116
117
# File 'lib/liquidscript/generator/javascript/literals.rb', line 108

def generate_for_in(code)
  temporary_variable(2) do |v,d|
    loop_body = buffer
    loop_body << "var #{v}, #{d} = #{replace(code[2])};\n" <<
      indent  << "for(#{v} in #{d}) {\n"                   <<
      indent! << "#{code[1].to_s} = #{d}[#{v}];\n"
    insert_into(code[3], loop_body)
    loop_body << unindent! << "}"
  end
end

#generate_for_seg(code) ⇒ Object



119
120
121
122
123
124
125
126
127
128
129
130
131
# File 'lib/liquidscript/generator/javascript/literals.rb', line 119

def generate_for_seg(code)
  loop_body = buffer
  loop_body << "for("            <<
               replace(code[1])  << "; " <<
               replace(code[2])  << "; " <<
               replace(code[3])  << ") {\n"

  indent!
  insert_into(code[4], loop_body)
  unindent!

  loop_body << indent_level << "}"
end

#generate_function(code) ⇒ Object



237
238
239
240
241
242
243
244
245
246
247
248
249
250
# File 'lib/liquidscript/generator/javascript/literals.rb', line 237

def generate_function(code)

  function = buffer
  indent!

  function                        <<
    "function("                   <<
    code[1].parameters.join(', ') <<
    ") {\n"                       <<
    replace(code[1], :final_return => true)
  unindent!

  function << indent_level << "}"
end

#generate_href(code) ⇒ Object



169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
# File 'lib/liquidscript/generator/javascript/literals.rb', line 169

def generate_href(code)
  heredoc = code[1]
  hbuf = buffer

  heredoc.body.each do |part|
    case part.type
    when :heredoc, :iheredoc, :iheredoc_begin
      hbuf << '"' << part.value.gsub('"', '\\"') << '"'
    else
      hbuf << ' + ' << replace(part) << ' + '
    end
  end

  hbuf
end

#generate_interop(code) ⇒ Object



141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# File 'lib/liquidscript/generator/javascript/literals.rb', line 141

def generate_interop(code)
  content = code[1..-1]
  buf = buffer

  content.each do |part|
    case part.type
    when :istring_begin, :istring
      buf << "\"#{part.value}\""
    else
      buf << " + (#{replace(part)}) + "
    end
  end

  buf
end

#generate_istring(code) ⇒ Object



137
138
139
# File 'lib/liquidscript/generator/javascript/literals.rb', line 137

def generate_istring(code)
  "\"#{code.first.gsub("\n", "\\n")}\""
end

#generate_keyword(code) ⇒ Object



204
205
206
# File 'lib/liquidscript/generator/javascript/literals.rb', line 204

def generate_keyword(code)
  "#{code[1].value}"
end

#generate_neg(code) ⇒ Object



93
94
95
# File 'lib/liquidscript/generator/javascript/literals.rb', line 93

def generate_neg(code)
  "-#{replace(code[1])}"
end

#generate_nerange(code) ⇒ Object



34
35
36
37
38
39
40
41
42
43
44
45
# File 'lib/liquidscript/generator/javascript/literals.rb', line 34

def generate_nerange(code)
  start  = code[1]
  ending = code[2]

  if (start.to_i - ending.to_i).abs > 50
    generate_erange(code, {}, true)
  elsif ending > start
    buffer << "[" << (start...ending).to_a.join(', ') << "]"
  else
    buffer << "[" << (ending...start).to_a.reverse.join(', ') << "]"
  end
end

#generate_newline(_) ⇒ Object



233
234
235
# File 'lib/liquidscript/generator/javascript/literals.rb', line 233

def generate_newline(_)
  ""
end

#generate_nrange(code) ⇒ Object



21
22
23
24
25
26
27
28
29
30
31
32
# File 'lib/liquidscript/generator/javascript/literals.rb', line 21

def generate_nrange(code)
  start  = code[1]
  ending = code[2]

  if (start.to_i - ending.to_i).abs > 50
    generate_range(code, {}, true)
  elsif ending > start
    buffer << "[" << (start..ending).to_a.join(', ') << "]"
  else
    buffer << "[" << (ending..start).to_a.reverse.join(', ') << "]"
  end
end

#generate_number(code) ⇒ Object



17
18
19
# File 'lib/liquidscript/generator/javascript/literals.rb', line 17

def generate_number(code)
  "#{code.first}"
end

#generate_object(code) ⇒ Object



208
209
210
211
212
213
214
215
216
217
218
219
# File 'lib/liquidscript/generator/javascript/literals.rb', line 208

def generate_object(code)

  object = buffer
  object.set_join! ",\n#{indent!}"

  code[1].inject(object) do |buf, part|
    buf << "\"#{part[0].value}\": #{replace(part[1])}"
  end

  unindent!
  "{#{object}}"
end

#generate_op(code) ⇒ Object



89
90
91
# File 'lib/liquidscript/generator/javascript/literals.rb', line 89

def generate_op(code)
  "#{replace(code[1])}#{code[2].value}"
end

#generate_pos(code) ⇒ Object



97
98
99
# File 'lib/liquidscript/generator/javascript/literals.rb', line 97

def generate_pos(code)
  "+#{replace(code[1])}"
end

#generate_range(code, options = {}, norep = false) ⇒ Object



47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
# File 'lib/liquidscript/generator/javascript/literals.rb', line 47

def generate_range(code, options = {}, norep = false)
  out = buffer
  a = norep ? code[1] : replace(code[1])
  b = norep ? code[2] : replace(code[2])
  out << "(function(a, b) {\n"                          <<
         indent!   << "var out, i, t;\n"                <<
         indent    << "out = [];\n"                     <<
         indent    << "if(a > b) {\n"                   <<
         indent!   << "t = a; a = b; b = t;\n"          <<
         unindent! << "}\n"                             <<
         indent    << "for(i = a; i <= b; i++) {\n"     <<
         indent!   << "out.push(i);\n"                  <<
         unindent! << "};\n"                            <<
         indent    << "return t === undefined ? "       <<
                      "out : out.reverse();\n"          <<
         unindent! << "})(" << a << ", " << b << ")"
  out
end

#generate_regex(code) ⇒ Object



133
134
135
# File 'lib/liquidscript/generator/javascript/literals.rb', line 133

def generate_regex(code)
  "/#{code[1].value[0]}/#{code[1].value[1]}"
end

#generate_return(code) ⇒ Object



165
166
167
# File 'lib/liquidscript/generator/javascript/literals.rb', line 165

def generate_return(code)
  "return #{replace(code[1])}"
end

#generate_sstring(code) ⇒ Object



157
158
159
# File 'lib/liquidscript/generator/javascript/literals.rb', line 157

def generate_sstring(code)
  "'#{code.first.gsub(/'/, "\\'")}'"
end

#generate_unop(code) ⇒ Object



161
162
163
# File 'lib/liquidscript/generator/javascript/literals.rb', line 161

def generate_unop(code)
  "#{code[1].value} #{replace(code[2])}"
end

#generate_variable(code) ⇒ Object



200
201
202
# File 'lib/liquidscript/generator/javascript/literals.rb', line 200

def generate_variable(code)
  code.to_s
end

#generate_while(code) ⇒ Object



101
102
103
104
105
106
# File 'lib/liquidscript/generator/javascript/literals.rb', line 101

def generate_while(code)
  loop_body = buffer
  loop_body << "while(#{replace(code[1])}) {\n"
  insert_into(code[2], loop_body)
  loop_body << indent_level << "}"
end