/documentation/docs/browser.html

http://github.com/jashkenas/coffee-script · HTML · 301 lines · 213 code · 88 blank · 0 comment · 0 complexity · 5d1fa6cd4cbb9fbb88170d0c9779ee6b MD5 · raw file

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>browser.coffee</title>
  5. <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  6. <meta name="viewport" content="width=device-width, target-densitydpi=160dpi, initial-scale=1.0; maximum-scale=1.0; user-scalable=0;">
  7. <link rel="stylesheet" media="all" href="docco.css" />
  8. </head>
  9. <body>
  10. <div id="container">
  11. <div id="background"></div>
  12. <ul id="jump_to">
  13. <li>
  14. <a class="large" href="javascript:void(0);">Jump To &hellip;</a>
  15. <a class="small" href="javascript:void(0);">+</a>
  16. <div id="jump_wrapper">
  17. <div id="jump_page_wrapper">
  18. <div id="jump_page">
  19. <a class="source" href="browser.html">
  20. browser.coffee
  21. </a>
  22. <a class="source" href="cake.html">
  23. cake.coffee
  24. </a>
  25. <a class="source" href="coffee-script.html">
  26. coffee-script.coffee
  27. </a>
  28. <a class="source" href="command.html">
  29. command.coffee
  30. </a>
  31. <a class="source" href="grammar.html">
  32. grammar.coffee
  33. </a>
  34. <a class="source" href="helpers.html">
  35. helpers.coffee
  36. </a>
  37. <a class="source" href="index.html">
  38. index.coffee
  39. </a>
  40. <a class="source" href="lexer.html">
  41. lexer.coffee
  42. </a>
  43. <a class="source" href="nodes.html">
  44. nodes.coffee
  45. </a>
  46. <a class="source" href="optparse.html">
  47. optparse.coffee
  48. </a>
  49. <a class="source" href="register.html">
  50. register.coffee
  51. </a>
  52. <a class="source" href="repl.html">
  53. repl.coffee
  54. </a>
  55. <a class="source" href="rewriter.html">
  56. rewriter.coffee
  57. </a>
  58. <a class="source" href="scope.html">
  59. scope.litcoffee
  60. </a>
  61. <a class="source" href="sourcemap.html">
  62. sourcemap.litcoffee
  63. </a>
  64. </div>
  65. </div>
  66. </li>
  67. </ul>
  68. <ul class="sections">
  69. <li id="title">
  70. <div class="annotation">
  71. <h1>browser.coffee</h1>
  72. </div>
  73. </li>
  74. <li id="section-1">
  75. <div class="annotation">
  76. <div class="pilwrap ">
  77. <a class="pilcrow" href="#section-1">&#182;</a>
  78. </div>
  79. <p>This <strong>Browser</strong> compatibility layer extends core CoffeeScript functions
  80. to make things work smoothly when compiling code directly in the browser.
  81. We add support for loading remote Coffee scripts via <strong>XHR</strong>, and
  82. <code>text/coffeescript</code> script tags, source maps via data-URLs, and so on.</p>
  83. </div>
  84. <div class="content"><div class='highlight'><pre>
  85. CoffeeScript = <span class="hljs-built_in">require</span> <span class="hljs-string">'./coffee-script'</span>
  86. CoffeeScript.<span class="hljs-built_in">require</span> = <span class="hljs-built_in">require</span>
  87. compile = CoffeeScript.compile</pre></div></div>
  88. </li>
  89. <li id="section-2">
  90. <div class="annotation">
  91. <div class="pilwrap ">
  92. <a class="pilcrow" href="#section-2">&#182;</a>
  93. </div>
  94. <p>Use standard JavaScript <code>eval</code> to eval code.</p>
  95. </div>
  96. <div class="content"><div class='highlight'><pre>CoffeeScript.<span class="hljs-function"><span class="hljs-title">eval</span> = <span class="hljs-params">(code, options = {})</span> -&gt;</span>
  97. options.bare ?= <span class="hljs-literal">on</span>
  98. eval compile code, options</pre></div></div>
  99. </li>
  100. <li id="section-3">
  101. <div class="annotation">
  102. <div class="pilwrap ">
  103. <a class="pilcrow" href="#section-3">&#182;</a>
  104. </div>
  105. <p>Running code does not provide access to this scope.</p>
  106. </div>
  107. <div class="content"><div class='highlight'><pre>CoffeeScript.<span class="hljs-function"><span class="hljs-title">run</span> = <span class="hljs-params">(code, options = {})</span> -&gt;</span>
  108. options.bare = <span class="hljs-literal">on</span>
  109. options.shiftLine = <span class="hljs-literal">on</span>
  110. Function(compile code, options)()</pre></div></div>
  111. </li>
  112. <li id="section-4">
  113. <div class="annotation">
  114. <div class="pilwrap ">
  115. <a class="pilcrow" href="#section-4">&#182;</a>
  116. </div>
  117. <p>If were not in a browser environment, were finished with the public API.</p>
  118. </div>
  119. <div class="content"><div class='highlight'><pre><span class="hljs-keyword">return</span> <span class="hljs-keyword">unless</span> <span class="hljs-built_in">window</span>?</pre></div></div>
  120. </li>
  121. <li id="section-5">
  122. <div class="annotation">
  123. <div class="pilwrap ">
  124. <a class="pilcrow" href="#section-5">&#182;</a>
  125. </div>
  126. <p>Include source maps where possible. If weve got a base64 encoder, a
  127. JSON serializer, and tools for escaping unicode characters, were good to go.
  128. Ported from <a href="https://developer.mozilla.org/en-US/docs/DOM/window.btoa">https://developer.mozilla.org/en-US/docs/DOM/window.btoa</a></p>
  129. </div>
  130. <div class="content"><div class='highlight'><pre><span class="hljs-keyword">if</span> btoa? <span class="hljs-keyword">and</span> JSON? <span class="hljs-keyword">and</span> unescape? <span class="hljs-keyword">and</span> encodeURIComponent?
  131. <span class="hljs-function"><span class="hljs-title">compile</span> = <span class="hljs-params">(code, options = {})</span> -&gt;</span>
  132. options.sourceMap = <span class="hljs-literal">true</span>
  133. options.inline = <span class="hljs-literal">true</span>
  134. {js, v3SourceMap} = CoffeeScript.compile code, options
  135. <span class="hljs-string">"<span class="hljs-subst">#{js}</span>\n//# sourceMappingURL=data:application/json;base64,<span class="hljs-subst">#{btoa unescape encodeURIComponent v3SourceMap}</span>\n//# sourceURL=coffeescript"</span></pre></div></div>
  136. </li>
  137. <li id="section-6">
  138. <div class="annotation">
  139. <div class="pilwrap ">
  140. <a class="pilcrow" href="#section-6">&#182;</a>
  141. </div>
  142. <p>Load a remote script from the current domain via XHR.</p>
  143. </div>
  144. <div class="content"><div class='highlight'><pre>CoffeeScript.<span class="hljs-function"><span class="hljs-title">load</span> = <span class="hljs-params">(url, callback, options = {}, hold = <span class="hljs-literal">false</span>)</span> -&gt;</span>
  145. options.sourceFiles = [url]
  146. xhr = <span class="hljs-keyword">if</span> <span class="hljs-built_in">window</span>.ActiveXObject
  147. <span class="hljs-keyword">new</span> <span class="hljs-built_in">window</span>.ActiveXObject(<span class="hljs-string">'Microsoft.XMLHTTP'</span>)
  148. <span class="hljs-keyword">else</span>
  149. <span class="hljs-keyword">new</span> <span class="hljs-built_in">window</span>.XMLHttpRequest()
  150. xhr.open <span class="hljs-string">'GET'</span>, url, <span class="hljs-literal">true</span>
  151. xhr.overrideMimeType <span class="hljs-string">'text/plain'</span> <span class="hljs-keyword">if</span> <span class="hljs-string">'overrideMimeType'</span> <span class="hljs-keyword">of</span> xhr
  152. xhr.<span class="hljs-function"><span class="hljs-title">onreadystatechange</span> = -&gt;</span>
  153. <span class="hljs-keyword">if</span> xhr.readyState <span class="hljs-keyword">is</span> <span class="hljs-number">4</span>
  154. <span class="hljs-keyword">if</span> xhr.status <span class="hljs-keyword">in</span> [<span class="hljs-number">0</span>, <span class="hljs-number">200</span>]
  155. param = [xhr.responseText, options]
  156. CoffeeScript.run param... <span class="hljs-keyword">unless</span> hold
  157. <span class="hljs-keyword">else</span>
  158. <span class="hljs-keyword">throw</span> <span class="hljs-keyword">new</span> Error <span class="hljs-string">"Could not load <span class="hljs-subst">#{url}</span>"</span>
  159. callback param <span class="hljs-keyword">if</span> callback
  160. xhr.send <span class="hljs-literal">null</span></pre></div></div>
  161. </li>
  162. <li id="section-7">
  163. <div class="annotation">
  164. <div class="pilwrap ">
  165. <a class="pilcrow" href="#section-7">&#182;</a>
  166. </div>
  167. <p>Activate CoffeeScript in the browser by having it compile and evaluate
  168. all script tags with a content-type of <code>text/coffeescript</code>.
  169. This happens on page load.</p>
  170. </div>
  171. <div class="content"><div class='highlight'><pre><span class="hljs-function"><span class="hljs-title">runScripts</span> = -&gt;</span>
  172. scripts = <span class="hljs-built_in">window</span>.<span class="hljs-built_in">document</span>.getElementsByTagName <span class="hljs-string">'script'</span>
  173. coffeetypes = [<span class="hljs-string">'text/coffeescript'</span>, <span class="hljs-string">'text/literate-coffeescript'</span>]
  174. coffees = (s <span class="hljs-keyword">for</span> s <span class="hljs-keyword">in</span> scripts <span class="hljs-keyword">when</span> s.type <span class="hljs-keyword">in</span> coffeetypes)
  175. index = <span class="hljs-number">0</span>
  176. <span class="hljs-function"><span class="hljs-title">execute</span> = -&gt;</span>
  177. param = coffees[index]
  178. <span class="hljs-keyword">if</span> param <span class="hljs-keyword">instanceof</span> Array
  179. CoffeeScript.run param...
  180. index++
  181. execute()
  182. <span class="hljs-keyword">for</span> script, i <span class="hljs-keyword">in</span> coffees
  183. <span class="hljs-keyword">do</span> <span class="hljs-function"><span class="hljs-params">(script, i)</span> -&gt;</span>
  184. options = <span class="hljs-attribute">literate</span>: script.type <span class="hljs-keyword">is</span> coffeetypes[<span class="hljs-number">1</span>]
  185. source = script.src <span class="hljs-keyword">or</span> script.getAttribute(<span class="hljs-string">'data-src'</span>)
  186. <span class="hljs-keyword">if</span> source
  187. CoffeeScript.load source,
  188. <span class="hljs-function"><span class="hljs-params">(param)</span> -&gt;</span>
  189. coffees[i] = param
  190. execute()
  191. options
  192. <span class="hljs-literal">true</span>
  193. <span class="hljs-keyword">else</span>
  194. options.sourceFiles = [<span class="hljs-string">'embedded'</span>]
  195. coffees[i] = [script.innerHTML, options]
  196. execute()</pre></div></div>
  197. </li>
  198. <li id="section-8">
  199. <div class="annotation">
  200. <div class="pilwrap ">
  201. <a class="pilcrow" href="#section-8">&#182;</a>
  202. </div>
  203. <p>Listen for window load, both in decent browsers and in IE.</p>
  204. </div>
  205. <div class="content"><div class='highlight'><pre><span class="hljs-keyword">if</span> <span class="hljs-built_in">window</span>.addEventListener
  206. <span class="hljs-built_in">window</span>.addEventListener <span class="hljs-string">'DOMContentLoaded'</span>, runScripts, <span class="hljs-literal">no</span>
  207. <span class="hljs-keyword">else</span>
  208. <span class="hljs-built_in">window</span>.attachEvent <span class="hljs-string">'onload'</span>, runScripts</pre></div></div>
  209. </li>
  210. </ul>
  211. </div>
  212. </body>
  213. </html>