30分プログラム一覧生成プログラム

30分プログラム、その221。30分プログラム一覧のページを生成するプログラム。ここ数日やってきた生成ツールの最後の部分。

#!/bin/sh
mv 30min.yaml 30min.old.yaml
perl yaml-collect.pl *-*-*.txt > delta.yaml
perl yaml-merge.pl --key=url 30min.old.yaml delta.yaml > 30min.yaml
perl yaml-conv.pl 30min.yaml > 1900-01-01.txt

とすることで、一覧ページを生成する。それぞれのプログラムは、yaml-collect.pl(id:mzp:20080107:collect)、yaml-merge.pl(id:mzp:20080110:merge)、yaml-conv(今日のやつ)。

使い方

$ cat 30min.yaml
---
category:
  - Python
title: cat -n
url: http://d.hatena.ne.jp/mzp/20080101/cat
---
category:
  - Python
title: SQLiteをPythonで
url: http://d.hatena.ne.jp/mzp/20080102/sqlite

$ perl yaml-conv.pl 30min.yaml
* 30分プログラム一覧
** Python
- [http://d.hatena.ne.jp/mzp/20080101/cat:title=cat -n] <a href=\
"http://b.hatena.ne.jp/entry/http://d.hatena.ne.jp/mzp/20080101/c\
at"><img src="http://b.hatena.ne.jp/entry/image/http://d.hatena.n\
e.jp/mzp/20080101/cat" /></a>
- [http://d.hatena.ne.jp/mzp/20080102/sqlite:title=SQLiteをPython\
で] <a href="http://b.hatena.ne.jp/entry/http://d.hatena.ne.jp/mz\
p/20080102/sqlite"><img src="http://b.hatena.ne.jp/entry/image/ht\
tp://d.hatena.ne.jp/mzp/20080102/sqlite" /></a>

ソースコード

#! /usr/bin/perl
# -*- mode:perl; coding:utf-8 -*-
#
# yaml-conv.pl -
#
# Copyright(C) 2008 by mzp
# Author: MIZUNO Hiroki / mzpppp at gmail dot com
# http://howdyworld.org
#
# Timestamp: 2008/01/12 23:25:14
#
# This program is free software; you can redistribute it and/or
# modify it under MIT Lincence.
#

use strict;
use warnings;
use YAML qw(LoadFile);
use Data::Dumper;

# load from file
my ($filename) = @ARGV;
my @yaml = LoadFile($filename);

# divide by category
my %category = ();
for my $entry (@yaml){
    for(@{$entry->{'category'}}){
	$category{$_}=[] unless($category{$_});
	push @{$category{$_}},$entry;
    }
}

# print entry
sub say(@){
    print @_,"\n";
}

say "";
say "*list*30分プログラム一覧";
for my $name (sort keys %category){
    say "** $name";

    for(@{$category{$name}}){
	my $url   = $_->{url};
	my $title = $_->{title};
	my $bm_image = "<img src=\"http://b.hatena.ne.jp/entry/image/$url\" />";
	my $bookmark = "<a href=\"http://b.hatena.ne.jp/entry/$url\">$bm_image</a>";

	say "- [$url:title=$title] $bookmark";
    }
    say "";
}