Module: Ym4r::GmPlugin::MappingObject

Overview

The module where all the Ruby-to-JavaScript conversion takes place. It is included by all the classes in the YM4R library.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(name, *args) ⇒ Object

Creates javascript code for missing methods + takes care of listeners



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/gm_plugin/mapping.rb', line 9

def method_missing(name,*args)
  str_name = name.to_s
  if str_name =~ /^on_(.*)/
    if args.length != 1
      raise ArgumentError("Only 1 argument is allowed on on_ methods");
    else
      Variable.new("GEvent.addListener(#{to_javascript},\"#{MappingObject.javascriptify_method($1)}\",#{args[0]})")
    end
  else
    args.collect! do |arg|
      MappingObject.javascriptify_variable(arg)
    end
    Variable.new("#{to_javascript}.#{MappingObject.javascriptify_method(str_name)}(#{args.join(",")})")
  end
end

Instance Attribute Details

#variableObject (readonly)

The name of the variable in JavaScript space.



6
7
8
# File 'lib/gm_plugin/mapping.rb', line 6

def variable
  @variable
end

Class Method Details

.escape_javascript(javascript) ⇒ Object

Escape string to be used in JavaScript. Lifted from rails.



50
51
52
# File 'lib/gm_plugin/mapping.rb', line 50

def self.escape_javascript(javascript)
  javascript.gsub(/\r\n|\n|\r/, "\\n").gsub("\"") { |m| "\\#{m}" }
end

.javascriptify_method(method_name) ⇒ Object

Transform a ruby-type method name (like add_overlay) to a JavaScript-style one (like addOverlay).



55
56
57
# File 'lib/gm_plugin/mapping.rb', line 55

def self.javascriptify_method(method_name)
  method_name.gsub(/_(\w)/){|s| $1.upcase}
end

.javascriptify_variable(arg) ⇒ Object

Transforms a Ruby object into a JavaScript string : MAppingObject, String, Array, Hash and general case (using to_s)



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/gm_plugin/mapping.rb', line 31

def self.javascriptify_variable(arg)
  if arg.is_a?(MappingObject)
    arg.to_javascript
  elsif arg.is_a?(String)
    "\"#{MappingObject.escape_javascript(arg)}\""
  elsif arg.is_a?(Array)
    "[" + arg.collect{ |a| MappingObject.javascriptify_variable(a)}.join(",") + "]"
  elsif arg.is_a?(Hash)
    "{" + arg.to_a.collect do |v|
      "#{MappingObject.javascriptify_method(v[0].to_s)} : #{MappingObject.javascriptify_variable(v[1])}"
    end.join(",") + "}"
  elsif arg.nil?
    "undefined"
  else
    arg.to_s
  end
end

Instance Method Details

#[](index) ⇒ Object

Creates javascript code for array or hash indexing



26
27
28
# File 'lib/gm_plugin/mapping.rb', line 26

def [](index) #index could be an integer or string
  return Variable.new("#{to_javascript}[#{MappingObject.javascriptify_variable(index)}]")
end

#assign_to(variable) ⇒ Object

Binds a Mapping object to a previously declared JavaScript variable of name variable.



78
79
80
81
# File 'lib/gm_plugin/mapping.rb', line 78

def assign_to(variable)
  @variable = variable
  "#{@variable} = #{create};"
end

#createObject

Creates a Mapping Object in JavaScript. To be implemented by subclasses if needed



104
105
# File 'lib/gm_plugin/mapping.rb', line 104

def create
end

#declare(variable) ⇒ Object

Declares a Mapping Object bound to a JavaScript variable of name variable.



60
61
62
63
# File 'lib/gm_plugin/mapping.rb', line 60

def declare(variable)
  @variable = variable
  "var #{@variable} = #{create};"
end

#declare_random(init, size = 8) ⇒ Object

declare with a random variable name



66
67
68
69
70
# File 'lib/gm_plugin/mapping.rb', line 66

def declare_random(init,size = 8)
  s = init.clone
  6.times { s << (i = Kernel.rand(62); i += ((i < 10) ? 48 : ((i < 36) ? 55 : 61 ))).chr }
  declare(s)
end

#declared?Boolean

Checks if the MappinObject has been declared

Returns:

  • (Boolean)


73
74
75
# File 'lib/gm_plugin/mapping.rb', line 73

def declared?
  !@variable.nil?
end

#get_property(property) ⇒ Object

Returns the code to get a property from the MappingObject



89
90
91
# File 'lib/gm_plugin/mapping.rb', line 89

def get_property(property)
  Variable.new("#{to_javascript}.#{MappingObject.javascriptify_method(property.to_s)}")
end

#set_property(property, value) ⇒ Object

Assign the value to the property of the MappingObject



84
85
86
# File 'lib/gm_plugin/mapping.rb', line 84

def set_property(property, value)
  "#{to_javascript}.#{MappingObject.javascriptify_method(property.to_s)} = #{MappingObject.javascriptify_variable(value)}"
end

#to_javascriptObject

Returns a Javascript code representing the object



94
95
96
97
98
99
100
# File 'lib/gm_plugin/mapping.rb', line 94

def to_javascript
  unless @variable.nil?
    @variable
  else
    create
  end
end