coursegen 0.8.1 → 0.9.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/workflows/pr.yml +19 -0
- data/.gitignore +3 -0
- data/Gemfile.lock +80 -57
- 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 +158 -94
- 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 +36 -28
- 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
|
}
|