詩と創作・思索のひろば

ドキドキギュンギュンダイアリーです!!!

Fork me on GitHub

AsciiDoc(Asciidoctor)の文書をtextlintで校正する

AsciiDocはMarkdownのようなテキストマークアップ言語のひとつで、ページ内リンクや脚注などかなり機能が豊富なので、大きめのドキュメントを本腰を入れて書くなど、表現したいものがある程度複雑なときに便利。DocBookというフォーマットを通じて、HTMLだけでなくPDFとかroff形式にも変換できるらしい(やったことはない)。GitのドキュメントがAsciiDoc形式で書かれているのを見て知って、自分も個人的なドキュメントはREADME.adocなどとして、AsciiDoc形式で書くことがある。AsciidoctorはAsciiDocの実装のひとつで、Rubyで書かれていて利用が簡単なのでこれを使っている。

さて、上記の記事でtextlintなるものを知ったので、AsciidoctorのJavaScript実装を使ってプラグインを書こうと思いたったわけだ(標準で対応しているのはプレーンテキスト、HTML、Markdownのみ)。しかし取りかかってみるとこれがなかなか大変で、textlintの期待するデータ構造はテキストの行やカラム位置の情報まで求めるので、Asciidoctorのパーザに精通している必要がありそうだった。せいぜい校正項目のある行くらいが分かれば自分の目的は達成されるので、ここまでやるのは少し苦労が多そうだった。

そこで、一度プレーンテキストに変換してからtextlintで処理し、結果のエラーの行番号を元のファイルの行にマッピングする、という方法を取ることにしたのがこちら。npm install textlint してある前提。

Rubyのスクリプトで、指定されたファイルをAsciidoctorのAPIで解析し、構文木をたどりながらプレーンテキストを吐く。その際に各行と、そのソースの位置情報を記録しておく。プレーンテキストに対してtextlintを走らせて、結果をJSONで受けとり、元のファイル名に直して出力する。そのままVimのquickfixリストにできるフォーマット。

少しだけ変なハックを入れている。このスクリプトは通常はHTMLタグのみを消して出力する、つまりアンカーテキストなどは校正の対象となるのだけど、それで上手くいかない場合があった。codeタグの中に入ったアルファベットも日本語のルールで校正されてしまう、という問題だ。そこで -T オプションでそのタグの内容を墨塗りできるようにしてある。中身を消し去ってしまうと変な文章になるので、苦肉の策。墨塗り文字のくり返しがエラーになるので、そいつは無視する、ということもしている。

Dropbox のファイル選択/保存ダイアログを表示できる Polymer エレメントを書いた

デモを動かしてみるとこんな感じです。

f:id:motemen:20150611202513g:plain

概要

dropbox/dropbox-js を利用してファイル選択/保存ダイアログを表示するコンポーネントです。基本的にフォルダ内のファイルの一覧を行うだけで、それ以上のことはコンポーネントのユーザに委ねているので、ユーザは dropbox-js の API を使って実際のファイルの読み書きを行う必要があります。

使い方

bower でインストールして、

bower install --save motemen/dropbox-file-chooser-dialog

ダイアログを表示したいページや要素で import しつつ、配置します。

<script src="path/to/webcomponentsjs/webcomponents-lite.js"></script><!-- 必要であれば -->
<link rel="import" href="path/to/bower_components/dropbox-file-chooser-dialog/dropbox-file-chooser-dialog.html">
...
<dropbox-file-chooser-dialog app-key="YOUR_APP_KEY"></dropbox-file-chooser-dialog>

API

ドキュメント にある通り、openFolder(path[, mode]) でダイアログを開けます。

var dialog = document.querySelector('dropbox-file-chooser-dialog');

// 「ファイルを開く」ダイアログ
dialog.openFolder('/', 'open');

// 「ファイル名を指定して保存する」ダイアログ
dialog.openFolder('/', 'save');

また簡便のため、dropbox-js へのインターフェースも少し定義してあります。

dialog.authenticate(function (err, dropbox) { ... });

dialog.readFile(path, function (err, content, file) { ... });

dialog.writeFile(file, content, options, function (err, file) { ... });

イベント

ダイアログが表示されて、ユーザによってファイルが選択またはファイル名が指定された時には以下のイベントが発火します。

dropbox-file-chosen-open

ファイルを開く選択。event.detail{ file: Dropbox.File.Stat }

dropbox-file-chosen-save

ファイルを保存する選択。event.detail{ folder: Dropbox.File.Stat, filename: String }

カスタマイズ

  • 必須の属性として、Dropbox に登録したアプリの App Key を app-key に記述する必要があります。
  • with-backdrop 属性を与えることで、デモのようにダイアログの表示時にそれ以外の要素をグレーアウトさせることができます。(詳しくは IronOverlayBehavior
<dropbox-file-chooser-dialog with-backdrop></dropbox-file-chooser-dialog>
  • スタイルシートで dropbox-file-chooser-dialog の width, height を指定することでいい塩梅にダイアログが配置されます。(同上)
dropbox-file-chooser-dialog {
  width: 60%;
  height: 60%;
}
  • iframe 内に表示するなど、遷移による Dropbox 認証が行えない場合、popup-oauth-receiver-url 属性を使うことができます(デモを参照してください)。

また、ヘッダの色はデフォルトで灰色に黒ですが、Custom CSS properties という機構を利用して、以下のようにしてカスタマイズできます。

<style>
:host {
  --dropbox-file-chooser-dialog-header-background-color: red;
  --dropbox-file-chooser-dialog-header-color: white;
}
</style>

上の例は何がしかの Polymer エレメントからスタイルをあてたい場合で、素の HTML から利用するときは以下のように is="custom-style" を指定する必要があります。

<style is="custom-style">
:root {
  --dropbox-file-chooser-dialog-header-background-color: red;
  --dropbox-file-chooser-dialog-header-color: white;
}
</style>

ソースとドキュメント

ソース: https://github.com/motemen/dropbox-file-chooser-dialog

ドキュメントとデモ: https://motemen.github.io/dropbox-file-chooser-dialog/

デモはその性格上お使いの Dropbox の読み書き権限を要求しますが、ファイルの内容の書き換えや読み出しまでは行いません。為念。

初回の認証あたりの流れがちょっといかしてない感じがしますが、どうぞご利用くださいね。

コマンドラインでカラーコードの計算・操作ができるツール

何かしら画面を作らなければいけないときには色のことを考える必要があって、たとえばこの色を少し暗くした色が欲しい! と思ったときに、素人としては頼れる方法を持っていないのが問題なのです。ウェブサイトであれば Scss なり Less なりの CSS プリプロセッサを使えばそういった要求に応える便利な機能が用意されているのであまり考える必要はないのだけれど、他の場面でも使える汎用的な道具が欲しかった。簡単に言うと darken(red, 10%) とか与えたら #rrggbb みたいな形式で表現してくれるやつです。

そこで書いたのがコレだ: motemen/node-less-calc

たぶん Functions | Less.js にある関数がすべて使えます……というので分かるとおり、Less の機能にそのまま乗っかっている非常にエコな実装。オマケで色だけでなく大きさの計算もできる。

% less-calc 'darken(red, 10%)'
#cc0000

% less-calc '1px+1px'
2px

npmjs.org にアップロードしていないので以下のようにしてインストールしてください。

% npm install -g motemen/node-less-calc

はてなで一緒に働きませんか?