openstax_kitchen 3.1.0 → 5.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (115) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -1
  3. data/CHANGELOG.md +64 -0
  4. data/Gemfile.lock +20 -14
  5. data/README.md +16 -0
  6. data/codecov.yaml +1 -0
  7. data/docker/ci +0 -1
  8. data/lib/kitchen/book_document.rb +1 -1
  9. data/lib/kitchen/book_element.rb +16 -2
  10. data/lib/kitchen/chapter_element.rb +10 -13
  11. data/lib/kitchen/chapter_element_enumerator.rb +1 -1
  12. data/lib/kitchen/composite_chapter_element.rb +7 -11
  13. data/lib/kitchen/composite_chapter_element_enumerator.rb +21 -0
  14. data/lib/kitchen/composite_page_element.rb +15 -10
  15. data/lib/kitchen/composite_page_element_enumerator.rb +1 -1
  16. data/lib/kitchen/config.rb +14 -0
  17. data/lib/kitchen/directions/bake_chapter_glossary/main.rb +18 -0
  18. data/lib/kitchen/directions/bake_chapter_glossary/v1.rb +30 -0
  19. data/lib/kitchen/directions/bake_chapter_introductions.rb +1 -1
  20. data/lib/kitchen/directions/bake_chapter_key_concepts/main.rb +7 -2
  21. data/lib/kitchen/directions/bake_chapter_key_concepts/v1.rb +12 -7
  22. data/lib/kitchen/directions/bake_chapter_key_equations.rb +26 -21
  23. data/lib/kitchen/directions/bake_chapter_references/main.rb +16 -0
  24. data/lib/kitchen/directions/bake_chapter_references/v1.rb +35 -0
  25. data/lib/kitchen/directions/bake_chapter_summary.rb +48 -42
  26. data/lib/kitchen/directions/bake_composite_chapters.rb +1 -1
  27. data/lib/kitchen/directions/bake_composite_pages.rb +1 -1
  28. data/lib/kitchen/directions/bake_equations.rb +14 -4
  29. data/lib/kitchen/directions/bake_example.rb +5 -1
  30. data/lib/kitchen/directions/bake_figure.rb +1 -1
  31. data/lib/kitchen/directions/bake_first_elements.rb +22 -0
  32. data/lib/kitchen/directions/bake_footnotes/v1.rb +2 -1
  33. data/lib/kitchen/directions/bake_free_response/free_response.xhtml.erb +10 -0
  34. data/lib/kitchen/directions/bake_free_response/main.rb +11 -0
  35. data/lib/kitchen/directions/bake_free_response/v1.rb +29 -0
  36. data/lib/kitchen/directions/bake_further_research.rb +59 -0
  37. data/lib/kitchen/directions/bake_index/v1.rb +36 -26
  38. data/lib/kitchen/directions/bake_link_placeholders.rb +1 -1
  39. data/lib/kitchen/directions/bake_notes/bake_note_subtitle.rb +4 -0
  40. data/lib/kitchen/directions/bake_notes/bake_numbered_notes.rb +9 -21
  41. data/lib/kitchen/directions/bake_numbered_exercise/main.rb +6 -2
  42. data/lib/kitchen/directions/bake_numbered_exercise/v1.rb +25 -12
  43. data/lib/kitchen/directions/bake_numbered_table/v1.rb +1 -8
  44. data/lib/kitchen/directions/bake_page_abstracts.rb +1 -1
  45. data/lib/kitchen/directions/bake_references/main.rb +16 -0
  46. data/lib/kitchen/directions/bake_references/v1.rb +48 -0
  47. data/lib/kitchen/directions/bake_suggested_reading.rb +5 -0
  48. data/lib/kitchen/directions/bake_toc.rb +4 -2
  49. data/lib/kitchen/directions/{bake_book_answer_key → book_answer_key_container}/eob_solutions_container.xhtml.erb +0 -0
  50. data/lib/kitchen/directions/{bake_book_answer_key → book_answer_key_container}/main.rb +1 -1
  51. data/lib/kitchen/directions/{bake_book_answer_key → book_answer_key_container}/v1.rb +2 -2
  52. data/lib/kitchen/directions/{bake_chapter_review → chapter_review_container}/chapter_review.xhtml.erb +0 -0
  53. data/lib/kitchen/directions/{bake_chapter_review → chapter_review_container}/main.rb +1 -1
  54. data/lib/kitchen/directions/{bake_chapter_review → chapter_review_container}/v1.rb +2 -2
  55. data/lib/kitchen/directions/eoc_section_title_link_snippet.rb +1 -1
  56. data/lib/kitchen/directions/move_exercises_to_eoc/main.rb +27 -0
  57. data/lib/kitchen/directions/{bake_chapter_review_exercises → move_exercises_to_eoc}/v1.rb +8 -10
  58. data/lib/kitchen/directions/{bake_chapter_review_exercises → move_exercises_to_eoc}/v2.rb +8 -9
  59. data/lib/kitchen/directions/{bake_chapter_answer_key → move_solutions_to_answer_key}/main.rb +1 -1
  60. data/lib/kitchen/directions/move_solutions_to_answer_key/strategies/american_government.rb +19 -0
  61. data/lib/kitchen/directions/{bake_chapter_answer_key → move_solutions_to_answer_key}/strategies/calculus.rb +1 -1
  62. data/lib/kitchen/directions/{bake_chapter_answer_key → move_solutions_to_answer_key}/strategies/uphysics.rb +7 -5
  63. data/lib/kitchen/directions/{bake_chapter_answer_key → move_solutions_to_answer_key}/v1.rb +3 -1
  64. data/lib/kitchen/document.rb +20 -42
  65. data/lib/kitchen/element.rb +9 -3
  66. data/lib/kitchen/element_base.rb +93 -21
  67. data/lib/kitchen/element_enumerator_base.rb +33 -2
  68. data/lib/kitchen/element_enumerator_factory.rb +28 -12
  69. data/lib/kitchen/element_factory.rb +3 -3
  70. data/lib/kitchen/example_element.rb +8 -11
  71. data/lib/kitchen/example_element_enumerator.rb +1 -1
  72. data/lib/kitchen/exercise_element.rb +7 -10
  73. data/lib/kitchen/exercise_element_enumerator.rb +1 -1
  74. data/lib/kitchen/figure_element.rb +8 -11
  75. data/lib/kitchen/figure_element_enumerator.rb +1 -1
  76. data/lib/kitchen/id_tracker.rb +68 -0
  77. data/lib/kitchen/metadata_element.rb +8 -2
  78. data/lib/kitchen/metadata_element_enumerator.rb +1 -1
  79. data/lib/kitchen/note_element.rb +8 -11
  80. data/lib/kitchen/note_element_enumerator.rb +1 -1
  81. data/lib/kitchen/oven.rb +5 -1
  82. data/lib/kitchen/page_element.rb +25 -9
  83. data/lib/kitchen/page_element_enumerator.rb +1 -1
  84. data/lib/kitchen/patches/i18n.rb +34 -0
  85. data/lib/kitchen/patches/nokogiri.rb +55 -0
  86. data/lib/kitchen/patches/nokogiri_profiling.rb +60 -0
  87. data/lib/kitchen/reference_element.rb +27 -0
  88. data/lib/kitchen/references_element_enumerator.rb +20 -0
  89. data/lib/kitchen/search_query.rb +31 -3
  90. data/lib/kitchen/selector.rb +25 -0
  91. data/lib/kitchen/selectors/base.rb +39 -0
  92. data/lib/kitchen/selectors/standard_1.rb +13 -0
  93. data/lib/kitchen/table_element.rb +8 -11
  94. data/lib/kitchen/table_element_enumerator.rb +1 -1
  95. data/lib/kitchen/templates/eob_section_title_template.xhtml.erb +10 -0
  96. data/lib/kitchen/templates/eoc_section_title_template.xhtml.erb +10 -0
  97. data/lib/kitchen/term_element.rb +5 -8
  98. data/lib/kitchen/term_element_enumerator.rb +1 -1
  99. data/lib/kitchen/unit_element.rb +13 -7
  100. data/lib/kitchen/unit_element_enumerator.rb +1 -1
  101. data/lib/kitchen/version.rb +1 -1
  102. data/lib/locales/en.yml +3 -0
  103. data/lib/locales/es.yml +32 -0
  104. data/lib/openstax_kitchen.rb +2 -5
  105. data/openstax_kitchen.gemspec +1 -0
  106. metadata +51 -23
  107. data/lib/kitchen/directions/bake_chapter_glossary.rb +0 -39
  108. data/lib/kitchen/directions/bake_chapter_key_concepts/key_concepts.xhtml.erb +0 -16
  109. data/lib/kitchen/directions/bake_chapter_review_exercises/main.rb +0 -15
  110. data/lib/kitchen/directions/bake_chapter_review_exercises/review_exercises.xhtml.erb +0 -10
  111. data/lib/kitchen/directions/bake_exercises/main.rb +0 -12
  112. data/lib/kitchen/directions/bake_exercises/v1.rb +0 -169
  113. data/lib/kitchen/directions/bake_notes/bake_notes.rb +0 -48
  114. data/lib/kitchen/directions/bake_problem_first_elements.rb +0 -16
  115. data/lib/kitchen/transliterations.rb +0 -21
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kitchen
4
+ module Directions
5
+ # Bake directons for eoc glossary
6
+ #
7
+ module BakeChapterGlossary
8
+ def self.v1(chapter:, metadata_source:, append_to: nil, uuid_prefix: nil)
9
+ V1.new.bake(
10
+ chapter: chapter,
11
+ metadata_source: metadata_source,
12
+ append_to: append_to,
13
+ uuid_prefix: uuid_prefix
14
+ )
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kitchen::Directions::BakeChapterGlossary
4
+ class V1
5
+ renderable
6
+
7
+ def bake(chapter:, metadata_source:, append_to: nil, uuid_prefix: '')
8
+ @metadata = metadata_source.children_to_keep.copy
9
+ @klass = 'glossary'
10
+ @title = I18n.t(:eoc_key_terms_title)
11
+ @uuid_prefix = uuid_prefix
12
+
13
+ definitions = chapter.glossaries.search('dl').cut
14
+ return if definitions.none?
15
+ definitions.sort_by! do |definition|
16
+ [definition.first('dt').text.downcase, definition.first('dd').text.downcase]
17
+ end
18
+
19
+ chapter.glossaries.trash
20
+
21
+ @content = definitions.paste
22
+
23
+ append_to_element = append_to || chapter
24
+ @in_composite_chapter = append_to_element.is?(:composite_chapter)
25
+
26
+ append_to_element.append(child: render(file:
27
+ '../../templates/eoc_section_title_template.xhtml.erb'))
28
+ end
29
+ end
30
+ end
@@ -28,7 +28,7 @@ module Kitchen
28
28
  title.name = 'h2'
29
29
  MoveTitleTextIntoSpan.v1(title: title)
30
30
 
31
- intro_content = introduction_page.search("> :not([data-type='metadata']):not(figure)").cut
31
+ intro_content = introduction_page.search("> :not([data-type='metadata']):not(.splash):not(.has-splash)").cut
32
32
 
33
33
  introduction_page.append(child:
34
34
  <<~HTML
@@ -3,8 +3,13 @@
3
3
  module Kitchen
4
4
  module Directions
5
5
  module BakeChapterKeyConcepts
6
- def self.v1(chapter:, metadata_source:, append_to: nil)
7
- V1.new.bake(chapter: chapter, metadata_source: metadata_source, append_to: append_to)
6
+ def self.v1(chapter:, metadata_source:, append_to: nil, uuid_prefix: '.')
7
+ V1.new.bake(
8
+ chapter: chapter,
9
+ metadata_source: metadata_source,
10
+ append_to: append_to,
11
+ uuid_prefix: uuid_prefix
12
+ )
8
13
  end
9
14
  end
10
15
  end
@@ -3,10 +3,12 @@
3
3
  module Kitchen::Directions::BakeChapterKeyConcepts
4
4
  class V1
5
5
  renderable
6
- def bake(chapter:, metadata_source:, append_to:)
7
- @metadata_elements = metadata_source.children_to_keep.copy
6
+ def bake(chapter:, metadata_source:, append_to:, uuid_prefix:)
7
+ @metadata = metadata_source.children_to_keep.copy
8
+ @klass = 'key-concepts'
9
+ @title = I18n.t(:eoc_key_concepts)
10
+ @uuid_prefix = uuid_prefix
8
11
 
9
- @key_concepts = []
10
12
  key_concepts_clipboard = Kitchen::Clipboard.new
11
13
  chapter.non_introduction_pages.each do |page|
12
14
  key_concepts = page.key_concepts
@@ -16,15 +18,18 @@ module Kitchen::Directions::BakeChapterKeyConcepts
16
18
  title = Kitchen::Directions::EocSectionTitleLinkSnippet.v1(page: page)
17
19
  key_concepts.each do |key_concept|
18
20
  key_concept.prepend(child: title)
19
- key_concept&.cut(to: key_concepts_clipboard)
21
+ key_concept.wrap("<div class='os-section-area'>")
22
+ page.search('div.os-section-area').first.cut(to: key_concepts_clipboard)
20
23
  end
21
- @key_concepts.push(key_concepts_clipboard.paste)
22
- key_concepts_clipboard.clear
23
24
  end
24
25
 
26
+ @content = "<div class=\"os-key-concepts\"> #{key_concepts_clipboard.paste} </div>"
27
+
25
28
  append_to_element = append_to || chapter
29
+ @in_composite_chapter = append_to_element.is?(:composite_chapter)
26
30
 
27
- append_to_element.append(child: render(file: 'key_concepts.xhtml.erb'))
31
+ append_to_element.append(child: render(file:
32
+ '../../templates/eoc_section_title_template.xhtml.erb'))
28
33
  end
29
34
  end
30
35
  end
@@ -2,33 +2,38 @@
2
2
 
3
3
  module Kitchen
4
4
  module Directions
5
- # Bake directions for eoc key equations
5
+ # Bake directons for eoc key equations
6
6
  #
7
7
  module BakeChapterKeyEquations
8
- def self.v1(chapter:, metadata_source:, append_to: nil)
9
- metadata_elements = metadata_source.children_to_keep.copy
8
+ def self.v1(chapter:, metadata_source:, append_to: nil, uuid_prefix: '.')
9
+ V1.new.bake(
10
+ chapter: chapter,
11
+ metadata_source: metadata_source,
12
+ append_to: append_to,
13
+ uuid_prefix: uuid_prefix
14
+ )
15
+ end
10
16
 
11
- chapter.key_equations.search('h3').trash
12
- key_equations = chapter.key_equations.cut
17
+ class V1
18
+ renderable
19
+ def bake(chapter:, metadata_source:, append_to:, uuid_prefix:)
20
+ @metadata = metadata_source.children_to_keep.copy
21
+ @klass = 'key-equations'
22
+ @title = I18n.t(:eoc_key_equations)
23
+ @uuid_prefix = uuid_prefix
13
24
 
14
- return if key_equations.none?
25
+ chapter.key_equations.search('h3').trash
15
26
 
16
- append_to_element = append_to || chapter
27
+ return if chapter.key_equations.none?
17
28
 
18
- append_to_element.append(child:
19
- <<~HTML
20
- <div class="os-eoc os-key-equations-container" data-type="composite-page" data-uuid-key=".key-equations">
21
- <h2 data-type="document-title">
22
- <span class="os-text">#{I18n.t(:eoc_key_equations)}</span>
23
- </h2>
24
- <div data-type="metadata" style="display: none;">
25
- <h1 data-type="document-title" itemprop="name">#{I18n.t(:eoc_key_equations)}</h1>
26
- #{metadata_elements.paste}
27
- </div>
28
- #{key_equations.paste}
29
- </div>
30
- HTML
31
- )
29
+ @content = chapter.key_equations.cut.paste
30
+
31
+ append_to_element = append_to || chapter
32
+ @in_composite_chapter = append_to_element.is?(:composite_chapter)
33
+
34
+ append_to_element.append(child: render(file:
35
+ '../templates/eoc_section_title_template.xhtml.erb'))
36
+ end
32
37
  end
33
38
  end
34
39
  end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kitchen
4
+ module Directions
5
+ module BakeChapterReferences
6
+ def self.v1(chapter:, metadata_source:, uuid_prefix: '.', klass: 'references')
7
+ V1.new.bake(
8
+ chapter: chapter,
9
+ metadata_source: metadata_source,
10
+ uuid_prefix: uuid_prefix,
11
+ klass: klass
12
+ )
13
+ end
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,35 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kitchen::Directions::BakeChapterReferences
4
+ class V1
5
+ renderable
6
+
7
+ def bake(chapter:, metadata_source:, uuid_prefix: '.', klass: 'references')
8
+ @metadata = metadata_source.children_to_keep.copy
9
+ @klass = klass
10
+ @title = I18n.t(:references)
11
+ @uuid_prefix = uuid_prefix
12
+
13
+ chapter.references.search('h3').trash
14
+
15
+ chapter.non_introduction_pages.each do |page|
16
+ references = page.references
17
+ next if references.none?
18
+
19
+ references.search('h3').trash
20
+ title = Kitchen::Directions::EocSectionTitleLinkSnippet.v1(page: page)
21
+
22
+ references.each do |reference|
23
+ reference.prepend(child: title)
24
+ end
25
+ end
26
+
27
+ @content = chapter.pages.references.cut.paste
28
+
29
+ @in_composite_chapter = false
30
+
31
+ chapter.append(child: render(file:
32
+ '../../templates/eoc_section_title_template.xhtml.erb'))
33
+ end
34
+ end
35
+ end
@@ -5,50 +5,56 @@ module Kitchen
5
5
  # Bake directions for eoc summary
6
6
  #
7
7
  module BakeChapterSummary
8
- def self.v1(chapter:, metadata_source:)
9
- metadata_elements = metadata_source.children_to_keep.copy
10
-
11
- summaries = Clipboard.new
12
-
13
- # TODO: include specific page types somehow without writing it out
14
- chapter.non_introduction_pages.each do |page|
15
- summary = page.summary
16
- summary.first("[data-type='title']")&.trash # get rid of old title if exists
17
- summary_title = page.title.copy
18
- summary_title.name = 'h3'
19
- summary_title.replace_children(with: <<~HTML
20
- <span class="os-number">#{chapter.count_in(:book)}.#{page.count_in(:chapter)}</span>
21
- <span class="os-divider"> </span>
22
- <span class="os-text" data-type="" itemprop="">#{summary_title.children}</span>
23
- HTML
24
- )
25
-
26
- summary.prepend(child:
27
- <<~HTML
28
- <a href="##{page.title.id}">
29
- #{summary_title.paste}
30
- </a>
8
+ def self.v1(chapter:, metadata_source:, klass: 'summary', uuid_prefix: '.')
9
+ V1.new.bake(
10
+ chapter: chapter,
11
+ metadata_source: metadata_source,
12
+ uuid_prefix: uuid_prefix,
13
+ klass: klass
14
+ )
15
+ end
16
+
17
+ class V1
18
+ renderable
19
+ def bake(chapter:, metadata_source:, uuid_prefix: '.', klass: 'summary')
20
+ @metadata = metadata_source.children_to_keep.copy
21
+ @klass = klass
22
+ @title = I18n.t(:eoc_summary_title)
23
+ @uuid_prefix = uuid_prefix
24
+
25
+ summaries = Clipboard.new
26
+
27
+ # TODO: include specific page types somehow without writing it out
28
+ chapter.non_introduction_pages.each do |page|
29
+ summary = page.summary
30
+ summary.first("[data-type='title']")&.trash # get rid of old title if exists
31
+ summary_title = page.title.copy
32
+ summary_title.name = 'h3'
33
+ summary_title.replace_children(with: <<~HTML
34
+ <span class="os-number">#{chapter.count_in(:book)}.#{page.count_in(:chapter)}</span>
35
+ <span class="os-divider"> </span>
36
+ <span class="os-text" data-type="" itemprop="">#{summary_title.children}</span>
31
37
  HTML
32
- )
33
- summary.cut(to: summaries)
34
- end
38
+ )
35
39
 
36
- return if summaries.none?
37
-
38
- chapter.append(child:
39
- <<~HTML
40
- <div class="os-eoc os-summary-container" data-type="composite-page" data-uuid-key=".summary">
41
- <h2 data-type="document-title">
42
- <span class="os-text">#{I18n.t(:eoc_summary_title)}</span>
43
- </h2>
44
- <div data-type="metadata" style="display: none;">
45
- <h1 data-type="document-title" itemprop="name">#{I18n.t(:eoc_summary_title)}</h1>
46
- #{metadata_elements.paste}
47
- </div>
48
- #{summaries.paste}
49
- </div>
50
- HTML
51
- )
40
+ summary.prepend(child:
41
+ <<~HTML
42
+ <a href="##{page.title.id}">
43
+ #{summary_title.paste}
44
+ </a>
45
+ HTML
46
+ )
47
+ summary.cut(to: summaries)
48
+ end
49
+
50
+ return if summaries.none?
51
+
52
+ @content = summaries.paste
53
+ @in_composite_chapter = false
54
+
55
+ chapter.append(child: render(file:
56
+ '../templates/eoc_section_title_template.xhtml.erb'))
57
+ end
52
58
  end
53
59
  end
54
60
  end
@@ -4,7 +4,7 @@ module Kitchen
4
4
  module Directions
5
5
  module BakeCompositeChapters
6
6
  def self.v1(book:)
7
- book.search("[data-type='composite-chapter']").each do |chapter|
7
+ book.composite_chapters.each do |chapter|
8
8
  chapter.first("[data-type='document-title']").id =
9
9
  "composite-chapter-#{chapter.count_in(:book)}"
10
10
  end
@@ -4,7 +4,7 @@ module Kitchen
4
4
  module Directions
5
5
  module BakeCompositePages
6
6
  def self.v1(book:)
7
- book.search("[data-type='composite-page']").each do |page|
7
+ book.composite_pages.each do |page|
8
8
  page.id = "composite-page-#{page.count_in(:book)}"
9
9
  end
10
10
  end
@@ -3,20 +3,30 @@
3
3
  module Kitchen
4
4
  module Directions
5
5
  module BakeEquations
6
- def self.v1(book:)
7
- book.chapters.search('[data-type="equation"]:not(.unnumbered)').each do |eq|
6
+ def self.v1(book:, number_decorator: :none)
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
12
  equation_label = "#{I18n.t(:equation)} #{number}"
13
- book.document.pantry(name: :link_text).store equation_label, label: eq.id
13
+ book.pantry(name: :link_text).store equation_label, label: eq.id
14
+
15
+ decorated_number =
16
+ case number_decorator
17
+ when :none
18
+ number
19
+ when :parentheses
20
+ "(#{number})"
21
+ else
22
+ raise "Unsupported number_decorator '#{number_decorator}'"
23
+ end
14
24
 
15
25
  # Bake the equation
16
26
  eq.append(child:
17
27
  <<~HTML
18
28
  <div class="os-equation-number">
19
- <span class="os-number">#{number}</span>
29
+ <span class="os-number">#{decorated_number}</span>
20
30
  </div>
21
31
  HTML
22
32
  )
@@ -20,7 +20,11 @@ module Kitchen
20
20
  .pantry(name: :link_text)
21
21
  .store("#{I18n.t(:example_label)} #{number}", label: example.id)
22
22
 
23
- example.titles.each { |title| title.name = 'h4' }
23
+ example.titles.each do |title|
24
+ next if title.parent.has_class?('os-caption-container')
25
+
26
+ title.name = 'h4'
27
+ end
24
28
 
25
29
  example.exercises.each do |exercise|
26
30
  if (problem = exercise.problem)
@@ -6,7 +6,7 @@ module Kitchen
6
6
  def self.v1(figure:, number:)
7
7
  figure.wrap(%(<div class="os-figure#{' has-splash' if figure.has_class?('splash')}">))
8
8
 
9
- figure.document.pantry(name: :link_text).store "#{I18n.t(:figure)} #{number}", label: figure.id
9
+ figure.pantry(name: :link_text).store "#{I18n.t(:figure)} #{number}", label: figure.id
10
10
  title = figure.title&.cut
11
11
 
12
12
  caption = figure.caption&.cut
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Kitchen
4
+ module Directions
5
+ module BakeFirstElements
6
+ def self.v1(within:)
7
+ selectors = [
8
+ 'div.os-problem-container > div.os-table',
9
+ 'div.os-problem-container > span[data-type="media"]',
10
+ 'div.os-solution-container > div.os-table',
11
+ 'div.os-solution-container > span[data-type="media"]'
12
+ ]
13
+ selectors.each do |selector|
14
+ within.search("#{selector}:first-child").each do |problem|
15
+ problem.add_class('first-element')
16
+ problem.parent.add_class('has-first-element')
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
22
+ end
@@ -8,7 +8,8 @@ module Kitchen::Directions::BakeFootnotes
8
8
  # appendices, etc) or within chapters. Tackle each case separately
9
9
 
10
10
  book.body.element_children.only(Kitchen::PageElement,
11
- Kitchen::CompositePageElement).each do |page|
11
+ Kitchen::CompositePageElement,
12
+ Kitchen::CompositeChapterElement).each do |page|
12
13
  bake_footnotes_within(page)
13
14
  end
14
15