cosch 1.0.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/bin/cosch +3 -0
- data/lib/.sass-cache/6db5b649d55c02176445ff137b903182b0c690b5/style.sassc +0 -0
- data/lib/appcache_path_generator.rb +32 -0
- data/lib/asker.rb +9 -0
- data/lib/commands/build.rb +148 -0
- data/lib/commands/deploy_to_github_pages.rb +22 -0
- data/lib/commands/new.rb +18 -0
- data/lib/deploy_to_github_pages.rb +13 -0
- data/lib/location_data_generator.rb +43 -0
- data/lib/sass/style.sass +72 -0
- data/lib/schedule_generator.rb +63 -0
- data/lib/scripts/deploy_to_github_pages.sh +30 -0
- data/lib/template/schedule.yml +33 -0
- data/lib/template/static/CNAME_ +1 -0
- data/lib/template/static/style.css +68 -0
- data/lib/template/static/style.css.map +7 -0
- data/lib/template/views/_navigation.liquid +10 -0
- data/lib/template/views/cache.appcache +3 -0
- data/lib/template/views/day.html +28 -0
- data/lib/template/views/location.html +25 -0
- data/lib/template/views/wrapper.html +32 -0
- metadata +135 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 78c5f598170235eba9003d511397b95370587ead
|
4
|
+
data.tar.gz: 4f965bf7eb2a5939bc961b6cdae9cb67220ee406
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: aae6eb7e42bcf73d68bd886e80c3dcf19438b6a63b22acecc402f473cc050c7803c54e8ec49a0e2852d86afb7171c459bf90619f8d56fde33a36b751d3b328b5
|
7
|
+
data.tar.gz: 3143dd37e9de4d8aa749bafdca856f173edf6734dc8e16e29051893401df36a0b77a45122ae9e5eb04f38c7f5e27cee0d0bff3229a89f802ba7f1676e29c658e
|
data/bin/cosch
ADDED
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'digest'
|
2
|
+
|
3
|
+
class AppcachePathGenerator
|
4
|
+
|
5
|
+
def initialize source_dir
|
6
|
+
@source_dir = source_dir
|
7
|
+
end
|
8
|
+
|
9
|
+
def paths
|
10
|
+
resources = []
|
11
|
+
# cd into dir so glob does not contain first path part prefix in paths
|
12
|
+
# e.g. if dir is build/ glob would contain build/foo/bat, but we want foo/bat
|
13
|
+
Dir.chdir(@source_dir) do
|
14
|
+
resources = Dir["**/*"].reject { |i| File.directory? i }
|
15
|
+
end
|
16
|
+
resources.sort
|
17
|
+
end
|
18
|
+
|
19
|
+
# might be better placed elsewhere
|
20
|
+
def appcache_version
|
21
|
+
|
22
|
+
md5 = Digest::MD5.new
|
23
|
+
content = ''
|
24
|
+
|
25
|
+
paths.each do |file|
|
26
|
+
content << File.read(File.join(@source_dir, file))
|
27
|
+
end
|
28
|
+
|
29
|
+
md5.hexdigest content
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
data/lib/asker.rb
ADDED
@@ -0,0 +1,148 @@
|
|
1
|
+
require 'liquid'
|
2
|
+
require 'fileutils'
|
3
|
+
require 'yaml'
|
4
|
+
require_relative '../appcache_path_generator'
|
5
|
+
require_relative '../location_data_generator'
|
6
|
+
require 'find'
|
7
|
+
|
8
|
+
VIEW_PATH_ROOT = File.join('views')
|
9
|
+
|
10
|
+
module RapidSchedule
|
11
|
+
module Commands
|
12
|
+
class Build
|
13
|
+
def execute!
|
14
|
+
p 'Building site'
|
15
|
+
@config = YAML.load_file 'schedule.yml'
|
16
|
+
@days = days = @config["days"]
|
17
|
+
@location_data_generator = RapidSchedule::LocationDataGenerator.new(@days)
|
18
|
+
|
19
|
+
Liquid::Template.file_system = Liquid::LocalFileSystem.new(VIEW_PATH_ROOT)
|
20
|
+
|
21
|
+
|
22
|
+
@days = decorate_days_with_file_names(days)
|
23
|
+
|
24
|
+
FileUtils.mkdir_p('build/')
|
25
|
+
FileUtils.rm_rf(Dir.glob('build/*'))
|
26
|
+
|
27
|
+
|
28
|
+
@days.each do |day|
|
29
|
+
create_day_view_for_day(day, @location_data_generator.locations_for_day(day))
|
30
|
+
create_location_views_for_day(day)
|
31
|
+
end
|
32
|
+
|
33
|
+
copy_static_to_build
|
34
|
+
|
35
|
+
appcache_generator = AppcachePathGenerator.new 'build'
|
36
|
+
appcache_content = generate_appcache_content(appcache_generator.paths)
|
37
|
+
|
38
|
+
appcache_content << "#VERSION:" + appcache_generator.appcache_version + '#'
|
39
|
+
|
40
|
+
File.open('build/' + 'cache.appcache', 'w') { |file| file.write(appcache_content) }
|
41
|
+
end
|
42
|
+
|
43
|
+
private
|
44
|
+
|
45
|
+
def create_day_view_for_day(day, locations)
|
46
|
+
day_html = generate_day_html(day, locations)
|
47
|
+
write_with_wrapper_markup(day_html, 'build/' + day['file_name'] + '.html')
|
48
|
+
end
|
49
|
+
|
50
|
+
def create_location_views_for_day(day)
|
51
|
+
locations = @location_data_generator.locations_for_day(day)
|
52
|
+
|
53
|
+
locations.each do |location|
|
54
|
+
html = generate_location_html(location, @location_data_generator.talks_for_location_for_day(location, day), day)
|
55
|
+
write_with_wrapper_markup(html, generate_location_path_for_day(day, location))
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
|
60
|
+
def generate_location_html(location, talks, day)
|
61
|
+
html_path = File.join(VIEW_PATH_ROOT, 'location.html')
|
62
|
+
file_content = File.new(html_path).read
|
63
|
+
|
64
|
+
Liquid::Template.parse(file_content).render(
|
65
|
+
{
|
66
|
+
'day' => day,
|
67
|
+
'talks' => talks,
|
68
|
+
'days' => @days,
|
69
|
+
'title' => @config['title'],
|
70
|
+
'location' => location
|
71
|
+
})
|
72
|
+
end
|
73
|
+
|
74
|
+
def generate_location_path_for_day(day, location)
|
75
|
+
'build/' + day['file_name'] + '_' + sanitize_filename(location) + '.html'
|
76
|
+
end
|
77
|
+
|
78
|
+
# XXX file names not unique anymore! Could be overridden
|
79
|
+
def decorate_days_with_file_names(days)
|
80
|
+
days_decorated = days.map do |day|
|
81
|
+
index = days.index day
|
82
|
+
day['file_name'] = sanitize_filename(day["name"])
|
83
|
+
|
84
|
+
if index === 0
|
85
|
+
day['file_name'] = 'index'
|
86
|
+
end
|
87
|
+
|
88
|
+
# sanitize location paths
|
89
|
+
day['slots'].each do |slot|
|
90
|
+
slot['talks'].each do |talk|
|
91
|
+
talk['location_file_name'] = sanitize_filename(talk['location'])
|
92
|
+
end
|
93
|
+
end
|
94
|
+
|
95
|
+
day
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
def write_with_wrapper_markup(html, path)
|
100
|
+
wrapper_path = File.join(VIEW_PATH_ROOT, 'wrapper.html')
|
101
|
+
html = Liquid::Template.parse(File.new(wrapper_path).read).render('content' => html)
|
102
|
+
|
103
|
+
File.open(path, 'w') { |file| file.write(html) }
|
104
|
+
end
|
105
|
+
|
106
|
+
def generate_day_html(day, locations)
|
107
|
+
html_path = File.join(VIEW_PATH_ROOT, 'day.html')
|
108
|
+
file_content = File.new(html_path).read
|
109
|
+
|
110
|
+
Liquid::Template.parse(file_content).render(
|
111
|
+
{
|
112
|
+
'day' => day,
|
113
|
+
'days' => @days,
|
114
|
+
'active_name' => day['name'],
|
115
|
+
'title' => @config['title']
|
116
|
+
})
|
117
|
+
end
|
118
|
+
|
119
|
+
def generate_appcache_content(paths)
|
120
|
+
Liquid::Template.parse(File.new(File.join(VIEW_PATH_ROOT, 'cache.appcache')).read).render 'resources' => paths
|
121
|
+
end
|
122
|
+
|
123
|
+
def copy_static_to_build
|
124
|
+
static_folder_path = 'static'
|
125
|
+
|
126
|
+
return unless Dir.exist? static_folder_path
|
127
|
+
|
128
|
+
FileUtils.cp_r(Dir[static_folder_path + '/*'], 'build')
|
129
|
+
end
|
130
|
+
|
131
|
+
def sanitize_filename(filename)
|
132
|
+
# Split the name when finding a period which is preceded by some
|
133
|
+
# character, and is followed by some character other than a period,
|
134
|
+
# if there is no following period that is followed by something
|
135
|
+
# other than a period (yeah, confusing, I know)
|
136
|
+
fn = filename.split /(?<=.)\.(?=[^.])(?!.*\.[^.])/m
|
137
|
+
|
138
|
+
# We now have one or two parts (depending on whether we could find
|
139
|
+
# a suitable period). For each of these parts, replace any unwanted
|
140
|
+
# sequence of characters with an underscore
|
141
|
+
fn.map! { |s| s.gsub /[^a-z0-9\-]+/i, '_' }
|
142
|
+
|
143
|
+
# Finally, join the parts with a period and return the result
|
144
|
+
return fn.join '.'
|
145
|
+
end
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require_relative '../deploy_to_github_pages'
|
2
|
+
require_relative '../asker'
|
3
|
+
|
4
|
+
module RapidSchedule
|
5
|
+
module Commands
|
6
|
+
class DeployToGithubPages
|
7
|
+
def execute!(options = {})
|
8
|
+
gh_remote_url = options["remote"]
|
9
|
+
|
10
|
+
unless gh_remote_url
|
11
|
+
gh_remote_url = RapidSchedule::DeployToGithubPages.retrieve_remote_url
|
12
|
+
end
|
13
|
+
|
14
|
+
ok = RapidSchedule::Asker.confirm? "Will push to: #{gh_remote_url} gh-pages branch"
|
15
|
+
|
16
|
+
if ok
|
17
|
+
RapidSchedule::DeployToGithubPages.deploy gh_remote_url
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
data/lib/commands/new.rb
ADDED
@@ -0,0 +1,18 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
module RapidSchedule
|
4
|
+
module Commands
|
5
|
+
class New
|
6
|
+
def execute!(args, options = {})
|
7
|
+
template_path = File.expand_path(File.join(__FILE__, '..', '..', 'template'))
|
8
|
+
|
9
|
+
raise ArgumentError.new("You need to provide a PATH") if args.empty?
|
10
|
+
|
11
|
+
destination = File.expand_path(args.join(" "), Dir.pwd)
|
12
|
+
|
13
|
+
FileUtils.mkdir_p(destination)
|
14
|
+
FileUtils.cp_r(Dir[File.join(template_path, '*')], destination)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,13 @@
|
|
1
|
+
module RapidSchedule
|
2
|
+
class DeployToGithubPages
|
3
|
+
def self.deploy(remote_url)
|
4
|
+
script_path = File.join(File.dirname(__FILE__), 'scripts', 'deploy_to_github_pages.sh')
|
5
|
+
system(script_path, remote_url)
|
6
|
+
end
|
7
|
+
|
8
|
+
# xxx handle no git rep
|
9
|
+
def self.retrieve_remote_url
|
10
|
+
`git remote show -n origin | grep 'Push' | awk '{print $NF}'`.strip
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module RapidSchedule
|
2
|
+
class LocationDataGenerator
|
3
|
+
def initialize(days)
|
4
|
+
@days = days
|
5
|
+
end
|
6
|
+
|
7
|
+
def talks_for_location_for_day(location, day)
|
8
|
+
day = day_by_name(day["name"])
|
9
|
+
talks_at_location = []
|
10
|
+
|
11
|
+
day['slots'].each do |slot|
|
12
|
+
slot['talks'].each do |talk|
|
13
|
+
if talk["location"] === location
|
14
|
+
talk["start"] = slot["start"]
|
15
|
+
talk["end"] = slot["end"]
|
16
|
+
|
17
|
+
talks_at_location << talk
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
talks_at_location
|
23
|
+
end
|
24
|
+
|
25
|
+
def locations_for_day(day)
|
26
|
+
day = day_by_name(day["name"])
|
27
|
+
locations = []
|
28
|
+
|
29
|
+
day['slots'].each do |slot|
|
30
|
+
slot['talks'].each do |talk|
|
31
|
+
locations << talk['location'] unless locations.include?(talk['location'])
|
32
|
+
end
|
33
|
+
end
|
34
|
+
locations
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def day_by_name(name)
|
40
|
+
@days.each { |day| return day if name === day["name"] }
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
data/lib/sass/style.sass
ADDED
@@ -0,0 +1,72 @@
|
|
1
|
+
body
|
2
|
+
font-size: 16px
|
3
|
+
font-family: Helvetica Neue
|
4
|
+
margin: 0
|
5
|
+
padding: 0
|
6
|
+
|
7
|
+
.content
|
8
|
+
width: 95%
|
9
|
+
margin: 10px auto
|
10
|
+
|
11
|
+
body *
|
12
|
+
box-sizing: border-box
|
13
|
+
|
14
|
+
.slot-container
|
15
|
+
margin-bottom: 30px
|
16
|
+
margin-right: -5px
|
17
|
+
|
18
|
+
.talks-container
|
19
|
+
display: -webkit-flex
|
20
|
+
display: flex
|
21
|
+
|
22
|
+
width: 100%
|
23
|
+
|
24
|
+
-webkit-flex-wrap: wrap
|
25
|
+
-ms-flex-wrap: wrap
|
26
|
+
flex-wrap: wrap
|
27
|
+
|
28
|
+
.talk-footer
|
29
|
+
font-size: 0.75em
|
30
|
+
position: absolute
|
31
|
+
bottom: 0
|
32
|
+
height: 30px
|
33
|
+
|
34
|
+
.talk-speaker, .talk-location
|
35
|
+
min-height: 1em
|
36
|
+
|
37
|
+
.talk-title
|
38
|
+
padding-bottom: 30px
|
39
|
+
|
40
|
+
.talk-container
|
41
|
+
|
42
|
+
-webkit-flex-grow: 1
|
43
|
+
-webkit-flex-shrink: 1
|
44
|
+
|
45
|
+
-ms-flex-grow: 1
|
46
|
+
-ms-flex-shrink: 1
|
47
|
+
|
48
|
+
flex-grow: 1
|
49
|
+
flex-shrink: 1
|
50
|
+
|
51
|
+
min-width: 200px
|
52
|
+
width: 200px
|
53
|
+
padding: 10px
|
54
|
+
border: 1px solid #e5e5e5
|
55
|
+
border-radius: 2px
|
56
|
+
background-color: #fff
|
57
|
+
margin: 5px
|
58
|
+
margin-left: 0px
|
59
|
+
box-shadow: 0px 3px rgba(0, 0, 0, 0.1)
|
60
|
+
min-height: 100px
|
61
|
+
position: relative
|
62
|
+
|
63
|
+
nav ul
|
64
|
+
padding: 0
|
65
|
+
|
66
|
+
nav ul li
|
67
|
+
list-style-type: none
|
68
|
+
display: inline-block
|
69
|
+
&.active
|
70
|
+
font-weight: bold
|
71
|
+
|
72
|
+
/*# sourceMappingURL=style.css.map
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require_relative 'commands/build'
|
2
|
+
require_relative 'commands/deploy_to_github_pages'
|
3
|
+
require_relative 'commands/new'
|
4
|
+
require 'mercenary'
|
5
|
+
|
6
|
+
module RapidSchedule
|
7
|
+
|
8
|
+
class ScheduleGenerator
|
9
|
+
def initialize(argv, stdin=STDIN, stdout=STDOUT, stderr=STDERR, kernel=Kernel)
|
10
|
+
@argv, @stdin, @stdout, @stderr, @kernel = argv, stdin, stdout, stderr, kernel
|
11
|
+
end
|
12
|
+
|
13
|
+
def execute!
|
14
|
+
Mercenary.program(:cosch) do |p|
|
15
|
+
p.version '1.0.1'
|
16
|
+
p.description 'Generate your conference schedule easily'
|
17
|
+
p.syntax "cosch <subcommand>"
|
18
|
+
|
19
|
+
# blatantly stolen from jekyll XXX needs tests
|
20
|
+
p.action do |args|
|
21
|
+
if args.empty?
|
22
|
+
puts p
|
23
|
+
else
|
24
|
+
unless p.has_command?(args.first)
|
25
|
+
raise ArgumentError.new("Invalid command. Use --help for more information")
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
p.command(:build) do |c|
|
31
|
+
c.syntax "build"
|
32
|
+
c.description "builds the static site"
|
33
|
+
|
34
|
+
c.action do |args, options|
|
35
|
+
RapidSchedule::Commands::Build.new.execute!
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
p.command(:deploy) do |c|
|
40
|
+
c.syntax "deploy"
|
41
|
+
c.description "deploys site to Github pages."
|
42
|
+
c.option 'remote', '--remote [REMOTE_URL]', 'Set the git remote url where gh-pages branch is pushed to.'
|
43
|
+
|
44
|
+
c.action do |args, options|
|
45
|
+
RapidSchedule::Commands::DeployToGithubPages.new.execute! options
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
p.command(:new) do |c|
|
50
|
+
c.syntax "new PATH"
|
51
|
+
c.description "creates a new schedule skeleton at PATH."
|
52
|
+
|
53
|
+
c.action do |args, options|
|
54
|
+
RapidSchedule::Commands::New.new.execute! args, options
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
end
|
59
|
+
@kernel.exit 0
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
#!/bin/bash -e
|
2
|
+
echo "Going to deploy the joy. Buckle up."
|
3
|
+
|
4
|
+
GIT_REMOTE_URL=$1
|
5
|
+
|
6
|
+
# thanks http://stackoverflow.com/questions/59895/can-a-bash-script-tell-what-directory-its-stored-in
|
7
|
+
DIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
|
8
|
+
|
9
|
+
if [ -z "$GIT_REMOTE_URL" ]; then
|
10
|
+
echo "Missing git remote url. Aborting"
|
11
|
+
exit 1
|
12
|
+
fi
|
13
|
+
|
14
|
+
|
15
|
+
# xxx there must be a better way
|
16
|
+
# why isn't even possible to call the script with ../../ in the first place?
|
17
|
+
ABSOLUTE_SCRIPT_PATH=$(cd "$DIR/../../bin/" && pwd)
|
18
|
+
|
19
|
+
"$ABSOLUTE_SCRIPT_PATH/cosch.rb" build
|
20
|
+
|
21
|
+
cd build
|
22
|
+
rm -rf .git
|
23
|
+
git init
|
24
|
+
git add .
|
25
|
+
git commit -m 'Deployment'
|
26
|
+
git push "$GIT_REMOTE_URL" master:gh-pages --force
|
27
|
+
rm -rf .git
|
28
|
+
|
29
|
+
echo "Deployment done"
|
30
|
+
|
@@ -0,0 +1,33 @@
|
|
1
|
+
title: My awesome conference
|
2
|
+
days:
|
3
|
+
- name: Saturday
|
4
|
+
slots:
|
5
|
+
- start: '12:00'
|
6
|
+
end: '13:00'
|
7
|
+
|
8
|
+
talks:
|
9
|
+
- speaker: Robin Drexler
|
10
|
+
title: How Geloet will save us all
|
11
|
+
location: H1
|
12
|
+
|
13
|
+
- speaker: Katrin Werner
|
14
|
+
title: Geloet is jsut not worth it
|
15
|
+
location: H2
|
16
|
+
|
17
|
+
- start: '12:00'
|
18
|
+
end: '13:00'
|
19
|
+
|
20
|
+
talks:
|
21
|
+
- speaker: Peter
|
22
|
+
title: Wurst is good
|
23
|
+
location: H1
|
24
|
+
|
25
|
+
- name: Sunday
|
26
|
+
slots:
|
27
|
+
- start: '15:00'
|
28
|
+
end: '16:00'
|
29
|
+
|
30
|
+
talks:
|
31
|
+
- speaker: Robin Drexler
|
32
|
+
title: How Geloet will save us all pt 2
|
33
|
+
location: H1
|
@@ -0,0 +1 @@
|
|
1
|
+
awesomeconf.example.org
|
@@ -0,0 +1,68 @@
|
|
1
|
+
body {
|
2
|
+
font-size: 16px;
|
3
|
+
font-family: Helvetica Neue;
|
4
|
+
margin: 0;
|
5
|
+
padding: 0; }
|
6
|
+
|
7
|
+
.content {
|
8
|
+
width: 95%;
|
9
|
+
margin: 10px auto; }
|
10
|
+
|
11
|
+
body * {
|
12
|
+
box-sizing: border-box; }
|
13
|
+
|
14
|
+
.slot-container {
|
15
|
+
margin-bottom: 30px;
|
16
|
+
margin-right: -5px; }
|
17
|
+
|
18
|
+
.talks-container {
|
19
|
+
display: -webkit-flex;
|
20
|
+
display: flex;
|
21
|
+
width: 100%;
|
22
|
+
-webkit-flex-wrap: wrap;
|
23
|
+
-ms-flex-wrap: wrap;
|
24
|
+
flex-wrap: wrap; }
|
25
|
+
|
26
|
+
.talk-footer {
|
27
|
+
font-size: 0.75em;
|
28
|
+
position: absolute;
|
29
|
+
bottom: 0;
|
30
|
+
height: 30px; }
|
31
|
+
|
32
|
+
.talk-speaker, .talk-location {
|
33
|
+
min-height: 1em; }
|
34
|
+
|
35
|
+
.talk-title {
|
36
|
+
padding-bottom: 30px; }
|
37
|
+
|
38
|
+
.talk-container {
|
39
|
+
-webkit-flex-grow: 1;
|
40
|
+
-webkit-flex-shrink: 1;
|
41
|
+
-ms-flex-grow: 1;
|
42
|
+
-ms-flex-shrink: 1;
|
43
|
+
flex-grow: 1;
|
44
|
+
flex-shrink: 1;
|
45
|
+
min-width: 200px;
|
46
|
+
width: 200px;
|
47
|
+
padding: 10px;
|
48
|
+
border: 1px solid #e5e5e5;
|
49
|
+
border-radius: 2px;
|
50
|
+
background-color: #fff;
|
51
|
+
margin: 5px;
|
52
|
+
margin-left: 0px;
|
53
|
+
box-shadow: 0px 3px rgba(0, 0, 0, 0.1);
|
54
|
+
min-height: 100px;
|
55
|
+
position: relative; }
|
56
|
+
|
57
|
+
nav ul {
|
58
|
+
padding: 0; }
|
59
|
+
|
60
|
+
nav ul li {
|
61
|
+
list-style-type: none;
|
62
|
+
display: inline-block; }
|
63
|
+
nav ul li.active {
|
64
|
+
font-weight: bold; }
|
65
|
+
|
66
|
+
/*# sourceMappingURL=style.css.map */
|
67
|
+
|
68
|
+
/*# sourceMappingURL=style.css.map */
|
@@ -0,0 +1,7 @@
|
|
1
|
+
{
|
2
|
+
"version": 3,
|
3
|
+
"mappings": "AAAA,IAAI;EACA,SAAS,EAAE,IAAI;EACf,WAAW,EAAE,cAAc;EAC3B,MAAM,EAAE,CAAC;EACT,OAAO,EAAE,CAAC;;AAEd,QAAQ;EACJ,KAAK,EAAE,GAAG;EACV,MAAM,EAAE,SAAS;;AAErB,MAAM;EACF,UAAU,EAAE,UAAU;;AAE1B,eAAe;EACX,aAAa,EAAE,IAAI;EACnB,YAAY,EAAE,IAAI;;AAEtB,gBAAgB;EACZ,OAAO,EAAE,YAAY;EACrB,OAAO,EAAE,IAAI;EAEb,KAAK,EAAE,IAAI;EAEX,iBAAiB,EAAE,IAAI;EACvB,aAAa,EAAE,IAAI;EACnB,SAAS,EAAE,IAAI;;AAEnB,YAAY;EACR,SAAS,EAAE,MAAM;EACjB,QAAQ,EAAE,QAAQ;EAClB,MAAM,EAAE,CAAC;EACT,MAAM,EAAE,IAAI;;AAEhB,6BAA6B;EACzB,UAAU,EAAE,GAAG;;AAEnB,WAAW;EACP,cAAc,EAAE,IAAI;;AAExB,eAAe;EAEX,iBAAiB,EAAE,CAAC;EACpB,mBAAmB,EAAE,CAAC;EAEtB,aAAa,EAAE,CAAC;EAChB,eAAe,EAAE,CAAC;EAElB,SAAS,EAAE,CAAC;EACZ,WAAW,EAAE,CAAC;EAEd,SAAS,EAAE,KAAK;EAChB,KAAK,EAAE,KAAK;EACZ,OAAO,EAAE,IAAI;EACb,MAAM,EAAE,iBAAiB;EACzB,aAAa,EAAE,GAAG;EAClB,gBAAgB,EAAE,IAAI;EACtB,MAAM,EAAE,GAAG;EACX,WAAW,EAAE,GAAG;EAChB,UAAU,EAAE,0BAA0B;EACtC,UAAU,EAAE,KAAK;EACjB,QAAQ,EAAE,QAAQ;;AAEtB,MAAM;EACF,OAAO,EAAE,CAAC;;AAEd,SAAS;EACL,eAAe,EAAE,IAAI;EACrB,OAAO,EAAE,YAAY;EACrB,gBAAQ;IACJ,WAAW,EAAE,IAAI",
|
4
|
+
"sources": ["../../sass/style.sass"],
|
5
|
+
"names": [],
|
6
|
+
"file": "style.css"
|
7
|
+
}
|
@@ -0,0 +1,28 @@
|
|
1
|
+
<header>
|
2
|
+
<h1>{{ title }}</h1>
|
3
|
+
</header>
|
4
|
+
|
5
|
+
|
6
|
+
{% include 'navigation'%}
|
7
|
+
|
8
|
+
<h2>{{day.name}}</h2>
|
9
|
+
|
10
|
+
{% for slot in day.slots %}
|
11
|
+
<div class="slot-container">
|
12
|
+
<span class="slot-time-start">{{ slot.start }}</span> -
|
13
|
+
<span class="slot-time-end">{{ slot.end }}</span>
|
14
|
+
|
15
|
+
<div class="talks-container">
|
16
|
+
{% for talk in slot.talks %}
|
17
|
+
<div class="talk-container">
|
18
|
+
<div class="talk-title">{{ talk.title }}</div>
|
19
|
+
<div class="talk-footer">
|
20
|
+
<div class="talk-speaker">{{ talk.speaker }}</div>
|
21
|
+
<div class="talk-location"><a href="{{day.file_name}}_{{talk.location_file_name}}.html">{{ talk.location }}</a></div>
|
22
|
+
<div style="clear: both;"></div>
|
23
|
+
</div>
|
24
|
+
</div>
|
25
|
+
{% endfor %}
|
26
|
+
</div>
|
27
|
+
</div>
|
28
|
+
{% endfor %}
|
@@ -0,0 +1,25 @@
|
|
1
|
+
<header>
|
2
|
+
<h1>{{ title }}</h1>
|
3
|
+
</header>
|
4
|
+
|
5
|
+
<a href="index.html">Home</a>
|
6
|
+
|
7
|
+
<h2>{{location}} - {{day.name}}</h2>
|
8
|
+
|
9
|
+
{% for talk in talks%}
|
10
|
+
<div class="slot-container">
|
11
|
+
<span class="slot-time-start">{{ talk.start }}</span> -
|
12
|
+
<span class="slot-time-end">{{ talk.end }}</span>
|
13
|
+
|
14
|
+
<div class="talks-container">
|
15
|
+
<div class="talk-container">
|
16
|
+
<div class="talk-title">{{ talk.title }}</div>
|
17
|
+
<div class="talk-footer">
|
18
|
+
<div class="talk-speaker">{{ talk.speaker }}</div>
|
19
|
+
<div class="talk-location">{{ talk.location }}</div>
|
20
|
+
<div style="clear: both;"></div>
|
21
|
+
</div>
|
22
|
+
</div>
|
23
|
+
</div>
|
24
|
+
</div>
|
25
|
+
{% endfor %}
|
@@ -0,0 +1,32 @@
|
|
1
|
+
<html manifest="cache.appcache">
|
2
|
+
<head>
|
3
|
+
<link rel="stylesheet" href="style.css"/>
|
4
|
+
<meta name="viewport" content="width=device-width, initial-scale=1">
|
5
|
+
</head>
|
6
|
+
|
7
|
+
<body>
|
8
|
+
<div class="content">
|
9
|
+
{{ content }}
|
10
|
+
</div>
|
11
|
+
|
12
|
+
<script type="application/javascript">
|
13
|
+
(function () {
|
14
|
+
if (!window.applicationCache) {
|
15
|
+
return;
|
16
|
+
}
|
17
|
+
window.addEventListener('load', function (e) {
|
18
|
+
window.applicationCache.addEventListener('updateready', function (e) {
|
19
|
+
if (window.applicationCache.status == window.applicationCache.UPDATEREADY) {
|
20
|
+
if (confirm('Schedule has updated. Want to reload?')) {
|
21
|
+
window.location.reload();
|
22
|
+
}
|
23
|
+
}
|
24
|
+
}, false);
|
25
|
+
|
26
|
+
}, false);
|
27
|
+
})();
|
28
|
+
|
29
|
+
</script>
|
30
|
+
</body>
|
31
|
+
|
32
|
+
</html>
|
metadata
ADDED
@@ -0,0 +1,135 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: cosch
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.1
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Robin Drexler
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2014-10-10 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: liquid
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ~>
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 2.6.1
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ~>
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 2.6.1
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: mercenary
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ~>
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.3.4
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ~>
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.3.4
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: sass
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ~>
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: 3.4.4
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ~>
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: 3.4.4
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rspec
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 3.1.0
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ~>
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 3.1.0
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: nokogiri
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ~>
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 1.6.3.1
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ~>
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 1.6.3.1
|
83
|
+
description: 'See: https://github.com/robin-drexler/cosch'
|
84
|
+
email: drexler.robin@gmail.com
|
85
|
+
executables:
|
86
|
+
- cosch
|
87
|
+
extensions: []
|
88
|
+
extra_rdoc_files: []
|
89
|
+
files:
|
90
|
+
- bin/cosch
|
91
|
+
- lib/.sass-cache/6db5b649d55c02176445ff137b903182b0c690b5/style.sassc
|
92
|
+
- lib/appcache_path_generator.rb
|
93
|
+
- lib/asker.rb
|
94
|
+
- lib/commands/build.rb
|
95
|
+
- lib/commands/deploy_to_github_pages.rb
|
96
|
+
- lib/commands/new.rb
|
97
|
+
- lib/deploy_to_github_pages.rb
|
98
|
+
- lib/location_data_generator.rb
|
99
|
+
- lib/sass/style.sass
|
100
|
+
- lib/schedule_generator.rb
|
101
|
+
- lib/scripts/deploy_to_github_pages.sh
|
102
|
+
- lib/template/schedule.yml
|
103
|
+
- lib/template/static/CNAME_
|
104
|
+
- lib/template/static/style.css
|
105
|
+
- lib/template/static/style.css.map
|
106
|
+
- lib/template/views/_navigation.liquid
|
107
|
+
- lib/template/views/cache.appcache
|
108
|
+
- lib/template/views/day.html
|
109
|
+
- lib/template/views/location.html
|
110
|
+
- lib/template/views/wrapper.html
|
111
|
+
homepage:
|
112
|
+
licenses:
|
113
|
+
- MIT
|
114
|
+
metadata: {}
|
115
|
+
post_install_message:
|
116
|
+
rdoc_options: []
|
117
|
+
require_paths:
|
118
|
+
- lib
|
119
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
120
|
+
requirements:
|
121
|
+
- - '>='
|
122
|
+
- !ruby/object:Gem::Version
|
123
|
+
version: '0'
|
124
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
125
|
+
requirements:
|
126
|
+
- - '>='
|
127
|
+
- !ruby/object:Gem::Version
|
128
|
+
version: '0'
|
129
|
+
requirements: []
|
130
|
+
rubyforge_project:
|
131
|
+
rubygems_version: 2.0.3
|
132
|
+
signing_key:
|
133
|
+
specification_version: 4
|
134
|
+
summary: Generate your conference schedule easily
|
135
|
+
test_files: []
|