daigaku 0.0.2 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (55) hide show
  1. checksums.yaml +4 -4
  2. data/.travis.yml +6 -0
  3. data/README.md +25 -3
  4. data/Rakefile +3 -0
  5. data/daigaku.gemspec +3 -2
  6. data/lib/daigaku/configuration.rb +7 -4
  7. data/lib/daigaku/congratulator.rb +13 -0
  8. data/lib/daigaku/course.rb +5 -0
  9. data/lib/daigaku/generator.rb +13 -6
  10. data/lib/daigaku/github_client.rb +30 -0
  11. data/lib/daigaku/reference_solution.rb +10 -2
  12. data/lib/daigaku/solution.rb +19 -8
  13. data/lib/daigaku/storeable.rb +32 -0
  14. data/lib/daigaku/terminal/courses.rb +103 -11
  15. data/lib/daigaku/terminal/output.rb +6 -0
  16. data/lib/daigaku/terminal/texts/congratulations.txt +12 -0
  17. data/lib/daigaku/terminal.rb +2 -1
  18. data/lib/daigaku/test_result.rb +5 -3
  19. data/lib/daigaku/version.rb +1 -1
  20. data/lib/daigaku/views/chapters_menu.rb +19 -50
  21. data/lib/daigaku/views/courses_menu.rb +14 -49
  22. data/lib/daigaku/views/main_menu.rb +6 -6
  23. data/lib/daigaku/views/menu.rb +89 -0
  24. data/lib/daigaku/views/task_view.rb +29 -11
  25. data/lib/daigaku/views/top_bar.rb +9 -17
  26. data/lib/daigaku/views/units_menu.rb +21 -52
  27. data/lib/daigaku/views.rb +4 -12
  28. data/lib/daigaku/window.rb +46 -3
  29. data/lib/daigaku.rb +1 -4
  30. data/spec/daigaku/configuration_spec.rb +11 -11
  31. data/spec/daigaku/congratulator_spec.rb +24 -0
  32. data/spec/daigaku/course_spec.rb +18 -0
  33. data/spec/daigaku/generator_spec.rb +4 -4
  34. data/spec/daigaku/github_client_spec.rb +53 -0
  35. data/spec/daigaku/reference_solution_spec.rb +20 -2
  36. data/spec/daigaku/solution_spec.rb +13 -6
  37. data/spec/daigaku/storeable_spec.rb +35 -0
  38. data/spec/daigaku/terminal/courses_spec.rb +215 -5
  39. data/spec/daigaku/terminal/output_spec.rb +31 -3
  40. data/spec/daigaku/terminal_spec.rb +12 -2
  41. data/spec/daigaku/test_result_spec.rb +12 -2
  42. data/spec/daigaku/views/chapters_menu_spec.rb +1 -3
  43. data/spec/daigaku/views/courses_menu_spec.rb +1 -3
  44. data/spec/daigaku/views/menu_spec.rb +19 -0
  45. data/spec/daigaku/views/task_view_spec.rb +1 -1
  46. data/spec/daigaku/views/units_menu_spec.rb +1 -3
  47. data/spec/daigaku/views_spec.rb +0 -2
  48. data/spec/daigaku_spec.rb +0 -6
  49. data/spec/support/macros/content_helpers.rb +1 -1
  50. data/spec/support/macros/mock_helpers.rb +6 -1
  51. data/spec/support/macros/path_helpers.rb +12 -6
  52. data/spec/support/macros/resource_helpers.rb +3 -1
  53. metadata +33 -8
  54. data/lib/daigaku/database.rb +0 -64
  55. data/spec/daigaku/database_spec.rb +0 -79
@@ -1,53 +1,24 @@
1
+ require 'daigaku/views/menu'
2
+
1
3
  module Daigaku
2
4
  module Views
3
- require 'wisper'
4
-
5
- class ChaptersMenu
6
- include Views
7
- include Wisper::Publisher
8
-
9
- def initialize
10
- @position = 0
11
- end
12
-
13
- def enter_chapters_menu(course)
14
- @window = default_window
15
- @course = course
16
-
17
- main_panel(@window) do |window|
18
- show sub_window_below_top_bar(window)
19
- end
20
- end
21
-
22
- def reenter_chapters_menu(course, chapter)
23
- @course = course
24
- @chapter = chapter
25
5
 
26
- @position = course.chapters.find_index(chapter)
27
- enter_chapters_menu(@course)
28
- end
6
+ class ChaptersMenu < Menu
29
7
 
30
8
  private
31
9
 
32
- def show(window)
33
- draw(window, @position)
34
- interact_with(window)
10
+ def before_enter(*args)
11
+ @course = args[0]
35
12
  end
36
13
 
37
- def draw(window, active_index = 0)
38
- window.attrset(A_NORMAL)
39
- window.setpos(0, 1)
40
- window.emphasize @course.title
41
- window.write ' - available chapters:'
42
-
43
- menu_items.each_with_index do |item, index|
44
- window.setpos(index + 2, 1)
45
- window.print_indicator(chapters[index])
46
- window.attrset(index == active_index ? A_STANDOUT : A_NORMAL)
47
- window.write " #{item.to_s} "
48
- end
14
+ def before_reenter(*args)
15
+ @course = args[0]
16
+ @chapter = args[1]
17
+ @position = @course.chapters.find_index(@chapter)
18
+ end
49
19
 
50
- window.refresh
20
+ def header_text
21
+ "*#{@course.title}* - available chapters:"
51
22
  end
52
23
 
53
24
  def interact_with(window)
@@ -60,29 +31,27 @@ module Daigaku
60
31
  @position += 1
61
32
  broadcast(:reset_menu_position)
62
33
  when 10 # Enter
63
- broadcast(:enter_units_menu, @course, chapters[@position])
34
+ broadcast(:enter, @course, models[@position])
64
35
  return
65
36
  when 263 # Backspace
66
- broadcast(:reenter_courses_menu, @course)
37
+ broadcast(:reenter, @course)
67
38
  return
68
39
  when 27 # ESC
69
40
  exit
70
41
  end
71
42
 
72
- @position = menu_items.length - 1 if @position < 0
73
- @position = 0 if @position >= menu_items.length
43
+ @position = items.length - 1 if @position < 0
44
+ @position = 0 if @position >= items.length
74
45
  draw(window, @position)
75
46
  end
76
47
  end
77
48
 
78
- def chapters
49
+ def models
79
50
  @course.chapters
80
51
  end
81
52
 
82
- def menu_items
83
- @menu_items = chapters.map do |chapter|
84
- chapter.title
85
- end
53
+ def items
54
+ models.map(&:title)
86
55
  end
87
56
 
88
57
  end
@@ -1,48 +1,14 @@
1
+ require 'daigaku/views/menu'
2
+
1
3
  module Daigaku
2
4
  module Views
3
- require 'wisper'
4
-
5
- class CoursesMenu
6
- include Views
7
- include Wisper::Publisher
8
-
9
- def initialize
10
- @position = 0
11
- end
12
-
13
- def enter
14
- @window = default_window
15
-
16
- main_panel(@window) do |window|
17
- show sub_window_below_top_bar(window)
18
- end
19
- end
20
5
 
21
- def reenter_courses_menu(course)
22
- @current_course = course
23
- enter
24
- end
6
+ class CoursesMenu < Menu
25
7
 
26
8
  private
27
9
 
28
- def show(window)
29
- draw(window, @position)
30
- interact_with(window)
31
- end
32
-
33
- def draw(window, active_index = 0)
34
- window.attrset(A_NORMAL)
35
- window.setpos(0, 1)
36
- window.write 'Available daigaku courses:'
37
-
38
- course_entries.each_with_index do |item, index|
39
- window.setpos(index + 2, 1)
40
- window.print_indicator(courses[index])
41
- window.attrset(index == active_index ? A_STANDOUT : A_NORMAL)
42
- window.write " #{item.to_s} "
43
- end
44
-
45
- window.refresh
10
+ def header_text
11
+ 'Available daigaku courses:'
46
12
  end
47
13
 
48
14
  def interact_with(window)
@@ -55,29 +21,28 @@ module Daigaku
55
21
  @position += 1
56
22
  broadcast(:reset_menu_position)
57
23
  when 10 # Enter
58
- broadcast(:enter_chapters_menu, courses[@position])
24
+ broadcast(:enter, models[@position])
59
25
  return
60
26
  when 27 # ESC
61
27
  exit
62
28
  end
63
29
 
64
- entries = course_entries
65
- @position = entries.length - 1 if @position < 0
66
- @position = 0 if @position >= entries.length
30
+ @position = items.length - 1 if @position < 0
31
+ @position = 0 if @position >= items.length
67
32
  draw(window, @position)
68
33
  end
69
34
  end
70
35
 
71
- def courses
72
- @courses = Loading::Courses.load(Daigaku.config.courses_path)
36
+ def models
37
+ Loading::Courses.load(Daigaku.config.courses_path)
73
38
  end
74
39
 
75
- def course_entries
76
- non_empty_courses = courses.select { |course| !course.chapters.empty? }
40
+ def items
41
+ non_empty_courses = models.select { |course| !course.chapters.empty? }
77
42
 
78
- @course_entries = non_empty_courses.map do |course|
43
+ non_empty_courses.map do |course|
79
44
  line = "#{course.title}"
80
- line << "(#{course.author})" if course.author
45
+ self.items_info <<= [(course.author ? "(by #{course.author})" : '')]
81
46
  line
82
47
  end
83
48
  end
@@ -15,14 +15,14 @@ module Daigaku
15
15
  # second has to have method that is broadcasted.
16
16
 
17
17
  # top down navigation
18
- courses_menu.subscribe(chapters_menu, on: :enter_chapters_menu)
19
- chapters_menu.subscribe(units_menu, on: :enter_units_menu)
20
- units_menu.subscribe(task_view, on: :enter_task_view)
18
+ courses_menu.subscribe(chapters_menu, on: :enter)
19
+ chapters_menu.subscribe(units_menu, on: :enter)
20
+ units_menu.subscribe(task_view, on: :enter)
21
21
 
22
22
  # bottom up navigation
23
- chapters_menu.subscribe(courses_menu, on: :reenter_courses_menu)
24
- units_menu.subscribe(chapters_menu, on: :reenter_chapters_menu)
25
- task_view.subscribe(units_menu, on: :reenter_units_menu)
23
+ chapters_menu.subscribe(courses_menu, on: :reenter)
24
+ units_menu.subscribe(chapters_menu, on: :reenter)
25
+ task_view.subscribe(units_menu, on: :reenter)
26
26
 
27
27
  # position reset
28
28
  courses_menu.subscribe(chapters_menu, on: :reset_menu_position)
@@ -0,0 +1,89 @@
1
+ require 'wisper'
2
+
3
+ module Daigaku
4
+ module Views
5
+
6
+ class Menu
7
+ include Views
8
+ include Wisper::Publisher
9
+
10
+ TOP_BAR_TEXT = [
11
+ 'Use *UP KEY* and *DOWN KEY* for menu navigation',
12
+ 'Enter menu with *RETURN*',
13
+ 'Go back with *BACKSPACE*',
14
+ 'Exit with *ESC*'
15
+ ].join(' | ')
16
+
17
+ def initialize
18
+ @position = 0
19
+ end
20
+
21
+ def enter(*args)
22
+ if self.class.private_method_defined?(:before_enter)
23
+ before_enter(*args)
24
+ end
25
+
26
+ @window = default_window
27
+ top_bar = TopBar.new(@window, TOP_BAR_TEXT)
28
+ show sub_window_below_top_bar(@window, top_bar)
29
+ end
30
+
31
+ def reenter(*args)
32
+ if self.class.private_method_defined?(:before_reenter)
33
+ before_reenter(*args)
34
+ end
35
+
36
+ enter(*args)
37
+ end
38
+
39
+ protected
40
+
41
+ def show(window)
42
+ draw(window, @position)
43
+ interact_with(window)
44
+ end
45
+
46
+ def draw(window, active_index = 0)
47
+ window.attrset(A_NORMAL)
48
+ window.setpos(0, 1)
49
+ window.print_markdown header_text
50
+
51
+ items.each_with_index do |item, index|
52
+ window.setpos(index + 2, 1)
53
+ window.print_indicator(models[index])
54
+ window.attrset(index == active_index ? A_STANDOUT : A_NORMAL)
55
+ window.write " #{item.to_s} "
56
+ window.attrset(A_NORMAL)
57
+ window.write " #{items_info[index].try(:join, ' ')}"
58
+ end
59
+
60
+ window.refresh
61
+ end
62
+
63
+ def interact_with(window)
64
+ raise "Please implement the method #interact_with!"
65
+ end
66
+
67
+ def models
68
+ raise "Please implement the method #models!"
69
+ end
70
+
71
+ def items
72
+ raise "Please implement the method #items!"
73
+ end
74
+
75
+ def header_text
76
+ raise "Please implement the method #header_text!"
77
+ end
78
+
79
+ def items_info
80
+ @items_info || []
81
+ end
82
+
83
+ def items_info=(items_info)
84
+ @items_info = items_info
85
+ end
86
+ end
87
+
88
+ end
89
+ end
@@ -7,12 +7,20 @@ module Daigaku
7
7
  include Views
8
8
  include Wisper::Publisher
9
9
 
10
+ TOP_BAR_TEXT = [
11
+ 'Scroll with *UP KEY* and *DOWN KEY*',
12
+ 'Verify solution with *v*',
13
+ 'Open solution file with *o*',
14
+ 'Clear validation with *c*',
15
+ 'Exit with *ESC*'
16
+ ].join(' | ')
17
+
10
18
  def initialize
11
19
  @lines = []
12
20
  @top = nil
13
21
  end
14
22
 
15
- def enter_task_view(course, chapter, unit)
23
+ def enter(course, chapter, unit)
16
24
  @course = course
17
25
  @chapter = chapter
18
26
  @unit = unit
@@ -30,12 +38,9 @@ module Daigaku
30
38
  def set_head(window)
31
39
  window.setpos(0, 1)
32
40
  window.clear_line
33
- window.emphasize @course.title
34
- window.write ' > '
35
- window.emphasize @chapter.title
36
- window.write ' > '
37
- window.emphasize @unit.title
38
- window.write ':'
41
+
42
+ text = "*#{@course.title}* > *#{@chapter.title}* > *#{@unit.title}*:"
43
+ window.print_markdown(text)
39
44
 
40
45
  window.setpos(1, 1)
41
46
  window.clear_line
@@ -120,7 +125,7 @@ module Daigaku
120
125
  scrollable = true
121
126
 
122
127
  case char
123
- when 'v' # Verifiy
128
+ when 'v' # verify
124
129
  print_test_results(window)
125
130
  return
126
131
  when 'c' # clear
@@ -157,7 +162,7 @@ module Daigaku
157
162
  while scroll_down(window)
158
163
  end
159
164
  when Curses::KEY_BACKSPACE
160
- broadcast(:reenter_units_menu, @course, @chapter, @unit)
165
+ broadcast(:reenter, @course, @chapter, @unit)
161
166
  return
162
167
  when 27 # ESC
163
168
  exit
@@ -181,8 +186,19 @@ module Daigaku
181
186
 
182
187
  def print_test_results(window)
183
188
  result = @unit.solution.verify!
189
+ @test_result_lines = result.summary_lines
190
+
191
+ if result.passed?
192
+ code_lines = @unit.reference_solution.code_lines
193
+
194
+ unless code_lines.empty?
195
+ code_lines.map! { |line| " #{line}" }
196
+ code_lines.unshift('', "Reference code:", '')
197
+ end
198
+
199
+ @test_result_lines += code_lines
200
+ end
184
201
 
185
- @test_result_lines = result.summary.strip.split("\n")
186
202
  @lines = [''] + @test_result_lines + ['', ''] + @unit.task.markdown.lines
187
203
  @examples = result.examples
188
204
 
@@ -206,7 +222,9 @@ module Daigaku
206
222
 
207
223
  def initialize_window(height)
208
224
  @window = default_window(height)
209
- main_panel(@window) { |window| show sub_window_below_top_bar(window) }
225
+
226
+ top_bar = TopBar.new(@window, TOP_BAR_TEXT)
227
+ show sub_window_below_top_bar(@window, top_bar)
210
228
  end
211
229
 
212
230
  def example_index(heights, index)
@@ -4,12 +4,14 @@ module Daigaku
4
4
  class TopBar
5
5
  include Curses
6
6
 
7
+ HEIGHT = 4
8
+
7
9
  attr_reader :height, :width, :panel
8
10
 
9
- def initialize(window)
10
- @height = 4
11
+ def initialize(window, text = '')
12
+ @height = HEIGHT
11
13
  @width = window.maxx
12
- @panel = create_panel(window, @width, @height)
14
+ @panel = create_panel(window, @width, @height, text)
13
15
  end
14
16
 
15
17
  def show
@@ -18,23 +20,13 @@ module Daigaku
18
20
 
19
21
  private
20
22
 
21
- def create_panel(window, width, heigth)
22
- panel = window.subwin(heigth, window.maxx, 0, 0)
23
+ def create_panel(window, width, height, text)
24
+ panel = window.subwin(height, window.maxx, 0, 0)
23
25
 
24
26
  panel.setpos(1, 1)
25
- panel.write 'Use '
26
- panel.emphasize 'UP KEY'
27
- panel.write ' and '
28
- panel.emphasize 'DOWN KEY'
29
- panel.write ' for menu navigation'
30
- panel.write ' | Enter menu with '
31
- panel.emphasize 'RETURN'
32
- panel.write ' | Go back with '
33
- panel.emphasize 'BACKSPACE'
34
- panel.write ' | Exit with '
35
- panel.emphasize 'ESC'
27
+ panel.print_markdown(text)
36
28
  panel.setpos(2, 1)
37
- panel.write '_' * (window.maxx - 3)
29
+ panel.clear_line(text: '_')
38
30
 
39
31
  panel
40
32
  end
@@ -1,56 +1,27 @@
1
+ require 'daigaku/views/menu'
2
+
1
3
  module Daigaku
2
4
  module Views
3
- require 'wisper'
4
-
5
- class UnitsMenu
6
- include Views
7
- include Wisper::Publisher
8
-
9
- def initialize
10
- @position = 0
11
- end
12
5
 
13
- def enter_units_menu(course, chapter)
14
- @window = default_window
15
- @course = course
16
- @chapter = chapter
17
-
18
- main_panel(@window) do |window|
19
- show sub_window_below_top_bar(window)
20
- end
21
- end
22
-
23
- def reenter_units_menu(course, chapter, unit)
24
- @course = course
25
- @chapter = chapter
26
-
27
- @position = chapter.units.find_index(unit)
28
- enter_units_menu(@course, @chapter)
29
- end
6
+ class UnitsMenu < Menu
30
7
 
31
8
  private
32
9
 
33
- def show(window)
34
- draw(window, @position)
35
- interact_with(window)
10
+ def before_enter(*args)
11
+ @course = args[0]
12
+ @chapter = args[1]
36
13
  end
37
14
 
38
- def draw(window, active_index = 0)
39
- window.attrset(A_NORMAL)
40
- window.setpos(0, 1)
41
- window.emphasize @course.title
42
- window.write ' > '
43
- window.emphasize @chapter.title
44
- window.write ' > - available units:'
15
+ def before_reenter(*args)
16
+ @course = args[0]
17
+ @chapter = args[1]
18
+ @unit = args[2]
45
19
 
46
- menu_items.each_with_index do |item, index|
47
- window.setpos(index + 2, 1)
48
- window.print_indicator(units[index])
49
- window.attrset(index == active_index ? A_STANDOUT : A_NORMAL)
50
- window.write " #{item.to_s} "
51
- end
20
+ @position = @chapter.units.find_index(@unit)
21
+ end
52
22
 
53
- window.refresh
23
+ def header_text
24
+ "*#{@course.title}* > *#{@chapter.title}* - available units:"
54
25
  end
55
26
 
56
27
  def interact_with(window)
@@ -61,29 +32,27 @@ module Daigaku
61
32
  when KEY_DOWN
62
33
  @position += 1
63
34
  when 10 # Enter
64
- broadcast(:enter_task_view, @course, @chapter, units[@position])
35
+ broadcast(:enter, @course, @chapter, models[@position])
65
36
  return
66
37
  when 263 # Backspace
67
- broadcast(:reenter_chapters_menu, @course, @chapter)
38
+ broadcast(:reenter, @course, @chapter)
68
39
  return
69
40
  when 27 # ESC
70
41
  exit
71
42
  end
72
43
 
73
- @position = menu_items.length - 1 if @position < 0
74
- @position = 0 if @position >= menu_items.length
44
+ @position = items.length - 1 if @position < 0
45
+ @position = 0 if @position >= items.length
75
46
  draw(window, @position)
76
47
  end
77
48
  end
78
49
 
79
- def units
50
+ def models
80
51
  @chapter.units
81
52
  end
82
53
 
83
- def menu_items
84
- @menu_items = units.map do |unit|
85
- unit.title
86
- end
54
+ def items
55
+ models.map(&:title)
87
56
  end
88
57
 
89
58
  end
data/lib/daigaku/views.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  require 'curses'
2
2
  require 'active_support/concern'
3
- require_relative 'views/top_bar'
3
+ require 'daigaku/views/top_bar'
4
4
 
5
5
  module Daigaku
6
6
  module Views
@@ -38,17 +38,9 @@ module Daigaku
38
38
  window
39
39
  end
40
40
 
41
- def top_bar(window)
42
- TopBar.new(window)
43
- end
44
-
45
- def main_panel(window)
46
- top_bar(window).show
47
- yield(window) if block_given?
48
- end
49
-
50
- def sub_window_below_top_bar(window)
51
- top = top_bar(window).height
41
+ def sub_window_below_top_bar(window, top_bar)
42
+ top_bar.show
43
+ top = top_bar.height
52
44
  sub_window = window.subwin(window.maxy - top, window.maxx, top, 0)
53
45
  sub_window.keypad(true)
54
46
  sub_window
@@ -1,4 +1,5 @@
1
1
  require 'curses'
2
+ require 'cgi'
2
3
 
3
4
  module Daigaku
4
5
  class Window < Curses::Window
@@ -72,7 +73,7 @@ module Daigaku
72
73
 
73
74
  x = curx
74
75
  setpos(cury, start)
75
- write(' ' * (stop - 1), color, text_decoration)
76
+ write((options[:text] || ' ') * (stop - 1), color, text_decoration)
76
77
  setpos(cury, x)
77
78
  refresh
78
79
  end
@@ -106,8 +107,10 @@ module Daigaku
106
107
  h1 = /^\#{1}[^#]+/ # '# heading'
107
108
  h2 = /^\#{2}[^#]+/ # '## sub heading'
108
109
  bold = /(\*[^*]*\*)/ # '*text*'
109
- line = /^-{3,}/ # '---' vertical line
110
- code = /(\`*\`)/ # '`code line`'
110
+ line = /^-{3,}/ # '---' vertical line
111
+ code = /(\`*\`)/ # '`code line`'
112
+ ruby_doc_core = /(\(ruby-doc core:.*\))/ # '(ruby-doc core: Kernel#print)'
113
+ ruby_doc_stdlib = /(\(ruby-doc stdlib:.*\))/ # '(ruby-doc stdlib: CSV#Row::<<)'
111
114
 
112
115
  case text
113
116
  when h1
@@ -149,6 +152,12 @@ module Daigaku
149
152
  end
150
153
  when line
151
154
  write('-' * (Curses.cols - 2))
155
+ when ruby_doc_core
156
+ capture = text.match(/\(ruby-doc core:\s?(.*)\)/).captures.first
157
+ write text.gsub(ruby_doc_core, ruby_doc_core_link(capture))
158
+ when ruby_doc_stdlib
159
+ capture = text.match(/\(ruby-doc stdlib:\s?(.*)\)/).captures.first
160
+ write text.gsub(ruby_doc_stdlib, ruby_doc_stdlib_link(capture))
152
161
  else
153
162
  write(text)
154
163
  end
@@ -165,5 +174,39 @@ module Daigaku
165
174
  Curses.init_pair(COLOR_GREEN, GREEN, BACKGROUND)
166
175
  Curses.init_pair(COLOR_YELLOW, YELLOW, BACKGROUND)
167
176
  end
177
+
178
+ private
179
+
180
+ def ruby_doc_core_link(text)
181
+ base_url = "http://ruby-doc.org/core-#{RUBY_VERSION}"
182
+ class_part = ruby_doc_class_parts(text).join('/')
183
+ method = ruby_doc_method(text)
184
+
185
+ "#{base_url}/#{class_part}.html#{method}"
186
+ end
187
+
188
+ def ruby_doc_stdlib_link(text)
189
+ base_url = "http://ruby-doc.org/stdlib-#{RUBY_VERSION}"
190
+ class_parts = ruby_doc_class_parts(text)
191
+ libdoc_part = "libdoc/#{class_parts.first.downcase}/rdoc"
192
+ method = ruby_doc_method(text)
193
+
194
+ "#{base_url}/#{libdoc_part}/#{class_parts.join('/')}.html#{method}"
195
+ end
196
+
197
+ def ruby_doc_class_parts(text)
198
+ parts = text.split(/::|#/)
199
+ parts[0..(parts.count > 1 ? -2 : -1)]
200
+ end
201
+
202
+ def ruby_doc_method(text)
203
+ parts = text.split(/::|#/)
204
+
205
+ if parts.count > 1
206
+ method_type = text.match(/#/) ? 'i' : 'c'
207
+ method_name = CGI.escape(parts.last.strip).gsub('%', '-').gsub(/\A-/, '')
208
+ "#method-#{method_type}-#{method_name}"
209
+ end
210
+ end
168
211
  end
169
212
  end
data/lib/daigaku.rb CHANGED
@@ -1,3 +1,4 @@
1
+ require 'quick_store'
1
2
  require 'daigaku/window'
2
3
 
3
4
  Dir[File.join("#{File.dirname(__FILE__)}/**/*.rb")].sort.each do |file|
@@ -19,9 +20,5 @@ module Daigaku
19
20
  Views::Splash.new
20
21
  Views::MainMenu.new
21
22
  end
22
-
23
- def database
24
- Database.instance
25
- end
26
23
  end
27
24
  end