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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d1912283c38c05cc3a9f23d05a0ac73eca6846943ee32af42952478e6db89a04
4
- data.tar.gz: 7d96c876d140e466e81e7aa6a34f4cb8f0a113da11b70ee454edd755469944ae
3
+ metadata.gz: ab634a886e4a04c4a309f672ff57317e54eab5d44e8fcac304a42c9463c5bb15
4
+ data.tar.gz: 4c2e2a610935627d01c80dd0f0b7ad48f6a840dddf2b433a122f4655f3a27826
5
5
  SHA512:
6
- metadata.gz: 015ce01c509c0b73107501e9a0ab8c0167b032ad3b51712b1c3f511c79dc7687ace68f0f4871972f7efd691642d8a7e72d99114c65f5abe74a97ed9b56bcc873
7
- data.tar.gz: 574528be0428bfd65b7d6bf473febc0c202c26c6677d3e6a33bdd9cc582394537e7bca141a956e2824d30a1f40231ce2f4f54ab165ddf6b108bb84d80ba1ec9a
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 = @content.split(/(\n{2,})/)
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)
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Sakusei
4
- VERSION = '0.2.2'
4
+ VERSION = '0.3.0'
5
5
  end
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.2.2
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-14 00:00:00.000000000 Z
11
+ date: 2026-04-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor