Class: Wikidotrb::Module::PageCollection
- Inherits:
-
Array
- Object
- Array
- Wikidotrb::Module::PageCollection
- Defined in:
- lib/wikidotrb/module/page.rb
Instance Attribute Summary collapse
-
#site
Returns the value of attribute site.
Class Method Summary collapse
- .acquire_page_discuss(site, pages)
- .acquire_page_ids(site, pages)
- .acquire_page_revisions(site, pages)
- .acquire_page_sources(site, pages)
- .acquire_page_votes(site, pages)
- .parse(site, html_body)
- .search_pages(site, query = SearchPagesQuery.new)
Instance Method Summary collapse
- #get_page_discuss
- #get_page_ids
- #get_page_revisions
-
#get_page_sources
Modification of method definition part.
- #get_page_votes
-
#initialize(site: nil, pages: []) ⇒ PageCollection
constructor
A new instance of PageCollection.
Constructor Details
#initialize(site: nil, pages: []) ⇒ PageCollection
Returns a new instance of PageCollection.
78 79 80 81 |
# File 'lib/wikidotrb/module/page.rb', line 78 def initialize(site: nil, pages: []) super(pages) @site = site || pages.first&.site end |
Instance Attribute Details
#site
Returns the value of attribute site.
76 77 78 |
# File 'lib/wikidotrb/module/page.rb', line 76 def site @site end |
Class Method Details
.acquire_page_discuss(site, pages)
338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 |
# File 'lib/wikidotrb/module/page.rb', line 338 def self.acquire_page_discuss(site, pages) target_pages = pages.reject(&:is_discuss_acquired?) return pages if target_pages.empty? responses = site.amc_request( bodies: target_pages.map do |page| { "action" => "ForumAction", "event" => "createPageDiscussionThread", "page_id" => page.id, "moduleName" => "Empty" } end ) target_pages.each_with_index do |page, index| page.discuss = ForumThread.new(site, responses[index]["thread_id"], page: page) end end |
.acquire_page_ids(site, pages)
233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 |
# File 'lib/wikidotrb/module/page.rb', line 233 def self.acquire_page_ids(site, pages) target_pages = pages.reject(&:is_id_acquired?) return pages if target_pages.empty? responses = Wikidotrb::Util::RequestUtil.request( client: site.client, method: "GET", urls: target_pages.map { |page| "#{page.get_url}/norender/true/noredirect/true" } ) responses.each_with_index do |response, index| source = response.body.to_s # Convert to string if necessary id_match = source&.match(/WIKIREQUEST\.info\.pageId = (\d+);/) unless id_match raise Wikidotrb::Common::Exceptions::UnexpectedException, "Cannot find page id for: #{target_pages[index].fullname}, possibly an invalid response" end target_pages[index].id = id_match[1].to_i end pages end |
.acquire_page_revisions(site, pages)
259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 |
# File 'lib/wikidotrb/module/page.rb', line 259 def self.acquire_page_revisions(site, pages) return pages if pages.empty? responses = site.amc_request( bodies: pages.map do |page| { "moduleName" => "history/PageRevisionListModule", "page_id" => page.id, "options" => { "all" => true }, "perpage" => 100_000_000 # Get all without using pager } end ) responses.each_with_index do |response, index| body = response["body"] revs = [] body_html = Nokogiri::HTML(body) body_html.css("table.page-history > tr[id^=revision-row-]").each do |rev_element| rev_id = rev_element["id"].gsub("revision-row-", "").to_i tds = rev_element.css("td") rev_no = tds[0].text.strip.gsub(".", "").to_i created_by = Wikidotrb::Util::Parser::UserParser.parse(site.client, tds[4].css("span.printuser").first) created_at = Wikidotrb::Util::Parser::ODateParser.parse(tds[5].css("span.odate").first) comment = tds[6].text.strip revs << PageRevision.new( page: pages[index], id: rev_id, rev_no: rev_no, created_by: created_by, created_at: created_at, comment: comment ) end pages[index].revisions = revs end pages end |
.acquire_page_sources(site, pages)
217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 |
# File 'lib/wikidotrb/module/page.rb', line 217 def self.acquire_page_sources(site, pages) return pages if pages.empty? responses = site.amc_request( bodies: pages.map { |page| { "moduleName" => "viewsource/ViewSourceModule", "page_id" => page.id } } ) pages.each_with_index do |page, index| body = responses[index]["body"] source = Nokogiri::HTML(body).at_css("div.page-source").text.strip page.source = PageSource.new(page: page, wiki_text: source) end pages end |
.acquire_page_votes(site, pages)
301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 |
# File 'lib/wikidotrb/module/page.rb', line 301 def self.acquire_page_votes(site, pages) return pages if pages.empty? responses = site.amc_request( bodies: pages.map { |page| { "moduleName" => "pagerate/WhoRatedPageModule", "pageId" => page.id } } ) responses.each_with_index do |response, index| body = response["body"] html = Nokogiri::HTML(body) user_elems = html.css("span.printuser") value_elems = html.css('span[style^="color"]') if user_elems.size != value_elems.size raise Wikidotrb::Common::Exceptions::UnexpectedException, "User and value count mismatch" end users = user_elems.map { |user_elem| Wikidotrb::Util::Parser::UserParser.parse(site.client, user_elem) } values = value_elems.map do |value_elem| value = value_elem.text.strip if value == "+" 1 elsif value == "-" -1 else value.to_i end end votes = users.zip(values).map { |user, vote| PageVote.new(page: pages[index], user: user, value: vote) } pages[index].votes = PageVoteCollection.new(page: pages[index], votes: votes) end pages end |
.parse(site, html_body)
83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 |
# File 'lib/wikidotrb/module/page.rb', line 83 def self.parse(site, html_body) pages = [] html_body.css("div.page").each do |page_element| page_params = {} # Determine rating method = !page_element.css("span.rating span.page-rate-list-pages-start").empty? # Get each value page_element.css("span.set").each do |set_element| key = set_element.css("span.name").text.strip value_element = set_element.css("span.value") value = if value_element.empty? nil elsif %w[created_at updated_at commented_at].include?(key) odate_element = value_element.css("span.odate") odate_element.empty? ? nil : Wikidotrb::Util::Parser::ODateParser.parse(odate_element) elsif %w[created_by_linked updated_by_linked commented_by_linked].include?(key) printuser_element = value_element.css("span.printuser") if printuser_element.empty? nil else Wikidotrb::Util::Parser::UserParser.parse(site.client, printuser_element) end elsif %w[tags _tags].include?(key) value_element.text.split elsif %w[rating_votes comments size revisions].include?(key) value_element.text.strip.to_i elsif key == "rating" ? value_element.text.strip.to_f : value_element.text.strip.to_i elsif key == "rating_percent" ? value_element.text.strip.to_f / 100 : nil else value_element.text.strip end # Convert key key = key.gsub("_linked", "") if key.include?("_linked") key = "#{key}_count" if %w[comments children revisions].include?(key) key = "votes_count" if key == "rating_votes" page_params[key.to_sym] = value end # Integrate tag lists page_params[:tags] ||= [] page_params[:tags] += page_params.delete(:_tags) || [] # Create page object pages << Page.new(site: site, **page_params) end new(site: site, pages: pages) end |
.search_pages(site, query = SearchPagesQuery.new)
141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 |
# File 'lib/wikidotrb/module/page.rb', line 141 def self.search_pages(site, query = SearchPagesQuery.new) # Initialize query query_dict = query.to_h query_dict["moduleName"] = "list/ListPagesModule" query_dict["module_body"] = %([[div class="page"]]#{ DEFAULT_MODULE_BODY.map do |key| <<~WIKIDOT.chomp [[span class="set #{key}"]] [[span class="name"]]#{key}[[/span]] [[span class="value"]]%%#{key}%%[[/span]] [[/span]] WIKIDOT end.join }[[/div]]) begin # Initial request response_data = site.amc_request(bodies: [query_dict])[0] rescue Wikidotrb::Common::Exceptions::WikidotStatusCodeException => e raise Wikidotrb::Common::Exceptions::ForbiddenException, "Failed to get pages, target site may be private" if e.status_code == "not_ok" raise e end body = response_data["body"] first_page_html_body = Nokogiri::HTML(body) total = 1 html_bodies = [first_page_html_body] # Check for pager existence pager_element = first_page_html_body.css("div.pager") unless pager_element.empty? # Get maximum page number total = pager_element.css("span.target")[-2].css("a").text.to_i end # If multiple pages exist, repeat requests if total > 1 request_bodies = [] (1...total).each do |i| _query_dict = query_dict.dup _query_dict["offset"] = i * query.perPage request_bodies << _query_dict end responses = site.amc_request(bodies: request_bodies) html_bodies.concat(responses.map { |response| Nokogiri::HTML(response["body"]) }) end # Parse all HTML bodies and create page collection pages = html_bodies.flat_map { |html_body| parse(site, html_body) } new(site: site, pages: pages) end |
Instance Method Details
#get_page_discuss
213 214 215 |
# File 'lib/wikidotrb/module/page.rb', line 213 def get_page_discuss PageCollection.acquire_page_discuss(@site, self) end |
#get_page_ids
201 202 203 |
# File 'lib/wikidotrb/module/page.rb', line 201 def get_page_ids PageCollection.acquire_page_ids(@site, self) end |
#get_page_revisions
205 206 207 |
# File 'lib/wikidotrb/module/page.rb', line 205 def get_page_revisions PageCollection.acquire_page_revisions(@site, self) end |
#get_page_sources
Modification of method definition part
197 198 199 |
# File 'lib/wikidotrb/module/page.rb', line 197 def get_page_sources PageCollection.acquire_page_sources(@site, self) end |
#get_page_votes
209 210 211 |
# File 'lib/wikidotrb/module/page.rb', line 209 def get_page_votes PageCollection.acquire_page_votes(@site, self) end |