#!/usr/bin/ruby -Ks require 'bluecloth' require 'cgi' require 'optparse' #== Maker #Makedownで記述されたテキストファイルをHTMLファイルに変換するクラス # #=== 使用例 # # maker = Maker.new # maker.make(title, body) #=> 変換結果を返す # maker.run('sample.txt') #=> sample.htmlを作成する # class MDMaker #コンストラクタ #[header] ヘッダーの文字列(など) #[footer] フッターの文字列(など) def initialize( header ='', footer='') @header = header @footer = footer end #ファイルの先頭行と、それ以降を取得する。 #[filename] ファイル名 def parse_file(filename) body = open(filename).readlines title = chop_term(body.shift) return [title, body.join("")] end #HTMLファイルを作成する。 #[filename] 変換対象となるファイル名 #[ext] 作成するファイルの拡張子 def run(filename, ext = '.html') new_file = change_ext(filename, ext) title, body = parse_file(filename) open(new_file, 'w') do |io| io.write(make(title, body)) end end #htmlを作成する #[title] htmlのタイトル #[body] Markdownで記述された文字列 def make(title, body) return replace_title(title) + BlueCloth::new(body).to_html + @footer end #ファイル名(filename)の拡張子をextに変更する #[filename] ファイル名 #[ext] 拡張子 def change_ext(filename, ext) if /\.\w+$/ =~ filename return filename.sub(/\.\w+$/, ext) else return filename + ext end end #ヘッダーのタイトルを差し替える。 #引数 に変換する #[title] タイトル def replace_title(title) @header.sub(/()(.*)(<\/title>)/i) do $1 + CGI::escapeHTML(chop_term(title)) + $3 end end #行末の改行文字を取り除く #[line] 文字列 def chop_term(line) line.sub(/(?:\r|\r\n|\n)\z/, "") end end #ファイルが存在するときはtrueを返す。 #ファイルが見つからないときは例外を投げる。 def fileexists?(filename) unless FileTest.exists?(filename) raise "No such file - #{filename}" end true end #メインの処理 def main parser = OptionParser.new parser.banner = "Usage: #{File.basename($0)} -t target -h header_file -f footer_file" #ソースファイル filename = nil parser.on("-n" "-name=FILENAME", String, "filename") do |arg| if fileexists?(arg) filename = arg end end #ターゲット target = '*.txt' parser.on("-t", "--target=TARGET", String, "target file") do |arg| target = arg end #ヘッダー header = "<html><head><title>title" parser.on("-h", "--header=HEADER", String, "header file") do |arg| if fileexists?(arg) header = open(arg).read end end #フッター footer = "" parser.on("-f", "--footer=FOOTER", String, "footer file") do |arg| if fileexists?(arg) footer = open(arg).read end end #拡張子 ext = ".html" parser.on("-e", "--extension=EXTENSION", String, "extension") do |arg| ext = arg end begin parser.parse! maker = MDMaker.new(header, footer) rescue => err $stderr.puts err.message $stderr.puts parser.help return end if filename #filenameのファイルを変換する title, body = maker.parse_file(filename) $stdout.puts maker.make(title, body) elsif #targetのファイルを作成する Dir.glob(target).each do |filename| maker.run(filename, ext) end end end if $0 == __FILE__ main() end