add emscripten target
This commit is contained in:
parent
eea9fcd427
commit
b5321c7ed3
5 changed files with 145 additions and 2 deletions
8
.gitignore
vendored
8
.gitignore
vendored
|
|
@ -1,2 +1,6 @@
|
||||||
ana
|
/ana
|
||||||
dict.bin
|
/ana.js
|
||||||
|
/ana.js.mem
|
||||||
|
/anamodule.so
|
||||||
|
/dict.bin
|
||||||
|
/words
|
||||||
|
|
|
||||||
10
Makefile
10
Makefile
|
|
@ -33,8 +33,18 @@ CXXFLAGS := -g $(call cc-option,-std=c++11,-std=c++0x) -Wall
|
||||||
|
|
||||||
all: ana anamodule.so
|
all: ana anamodule.so
|
||||||
|
|
||||||
|
ana.js: $(wildcard *.cc) $(wildcard *.h) Makefile words
|
||||||
|
em++ -Os --bind -std=c++11 -s TOTAL_MEMORY=33554432 --embed-file words -DANA_AS_JS run.cc -o ana.js
|
||||||
|
|
||||||
|
words:
|
||||||
|
grep '^[a-z]*$$' /usr/share/dict/words > $@
|
||||||
|
|
||||||
ana: $(wildcard *.cc) $(wildcard *.h) Makefile
|
ana: $(wildcard *.cc) $(wildcard *.h) Makefile
|
||||||
$(CXX) $(CXXFLAGS) -fwhole-program -o $@ $(filter %.cc, $^)
|
$(CXX) $(CXXFLAGS) -fwhole-program -o $@ $(filter %.cc, $^)
|
||||||
anamodule.so: $(wildcard *.cc) $(wildcard *.h) Makefile
|
anamodule.so: $(wildcard *.cc) $(wildcard *.h) Makefile
|
||||||
$(CXX) $(CXXFLAGS) $(CXXFLAGS_PYTHON) -o $@ $(filter %.cc, $^) \
|
$(CXX) $(CXXFLAGS) $(CXXFLAGS_PYTHON) -o $@ $(filter %.cc, $^) \
|
||||||
$(LFLAGS_PYTHON)
|
$(LFLAGS_PYTHON)
|
||||||
|
|
||||||
|
publish: ana.js ana.html ana.js.mem
|
||||||
|
git branch -D gh-pages || true
|
||||||
|
./import ana.js ana.js.mem index.html=ana.html | git fast-import --date-format=now
|
||||||
|
|
|
||||||
67
ana.html
Normal file
67
ana.html
Normal file
|
|
@ -0,0 +1,67 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<meta name="viewport" content="width=device-width">
|
||||||
|
<head>
|
||||||
|
<title>Surly Anagram Server (emscripted)</title>
|
||||||
|
<style>
|
||||||
|
@media screen and (min-width: 680px) { #cheatsheet { float: right; } }
|
||||||
|
#cheatsheet { font-size: 71%; cursor: pointer; }
|
||||||
|
#cheatsheet table, #cheatsheet caption { background: #d9d9d9; color: #000; }
|
||||||
|
#cheatsheet.hidden { cursor: zoom-in; }
|
||||||
|
#cheatsheet caption:after { content: "«" }
|
||||||
|
#cheatsheet.hidden caption:after { content: "»" }
|
||||||
|
#cheatsheet.hidden tbody { display: none; }
|
||||||
|
//#cheatsheet { float: right; }
|
||||||
|
#cheatsheet th { text-align: left }
|
||||||
|
#cheatsheet caption { font-weight: bold; }
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="cheatsheet"
|
||||||
|
onclick="document.getElementById('cheatsheet').classList.toggle('hidden')">
|
||||||
|
<table>
|
||||||
|
<caption>Cheatsheet</caption>
|
||||||
|
<tr><th>letters... <td> Letters available to anagram
|
||||||
|
<tr><th>=word <td> word must be in result
|
||||||
|
<tr><th>>n <td> words must contain at least n letters
|
||||||
|
<tr><th><n <td> words must contain at most n letters
|
||||||
|
<tr><th>' <td> words with apostrophes are considered
|
||||||
|
<tr><th>n <td> choose a word with exactly n letters
|
||||||
|
<tr><th>-n <td> display at most n results (limit 1000)
|
||||||
|
<tr><th>? <td> display candidate words, not whole phrases
|
||||||
|
<tr><td colspan=2>In ajax mode, hit enter or click "anagram" to do get full results
|
||||||
|
<tr><td colspan=2>Source (web app and unix commandline program) on
|
||||||
|
<a href="https://github.com/jepler/anagram">github</a>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<form id="f" onsubmit="javascript:update();return false"><input type="text" id="query" name="q" value="" oninput="javascript:update()">
|
||||||
|
</form>
|
||||||
|
<pre id="results">
|
||||||
|
<script>
|
||||||
|
var last = '';
|
||||||
|
var Module;
|
||||||
|
if(typeof Module==="undefined") Module={};
|
||||||
|
Module['onRuntimeInitialized'] = function() {
|
||||||
|
update = function() {
|
||||||
|
var search = document.getElementById("query").value;
|
||||||
|
document.location.hash = '#' + search;
|
||||||
|
if(search == last) return false;;
|
||||||
|
document.getElementById("results").innerText=Module.ana(search);
|
||||||
|
last = search;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if(document.location.hash) {
|
||||||
|
document.getElementById("query").value = decodeURIComponent(
|
||||||
|
document.location.hash.substr(1));
|
||||||
|
update();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
<script src="ana.js"></script>
|
||||||
|
<script>
|
||||||
|
document.getElementById("query").focus()
|
||||||
|
</script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
37
import
Executable file
37
import
Executable file
|
|
@ -0,0 +1,37 @@
|
||||||
|
#!/usr/bin/python3
|
||||||
|
import argparse
|
||||||
|
import glob
|
||||||
|
import os
|
||||||
|
import subprocess
|
||||||
|
import sys
|
||||||
|
|
||||||
|
|
||||||
|
parser = argparse.ArgumentParser()
|
||||||
|
parser.add_argument("--branch", metavar='branch', default="gh-pages",
|
||||||
|
help="branch to use (any old contents are destroyed)")
|
||||||
|
parser.add_argument('files', metavar='files', nargs='+',
|
||||||
|
help='files to be committed')
|
||||||
|
|
||||||
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
version = subprocess.getoutput("git describe --always --dirty")
|
||||||
|
|
||||||
|
fd = os.fdopen(sys.stdout.fileno(), 'wb')
|
||||||
|
|
||||||
|
fd.write(b"commit refs/heads/" + args.branch.encode('utf-8') + b"\n")
|
||||||
|
fd.write(b"committer Doc Man <noreply@example.com> now" + b"\n")
|
||||||
|
fd.write(b"data <<EOF" + b"\n")
|
||||||
|
fd.write(b"Docs built at " + version.encode('utf-8') + b"\n")
|
||||||
|
fd.write(b"EOF" + b"\n")
|
||||||
|
|
||||||
|
for fn in args.files:
|
||||||
|
if '=' in fn:
|
||||||
|
dest, src = fn.split('=', 1)
|
||||||
|
else:
|
||||||
|
dest = src = fn
|
||||||
|
with open(src, 'rb') as f: contents = f.read()
|
||||||
|
fd.write(b"M 644 inline " + os.path.basename(dest).encode('utf-8') + b"\n")
|
||||||
|
fd.write(b"data " + str(len(contents)).encode("utf-8") + b"\n")
|
||||||
|
fd.write(contents)
|
||||||
|
fd.write(b"done\n")
|
||||||
|
|
||||||
25
run.cc
25
run.cc
|
|
@ -718,6 +718,31 @@ initana(void) {
|
||||||
PyModule_AddObject(m, "anadict", (PyObject *)&dict_type);
|
PyModule_AddObject(m, "anadict", (PyObject *)&dict_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#elif defined(ANA_AS_JS)
|
||||||
|
#include <emscripten/bind.h>
|
||||||
|
|
||||||
|
dict d;
|
||||||
|
|
||||||
|
std::string js_run(std::string s) {
|
||||||
|
std::string result;
|
||||||
|
ana_cfg cfg;
|
||||||
|
ana_st st;
|
||||||
|
parse(s, cfg, false, false, 3, 11, 1000);
|
||||||
|
setup(st, cfg, d);
|
||||||
|
while(1) {
|
||||||
|
std::string line;
|
||||||
|
bool res = step(st, line);
|
||||||
|
result += line; result += "\n";
|
||||||
|
if(!res) break;
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
EMSCRIPTEN_BINDINGS(ana) {
|
||||||
|
emscripten::function("ana", &js_run);
|
||||||
|
d.readdict("words");
|
||||||
|
}
|
||||||
|
|
||||||
#else
|
#else
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue