昨年くらいから断続的にテキストパーサーを調べて実験コードを書いてきた (この辺の話)のですが、 機能変更が落ち着いてきたのでとりあえず公開しました。TypeScript 版です。 ライセンスは MIT です。 このブログで書いてきたパーサーコンビネータは Kotlin で実装しているのですが、 それを TypeScript に移植してあれこれ修正したものです。 ライブラリ本体は TypeScript で書いていますが、パースするコードを書くときは JavaScript でゆるくかけるので楽です。
Kotlin 版では tailrec が使えたので深い再帰が発生してもスタックオーバーフローにはならないと思うのですが、 TypeScript 版はそのあたりの対策は今のところしていません。 そんな巨大なテキストをパースすることもないのかな。
» Read Moreその2の続きです。 今まではパーサーが letter, zeroOrMore しか用意していなかったので、 HelloWrold! などという中途半端な文字列をパースする例で説明していた。 今回は普通に Hello, World! 文字列をパースできるように、 one, and および seq パーサーを追加します。
» Read More改善版2024)Kotlin でパーサーコンビネータを実装する HtmlWriter の導入で書いたコードを TypeScript に書きかえます。
» Read Moreたとえば無印良品のこの食品 フライパンでつくるミールキット 海老といかのアヒージョの商品表示情報のPDFをみると以下のような文字列が原材料名に記載されています。
ブロッコリー(エクアドル)、揚げじゃがいも(じゃがいも(国産)、植物油脂)、殻付き海老(インド)、いか(中国)、(一部にえび・いかを含む)
このように括弧が入れ子で多重に出現している文字列、しかも、一重/二重/三重・・・ n 重のバリエーションがある文字列をパースすることを考えたい。
最終的には以下のように括弧で括られた部分を AST(Abstract syntax tree) に 変換して、各トークンをその括弧の包含関係を生かした状態で把握できるようにしたい。
» Read MoreDeno を使えば TypeScript を使って UXP InDesign スクリプトをバンドルできることがわかった、 というのが前回のポスト。 しかし、 require("uxp").storage.localFileSystem を使う場合なども機能するのだろうか? と思い立ち調査しました。 結論としては問題ありません。
結論だけ知りたい場合はこちらのレポジトリの read-text-ts をご覧ください。
» Read MoreDeno を使えば TypeScript を使って UXP InDesign スクリプトをバンドルできることがわかった。
以前軽く試したときは、deno bundle した段階で型関連のエラーが出てしまいバンドルできなかった。 でも考えてみたら(考えるほどでもないが)自分で型定義を用意して bundle 時とかコンパイル時に渡せば無問題なのでは? と思い立ち試したところ問題なくバンドルできた。
結論だけ知りたい場合はこちらのレポジトリの hello-world-ts を見てください。
このエントリーではごく簡単な UXP InDesign Scripting の例で説明します。
» Read MoreUXP InDesign, SheetJS を利用して MSエクセルデータを扱う(rollup.js編)では、rollup.js を使ってスクリプトをひとつのファイルにまとめていました(バンドル)が、Deno を使ってバンドルできることがわかりました。
もっとも、あくまでここで検証した簡単なスクリプトについてうまくバンドルできたという話です。 いろいろなケース、とかすべてのケースで、Deno によるバンドル(rollup.js によるバンドルもそうですが)がうまくいくかはわかりません。
簡単に手順を書き残します。
» Read Moredanfo.js 空のセルが存在するエクセルファイルを読み込み失敗するなど で SheetJSからセルの値を読み取るときに、セルアドレスを生成するためのコードで、行列を二重にループしていた。 これをもっと簡単に書きたい。
» Read More