openstax_kitchen 14.0.0 → 17.1.0

Sign up to get free protection for your applications and to get access to all the features.
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: