| 次のページ >>

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

Yapra: hAtomまたはユーザ定義XPathを使ってウェブページをフィードに変換するプラグイン

表題の通りです。 再発明くさいのですが、他のプラグインから呼び出して使うことを想定して作っています

単体でも使えなくはないです。RSS::save に渡せばフィードとして保存できたりします。

ダウンロード

https://gist.github.com/raw/824665/2fcfd878b2cfd5f8e50aab97282c537213bbe453/extract.rb

{class base plugin dir}/yapra/plugin/feed/extract.rb として保存してください。

コード


Yapra メモ … その他の Yapra 関連記事についてはこっちにまとめてあります
スポンサーサイト

Yapra: フィードの要約を表示するプラグイン

「何かのプラグインでフィードを生成する → 結果を見る → パラメータなど修正」 という手順のうち、結果を確認する部分がめんどくさかったので作ってみました。

設定ファイルをいじってフィードを生成する場合だけでなく、 フィードを加工するプラグインを作る場合にも便利。


# test.yaml
- module: RSS::load
  config:
    url: http://feeds.fc2.com/fc2/xml?host=haraita9283.blog98

- module: Feed::PrintSummary
  config: 
    size: 3

このように設定ファイルを書いて端末から実行すると、標準出力に次のように出力されます。

$ yapra -c test.yaml
(略)
title: [Yapra: クラスベースのプラグインの書き方とファイル配置、パスの通し方]
date: [2011-02-08T00:05:20+09:00]
link: [http://haraita9283.blog98.fc2.com/blog-entry-407.html]
description: [Yapra のプラグインには legacy なもの class base なもの の 2種類あり、新たに自作する場合はクラスベースな方が推奨されているらしい。 参考: とりあえずネタ振り的なも ...]
--------------------------------
title: [whileループで動き続けるプログラムをログアウト時に終了させる(Ubuntu 10.10)]
date: [2011-02-05T22:07:22+09:00]
link: [http://haraita9283.blog98.fc2.com/blog-entry-406.html]
description: [注)いろいろよく分かってない人が書いてます。 1 環境 2 期待する動作 3 詳細 3.1 SIGHUP は送信されているか?3.2 明示的に SIGHUP を送信する 4 まとめ 5 備考 ...]
--------------------------------
title: [ローカルファイルシステムのファイルをHTTPで取得できるようにする(Ruby/WEBrick)]
date: [2011-02-01T01:10:36+09:00]
link: [http://haraita9283.blog98.fc2.com/blog-entry-405.html]
description: [あるファイルをローカルファイルシステムに置いて別のアプリケーションから利用したいが、 そのアプリケーションはネット上のリソースを使うことを前提としている、という場合があります。 たとえば Fi ...]
$ 

コード


# -*- coding: utf-8 -*-
require 'yapra/plugin/base'

module Yapra::Plugin::Feed

  # description:
  #
  # Data must be a collection of RSS::RDF::Item instance.
  # 
  # example:
  # 
  # - module: Feed::PrintSummary
  #   config: 
  #     reverse: true
  #     size: 10
  #     description_length: 100
  # 
  # config is optional.

  class PrintSummary < Yapra::Plugin::Base
    def shorten(element, length)
      return nil if element.nil?

      chars = element.gsub(/\s+/, " ").strip.split(//u)
      if chars.size > length
        chars = chars[0...(length-4)]
        chars << " ..."
      end

      chars.join("")
    end

    def run(data)
      description_length = config["description_length"] || 200

      summaries = data.map{|item|
        temp_item = item.clone

        if temp_item.description.respond_to? :inner_text
          temp_item.description = temp_item.description.inner_text
        end

        temp_item.description = shorten( temp_item.description,
                                         description_length )

        %w(title date link description).map{|field|
          "#{field}: [%s]\n" % temp_item.send(field)
        }.join("")
      }

      summaries.reverse! if config["reverse"]

      if config["size"]
        summaries = summaries[0...( config["size"] )]
      end

      puts summaries.join("-"*32 + "\n")

      data
    end
  end
end

関連記事


Yapra メモ … その他の Yapra 関連記事についてはこっちにまとめてあります

Yapra: クラスベースのプラグインの書き方とファイル配置、パスの通し方

Yapra のプラグインには

  • legacy なもの
  • class base なもの

の 2種類あり、新たに自作する場合はクラスベースな方が推奨されているらしい。

参考: とりあえずネタ振り的なものを - yapra | Google グループ

以下、クラスベースのプラグイン自作についてメモ。


Ruby の $LOAD_PATH/foo/bar/ が含まれていると、 その下のディレクトリ階層がクラスの階層に対応する。

たとえば設定ファイルをこのように書きたい場合、

- module: Foo::BarBaz
  config: #...

プラグインを次のように書き、 /foo/bar/yapra/plugin/foo/bar_baz.rb (={ロードパスの通ったディレクトリ}/yapra/plugin/foo/bar_baz.rb) として保存する。


require "yapra/plugin/base"
 
module Yapra::Plugin::Foo
  class BarBaz < Yapra::Plugin::Base
    def run(data)
      puts "plugin Foo::BarBaz"
      p config
      # ...
      return data
    end
  end
end

クラスベースのプラグインを自作して使いたいが Yapra のインストールされているディレクトリや site_ruby には余計なものを入れたくない。 かといってわざわざ gem にするほどでもない。 そういう場合は、Ruby の -I オプションを使って別のディレクトリを指定するのが良いかもしれない。

そこで、次のようなシェルスクリプトを用意した。


#!/bin/bash
 
YAPRA_DIR=~/my-yapra/yapra
MY_PLUGIN_DIR_CLASS_BASE=~/my-yapra/my-dir-class-base
 
ruby -I ${YAPRA_DIR}/lib \
     -I ${MY_PLUGIN_DIR_CLASS_BASE} \
     ${YAPRA_DIR}/bin/yapra \
     "$@"

レガシーなプラグインも使いたい場合は (Ruby ではなく Yapra の) -p オプションで指定する。


#!/bin/bash
 
YAPRA_DIR=~/my-yapra/yapra
MY_PLUGIN_DIR_CLASS_BASE=~/my-yapra/my-dir-class-base
MY_PLUGIN_DIR_LEGACY=~/my-yapra/my-dir-legacy
 
ruby -I ${YAPRA_DIR}/lib \
     -I ${MY_PLUGIN_DIR_CLASS_BASE} \
     ${YAPRA_DIR}/bin/yapra \
     -p ${MY_PLUGIN_DIR_LEGACY} \
     "$@"

Windows XP でも次のようなバッチファイルで同じように動かせました。

- ruby 1.9.2p136 (2010-12-25 revision 30365) [i386-mswin32]
- Yapra 0.1.3

@echo off

set YAPRA_DIR="c:\dev\yapra"
set MY_PLUGIN_DIR_CLASS_BASE="C:\dev\yapra\my-plugin\class-base"
set MY_PLUGIN_DIR_LEGACY="C:/dev/yapra/my-plugin/legacy"

ruby192.bat ^
  -I "%YAPRA_DIR%\lib-plugins" ^
  -I "%MY_PLUGIN_DIR_CLASS_BASE%" ^
  "%YAPRA_DIR%\bin\yapra" ^
  -p "%MY_PLUGIN_DIR_LEGACY%" ^
  %*

関連記事

参考(外部リンク)

Yapra メモ

すいません、ぜんぜん整理されてません。 書きかけです。気が向いたら追記・修正などします。

インストール

gem install yapra

簡単。

Feed::Custom の apply_template_after_extracted

2010-02-23 / Ruby 1.8.7 / Yapra 0.1.4

"<%= title %>" だと
NameError in 'undefined local variable or method `title' for #<Yapra::Plugin::Feed::Custom:0xb6f32b5c>'
などと言われるので、
"<%= item.title %>" のように item. を付ける。

実行中の plugin の中で他の plugin を呼び出す

他の plugin の呼び出し - yapra | Google グループ

-d (--configfile-direcotry)

2011-02-01

設定ファイルをディレクトリに入れて -d で指定するとまとめて実行してくれる。
参考: とりあえずネタ振り的なものを - yapra | Google グループ

XPath の確認方法

とりあえず 2つだけ。

Ruby 1.9.2 + Yapra 0.1.3 での動作

2010-01-13 とりあえず RSS::load/save だけで試したところ、 2、3ヶ所修正するとエラーを出さずに動いた。

2011-01-20 本家に反映してもらえました → Commit 8d130c03fc6a4c3379624c5178818b3574029d23 to yuanying's yapra - GitHub

プラグインのディレクトリ

とりあえずネタ振り的なものを - yapra | Google グループ から引用:

今のところ、yapra本体にあるpluginディレクトリは、

- legacy_plugin: pragger 由来のプラグイン
- plugin: pragger作法のプラグイン
- lib-plugin: クラスベースのプラグイン

と、分けておいていますが自作のプラグインは基本的に自分で管理
することになると思います。

クラスベースのプラグインならばLoadPathが通った場所にあ
ればいいので、
一番良いのは gem にしてインストールするか、
もしくは自分で site_ruby ? とかに置くことになると思います。

legacyなプラグインは基本的に自作しない方向で、
もし使うことになったら yapra の -p オプションで明
示的に指定。 

プラグインを gem のディレクトリに置きたくない

プラグインを好きなディレクトリに置いて yapra のオプション -p (--plugindir) で指定する。

たくさん出るエラーメッセージのようなものについて

実行すると次のようなメッセージがずらずらと出るが、 "WARN" とある行は警告で、たとえば Googleカレンダーを使わない場合でも 「Feed::google_calendar がないよ」というメッセージが出たりしている。 そもそも関係ないので無視してオッケー(だと思う)。

W, [2010-09-21T04:43:02.684261 #28748]  WARN -- : Feed::google_calendar can't load, because: no such file to load -- gcalapi
W, [2010-09-21T04:43:02.689784 #28748]  WARN -- : Feed::hatena_graph can't load, because: no such file to load -- hatena/api/graph
W, [2010-09-21T04:43:02.723983 #28748]  WARN -- : Publish::google_calendar can't load, because: no such file to load -- gcalapi
...

じゃあ warn の行だけフィルタすればいいじゃない、ということで yapra -c foo.yaml 2>&1 | grep -v -i warn とするといいのかもしれないが、 見えていた方がいい警告まで除外されてハマったりするのも嫌なので結局は気にしないのがいいのかも。

追記: --log-level オプションも参照

エラーへの対処

--log-level オプションを使う。

パイプライン

参考: 他の plugin の呼び出し - yapra | Google グループ

関連記事

参考(外部リンク)

Lang-8 のキーワード・タグ検索結果や「添削を待っている最新日記」などをフィードにする Yapra プラグインを書いた

20101006 追記: わざわざ自作しなくても 標準のプラグインだけで間に合う気がしてきました。

PLUGINDIR/Lang8/ 以下に次の 2つのファイルを置いてください。


# lang8.rb

require "rubygems"
require "mechanize"


class Lang8
  def initialize
    @agent = Mechanize.new
    @@feed_item = Struct.new("Item", :title, :link, :date, :description)
  end


  def login(mail, pass)
    login_form = @agent.get("http://lang-8.com/login").forms[1]
    login_form["username"] = mail
    login_form["password"] = pass
    redirect_page = @agent.submit(login_form)
  end

  
  def get(url)
    @agent.get(url)
  end


  def feed_items(url)
    page = get(url)
    journals = page.root.css(".on_journal_list")
    journals.map {|journal|
      Lang8.journal2item(journal)
    }
  end

    
  def self.journal2item(journal)
    fi = @@feed_item.new
    fi.title = "%s (by %s)" % [ journal.css(".journal_title a").text,
                                journal.css(".user_name").text ]
    fi.link = "http://lang-8.com" +
      journal.css(".journal_title a").attr("href").text
    fi.date = Time.parse( journal.css(".journal_date").text.strip )
    fi.description = journal.css(".on_status_list")[0].children[-1].text.strip
    fi
  end
end

# journals.rb


require "rubygems"
require "yapra/plugin"
require File.join(File.dirname(__FILE__),
                  "lang8")


def journals(config, data)
  lang8 = Lang8.new
  lang8.login( config["mail"], config["pass"] )
  lang8.feed_items config["url"]
end

設定ファイル例

「マイフレンド最新日記」を取得して RSS 1.0 に書き出す場合:

- module: Lang8::journals
  config:
    mail: {MAIL}
    pass: {PASS}
    url: http://lang-8.com/journals/friends
- module: RSS::save
  config: 
    about: 
    title: "Lang8: マイフレンド最新日記"
    description: 
    link: http://lang-8.com/journals/friends
    filename: lang8-friends.rss

Lang8::journals のパラメータ url で http://lang-8.com/journals/lang_matched を指定すると「あなたの添削を待っている最新日記」、 http://lang-8.com/journals/search?keyword=FooBar とするとキーワード検索の結果、 http://lang-8.com/journals/search?tag=FooBar だとタグ検索の結果が得られます。

関連記事



** ホームに戻る

| 次のページ >>
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。