openstax_kitchen 14.0.0 → 17.1.0

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.
Files changed (58) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +47 -3
  3. data/Gemfile.lock +4 -4
  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_annotation_classes/v1.rb +11 -2
  8. data/lib/kitchen/directions/bake_autotitled_exercise/main.rb +4 -0
  9. data/lib/kitchen/directions/bake_autotitled_exercise/v3.rb +35 -0
  10. data/lib/kitchen/directions/bake_chapter_references/main.rb +15 -0
  11. data/lib/kitchen/directions/bake_chapter_references/v2.rb +53 -0
  12. data/lib/kitchen/directions/bake_chapter_references/v3.rb +45 -0
  13. data/lib/kitchen/directions/bake_chapter_summary.rb +5 -4
  14. data/lib/kitchen/directions/bake_example.rb +1 -1
  15. data/lib/kitchen/directions/bake_exercise_prefixes/main.rb +14 -0
  16. data/lib/kitchen/directions/bake_exercise_prefixes/v1.rb +22 -0
  17. data/lib/kitchen/directions/bake_footnotes/v1.rb +1 -1
  18. data/lib/kitchen/directions/bake_index/v1.rb +13 -8
  19. data/lib/kitchen/directions/bake_index/v1.xhtml.erb +6 -10
  20. data/lib/kitchen/directions/{bake_injected_exercise.rb → bake_injected_exercise/bake_injected_exercise.rb} +10 -1
  21. data/lib/kitchen/directions/bake_injected_exercise/bake_injected_exercise_question.rb +4 -0
  22. data/lib/kitchen/directions/bake_link_placeholders.rb +1 -1
  23. data/lib/kitchen/directions/bake_lo_link_labels.rb +19 -0
  24. data/lib/kitchen/directions/bake_non_introduction_pages.rb +3 -1
  25. data/lib/kitchen/directions/bake_numbered_exercise/main.rb +8 -3
  26. data/lib/kitchen/directions/bake_numbered_exercise/v1.rb +48 -7
  27. data/lib/kitchen/directions/bake_numbered_table/bake_table_body.rb +5 -1
  28. data/lib/kitchen/directions/bake_numbered_table/v2.rb +2 -1
  29. data/lib/kitchen/directions/bake_references/v1.rb +13 -0
  30. data/lib/kitchen/directions/bake_screenreader_spans.rb +22 -0
  31. data/lib/kitchen/directions/bake_unnumbered_exercise.rb +16 -0
  32. data/lib/kitchen/directions/book_answer_key_container/eob_answer_key_container.xhtml.erb +9 -0
  33. data/lib/kitchen/directions/book_answer_key_container/v1.rb +6 -2
  34. data/lib/kitchen/directions/default_strategy_for_answer_key_solutions.rb +35 -0
  35. data/lib/kitchen/directions/move_solutions_to_answer_key/answer_key_inner_container.rb +29 -0
  36. data/lib/kitchen/element_base.rb +25 -5
  37. data/lib/kitchen/element_enumerator_base.rb +18 -0
  38. data/lib/kitchen/injected_exercise_element.rb +41 -0
  39. data/lib/kitchen/injected_exercise_element_enumerator.rb +21 -0
  40. data/lib/kitchen/injected_question_element.rb +7 -0
  41. data/lib/kitchen/patches/i18n.rb +4 -0
  42. data/lib/kitchen/patches/integer.rb +32 -3
  43. data/lib/kitchen/patches/nokogiri.rb +5 -4
  44. data/lib/kitchen/patches/renderable.rb +1 -1
  45. data/lib/kitchen/selectors/base.rb +3 -0
  46. data/lib/kitchen/selectors/standard_1.rb +1 -0
  47. data/lib/kitchen/version.rb +1 -1
  48. data/lib/locales/en.yml +16 -0
  49. data/lib/locales/es.yml +6 -1
  50. metadata +18 -11
  51. data/lib/kitchen/directions/book_answer_key_container/eob_answer_key_outer_container.xhtml.erb +0 -9
  52. data/lib/kitchen/directions/move_solutions_to_answer_key/main.rb +0 -18
  53. data/lib/kitchen/directions/move_solutions_to_answer_key/strategies/calculus.rb +0 -41
  54. data/lib/kitchen/directions/move_solutions_to_answer_key/strategies/contemporary_math.rb +0 -40
  55. data/lib/kitchen/directions/move_solutions_to_answer_key/strategies/default.rb +0 -27
  56. data/lib/kitchen/directions/move_solutions_to_answer_key/strategies/precalculus.rb +0 -63
  57. data/lib/kitchen/directions/move_solutions_to_answer_key/strategies/uphysics.rb +0 -21
  58. 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: 23c782f23dfd67f38174ddb5f51c28955ae7929854e17a6f9163f41bb644485e
4
+ data.tar.gz: 4fafd85f2c59373ebe321e0ddc1b86f5b61e7453bbfe1ca66b94b9ec59c75a59
5
5
  SHA512:
6
- metadata.gz: 20d6729f702ada57a80cf10bf5851562e1649e10ff002f98dc56a30f438aecee2b242e7a377af49313344b73b604d690eb2c8f7acd903cddafd32a0b7505fc2f
7
- data.tar.gz: bf8d77b0693a23cc1332d5c40c6eea39aeed0e1b1cb3c83017d60ad3541280c210fde867063551c52afe5e76198add5cfd5af960ab55b3f0cd617492e262658c
6
+ metadata.gz: 9cf25e0c145ec59512e2e53b52b7dc8e0146568153c04482f8832341389716d7f7682982b273ffebafebb9a0f0b579ac72cc8fee2141415f96ca652946c2f8be
7
+ data.tar.gz: 15d806949cb3f91884cd09b3aa13bf9de30f0264e6ad2ab6a059531394e1d5016752ff1c01ab1fd19d4d82e513e4b465412ba685cef8cad646903baa9953a7ca
data/CHANGELOG.md CHANGED
@@ -6,11 +6,55 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [17.1.0] - 2021-12-17
10
+
11
+ * Add append_to support to `BakeChapterSummary` (minor)
12
+ * Add support for italicized terms in index (minor)
13
+ * Fix problem with namespaces in `BakeLinkPlaceholders` and `BakeIndex` (minor)
14
+ * Create `V3` for `BakeChapterReferences` which sorts references alphabetically (minor)
15
+
16
+ ## [17.0.0] - 2021-12-3
17
+
18
+ * Create method in `Integer` class that generate roman numbers up to 100 (minor)
19
+ * Add more roman numbers to `Integer` class (patch)
20
+ * Create `V2` for `BakeChapterReferences` (minor)
21
+ * Create `BakeExercisePrefixes` direction adding prefixes for exercises in selected sections (minor)
22
+ * Add support for 'text-heavy-top-titled' tables in `BakeTableBody` (minor)
23
+ * Remove `Nokigiri#previous` patch, `ElementBase#previous` now uses `#previous_element` (minor)
24
+ * Modifies `BakeAnnotationClasses` for annotations wrapper to be a `span` intead of a `div` (major)
25
+
26
+ ## [16.0.0] - 2021-11-19
27
+
28
+ * Add reference link separator to `BakeReferences.v1` (patch)
29
+ * Modify `BakeFootnotes` to be more general (minor)
30
+ * Add `#preceded_by_text` method to element_base and the nokigiri patch (minor)
31
+ * Remove `Nokigiri#previous` patch, `ElementBase#previous` now uses `#previous_element` (minor)
32
+ * Broaden caption selection for `BakeNumberedTable#v2` (patch)
33
+ * Add details of question count to injected exercises in `BakeInjectedExercise` (major)
34
+ * Add target labels to chapter content module pages option in `BakeNonIntroductionPages`, create a separate directory `BakeLOLinkLabels` to add `.label-text`, `.label-counter` spans wrappers for links with `.lo-reference` class (minor)
35
+ * Add `BakeScreenreaderSpans` direction (minor)
36
+ * Fix `BakeIndex` to group terms by character in polish books and transliterate it for others (minor)
37
+ * Add optional bake `exercies-context` figure_reference if there is one present in singular part exercises to `BakeInjectedExercise`,`BakeInjectedQuestion` to move it down from exercise to question problem container. (major)
38
+ * Create v3 for autotitled exercises with os-hasSolution class
39
+
40
+ ## [15.0.0] - 2021-11-05
41
+
42
+ * Add unstyled tables to `BakeTableBody` (minor)
43
+ * Add to `BakeNumberedExercises` rules for baking exercises in appendecies (minor)
44
+ * Add `BakeUnnumberedExercise` direction (minor)
45
+ * Change whitespace for `BakeIndex` and `BakeExample` (major)
46
+ * Add `BakeAllNumberedExerciseTypes` direction for easier baking of compound sections (minor)
47
+ * Add `solution_stays_put` option for `BakeNumberedExercise` (minor)
48
+ * Add `BakeAllChapterSolutionsTypes` direction to move injected solutions and regular ones to EOC (minor)
49
+ * Refactor: moves all `Answer key strategies` that are book-specific to the
50
+ recipes side and keeps the `Default Strategy`in kitchen (major)
51
+ * Adds missing spanish translations (minor)
52
+
9
53
  ## [14.0.0] - 2021-10-22
10
54
 
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)
55
+ * Fix `BakeAutotitledExercise` V2 to stop breaking for exercises without solutions (patch)
56
+ * Add `BakeAutotitledExercise` V2 (minor)
57
+ * Fix `BakeChapterGlossary::V1` to stop adding an empty wrapper if there is no content (patch)
14
58
  * Create `BakeNoteExercise` and `BakeNoteInjectedQuestion` and support exercises in `BakeUnclassifiedNotes` (minor)
15
59
  * Add baking section with class `column header` to `BakeAppendix` (patch)
16
60
  * 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 (17.1.0)
5
5
  activesupport
6
6
  i18n
7
7
  nokogiri
@@ -11,7 +11,7 @@ PATH
11
11
  GEM
12
12
  remote: https://rubygems.org/
13
13
  specs:
14
- activesupport (6.1.4.1)
14
+ activesupport (6.1.4.4)
15
15
  concurrent-ruby (~> 1.0, >= 1.0.2)
16
16
  i18n (>= 1.6, < 2)
17
17
  minitest (>= 5.1)
@@ -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
@@ -99,7 +99,7 @@ GEM
99
99
  tins (~> 1.0)
100
100
  tins (1.26.0)
101
101
  sync
102
- twitter_cldr (6.7.0)
102
+ twitter_cldr (6.9.0)
103
103
  camertron-eprun
104
104
  cldr-plurals-runtime-rb (~> 1.1)
105
105
  tzinfo
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
@@ -20,9 +20,18 @@ module Kitchen::Directions::BakeAnnotationClasses
20
20
  kinesthetic-icon]
21
21
  annotation_icon_classes.each do |annotation_icon_class|
22
22
  book.search("p.#{annotation_icon_class}").each do |annotation_with_icon_class|
23
- annotation_with_icon_class.search('div.os-icons').first.append(child:
23
+ annotation_with_icon_class.search('div.os-icons').first&.name = 'span'
24
+
25
+ icon_title = I18n.t(:"annotation_icons.#{annotation_icon_class}.title")
26
+
27
+ annotation_with_icon_class.search('span.os-icons').first.append(child:
24
28
  <<~HTML
25
- <span class = "#{annotation_icon_class}"></span>
29
+ <span
30
+ class = "#{annotation_icon_class}"
31
+ role="img"
32
+ title="#{icon_title}"
33
+ aria-label="#{icon_title}"
34
+ ></span>
26
35
  HTML
27
36
  )
28
37
  end
@@ -10,6 +10,10 @@ module Kitchen
10
10
  def self.v2(exercise:, title:)
11
11
  V2.new.bake(exercise: exercise, title: title)
12
12
  end
13
+
14
+ def self.v3(exercise:, title:)
15
+ V3.new.bake(exercise: exercise, title: title)
16
+ end
13
17
  end
14
18
  end
15
19
  end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kitchen::Directions::BakeAutotitledExercise
4
+ # Differences from V2:
5
+ # 1. Exercise with solution has class os-hasSolution
6
+ # 2. Solution id is based on exercise id
7
+ class V3
8
+ def bake(exercise:, title:)
9
+ exercise.add_class('unnumbered')
10
+ exercise.titles.first&.trash
11
+
12
+ # bake problem
13
+ exercise.prepend(child:
14
+ <<~HTML
15
+ <h3 class="os-title" data-type="title">
16
+ <span class="os-title-label">#{title}</span>
17
+ </h3>
18
+ HTML
19
+ )
20
+ exercise.problem.wrap_children(class: 'os-problem-container')
21
+ return unless exercise.solution
22
+
23
+ exercise.add_class('os-hasSolution')
24
+ exercise.solution.id = "#{exercise.id}-solution"
25
+ exercise.solution.wrap_children(class: 'os-solution-container')
26
+ exercise.solution.prepend(child:
27
+ <<~HTML
28
+ <h4 class="solution-title" data-type="title">
29
+ <span class="os-text">#{I18n.t(:solution)}</span>
30
+ </h4>
31
+ HTML
32
+ )
33
+ end
34
+ end
35
+ end
@@ -10,6 +10,21 @@ module Kitchen
10
10
  uuid_prefix: uuid_prefix,
11
11
  klass: klass)
12
12
  end
13
+
14
+ def self.v2(chapter:, metadata_source:, uuid_prefix: '.', klass: 'references')
15
+ V2.new.bake(
16
+ chapter: chapter,
17
+ metadata_source: metadata_source,
18
+ uuid_prefix: uuid_prefix,
19
+ klass: klass)
20
+ end
21
+
22
+ def self.v3(chapter:, metadata_source:, uuid_prefix: '.')
23
+ V3.new.bake(
24
+ chapter: chapter,
25
+ metadata_source: metadata_source,
26
+ uuid_prefix: uuid_prefix)
27
+ end
13
28
  end
14
29
  end
15
30
  end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kitchen::Directions::BakeChapterReferences
4
+ class V2
5
+ def bake(chapter:, metadata_source:, uuid_prefix: '.', klass: 'references')
6
+ chapter.pages.each do |page|
7
+ bake_page_cite(page: page)
8
+ bake_page_references(page: page)
9
+ end
10
+
11
+ return if chapter.pages.references.none?
12
+
13
+ content = chapter.pages.references.cut.paste
14
+
15
+ Kitchen::Directions::CompositePageContainer.v1(
16
+ container_key: klass,
17
+ uuid_key: "#{uuid_prefix}#{klass}",
18
+ metadata_source: metadata_source,
19
+ content: content,
20
+ append_to: chapter
21
+ )
22
+ end
23
+
24
+ def bake_page_cite(page:)
25
+ page.search('[data-type="cite"]').each do |link|
26
+ link.id = "#{page.id}-endNote#{link.count_in(:chapter)}"
27
+
28
+ link.prepend(child:
29
+ <<~HTML
30
+ <sup class="os-end-note-number">#{link.count_in(:chapter)}</sup>
31
+ HTML
32
+ )
33
+
34
+ link.search('.delete-me').trash
35
+ end
36
+ end
37
+
38
+ def bake_page_references(page:)
39
+ page.references.each do |reference|
40
+ Kitchen::Directions::RemoveSectionTitle.v1(section: reference)
41
+
42
+ reference.search('a').each do |ref_link|
43
+ ref_link.replace_children(with:
44
+ <<~HTML
45
+ <span>#{ref_link.count_in(:chapter)}.</span>
46
+ HTML
47
+ )
48
+ ref_link.href = "##{page.id}-endNote#{ref_link.count_in(:chapter)}"
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,45 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kitchen::Directions::BakeChapterReferences
4
+ class V3
5
+ class Reference
6
+ attr_reader :element
7
+
8
+ def initialize(element)
9
+ reference_item = Kitchen::I18nString.new(element.text.downcase)
10
+ @sortable = [reference_item]
11
+ @element = element
12
+ end
13
+
14
+ def <=>(other)
15
+ sortable <=> other.sortable
16
+ end
17
+
18
+ protected
19
+
20
+ attr_reader :sortable
21
+ end
22
+
23
+ def bake(chapter:, metadata_source:, append_to: nil, uuid_prefix: '.')
24
+ @references = []
25
+
26
+ chapter.references.search('p').each do |reference_element|
27
+ @references.push(Reference.new(reference_element.cut))
28
+ end
29
+
30
+ chapter.references.trash
31
+
32
+ content = @references.sort.map { |reference| reference.element.paste }.join
33
+
34
+ return if content.empty?
35
+
36
+ Kitchen::Directions::CompositePageContainer.v1(
37
+ container_key: 'references',
38
+ uuid_key: "#{uuid_prefix}references",
39
+ metadata_source: metadata_source,
40
+ content: content,
41
+ append_to: append_to || chapter
42
+ )
43
+ end
44
+ end
45
+ end
@@ -5,17 +5,18 @@ module Kitchen
5
5
  # Bake directions for eoc summary
6
6
  #
7
7
  module BakeChapterSummary
8
- def self.v1(chapter:, metadata_source:, klass: 'summary', uuid_prefix: '.')
8
+ def self.v1(chapter:, metadata_source:, klass: 'summary', uuid_prefix: '.', append_to: nil)
9
9
  V1.new.bake(
10
10
  chapter: chapter,
11
11
  metadata_source: metadata_source,
12
12
  uuid_prefix: uuid_prefix,
13
- klass: klass
13
+ klass: klass,
14
+ append_to: append_to
14
15
  )
15
16
  end
16
17
 
17
18
  class V1
18
- def bake(chapter:, metadata_source:, uuid_prefix: '.', klass: 'summary')
19
+ def bake(chapter:, metadata_source:, uuid_prefix: '.', klass: 'summary', append_to: nil)
19
20
  summaries = Clipboard.new
20
21
 
21
22
  chapter.pages.each do |page|
@@ -36,7 +37,7 @@ module Kitchen
36
37
  uuid_key: "#{uuid_prefix}#{klass}",
37
38
  metadata_source: metadata_source,
38
39
  content: summaries.paste,
39
- append_to: chapter
40
+ append_to: append_to || chapter
40
41
  )
41
42
  end
42
43
  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>
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kitchen
4
+ module Directions
5
+ module BakeExercisePrefixes
6
+ def self.v1(chapter:, sections_prefixed:)
7
+ V1.new.bake(
8
+ chapter: chapter,
9
+ sections_prefixed: sections_prefixed
10
+ )
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kitchen::Directions::BakeExercisePrefixes
4
+ class V1
5
+ def bake(chapter:, sections_prefixed:)
6
+ sections_prefixed.each do |section_key|
7
+ chapter.composite_pages.each do |composite_page|
8
+ composite_page.search("section.#{section_key}").exercises.each do |exercise|
9
+ problem = exercise.problem
10
+ exercise_prefix =
11
+ "<span class='os-text'>#{I18n.t(:"sections_prefixed.#{section_key}")}</span>"
12
+ problem.prepend(child:
13
+ <<~HTML
14
+ #{exercise_prefix}
15
+ HTML
16
+ )
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -30,7 +30,7 @@ module Kitchen::Directions::BakeFootnotes
30
30
  aside_id_to_footnote_number[aside_id] = footnote_number
31
31
  if anchor.parent.name == 'p'
32
32
  anchor.parent.add_class('has-noteref')
33
- elsif anchor.parent.name == 'em' && anchor.parent.parent.name == 'p'
33
+ elsif anchor.parent.name != 'p' && anchor.parent.parent.name == 'p'
34
34
  anchor.parent.parent.add_class('has-noteref')
35
35
  end
36
36
  end
@@ -11,12 +11,14 @@ module Kitchen::Directions::BakeIndex
11
11
  attr_reader :id
12
12
  attr_reader :group_by
13
13
  attr_reader :page_title
14
+ attr_reader :italicized
14
15
 
15
- def initialize(text:, id:, group_by:, page_title:)
16
+ def initialize(text:, id:, group_by:, page_title:, italicized:)
16
17
  @text = text.strip
17
18
  @id = id
18
19
  @group_by = group_by
19
20
  @page_title = page_title
21
+ @italicized = italicized
20
22
  end
21
23
  end
22
24
 
@@ -126,7 +128,8 @@ module Kitchen::Directions::BakeIndex
126
128
  page = term_element.ancestor(:page)
127
129
  term_element.id = "auto_#{page.id}_term#{term_element.count_in(:book)}"
128
130
  page_title = page.title.text
129
- add_term_to_index(term_element, page_title)
131
+ term_italicized = term_element&.first("em[data-effect='italics']")
132
+ add_term_to_index(term_element, page_title, term_italicized)
130
133
  end
131
134
 
132
135
  book.chapters.composite_pages.terms.each do |term_element|
@@ -135,7 +138,8 @@ module Kitchen::Directions::BakeIndex
135
138
  term_element.id = "auto_composite_page_term#{term_element.count_in(:book)}"
136
139
  chapter_number = chapter.count_in(:book)
137
140
  page_title = "#{chapter_number} #{page.title.text.strip}".strip
138
- add_term_to_index(term_element, page_title)
141
+ term_italicized = term_element&.first("em[data-effect='italics']")
142
+ add_term_to_index(term_element, page_title, term_italicized)
139
143
  end
140
144
 
141
145
  types.each do |type|
@@ -150,22 +154,22 @@ module Kitchen::Directions::BakeIndex
150
154
  end
151
155
  end
152
156
 
153
- def add_term_to_index(term_element, page_title)
157
+ def add_term_to_index(term_element, page_title, term_italicized)
154
158
  type =
155
159
  if !term_element.key?('index')
156
160
  'term'
157
- elsif term_element['cxlxt:index'] == 'name'
161
+ elsif term_element['cxlxt:index'] == 'name' || term_element['index'] == 'name'
158
162
  'name'
159
- elsif term_element['cxlxt:index'] == 'foreign'
163
+ elsif term_element['cxlxt:index'] == 'foreign' || term_element['index'] == 'foreign'
160
164
  'foreign'
161
165
  end
162
166
 
163
167
  if term_element.key?('reference')
164
- term_reference = term_element['cmlnle:reference']
168
+ term_reference = term_element['cmlnle:reference'] || term_element['reference']
165
169
  group_by = term_reference[0]
166
170
  content = term_reference
167
171
  else
168
- group_by = I18n.transliterate(term_element.text.strip[0])
172
+ group_by = I18n.character_to_group(term_element.text.strip[0])
169
173
  content = term_element.text
170
174
  end
171
175
 
@@ -175,6 +179,7 @@ module Kitchen::Directions::BakeIndex
175
179
  # Add it to our index object
176
180
  @indexes[type].add_term(
177
181
  Term.new(
182
+ italicized: term_italicized,
178
183
  text: content,
179
184
  id: term_element.id,
180
185
  group_by: group_by,
@@ -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 %>
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 %>
14
+ <%- item.terms.each_with_index do |term, ii| -%>
15
+ <%- if ii == 0 -%>
16
+ <span class="os-term" group-by="<%= term.group_by %>"><%- if term.italicized -%><em data-effect="italics"><%= term.text %></em><%- else -%><%= term.text %><% end %></span>
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>
@@ -7,12 +7,21 @@ module Kitchen::Directions::BakeInjectedExercise
7
7
 
8
8
  class V1
9
9
  def bake(exercise:)
10
- context = exercise.search('div[data-type="exercise-context"]')&.first
10
+ question_count = exercise.injected_questions.count
11
+ exercise[:'data-question-count'] = question_count
12
+ exercise[:'data-is-multipart'] = question_count > 1 ? 'True' : 'False'
13
+
14
+ context = exercise&.exercise_context
15
+
11
16
  return unless context
12
17
 
13
18
  # link replacement is done by BakeLinkPlaceholders
14
19
  link = context.first('a').cut
15
20
  context.replace_children(with: "#{I18n.t(:context_lead_text)}#{link.paste}")
21
+ return unless question_count == 1
22
+
23
+ question = exercise.exercise_question
24
+ question.prepend(child: context.cut.paste)
16
25
  end
17
26
  end
18
27
  end
@@ -41,11 +41,15 @@ module Kitchen::Directions::BakeInjectedExerciseQuestion
41
41
  end
42
42
  end
43
43
 
44
+ context = question.exercise_context_in_question&.cut&.paste
45
+
44
46
  question.prepend(child:
45
47
  <<~HTML
46
48
  #{problem_number unless only_number_solution}
47
49
  #{"<span class='os-divider'>. </span>" unless only_number_solution}
48
50
  <div class="os-problem-container">
51
+ #{context if context.present?}
52
+ #{"<span class='os-divider'>. </span>" if context.present?}
49
53
  #{question.stimulus&.cut&.paste}
50
54
  #{question.stem.cut.paste}
51
55
  #{question.answers&.cut&.paste}
@@ -9,7 +9,7 @@ module Kitchen
9
9
  book.search('a').each do |anchor|
10
10
  next unless anchor.text == '[link]'
11
11
 
12
- label_case = anchor['cmlnle:case']
12
+ label_case = anchor['cmlnle:case'] || anchor['case']
13
13
  id = anchor[:href][1..-1]
14
14
 
15
15
  if cases
@@ -0,0 +1,19 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kitchen
4
+ module Directions
5
+ # Bake directions for LO link labels
6
+ module BakeLOLinkLabels
7
+ def self.v1(book:)
8
+ book.search('a.lo-reference').each do |anchor|
9
+ anchor.wrap_children('span', class: 'label-counter')
10
+ anchor.prepend(child:
11
+ <<~HTML
12
+ <span class="label-text">#{I18n.t(:lo_label_text)}</span>
13
+ HTML
14
+ )
15
+ end
16
+ end
17
+ end
18
+ end
19
+ end
@@ -3,13 +3,15 @@
3
3
  module Kitchen
4
4
  module Directions
5
5
  module BakeNonIntroductionPages
6
- def self.v1(chapter:)
6
+ def self.v1(chapter:, add_target_label: false)
7
7
  chapter.non_introduction_pages.each do |page|
8
8
  number = "#{chapter.count_in(:book)}.#{page.count_in(:chapter)}"
9
9
 
10
10
  page.search("div[data-type='description']").each(&:trash)
11
11
  page.add_class('chapter-content-module')
12
12
 
13
+ page.target_label(custom_content: number) if add_target_label
14
+
13
15
  title = page.title
14
16
  title.name = 'h2'
15
17
  title.replace_children(with: