sakusei 0.2.2 → 0.3.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/lib/sakusei/heading_wrapper.rb +51 -3
- data/lib/sakusei/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: ab634a886e4a04c4a309f672ff57317e54eab5d44e8fcac304a42c9463c5bb15
|
|
4
|
+
data.tar.gz: 4c2e2a610935627d01c80dd0f0b7ad48f6a840dddf2b433a122f4655f3a27826
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: caf4eb2b35c3de565416c7001f5c5fb4e79837f3ddc5cb5817154b2ea4eb6e6125ad818b71520337b6381b90b9d0fd2ecbae392fe8b1d7645e41038df9d457fe
|
|
7
|
+
data.tar.gz: 579ad95d4b5a86a3095f7c6138a57bc577863cfecef7244520404bfddcd84281b9d405fbbc37053dcaf7dea6b7f8d3b81461325e186b7ba806fe547b684f96ff
|
|
@@ -10,15 +10,65 @@ module Sakusei
|
|
|
10
10
|
# Raw HTML in the markdown (html: true) passes through md-to-pdf untouched.
|
|
11
11
|
class HeadingWrapper
|
|
12
12
|
HEADING_PATTERN = /\A[ \t]*(##|###) /
|
|
13
|
+
FENCE_PATTERN = /\A`{3,}/
|
|
13
14
|
|
|
14
15
|
def initialize(content)
|
|
15
16
|
@content = content
|
|
16
17
|
end
|
|
17
18
|
|
|
18
19
|
def wrap
|
|
20
|
+
code_blocks = []
|
|
21
|
+
text_lines = []
|
|
22
|
+
in_code = false
|
|
23
|
+
code_buffer = []
|
|
24
|
+
|
|
25
|
+
@content.each_line do |line|
|
|
26
|
+
if line.match?(FENCE_PATTERN)
|
|
27
|
+
if in_code
|
|
28
|
+
# End of code block
|
|
29
|
+
code_buffer << line
|
|
30
|
+
code_blocks << code_buffer.join
|
|
31
|
+
text_lines << "#{placeholder_for(code_blocks.length - 1)}\n\n"
|
|
32
|
+
code_buffer = []
|
|
33
|
+
in_code = false
|
|
34
|
+
else
|
|
35
|
+
# Start of code block
|
|
36
|
+
in_code = true
|
|
37
|
+
code_buffer << line
|
|
38
|
+
end
|
|
39
|
+
elsif in_code
|
|
40
|
+
code_buffer << line
|
|
41
|
+
else
|
|
42
|
+
text_lines << line
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
# Handle unclosed code block
|
|
47
|
+
if in_code
|
|
48
|
+
code_blocks << code_buffer.join
|
|
49
|
+
text_lines << "#{placeholder_for(code_blocks.length - 1)}\n\n"
|
|
50
|
+
end
|
|
51
|
+
|
|
52
|
+
wrapped = wrap_text(text_lines.join)
|
|
53
|
+
|
|
54
|
+
# Restore code blocks
|
|
55
|
+
code_blocks.each_with_index do |block, i|
|
|
56
|
+
wrapped = wrapped.sub(placeholder_for(i), block)
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
wrapped
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
private
|
|
63
|
+
|
|
64
|
+
def placeholder_for(index)
|
|
65
|
+
"__SAKUSEI_CODE_BLOCK_#{index}__"
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
def wrap_text(content)
|
|
19
69
|
# Split on two-or-more blank lines to get top-level blocks.
|
|
20
70
|
# Preserve the separator length so rejoining is faithful.
|
|
21
|
-
blocks =
|
|
71
|
+
blocks = content.split(/(\n{2,})/)
|
|
22
72
|
# split with a capture group gives us [block, sep, block, sep, ...]
|
|
23
73
|
result = []
|
|
24
74
|
i = 0
|
|
@@ -47,8 +97,6 @@ module Sakusei
|
|
|
47
97
|
result.join
|
|
48
98
|
end
|
|
49
99
|
|
|
50
|
-
private
|
|
51
|
-
|
|
52
100
|
def heading_block?(block)
|
|
53
101
|
return false unless block
|
|
54
102
|
block.match?(HEADING_PATTERN)
|
data/lib/sakusei/version.rb
CHANGED
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: sakusei
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.3.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Keith Rowell
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2026-04-
|
|
11
|
+
date: 2026-04-18 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: thor
|