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