Skip to content

Commit 7faaa71

Browse files
committed
Initial Commit
0 parents  commit 7faaa71

24 files changed

+666
-0
lines changed

.gitmodules

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
[submodule "data"]
2+
path = data
3+
url = [email protected]:mattt/wwdc-session-transcripts.git

Gemfile

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
source "https://rubygems.org"
2+
ruby "2.0.0"
3+
4+
gem 'pg'
5+
gem 'sequel'
6+
7+
gem 'rake'
8+
9+
gem 'rack-gauges', require: 'rack/gauges'
10+
11+
gem 'sinatra', require: 'sinatra/base'
12+
gem 'sinatra-contrib', require: 'sinatra/contrib/all'
13+
gem 'sinatra-param', require: 'sinatra/param'
14+
15+
gem 'haml'
16+
gem 'redcarpet'
17+
18+
gem 'unicorn'
19+
20+
group :development do
21+
gem 'compass'
22+
end

Gemfile.lock

+60
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
GEM
2+
remote: https://rubygems.org/
3+
specs:
4+
backports (3.3.3)
5+
chunky_png (1.2.8)
6+
compass (0.12.2)
7+
chunky_png (~> 1.2)
8+
fssm (>= 0.2.7)
9+
sass (~> 3.1)
10+
fssm (0.2.10)
11+
haml (4.0.3)
12+
tilt
13+
kgio (2.8.1)
14+
multi_json (1.7.9)
15+
pg (0.17.0)
16+
rack (1.5.2)
17+
rack-gauges (1.1.0)
18+
rack-protection (1.5.0)
19+
rack
20+
rack-test (0.6.2)
21+
rack (>= 1.0)
22+
raindrops (0.12.0)
23+
rake (10.1.0)
24+
redcarpet (3.0.0)
25+
sass (3.2.10)
26+
sequel (4.2.0)
27+
sinatra (1.4.3)
28+
rack (~> 1.4)
29+
rack-protection (~> 1.4)
30+
tilt (~> 1.3, >= 1.3.4)
31+
sinatra-contrib (1.4.1)
32+
backports (>= 2.0)
33+
multi_json
34+
rack-protection
35+
rack-test
36+
sinatra (~> 1.4.0)
37+
tilt (~> 1.3)
38+
sinatra-param (0.1.3)
39+
sinatra (~> 1.3)
40+
tilt (1.4.1)
41+
unicorn (4.6.3)
42+
kgio (~> 2.6)
43+
rack
44+
raindrops (~> 0.7)
45+
46+
PLATFORMS
47+
ruby
48+
49+
DEPENDENCIES
50+
compass
51+
haml
52+
pg
53+
rack-gauges
54+
rake
55+
redcarpet
56+
sequel
57+
sinatra
58+
sinatra-contrib
59+
sinatra-param
60+
unicorn

Procfile

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
web: bundle exec unicorn -p $PORT
2+
compass: bundle exec compass watch public

README.md

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# ASCIIwwdc
2+
*Searchable full-text transcripts of WWDC sessions*

Rakefile

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
require 'bundler'
2+
Bundler.require
3+
4+
require 'yaml'
5+
6+
Sequel.extension :migration
7+
8+
DB = Sequel.connect(ENV['DATABASE_URL'])
9+
Sequel::Migrator.run(DB, ::File.join(::File.dirname(__FILE__), 'lib/migrations'))
10+
11+
require './lib/models/session'
12+
13+
namespace :db do
14+
task :seed do
15+
Dir["data/*"].each do |directory|
16+
year = Integer(directory.split(/\//).last)
17+
18+
YAML.load(File.open(File.join(directory, "_sessions.yml"))).each do |number, attributes|
19+
session = Session.new(attributes)
20+
session.number = number
21+
session.year = year
22+
session.transcript = File.read("data/#{year}/#{number}.srt").lines.delete_if{|line|
23+
line == "\n" ||
24+
line[0] == "[" ||
25+
/^\d{2}\:\d{2}\:\d{2}\.\d{3}/ === line ||
26+
/^WEBVTT/ === line ||
27+
/^X-TIMESTAMP-MAP/ === line
28+
}.collect{|line|
29+
line.gsub(/[\r\n]+/, " ").gsub(/(&gt\;|\-\-)/, "")
30+
}.join
31+
32+
puts session
33+
session.save
34+
end
35+
end
36+
end
37+
end

config.ru

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
require 'bundler'
2+
Bundler.require
3+
4+
DB = Sequel.connect(ENV['DATABASE_URL'])
5+
6+
Rack::Mime::MIME_TYPES.merge!({
7+
".srt" => "text/plain",
8+
".vtt" => "text/vtt",
9+
})
10+
11+
use Rack::Static, urls: ["/css", "/images", "/js", "favicon.ico"], root: "public"
12+
use Rack::Gauges, tracker: ENV['GAUGES_TRACKER_ID'] if ENV['GAUGES_TRACKER_ID']
13+
14+
require './web'
15+
16+
run Web

data

Submodule data added at e501fb8

lib/migrations/001_base_schema.rb

+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
Sequel.migration do
2+
up do
3+
create_table :sessions do
4+
primary_key :id
5+
6+
varchar :title, empty: false
7+
text :description
8+
text :transcript
9+
text :markup
10+
integer :year, null: false
11+
integer :number, null: false
12+
varchar :track
13+
interval :duration
14+
end
15+
end
16+
17+
down do
18+
drop_table :sessions
19+
end
20+
end
+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
Sequel.migration do
2+
up do
3+
add_column :sessions, :tsv, 'TSVector'
4+
add_index :sessions, :tsv, type: "GIN"
5+
create_trigger :sessions, :tsv, :tsvector_update_trigger,
6+
args: [:tsv, :'pg_catalog.english', :transcript],
7+
events: [:insert, :update],
8+
each_row: true
9+
end
10+
11+
down do
12+
drop_column :sessions, :tsv
13+
drop_index :sessions, :tsv
14+
drop_trigger :sessions, :tsv
15+
end
16+
end

lib/models/session.rb

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
require 'ostruct'
2+
3+
class Session < Sequel::Model
4+
plugin :json_serializer, naked: true, except: [:id, :tsv]
5+
plugin :validation_helpers
6+
plugin :schema
7+
8+
def self.search(query)
9+
query = Session.db.literal(query.to_s + ":*")
10+
11+
Session.db[%{
12+
SELECT title, description, year, number,
13+
ts_rank_cd(
14+
(
15+
setweight(to_tsvector(title), 'A') ||
16+
setweight(to_tsvector(description), 'C') ||
17+
setweight(tsv, 'D')
18+
),
19+
plainto_tsquery('english', #{query})
20+
) AS rank,
21+
ts_headline(
22+
'pg_catalog.english', transcript, plainto_tsquery('english', #{query}),
23+
'ShortWord=0, MinWords=50, MaxWords=70'
24+
) AS excerpt
25+
FROM sessions
26+
WHERE tsv @@ plainto_tsquery('english', #{query})
27+
ORDER BY rank DESC
28+
}].collect{|result| OpenStruct.new(result)}
29+
end
30+
31+
def to_s
32+
"#{self.number} #{self.title}"
33+
end
34+
35+
def validate
36+
super
37+
38+
validates_presence [:title, :description, :year, :track, :transcript]
39+
validates_unique [:title, :year]
40+
validates_unique [:number, :year]
41+
end
42+
43+
def before_save
44+
super
45+
46+
html = ""
47+
48+
previous = nil
49+
self.transcript.split(/\.\s+/).each do |sentence|
50+
html << "<p>#{sentence.strip}.</p>" unless sentence == previous
51+
previous = sentence
52+
end
53+
54+
self.markup = html
55+
end
56+
end

public/config.rb

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
http_path = "/"
2+
css_dir = "css"
3+
sass_dir = "sass"
4+
images_dir = "images"
5+
javascripts_dir = "js"
6+
7+
output_style = :compressed
8+
line_comments = false
9+
preferred_syntax = :sass

public/css/screen.css

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

public/css/styles.css

+17
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

public/images/bg.png

2.17 KB
Loading

public/images/[email protected]

4.88 KB
Loading

public/images/wwdc-2013.png

27.1 KB
Loading

0 commit comments

Comments
 (0)