coursegen 0.8.3 → 0.9.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/pr.yml +19 -0
- data/.gitignore +3 -0
- data/Gemfile.lock +60 -35
- data/README.md +285 -69
- data/Rakefile +10 -1
- data/coursegen.gemspec +26 -26
- data/lib/coursegen.rb +5 -2
- data/lib/coursegen/cli.rb +49 -14
- data/lib/coursegen/course/data/citem.rb +10 -1
- data/lib/coursegen/course/data/data_adaptor.rb +16 -6
- data/lib/coursegen/course/data/section.rb +1 -1
- data/lib/coursegen/course/helpers/bootstrap_markup.rb +15 -15
- data/lib/coursegen/course/helpers/content_helpers.rb +86 -71
- data/lib/coursegen/course/helpers/formatting_helpers.rb +6 -10
- data/lib/coursegen/course/helpers/ical_feed_helpers.rb +2 -1
- data/lib/coursegen/course/helpers/lecture_helpers.rb +3 -2
- data/lib/coursegen/course/helpers/list_of.rb +40 -20
- data/lib/coursegen/course/helpers/list_of_helpers.rb +20 -14
- data/lib/coursegen/course/helpers/logging_helpers.rb +13 -12
- data/lib/coursegen/course/helpers/navigation_helpers.rb +62 -23
- data/lib/coursegen/course/helpers/sidebar_helpers.rb +19 -18
- data/lib/coursegen/course/helpers/table_helpers.rb +5 -4
- data/lib/coursegen/course/schedule/scheduler.rb +52 -19
- data/lib/coursegen/templates.rb +30 -23
- data/lib/coursegen/version.rb +3 -1
- data/spec/lectures_spec.rb +60 -50
- data/spec/play_spec.rb +24 -12
- data/spec/scheduler_spec.rb +87 -27
- data/tech_debt.md +5 -0
- data/templates/Rules +14 -19
- data/templates/cg_config.rb +105 -21
- data/templates/content/bootstrap/css/custom.css +87 -151
- data/templates/content/bootstrap/css/full-width-pics.css +8 -64
- data/templates/content/bootstrap/css/postit.css +7 -0
- data/templates/content/bootstrap/css/toasty.css +3 -0
- data/templates/content/content/index.md.erb +1 -1
- data/templates/content/content/intro/course_toc.md.erb +0 -1
- data/templates/content/content/intro/welcome.md.erb +1 -3
- data/templates/content/content/lectures/part1/02_here_we_go.md.erb +22 -1
- data/templates/content/content/lectures/part2/01_start_part2.md.erb +2 -1
- data/templates/content/content/lectures/part2/02_continue_part2.md.erb +3 -2
- data/templates/layouts/banner.html.erb +4 -4
- data/templates/layouts/body_footer.html +3 -4
- data/templates/layouts/body_header.html.erb +25 -7
- data/templates/layouts/bottom_includes.html.erb +21 -10
- data/templates/layouts/course.html.erb +7 -21
- data/templates/layouts/helpful_box.html +1 -1
- data/templates/layouts/nav-menus.html.erb +16 -36
- data/templates/layouts/sidebar.html.erb +9 -8
- data/templates/layouts/slides.html.erb +69 -0
- data/templates/layouts/top_includes.html.erb +24 -23
- metadata +32 -24
- data/.DS_Store +0 -0
- data/.vscode/settings.json +0 -2
- data/templates/.DS_Store +0 -0
- data/templates/Guardfile +0 -9
- data/templates/content/bootstrap/css/tipuesearch.css +0 -163
- data/templates/content/bootstrap/js/tipuesearch.js +0 -379
- data/templates/content/bootstrap/js/tipuesearch.min.js +0 -12
- data/templates/content/bootstrap/js/tipuesearch_content.js +0 -13
- data/templates/content/bootstrap/js/tipuesearch_set.js +0 -23
- data/templates/layouts/main_navbar.html.erb +0 -21
data/tech_debt.md
CHANGED
@@ -6,5 +6,10 @@
|
|
6
6
|
* Make the way mocks are built in specs more consitent
|
7
7
|
* A way to have a nested section which is not an 'event' based section
|
8
8
|
* Clean up the placement of the .js files for the search stuff. It's a bit messy
|
9
|
+
* Add more tests
|
9
10
|
|
10
11
|
### Features
|
12
|
+
|
13
|
+
* generate pdf
|
14
|
+
* more elaborate sample course in cg itself
|
15
|
+
* document the different macros
|
data/templates/Rules
CHANGED
@@ -20,10 +20,6 @@ compile '/content/scripts/**/*' do
|
|
20
20
|
nil
|
21
21
|
end
|
22
22
|
|
23
|
-
compile "/content/tipuesearch/tipuesearch_content.js.erb" do
|
24
|
-
filter :erb
|
25
|
-
end
|
26
|
-
|
27
23
|
compile '/**/*.ical.erb' do
|
28
24
|
filter :erb
|
29
25
|
end
|
@@ -38,6 +34,16 @@ compile '/**/*.{md,ical}.erb' do
|
|
38
34
|
end
|
39
35
|
end
|
40
36
|
|
37
|
+
compile '/**/*.md.erb', rep: :slides do
|
38
|
+
if item[:status] != "hidden"
|
39
|
+
filter :erb
|
40
|
+
layout '/slides.*'
|
41
|
+
write item.identifier.without_ext + '/slides.html'
|
42
|
+
else
|
43
|
+
nil
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
41
47
|
compile '/**/*' do
|
42
48
|
if item.binary? || item[:status] == "hidden"
|
43
49
|
nil
|
@@ -48,31 +54,20 @@ route '/bootstrap/**/*' do
|
|
48
54
|
@item.identifier.to_s
|
49
55
|
end
|
50
56
|
|
51
|
-
route '/tipuesearch/**/*' do
|
52
|
-
@item.identifier.to_s
|
53
|
-
end
|
54
|
-
|
55
|
-
route "/content/tipuesearch/tipuesearch_content.*" do
|
56
|
-
'/tipuesearch/tipuesearch_content.js'
|
57
|
-
end
|
58
|
-
|
59
|
-
# Output the search page
|
60
|
-
route '/tipuesearch/search.md.erb' do
|
61
|
-
'/tipuesearch/search/index.html'
|
62
|
-
end
|
63
|
-
|
64
57
|
# Select which .md.erb becomes the home page of the site
|
65
58
|
route HOME_PAGE do
|
66
59
|
'/index.html'
|
67
60
|
end
|
68
61
|
|
62
|
+
route HOME_PAGE, rep: :slides do
|
63
|
+
'/slides.html'
|
64
|
+
end
|
65
|
+
|
69
66
|
route '/**/*' do
|
70
67
|
if item[:extension].nil?
|
71
68
|
raise RuntimeError, "Missing required extension: \".#{item.identifier}\""
|
72
69
|
elsif item.binary?
|
73
70
|
item.identifier.to_s
|
74
|
-
elsif item.identifier == "/searchtipuesearch_content/"
|
75
|
-
item.identifier.chop + '.' + item[:extension] rescue fail "in route * in Rules"
|
76
71
|
elsif item[:status] == "hidden"
|
77
72
|
nil
|
78
73
|
elsif item[:type] == "subsection"
|
data/templates/cg_config.rb
CHANGED
@@ -1,30 +1,114 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Coursegen configuration file.
|
4
|
+
#
|
5
|
+
# Note that in order to read the configuration file, this file must be at the
|
6
|
+
# root of the course directory.
|
1
7
|
require 'coursegen'
|
2
8
|
|
3
|
-
#
|
4
|
-
|
9
|
+
# AUTHOR
|
10
|
+
AUTHOR_NAME = 'yourname'
|
11
|
+
AUTHOR_EMAIL = 'yourname'
|
12
|
+
COPYRIGHT_STRING = "Copyright (2013-#{Time.now.year}) #{AUTHOR_NAME}, #{AUTHOR_EMAIL}"
|
13
|
+
|
14
|
+
# Bucket Deployment of the course
|
15
|
+
AWS_BUCKET = "yourbucketname"
|
16
|
+
|
17
|
+
# COURSE
|
18
|
+
COURSE_SHORT_NAME = 'cool'
|
19
|
+
COURSE_LONG_NAME = 'Cool Course'
|
20
|
+
COURSE_ABBREV = 'CC'
|
5
21
|
|
6
|
-
#
|
7
|
-
|
8
|
-
|
9
|
-
|
22
|
+
# Lectures_schedule defines the schedule of lectures.
|
23
|
+
#
|
24
|
+
# This is primarily used to 1) figure out the time and date of each class,
|
25
|
+
# and 2) figure out the ordering of classes on the sidebar.
|
10
26
|
|
11
27
|
LECTURES_SCHEDULE_CONFIG = ScheduleDef.new(
|
12
|
-
first_day: "
|
13
|
-
weekdays: [:
|
14
|
-
start_times: ["15:30", "
|
15
|
-
end_times: ["16:50", "16:
|
16
|
-
number:
|
28
|
+
first_day: "jul-20-2020",
|
29
|
+
weekdays: [:monday,],
|
30
|
+
start_times: ["15:30", "15:30"],
|
31
|
+
end_times: ["16:50", "16:50"],
|
32
|
+
number: 28,
|
33
|
+
skips: [],
|
17
34
|
start_time: "15:30",
|
18
|
-
end_time: "16:50"
|
19
|
-
|
35
|
+
end_time: "16:50"
|
36
|
+
)
|
20
37
|
|
21
|
-
#
|
38
|
+
# Section_config defines the structure of the course.
|
39
|
+
#
|
40
|
+
# Each section is defined by
|
41
|
+
# title name of the section
|
42
|
+
# selector directory of the section (under /content)
|
43
|
+
# type type of the section (:section or :lecture)
|
44
|
+
# schedule schedule of the lecture (only needed for :lecture)
|
45
|
+
#
|
46
|
+
# Additionally, you can choose to hide the section on the sidebar by setting
|
47
|
+
# hidden: true.
|
22
48
|
SECTION_CONFIG = [
|
23
|
-
SectionDef.new("Intro", "intro", type: :section),
|
24
|
-
SectionDef.new("Lectures", "lectures",
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
49
|
+
SectionDef.new("Intro", "intro", type: :section, collapsed: false, bullet: :star),
|
50
|
+
SectionDef.new("Lectures", "lectures",
|
51
|
+
type: :lecture, schedule: LECTURES_SCHEDULE_CONFIG, bullet: :dash),
|
52
|
+
SectionDef.new("Homework", "homework", hidden: true, type: :section),
|
53
|
+
].freeze
|
54
|
+
|
55
|
+
# SITE
|
56
|
+
#
|
57
|
+
# The URL of the deployed site.
|
58
|
+
# Please include any http or https prefix.
|
59
|
+
SITE_URL = "http://coolcourse.s3-website-us-east-1.amazonaws.com"
|
60
|
+
|
61
|
+
# Home_page sets the home page of the site.
|
62
|
+
# This is usually /content/index.md.erb.
|
63
|
+
#
|
64
|
+
# Note: the .erb suffix is required when setting the HOME_PAGE path.
|
65
|
+
HOME_PAGE = "/content/intro/welcome.md.erb"
|
66
|
+
|
67
|
+
# Menulinks defines the links on the navigation bar.
|
68
|
+
# They are formatted as "Name" - "URL" pair.
|
69
|
+
#
|
70
|
+
# Examples:
|
71
|
+
# %w[HOME /content/index.md]
|
72
|
+
# %w[TOC /content/course_toc.md]
|
73
|
+
MENULINKS = [%w[lectures /content/intro/welcome.md/]].freeze
|
74
|
+
|
75
|
+
# Helpful_box provides a feedback box on the sidebar.
|
76
|
+
#
|
77
|
+
# DO NOT USE. This is currently not functional.
|
30
78
|
HELPFUL_BOX = false
|
79
|
+
|
80
|
+
# STYLING
|
81
|
+
#
|
82
|
+
# Options:
|
83
|
+
# bullet_style: css style for each bullet
|
84
|
+
STYLING_CONFIG = {
|
85
|
+
bullet_style: '"font-size: 60%; width: 10px; color: grey"'
|
86
|
+
}.freeze
|
87
|
+
|
88
|
+
# SEARCH
|
89
|
+
#
|
90
|
+
# Coursegen uses DocSearch by Algolia (https://docsearch.algolia.com/) to
|
91
|
+
# provide site-wide full-text search functionality.
|
92
|
+
#
|
93
|
+
# In order for search to function, you need to replace with your own
|
94
|
+
# search API key, and name of your index from Algolia.
|
95
|
+
# For details, please refer to https://github.com/pitosalas/coursegen/blob/master/README.md.
|
96
|
+
SEARCH_CONFIG = {
|
97
|
+
api_key: '855a55e631c6523e8201162e6d9c1e9c',
|
98
|
+
index_name: 'coolcourse',
|
99
|
+
# APP_ID is only used if you are running DocSearch on your own.
|
100
|
+
app_id: '',
|
101
|
+
debug: false
|
102
|
+
}.freeze
|
103
|
+
|
104
|
+
# SLIDES
|
105
|
+
SLIDES_CONFIG = {
|
106
|
+
# Ignore_selectors ignore certain html elements from rendering in the slides.
|
107
|
+
ignore_selectors: ['li ul'],
|
108
|
+
|
109
|
+
# Reveal.js specific options
|
110
|
+
# See: https://revealjs.com/config/
|
111
|
+
revealjs_opts: {
|
112
|
+
transition: 'slide'
|
113
|
+
}
|
114
|
+
}.freeze
|
@@ -1,33 +1,27 @@
|
|
1
1
|
@import url("prettyquote.css");
|
2
2
|
@import url("full-width-pics.css");
|
3
3
|
@import url(//fonts.googleapis.com/css?family=Telex);
|
4
|
+
@import url("postit.css");
|
5
|
+
@import url("toasty.css");
|
6
|
+
|
7
|
+
html {
|
8
|
+
font-size: 0.9rem;
|
9
|
+
}
|
10
|
+
body {
|
11
|
+
padding-bottom: 40px;
|
12
|
+
}
|
4
13
|
|
5
14
|
.themefg {
|
6
|
-
color: rgb(64,56,207);
|
15
|
+
color: rgb(64, 56, 207);
|
7
16
|
}
|
8
17
|
|
9
18
|
.themebg {
|
10
|
-
background-color: rgb(64,56,207);
|
19
|
+
background-color: rgb(64, 56, 207);
|
11
20
|
}
|
12
21
|
.nav-menus {
|
13
22
|
height: 0px;
|
14
23
|
}
|
15
|
-
|
16
|
-
.navbar-inverse .navbar-nav > li > a {
|
17
|
-
padding-top: 4px;
|
18
|
-
padding-bottom: 0px;
|
19
|
-
color: white;
|
20
|
-
}
|
21
|
-
|
22
|
-
.navbar-inverse .navbar-nav > li > a:hover {
|
23
|
-
font-weight: bold;
|
24
|
-
}
|
25
|
-
|
26
|
-
a {
|
27
|
-
color: rgb(64,56,207);
|
28
|
-
}
|
29
|
-
|
30
|
-
.navbar a.navbar-title {
|
24
|
+
.masthead a {
|
31
25
|
font-family: telex;
|
32
26
|
float: left;
|
33
27
|
margin-top: 20px;
|
@@ -54,19 +48,19 @@ a {
|
|
54
48
|
}
|
55
49
|
|
56
50
|
.navbar {
|
57
|
-
|
58
|
-
|
51
|
+
min-height: 35px;
|
52
|
+
margin-bottom: 1px;
|
59
53
|
}
|
60
54
|
|
61
55
|
.navbar a:hover {
|
62
|
-
|
56
|
+
color: white;
|
63
57
|
text-decoration: none;
|
64
58
|
}
|
65
59
|
|
66
|
-
.navbar .input-group-sm input{
|
67
|
-
|
68
|
-
|
69
|
-
|
60
|
+
.navbar .input-group-sm input {
|
61
|
+
height: 22px;
|
62
|
+
width: 150px;
|
63
|
+
margin-top: 4px;
|
70
64
|
}
|
71
65
|
|
72
66
|
.header-main {
|
@@ -77,176 +71,118 @@ a {
|
|
77
71
|
padding-left: 45px;
|
78
72
|
}
|
79
73
|
|
80
|
-
h1,
|
81
|
-
|
82
|
-
|
74
|
+
h1,
|
75
|
+
h2,
|
76
|
+
h3,
|
77
|
+
h4,
|
78
|
+
h5,
|
79
|
+
h6 {
|
80
|
+
font-family: telex;
|
81
|
+
color: rgb(64, 56, 207);
|
83
82
|
}
|
84
83
|
|
85
|
-
|
84
|
+
h1 {
|
86
85
|
padding-top: 20px;
|
87
|
-
|
86
|
+
font-size: 1.5rem;
|
87
|
+
}
|
88
|
+
|
89
|
+
h2 {
|
90
|
+
margin-top: 20px;
|
91
|
+
border-top: rgb(64, 56, 207) solid 2px;
|
92
|
+
padding-top: 5px;
|
93
|
+
font-size: 1.30rem;
|
88
94
|
}
|
89
95
|
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
+
h3 {
|
97
|
+
font-size: 1.1rem;
|
98
|
+
}
|
99
|
+
|
100
|
+
h3.subheader {
|
101
|
+
/* border-bottom: rgb(64, 56, 207) solid 2px; */
|
102
|
+
padding-bottom: 5px;
|
103
|
+
margin-bottom: 10px;
|
104
|
+
|
105
|
+
}
|
96
106
|
|
97
107
|
h4 {
|
98
|
-
|
99
|
-
|
100
|
-
padding-top: 5px;
|
108
|
+
font-size: 1.0rem;
|
109
|
+
margin-left: 18px;
|
101
110
|
}
|
102
111
|
|
112
|
+
/* Table use only */
|
103
113
|
h5 {
|
104
|
-
|
105
|
-
font-
|
114
|
+
margin-top: 15px;
|
115
|
+
font-size: 0.8rem;
|
106
116
|
font-variant: small-caps;
|
107
117
|
}
|
108
118
|
|
109
|
-
|
110
|
-
|
111
|
-
padding-bottom: 40px;
|
119
|
+
footer {
|
120
|
+
padding-top: 20px;
|
112
121
|
}
|
113
122
|
|
114
|
-
|
115
|
-
|
123
|
+
.sidebar {
|
124
|
+
background-color: rgb(247, 241, 213);
|
125
|
+
margin-top: 20px;
|
116
126
|
}
|
117
127
|
|
118
|
-
.
|
119
|
-
|
120
|
-
|
121
|
-
|
128
|
+
.sidebar ul {
|
129
|
+
list-style: none;
|
130
|
+
padding-left: 12px;
|
131
|
+
margin-top: 3px;
|
122
132
|
}
|
123
133
|
|
124
|
-
.
|
125
|
-
|
134
|
+
.sidebar label.level2 {
|
135
|
+
margin-bottom: 0px;
|
126
136
|
}
|
127
137
|
|
128
|
-
.
|
129
|
-
|
138
|
+
.sidebar a {
|
139
|
+
font-size: 85%;
|
130
140
|
}
|
131
141
|
|
132
|
-
.
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
142
|
+
.sidebar label.level1 {
|
143
|
+
text-transform: uppercase;
|
144
|
+
color: grey;
|
145
|
+
margin-top: 10px;
|
146
|
+
margin-bottom: 3px;
|
137
147
|
}
|
138
148
|
|
139
|
-
.
|
140
|
-
|
149
|
+
.sidebar label.level2 {
|
150
|
+
font-weight: normal;
|
141
151
|
}
|
142
152
|
|
143
153
|
.CodeRay .line-numbers {
|
144
|
-
|
154
|
+
margin-right: 15px;
|
145
155
|
}
|
146
156
|
|
147
157
|
.tree .bold a {
|
148
|
-
|
158
|
+
font-weight: bold;
|
149
159
|
}
|
150
160
|
|
151
161
|
.tree .red a {
|
152
|
-
|
162
|
+
color: red;
|
153
163
|
}
|
154
164
|
.tree .italic a {
|
155
|
-
|
165
|
+
font-style: italic;
|
156
166
|
}
|
157
167
|
|
158
168
|
.glyphicon-small {
|
159
|
-
|
169
|
+
font-size: 10px;
|
160
170
|
}
|
161
171
|
|
162
|
-
/* Search Page */
|
163
|
-
|
164
172
|
.h01 {
|
165
|
-
|
166
|
-
|
167
|
-
}
|
168
|
-
|
169
|
-
|
170
|
-
font-size: 14px;
|
171
|
-
color: red;
|
172
|
-
font-family: telex;
|
173
|
-
}
|
174
|
-
|
175
|
-
.tipue_search_content_title {
|
176
|
-
color: purple;
|
177
|
-
font-size: 16px;
|
178
|
-
margin-top: 15px;
|
179
|
-
margin-left: 10px;
|
180
|
-
text-rendering: optimizelegibility;
|
181
|
-
font-family: telex;
|
182
|
-
}
|
183
|
-
|
184
|
-
.tipue_search_content_text {
|
185
|
-
font-size: 14px;
|
186
|
-
margin-left: 30px;
|
187
|
-
}
|
188
|
-
|
189
|
-
div.tipue_search_content_loc a {
|
190
|
-
font-size: 14px;
|
191
|
-
margin-left: 20px;
|
192
|
-
display: none;
|
193
|
-
}
|
194
|
-
|
195
|
-
#tipue_search_foot
|
196
|
-
{
|
197
|
-
margin: 51px 0 21px 0;
|
198
|
-
}
|
199
|
-
#tipue_search_foot_boxes
|
200
|
-
{
|
201
|
-
padding: 0;
|
202
|
-
margin: 0;
|
203
|
-
font: 12px/1 'Open Sans', sans-serif;
|
204
|
-
}
|
205
|
-
#tipue_search_foot_boxes li
|
206
|
-
{
|
207
|
-
list-style: none;
|
208
|
-
margin: 0;
|
209
|
-
padding: 0;
|
210
|
-
display: inline;
|
211
|
-
}
|
212
|
-
#tipue_search_foot_boxes li a
|
213
|
-
{
|
214
|
-
padding: 9px 15px 10px 15px;
|
215
|
-
background-color: #f1f1f1;
|
216
|
-
border: 1px solid #dcdcdc;
|
217
|
-
border-radius: 1px;
|
218
|
-
color: #333;
|
219
|
-
margin-right: 7px;
|
220
|
-
text-decoration: none;
|
221
|
-
text-align: center;
|
222
|
-
}
|
223
|
-
#tipue_search_foot_boxes li.current
|
224
|
-
{
|
225
|
-
padding: 9px 15px 10px 15px;
|
226
|
-
background: #fff;
|
227
|
-
border: 1px solid #dcdcdc;
|
228
|
-
border-radius: 1px;
|
229
|
-
color: #333;
|
230
|
-
margin-right: 7px;
|
231
|
-
text-align: center;
|
232
|
-
}
|
233
|
-
#tipue_search_foot_boxes li a:hover
|
234
|
-
{
|
235
|
-
border: 1px solid #ccc;
|
236
|
-
background-color: #f3f3f3;
|
237
|
-
}
|
238
|
-
|
239
|
-
.helpful
|
240
|
-
{
|
173
|
+
color: red;
|
174
|
+
font-weight: bold;
|
175
|
+
}
|
176
|
+
|
177
|
+
.helpful {
|
241
178
|
visibility: hidden;
|
242
179
|
}
|
243
180
|
|
244
181
|
@media (max-width: 980px) {
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
}
|
182
|
+
/* Enable use of floated navbar text */
|
183
|
+
.navbar-text.pull-right {
|
184
|
+
float: none;
|
185
|
+
padding-left: 5px;
|
186
|
+
padding-right: 5px;
|
187
|
+
}
|
252
188
|
}
|