: O. Yuanying

Pragger で RSS を簡単に sort したい!!

Pragger で sort したい!! にも書いたのですが、PraggerでRSSのItemをsortするのがちょっとめんどくさい。

item要素のdateを比べたいだけだったから、Filter::sortをこんな感じで書きたかったのですよ!


- module: Filter::sort
  config:
    method: date

ってことで Filter::sort をちょこっと修正。


def sort(config,data)
  return data.sort do|a,b|
    if(config==nil || config["method"] == nil)
      a <=> b
    elsif config["method"].kind_of?(Hash)
      eval_pragger(config["method"],[a])[0] <=> eval_pragger(config["method"],[b])[0]
    else
      method = config['method']
      a = a.respond_to?(method) ? a.__send__(method) : nil
      b = b.respond_to?(method) ? b.__send__(method) : nil
      return a <=> b if a.respond_to?('<=>')
      return b <=> a if b.respond_to?('<=>')
      nil
    end
  end
end

びみょーに冗長な気がするけど…。とりあえず動いたのでよしとする。

ちょっと書き換えた (2008-05-27)


def create_compare_proc config
  if(config==nil || config["method"] == nil)
    return lambda do |a, b|
      a <=> b
    end
  elsif config["method"].kind_of?(Hash)
    return lambda do |a, b|
      eval_pragger(config["method"],[a])[0] <=> eval_pragger(config["method"],[b])[0]
    end
  else
    return lambda do |a, b|
      method = config['method']
      a = a.respond_to?(method) ? a.__send__(method) : nil
      b = b.respond_to?(method) ? b.__send__(method) : nil
      return a <=> b if a.respond_to?('<=>')
      return b <=> a if b.respond_to?('<=>')
      nil
    end
  end
end

def sort(config,data)
  proc = create_compare_proc(config)
  return data.sort do|a, b|
    proc.call(a, b)
  end
end