pocketbook 0.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.
Files changed (41) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +21 -0
  3. data/README.md +308 -0
  4. data/bin/pocketbook +5 -0
  5. data/bin/test-render +49 -0
  6. data/lib/pocketbook/book.rb +28 -0
  7. data/lib/pocketbook/book_renderer/chapter.rb +85 -0
  8. data/lib/pocketbook/book_renderer/front_matter.rb +27 -0
  9. data/lib/pocketbook/book_renderer/metadata.rb +70 -0
  10. data/lib/pocketbook/book_renderer/pdf.rb +42 -0
  11. data/lib/pocketbook/book_renderer/toc.rb +55 -0
  12. data/lib/pocketbook/book_renderer.rb +140 -0
  13. data/lib/pocketbook/book_template.rb +40 -0
  14. data/lib/pocketbook/cli/options_parser.rb +344 -0
  15. data/lib/pocketbook/cli/runner.rb +505 -0
  16. data/lib/pocketbook/cli/watch_command.rb +275 -0
  17. data/lib/pocketbook/cli.rb +12 -0
  18. data/lib/pocketbook/core_stylesheet.rb +20 -0
  19. data/lib/pocketbook/pdf_document.rb +96 -0
  20. data/lib/pocketbook/render_request.rb +67 -0
  21. data/lib/pocketbook/styles/core/01_tokens.css +11 -0
  22. data/lib/pocketbook/styles/core/02_pages.css +72 -0
  23. data/lib/pocketbook/styles/core/03_layout.css +162 -0
  24. data/lib/pocketbook/styles/core/04_toc.css +62 -0
  25. data/lib/pocketbook/styles/core/05_content.css +49 -0
  26. data/lib/pocketbook/styles/core/06_running.css +48 -0
  27. data/lib/pocketbook/styles/core/07_print.css +12 -0
  28. data/lib/pocketbook/theme/manifest.rb +244 -0
  29. data/lib/pocketbook/theme.rb +268 -0
  30. data/lib/pocketbook/version.rb +3 -0
  31. data/lib/pocketbook.rb +29 -0
  32. data/themes/basic/styles/plain.css +63 -0
  33. data/themes/basic/template.html.erb +30 -0
  34. data/themes/basic/theme.yml +8 -0
  35. data/themes/classic/styles/base.css +250 -0
  36. data/themes/classic/styles/dark.css +19 -0
  37. data/themes/classic/styles/light.css +12 -0
  38. data/themes/classic/styles/sepia.css +17 -0
  39. data/themes/classic/template.html.erb +72 -0
  40. data/themes/classic/theme.yml +17 -0
  41. metadata +136 -0
data/lib/pocketbook.rb ADDED
@@ -0,0 +1,29 @@
1
+ require_relative "pocketbook/version"
2
+
3
+ module Pocketbook
4
+ # Installation root resolved from this file location.
5
+ # In a gem install this points to the gem directory (not the current repo/cwd).
6
+ INSTALLATION_ROOT = File.expand_path("..", __dir__)
7
+ THEMES_DIRECTORY = File.join(INSTALLATION_ROOT, "themes")
8
+ USER_DATA_DIRECTORY = File.join(Dir.home, ".pocketbook")
9
+ USER_THEMES_DIRECTORY = File.join(USER_DATA_DIRECTORY, "themes")
10
+
11
+ def self.bundled_theme_path(name)
12
+ File.join(THEMES_DIRECTORY, name)
13
+ end
14
+
15
+ def self.user_themes_path(name = nil)
16
+ return USER_THEMES_DIRECTORY if name.nil?
17
+
18
+ File.join(USER_THEMES_DIRECTORY, name)
19
+ end
20
+ end
21
+
22
+ require_relative "pocketbook/core_stylesheet"
23
+ require_relative "pocketbook/theme"
24
+ require_relative "pocketbook/book_template"
25
+ require_relative "pocketbook/pdf_document"
26
+ require_relative "pocketbook/book_renderer"
27
+ require_relative "pocketbook/book"
28
+ require_relative "pocketbook/render_request"
29
+ require_relative "pocketbook/cli"
@@ -0,0 +1,63 @@
1
+ .content-only {
2
+ padding: 0;
3
+ }
4
+
5
+ .content-only .chapter + .chapter {
6
+ break-before: page;
7
+ }
8
+
9
+ .content-only .chapter h1 {
10
+ margin-top: 0;
11
+ margin-bottom: 0.8rem;
12
+ letter-spacing: 0.01em;
13
+ }
14
+
15
+ .content-only .chapter h2,
16
+ .content-only .chapter h3 {
17
+ text-wrap: balance;
18
+ }
19
+
20
+ .content-only .chapter p {
21
+ text-wrap: pretty;
22
+ hyphens: auto;
23
+ }
24
+
25
+ .content-only .chapter blockquote {
26
+ margin-left: 0;
27
+ margin-right: 0;
28
+ padding: 0.65rem 0.9rem;
29
+ border-left: 2px solid #8f8f8f;
30
+ background: #f4f4f4;
31
+ }
32
+
33
+ .content-only .chapter pre {
34
+ border: 1px solid #d6d6d6;
35
+ border-radius: 0.2rem;
36
+ padding: 0.65rem 0.85rem;
37
+ background: #fafafa;
38
+ }
39
+
40
+ .content-only .chapter table {
41
+ width: 100%;
42
+ border-collapse: collapse;
43
+ margin: 0.6rem 0 1rem;
44
+ }
45
+
46
+ .content-only .chapter th,
47
+ .content-only .chapter td {
48
+ border: 1px solid #d2d2d2;
49
+ padding: 0.3rem 0.4rem;
50
+ }
51
+
52
+ .content-only .chapter th {
53
+ text-align: left;
54
+ background: #f0f0f0;
55
+ }
56
+
57
+ .content-only .chapter tbody tr:nth-child(even) td {
58
+ background: #fafafa;
59
+ }
60
+
61
+ body {
62
+ color: #151515;
63
+ }
@@ -0,0 +1,30 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title><%= h(metadata[:title]) %></title>
7
+ <style>
8
+ @layer pocketbook-core, pocketbook-theme;
9
+
10
+ @layer pocketbook-core {
11
+ <%= core_css %>
12
+ }
13
+
14
+ @layer pocketbook-theme {
15
+ <%= styles_css %>
16
+ }
17
+
18
+ @layer pocketbook-theme {
19
+ :root {
20
+ --book-size: <%= h(metadata[:size]) %>;
21
+ }
22
+ }
23
+ </style>
24
+ </head>
25
+ <body>
26
+ <main class="content-only" role="document">
27
+ <%= body_html %>
28
+ </main>
29
+ </body>
30
+ </html>
@@ -0,0 +1,8 @@
1
+ name: basic
2
+ version: 0.1.0
3
+ template: template.html.erb
4
+ styles:
5
+ plain:
6
+ - styles/plain.css
7
+ defaults:
8
+ style: plain
@@ -0,0 +1,250 @@
1
+ :root {
2
+ --space-1: 0.28rem;
3
+ --space-2: 0.5rem;
4
+ --space-3: 0.85rem;
5
+ --space-4: 1.25rem;
6
+ --space-5: 1.9rem;
7
+ --space-6: 2.8rem;
8
+ --rule-color: color-mix(in srgb, var(--text-color) 25%, transparent);
9
+ --toc-rule-color: color-mix(in srgb, var(--text-color) 30%, transparent);
10
+ --code-bg: color-mix(in srgb, var(--paper) 86%, var(--accent) 14%);
11
+ --panel-border: color-mix(in srgb, var(--accent) 25%, transparent);
12
+ --table-header-bg: color-mix(in srgb, var(--paper) 78%, var(--accent) 22%);
13
+ --table-row-bg: color-mix(in srgb, var(--paper) 94%, var(--accent) 6%);
14
+ }
15
+
16
+ body {
17
+ hanging-punctuation: first last;
18
+ text-rendering: optimizeLegibility;
19
+ }
20
+
21
+ .cover {
22
+ overflow: hidden;
23
+ }
24
+
25
+ .cover::before {
26
+ content: "";
27
+ position: absolute;
28
+ inset: 0;
29
+ background:
30
+ radial-gradient(circle at 15% 18%, color-mix(in srgb, var(--accent) 18%, transparent), transparent 42%),
31
+ radial-gradient(circle at 86% 82%, color-mix(in srgb, var(--accent) 12%, transparent), transparent 46%),
32
+ repeating-linear-gradient(
33
+ -45deg,
34
+ transparent 0,
35
+ transparent 7px,
36
+ color-mix(in srgb, var(--cover-fg) 7%, transparent) 7px,
37
+ color-mix(in srgb, var(--cover-fg) 7%, transparent) 8px
38
+ );
39
+ opacity: 0.45;
40
+ pointer-events: none;
41
+ }
42
+
43
+ .cover::after {
44
+ content: "";
45
+ position: absolute;
46
+ inset: 10% auto 10% 6mm;
47
+ width: 1.2mm;
48
+ background: color-mix(in srgb, var(--accent) 86%, white 14%);
49
+ border-radius: 999px;
50
+ box-shadow: 0 0 0 0.6mm color-mix(in srgb, var(--cover-fg) 10%, transparent);
51
+ opacity: 0.9;
52
+ }
53
+
54
+ .cover-inner {
55
+ position: relative;
56
+ z-index: 1;
57
+ background: transparent;
58
+ padding-left: 24mm;
59
+ padding-right: 18mm;
60
+ gap: var(--space-4);
61
+ }
62
+
63
+ .cover-title {
64
+ font-size: clamp(2.7rem, 4vw, 3.4rem);
65
+ letter-spacing: 0.015em;
66
+ line-height: 1.04;
67
+ max-width: 88%;
68
+ text-wrap: balance;
69
+ }
70
+
71
+ .cover-subtitle {
72
+ margin-top: var(--space-2);
73
+ font-style: italic;
74
+ font-size: 1.12rem;
75
+ line-height: 1.5;
76
+ max-width: 78%;
77
+ opacity: 0.94;
78
+ text-wrap: pretty;
79
+ }
80
+
81
+ .cover-author {
82
+ margin-top: var(--space-5);
83
+ letter-spacing: 0.08em;
84
+ }
85
+
86
+ .toc-heading {
87
+ letter-spacing: 0.03em;
88
+ }
89
+
90
+ .toc-title {
91
+ letter-spacing: 0.02em;
92
+ }
93
+
94
+ .toc-item + .toc-item {
95
+ margin-top: 0.5rem;
96
+ }
97
+
98
+ .toc-item-level-2 .toc-link {
99
+ opacity: 0.94;
100
+ }
101
+
102
+ .toc-item-level-3 .toc-link {
103
+ opacity: 0.85;
104
+ }
105
+
106
+ .toc-fill {
107
+ border-bottom-color: var(--toc-rule-color);
108
+ }
109
+
110
+ .toc-page {
111
+ min-width: 2.5ch;
112
+ font-size: 0.96em;
113
+ }
114
+
115
+ .chapter {
116
+ text-align: justify;
117
+ text-wrap: pretty;
118
+ }
119
+
120
+ .chapter h1 {
121
+ border-bottom: 1px solid color-mix(in srgb, var(--accent) 58%, var(--text-color) 42%);
122
+ padding-bottom: var(--space-2);
123
+ margin-bottom: var(--space-4);
124
+ letter-spacing: 0.01em;
125
+ }
126
+
127
+ .chapter h2,
128
+ .chapter h3 {
129
+ text-wrap: balance;
130
+ }
131
+
132
+ .chapter h2 {
133
+ margin-top: var(--space-5);
134
+ }
135
+
136
+ .chapter h3 {
137
+ margin-top: var(--space-4);
138
+ }
139
+
140
+ .chapter p {
141
+ hyphens: auto;
142
+ }
143
+
144
+ .chapter h1 + p::first-letter {
145
+ float: left;
146
+ font-family: var(--font-display);
147
+ font-size: 3.2em;
148
+ line-height: 0.85;
149
+ margin-right: 0.08em;
150
+ margin-top: 0.08em;
151
+ color: color-mix(in srgb, var(--accent) 82%, var(--text-color) 18%);
152
+ }
153
+
154
+ .chapter a {
155
+ color: color-mix(in srgb, var(--accent) 78%, var(--text-color) 22%);
156
+ text-decoration-color: color-mix(in srgb, var(--accent) 55%, transparent);
157
+ text-underline-offset: 0.12em;
158
+ text-decoration-thickness: 0.06em;
159
+ }
160
+
161
+ .chapter blockquote {
162
+ margin-left: 0;
163
+ margin-right: 0;
164
+ padding: var(--space-3) var(--space-4);
165
+ background: var(--blockquote-bg, rgba(0, 0, 0, 0.04));
166
+ border-left: 3px solid var(--accent);
167
+ border-radius: 0.24rem;
168
+ }
169
+
170
+ .chapter code {
171
+ font-size: 0.9em;
172
+ padding: 0.08em 0.26em;
173
+ border-radius: 0.2rem;
174
+ background: var(--code-bg);
175
+ }
176
+
177
+ .chapter pre {
178
+ padding: var(--space-3) var(--space-4);
179
+ border-radius: 0.3rem;
180
+ border: 1px solid var(--panel-border);
181
+ background: color-mix(in srgb, var(--paper) 96%, var(--text-color) 4%);
182
+ }
183
+
184
+ .chapter pre code {
185
+ background: transparent;
186
+ padding: 0;
187
+ }
188
+
189
+ .chapter table {
190
+ width: 100%;
191
+ border-collapse: collapse;
192
+ margin: var(--space-3) 0 var(--space-4);
193
+ font-size: 0.95em;
194
+ }
195
+
196
+ .chapter th,
197
+ .chapter td {
198
+ padding: 0.35rem 0.45rem;
199
+ border: 1px solid var(--panel-border);
200
+ }
201
+
202
+ .chapter th {
203
+ background: var(--table-header-bg);
204
+ text-align: left;
205
+ }
206
+
207
+ .chapter tbody tr:nth-child(even) td {
208
+ background: var(--table-row-bg);
209
+ }
210
+
211
+ .chapter img {
212
+ border-radius: 0.2rem;
213
+ border: 1px solid var(--panel-border);
214
+ box-shadow: 0 0.8mm 2mm color-mix(in srgb, black 10%, transparent);
215
+ }
216
+
217
+ .running-header,
218
+ .running-footer {
219
+ letter-spacing: 0.06em;
220
+ font-size: 8.2pt;
221
+ }
222
+
223
+ .running-header-book,
224
+ .running-header-chapter {
225
+ text-transform: uppercase;
226
+ font-size: 0.9em;
227
+ }
228
+
229
+ .running-divider {
230
+ width: 20px;
231
+ opacity: 0.85;
232
+ }
233
+
234
+ .backcover {
235
+ background: var(--backcover-bg, #222222);
236
+ }
237
+
238
+ .backcover-inner {
239
+ position: relative;
240
+ }
241
+
242
+ .backcover-inner::before {
243
+ content: "";
244
+ position: absolute;
245
+ top: -6mm;
246
+ left: 0;
247
+ width: 16mm;
248
+ height: 1.4px;
249
+ background: color-mix(in srgb, var(--accent) 84%, white 16%);
250
+ }
@@ -0,0 +1,19 @@
1
+ :root {
2
+ --paper: #111315;
3
+ --text-color: #ece8df;
4
+ --folio-color: #c7c5c2;
5
+ --cover-bg: linear-gradient(165deg, #1f2933 0%, #0a0d12 72%);
6
+ --cover-fg: #f5f1e8;
7
+ --accent: #d0aa72;
8
+ --font-body: "Charter", "Book Antiqua", serif;
9
+ --font-display: "Gill Sans", "Trebuchet MS", sans-serif;
10
+ --backcover-bg: linear-gradient(200deg, #090b0d 0%, #1d252d 100%);
11
+ --blockquote-bg: rgba(255, 255, 255, 0.08);
12
+ --rule-color: rgba(255, 255, 255, 0.25);
13
+ --toc-rule-color: rgba(255, 255, 255, 0.32);
14
+ --code-bg: color-mix(in srgb, #0b0d10 82%, var(--accent) 18%);
15
+ --panel-border: rgba(255, 255, 255, 0.2);
16
+ --table-header-bg: rgba(255, 255, 255, 0.08);
17
+ --table-row-bg: rgba(255, 255, 255, 0.04);
18
+ }
19
+
@@ -0,0 +1,12 @@
1
+ :root {
2
+ --paper: #fcfbf7;
3
+ --text-color: #1c1c1c;
4
+ --folio-color: #5f5951;
5
+ --cover-bg: linear-gradient(160deg, #2f1e0e 0%, #0f0f0f 65%);
6
+ --cover-fg: #f6f1e9;
7
+ --accent: #d7a45a;
8
+ --font-body: "Charter", "Book Antiqua", serif;
9
+ --font-display: "Gill Sans", "Trebuchet MS", sans-serif;
10
+ --backcover-bg: linear-gradient(195deg, #121212 0%, #232323 100%);
11
+ --blockquote-bg: rgba(0, 0, 0, 0.04);
12
+ }
@@ -0,0 +1,17 @@
1
+ :root {
2
+ --paper: #f3e9d2;
3
+ --text-color: #3f2f1d;
4
+ --folio-color: #6a5440;
5
+ --cover-bg: linear-gradient(160deg, #6a4628 0%, #2f2116 70%);
6
+ --cover-fg: #f6efe2;
7
+ --accent: #8d5422;
8
+ --font-body: "Palatino Linotype", "Book Antiqua", serif;
9
+ --font-display: "Gill Sans", "Trebuchet MS", sans-serif;
10
+ --backcover-bg: linear-gradient(200deg, #2f2217 0%, #5b3f28 100%);
11
+ --blockquote-bg: rgba(86, 55, 25, 0.08);
12
+ --rule-color: rgba(63, 47, 29, 0.3);
13
+ --toc-rule-color: rgba(63, 47, 29, 0.35);
14
+ --panel-border: rgba(63, 47, 29, 0.24);
15
+ --table-header-bg: rgba(141, 84, 34, 0.12);
16
+ --table-row-bg: rgba(141, 84, 34, 0.06);
17
+ }
@@ -0,0 +1,72 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1">
6
+ <title><%= h(metadata[:title]) %></title>
7
+ <style>
8
+ @layer pocketbook-core, pocketbook-theme;
9
+
10
+ @layer pocketbook-core {
11
+ <%= core_css %>
12
+ }
13
+
14
+ @layer pocketbook-theme {
15
+ <%= styles_css %>
16
+ }
17
+
18
+ /* Runtime metadata values should always win over theme defaults. */
19
+ @layer pocketbook-theme {
20
+ :root {
21
+ --book-size: <%= h(metadata[:size]) %>;
22
+ --book-title-label: <%= metadata[:title].to_s.inspect %>;
23
+ --publisher-label: <%= metadata[:publisher].to_s.inspect %>;
24
+ }
25
+ }
26
+ </style>
27
+ </head>
28
+ <body>
29
+ <section class="cover">
30
+ <div class="cover-inner">
31
+ <h1 class="cover-title"><%= h(metadata[:title]) %></h1>
32
+ <% unless metadata[:subtitle].to_s.strip.empty? %>
33
+ <p class="cover-subtitle"><%= h(metadata[:subtitle]) %></p>
34
+ <% end %>
35
+ <p class="cover-author"><%= h(metadata[:author]) %></p>
36
+ </div>
37
+ </section>
38
+
39
+ <nav class="toc" aria-label="Table of contents">
40
+ <section class="toc-inner">
41
+ <h2 class="toc-heading">Contents</h2>
42
+ <ol class="toc-list">
43
+ <%= toc_html %>
44
+ </ol>
45
+ </section>
46
+ </nav>
47
+
48
+ <div class="running-header" aria-hidden="true">
49
+ <span class="running-header-book"><%= h(metadata[:title]) %></span>
50
+ <span class="running-header-chapter" data-fallback="<%= h(metadata[:title]) %>"></span>
51
+ </div>
52
+
53
+ <div class="running-footer" aria-hidden="true">
54
+ <span><%= h(metadata[:publisher]) %></span>
55
+ <span>
56
+ <span class="running-divider"></span>
57
+ <span class="page-number"></span>
58
+ </span>
59
+ </div>
60
+
61
+ <main class="book-content" role="document">
62
+ <%= body_html %>
63
+ </main>
64
+
65
+ <section class="backcover">
66
+ <div class="backcover-inner">
67
+ <p class="backcover-title">Back Cover</p>
68
+ <p class="backcover-copy"><%= h(metadata[:backcover_text]) %></p>
69
+ </div>
70
+ </section>
71
+ </body>
72
+ </html>
@@ -0,0 +1,17 @@
1
+ name: classic
2
+ version: 0.2.0
3
+ template: template.html.erb
4
+ styles:
5
+ light:
6
+ - styles/base.css
7
+ - styles/light.css
8
+ dark:
9
+ - styles/base.css
10
+ - styles/dark.css
11
+ sepia:
12
+ - styles/base.css
13
+ - styles/sepia.css
14
+ defaults:
15
+ style: light
16
+ publisher: Pocketbook Labs
17
+ size: 6in 9in
metadata ADDED
@@ -0,0 +1,136 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: pocketbook
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Pocketbook contributors
8
+ bindir: bin
9
+ cert_chain: []
10
+ date: 1980-01-02 00:00:00.000000000 Z
11
+ dependencies:
12
+ - !ruby/object:Gem::Dependency
13
+ name: ferrum
14
+ requirement: !ruby/object:Gem::Requirement
15
+ requirements:
16
+ - - "~>"
17
+ - !ruby/object:Gem::Version
18
+ version: '0.15'
19
+ type: :runtime
20
+ prerelease: false
21
+ version_requirements: !ruby/object:Gem::Requirement
22
+ requirements:
23
+ - - "~>"
24
+ - !ruby/object:Gem::Version
25
+ version: '0.15'
26
+ - !ruby/object:Gem::Dependency
27
+ name: kramdown
28
+ requirement: !ruby/object:Gem::Requirement
29
+ requirements:
30
+ - - "~>"
31
+ - !ruby/object:Gem::Version
32
+ version: '2.5'
33
+ type: :runtime
34
+ prerelease: false
35
+ version_requirements: !ruby/object:Gem::Requirement
36
+ requirements:
37
+ - - "~>"
38
+ - !ruby/object:Gem::Version
39
+ version: '2.5'
40
+ - !ruby/object:Gem::Dependency
41
+ name: kramdown-parser-gfm
42
+ requirement: !ruby/object:Gem::Requirement
43
+ requirements:
44
+ - - "~>"
45
+ - !ruby/object:Gem::Version
46
+ version: '1.1'
47
+ type: :runtime
48
+ prerelease: false
49
+ version_requirements: !ruby/object:Gem::Requirement
50
+ requirements:
51
+ - - "~>"
52
+ - !ruby/object:Gem::Version
53
+ version: '1.1'
54
+ - !ruby/object:Gem::Dependency
55
+ name: listen
56
+ requirement: !ruby/object:Gem::Requirement
57
+ requirements:
58
+ - - "~>"
59
+ - !ruby/object:Gem::Version
60
+ version: '3.9'
61
+ type: :runtime
62
+ prerelease: false
63
+ version_requirements: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '3.9'
68
+ description: Pocketbook turns markdown into themed, print-oriented PDFs with reusable
69
+ templates and CSS.
70
+ executables:
71
+ - pocketbook
72
+ extensions: []
73
+ extra_rdoc_files: []
74
+ files:
75
+ - LICENSE
76
+ - README.md
77
+ - bin/pocketbook
78
+ - bin/test-render
79
+ - lib/pocketbook.rb
80
+ - lib/pocketbook/book.rb
81
+ - lib/pocketbook/book_renderer.rb
82
+ - lib/pocketbook/book_renderer/chapter.rb
83
+ - lib/pocketbook/book_renderer/front_matter.rb
84
+ - lib/pocketbook/book_renderer/metadata.rb
85
+ - lib/pocketbook/book_renderer/pdf.rb
86
+ - lib/pocketbook/book_renderer/toc.rb
87
+ - lib/pocketbook/book_template.rb
88
+ - lib/pocketbook/cli.rb
89
+ - lib/pocketbook/cli/options_parser.rb
90
+ - lib/pocketbook/cli/runner.rb
91
+ - lib/pocketbook/cli/watch_command.rb
92
+ - lib/pocketbook/core_stylesheet.rb
93
+ - lib/pocketbook/pdf_document.rb
94
+ - lib/pocketbook/render_request.rb
95
+ - lib/pocketbook/styles/core/01_tokens.css
96
+ - lib/pocketbook/styles/core/02_pages.css
97
+ - lib/pocketbook/styles/core/03_layout.css
98
+ - lib/pocketbook/styles/core/04_toc.css
99
+ - lib/pocketbook/styles/core/05_content.css
100
+ - lib/pocketbook/styles/core/06_running.css
101
+ - lib/pocketbook/styles/core/07_print.css
102
+ - lib/pocketbook/theme.rb
103
+ - lib/pocketbook/theme/manifest.rb
104
+ - lib/pocketbook/version.rb
105
+ - themes/basic/styles/plain.css
106
+ - themes/basic/template.html.erb
107
+ - themes/basic/theme.yml
108
+ - themes/classic/styles/base.css
109
+ - themes/classic/styles/dark.css
110
+ - themes/classic/styles/light.css
111
+ - themes/classic/styles/sepia.css
112
+ - themes/classic/template.html.erb
113
+ - themes/classic/theme.yml
114
+ homepage: https://example.com/pocketbook
115
+ licenses:
116
+ - MIT
117
+ metadata:
118
+ rubygems_mfa_required: 'true'
119
+ rdoc_options: []
120
+ require_paths:
121
+ - lib
122
+ required_ruby_version: !ruby/object:Gem::Requirement
123
+ requirements:
124
+ - - ">="
125
+ - !ruby/object:Gem::Version
126
+ version: '3.0'
127
+ required_rubygems_version: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ requirements: []
133
+ rubygems_version: 3.6.9
134
+ specification_version: 4
135
+ summary: Generate print-ready PDFs from Markdown
136
+ test_files: []