update containers

This commit is contained in:
sevki 2024-06-23 21:16:55 +01:00
parent f5e12fa69c
commit e17781d8ca
8 changed files with 409 additions and 155 deletions

View file

@ -75,6 +75,9 @@ ENV CARGO_HOME=/root/.cargo
# install wasm32-unknown-unknown
RUN rustup target add wasm32-unknown-unknown
# update rust
RUN rustup update
RUN curl https://raw.githubusercontent.com/SeaQL/FireDBG.for.Rust/main/install.sh -sSf | sh
WORKDIR /workspaces

View file

@ -21,22 +21,16 @@ on:
jobs:
rust-clippy-analyze:
name: Run rust-clippy analyzing
runs-on: ubuntu-latest
container: ghcr.io/sevki/devcontainer:main
runs-on: self-hosted
permissions:
contents: read
security-events: write
actions: read # only required for a private repository by github/codeql-action/upload-sarif to get the Action run status
steps:
- name: Tailscale
uses: tailscale/github-action@v2
with:
oauth-client-id: ${{ secrets.TS_OAUTH_CLIENT_ID }}
oauth-secret: ${{ secrets.TS_OAUTH_SECRET }}
tags: tag:ci
version: 1.66.4
args: --accept-routes --accept-dns
- name: Modify hosts file
run: |
echo "66.241.125.220 ok.software" >> /etc/hosts
- name: Checkout code
uses: actions/checkout@v2

View file

@ -28,16 +28,11 @@ jobs:
# Build job
build:
runs-on: ubuntu-latest
container: ghcr.io/oknotokcomputer/devcontainer/base:latest
container: ghcr.io/sevki/devcontainer:main
env:
MDBOOK_VERSION: 0.4.40
steps:
- uses: actions/checkout@v4
- name: Install mdBook
run: |
curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf -y | sh
rustup update
cargo install --version ${MDBOOK_VERSION} mdbook
- uses: actions/checkout@v4
- name: rustup update
run: |
rustup toolchain install ${{ matrix.toolchains }}
@ -45,7 +40,10 @@ jobs:
rustup component add clippy
rustup component add rust-src
rustup target add ${{ matrix.targets }}
rustup update
rustup update
- name: Install mdBook
run: |
cargo install --version ${MDBOOK_VERSION} mdbook
- name: Setup Pages
id: pages
uses: actions/configure-pages@v5
@ -60,7 +58,6 @@ jobs:
cd packages/app
npm install
npm run build
- name: Upload artifact
uses: actions/upload-pages-artifact@v3
with:

View file

@ -11,9 +11,10 @@ env:
jobs:
build:
env:
MDBOOK_VERSION: 0.4.40
runs-on: ubuntu-latest
container: ghcr.io/oknotokcomputer/devcontainer/base:latest
container: ghcr.io/sevki/devcontainer:main
strategy:
matrix:
targets: [
@ -37,16 +38,13 @@ jobs:
rustup component add rust-src
rustup target add ${{ matrix.targets }}
rustup update
- name: Build ${{ matrix.packages }} for ${{ matrix.targets }}
run: cargo build -Zbuild-std --verbose --target ${{ matrix.targets }} -p ${{ matrix.packages }}
- name: Test ${{ matrix.packages }} for ${{ matrix.targets }}
run: cargo test --verbose --target ${{ matrix.targets }} -p ${{ matrix.packages }}
# - name: Build ${{ matrix.packages }} for ${{ matrix.targets }}
# run: cargo build --verbose --target ${{ matrix.targets }} -p ${{ matrix.packages }}
# - name: Test ${{ matrix.packages }} for ${{ matrix.targets }}
# run: cargo test --verbose --target ${{ matrix.targets }} -p ${{ matrix.packages }}
- name: Install mdBook
run: |
curl --proto '=https' --tlsv1.2 https://sh.rustup.rs -sSf -y | sh
rustup update
cargo install --version ${MDBOOK_VERSION} mdbook
- name: Setup Pages
id: pages
uses: actions/configure-pages@v5

View file

@ -1,6 +1,6 @@
[toolchain]
channel = "1.78"
channel = "1.79"
components = [
"rust-src",
"rustc-dev",

View file

@ -213,7 +213,7 @@ function makeMutClosure(arg0, arg1, dtor, f) {
CLOSURE_DTORS.register(real, state, state);
return real;
}
function __wbg_adapter_22(arg0, arg1, arg2) {
function __wbg_adapter_20(arg0, arg1, arg2) {
wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__hb27815019b215f9b(arg0, arg1, addHeapObject(arg2));
}
@ -294,7 +294,7 @@ function handleError(f, args) {
wasm.__wbindgen_exn_store(addHeapObject(e));
}
}
function __wbg_adapter_117(arg0, arg1, arg2, arg3) {
function __wbg_adapter_99(arg0, arg1, arg2, arg3) {
wasm.wasm_bindgen__convert__closures__invoke2_mut__h46fcf022e9949c5e(arg0, arg1, addHeapObject(arg2), addHeapObject(arg3));
}
@ -669,6 +669,10 @@ async function __wbg_load(module, imports) {
function __wbg_get_imports() {
const imports = {};
imports.wbg = {};
imports.wbg.__wbg_tokenspan_new = function(arg0) {
const ret = TokenSpan.__wrap(arg0);
return addHeapObject(ret);
};
imports.wbg.__wbindgen_object_drop_ref = function(arg0) {
takeObject(arg0);
};
@ -681,10 +685,6 @@ function __wbg_get_imports() {
const ret = false;
return ret;
};
imports.wbg.__wbg_tokenspan_new = function(arg0) {
const ret = TokenSpan.__wrap(arg0);
return addHeapObject(ret);
};
imports.wbg.__wbindgen_string_new = function(arg0, arg1) {
const ret = getStringFromWasm0(arg0, arg1);
return addHeapObject(ret);
@ -778,41 +778,9 @@ function __wbg_get_imports() {
wasm.__wbindgen_free(deferred0_0, deferred0_1, 1);
}
};
imports.wbg.__wbg_instanceof_Window_a2a08d3918d7d4d0 = function(arg0) {
let result;
try {
result = getObject(arg0) instanceof Window;
} catch (_) {
result = false;
}
const ret = result;
return ret;
};
imports.wbg.__wbg_document_57dfbea142dce550 = function(arg0) {
const ret = getObject(arg0).document;
return isLikeNone(ret) ? 0 : addHeapObject(ret);
};
imports.wbg.__wbg_getElementById_fdca7f1415dc3824 = function(arg0, arg1, arg2) {
const ret = getObject(arg0).getElementById(getStringFromWasm0(arg1, arg2));
return isLikeNone(ret) ? 0 : addHeapObject(ret);
};
imports.wbg.__wbg_setinnerHTML_4e2640423f25caf3 = function(arg0, arg1, arg2) {
getObject(arg0).innerHTML = getStringFromWasm0(arg1, arg2);
};
imports.wbg.__wbg_style_affc67c1e8901162 = function(arg0) {
const ret = getObject(arg0).style;
return addHeapObject(ret);
};
imports.wbg.__wbg_log_a55c8bdc4457c57b = function(arg0) {
console.log(getObject(arg0));
};
imports.wbg.__wbg_setProperty_c3d0b0f9bb2f7e45 = function() { return handleError(function (arg0, arg1, arg2, arg3, arg4) {
getObject(arg0).setProperty(getStringFromWasm0(arg1, arg2), getStringFromWasm0(arg3, arg4));
}, arguments) };
imports.wbg.__wbg_newnoargs_0c0d88a96558f490 = function(arg0, arg1) {
const ret = new Function(getStringFromWasm0(arg0, arg1));
return addHeapObject(ret);
};
imports.wbg.__wbindgen_is_object = function(arg0) {
const val = getObject(arg0);
const ret = typeof(val) === 'object' && val !== null;
@ -826,30 +794,6 @@ function __wbg_get_imports() {
const ret = getObject(arg0).value;
return addHeapObject(ret);
};
imports.wbg.__wbg_call_90fbab7bd21c618e = function() { return handleError(function (arg0, arg1) {
const ret = getObject(arg0).call(getObject(arg1));
return addHeapObject(ret);
}, arguments) };
imports.wbg.__wbg_self_95c25df0896c10fd = function() { return handleError(function () {
const ret = self.self;
return addHeapObject(ret);
}, arguments) };
imports.wbg.__wbg_window_f7bac3df0b2770c0 = function() { return handleError(function () {
const ret = window.window;
return addHeapObject(ret);
}, arguments) };
imports.wbg.__wbg_globalThis_52d4880a7eac7ac3 = function() { return handleError(function () {
const ret = globalThis.globalThis;
return addHeapObject(ret);
}, arguments) };
imports.wbg.__wbg_global_90a45531184ede47 = function() { return handleError(function () {
const ret = global.global;
return addHeapObject(ret);
}, arguments) };
imports.wbg.__wbindgen_is_undefined = function(arg0) {
const ret = getObject(arg0) === undefined;
return ret;
};
imports.wbg.__wbg_new_ddadd9d04e3295e5 = function(arg0, arg1) {
const ret = new Error(getStringFromWasm0(arg0, arg1));
return addHeapObject(ret);
@ -873,7 +817,7 @@ function __wbg_get_imports() {
const a = state0.a;
state0.a = 0;
try {
return __wbg_adapter_117(a, state0.b, arg0, arg1);
return __wbg_adapter_99(a, state0.b, arg0, arg1);
} finally {
state0.a = a;
}
@ -939,8 +883,8 @@ function __wbg_get_imports() {
const ret = wasm.memory;
return addHeapObject(ret);
};
imports.wbg.__wbindgen_closure_wrapper4486 = function(arg0, arg1, arg2) {
const ret = makeMutClosure(arg0, arg1, 1470, __wbg_adapter_22);
imports.wbg.__wbindgen_closure_wrapper4384 = function(arg0, arg1, arg2) {
const ret = makeMutClosure(arg0, arg1, 1476, __wbg_adapter_20);
return addHeapObject(ret);
};

View file

@ -1,65 +1,383 @@
<!doctype html><html lang="en" class="dark" dir=""><head><meta charset="UTF-8"><title>Playground</title><meta name="description" content=""><meta name="viewport" content="width=device-width,initial-scale=1"><meta name="theme-color" content="#ffffff"><link rel="shortcut icon" href="taocp.png"><link rel="stylesheet" href="css/variables.css"><link rel="stylesheet" href="css/general.css"><link rel="stylesheet" href="css/chrome.css"><link rel="stylesheet" href="css/print.css" media="print"><link rel="stylesheet" href="FontAwesome/css/font-awesome.css"><link rel="stylesheet" href="fonts/fonts.css"><link rel="stylesheet" href="highlight.css"><link rel="stylesheet" href="tomorrow-night.css"><link rel="stylesheet" href="ayu-highlight.css"><link rel="stylesheet" href="ok.css"><link rel="preconnect" href="https://fonts.googleapis.com"><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin><link href="https://fonts.googleapis.com/css2?family=Allura&family=Inclusive+Sans:ital@0;1&display=swap" rel="stylesheet"><script type="module" src="app.bundle.js"></script><script type="module" src="editor.worker.bundle.js"></script></head><body class="sidebar-visible no-js"><div id="body-container"><script>var path_to_root = "";
var default_theme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "rust" : "dark";</script><script>try {
var theme = localStorage.getItem('mdbook-theme');
var sidebar = localStorage.getItem('mdbook-sidebar');
<!DOCTYPE html>
<html lang="en" class="dark" dir="">
<head>
<meta charset="UTF-8" />
<title>Playground</title>
<meta name="description" content="" />
<meta name="viewport" content="width=device-width,initial-scale=1" />
<meta name="theme-color" content="#ffffff" />
<link rel="shortcut icon" href="taocp.png" />
<link rel="stylesheet" href="css/variables.css" />
<link rel="stylesheet" href="css/general.css" />
<link rel="stylesheet" href="css/chrome.css" />
<link rel="stylesheet" href="css/print.css" media="print" />
<link rel="stylesheet" href="FontAwesome/css/font-awesome.css" />
<link rel="stylesheet" href="fonts/fonts.css" />
<link rel="stylesheet" href="highlight.css" />
<link rel="stylesheet" href="tomorrow-night.css" />
<link rel="stylesheet" href="ayu-highlight.css" />
<link rel="stylesheet" href="ok.css" />
<link rel="preconnect" href="https://fonts.googleapis.com" />
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin />
<link
href="https://fonts.googleapis.com/css2?family=Allura&family=Inclusive+Sans:ital@0;1&display=swap"
rel="stylesheet"
/>
<script type="module" src="app.bundle.js"></script>
<script type="module" src="editor.worker.bundle.js"></script>
</head>
<body class="sidebar-visible no-js">
<div id="body-container">
<script>
var path_to_root = "";
var default_theme = window.matchMedia("(prefers-color-scheme: dark)")
.matches
? "rust"
: "dark";
</script>
<script>
try {
var theme = localStorage.getItem("mdbook-theme");
var sidebar = localStorage.getItem("mdbook-sidebar");
if (theme.startsWith('"') && theme.endsWith('"')) {
localStorage.setItem('mdbook-theme', theme.slice(1, theme.length - 1));
}
if (theme.startsWith('"') && theme.endsWith('"')) {
localStorage.setItem(
"mdbook-theme",
theme.slice(1, theme.length - 1)
);
}
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
localStorage.setItem('mdbook-sidebar', sidebar.slice(1, sidebar.length - 1));
}
} catch (e) { }</script><script>var theme;
try { theme = localStorage.getItem('mdbook-theme'); } catch(e) { }
if (theme === null || theme === undefined) { theme = default_theme; }
var html = document.querySelector('html');
html.classList.remove('dark')
html.classList.add(theme);
var body = document.querySelector('body');
body.classList.remove('no-js')
body.classList.add('js');</script><input type="checkbox" id="sidebar-toggle-anchor" class="hidden"><script>var body = document.querySelector('body');
var sidebar = null;
var sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
if (document.body.clientWidth >= 1080) {
try { sidebar = localStorage.getItem('mdbook-sidebar'); } catch(e) { }
sidebar = sidebar || 'visible';
} else {
sidebar = 'hidden';
if (sidebar.startsWith('"') && sidebar.endsWith('"')) {
localStorage.setItem(
"mdbook-sidebar",
sidebar.slice(1, sidebar.length - 1)
);
}
} catch (e) {}
</script>
<script>
var theme;
try {
theme = localStorage.getItem("mdbook-theme");
} catch (e) {}
if (theme === null || theme === undefined) {
theme = default_theme;
}
var html = document.querySelector("html");
html.classList.remove("dark");
html.classList.add(theme);
var body = document.querySelector("body");
body.classList.remove("no-js");
body.classList.add("js");
</script>
<input type="checkbox" id="sidebar-toggle-anchor" class="hidden" />
<script>
var body = document.querySelector("body");
var sidebar = null;
var sidebar_toggle = document.getElementById("sidebar-toggle-anchor");
if (document.body.clientWidth >= 1080) {
try {
sidebar = localStorage.getItem("mdbook-sidebar");
} catch (e) {}
sidebar = sidebar || "visible";
} else {
sidebar = "hidden";
}
sidebar_toggle.checked = sidebar === "visible";
body.classList.remove("sidebar-visible");
body.classList.add("sidebar-" + sidebar);
</script>
<nav id="sidebar" class="sidebar" aria-label="Table of contents">
<div class="sidebar-scrollbox">
<ol class="chapter">
<li class="chapter-item expanded">
<a href="0intro.html"
><strong aria-hidden="true">1.</strong> Intro</a
>
</li>
<li class="chapter-item expanded affix"></li>
<li class="part-title">Language</li>
<li class="chapter-item expanded">
<a href="language/0intro.html"
><strong aria-hidden="true">2.</strong> Language</a
>
</li>
<li>
<ol class="section">
<li class="chapter-item expanded">
<a href="examples.html"
><strong aria-hidden="true">2.1.</strong> Examples</a
>
</li>
</ol>
</li>
<li class="chapter-item expanded"></li>
<li class="part-title">Playground</li>
<li class="chapter-item expanded">
<a href="playground.html" class="active"
><strong aria-hidden="true">3.</strong> Playground</a
>
</li>
</ol>
</div>
<div id="sidebar-resize-handle" class="sidebar-resize-handle">
<div class="sidebar-resize-indicator"></div>
</div>
</nav>
<script>
var sidebarScrollbox = document.querySelector(
"#sidebar .sidebar-scrollbox"
);
sidebarScrollbox.addEventListener(
"click",
function (e) {
if (e.target.tagName === "A") {
sessionStorage.setItem(
"sidebar-scroll",
sidebarScrollbox.scrollTop
);
}
sidebar_toggle.checked = sidebar === 'visible';
body.classList.remove('sidebar-visible');
body.classList.add("sidebar-" + sidebar);</script><nav id="sidebar" class="sidebar" aria-label="Table of contents"><div class="sidebar-scrollbox"><ol class="chapter"><li class="chapter-item expanded"><a href="0intro.html"><strong aria-hidden="true">1.</strong> Intro</a></li><li class="chapter-item expanded affix"></li><li class="part-title">Language</li><li class="chapter-item expanded"><a href="language/0intro.html"><strong aria-hidden="true">2.</strong> Language</a></li><li><ol class="section"><li class="chapter-item expanded"><a href="examples.html"><strong aria-hidden="true">2.1.</strong> Examples</a></li></ol></li><li class="chapter-item expanded"></li><li class="part-title">Playground</li><li class="chapter-item expanded"><a href="playground.html" class="active"><strong aria-hidden="true">3.</strong> Playground</a></li></ol></div><div id="sidebar-resize-handle" class="sidebar-resize-handle"><div class="sidebar-resize-indicator"></div></div></nav><script>var sidebarScrollbox = document.querySelector('#sidebar .sidebar-scrollbox');
sidebarScrollbox.addEventListener('click', function(e) {
if (e.target.tagName === 'A') {
sessionStorage.setItem('sidebar-scroll', sidebarScrollbox.scrollTop);
}
}, { passive: true });
var sidebarScrollTop = sessionStorage.getItem('sidebar-scroll');
sessionStorage.removeItem('sidebar-scroll');
if (sidebarScrollTop) {
// preserve sidebar scroll position when navigating via links within sidebar
sidebarScrollbox.scrollTop = sidebarScrollTop;
} else {
// scroll sidebar to current active section when navigating via "next/previous chapter" buttons
var activeSection = document.querySelector('#sidebar .active');
if (activeSection) {
activeSection.scrollIntoView({ block: 'center' });
}
}</script><div id="page-wrapper" class="page-wrapper"><div class="page"><div id="menu-bar-hover-placeholder"></div><div id="menu-bar" class="menu-bar sticky"><div class="left-buttons"><label id="sidebar-toggle" class="nes-btn" for="sidebar-toggle-anchor" title="Toggle Table of Contents" aria-label="Toggle Table of Contents" aria-controls="sidebar">🍔</label> <button id="theme-toggle" class="nes-btn" type="button" title="Change theme" aria-label="Change theme" aria-haspopup="true" aria-expanded="false" aria-controls="theme-list">💅</button><ul id="theme-list" class="is-primary theme-popup" aria-label="Themes" role="menu"><li role="none"><button role="menuitem" class="theme" id="light">Light</button></li><li role="none"><button role="menuitem" class="theme" id="rust">Rust</button></li><li role="none"><button role="menuitem" class="theme" id="coal">Coal</button></li><li role="none"><button role="menuitem" class="theme" id="navy">Navy</button></li><li role="none"><button role="menuitem" class="theme" id="ayu">Ayu</button></li></ul><button id="search-toggle" class="nes-btn is-primary" type="button" title="Search. (Shortkey: s)" aria-label="Toggle Searchbar" aria-expanded="false" aria-keyshortcuts="S" aria-controls="searchbar">🔎</button></div><h1 class="menu-title"></h1><div class="right-buttons"><a href="print.html" title="Print this book" aria-label="Print this book" class="nes-btn">🖨️ </a><a class="nes-btn" href="https://ok.software/ok/src" title="branch" aria-label="branch">🌿</a></div></div><div id="search-wrapper" class="hidden"><form id="searchbar-outer" class="searchbar-outer"><input type="search" id="searchbar" class="nes-field" name="searchbar" placeholder="Search this book ..." aria-controls="searchresults-outer" aria-describedby="searchresults-header"></form><div id="searchresults-outer" class="searchresults-outer hidden"><div id="searchresults-header" class="searchresults-header"></div><ul id="searchresults"></ul></div></div><script>document.getElementById('sidebar-toggle').setAttribute('aria-expanded', sidebar === 'visible');
document.getElementById('sidebar').setAttribute('aria-hidden', sidebar !== 'visible');
Array.from(document.querySelectorAll('#sidebar a')).forEach(function(link) {
link.setAttribute('tabIndex', sidebar === 'visible' ? 0 : -1);
});</script><div id="content" class="content"><main><div id="container"><div id="cell-editor"><label for="editor">editor</label><div id="editor"></div></div><div id="cell-syntax"><label for="channel-syntax">syntax</label> <textarea id="channel-syntax" autocomplete="off" spellcheck="off" wrap="off" readonly="readonly"></textarea></div><div id="cell-console"><label for="channel-console">console</label> <textarea id="channel-console" autocomplete="off" spellcheck="off" wrap="off" readonly="readonly" rows="3"></textarea></div><div id="cell-client"><label for="channel-client">message trace (client ⇒ server)</label> <textarea id="channel-client" autocomplete="off" spellcheck="off" wrap="off" readonly="readonly" rows="4"></textarea></div><div id="cell-server"><label for="channel-server">message trace (client ⇐ server)</label> <textarea id="channel-server" autocomplete="off" spellcheck="off" wrap="off" readonly="readonly" rows="4"></textarea></div></div></main><nav class="nav-wrapper" aria-label="Page navigation"><a rel="prev" href="examples.html" class="mobile-nav-chapters previous" title="Previous chapter" aria-label="Previous chapter" aria-keyshortcuts="Left"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAzElEQVRYR+2X0Q6AIAhF5f8/2jYXZkwEjNSVvVUjDpcrGgT7FUkI2D9xRfQETwNIiWO85wfINfQUEyxBG2ArsLwC0jioGt5zFcwF4OYDPi/mBYKm4t0U8ATgRm3ThFoAqkhNgWkA0jJLvaOVSs7j3qMnSgXWBMiWPXe94QqMBMBc1VZIvaTu5u5pQewq0EqNZvIEMCmxAawK0DNkay9QmfFNAJUXfgGgUkLaE7j/h8fnASkxHTz0DGIBMCnBeeM7AArpUd3mz2x3C7wADglA8BcWMZhZAAAAAElFTkSuQmCC" style="rotate: 270deg; width: 94px"/></a><div style="clear: both"></div></nav></div></div><nav class="nav-wide-wrapper" aria-label="Page navigation"><a rel="next prefetch" href="examples.html" class="nav-chapters previous" title="Next chapter" aria-label="Next chapter" aria-keyshortcuts="Right" style="display: flex; justify-content: middle; align-items: center; width: 50%">&lt;</a></nav></div><script>const wsProtocol = location.protocol === 'https:' ? 'wss:' : 'ws:';
const wsAddress = wsProtocol + "//" + location.host + "/" + "__livereload";
const socket = new WebSocket(wsAddress);
socket.onmessage = function (event) {
if (event.data === "reload") {
socket.close();
location.reload();
}
};
},
{ passive: true }
);
var sidebarScrollTop = sessionStorage.getItem("sidebar-scroll");
sessionStorage.removeItem("sidebar-scroll");
if (sidebarScrollTop) {
// preserve sidebar scroll position when navigating via links within sidebar
sidebarScrollbox.scrollTop = sidebarScrollTop;
} else {
// scroll sidebar to current active section when navigating via "next/previous chapter" buttons
var activeSection = document.querySelector("#sidebar .active");
if (activeSection) {
activeSection.scrollIntoView({ block: "center" });
}
}
</script>
<div id="page-wrapper" class="page-wrapper">
<div class="page">
<div id="menu-bar-hover-placeholder"></div>
<div id="menu-bar" class="menu-bar sticky">
<div class="left-buttons">
<label
id="sidebar-toggle"
class="nes-btn"
for="sidebar-toggle-anchor"
title="Toggle Table of Contents"
aria-label="Toggle Table of Contents"
aria-controls="sidebar"
>🍔</label
>
<button
id="theme-toggle"
class="nes-btn"
type="button"
title="Change theme"
aria-label="Change theme"
aria-haspopup="true"
aria-expanded="false"
aria-controls="theme-list"
>
💅
</button>
<ul
id="theme-list"
class="is-primary theme-popup"
aria-label="Themes"
role="menu"
>
<li role="none">
<button role="menuitem" class="theme" id="light">
Light
</button>
</li>
<li role="none">
<button role="menuitem" class="theme" id="rust">Rust</button>
</li>
<li role="none">
<button role="menuitem" class="theme" id="coal">Coal</button>
</li>
<li role="none">
<button role="menuitem" class="theme" id="navy">Navy</button>
</li>
<li role="none">
<button role="menuitem" class="theme" id="ayu">Ayu</button>
</li>
</ul>
<button
id="search-toggle"
class="nes-btn is-primary"
type="button"
title="Search. (Shortkey: s)"
aria-label="Toggle Searchbar"
aria-expanded="false"
aria-keyshortcuts="S"
aria-controls="searchbar"
>
🔎
</button>
</div>
<h1 class="menu-title"></h1>
<div class="right-buttons">
<a
href="print.html"
title="Print this book"
aria-label="Print this book"
class="nes-btn"
>🖨️ </a
><a
class="nes-btn"
href="https://ok.software/ok/src"
title="branch"
aria-label="branch"
>🌿</a
>
</div>
</div>
<div id="search-wrapper" class="hidden">
<form id="searchbar-outer" class="searchbar-outer">
<input
type="search"
id="searchbar"
class="nes-field"
name="searchbar"
placeholder="Search this book ..."
aria-controls="searchresults-outer"
aria-describedby="searchresults-header"
/>
</form>
<div id="searchresults-outer" class="searchresults-outer hidden">
<div id="searchresults-header" class="searchresults-header"></div>
<ul id="searchresults"></ul>
</div>
</div>
<script>
document
.getElementById("sidebar-toggle")
.setAttribute("aria-expanded", sidebar === "visible");
document
.getElementById("sidebar")
.setAttribute("aria-hidden", sidebar !== "visible");
Array.from(document.querySelectorAll("#sidebar a")).forEach(
function (link) {
link.setAttribute("tabIndex", sidebar === "visible" ? 0 : -1);
}
);
</script>
<div id="content" class="content">
<main>
<div id="container">
<div id="cell-editor">
<label for="editor">editor</label>
<div id="editor"></div>
</div>
<div id="cell-syntax">
<label for="channel-syntax">syntax</label>
<textarea
id="channel-syntax"
autocomplete="off"
spellcheck="off"
wrap="off"
readonly="readonly"
></textarea>
</div>
<div id="cell-console">
<label for="channel-console">console</label>
<textarea
id="channel-console"
autocomplete="off"
spellcheck="off"
wrap="off"
readonly="readonly"
rows="3"
></textarea>
</div>
<div id="cell-client">
<label for="channel-client"
>message trace (client ⇒ server)</label
>
<textarea
id="channel-client"
autocomplete="off"
spellcheck="off"
wrap="off"
readonly="readonly"
rows="4"
></textarea>
</div>
<div id="cell-server">
<label for="channel-server"
>message trace (client ⇐ server)</label
>
<textarea
id="channel-server"
autocomplete="off"
spellcheck="off"
wrap="off"
readonly="readonly"
rows="4"
></textarea>
</div>
</div>
</main>
<nav class="nav-wrapper" aria-label="Page navigation">
<a
rel="prev"
href="examples.html"
class="mobile-nav-chapters previous"
title="Previous chapter"
aria-label="Previous chapter"
aria-keyshortcuts="Left"
><img
src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAAzElEQVRYR+2X0Q6AIAhF5f8/2jYXZkwEjNSVvVUjDpcrGgT7FUkI2D9xRfQETwNIiWO85wfINfQUEyxBG2ArsLwC0jioGt5zFcwF4OYDPi/mBYKm4t0U8ATgRm3ThFoAqkhNgWkA0jJLvaOVSs7j3qMnSgXWBMiWPXe94QqMBMBc1VZIvaTu5u5pQewq0EqNZvIEMCmxAawK0DNkay9QmfFNAJUXfgGgUkLaE7j/h8fnASkxHTz0DGIBMCnBeeM7AArpUd3mz2x3C7wADglA8BcWMZhZAAAAAElFTkSuQmCC"
style="rotate: 270deg; width: 94px"
/></a>
<div style="clear: both"></div>
</nav>
</div>
</div>
<nav class="nav-wide-wrapper" aria-label="Page navigation">
<a
rel="next prefetch"
href="examples.html"
class="nav-chapters previous"
title="Next chapter"
aria-label="Next chapter"
aria-keyshortcuts="Right"
style="
display: flex;
justify-content: middle;
align-items: center;
width: 50%;
"
>&lt;</a
>
</nav>
</div>
<script>
const wsProtocol = location.protocol === "https:" ? "wss:" : "ws:";
const wsAddress =
wsProtocol + "//" + location.host + "/" + "__livereload";
const socket = new WebSocket(wsAddress);
socket.onmessage = function (event) {
if (event.data === "reload") {
socket.close();
location.reload();
}
};
window.onbeforeunload = function() {
socket.close();
}</script><script>window.playground_copyable = true;</script><script src="elasticlunr.min.js"></script><script src="mark.min.js"></script><script src="searcher.js"></script><script src="clipboard.min.js"></script><script src="highlight.js"></script><script src="book.js"></script></div></body></html>
window.onbeforeunload = function () {
socket.close();
};
</script>
<script>
window.playground_copyable = true;
</script>
<script src="elasticlunr.min.js"></script>
<script src="mark.min.js"></script>
<script src="searcher.js"></script>
<script src="clipboard.min.js"></script>
<script src="highlight.js"></script>
<script src="book.js"></script>
</div>
</body>
</html>