coursegen 0.3.1 → 0.4.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +2 -1
- data/Gemfile.lock +50 -46
- data/coursegen.gemspec +2 -3
- data/deleteme.rb +2 -0
- data/lib/coursegen/cli.rb +5 -3
- data/lib/coursegen/course/data/citem.rb +26 -27
- data/lib/coursegen/course/data/data_adaptor.rb +5 -1
- data/lib/coursegen/course/data/lectures.rb +84 -72
- data/lib/coursegen/course/data/section.rb +53 -53
- data/lib/coursegen/course/data/section_def.rb +6 -6
- data/lib/coursegen/course/data/toc.rb +1 -2
- data/lib/coursegen/course/helpers/bootstrap_markup.rb +3 -2
- data/lib/coursegen/course/helpers/content_helpers.rb +121 -75
- data/lib/coursegen/course/helpers/ical_feed_helpers.rb +1 -1
- data/lib/coursegen/course/helpers/list_of.rb +12 -12
- data/lib/coursegen/course/helpers/list_of_helpers.rb +2 -2
- data/lib/coursegen/course/helpers/navigation_helpers.rb +35 -26
- data/lib/coursegen/course/helpers/sidebar_helpers.rb +12 -16
- data/lib/coursegen/course/lib/ical_adaptor.rb +3 -5
- data/lib/coursegen/course/lib/search_data_generator.rb +3 -4
- data/lib/coursegen/course/schedule/schedule_def.rb +12 -11
- data/lib/coursegen/course/schedule/schedule_feed.rb +3 -1
- data/lib/coursegen/course/schedule/scheduler.rb +20 -13
- data/lib/coursegen/version.rb +1 -1
- data/lib/coursegen.rb +10 -9
- data/spec/play_spec.rb +15 -19
- data/spec/scheduler_spec.rb +59 -63
- data/spec/spec_helper.rb +1 -1
- data/spec/toc_spec.rb +69 -71
- data/tech_debt.md +0 -3
- data/templates/Guardfile +2 -2
- data/templates/body_footer.html +8 -0
- data/templates/body_header.html.erb +6 -0
- data/templates/cg_config.rb +8 -7
- data/templates/content/bootstrap/css/custom.css +25 -8
- data/templates/content/content/intro/course_toc.md.erb +1 -1
- data/templates/course.html +59 -0
- data/templates/helpful_box.html +3 -0
- data/templates/layouts/body_header.html.erb +1 -1
- data/templates/layouts/course.html +3 -2
- data/templates/layouts/main_navbar.html.erb +1 -1
- data/templates/main_navbar.html.erb +21 -0
- metadata +22 -16
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4aa75e9754a6ce6c2062f4c37aab0846397a9412
|
4
|
+
data.tar.gz: 634163b939293459d18e57444f41919b3317d277
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 10a00235c1a6e719df5ddf44006d46c1df8f2979151a3b0cf8a48ef97c0e726db41b62a4e1ea619133db69854f2a55c94189aa9dec2bfd4e1aa0429d6dabc639
|
7
|
+
data.tar.gz: b7eb6b5220879501cc8996d40c7ac960d1e5d9a41734090fe90831409090d90b51424ea141a4b537e2ac023a43c4c50dd322184f2d80313d82b6178bfbbe519d
|
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,17 +1,17 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
coursegen (0.
|
4
|
+
coursegen (0.4.2)
|
5
5
|
activesupport
|
6
6
|
adsf
|
7
|
+
byebug
|
7
8
|
cri
|
8
9
|
guard
|
9
10
|
guard-shell
|
10
11
|
icalendar
|
11
12
|
kramdown
|
12
|
-
nanoc
|
13
|
+
nanoc
|
13
14
|
nokogiri
|
14
|
-
pry-byebug
|
15
15
|
rubytree
|
16
16
|
thor
|
17
17
|
tzinfo
|
@@ -19,26 +19,25 @@ PATH
|
|
19
19
|
GEM
|
20
20
|
remote: https://rubygems.org/
|
21
21
|
specs:
|
22
|
-
activesupport (
|
22
|
+
activesupport (5.1.3)
|
23
|
+
concurrent-ruby (~> 1.0, >= 1.0.2)
|
23
24
|
i18n (~> 0.7)
|
24
|
-
json (~> 1.7, >= 1.7.7)
|
25
25
|
minitest (~> 5.1)
|
26
|
-
thread_safe (~> 0.3, >= 0.3.4)
|
27
26
|
tzinfo (~> 1.1)
|
28
|
-
adsf (1.2.
|
27
|
+
adsf (1.2.1)
|
29
28
|
rack (>= 1.0.0)
|
30
|
-
byebug (
|
31
|
-
|
32
|
-
coderay (1.1.0)
|
29
|
+
byebug (9.0.6)
|
30
|
+
coderay (1.1.1)
|
33
31
|
colored (1.2)
|
34
|
-
|
35
|
-
cri (2.
|
32
|
+
concurrent-ruby (1.0.5)
|
33
|
+
cri (2.9.1)
|
36
34
|
colored (~> 1.2)
|
37
|
-
|
35
|
+
ddplugin (1.0.1)
|
36
|
+
ffi (1.9.18)
|
38
37
|
formatador (0.2.5)
|
39
|
-
guard (2.
|
38
|
+
guard (2.14.1)
|
40
39
|
formatador (>= 0.2.4)
|
41
|
-
listen (>= 2.7,
|
40
|
+
listen (>= 2.7, < 4.0)
|
42
41
|
lumberjack (~> 1.0)
|
43
42
|
nenv (~> 0.1)
|
44
43
|
notiffany (~> 0.0)
|
@@ -49,46 +48,51 @@ GEM
|
|
49
48
|
guard-shell (0.7.1)
|
50
49
|
guard (>= 2.0.0)
|
51
50
|
guard-compat (~> 1.0)
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
51
|
+
hamster (3.0.0)
|
52
|
+
concurrent-ruby (~> 1.0)
|
53
|
+
i18n (0.8.6)
|
54
|
+
icalendar (2.4.1)
|
55
|
+
json (1.8.6)
|
56
|
+
kramdown (1.14.0)
|
57
|
+
listen (3.1.5)
|
58
|
+
rb-fsevent (~> 0.9, >= 0.9.4)
|
59
|
+
rb-inotify (~> 0.9, >= 0.9.7)
|
60
|
+
ruby_dep (~> 1.2)
|
61
|
+
lumberjack (1.0.12)
|
60
62
|
method_source (0.8.2)
|
61
|
-
|
62
|
-
minitest (5.
|
63
|
-
nanoc (4.
|
64
|
-
cri (~> 2.
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
63
|
+
mini_portile2 (2.2.0)
|
64
|
+
minitest (5.10.3)
|
65
|
+
nanoc (4.8.2)
|
66
|
+
cri (~> 2.8)
|
67
|
+
ddplugin (~> 1.0)
|
68
|
+
hamster (~> 3.0)
|
69
|
+
ref (~> 2.0)
|
70
|
+
nenv (0.3.0)
|
71
|
+
nokogiri (1.8.0)
|
72
|
+
mini_portile2 (~> 2.2.0)
|
73
|
+
notiffany (0.1.1)
|
69
74
|
nenv (~> 0.1)
|
70
75
|
shellany (~> 0.0)
|
71
|
-
pry (0.10.
|
76
|
+
pry (0.10.4)
|
72
77
|
coderay (~> 1.1.0)
|
73
78
|
method_source (~> 0.8.1)
|
74
79
|
slop (~> 3.4)
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
rubytree (0.9.6)
|
80
|
+
rack (2.0.3)
|
81
|
+
rake (11.3.0)
|
82
|
+
rb-fsevent (0.10.2)
|
83
|
+
rb-inotify (0.9.10)
|
84
|
+
ffi (>= 0.5.0, < 2)
|
85
|
+
ref (2.0.0)
|
86
|
+
ruby_dep (1.5.0)
|
87
|
+
rubytree (0.9.7)
|
84
88
|
json (~> 1.8)
|
85
89
|
structured_warnings (~> 0.2)
|
86
90
|
shellany (0.0.1)
|
87
91
|
slop (3.6.0)
|
88
|
-
structured_warnings (0.
|
89
|
-
thor (0.
|
90
|
-
thread_safe (0.3.
|
91
|
-
tzinfo (1.2.
|
92
|
+
structured_warnings (0.3.0)
|
93
|
+
thor (0.20.0)
|
94
|
+
thread_safe (0.3.6)
|
95
|
+
tzinfo (1.2.3)
|
92
96
|
thread_safe (~> 0.1)
|
93
97
|
|
94
98
|
PLATFORMS
|
@@ -100,4 +104,4 @@ DEPENDENCIES
|
|
100
104
|
rake
|
101
105
|
|
102
106
|
BUNDLED WITH
|
103
|
-
1.
|
107
|
+
1.15.3
|
data/coursegen.gemspec
CHANGED
@@ -21,12 +21,10 @@ Gem::Specification.new do |spec|
|
|
21
21
|
spec.add_development_dependency "bundler"
|
22
22
|
spec.add_development_dependency "rake"
|
23
23
|
|
24
|
-
|
25
|
-
spec.add_dependency "nanoc", '~> 4.0.0rc2'
|
24
|
+
spec.add_dependency "nanoc"
|
26
25
|
spec.add_dependency "thor"
|
27
26
|
spec.add_dependency "rubytree"
|
28
27
|
spec.add_dependency "cri"
|
29
|
-
spec.add_dependency "pry-byebug"
|
30
28
|
spec.add_dependency "nokogiri"
|
31
29
|
spec.add_dependency "activesupport"
|
32
30
|
spec.add_dependency "kramdown"
|
@@ -35,4 +33,5 @@ Gem::Specification.new do |spec|
|
|
35
33
|
spec.add_dependency "guard-shell"
|
36
34
|
spec.add_dependency "tzinfo"
|
37
35
|
spec.add_dependency "icalendar"
|
36
|
+
spec.add_dependency "byebug"
|
38
37
|
end
|
data/deleteme.rb
ADDED
data/lib/coursegen/cli.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'thor'
|
2
2
|
require 'coursegen/templates'
|
3
3
|
require 'nanoc'
|
4
|
-
require './cg_config.rb' if File.
|
4
|
+
require './cg_config.rb' if File.exist? 'cg_config.rb'
|
5
5
|
|
6
6
|
module CourseGen
|
7
7
|
class CLI < Thor
|
@@ -47,9 +47,11 @@ module CourseGen
|
|
47
47
|
|
48
48
|
no_commands do
|
49
49
|
def check_valid_directory
|
50
|
-
CourseGen::Templates.new.valid_cg_directory?
|
51
|
-
say("Valid cg directory")
|
50
|
+
if CourseGen::Templates.new.valid_cg_directory?
|
51
|
+
say("Valid cg directory")
|
52
|
+
else
|
52
53
|
error("Invalid cg directory")
|
54
|
+
end
|
53
55
|
end
|
54
56
|
end
|
55
57
|
end
|
@@ -1,23 +1,25 @@
|
|
1
|
+
require 'byebug'
|
1
2
|
require 'active_support/inflector'
|
2
3
|
|
3
4
|
#
|
4
5
|
# Coursegen Item decorates Nanoc Item
|
5
6
|
#
|
6
7
|
class CItem
|
7
|
-
|
8
8
|
attr_reader :order, :section, :subsection, :subsection_citem, :title,
|
9
|
-
:type, :identifier, :short_name, :status, :nitem, :css_class, :homework, :desc
|
10
|
-
attr_accessor :lecture_number, :lecture_date
|
9
|
+
:type, :identifier, :short_name, :status, :nitem, :css_class, :homework, :desc, :cat
|
10
|
+
attr_accessor :lecture_number, :lecture_date, :start_time, :end_time
|
11
11
|
|
12
12
|
# Callable with nitem=nil to create a mock
|
13
|
-
def initialize
|
13
|
+
def initialize(nitem=nil, ident=nil, type=nil, order=nil)
|
14
14
|
if !nitem.nil?
|
15
|
-
|
15
|
+
# path to create a real citem
|
16
|
+
fail ArgumentError, "invalid CItem contruction" unless ident.nil?
|
16
17
|
@nitem = nitem
|
17
|
-
defaults_from_nitem
|
18
|
+
defaults_from_nitem
|
18
19
|
parse_identifier @nitem.identifier
|
19
20
|
else
|
20
|
-
|
21
|
+
# path to create a mock citem
|
22
|
+
fail ArgumentError, "invalid CItem contruction" unless nitem.nil?
|
21
23
|
@nitem = nil
|
22
24
|
@status = nil
|
23
25
|
@type = type
|
@@ -33,15 +35,11 @@ class CItem
|
|
33
35
|
if @nitem.nil?
|
34
36
|
false
|
35
37
|
else
|
36
|
-
@nitem[:status] == 'hidden' || %w(css min.css js png).include?(@nitem[:extension])
|
38
|
+
@nitem[:status] == 'hidden' || %w(css min.css js pdf png).include?(@nitem[:extension])
|
37
39
|
end
|
38
40
|
end
|
39
41
|
|
40
|
-
def
|
41
|
-
@nitem.path
|
42
|
-
end
|
43
|
-
|
44
|
-
def is_lecture?
|
42
|
+
def lecture?
|
45
43
|
!@lecture_date.nil?
|
46
44
|
end
|
47
45
|
|
@@ -54,26 +52,26 @@ class CItem
|
|
54
52
|
end
|
55
53
|
|
56
54
|
def schedule_start_date_time
|
57
|
-
if
|
58
|
-
|
59
|
-
|
60
|
-
|
55
|
+
return if @lecture_date.nil?
|
56
|
+
# schedule = Toc.instance.section(@section).schedule
|
57
|
+
# lecture_date + schedule.start_time
|
58
|
+
lecture_date + @start_time
|
61
59
|
end
|
62
60
|
|
63
61
|
def schedule_end_date_time
|
64
|
-
if
|
65
|
-
|
66
|
-
|
67
|
-
|
62
|
+
return if @lecture_date.nil?
|
63
|
+
# schedule = Toc.instance.section(@section).schedule
|
64
|
+
# lecture_date + schedule.end_time
|
65
|
+
lecture_date + @end_time
|
68
66
|
end
|
69
67
|
|
70
68
|
def lecture_number_s
|
71
|
-
"#{@section.singularize} #{@lecture_number
|
69
|
+
"#{@section.singularize} #{@lecture_number}"
|
72
70
|
end
|
73
71
|
|
74
72
|
private
|
75
73
|
|
76
|
-
def defaults_from_nitem
|
74
|
+
def defaults_from_nitem
|
77
75
|
@type = @nitem[:type] || 'page'
|
78
76
|
fail ArgumentError, 'Invalid page type' unless ["page", "subsection"].include? @type
|
79
77
|
|
@@ -86,21 +84,22 @@ class CItem
|
|
86
84
|
@css_class = @nitem[:css_class]
|
87
85
|
@homework = @nitem[:homework]
|
88
86
|
@desc = @nitem[:desc]
|
87
|
+
@cat = @nitem[:cat]
|
89
88
|
end
|
90
89
|
|
91
|
-
def parse_identifier
|
90
|
+
def parse_identifier(ident)
|
92
91
|
parts = ident.to_s.split("/")
|
93
92
|
@section ||= parts[2]
|
94
|
-
#parsed_title = parts[-1].match(/^((\d*)_)?([^\/]*)$/)
|
93
|
+
# parsed_title = parts[-1].match(/^((\d*)_)?([^\/]*)$/)
|
95
94
|
parsed_title = parts[-1].match(/^((\d*)_)?(\w*)/)
|
96
|
-
|
95
|
+
fail "Invalid item title" if parsed_title.nil?
|
97
96
|
|
98
97
|
@order ||= parsed_title[2].to_i
|
99
98
|
@short_name = parsed_title[3]
|
100
99
|
@title ||= short_name
|
101
100
|
if @type == "subsection"
|
102
101
|
@subsection = "/#{parts[1..-2].join('/')}/"
|
103
|
-
#
|
102
|
+
# @subsection = "/#{parts[1..-1].join('/')}/"
|
104
103
|
elsif @type == "page"
|
105
104
|
@subsection = "/#{parts[1..-2].join('/')}/"
|
106
105
|
end
|
@@ -1,10 +1,12 @@
|
|
1
|
+
# Standard way to access information to be used in a list_of()
|
1
2
|
class DataAdaptor
|
2
3
|
def initialize(source)
|
3
4
|
@section = Toc.instance.section(source)
|
4
5
|
end
|
5
6
|
|
6
7
|
# column_selector is one of: :number, :date, :title, :homework
|
7
|
-
COL_NAMES = {
|
8
|
+
COL_NAMES = {number: "#", date: "lecture date", title: "title",
|
9
|
+
homework: "homework", desc: "description", cat: "category"}
|
8
10
|
|
9
11
|
def column_name(column_selector)
|
10
12
|
COL_NAMES[column_selector]
|
@@ -38,6 +40,8 @@ class DataAdaptor
|
|
38
40
|
desc = citem.desc || ""
|
39
41
|
hw = citem.homework || ""
|
40
42
|
desc + ". HW: " + hw
|
43
|
+
when :cat
|
44
|
+
citem.cat
|
41
45
|
else
|
42
46
|
"error!"
|
43
47
|
end
|
@@ -1,91 +1,103 @@
|
|
1
1
|
require 'tree'
|
2
2
|
|
3
3
|
class Lectures < Section
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
4
|
+
def initialize(sect, citems, schedule=nil, collapsed=false)
|
5
|
+
super sect, citems, collapsed
|
6
|
+
@schedule = schedule || ::Scheduler.new
|
7
|
+
@citems = sort_items
|
8
|
+
build_tree
|
9
|
+
end
|
10
10
|
|
11
|
-
|
12
|
-
|
13
|
-
|
11
|
+
def has_subsections?
|
12
|
+
true
|
13
|
+
end
|
14
14
|
|
15
|
-
|
16
|
-
|
17
|
-
|
15
|
+
def has_lecture_numbers?
|
16
|
+
true
|
17
|
+
end
|
18
18
|
|
19
|
-
|
20
|
-
|
21
|
-
|
19
|
+
def schedule
|
20
|
+
@schedule
|
21
|
+
end
|
22
22
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
23
|
+
def build_tree
|
24
|
+
lecture_num = 1
|
25
|
+
@root = Tree::TreeNode.new("root", "root")
|
26
|
+
@citems.each do |i|
|
27
|
+
i.lecture_number = lecture_num
|
28
|
+
i.lecture_date = @schedule.event_date_by_index(lecture_num - 1) # Lecture numbers are base 1
|
29
|
+
i.start_time = @schedule.event_start_times[lecture_num - 1]
|
30
|
+
i.end_time = @schedule.event_end_times[lecture_num - 1]
|
31
|
+
if i.type == "subsection"
|
32
|
+
@root.add(Tree::TreeNode.new(i.subsection, i))
|
33
|
+
elsif i.type == "page"
|
34
|
+
parent_tree_node = parent_node_of(i)
|
35
|
+
parent_tree_node.add(Tree::TreeNode.new(i.identifier, i))
|
36
|
+
lecture_num += 1
|
37
|
+
else
|
38
|
+
raise ArgumentError, "invalid lecture page type of #{i.type}for #{i.title}"
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
40
42
|
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
43
|
+
def parent_node_of citem
|
44
|
+
parent_node = @root[citem.subsection]
|
45
|
+
raise RuntimeError, "Cant find section for item: #{citem.identifier}" if parent_node.nil?
|
46
|
+
parent_node
|
47
|
+
end
|
46
48
|
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
end
|
49
|
+
def treenode_of citem
|
50
|
+
@root.find do |tree_node|
|
51
|
+
if citem.type == "subsection"
|
52
|
+
citem.subsection == tree_node.name
|
53
|
+
else
|
54
|
+
citem.identifier == tree_node.name
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
57
58
|
|
58
|
-
|
59
|
-
|
60
|
-
|
59
|
+
def subsections
|
60
|
+
@root.children
|
61
|
+
end
|
61
62
|
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
63
|
+
def next_for(citem)
|
64
|
+
next_node = treenode_of(citem).next_sibling
|
65
|
+
if !next_node.nil?
|
66
|
+
next_node.content
|
67
|
+
else
|
68
|
+
citem
|
69
|
+
end
|
70
|
+
end
|
70
71
|
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
72
|
+
def previous_for(citem)
|
73
|
+
prev_node = treenode_of(citem).previous_sibling
|
74
|
+
if !prev_node.nil?
|
75
|
+
prev_node.content
|
76
|
+
else
|
77
|
+
citem
|
78
|
+
end
|
79
|
+
end
|
79
80
|
|
80
|
-
protected
|
81
|
+
protected
|
82
|
+
|
83
|
+
# @TODO: once there are skips, this calcluation doesn't work anymore!
|
84
|
+
def get_time(times, lect_num)
|
85
|
+
if times.nil?
|
86
|
+
"0"
|
87
|
+
else
|
88
|
+
times[(lect_num % 3) - 1]
|
89
|
+
end
|
90
|
+
end
|
81
91
|
|
82
92
|
#
|
83
93
|
# Sort all the items in this section: First by the ordering of the subseciton
|
84
94
|
# that the item belongs to, and second by the item's own indicated order.
|
85
95
|
#
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
96
|
+
def sort_items
|
97
|
+
new_citems = @citems.sort_by do |i|
|
98
|
+
[lookup_citem_by_identifier(i.subsection + "index.html").order,
|
99
|
+
((i.type == "page" ? 100 : 1) * i.order)]
|
100
|
+
end
|
101
|
+
@items = new_citems
|
102
|
+
end
|
91
103
|
end
|
@@ -1,60 +1,61 @@
|
|
1
1
|
require 'forwardable'
|
2
|
-
require '
|
2
|
+
require 'byebug'
|
3
3
|
|
4
4
|
class Section
|
5
|
-
|
6
|
-
|
7
|
-
|
5
|
+
extend Forwardable
|
6
|
+
attr_reader :section
|
7
|
+
def_delegators :@citems, :[], :count, :each, :sort!, :reduce
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
9
|
+
def initialize(sect, citems, collapsed)
|
10
|
+
@section = sect
|
11
|
+
@collapsed = collapsed
|
12
|
+
@citems = section_filter(citems)
|
13
|
+
sort_pages
|
14
|
+
end
|
15
15
|
|
16
|
-
|
17
|
-
|
18
|
-
|
16
|
+
def find_index(citem)
|
17
|
+
@citems.find_index(citem)
|
18
|
+
end
|
19
19
|
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
raise
|
24
|
-
|
25
|
-
|
20
|
+
def find_by_short_name(sname)
|
21
|
+
matches = @citems.select { |c| sname == c.short_name }
|
22
|
+
raise RuntimeError,"'#{sname}': invalid reference in section \"#{@section}\"" if matches.length == 0
|
23
|
+
raise RuntimeError, "'#{sname}': duplicate referenced in section \"#{@section}\"" if matches.length != 1
|
24
|
+
matches[0]
|
25
|
+
end
|
26
26
|
|
27
|
-
|
28
|
-
|
29
|
-
|
27
|
+
def [](ind)
|
28
|
+
@citems[ind]
|
29
|
+
end
|
30
30
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
31
|
+
def next_for(citem)
|
32
|
+
index = @citems.find_index(citem)
|
33
|
+
raise ArgumentError, "invalid citem in next_for" if index.nil?
|
34
|
+
new_index = [index, @citems.length - 2].min
|
35
|
+
@citems[new_index + 1]
|
36
|
+
end
|
37
37
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
38
|
+
def previous_for(citem)
|
39
|
+
index = @citems.find_index(citem)
|
40
|
+
byebug if index.nil?
|
41
|
+
raise ArgumentError, "invalid citem in previous_for" if index.nil?
|
42
|
+
new_index = [index, 1].max
|
43
|
+
@citems[new_index - 1]
|
44
|
+
end
|
44
45
|
|
45
|
-
|
46
|
-
|
47
|
-
|
46
|
+
def has_subsections?
|
47
|
+
false
|
48
|
+
end
|
48
49
|
|
49
|
-
|
50
|
-
|
51
|
-
|
50
|
+
def has_lecture_numbers?
|
51
|
+
false
|
52
|
+
end
|
52
53
|
|
53
|
-
|
54
|
-
|
55
|
-
|
54
|
+
def collapsed?
|
55
|
+
@collapsed
|
56
|
+
end
|
56
57
|
|
57
|
-
|
58
|
+
protected
|
58
59
|
|
59
60
|
def lookup_citem_by_identifier identifier
|
60
61
|
res = @citems.select { |i| i.identifier.to_s == identifier }
|
@@ -64,15 +65,14 @@ class Section
|
|
64
65
|
end
|
65
66
|
|
66
67
|
# Remove citems that don't belong in this section, or are hidden
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
filtered_citems.compact
|
68
|
+
def section_filter citems
|
69
|
+
filtered_citems = citems.map do |citem|
|
70
|
+
citem.section == @section && !citem.hidden? ? citem : nil
|
71
|
+
end
|
72
|
+
filtered_citems.compact
|
73
73
|
end
|
74
74
|
|
75
|
-
|
76
|
-
|
77
|
-
|
75
|
+
def sort_pages
|
76
|
+
@citems.sort! { |a,b| a.order <=> b.order } rescue fail "sort_pages in section.rb"
|
77
|
+
end
|
78
78
|
end
|