class Tumblr4r::XMLParser

Tumblr XML API

Public Instance Methods

answer(post, rexml_post) click to toggle source
# File lib/tumblr4r.rb, line 627
def answer(post, rexml_post)
  post = self.post(post, rexml_post)
  post.question = rexml_post.elements["question"].try(:text) || ""
  post.answer   = rexml_post.elements["answer"].try(:text) || ""
  post
end
audio(post, rexml_post) click to toggle source
# File lib/tumblr4r.rb, line 611
def audio(post, rexml_post)
  post = self.post(post, rexml_post)
  post.audio_plays = (rexml_post.attributes["audio-plays"] == "1")
  post.audio_caption = rexml_post.elements["audio-caption"].try(:text) || ""
  post.audio_player = rexml_post.elements["audio-player"].try(:text) || ""
  post
end
chat(post, rexml_post) click to toggle source
# File lib/tumblr4r.rb, line 604
def chat(post, rexml_post)
  post = self.post(post, rexml_post)
  post.conversation_title = rexml_post.elements["conversation-title"].try(:text) || ""
  post.conversation_text = rexml_post.elements["conversation-text"].try(:text) || ""
  post
end
photo(post, rexml_post) click to toggle source
# File lib/tumblr4r.rb, line 576
def photo(post, rexml_post)
  post = self.post(post, rexml_post)
  post.type
  post.photo_caption = rexml_post.elements["photo-caption"].try(:text) || ""
  post.photo_link_url = rexml_post.elements["photo-link-url"].try(:text) || ""
  post.photo_url = rexml_post.elements["photo-url"].try(:text) || ""
  post.photoset = []
  rexml_post.elements.each("photoset/photo") do |photo|
    post.photoset.push(photo.elements["photo-url"].try(:text) || "")
  end
  post
end
post(post, rexml_post) click to toggle source

TODO: この辺りの設計についてはもう少し考慮の余地がある? みんな同じような構造(まずはpost(post, rexml_post)呼んでその後独自処理)してるし、 引数にpostとrexml_postをもらってくるってのもなんかイケてない気がする。

# File lib/tumblr4r.rb, line 552
def post(post, rexml_post)
  post.post_id = rexml_post.attributes["id"].to_i
  post.url = rexml_post.attributes["url"]
  post.url_with_slug = rexml_post.attributes["url-with-slug"]
  post.liked = (rexml_post.attributes["liked"] == "true")
  post.reblog_key = rexml_post.attributes["reblog-key"]
  post.type = rexml_post.attributes["type"]
  # TODO: time 関係の型をStringじゃなくTimeとかにする?
  post.date_gmt = rexml_post.attributes["date-gmt"]
  post.date = rexml_post.attributes["date"]
  post.unix_timestamp = rexml_post.attributes["unix-timestamp"].to_i
  post.format = rexml_post.attributes["format"]
  post.tags = rexml_post.get_elements("tag").map(&:text)
  post.bookmarklet = (rexml_post.attributes["bookmarklet"] == "true")
  post
end
posts(xml) click to toggle source

XMLをパースしてオブジェクトのArrayを作る @param [String] xml APIからのレスポンス全体 @return [Array<Post>, Integer, Integer] 各種Postの子クラスのArray, start, total

# File lib/tumblr4r.rb, line 515
def posts(xml)
  rexml_doc = REXML::Document.new(xml)
  rexml_posts = REXML::XPath.first(rexml_doc, "//tumblr/posts")
  start = rexml_posts.attributes["start"]
  total = rexml_posts.attributes["total"]
  posts = []
  rexml_posts.elements.each("//posts/post") do |rexml_post|
    post_type = rexml_post.attributes["type"]
    post = nil
    case post_type
    when POST_TYPE::REGULAR
      post = self.regular(Regular.new, rexml_post)
    when POST_TYPE::PHOTO
      post = self.photo(Photo.new, rexml_post)
    when POST_TYPE::QUOTE
      post = self.quote(Quote.new, rexml_post)
    when POST_TYPE::LINK
      post = self.link(Link.new, rexml_post)
    when POST_TYPE::CHAT
      post = self.chat(Chat.new, rexml_post)
    when POST_TYPE::AUDIO
      post = self.audio(Audio.new, rexml_post)
    when POST_TYPE::VIDEO
      post = self.video(Video.new, rexml_post)
    when POST_TYPE::ANSWER
      post = self.answer(Answer.new, rexml_post)
    else
      raise TumblrError.new("unknown post type #{post_type}")
    end
    posts << post
  end
  return posts, start.to_i, total.to_i
end
quote(post, rexml_post) click to toggle source
# File lib/tumblr4r.rb, line 589
def quote(post, rexml_post)
  post = self.post(post, rexml_post)
  post.quote_text = rexml_post.elements["quote-text"].try(:text) || ""
  post.quote_source = rexml_post.elements["quote-source"].try(:text) || ""
  post
end
regular(post, rexml_post) click to toggle source
# File lib/tumblr4r.rb, line 569
def regular(post, rexml_post)
  post = self.post(post, rexml_post)
  post.regular_title = rexml_post.elements["regular-title"].try(:text) || ""
  post.regular_body = rexml_post.elements["regular-body"].try(:text) || ""
  post
end
siteinfo(site, xml) click to toggle source

@param [Site] site xmlをパースした結果を埋める入れ物 @param [String] xml TumblrAPIのレスポンスのXMLそのまま

# File lib/tumblr4r.rb, line 499
def siteinfo(site, xml)
  xml_doc = REXML::Document.new(xml)
  tumblelog = REXML::XPath.first(xml_doc, "//tumblr/tumblelog")
  site.name = tumblelog.attributes["name"]
  site.timezone = tumblelog.attributes["timezone"]
  site.title = tumblelog.attributes["title"]
  site.cname = tumblelog.attributes["cname"]
  site.description = tumblelog.text
  # tumblelog.elements["/feeds"]}
  # TODO: feeds は後回し
  return site
end
video(post, rexml_post) click to toggle source
# File lib/tumblr4r.rb, line 619
def video(post, rexml_post)
  post = self.post(post, rexml_post)
  post.video_caption = rexml_post.elements["video-caption"].try(:text) || ""
  post.video_source = rexml_post.elements["video-source"].try(:text) || ""
  post.video_player = rexml_post.elements["video-player"].try(:text) || ""
  post
end