kiyoka.2008_10_06 RSSPLAIN

Related pages: !kiyoka.blog.list !kiyoka.blog.2008_10
51555555522555555555555555555555555555555554444444444444444555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555555355555555555555555555555555555555555555555555055555555555555555555555555555555550
5

[OldType][tDiary] tDiaryのデータをOldTypeに変換した

1

h1 to oldtype_logo

5

kiyoka日記EXTにあるtDiaryの過去データをツールを作って変換した。

5

ツールはshellスクリプトとGaucheで作成。

5

いまは、少しづつ変換後のコンテンツを微調整している所。

5

例えば、tDiaryに登録した画像データまでは変換しないので、そのあたりは手作業になる。

5

過去記事は 324件 もあった。こんなに書いてたんだなあ。

5

変換が終わったら、この膨大な記事から本の書評だけ抜きだしたり色々面白いことができそう。

5

 

2

ちなみに、これがスクリプト。

2

ちょっと長いけど、御勘弁。(このソースコードはCodeReposに上げてます)

5

 

5

[ tdiary2oldtype.sh ]

5
#!/bin/zsh
5
5
cat tdiary_data/**/*.td2 | iconv -f euc-jp -t utf8 > td2.txt
5
cat tdiary_data/**/*.tdc | iconv -f euc-jp -t utf8 > tdc.txt
5
5
gosh ./convertToSexp.scm d < td2.txt > td2.scm
5
gosh ./convertToSexp.scm c < tdc.txt > tdc.scm
5
5
mkdir -p out
5
gosh ./convertToOT.scm ${USER} td2.scm tdc.scm
5

 

5

一旦、tDiaryの形式からS式のファイル(alist)に変換するのがミソ。

5

 

5
  tDiaryのデータ
5
Date: 20070902
5
Title: 
5
Last-Modified: 1188819527
5
Visible: true
5
Format: tDiary
5
5
[プログラミング] Schemeのlambdaがようやく分かってきた
5
 <%=a "なんでもλ|http://practical-scheme.net/docs/lambda-j.html" %>を前に何度も読んだけど、自分のモノになってなかったようです。
5
 最近、named letと継続渡しオンパレードなWiLiKiのパーサをいじることで、ようやく全部同じだという感覚が掴めました。
5
 何なんでしょう。こういう質の高いチュートリアルを読んでも掴めなかった感覚が実際に自分でやってみると掴めるというのは。
5
 なんでも経験ですね。
5
 誰か『なんでも経験』ていう文章書いて下さいませ。
5
5
.
5

 

5
  変換後のS式
4
( "20070902"
4
  (Date: . "20070902")
4
  (Title: . "")
4
  (Last-Modified: . "1188819527")
4
  (Visible: . "true")
4
  (Format: . "tDiary")
4
  
4
  ( "[プログラミング] Schemeのlambdaがようやく分かってきた
4
<%=a 'なんでもλ|http://practical-scheme.net/docs/lambda-j.html' %>を前に何度も読んだけど、自分のモノになってなかったようです。
4
最近、named letと継続渡しオンパレードなWiLiKiのパーサをいじることで、ようやく全部同じだという感覚が掴めました。
4
何なんでしょう。こういう質の高いチュートリアルを読んでも掴めなかった感覚が実際に自分でやってみると掴めるというのは。
4
なんでも経験ですね。
4
誰か『なんでも経験』ていう文章書いて下さいませ。" )
4
  .
4
  .
4
  )
5

 

5

[convertToSexp.scm]

5
#!/usr/local/bin/gosh
5
5
(use srfi-1)
5
(use srfi-13)
5
5
(define (load-td2 port)
5
  (let (
5
        (body  '())
5
        (str-list (port->string-list port)))
5
5
    (define (reset-body!)
5
      (let1 ret (reverse body)
5
            (set! body '())
5
            (if (null? ret)
5
                ""
5
                (string-append "    ( \""
5
                               (string-join ret "\n")
5
                               "\" )"))))
5
    (define (push-body! str)
5
      (push! body str))
5
5
    (filter-map
5
     (lambda (str)
5
       (cond
5
        ((#/^TDIARY+/ str)
5
         #f)
5
        ((#/^[a-zA-Z-]+: / str)
5
         (let1 pair (string-split str #/[ ]+/)
5
               (string-append
5
                (if (#/^Date: / str)
5
                    (format "( \"~a\" " (cadr pair))
5
                    "")
5
                (format "(~a . \"~a\")" (car pair) (cadr pair)))))
5
        ((= 0 (string-length str))
5
         (reset-body!))
5
        ((#/^[.]$/ str)
5
         (string-append (reset-body!)
5
                        " )"))
5
        (else
5
         (let1 str (string-trim
5
                    (regexp-replace-all #/[\"]/ str "'"))
5
               (push-body! str)
5
               #f))))
5
     str-list)))
5
5
5
(define (main argv)
5
  (print "(")
5
  (for-each print
5
            (load-td2
5
             (current-input-port)))
5
  (print ")"))
5

 

5

[convertToOT.scm]

5
#!/usr/local/bin/gosh
5
5
(use srfi-1)
5
(use util.list)
5
(use rfc.uri)
5
5
;;
5
;; "20081231" => "2008_12_31"
5
;;
5
(define (convert-date date)
5
  (let ((y (substring date 0 4))
5
        (m (substring date 4 6))
5
        (d (substring date 6 8)))
5
    (string-append y "_" m "_" d)))
5
5
5
;;
5
;; "<%=a 'link|str' %>          =>  [[link|str]]
5
;; "<%=isbn_image 'id' %>       =>  ##(amazon id)
5
;;
5
(define (convert-command str)
5
  (let* ((str
5
          (regexp-replace-all #/<a[ ]+href='([^']+)'>([^<]+)<\/a>/ str
5
                              (lambda (m)
5
                                (string-append "[["
5
                                               (rxmatch-substring m 1)
5
                                               "|"
5
                                               (rxmatch-substring m 2)
5
                                               "]]"))))
5
         (str
5
          (regexp-replace-all #/<%=[ ]?a[ ]+'([^|]+)[|]([^']+)'[ ]+%>/ str
5
                              (lambda (m)
5
                                (string-append "[["
5
                                               (rxmatch-substring m 2)
5
                                               "|"
5
                                               (rxmatch-substring m 1)
5
                                               "]]"))))
5
         (str
5
          (regexp-replace-all #/<%=[ ]?isbn_image[ ]+'([^']+)'[ ]+%>/ str
5
                              (lambda (m)
3
                                (string-append "##(amazon " (rxmatch-substring m 1) ")")))))
5
    str))
5
5
  
5
(define (output-oldtype-file username date entry-data)
5
5
  (define (display-diary entry port)
5
    (for-each
5
     (lambda (lst)
5
       (when (string? (car lst))
5
         (begin
5
           (display (convert-command (car lst)) port)
5
           (newline port)
5
           (newline port))))
5
     entry))
5
5
  (define (display-comment entry port)
5
    (let1 name (assq-ref entry 'Name:)
5
          (for-each
5
           (lambda (x)
5
             (let1 str (car x)
5
                   (when (string? str)
5
                     (when (not (#/http:\/\// str))
5
                       (begin
5
                         (display  (format "##(comment-data ~a ~a)"
5
                                           (uri-encode-string name)
5
                                           (uri-encode-string str))
5
                                   port)
5
                         (newline port))))))
5
           entry)))
5
5
  (call-with-output-file (format "./out/~a.~a.ot" username (convert-date date))
5
    (lambda (port)
5
      port
5
      (begin
5
        (for-each
5
         (lambda (entry) ;; entry is a diary or a comment.
5
           (cond
5
            ((assq-ref entry 'Title:)
5
             ;; diary
5
             (display-diary entry port))
5
            ;; comment
5
            (else
5
             (display-comment entry port))))
5
         entry-data)
0
        (display "#(comment)" port)
5
        (newline port)))))
5
5
5
5
(define (save-oldtype-data username diary-data comment-data)
5
  (let1 h (make-hash-table 'string=?)
5
        ;; make hash data ( key is string of date , value is alist of diary or comment)
5
        (for-each
5
         (lambda (pair)
5
           (hash-table-push! h (car pair) (cdr pair)))
5
         (append
5
          diary-data
5
          comment-data
5
          ))
5
5
        (hash-table-for-each
5
         h
5
         (lambda (k v)
5
           (output-oldtype-file username k (reverse v))))))
5
5
5
(define (main argv)
5
  (let ((username       (cadr argv))         
5
        (diary-file     (caddr argv))
5
        (comment-file   (cadddr argv)))
5
    (let ((diary-data
5
           (call-with-input-file diary-file read))
5
          (comment-data
5
           (call-with-input-file comment-file read)))
5
      (save-oldtype-data
5
       username
5
       diary-data
5
       comment-data))))
5

 

0
 spam対策のため本記事からコメントを外しました。