Opal:Ruby to Javascript Compiler
Rubyã®ã³ã¼ããJavaScriptã«å¤æããOpalã¨ããã½ããã¦ã§ã¢ããããOpalèªèº«ã¯Rubyã§æ¸ããã¦ãã¦ãgemã§ã¤ã³ã¹ãã¼ã«ã§ãããããã使ã£ã¦Rubyã³ã¼ããJavaScriptã«å¤æãã¦Webãµã¤ãã«ã¢ãããã¼ãããã¨ãæå
ã§Rubyã§æ¸ããã³ã¼ãããã©ã¦ã¶ä¸ã§åä½ãã¦ãã¾ããã¨ãã話ã§ããã
Opalã¯ãã§ã«ããªãéçºãé²ãã§ãã¦ãçµã¿è¾¼ã¿ã©ã¤ãã©ãªãæ¨æºã©ã¤ãã©ãªãå®è£
ããã¦ãããRailsãSinatraã¨ã®é£æºãjQueryã®ãã¤ã³ããªã©ããããOpalç¨ã²ã¼ã ã©ã¤ãã©ãªã¾ã§ããã
éã«æ¬ ç¹ã¯ã¨è¨ãã¨ãå¤æããé½åã§ç´æ¥JavaScriptãæ¸ããããé
ãã¨ããæååã®ç ´å£çå¤æ´ãã§ããªãã¨ãããããªæããæååã®ç ´å£çå¤æ´ã¯ããããããã¾ããããªãã®ã§åºæ¬çã«ã¯éåæã¯ãã¾ãç¡ãã
opal-parser.js
Opalã¯Rubyã§æ¸ãããã½ããã¦ã§ã¢ãªã®ã§ãOpalèªèº«ãOpalã§JavaScriptåãããã¨ãã§ããããã¶ãããã§ä½ãããã®ã§ã¯ãªããã¨æããã®ã®ã²ã¨ã¤ã«opal-parser.jsã¨ãããã®ããããããã¤ããµã¤ãã«èªã¿è¾¼ãã§ããã¨ãscriptã¿ã°ã§type="text/ruby"ã¨æå®ãããã¨ã§HTMLä¸ã«ç´æ¥Rubyã®ã³ã¼ããæ¸ããããã«ãªããå®è¡æå¤æã§ãããããããevalç¨ã«åå¨ããããããªããã¨ã
ãã§ãã試ãã§ããã¤ã使ã£ã¦ãµã³ãã«ãä½ã£ã¦ã¿ããJavaScriptã«å¤æããã³ã¼ããå
¬éããã¨ã¤ã³ãã¯ããç¡ãããopal-parser.jsã§HTMLåãè¾¼ã¿Rubyã³ã¼ããå®è¡ããã¨ã¤ã³ãã¯ããããªãããã
opalサンプル
ãµã³ãã«è§£èª¬
ã¤ã£ã¦ãyharaさんの記事のサンプルã¨ãããã§ä½¿ããã¦ãyeahã®ã³ã¼ããåèã«ãã¦ããã®ã§åãããªãã¨ã¯è¨ããªãã®ã ãã
ã¨ãããããã£ãã®ãµã³ãã«ãåããã¦ããããã¨ãã«ã¼ã½ã«ãã¼ã§ç»åãåãã®ããããã ããããã§ãã½ã¼ã¹ã表示ããã¨ä¸ã®ã»ãã«Rubyã£ã½ãã³ã¼ããæ¸ãã¦ããããã ãããã«æ¸ãã¦ããã³ã¼ãã¯DXRubyã®è¶
ç°¡æäºæã¤ã³ã¿ã¼ãã§ã¤ã¹ã®å®ç¾©ã§ãä¸çªä¸ã®onload doãendã®ä¸ãè¦ã¦ãããã¨ã¡ã¤ã³ã®ã³ã¼ãã¯DXRubyç¨ãµã³ãã«ãã®ã¾ã¾ã§ãããã¨ãããããã¤ããããªæããæ¼ã£ã¦ããã
ã§ã¯é çªã«è¡ã£ã¦ã¿ãããOpalã®é°å²æ°ã¨ã¤ãããä¼ããã°ä»åã®è¨äºã®ä¾¡å¤ããããã¨ãããã®ã ã
Imageã¯ã©ã¹
class Image def self.load(filename) image = Native(`new Image()`) image.src = filename image end end
``ã§æ¬ãã¨ãã®ä¸ã¯JavaScriptã¨ãã¦å®è¡ããããRubyã®ä¸ã«JavaScriptãåãè¾¼ããã¨ããæç¹ã§ãã§ã«ä½ããããããããã§ãNativeã¡ã½ããã«æ¸¡ãã¨JavaScriptã®ãªãã¸ã§ã¯ããRubyãªãã¸ã§ã¯ãã«å¤æããã¦ãããç¨ã®é¢æ°ãRubyããå¼ã¹ãããã«ãªãããã¶ãããã使ãã¨JavaScriptç¨ã²ã¼ã ã©ã¤ãã©ãªãªã©ããã®ã¾ã¾ä½¿ããããã«ãªãã®ã§ãpixiã¨ãããã¶ããã®ã¾ã¾ä½¿ããã
ã¨ãããã¨ã§ããã®loadã¡ã½ãããè¿ãã®ã¯DXRubyäºæImageã§ã¯ãªãJavaScriptã®Imageã§ãããImageãã¯ã©ã¹ã«ãã¦ããæå³ãç¡ãããã¾ããæ¬æ°ã§äºæã©ã¤ãã©ãªãä½ããªãããã¯å¤ããå¿
è¦ãããã ããã
Inputã¢ã¸ã¥ã¼ã«
ãã¤ã³ãã¯ãã®é¨åã
%x{ window.addEventListener('keydown', function(event) { #{@tmp_pressed_keys[`event.keyCode`] = true} }); window.addEventListener('keyup', function(event) { #{@tmp_pressed_keys[`event.keyCode`] = nil} }); }
%x{}ã¯JavaScriptåãè¾¼ã¿ã§ãããaddEventListenerã§ãã¼ãã¼ãã¤ãã³ããåãåããJavaScriptã®functionãå¼ãã§ãããããªã®ã ãããã®ä¸ã«è¨è¿°ããã¦ãã#{}ã¯Rubyãåãè¾¼ãè¨æ³ã§ãããã¤ã¾ãfunctionã®å é¨ã¯Rubyã§ãããããã«ãã®ä¸ã«``ã§JavaScriptãåãè¾¼ã¾ãã¦ãããã©ãã¾ã§ããããã ãããfunctionã®å¼æ°eventãä¸çªå å´ã®JavaScriptã§ä½¿ããã¦ããã¨ããã注ç®ã ã
onload
Windowã¢ã¸ã¥ã¼ã«ã¯ã©ãã§ãããã®ã§çç¥ãã¦ãã¡ã¤ã³ã®é¨åã
def onload(&block) `window.onload = block;` end onload do image = Image.load("../img/logo.png") x = y = 100 Window.loop do x += Input.x * 5 y += Input.y * 5 Window.draw(x, y, image) end end
onloadã¡ã½ããã¯æ¸¡ããããããã¯ãJavaScriptã®window.onloadã«ã»ããã・・・ã・・・ï¼
Rubyå´ã®ãã¼ã«ã«å¤æ°ãJavaScriptã§ç´æ¥åç
§ã§ããã¨ããã¨ããããããããRubyã®ãããã¯ããã®ã¾ã¾JavaScriptã«æ¸¡ããã¨ãã§ããã¨ããã®ããããããããå¯è½ãªã®ã¯Rubyã®ãããã¯ãJavaScriptã®functionã«å¤æããã¦ããããã ããã
ã¡ãªã¿ã«Window.loopã¯ãããã¯ãrequestAnimationFrameã§ã³ã¼ã«ããã¯ãããããã«ä½ã£ã¦ããã®ã§ãå®éã«ã¯ã«ã¼ãããªãããã®ã¸ãã¯JavaScriptã®æµåã«æ²¿ã£ã¦ä½ããªãã¨ãããªãã®ã§ãèªåã§ã¦ã£ã³ãã¦ãä½ã£ããããDXRubyã¨ã¯åæ§ã«ã¯ã§ããªããè¦ãç®ã ãåãããã
ããã¾ã
ãã¤ã¦DXRubyããã©ã¦ã¶ã§åãããããã®ã«ãªãããªãã¦ããçãå¦æ³ããã¦ããããã ããç¾å®ã®ã»ããå
ã«è¡ã£ã¦ããããã ãJavaScriptã®è¨èªãã©ã³ã¹ã¬ã¼ã¿æè¡ã¯åã¾ããå¢ãã§é²æ©ãã¦ããã
å½ç¶ãWebSocketãªããã使ã£ã¦ãµã¼ãã¨ã®ããã¨ããªãããã§ããã ãããããã®æã®ã©ã¤ãã©ãªã使ããã¨ãã§ããã¯ãã§ãä¸æ°ã«ä¸çãåºãããããªå¯è½æ§ãæããã
ã¤ã£ã¦ãWebé¢é£ã¯å
¨ãã®ç´ 人(é¿ãã¦ãã)ã§ãã¾ã¨ãã«åä½ããä½ããä½ããã¨ããã°ããããããã¶ãå
ã«ãªãããããªããã¨æãã