quillmark 0.4.0__tar.gz → 0.5.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.
- {quillmark-0.4.0 → quillmark-0.5.0}/Cargo.lock +10 -10
- {quillmark-0.4.0 → quillmark-0.5.0}/Cargo.toml +7 -6
- {quillmark-0.4.0 → quillmark-0.5.0}/PKG-INFO +8 -10
- {quillmark-0.4.0/quillmark-python → quillmark-0.5.0}/README.md +7 -8
- {quillmark-0.4.0 → quillmark-0.5.0}/pyproject.toml +0 -1
- {quillmark-0.4.0 → quillmark-0.5.0}/python/quillmark/__init__.pyi +10 -26
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark/Cargo.toml +1 -1
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-acroform/Cargo.toml +1 -1
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-core/Cargo.toml +1 -1
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-core/src/parse.rs +156 -15
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-fixtures/Cargo.toml +1 -1
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-fixtures/resources/extended_metadata_demo.md +2 -2
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-fixtures/resources/usaf_form_8/usaf_form_8.md +6 -1
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-python/Cargo.toml +1 -1
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-python/IMPLEMENTATION_SUMMARY.md +18 -0
- {quillmark-0.4.0 → quillmark-0.5.0/quillmark-python}/README.md +7 -8
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-python/python/quillmark/__init__.pyi +10 -26
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-python/src/types.rs +0 -54
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-typst/Cargo.toml +1 -1
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-typst/src/filters.rs +0 -2
- {quillmark-0.4.0 → quillmark-0.5.0}/python/quillmark/__init__.py +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/python/quillmark/py.typed +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark/README.md +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark/src/lib.rs +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark/src/orchestration.rs +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-acroform/README.md +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-acroform/src/lib.rs +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-core/README.md +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-core/src/backend.rs +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-core/src/error.rs +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-core/src/lib.rs +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-core/src/quill.rs +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-core/src/templating.rs +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-core/src/types.rs +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-core/src/value.rs +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-fixtures/.npmignore +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-fixtures/README.md +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-fixtures/resources/appreciated_letter/Quill.toml +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-fixtures/resources/appreciated_letter/appreciated_letter.md +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-fixtures/resources/appreciated_letter/glue.typ +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-fixtures/resources/frontmatter_demo.md +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-fixtures/resources/sample.md +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-fixtures/resources/taro/Quill.toml +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-fixtures/resources/taro/glue.typ +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-fixtures/resources/taro/taro.md +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-fixtures/resources/taro.png +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-fixtures/resources/usaf_form_8/Quill.toml +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-fixtures/resources/usaf_form_8/form.pdf +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-fixtures/resources/usaf_memo/.quillignore +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-fixtures/resources/usaf_memo/Quill.toml +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-fixtures/resources/usaf_memo/assets/dow_seal.png +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-fixtures/resources/usaf_memo/glue.typ +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-fixtures/resources/usaf_memo/packages/tonguetoquill-usaf-memo/.gitignore +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-fixtures/resources/usaf_memo/packages/tonguetoquill-usaf-memo/LICENSE +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-fixtures/resources/usaf_memo/packages/tonguetoquill-usaf-memo/fonts/Cinzel/Cinzel-Regular.ttf +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-fixtures/resources/usaf_memo/packages/tonguetoquill-usaf-memo/fonts/Cinzel/LICENSE +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-fixtures/resources/usaf_memo/packages/tonguetoquill-usaf-memo/fonts/CopperplateCC/CopperplateCC-Heavy.otf +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-fixtures/resources/usaf_memo/packages/tonguetoquill-usaf-memo/fonts/CopperplateCC/LICENSE.md +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-fixtures/resources/usaf_memo/packages/tonguetoquill-usaf-memo/fonts/NimbusRomanNo9L/GNU General Public License.txt +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-fixtures/resources/usaf_memo/packages/tonguetoquill-usaf-memo/fonts/NimbusRomanNo9L/NimbusRomNo9L-Med.otf +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-fixtures/resources/usaf_memo/packages/tonguetoquill-usaf-memo/fonts/NimbusRomanNo9L/NimbusRomNo9L-MedIta.otf +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-fixtures/resources/usaf_memo/packages/tonguetoquill-usaf-memo/fonts/NimbusRomanNo9L/NimbusRomNo9L-Reg.otf +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-fixtures/resources/usaf_memo/packages/tonguetoquill-usaf-memo/fonts/NimbusRomanNo9L/NimbusRomNo9L-RegIta.otf +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-fixtures/resources/usaf_memo/packages/tonguetoquill-usaf-memo/src/lib.typ +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-fixtures/resources/usaf_memo/packages/tonguetoquill-usaf-memo/src/utils.typ +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-fixtures/resources/usaf_memo/packages/tonguetoquill-usaf-memo/typst.toml +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-fixtures/resources/usaf_memo/usaf_memo.md +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-fixtures/src/lib.rs +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-python/.gitignore +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-python/examples/basic.py +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-python/examples/batch.py +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-python/examples/workflow_demo.py +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-python/python/quillmark/__init__.py +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-python/python/quillmark/py.typed +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-python/src/enums.rs +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-python/src/errors.rs +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-python/src/lib.rs +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-python/tests/conftest.py +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-python/tests/test_api_requirements.py +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-python/tests/test_engine.py +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-python/tests/test_parse.py +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-python/tests/test_quill.py +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-python/tests/test_render.py +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-python/uv.lock +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-typst/README.md +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-typst/src/compile.rs +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-typst/src/convert.rs +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-typst/src/error_mapping.rs +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-typst/src/lib.rs +0 -0
- {quillmark-0.4.0 → quillmark-0.5.0}/quillmark-typst/src/world.rs +0 -0
@@ -4,9 +4,9 @@ version = 4
|
|
4
4
|
|
5
5
|
[[package]]
|
6
6
|
name = "acroform"
|
7
|
-
version = "0.1.
|
7
|
+
version = "0.1.3"
|
8
8
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
9
|
-
checksum = "
|
9
|
+
checksum = "de7f2f94dd867d55d799a2bae63e4bdce7ea6e1d40ea9e7ba1c07d977942b44d"
|
10
10
|
dependencies = [
|
11
11
|
"lopdf",
|
12
12
|
]
|
@@ -2043,7 +2043,7 @@ dependencies = [
|
|
2043
2043
|
|
2044
2044
|
[[package]]
|
2045
2045
|
name = "quillmark"
|
2046
|
-
version = "0.
|
2046
|
+
version = "0.5.0"
|
2047
2047
|
dependencies = [
|
2048
2048
|
"acroform",
|
2049
2049
|
"anyhow",
|
@@ -2060,7 +2060,7 @@ dependencies = [
|
|
2060
2060
|
|
2061
2061
|
[[package]]
|
2062
2062
|
name = "quillmark-acroform"
|
2063
|
-
version = "0.
|
2063
|
+
version = "0.5.0"
|
2064
2064
|
dependencies = [
|
2065
2065
|
"acroform",
|
2066
2066
|
"minijinja",
|
@@ -2073,7 +2073,7 @@ dependencies = [
|
|
2073
2073
|
|
2074
2074
|
[[package]]
|
2075
2075
|
name = "quillmark-core"
|
2076
|
-
version = "0.
|
2076
|
+
version = "0.5.0"
|
2077
2077
|
dependencies = [
|
2078
2078
|
"anyhow",
|
2079
2079
|
"glob",
|
@@ -2088,7 +2088,7 @@ dependencies = [
|
|
2088
2088
|
|
2089
2089
|
[[package]]
|
2090
2090
|
name = "quillmark-fixtures"
|
2091
|
-
version = "0.
|
2091
|
+
version = "0.5.0"
|
2092
2092
|
dependencies = [
|
2093
2093
|
"quillmark",
|
2094
2094
|
"quillmark-typst",
|
@@ -2096,7 +2096,7 @@ dependencies = [
|
|
2096
2096
|
|
2097
2097
|
[[package]]
|
2098
2098
|
name = "quillmark-fuzz"
|
2099
|
-
version = "0.
|
2099
|
+
version = "0.5.0"
|
2100
2100
|
dependencies = [
|
2101
2101
|
"proptest",
|
2102
2102
|
"quillmark-core",
|
@@ -2105,7 +2105,7 @@ dependencies = [
|
|
2105
2105
|
|
2106
2106
|
[[package]]
|
2107
2107
|
name = "quillmark-python"
|
2108
|
-
version = "0.
|
2108
|
+
version = "0.5.0"
|
2109
2109
|
dependencies = [
|
2110
2110
|
"anyhow",
|
2111
2111
|
"pyo3",
|
@@ -2116,7 +2116,7 @@ dependencies = [
|
|
2116
2116
|
|
2117
2117
|
[[package]]
|
2118
2118
|
name = "quillmark-typst"
|
2119
|
-
version = "0.
|
2119
|
+
version = "0.5.0"
|
2120
2120
|
dependencies = [
|
2121
2121
|
"anyhow",
|
2122
2122
|
"dirs",
|
@@ -2138,7 +2138,7 @@ dependencies = [
|
|
2138
2138
|
|
2139
2139
|
[[package]]
|
2140
2140
|
name = "quillmark-wasm"
|
2141
|
-
version = "0.
|
2141
|
+
version = "0.5.0"
|
2142
2142
|
dependencies = [
|
2143
2143
|
"console_error_panic_hook",
|
2144
2144
|
"getrandom 0.3.4",
|
@@ -11,10 +11,11 @@ default-members = [
|
|
11
11
|
resolver = "2"
|
12
12
|
|
13
13
|
[workspace.package]
|
14
|
-
version = "0.
|
14
|
+
version = "0.5.0"
|
15
15
|
edition = "2021"
|
16
16
|
include = ["src/**", "Cargo.toml", "README*", "LICENSE*"]
|
17
17
|
readme = "README.md"
|
18
|
+
license = "Apache-2.0"
|
18
19
|
|
19
20
|
[workspace.dependencies]
|
20
21
|
# Core dependencies
|
@@ -43,13 +44,13 @@ typst-svg = "0.13.1"
|
|
43
44
|
dirs = "6.0"
|
44
45
|
|
45
46
|
# AcroForm backend dependencies
|
46
|
-
acroform = "0.1.
|
47
|
+
acroform = "0.1.3"
|
47
48
|
|
48
49
|
# Intra-project dependencies
|
49
|
-
quillmark-core = { version = "0.
|
50
|
-
quillmark-typst = { version = "0.
|
51
|
-
quillmark-acroform = { version = "0.
|
52
|
-
quillmark = { version = "0.
|
50
|
+
quillmark-core = { version = "0.5.0", path = "quillmark-core" }
|
51
|
+
quillmark-typst = { version = "0.5.0", path = "quillmark-typst", default-features = false }
|
52
|
+
quillmark-acroform = { version = "0.5.0", path = "quillmark-acroform" }
|
53
|
+
quillmark = { version = "0.5.0", path = "quillmark", default-features = false }
|
53
54
|
|
54
55
|
# Test and dev dependencies
|
55
56
|
tempfile = "~3.23"
|
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.4
|
2
2
|
Name: quillmark
|
3
|
-
Version: 0.
|
3
|
+
Version: 0.5.0
|
4
4
|
Classifier: Development Status :: 4 - Beta
|
5
5
|
Classifier: Intended Audience :: Developers
|
6
6
|
Classifier: License :: OSI Approved :: Apache Software License
|
@@ -12,7 +12,6 @@ Classifier: Programming Language :: Python :: 3.13
|
|
12
12
|
Classifier: Programming Language :: Rust
|
13
13
|
Classifier: Topic :: Text Processing :: Markup
|
14
14
|
Requires-Dist: pytest>=8.0 ; extra == 'dev'
|
15
|
-
Requires-Dist: pytest-cov>=5.0 ; extra == 'dev'
|
16
15
|
Requires-Dist: maturin>=1.7,<2.0 ; extra == 'dev'
|
17
16
|
Provides-Extra: dev
|
18
17
|
Summary: Python bindings for Quillmark - template-first Markdown rendering
|
@@ -118,10 +117,10 @@ Represents parsed Markdown with frontmatter.
|
|
118
117
|
```python
|
119
118
|
parsed = ParsedDocument.from_markdown(markdown)
|
120
119
|
|
121
|
-
parsed.body() # Document body
|
122
|
-
parsed.quill_tag() # QUILL field value (
|
123
|
-
parsed.get_field(key) # Get specific field
|
124
|
-
parsed.fields # All frontmatter fields
|
120
|
+
parsed.body() # Document body (str | None)
|
121
|
+
parsed.quill_tag() # QUILL field value (str | None)
|
122
|
+
parsed.get_field(key) # Get specific field (Any | None)
|
123
|
+
parsed.fields # All frontmatter fields (dict)
|
125
124
|
```
|
126
125
|
|
127
126
|
#### `Workflow` - Rendering Pipeline
|
@@ -143,6 +142,8 @@ workflow.supported_formats # [OutputFormat.PDF, OutputFormat.SVG]
|
|
143
142
|
glue_output = workflow.process_glue_parsed(parsed)
|
144
143
|
```
|
145
144
|
|
145
|
+
**Note**: Dynamic asset and font injection is not currently supported in Python bindings. Assets must be included in the quill bundle.
|
146
|
+
|
146
147
|
#### `RenderResult` - Output Container
|
147
148
|
|
148
149
|
Contains rendered artifacts and diagnostics.
|
@@ -184,10 +185,7 @@ Canonical development flow:
|
|
184
185
|
uv venv
|
185
186
|
|
186
187
|
# Install developer extras (includes maturin, pytest, mypy, ruff)
|
187
|
-
uv pip install -e "[dev]"
|
188
|
-
|
189
|
-
# Build and install (compile Rust + install into venv)
|
190
|
-
uv run python -m maturin develop
|
188
|
+
uv pip install -e ".[dev]"
|
191
189
|
|
192
190
|
# Run tests
|
193
191
|
uv run pytest
|
@@ -92,10 +92,10 @@ Represents parsed Markdown with frontmatter.
|
|
92
92
|
```python
|
93
93
|
parsed = ParsedDocument.from_markdown(markdown)
|
94
94
|
|
95
|
-
parsed.body() # Document body
|
96
|
-
parsed.quill_tag() # QUILL field value (
|
97
|
-
parsed.get_field(key) # Get specific field
|
98
|
-
parsed.fields # All frontmatter fields
|
95
|
+
parsed.body() # Document body (str | None)
|
96
|
+
parsed.quill_tag() # QUILL field value (str | None)
|
97
|
+
parsed.get_field(key) # Get specific field (Any | None)
|
98
|
+
parsed.fields # All frontmatter fields (dict)
|
99
99
|
```
|
100
100
|
|
101
101
|
#### `Workflow` - Rendering Pipeline
|
@@ -117,6 +117,8 @@ workflow.supported_formats # [OutputFormat.PDF, OutputFormat.SVG]
|
|
117
117
|
glue_output = workflow.process_glue_parsed(parsed)
|
118
118
|
```
|
119
119
|
|
120
|
+
**Note**: Dynamic asset and font injection is not currently supported in Python bindings. Assets must be included in the quill bundle.
|
121
|
+
|
120
122
|
#### `RenderResult` - Output Container
|
121
123
|
|
122
124
|
Contains rendered artifacts and diagnostics.
|
@@ -158,10 +160,7 @@ Canonical development flow:
|
|
158
160
|
uv venv
|
159
161
|
|
160
162
|
# Install developer extras (includes maturin, pytest, mypy, ruff)
|
161
|
-
uv pip install -e "[dev]"
|
162
|
-
|
163
|
-
# Build and install (compile Rust + install into venv)
|
164
|
-
uv run python -m maturin develop
|
163
|
+
uv pip install -e ".[dev]"
|
165
164
|
|
166
165
|
# Run tests
|
167
166
|
uv run pytest
|
@@ -78,7 +78,11 @@ class Quillmark:
|
|
78
78
|
"""Get list of registered quill names."""
|
79
79
|
|
80
80
|
class Workflow:
|
81
|
-
"""Sealed workflow for executing the render pipeline.
|
81
|
+
"""Sealed workflow for executing the render pipeline.
|
82
|
+
|
83
|
+
Note: Dynamic asset and font injection is not currently supported in Python bindings.
|
84
|
+
Assets must be included in the quill bundle.
|
85
|
+
"""
|
82
86
|
|
83
87
|
def render(
|
84
88
|
self,
|
@@ -112,38 +116,17 @@ class Workflow:
|
|
112
116
|
def process_glue_parsed(self, parsed: ParsedDocument) -> str:
|
113
117
|
"""Process parsed document through glue template."""
|
114
118
|
|
115
|
-
|
116
|
-
"""Add dynamic asset (returns new workflow instance)."""
|
117
|
-
|
118
|
-
def with_assets(self, assets: dict[str, bytes]) -> Workflow:
|
119
|
-
"""Add multiple dynamic assets."""
|
120
|
-
|
121
|
-
def clear_assets(self) -> Workflow:
|
122
|
-
"""Remove all dynamic assets."""
|
123
|
-
|
124
|
-
def with_font(self, filename: str, contents: bytes) -> Workflow:
|
125
|
-
"""Add dynamic font."""
|
126
|
-
|
127
|
-
def with_fonts(self, fonts: dict[str, bytes]) -> Workflow:
|
128
|
-
"""Add multiple dynamic fonts."""
|
129
|
-
|
130
|
-
def clear_fonts(self) -> Workflow:
|
131
|
-
"""Remove all dynamic fonts."""
|
132
|
-
|
119
|
+
@property
|
133
120
|
def backend_id(self) -> str:
|
134
121
|
"""Get backend identifier."""
|
135
122
|
|
123
|
+
@property
|
136
124
|
def supported_formats(self) -> list[OutputFormat]:
|
137
125
|
"""Get supported output formats."""
|
138
126
|
|
127
|
+
@property
|
139
128
|
def quill_name(self) -> str:
|
140
129
|
"""Get quill name."""
|
141
|
-
|
142
|
-
def dynamic_asset_names(self) -> list[str]:
|
143
|
-
"""Get list of dynamic asset filenames."""
|
144
|
-
|
145
|
-
def dynamic_font_names(self) -> list[str]:
|
146
|
-
"""Get list of dynamic font filenames."""
|
147
130
|
|
148
131
|
class Quill:
|
149
132
|
"""Template bundle containing glue templates and assets."""
|
@@ -191,12 +174,13 @@ class ParsedDocument:
|
|
191
174
|
ParseError: If YAML frontmatter is invalid
|
192
175
|
"""
|
193
176
|
|
194
|
-
def body(self) -> str:
|
177
|
+
def body(self) -> str | None:
|
195
178
|
"""Get document body content."""
|
196
179
|
|
197
180
|
def get_field(self, key: str) -> Any | None:
|
198
181
|
"""Get frontmatter field value."""
|
199
182
|
|
183
|
+
@property
|
200
184
|
def fields(self) -> dict[str, Any]:
|
201
185
|
"""Get all frontmatter fields."""
|
202
186
|
|
@@ -5,7 +5,7 @@ edition.workspace = true
|
|
5
5
|
include.workspace = true
|
6
6
|
readme = "README.md"
|
7
7
|
description = "Quillmark engine API"
|
8
|
-
license =
|
8
|
+
license.workspace = true
|
9
9
|
documentation = "https://docs.rs/quillmark"
|
10
10
|
homepage = "https://github.com/nibsbin/quillmark"
|
11
11
|
repository = "https://github.com/nibsbin/quillmark"
|
@@ -5,7 +5,7 @@ edition.workspace = true
|
|
5
5
|
include.workspace = true
|
6
6
|
readme = "README.md"
|
7
7
|
description = "AcroForm backend for Quillmark"
|
8
|
-
license =
|
8
|
+
license.workspace = true
|
9
9
|
documentation = "https://docs.rs/quillmark-acroform"
|
10
10
|
homepage = "https://github.com/nibsbin/quillmark"
|
11
11
|
repository = "https://github.com/nibsbin/quillmark"
|
@@ -5,7 +5,7 @@ edition.workspace = true
|
|
5
5
|
include.workspace = true
|
6
6
|
readme = "README.md"
|
7
7
|
description = "Core types and functionality for Quillmark"
|
8
|
-
license =
|
8
|
+
license.workspace = true
|
9
9
|
documentation = "https://docs.rs/quillmark-core"
|
10
10
|
homepage = "https://github.com/nibsbin/quillmark"
|
11
11
|
repository = "https://github.com/nibsbin/quillmark"
|
@@ -191,7 +191,15 @@ fn find_metadata_blocks(
|
|
191
191
|
let abs_pos = pos + delimiter_pos;
|
192
192
|
let content_start = abs_pos + delimiter_len; // After "---\n" or "---\r\n"
|
193
193
|
|
194
|
-
// Check if
|
194
|
+
// Check if this --- is a horizontal rule (blank lines above AND below)
|
195
|
+
let preceded_by_blank = if abs_pos > 0 {
|
196
|
+
// Check if there's a blank line before the ---
|
197
|
+
let before = &markdown[..abs_pos];
|
198
|
+
before.ends_with("\n\n") || before.ends_with("\r\n\r\n")
|
199
|
+
} else {
|
200
|
+
false
|
201
|
+
};
|
202
|
+
|
195
203
|
let followed_by_blank = if content_start < markdown.len() {
|
196
204
|
markdown[content_start..].starts_with('\n')
|
197
205
|
|| markdown[content_start..].starts_with("\r\n")
|
@@ -199,13 +207,23 @@ fn find_metadata_blocks(
|
|
199
207
|
false
|
200
208
|
};
|
201
209
|
|
202
|
-
|
210
|
+
// Horizontal rule: blank lines both above and below
|
211
|
+
if preceded_by_blank && followed_by_blank {
|
203
212
|
// This is a horizontal rule in the body, skip it
|
204
213
|
pos = abs_pos + 3; // Skip past "---"
|
205
214
|
continue;
|
206
215
|
}
|
207
216
|
|
208
|
-
//
|
217
|
+
// Check if followed by non-blank line (or if we're at document start)
|
218
|
+
// This starts a metadata block
|
219
|
+
if followed_by_blank {
|
220
|
+
// --- followed by blank line but NOT preceded by blank line
|
221
|
+
// This is NOT a metadata block opening, skip it
|
222
|
+
pos = abs_pos + 3;
|
223
|
+
continue;
|
224
|
+
}
|
225
|
+
|
226
|
+
// Found potential metadata block opening (followed by non-blank line)
|
209
227
|
// Look for closing "\n---\n" or "\r\n---\r\n" etc., OR "\n---" / "\r\n---" at end of document
|
210
228
|
let rest = &markdown[content_start..];
|
211
229
|
|
@@ -252,18 +270,6 @@ fn find_metadata_blocks(
|
|
252
270
|
.into());
|
253
271
|
}
|
254
272
|
|
255
|
-
// Check if the block is contiguous (no blank lines in the YAML content)
|
256
|
-
if content.contains("\n\n") || content.contains("\r\n\r\n") {
|
257
|
-
// Not a contiguous block
|
258
|
-
if abs_pos == 0 {
|
259
|
-
// Started at beginning but has blank lines - this is an error
|
260
|
-
return Err("Frontmatter started but not closed with ---".into());
|
261
|
-
}
|
262
|
-
// Otherwise treat as horizontal rule in body
|
263
|
-
pos = abs_pos + 3;
|
264
|
-
continue;
|
265
|
-
}
|
266
|
-
|
267
273
|
// Parse YAML content to check for reserved keys (QUILL, SCOPE)
|
268
274
|
// First, try to parse as YAML
|
269
275
|
let (tag, quill_name, yaml_content) = if !content.is_empty() {
|
@@ -1314,6 +1320,141 @@ SCOPE: items
|
|
1314
1320
|
.to_string()
|
1315
1321
|
.contains("Cannot specify both QUILL and SCOPE"));
|
1316
1322
|
}
|
1323
|
+
|
1324
|
+
#[test]
|
1325
|
+
fn test_blank_lines_in_frontmatter() {
|
1326
|
+
// New parsing standard: blank lines are allowed within YAML blocks
|
1327
|
+
let markdown = r#"---
|
1328
|
+
title: Test Document
|
1329
|
+
author: Test Author
|
1330
|
+
|
1331
|
+
description: This has a blank line above it
|
1332
|
+
tags:
|
1333
|
+
- one
|
1334
|
+
- two
|
1335
|
+
---
|
1336
|
+
|
1337
|
+
# Hello World
|
1338
|
+
|
1339
|
+
This is the body."#;
|
1340
|
+
|
1341
|
+
let doc = decompose(markdown).unwrap();
|
1342
|
+
|
1343
|
+
assert_eq!(doc.body(), Some("\n# Hello World\n\nThis is the body."));
|
1344
|
+
assert_eq!(
|
1345
|
+
doc.get_field("title").unwrap().as_str().unwrap(),
|
1346
|
+
"Test Document"
|
1347
|
+
);
|
1348
|
+
assert_eq!(
|
1349
|
+
doc.get_field("author").unwrap().as_str().unwrap(),
|
1350
|
+
"Test Author"
|
1351
|
+
);
|
1352
|
+
assert_eq!(
|
1353
|
+
doc.get_field("description").unwrap().as_str().unwrap(),
|
1354
|
+
"This has a blank line above it"
|
1355
|
+
);
|
1356
|
+
|
1357
|
+
let tags = doc.get_field("tags").unwrap().as_sequence().unwrap();
|
1358
|
+
assert_eq!(tags.len(), 2);
|
1359
|
+
}
|
1360
|
+
|
1361
|
+
#[test]
|
1362
|
+
fn test_blank_lines_in_scope_blocks() {
|
1363
|
+
// Blank lines should be allowed in SCOPE blocks too
|
1364
|
+
let markdown = r#"---
|
1365
|
+
SCOPE: items
|
1366
|
+
name: Item 1
|
1367
|
+
|
1368
|
+
price: 19.99
|
1369
|
+
|
1370
|
+
tags:
|
1371
|
+
- electronics
|
1372
|
+
- gadgets
|
1373
|
+
---
|
1374
|
+
|
1375
|
+
Body of item 1."#;
|
1376
|
+
|
1377
|
+
let doc = decompose(markdown).unwrap();
|
1378
|
+
|
1379
|
+
let items = doc.get_field("items").unwrap().as_sequence().unwrap();
|
1380
|
+
assert_eq!(items.len(), 1);
|
1381
|
+
|
1382
|
+
let item = items[0].as_object().unwrap();
|
1383
|
+
assert_eq!(item.get("name").unwrap().as_str().unwrap(), "Item 1");
|
1384
|
+
assert_eq!(item.get("price").unwrap().as_f64().unwrap(), 19.99);
|
1385
|
+
|
1386
|
+
let tags = item.get("tags").unwrap().as_array().unwrap();
|
1387
|
+
assert_eq!(tags.len(), 2);
|
1388
|
+
}
|
1389
|
+
|
1390
|
+
#[test]
|
1391
|
+
fn test_horizontal_rule_with_blank_lines_above_and_below() {
|
1392
|
+
// Horizontal rule: blank lines both above AND below the ---
|
1393
|
+
let markdown = r#"---
|
1394
|
+
title: Test
|
1395
|
+
---
|
1396
|
+
|
1397
|
+
First paragraph.
|
1398
|
+
|
1399
|
+
---
|
1400
|
+
|
1401
|
+
Second paragraph."#;
|
1402
|
+
|
1403
|
+
let doc = decompose(markdown).unwrap();
|
1404
|
+
|
1405
|
+
assert_eq!(doc.get_field("title").unwrap().as_str().unwrap(), "Test");
|
1406
|
+
|
1407
|
+
// The body should contain the horizontal rule (---) as part of the content
|
1408
|
+
let body = doc.body().unwrap();
|
1409
|
+
assert!(body.contains("First paragraph."));
|
1410
|
+
assert!(body.contains("---"));
|
1411
|
+
assert!(body.contains("Second paragraph."));
|
1412
|
+
}
|
1413
|
+
|
1414
|
+
#[test]
|
1415
|
+
fn test_horizontal_rule_not_preceded_by_blank() {
|
1416
|
+
// --- not preceded by blank line but followed by blank line is NOT a horizontal rule
|
1417
|
+
// It's also NOT a valid metadata block opening (since it's followed by blank)
|
1418
|
+
let markdown = r#"---
|
1419
|
+
title: Test
|
1420
|
+
---
|
1421
|
+
|
1422
|
+
First paragraph.
|
1423
|
+
---
|
1424
|
+
|
1425
|
+
Second paragraph."#;
|
1426
|
+
|
1427
|
+
let doc = decompose(markdown).unwrap();
|
1428
|
+
|
1429
|
+
let body = doc.body().unwrap();
|
1430
|
+
// The second --- should be in the body as text (not a horizontal rule since no blank above)
|
1431
|
+
assert!(body.contains("---"));
|
1432
|
+
}
|
1433
|
+
|
1434
|
+
#[test]
|
1435
|
+
fn test_multiple_blank_lines_in_yaml() {
|
1436
|
+
// Multiple blank lines should also be allowed
|
1437
|
+
let markdown = r#"---
|
1438
|
+
title: Test
|
1439
|
+
|
1440
|
+
|
1441
|
+
author: John Doe
|
1442
|
+
|
1443
|
+
|
1444
|
+
version: 1.0
|
1445
|
+
---
|
1446
|
+
|
1447
|
+
Body content."#;
|
1448
|
+
|
1449
|
+
let doc = decompose(markdown).unwrap();
|
1450
|
+
|
1451
|
+
assert_eq!(doc.get_field("title").unwrap().as_str().unwrap(), "Test");
|
1452
|
+
assert_eq!(
|
1453
|
+
doc.get_field("author").unwrap().as_str().unwrap(),
|
1454
|
+
"John Doe"
|
1455
|
+
);
|
1456
|
+
assert_eq!(doc.get_field("version").unwrap().as_f64().unwrap(), 1.0);
|
1457
|
+
}
|
1317
1458
|
}
|
1318
1459
|
#[cfg(test)]
|
1319
1460
|
mod demo_file_test {
|
@@ -3,7 +3,7 @@ name = "quillmark-fixtures"
|
|
3
3
|
version.workspace = true
|
4
4
|
edition.workspace = true
|
5
5
|
description = "Test fixtures and utilities for Quillmark"
|
6
|
-
license =
|
6
|
+
license.workspace = true
|
7
7
|
publish = false # Don't publish test fixtures to crates.io
|
8
8
|
readme = "README.md"
|
9
9
|
|
@@ -55,7 +55,7 @@ Ideal for content-heavy sites where each item needs its own metadata (price, cat
|
|
55
55
|
## Technical Details
|
56
56
|
|
57
57
|
- **Tag pattern**: `[a-z_][a-z0-9_]*`
|
58
|
-
- **
|
59
|
-
- **Horizontal rules**:
|
58
|
+
- **Blank lines**: Allowed within metadata blocks
|
59
|
+
- **Horizontal rules**: `---` with blank lines both above and below
|
60
60
|
- **Reserved names**: Cannot use `body` as tag directive
|
61
61
|
- **Collections**: Same tag name creates array of objects
|
@@ -83,7 +83,12 @@ comments:
|
|
83
83
|
#exceptionally_qualified:
|
84
84
|
examiner_remarks:
|
85
85
|
mission_description: Delivering packages to all points in the universe.
|
86
|
-
discrepancies:
|
86
|
+
discrepancies: |
|
87
|
+
Fry, we need to talk about your performance. Again. Your delivery times are consistently late - and I mean *consistently*. Every single package arrives after the guaranteed delivery window, which means I have to spend half my day apologizing to angry customers while you stand there with that vacant expression asking if we can stop for pizza. This isn't a joyride through the galaxy. This is a business, and you're single-handedly destroying our reputation one tardy delivery at a time.
|
88
|
+
|
89
|
+
And while we're on the subject, you smell like burning hair. I don't know what you're doing in your spare time, and honestly I don't want to know, but it's affecting the whole crew. Bender actually complained about a smell, Fry. *Bender*. A robot who stores week-old sandwiches in his chest cavity said you're making the ship uninhabitable. Whatever you're burning, stop burning it. Or at least shower afterwards.
|
90
|
+
|
91
|
+
Look, I'm sure you did your best, which is to say you failed miserably. I've tried to be patient. I've tried to work with your... limitations. But at this point, maybe you should stick to the one thing you're good at - nothing. Actually, scratch that. You're not even good at nothing. You somehow manage to make nothing worse just by being near it.
|
87
92
|
addi_training: You need to learn how to not be you
|
88
93
|
addi_comments: None
|
89
94
|
reviewing_remarks: None
|
@@ -129,6 +129,7 @@ As specified, the following are explicitly NOT exposed:
|
|
129
129
|
- Low-level Workflow internals
|
130
130
|
- Backend implementation details
|
131
131
|
- Custom backend registration from Python
|
132
|
+
- Dynamic asset/font injection (not yet implemented in Python bindings)
|
132
133
|
|
133
134
|
## Usage Example
|
134
135
|
|
@@ -168,6 +169,23 @@ result.artifacts[0].save("output.pdf")
|
|
168
169
|
- Maintains compatibility with existing Rust API design
|
169
170
|
- Python 3.10+ required (abi3 support)
|
170
171
|
|
172
|
+
## Breaking Changes (v0.4.1)
|
173
|
+
|
174
|
+
The following breaking changes were made to remove legacy code and ensure consistency:
|
175
|
+
|
176
|
+
1. **Removed unsupported builder methods** - The following methods have been removed from `Workflow`:
|
177
|
+
- `with_asset()`, `with_assets()`, `clear_assets()`
|
178
|
+
- `with_font()`, `with_fonts()`, `clear_fonts()`
|
179
|
+
- `dynamic_asset_names()`, `dynamic_font_names()`
|
180
|
+
|
181
|
+
These methods were never properly implemented and always threw errors. Dynamic assets/fonts are not yet supported in Python bindings.
|
182
|
+
|
183
|
+
2. **Removed redundant getter** - `RenderResult.output_format` has been removed. Use `artifact.output_format` on individual artifacts instead.
|
184
|
+
|
185
|
+
3. **Type stub corrections** - Fixed type declarations to match actual implementation:
|
186
|
+
- `ParsedDocument.body()` now correctly returns `str | None` (was incorrectly documented as `str`)
|
187
|
+
- Various getters now correctly declared as properties in type stubs
|
188
|
+
|
171
189
|
## Documentation
|
172
190
|
|
173
191
|
- README.md provides comprehensive API documentation
|
@@ -92,10 +92,10 @@ Represents parsed Markdown with frontmatter.
|
|
92
92
|
```python
|
93
93
|
parsed = ParsedDocument.from_markdown(markdown)
|
94
94
|
|
95
|
-
parsed.body() # Document body
|
96
|
-
parsed.quill_tag() # QUILL field value (
|
97
|
-
parsed.get_field(key) # Get specific field
|
98
|
-
parsed.fields # All frontmatter fields
|
95
|
+
parsed.body() # Document body (str | None)
|
96
|
+
parsed.quill_tag() # QUILL field value (str | None)
|
97
|
+
parsed.get_field(key) # Get specific field (Any | None)
|
98
|
+
parsed.fields # All frontmatter fields (dict)
|
99
99
|
```
|
100
100
|
|
101
101
|
#### `Workflow` - Rendering Pipeline
|
@@ -117,6 +117,8 @@ workflow.supported_formats # [OutputFormat.PDF, OutputFormat.SVG]
|
|
117
117
|
glue_output = workflow.process_glue_parsed(parsed)
|
118
118
|
```
|
119
119
|
|
120
|
+
**Note**: Dynamic asset and font injection is not currently supported in Python bindings. Assets must be included in the quill bundle.
|
121
|
+
|
120
122
|
#### `RenderResult` - Output Container
|
121
123
|
|
122
124
|
Contains rendered artifacts and diagnostics.
|
@@ -158,10 +160,7 @@ Canonical development flow:
|
|
158
160
|
uv venv
|
159
161
|
|
160
162
|
# Install developer extras (includes maturin, pytest, mypy, ruff)
|
161
|
-
uv pip install -e "[dev]"
|
162
|
-
|
163
|
-
# Build and install (compile Rust + install into venv)
|
164
|
-
uv run python -m maturin develop
|
163
|
+
uv pip install -e ".[dev]"
|
165
164
|
|
166
165
|
# Run tests
|
167
166
|
uv run pytest
|
@@ -78,7 +78,11 @@ class Quillmark:
|
|
78
78
|
"""Get list of registered quill names."""
|
79
79
|
|
80
80
|
class Workflow:
|
81
|
-
"""Sealed workflow for executing the render pipeline.
|
81
|
+
"""Sealed workflow for executing the render pipeline.
|
82
|
+
|
83
|
+
Note: Dynamic asset and font injection is not currently supported in Python bindings.
|
84
|
+
Assets must be included in the quill bundle.
|
85
|
+
"""
|
82
86
|
|
83
87
|
def render(
|
84
88
|
self,
|
@@ -112,38 +116,17 @@ class Workflow:
|
|
112
116
|
def process_glue_parsed(self, parsed: ParsedDocument) -> str:
|
113
117
|
"""Process parsed document through glue template."""
|
114
118
|
|
115
|
-
|
116
|
-
"""Add dynamic asset (returns new workflow instance)."""
|
117
|
-
|
118
|
-
def with_assets(self, assets: dict[str, bytes]) -> Workflow:
|
119
|
-
"""Add multiple dynamic assets."""
|
120
|
-
|
121
|
-
def clear_assets(self) -> Workflow:
|
122
|
-
"""Remove all dynamic assets."""
|
123
|
-
|
124
|
-
def with_font(self, filename: str, contents: bytes) -> Workflow:
|
125
|
-
"""Add dynamic font."""
|
126
|
-
|
127
|
-
def with_fonts(self, fonts: dict[str, bytes]) -> Workflow:
|
128
|
-
"""Add multiple dynamic fonts."""
|
129
|
-
|
130
|
-
def clear_fonts(self) -> Workflow:
|
131
|
-
"""Remove all dynamic fonts."""
|
132
|
-
|
119
|
+
@property
|
133
120
|
def backend_id(self) -> str:
|
134
121
|
"""Get backend identifier."""
|
135
122
|
|
123
|
+
@property
|
136
124
|
def supported_formats(self) -> list[OutputFormat]:
|
137
125
|
"""Get supported output formats."""
|
138
126
|
|
127
|
+
@property
|
139
128
|
def quill_name(self) -> str:
|
140
129
|
"""Get quill name."""
|
141
|
-
|
142
|
-
def dynamic_asset_names(self) -> list[str]:
|
143
|
-
"""Get list of dynamic asset filenames."""
|
144
|
-
|
145
|
-
def dynamic_font_names(self) -> list[str]:
|
146
|
-
"""Get list of dynamic font filenames."""
|
147
130
|
|
148
131
|
class Quill:
|
149
132
|
"""Template bundle containing glue templates and assets."""
|
@@ -191,12 +174,13 @@ class ParsedDocument:
|
|
191
174
|
ParseError: If YAML frontmatter is invalid
|
192
175
|
"""
|
193
176
|
|
194
|
-
def body(self) -> str:
|
177
|
+
def body(self) -> str | None:
|
195
178
|
"""Get document body content."""
|
196
179
|
|
197
180
|
def get_field(self, key: str) -> Any | None:
|
198
181
|
"""Get frontmatter field value."""
|
199
182
|
|
183
|
+
@property
|
200
184
|
def fields(self) -> dict[str, Any]:
|
201
185
|
"""Get all frontmatter fields."""
|
202
186
|
|
@@ -8,7 +8,6 @@ use pyo3::{Bound, PyAny}; // Bound, PyAny
|
|
8
8
|
use quillmark::{
|
9
9
|
Diagnostic, Location, OutputFormat, ParsedDocument, Quill, Quillmark, RenderResult, Workflow,
|
10
10
|
};
|
11
|
-
use std::collections::HashMap;
|
12
11
|
use std::path::PathBuf;
|
13
12
|
|
14
13
|
use crate::enums::{PyOutputFormat, PySeverity};
|
@@ -122,42 +121,6 @@ impl PyWorkflow {
|
|
122
121
|
.map_err(convert_render_error)
|
123
122
|
}
|
124
123
|
|
125
|
-
fn with_asset(&self, _filename: String, _contents: Vec<u8>) -> PyResult<()> {
|
126
|
-
Err(PyErr::new::<crate::errors::QuillmarkError, _>(
|
127
|
-
"Builder pattern methods (with_asset, with_font, etc.) are not yet supported in Python bindings. \
|
128
|
-
Create a new workflow instead.",
|
129
|
-
))
|
130
|
-
}
|
131
|
-
|
132
|
-
fn with_assets(&self, _assets: HashMap<String, Vec<u8>>) -> PyResult<()> {
|
133
|
-
Err(PyErr::new::<crate::errors::QuillmarkError, _>(
|
134
|
-
"Builder pattern methods are not yet supported in Python bindings",
|
135
|
-
))
|
136
|
-
}
|
137
|
-
|
138
|
-
fn clear_assets(&self) -> PyResult<()> {
|
139
|
-
Err(PyErr::new::<crate::errors::QuillmarkError, _>(
|
140
|
-
"Builder pattern methods are not yet supported in Python bindings",
|
141
|
-
))
|
142
|
-
}
|
143
|
-
|
144
|
-
fn with_font(&self, _filename: String, _contents: Vec<u8>) -> PyResult<()> {
|
145
|
-
Err(PyErr::new::<crate::errors::QuillmarkError, _>(
|
146
|
-
"Builder pattern methods are not yet supported in Python bindings",
|
147
|
-
))
|
148
|
-
}
|
149
|
-
|
150
|
-
fn with_fonts(&self, _fonts: HashMap<String, Vec<u8>>) -> PyResult<()> {
|
151
|
-
Err(PyErr::new::<crate::errors::QuillmarkError, _>(
|
152
|
-
"Builder pattern methods are not yet supported in Python bindings",
|
153
|
-
))
|
154
|
-
}
|
155
|
-
|
156
|
-
fn clear_fonts(&self) -> PyResult<()> {
|
157
|
-
Err(PyErr::new::<crate::errors::QuillmarkError, _>(
|
158
|
-
"Builder pattern methods are not yet supported in Python bindings",
|
159
|
-
))
|
160
|
-
}
|
161
124
|
#[getter]
|
162
125
|
fn backend_id(&self) -> &str {
|
163
126
|
self.inner.backend_id()
|
@@ -176,14 +139,6 @@ impl PyWorkflow {
|
|
176
139
|
fn quill_name(&self) -> &str {
|
177
140
|
self.inner.quill_name()
|
178
141
|
}
|
179
|
-
|
180
|
-
fn dynamic_asset_names(&self) -> Vec<String> {
|
181
|
-
self.inner.dynamic_asset_names()
|
182
|
-
}
|
183
|
-
|
184
|
-
fn dynamic_font_names(&self) -> Vec<String> {
|
185
|
-
self.inner.dynamic_font_names()
|
186
|
-
}
|
187
142
|
}
|
188
143
|
|
189
144
|
// Quill wrapper
|
@@ -339,15 +294,6 @@ impl PyRenderResult {
|
|
339
294
|
.map(|d| PyDiagnostic { inner: d.clone() })
|
340
295
|
.collect()
|
341
296
|
}
|
342
|
-
|
343
|
-
#[getter]
|
344
|
-
fn output_format(&self) -> &str {
|
345
|
-
match self.inner.output_format {
|
346
|
-
OutputFormat::Pdf => "pdf",
|
347
|
-
OutputFormat::Svg => "svg",
|
348
|
-
OutputFormat::Txt => "txt",
|
349
|
-
}
|
350
|
-
}
|
351
297
|
}
|
352
298
|
|
353
299
|
// Artifact wrapper
|
@@ -5,7 +5,7 @@ edition.workspace = true
|
|
5
5
|
include.workspace = true
|
6
6
|
readme = "README.md"
|
7
7
|
description = "Typst backend for Quillmark"
|
8
|
-
license =
|
8
|
+
license.workspace = true
|
9
9
|
documentation = "https://docs.rs/quillmark-typst"
|
10
10
|
homepage = "https://github.com/nibsbin/quillmark"
|
11
11
|
repository = "https://github.com/nibsbin/quillmark"
|
@@ -107,8 +107,6 @@ pub fn date_filter(_state: &State, mut value: Value, kwargs: Kwargs) -> Result<V
|
|
107
107
|
// Use js-sys to get the current UTC date string on wasm targets.
|
108
108
|
// We format as YYYY-MM-DD to match Iso8601::DEFAULT parsing expectations.
|
109
109
|
use js_sys::Date;
|
110
|
-
use wasm_bindgen::JsValue;
|
111
|
-
|
112
110
|
let d = Date::new_0();
|
113
111
|
let year = d.get_utc_full_year() as i32;
|
114
112
|
let month = (d.get_utc_month() as u8).saturating_add(1);
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{quillmark-0.4.0 → quillmark-0.5.0}/quillmark-fixtures/resources/appreciated_letter/Quill.toml
RENAMED
File without changes
|
File without changes
|
{quillmark-0.4.0 → quillmark-0.5.0}/quillmark-fixtures/resources/appreciated_letter/glue.typ
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{quillmark-0.4.0 → quillmark-0.5.0}/quillmark-fixtures/resources/usaf_memo/assets/dow_seal.png
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|