coursegen 0.3.1 → 0.4.2
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/.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
|