Skip to content

Commit 7de7ede

Browse files
committed
Update: rewrite playground with typescript
1 parent f2f6a44 commit 7de7ede

File tree

4 files changed

+331
-198
lines changed

4 files changed

+331
-198
lines changed

playground/index.html

Lines changed: 1 addition & 198 deletions
Original file line numberDiff line numberDiff line change
@@ -219,204 +219,7 @@ <h1>cooklang-rs playground</h1>
219219
</div>
220220
</main>
221221

222-
<script type="module">
223-
import init, { State, version } from "@cooklang/cooklang-ts";
224-
225-
async function run() {
226-
await init();
227-
228-
const editor = ace.edit("editor", {
229-
wrap: true,
230-
printMargin: false,
231-
fontSize: 16,
232-
fontFamily: "Jetbrains Mono",
233-
placeholder: "Write your recipe here",
234-
});
235-
const input = window.sessionStorage.getItem("input") ?? "Write your @recipe here!";
236-
editor.setValue(input);
237-
const output = document.getElementById("output");
238-
const errors = document.getElementById("errors");
239-
const errorsDetails = document.getElementById("errors-details");
240-
const elapsed = document.getElementById("elapsed");
241-
const parserSelect = document.getElementById("parserSelect");
242-
const jsonCheckbox = document.getElementById("json");
243-
const servings = document.getElementById("servings");
244-
const loadUnits = document.getElementById("loadUnits");
245-
document.getElementById("version").textContent = version();
246-
247-
const state = new State();
248-
249-
const search = new URLSearchParams(window.location.search);
250-
if (search.has("json")) {
251-
jsonCheckbox.checked = search.get("json") === "true";
252-
}
253-
if (search.has("loadUnits")) {
254-
const load = search.get("loadUnits") === "true"
255-
state.load_units = load;
256-
}
257-
loadUnits.checked = state.load_units;
258-
if (search.has("extensions")) {
259-
state.extensions = Number(search.get("extensions"));
260-
}
261-
let mode = search.get("mode") || localStorage.getItem("mode");
262-
if (mode !== null) {
263-
parserSelect.value = mode;
264-
setMode(mode);
265-
}
266-
267-
function parse() {
268-
const input = editor.getValue();
269-
window.sessionStorage.setItem("input", input);
270-
switch (parserSelect.value) {
271-
case "full": {
272-
const { value, error } = state.parse_full(input, jsonCheckbox.checked);
273-
output.textContent = value;
274-
errors.innerHTML = error;
275-
break;
276-
}
277-
case "events": {
278-
const events = state.parse_events(input);
279-
output.textContent = events;
280-
errors.innerHTML = "";
281-
break;
282-
}
283-
case "ast": {
284-
const { value, error } = state.parse_ast(input, jsonCheckbox.checked);
285-
output.textContent = value;
286-
errors.innerHTML = error;
287-
break;
288-
}
289-
case "render": {
290-
const { value, error } = state.parse_render(input, servings.value.length === 0 ? null : servings.valueAsNumber);
291-
output.innerHTML = value;
292-
errors.innerHTML = error;
293-
break;
294-
}
295-
case "stdmeta": {
296-
const { value, error } = state.std_metadata(input);
297-
output.innerHTML = value;
298-
errors.innerHTML = error;
299-
break;
300-
}
301-
}
302-
errorsDetails.open = errors.childElementCount !== 0
303-
}
304-
305-
editor.on("change", debounce(parse, 100));
306-
parserSelect.addEventListener("change", (ev) => setMode(ev.target.value));
307-
jsonCheckbox.addEventListener("change", (ev) => {
308-
const params = new URLSearchParams(window.location.search);
309-
if (ev.target.checked) {
310-
params.set("json", "true");
311-
} else {
312-
params.delete("json")
313-
}
314-
window.history.replaceState(
315-
null,
316-
"",
317-
window.location.pathname + "?" + params.toString()
318-
);
319-
parse()
320-
});
321-
loadUnits.addEventListener("change", (ev) => {
322-
const params = new URLSearchParams(window.location.search);
323-
state.load_units = !!ev.target.checked;
324-
if (ev.target.checked) {
325-
params.delete("loadUnits")
326-
} else {
327-
params.set("loadUnits", "false");
328-
}
329-
window.history.replaceState(
330-
null,
331-
"",
332-
window.location.pathname + "?" + params.toString()
333-
);
334-
parse()
335-
});
336-
servings.addEventListener("change", () => parse());
337-
338-
const extensionsContainer = document.getElementById("extensions-container");
339-
340-
const extensions = [
341-
["COMPONENT_MODIFIERS", 1 << 1],
342-
["COMPONENT_ALIAS", 1 << 3],
343-
["ADVANCED_UNITS", 1 << 5],
344-
["MODES", 1 << 6],
345-
["INLINE_QUANTITIES", 1 << 7],
346-
["RANGE_VALUES", 1 << 9],
347-
["TIMER_REQUIRES_TIME", 1 << 10],
348-
["INTERMEDIATE_PREPARATIONS", 1 << 11 | 1 << 1]
349-
];
350-
351-
extensions.forEach(([e, bits]) => {
352-
const elem = document.createElement("input");
353-
elem.setAttribute("type", "checkbox");
354-
elem.setAttribute("id", e);
355-
elem.setAttribute("data-ext-bits", bits);
356-
elem.checked = (state.extensions & bits) === bits;
357-
const label = document.createElement("label");
358-
label.setAttribute("for", e);
359-
label.textContent = e;
360-
const container = document.createElement("div");
361-
container.appendChild(elem);
362-
container.appendChild(label);
363-
extensionsContainer.appendChild(container);
364-
365-
elem.addEventListener("change", updateExtensions);
366-
});
367-
function updateExtensions() {
368-
let e = 0;
369-
document.querySelectorAll("[data-ext-bits]:checked").forEach(elem => {
370-
const bits = Number(elem.getAttribute("data-ext-bits"));
371-
e |= bits;
372-
});
373-
console.log(e);
374-
state.extensions = e;
375-
376-
const params = new URLSearchParams(window.location.search);
377-
params.set("extensions", e);
378-
window.history.replaceState(
379-
null,
380-
"",
381-
window.location.pathname + "?" + params.toString()
382-
);
383-
parse();
384-
}
385-
386-
function setMode(mode) {
387-
const params = new URLSearchParams(window.location.search);
388-
params.set("mode", mode);
389-
window.history.replaceState(
390-
null,
391-
"",
392-
window.location.pathname + "?" + params.toString()
393-
);
394-
document.getElementById("jsoncontainer").hidden = mode === "render" || mode === "events";
395-
document.getElementById("servingscontainer").hidden = mode !== "render";
396-
localStorage.setItem("mode", mode);
397-
parse();
398-
}
399-
400-
editor.focus();
401-
parse();
402-
}
403-
404-
function debounce(fn, delay) {
405-
let timer = null;
406-
let first = true;
407-
return () => {
408-
if (first) {
409-
fn();
410-
first = false;
411-
} else {
412-
clearTimeout(timer);
413-
timer = setTimeout(fn, delay);
414-
}
415-
};
416-
}
417-
418-
run();
419-
</script>
222+
<script type="module" src="./main.ts"></script>
420223
</body>
421224

422225
</html>

0 commit comments

Comments
 (0)