#!/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 = "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