Class: RubyHackernews::CommentService

Inherits:
Object
  • Object
show all
Includes:
MechanizeContext
Defined in:
lib/ruby-hackernews/services/comment_service.rb

Instance Method Summary collapse

Methods included from MechanizeContext

#[], #agent, agent=, #authenticated?, #require_authentication

Instance Method Details

#find_by_id(id) ⇒ Object



17
18
19
20
21
22
23
24
25
# File 'lib/ruby-hackernews/services/comment_service.rb', line 17

def find_by_id(id)
  page = agent.get(ConfigurationService.base_url + "item?id=#{id}")
  comment = parse_comment(page.search("table")[2].search("tr").first)
  comment.instance_variable_set(:@absolute_link, "item?id=#{id}")
  get_comments_entities(page.search("table")[3]).each do |c|
    comment << c
  end
  return comment
end

#get_comments(page) ⇒ Object



6
7
8
9
# File 'lib/ruby-hackernews/services/comment_service.rb', line 6

def get_comments(page)
  table = page.search("table")[3]
  return get_comments_entities(table)
end

#get_comments_entities(table) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/ruby-hackernews/services/comment_service.rb', line 27

def get_comments_entities(table)
  comments = []
  target   = comments
  current_level = 0
  trs = table.search("table/tr").select do |tr|
    tr.search("span.comment").inner_html != "[deleted]"
  end
  trs.each do |tr|
    comment = parse_comment(tr)
    level = tr.search("img[@src='s.gif']").first['width'].to_i / 40
    difference = current_level - level
    (difference + 1).times do
      target = target.kind_of?(Comment) && target.parent ? target.parent : comments
    end
    current_level = level
    target << comment
    target = comment
  end
  return comments
end

#get_new_comments(pages = 1, url = ConfigurationService.comments_url) ⇒ Object



48
49
50
# File 'lib/ruby-hackernews/services/comment_service.rb', line 48

def get_new_comments(pages = 1, url = ConfigurationService.comments_url)
  get_new_comments_with_extra(pages,url)[:comments]
end

#get_new_comments_with_extra(pages = 1, url = ConfigurationService.comments_url) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/ruby-hackernews/services/comment_service.rb', line 52

def get_new_comments_with_extra(pages = 1, url = ConfigurationService.comments_url)
  parser = EntryPageParser.new(agent.get(url))
  comments = []
  next_url = nil
  pages.times do
    lines = parser.get_lines
    lines.each do |line|
      comments << parse_comment(line)
    end
    next_url = parser.get_next_url || break
    parser = EntryPageParser.new(agent.get(next_url))
  end
  return {:comments => comments, :next_url => next_url}
end

#get_user_comments(user) ⇒ Object



11
12
13
14
15
# File 'lib/ruby-hackernews/services/comment_service.rb', line 11

def get_user_comments(user)
  page = agent.get(ConfigurationService.base_url + "threads?id=#{user.name}")
  table = page.search("table")[2]
  return get_comments_entities(table)
end

#parse_comment(element) ⇒ Object



67
68
69
70
71
72
73
74
75
76
77
78
79
# File 'lib/ruby-hackernews/services/comment_service.rb', line 67

def parse_comment(element)
  text_html = element.search("span.comment").first.search("font").children.map { |x| x.inner_text }.join("\n")
  header = element.search("span.comhead").first
  voting = VotingInfoParser.new(element.search("td/center/a"), header).parse
   = UserInfoParser.new(header).parse
  reply_link = element.search("td[@class='default']/p//u//a").first
  reply_url = reply_link['href'] if reply_link
  absolute_link_group = header.search("a")
  absolute_url = absolute_link_group.count == 2 ? absolute_link_group[1]['href'] : nil
  parent_link = header.search("a[text()*='parent']").first
  parent_url = parent_link['href'] if parent_link
  return Comment.new(text_html, voting, , reply_url, absolute_url, parent_url)
end

#write_comment(page_url, comment) ⇒ Object



81
82
83
84
85
86
87
# File 'lib/ruby-hackernews/services/comment_service.rb', line 81

def write_comment(page_url, comment)
  require_authentication
  form = agent.get(page_url).forms.first
  form.text = comment
  form.submit
  return true
end