Skip to content

Commit c71a835

Browse files
committed
feat(pdf): default to no-gutter in digital mode
Default generated PDF digital-mode output to no book gutter while preserving the guttered default for print-mode output.
1 parent 4ecdcc5 commit c71a835

3 files changed

Lines changed: 58 additions & 4 deletions

File tree

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
3939
- Improve handling of special characters in generated PDF code blocks and inline text with PUA escapes.
4040
- Adjust the generated PDF LaTeX template geometry so guttered body content aligns more closely with header and footer text at the outer page edge.
4141
- Align generated PDF no-gutter horizontal content margins with Swift-DocC-Render's full-width container padding instead of using paper-size-specific LaTeX margins.
42+
- Default generated PDF digital-mode output to no book gutter while preserving the guttered default for print-mode output.
4243

4344
### Fixed
4445
- Fix an issue where the header text in the generated PDF document could be misaligned between odd and even pages.

src/swift_book_pdf/pdf/cli/config.py

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
from swift_book_pdf.pdf.backend import PDFBackend, PDFBackendConfigInput
2222
from swift_book_pdf.pdf.config import (
2323
DEFAULT_BODY_FONT_SIZE,
24-
DEFAULT_GUTTER,
2524
Appearance,
2625
PaperSize,
2726
PDFConfig,
@@ -51,15 +50,30 @@ def build_doc_config(
5150
Returns:
5251
PDF document layout configuration.
5352
"""
53+
rendering_mode = RenderingMode(mode)
5454
return PDFDocumentConfig(
55-
mode=RenderingMode(mode),
55+
mode=rendering_mode,
5656
paper_size=PaperSize(paper),
57-
gutter=DEFAULT_GUTTER if gutter is None else gutter,
57+
gutter=_default_gutter_for_mode(rendering_mode)
58+
if gutter is None
59+
else gutter,
5860
font_size=(DEFAULT_BODY_FONT_SIZE if font_size is None else font_size),
5961
appearance=Appearance.DARK if dark else Appearance.LIGHT,
6062
)
6163

6264

65+
def _default_gutter_for_mode(mode: RenderingMode) -> bool:
66+
"""Return the implicit gutter setting for a rendering mode.
67+
68+
Args:
69+
mode: Resolved PDF rendering mode.
70+
71+
Returns:
72+
Whether gutter should be enabled when the CLI flag is omitted.
73+
"""
74+
return mode == RenderingMode.PRINT
75+
76+
6377
def build_content_selection(
6478
*,
6579
only_toc: bool,

tests/pdf/test_config.py

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,10 @@
1313
# limitations under the License.
1414

1515
from swift_book_pdf.core.config import ResolvedBuildSource
16-
from swift_book_pdf.pdf.cli.config import build_content_selection
16+
from swift_book_pdf.pdf.cli.config import (
17+
build_content_selection,
18+
build_doc_config,
19+
)
1720
from swift_book_pdf.pdf.config import PDFContentSelection, PDFDocumentConfig
1821
from swift_book_pdf.pdf.latex.config import LaTeXConfig, LaTeXPDFConfig
1922
from swift_book_pdf.pdf.latex.fonts.resolver import LaTeXFontConfig
@@ -88,6 +91,42 @@ def test_latex_pdf_config_formats_build_error_details() -> None:
8891
)
8992

9093

94+
def test_build_doc_config_defaults_to_no_gutter_for_digital_mode() -> None:
95+
config = build_doc_config(
96+
mode="digital",
97+
paper="letter",
98+
dark=False,
99+
gutter=None,
100+
font_size=None,
101+
)
102+
103+
assert config.gutter is False
104+
105+
106+
def test_build_doc_config_defaults_to_gutter_for_print_mode() -> None:
107+
config = build_doc_config(
108+
mode="print",
109+
paper="letter",
110+
dark=False,
111+
gutter=None,
112+
font_size=None,
113+
)
114+
115+
assert config.gutter is True
116+
117+
118+
def test_build_doc_config_uses_explicit_gutter_override() -> None:
119+
config = build_doc_config(
120+
mode="digital",
121+
paper="letter",
122+
dark=False,
123+
gutter=True,
124+
font_size=None,
125+
)
126+
127+
assert config.gutter is True
128+
129+
91130
def test_pdf_content_selection_rejects_conflicting_selectors() -> None:
92131
try:
93132
PDFContentSelection(only_toc=True, only_chapter="GuidedTour")

0 commit comments

Comments
 (0)