openstax_kitchen 9.2.0 → 10.0.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +22 -0
- data/Gemfile.lock +1 -1
- data/lib/kitchen/directions/bake_chapter_glossary/main.rb +3 -2
- data/lib/kitchen/directions/bake_chapter_glossary/v1.rb +10 -1
- data/lib/kitchen/directions/bake_chapter_key_concepts/v1.rb +12 -21
- data/lib/kitchen/directions/bake_chapter_solutions/main.rb +7 -2
- data/lib/kitchen/directions/bake_chapter_solutions/v1.rb +11 -9
- data/lib/kitchen/directions/bake_chapter_summary.rb +0 -1
- data/lib/kitchen/directions/bake_example.rb +3 -7
- data/lib/kitchen/directions/bake_first_elements.rb +6 -5
- data/lib/kitchen/directions/bake_further_research.rb +0 -1
- data/lib/kitchen/directions/bake_handbook/main.rb +11 -0
- data/lib/kitchen/directions/bake_handbook/v1.rb +74 -0
- data/lib/kitchen/directions/bake_lists_with_para.rb +17 -0
- data/lib/kitchen/directions/bake_numbered_exercise/v1.rb +19 -0
- data/lib/kitchen/directions/bake_numbered_table/bake_table_body.rb +1 -1
- data/lib/kitchen/directions/bake_numbered_table/v1.rb +1 -1
- data/lib/kitchen/directions/bake_toc.rb +7 -0
- data/lib/kitchen/directions/bake_unit_page_title/main.rb +11 -0
- data/lib/kitchen/directions/bake_unit_page_title/v1.rb +21 -0
- data/lib/kitchen/directions/move_custom_section_to_eoc_container/main.rb +5 -2
- data/lib/kitchen/directions/move_custom_section_to_eoc_container/v1.rb +18 -2
- data/lib/kitchen/directions/move_exercises_to_eoc/v2.rb +12 -30
- data/lib/kitchen/directions/move_solutions_to_answer_key/strategies/contemporary_math.rb +40 -0
- data/lib/kitchen/directions/move_solutions_to_answer_key/v1.rb +7 -1
- data/lib/kitchen/example_element.rb +9 -3
- data/lib/kitchen/exercise_element.rb +8 -0
- data/lib/kitchen/figure_element.rb +11 -0
- data/lib/kitchen/note_element.rb +8 -1
- data/lib/kitchen/page_element.rb +0 -8
- data/lib/kitchen/version.rb +1 -1
- data/lib/locales/en.yml +1 -0
- metadata +8 -4
- data/lib/kitchen/directions/bake_theorem/main.rb +0 -11
- data/lib/kitchen/directions/bake_theorem/v1.rb +0 -28
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3a071ba6e289c222a7333f401c7d6bd25d6dba9527253b6c6ae123169d9b6425
|
4
|
+
data.tar.gz: 2debc535f61a289f6668019f1eeb5cd639efaf8d49172d668f8b602e02e91b07
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6bfeae3a664c95c17249ab32a8bba863091fb1e23f501273fd57d9752688c29ba9877b5a6404393dc88ae993f16af3f89fa768e3984cf81233908ab238b0350a
|
7
|
+
data.tar.gz: '086fa06f8f7eb33f3908c15ba0172a02a1738c943ba87b25245f63626cda51e5163edbece95cdce2ce1907d5815aefd179db7fb7e3a4fe2a7165c623c5120ede'
|
data/CHANGELOG.md
CHANGED
@@ -6,6 +6,28 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
6
6
|
|
7
7
|
## [Unreleased]
|
8
8
|
|
9
|
+
## [10.0.0] - 2021-07-30
|
10
|
+
|
11
|
+
* Add support for baking multipart questions to `BakeNumberedExercise` (minor)
|
12
|
+
* Add `has_para` option to `BakeChapterGlossary` for books from Adaptarr (minor)
|
13
|
+
* Create `BakeListsWithPara` to remove paragraphs from lists in books created by Adaptarr (minor)
|
14
|
+
* Create `Strategy::ContemporaryMath` (minor)
|
15
|
+
* Stop `BakeTableBody` from blowing up when table doesn't have an ID (patch)
|
16
|
+
* Refactor `MoveExercisesToEOC::V2` & `BakeChapterKeyConcepts` to use `MoveCustomSectionToEocContainer` (minor)
|
17
|
+
* Add wrapper support for `MoveCustomSectionToEocContainer` (minor)
|
18
|
+
* Create `BakeHandbook` direction (minor)
|
19
|
+
* Add `ExampleElement#titles_to_rename` & refactor `BakeExample` (patch)
|
20
|
+
* Create `BakeUnitPageTitle` (minor)
|
21
|
+
* Fix `BakeExample` to skip baked exercises (patch)
|
22
|
+
* Add `FigureElement#figure_to_bake?` (minor)
|
23
|
+
* Remove `itemprop` attribute from `BakeChapterSummary` and `BakeFurtherResearch` (major)
|
24
|
+
* Fix `NoteElement#title` to exclude nested element titles (patch)
|
25
|
+
* Remove `BakeTheorem` (minor)
|
26
|
+
* Allow `BakeChapterSolutions` to bake solutions from multiple sections (minor)
|
27
|
+
* Add `.os-problem-container` to `BakeFirstElement` selectors (minor)
|
28
|
+
* Tweak `BakeExample` to not touch unbaked titles in captions (minor/patch)
|
29
|
+
* Tweak `BakeNumberedTables.v1` to cut extra white space (minor)
|
30
|
+
|
9
31
|
## [9.2.0] - 2021-07-19
|
10
32
|
|
11
33
|
* Update `BakeFirstElements` to also add the `.has-first-inline-list` class (minor)
|
data/Gemfile.lock
CHANGED
@@ -5,12 +5,13 @@ module Kitchen
|
|
5
5
|
# Bake directons for eoc glossary
|
6
6
|
#
|
7
7
|
module BakeChapterGlossary
|
8
|
-
def self.v1(chapter:, metadata_source:, append_to: nil, uuid_prefix: nil)
|
8
|
+
def self.v1(chapter:, metadata_source:, append_to: nil, uuid_prefix: nil, has_para: false)
|
9
9
|
V1.new.bake(
|
10
10
|
chapter: chapter,
|
11
11
|
metadata_source: metadata_source,
|
12
12
|
append_to: append_to,
|
13
|
-
uuid_prefix: uuid_prefix
|
13
|
+
uuid_prefix: uuid_prefix,
|
14
|
+
has_para: has_para
|
14
15
|
)
|
15
16
|
end
|
16
17
|
end
|
@@ -21,9 +21,18 @@ module Kitchen::Directions::BakeChapterGlossary
|
|
21
21
|
attr_reader :sortable
|
22
22
|
end
|
23
23
|
|
24
|
-
def bake(chapter:, metadata_source:, append_to: nil, uuid_prefix: '')
|
24
|
+
def bake(chapter:, metadata_source:, append_to: nil, uuid_prefix: '', has_para: false)
|
25
25
|
@glossary = []
|
26
26
|
|
27
|
+
# Use for books created by Adaptarr, where dd contains paragraphs
|
28
|
+
# More info: https://github.com/openstax/kitchen/issues/284
|
29
|
+
if has_para
|
30
|
+
chapter.glossaries.search('dd').each do |description|
|
31
|
+
description_content = description.first('p').text
|
32
|
+
description.replace_children with: description_content
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
27
36
|
chapter.glossaries.search('dl').each do |definition_element|
|
28
37
|
@glossary.push(Definition.new(definition_element.cut))
|
29
38
|
end
|
@@ -3,29 +3,20 @@
|
|
3
3
|
module Kitchen::Directions::BakeChapterKeyConcepts
|
4
4
|
class V1
|
5
5
|
def bake(chapter:, metadata_source:, append_to:, uuid_prefix:)
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
next if key_concepts.none?
|
10
|
-
|
11
|
-
title = Kitchen::Directions::EocSectionTitleLinkSnippet.v1(page: page)
|
12
|
-
key_concepts.each do |key_concept|
|
13
|
-
Kitchen::Directions::RemoveSectionTitle.v1(section: key_concept)
|
14
|
-
key_concept.prepend(child: title)
|
15
|
-
key_concept.wrap("<div class='os-section-area'>")
|
16
|
-
page.search('div.os-section-area').first.cut(to: key_concepts_clipboard)
|
17
|
-
end
|
18
|
-
end
|
19
|
-
|
20
|
-
content = "<div class=\"os-key-concepts\"> #{key_concepts_clipboard.paste} </div>"
|
21
|
-
|
22
|
-
Kitchen::Directions::EocCompositePageContainer.v1(
|
6
|
+
Kitchen::Directions::MoveCustomSectionToEocContainer.v1(
|
7
|
+
chapter: chapter,
|
8
|
+
metadata_source: metadata_source,
|
23
9
|
container_key: 'key-concepts',
|
24
10
|
uuid_key: "#{uuid_prefix}key-concepts",
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
11
|
+
section_selector: 'section.key-concepts',
|
12
|
+
append_to: append_to || chapter,
|
13
|
+
include_intro_page: false,
|
14
|
+
wrap_section: true, wrap_content: true
|
15
|
+
) do |section|
|
16
|
+
Kitchen::Directions::RemoveSectionTitle.v1(section: section)
|
17
|
+
title = Kitchen::Directions::EocSectionTitleLinkSnippet.v1(page: section.ancestor(:page))
|
18
|
+
section.prepend(child: title)
|
19
|
+
end
|
29
20
|
end
|
30
21
|
end
|
31
22
|
end
|
@@ -3,8 +3,13 @@
|
|
3
3
|
module Kitchen
|
4
4
|
module Directions
|
5
5
|
module BakeChapterSolutions
|
6
|
-
def self.v1(chapter:, metadata_source:, uuid_prefix: '')
|
7
|
-
V1.new.bake(
|
6
|
+
def self.v1(chapter:, metadata_source:, uuid_prefix: '', classes: %w[free-response])
|
7
|
+
V1.new.bake(
|
8
|
+
chapter: chapter,
|
9
|
+
metadata_source: metadata_source,
|
10
|
+
uuid_prefix: uuid_prefix,
|
11
|
+
classes: classes
|
12
|
+
)
|
8
13
|
end
|
9
14
|
end
|
10
15
|
end
|
@@ -2,20 +2,22 @@
|
|
2
2
|
|
3
3
|
module Kitchen::Directions::BakeChapterSolutions
|
4
4
|
class V1
|
5
|
-
def bake(chapter:, metadata_source:, uuid_prefix: '')
|
5
|
+
def bake(chapter:, metadata_source:, uuid_prefix: '', classes: %w[free-response])
|
6
6
|
solutions_clipboard = Kitchen::Clipboard.new
|
7
7
|
|
8
|
-
|
9
|
-
|
10
|
-
|
8
|
+
classes.each do |klass|
|
9
|
+
chapter.search("section.#{klass}").each do |question|
|
10
|
+
exercises = question.exercises
|
11
|
+
# must run AFTER the other sections are baked
|
11
12
|
|
12
|
-
|
13
|
+
next if exercises.none?
|
13
14
|
|
14
|
-
|
15
|
-
|
16
|
-
|
15
|
+
exercises.each do |exercise|
|
16
|
+
solution = exercise.solution
|
17
|
+
next unless solution.present?
|
17
18
|
|
18
|
-
|
19
|
+
solution.cut(to: solutions_clipboard)
|
20
|
+
end
|
19
21
|
end
|
20
22
|
end
|
21
23
|
|
@@ -26,7 +26,6 @@ module Kitchen
|
|
26
26
|
summary.first("[data-type='title']")&.trash # get rid of old title if exists
|
27
27
|
title = EocSectionTitleLinkSnippet.v1(page: page)
|
28
28
|
summary.prepend(child: title)
|
29
|
-
summary.first('h3')[:itemprop] = 'name'
|
30
29
|
summary.cut(to: summaries)
|
31
30
|
end
|
32
31
|
|
@@ -20,18 +20,14 @@ module Kitchen
|
|
20
20
|
.pantry(name: :link_text)
|
21
21
|
.store("#{I18n.t(:example_label)} #{number}", label: example.id)
|
22
22
|
|
23
|
-
example.
|
24
|
-
if title.parent.has_class?('os-caption-container') || \
|
25
|
-
title.parent.has_class?('os-caption')
|
26
|
-
next
|
27
|
-
end
|
28
|
-
|
23
|
+
example.titles_to_rename.each do |title|
|
29
24
|
title.name = 'h4'
|
30
25
|
end
|
31
26
|
|
32
27
|
example.exercises.each do |exercise|
|
28
|
+
next if exercise.baked?
|
29
|
+
|
33
30
|
if (problem = exercise.problem)
|
34
|
-
problem.titles.each { |title| title.name = 'h4' }
|
35
31
|
problem.wrap_children(class: 'os-problem-container')
|
36
32
|
end
|
37
33
|
|
@@ -19,11 +19,12 @@ module Kitchen
|
|
19
19
|
end
|
20
20
|
|
21
21
|
# add first-inline-element class
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
22
|
+
inline_selector = 'div.os-solution-container > ol[type="1"]:first-child,' \
|
23
|
+
'div.os-problem-container > ol[type="1"]:first-child'
|
24
|
+
within.search(inline_selector).each do |inline_list|
|
25
|
+
inline_list.add_class('first-inline-list-element')
|
26
|
+
inline_list.parent.add_class('has-first-inline-list-element')
|
27
|
+
end
|
27
28
|
end
|
28
29
|
end
|
29
30
|
end
|
@@ -26,7 +26,6 @@ module Kitchen
|
|
26
26
|
RemoveSectionTitle.v1(section: further_research)
|
27
27
|
title = EocSectionTitleLinkSnippet.v1(page: further_research.ancestor(:page))
|
28
28
|
further_research.prepend(child: title)
|
29
|
-
further_research.first('h3')[:itemprop] = 'name'
|
30
29
|
end
|
31
30
|
end
|
32
31
|
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Kitchen::Directions::BakeHandbook
|
4
|
+
class V1
|
5
|
+
def bake(book:, title_element:)
|
6
|
+
book.pages('$.handbook').each do |page|
|
7
|
+
page.titles.each do |title|
|
8
|
+
title.replace_children(with:
|
9
|
+
<<~HTML
|
10
|
+
<span data-type="" itemprop="" class="os-text">#{title.text}</span>
|
11
|
+
HTML
|
12
|
+
)
|
13
|
+
title.name = title_element
|
14
|
+
end
|
15
|
+
|
16
|
+
# Create Outline Title
|
17
|
+
outline_html = <<~HTML
|
18
|
+
<div class="os-handbook-outline">
|
19
|
+
<h3 class="os-title">#{I18n.t(:handbook_outline_title)}</h3>
|
20
|
+
</div>
|
21
|
+
HTML
|
22
|
+
page.title.append(sibling: outline_html)
|
23
|
+
|
24
|
+
bake_first_section_title_and_objectives(page: page)
|
25
|
+
fix_nested_section_headers(page: page)
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
# Bake Handbook First Section Title
|
30
|
+
def bake_first_section_title_and_objectives(page:)
|
31
|
+
outline_items_html = []
|
32
|
+
page.search('> section').each do |section|
|
33
|
+
first_section_title = section.titles.first
|
34
|
+
first_section_title.replace_children(with:
|
35
|
+
<<~HTML
|
36
|
+
<span class="os-part-text">H</span>
|
37
|
+
<span class="os-number">#{section.count_in(:page)}</span>
|
38
|
+
<span class="os-divider">. </span>
|
39
|
+
<span class="os-text">#{first_section_title.text}</span>
|
40
|
+
HTML
|
41
|
+
)
|
42
|
+
first_section_title.name = 'h2'
|
43
|
+
|
44
|
+
outline_item_html = <<~HTML
|
45
|
+
<div class="os-handbook-objective">
|
46
|
+
<a class="os-handbook-objective" href="##{first_section_title[:id]}">
|
47
|
+
#{first_section_title.children}
|
48
|
+
</a>
|
49
|
+
</div>
|
50
|
+
HTML
|
51
|
+
outline_items_html.push(outline_item_html)
|
52
|
+
end
|
53
|
+
page.search('.os-handbook-outline').first.append(child:
|
54
|
+
<<~HTML
|
55
|
+
#{outline_items_html.join}
|
56
|
+
HTML
|
57
|
+
)
|
58
|
+
end
|
59
|
+
|
60
|
+
def fix_nested_section_headers(page:)
|
61
|
+
page.search('section').each do |section|
|
62
|
+
section_data_depth = section[:'data-depth']
|
63
|
+
case section_data_depth
|
64
|
+
when '2'
|
65
|
+
section.titles.first.name = 'h3'
|
66
|
+
when '3'
|
67
|
+
section.titles.first.name = 'h4'
|
68
|
+
when '4'
|
69
|
+
section.titles.first.name = 'h5'
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Kitchen
|
4
|
+
module Directions
|
5
|
+
# Bakes lists with paragraphs
|
6
|
+
# Should be used for books created by Adaptarr to put list text directly to <li>
|
7
|
+
#
|
8
|
+
module BakeListsWithPara
|
9
|
+
def self.v1(book:)
|
10
|
+
book.search('li').each do |item|
|
11
|
+
item_content = item.first('p')&.text
|
12
|
+
item.replace_children with: item_content unless item_content.nil?
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -37,6 +37,25 @@ module Kitchen::Directions::BakeNumberedExercise
|
|
37
37
|
<div class="os-problem-container">#{problem.children}</div>
|
38
38
|
HTML
|
39
39
|
)
|
40
|
+
|
41
|
+
# Bake multipart questions
|
42
|
+
multipart_questions = problem.search('div.question-stem')
|
43
|
+
return unless multipart_questions.count > 1
|
44
|
+
|
45
|
+
multipart_clipboard = Kitchen::Clipboard.new
|
46
|
+
multipart_questions.each do |question|
|
47
|
+
question.wrap('<li>')
|
48
|
+
question = question.parent
|
49
|
+
question.cut(to: multipart_clipboard)
|
50
|
+
end
|
51
|
+
|
52
|
+
problem.first('div.question-stimulus, div.exercise-stimulus').append(sibling:
|
53
|
+
<<~HTML
|
54
|
+
<ol type="a">
|
55
|
+
#{multipart_clipboard.paste}
|
56
|
+
</ol>
|
57
|
+
HTML
|
58
|
+
)
|
40
59
|
end
|
41
60
|
|
42
61
|
def bake_solution(exercise:, number:, divider: '. ')
|
@@ -10,7 +10,7 @@ module Kitchen
|
|
10
10
|
table.wrap(%(<div class="os-table">))
|
11
11
|
|
12
12
|
table_label = "#{I18n.t(:table_label)} #{number}"
|
13
|
-
table.pantry(name: :link_text).store table_label, label: table.id
|
13
|
+
table.pantry(name: :link_text).store table_label, label: table.id if table.id
|
14
14
|
|
15
15
|
if table.top_titled?
|
16
16
|
table.parent.add_class('os-top-titled-container')
|
@@ -16,7 +16,7 @@ module Kitchen::Directions::BakeNumberedTable
|
|
16
16
|
HTML
|
17
17
|
end
|
18
18
|
|
19
|
-
if (caption = table.caption&.cut)
|
19
|
+
if (caption = table.caption&.cut) && !caption&.children&.to_s&.blank?
|
20
20
|
new_caption = <<~HTML
|
21
21
|
\n<span class="os-caption">#{caption.children}</span>
|
22
22
|
HTML
|
@@ -28,6 +28,8 @@ module Kitchen
|
|
28
28
|
|
29
29
|
def self.li_for_unit(unit)
|
30
30
|
chapters = unit.element_children.only(ChapterElement)
|
31
|
+
pages = unit.element_children.only(PageElement)
|
32
|
+
|
31
33
|
<<~HTML
|
32
34
|
<li cnx-archive-uri="" cnx-archive-shortid="" class="os-toc-unit">
|
33
35
|
<a href="#">
|
@@ -36,6 +38,7 @@ module Kitchen
|
|
36
38
|
<span data-type itemprop class="os-text">#{unit.title_text}</span>
|
37
39
|
</a>
|
38
40
|
<ol class="os-unit">
|
41
|
+
#{pages.map { |page| li_for_page(page) }.join("\n")}
|
39
42
|
#{chapters.map { |chapter| li_for_chapter(chapter) }.join("\n")}
|
40
43
|
</ol>
|
41
44
|
</li>
|
@@ -92,6 +95,10 @@ module Kitchen
|
|
92
95
|
'os-toc-preface'
|
93
96
|
elsif page.is_handbook?
|
94
97
|
'os-toc-handbook'
|
98
|
+
elsif page.has_ancestor?(:unit) && !
|
99
|
+
page.has_ancestor?(:chapter) && !
|
100
|
+
page.has_ancestor?(:composite_chapter)
|
101
|
+
'os-toc-unit-page'
|
95
102
|
else
|
96
103
|
raise "do not know what TOC class to use for page with classes #{page.classes}"
|
97
104
|
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Kitchen::Directions::BakeUnitPageTitle
|
4
|
+
class V1
|
5
|
+
def bake(book:)
|
6
|
+
book.units.pages.each do |page|
|
7
|
+
compose_unit_page_title(page: page)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
def compose_unit_page_title(page:)
|
12
|
+
title = page.title
|
13
|
+
title.name = 'h2'
|
14
|
+
title.replace_children(with:
|
15
|
+
<<~HTML
|
16
|
+
<span data-type="" itemprop="" class="os-text">#{title.text}</span>
|
17
|
+
HTML
|
18
|
+
)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
@@ -18,7 +18,8 @@ module Kitchen
|
|
18
18
|
# @return [ElementBase] the append_to element with container appended
|
19
19
|
#
|
20
20
|
def self.v1(chapter:, metadata_source:, container_key:, uuid_key:,
|
21
|
-
section_selector:, append_to: nil, include_intro_page: true
|
21
|
+
section_selector:, append_to: nil, include_intro_page: true,
|
22
|
+
wrap_section: false, wrap_content: false)
|
22
23
|
V1.new.bake(
|
23
24
|
chapter: chapter,
|
24
25
|
metadata_source: metadata_source,
|
@@ -26,7 +27,9 @@ module Kitchen
|
|
26
27
|
uuid_key: uuid_key,
|
27
28
|
section_selector: section_selector,
|
28
29
|
append_to: append_to || chapter,
|
29
|
-
include_intro_page: include_intro_page
|
30
|
+
include_intro_page: include_intro_page,
|
31
|
+
wrap_section: wrap_section,
|
32
|
+
wrap_content: wrap_content
|
30
33
|
) do |section|
|
31
34
|
yield section if block_given?
|
32
35
|
end
|
@@ -5,20 +5,36 @@
|
|
5
5
|
module Kitchen::Directions::MoveCustomSectionToEocContainer
|
6
6
|
class V1
|
7
7
|
def bake(chapter:, metadata_source:, container_key:, uuid_key:,
|
8
|
-
section_selector:, append_to:, include_intro_page:,
|
8
|
+
section_selector:, append_to:, include_intro_page:, wrap_section:, wrap_content:,
|
9
|
+
&block)
|
9
10
|
section_clipboard = Kitchen::Clipboard.new
|
10
11
|
pages = include_intro_page ? chapter.pages : chapter.non_introduction_pages
|
11
12
|
sections = pages.search(section_selector)
|
12
13
|
sections.each(&block)
|
14
|
+
if wrap_section
|
15
|
+
sections.each { |section| section.wrap('<div class="os-section-area">') }
|
16
|
+
sections = pages.search('div.os-section-area')
|
17
|
+
end
|
13
18
|
sections.cut(to: section_clipboard)
|
14
19
|
|
15
20
|
return if section_clipboard.none?
|
16
21
|
|
22
|
+
content = \
|
23
|
+
if wrap_content
|
24
|
+
<<~HTML
|
25
|
+
<div class="os-#{container_key}">
|
26
|
+
#{section_clipboard.paste}
|
27
|
+
</div>
|
28
|
+
HTML
|
29
|
+
else
|
30
|
+
section_clipboard.paste
|
31
|
+
end
|
32
|
+
|
17
33
|
Kitchen::Directions::EocCompositePageContainer.v1(
|
18
34
|
container_key: container_key,
|
19
35
|
uuid_key: uuid_key,
|
20
36
|
metadata_source: metadata_source,
|
21
|
-
content:
|
37
|
+
content: content,
|
22
38
|
append_to: append_to || chapter
|
23
39
|
)
|
24
40
|
end
|
@@ -5,38 +5,20 @@ module Kitchen::Directions::MoveExercisesToEOC
|
|
5
5
|
# and some additional wrappers
|
6
6
|
class V2
|
7
7
|
def bake(chapter:, metadata_source:, klass:, append_to: nil, uuid_prefix: '.')
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
sections = page.search("section.#{klass}")
|
12
|
-
|
13
|
-
sections.each do |exercise_section|
|
14
|
-
Kitchen::Directions::RemoveSectionTitle.v1(section: exercise_section)
|
15
|
-
# Get parent page title
|
16
|
-
section_title = Kitchen::Directions::EocSectionTitleLinkSnippet.v1(page: page)
|
17
|
-
# Configure section title & wrappers
|
18
|
-
exercise_section.prepend(child: section_title)
|
19
|
-
exercise_section.wrap('<div class="os-section-area">')
|
20
|
-
exercise_section = exercise_section.parent
|
21
|
-
exercise_section.cut(to: exercise_clipboard)
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
return if exercise_clipboard.none?
|
26
|
-
|
27
|
-
content = <<~HTML
|
28
|
-
<div class="os-#{klass}">
|
29
|
-
#{exercise_clipboard.paste}
|
30
|
-
</div>
|
31
|
-
HTML
|
32
|
-
|
33
|
-
Kitchen::Directions::EocCompositePageContainer.v1(
|
8
|
+
Kitchen::Directions::MoveCustomSectionToEocContainer.v1(
|
9
|
+
chapter: chapter,
|
10
|
+
metadata_source: metadata_source,
|
34
11
|
container_key: klass,
|
35
12
|
uuid_key: "#{uuid_prefix}#{klass}",
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
13
|
+
section_selector: "section.#{klass}",
|
14
|
+
append_to: append_to || chapter,
|
15
|
+
include_intro_page: false,
|
16
|
+
wrap_section: true, wrap_content: true
|
17
|
+
) do |section|
|
18
|
+
Kitchen::Directions::RemoveSectionTitle.v1(section: section)
|
19
|
+
title = Kitchen::Directions::EocSectionTitleLinkSnippet.v1(page: section.ancestor(:page))
|
20
|
+
section.prepend(child: title)
|
21
|
+
end
|
40
22
|
end
|
41
23
|
end
|
42
24
|
end
|
@@ -0,0 +1,40 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Kitchen::Directions::MoveSolutionsToAnswerKey
|
4
|
+
module Strategies
|
5
|
+
class ContemporaryMath
|
6
|
+
def bake(chapter:, append_to:)
|
7
|
+
solutions_clipboard = Kitchen::Clipboard.new
|
8
|
+
chapter.notes('$.your-turn').exercises.each do |exercise|
|
9
|
+
solution = exercise.solution
|
10
|
+
next unless solution
|
11
|
+
|
12
|
+
# Hacky numbering fix
|
13
|
+
number = exercise.ancestor(:note).count_in(:chapter)
|
14
|
+
solution.first('a.os-number').inner_html = number.to_s
|
15
|
+
solution.first('span.os-divider').inner_html = '. '
|
16
|
+
solution.cut(to: solutions_clipboard)
|
17
|
+
end
|
18
|
+
title = <<~HTML
|
19
|
+
<h3 data-type="title">
|
20
|
+
<span class="os-title-label">#{I18n.t(:'notes.your-turn')}</span>
|
21
|
+
</h3>
|
22
|
+
HTML
|
23
|
+
append_solution_area(title: title, solutions: solutions_clipboard,
|
24
|
+
append_to: append_to)
|
25
|
+
end
|
26
|
+
|
27
|
+
def append_solution_area(title:, solutions:, append_to:)
|
28
|
+
append_to = append_to.add_child(
|
29
|
+
<<~HTML
|
30
|
+
<div class="os-solution-area">
|
31
|
+
#{title}
|
32
|
+
</div>
|
33
|
+
HTML
|
34
|
+
).first
|
35
|
+
|
36
|
+
append_to.add_child(solutions.paste)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
@@ -2,11 +2,16 @@
|
|
2
2
|
|
3
3
|
module Kitchen::Directions::MoveSolutionsToAnswerKey
|
4
4
|
class V1
|
5
|
-
|
5
|
+
# rubocop:disable Metrics/ParameterLists
|
6
|
+
# This direction may need refactoring to simplify parameters
|
7
|
+
def bake(chapter:, metadata_source:, strategy:, append_to:, strategy_options: {},
|
8
|
+
solutions_plural: true)
|
6
9
|
strategy =
|
7
10
|
case strategy
|
8
11
|
when :calculus
|
9
12
|
Strategies::Calculus.new
|
13
|
+
when :contemporary_math
|
14
|
+
Strategies::ContemporaryMath.new
|
10
15
|
when :uphysics
|
11
16
|
Strategies::UPhysics.new
|
12
17
|
when :precalculus
|
@@ -34,5 +39,6 @@ module Kitchen::Directions::MoveSolutionsToAnswerKey
|
|
34
39
|
)
|
35
40
|
strategy.bake(chapter: chapter, append_to: append_to.last_element)
|
36
41
|
end
|
42
|
+
# rubocop:enable Metrics/ParameterLists
|
37
43
|
end
|
38
44
|
end
|
@@ -27,9 +27,15 @@ module Kitchen
|
|
27
27
|
#
|
28
28
|
# @return [ElementEnumerator]
|
29
29
|
#
|
30
|
-
def
|
31
|
-
|
30
|
+
def titles_to_rename
|
31
|
+
titles(except: \
|
32
|
+
lambda do |title|
|
33
|
+
title.parent.has_class?('os-caption-container') || \
|
34
|
+
title.parent.has_class?('os-caption') || \
|
35
|
+
title.parent.name == 'caption' || \
|
36
|
+
title.parent[:'data-type'] == 'note'
|
37
|
+
end
|
38
|
+
)
|
32
39
|
end
|
33
|
-
|
34
40
|
end
|
35
41
|
end
|
@@ -47,5 +47,16 @@ module Kitchen
|
|
47
47
|
parent.name == 'figure'
|
48
48
|
end
|
49
49
|
|
50
|
+
# Returns true unless the figure is a subfigure or has the 'unnumbered' class,
|
51
|
+
# unless the figure has both the 'unnumbered' and the 'splash' classes.
|
52
|
+
#
|
53
|
+
# @return [Boolean]
|
54
|
+
#
|
55
|
+
def figure_to_bake?
|
56
|
+
return false if subfigure? || (has_class?('unnumbered') && !has_class?('splash'))
|
57
|
+
|
58
|
+
true
|
59
|
+
end
|
60
|
+
|
50
61
|
end
|
51
62
|
end
|
data/lib/kitchen/note_element.rb
CHANGED
@@ -29,7 +29,14 @@ module Kitchen
|
|
29
29
|
#
|
30
30
|
def title
|
31
31
|
block_error_if(block_given?)
|
32
|
-
first(
|
32
|
+
note_body = first('div.os-note-body')
|
33
|
+
first_child = note_body ? note_body.element_children[0] : element_children[0]
|
34
|
+
|
35
|
+
if first_child[:'data-type'] == 'title'
|
36
|
+
first_child
|
37
|
+
elsif first_child&.element_children&.[](0)&.[](:'data-type') == 'title'
|
38
|
+
first_child.element_children[0]
|
39
|
+
end
|
33
40
|
end
|
34
41
|
|
35
42
|
# Returns true if the note's title is autogenerated
|
data/lib/kitchen/page_element.rb
CHANGED
@@ -103,14 +103,6 @@ module Kitchen
|
|
103
103
|
first!('section.exercises')
|
104
104
|
end
|
105
105
|
|
106
|
-
# Returns the key concepts
|
107
|
-
#
|
108
|
-
# @return [Element]
|
109
|
-
#
|
110
|
-
def key_concepts
|
111
|
-
search('section.key-concepts')
|
112
|
-
end
|
113
|
-
|
114
106
|
# Returns the free response questions
|
115
107
|
#
|
116
108
|
# @return [Element]
|
data/lib/kitchen/version.rb
CHANGED
data/lib/locales/en.yml
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: openstax_kitchen
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 10.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- JP Slavinsky
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-07-
|
11
|
+
date: 2021-07-30 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -274,11 +274,14 @@ files:
|
|
274
274
|
- lib/kitchen/directions/bake_free_response/main.rb
|
275
275
|
- lib/kitchen/directions/bake_free_response/v1.rb
|
276
276
|
- lib/kitchen/directions/bake_further_research.rb
|
277
|
+
- lib/kitchen/directions/bake_handbook/main.rb
|
278
|
+
- lib/kitchen/directions/bake_handbook/v1.rb
|
277
279
|
- lib/kitchen/directions/bake_index/main.rb
|
278
280
|
- lib/kitchen/directions/bake_index/v1.rb
|
279
281
|
- lib/kitchen/directions/bake_index/v1.xhtml.erb
|
280
282
|
- lib/kitchen/directions/bake_inline_lists.rb
|
281
283
|
- lib/kitchen/directions/bake_link_placeholders.rb
|
284
|
+
- lib/kitchen/directions/bake_lists_with_para.rb
|
282
285
|
- lib/kitchen/directions/bake_math_in_paragraph.rb
|
283
286
|
- lib/kitchen/directions/bake_non_introduction_pages.rb
|
284
287
|
- lib/kitchen/directions/bake_notes/bake_autotitled_notes.rb
|
@@ -303,9 +306,9 @@ files:
|
|
303
306
|
- lib/kitchen/directions/bake_references/v2.rb
|
304
307
|
- lib/kitchen/directions/bake_stepwise.rb
|
305
308
|
- lib/kitchen/directions/bake_suggested_reading.rb
|
306
|
-
- lib/kitchen/directions/bake_theorem/main.rb
|
307
|
-
- lib/kitchen/directions/bake_theorem/v1.rb
|
308
309
|
- lib/kitchen/directions/bake_toc.rb
|
310
|
+
- lib/kitchen/directions/bake_unit_page_title/main.rb
|
311
|
+
- lib/kitchen/directions/bake_unit_page_title/v1.rb
|
309
312
|
- lib/kitchen/directions/bake_unit_title/main.rb
|
310
313
|
- lib/kitchen/directions/bake_unit_title/v1.rb
|
311
314
|
- lib/kitchen/directions/bake_unnumbered_tables.rb
|
@@ -326,6 +329,7 @@ files:
|
|
326
329
|
- lib/kitchen/directions/move_exercises_to_eoc/v3.rb
|
327
330
|
- lib/kitchen/directions/move_solutions_to_answer_key/main.rb
|
328
331
|
- lib/kitchen/directions/move_solutions_to_answer_key/strategies/calculus.rb
|
332
|
+
- lib/kitchen/directions/move_solutions_to_answer_key/strategies/contemporary_math.rb
|
329
333
|
- lib/kitchen/directions/move_solutions_to_answer_key/strategies/default.rb
|
330
334
|
- lib/kitchen/directions/move_solutions_to_answer_key/strategies/precalculus.rb
|
331
335
|
- lib/kitchen/directions/move_solutions_to_answer_key/strategies/uphysics.rb
|
@@ -1,28 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module Kitchen::Directions::BakeTheorem
|
4
|
-
class V1
|
5
|
-
def bake(theorem:, number:)
|
6
|
-
theorem['use-subtitle'] = true
|
7
|
-
new_subtitle = theorem.title.cut
|
8
|
-
|
9
|
-
theorem.wrap_children(class: 'os-note-body')
|
10
|
-
note_body = theorem.first('.os-note-body')
|
11
|
-
|
12
|
-
note_body.prepend(sibling:
|
13
|
-
<<~HTML
|
14
|
-
<div class="os-title">
|
15
|
-
<span class="os-title-label">#{I18n.t(:theorem)} </span>
|
16
|
-
<span class="os-number">#{number}</span>
|
17
|
-
<span class="os-divider"> </span>
|
18
|
-
</div>
|
19
|
-
HTML
|
20
|
-
)
|
21
|
-
|
22
|
-
new_subtitle.name = 'h4'
|
23
|
-
new_subtitle.add_class('os-subtitle')
|
24
|
-
new_subtitle.children.wrap('<span class="os-subtitle-label">')
|
25
|
-
note_body.prepend(child: new_subtitle.paste)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|