openstax_kitchen 16.0.0 → 19.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 +31 -0
- data/Gemfile.lock +5 -5
- data/lib/kitchen/directions/bake_annotation_classes/v1.rb +11 -2
- 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_exercise_prefixes/main.rb +14 -0
- data/lib/kitchen/directions/bake_exercise_prefixes/v1.rb +22 -0
- data/lib/kitchen/directions/bake_handbook/v1.rb +1 -1
- data/lib/kitchen/directions/bake_index/v1.rb +12 -7
- data/lib/kitchen/directions/bake_index/v1.xhtml.erb +1 -1
- data/lib/kitchen/directions/bake_link_placeholders.rb +1 -1
- data/lib/kitchen/directions/bake_numbered_table/bake_table_body.rb +6 -1
- data/lib/kitchen/directions/bake_references/v1.rb +4 -4
- data/lib/kitchen/directions/bake_screenreader_spans.rb +39 -5
- data/lib/kitchen/directions/bake_toc.rb +6 -3
- data/lib/kitchen/directions/bake_unit_page_title/v1.rb +8 -2
- data/lib/kitchen/directions/bake_unnumbered_tables.rb +4 -0
- data/lib/kitchen/directions/move_solutions_to_answer_key/answer_key_cleaner.rb +19 -0
- data/lib/kitchen/element_base.rb +17 -1
- data/lib/kitchen/patches/integer.rb +32 -3
- data/lib/kitchen/patches/nokogiri.rb +0 -7
- data/lib/kitchen/version.rb +1 -1
- data/lib/locales/en.yml +22 -0
- metadata +7 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8ad3abbaf8b72b698a5c8d16136f6d6ec9662c82c12291a7c7f87d02eafc0805
|
4
|
+
data.tar.gz: 948a85a3659dd95502113d351cbeb5a3cbc0b2c0151806974c69978818f622f2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 619c09628f6d62413fd07a7ee4e732cff9f52e78363a2f3414a11f9bbb3f32a008695fb4eaa25f82f0bc8cd81354ebc9e8666973904dd9f5ae2367a6183fde5c
|
7
|
+
data.tar.gz: f1b1198cdf3d84544fdd0af0fafa5bb17a0b15a273fb801ea5a4a345a7812da2e0de5311292e5b1e05a4d11715f6564ef817ff07ae5450a23f4397483ba45254
|
data/CHANGELOG.md
CHANGED
@@ -6,12 +6,43 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
6
6
|
|
7
7
|
## [Unreleased]
|
8
8
|
|
9
|
+
## [19.0.0] - 2022-1-28
|
10
|
+
|
11
|
+
* Add features to `BakeScreenreaderSpans` & use translations instead of plaintext (minor)
|
12
|
+
* Create `AnswerKeyCleaner` to remove empty chapter containers (minor)
|
13
|
+
* Change markup to `span` with `sup` for reference link separator `BakeReferences.v1` plus remove whitespaces and new lines (patch)
|
14
|
+
* Changes to `BakeScreenreaderSpans` behavior (major)
|
15
|
+
* Changes to `BakeToc` to improve error messaging by including `page.id` (minor)
|
16
|
+
|
17
|
+
## [18.0.0] - 2022-01-14
|
18
|
+
|
19
|
+
* Fix links in `BakeHanbook` outline to point sections (patch)
|
20
|
+
* Add unit title prefix with number to `BakeUnitPageTitle` (patch)
|
21
|
+
* Add `scope="col"` attribute to `BakeTableBody` and `BakeUnnumberedTables` (major)
|
22
|
+
|
23
|
+
## [17.1.0] - 2021-12-17
|
24
|
+
|
25
|
+
* Add append_to support to `BakeChapterSummary` (minor)
|
26
|
+
* Add support for italicized terms in index (minor)
|
27
|
+
* Fix problem with namespaces in `BakeLinkPlaceholders` and `BakeIndex` (minor)
|
28
|
+
* Create `V3` for `BakeChapterReferences` which sorts references alphabetically (minor)
|
29
|
+
|
30
|
+
## [17.0.0] - 2021-12-3
|
31
|
+
|
32
|
+
* Create method in `Integer` class that generate roman numbers up to 100 (minor)
|
33
|
+
* Add more roman numbers to `Integer` class (patch)
|
34
|
+
* Create `V2` for `BakeChapterReferences` (minor)
|
35
|
+
* Create `BakeExercisePrefixes` direction adding prefixes for exercises in selected sections (minor)
|
36
|
+
* Add support for 'text-heavy-top-titled' tables in `BakeTableBody` (minor)
|
37
|
+
* Remove `Nokigiri#previous` patch, `ElementBase#previous` now uses `#previous_element` (minor)
|
38
|
+
* Modifies `BakeAnnotationClasses` for annotations wrapper to be a `span` intead of a `div` (major)
|
9
39
|
|
10
40
|
## [16.0.0] - 2021-11-19
|
11
41
|
|
12
42
|
* Add reference link separator to `BakeReferences.v1` (patch)
|
13
43
|
* Modify `BakeFootnotes` to be more general (minor)
|
14
44
|
* Add `#preceded_by_text` method to element_base and the nokigiri patch (minor)
|
45
|
+
* Remove `Nokigiri#previous` patch, `ElementBase#previous` now uses `#previous_element` (minor)
|
15
46
|
* Broaden caption selection for `BakeNumberedTable#v2` (patch)
|
16
47
|
* Add details of question count to injected exercises in `BakeInjectedExercise` (major)
|
17
48
|
* 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)
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
openstax_kitchen (
|
4
|
+
openstax_kitchen (19.0.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)
|
@@ -36,7 +36,7 @@ GEM
|
|
36
36
|
yard (~> 0.9.12)
|
37
37
|
method_source (1.0.0)
|
38
38
|
mini_portile2 (2.5.0)
|
39
|
-
minitest (5.
|
39
|
+
minitest (5.15.0)
|
40
40
|
nokogiri (1.11.1)
|
41
41
|
mini_portile2 (~> 2.5.0)
|
42
42
|
racc (~> 1.4)
|
@@ -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.11.1)
|
103
103
|
camertron-eprun
|
104
104
|
cldr-plurals-runtime-rb (~> 1.1)
|
105
105
|
tzinfo
|
@@ -107,7 +107,7 @@ GEM
|
|
107
107
|
concurrent-ruby (~> 1.0)
|
108
108
|
unicode-display_width (1.7.0)
|
109
109
|
yard (0.9.24)
|
110
|
-
zeitwerk (2.5.
|
110
|
+
zeitwerk (2.5.4)
|
111
111
|
|
112
112
|
PLATFORMS
|
113
113
|
ruby
|
@@ -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
|
@@ -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
|
@@ -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
|
@@ -43,7 +43,7 @@ module Kitchen::Directions::BakeHandbook
|
|
43
43
|
|
44
44
|
outline_item_html = <<~HTML
|
45
45
|
<div class="os-handbook-objective">
|
46
|
-
<a class="os-handbook-objective" href="##{
|
46
|
+
<a class="os-handbook-objective" href="##{section[:id]}">
|
47
47
|
#{first_section_title.children}
|
48
48
|
</a>
|
49
49
|
</div>
|
@@ -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,18 +154,18 @@ 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
|
@@ -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,
|
@@ -13,7 +13,7 @@
|
|
13
13
|
<div class="os-index-item">
|
14
14
|
<%- item.terms.each_with_index do |term, ii| -%>
|
15
15
|
<%- if ii == 0 -%>
|
16
|
-
<span class="os-term" group-by="<%= term.group_by %>"><%= term.text %></span>
|
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
17
|
<%- else -%><span class="os-index-link-separator">, </span><% end %>
|
18
18
|
<a class="os-term-section-link" href="#<%= term.id %>"><span class="os-term-section"><%= term.page_title %></span></a><!--
|
19
19
|
--><%- end %>
|
@@ -40,12 +40,17 @@ module Kitchen
|
|
40
40
|
table.remove_attribute('summary')
|
41
41
|
table.wrap(%(<div class="os-table">))
|
42
42
|
|
43
|
+
table.search('th').each do |header|
|
44
|
+
header[:scope] = 'col'
|
45
|
+
end
|
46
|
+
|
43
47
|
# Store label information
|
44
48
|
table.target_label(label_text: 'table', custom_content: number, cases: cases)
|
45
49
|
|
46
50
|
if table.top_titled?
|
51
|
+
klass = table.text_heavy? ? 'text-heavy-top-titled' : 'top-titled'
|
47
52
|
custom_table = CustomBody.new(table: table,
|
48
|
-
klass:
|
53
|
+
klass: klass,
|
49
54
|
fake_title_class: 'os-table-title',
|
50
55
|
fake_title: table.title,
|
51
56
|
to_trash: table.title_row)
|
@@ -8,7 +8,7 @@ module Kitchen::Directions::BakeReferences
|
|
8
8
|
book.chapters.each do |chapter|
|
9
9
|
chapter.search('[data-type="cite"]').each do |link|
|
10
10
|
link.prepend(child:
|
11
|
-
<<~HTML
|
11
|
+
<<~HTML.chomp
|
12
12
|
<sup class="os-citation-number">#{link.count_in(:chapter)}</sup>
|
13
13
|
HTML
|
14
14
|
)
|
@@ -21,10 +21,10 @@ module Kitchen::Directions::BakeReferences
|
|
21
21
|
next unless link_sibling&.raw&.attr('data-type') == 'cite'
|
22
22
|
|
23
23
|
link.prepend(sibling:
|
24
|
-
<<~HTML
|
25
|
-
<span class="os-reference-link-separator">, </span>
|
24
|
+
<<~HTML.strip.chomp
|
25
|
+
<span class="os-reference-link-separator"><sup>, </sup></span>
|
26
26
|
HTML
|
27
|
-
|
27
|
+
)
|
28
28
|
end
|
29
29
|
|
30
30
|
chapter.references.each do |reference|
|
@@ -6,17 +6,51 @@ module Kitchen
|
|
6
6
|
# Add text for accessibility.
|
7
7
|
# Additional screenreader spans can be added below.
|
8
8
|
def self.v1(book:)
|
9
|
+
book.search('u[data-effect="underline"]').each do |element|
|
10
|
+
add_screenreader_text(
|
11
|
+
element: element,
|
12
|
+
begin_message: I18n.t(:'screenreader.underline'),
|
13
|
+
end_message: "#{I18n.t(:'screenreader.end')} #{I18n.t(:'screenreader.underline')}"
|
14
|
+
)
|
15
|
+
end
|
9
16
|
book.search('u[data-effect="double-underline"]').each do |element|
|
10
|
-
|
11
|
-
|
17
|
+
add_screenreader_text(
|
18
|
+
element: element,
|
19
|
+
begin_message: I18n.t(:'screenreader.double-underline'),
|
20
|
+
end_message: "#{I18n.t(:'screenreader.end')} #{I18n.t(:'screenreader.double-underline')}"
|
12
21
|
)
|
13
22
|
end
|
14
|
-
book.search('
|
15
|
-
|
16
|
-
|
23
|
+
book.search('p.public-domain').each do |element|
|
24
|
+
add_screenreader_text(
|
25
|
+
element: element,
|
26
|
+
begin_message: I18n.t(:'screenreader.public-domain'),
|
27
|
+
end_message: "#{I18n.t(:'screenreader.end')} #{I18n.t(:'screenreader.public-domain')}"
|
28
|
+
)
|
29
|
+
end
|
30
|
+
book.search('p.student-sample').each do |element|
|
31
|
+
add_screenreader_text(
|
32
|
+
element: element,
|
33
|
+
begin_message: I18n.t(:'screenreader.student-sample'),
|
34
|
+
end_message: "#{I18n.t(:'screenreader.end')} #{I18n.t(:'screenreader.student-sample')}"
|
35
|
+
)
|
36
|
+
end
|
37
|
+
book.search('p.annotation-text').each do |element|
|
38
|
+
add_screenreader_text(
|
39
|
+
element: element,
|
40
|
+
begin_message: I18n.t(:'screenreader.annotation-text'),
|
41
|
+
end_message: "#{I18n.t(:'screenreader.end')} #{I18n.t(:'screenreader.annotation-text')}"
|
17
42
|
)
|
18
43
|
end
|
19
44
|
end
|
45
|
+
|
46
|
+
def self.add_screenreader_text(element:, begin_message:, end_message:)
|
47
|
+
element.prepend(child:
|
48
|
+
"<span data-screenreader-only=\"true\">#{begin_message}</span>"
|
49
|
+
)
|
50
|
+
element.append(child:
|
51
|
+
"<span data-screenreader-only=\"true\">#{end_message}</span>"
|
52
|
+
)
|
53
|
+
end
|
20
54
|
end
|
21
55
|
end
|
22
56
|
end
|
@@ -100,7 +100,8 @@ module Kitchen
|
|
100
100
|
page.has_ancestor?(:composite_chapter)
|
101
101
|
'os-toc-unit-page'
|
102
102
|
else
|
103
|
-
raise "
|
103
|
+
raise "could not detect which page type class to apply for page.id `#{page.id}`
|
104
|
+
during baking the TOC. The classes on the page are: `#{page.classes}`"
|
104
105
|
end
|
105
106
|
when CompositePageElement
|
106
107
|
if page.is_index? || page.is_index_of_type?
|
@@ -112,10 +113,12 @@ module Kitchen
|
|
112
113
|
elsif page.has_ancestor?(:composite_chapter) || page.has_ancestor?(:chapter)
|
113
114
|
'os-toc-chapter-composite-page'
|
114
115
|
else
|
115
|
-
raise "
|
116
|
+
raise "could not detect which composite page type class to apply to TOC for page id \
|
117
|
+
`#{page.id}` during baking the TOC. The classes on the page are: `#{page.classes}`"
|
116
118
|
end
|
117
119
|
else
|
118
|
-
raise(ArgumentError, "
|
120
|
+
raise(ArgumentError, "could not detect any page type class to apply for `#{page.id}` \
|
121
|
+
during baking TOC")
|
119
122
|
end
|
120
123
|
|
121
124
|
title = page.title.copy
|
@@ -4,17 +4,23 @@ module Kitchen::Directions::BakeUnitPageTitle
|
|
4
4
|
class V1
|
5
5
|
def bake(book:)
|
6
6
|
book.units.each do |unit|
|
7
|
+
@unit_title = I18n.t(:unit)
|
8
|
+
@unit_number = unit.count_in(:book)
|
7
9
|
unit.element_children.only(Kitchen::PageElement).each do |page|
|
8
|
-
compose_unit_page_title(page: page
|
10
|
+
compose_unit_page_title(page: page, unit_title_prefix: @unit_title,
|
11
|
+
unit_number: @unit_number)
|
9
12
|
end
|
10
13
|
end
|
11
14
|
end
|
12
15
|
|
13
|
-
def compose_unit_page_title(page:)
|
16
|
+
def compose_unit_page_title(page:, unit_title_prefix:, unit_number:)
|
14
17
|
title = page.title
|
15
18
|
title.name = 'h2'
|
16
19
|
title.replace_children(with:
|
17
20
|
<<~HTML
|
21
|
+
<span class="os-part-text">#{unit_title_prefix} </span>
|
22
|
+
<span class="os-number">#{unit_number}</span>
|
23
|
+
<span class="os-divider"> </span>
|
18
24
|
<span data-type="" itemprop="" class="os-text">#{title.text}</span>
|
19
25
|
HTML
|
20
26
|
)
|
@@ -10,6 +10,10 @@ module Kitchen
|
|
10
10
|
table.parent.add_class('os-unstyled-container') if table.unstyled?
|
11
11
|
table.parent.add_class('os-column-header-container') if table.column_header?
|
12
12
|
table.parent.add_class('os-top-titled-container') if table.top_titled?
|
13
|
+
|
14
|
+
table.search('th').each do |header|
|
15
|
+
header[:scope] = 'col'
|
16
|
+
end
|
13
17
|
end
|
14
18
|
end
|
15
19
|
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Kitchen::Directions::AnswerKeyCleaner
|
4
|
+
def self.v1(book:)
|
5
|
+
V1.new.bake(book: book)
|
6
|
+
end
|
7
|
+
|
8
|
+
class V1
|
9
|
+
renderable
|
10
|
+
|
11
|
+
def bake(book:)
|
12
|
+
answer_key_chapters = book.search(
|
13
|
+
'.os-eob[data-type="composite-chapter"] > [data-type="composite-page"]')
|
14
|
+
answer_key_chapters.each do |container|
|
15
|
+
container.trash unless container.contains?('[data-type="solution"]')
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
data/lib/kitchen/element_base.rb
CHANGED
@@ -223,6 +223,22 @@ module Kitchen
|
|
223
223
|
self[:'data-type']
|
224
224
|
end
|
225
225
|
|
226
|
+
# Returns the element's href
|
227
|
+
#
|
228
|
+
# @return [String]
|
229
|
+
#
|
230
|
+
def href
|
231
|
+
self[:href]
|
232
|
+
end
|
233
|
+
|
234
|
+
# Sets the element's href
|
235
|
+
#
|
236
|
+
# @param value [String] the new value for the href
|
237
|
+
#
|
238
|
+
def href=(value)
|
239
|
+
self[:href] = value
|
240
|
+
end
|
241
|
+
|
226
242
|
# A way to set values and chain them
|
227
243
|
#
|
228
244
|
# @param property [String, Symbol] the name of the property to set
|
@@ -511,7 +527,7 @@ module Kitchen
|
|
511
527
|
# nil if there's no previous sibling
|
512
528
|
#
|
513
529
|
def previous
|
514
|
-
prev = raw.
|
530
|
+
prev = raw.previous_element
|
515
531
|
return prev if prev.nil?
|
516
532
|
|
517
533
|
Element.new(
|
@@ -3,7 +3,22 @@
|
|
3
3
|
# Monkey patches for +Integer+
|
4
4
|
#
|
5
5
|
class Integer
|
6
|
-
|
6
|
+
|
7
|
+
@roman_numerals = {
|
8
|
+
100 => 'c',
|
9
|
+
90 => 'xc',
|
10
|
+
50 => 'l',
|
11
|
+
40 => 'xl',
|
12
|
+
10 => 'x',
|
13
|
+
9 => 'ix',
|
14
|
+
5 => 'v',
|
15
|
+
4 => 'iv',
|
16
|
+
1 => 'i'
|
17
|
+
}
|
18
|
+
|
19
|
+
class << self
|
20
|
+
attr_accessor :roman_numerals
|
21
|
+
end
|
7
22
|
|
8
23
|
# Formats as different types of integers, including roman numerals.
|
9
24
|
#
|
@@ -14,11 +29,25 @@ class Integer
|
|
14
29
|
when :arabic
|
15
30
|
to_s
|
16
31
|
when :roman
|
17
|
-
raise 'Unknown conversion to Roman numerals' if self
|
32
|
+
raise 'Unknown conversion to Roman numerals' if self > self.class.roman_numerals.keys.first
|
18
33
|
|
19
|
-
|
34
|
+
to_roman
|
20
35
|
else
|
21
36
|
raise 'Unknown integer format'
|
22
37
|
end
|
23
38
|
end
|
39
|
+
|
40
|
+
def to_roman
|
41
|
+
return 0 if zero?
|
42
|
+
|
43
|
+
roman = ''
|
44
|
+
integer = self
|
45
|
+
self.class.roman_numerals.each do |number, letter|
|
46
|
+
until integer < number
|
47
|
+
roman += letter
|
48
|
+
integer -= number
|
49
|
+
end
|
50
|
+
end
|
51
|
+
roman
|
52
|
+
end
|
24
53
|
end
|
@@ -67,13 +67,6 @@ module Nokogiri
|
|
67
67
|
self[:class]&.split || []
|
68
68
|
end
|
69
69
|
|
70
|
-
def previous
|
71
|
-
prev = previous_element
|
72
|
-
return nil if prev.nil?
|
73
|
-
|
74
|
-
prev.text? ? prev.previous : prev
|
75
|
-
end
|
76
|
-
|
77
70
|
def preceded_by_text?
|
78
71
|
prev = previous_sibling
|
79
72
|
while !prev.nil? && prev.blank? do prev = prev.previous_sibling end
|
data/lib/kitchen/version.rb
CHANGED
data/lib/locales/en.yml
CHANGED
@@ -46,3 +46,25 @@ en:
|
|
46
46
|
reference: References
|
47
47
|
index:
|
48
48
|
main: Index
|
49
|
+
annotation_icons:
|
50
|
+
linguistic-icon:
|
51
|
+
title: Language lens icon
|
52
|
+
culture-icon:
|
53
|
+
title: Culture lens icon
|
54
|
+
dreaming-icon:
|
55
|
+
title: Generating and capturing ideas icon
|
56
|
+
visual-icon:
|
57
|
+
title: Visual learning style icon
|
58
|
+
speech-icon:
|
59
|
+
title: Voice to text icon
|
60
|
+
auditory-icon:
|
61
|
+
title: Auditory learning style icon
|
62
|
+
kinesthetic-icon:
|
63
|
+
title: Kinesthetic learning style icon
|
64
|
+
screenreader:
|
65
|
+
end: end
|
66
|
+
underline: underline
|
67
|
+
double-underline: double underline
|
68
|
+
public-domain: public domain text
|
69
|
+
student-sample: student sample text
|
70
|
+
annotation-text: annotated text
|
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: 19.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:
|
11
|
+
date: 2022-01-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|
@@ -265,6 +265,8 @@ files:
|
|
265
265
|
- lib/kitchen/directions/bake_chapter_key_equations.rb
|
266
266
|
- lib/kitchen/directions/bake_chapter_references/main.rb
|
267
267
|
- lib/kitchen/directions/bake_chapter_references/v1.rb
|
268
|
+
- lib/kitchen/directions/bake_chapter_references/v2.rb
|
269
|
+
- lib/kitchen/directions/bake_chapter_references/v3.rb
|
268
270
|
- lib/kitchen/directions/bake_chapter_section_exercises/main.rb
|
269
271
|
- lib/kitchen/directions/bake_chapter_section_exercises/v1.rb
|
270
272
|
- lib/kitchen/directions/bake_chapter_solutions/main.rb
|
@@ -281,6 +283,8 @@ files:
|
|
281
283
|
- lib/kitchen/directions/bake_eoc_section_content/remove_section_title.rb
|
282
284
|
- lib/kitchen/directions/bake_equations.rb
|
283
285
|
- lib/kitchen/directions/bake_example.rb
|
286
|
+
- lib/kitchen/directions/bake_exercise_prefixes/main.rb
|
287
|
+
- lib/kitchen/directions/bake_exercise_prefixes/v1.rb
|
284
288
|
- lib/kitchen/directions/bake_figure.rb
|
285
289
|
- lib/kitchen/directions/bake_first_elements.rb
|
286
290
|
- lib/kitchen/directions/bake_folio.rb
|
@@ -355,6 +359,7 @@ files:
|
|
355
359
|
- lib/kitchen/directions/move_exercises_to_eoc/v1.rb
|
356
360
|
- lib/kitchen/directions/move_exercises_to_eoc/v2.rb
|
357
361
|
- lib/kitchen/directions/move_exercises_to_eoc/v3.rb
|
362
|
+
- lib/kitchen/directions/move_solutions_to_answer_key/answer_key_cleaner.rb
|
358
363
|
- lib/kitchen/directions/move_solutions_to_answer_key/answer_key_inner_container.rb
|
359
364
|
- lib/kitchen/directions/move_solutions_to_answer_key/move_solutions_from_exercise_section.rb
|
360
365
|
- lib/kitchen/directions/move_solutions_to_answer_key/move_solutions_from_numbered_note.rb
|