openstax_kitchen 11.0.0 → 12.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 (71) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +52 -0
  3. data/Gemfile.lock +2 -2
  4. data/lib/kitchen/chapter_element.rb +7 -0
  5. data/lib/kitchen/composite_page_element.rb +8 -0
  6. data/lib/kitchen/directions/bake_accessibility_fixes.rb +11 -0
  7. data/lib/kitchen/directions/bake_autotitled_exercise/main.rb +11 -0
  8. data/lib/kitchen/directions/bake_autotitled_exercise/v1.rb +28 -0
  9. data/lib/kitchen/directions/bake_chapter_introductions/bake_chapter_objectives.rb +48 -0
  10. data/lib/kitchen/directions/bake_chapter_introductions/bake_chapter_outline.rb +14 -0
  11. data/lib/kitchen/directions/bake_chapter_introductions/main.rb +43 -0
  12. data/lib/kitchen/directions/bake_chapter_introductions/v1.rb +16 -0
  13. data/lib/kitchen/directions/bake_chapter_introductions/v2.rb +91 -0
  14. data/lib/kitchen/directions/bake_chapter_references/v1.rb +2 -0
  15. data/lib/kitchen/directions/bake_custom_sections/main.rb +14 -0
  16. data/lib/kitchen/directions/bake_custom_sections/v1.rb +42 -0
  17. data/lib/kitchen/directions/bake_eoc_section_content/remove_section_title.rb +2 -2
  18. data/lib/kitchen/directions/bake_equations.rb +2 -3
  19. data/lib/kitchen/directions/bake_example.rb +7 -8
  20. data/lib/kitchen/directions/bake_figure.rb +8 -5
  21. data/lib/kitchen/directions/bake_footnotes/v1.rb +5 -1
  22. data/lib/kitchen/directions/bake_free_response/v1.rb +3 -1
  23. data/lib/kitchen/directions/bake_iframes/main.rb +11 -0
  24. data/lib/kitchen/directions/bake_iframes/v1.rb +25 -0
  25. data/lib/kitchen/directions/bake_index/main.rb +2 -2
  26. data/lib/kitchen/directions/bake_index/v1.rb +39 -7
  27. data/lib/kitchen/directions/bake_index/v1.xhtml.erb +3 -3
  28. data/lib/kitchen/directions/bake_injected_exercise.rb +18 -0
  29. data/lib/kitchen/directions/bake_injected_exercise_question.rb +71 -0
  30. data/lib/kitchen/directions/{bake_page_abstracts.rb → bake_learning_objectives.rb} +10 -5
  31. data/lib/kitchen/directions/bake_link_placeholders.rb +15 -2
  32. data/lib/kitchen/directions/bake_lists_with_para.rb +3 -3
  33. data/lib/kitchen/directions/bake_notes/bake_autotitled_notes.rb +25 -5
  34. data/lib/kitchen/directions/bake_notes/bake_note_subtitle.rb +6 -2
  35. data/lib/kitchen/directions/bake_notes/bake_numbered_notes/main.rb +13 -3
  36. data/lib/kitchen/directions/bake_notes/bake_numbered_notes/v1.rb +29 -25
  37. data/lib/kitchen/directions/bake_notes/bake_numbered_notes/v2.rb +22 -17
  38. data/lib/kitchen/directions/bake_notes/bake_numbered_notes/v3.rb +32 -22
  39. data/lib/kitchen/directions/bake_numbered_exercise/main.rb +3 -2
  40. data/lib/kitchen/directions/bake_numbered_exercise/v1.rb +6 -24
  41. data/lib/kitchen/directions/bake_numbered_table/bake_table_body.rb +3 -3
  42. data/lib/kitchen/directions/bake_numbered_table/main.rb +4 -4
  43. data/lib/kitchen/directions/bake_numbered_table/v1.rb +5 -3
  44. data/lib/kitchen/directions/bake_numbered_table/v2.rb +5 -3
  45. data/lib/kitchen/directions/bake_references/main.rb +3 -2
  46. data/lib/kitchen/directions/bake_references/v1.rb +8 -3
  47. data/lib/kitchen/directions/bake_stepwise.rb +1 -1
  48. data/lib/kitchen/directions/bake_toc.rb +1 -1
  49. data/lib/kitchen/directions/move_solutions_to_answer_key/move_solutions_from_exercise_section.rb +1 -7
  50. data/lib/kitchen/directions/move_solutions_to_answer_key/move_solutions_from_numbered_note.rb +1 -7
  51. data/lib/kitchen/directions/move_solutions_to_answer_key/strategies/contemporary_math.rb +17 -0
  52. data/lib/kitchen/element_base.rb +46 -2
  53. data/lib/kitchen/element_enumerator_base.rb +35 -0
  54. data/lib/kitchen/example_element.rb +2 -1
  55. data/lib/kitchen/exercise_element.rb +42 -0
  56. data/lib/kitchen/figure_element.rb +1 -1
  57. data/lib/kitchen/injected_question_element.rb +77 -0
  58. data/lib/kitchen/injected_question_element_enumerator.rb +21 -0
  59. data/lib/kitchen/metadata_element.rb +6 -1
  60. data/lib/kitchen/note_element.rb +13 -5
  61. data/lib/kitchen/selectors/base.rb +6 -0
  62. data/lib/kitchen/selectors/standard_1.rb +3 -0
  63. data/lib/kitchen/solution_element_enumerator.rb +21 -0
  64. data/lib/kitchen/version.rb +1 -1
  65. data/lib/locales/en.yml +6 -4
  66. data/lib/locales/es.yml +5 -4
  67. data/lib/locales/pl.yml +52 -7
  68. metadata +21 -7
  69. data/lib/kitchen/directions/bake_chapter_introductions/chapter_introduction.xhtml.erb +0 -0
  70. data/lib/kitchen/directions/bake_chapter_introductions.rb +0 -65
  71. data/lib/kitchen/directions/bake_notes/bake_note_iframes.rb +0 -27
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: e6964a7fe85234e82e7f54f3b6d4980633f4f4c29c49d3123743c214d9f46653
4
- data.tar.gz: 2426f1990ae74d35d2ac098bcf7d5c09aa5094eeef598dd9658d8fedf97916c4
3
+ metadata.gz: 28254d4a9107528ff5dbebacc82e5cc3cbf20e71fcc9d8303c2f41fd90d2d4be
4
+ data.tar.gz: 2c71714f62fe45ea772614d5c72f6a95ce59deebc63e1259b182e25d70481400
5
5
  SHA512:
6
- metadata.gz: faba0041d8c958c3ffa369dbe2d0c5453f8a236bedd0654e362afa65c84093ec22771dadaa9a313e688f6644681267b63f263ba60af9d1b81a211bc3c98a5df1
7
- data.tar.gz: a1e8ff40b3377508904ab62980302f129527755512f58506c805d7ae1507977ce65f1c993786cdeffc5f3871e4448e5d4df264979539d60f995d7f9c7b3ece48
6
+ metadata.gz: dfaf9123a29ef2bedddb524ed7758b1092c88c6cbc850aeee0d4530633783ab2cbec39b68f3b5fc391219f344f191c4714f779ef8efc57c7f35c47d075eb813e
7
+ data.tar.gz: c686d00ca4305b0f90f23c4ba2cfb3151a5c0384f7979e82fe16d5432a9e79b32705822aeae244601343d3620e053247b848edf78631c59f93a920e312d7951d
data/CHANGELOG.md CHANGED
@@ -6,6 +6,57 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
6
6
 
7
7
  ## [Unreleased]
8
8
 
9
+ ## [12.1.0] - 2021-09-24
10
+
11
+ * Fix `BakeExample#titles_to_rename` to exclude exercise titles (patch)
12
+ * Modify `BakeFigure` to bake unnumbered figures with caption (minor)
13
+ * Fix `NoteElement#title` to be more specific about finding the title (patch)
14
+ * Adds `data-type="slug"` to `metadata_lement` `children_to_keep` method, updates spec helper `metadata_element` and related spec files(minor)
15
+
16
+ ## [12.0.0] - 2021-09-21
17
+
18
+ * Fixes `BakeStepwise` to skip nested lists (patch)
19
+ * Adds an optional selector to `RemoveSectionTitles` (minor)
20
+ * Patches `BakeFreeResponse` to only delete the first h3, not all h3s (patch)
21
+ * Lets `BakeExample` not count titles in lists as commentary titles (minor)
22
+ * Renames `BakePageAbstracts` to `BakeLearningObjectives` and adds optional parameter for titles in `v2` (major)
23
+ * Gets rid of extraneous titles in `BakeAutoTitledNotes` when subtitles are off (minor)
24
+ * Adds `BakeAutotitledExercise` direction and the option to `bake_unclassified_exercises` within `BakeAutotitledNotes`
25
+ * Adds optional numbering for `BakeReferences.v1` (minor)
26
+ * Patches`BakeNumberedNotes.v3` to suppress solutions outside examples when suppress_solutions is true (minor)
27
+
28
+ ## [11.2.0] - 2021-09-10
29
+
30
+ * Adds `BakeAccessibilityFixes` direction for (minor)
31
+ * Remove deprecation warning from `BakeChapterIntroductions.v1` and adapted to be used like `.v2` (minor)
32
+ * Small class fix for `BakeFootnotes.v1` (patch)
33
+ * Fix `BakeNumberedNotes` to find related example better (minor)
34
+ * Small fix for parameter in `bake_note` definition (minor)
35
+ * Small fixes to return when no elements are found and not add an empty wrapper in `BakeChapterReferences` and
36
+ `BakeFreeResponse` (minor)
37
+ * Adding class `os-timeline-table-container` to numbered tables when required (minor)
38
+ * Fix `BakeExample` to catch the multiple solutions to one exercise (patch)
39
+
40
+ ## [11.1.0] - 2021-08-30
41
+
42
+ * Update injected questions to synthesize ids during baking (minor)
43
+ * Fix `BakeListsWithPara` to copy all children from para not just text (minor)
44
+ * Implement labels with cases to `BakeAutotitledNotes` and `BakeNumberedNotes` (minor)
45
+ * Add ids to injected questions (minor)
46
+ * Create `BakeIframes` outer directory to allow bake iframes also from outside notes, remove `BakeNoteIFrames` module from notes directory (minor)
47
+ * Update the contemporary math `Strategy` to target injected solution sections (minor)
48
+ * Update `BakeNumberedNotes` to handle injected questions in notes (minor)
49
+ * Create `InjectedQuestionElement` and `InjectedQuestionElementEnumerator` classes (minor)
50
+ * Create `BakeInjectedExercise` and `BakeInjectedExerciseQuestion` directions (minor)
51
+ * Update `MoveSolutionsFromExerciseSection` and `MoveSolutionsFromNumberedNote` to move injected solutions (minor)
52
+ * Add `SolutionElementEnumerator` to support the above (minor)
53
+ * Remove multipart exercise baking from `BakeNumberedExercise`; this is now done in `InjectedExercise` directions (patch)
54
+ * Modify target labels to use grammatical cases (minor)
55
+ * Modify `BakeIndex` to bake multiple types of indexes (minor)
56
+ * Create `v2` in `BakeChapterIntroductions` that should replace `v1` (minor)
57
+ * Added a DEPRECATION warning in `v1` for `BakeChapterIntroductions` (minor)
58
+ * Added a bit more description to deprecation warning for `BakeChapterIntroductions.v1` (minor)
59
+
9
60
  ## [11.0.0] - 2021-08-6
10
61
 
11
62
  * Add `ChangeSubsectionTitleTag` direction for modifying eoc sections (minor)
@@ -20,6 +71,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
20
71
  * Adds `PageElement#count_in_chapter_without_intro_page` (minor)
21
72
  * Adds `ChapterElement#has_introduction?` (minor)
22
73
  * Adds `BakeFolio` to set spanish translation variables in the html tag for folio-pdf purposes (minor)
74
+ * Create `BakeCustomSections` direction for English Composition (minor)
23
75
  * Create `BakeAnnotationClasses` v1 for English Composition (minor)
24
76
 
25
77
  ## [10.0.0] - 2021-07-30
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- openstax_kitchen (11.0.0)
4
+ openstax_kitchen (12.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)
14
+ activesupport (6.1.4.1)
15
15
  concurrent-ruby (~> 1.0, >= 1.0.2)
16
16
  i18n (>= 1.6, < 2)
17
17
  minitest (>= 5.1)
@@ -68,5 +68,12 @@ module Kitchen
68
68
  search('div[data-type="abstract"]')
69
69
  end
70
70
 
71
+ # Returns an enumerator for the learning objectives
72
+ #
73
+ # @return [ElementEnumerator]
74
+ #
75
+ def learning_objectives
76
+ search('section.learning-objectives')
77
+ end
71
78
  end
72
79
  end
@@ -41,6 +41,14 @@ module Kitchen
41
41
  has_class?('os-index-container')
42
42
  end
43
43
 
44
+ # Returns true if this page is a book index of type
45
+ #
46
+ # @return [Boolean]
47
+ #
48
+ def is_index_of_type?
49
+ (self[:class] || '').match?(/os-index-.+-container/)
50
+ end
51
+
44
52
  # In books we can find two types of EOB References.
45
53
  #
46
54
  # One of them has form similar to footnotes. There are citation links in the text that provides
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kitchen
4
+ module Directions
5
+ module BakeAccessibilityFixes
6
+ def self.v1(section:)
7
+ section.search('ol[data-number-style="lower-alpha"]').each { |ol| ol['type'] = 'a' }
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kitchen
4
+ module Directions
5
+ module BakeAutotitledExercise
6
+ def self.v1(exercise:, number: nil)
7
+ V1.new.bake(exercise: exercise, number: number)
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kitchen::Directions::BakeAutotitledExercise
4
+ class V1
5
+ def bake(exercise:, number:)
6
+ exercise.add_class('unnumbered') unless number
7
+
8
+ # bake problem
9
+ exercise.problem.wrap_children('div', class: 'os-problem-container')
10
+ exercise.problem.prepend(child:
11
+ <<~HTML
12
+ <h4 class="exercise-title" data-type="title">#{exercise.autogenerated_title}</h4>
13
+ HTML
14
+ )
15
+ return unless exercise.solution
16
+
17
+ # bake solution in place
18
+ exercise.solution.wrap_children('div', class: 'os-solution-container')
19
+ exercise.solution.prepend(child:
20
+ <<~HTML
21
+ <h4 class="solution-title" data-type="title">
22
+ <span class="os-text">#{I18n.t(:"exercises.solution")}</span>
23
+ </h4>
24
+ HTML
25
+ )
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kitchen::Directions::BakeChapterIntroductions
4
+ class BakeChapterObjectives
5
+ def bake(chapter:, strategy:)
6
+ case strategy
7
+ when :default
8
+ bake_as_note(chapter: chapter)
9
+ when :add_objectives
10
+ add_chapter_objectives(chapter: chapter)
11
+ when :none
12
+ ''
13
+ else
14
+ raise 'No such strategy'
15
+ end
16
+ end
17
+
18
+ def bake_as_note(chapter:)
19
+ chapter_objectives_note = chapter.notes('$.chapter-objectives').first
20
+
21
+ return unless chapter_objectives_note.present?
22
+
23
+ # trash existing title
24
+ chapter_objectives_note.titles.first&.trash
25
+ Kitchen::Directions::BakeAutotitledNotes.v1(
26
+ book: chapter,
27
+ classes: %w[chapter-objectives],
28
+ bake_subtitle: false
29
+ )
30
+
31
+ chapter_objectives_note.cut.paste
32
+ end
33
+
34
+ def add_chapter_objectives(chapter:)
35
+ chapter.non_introduction_pages.map do |page|
36
+ <<~HTML
37
+ <div class="os-chapter-objective">
38
+ <a class="os-chapter-objective" href="##{page.title[:id]}">
39
+ <span class="os-number">#{chapter.count_in(:book)}.#{page.count_in(:chapter)}</span>
40
+ <span class="os-divider"> </span>
41
+ <span data-type="" itemprop="" class="os-text">#{page.title.children[0].text}</span>
42
+ </a>
43
+ </div>
44
+ HTML
45
+ end.join('')
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kitchen::Directions::BakeChapterIntroductions
4
+ class BakeChapterOutline
5
+ def bake(chapter_objectives_html:)
6
+ <<~HTML
7
+ <div class="os-chapter-outline">
8
+ <h3 class="os-title">#{I18n.t(:chapter_outline)}</h3>
9
+ #{chapter_objectives_html}
10
+ </div>
11
+ HTML
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kitchen
4
+ module Directions
5
+ module BakeChapterIntroductions
6
+ def self.v1(book:)
7
+ V1.new.bake(
8
+ book: book
9
+ )
10
+ end
11
+
12
+ def self.v2(
13
+ book:,
14
+ strategy_options: {
15
+ strategy: :default, bake_chapter_outline: false, introduction_order: :v1
16
+ }
17
+ )
18
+ V2.new.bake(
19
+ book: book,
20
+ strategy_options: strategy_options
21
+ )
22
+ end
23
+
24
+ def self.bake_chapter_objectives(chapter:, strategy:)
25
+ BakeChapterObjectives.new.bake(
26
+ chapter: chapter,
27
+ strategy: strategy
28
+ )
29
+ end
30
+
31
+ def self.bake_chapter_outline(chapter_objectives_html:)
32
+ BakeChapterOutline.new.bake(
33
+ chapter_objectives_html: chapter_objectives_html
34
+ )
35
+ end
36
+
37
+ def self.v1_update_selectors(something_with_selectors)
38
+ something_with_selectors.selectors.title_in_introduction_page =
39
+ ".intro-text > [data-type='document-title']"
40
+ end
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kitchen::Directions::BakeChapterIntroductions
4
+ class V1
5
+ def bake(book:)
6
+ Kitchen::Directions::BakeChapterIntroductions.v2(
7
+ book: book,
8
+ strategy_options: {
9
+ strategy: :add_objectives,
10
+ bake_chapter_outline: true,
11
+ introduction_order: :v1
12
+ }
13
+ )
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,91 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kitchen::Directions::BakeChapterIntroductions
4
+ class V2
5
+ def bake(book:, strategy_options:)
6
+ book.chapters.each do |chapter|
7
+ introduction_page = chapter.introduction_page
8
+ title = bake_title(introduction_page: introduction_page)
9
+
10
+ chapter_intro_html =
11
+ Kitchen::Directions::BakeChapterIntroductions.bake_chapter_objectives(
12
+ chapter: chapter,
13
+ strategy: strategy_options[:strategy]
14
+ )
15
+
16
+ if strategy_options[:bake_chapter_outline]
17
+ chapter_intro_html =
18
+ Kitchen::Directions::BakeChapterIntroductions.bake_chapter_outline(
19
+ chapter_objectives_html: chapter_intro_html
20
+ )
21
+ end
22
+
23
+ case strategy_options[:introduction_order]
24
+ when :v1
25
+ v1_introduction_order(
26
+ introduction_page: introduction_page,
27
+ chapter_intro_html: chapter_intro_html,
28
+ title: title
29
+ )
30
+ when :v2
31
+ v2_introduction_order(
32
+ introduction_page: introduction_page,
33
+ chapter_intro_html: chapter_intro_html,
34
+ title: title
35
+ )
36
+ end
37
+ end
38
+
39
+ Kitchen::Directions::BakeChapterIntroductions.v1_update_selectors(book)
40
+ end
41
+
42
+ def v1_introduction_order(introduction_page:, chapter_intro_html:, title:)
43
+ intro_content = introduction_page.search(
44
+ "> :not([data-type='metadata']):not(.splash):not(.has-splash)"
45
+ ).cut
46
+
47
+ introduction_page.append(child:
48
+ <<~HTML
49
+ <div class="intro-body">
50
+ #{chapter_intro_html}
51
+ <div class="intro-text">
52
+ #{title.paste}
53
+ #{intro_content.paste}
54
+ </div>
55
+ </div>
56
+ HTML
57
+ )
58
+ end
59
+
60
+ def v2_introduction_order(introduction_page:, chapter_intro_html:, title:)
61
+ if chapter_intro_html.empty?
62
+ chapter_intro_html = introduction_page.notes('$.chapter-objectives').first&.cut&.paste
63
+ end
64
+ extra_content = introduction_page.search(
65
+ '> :not([data-type="metadata"]):not(.splash):not(.has-splash)'
66
+ ).cut
67
+
68
+ introduction_page.append(child:
69
+ <<~HTML
70
+ <div class="intro-body">
71
+ #{chapter_intro_html}
72
+ <div class="intro-text">
73
+ #{title.paste}
74
+ #{extra_content.paste}
75
+ </div>
76
+ </div>
77
+ HTML
78
+ )
79
+ end
80
+
81
+ def bake_title(introduction_page:)
82
+ introduction_page.search(
83
+ 'div[data-type="description"], div[data-type="abstract"]'
84
+ ).each(&:trash)
85
+
86
+ title = introduction_page.title.cut
87
+ title.name = 'h2'
88
+ Kitchen::Directions::MoveTitleTextIntoSpan.v1(title: title)
89
+ end
90
+ end
91
+ end
@@ -7,6 +7,8 @@ module Kitchen::Directions::BakeChapterReferences
7
7
  bake_page_references(page: page)
8
8
  end
9
9
 
10
+ return if chapter.pages.references.none?
11
+
10
12
  content = chapter.pages.references.cut.paste
11
13
 
12
14
  Kitchen::Directions::EocCompositePageContainer.v1(
@@ -0,0 +1,14 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kitchen
4
+ module Directions
5
+ module BakeCustomSections
6
+ def self.v1(chapter:, custom_sections_properties:)
7
+ V1.new.bake(
8
+ chapter: chapter,
9
+ custom_sections_properties: custom_sections_properties
10
+ )
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kitchen::Directions::BakeCustomSections
4
+ class V1
5
+ def bake(chapter:, custom_sections_properties:)
6
+ custom_sections_properties.each do |_custom_section_name, property|
7
+ title_text = I18n.t(:"custom-sections.#{property[:class]}")
8
+ property_class = property[:class]
9
+ inject = property[:inject]
10
+ chapter.search(".#{property_class}").each do |custom_section|
11
+
12
+ case inject
13
+ when 'title'
14
+ custom_section_title = custom_section.first('h2')
15
+ custom_section_title_os_text = custom_section_title.first('.os-text')
16
+ custom_section_title_sibling = custom_section.first('h2 + div')
17
+ div_id = custom_section_title_sibling['id']
18
+ custom_section_title_sibling.trash
19
+ custom_section_title.append(sibling:
20
+ <<~HTML
21
+ <h3 class="os-subtitle" id="#{div_id}">#{custom_section_title_os_text.text}</h3>
22
+ HTML
23
+ )
24
+ custom_section_title_os_text.replace_children(with: title_text)
25
+ when 'subtitle'
26
+ custom_section_title = custom_section.titles.first
27
+ custom_section_title.name = 'h4'
28
+ custom_section_title.prepend(sibling:
29
+ <<~HTML
30
+ <h3 class="os-title">#{title_text}</h3>
31
+ HTML
32
+ )
33
+ when 'title_prefix'
34
+ custom_section_title = custom_section.titles.first
35
+ custom_section_title.replace_children(with: "#{title_text}: " +
36
+ custom_section_title.text)
37
+ end
38
+ end
39
+ end
40
+ end
41
+ end
42
+ end
@@ -3,8 +3,8 @@
3
3
  module Kitchen
4
4
  module Directions
5
5
  module RemoveSectionTitle
6
- def self.v1(section:)
7
- section.first('[data-type="title"]')&.trash
6
+ def self.v1(section:, selector: '')
7
+ section.first("#{selector}[data-type=\"title\"]")&.trash
8
8
  end
9
9
  end
10
10
  end
@@ -3,14 +3,13 @@
3
3
  module Kitchen
4
4
  module Directions
5
5
  module BakeEquations
6
- def self.v1(book:, number_decorator: :none)
6
+ def self.v1(book:, number_decorator: :none, cases: false)
7
7
  book.chapters.search('div[data-type="equation"]:not(.unnumbered)').each do |eq|
8
8
  chapter = eq.ancestor(:chapter)
9
9
  number = "#{chapter.count_in(:book)}.#{eq.count_in(:chapter)}"
10
10
 
11
11
  # Store label information
12
- equation_label = "#{I18n.t(:equation)} #{number}"
13
- book.pantry(name: :link_text).store equation_label, label: eq.id
12
+ eq.target_label(label_text: 'equation', custom_content: number, cases: cases)
14
13
 
15
14
  decorated_number =
16
15
  case number_decorator
@@ -3,22 +3,21 @@
3
3
  module Kitchen
4
4
  module Directions
5
5
  module BakeExample
6
- def self.v1(example:, number:, title_tag:, numbered_solutions: false)
6
+ def self.v1(example:, number:, title_tag:, numbered_solutions: false, cases: false)
7
7
  example.wrap_children(class: 'body')
8
8
 
9
9
  example.prepend(child:
10
10
  <<~HTML
11
11
  <#{title_tag} class="os-title">
12
- <span class="os-title-label">#{I18n.t(:example_label)} </span>
12
+ <span class="os-title-label">#{I18n.t("example#{'.nominative' if cases}")} </span>
13
13
  <span class="os-number">#{number}</span>
14
14
  <span class="os-divider"> </span>
15
15
  </#{title_tag}>
16
16
  HTML
17
17
  )
18
18
 
19
- example.document
20
- .pantry(name: :link_text)
21
- .store("#{I18n.t(:example_label)} #{number}", label: example.id)
19
+ # Store label information
20
+ example.target_label(label_text: 'example', custom_content: number, cases: cases)
22
21
 
23
22
  example.titles_to_rename.each do |title|
24
23
  title.name = 'h4'
@@ -31,9 +30,9 @@ module Kitchen
31
30
  problem.wrap_children(class: 'os-problem-container')
32
31
  end
33
32
 
34
- if (solution = exercise.solution)
33
+ exercise.solutions.each do |solution|
35
34
  solution_number = if numbered_solutions
36
- "<span class=\"os-number\">#{exercise.count_in(:example)}</span>"
35
+ "<span class=\"os-number\">#{solution.count_in(:example)}</span>"
37
36
  else
38
37
  ''
39
38
  end
@@ -54,7 +53,7 @@ module Kitchen
54
53
  next unless commentary.present?
55
54
 
56
55
  commentary_title = commentary.titles.first
57
- next unless commentary_title.present?
56
+ next unless commentary_title.present? && commentary_title.parent['data-type'] != 'list'
58
57
 
59
58
  commentary_title.name = 'h4'
60
59
  commentary_title['data-type'] = 'commentary-title'
@@ -3,11 +3,12 @@
3
3
  module Kitchen
4
4
  module Directions
5
5
  module BakeFigure
6
- def self.v1(figure:, number:)
7
- return if figure.has_class?('unnumbered') && !figure.has_class?('splash')
6
+ def self.v1(figure:, number:, cases: false)
7
+ return if figure.has_class?('unnumbered') && !figure.has_class?('splash') && !figure.caption
8
8
 
9
9
  figure.wrap(%(<div class="os-figure#{' has-splash' if figure.has_class?('splash')}">))
10
- if figure.has_class?('unnumbered') && figure.has_class?('splash')
10
+
11
+ if figure.has_class?('unnumbered') && (figure.caption || figure.has_class?('splash'))
11
12
  caption = figure.caption&.cut
12
13
  figure.append(sibling:
13
14
  <<~HTML
@@ -19,14 +20,16 @@ module Kitchen
19
20
  return
20
21
  end
21
22
 
22
- figure.pantry(name: :link_text).store "#{I18n.t(:figure)} #{number}", label: figure.id
23
+ # Store label information
24
+ figure.target_label(label_text: 'figure', custom_content: number, cases: cases)
25
+
23
26
  title = figure.title&.cut
24
27
 
25
28
  caption = figure.caption&.cut
26
29
  figure.append(sibling:
27
30
  <<~HTML
28
31
  <div class="os-caption-container">
29
- <span class="os-title-label">#{I18n.t(:figure)} </span>
32
+ <span class="os-title-label">#{I18n.t("figure#{'.nominative' if cases}")} </span>
30
33
  <span class="os-number">#{number}</span>
31
34
  <span class="os-divider"> </span>
32
35
  #{"<span class=\"os-title\" data-type=\"title\" id=\"#{title.id}\">#{title.children}</span>" if title}
@@ -28,7 +28,11 @@ module Kitchen::Directions::BakeFootnotes
28
28
  anchor.replace_children(with: footnote_number)
29
29
  aside_id = anchor[:href][1..-1]
30
30
  aside_id_to_footnote_number[aside_id] = footnote_number
31
- anchor.parent.add_class('has-noteref') if anchor.parent.name == 'p'
31
+ if anchor.parent.name == 'p'
32
+ anchor.parent.add_class('has-noteref')
33
+ elsif anchor.parent.name == 'em' && anchor.parent.parent.name == 'p'
34
+ anchor.parent.parent.add_class('has-noteref')
35
+ end
32
36
  end
33
37
 
34
38
  container.search('aside').each do |aside|
@@ -12,7 +12,7 @@ module Kitchen::Directions::BakeFreeResponse
12
12
  free_response_questions = page.free_response
13
13
  next if free_response_questions.none?
14
14
 
15
- free_response_questions.search('h3').trash
15
+ free_response_questions.search('h3')&.first&.trash
16
16
  title = Kitchen::Directions::EocSectionTitleLinkSnippet.v1(page: page)
17
17
  free_response_questions.each do |free_response_question|
18
18
  free_response_question.prepend(child: title)
@@ -20,6 +20,8 @@ module Kitchen::Directions::BakeFreeResponse
20
20
  end
21
21
  end
22
22
 
23
+ return if @free_response_clipboard.none?
24
+
23
25
  append_to_element = append_to || chapter
24
26
  @title_tag = append_to ? 'h3' : 'h2'
25
27
 
@@ -0,0 +1,11 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kitchen
4
+ module Directions
5
+ module BakeIframes
6
+ def self.v1(outer_element:)
7
+ V1.new.bake(outer_element: outer_element)
8
+ end
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kitchen::Directions::BakeIframes
4
+ class V1
5
+ def bake(outer_element:)
6
+ iframes = outer_element.search('iframe')
7
+ return unless iframes.any?
8
+
9
+ iframes.each do |iframe|
10
+ iframe.wrap('<div class="os-has-iframe" data-type="alternatives">')
11
+ iframe.add_class('os-is-iframe')
12
+ link_ref = iframe[:src]
13
+ next unless link_ref
14
+
15
+ iframe = iframe.parent
16
+ iframe.add_class('os-has-link')
17
+ iframe.prepend(child:
18
+ <<~HTML
19
+ <a class="os-is-link" href="#{link_ref}" target="_window">#{I18n.t(:iframe_link_text)}</a>
20
+ HTML
21
+ )
22
+ end
23
+ end
24
+ end
25
+ end
@@ -3,8 +3,8 @@
3
3
  module Kitchen
4
4
  module Directions
5
5
  module BakeIndex
6
- def self.v1(book:)
7
- V1.new.bake(book: book)
6
+ def self.v1(book:, types: %w[main], uuid_prefix: nil)
7
+ V1.new.bake(book: book, types: types, uuid_prefix: uuid_prefix)
8
8
  end
9
9
  end
10
10
  end