From 383f8e77007842d65003e90bedea34b198aaa078 Mon Sep 17 00:00:00 2001 From: abap34 Date: Thu, 10 Aug 2023 01:39:05 +0900 Subject: [PATCH 1/2] =?UTF-8?q?example=E3=82=92=E3=81=BE=E3=81=A8=E3=82=82?= =?UTF-8?q?=E3=81=AA=E3=82=82=E3=81=AE=E3=81=AB=E3=82=A2=E3=83=83=E3=83=97?= =?UTF-8?q?=E3=83=87=E3=83=BC=E3=83=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- example/example.md | 136 +++++++++++++++++++------------ example/helloalmo/in/001.txt | 1 + example/helloalmo/in/002.txt | 1 + example/helloalmo/in/sample.txt | 1 + example/helloalmo/out/001.txt | 1 + example/helloalmo/out/002.txt | 1 + example/helloalmo/out/sample.txt | 1 + 7 files changed, 92 insertions(+), 50 deletions(-) create mode 100644 example/helloalmo/in/001.txt create mode 100644 example/helloalmo/in/002.txt create mode 100644 example/helloalmo/in/sample.txt create mode 100644 example/helloalmo/out/001.txt create mode 100644 example/helloalmo/out/002.txt create mode 100644 example/helloalmo/out/sample.txt diff --git a/example/example.md b/example/example.md index d1b477a..92f9857 100644 --- a/example/example.md +++ b/example/example.md @@ -1,72 +1,108 @@ --- -title:abap34 -data:0809 +title: ALMO デモページ +date: 2023-08-10 +author: abap34 --- -# すごいマークダウン -## H2 -### h3 -#### $a$ -##### *xxx*ff -###### ~~fff~~ +# ALMO デモページ -This is Awesome Markdown. -めっちゃすごいマークダウンと、申します... +## はじめに -インラインの形式だよ。 +ALMOは、拡張Markdownを受け取り実行 & ジャッジ環境同梱の単一のHTMLファイルを出力します。 -$x^2 + y^2 = z^2$ +ALMOは基本的なMarkdownのパーサの機能を内包していますが、 -とか +ALMOの最大の特徴、そして売りは、**実行・ジャッジ可能なコードブロック**です。 -*traO*とか**xx**とか`a`とか`xxx` +下にいかにも入力可能そうなエディタと、ボタンがあります。 -とか**野球部**ね。~~a~~ +そこに、 -- vector - - fff - - xx -- array - - ネストできます`a` - - すごいね -yaa -- gg +入力を受け取って、 `Hello {入力された文字列}!` という文字列を出力するプログラムを書いてみましょう。 -- ff -## guo- -*ff* +なお、Pythonの標準入力は`input()`で受け取ることができます。 +文字列結合は`+`で行え、出力は`print()`で行えます。 -$$ -f*f := f\times f -$$ -``` -int main() { - int a; - std::cin >> a; - std::cout << a << std::endl; -} -``` -[url](https://atcoder.jp/) +:::code +title=Hello ALMO! +sample_in=example/helloalmo/in/sample.txt +sample_out=example/helloalmo/out/sample.txt +in=example/helloalmo/in/*.txt +out=example/helloalmo/out/*.txt +::: + + + + +プログラムが書けたら、"Run Sample"ボタンを押してみましょう。 +すると、「サンプルの入力」に対する実行結果が、「出力」に表示されます。 + +ただしいプログラムが書けたら、"Submit"ボタンを押してみましょう。 + +すると、複数のテストケースに対して正しい出力がなされているかチェックされます。 -f![xx](example/image/sum.png) +無事に正しいコードが書かれていれば左上のステータスが"AC(Accepted)"となったはずです! -インターネット上の画像をBas64でエンコードして埋め込むこともできます。 -![](https://www.abap34.com/assets/myicon-3ebaec7d.png) +このように、ALMOはプログラムを書いて実行し、ジャッジすることができます。 +そして、この実行は、 **サーバー側ではなく、ユーザーのブラウザ側で完結しています。** + +ALMOは、[Pyodide](https://pyodide.org/en/stable/) を使ってブラウザ上でPythonのコードを実行することができます。 + +また、ジャッジコードも組み込まれており、全ての処理がブラウザ上で完結しています! +(つまり一度読み込みさえ終わればオフライン環境でも動作します.) + +そしてこのコードブロックは + + +``` :::code -title=Sum Function -sample_in=example/in/sample.txt -sample_out=example/in/sample.txt -in=example/in/*.txt -out=example/out/*.txt -judge=equal +title=Hello ALMO! +sample_in=example/helloalmo/in/sample.txt +sample_out=example/helloalmo/out/sample.txt +in=example/helloalmo/in/*.txt +out=example/helloalmo/out/*.txt ::: +``` + + +と書くだけで作ることができます。 + + +このような記述を含むMarkdownファイルをALMOに渡すだけで、ALMOは全ての入出力ファイルをHTMLファイルに埋め込んで、自動でジャッジが構築されます! + +つまり、ALMOは**「全部入り」のHTMLファイルを出力する**パーサです! +(他にも、たとえインターネット上のファイルでも、画像は自動でBase64に変換され、HTMLファイルに埋め込まれます。) + +![マンドリル](https://imagingsolution.net/wordpress/wp-content/uploads/2011/03/Mandrill.png) + + + +## インストール方法・使い方 + +ALMOは、Homebrewを使ってインストールすることができます。 + +``` +brew tap abap34/homebrew-almo +brew install almo +``` + +インストールが完了したら、MarkdownファイルをALMOに渡してみましょう。 + +``` +almo example/example.md > index.html +``` + +結果は標準出力に吐かれるので、適宜リダイレクトしてください。 + +HTMLファイルは単体で動作します! + +あとは自分のサイトに配置したり、配布して、ぜひ使ってください! + +記法の詳細については [レポジトリのREADME.md](https://github.com/abap34/ALMO)を参照してください。 + -| **TOKYO** | 2 | 3 | -|:---|:---:|---:| -| *4* | **おい** | 9 | -| 7 | 8 | 9 | diff --git a/example/helloalmo/in/001.txt b/example/helloalmo/in/001.txt new file mode 100644 index 0000000..04fea06 --- /dev/null +++ b/example/helloalmo/in/001.txt @@ -0,0 +1 @@ +world \ No newline at end of file diff --git a/example/helloalmo/in/002.txt b/example/helloalmo/in/002.txt new file mode 100644 index 0000000..093014d --- /dev/null +++ b/example/helloalmo/in/002.txt @@ -0,0 +1 @@ +wasm \ No newline at end of file diff --git a/example/helloalmo/in/sample.txt b/example/helloalmo/in/sample.txt new file mode 100644 index 0000000..81bb245 --- /dev/null +++ b/example/helloalmo/in/sample.txt @@ -0,0 +1 @@ +ALMO \ No newline at end of file diff --git a/example/helloalmo/out/001.txt b/example/helloalmo/out/001.txt new file mode 100644 index 0000000..5dd01c1 --- /dev/null +++ b/example/helloalmo/out/001.txt @@ -0,0 +1 @@ +Hello, world! \ No newline at end of file diff --git a/example/helloalmo/out/002.txt b/example/helloalmo/out/002.txt new file mode 100644 index 0000000..684288a --- /dev/null +++ b/example/helloalmo/out/002.txt @@ -0,0 +1 @@ +Hello, wasm! \ No newline at end of file diff --git a/example/helloalmo/out/sample.txt b/example/helloalmo/out/sample.txt new file mode 100644 index 0000000..4cd2153 --- /dev/null +++ b/example/helloalmo/out/sample.txt @@ -0,0 +1 @@ +Hello, ALMO! \ No newline at end of file From 41fab8b803b2f376cb7e2ad9310d6f6796361331 Mon Sep 17 00:00:00 2001 From: abap34 Date: Thu, 10 Aug 2023 01:39:56 +0900 Subject: [PATCH 2/2] =?UTF-8?q?=E3=82=A4=E3=83=B3=E3=83=A9=E3=82=A4?= =?UTF-8?q?=E3=83=B3=E3=82=B3=E3=83=BC=E3=83=89=E3=83=96=E3=83=AD=E3=83=83?= =?UTF-8?q?=E3=82=AF=E3=81=AB=E5=AF=BE=E5=BF=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/render.hpp | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/render.hpp b/src/render.hpp index 7415078..40f06ae 100644 --- a/src/render.hpp +++ b/src/render.hpp @@ -816,7 +816,7 @@ namespace almo { std::string base64_image = base64_encode(image_data); // Generate the HTML tag with Base64-encoded image data - std::string output = "\"""; + std::string output = "\"""; return output; } @@ -839,7 +839,7 @@ namespace almo { } std::string render_table(std::vector from_render, int n_row, int n_col, std::vector col_names, std::vector col_format) { - // std::cout << "render table" << std::endl; + std::string output = ""; output += ""; for (int i = 0; i < n_col; i++) { @@ -856,10 +856,17 @@ namespace almo { } output += ""; } + + output += "
"; return output; } + std::string render_inline_code(nlohmann::json j, std::string content) { + std::string output = "" + content + ""; + return output; + } + bool haschild(nlohmann::json j) { return !(j["class"] == "PlainText" || j["class"] == "NewLine" || j["class"] == "Url"); @@ -887,12 +894,15 @@ namespace almo { for (nlohmann::json child : j["content"]) { from_render.push_back(build_block(child, render_map)); } + + std::vector col_format = j["col_format"]; std::vector col_names = j["col_names"]; std::string n_row_str = j["n_row"]; std::string n_col_str = j["n_col"]; + int n_row = std::stoi(n_row_str); int n_col = std::stoi(n_col_str); @@ -937,6 +947,8 @@ namespace almo { render_map["InlineImage"] = render_inline_image; render_map["ListBlock"] = render_list_block; render_map["Item"] = render_item; + render_map["InlineCodeBlock"] = render_inline_code; + std::string outputs;