Giter Club home page Giter Club logo

abap34 / almo Goto Github PK

View Code? Open in Web Editor NEW
13.0 13.0 3.0 5.11 MB

[⚠️ WIP] ALMOは拡張Markdownパーサ・静的サイトジェネレータです。ALMOは、WebAssemblyを使ってブラウザ上で完結する実行環境を提供し、サーバ無しでのサンプルコードの実行やジャッジシステムの構築を可能にします。

Home Page: https://www.abap34.com/almo.html

License: MIT License

C++ 77.99% HTML 4.51% Python 0.64% JavaScript 3.97% CSS 10.74% Shell 1.78% Dockerfile 0.19% Makefile 0.19%
cpp html markdown static-site-generator webassembly

almo's Introduction

abap34

Tokyo Institute of Technology, Department of Computer Science, B3

  • Interests
    • Machine Learning
    • Compiler
    • Mathematical optimization
    • Statistics

almo's People

Contributors

abap34 avatar ebi-fly13 avatar noya2ruler avatar potato167 avatar zer0-star avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

almo's Issues

`<>` を含むソースコードが正常に表示されない

#include <stdio.h>

のようなプログラムを与えると、

<pre><code class="language-c">
 #include <stdio.h>
</code></pre>

のように出力され、<std.io.h>
がタグとして認識されてしまって表示されない。

入力のコードを HTMLに変換するときにエスケープすればよさそう。

&&amp;
"&quot;
'&#39;
<&lt;
>&gt;

Document 整備

  • 導入方法
  • チュートリアル
  • 記法
  • テンプレート
  • テーマ
  • 周辺ライブラリ
  • 詳しい仕様

実行を中断できるようにする

今は実行を中断する手段がない。
ドキュメントでよく説明されているなら、sharedArrayBuffer を使った実装を標準にして中断機能をつけたほうがいい気がする。

ASTのノードの検索を追加

例えば PyOdide が必要か調べるために ExecutableCodeBlock が存在するか調べる、脚注として生成すべき数を調べるなどのためにノードの検索機能が必要.

  • 検索の仕方 (ノードのマッチ条件の記述方法)
  • 検索結果の表現方法

についてまず考える

ビルドのスクリプトを汎用性の高いものにする

いま、コンパイル時に文字列定数を埋め込むために R("...") をファイルに埋め込んでセットアップしてからビルドするようなスクリプトが作られている。

almo/scripts/setup.sh

Lines 1 to 24 in 8b4da2a

#!/bin/bash
src_dir="src/"
build_dir="build/"
mkdir -p "$build_dir"
for file in "$src_dir"*
do
name="$(basename "$file")"
extension="${name##*.}"
if [ "$extension" != "cpp" ] && [ "$extension" != "hpp" ]; then
contents="$(cat "$file")"
escaped_contents="${contents//\\/\\\\}"
echo -e "R\"(\n" > "$build_dir"$name
echo -e "$escaped_contents" >> "$build_dir"$name
echo -e "\n)\"" >> "$build_dir"$name
echo "ファイル $file を処理済み"
else
cp "$file" "$build_dir"
echo "ファイル $file をコピー"
fi
done

ビルドのプロセスがかなり複雑化してきていているので、より汎用性の高い実装にしたい。

たとえば Python で書き直すとかも選択肢の一つ

ALMO-CLI への機能の移行

以下の機能は ALMO-CLI (https://github.com/abap34/almo-cli) に移行して、ALMO 本体では Markdown のパースのみに集中したい。
(将来的には md_to_html, md_to_json, md_to_dot あたりのみを提供したい)

  • インターフェースの整備
  • front yaml のパース
  • テンプレートへの埋め込み

`NonLeafNode` に子がない場合 jsonの出力が崩れる

1.

という入力を与えると、

   "ir": {
      "class": "Block",
      "uuid": "",
      "childs": [
         {
            "class": "NewLine",
            "uuid": "1"
         },
         {
            "class": "NewLine",
            "uuid": "2"
         },
         {
            "class": "EnumerateBlock",
            "uuid": "3",
            "childs":
         ] // ここが invalid
      },
      {
         "class": "NewLine",
         "uuid": "4"
      },
      {
         "class": "NewLine",
         "uuid": "5"
      },
      {
         "class": "NewLine",
         "uuid": "6"
      }
   ]
}

のような 中間表現が出力される。

homebrew 以外への配布

  • homebrew 以外からも導入できるようにする
  • macOS 以外でもパッケージマネージャから導入できるようにする

clang でもコンパイルできるようにする

今、 C++23 の機能のうち g++ ではサポートされていて clang ではサポートされていないもの (例: join_with) が含まれているので、clang でコンパイルすることができない。

そこで join_wih の使用を一旦やめて、clang でもコンパイルできるようにする。

AST・中間表現の出力の設計の見直し

v0.7.0 では ASTのノード LeafNodeNonLeafNode のいずれかで表現して、プロパティをそのまま吐き出して json を作ってる。

ただ、例えば吐かれた ir から何かしらの処理をしたいとき (例: ブログでプレビューを作るために レンダリングされてない RawText だけ取り出したい) みたいな場合、統一的な keyになってないと辛い。

なので、jsonに吐くときにプロパティをそのまま吐くんじゃなくてもう少し手を入れる(例えば NonLeafNode なら content を必ず key にいれるとか、ノードのプロパティ自体に制約をかけるとか(これは少し行儀が悪そう)、元のASTで value を保持するのは全て RawText にするように設計を変更したい。

  • #85
  • jsonの形式を整備する

エスケープの動作がおかしい

dot 言語や jsonの出力に使うために以下のようなエスケープを行ってくれる関数を使っている。

almo/src/utils.hpp

Lines 179 to 192 in a512df9

// 文字列を受け取り、ダブルクオーテーションや改行などをエスケープする
// https://stackoverflow.com/questions/7724448/simple-json-string-escape-for-c
std::string escape(const std::string &s) {
std::ostringstream o;
for (auto c = s.cbegin(); c != s.cend(); c++) {
if (*c == '"' || *c == '\\' || ('\x00' <= *c && *c <= '\x1f')) {
o << "\\u"
<< std::hex << std::setw(4) << std::setfill('0') << static_cast<int>(*c);
} else {
o << *c;
}
}
return o.str();
}

しかし、{, }, |, >, < がエスケープ対象から漏れているため、dot言語の出力が崩れる場合がある。修正が必要

脚注の追加

脚注の機能がないのであるとよさそう。

  1. 適当な構文で脚注の表示とidを振れるようにする (例: これは Aによる研究 [^a_research] により示された。)
  2. id に対応する脚注の文を書くと、末尾に生成される。例: [a_reserch]: example.com
  3. もとの文に連番が振られる。

構文は既存の仕様の調査が必要そう。

C++側のインターフェースを整える

いまの実装では almo.cpp の main でコマンドライン引数のパースや置換などがまとめて行われていて、

#97 などを考えると外から呼び出しやすいようにこの辺りを分離して実装し直したい。

オンラインデモを作る

気軽に試せるようにオンラインのデモを作りたい。

emscripten で ALMO自体を wasm にコンパイルして動かすのが良さそう。

やっておきたい

  • エラーやwarningの行を出したい(例: n行目の記法が不正です) けど、前処理(メタデータの削除, コメントの削除) によって元のマークダウンファイルと、パーサが受け取るマークダウンの各行が一致しなくなる。ので、マークダウンのファイルを読んだときに、行数の情報も保存しておいてエラー出せるようにしたい。

  • パースする前の処理を色々できるようにしたい。

    • エイリアスのサポート
    • エスケープ(重要!!)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.