どせいたんさき。

ナスダヨー

impress.js でスライドを並べるのが面倒なので適当なスクリプト書いた

目的

impress.js を使ってスライドを作成しているのだけどスライドの位置をいちいち設定するのが面倒である.特にスライドの順番を変えたり,途中にスライドを挿入しようとしたりするとその後ろのスライドも全部位置を変えなければいけない.面倒である.

解決方法

適当にスクリプト書いた.

makeimpress
#!/usr/bin/perl
use strict;
use warnings;

sub arrange_slide {
    our $cnt;
    my ($id, $class, $pos) = @_;
    print "<div id=\"". sprintf("%02d-",$cnt) . "$id\" class=\"$class\" ";
    print "data-x=\"$pos->[0]\" " if ($pos->[0]);
    print "data-y=\"$pos->[1]\" " if ($pos->[1]);
    print "data-z=\"$pos->[2]\" " if ($pos->[2]);
    print ">\n";
    $cnt++;
}

sub include_slide {
    my ($fname, $pos) = @_;
    open(my $fh, "<", $fname) 
        or die "Cannot open $fname: $!";
    while (<$fh>) {
        if (/<div\s+id="?(.*?)"?\s+class="?(.*step.*?)"?\s*>/) {
            arrange_slide($1,$2,$pos);
            next;
        }
        print;
    };
}

my $file = shift;
open(my $fh, "<", $file) 
    or die "Cannot open $file: $!";

our $cnt = 0;          # slide counter
my $pos = [0,0,0];     # slide position [x,y,z]
my $step = [1024,900]; # slide step

while (<$fh>) {
    if (/<INCLUDE\s*(.*?)\s*\/?>/) {
        include_slide($1,$pos);
        $pos->[0] += $step->[0];
        next;
    }
    if (/<NEWLINE\s*\/?>/) {
        $pos->[0] = 0; 
        $pos->[1] += $step->[1];
    }
    print;
}

こんなスクリプトmakeimpress とかいう名前で保存しておく.あとはこれに読み込ませるためのテンプレートとなるファイルを作成する.スライドの部分以外は普通の impress.js 用 html ファイルのつもりで作成する.スライド本体が入るはずの部分は以下のように記述する.

index.tmpl
<!-- START: docuemnt body -->
<div id="impress">

<!-- DOCUMENT BODY START -->
  <INCLUDE src/titlepage.html />
  <INCLUDE src/hogepage.html />
  <INCLUDE src/fugaage.html />
  <NEWLINE />
  <INCLUDE src/piyopage.html />
  <INCLUDE src/homuage.html />
</div>
<!-- END: docuemnt body -->
./makeimpress index.tmpl > index.html

これでディレクトリ ./src の中にあるファイルを読み込んで順番に並ぶように配置した html ファイルが標準出力に出力される.<NEWLINE /> の命令は改行を意味している.一段下にずれてまた左端から並べてくれる.

スライドの並べ方は $step という変数で決めているのでこれを書き換えるような命令を実装すればいろいろな並べ方を読み込むファイルから指定できるはず.今回は危なっかしい正規表現で html のタグを処理しているのでできればやめたい.モジュールとか使ってちゃんと書きたい(願望).あるいは既製品があるのであればそれを利用したい.