Skip to content

Instantly share code, notes, and snippets.

@tily
Created April 19, 2011 14:03
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tily/927916 to your computer and use it in GitHub Desktop.
Save tily/927916 to your computer and use it in GitHub Desktop.

aozora-mix.rb

概要

  • Wiki に書いた URL のリストから青空文庫のミックスを作れるようにする

使い方

ruby aozora-mix.rb ページ名

オプション

  • -o ファイルパス
    • epub を出力するファイル。デフォルトではカレント・ディレクトリの out.epub
  • -t タイトル
    • ミックスのタイトルを指定する。デフォルトではページ名が使われる
  • -a 作成者名
    • ミックスの作成者名を指定する。デフォルトでは「青空ミックス」となる
  • -r
    • ルビをつける。-r を指定しないとルビを取り除く

依存ライブラリ

  • nokogiri
  • eeepub

TODO

  • 画像対応
  • 縦書き対応
# -*- coding: utf-8 -*-
require 'open-uri'
require 'optparse'
require 'cgi'
require 'rubygems'
require 'nokogiri' # gem install nokogiri
require 'eeepub' # gem install eeepub
BANNER = "ruby aozora-mix.rb pagename [-o output] [-t title] [-a author] [-r]"
REGEXP = %r|^http://www\.aozora\.gr\.jp/cards/\d+/files/[\d_]+\.html$|
ENDPOINT = "http://aozora-mix.jottit.com/"
FILENAME = "out.epub"
CREATOR = "青空ミックス"
LINK_XPATH = '//div[id("content")]//a/@href'
def main(args)
pagename, options = parse_args(args)
urls = get_urls(pagename)
epub = init_epub(pagename, options)
urls.each do |url|
puts "ダウンロードします (#{url})"
work = get_work(url, options)
next if !work
puts "ダウンロードしました (#{work[0]})"
epub.sections << work
sleep 1
end
abort "" if epub.sections.empty?
puts "epubファイルを作成しています (#{options[:o]})"
epub.save(options[:o])
puts "完了しました"
end
def parse_args(args)
options = {:o => FILENAME}
OptionParser.new do |o|
o.on('-o OUTPUT_PATH') {|v| options[:o] = v }
o.on('-t TITLE') {|v| options[:t] = v }
o.on('-a AUTHOR') {|v| options[:a] = v }
o.on('-r') {|v| options[:r] = v }
o.parse!(args)
end
abort BANNER if args.empty?
[args[0], options]
end
def get_urls(pagename)
doc = Nokogiri::HTML.parse(open(ENDPOINT + CGI.escape(pagename)).read)
urls = doc.search(LINK_XPATH).to_a
urls.reject! {|url| !url.to_s[REGEXP] }
if urls.empty?
abort "エラー:青空文庫へのリンクが見つかりませんでした"
end
urls
rescue
abort "エラー:#{ENDPOINT}#{pagename} を開けませんでした"
end
def init_epub(pagename, options)
EeePub::Easy.new do
title options[:t] || pagename
creator options[:a] || CREATOR
identifier ENDPOINT + pagename, :scheme => 'URL'
uid ENDPOINT + pagename
end
end
def get_work(url, options)
src = open(url).read
if !options[:r]
src = src.gsub(%r|<ruby><rb>(.+?)</rb>.+?</ruby>|) { $1 }
end
doc = Nokogiri::HTML.parse(src) # 暗黙的にUTF-8に変換される
author = doc.search("//h2/text()").first.to_s
title = doc.search("//h1/text()").first.to_s
html = doc.to_html
html = html.gsub(/charset=[^"\s]+/i, "charset=utf-8")
html = html.gsub(/encoding="[^"\s]+"/i, "encoding=\"utf-8\"")
["#{author} #{title}", html]
rescue
return nil
end
main(ARGV)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment