狗粮时间

楽土

Shell::Piping 现在已经拥有了我列表中的所有功能。所以是时候使用它了。我还需要以 README.md 的形式编写文档。如果能把它渲染成 HTML 而不推送到 github 上就更好了。事实证明,有一个 ruby gem 可以把一个漂亮的 Markdown 文件转换成 HTML 片段。我已经有了一个脚本,可以把 HTML 嵌入到一个 HTML 页面中,并努力使其可以打印。

#! /usr/bin/env raku

use v6;

put q:to/EOH/;
<html>
  <head>
    <style>
      body {
        margin: auto; margin-top: 4em; max-width: 80em;
      }

      @media print {
        @page { margin: 4em; }
        p { break-inside: avoid; break-before: avoid; }
        h3 { break-after: avoid; break-before: avoid; }
        h2 { break-after: avoid-page; break-before: auto; }
      }
    </style>
  </head>
  <body>
EOH
put $*ARGFILES.slurp;
put ‚  </body>‘;
put ‚</html>‘;

因为这个脚本是通过 $*ARGFILES 从 STDIN 中获取输入,所以它适合成为 unix 管道的一部分。手工启动这样一个管道是非常麻烦的。写入 README.md 可以创建所有需要决定的数据以及如何创建 README.html。

#! /usr/bin/env raku

use v6;
use Shell::Piping;

react whenever Supply.merge(Promise.in(0).Supply, ‚.‘.IO.watch) {
    say "something changed";
    for dir(‚.‘).grep(*.ends-with('.md')) {
        my $src = .IO;
        my $dst = $src.extension(‚html‘);
        if $src.modified > (try $dst.modified // 0) {
            my @html;
#`[MARK]    px«commonmarker $src» |» px<html-container> |» $dst;
            say ‚spurted!‘;
        }
    }
}

MARKed 行给我节省了十几行代码,不算错误处理。大多数错误会通过让 Shell::Pipe 抛出异常来产生错误信息。既然我们不能轻易地进行跨语言边界的依赖,那就提醒我未来的自己需要什么。

CATCH {
    when X::Shell::CommandNotFound {
        when .cmd ~~ ‚commonmarker‘ {
            put ‚Please install commonmarker with `gem install commonmarker`.‘;
            exit 2;
        }
        default {
            .rethrow;
        }
    }
}

可以说是一个异常。有 X::Shell::CommandNotFound 类型的对象和一个条件。如果条件没有满足,我们使用已经提供的异常。否则我们就用一个更好的消息来替换。我相信这是一个值得思考的补丁。可能还有更多的模板需要删除。

comments powered by Disqus