aozoragen 0.0.6 → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/bin/aozoragen +52 -18
- data/lib/aozoragen/renzaburo.rb +41 -41
- data/lib/aozoragen/sai-zen-sen.rb +95 -70
- data/lib/aozoragen/util.rb +69 -0
- data/lib/aozoragen/version.rb +1 -1
- data/lib/aozoragen/webmysteries.rb +52 -48
- metadata +5 -4
data/bin/aozoragen
CHANGED
@@ -6,37 +6,71 @@
|
|
6
6
|
# Copyright (C) 2012 by TADA Tadashi <t@tdtds.jp>
|
7
7
|
# Distributed under GPL
|
8
8
|
#
|
9
|
+
require 'optparse'
|
9
10
|
require 'uri'
|
10
11
|
require 'pathname'
|
11
12
|
|
13
|
+
opts = {
|
14
|
+
overwrite: false,
|
15
|
+
output: '.',
|
16
|
+
verbose: false,
|
17
|
+
}
|
18
|
+
OptionParser.new do |o|
|
19
|
+
o.banner = 'Usage: aozoragen [options] <URI...>'
|
20
|
+
o.on( '-f', '--overwrite', 'force overwrite existent files.' ){|b| opts[:overwrite] = b}
|
21
|
+
o.on( '-O DIR', '--output DIR', 'specify output directory.' ){|dir| opts[:output] = dir}
|
22
|
+
o.on( '-v', '--verbose', 'show progress messages.' ){|b| opts[:verbose] = b}
|
23
|
+
|
24
|
+
begin
|
25
|
+
o.parse!
|
26
|
+
rescue OptionParser::InvalidOption
|
27
|
+
puts "invalid option\n\n#{o}"
|
28
|
+
exit -1
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def write_open( file, opts )
|
33
|
+
name = "#{opts[:output]}/#{file}"
|
34
|
+
if !opts[:overwrite] && FileTest::exist?( name )
|
35
|
+
puts "Skipping write #{file}." if opts[:verbose]
|
36
|
+
return
|
37
|
+
end
|
38
|
+
open( name, 'w' ){|w| yield w}
|
39
|
+
puts name if opts[:verbose]
|
40
|
+
end
|
41
|
+
|
12
42
|
ARGV.each do |u|
|
13
43
|
uri = URI( u )
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
44
|
+
service = case uri.host
|
45
|
+
when 'sai-zen-sen.jp'
|
46
|
+
'sai-zen-sen'
|
47
|
+
when 'renzaburo.jp'
|
48
|
+
'renzaburo'
|
49
|
+
when 'github.com'
|
50
|
+
case Pathname( uri.path ).basename.to_s.sub( %r|(.*?)-.*$|, '\1' )
|
51
|
+
when 'webmysteries'
|
52
|
+
'webmisteries'
|
53
|
+
else
|
54
|
+
nil
|
55
|
+
end
|
56
|
+
else
|
57
|
+
nil
|
27
58
|
end
|
28
|
-
|
29
|
-
|
59
|
+
unless service
|
60
|
+
puts "Skipping unknown URI: #{uri}"
|
61
|
+
next
|
30
62
|
end
|
31
|
-
|
63
|
+
|
64
|
+
require "aozoragen/#{service}"
|
65
|
+
book = (Aozoragen.const_get service.split(/-/).map{|s| s.capitalize}.join)::new( uri )
|
32
66
|
|
33
67
|
meta = book.metainfo
|
34
|
-
|
68
|
+
write_open( "#{meta[:id]}.00.txt", opts ) do |w|
|
35
69
|
w.puts "#{meta[:title]}\n#{meta[:author].join ' / '}\n\n\n[#改ページ]"
|
36
70
|
end
|
37
71
|
|
38
72
|
book.each_chapter do |chapter|
|
39
|
-
|
73
|
+
write_open( "#{meta[:id]}.#{chapter[:id]}.txt", opts ) do |w|
|
40
74
|
w.puts chapter[:text]
|
41
75
|
end
|
42
76
|
end
|
data/lib/aozoragen/renzaburo.rb
CHANGED
@@ -2,55 +2,55 @@
|
|
2
2
|
#
|
3
3
|
# scraping renzaburo.jp
|
4
4
|
#
|
5
|
-
require '
|
5
|
+
require 'aozoragen/util'
|
6
6
|
require 'open-uri'
|
7
7
|
require 'pathname'
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
@index_html = Nokogiri( open( @index_uri, 'r:CP932', &:read ) )
|
13
|
-
end
|
9
|
+
module Aozoragen
|
10
|
+
class Renzaburo
|
11
|
+
include Util
|
14
12
|
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
info[:title] = t.text.sub( /|.*/, '' )
|
19
|
-
end
|
20
|
-
(@index_html / 'div.textBlock strong' ).each do |st|
|
21
|
-
info[:author] = [st.text]
|
13
|
+
def initialize( index_uri )
|
14
|
+
@index_uri = URI( index_uri.to_s.sub( /index\.html$/, '' ) )
|
15
|
+
@index_html = Nokogiri( open( @index_uri, 'r:CP932', &:read ) )
|
22
16
|
end
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
17
|
+
|
18
|
+
def metainfo
|
19
|
+
info = {:id => Pathname( @index_uri.path ).basename.to_s}
|
20
|
+
(@index_html / 'title').each do |t|
|
21
|
+
info[:title] = t.text.sub( /|.*/, '' )
|
22
|
+
end
|
23
|
+
(@index_html / 'div.textBlock strong' ).each do |st|
|
24
|
+
info[:author] = [st.text]
|
25
|
+
end
|
26
|
+
info
|
32
27
|
end
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
(content / 'h3').each do |t|
|
41
|
-
title = t.text.sub( /^『#{book_title}』 /, '' )
|
42
|
-
text << "\n[#小見出し]#{title}[#小見出し終わり]\n\n"
|
28
|
+
|
29
|
+
def each_chapter
|
30
|
+
book_title = metainfo[:title]
|
31
|
+
(@index_html / 'ul.btnList li.withDate a' ).each do |a|
|
32
|
+
uri = @index_uri + a.attr( :href )
|
33
|
+
text = get_content( uri, book_title )
|
34
|
+
yield( {id: Pathname( uri.path ).dirname.basename.to_s, uri: uri, text: text} )
|
43
35
|
end
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
36
|
+
end
|
37
|
+
|
38
|
+
def get_content( uri, book_title = '' )
|
39
|
+
text = ''
|
40
|
+
html = open( uri, 'r:CP932', &:read ).encode( 'UTF-8' )
|
41
|
+
html = html.gsub( /\—/, "\u2500" ).gsub( /\"/, "\u201D" )
|
42
|
+
(Nokogiri( html ) / 'div#mainContent' ).each do |content|
|
43
|
+
(content / 'h3').each do |t|
|
44
|
+
text << t.text.sub( /^『#{book_title}』 /, '' ).subhead
|
45
|
+
end
|
46
|
+
(content / 'div.textBlock p' ).each do |para|
|
47
|
+
next if /<次回につづく>/ =~ para.text
|
48
|
+
text << '[#10字下げ]' if (para.attr('class') || '').index( 'txtAlignC' )
|
49
|
+
text << para.text.gsub( /<br>/, "\n" ) << "\n\n"
|
50
|
+
end
|
48
51
|
end
|
52
|
+
text << "[#改ページ]\n"
|
53
|
+
text.for_tategaki
|
49
54
|
end
|
50
|
-
text << "[#改ページ]\n"
|
51
|
-
text.gsub( /</, '〈' ).gsub( />/, '〉' ).tr(
|
52
|
-
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',
|
53
|
-
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
|
54
|
-
)
|
55
55
|
end
|
56
56
|
end
|
@@ -2,37 +2,54 @@
|
|
2
2
|
#
|
3
3
|
# scraping sai-zen-sen.jp
|
4
4
|
#
|
5
|
-
require '
|
5
|
+
require 'aozoragen/util'
|
6
6
|
require 'open-uri'
|
7
7
|
require 'pathname'
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
@entity = SaiZenSenFateZero::new( index_uri )
|
13
|
-
else
|
14
|
-
@entity = SaiZenSenRegular::new( index_uri )
|
15
|
-
end
|
16
|
-
end
|
9
|
+
module Aozoragen
|
10
|
+
class SaiZenSen
|
11
|
+
include Util
|
17
12
|
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
13
|
+
def initialize( index_uri )
|
14
|
+
case index_uri.path
|
15
|
+
when '/sa/fate-zero/works/'
|
16
|
+
@entity = SaiZenSenFateZero::new( index_uri )
|
17
|
+
when %r|/01.html$| # short story
|
18
|
+
@entity = SaiZenSenShort::new( index_uri )
|
19
|
+
else
|
20
|
+
@entity = SaiZenSenRegular::new( index_uri )
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
def metainfo
|
25
|
+
@entity.metainfo
|
26
|
+
end
|
27
|
+
|
28
|
+
def each_chapter
|
29
|
+
@entity.each_chapter do |c|
|
30
|
+
c[:text] = c[:text].normalize_char
|
31
|
+
yield c
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
def each_chapter_local( selector )
|
36
|
+
(@index_html / selector).each do |a|
|
37
|
+
uri = @index_uri + a.attr('href')
|
38
|
+
next if uri.path == '/entryguide.html' # skipping member only contents.
|
25
39
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
40
|
+
chapter = Nokogiri( open( uri, 'r:utf-8', &:read ) )
|
41
|
+
text = get_chapter_text( chapter )
|
42
|
+
yield( {id: Pathname( uri.path ).dirname.basename.to_s, uri: uri, text: text} )
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
def get_chapter_text( chapter )
|
30
47
|
text = ''
|
31
48
|
(chapter / 'section.book-page-spread').each do |page|
|
32
49
|
page.children.each do |section|
|
33
50
|
case section.name
|
34
51
|
when 'hgroup'
|
35
|
-
text <<
|
52
|
+
text << detag( section ).subhead
|
36
53
|
when 'div'
|
37
54
|
case section.attr( 'class' )
|
38
55
|
when /delimiter/
|
@@ -54,61 +71,69 @@ class SaiZenSen
|
|
54
71
|
end
|
55
72
|
text << "[#改ページ]\n"
|
56
73
|
end
|
57
|
-
|
58
|
-
yield( {id: Pathname( uri.path ).dirname.basename.to_s, uri: uri, text: text} )
|
74
|
+
text
|
59
75
|
end
|
60
76
|
end
|
61
|
-
|
62
|
-
|
63
|
-
(
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
77
|
+
|
78
|
+
class SaiZenSenRegular < SaiZenSen
|
79
|
+
def initialize( index_uri )
|
80
|
+
@index_uri = index_uri
|
81
|
+
@index_html = Nokogiri( open( @index_uri, 'r:utf-8', &:read ) )
|
82
|
+
end
|
83
|
+
|
84
|
+
def metainfo
|
85
|
+
info = {:id => Pathname( @index_uri.path ).basename.to_s, :author => []}
|
86
|
+
info[:title] = (@index_html / '#page-content-heading h1')[0].text
|
87
|
+
(@index_html / '#authors h3').each do |author|
|
88
|
+
info[:author] << author.text.sub( /.*? /, '' )
|
69
89
|
end
|
90
|
+
info
|
70
91
|
end
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
class SaiZenSenRegular < SaiZenSen
|
76
|
-
def initialize( index_uri )
|
77
|
-
@index_uri = index_uri
|
78
|
-
@index_html = Nokogiri( open( @index_uri, 'r:utf-8', &:read ) )
|
79
|
-
end
|
80
|
-
|
81
|
-
def metainfo
|
82
|
-
info = {:id => Pathname( @index_uri.path ).basename.to_s, :author => []}
|
83
|
-
info[:title] = (@index_html / '#page-content-heading h1')[0].text
|
84
|
-
(@index_html / '#authors h3').each do |author|
|
85
|
-
info[:author] << author.text.sub( /.*? /, '' )
|
92
|
+
|
93
|
+
def each_chapter
|
94
|
+
each_chapter_local( '#back-numbers li a' ){|c| yield c}
|
86
95
|
end
|
87
|
-
info
|
88
96
|
end
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
97
|
+
|
98
|
+
class SaiZenSenShort < SaiZenSen
|
99
|
+
def initialize( index_uri )
|
100
|
+
@index_uri = index_uri
|
101
|
+
@index_html = Nokogiri( open( @index_uri, 'r:utf-8', &:read ) )
|
102
|
+
end
|
103
|
+
|
104
|
+
def metainfo
|
105
|
+
info = {:id => Pathname( @index_uri.path ).dirname.dirname.basename.to_s, :author => []}
|
106
|
+
info[:title] = (@index_html / 'h1.book-title')[0].text
|
107
|
+
(@index_html / 'h2.book-author strong').each do |author|
|
108
|
+
info[:author] << author.text
|
109
|
+
end
|
110
|
+
info
|
111
|
+
end
|
112
|
+
|
113
|
+
def each_chapter
|
114
|
+
text = get_chapter_text( @index_html )
|
115
|
+
yield( {id: Pathname( @index_uri.path ).basename( '.html' ).to_s, uri: @index_uri, text: text} )
|
116
|
+
end
|
108
117
|
end
|
109
|
-
|
110
|
-
|
111
|
-
|
118
|
+
|
119
|
+
class SaiZenSenFateZero < SaiZenSen
|
120
|
+
def initialize( index_uri )
|
121
|
+
@index_uri = index_uri
|
122
|
+
@index_html = Nokogiri( open( @index_uri, 'r:utf-8', &:read ) )
|
123
|
+
end
|
124
|
+
|
125
|
+
def metainfo
|
126
|
+
info = {
|
127
|
+
:id => Pathname( @index_uri.path ).basename.to_s,
|
128
|
+
:author => ['虚淵玄']
|
129
|
+
}
|
130
|
+
info[:title] = (@index_html / 'h1 img')[0].attr( 'alt' )
|
131
|
+
info
|
132
|
+
end
|
133
|
+
|
134
|
+
def each_chapter
|
135
|
+
each_chapter_local( 'article a' ){|c| yield c}
|
136
|
+
end
|
137
|
+
|
112
138
|
end
|
113
|
-
|
114
139
|
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
# -*- coding: utf-8; -*-
|
2
|
+
#
|
3
|
+
# utility methods for converting to AOZORA format
|
4
|
+
#
|
5
|
+
require 'nokogiri'
|
6
|
+
|
7
|
+
##
|
8
|
+
# Enhanced String methods for converting to AOZORA format
|
9
|
+
#
|
10
|
+
class String
|
11
|
+
##
|
12
|
+
# Half width of Alphabet and Digit to Full width.
|
13
|
+
#
|
14
|
+
def han2zen
|
15
|
+
self.tr( 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',
|
16
|
+
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' )
|
17
|
+
end
|
18
|
+
|
19
|
+
##
|
20
|
+
# replace characters fitting to vertical lyout
|
21
|
+
#
|
22
|
+
def for_tategaki
|
23
|
+
self.tr( '<>‐', '〈〉─' ).han2zen
|
24
|
+
end
|
25
|
+
|
26
|
+
##
|
27
|
+
# section heading format of Aozora
|
28
|
+
#
|
29
|
+
def subhead
|
30
|
+
self.split( /\n/ ).map{|x|
|
31
|
+
"\n[#小見出し]#{x}[#小見出し終わり]"
|
32
|
+
}.join + "\n\n"
|
33
|
+
end
|
34
|
+
|
35
|
+
##
|
36
|
+
# normalize invalid charcters
|
37
|
+
#
|
38
|
+
def normalize_char
|
39
|
+
self.tr( "\u6451\u5653\u7e6b\uFF0D/", '掴嘘繋─' )
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
module Aozoragen
|
44
|
+
##
|
45
|
+
# Utility methods for Aozora format
|
46
|
+
#
|
47
|
+
module Util
|
48
|
+
##
|
49
|
+
# delete HTML tags
|
50
|
+
#
|
51
|
+
def detag( elem )
|
52
|
+
# ruby tags
|
53
|
+
(elem / 'ruby rp').each do |rp|
|
54
|
+
case rp.text
|
55
|
+
when '('
|
56
|
+
rp.inner_html = '《'
|
57
|
+
when ')'
|
58
|
+
rp.inner_html = '》'
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
# delete tgas
|
63
|
+
elem.to_html.
|
64
|
+
gsub( /<br>/, "\n" ).
|
65
|
+
gsub( /<.*?>/, '' ).
|
66
|
+
strip
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
data/lib/aozoragen/version.rb
CHANGED
@@ -2,67 +2,71 @@
|
|
2
2
|
#
|
3
3
|
# scraping webmysteries.jp
|
4
4
|
#
|
5
|
-
require '
|
5
|
+
require 'aozoragen/util'
|
6
6
|
require 'open-uri'
|
7
7
|
require 'pathname'
|
8
8
|
require 'cgi'
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
@index_html = Nokogiri( open( @index_uri, 'r:UTF-8', &:read ) )
|
14
|
-
end
|
10
|
+
module Aozoragen
|
11
|
+
class Webmysteries
|
12
|
+
include Util
|
15
13
|
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
(@index_html / '#wiki-body h2 + ul li' ).each do |li|
|
20
|
-
info[:author] = [li.text]
|
14
|
+
def initialize( index_uri )
|
15
|
+
@index_uri = URI( index_uri )
|
16
|
+
@index_html = Nokogiri( open( @index_uri, 'r:UTF-8', &:read ) )
|
21
17
|
end
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
text = "\n"
|
29
|
-
each_pages( uri ) do |page|
|
30
|
-
text << page
|
18
|
+
|
19
|
+
def metainfo
|
20
|
+
info = {:id => Pathname( @index_uri.path ).basename.sub( %r|.*?-(.*)$|, '\1' ).to_s}
|
21
|
+
info[:title] = (@index_html / '#wiki-body h1')[0].text
|
22
|
+
(@index_html / '#wiki-body h2 + ul li' ).each do |li|
|
23
|
+
info[:author] = [li.text]
|
31
24
|
end
|
32
|
-
|
25
|
+
info
|
33
26
|
end
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
27
|
+
|
28
|
+
def each_chapter
|
29
|
+
(@index_html / '#wiki-body h3 + ul li a' ).each_with_index do |a, i|
|
30
|
+
uri = URI( a.attr( 'href' ) )
|
31
|
+
text = "\n"
|
32
|
+
each_pages( uri ) do |page|
|
33
|
+
text << page
|
34
|
+
end
|
35
|
+
yield( {id: '%02d' % (i+1), uri: uri, text: text} )
|
42
36
|
end
|
43
|
-
|
37
|
+
end
|
38
|
+
|
39
|
+
def each_pages( index )
|
44
40
|
begin
|
45
|
-
|
46
|
-
|
41
|
+
pages = []
|
42
|
+
html = Nokogiri( open( index, 'r', &:read ) )
|
43
|
+
(html / 'ul.pageNavi a').each do |a|
|
44
|
+
pages << a.attr( 'href' )
|
47
45
|
end
|
48
|
-
|
49
|
-
|
50
|
-
|
46
|
+
pages.shift # delete current page
|
47
|
+
begin
|
48
|
+
(html / 'noscript param[name="FlashVars"]')[0].attr( 'value' ).scan( /entry=(\d+)/ ) do |i|
|
49
|
+
yield get_text( i[0] )
|
50
|
+
end
|
51
|
+
end while html = Nokogiri( open( pages.shift, 'r', &:read ) )
|
52
|
+
rescue TypeError
|
53
|
+
# ignore open nil
|
54
|
+
end
|
51
55
|
end
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
56
|
+
|
57
|
+
def get_text( xml_id )
|
58
|
+
result = ''
|
59
|
+
open( "http://www.webmysteries.jp/entry_xml_data/#{xml_id}.xml" ) do |fx|
|
60
|
+
CGI::unescape( fx.read ).scan( %r|<entryBody>(.*?)</entryBody>|m ) do |entry|
|
61
|
+
result << entry[0].gsub( %r|<.*?>|m, "" )
|
62
|
+
end
|
59
63
|
end
|
64
|
+
result.
|
65
|
+
gsub( /^.*(つづく).*$/, '[#改ページ]' ).
|
66
|
+
gsub( /(?<=.)(([あ-ん]+))/, '《\1》' ).
|
67
|
+
gsub( /\n{3,}/m, "\n\n" ).
|
68
|
+
for_tategaki.
|
69
|
+
normalize_char
|
60
70
|
end
|
61
|
-
result.
|
62
|
-
gsub( /^.*(つづく).*$/, '[#改ページ]' ).
|
63
|
-
gsub( /(?<=.)(([あ-ん]+))/, '《\1》' ).
|
64
|
-
gsub( /‐/, '─' ).
|
65
|
-
gsub( /\uFF0D/, '─' ).
|
66
|
-
gsub( /\n{3,}/m, "\n\n" )
|
67
71
|
end
|
68
72
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: aozoragen
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0
|
4
|
+
version: 0.1.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,11 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-02-
|
12
|
+
date: 2012-02-29 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: nokogiri
|
16
|
-
requirement: &
|
16
|
+
requirement: &72469120 !ruby/object:Gem::Requirement
|
17
17
|
none: false
|
18
18
|
requirements:
|
19
19
|
- - ! '>='
|
@@ -21,7 +21,7 @@ dependencies:
|
|
21
21
|
version: '0'
|
22
22
|
type: :runtime
|
23
23
|
prerelease: false
|
24
|
-
version_requirements: *
|
24
|
+
version_requirements: *72469120
|
25
25
|
description: Scraping some Ebook web site and generating AOZORA format text files.
|
26
26
|
email:
|
27
27
|
- t@tdtds.jp
|
@@ -41,6 +41,7 @@ files:
|
|
41
41
|
- lib/aozoragen.rb
|
42
42
|
- lib/aozoragen/renzaburo.rb
|
43
43
|
- lib/aozoragen/sai-zen-sen.rb
|
44
|
+
- lib/aozoragen/util.rb
|
44
45
|
- lib/aozoragen/version.rb
|
45
46
|
- lib/aozoragen/webmysteries.rb
|
46
47
|
homepage: https://github.com/tdtds/aozoragen
|