-
Notifications
You must be signed in to change notification settings - Fork 0
/
gametex.rb
61 lines (54 loc) · 1.72 KB
/
gametex.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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
49
50
51
52
53
54
55
56
57
58
59
60
61
#!/usr/bin/env ruby
require 'csv'
require 'json'
require 'erb'
require 'open-uri'
require 'nokogiri'
require 'htmlentities'
require 'sanitize'
require 'trollop'
require_relative './feeds.rb'
def keywords(game)
mechanics = game.css('boardgamemechanic').map(&:text).join(', ')
categories = game.css('boardgamecategory').map(&:text).join(', ')
if mechanics.empty?
categories
elsif categories.empty?
mechanics
else
"#{mechanics}, #{categories}"
end
end
def write_file(game_hash)
ERB.new(File.new('./gametex.erb').read, nil, '-').result(binding)
end
def decode_html(html)
HTMLEntities.new.decode(html).gsub('<br/>', "\n").gsub('&'){'\&'}.gsub('#', '\#').gsub('>', '>')
end
opts = Trollop.options do
# Set help message
usage '[options]'
synopsis 'This command generates a menu or book of games owned by the user specified'
opt :username, 'The boardgamegeek.com username whose collection you want to parse', type: :string, required: true
opt :age, 'The age of the youngest player playing', type: :int
opt :players, 'The number of players playing', type: :int
opt :length, 'The number of minutes for the game', type: :int
end
@feeds = Feeds.new(opts)
doc = @feeds.game
games = doc.css('boardgame')
game_hash = {}
games.each do |game|
game_name = game.css('name[primary="true"]').text.gsub('&'){'\&'}
next unless @feeds.filters(game)
game_hash[game_name] = {
description: decode_html(Sanitize.fragment(game.css('description').text)),
minplayers: game.css('minplayers').text,
maxplayers: game.css('maxplayers').text,
age: game.css('age').text,
mechanics: keywords(game),
minplay: game.css('minplaytime').text,
maxplay: game.css('maxplaytime').text
}
end
puts write_file(game_hash)