commit
4872f2dd0d
131 changed files with 19242 additions and 0 deletions
@ -0,0 +1,11 @@
|
||||
install: |
||||
- appveyor-retry appveyor DownloadFile https://win.rustup.rs/ -FileName rustup-init.exe |
||||
- if not defined RUSTFLAGS rustup-init.exe -y --default-host x86_64-pc-windows-msvc --default-toolchain nightly |
||||
- set PATH=%PATH%;C:\Users\appveyor\.cargo\bin |
||||
- rustc -V |
||||
- cargo -V |
||||
|
||||
build: false |
||||
|
||||
test_script: |
||||
- cargo test --locked |
@ -0,0 +1,6 @@
|
||||
/target |
||||
**/*.rs.bk |
||||
Cargo.lock |
||||
bin/ |
||||
pkg/ |
||||
wasm-pack.log |
@ -0,0 +1,69 @@
|
||||
language: rust |
||||
sudo: false |
||||
|
||||
cache: cargo |
||||
|
||||
matrix: |
||||
include: |
||||
|
||||
# Builds with wasm-pack. |
||||
- rust: beta |
||||
env: RUST_BACKTRACE=1 |
||||
addons: |
||||
firefox: latest |
||||
chrome: stable |
||||
before_script: |
||||
- (test -x $HOME/.cargo/bin/cargo-install-update || cargo install cargo-update) |
||||
- (test -x $HOME/.cargo/bin/cargo-generate || cargo install --vers "^0.2" cargo-generate) |
||||
- cargo install-update -a |
||||
- curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh -s -- -f |
||||
script: |
||||
- cargo generate --git . --name testing |
||||
# Having a broken Cargo.toml (in that it has curlies in fields) anywhere |
||||
# in any of our parent dirs is problematic. |
||||
- mv Cargo.toml Cargo.toml.tmpl |
||||
- cd testing |
||||
- wasm-pack build |
||||
- wasm-pack test --chrome --firefox --headless |
||||
|
||||
# Builds on nightly. |
||||
- rust: nightly |
||||
env: RUST_BACKTRACE=1 |
||||
before_script: |
||||
- (test -x $HOME/.cargo/bin/cargo-install-update || cargo install cargo-update) |
||||
- (test -x $HOME/.cargo/bin/cargo-generate || cargo install --vers "^0.2" cargo-generate) |
||||
- cargo install-update -a |
||||
- rustup target add wasm32-unknown-unknown |
||||
script: |
||||
- cargo generate --git . --name testing |
||||
- mv Cargo.toml Cargo.toml.tmpl |
||||
- cd testing |
||||
- cargo check |
||||
- cargo check --target wasm32-unknown-unknown |
||||
- cargo check --no-default-features |
||||
- cargo check --target wasm32-unknown-unknown --no-default-features |
||||
- cargo check --no-default-features --features console_error_panic_hook |
||||
- cargo check --target wasm32-unknown-unknown --no-default-features --features console_error_panic_hook |
||||
- cargo check --no-default-features --features "console_error_panic_hook wee_alloc" |
||||
- cargo check --target wasm32-unknown-unknown --no-default-features --features "console_error_panic_hook wee_alloc" |
||||
|
||||
# Builds on beta. |
||||
- rust: beta |
||||
env: RUST_BACKTRACE=1 |
||||
before_script: |
||||
- (test -x $HOME/.cargo/bin/cargo-install-update || cargo install cargo-update) |
||||
- (test -x $HOME/.cargo/bin/cargo-generate || cargo install --vers "^0.2" cargo-generate) |
||||
- cargo install-update -a |
||||
- rustup target add wasm32-unknown-unknown |
||||
script: |
||||
- cargo generate --git . --name testing |
||||
- mv Cargo.toml Cargo.toml.tmpl |
||||
- cd testing |
||||
- cargo check |
||||
- cargo check --target wasm32-unknown-unknown |
||||
- cargo check --no-default-features |
||||
- cargo check --target wasm32-unknown-unknown --no-default-features |
||||
- cargo check --no-default-features --features console_error_panic_hook |
||||
- cargo check --target wasm32-unknown-unknown --no-default-features --features console_error_panic_hook |
||||
# Note: no enabling the `wee_alloc` feature here because it requires |
||||
# nightly for now. |
@ -0,0 +1,58 @@
|
||||
[package] |
||||
name = "wlasm" |
||||
version = "0.1.0" |
||||
authors = ["wctr <wctr@x-paste.de>"] |
||||
edition = "2018" |
||||
|
||||
[lib] |
||||
crate-type = ["cdylib", "rlib"] |
||||
|
||||
[features] |
||||
default = ["console_error_panic_hook"] |
||||
|
||||
[dependencies] |
||||
wasm-bindgen = "0.2" |
||||
js-sys = "0.3.35" |
||||
#web-sys = "0.3.35" |
||||
|
||||
# The `console_error_panic_hook` crate provides better debugging of panics by |
||||
# logging them with `console.error`. This is great for development, but requires |
||||
# all the `std::fmt` and `std::panicking` infrastructure, so isn't great for |
||||
# code size when deploying. |
||||
console_error_panic_hook = { version = "0.1.6", optional = true } |
||||
|
||||
# `wee_alloc` is a tiny allocator for wasm that is only ~1K in code size |
||||
# compared to the default allocator's ~10K. It is slower than the default |
||||
# allocator, however. |
||||
# |
||||
# Unfortunately, `wee_alloc` requires nightly Rust when targeting wasm for now. |
||||
wee_alloc = { version = "0.4.2", optional = true } |
||||
|
||||
[dependencies.wlambda] |
||||
default-features = false |
||||
features = [ |
||||
"regex", |
||||
"chrono", |
||||
"serde", |
||||
"serde_json", |
||||
"rmp-serde", |
||||
] |
||||
path = "../../WLambda" |
||||
|
||||
[dev-dependencies] |
||||
wasm-bindgen-test = "0.2" |
||||
|
||||
[profile.release] |
||||
# Tell `rustc` to optimize for small code size. |
||||
opt-level = "s" |
||||
debug = true |
||||
|
||||
[dependencies.web-sys] |
||||
version = "0.3.35" |
||||
features = [ |
||||
'Document', |
||||
'Element', |
||||
'HtmlElement', |
||||
'Node', |
||||
'Window', |
||||
] |
@ -0,0 +1,176 @@
|
||||
Apache License |
||||
Version 2.0, January 2004 |
||||
http://www.apache.org/licenses/ |
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION |
||||
|
||||
1. Definitions. |
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction, |
||||
and distribution as defined by Sections 1 through 9 of this document. |
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by |
||||
the copyright owner that is granting the License. |
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all |
||||
other entities that control, are controlled by, or are under common |
||||
control with that entity. For the purposes of this definition, |
||||
"control" means (i) the power, direct or indirect, to cause the |
||||
direction or management of such entity, whether by contract or |
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the |
||||
outstanding shares, or (iii) beneficial ownership of such entity. |
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity |
||||
exercising permissions granted by this License. |
||||
|
||||
"Source" form shall mean the preferred form for making modifications, |
||||
including but not limited to software source code, documentation |
||||
source, and configuration files. |
||||
|
||||
"Object" form shall mean any form resulting from mechanical |
||||
transformation or translation of a Source form, including but |
||||
not limited to compiled object code, generated documentation, |
||||
and conversions to other media types. |
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or |
||||
Object form, made available under the License, as indicated by a |
||||
copyright notice that is included in or attached to the work |
||||
(an example is provided in the Appendix below). |
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object |
||||
form, that is based on (or derived from) the Work and for which the |
||||
editorial revisions, annotations, elaborations, or other modifications |
||||
represent, as a whole, an original work of authorship. For the purposes |
||||
of this License, Derivative Works shall not include works that remain |
||||
separable from, or merely link (or bind by name) to the interfaces of, |
||||
the Work and Derivative Works thereof. |
||||
|
||||
"Contribution" shall mean any work of authorship, including |
||||
the original version of the Work and any modifications or additions |
||||
to that Work or Derivative Works thereof, that is intentionally |
||||
submitted to Licensor for inclusion in the Work by the copyright owner |
||||
or by an individual or Legal Entity authorized to submit on behalf of |
||||
the copyright owner. For the purposes of this definition, "submitted" |
||||
means any form of electronic, verbal, or written communication sent |
||||
to the Licensor or its representatives, including but not limited to |
||||
communication on electronic mailing lists, source code control systems, |
||||
and issue tracking systems that are managed by, or on behalf of, the |
||||
Licensor for the purpose of discussing and improving the Work, but |
||||
excluding communication that is conspicuously marked or otherwise |
||||
designated in writing by the copyright owner as "Not a Contribution." |
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity |
||||
on behalf of whom a Contribution has been received by Licensor and |
||||
subsequently incorporated within the Work. |
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of |
||||
this License, each Contributor hereby grants to You a perpetual, |
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable |
||||
copyright license to reproduce, prepare Derivative Works of, |
||||
publicly display, publicly perform, sublicense, and distribute the |
||||
Work and such Derivative Works in Source or Object form. |
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of |
||||
this License, each Contributor hereby grants to You a perpetual, |
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable |
||||
(except as stated in this section) patent license to make, have made, |
||||
use, offer to sell, sell, import, and otherwise transfer the Work, |
||||
where such license applies only to those patent claims licensable |
||||
by such Contributor that are necessarily infringed by their |
||||
Contribution(s) alone or by combination of their Contribution(s) |
||||
with the Work to which such Contribution(s) was submitted. If You |
||||
institute patent litigation against any entity (including a |
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work |
||||
or a Contribution incorporated within the Work constitutes direct |
||||
or contributory patent infringement, then any patent licenses |
||||
granted to You under this License for that Work shall terminate |
||||
as of the date such litigation is filed. |
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the |
||||
Work or Derivative Works thereof in any medium, with or without |
||||
modifications, and in Source or Object form, provided that You |
||||
meet the following conditions: |
||||
|
||||
(a) You must give any other recipients of the Work or |
||||
Derivative Works a copy of this License; and |
||||
|
||||
(b) You must cause any modified files to carry prominent notices |
||||
stating that You changed the files; and |
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works |
||||
that You distribute, all copyright, patent, trademark, and |
||||
attribution notices from the Source form of the Work, |
||||
excluding those notices that do not pertain to any part of |
||||
the Derivative Works; and |
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its |
||||
distribution, then any Derivative Works that You distribute must |
||||
include a readable copy of the attribution notices contained |
||||
within such NOTICE file, excluding those notices that do not |
||||
pertain to any part of the Derivative Works, in at least one |
||||
of the following places: within a NOTICE text file distributed |
||||
as part of the Derivative Works; within the Source form or |
||||
documentation, if provided along with the Derivative Works; or, |
||||
within a display generated by the Derivative Works, if and |
||||
wherever such third-party notices normally appear. The contents |
||||
of the NOTICE file are for informational purposes only and |
||||
do not modify the License. You may add Your own attribution |
||||
notices within Derivative Works that You distribute, alongside |
||||
or as an addendum to the NOTICE text from the Work, provided |
||||
that such additional attribution notices cannot be construed |
||||
as modifying the License. |
||||
|
||||
You may add Your own copyright statement to Your modifications and |
||||
may provide additional or different license terms and conditions |
||||
for use, reproduction, or distribution of Your modifications, or |
||||
for any such Derivative Works as a whole, provided Your use, |
||||
reproduction, and distribution of the Work otherwise complies with |
||||
the conditions stated in this License. |
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise, |
||||
any Contribution intentionally submitted for inclusion in the Work |
||||
by You to the Licensor shall be under the terms and conditions of |
||||
this License, without any additional terms or conditions. |
||||
Notwithstanding the above, nothing herein shall supersede or modify |
||||
the terms of any separate license agreement you may have executed |
||||
with Licensor regarding such Contributions. |
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade |
||||
names, trademarks, service marks, or product names of the Licensor, |
||||
except as required for reasonable and customary use in describing the |
||||
origin of the Work and reproducing the content of the NOTICE file. |
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or |
||||
agreed to in writing, Licensor provides the Work (and each |
||||
Contributor provides its Contributions) on an "AS IS" BASIS, |
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or |
||||
implied, including, without limitation, any warranties or conditions |
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A |
||||
PARTICULAR PURPOSE. You are solely responsible for determining the |
||||
appropriateness of using or redistributing the Work and assume any |
||||
risks associated with Your exercise of permissions under this License. |
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory, |
||||
whether in tort (including negligence), contract, or otherwise, |
||||
unless required by applicable law (such as deliberate and grossly |
||||
negligent acts) or agreed to in writing, shall any Contributor be |
||||
liable to You for damages, including any direct, indirect, special, |
||||
incidental, or consequential damages of any character arising as a |
||||
result of this License or out of the use or inability to use the |
||||
Work (including but not limited to damages for loss of goodwill, |
||||
work stoppage, computer failure or malfunction, or any and all |
||||
other commercial damages or losses), even if such Contributor |
||||
has been advised of the possibility of such damages. |
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing |
||||
the Work or Derivative Works thereof, You may choose to offer, |
||||
and charge a fee for, acceptance of support, warranty, indemnity, |
||||
or other liability obligations and/or rights consistent with this |
||||
License. However, in accepting such obligations, You may act only |
||||
on Your own behalf and on Your sole responsibility, not on behalf |
||||
of any other Contributor, and only if You agree to indemnify, |
||||
defend, and hold each Contributor harmless for any liability |
||||
incurred by, or claims asserted against, such Contributor by reason |
||||
of your accepting any such warranty or additional liability. |
||||
|
||||
END OF TERMS AND CONDITIONS |
@ -0,0 +1,25 @@
|
||||
Copyright (c) 2018 wctr <wctr@x-paste.de> |
||||
|
||||
Permission is hereby granted, free of charge, to any |
||||
person obtaining a copy of this software and associated |
||||
documentation files (the "Software"), to deal in the |
||||
Software without restriction, including without |
||||
limitation the rights to use, copy, modify, merge, |
||||
publish, distribute, sublicense, and/or sell copies of |
||||
the Software, and to permit persons to whom the Software |
||||
is furnished to do so, subject to the following |
||||
conditions: |
||||
|
||||
The above copyright notice and this permission notice |
||||
shall be included in all copies or substantial portions |
||||
of the Software. |
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF |
||||
ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED |
||||
TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A |
||||
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT |
||||
SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY |
||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION |
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR |
||||
IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
||||
DEALINGS IN THE SOFTWARE. |
@ -0,0 +1,3 @@
|
||||
wasm-pack build --target no-modules |
||||
copy pkg\*.js webdata |
||||
copy pkg\*.wasm webdata |
@ -0,0 +1,37 @@
|
||||
!@import u util; |
||||
#!@import a auth; |
||||
|
||||
!:global auth_realm = \ "wlasm" ; |
||||
!:global local_endpoint = \ "0.0.0.0:19099" ; |
||||
!:global file_prefix = { || "/files" }; |
||||
!:global file_path = { || "webdata" }; |
||||
!:global need_auth = { || |
||||
$false |
||||
}; |
||||
#!:global auth = { a:auth[[@]] }; |
||||
|
||||
!:global req = { |
||||
!(method, path, data, url, qp) = @; |
||||
|
||||
!data = block :from_req { |
||||
!t = std:str:cat method ":" path; |
||||
u:regex_match t $[ |
||||
# $q"^GET:/journal/data/entries/(\d+)", { |
||||
# return :from_req ~ |
||||
# db:exec "SELECT * FROM entries WHERE id=?" _.1; |
||||
# }, |
||||
]; |
||||
$e $["No URL Handler!", t] |
||||
}; |
||||
|
||||
(is_err data) { |
||||
std:displayln :ERROR " " (unwrap_err data | str); |
||||
(is_map ~ unwrap_err data) { unwrap_err data } { |
||||
${ |
||||
status = 500, |
||||
content_type = "text/plain", |
||||
body = unwrap_err data, |
||||
} |
||||
}; |
||||
} { ${ data = data } }; |
||||
}; |
@ -0,0 +1,69 @@
|
||||
mod utils; |
||||
|
||||
use wasm_bindgen::prelude::*; |
||||
use wlambda::*; |
||||
|
||||
// When the `wee_alloc` feature is enabled, use `wee_alloc` as the global
|
||||
// allocator.
|
||||
#[cfg(feature = "wee_alloc")] |
||||
#[global_allocator] |
||||
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT; |
||||
|
||||
#[wasm_bindgen] |
||||
pub fn init() { |
||||
utils::set_panic_hook(); |
||||
// console_error_panic_hook::set_once();
|
||||
} |
||||
|
||||
#[wasm_bindgen] |
||||
pub struct Evaluator { |
||||
result: VVal, |
||||
recent_error: String, |
||||
ctx: EvalContext, |
||||
} |
||||
|
||||
#[wasm_bindgen] |
||||
impl Evaluator { |
||||
pub fn new() -> Self { |
||||
Self { |
||||
result: VVal::Nul, |
||||
recent_error: String::from(""), |
||||
ctx: EvalContext::new_default(), |
||||
} |
||||
} |
||||
|
||||
pub fn get_result_s(&self) -> String { |
||||
self.result.s() |
||||
} |
||||
|
||||
pub fn get_result_s_raw(&self) -> String { |
||||
self.result.s_raw() |
||||
} |
||||
|
||||
pub fn get_error(&self) -> String { |
||||
self.recent_error.clone() |
||||
} |
||||
|
||||
pub fn eval(&mut self, s: String) -> bool { |
||||
match self.ctx.eval(&s) { |
||||
Ok(v) => { |
||||
self.result = v; |
||||
self.recent_error = String::from("{no error}"); |
||||
true |
||||
}, |
||||
Err(e) => { |
||||
self.recent_error = format!("{}", e); |
||||
false |
||||
}, |
||||
} |
||||
} |
||||
} |
||||
|
||||
#[wasm_bindgen] |
||||
pub fn eval(s: String) -> String { |
||||
let mut ctx = EvalContext::new_default(); |
||||
// let w = window().unwrap();
|
||||
// use web_sys::window;
|
||||
let r = ctx.eval(&s).unwrap(); |
||||
r.s() |
||||
} |
@ -0,0 +1,10 @@
|
||||
pub fn set_panic_hook() { |
||||
// When the `console_error_panic_hook` feature is enabled, we can call the
|
||||
// `set_panic_hook` function at least once during initialization, and then
|
||||
// we will get better error messages if our code ever panics.
|
||||
//
|
||||
// For more details see
|
||||
// https://github.com/rustwasm/console_error_panic_hook#readme
|
||||
#[cfg(feature = "console_error_panic_hook")] |
||||
console_error_panic_hook::set_once(); |
||||
} |
@ -0,0 +1,13 @@
|
||||
//! Test suite for the Web and headless browsers.
|
||||
|
||||
#![cfg(target_arch = "wasm32")] |
||||
|
||||
extern crate wasm_bindgen_test; |
||||
use wasm_bindgen_test::*; |
||||
|
||||
wasm_bindgen_test_configure!(run_in_browser); |
||||
|
||||
#[wasm_bindgen_test] |
||||
fn pass() { |
||||
assert_eq!(1 + 1, 2); |
||||
} |
@ -0,0 +1,19 @@
|
||||
!@wlambda; |
||||
!@import std std; |
||||
|
||||
!@export regex_match \:_regex_match_xxx { !text = _; |
||||
!matches = _1; |
||||
range 0 (len matches) 2 { |
||||
!regex = _ matches; |
||||
!fun = (_ + 1) matches; |
||||
std:re:match regex text { |
||||
fun[_]; |
||||
return :_regex_match_xxx $n; |
||||
}; |
||||
}; |
||||
}; |
||||
|
||||
!strip_match = \:ret { !(re, text) = @; |
||||
std:re:match re text { return :ret $[_.1, _.2] }; |
||||
$[$n, text] |
||||
}; |
Binary file not shown.
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -0,0 +1,34 @@
|
||||
<html> |
||||
<head> |
||||
<meta content="text/html;charset=utf-8" http-equiv="Content-Type"/> |
||||
<link rel="stylesheet" href="/files/css/bulma.min.css"></link> |
||||
<link rel="stylesheet" href="/files/css/fa-all.min.css"></link> |
||||
<script src="/files/js/mithril.js"></script> |
||||
</head> |
||||
<body> |
||||
<!-- Include the JS generated by `wasm-pack build` --> |
||||
<script src='/files/wlasm.js'></script> |
||||
<script src="/files/main.js"></script> |
||||
|
||||
<!-- |
||||
<textarea id="code"> |
||||
</textarea> |
||||
<button id="eval"> |
||||
</button> |
||||
<pre id="result"> |
||||
</pre> |
||||
--> |
||||
|
||||
<script> |
||||
// Like with the `--target web` output the exports are immediately |
||||
// available but they won't work until we initialize the module. Unlike |
||||
// `--target web`, however, the globals are all stored on a |
||||
// `wasm_bindgen` global. The global itself is the initialization |
||||
// function and then the properties of the global are all the exported |
||||
// functions. |
||||
// |
||||
// Note that the name `wasm_bindgen` can be configured with the |
||||
// `--no-modules-global` CLI flag |
||||
</script> |
||||
</body> |
||||
</html> |
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -0,0 +1,104 @@
|
||||
const { |
||||
init, |
||||
eval, |
||||
Evaluator, |
||||
} = wasm_bindgen; |
||||
|
||||
|
||||
let EVAL = null; |
||||
|
||||
async function start() { |
||||
await wasm_bindgen('/files/wlasm_bg.wasm'); |
||||
init(); |
||||
EVAL = Evaluator.new(); |
||||
} |
||||
|
||||
let was_error = false; |
||||
let eval_input = "std:displayln \"Hello, World!\";"; |
||||
let eval_output = ""; |
||||
|
||||
function do_eval() { |
||||
// eval_output = eval(eval_input);
|
||||
if (EVAL.eval(eval_input)) { |
||||
eval_output = EVAL.get_result_s(); |
||||
} else { |
||||
was_error = true; |
||||
eval_output = EVAL.get_error(); |
||||
} |
||||
} |
||||
|
||||
class MainView { |
||||
view(vn) { |
||||
let result = null; |
||||
if (was_error) { |
||||
result = |
||||
m("div", { class: "section column is-5 content" }, |
||||
m("h2", { class: "has-text-danger" }, "Error:"), |
||||
m("div", { |
||||
class: "box is-family-monospace", |
||||
style: "overflow-y: auto; overflow-wrap: break-word", |
||||
}, eval_output)); |
||||
} else { |
||||
result = |
||||
m("div", { class: "section column is-5 content" }, |
||||
m("h2", "Result:"), |
||||
m("div", { |
||||
class: "box is-family-monospace", |
||||
style: "overflow-y: auto; overflow-wrap: break-word", |
||||
}, eval_output)); |
||||
} |
||||
|
||||
return m("div", { class: "columns" }, [ |
||||
m("div", { class: "section column is-2 content" }, [ |
||||
m("h2", "WASM WLambda Evaluator"), |
||||
m("ul", [ |
||||
m("li", m("a", { href: "https://docs.rs/wlambda/newest/wlambda/index.html" }, "WLambda Quick Overview")), |
||||
m("li", m("a", { href: "https://docs.rs/wlambda/newest/wlambda/prelude/index.html#wlambda-reference" }, "WLambda Language Reference")), |
||||
m("li", m("a", { href: "https://docs.rs/wlambda/newest/wlambda/parser/index.html" }, "WLambda Syntax Grammar")), |
||||
]) |
||||
]), |
||||
m("div", { class: "section column is-5" }, |
||||
m("div", { class: "card" }, [ |
||||
m("div", { class: "card-header" }, |
||||
m("p", { class: "card-header-title" }, "WLambda Code Input:")), |
||||
m("div", { class: "card-content" }, |
||||
m("textarea", { |
||||
class: "textarea is-size-7 is-fullwidth is-family-monospace is-primary", |
||||
wrap: "off", |
||||
style: "min-height: 300px; overflow-x: scroll", |
||||
oninput: function(e) { eval_input = e.target.value; } |
||||
}, eval_input)), |
||||
m("div", { class: "card-footer" }, |
||||
m("button", { type: "text", class: "is-danger button card-footer-item", |
||||
onclick: function(e) { |
||||
do_eval(); |
||||
} }, "Eval (Ctrl+Return)"), |
||||
m("button", { type: "text", class: "is-primary is-outlined button card-footer-item", |
||||
onclick: function(e) { |
||||
eval_input = ""; |
||||
eval_output = ""; |
||||
} }, "Clear")) |
||||
])), |
||||
result, |
||||
]) |
||||
} |
||||
}; |
||||
|
||||
start(); |
||||
|
||||
m.route(document.body, '/main', { |
||||
'/main': MainView, |
||||
}); |
||||
|
||||
|
||||
document.addEventListener("keydown", function(e) { |
||||
if (e.getModifierState("Control")) { |
||||
switch (e.key) { |
||||
case "Enter": |
||||
do_eval(); |
||||
m.redraw(); |
||||
setTimeout(function() { m.redraw() }, 50); |
||||
break; |
||||
} |
||||
} |
||||
}); |
@ -0,0 +1,99 @@
|
||||
/* a11y-dark theme */ |
||||
/* Based on the Tomorrow Night Eighties theme: https://github.com/isagalaev/highlight.js/blob/master/src/styles/tomorrow-night-eighties.css */ |
||||
/* @author: ericwbailey */ |
||||
|
||||
/* Comment */ |
||||
.hljs-comment, |
||||
.hljs-quote { |
||||
color: #d4d0ab; |
||||
} |
||||
|
||||
/* Red */ |
||||
.hljs-variable, |
||||
.hljs-template-variable, |
||||
.hljs-tag, |
||||
.hljs-name, |
||||
.hljs-selector-id, |
||||
.hljs-selector-class, |
||||
.hljs-regexp, |
||||
.hljs-deletion { |
||||
color: #ffa07a; |
||||
} |
||||
|
||||
/* Orange */ |
||||
.hljs-number, |
||||
.hljs-built_in, |
||||
.hljs-builtin-name, |
||||
.hljs-literal, |
||||
.hljs-type, |
||||
.hljs-params, |
||||
.hljs-meta, |
||||
.hljs-link { |
||||
color: #f5ab35; |
||||
} |
||||
|
||||
/* Yellow */ |
||||
.hljs-attribute { |
||||
color: #ffd700; |
||||
} |
||||
|
||||
/* Green */ |
||||
.hljs-string, |
||||
.hljs-symbol, |
||||
.hljs-bullet, |
||||
.hljs-addition { |
||||
color: #abe338; |
||||
} |
||||
|
||||
/* Blue */ |
||||
.hljs-title, |
||||
.hljs-section { |
||||
color: #00e0e0; |
||||
} |
||||
|
||||
/* Purple */ |
||||
.hljs-keyword, |
||||
.hljs-selector-tag { |
||||
color: #dcc6e0; |
||||
} |
||||
|
||||
.hljs { |
||||
display: block; |
||||
overflow-x: auto; |
||||
background: #2b2b2b; |
||||
color: #f8f8f2; |
||||
padding: 0.5em; |
||||
} |
||||
|
||||
.hljs-emphasis { |
||||
font-style: italic; |
||||
} |
||||
|
||||
.hljs-strong { |
||||
font-weight: bold; |
||||
} |
||||
|
||||
@media screen and (-ms-high-contrast: active) { |
||||
.hljs-addition, |
||||
.hljs-attribute, |
||||
.hljs-built_in, |
||||
.hljs-builtin-name, |
||||
.hljs-bullet, |
||||
.hljs-comment, |
||||
.hljs-link, |
||||
.hljs-literal, |
||||
.hljs-meta, |
||||
.hljs-number, |
||||
.hljs-params, |
||||
.hljs-string, |
||||
.hljs-symbol, |
||||
.hljs-type, |
||||
.hljs-quote { |
||||
color: highlight; |
||||
} |
||||
|
||||
.hljs-keyword, |
||||
.hljs-selector-tag { |
||||
font-weight: bold; |
||||
} |
||||
} |
@ -0,0 +1,99 @@
|
||||
/* a11y-light theme */ |
||||
/* Based on the Tomorrow Night Eighties theme: https://github.com/isagalaev/highlight.js/blob/master/src/styles/tomorrow-night-eighties.css */ |
||||
/* @author: ericwbailey */ |
||||
|
||||
/* Comment */ |
||||
.hljs-comment, |
||||
.hljs-quote { |
||||
color: #696969; |
||||
} |
||||
|
||||
/* Red */ |
||||
.hljs-variable, |
||||
.hljs-template-variable, |
||||
.hljs-tag, |
||||
.hljs-name, |
||||
.hljs-selector-id, |
||||
.hljs-selector-class, |
||||
.hljs-regexp, |
||||
.hljs-deletion { |
||||
color: #d91e18; |
||||
} |
||||
|
||||
/* Orange */ |
||||
.hljs-number, |
||||
.hljs-built_in, |
||||
.hljs-builtin-name, |
||||
.hljs-literal, |
||||
.hljs-type, |
||||
.hljs-params, |
||||
.hljs-meta, |
||||
.hljs-link { |
||||
color: #aa5d00; |
||||
} |
||||
|
||||
/* Yellow */ |
||||
.hljs-attribute { |
||||
color: #aa5d00; |
||||
} |
||||
|
||||
/* Green */ |
||||
.hljs-string, |
||||
.hljs-symbol, |
||||
.hljs-bullet, |
||||
.hljs-addition { |
||||
color: #008000; |
||||
} |
||||
|
||||
/* Blue */ |
||||
.hljs-title, |
||||
.hljs-section { |
||||
color: #007faa; |
||||
} |
||||
|
||||
/* Purple */ |
||||
.hljs-keyword, |
||||
.hljs-selector-tag { |
||||
color: #7928a1; |
||||
} |
||||
|
||||
.hljs { |
||||
display: block; |
||||
overflow-x: auto; |
||||
background: #fefefe; |
||||
color: #545454; |
||||
padding: 0.5em; |
||||
} |
||||
|
||||
.hljs-emphasis { |
||||
font-style: italic; |
||||
} |
||||
|
||||
.hljs-strong { |
||||
font-weight: bold; |
||||
} |
||||
|
||||
@media screen and (-ms-high-contrast: active) { |
||||
.hljs-addition, |
||||
.hljs-attribute, |
||||
.hljs-built_in, |
||||
.hljs-builtin-name, |
||||
.hljs-bullet, |
||||
.hljs-comment, |
||||
.hljs-link, |
||||
.hljs-literal, |
||||
.hljs-meta, |
||||
.hljs-number, |
||||
.hljs-params, |
||||
.hljs-string, |
||||
.hljs-symbol, |
||||
.hljs-type, |
||||
.hljs-quote { |
||||
color: highlight; |
||||
} |
||||
|
||||
.hljs-keyword, |
||||
.hljs-selector-tag { |
||||
font-weight: bold; |
||||
} |
||||
} |
@ -0,0 +1,108 @@
|
||||
/*! |
||||
* Agate by Taufik Nurrohman <https://github.com/tovic> |
||||
* ---------------------------------------------------- |
||||
* |
||||
* #ade5fc |
||||
* #a2fca2 |
||||
* #c6b4f0 |
||||
* #d36363 |
||||
* #fcc28c |
||||
* #fc9b9b |
||||
* #ffa |
||||
* #fff |
||||
* #333 |
||||
* #62c8f3 |
||||
* #888 |
||||
* |
||||
*/ |
||||
|
||||
.hljs { |
||||
display: block; |
||||
overflow-x: auto; |
||||
padding: 0.5em; |
||||
background: #333; |
||||
color: white; |
||||
} |
||||
|
||||
.hljs-name, |
||||
.hljs-strong { |
||||
font-weight: bold; |
||||
} |
||||
|
||||
.hljs-code, |
||||
.hljs-emphasis { |
||||
font-style: italic; |
||||
} |
||||
|
||||
.hljs-tag { |
||||
color: #62c8f3; |
||||
} |
||||
|
||||
.hljs-variable, |
||||
.hljs-template-variable, |
||||
.hljs-selector-id, |
||||
.hljs-selector-class { |
||||
color: #ade5fc; |
||||
} |
||||
|
||||
.hljs-string, |
||||
.hljs-bullet { |
||||
color: #a2fca2; |
||||
} |
||||
|
||||
.hljs-type, |
||||
.hljs-title, |
||||
.hljs-section, |
||||
.hljs-attribute, |
||||
.hljs-quote, |
||||
.hljs-built_in, |
||||
.hljs-builtin-name { |
||||
color: #ffa; |
||||
} |
||||
|
||||
.hljs-number, |
||||
.hljs-symbol, |
||||
.hljs-bullet { |
||||
color: #d36363; |
||||
} |
||||
|
||||
.hljs-keyword, |
||||
.hljs-selector-tag, |
||||
.hljs-literal { |
||||
color: #fcc28c; |
||||
} |
||||
|
||||
.hljs-comment, |
||||
.hljs-deletion, |
||||
.hljs-code { |
||||
color: #888; |
||||
} |
||||
|
||||
.hljs-regexp, |
||||
.hljs-link { |
||||
color: #c6b4f0; |
||||
} |
||||
|
||||
.hljs-meta { |
||||
color: #fc9b9b; |
||||
} |
||||
|
||||
.hljs-deletion { |
||||
background-color: #fc9b9b; |
||||
color: #333; |
||||
} |
||||
|
||||
.hljs-addition { |
||||
background-color: #a2fca2; |
||||
color: #333; |
||||
} |
||||
|
||||
.hljs a { |
||||
color: inherit; |
||||
} |
||||
|
||||
.hljs a:focus, |
||||
.hljs a:hover { |
||||
color: inherit; |
||||
text-decoration: underline; |
||||
} |
@ -0,0 +1,89 @@
|
||||
/* |
||||
|
||||
An Old Hope โ Star Wars Syntax (c) Gustavo Costa <gusbemacbe@gmail.com> |
||||
Original theme - Ocean Dark Theme โ by https://github.com/gavsiu |
||||
Based on Jesse Leite's Atom syntax theme 'An Old Hope' โ https://github.com/JesseLeite/an-old-hope-syntax-atom |
||||
|
||||
*/ |
||||
|
||||
/* Death Star Comment */ |
||||
.hljs-comment, |
||||
.hljs-quote |
||||
{ |
||||
color: #B6B18B; |
||||
} |
||||
|
||||
/* Darth Vader */ |
||||
.hljs-variable, |
||||
.hljs-template-variable, |
||||
.hljs-tag, |
||||
.hljs-name, |
||||
.hljs-selector-id, |
||||
.hljs-selector-class, |
||||
.hljs-regexp, |
||||
.hljs-deletion |
||||
{ |
||||
color: #EB3C54; |
||||
} |
||||
|
||||
/* Threepio */ |
||||
.hljs-number, |
||||
.hljs-built_in, |
||||
.hljs-builtin-name, |
||||
.hljs-literal, |
||||
.hljs-type, |
||||
.hljs-params, |
||||
.hljs-meta, |
||||
.hljs-link |
||||
{ |
||||
color: #E7CE56; |
||||
} |
||||
|
||||
/* Luke Skywalker */ |
||||
.hljs-attribute |
||||
{ |
||||
color: #EE7C2B; |
||||
} |
||||
|
||||
/* Obi Wan Kenobi */ |
||||
.hljs-string, |
||||
.hljs-symbol, |
||||
.hljs-bullet, |
||||
.hljs-addition |
||||
{ |
||||
color: #4FB4D7; |
||||
} |
||||
|
||||
/* Yoda */ |
||||
.hljs-title, |
||||
.hljs-section |
||||
{ |
||||
color: #78BB65; |
||||
} |
||||
|
||||
/* Mace Windu */ |
||||
.hljs-keyword, |
||||
.hljs-selector-tag |
||||
{ |
||||
color: #B45EA4; |
||||
} |
||||
|
||||
/* Millenium Falcon */ |
||||
.hljs |
||||
{ |
||||
display: block; |
||||
overflow-x: auto; |
||||
background: #1C1D21; |
||||
color: #c0c5ce; |
||||
padding: 0.5em; |
||||
} |
||||
|
||||
.hljs-emphasis |
||||
{ |
||||
font-style: italic; |
||||
} |
||||
|
||||
.hljs-strong |
||||
{ |
||||
font-weight: bold; |
||||
} |
@ -0,0 +1,66 @@
|
||||
/* |
||||
Date: 24 Fev 2015 |
||||
Author: Pedro Oliveira <kanytu@gmail . com> |
||||
*/ |
||||
|
||||
.hljs { |
||||
color: #a9b7c6; |
||||
background: #282b2e; |
||||
display: block; |
||||
overflow-x: auto; |
||||
padding: 0.5em; |
||||
} |
||||
|
||||
.hljs-number, |
||||
.hljs-literal, |
||||
.hljs-symbol, |
||||
.hljs-bullet { |
||||
color: #6897BB; |
||||
} |
||||
|
||||
.hljs-keyword, |
||||
.hljs-selector-tag, |
||||
.hljs-deletion { |
||||
color: #cc7832; |
||||
} |
||||
|
||||
.hljs-variable, |
||||
.hljs-template-variable, |
||||
.hljs-link { |
||||
color: #629755; |
||||
} |
||||
|
||||
.hljs-comment, |
||||
.hljs-quote { |
||||
color: #808080; |
||||
} |
||||
|
||||
.hljs-meta { |
||||
color: #bbb529; |
||||
} |
||||
|
||||
.hljs-string, |
||||
.hljs-attribute, |
||||
.hljs-addition { |
||||
color: #6A8759; |
||||
} |
||||
|
||||
.hljs-section, |
||||
.hljs-title, |
||||
.hljs-type { |
||||
color: #ffc66d; |
||||
} |
||||
|
||||
.hljs-name, |
||||
.hljs-selector-id, |
||||
.hljs-selector-class { |
||||
color: #e8bf6a; |
||||
} |
||||
|
||||
.hljs-emphasis { |
||||
font-style: italic; |
||||
} |
||||
|
||||
.hljs-strong { |
||||
font-weight: bold; |
||||
} |
@ -0,0 +1,88 @@
|
||||
/* |
||||
|
||||
Arduinoยฎ Light Theme - Stefania Mellai <s.mellai@arduino.cc> |
||||
|
||||
*/ |
||||
|
||||
.hljs { |
||||
display: block; |
||||
overflow-x: auto; |
||||
padding: 0.5em; |
||||
background: #FFFFFF; |
||||
} |
||||
|
||||
.hljs, |
||||
.hljs-subst { |
||||
color: #434f54; |
||||
} |
||||
|
||||
.hljs-keyword, |
||||
.hljs-attribute, |
||||
.hljs-selector-tag, |
||||
.hljs-doctag, |
||||
.hljs-name { |
||||
color: #00979D; |
||||
} |
||||
|
||||
.hljs-built_in, |
||||
.hljs-literal, |
||||
.hljs-bullet, |
||||
.hljs-code, |
||||
.hljs-addition { |
||||
color: #D35400; |
||||
} |
||||
|
||||
.hljs-regexp, |
||||
.hljs-symbol, |
||||
.hljs-variable, |
||||
.hljs-template-variable, |
||||
.hljs-link, |
||||
.hljs-selector-attr, |
||||
.hljs-selector-pseudo { |
||||
color: #00979D; |
||||
} |
||||
|
||||
.hljs-type, |
||||
.hljs-string, |
||||
.hljs-selector-id, |
||||
.hljs-selector-class, |
||||
.hljs-quote, |
||||
.hljs-template-tag, |
||||
.hljs-deletion { |
||||
color: #005C5F; |
||||
} |
||||
|
||||
.hljs-title, |
||||
.hljs-section { |
||||
color: #880000; |
||||
font-weight: bold; |
||||
} |
||||
|
||||
.hljs-comment { |
||||
color: rgba(149,165,166,.8); |
||||
} |
||||
|
||||
.hljs-meta-keyword { |
||||
color: #728E00; |
||||
} |
||||
|
||||
.hljs-meta { |
||||
color: #728E00; |
||||
color: #434f54; |
||||
} |
||||
|
||||
.hljs-emphasis { |
||||
font-style: italic; |
||||
} |
||||
|
||||
.hljs-strong { |
||||
font-weight: bold; |
||||
} |
||||
|
||||
.hljs-function { |
||||
color: #728E00; |
||||
} |
||||
|
||||
.hljs-number { |
||||
color: #8A7B52; |
||||
} |
@ -0,0 +1,73 @@
|
||||
/* |
||||
Date: 17.V.2011 |
||||
Author: pumbur <pumbur@pumbur.net> |
||||
*/ |
||||
|
||||
.hljs { |
||||
display: block; |
||||
overflow-x: auto; |
||||
padding: 0.5em; |
||||
background: #222; |
||||
} |
||||
|
||||
.hljs, |
||||
.hljs-subst { |
||||
color: #aaa; |
||||
} |
||||
|
||||
.hljs-section { |
||||
color: #fff; |
||||
} |
||||
|
||||
.hljs-comment, |
||||
.hljs-quote, |
||||
.hljs-meta { |
||||
color: #444; |
||||
} |
||||
|
||||
.hljs-string, |
||||
.hljs-symbol, |
||||
.hljs-bullet, |
||||
.hljs-regexp { |
||||
color: #ffcc33; |
||||
} |
||||
|
||||
.hljs-number, |
||||
.hljs-addition { |
||||
color: #00cc66; |
||||
} |
||||
|
||||
.hljs-built_in, |
||||
.hljs-builtin-name, |
||||
.hljs-literal, |
||||
.hljs-type, |
||||
.hljs-template-variable, |
||||
.hljs-attribute, |
||||
.hljs-link { |
||||
color: #32aaee; |
||||
} |
||||
|
||||
.hljs-keyword, |
||||
.hljs-selector-tag, |
||||
.hljs-name, |
||||
.hljs-selector-id, |
||||
.hljs-selector-class { |
||||
color: #6644aa; |
||||
} |
||||
|
||||
.hljs-title, |
||||
.hljs-variable, |
||||
.hljs-deletion, |
||||
.hljs-template-tag { |
||||
color: #bb1166; |
||||
} |
||||
|
||||
.hljs-section, |
||||
.hljs-doctag, |
||||
.hljs-strong { |
||||
font-weight: bold; |
||||
} |
||||
|
||||
.hljs-emphasis { |
||||
font-style: italic; |
||||
} |
@ -0,0 +1,45 @@
|
||||
/* |
||||
|
||||
Original style from softwaremaniacs.org (c) Ivan Sagalaev <Maniac@SoftwareManiacs.Org> |
||||
|
||||
*/ |
||||
|
||||
.hljs { |
||||
display: block; |
||||
overflow-x: auto; |
||||
padding: 0.5em; |
||||
background: white; |
||||
color: black; |
||||
} |
||||
|
||||
.hljs-string, |
||||
.hljs-variable, |
||||
.hljs-template-variable, |
||||
.hljs-symbol, |
||||
.hljs-bullet, |
||||
.hljs-section, |
||||
.hljs-addition, |
||||
.hljs-attribute, |
||||
.hljs-link { |
||||
color: #888; |
||||
} |
||||
|
||||
.hljs-comment, |
||||
.hljs-quote, |
||||
.hljs-meta, |
||||
.hljs-deletion { |
||||
color: #ccc; |
||||
} |
||||
|
||||
.hljs-keyword, |
||||
.hljs-selector-tag, |
||||
.hljs-section, |
||||
.hljs-name, |
||||
.hljs-type, |
||||
.hljs-strong { |
||||
font-weight: bold; |
||||
} |
||||
|
||||
.hljs-emphasis { |
||||
font-style: italic; |
||||
} |
@ -0,0 +1,83 @@
|
||||
/* Base16 Atelier Cave Dark - Theme */ |
||||
/* by Bram de Haan (http://atelierbram.github.io/syntax-highlighting/atelier-schemes/cave) */ |
||||
/* Original Base16 color scheme by Chris Kempson (https://github.com/chriskempson/base16) */ |
||||
|
||||
/* Atelier-Cave Comment */ |
||||
.hljs-comment, |
||||
.hljs-quote { |
||||
color: #7e7887; |
||||
} |
||||
|
||||
/* Atelier-Cave Red */ |
||||
.hljs-variable, |
||||
.hljs-template-variable, |
||||
.hljs-attribute, |
||||
.hljs-regexp, |
||||
.hljs-link, |
||||
.hljs-tag, |
||||
.hljs-name, |
||||
.hljs-selector-id, |
||||
.hljs-selector-class { |
||||
color: #be4678; |
||||
} |
||||
|
||||
/* Atelier-Cave Orange */ |
||||
.hljs-number, |
||||
.hljs-meta, |
||||
.hljs-built_in, |
||||
.hljs-builtin-name, |
||||
.hljs-literal, |
||||
.hljs-type, |
||||
.hljs-params { |
||||
color: #aa573c; |
||||
} |
||||
|
||||
/* Atelier-Cave Green */ |
||||
.hljs-string, |
||||
.hljs-symbol, |
||||
.hljs-bullet { |
||||
color: #2a9292; |
||||
} |
||||
|
||||
/* Atelier-Cave Blue */ |
||||
.hljs-title, |
||||
.hljs-section { |
||||
color: #576ddb; |
||||
} |
||||
|
||||
/* Atelier-Cave Purple */ |
||||
.hljs-keyword, |
||||
.hljs-selector-tag { |
||||
color: #955ae7; |
||||
} |
||||
|
||||
.hljs-deletion, |
||||
.hljs-addition { |
||||