Skip to content

Instantly share code, notes, and snippets.

@siriux
Created July 20, 2013 09:35
Show Gist options
  • Save siriux/6044456 to your computer and use it in GitHub Desktop.
Save siriux/6044456 to your computer and use it in GitHub Desktop.
Code to load ScalaJS files dynamically during development: See: https://groups.google.com/forum/?fromgroups#!topic/scala-js/kZMM6vvXs68
<!DOCTYPE html>
<html>
<head>
<title>Hello world - Scala.js example</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>
<body>
<div id="playground">
</div>
<script type="application/javascript" src="jquery.js"></script>
<script type="application/javascript" src="scalajs-corejslib.js"></script>
<script type="application/javascript">
function loadDynamically(obj) {
return Proxy.create({
get: function(proxy, name) {
if (!(name in obj)) {
var file = name.replace('\ufe33', '.')
jQuery.ajax({
url: file,
async: false
});
}
return obj[name];
},
set: function(receiver, name, val) {
obj[name] = val;
}
});
}
// Create dynamic loaders
ScalaJS.g = loadDynamically(ScalaJS.g);
ScalaJS.data = loadDynamically(ScalaJS.data);
ScalaJS.c = loadDynamically(ScalaJS.c);
ScalaJS.inheritable = loadDynamically(ScalaJS.inheritable);
ScalaJS.classes = loadDynamically(ScalaJS.classes);
ScalaJS.impls = loadDynamically(ScalaJS.impls);
ScalaJS.moduleInstances = loadDynamically(ScalaJS.moduleInstances);
ScalaJS.modules = loadDynamically(ScalaJS.modules);
ScalaJS.is = loadDynamically(ScalaJS.is);
ScalaJS.as = loadDynamically(ScalaJS.as);
ScalaJS.isArrayOf = loadDynamically(ScalaJS.isArrayOf);
ScalaJS.asArrayOf = loadDynamically(ScalaJS.asArrayOf);
ScalaJS.natives = loadDynamically(ScalaJS.natives);
// Start
ScalaJS.modules.helloworld\ufe33HelloWorld().main();
</script>
</body>
</html>
import SimpleHTTPServer
import SocketServer
import os
import fnmatch
import re
basePaths = ['target/scala-2.10/classes', '../../scalalib/target/scala-2.10/classes']
fileMapping = {}
def addJsFiles(path):
removeNumber = re.compile(r"^\d*-?(.*)\.js")
for root, dirnames, filenames in os.walk(path):
for filename in fnmatch.filter(filenames, '*.js'):
className = os.path.relpath(root, path).replace('/', '.') + "." + removeNumber.sub(r"\1", filename)
filePath = os.path.join(root, filename)
fileMapping[className] = filePath
if className[-1] == '$':
fileMapping[className[:-1]] = filePath
for path in basePaths:
addJsFiles(path)
class ScalaJsHandler(SimpleHTTPServer.SimpleHTTPRequestHandler):
def return_file(self, file, type):
f = open(file)
self.send_response(200)
self.send_header('Content-type', type)
self.end_headers()
self.wfile.write(f.read())
f.close()
def do_GET(self):
if self.path == '/':
return self.return_file('helloworld-dynamic.html', 'text/html')
if self.path == '/scalajs-corejslib.js':
return self.return_file('../../corejslib/target/scalajs-corejslib.js', 'application/javascript')
if self.path == '/jquery.js':
return self.return_file('jquery-1.9.1.min.js', 'application/javascript')
className = self.path[1:]
print className
if className in fileMapping:
return self.return_file(fileMapping[className], 'application/javascript')
pywebserver = SocketServer.TCPServer(("", 8001), ScalaJsHandler)
pywebserver.serve_forever()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment