Skip to content

Commit 39c59c0

Browse files
committed
PHP Show & Tell Fun
1 parent 96a5e18 commit 39c59c0

File tree

6 files changed

+92
-5
lines changed

6 files changed

+92
-5
lines changed

Diff for: docs/core.js

+2-2
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: docs/core.js.map

+1-1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: esm/interpreter/php-wasm.js

+70
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,70 @@
1+
import { dedent } from '../utils.js';
2+
import { io, stdio } from './_utils.js';
3+
4+
const type = 'php-wasm';
5+
6+
// TODO: almost nothing is implemented
7+
8+
// REQUIRES INTEGRATION TEST
9+
/* c8 ignore start */
10+
export default {
11+
type,
12+
module: (version = '0.0.3') => `https://cdn.jsdelivr.net/npm/@webreflection/php@${version}/es.js`,
13+
async engine({ PhpWeb }, _, url) {
14+
const { stderr, get } = stdio();
15+
const interpreter = await new Promise(resolve => {
16+
let timer = 0, chunks = [];
17+
const php = new PhpWeb({
18+
print: (message) => {
19+
chunks.push(message);
20+
clearTimeout(timer);
21+
timer = setTimeout(() => {
22+
document.getElementById('target').innerHTML = chunks.splice(0).join('');
23+
});
24+
},
25+
printErr: (message) => {
26+
if (message) stderr(message);
27+
},
28+
locateFile: () => `${url.slice(0, url.lastIndexOf('/'))}/php-web.wasm`
29+
});
30+
php.addEventListener('ready', () => {
31+
resolve(get(php));
32+
});
33+
});
34+
// TODO: to be implemented
35+
// if (config.files) await fetchFiles(this, interpreter, config.files);
36+
// if (config.fetch) await fetchPaths(this, interpreter, config.fetch);
37+
return interpreter;
38+
},
39+
// Fallback to globally defined module fields
40+
registerJSModule: () => {
41+
// TODO: to be implemented
42+
},
43+
run: (interpreter, code, ...args) => {
44+
// TODO: this is always async
45+
try {
46+
return interpreter.run(`<?php ${dedent(code)} ?>`, ...args);
47+
}
48+
catch (error) {
49+
io.get(interpreter).stderr(error);
50+
}
51+
},
52+
runAsync: async (interpreter, code, ...args) => {
53+
try {
54+
return await interpreter.run(`<?php ${dedent(code)} ?>`, ...args);
55+
}
56+
catch (error) {
57+
io.get(interpreter).stderr(error);
58+
}
59+
},
60+
runEvent: async () => {
61+
// TODO: to be implemented
62+
throw new SyntaxError('runEvent are not implemented');
63+
},
64+
transform: (_, value) => value,
65+
writeFile: () => {
66+
// TODO: to be implemented
67+
throw new SyntaxError('writeFile is not implemented');
68+
},
69+
};
70+
/* c8 ignore stop */

Diff for: esm/interpreters.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,9 @@ const register = (interpreter) => {
5353

5454
//:RUNTIMES
5555
import micropython from './interpreter/micropython.js';
56+
import php_wasm from './interpreter/php-wasm.js';
5657
import pyodide from './interpreter/pyodide.js';
5758
import ruby_wasm_wasi from './interpreter/ruby-wasm-wasi.js';
5859
import wasmoon from './interpreter/wasmoon.js';
59-
for (const interpreter of [micropython, pyodide, ruby_wasm_wasi, wasmoon])
60+
for (const interpreter of [micropython, php_wasm, pyodide, ruby_wasm_wasi, wasmoon])
6061
register(interpreter);

Diff for: package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,6 @@
7171
"html-escaper": "^3.0.3"
7272
},
7373
"worker": {
74-
"blob": "sha256-ixJNXrBnwM18zoc4l44JmnNzgD+eoNpGaOcZz3dXP94="
74+
"blob": "sha256-i+V1onL/+r/OO5XheOe/tvzQ2olHFpxNdK0KmoQnHF4="
7575
}
7676
}

Diff for: test/php-wasm.html

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<!doctype html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8" />
5+
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
6+
<title>PHP</title>
7+
<link rel="stylesheet" href="style.css" />
8+
<script type="module" src="../core.js"></script>
9+
</head>
10+
<body>
11+
<script type="php-wasm">
12+
phpinfo();
13+
</script>
14+
<div id="target"></div>
15+
</body>
16+
</html>

0 commit comments

Comments
 (0)