Class: Wikidotrb::Util::Parser::UserParser
- Inherits:
-
Object
- Object
- Wikidotrb::Util::Parser::UserParser
- Defined in:
- lib/wikidotrb/util/parser/user.rb
Overview
UserParser parses HTML elements containing user information on Wikidot pages and converts them into corresponding user objects
Class Method Summary collapse
-
.deleted_user_string?(elem) ⇒ Boolean
Check if the input is specifically the string "(user deleted)".
-
.gravatar_avatar?(elem) ⇒ Boolean
Check if the element contains a Gravatar avatar (used to identify guest users).
-
.parse(client, elem) ⇒ AbstractUser?
Parse printuser element and return a user object.
-
.parse_anonymous_user(client, elem) ⇒ Wikidotrb::Module::AnonymousUser
Parse an anonymous user element (IP address user).
-
.parse_deleted_user(client, elem) ⇒ Wikidotrb::Module::DeletedUser
Parse a deleted user element.
-
.parse_guest_user(client, elem) ⇒ Wikidotrb::Module::GuestUser
Parse a guest user element (typically with Gravatar).
-
.parse_regular_user(client, elem) ⇒ Wikidotrb::Module::User?
Parse a regular registered Wikidot user.
-
.parse_wikidot_user(client) ⇒ Wikidotrb::Module::WikidotUser
Parse a special Wikidot system user.
Class Method Details
.deleted_user_string?(elem) ⇒ Boolean
Check if the input is specifically the string "(user deleted)"
136 137 138 |
# File 'lib/wikidotrb/util/parser/user.rb', line 136 def self.deleted_user_string?(elem) elem.is_a?(String) && elem.strip == "(user deleted)" end |
.gravatar_avatar?(elem) ⇒ Boolean
Check if the element contains a Gravatar avatar (used to identify guest users)
120 121 122 123 124 125 126 127 128 129 130 131 |
# File 'lib/wikidotrb/util/parser/user.rb', line 120 def self.gravatar_avatar?(elem) avatar_elem = elem.at_css("img") return false unless avatar_elem begin avatar_url = avatar_elem["src"] host = URI.parse(avatar_url).host host == "gravatar.com" rescue URI::InvalidURIError false end end |
.parse(client, elem) ⇒ AbstractUser?
Parse printuser element and return a user object
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
# File 'lib/wikidotrb/util/parser/user.rb', line 21 def self.parse(client, elem) if elem.nil? return nil elsif deleted_user_string?(elem) # Handle "(user deleted)" case return Wikidotrb::Module::DeletedUser.new(client: client) elsif !elem.is_a?(Nokogiri::XML::Element) # Assume it is a string and parse it using Nokogiri parsed_doc = Nokogiri::HTML.fragment(elem.to_s) elem = parsed_doc.children.first end if elem["class"]&.include?("deleted") parse_deleted_user(client, elem) elsif elem["class"]&.include?("anonymous") parse_anonymous_user(client, elem) elsif gravatar_avatar?(elem) parse_guest_user(client, elem) elsif elem.text.strip == "Wikidot" parse_wikidot_user(client) else parse_regular_user(client, elem) end end |
.parse_anonymous_user(client, elem) ⇒ Wikidotrb::Module::AnonymousUser
Parse an anonymous user element (IP address user)
63 64 65 66 67 68 69 70 71 72 73 74 |
# File 'lib/wikidotrb/util/parser/user.rb', line 63 def self.parse_anonymous_user(client, elem) masked_ip = elem.at_css("span.ip").text.gsub(/[()]/, "").strip ip = masked_ip # Default is the masked IP # Use the full IP if available from onclick attribute if (onclick_attr = elem.at_css("a")["onclick"]) match_data = onclick_attr.match(/WIKIDOT.page.listeners.anonymousUserInfo\('(.+?)'\)/) ip = match_data[1] if match_data end Wikidotrb::Module::AnonymousUser.new(client: client, ip: ip, ip_masked: masked_ip) end |
.parse_deleted_user(client, elem) ⇒ Wikidotrb::Module::DeletedUser
Parse a deleted user element
54 55 56 57 |
# File 'lib/wikidotrb/util/parser/user.rb', line 54 def self.parse_deleted_user(client, elem) id = elem["data-id"].to_i Wikidotrb::Module::DeletedUser.new(client: client, id: id) end |
.parse_guest_user(client, elem) ⇒ Wikidotrb::Module::GuestUser
Parse a guest user element (typically with Gravatar)
80 81 82 83 84 |
# File 'lib/wikidotrb/util/parser/user.rb', line 80 def self.parse_guest_user(client, elem) guest_name = elem.text.strip.split.first avatar_url = elem.at_css("img")["src"] Wikidotrb::Module::GuestUser.new(client: client, name: guest_name, avatar_url: avatar_url) end |
.parse_regular_user(client, elem) ⇒ Wikidotrb::Module::User?
Parse a regular registered Wikidot user
98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 |
# File 'lib/wikidotrb/util/parser/user.rb', line 98 def self.parse_regular_user(client, elem) user_anchor = elem.css("a").last # Return nil if user anchor is nil return nil if user_anchor.nil? user_name = user_anchor.text.strip user_unix = user_anchor["href"].to_s.gsub("http://www.wikidot.com/user:info/", "") user_id = user_anchor["onclick"].to_s.match(/WIKIDOT.page.listeners.userInfo\((\d+)\)/)[1].to_i Wikidotrb::Module::User.new( client: client, id: user_id, name: user_name, unix_name: user_unix, avatar_url: "http://www.wikidot.com/avatar.php?userid=#{user_id}" ) end |
.parse_wikidot_user(client) ⇒ Wikidotrb::Module::WikidotUser
Parse a special Wikidot system user
89 90 91 |
# File 'lib/wikidotrb/util/parser/user.rb', line 89 def self.parse_wikidot_user(client) Wikidotrb::Module::WikidotUser.new(client: client) end |