名もなき未知

エンジニアリングとか、日常とかそういうのをまとめる場所。

自分の環境で WSL2 + Marp を使って pdf を出力するスクリプト

これの続き。

namonakimichi.hatenablog.com

書いたshell

環境変数渡したり、なんかもはや pdf ファイルは一定のディレクトリ内に格納されたほうが便利かなと思って下記を書いた。

英語は感覚で書いているのでめちゃくちゃな気がする。

#!/bin/sh

if [ $# -eq 0 ] || [ $# -gt 2 ]; then
    cat << EOS 
How to use:
    Single File Mode:
    ex) ./build_pdf.sh test-slide/slide.md
    
    Create pdf file in output dir.
    For example input, output pdf file name is slide.pdf

    Optinal mode:
    ex) ./build_pdf.sh test-slide/slide.md out.pdf
    Create pdf file in output dir, output file name is out.pdf
EOS
    exit 1
fi

OUTPUT_DIRNAME="./output/"
if [ ! -e "$OUTPUT_DIRNAME/" ]; then
    mkdir $OUTPUT_DIRNAME
    touch "$OUTPUT_DIRNAME/.keep"
    echo "Create Dir: $OUTPUT_DIRNAME"
fi

OUTPUT_FILENAME=$2
if [ -z "$OUTPUT_FILENAME" ]; then
    OUTPUT_FILENAME=${1##*/}
    OUTPUT_FILENAME=${OUTPUT_FILENAME%.*}.pdf
fi

CHROME_PATH=$(which google-chrome-stable) pnpx marp "$1" -o "$OUTPUT_DIRNAME$OUTPUT_FILENAME"

run script で解決してみる

ところで npm run の形で環境変数を渡す手段もありそうだ。

とりあえず pakage.json にこんな感じの記載をして、固定して渡す環境変数を定義してしまう。

  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "marp": "CHROME_PATH=$(which google-chrome-stable) marp"
  },

これで pnpm run marp したら marp が動く( pnpm 試してるので npm じゃないんですが、コマンド体系的に似てて、この動作については一緒なので以後、 pnpm になっていますが、お気になさらず)。

で、引数を雑に渡すと失敗する。

❯ pnpm run marp test-slide/slide.md -o output.pdf
 ERROR   ERROR  Unknown option: 'o'
For help, run: pnpm help run

下記の記事を参考に、引数の渡し方を変えたらできた。 run script では必須の知識ではないだろうか…。

qiita.com

❯ pnpm run marp test-slide/slide.md -- -o output.pdf

> marp-backup@1.0.0 marp /home/yumechi/work/github.com/yumechi/marp-backup
> CHROME_PATH=$(which google-chrome-stable) marp "test-slide/slide.md" "-o" "output.pdf"

[  INFO ] Converting 1 markdown...
[  INFO ] test-slide/slide.md => output.pdf

一応公式のページ

docs.npmjs.com

感想

まず npm run する方向性で考えればよかったですねという反省。まあ久々に shell 書いて勉強になったのでよしとしましょう。

shell 、すぐ書き方なり典型的な処理を忘れてしまうんので、今年こそまとめようと思います…。

追記

今書いてるのは private でいろいろやらないといけないものなので見せられないのですが、時間ができたら自分用の slide 公開場としてテンプレートっぽいディレクトリを作ろうと思います。