timeline_setter 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.document +4 -0
- data/LICENSE.txt +18 -0
- data/README +15 -0
- data/Rakefile +98 -0
- data/bin/timeline-setter +9 -0
- data/doc/doc.markdown +253 -0
- data/doc/doc_wrapper.erb +87 -0
- data/doc/docco.css +186 -0
- data/doc/timeline-setter.html +592 -0
- data/doc/todo.markdown +28 -0
- data/doc/twitter-demo.html +122 -0
- data/documentation/TimelineSetter/CLI.html +575 -0
- data/documentation/TimelineSetter/Parser.html +285 -0
- data/documentation/TimelineSetter/Timeline.html +513 -0
- data/documentation/TimelineSetter/Util.html +246 -0
- data/documentation/TimelineSetter.html +112 -0
- data/documentation/_index.html +132 -0
- data/documentation/class_list.html +36 -0
- data/documentation/css/common.css +1 -0
- data/documentation/css/full_list.css +53 -0
- data/documentation/css/style.css +318 -0
- data/documentation/file.README.html +70 -0
- data/documentation/file_list.html +38 -0
- data/documentation/frames.html +13 -0
- data/documentation/index.html +70 -0
- data/documentation/js/app.js +203 -0
- data/documentation/js/full_list.js +149 -0
- data/documentation/js/jquery.js +16 -0
- data/documentation/method_list.html +155 -0
- data/documentation/top-level-namespace.html +88 -0
- data/index.html +397 -0
- data/lib/timeline_setter/cli.rb +85 -0
- data/lib/timeline_setter/parser.rb +28 -0
- data/lib/timeline_setter/timeline.rb +44 -0
- data/lib/timeline_setter/version.rb +3 -0
- data/lib/timeline_setter.rb +22 -0
- data/public/javascripts/timeline-setter.js +822 -0
- data/public/javascripts/vendor/jquery-min.js +16 -0
- data/public/javascripts/vendor/underscore-min.js +26 -0
- data/public/stylesheets/timeline-setter.css +396 -0
- data/spec/spec_helper.rb +10 -0
- data/spec/test_data.csv +4 -0
- data/spec/timeline_setter_spec.rb +85 -0
- data/templates/timeline-markup.erb +61 -0
- data/templates/timeline-min.erb +1 -0
- data/templates/timeline.erb +12 -0
- data/timeline_setter.gemspec +104 -0
- metadata +189 -0
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
require 'fileutils'
|
3
|
+
|
4
|
+
module TimelineSetter
|
5
|
+
class CLI
|
6
|
+
def initialize
|
7
|
+
parse_options!
|
8
|
+
end
|
9
|
+
|
10
|
+
def parse_options!
|
11
|
+
@options = {}
|
12
|
+
option_parser = OptionParser.new do |opts|
|
13
|
+
opts.banner = <<-BANNER
|
14
|
+
TimelineSetter: A tool to generate HTML timelines from CSVs.
|
15
|
+
|
16
|
+
Usage:
|
17
|
+
BANNER
|
18
|
+
|
19
|
+
opts.on('-c', '--csv CSV', 'CSV input file') do |c|
|
20
|
+
@options[:csv] = c
|
21
|
+
end
|
22
|
+
opts.on('-o', '--output OUTPUT', 'Output directory to install timeline into.') do |o|
|
23
|
+
@options[:output] = o
|
24
|
+
end
|
25
|
+
opts.on('-a', '--with-assets', 'Output timeline supporting assets as well') do |a|
|
26
|
+
@options[:assets] = a
|
27
|
+
end
|
28
|
+
opts.on('-O', '--open', 'Open generated timeline in a browser') do |o|
|
29
|
+
@options[:open] = o
|
30
|
+
end
|
31
|
+
opts.on('-m', '--min', 'Create a minified one-page version of the timeline') do |m|
|
32
|
+
@options[:min] = m
|
33
|
+
end
|
34
|
+
|
35
|
+
|
36
|
+
opts.on_tail("-h", "--help", "Show this message") do
|
37
|
+
puts opts
|
38
|
+
exit
|
39
|
+
end
|
40
|
+
end
|
41
|
+
option_parser.parse!
|
42
|
+
|
43
|
+
if @options.empty?
|
44
|
+
puts option_parser.on_tail
|
45
|
+
exit
|
46
|
+
else
|
47
|
+
compile!
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def sheet
|
52
|
+
File.open(@options[:csv]).read
|
53
|
+
end
|
54
|
+
|
55
|
+
def events
|
56
|
+
TimelineSetter::Parser.new sheet
|
57
|
+
end
|
58
|
+
|
59
|
+
def html
|
60
|
+
TimelineSetter::Timeline.new(events.events).send(@options[:min] ? :timeline_min : :timeline)
|
61
|
+
end
|
62
|
+
|
63
|
+
def outdir
|
64
|
+
@options[:output] ? @options[:output] : "#{`pwd`.strip}/"
|
65
|
+
end
|
66
|
+
|
67
|
+
def compile!
|
68
|
+
if @options[:assets]
|
69
|
+
FileUtils.cp_r(Dir.glob("#{TimelineSetter::ROOT}/public/*"), outdir)
|
70
|
+
end
|
71
|
+
|
72
|
+
File.open(outdir + 'timeline.html', 'w+') do |doc|
|
73
|
+
doc.write html
|
74
|
+
end
|
75
|
+
|
76
|
+
puts "== Files copied to #{outdir}"
|
77
|
+
|
78
|
+
if @options[:open]
|
79
|
+
puts "== Opening ..."
|
80
|
+
%x{ open #{outdir}timeline.html }
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module TimelineSetter
|
2
|
+
class Parser
|
3
|
+
attr_reader :events
|
4
|
+
|
5
|
+
# Initialize a new timeline from a CSV file via TableFu,
|
6
|
+
# add a hash for each row (event) in the sheet to an events array.
|
7
|
+
# Sheet should contain columns for
|
8
|
+
# * date
|
9
|
+
# * display_date
|
10
|
+
# * description
|
11
|
+
# * link
|
12
|
+
# * thumbnail
|
13
|
+
# * series
|
14
|
+
# * html
|
15
|
+
#
|
16
|
+
def initialize(sheet)
|
17
|
+
@events = []
|
18
|
+
spreadsheet = TableFu.new(sheet) do |s|
|
19
|
+
s.columns = %w[date display_date description link series html]
|
20
|
+
end
|
21
|
+
|
22
|
+
spreadsheet.rows.each do |row|
|
23
|
+
hash = spreadsheet.columns.inject({}) {|memo, column| memo[column.to_sym] = row[column].to_s ; memo}
|
24
|
+
@events << hash
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
module TimelineSetter
|
2
|
+
class Timeline
|
3
|
+
attr_reader :timeline
|
4
|
+
# Instantiate a new timeline from an events
|
5
|
+
# array created in Parser#initialize
|
6
|
+
def initialize(events)
|
7
|
+
@events = events
|
8
|
+
end
|
9
|
+
|
10
|
+
# Convert human dates to timestamps, sort the hash by timestamp, and
|
11
|
+
# convert the events hash to JSON to stick into our HTML.
|
12
|
+
def to_json
|
13
|
+
@events.collect {|r| r[:timestamp] = Time.parse(r[:date]).to_i * 1000 }.sort{|a,b| b[:timestamp] <=> a[:timestamp]}
|
14
|
+
@events.to_json
|
15
|
+
end
|
16
|
+
|
17
|
+
def timeline_markup
|
18
|
+
tmpl("timeline-markup.erb")
|
19
|
+
end
|
20
|
+
|
21
|
+
# Create timeline HTML by interpolating events hash into an ERB template.
|
22
|
+
# Re-template timeline by editing ../templates/timeline.erb
|
23
|
+
# This version preserves external links to CSS and JS.
|
24
|
+
def timeline
|
25
|
+
@timeline = tmpl("timeline.erb")
|
26
|
+
end
|
27
|
+
|
28
|
+
# Create a minified one-page version of a timeline by minifying CSS and JS and embedding all assets
|
29
|
+
# into our ERB template.
|
30
|
+
def timeline_min
|
31
|
+
@js = ""
|
32
|
+
@css = Kompress::CSS.new(File.open("#{TimelineSetter::ROOT}/public/stylesheets/timeline-setter.css").read).css
|
33
|
+
libs = Dir.glob("#{TimelineSetter::ROOT}/public/javascripts/vendor/**")
|
34
|
+
libs.each { |lib| @js << File.open(lib,'r').read }
|
35
|
+
@min_html = Kompress::HTML.new(timeline_markup).html
|
36
|
+
@js << Closure::Compiler.new.compile(File.open("#{TimelineSetter::ROOT}/public/javascripts/timeline-setter.js", 'r'))
|
37
|
+
@timeline = tmpl("timeline-min.erb")
|
38
|
+
end
|
39
|
+
|
40
|
+
def tmpl(tmpl_file)
|
41
|
+
ERB.new(File.open("#{TimelineSetter::ROOT}/templates/#{tmpl_file}").read).result(binding)
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
|
2
|
+
module TimelineSetter
|
3
|
+
ROOT = File.expand_path "#{File.dirname __FILE__}/.."
|
4
|
+
end
|
5
|
+
|
6
|
+
require 'date'
|
7
|
+
require 'time'
|
8
|
+
require 'erb'
|
9
|
+
require 'table_fu'
|
10
|
+
require 'json'
|
11
|
+
require 'kompress'
|
12
|
+
|
13
|
+
begin
|
14
|
+
require 'closure-compiler'
|
15
|
+
rescue LoadError
|
16
|
+
puts "== Warning, the closure-compiler gem is required to generate minified timelines"
|
17
|
+
end
|
18
|
+
|
19
|
+
|
20
|
+
require "#{TimelineSetter::ROOT}/lib/timeline_setter/version"
|
21
|
+
require "#{TimelineSetter::ROOT}/lib/timeline_setter/parser"
|
22
|
+
require "#{TimelineSetter::ROOT}/lib/timeline_setter/timeline"
|