openstax_kitchen 14.0.0 → 17.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/CHANGELOG.md +47 -3
- data/Gemfile.lock +4 -4
- data/codecov.yaml +4 -0
- data/lib/kitchen/directions/bake_all_chapter_solutions_types.rb +30 -0
- data/lib/kitchen/directions/bake_all_numbered_exercise_types.rb +26 -0
- data/lib/kitchen/directions/bake_annotation_classes/v1.rb +11 -2
- data/lib/kitchen/directions/bake_autotitled_exercise/main.rb +4 -0
- data/lib/kitchen/directions/bake_autotitled_exercise/v3.rb +35 -0
- data/lib/kitchen/directions/bake_chapter_references/main.rb +15 -0
- data/lib/kitchen/directions/bake_chapter_references/v2.rb +53 -0
- data/lib/kitchen/directions/bake_chapter_references/v3.rb +45 -0
- data/lib/kitchen/directions/bake_chapter_summary.rb +5 -4
- data/lib/kitchen/directions/bake_example.rb +1 -1
- data/lib/kitchen/directions/bake_exercise_prefixes/main.rb +14 -0
- data/lib/kitchen/directions/bake_exercise_prefixes/v1.rb +22 -0
- data/lib/kitchen/directions/bake_footnotes/v1.rb +1 -1
- data/lib/kitchen/directions/bake_index/v1.rb +13 -8
- data/lib/kitchen/directions/bake_index/v1.xhtml.erb +6 -10
- data/lib/kitchen/directions/{bake_injected_exercise.rb → bake_injected_exercise/bake_injected_exercise.rb} +10 -1
- data/lib/kitchen/directions/bake_injected_exercise/bake_injected_exercise_question.rb +4 -0
- data/lib/kitchen/directions/bake_link_placeholders.rb +1 -1
- data/lib/kitchen/directions/bake_lo_link_labels.rb +19 -0
- data/lib/kitchen/directions/bake_non_introduction_pages.rb +3 -1
- data/lib/kitchen/directions/bake_numbered_exercise/main.rb +8 -3
- data/lib/kitchen/directions/bake_numbered_exercise/v1.rb +48 -7
- data/lib/kitchen/directions/bake_numbered_table/bake_table_body.rb +5 -1
- data/lib/kitchen/directions/bake_numbered_table/v2.rb +2 -1
- data/lib/kitchen/directions/bake_references/v1.rb +13 -0
- data/lib/kitchen/directions/bake_screenreader_spans.rb +22 -0
- data/lib/kitchen/directions/bake_unnumbered_exercise.rb +16 -0
- data/lib/kitchen/directions/book_answer_key_container/eob_answer_key_container.xhtml.erb +9 -0
- data/lib/kitchen/directions/book_answer_key_container/v1.rb +6 -2
- data/lib/kitchen/directions/default_strategy_for_answer_key_solutions.rb +35 -0
- data/lib/kitchen/directions/move_solutions_to_answer_key/answer_key_inner_container.rb +29 -0
- data/lib/kitchen/element_base.rb +25 -5
- data/lib/kitchen/element_enumerator_base.rb +18 -0
- data/lib/kitchen/injected_exercise_element.rb +41 -0
- data/lib/kitchen/injected_exercise_element_enumerator.rb +21 -0
- data/lib/kitchen/injected_question_element.rb +7 -0
- data/lib/kitchen/patches/i18n.rb +4 -0
- data/lib/kitchen/patches/integer.rb +32 -3
- data/lib/kitchen/patches/nokogiri.rb +5 -4
- data/lib/kitchen/patches/renderable.rb +1 -1
- data/lib/kitchen/selectors/base.rb +3 -0
- data/lib/kitchen/selectors/standard_1.rb +1 -0
- data/lib/kitchen/version.rb +1 -1
- data/lib/locales/en.yml +16 -0
- data/lib/locales/es.yml +6 -1
- metadata +18 -11
- data/lib/kitchen/directions/book_answer_key_container/eob_answer_key_outer_container.xhtml.erb +0 -9
- data/lib/kitchen/directions/move_solutions_to_answer_key/main.rb +0 -18
- data/lib/kitchen/directions/move_solutions_to_answer_key/strategies/calculus.rb +0 -41
- data/lib/kitchen/directions/move_solutions_to_answer_key/strategies/contemporary_math.rb +0 -40
- data/lib/kitchen/directions/move_solutions_to_answer_key/strategies/default.rb +0 -27
- data/lib/kitchen/directions/move_solutions_to_answer_key/strategies/precalculus.rb +0 -63
- data/lib/kitchen/directions/move_solutions_to_answer_key/strategies/uphysics.rb +0 -21
- 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:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 23c782f23dfd67f38174ddb5f51c28955ae7929854e17a6f9163f41bb644485e
|
4
|
+
data.tar.gz: 4fafd85f2c59373ebe321e0ddc1b86f5b61e7453bbfe1ca66b94b9ec59c75a59
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
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 (
|
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.
|
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.
|
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.
|
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
@@ -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
|
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
|
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
|
@@ -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)}
|
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,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
|
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
|
-
|
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
|
-
|
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.
|
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
|
-
|
15
|
-
|
16
|
-
<span class="os-term" group-by="<%= term.group_by %>"><%= term.text %></span>
|
17
|
-
|
18
|
-
|
19
|
-
|
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
|
-
|
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}
|
@@ -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:
|