Class: Tumblr4r::XMLParser

Inherits:
Object
  • Object
show all
Defined in:
lib/tumblr4r.rb

Overview

Tumblr XML API

Instance Method Summary collapse

Instance Method Details

#audio(post, rexml_post) ⇒ Object



502
503
504
505
506
507
508
# File 'lib/tumblr4r.rb', line 502

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) ⇒ Object



495
496
497
498
499
500
# File 'lib/tumblr4r.rb', line 495

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


487
488
489
490
491
492
493
# File 'lib/tumblr4r.rb', line 487

def link(post, rexml_post)
  post = self.post(post, rexml_post)
  post.link_text = rexml_post.elements["link-text"].try(:text) || ""
  post.link_url = rexml_post.elements["link-url"].try(:text) || ""
  post.link_description = rexml_post.elements["link-description"].try(:text) || ""
  post
end

#photo(post, rexml_post) ⇒ Object



467
468
469
470
471
472
473
474
475
476
477
478
# File 'lib/tumblr4r.rb', line 467

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) ⇒ Object

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



445
446
447
448
449
450
451
452
453
454
455
456
457
458
# File 'lib/tumblr4r.rb', line 445

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.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) ⇒ Array<Post>, Integer

XMLをパースしてオブジェクトのArrayを作る

Parameters:

  • xml (String)

    APIからのレスポンス全体

Returns:

  • (Array<Post>, Integer, Integer)

    各種Postの子クラスのArray, start, total



410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
# File 'lib/tumblr4r.rb', line 410

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)
    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) ⇒ Object



480
481
482
483
484
485
# File 'lib/tumblr4r.rb', line 480

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) ⇒ Object



460
461
462
463
464
465
# File 'lib/tumblr4r.rb', line 460

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) ⇒ Object

Parameters:

  • site (Site)

    xmlをパースした結果を埋める入れ物

  • xml (String)

    TumblrAPIのレスポンスのXMLそのまま



394
395
396
397
398
399
400
401
402
403
404
405
# File 'lib/tumblr4r.rb', line 394

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) ⇒ Object



510
511
512
513
514
515
516
# File 'lib/tumblr4r.rb', line 510

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