class News2Kindle::Generator::Tdiary

Public Class Methods

new( tmpdir ) click to toggle source
# File lib/news2kindle/generator/tdiary.rb, line 11
def initialize( tmpdir )
        @current_dir = tmpdir
        resource = Pathname(__FILE__) + '../../../../resource'
        FileUtils.cp(resource + "tdiary.css", @current_dir)
end

Public Instance Methods

generate(opts) { |"#{current_dir}/opf"| ... } click to toggle source
# File lib/news2kindle/generator/tdiary.rb, line 17
                        def generate(opts)
                                now = opts[:now]
                                @top = opts[:tdiary_top] || ENV['TDIARY_TOP']

                                html = title = author = now_str = nil
                                begin
                                        retry_loop( 5 ) do
                                                html = Nokogiri(URI.open("#{@top}?date=#{now.strftime '%m%d'}", 'r:utf-8', &:read))
                                                title = (html / 'head title').text
                                                author = (html / 'head meta[name="author"]')[0]['content']
                                                now_str = now.strftime( '%m-%d' )
                                        end
                                rescue => e
                                        News2Kindle.logger.info "failed by retry over: #{e.class}: #{e}"
                                end

                                #
                                # generating html
                                #
                                html.css('head meta', 'head link', 'head style', 'script').remove
                                html.css('div.adminmenu', 'div.sidebar', 'div.footer').remove
                                (html / 'img').each do |img|
                                        file_name = save_image(img['src'])
                                        img['src'] = file_name
                                end
                                open( "#{@current_dir}/index.html", 'w' ){|f| f.write html.to_html}

                                #
                                # generating TOC in ncx
                                #
                                open( "#{@current_dir}/toc.ncx", 'w:utf-8' ) do |f|
                                        f.write <<-XML.gsub( /^\t/, '' )
                                        <?xml version="1.0" encoding="UTF-8"?>
                                        <!DOCTYPE ncx PUBLIC "-//NISO//DTD ncx 2005-1//EN" "http://www.daisy.org/z3986/2005/ncx-2005-1.dtd">
                                        <ncx xmlns="http://www.daisy.org/z3986/2005/ncx/" version="2005-1">
                                        <docTitle><text>#{title}</text></docTitle>
                                        <navMap>
                                                <navPoint id="index" playOrder="1">
                                                        <navLabel>
                                                                <text>#{title}</text>
                                                        </navLabel>
                                                        <content src="index.html" />
                                                </navPoint>
                                        </navMap>
                                        </ncx>
                                        XML
                                end
                                
                                #
                                # generating OPF
                                #
                                open( "#{@current_dir}/tdiary.opf", 'w:utf-8' ) do |f|
                                        f.write <<-XML.gsub( /^\t/, '' )
                                        <?xml version="1.0" encoding="utf-8"?>
                                        <package unique-identifier="uid">
                                                <metadata>
                                                        <dc-metadata xmlns:dc="http://purl.org/metadata/dublin_core" xmlns:oebpackage="http://openebook.org/namespaces/oeb-package/1.0/">
                                                                <dc:Title>#{title}</dc:Title>
                                                                <dc:Language>ja-JP</dc:Language>
                                                                <dc:Creator>#{author}</dc:Creator>
                                                                <dc:Description>tDiary N-Year Diary</dc:Description>
                                                                <dc:Date>#{now.strftime( '%d/%m/%Y' )}</dc:Date>
                                                        </dc-metadata>
                                                </metadata>
                                                <manifest>
                                                        <item id="toc" media-type="application/x-dtbncx+xml" href="toc.ncx"></item>
                                                        <item id="style" media-type="text/css" href="tdiary.css"></item>
                                                        <item id="index" media-type="text/html" href="index.html"></item>
                                                </manifest>
                                                <spine toc="toc">
                                                        <itemref idref="index" />
                                                </spine>
                                                <tours></tours>
                                                <guide>
                                                        <reference type="start" title="Start Page" href="index.html"></reference>
                                                </guide>
                                        </package>
                                        XML
                                end

                                yield "#{@current_dir}/tdiary.opf"
                        end

Private Instance Methods

retry_loop( times ) { || ... } click to toggle source
# File lib/news2kindle/generator/tdiary.rb, line 102
def retry_loop( times )
        count = 0
        begin
                yield
        rescue
                count += 1
                if count >= times
                        raise
                else
                        News2Kindle.logger.debug $!
                        News2Kindle.logger.info "#{count} retry."
                        sleep 1
                        retry
                end
        end
end
save_image(img) click to toggle source
# File lib/news2kindle/generator/tdiary.rb, line 119
def save_image(img)
        require 'securerandom'

        img = @top + img if /^https?:/ !~ img
        uri = URI(img)
        file_name = "#{SecureRandom.hex}#{uri.to_s.scan(/\.[^\.]+$/)[0]}"
        begin
                open("#{@current_dir}/#{file_name}", 'w') do |f|
                        f.write URI.open(uri, &:read)
                end
        rescue OpenURI::HTTPError, RuntimeError, Errno::ENOENT
                News2Kindle.logger.warn "#$!: #{uri}"
        end
        return file_name
end