manuscripta 0.1.0__tar.gz
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.
- manuscripta-0.1.0/LICENSE +21 -0
- manuscripta-0.1.0/PKG-INFO +199 -0
- manuscripta-0.1.0/README.md +164 -0
- manuscripta-0.1.0/pyproject.toml +187 -0
- manuscripta-0.1.0/src/manuscripta/__init__.py +3 -0
- manuscripta-0.1.0/src/manuscripta/audiobook/__init__.py +0 -0
- manuscripta-0.1.0/src/manuscripta/audiobook/generator.py +862 -0
- manuscripta-0.1.0/src/manuscripta/audiobook/tts/__init__.py +0 -0
- manuscripta-0.1.0/src/manuscripta/audiobook/tts/base.py +10 -0
- manuscripta-0.1.0/src/manuscripta/audiobook/tts/edge_tts_adapter.py +239 -0
- manuscripta-0.1.0/src/manuscripta/audiobook/tts/elevenlabs_adapter.py +25 -0
- manuscripta-0.1.0/src/manuscripta/audiobook/tts/gtts_adapter.py +14 -0
- manuscripta-0.1.0/src/manuscripta/audiobook/tts/pyttsx3_adapter.py +18 -0
- manuscripta-0.1.0/src/manuscripta/config/__init__.py +0 -0
- manuscripta-0.1.0/src/manuscripta/config/loader.py +37 -0
- manuscripta-0.1.0/src/manuscripta/data/__init__.py +0 -0
- manuscripta-0.1.0/src/manuscripta/data/character_profiles.json +7 -0
- manuscripta-0.1.0/src/manuscripta/data/emoji_map.py +88 -0
- manuscripta-0.1.0/src/manuscripta/data/emoji_map_sanity.py +23 -0
- manuscripta-0.1.0/src/manuscripta/data/image_prompt_generation_template.json +45 -0
- manuscripta-0.1.0/src/manuscripta/data/image_prompts.json +20 -0
- manuscripta-0.1.0/src/manuscripta/data/symbol_map.py +24 -0
- manuscripta-0.1.0/src/manuscripta/enums/__init__.py +0 -0
- manuscripta-0.1.0/src/manuscripta/enums/book_type.py +8 -0
- manuscripta-0.1.0/src/manuscripta/export/__init__.py +0 -0
- manuscripta-0.1.0/src/manuscripta/export/book.py +834 -0
- manuscripta-0.1.0/src/manuscripta/export/comic.py +187 -0
- manuscripta-0.1.0/src/manuscripta/export/print_version.py +227 -0
- manuscripta-0.1.0/src/manuscripta/export/shortcuts.py +693 -0
- manuscripta-0.1.0/src/manuscripta/export/shortcuts_comic.py +82 -0
- manuscripta-0.1.0/src/manuscripta/export/validation.py +245 -0
- manuscripta-0.1.0/src/manuscripta/images/__init__.py +0 -0
- manuscripta-0.1.0/src/manuscripta/images/convert.py +250 -0
- manuscripta-0.1.0/src/manuscripta/images/generate.py +126 -0
- manuscripta-0.1.0/src/manuscripta/images/generate_deepai.py +238 -0
- manuscripta-0.1.0/src/manuscripta/images/inject.py +293 -0
- manuscripta-0.1.0/src/manuscripta/markdown/__init__.py +0 -0
- manuscripta-0.1.0/src/manuscripta/markdown/bullet_points.py +103 -0
- manuscripta-0.1.0/src/manuscripta/markdown/emojis.py +203 -0
- manuscripta-0.1.0/src/manuscripta/markdown/german_quotes.py +509 -0
- manuscripta-0.1.0/src/manuscripta/markdown/links_to_plain.py +114 -0
- manuscripta-0.1.0/src/manuscripta/markdown/normalize_toc.py +69 -0
- manuscripta-0.1.0/src/manuscripta/markdown/strip_links.py +191 -0
- manuscripta-0.1.0/src/manuscripta/markdown/unbold_headers.py +223 -0
- manuscripta-0.1.0/src/manuscripta/paths/__init__.py +0 -0
- manuscripta-0.1.0/src/manuscripta/paths/img_tags.py +205 -0
- manuscripta-0.1.0/src/manuscripta/paths/to_absolute.py +349 -0
- manuscripta-0.1.0/src/manuscripta/paths/to_relative.py +131 -0
- manuscripta-0.1.0/src/manuscripta/project/__init__.py +0 -0
- manuscripta-0.1.0/src/manuscripta/project/chapters.py +193 -0
- manuscripta-0.1.0/src/manuscripta/project/init.py +259 -0
- manuscripta-0.1.0/src/manuscripta/project/metadata.py +76 -0
- manuscripta-0.1.0/src/manuscripta/project/reorder.py +339 -0
- manuscripta-0.1.0/src/manuscripta/project/shortcuts_init.py +73 -0
- manuscripta-0.1.0/src/manuscripta/project/tag_message.py +889 -0
- manuscripta-0.1.0/src/manuscripta/translation/__init__.py +0 -0
- manuscripta-0.1.0/src/manuscripta/translation/deepl.py +225 -0
- manuscripta-0.1.0/src/manuscripta/translation/lmstudio.py +562 -0
- manuscripta-0.1.0/src/manuscripta/translation/shortcuts.py +117 -0
- manuscripta-0.1.0/src/manuscripta/translation/shortcuts_lms.py +117 -0
- manuscripta-0.1.0/src/manuscripta/utils/__init__.py +0 -0
- manuscripta-0.1.0/src/manuscripta/utils/bulk_extension.py +215 -0
- manuscripta-0.1.0/src/manuscripta/utils/git_cache.py +89 -0
- manuscripta-0.1.0/src/manuscripta/utils/pandoc_batch.py +338 -0
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Asterios Raptis
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: manuscripta
|
|
3
|
+
Version: 0.1.0
|
|
4
|
+
Summary: Book production pipeline for authors and self-publishers. Multi-format export (PDF, EPUB, DOCX, HTML, Markdown), audiobook generation, translation, and manuscript tooling.
|
|
5
|
+
License-Expression: MIT
|
|
6
|
+
License-File: LICENSE
|
|
7
|
+
Keywords: book,publishing,pandoc,epub,audiobook,self-publishing,kdp
|
|
8
|
+
Author: Asterios Raptis
|
|
9
|
+
Author-email: asteri.raptis@gmail.com
|
|
10
|
+
Requires-Python: >=3.11,<4.0
|
|
11
|
+
Classifier: Development Status :: 3 - Alpha
|
|
12
|
+
Classifier: Intended Audience :: End Users/Desktop
|
|
13
|
+
Classifier: Topic :: Text Processing :: Markup :: Markdown
|
|
14
|
+
Classifier: License :: OSI Approved :: MIT License
|
|
15
|
+
Classifier: Programming Language :: Python :: 3.11
|
|
16
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
17
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
18
|
+
Requires-Dist: beautifulsoup4 (>=4.14.3,<5.0.0)
|
|
19
|
+
Requires-Dist: ebooklib (>=0.20,<0.21)
|
|
20
|
+
Requires-Dist: edge-tts (>=7.2.7,<8.0.0)
|
|
21
|
+
Requires-Dist: ftfy (>=6.3.1,<7.0.0)
|
|
22
|
+
Requires-Dist: pandas (>=2.3.2,<3.0.0)
|
|
23
|
+
Requires-Dist: pillow (>=11.2.1,<12.0.0)
|
|
24
|
+
Requires-Dist: pymupdf (>=1.26.4,<2.0.0)
|
|
25
|
+
Requires-Dist: python-dotenv (>=1.1.0,<2.0.0)
|
|
26
|
+
Requires-Dist: pyyaml (>=6.0.2,<7.0.0)
|
|
27
|
+
Requires-Dist: questionary (>=2.1.1,<3.0.0)
|
|
28
|
+
Requires-Dist: requests (>=2.32.5,<3.0.0)
|
|
29
|
+
Requires-Dist: toml (>=0.10.2,<0.11.0)
|
|
30
|
+
Project-URL: Homepage, https://github.com/astrapi69/manuscripta
|
|
31
|
+
Project-URL: Issues, https://github.com/astrapi69/manuscripta/issues
|
|
32
|
+
Project-URL: Repository, https://github.com/astrapi69/manuscripta
|
|
33
|
+
Description-Content-Type: text/markdown
|
|
34
|
+
|
|
35
|
+
# manuscripta
|
|
36
|
+
|
|
37
|
+
Book production pipeline for authors and self-publishers.
|
|
38
|
+
|
|
39
|
+
Multi-format export (PDF, EPUB, DOCX, HTML, Markdown), audiobook generation, translation, and manuscript tooling, powered by Pandoc.
|
|
40
|
+
|
|
41
|
+
## Installation
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
pip install manuscripta
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Or with Poetry:
|
|
48
|
+
|
|
49
|
+
```bash
|
|
50
|
+
poetry add manuscripta
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Requirements
|
|
54
|
+
|
|
55
|
+
- Python 3.11+
|
|
56
|
+
- [Pandoc](https://pandoc.org/installing.html) installed and available on PATH
|
|
57
|
+
- For audiobook generation: internet connection (Edge TTS) or local TTS engine
|
|
58
|
+
|
|
59
|
+
## Quick Start
|
|
60
|
+
|
|
61
|
+
Inside your book repository root:
|
|
62
|
+
|
|
63
|
+
```bash
|
|
64
|
+
# Export to PDF
|
|
65
|
+
export-pdf
|
|
66
|
+
|
|
67
|
+
# Export to EPUB with cover
|
|
68
|
+
export-ewc --cover assets/covers/cover.jpg
|
|
69
|
+
|
|
70
|
+
# Export all formats
|
|
71
|
+
export-all
|
|
72
|
+
|
|
73
|
+
# Safe export (no source modifications, good for drafts)
|
|
74
|
+
export-pdf-safe
|
|
75
|
+
|
|
76
|
+
# Generate audiobook
|
|
77
|
+
manuscripta-audiobook --engine edge --voice en-US-JennyNeural
|
|
78
|
+
|
|
79
|
+
# Initialize a new book project
|
|
80
|
+
manuscripta-init
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
## Book Repository Structure
|
|
84
|
+
|
|
85
|
+
Each book repository should follow this layout:
|
|
86
|
+
|
|
87
|
+
```
|
|
88
|
+
my-book/
|
|
89
|
+
manuscript/
|
|
90
|
+
front-matter/
|
|
91
|
+
toc.md
|
|
92
|
+
toc-print.md
|
|
93
|
+
foreword.md
|
|
94
|
+
preface.md
|
|
95
|
+
chapters/
|
|
96
|
+
01-chapter-one.md
|
|
97
|
+
02-chapter-two.md
|
|
98
|
+
back-matter/
|
|
99
|
+
epilogue.md
|
|
100
|
+
glossary.md
|
|
101
|
+
acknowledgments.md
|
|
102
|
+
about-the-author.md
|
|
103
|
+
bibliography.md
|
|
104
|
+
imprint.md
|
|
105
|
+
config/
|
|
106
|
+
metadata.yaml
|
|
107
|
+
export-settings.yaml
|
|
108
|
+
voice-settings.yaml
|
|
109
|
+
assets/
|
|
110
|
+
covers/
|
|
111
|
+
images/
|
|
112
|
+
fonts/
|
|
113
|
+
templates/
|
|
114
|
+
output/
|
|
115
|
+
pyproject.toml
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Configuration
|
|
119
|
+
|
|
120
|
+
### export-settings.yaml
|
|
121
|
+
|
|
122
|
+
Controls output formats, TOC behavior, and section ordering per book type (ebook, paperback, hardcover, audiobook).
|
|
123
|
+
|
|
124
|
+
### voice-settings.yaml
|
|
125
|
+
|
|
126
|
+
TTS configuration: language, voice, and sections to skip during audio generation.
|
|
127
|
+
|
|
128
|
+
### metadata.yaml
|
|
129
|
+
|
|
130
|
+
Pandoc metadata: title, author, date, language.
|
|
131
|
+
|
|
132
|
+
## Available Commands
|
|
133
|
+
|
|
134
|
+
### Export
|
|
135
|
+
|
|
136
|
+
| Command | Description |
|
|
137
|
+
|---------|-------------|
|
|
138
|
+
| `export-pdf` / `export-p` | Export PDF |
|
|
139
|
+
| `export-epub` / `export-e` | Export EPUB |
|
|
140
|
+
| `export-docx` / `export-d` | Export DOCX |
|
|
141
|
+
| `export-html` / `export-h` | Export HTML |
|
|
142
|
+
| `export-md` | Export Markdown |
|
|
143
|
+
| `export-all` | Export all formats |
|
|
144
|
+
| `export-all-with-cover` | Export all with cover |
|
|
145
|
+
| `export-pvp` | Print version (paperback) |
|
|
146
|
+
| `export-pvh` | Print version (hardcover) |
|
|
147
|
+
|
|
148
|
+
All export commands have a `-safe` variant (e.g. `export-pdf-safe`) that skips source preprocessing for fast, non-destructive draft builds.
|
|
149
|
+
|
|
150
|
+
### Audiobook
|
|
151
|
+
|
|
152
|
+
| Command | Description |
|
|
153
|
+
|---------|-------------|
|
|
154
|
+
| `manuscripta-audiobook` | Generate MP3 audiobook |
|
|
155
|
+
|
|
156
|
+
### Translation
|
|
157
|
+
|
|
158
|
+
| Command | Description |
|
|
159
|
+
|---------|-------------|
|
|
160
|
+
| `translate-en-de` | English to German (DeepL) |
|
|
161
|
+
| `translate-de-en` | German to English (DeepL) |
|
|
162
|
+
| `translate-book-en-de` | English to German (LMStudio) |
|
|
163
|
+
| `translate-book-de-en` | German to English (LMStudio) |
|
|
164
|
+
|
|
165
|
+
### Project Management
|
|
166
|
+
|
|
167
|
+
| Command | Description |
|
|
168
|
+
|---------|-------------|
|
|
169
|
+
| `manuscripta-init` | Initialize new book project |
|
|
170
|
+
| `create-chapters` | Create chapter files |
|
|
171
|
+
| `reorder-chapters` | Reorder and rename chapters |
|
|
172
|
+
| `manuscripta-tag` | Generate release tag message |
|
|
173
|
+
|
|
174
|
+
## Module Structure
|
|
175
|
+
|
|
176
|
+
```
|
|
177
|
+
manuscripta/
|
|
178
|
+
export/ # PDF, EPUB, DOCX, HTML, Markdown export
|
|
179
|
+
audiobook/ # TTS-based audiobook generation
|
|
180
|
+
tts/ # Pluggable TTS backends (Edge, gTTS, pyttsx3, ElevenLabs)
|
|
181
|
+
translation/ # DeepL and LMStudio translation
|
|
182
|
+
markdown/ # Markdown processing (quotes, links, emojis, TOC)
|
|
183
|
+
paths/ # Path conversion (absolute/relative, image tags)
|
|
184
|
+
images/ # Image conversion, generation, injection
|
|
185
|
+
project/ # Project init, chapters, metadata, tagging
|
|
186
|
+
config/ # Config file loading
|
|
187
|
+
enums/ # Book type enum
|
|
188
|
+
utils/ # Pandoc batch, git cache, bulk operations
|
|
189
|
+
data/ # Emoji/symbol maps, JSON data files
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## Companion Tools
|
|
193
|
+
|
|
194
|
+
- [manuscript-tools](https://pypi.org/project/manuscript-tools/) - Validation, sanitization and metrics for Markdown manuscripts. Install separately for linting capabilities.
|
|
195
|
+
|
|
196
|
+
## License
|
|
197
|
+
|
|
198
|
+
MIT
|
|
199
|
+
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
# manuscripta
|
|
2
|
+
|
|
3
|
+
Book production pipeline for authors and self-publishers.
|
|
4
|
+
|
|
5
|
+
Multi-format export (PDF, EPUB, DOCX, HTML, Markdown), audiobook generation, translation, and manuscript tooling, powered by Pandoc.
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
pip install manuscripta
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Or with Poetry:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
poetry add manuscripta
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Requirements
|
|
20
|
+
|
|
21
|
+
- Python 3.11+
|
|
22
|
+
- [Pandoc](https://pandoc.org/installing.html) installed and available on PATH
|
|
23
|
+
- For audiobook generation: internet connection (Edge TTS) or local TTS engine
|
|
24
|
+
|
|
25
|
+
## Quick Start
|
|
26
|
+
|
|
27
|
+
Inside your book repository root:
|
|
28
|
+
|
|
29
|
+
```bash
|
|
30
|
+
# Export to PDF
|
|
31
|
+
export-pdf
|
|
32
|
+
|
|
33
|
+
# Export to EPUB with cover
|
|
34
|
+
export-ewc --cover assets/covers/cover.jpg
|
|
35
|
+
|
|
36
|
+
# Export all formats
|
|
37
|
+
export-all
|
|
38
|
+
|
|
39
|
+
# Safe export (no source modifications, good for drafts)
|
|
40
|
+
export-pdf-safe
|
|
41
|
+
|
|
42
|
+
# Generate audiobook
|
|
43
|
+
manuscripta-audiobook --engine edge --voice en-US-JennyNeural
|
|
44
|
+
|
|
45
|
+
# Initialize a new book project
|
|
46
|
+
manuscripta-init
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Book Repository Structure
|
|
50
|
+
|
|
51
|
+
Each book repository should follow this layout:
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
my-book/
|
|
55
|
+
manuscript/
|
|
56
|
+
front-matter/
|
|
57
|
+
toc.md
|
|
58
|
+
toc-print.md
|
|
59
|
+
foreword.md
|
|
60
|
+
preface.md
|
|
61
|
+
chapters/
|
|
62
|
+
01-chapter-one.md
|
|
63
|
+
02-chapter-two.md
|
|
64
|
+
back-matter/
|
|
65
|
+
epilogue.md
|
|
66
|
+
glossary.md
|
|
67
|
+
acknowledgments.md
|
|
68
|
+
about-the-author.md
|
|
69
|
+
bibliography.md
|
|
70
|
+
imprint.md
|
|
71
|
+
config/
|
|
72
|
+
metadata.yaml
|
|
73
|
+
export-settings.yaml
|
|
74
|
+
voice-settings.yaml
|
|
75
|
+
assets/
|
|
76
|
+
covers/
|
|
77
|
+
images/
|
|
78
|
+
fonts/
|
|
79
|
+
templates/
|
|
80
|
+
output/
|
|
81
|
+
pyproject.toml
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
## Configuration
|
|
85
|
+
|
|
86
|
+
### export-settings.yaml
|
|
87
|
+
|
|
88
|
+
Controls output formats, TOC behavior, and section ordering per book type (ebook, paperback, hardcover, audiobook).
|
|
89
|
+
|
|
90
|
+
### voice-settings.yaml
|
|
91
|
+
|
|
92
|
+
TTS configuration: language, voice, and sections to skip during audio generation.
|
|
93
|
+
|
|
94
|
+
### metadata.yaml
|
|
95
|
+
|
|
96
|
+
Pandoc metadata: title, author, date, language.
|
|
97
|
+
|
|
98
|
+
## Available Commands
|
|
99
|
+
|
|
100
|
+
### Export
|
|
101
|
+
|
|
102
|
+
| Command | Description |
|
|
103
|
+
|---------|-------------|
|
|
104
|
+
| `export-pdf` / `export-p` | Export PDF |
|
|
105
|
+
| `export-epub` / `export-e` | Export EPUB |
|
|
106
|
+
| `export-docx` / `export-d` | Export DOCX |
|
|
107
|
+
| `export-html` / `export-h` | Export HTML |
|
|
108
|
+
| `export-md` | Export Markdown |
|
|
109
|
+
| `export-all` | Export all formats |
|
|
110
|
+
| `export-all-with-cover` | Export all with cover |
|
|
111
|
+
| `export-pvp` | Print version (paperback) |
|
|
112
|
+
| `export-pvh` | Print version (hardcover) |
|
|
113
|
+
|
|
114
|
+
All export commands have a `-safe` variant (e.g. `export-pdf-safe`) that skips source preprocessing for fast, non-destructive draft builds.
|
|
115
|
+
|
|
116
|
+
### Audiobook
|
|
117
|
+
|
|
118
|
+
| Command | Description |
|
|
119
|
+
|---------|-------------|
|
|
120
|
+
| `manuscripta-audiobook` | Generate MP3 audiobook |
|
|
121
|
+
|
|
122
|
+
### Translation
|
|
123
|
+
|
|
124
|
+
| Command | Description |
|
|
125
|
+
|---------|-------------|
|
|
126
|
+
| `translate-en-de` | English to German (DeepL) |
|
|
127
|
+
| `translate-de-en` | German to English (DeepL) |
|
|
128
|
+
| `translate-book-en-de` | English to German (LMStudio) |
|
|
129
|
+
| `translate-book-de-en` | German to English (LMStudio) |
|
|
130
|
+
|
|
131
|
+
### Project Management
|
|
132
|
+
|
|
133
|
+
| Command | Description |
|
|
134
|
+
|---------|-------------|
|
|
135
|
+
| `manuscripta-init` | Initialize new book project |
|
|
136
|
+
| `create-chapters` | Create chapter files |
|
|
137
|
+
| `reorder-chapters` | Reorder and rename chapters |
|
|
138
|
+
| `manuscripta-tag` | Generate release tag message |
|
|
139
|
+
|
|
140
|
+
## Module Structure
|
|
141
|
+
|
|
142
|
+
```
|
|
143
|
+
manuscripta/
|
|
144
|
+
export/ # PDF, EPUB, DOCX, HTML, Markdown export
|
|
145
|
+
audiobook/ # TTS-based audiobook generation
|
|
146
|
+
tts/ # Pluggable TTS backends (Edge, gTTS, pyttsx3, ElevenLabs)
|
|
147
|
+
translation/ # DeepL and LMStudio translation
|
|
148
|
+
markdown/ # Markdown processing (quotes, links, emojis, TOC)
|
|
149
|
+
paths/ # Path conversion (absolute/relative, image tags)
|
|
150
|
+
images/ # Image conversion, generation, injection
|
|
151
|
+
project/ # Project init, chapters, metadata, tagging
|
|
152
|
+
config/ # Config file loading
|
|
153
|
+
enums/ # Book type enum
|
|
154
|
+
utils/ # Pandoc batch, git cache, bulk operations
|
|
155
|
+
data/ # Emoji/symbol maps, JSON data files
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
## Companion Tools
|
|
159
|
+
|
|
160
|
+
- [manuscript-tools](https://pypi.org/project/manuscript-tools/) - Validation, sanitization and metrics for Markdown manuscripts. Install separately for linting capabilities.
|
|
161
|
+
|
|
162
|
+
## License
|
|
163
|
+
|
|
164
|
+
MIT
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
[project]
|
|
2
|
+
name = "manuscripta"
|
|
3
|
+
version = "0.1.0"
|
|
4
|
+
description = "Book production pipeline for authors and self-publishers. Multi-format export (PDF, EPUB, DOCX, HTML, Markdown), audiobook generation, translation, and manuscript tooling."
|
|
5
|
+
readme = "README.md"
|
|
6
|
+
license = "MIT"
|
|
7
|
+
requires-python = ">=3.11,<4.0"
|
|
8
|
+
keywords = ["book", "publishing", "pandoc", "epub", "audiobook", "self-publishing", "kdp"]
|
|
9
|
+
classifiers = [
|
|
10
|
+
"Development Status :: 3 - Alpha",
|
|
11
|
+
"Intended Audience :: End Users/Desktop",
|
|
12
|
+
"Topic :: Text Processing :: Markup :: Markdown",
|
|
13
|
+
"License :: OSI Approved :: MIT License",
|
|
14
|
+
"Programming Language :: Python :: 3.11",
|
|
15
|
+
"Programming Language :: Python :: 3.12",
|
|
16
|
+
"Programming Language :: Python :: 3.13",
|
|
17
|
+
]
|
|
18
|
+
|
|
19
|
+
[[project.authors]]
|
|
20
|
+
name = "Asterios Raptis"
|
|
21
|
+
email = "asteri.raptis@gmail.com"
|
|
22
|
+
|
|
23
|
+
[project.urls]
|
|
24
|
+
Homepage = "https://github.com/astrapi69/manuscripta"
|
|
25
|
+
Repository = "https://github.com/astrapi69/manuscripta"
|
|
26
|
+
Issues = "https://github.com/astrapi69/manuscripta/issues"
|
|
27
|
+
|
|
28
|
+
[project.scripts]
|
|
29
|
+
# --- Main commands ---
|
|
30
|
+
manuscripta-export = "manuscripta.export.book:main"
|
|
31
|
+
manuscripta-export-comic = "manuscripta.export.comic:main"
|
|
32
|
+
manuscripta-audiobook = "manuscripta.audiobook.generator:main"
|
|
33
|
+
manuscripta-init = "manuscripta.project.init:main"
|
|
34
|
+
manuscripta-tag = "manuscripta.project.tag_message:main"
|
|
35
|
+
|
|
36
|
+
# --- Export shortcuts ---
|
|
37
|
+
export-shortcuts = "manuscripta.export.shortcuts:main"
|
|
38
|
+
export-epub = "manuscripta.export.shortcuts:export_epub"
|
|
39
|
+
export-epub2 = "manuscripta.export.shortcuts:export_epub2"
|
|
40
|
+
export-e = "manuscripta.export.shortcuts:export_epub"
|
|
41
|
+
export-e2 = "manuscripta.export.shortcuts:export_epub2"
|
|
42
|
+
export-epub-with-cover = "manuscripta.export.shortcuts:export_epub_with_cover"
|
|
43
|
+
export-epub2-with-cover = "manuscripta.export.shortcuts:export_epub2_with_cover"
|
|
44
|
+
export-ewc = "manuscripta.export.shortcuts:export_epub_with_cover"
|
|
45
|
+
export-e2wc = "manuscripta.export.shortcuts:export_epub2_with_cover"
|
|
46
|
+
export-print-version-epub = "manuscripta.export.shortcuts:export_print_version_epub"
|
|
47
|
+
export-pve = "manuscripta.export.shortcuts:export_print_version_epub"
|
|
48
|
+
export-print-version-paperback = "manuscripta.export.shortcuts:export_print_version_paperback"
|
|
49
|
+
export-pvp = "manuscripta.export.shortcuts:export_print_version_paperback"
|
|
50
|
+
export-print-version-hardcover = "manuscripta.export.shortcuts:export_print_version_hardcover"
|
|
51
|
+
export-pvh = "manuscripta.export.shortcuts:export_print_version_hardcover"
|
|
52
|
+
export-markdown = "manuscripta.export.shortcuts:export_markdown"
|
|
53
|
+
export-md = "manuscripta.export.shortcuts:export_markdown"
|
|
54
|
+
export-pdf = "manuscripta.export.shortcuts:export_pdf"
|
|
55
|
+
export-p = "manuscripta.export.shortcuts:export_pdf"
|
|
56
|
+
export-docx = "manuscripta.export.shortcuts:export_docx"
|
|
57
|
+
export-d = "manuscripta.export.shortcuts:export_docx"
|
|
58
|
+
export-html = "manuscripta.export.shortcuts:export_html"
|
|
59
|
+
export-h = "manuscripta.export.shortcuts:export_html"
|
|
60
|
+
export-all-with-cover = "manuscripta.export.shortcuts:export_all_formats_with_cover"
|
|
61
|
+
export-all = "manuscripta.export.shortcuts:export_all_formats"
|
|
62
|
+
# Safe shortcuts (skip Step 1 & 4)
|
|
63
|
+
export-pdf-safe = "manuscripta.export.shortcuts:export_pdf_safe"
|
|
64
|
+
export-ps = "manuscripta.export.shortcuts:export_pdf_safe"
|
|
65
|
+
export-epub-safe = "manuscripta.export.shortcuts:export_epub_safe"
|
|
66
|
+
export-es = "manuscripta.export.shortcuts:export_epub_safe"
|
|
67
|
+
export-docx-safe = "manuscripta.export.shortcuts:export_docx_safe"
|
|
68
|
+
export-ds = "manuscripta.export.shortcuts:export_docx_safe"
|
|
69
|
+
export-markdown-safe = "manuscripta.export.shortcuts:export_markdown_safe"
|
|
70
|
+
export-mds = "manuscripta.export.shortcuts:export_markdown_safe"
|
|
71
|
+
export-html-safe = "manuscripta.export.shortcuts:export_html_safe"
|
|
72
|
+
export-hs = "manuscripta.export.shortcuts:export_html_safe"
|
|
73
|
+
export-print-version-paperback-safe = "manuscripta.export.shortcuts:export_print_version_paperback_safe"
|
|
74
|
+
export-pvps = "manuscripta.export.shortcuts:export_print_version_paperback_safe"
|
|
75
|
+
export-print-version-hardcover-safe = "manuscripta.export.shortcuts:export_print_version_hardcover_safe"
|
|
76
|
+
export-pvhs = "manuscripta.export.shortcuts:export_print_version_hardcover_safe"
|
|
77
|
+
|
|
78
|
+
# --- Comic shortcuts ---
|
|
79
|
+
export-comic-html = "manuscripta.export.shortcuts_comic:export_comic_html"
|
|
80
|
+
export-comic-pdf = "manuscripta.export.shortcuts_comic:export_comic_pdf"
|
|
81
|
+
|
|
82
|
+
# --- Init shortcuts ---
|
|
83
|
+
update-mdv = "manuscripta.project.shortcuts_init:run_update_metadata_values"
|
|
84
|
+
init-bp = "manuscripta.project.shortcuts_init:run_init_book_project"
|
|
85
|
+
|
|
86
|
+
# --- Markdown tools ---
|
|
87
|
+
fix-german-quotes = "manuscripta.markdown.german_quotes:main"
|
|
88
|
+
replace-md-bullet-points = "manuscripta.markdown.bullet_points:main"
|
|
89
|
+
unbold-md-headers = "manuscripta.markdown.unbold_headers:main"
|
|
90
|
+
replace-emojis = "manuscripta.markdown.emojis:main"
|
|
91
|
+
|
|
92
|
+
# --- Translation (DeepL) ---
|
|
93
|
+
translate = "manuscripta.translation.shortcuts:translate"
|
|
94
|
+
translate-de-es = "manuscripta.translation.shortcuts:translate_manuscript_from_german_to_spanish"
|
|
95
|
+
translate-en-es = "manuscripta.translation.shortcuts:translate_manuscript_from_english_to_spanish"
|
|
96
|
+
translate-en-de = "manuscripta.translation.shortcuts:translate_manuscript_to_german"
|
|
97
|
+
translate-de-en = "manuscripta.translation.shortcuts:translate_manuscript_from_german_to_english"
|
|
98
|
+
translate-book-deepl = "manuscripta.translation.deepl:main"
|
|
99
|
+
|
|
100
|
+
# --- Translation (LMStudio) ---
|
|
101
|
+
translate-book = "manuscripta.translation.lmstudio:main"
|
|
102
|
+
translate-book-lmstudio = "manuscripta.translation.lmstudio:main"
|
|
103
|
+
translate-book-en-es = "manuscripta.translation.shortcuts_lms:translate_manuscript_from_english_to_spanish"
|
|
104
|
+
translate-book-en-de = "manuscripta.translation.shortcuts_lms:translate_manuscript_from_english_to_german"
|
|
105
|
+
translate-book-en-fr = "manuscripta.translation.shortcuts_lms:translate_manuscript_from_english_to_french"
|
|
106
|
+
translate-book-de-en = "manuscripta.translation.shortcuts_lms:translate_manuscript_from_german_to_english"
|
|
107
|
+
|
|
108
|
+
# --- Utilities ---
|
|
109
|
+
full-export = "manuscripta.export.book:main"
|
|
110
|
+
generate-audiobook = "manuscripta.audiobook.generator:main"
|
|
111
|
+
reorder-chapters = "manuscripta.project.reorder:main"
|
|
112
|
+
make-tag-message = "manuscripta.project.tag_message:main"
|
|
113
|
+
bulk-change-ext = "manuscripta.utils.bulk_extension:main"
|
|
114
|
+
convert-images = "manuscripta.images.convert:main"
|
|
115
|
+
generate-images = "manuscripta.images.generate:main"
|
|
116
|
+
generate-images-deepai = "manuscripta.images.generate_deepai:main"
|
|
117
|
+
inject-images = "manuscripta.images.inject:main"
|
|
118
|
+
pandoc-batch = "manuscripta.utils.pandoc_batch:main"
|
|
119
|
+
clean-git-cache = "manuscripta.utils.git_cache:main"
|
|
120
|
+
create-chapters = "manuscripta.project.chapters:main"
|
|
121
|
+
update-metadata-values = "manuscripta.project.metadata:main"
|
|
122
|
+
convert-paths-to-absolute = "manuscripta.paths.to_absolute:main"
|
|
123
|
+
convert-paths-to-relative = "manuscripta.paths.to_relative:main"
|
|
124
|
+
print-version-build = "manuscripta.export.print_version:main"
|
|
125
|
+
strip-links = "manuscripta.markdown.strip_links:main"
|
|
126
|
+
normalize-toc = "manuscripta.markdown.normalize_toc:main"
|
|
127
|
+
|
|
128
|
+
[tool.poetry.dependencies]
|
|
129
|
+
python = ">=3.11,<4.0"
|
|
130
|
+
pandas = "^2.3.2"
|
|
131
|
+
python-dotenv = "^1.1.0"
|
|
132
|
+
requests = "^2.32.5"
|
|
133
|
+
pillow = "^11.2.1"
|
|
134
|
+
pyyaml = "^6.0.2"
|
|
135
|
+
toml = "^0.10.2"
|
|
136
|
+
ftfy = "^6.3.1"
|
|
137
|
+
questionary = "^2.1.1"
|
|
138
|
+
pymupdf = "^1.26.4"
|
|
139
|
+
edge-tts = "^7.2.7"
|
|
140
|
+
ebooklib = "^0.20"
|
|
141
|
+
beautifulsoup4 = "^4.14.3"
|
|
142
|
+
|
|
143
|
+
[tool.poetry.group.dev.dependencies]
|
|
144
|
+
hypothesis = "^6.138.13"
|
|
145
|
+
types-pyyaml = "^6.0.12.20250915"
|
|
146
|
+
types-toml = "^0.10.8.20240310"
|
|
147
|
+
ruff = "^0.14.0"
|
|
148
|
+
black = "^25.9.0"
|
|
149
|
+
codespell = "^2.4.1"
|
|
150
|
+
pre-commit = "^4.3.0"
|
|
151
|
+
types-requests = "^2.32.4.20250913"
|
|
152
|
+
mypy = "^1.11"
|
|
153
|
+
pytest-cov = "^4.1.0"
|
|
154
|
+
|
|
155
|
+
[tool.poetry.group.test.dependencies]
|
|
156
|
+
hypothesis = ">=6,<7"
|
|
157
|
+
pytest = "^8.2"
|
|
158
|
+
pytest-mock = "^3.10.0"
|
|
159
|
+
|
|
160
|
+
[tool.pytest.ini_options]
|
|
161
|
+
testpaths = ["tests"]
|
|
162
|
+
addopts = "--cov=src/manuscripta --cov-report=term-missing"
|
|
163
|
+
pythonpath = ["src"]
|
|
164
|
+
|
|
165
|
+
[build-system]
|
|
166
|
+
requires = ["poetry-core>=2.0.0,<3.0.0"]
|
|
167
|
+
build-backend = "poetry.core.masonry.api"
|
|
168
|
+
|
|
169
|
+
[tool.mypy]
|
|
170
|
+
python_version = "3.11"
|
|
171
|
+
ignore_missing_imports = true
|
|
172
|
+
no_implicit_optional = false
|
|
173
|
+
check_untyped_defs = false
|
|
174
|
+
warn_unused_ignores = false
|
|
175
|
+
allow_redefinition = true
|
|
176
|
+
|
|
177
|
+
[[tool.mypy.overrides]]
|
|
178
|
+
module = "tests.*"
|
|
179
|
+
disallow_untyped_defs = false
|
|
180
|
+
check_untyped_defs = false
|
|
181
|
+
|
|
182
|
+
[tool.ruff]
|
|
183
|
+
fix = true
|
|
184
|
+
unsafe-fixes = true
|
|
185
|
+
|
|
186
|
+
[tool.codespell]
|
|
187
|
+
ignore-words-list = "prozess"
|
|
File without changes
|