openstax_kitchen 1.0.0 → 2.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 +6 -2
- data/Gemfile.lock +2 -2
- data/README.md +4 -4
- data/bin/console +1 -1
- data/lib/kitchen/version.rb +1 -1
- data/lib/{kitchen.rb → openstax_kitchen.rb} +0 -0
- data/tutorials/check_it +1 -1
- metadata +3 -5
- data/bin/normalize +0 -79
- data/books/chemistry2e/bake.rb +0 -133
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 47c8699f2836cea06df2e5a97aa79c350662e8193c9c1abfafd50740de61cbf6
|
4
|
+
data.tar.gz: 2384b847a91f55624ca266274fb273f98cfcaeb81962c988b04efcb0d619f2a1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6a617ef7617b5ebb0ae959615125a82945f965fcb7cbc080eff8da974fb843bd81fc72226fc62d9439f9012d95af21c80e6d85d81a1a0594c7b7546d8fd6e6f8
|
7
|
+
data.tar.gz: cad462c3c8809912d290148a5c5f64fd8518bd8043ba66d315babeed504dc083761014abd038a9fea8eb88caaa9dcc930be4f9c0b4f048e3590a0645b8bf0da9
|
data/CHANGELOG.md
CHANGED
@@ -6,6 +6,10 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|
6
6
|
|
7
7
|
## [Unreleased]
|
8
8
|
|
9
|
-
## [
|
9
|
+
## [2.0.0] - 2020-12-18
|
10
10
|
|
11
|
-
|
11
|
+
* Changed the main gem source file to have the same name as the gem (`openstax_kitchen`) so that you don't have to `require` a different name than you use in your `gem` call.
|
12
|
+
|
13
|
+
## [1.0.0] - 2020-12-15
|
14
|
+
|
15
|
+
* First official version.
|
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
openstax_kitchen (
|
4
|
+
openstax_kitchen (2.0.0)
|
5
5
|
activesupport
|
6
6
|
i18n
|
7
7
|
nokogiri
|
@@ -21,7 +21,7 @@ GEM
|
|
21
21
|
simplecov (~> 0.18.0)
|
22
22
|
concurrent-ruby (1.1.7)
|
23
23
|
diff-lcs (1.3)
|
24
|
-
docile (1.3.
|
24
|
+
docile (1.3.3)
|
25
25
|
i18n (1.8.5)
|
26
26
|
concurrent-ruby (~> 1.0)
|
27
27
|
mini_portile2 (2.4.0)
|
data/README.md
CHANGED
@@ -10,7 +10,7 @@ Kitchen lets you modify the structure and content of XML files. You create a `R
|
|
10
10
|
Add this line to your application's Gemfile:
|
11
11
|
|
12
12
|
```ruby
|
13
|
-
gem '
|
13
|
+
gem 'openstax_kitchen'
|
14
14
|
```
|
15
15
|
|
16
16
|
And then execute:
|
@@ -32,7 +32,7 @@ We'll first talk about the generic way since those tools are also available in t
|
|
32
32
|
Kitchen lets you modify the structure and content of XML files. You create a `Recipe` and `bake` it in the `Oven`:
|
33
33
|
|
34
34
|
```ruby
|
35
|
-
require "
|
35
|
+
require "openstax_kitchen"
|
36
36
|
|
37
37
|
recipe = Kitchen::Recipe.new do |document|
|
38
38
|
document.search("div.section").each do |element|
|
@@ -430,10 +430,10 @@ Want to make a one-file script to do some baking? Use the "inline" form of bund
|
|
430
430
|
require "bundler/inline"
|
431
431
|
|
432
432
|
gemfile do
|
433
|
-
gem '
|
433
|
+
gem 'openstax_kitchen', '2.0.0'
|
434
434
|
end
|
435
435
|
|
436
|
-
require "
|
436
|
+
require "openstax_kitchen"
|
437
437
|
|
438
438
|
recipe = Kitchen::Recipe.new do |doc|
|
439
439
|
# ... recipe steps here
|
data/bin/console
CHANGED
data/lib/kitchen/version.rb
CHANGED
File without changes
|
data/tutorials/check_it
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: 2.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: 2020-12-
|
11
|
+
date: 2020-12-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: nokogiri
|
@@ -143,14 +143,11 @@ files:
|
|
143
143
|
- README.md
|
144
144
|
- Rakefile
|
145
145
|
- bin/console
|
146
|
-
- bin/normalize
|
147
146
|
- bin/setup
|
148
|
-
- books/chemistry2e/bake.rb
|
149
147
|
- codecov.yaml
|
150
148
|
- docker-compose.yml
|
151
149
|
- docker/bash
|
152
150
|
- docker/entrypoint
|
153
|
-
- lib/kitchen.rb
|
154
151
|
- lib/kitchen/ancestor.rb
|
155
152
|
- lib/kitchen/book_document.rb
|
156
153
|
- lib/kitchen/book_element.rb
|
@@ -223,6 +220,7 @@ files:
|
|
223
220
|
- lib/kitchen/version.rb
|
224
221
|
- lib/locales/en.yml
|
225
222
|
- lib/notes.md
|
223
|
+
- lib/openstax_kitchen.rb
|
226
224
|
- openstax_kitchen.gemspec
|
227
225
|
- tutorials/00/expected_baked.html
|
228
226
|
- tutorials/00/raw.html
|
data/bin/normalize
DELETED
@@ -1,79 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require "bundler/inline"
|
4
|
-
|
5
|
-
gemfile do
|
6
|
-
gem 'nokogiri'
|
7
|
-
gem 'byebug'
|
8
|
-
end
|
9
|
-
|
10
|
-
require 'nokogiri'
|
11
|
-
require 'byebug'
|
12
|
-
|
13
|
-
# In HTML attribute order doesn't matter, but to make sure our diffs are useful resort all
|
14
|
-
# attributes.
|
15
|
-
def sort_attributes(document)
|
16
|
-
document.traverse do |child|
|
17
|
-
next if child.text? || child.document?
|
18
|
-
attributes = child.attributes
|
19
|
-
attributes.each do |key, value|
|
20
|
-
child.remove_attribute(key)
|
21
|
-
end
|
22
|
-
sorted_keys = attributes.keys.sort
|
23
|
-
sorted_keys.each do |key|
|
24
|
-
value = attributes[key].to_s
|
25
|
-
child[key] = value
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
|
30
|
-
# Legacy baked docs have a few issues that I think are unintentional; clean those
|
31
|
-
def clean_legacy_baked(document)
|
32
|
-
document.traverse do |child|
|
33
|
-
next if child.text? || child.document?
|
34
|
-
|
35
|
-
# Legacy bakings of unnumbered tables include a bogus number, delete it
|
36
|
-
if child.name == "table" && (child[:class] || "").include?("unnumbered")
|
37
|
-
child.remove_attribute("summary")
|
38
|
-
end
|
39
|
-
|
40
|
-
# Sometimes there is `class=' '`, get rid of these
|
41
|
-
child.attributes.each do |key, value|
|
42
|
-
child.remove_attribute(key) if key == "class" && value.to_s.strip == ""
|
43
|
-
end
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def mask_copied_id_numbers(document)
|
48
|
-
document.traverse do |child|
|
49
|
-
if child[:id]
|
50
|
-
child[:id] = child[:id].gsub(/_copy_(\d+)$/,"_copy_XXX")
|
51
|
-
end
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def process(input_file:, output_file:)
|
56
|
-
read_and_write(input_file: input_file, output_file: output_file) do |doc|
|
57
|
-
clean_legacy_baked(doc)
|
58
|
-
sort_attributes(doc)
|
59
|
-
mask_copied_id_numbers(doc)
|
60
|
-
end
|
61
|
-
end
|
62
|
-
|
63
|
-
def read_and_write(input_file:, output_file:)
|
64
|
-
doc = Nokogiri::XML(File.open(input_file)){|config| config.noblanks}
|
65
|
-
|
66
|
-
yield(doc) if block_given?
|
67
|
-
|
68
|
-
File.open(output_file, "w") do |f|
|
69
|
-
f.write doc.to_xhtml(indent:2)
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
ARGV.each do |input_file|
|
74
|
-
output_file = input_file.gsub(/(\.\w+)\z/,'.normalized\1')
|
75
|
-
|
76
|
-
process(input_file: input_file, output_file: output_file)
|
77
|
-
|
78
|
-
puts "Normalized '#{input_file}' to '#{output_file}'"
|
79
|
-
end
|
data/books/chemistry2e/bake.rb
DELETED
@@ -1,133 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require "bundler/inline"
|
4
|
-
|
5
|
-
gemfile do
|
6
|
-
gem 'kitchen', path: '/Users/jps/dev/openstax/kitchen'
|
7
|
-
gem 'byebug'
|
8
|
-
end
|
9
|
-
|
10
|
-
require "kitchen"
|
11
|
-
require 'byebug'
|
12
|
-
|
13
|
-
include Kitchen::Directions
|
14
|
-
|
15
|
-
recipe = Kitchen::BookRecipe.new(book_short_name: :chemistry) do |doc|
|
16
|
-
book = doc.book
|
17
|
-
|
18
|
-
# Some stuff just goes away
|
19
|
-
book.search("cnx-pi").trash
|
20
|
-
|
21
|
-
# Update the preface title
|
22
|
-
book.pages("$.preface").search("div[data-type='document-title']").each do |title| # TODO add title method
|
23
|
-
title.replace_children(with:
|
24
|
-
<<~HTML
|
25
|
-
<span data-type="" itemprop="" class="os-text">#{title.text}</span>
|
26
|
-
HTML
|
27
|
-
)
|
28
|
-
title.name = "h1"
|
29
|
-
end
|
30
|
-
|
31
|
-
book.chapters.each do |chapter|
|
32
|
-
BakeChapterGlossary.v1(chapter: chapter, metadata_source: book.metadata)
|
33
|
-
BakeChapterKeyEquations.v1(chapter: chapter, metadata_source: book.metadata)
|
34
|
-
BakeChapterSummary.v1(chapter: chapter, metadata_source: book.metadata)
|
35
|
-
end
|
36
|
-
|
37
|
-
BakeExercises.v1(book: book)
|
38
|
-
BakeChapterIntroductions.v1(book: book)
|
39
|
-
|
40
|
-
book.chapters.each do |chapter|
|
41
|
-
# Fix up chapter titles - TODO put this in BakeChapter
|
42
|
-
heading = chapter.at("h1[2]")
|
43
|
-
heading[:id] = "chapTitle#{chapter.count_in(:book)}"
|
44
|
-
heading.replace_children(with:
|
45
|
-
<<~HTML
|
46
|
-
<span class="os-part-text">Chapter </span>
|
47
|
-
<span class="os-number">#{chapter.count_in(:book)}</span>
|
48
|
-
<span class="os-divider"> </span>
|
49
|
-
<span data-type="" itemprop="" class="os-text">#{heading.text}</span>
|
50
|
-
HTML
|
51
|
-
)
|
52
|
-
|
53
|
-
chapter.tables("$:not(.unnumbered)").each do |table|
|
54
|
-
BakeNumberedTable.v1(table: table, number: "#{chapter.count_in(:book)}.#{table.count_in(:chapter)}")
|
55
|
-
end
|
56
|
-
|
57
|
-
chapter.examples.each do |example|
|
58
|
-
BakeExample.v1(example: example,
|
59
|
-
number: "#{chapter.count_in(:book)}.#{example.count_in(:chapter)}",
|
60
|
-
title_tag: "h3")
|
61
|
-
end
|
62
|
-
|
63
|
-
chapter.pages("$:not(.introduction)").each do |page|
|
64
|
-
page.search("div[data-type='description']").each(&:trash)
|
65
|
-
page.add_class("chapter-content-module")
|
66
|
-
|
67
|
-
title = page.search("div[data-type='document-title']").first
|
68
|
-
title.name = "h2"
|
69
|
-
title.replace_children(with:
|
70
|
-
<<~HTML
|
71
|
-
<span class="os-number">#{chapter.count_in(:book)}.#{page.count_in(:chapter)}</span>
|
72
|
-
<span class="os-divider"> </span>
|
73
|
-
<span data-type="" itemprop="" class="os-text">#{title.text}</span>
|
74
|
-
HTML
|
75
|
-
)
|
76
|
-
end
|
77
|
-
|
78
|
-
chapter.figures.each do |figure|
|
79
|
-
BakeFigure.v1(figure: figure, number: "#{chapter.count_in(:book)}.#{figure.count_in(:chapter)}")
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
book.pages("$.appendix").each do |page|
|
84
|
-
appendix_letter = [*('A'..'Z')][page.count_in(:book)-1]
|
85
|
-
|
86
|
-
page.figures.each do |figure|
|
87
|
-
BakeFigure.v1(figure: figure, number: "#{appendix_letter}#{figure.count_in(:page)}")
|
88
|
-
end
|
89
|
-
|
90
|
-
page.tables("$:not(.unnumbered)").each do |table|
|
91
|
-
BakeNumberedTable.v1(table: table, number: "#{appendix_letter}#{table.count_in(:page)}")
|
92
|
-
end
|
93
|
-
|
94
|
-
page.examples.each do |example|
|
95
|
-
BakeExample.v1(example: example,
|
96
|
-
number: "#{appendix_letter}#{example.count_in(:page)}",
|
97
|
-
title_tag: "div")
|
98
|
-
end
|
99
|
-
|
100
|
-
BakeAppendix.v1(page: page, number: appendix_letter)
|
101
|
-
end
|
102
|
-
|
103
|
-
BakeNotes.v1(book: book)
|
104
|
-
BakeStepwise.v1(book: book)
|
105
|
-
BakeUnnumberedTables.v1(book: book)
|
106
|
-
BakeMathInParagraph.v1(book: book)
|
107
|
-
BakeIndex.v1(book: book)
|
108
|
-
BakeCompositePages.v1(book: book)
|
109
|
-
BakeFootnotes.v1(book: book)
|
110
|
-
|
111
|
-
BakeToc.v1(book: book)
|
112
|
-
|
113
|
-
# competing docs from elements - BakeLinkPlaceholders
|
114
|
-
book.search("a").each do |anchor|
|
115
|
-
next unless anchor.text == "[link]"
|
116
|
-
id = anchor[:href][1..-1]
|
117
|
-
replacement = doc.pantry(name: :link_text).get(id)
|
118
|
-
if replacement.present?
|
119
|
-
anchor.replace_children(with: replacement)
|
120
|
-
else
|
121
|
-
# TODO log a warning!
|
122
|
-
puts "warning! could not find a replacement for '[link]' on an element with ID '#{id}'"
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
end
|
127
|
-
|
128
|
-
puts Kitchen::Oven.bake(
|
129
|
-
# input_file: "collection.assembled.xhtml",
|
130
|
-
input_file: "entire.collection.assembled.xhtml",
|
131
|
-
recipes: recipe,
|
132
|
-
output_file: "collection.kitchen.xhtml"
|
133
|
-
)
|