# $Id: yarss.rb, 2005/06/26 14:44:12 spiegel Exp $ =begin ndiary.conf での設定 # RSS RSS_FILENAME = 'http://www14.cds.ne.jp/~not/tawagoto/index.rdf' RSS_CREATER = 'not(のとや)' RSS_TITLE = 'nonsense talk' RSS_LINK = 'http://www14.cds.ne.jp/~not/tawagoto/' RSS_LINK_BASE = 'http://www14.cds.ne.jp/~not/tawagoto/' # 記事毎の url の基準となる url RSS_DESCRIPTION = '本買い日記だったり nDiary開発日誌だったり' RSS_DESCRIPTION_SIZE = 400 # byte. 0 の場合は を出力しない RSS_CONTENT = true # を出力 # Optional 省略可 RSS_DELETE_HEADCHAR = true # トピックの行頭文字を削除するかどうか (true / false) RSS_DCDATE_TYPE = 0 # トピック毎の dc:date の扱い # 0: dc:date はつけない # 1: *.diary の更新時刻を元にする。同じ日のトピックは全て同じに # 2: nDiary実行時の時刻を元にする # 前回実行時から変化がないトピックは前回の時刻を保持 # 3: *.diary の更新時刻を元にする # 前回実行時から変化がないトピックは前回の時刻を保持 # 3,4 の場合は LOG_DIRECTORY に rss_cache というファイルが作成されます RSS_RIGHTS = 'Copyright ...' # 著作権表示 RSS_IMAGE = 'banner.png' # イメージファイルへの URI (バナー等) RSS_CSS = './rss.xsl' # スタイルシートファイルへの URI RSS_CCPL = '' # CCPL オプション # http://www.alles.or.jp/~spiegel/docs/cc-about.html 参照 # 'by' , 'by-nd' , 'by-nc-nd' , 'by-nc' , 'by-nc-sa' , 'by-sa' , 'nd' , # 'nd-nc' , 'nc' , 'nc-sa' , 'sa' FOAF_MBOX_SHA1SUM = '' # FoaF mbox_sha1sum 要素 FOAF_RDF = '' # FoaF ファイル ATOM_FILENAME = 'http://www14.cds.ne.jp/~not/tawagoto/atom.xml' # Atom を出力する際に指定します JSON_FILENAME = 'http://www14.cds.ne.jp/~not/tawagoto/rss.json' # JSON 形式の feed を出力する際に指定します =end class Filter begin require 'digest/md5' rescue LoadError require 'md5' end def yarss(str, type) return unless @diary.kind_of?(LastDiary) @rss ||= [] @rss_flag ||= false @rss_flag2 ||= false case type when :TOPIC topic = str.gsub(/<\/?([!\w]+)[^>]*>/i, '') topic = CGI::escapeHTML(topic) if @diary.config['RSS_DELETE_HEADCHAR'] != false then /^.\s*(.+)$/ =~ topic topic = $1 end @rss << [topic, @diary.date, @diary.instance_eval{@cntTopic + 1}, '', '', ''] @rss_flag = true @rss_flag2 = true when :P, :CODE, :BLOCKQUOTE, :DL, :UL, :QUOTE if @rss_flag then desc = str.dup desc.gsub!(/<\/?([!\w]+)[^>]*>/i, '') desc = CGI::escapeHTML(desc) desc.gsub!(/[\n\t ]/,'') if @diary.config['RSS_DESCRIPTION_SIZE'].nil? then desc_size = 400 else desc_size = @diary.config['RSS_DESCRIPTION_SIZE'].to_i desc_size = 400 if desc_size < 0 end if desc.size > desc_size desc = desc[0..desc_size] desc.chop! unless desc.sub!(/.$/,'') desc << '...' end unless desc.empty? then @rss[-1][3] = desc @rss_flag = nil end if @rss_flag2 then @rss[-1][4] << str end end when :AFTER_P, :AFTER_CODE, :AFTER_BLOCKQUOTE, :AFTER_DL, :AFTER_UL, :AFTER_QUOTE @rss[-1][5] << str if @diary.config['RSS_CONTENT'] and @rss[-1] when :ONEDAY @rss_flag = nil @rss_flag2 = nil when :HTML filename = @diary.config['RSS_FILENAME'].to_s atom_name = @diary.config['ATOM_FILENAME'].to_s json_name = @diary.config['JSON_FILENAME'].to_s creater = @diary.config['RSS_CREATER'].to_s title = @diary.config['RSS_TITLE'].to_s link = @diary.config['RSS_LINK'].to_s link_base = @diary.config['RSS_LINK_BASE'].to_s desc = @diary.config['RSS_DESCRIPTION'].to_s rights = @diary.config['RSS_RIGHTS'].to_s image = @diary.config['RSS_IMAGE'].to_s css = @diary.config['RSS_CSS'].to_s ccpl = @diary.config['RSS_CCPL'].to_s.downcase mbox_sha1sum = @diary.config['FOAF_MBOX_SHA1SUM'].to_s foaf_rdf = @diary.config['FOAF_RDF'].to_s if filename.empty? then $stderr.puts "Filter error: RSS_FILENAME is empty." return end rights = %Q! #{rights}\n! unless rights.empty? image_detail = '' if not image.empty? then image_detail << %Q! \n! image_detail << %Q! #{title}\n! image_detail << %Q! #{link}\n! image_detail << %Q! #{image}\n! image_detail << %Q! \n! image = %Q! \n! end maker = '' if (not mbox_sha1sum.empty?) and (not foaf_rdf.empty?) then maker << %Q! \n! maker << %Q! \n! maker << %Q! #{creater}\n! maker << %Q! #{mbox_sha1sum}\n! maker << %Q! \n! maker << %Q! \n! maker << %Q! \n! else maker << %Q! #{creater}\n! end css = %Q!\n! unless css.empty? ccpl_detail = '' case ccpl when 'by' ccpl_detail = < CCPL_END ccpl = %Q! \n! when 'by-nd' ccpl_detail = < CCPL_END cpl = %Q! \n! when 'by-nc-nd' ccpl_detail = < CCPL_END ccpl = %Q! \n! when 'by-nc' ccpl_detail = < CCPL_END ccpl = %Q! \n! when 'by-nc-sa' ccpl_detail = < CCPL_END ccpl = %Q! \n! when 'by-sa' ccpl_detail = < CCPL_END ccpl = %Q! \n! when 'nd' ccpl_detail = < CCPL_END ccpl = %Q! \n! when 'nd-nc' ccpl_detail = < CCPL_END ccpl = %Q! \n! when 'nc' ccpl_detail = < CCPL_END ccpl = %Q! \n! when 'nc-sa' ccpl_detail = < CCPL_END ccpl = %Q! \n! when 'sa' ccpl_detail = < CCPL_END ccpl = %Q! \n! else ccpl = '' end index = '' items = '' aitems = '' jitems = '' rss_cache = {} begin open(@diary.logDirectory + 'rss_cache'){ |f| f.each{ |line| topic, dcdate, md5 = line.chomp.split(/\t/,3) rss_cache[topic] = [dcdate, md5] } } rescue rss_cache = {} end @rss.each{ |t, date, tn, d, str, content| l = @diary.date2monthlyfilelink(date, true) + "_t#{tn}" dcdate = '' case @diary.config['RSS_DCDATE_TYPE'].to_i when 1, 3 dcdate = File::mtime(@diary.allDiaries[date]).strftime('%Y-%m-%dT%H:%M:%S+09:00') when 2 dcdate = @diary.instance_eval{@now}.strftime('%Y-%m-%dT%H:%M:%S+09:00') end dcdate2 = File::mtime(@diary.allDiaries[date]).strftime('%Y-%m-%dT%H:%M:%S+09:00') if @diary.config['RSS_DCDATE_TYPE'].to_i >= 2 then key = sprintf("%s_t%03d", date, tn) if content.empty? then md5 = Digest::MD5::new(str.strip).hexdigest rescue md5 = MD5::new(str.strip).hexdigest else md5 = Digest::MD5::new(content.strip).hexdigest rescue md5 = MD5::new(content.strip).hexdigest end if rss_cache.key?(key) and rss_cache[key][1] == md5 then dcdate = rss_cache[key][0] end rss_cache[key] = [dcdate, md5] end index << %Q! \n! items << %Q! \n! items << %Q! #{t}\n! items << %Q! #{link_base+l}\n! items << %Q! #{d}\n! unless d.empty? items << %Q! #{dcdate}\n! unless dcdate.empty? items << %Q| \n| unless content.empty? items << %Q! \n! aitems << %Q! \n! aitems << %Q! #{t}\n! aitems << %Q! \n! aitems << %Q! #{creater}\n! aitems << %Q! \n! aitems << %Q! \n! aitems << %Q! #{link_base+l}\n! aitems << %Q! #{d}\n! unless d.empty? aitems << %Q! #{dcdate}\n! aitems << %Q! #{dcdate2}\n! unless dcdate.empty? aitems << %Q! \n! jitems << %Q! },\n! unless jitems.empty? jitems << %Q! {\n! jitems << %Q! "title": "#{t}",\n! jitems << %Q! "author": { "name": "#{creater}" },\n! jitems << %Q! "link": { "href": "#{link_base+l}" },\n! jitems << %Q! "id": "#{link_base+l}",\n! jitems << %Q! "summary": "#{d}",\n! unless d.empty? jitems << %Q! "modified": "#{dcdate2}",\n! unless dcdate.empty? jitems << %Q! "issued": "#{dcdate}"\n! } unless rss_cache.keys.empty? then open(@diary.logDirectory + 'rss_cache', 'w'){ |f| rss_cache.keys.sort.reverse[0..50].each{ |t| # 50 が保存しとくトピックの数 f.puts [t, rss_cache[t][0], rss_cache[t][1]].join("\t") } } end jitems << %Q! }! rss = < ja #{title} #{maker}#{rights}#{ccpl}#{image} #{link} #{desc} daily #{@diary.instance_eval{@now}.strftime('%Y-%m-%dT%H:%M:%S+09:00')} #{index} #{items}#{image_detail}#{ccpl_detail} RSS_END atom = < #{title} #{creater} #{desc} #{link} #{@diary.instance_eval{@now}.strftime('%Y-%m-%dT%H:%M:%S+09:00')} #{aitems} ATOM_END json = <' f.print rss rescue f.puts '' f.print rss.toeuc end } atom_filename = @diary.outputDirectory + File::basename(atom_name) open(atom_filename, 'w'){ |f| begin atom = atom.toutf8 f.puts '' f.print atom rescue f.puts '' f.print atom.toeuc end } unless atom_name.empty? json_filename = @diary.outputDirectory + File::basename(json_name) open(json_filename, 'w'){ |f| begin json = json.toutf8 f.print json rescue f.print json.toeuc end } unless json_name.empty? end end end