openstax_kitchen 14.0.0 → 15.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (28) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +16 -3
  3. data/Gemfile.lock +2 -2
  4. data/codecov.yaml +4 -0
  5. data/lib/kitchen/directions/bake_all_chapter_solutions_types.rb +30 -0
  6. data/lib/kitchen/directions/bake_all_numbered_exercise_types.rb +26 -0
  7. data/lib/kitchen/directions/bake_example.rb +1 -1
  8. data/lib/kitchen/directions/bake_index/v1.xhtml.erb +5 -9
  9. data/lib/kitchen/directions/bake_numbered_exercise/main.rb +8 -3
  10. data/lib/kitchen/directions/bake_numbered_exercise/v1.rb +48 -7
  11. data/lib/kitchen/directions/bake_numbered_table/bake_table_body.rb +3 -0
  12. data/lib/kitchen/directions/bake_unnumbered_exercise.rb +16 -0
  13. data/lib/kitchen/directions/book_answer_key_container/eob_answer_key_container.xhtml.erb +9 -0
  14. data/lib/kitchen/directions/book_answer_key_container/v1.rb +6 -2
  15. data/lib/kitchen/directions/default_strategy_for_answer_key_solutions.rb +35 -0
  16. data/lib/kitchen/directions/move_solutions_to_answer_key/answer_key_inner_container.rb +29 -0
  17. data/lib/kitchen/patches/renderable.rb +1 -1
  18. data/lib/kitchen/version.rb +1 -1
  19. data/lib/locales/es.yml +6 -1
  20. metadata +8 -10
  21. data/lib/kitchen/directions/book_answer_key_container/eob_answer_key_outer_container.xhtml.erb +0 -9
  22. data/lib/kitchen/directions/move_solutions_to_answer_key/main.rb +0 -18
  23. data/lib/kitchen/directions/move_solutions_to_answer_key/strategies/calculus.rb +0 -41
  24. data/lib/kitchen/directions/move_solutions_to_answer_key/strategies/contemporary_math.rb +0 -40
  25. data/lib/kitchen/directions/move_solutions_to_answer_key/strategies/default.rb +0 -27
  26. data/lib/kitchen/directions/move_solutions_to_answer_key/strategies/precalculus.rb +0 -63
  27. data/lib/kitchen/directions/move_solutions_to_answer_key/strategies/uphysics.rb +0 -21
  28. data/lib/kitchen/directions/move_solutions_to_answer_key/v1.rb +0 -47
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: fe096a5d1994a88a6a1e3d0d585bc76ff216157550eec29df3a37da3aa36f229
4
- data.tar.gz: 38f20f8be2ae246005c047ea0702e0e2a266b039e534fe0b063157054609873d
3
+ metadata.gz: 074dfc264ca97aab5805a3ab189b49fe1e97a1108366b592b5599a70e15f1345
4
+ data.tar.gz: fee3491d899d7983e55e5c6eb22010b49d23e8dd43e54ca97950a7be2fbda93f
5
5
  SHA512:
6
- metadata.gz: 20d6729f702ada57a80cf10bf5851562e1649e10ff002f98dc56a30f438aecee2b242e7a377af49313344b73b604d690eb2c8f7acd903cddafd32a0b7505fc2f
7
- data.tar.gz: bf8d77b0693a23cc1332d5c40c6eea39aeed0e1b1cb3c83017d60ad3541280c210fde867063551c52afe5e76198add5cfd5af960ab55b3f0cd617492e262658c
6
+ metadata.gz: d9a5936f931cf6b1c3485543adf375426d71b444109c68fc80b0a06ef6f953e4ac43cd40b27941c06dec0541e02dd2b3387074aa8a956821cdca781f97607f1d
7
+ data.tar.gz: 13d5bf302fe8144acef670f017bc8393847292d37f4a4dae68922cbf56c52da41c18719ec586ca1b5b1a135dc0c303e168f5515903e2b667299347cba909e7d4
data/CHANGELOG.md CHANGED
@@ -6,11 +6,24 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [15.0.0] - 2021-11-05
10
+
11
+ * Add unstyled tables to `BakeTableBody` (minor)
12
+ * Add to `BakeNumberedExercises` rules for baking exercises in appendecies (minor)
13
+ * Add `BakeUnnumberedExercise` direction (minor)
14
+ * Change whitespace for `BakeIndex` and `BakeExample` (major)
15
+ * Add `BakeAllNumberedExerciseTypes` direction for easier baking of compound sections (minor)
16
+ * Add `solution_stays_put` option for `BakeNumberedExercise` (minor)
17
+ * Add `BakeAllChapterSolutionsTypes` direction to move injected solutions and regular ones to EOC (minor)
18
+ * Refactor: moves all `Answer key strategies` that are book-specific to the
19
+ recipes side and keeps the `Default Strategy`in kitchen (major)
20
+ * Adds missing spanish translations (minor)
21
+
9
22
  ## [14.0.0] - 2021-10-22
10
23
 
11
- Fix `BakeAutotitledExercise` V2 to stop breaking for exercises without solutions (patch)
12
- Add `BakeAutotitledExercise` V2 (minor)
13
- Fix `BakeChapterGlossary::V1` to stop adding an empty wrapper if there is no content (patch)
24
+ * Fix `BakeAutotitledExercise` V2 to stop breaking for exercises without solutions (patch)
25
+ * Add `BakeAutotitledExercise` V2 (minor)
26
+ * Fix `BakeChapterGlossary::V1` to stop adding an empty wrapper if there is no content (patch)
14
27
  * Create `BakeNoteExercise` and `BakeNoteInjectedQuestion` and support exercises in `BakeUnclassifiedNotes` (minor)
15
28
  * Add baking section with class `column header` to `BakeAppendix` (patch)
16
29
  * Expand `BakeAnnotationClasses` to book from chapter to bake also paragraphs from Preface (major)
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- openstax_kitchen (14.0.0)
4
+ openstax_kitchen (15.0.0)
5
5
  activesupport
6
6
  i18n
7
7
  nokogiri
@@ -27,7 +27,7 @@ GEM
27
27
  concurrent-ruby (1.1.9)
28
28
  diff-lcs (1.3)
29
29
  docile (1.4.0)
30
- i18n (1.8.10)
30
+ i18n (1.8.11)
31
31
  concurrent-ruby (~> 1.0)
32
32
  inch (0.8.0)
33
33
  pry
data/codecov.yaml CHANGED
@@ -5,6 +5,10 @@ coverage:
5
5
  precision: 2
6
6
  round: down
7
7
  range: "70...100"
8
+ status:
9
+ project:
10
+ default:
11
+ threshold: 0.01% # codecov/project fails if there is a drop of more than 0.01%
8
12
 
9
13
  parsers:
10
14
  gcov:
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kitchen
4
+ module Directions
5
+ module BakeAllChapterSolutionsTypes
6
+ def self.v1(chapter:, within:, metadata_source:, uuid_prefix: '')
7
+ solutions_clipboard = Kitchen::Clipboard.new
8
+
9
+ within.search_with(ExerciseElementEnumerator, InjectedQuestionElementEnumerator)\
10
+ .each do |exercise|
11
+
12
+ solution = exercise.solution
13
+ next unless solution.present?
14
+
15
+ solution.cut(to: solutions_clipboard)
16
+ end
17
+
18
+ content = solutions_clipboard.paste
19
+
20
+ Kitchen::Directions::CompositePageContainer.v1(
21
+ container_key: 'solutions',
22
+ uuid_key: "#{uuid_prefix}solutions",
23
+ metadata_source: metadata_source,
24
+ content: content,
25
+ append_to: chapter
26
+ )
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kitchen
4
+ module Directions
5
+ module BakeAllNumberedExerciseTypes
6
+ def self.v1(within:, exercise_options: {}, question_options: {})
7
+ exercise_counter = 1
8
+ within.search_with(ExerciseElementEnumerator, InjectedQuestionElementEnumerator)\
9
+ .each do |exercise|
10
+ next if exercise.has_class?('unnumbered')
11
+
12
+ if exercise.instance_of?(ExerciseElement)
13
+ exercise_options[:exercise] = exercise
14
+ exercise_options[:number] = exercise_counter
15
+ BakeNumberedExercise.v1(exercise_options)
16
+ else
17
+ question_options[:number] = exercise_counter
18
+ question_options[:question] = exercise
19
+ BakeInjectedExerciseQuestion.v1(question_options)
20
+ end
21
+ exercise_counter += 1
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -39,7 +39,7 @@ module Kitchen
39
39
  solution.replace_children(with:
40
40
  <<~HTML
41
41
  <h4 data-type="solution-title">
42
- <span class="os-title-label">#{I18n.t(:solution)} </span>
42
+ <span class="os-title-label">#{I18n.t(:solution)}</span>
43
43
  #{solution_number}
44
44
  </h4>
45
45
  <div class="os-solution-container">#{solution.children}</div>
@@ -11,16 +11,12 @@
11
11
  <span class="group-label"><%= section.name %></span>
12
12
  <% section.items.each do |item| %>
13
13
  <div class="os-index-item">
14
- <% item.terms.each_with_index do |term, ii| %>
15
- <% if ii == 0 %>
14
+ <%- item.terms.each_with_index do |term, ii| -%>
15
+ <%- if ii == 0 -%>
16
16
  <span class="os-term" group-by="<%= term.group_by %>"><%= term.text %></span>
17
- <% else %>
18
- <span class="os-index-link-separator">, </span>
19
- <% end %>
20
- <a class="os-term-section-link" href="#<%= term.id %>">
21
- <span class="os-term-section"><%= term.page_title %></span>
22
- </a>
23
- <% end %>
17
+ <%- else -%><span class="os-index-link-separator">, </span><% end %>
18
+ <a class="os-term-section-link" href="#<%= term.id %>"><span class="os-term-section"><%= term.page_title %></span></a><!--
19
+ --><%- end %>
24
20
  </div>
25
21
  <% end %>
26
22
  </div>
@@ -3,14 +3,19 @@
3
3
  module Kitchen
4
4
  module Directions
5
5
  module BakeNumberedExercise
6
+ # rubocop:disable Metrics/ParameterLists
7
+ # :/
6
8
  def self.v1(exercise:, number:, suppress_solution_if: false,
7
- note_suppressed_solutions: false, cases: false)
9
+ note_suppressed_solutions: false, cases: false, solution_stays_put: false)
8
10
  V1.new.bake(exercise: exercise, number: number, suppress_solution_if: suppress_solution_if,
9
- note_suppressed_solutions: note_suppressed_solutions, cases: cases)
11
+ note_suppressed_solutions: note_suppressed_solutions, cases: cases,
12
+ solution_stays_put: solution_stays_put)
10
13
  end
14
+ # rubocop:enable Metrics/ParameterLists
11
15
 
12
16
  def self.bake_solution_v1(exercise:, number:, divider: '. ')
13
- V1.new.bake_solution(exercise: exercise, number: number, divider: divider)
17
+ V1.new.bake_solution(exercise: exercise, number: number, divider: divider,
18
+ solution_stays_put: false)
14
19
  end
15
20
  end
16
21
  end
@@ -2,13 +2,25 @@
2
2
 
3
3
  module Kitchen::Directions::BakeNumberedExercise
4
4
  class V1
5
- def bake(exercise:, number:, suppress_solution_if: false,
6
- note_suppressed_solutions: false, cases: false)
5
+ # rubocop:disable Metrics/ParameterLists
6
+ def bake(exercise:, number:, suppress_solution_if:,
7
+ note_suppressed_solutions:, cases:, solution_stays_put:)
7
8
  problem = exercise.problem
8
9
  solution = exercise.solution
9
10
 
11
+ in_appendix = exercise.has_ancestor?(:page) && exercise.ancestor(:page).has_class?('appendix')
12
+
10
13
  # Store label information
11
- label_number = "#{exercise.ancestor(:chapter).count_in(:book)}.#{number}"
14
+ if in_appendix
15
+ label_number = number
16
+ title_label = "<span class=\"os-title-label\">#{I18n.t('exercise')}</span>"
17
+ problem_divider = ''
18
+ else
19
+ label_number = "#{exercise.ancestor(:chapter).count_in(:book)}.#{number}"
20
+ title_label = ''
21
+ problem_divider = "<span class='os-divider'>. </span>"
22
+ end
23
+
12
24
  exercise.target_label(label_text: 'exercise', custom_content: label_number, cases: cases)
13
25
 
14
26
  problem_number = "<span class='os-number'>#{number}</span>"
@@ -26,25 +38,54 @@ module Kitchen::Directions::BakeNumberedExercise
26
38
  solution.trash
27
39
  exercise.add_class('os-hasSolution-trashed') if note_suppressed_solutions
28
40
  else
29
- problem_number = "<a class='os-number' href='##{exercise.id}-solution'>#{number}</a>"
30
- bake_solution(exercise: exercise, number: number)
41
+ problem_number = \
42
+ if solution_stays_put || in_appendix
43
+ "<span class='os-number'>#{number}</span>"
44
+ else
45
+ "<a class='os-number' href='##{exercise.id}-solution'>#{number}</a>"
46
+ end
47
+ bake_solution(
48
+ exercise: exercise,
49
+ number: number,
50
+ solution_stays_put: solution_stays_put,
51
+ in_appendix: in_appendix
52
+ )
31
53
  end
32
54
  end
33
55
 
34
56
  problem.replace_children(with:
35
57
  <<~HTML
58
+ #{title_label}
36
59
  #{problem_number}
37
- <span class='os-divider'>. </span>
60
+ #{problem_divider}
38
61
  <div class="os-problem-container">#{problem.children}</div>
39
62
  HTML
40
63
  )
41
64
  end
65
+ # rubocop:enable Metrics/ParameterLists
42
66
 
43
- def bake_solution(exercise:, number:, divider: '. ')
67
+ def bake_solution(exercise:, number:, solution_stays_put:, divider: '. ', in_appendix: false)
44
68
  solution = exercise.solution
69
+ if solution_stays_put
70
+ solution.wrap_children(class: 'os-solution-container')
71
+ solution.prepend(child:
72
+ <<~HTML
73
+ <h4 class="solution-title" data-type="title">
74
+ <span class="os-text">#{I18n.t(:solution)}</span>
75
+ </h4>
76
+ HTML
77
+ )
78
+ return
79
+ end
80
+
45
81
  solution.id = "#{exercise.id}-solution"
46
82
  exercise.add_class('os-hasSolution')
47
83
 
84
+ if in_appendix
85
+ solution.wrap_children(class: 'os-solution-container')
86
+ return
87
+ end
88
+
48
89
  solution.replace_children(with:
49
90
  <<~HTML
50
91
  <a class='os-number' href='##{exercise.id}'>#{number}</a>
@@ -65,6 +65,9 @@ module Kitchen
65
65
  elsif table.text_heavy?
66
66
  custom_table = CustomBody.new(table: table, klass: 'text-heavy')
67
67
  custom_table.modify_body(has_fake_title: false)
68
+ elsif table.unstyled?
69
+ custom_table = CustomBody.new(table: table, klass: 'unstyled')
70
+ custom_table.modify_body(has_fake_title: false)
68
71
  end
69
72
  end
70
73
  end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kitchen
4
+ module Directions
5
+ module BakeUnnumberedExercise
6
+ def self.v1(exercise:)
7
+ exercise.problem.wrap_children(class: 'os-problem-container')
8
+ return unless exercise.solution
9
+
10
+ exercise.solutions.each do |solution|
11
+ solution.wrap_children(class: 'os-solution-container')
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,9 @@
1
+ <div class="os-eob os-<%= @solutions_or_solution %>-container" data-type="<%= @composite_element %>" data-uuid-key=".<%= @uuid_key %>">
2
+ <<%= @main_title_tag %> data-type="document-title">
3
+ <span class="os-text"><%= @title %></span>
4
+ </<%= @main_title_tag %>>
5
+ <div data-type="metadata" style="display: none;">
6
+ <h1 data-type="document-title" itemprop="name"><%= @title %></h1>
7
+ <%= @metadata.paste %>
8
+ </div>
9
+ </div>
@@ -4,10 +4,14 @@ module Kitchen::Directions::BookAnswerKeyContainer
4
4
  class V1
5
5
  renderable
6
6
 
7
- def bake(book:, solutions_plural: true)
7
+ def bake(book:, solutions_plural:)
8
+ @composite_element = 'composite-chapter'
8
9
  @metadata = book.metadata.children_to_keep.copy
9
10
  @solutions_or_solution = solutions_plural ? 'solutions' : 'solution'
10
- book.body.append(child: render(file: 'eob_answer_key_outer_container.xhtml.erb'))
11
+ @title = I18n.t(:answer_key_title)
12
+ @main_title_tag = 'h1'
13
+ @uuid_key = @solutions_or_solution
14
+ book.body.append(child: render(file: 'eob_answer_key_container.xhtml.erb'))
11
15
  book.body.first("div.os-eob.os-#{@solutions_or_solution}-container")
12
16
  end
13
17
  end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kitchen::Directions::DefaultStrategyForAnswerKeySolutions
4
+ def self.v1(strategy_options:, chapter:, append_to:)
5
+ V1.new(
6
+ strategy_options
7
+ ).bake(
8
+ chapter: chapter,
9
+ append_to: append_to
10
+ )
11
+ end
12
+
13
+ class V1
14
+ def bake(chapter:, append_to:)
15
+ bake_section(chapter: chapter, append_to: append_to)
16
+ end
17
+
18
+ protected
19
+
20
+ def bake_section(chapter:, append_to:)
21
+ @selectors.each do |selector|
22
+ chapter.search("#{selector} div[data-type='solution']").each do |solution|
23
+ append_to.append(child: solution.cut.to_s) unless @condition.present? && !@condition
24
+ end
25
+ end
26
+ end
27
+
28
+ # This method helps to obtain more strategy-specific params through
29
+ # "strategy_options: {blah1: 1, blah2: 2}"
30
+ def initialize(strategy_options)
31
+ @selectors = strategy_options[:selectors] || (raise 'missing selectors for strategy')
32
+ @condition = strategy_options[:condition]
33
+ end
34
+ end
35
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kitchen::Directions::AnswerKeyInnerContainer
4
+ def self.v1(chapter:, metadata_source:, append_to:, solutions_plural: true)
5
+ V1.new.bake(
6
+ chapter: chapter,
7
+ metadata_source: metadata_source,
8
+ append_to: append_to,
9
+ solutions_plural: solutions_plural
10
+ )
11
+ end
12
+
13
+ class V1
14
+ renderable
15
+
16
+ def bake(chapter:, metadata_source:, append_to:, solutions_plural:)
17
+ @solutions_or_solution = solutions_plural ? 'solutions' : 'solution'
18
+ @uuid_key = "#{@solutions_or_solution}#{chapter.count_in(:book)}"
19
+ @metadata = metadata_source.children_to_keep.copy
20
+ @composite_element = 'composite-page'
21
+ @title = "#{I18n.t(:chapter)} #{chapter.count_in(:book)}"
22
+ @main_title_tag = 'h2'
23
+
24
+ append_to.append(
25
+ child: render(file: '../book_answer_key_container/eob_answer_key_container.xhtml.erb')
26
+ ).first("div[data-uuid-key='.#{@uuid_key}']")
27
+ end
28
+ end
29
+ end
@@ -29,7 +29,7 @@ class Object
29
29
  def render(file:)
30
30
  file = File.absolute_path(file, renderable_base_dir)
31
31
  template = File.open(file, 'rb', &:read)
32
- ERB.new(template).result(binding)
32
+ ERB.new(template, trim_mode: '-').result(binding)
33
33
  end
34
34
  end
35
35
  end
@@ -3,5 +3,5 @@
3
3
  # A library for modifying the structure of OpenStax book XML.
4
4
  #
5
5
  module Kitchen
6
- VERSION = '14.0.0'
6
+ VERSION = '15.0.0'
7
7
  end
data/lib/locales/es.yml CHANGED
@@ -21,17 +21,22 @@ es:
21
21
  eoc_exercises_title: Ejercicios
22
22
  eoc_composite_metadata_title: Revisión Del Capítulo
23
23
  eoc_solutions_title: Soluciones
24
- eoc_key_concepts: Conceptos Clave
25
24
  eoc_suggested_reading: Sugerencias Para Estudios Adicionales
26
25
  eob_index_symbols_group: Símbolos
27
26
  review_exercises: Ejercicios De Repaso
28
27
  section_exercises: ! 'Sección %{number} Ejercicios'
28
+ iframe_link_text: Haga Clic Para Ver El Contenido
29
+ handbook_outline_title: Esquema
30
+ context_lead_text: 'Referirse a '
29
31
  eoc:
30
32
  glossary: Términos Clave
31
33
  key-equations: Ecuaciones Clave
32
34
  summary: Resumen
33
35
  further-research: Investigación Adicional
36
+ key-concepts: Conceptos Clave
34
37
  references: Referencias
38
+ solutions: Soluciones
39
+ section-exercises: ! 'Sección %{number} Ejercicios'
35
40
  folio:
36
41
  preface: Prefacio
37
42
  access_for_free: Acceso gratis en openstax.org
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: openstax_kitchen
3
3
  version: !ruby/object:Gem::Version
4
- version: 14.0.0
4
+ version: 15.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - JP Slavinsky
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-10-25 00:00:00.000000000 Z
11
+ date: 2021-11-05 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activesupport
@@ -244,6 +244,8 @@ files:
244
244
  - lib/kitchen/debug/print_recipe_error.rb
245
245
  - lib/kitchen/directions/.rubocop.yml
246
246
  - lib/kitchen/directions/bake_accessibility_fixes.rb
247
+ - lib/kitchen/directions/bake_all_chapter_solutions_types.rb
248
+ - lib/kitchen/directions/bake_all_numbered_exercise_types.rb
247
249
  - lib/kitchen/directions/bake_annotation_classes/main.rb
248
250
  - lib/kitchen/directions/bake_annotation_classes/v1.rb
249
251
  - lib/kitchen/directions/bake_appendix.rb
@@ -331,9 +333,10 @@ files:
331
333
  - lib/kitchen/directions/bake_unit_page_title/v1.rb
332
334
  - lib/kitchen/directions/bake_unit_title/main.rb
333
335
  - lib/kitchen/directions/bake_unit_title/v1.rb
336
+ - lib/kitchen/directions/bake_unnumbered_exercise.rb
334
337
  - lib/kitchen/directions/bake_unnumbered_figure.rb
335
338
  - lib/kitchen/directions/bake_unnumbered_tables.rb
336
- - lib/kitchen/directions/book_answer_key_container/eob_answer_key_outer_container.xhtml.erb
339
+ - lib/kitchen/directions/book_answer_key_container/eob_answer_key_container.xhtml.erb
337
340
  - lib/kitchen/directions/book_answer_key_container/main.rb
338
341
  - lib/kitchen/directions/book_answer_key_container/v1.rb
339
342
  - lib/kitchen/directions/chapter_review_container/chapter_review.xhtml.erb
@@ -341,6 +344,7 @@ files:
341
344
  - lib/kitchen/directions/chapter_review_container/v1.rb
342
345
  - lib/kitchen/directions/composite_page_container/main.rb
343
346
  - lib/kitchen/directions/composite_page_container/v1.rb
347
+ - lib/kitchen/directions/default_strategy_for_answer_key_solutions.rb
344
348
  - lib/kitchen/directions/eoc_section_title_link_snippet.rb
345
349
  - lib/kitchen/directions/move_custom_section_to_eoc_container/main.rb
346
350
  - lib/kitchen/directions/move_custom_section_to_eoc_container/v1.rb
@@ -348,16 +352,10 @@ files:
348
352
  - lib/kitchen/directions/move_exercises_to_eoc/v1.rb
349
353
  - lib/kitchen/directions/move_exercises_to_eoc/v2.rb
350
354
  - lib/kitchen/directions/move_exercises_to_eoc/v3.rb
351
- - lib/kitchen/directions/move_solutions_to_answer_key/main.rb
355
+ - lib/kitchen/directions/move_solutions_to_answer_key/answer_key_inner_container.rb
352
356
  - lib/kitchen/directions/move_solutions_to_answer_key/move_solutions_from_exercise_section.rb
353
357
  - lib/kitchen/directions/move_solutions_to_answer_key/move_solutions_from_numbered_note.rb
354
358
  - lib/kitchen/directions/move_solutions_to_answer_key/solution_area_snippet.rb
355
- - lib/kitchen/directions/move_solutions_to_answer_key/strategies/calculus.rb
356
- - lib/kitchen/directions/move_solutions_to_answer_key/strategies/contemporary_math.rb
357
- - lib/kitchen/directions/move_solutions_to_answer_key/strategies/default.rb
358
- - lib/kitchen/directions/move_solutions_to_answer_key/strategies/precalculus.rb
359
- - lib/kitchen/directions/move_solutions_to_answer_key/strategies/uphysics.rb
360
- - lib/kitchen/directions/move_solutions_to_answer_key/v1.rb
361
359
  - lib/kitchen/directions/move_title_text_into_span.rb
362
360
  - lib/kitchen/document.rb
363
361
  - lib/kitchen/element.rb
@@ -1,9 +0,0 @@
1
- <div class="os-eob os-<%= @solutions_or_solution %>-container" data-type="composite-chapter" data-uuid-key=".<%= @solutions_or_solution %>">
2
- <h1 data-type="document-title">
3
- <span class="os-text"><%= I18n.t(:answer_key_title) %></span>
4
- </h1>
5
- <div data-type="metadata" style="display: none;">
6
- <h1 data-type="document-title" itemprop="name"><%= I18n.t(:answer_key_title) %></h1>
7
- <%= @metadata.paste %>
8
- </div>
9
- </div>
@@ -1,18 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Kitchen
4
- module Directions
5
- module MoveSolutionsToAnswerKey
6
- def self.v1(chapter:, metadata_source:, strategy:, append_to:, strategy_options: {}, solutions_plural: true)
7
- V1.new.bake(
8
- chapter: chapter,
9
- metadata_source: metadata_source,
10
- strategy: strategy,
11
- append_to: append_to,
12
- strategy_options: strategy_options,
13
- solutions_plural: solutions_plural
14
- )
15
- end
16
- end
17
- end
18
- end
@@ -1,41 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Kitchen::Directions::MoveSolutionsToAnswerKey
4
- module Strategies
5
- class Calculus
6
- def bake(chapter:, append_to:)
7
- checkpoint_solutions = chapter.search('div.checkpoint div[data-type="solution"]').cut
8
- append_solution_area(I18n.t(:checkpoint), checkpoint_solutions, append_to)
9
-
10
- chapter.search('section.section-exercises').each do |section|
11
- section_solutions = section.search('div[data-type="solution"]').cut
12
- section_title = I18n.t(
13
- :section_exercises,
14
- number: "#{chapter.count_in(:book)}.#{section.count_in(:chapter)}"
15
- )
16
- append_solution_area(section_title, section_solutions, append_to)
17
- end
18
-
19
- chapter.search('section.review-exercises').each do |section|
20
- section_solutions = section.search('div[data-type="solution"]').cut
21
- append_solution_area(I18n.t(:review_exercises), section_solutions, append_to)
22
- end
23
- end
24
-
25
- protected
26
-
27
- def append_solution_area(title, clipboard, append_to)
28
- append_to.append(child:
29
- <<~HTML
30
- <div class="os-solution-area">
31
- <h3 data-type="title">
32
- <span class="os-title-label">#{title}</span>
33
- </h3>
34
- #{clipboard.paste}
35
- </div>
36
- HTML
37
- )
38
- end
39
- end
40
- end
41
- end
@@ -1,40 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Kitchen::Directions::MoveSolutionsToAnswerKey
4
- module Strategies
5
- class ContemporaryMath
6
- def bake(chapter:, append_to:)
7
- # Hacky numbering fix
8
- chapter.notes('$.your-turn').exercises.each do |exercise|
9
- solution = exercise.solution
10
- next unless solution
11
-
12
- number = exercise.ancestor(:note).count_in(:chapter)
13
- solution.first('a.os-number').inner_html = number.to_s
14
- solution.first('span.os-divider').inner_html = '. '
15
- end
16
-
17
- Kitchen::Directions::MoveSolutionsFromNumberedNote.v1(
18
- chapter: chapter, append_to: append_to, note_class: 'your-turn'
19
- )
20
-
21
- # Bake section exercises
22
- chapter.non_introduction_pages.each do |page|
23
- number = "#{chapter.count_in(:book)}.#{page.count_in(:chapter)}"
24
- Kitchen::Directions::MoveSolutionsFromExerciseSection.v1(
25
- chapter: page, append_to: append_to, section_class: 'section-exercises',
26
- title_number: number
27
- )
28
- end
29
-
30
- # Bake other exercise sections
31
- classes = %w[chapter-review chapter-test]
32
- classes.each do |klass|
33
- Kitchen::Directions::MoveSolutionsFromExerciseSection.v1(
34
- chapter: chapter, append_to: append_to, section_class: klass
35
- )
36
- end
37
- end
38
- end
39
- end
40
- end
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Kitchen::Directions::MoveSolutionsToAnswerKey
4
- module Strategies
5
- class Default
6
- def bake(chapter:, append_to:)
7
- bake_section(chapter: chapter, append_to: append_to)
8
- end
9
-
10
- protected
11
-
12
- def bake_section(chapter:, append_to:)
13
- @selectors.each do |selector|
14
- chapter.search("#{selector} div[data-type='solution']").each do |solution|
15
- append_to.append(child: solution.cut.to_s)
16
- end
17
- end
18
- end
19
-
20
- # This method helps to obtain more strategy-specific params through
21
- # "strategy_options: {blah1: 1, blah2: 2}"
22
- def initialize(strategy_options)
23
- @selectors = strategy_options[:selectors] || (raise 'missing selectors for strategy')
24
- end
25
- end
26
- end
27
- end
@@ -1,63 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Kitchen::Directions::MoveSolutionsToAnswerKey
4
- module Strategies
5
- class Precalculus
6
- def bake(chapter:, append_to:)
7
- try_note_solutions(chapter: chapter, append_to: append_to)
8
-
9
- # Bake section exercises
10
- chapter.non_introduction_pages.each do |page|
11
- number = "#{chapter.count_in(:book)}.#{page.count_in(:chapter)}"
12
- Kitchen::Directions::MoveSolutionsFromExerciseSection.v1(
13
- chapter: page, append_to: append_to, section_class: 'section-exercises',
14
- title_number: number
15
- )
16
- end
17
-
18
- # Bake other types of exercises
19
- classes = %w[review-exercises practice-test]
20
- classes.each do |klass|
21
- Kitchen::Directions::MoveSolutionsFromExerciseSection.v1(
22
- chapter: chapter, append_to: append_to, section_class: klass
23
- )
24
- end
25
- end
26
-
27
- protected
28
-
29
- def try_note_solutions(chapter:, append_to:)
30
- append_to.append(child:
31
- <<~HTML
32
- <div class="os-module-reset-solution-area os-try-solution-area">
33
- <h3 data-type="title">
34
- <span class="os-title-label">#{I18n.t(:"notes.try")}</span>
35
- </h3>
36
- </div>
37
- HTML
38
- )
39
- chapter.pages.each do |page|
40
- solutions = Kitchen::Clipboard.new
41
- page.notes('$.try').each do |note|
42
- note.exercises.each do |exercise|
43
- solution = exercise.solution
44
- solution&.cut(to: solutions)
45
- end
46
- end
47
- next if solutions.items.empty?
48
-
49
- title_snippet = Kitchen::Directions::EocSectionTitleLinkSnippet.v1(
50
- page: page,
51
- wrapper: 'div'
52
- )
53
-
54
- append_to.first('div.os-try-solution-area').append(child:
55
- Kitchen::Directions::SolutionAreaSnippet.v1(
56
- title: title_snippet, solutions_clipboard: solutions
57
- )
58
- )
59
- end
60
- end
61
- end
62
- end
63
- end
@@ -1,21 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Kitchen::Directions::MoveSolutionsToAnswerKey
4
- module Strategies
5
- class UPhysics
6
- def bake(chapter:, append_to:)
7
- Kitchen::Directions::MoveSolutionsFromNumberedNote.v1(
8
- chapter: chapter, append_to: append_to, note_class: 'check-understanding'
9
- )
10
-
11
- classes = %w[review-conceptual-questions review-problems review-additional-problems
12
- review-challenge]
13
- classes.each do |klass|
14
- Kitchen::Directions::MoveSolutionsFromExerciseSection.v1(
15
- chapter: chapter, append_to: append_to, section_class: klass
16
- )
17
- end
18
- end
19
- end
20
- end
21
- end
@@ -1,47 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Kitchen::Directions::MoveSolutionsToAnswerKey
4
- class V1
5
- # rubocop:disable Metrics/ParameterLists
6
- # This direction may need refactoring to simplify parameters
7
- def bake(chapter:, metadata_source:, strategy:, append_to:, strategy_options: {},
8
- solutions_plural: true)
9
- strategy =
10
- case strategy
11
- when :calculus
12
- Strategies::Calculus.new
13
- when :contemporary_math
14
- Strategies::ContemporaryMath.new
15
- when :uphysics
16
- Strategies::UPhysics.new
17
- when :precalculus
18
- Strategies::Precalculus.new
19
- when :default
20
- Strategies::Default.new(strategy_options)
21
- else
22
- raise 'No such strategy'
23
- end
24
-
25
- solutions_or_solution = solutions_plural ? 'solutions' : 'solution'
26
- uuid_key = ".#{solutions_or_solution}#{chapter.count_in(:book)}"
27
- append_to.append(child:
28
- <<~HTML
29
- <div class="os-eob os-#{solutions_or_solution}-container" data-type="composite-page" \
30
- data-uuid-key="#{uuid_key}">
31
- <h2 data-type="document-title">
32
- <span class="os-text">#{I18n.t(:chapter)} #{chapter.count_in(:book)}</span>
33
- </h2>
34
- <div data-type="metadata" style="display: none;">
35
- <h1 data-type="document-title" itemprop="name">#{I18n.t(:chapter)} #{chapter.count_in(:book)}</h1>
36
- #{metadata_source.children_to_keep.copy.paste}
37
- </div>
38
- </div>
39
- HTML
40
- )
41
- strategy.bake(
42
- chapter: chapter, append_to: append_to.first("div[data-uuid-key='#{uuid_key}']")
43
- )
44
- end
45
- # rubocop:enable Metrics/ParameterLists
46
- end
47
- end