フォト
無料ブログはココログ

MyList

« 2018投稿一覧 | トップページ | 「お値段以上」はありえない <誰かが負担している> »

2019年1月 6日 (日)

cocologタイトル一覧作成awkスクリプト

 cocologにはバックナンバーのタイトル一覧機能が無い。
バックナンバーは日別、週別、月別、カテゴリー別に表示することができるけど、記事のタイトル一覧を表示させる機能が無い。

 しかたないので、毎年1年分のタイトル一覧を作成して投稿している。
さすがにタイトル一覧を手作業で作る気にはならないのでawkを使って自動的に作成している。

 ところが、毎年書いているような気がする。
スクリプト言語(LL)は気合を入れて書くもんじゃないといつも適当に書いているので、1年後に使おうとするとどうやって使うのか思い出せなかったりする。

 ということで、忘れないように今年使ったawkのスクリプトを書いておく。

 post2index.awkは1年分の記事から記事のタイトルとリンク先とカテゴリを取り出して、一覧にするスクリプトだ。

 使うのは gawkとnkf32/iconvなど。
gawkのインストール方法はくぐるとたくさん見つかる。
nkf32/iconvはあれば便利なければ UTF8toUTF16.batを使う。

〇手順

  1. バックナンバー保存
    まず、bknumディレクトリを作って、そこにcocologからバクナンバーを1月づつhtmlファイルに保存する。
    bknum \
             +bn1.html
           :
             +bn12.html
     
  2. 文字コードを変換する
    cocologの文字コードはutf-8なのでSJISに変換する。
    • cmd.exeを使うなら
      こんなバッチファイルを作って
      UTF8toUTF16.bat bknum\*.html bk_sjis.html
    • nkf32.exeを使うなら
      nkf32 -W8 bknum\*.html > bk_sjis.html
    • iconvを使うなら
      iconv -f UTF-8 -t SJIS bknum\*.html > bk_sjis.html
    • awkでもできるけどね
       
  3. 一覧に表示するカテゴリを指定する
    日付とタイトルの間にカテゴリが入るようになっている。
    ここに表示させるカテゴリはpost2index.awkを開いて

    LCATEGORY="日記・コラム・つぶやき 日 書籍・雑誌 書 映画・テレビ TV 趣味 趣 ペット ぺ"

    の行を編集する。
    表示させたいcocolog上カテゴリと表示させる文字をスペースで区切って並べる。 
  4. 一覧を作る
        gawk -f post2index.awk bk_sjis.html > index.html
  5. coclogの記事作成の[htmlの編集]タブにindex.htmlを張り付ける。
〇スクリプト
post2index.awk
#
# make index from cocolog  entry
# Dec. 2018 / Yoshi
#
# usage: gawk -f post2index.awk bknum\*.html > index.html
#
BEGIN {
    #------ ここを書き換える -----------
    YEAR        = 2018;
    LCATEGORY   = "日記・コラム・つぶやき 日 書籍・雑誌 本 映画・テレビ 映 趣味 趣 ペット ぺ"; 
    NCATEGORY   = 5;
    #-----------------------------------
    FALSE       = 0;
    TRUE        = !FALSE;
    FCATEGORY   = FALSE;
    nf = split(LCATEGORY, a);
    for (i=1; i<=nf; i+=2) {
        CATEGORY[++j,"category"]    = a[i];
        CATEGORY[j  ,"mark"]        = a[i+1];
    }
    CATEGORY[0] = j;
    year        = "";
    month       = "";
    day         = "";
    url         = "";
    title       = "";
    category    = "";
}

#
# get category url
FCATEGORY {
    FCATEGORY = FALSE;
    for (i=1; i<=CATEGORY[0]; i++) {
        if ($0 ~ CATEGORY[i, "category"]) {
            sub(/^[ \t]+/, "");
            CATEGORY[i, "url"] = $0;
        }
    }
    next;
}

/<li class=\"module-list-item\">/ { #"
    FCATEGORY = FALSE;
    next;
}

#
# stor itme list
function stor_link() {
    link[date, "url"]       = url;
    link[date, "title"]     = title;
    link[date, "category"]  = category;
    url         = "";
    title       = "";
    date        = "";
    category    = "";
}

#
# Date
/<h2 class=\"date-header\">[0-9]+年[0-9]+月 ?[0-9]+日/ { #"
    if (match($0, /[0-9]+年[0-9]+月 ?[0-9]+日/)) {
        s = substr($0, RSTART, RLENGTH);
        nf = split(s, a, /[年月日]/);
        year    = a[1];
        month   = a[2];
        day     = a[3];
    }
    date = sprintf("%04d/%02d/%02d", year, month, day);
    if (DEBUG) printf("date=%s\n", date);
}

#
# Category
/<span class=\"post-footers\">/ {    #"
    j = 0;
    for (i=1; i<=CATEGORY[0]; i++) {
        if ($0 ~ CATEGORY[i, "category"]) {
            category = category (j?",":"") CATEGORY[i, "mark"];
            j++;
        }
    }
    if (!FTWITTER) stor_link();
    if (DEBUG) printf("category=|%s|\n", category);
}

#
# make title list
#
END {
    printf("<p>%dの投稿一覧\n", YEAR);
    printf("</p>\n<p>凡例:");   
    for (i=1; i<=CATEGORY[0]; i++) {
        printf("&nbsp;%s:%s&nbsp;", CATEGORY[i, "mark"], CATEGORY[i, "url"])
    }
    for (m=1; m<=12; m++) {
        printf("</p>\n");
        printf("<p>--%04d/%02d--<br>\n", YEAR, m);
        for (d=1; d<=31; d++) {
            date = sprintf("%04d/%02d/%02d", YEAR, m, d)
            if (link[date, "url"]) {
                printf("<a target=\"_blank\" ");
                printf("href=\"%s\">",          link[date, "url"]);
                printf("(%s)",                  date);
                s = sprintf("%-" NCATEGORY "s", link[date, "category"]);
                gsub(/ /, "_", s);
                sub(/_+/, "<span style=\"color: #FFFFFF;\">&</span>",s);
                printf("[<tt>%s</tt>]&nbsp;",   s);
                printf("%s</a><br>\n",          link[date, "title"]);
            }
        }
    }
}

〇UTF-8→SJIS変換バッチファイル
 (http://scripting.cocolog-nifty.com/blog/2017/09/utf-8jis-2668.htmlを参考にしました)

UTF8toUTF16.bat
start /min /wait cmd /c chcp.com 65001 ^& ^( set /p x=""^<nul ^& cmd /u /c type %1 ^) ^>%2
start /min /wait cmd /c chcp.com 932 ^& cmd /c type %2 ^>%3


最近の投稿】【最近のプログラミング】【2018の投稿】【2017の投稿】【2016の投稿】【2015の投稿

« 2018投稿一覧 | トップページ | 「お値段以上」はありえない <誰かが負担している> »

00_Index(一覧)」カテゴリの記事

プログラミング」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: cocologタイトル一覧作成awkスクリプト:

« 2018投稿一覧 | トップページ | 「お値段以上」はありえない <誰かが負担している> »