いわゆる車輪の再開発をしていたようだ

卒論で頭がおかしくなっているらしい。普通に考えたらなんで自分で作るのか意味不明なんだけど、考えた時は書いた後だった。

Text::Hatenaとかではてな記法をhtmlに変換してから、hprictで必要な要素を貫き出してもっかいText::Hatenaで加工してやればよいだけだった。。。

内容

昨日の最後のところで、

Dir.chdir("/Users/yasuhisa/hatena_keyword/syou6162")
["Tsukuba.R:2:イントロダクション.txt","フュ−チャーリスト宣言.txt","我らクレイジー☆エンジニア主義.txt","頭がいい人、悪い人の仕事術.txt"].each{|f|
  path = "/Volumes/syou6162/Documents/" + File.basename(f,".txt") + ".html"
  system "ruby /tmp/aaa.rb -i \"#{f}\" -o \"#{path}\""
}

みたいなことをやっていたんだけど、変換するリストを持っておくのが面倒だと思ったのでそれすらもはてなグループのキーワードのテキストを使うことにした。おいらの場合、よく見そうなキーワードを「リンク集」というキーワードファイルにまとめてある。書式はこんな感じになっている。

*集合位相
-[[集合位相入門]]
*R
**R勉強会
-[[R勉強会第一回]]
-[[R勉強会第二回]]
**Tsukuba.R#1
-[[Tsukuba.R:1:GoodPointForUsingR]]
-[[Tsukuba.R:1:Rにおけるぐぐり方]]
-[[Tsukuba.R:1:Rの基本データ構造、よく使う関数紹介]]

これをディレクトリ構造に見たててどうにかしようというのが今回の考え。で、お手軽パーサーみたいなのを作ろうという感じにした。ディレクトリ構造になっているので、デザインパターンでいうところのCompositeパターンでいいなということに書いてから気がついた。このエントリとはあんまり関係ないけど、デザパタはid:hyukiさんのデザパタ本が分かりやすくて超おすすめです。

増補改訂版Java言語で学ぶデザインパターン入門

増補改訂版Java言語で学ぶデザインパターン入門

出力するためのdisplayメソッドはRejectの時のRubyのコードを参考にしました。
はてな記法からディレクトリ構造に変換

# -*- coding: utf-8 -*-

class Entry
  attr_accessor :name
  def initialize(name)
    @name = name
  end
  def display(indent=0)
  end
  def make
  end
end


class Text < Entry
  attr_accessor :base_path
  def display(indent=0)
    puts "   " + @name
  end
  def make
    input = base_path + "/" + @name + ".txt"
    output = "#{Dir.pwd}/#{@name}.html"
    system "ruby /tmp/aaa.rb -i \"#{input}\" -o \"#{output}\""
  end
end

class Directory < Entry
  attr_accessor :texts
  def initialize(name)
    @name = name
    @texts = []
  end
  def push(text)
    @texts.push text
  end
  def display(indent=0)
    puts ("\s" * indent)+ @name
    @texts.each{|text|
      text.display(indent+1)
    }
  end
  def make
    current = Dir.pwd
    Dir.mkdir(@name) unless File.exist?(@name)
    Dir.chdir(@name)
    puts "mkdir " + Dir.pwd
    @texts.each{|text|
      text.make
    }
    Dir.chdir(current)
  end
end

def convert_file_to_dirs(file,base_path)
  dirs = []
  prev_item = nil
  # 直前のアイテム。DirectoryかTextを判別する用
  prev_dir = nil
  # 直前のディレクトリを覚えておくためのもの
  up_dir = nil
  # 上のディレクトリを覚えておくためのもの
  num_of_prev_dir_asterisk = nil
  # 直前のディレクトリを覚えておくためのもの
  File.open(file,"r").each{|line|
    if line =~ /^(\*+)([^\*]*?)$/
      d = Directory.new($2)
      if $1.length == 1
        # *Rのようなもの      
        dirs.push d
        up_dir = d
      elsif $1.length == num_of_prev_dir_asterisk
        # 同レベルのものを追加
        up_dir.push d
      else
        # 下位レベルのものを追加
        prev_dir.push d
      end
      num_of_prev_dir_asterisk = $1.length
      prev_item = d
      prev_dir = d
    elsif line =~ /-\[\[(.*?)\]\]/
      t = Text.new($1)
      t.base_path = base_path
      prev_dir.push t
      prev_item = t
    elsif line =~ /^\n$/
      #改行飮みは飛ばす
      next
    end
  }
  return dirs
end

link_file = "/Users/yasuhisa/hatena_keyword/syou6162/リンク集.txt"
base_path = "/Users/yasuhisa/hatena_keyword/syou6162"
dirs = convert_file_to_dirs(link_file,base_path)

target = "/Volumes/syou6162/Documents"
dir_name = "keyword"
Dir.chdir(target)
Dir.mkdir(dir_name) unless File.exist?(target + "/" + dir_name)
Dir.chdir(dir_name)

dirs.each{|dir|
  dir.make
}

これではてなキーワードを編集しまくるだけで、自分用のhtmlがiphoneで見れるようになるなる。