@tonguetoquill/collection 0.2.3 → 0.2.5-beta.1
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.
- package/LICENSE +201 -201
- package/README.md +39 -39
- package/index.d.ts +2 -2
- package/index.js +8 -8
- package/package.json +41 -41
- package/quills/af4141/0.1.0/Quill.yaml +88 -88
- package/quills/af4141/0.1.0/design/TASK.md +19 -19
- package/quills/af4141/0.1.0/example.md +35 -35
- package/quills/af4141/0.1.0/packages/typst-af4141/FIELDS.json +3169 -3169
- package/quills/af4141/0.1.0/packages/typst-af4141/form.typ +538 -538
- package/quills/af4141/0.1.0/packages/typst-af4141/lib.typ +227 -227
- package/quills/af4141/0.1.0/packages/typst-af4141/typst.toml +7 -7
- package/quills/af4141/0.1.0/plate.typ +48 -48
- package/quills/classic_resume/0.1.0/Quill.yaml +118 -118
- package/quills/classic_resume/0.1.0/example.md +232 -232
- package/quills/classic_resume/0.1.0/packages/ttq-classic-resume/LICENSE +21 -21
- package/quills/classic_resume/0.1.0/packages/ttq-classic-resume/README.md +38 -38
- package/quills/classic_resume/0.1.0/packages/ttq-classic-resume/src/components.typ +184 -184
- package/quills/classic_resume/0.1.0/packages/ttq-classic-resume/src/layout.typ +42 -42
- package/quills/classic_resume/0.1.0/packages/ttq-classic-resume/src/lib.typ +5 -5
- package/quills/classic_resume/0.1.0/packages/ttq-classic-resume/typst.toml +26 -26
- package/quills/classic_resume/0.1.0/plate.typ +44 -44
- package/quills/cmu_letter/0.1.0/.quillignore +30 -30
- package/quills/cmu_letter/0.1.0/Quill.yaml +64 -64
- package/quills/cmu_letter/0.1.0/assets/cmu-wordmark.svg +174 -174
- package/quills/cmu_letter/0.1.0/example.md +30 -30
- package/quills/cmu_letter/0.1.0/packages/tonguetoquill-cmu-letter/LICENSE +21 -21
- package/quills/cmu_letter/0.1.0/packages/tonguetoquill-cmu-letter/fonts/README.txt +100 -100
- package/quills/cmu_letter/0.1.0/packages/tonguetoquill-cmu-letter/src/backmatter.typ +13 -13
- package/quills/cmu_letter/0.1.0/packages/tonguetoquill-cmu-letter/src/config.typ +39 -39
- package/quills/cmu_letter/0.1.0/packages/tonguetoquill-cmu-letter/src/frontmatter.typ +72 -72
- package/quills/cmu_letter/0.1.0/packages/tonguetoquill-cmu-letter/src/lib.typ +47 -47
- package/quills/cmu_letter/0.1.0/packages/tonguetoquill-cmu-letter/src/mainmatter.typ +42 -42
- package/quills/cmu_letter/0.1.0/packages/tonguetoquill-cmu-letter/src/primitives.typ +70 -70
- package/quills/cmu_letter/0.1.0/packages/tonguetoquill-cmu-letter/src/utils.typ +85 -85
- package/quills/cmu_letter/0.1.0/packages/tonguetoquill-cmu-letter/typst.toml +17 -17
- package/quills/cmu_letter/0.1.0/plate.typ +19 -19
- package/quills/daf4392/0.1.0/Quill.yaml +110 -0
- package/quills/daf4392/0.1.0/assets/arimo-v35-latin-700.ttf +0 -0
- package/quills/daf4392/0.1.0/assets/arimo-v35-latin-700italic.ttf +0 -0
- package/quills/daf4392/0.1.0/assets/arimo-v35-latin-italic.ttf +0 -0
- package/quills/daf4392/0.1.0/assets/arimo-v35-latin-regular.ttf +0 -0
- package/quills/daf4392/0.1.0/assets/page1.png +0 -0
- package/quills/daf4392/0.1.0/example.md +33 -0
- package/quills/daf4392/0.1.0/packages/daf4392page2_pkg/FIELDS.json +9 -0
- package/quills/daf4392/0.1.0/packages/daf4392page2_pkg/form.typ +14 -0
- package/quills/daf4392/0.1.0/packages/daf4392page2_pkg/lib.typ +227 -0
- package/quills/daf4392/0.1.0/packages/daf4392page2_pkg/out/debug.typ +4 -0
- package/quills/daf4392/0.1.0/packages/daf4392page2_pkg/out/example.typ +4 -0
- package/quills/daf4392/0.1.0/packages/daf4392page2_pkg/page1.png +0 -0
- package/quills/daf4392/0.1.0/packages/daf4392page2_pkg/typst.toml +7 -0
- package/quills/daf4392/0.1.0/plate.typ +60 -0
- package/quills/taro/0.1.0/Quill.yaml +29 -29
- package/quills/taro/0.1.0/example.md +26 -26
- package/quills/taro/0.1.0/plate.typ +31 -31
- package/quills/usaf_memo/0.1.0/.quillignore +30 -30
- package/quills/usaf_memo/0.1.0/Quill.yaml +209 -209
- package/quills/usaf_memo/0.1.0/example.md +54 -54
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/LICENSE +21 -21
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/fonts/Cinzel/LICENSE +93 -93
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/fonts/CopperplateCC/LICENSE.md +79 -79
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/fonts/NimbusRomanNo9L/GNU General Public License.txt +339 -339
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/src/backmatter.typ +28 -28
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/src/body.typ +332 -332
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/src/config.typ +63 -63
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/src/frontmatter.typ +114 -114
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/src/indorsement.typ +118 -118
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/src/lib.typ +55 -55
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/src/mainmatter.typ +32 -32
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/src/primitives.typ +272 -272
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/src/utils.typ +377 -377
- package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/typst.toml +16 -16
- package/quills/usaf_memo/0.1.0/plate.typ +74 -74
- package/quills/usaf_memo/0.2.0/.quillignore +30 -30
- package/quills/usaf_memo/0.2.0/Quill.yaml +219 -219
- package/quills/usaf_memo/0.2.0/example.md +55 -55
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/.gitignore +6 -6
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/LICENSE +21 -21
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/fonts/Cinzel/LICENSE +93 -93
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/fonts/CopperplateCC/LICENSE.md +79 -79
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/fonts/NimbusRomanNo9L/GNU General Public License.txt +339 -339
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/backmatter.typ +28 -28
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/body.typ +333 -333
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/config.typ +64 -64
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/frontmatter.typ +114 -114
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/indorsement.typ +118 -118
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/lib.typ +55 -55
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/mainmatter.typ +32 -32
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/primitives.typ +293 -293
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/utils.typ +374 -374
- package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/typst.toml +27 -27
- package/quills/usaf_memo/0.2.0/plate.typ +75 -75
- package/templates/af4141.md +88 -88
- package/templates/cmu_letter_template.md +37 -37
- package/templates/daf4392.md +33 -0
- package/templates/loc.md +78 -78
- package/templates/pass_request.md +43 -43
- package/templates/rebuttal.md +55 -55
- package/templates/taro.md +26 -26
- package/templates/templates.json +55 -49
- package/templates/usaf_template.md +23 -23
- package/templates/ussf_template.md +29 -29
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
// Formalizer Engine – rendering engine
|
|
2
|
+
// Renders pixel-perfect PDF form replicas from a PyMuPDF-extracted schema.
|
|
3
|
+
|
|
4
|
+
/// Render a single field's content overlay.
|
|
5
|
+
///
|
|
6
|
+
/// - field-type (str): normalised lowercase type
|
|
7
|
+
/// - value: user-supplied value for this field (or none)
|
|
8
|
+
/// - width (length): field width
|
|
9
|
+
/// - height (length): field height
|
|
10
|
+
/// - field (dictionary): raw field entry from the schema
|
|
11
|
+
#let render-field(field-type, value, width, height, field) = {
|
|
12
|
+
if field-type == "text" {
|
|
13
|
+
if value != none and str(value) != "" {
|
|
14
|
+
context {
|
|
15
|
+
let default-size = height * 0.6
|
|
16
|
+
let min-size = 6pt
|
|
17
|
+
let x-inset = 1.5pt
|
|
18
|
+
let m = measure(text(size: default-size, str(value)))
|
|
19
|
+
let scale = calc.min(1.0, (width - 2 * x-inset) / m.width)
|
|
20
|
+
let final-size = calc.max(min-size, default-size * scale)
|
|
21
|
+
box(
|
|
22
|
+
width: width,
|
|
23
|
+
height: height,
|
|
24
|
+
clip: true,
|
|
25
|
+
inset: (x: x-inset),
|
|
26
|
+
align(left + horizon, text(size: final-size, str(value))),
|
|
27
|
+
)
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
} else if field-type == "checkbox" {
|
|
31
|
+
if value == true {
|
|
32
|
+
box(
|
|
33
|
+
width: width,
|
|
34
|
+
height: height,
|
|
35
|
+
align(center + horizon, text(size: height * 0.8, "✓")),
|
|
36
|
+
)
|
|
37
|
+
}
|
|
38
|
+
} else if field-type == "radio" {
|
|
39
|
+
// value is true when this specific button is the selected one
|
|
40
|
+
// (resolved at group level before calling this helper)
|
|
41
|
+
if value == true {
|
|
42
|
+
let dot-r = calc.min(width, height) * 0.3
|
|
43
|
+
box(
|
|
44
|
+
width: width,
|
|
45
|
+
height: height,
|
|
46
|
+
align(center + horizon, circle(radius: dot-r, fill: black)),
|
|
47
|
+
)
|
|
48
|
+
}
|
|
49
|
+
} else if field-type == "combobox" or field-type == "listbox" {
|
|
50
|
+
let display = if value != none { str(value) } else { "" }
|
|
51
|
+
// Resolve export value → display label when options are present
|
|
52
|
+
if field.at("options", default: none) != none and value != none {
|
|
53
|
+
for opt in field.options {
|
|
54
|
+
if str(opt.at(0)) == str(value) {
|
|
55
|
+
display = str(opt.at(1))
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
if display != "" {
|
|
60
|
+
context {
|
|
61
|
+
let default-size = height * 0.6
|
|
62
|
+
let min-size = 6pt
|
|
63
|
+
let x-inset = 2pt
|
|
64
|
+
let m = measure(text(size: default-size, display))
|
|
65
|
+
let scale = calc.min(1.0, (width - 2 * x-inset) / m.width)
|
|
66
|
+
let final-size = calc.max(min-size, default-size * scale)
|
|
67
|
+
box(
|
|
68
|
+
width: width,
|
|
69
|
+
height: height,
|
|
70
|
+
clip: true,
|
|
71
|
+
inset: (x: x-inset),
|
|
72
|
+
align(left + horizon, text(size: final-size, display)),
|
|
73
|
+
)
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
/// Determine whether a single radio button should appear selected.
|
|
80
|
+
///
|
|
81
|
+
/// Strategy:
|
|
82
|
+
/// 1. If the field carries an `export_value` key, match against it.
|
|
83
|
+
/// 2. Otherwise fall back to matching the 0-based index within the group
|
|
84
|
+
/// (stringified) against the supplied value.
|
|
85
|
+
#let radio-button-selected(field, group-value, index-in-group) = {
|
|
86
|
+
if group-value == none { return false }
|
|
87
|
+
let ev = field.at("export_value", default: none)
|
|
88
|
+
if ev != none {
|
|
89
|
+
return str(ev) == str(group-value)
|
|
90
|
+
}
|
|
91
|
+
// Fallback: match against the stringified index
|
|
92
|
+
str(index-in-group) == str(group-value)
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/// Draw a debug overlay rectangle with a label for a field.
|
|
96
|
+
///
|
|
97
|
+
/// - field-type (str): normalised lowercase type
|
|
98
|
+
/// - name (str): field name
|
|
99
|
+
/// - width (length): field width
|
|
100
|
+
/// - height (length): field height
|
|
101
|
+
#let debug-overlay(field-type, name, width, height) = {
|
|
102
|
+
let color = if field-type == "text" {
|
|
103
|
+
rgb(0, 0, 255, 40%)
|
|
104
|
+
} else if field-type == "checkbox" {
|
|
105
|
+
rgb(0, 128, 0, 40%)
|
|
106
|
+
} else if field-type == "radio" {
|
|
107
|
+
rgb(255, 165, 0, 40%)
|
|
108
|
+
} else if field-type == "combobox" {
|
|
109
|
+
rgb(128, 0, 128, 40%)
|
|
110
|
+
} else if field-type == "listbox" {
|
|
111
|
+
rgb(0, 128, 128, 40%)
|
|
112
|
+
} else {
|
|
113
|
+
rgb(128, 128, 128, 40%)
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
let stroke-color = if field-type == "text" {
|
|
117
|
+
rgb(0, 0, 255)
|
|
118
|
+
} else if field-type == "checkbox" {
|
|
119
|
+
rgb(0, 128, 0)
|
|
120
|
+
} else if field-type == "radio" {
|
|
121
|
+
rgb(255, 165, 0)
|
|
122
|
+
} else if field-type == "combobox" {
|
|
123
|
+
rgb(128, 0, 128)
|
|
124
|
+
} else if field-type == "listbox" {
|
|
125
|
+
rgb(0, 128, 128)
|
|
126
|
+
} else {
|
|
127
|
+
rgb(128, 128, 128)
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
// Insert zero-width spaces after _ and - so the label can wrap
|
|
131
|
+
let breakable-name = name.replace("_", "_\u{200B}").replace("-", "-\u{200B}")
|
|
132
|
+
let label = breakable-name + " [" + field-type + "]"
|
|
133
|
+
|
|
134
|
+
box(width: width, height: height, {
|
|
135
|
+
// Semi-transparent colored background
|
|
136
|
+
rect(width: 100%, height: 100%, fill: color, stroke: 0.5pt + stroke-color)
|
|
137
|
+
// Label in top-left — uses block so text wraps within field width
|
|
138
|
+
place(
|
|
139
|
+
top + left,
|
|
140
|
+
dx: 1pt,
|
|
141
|
+
dy: 1pt,
|
|
142
|
+
block(
|
|
143
|
+
width: calc.max(width - 2pt, 10pt),
|
|
144
|
+
fill: white,
|
|
145
|
+
inset: (x: 2pt, y: 1pt),
|
|
146
|
+
radius: 2pt,
|
|
147
|
+
stroke: 0.3pt + stroke-color,
|
|
148
|
+
breakable: false,
|
|
149
|
+
text(size: 5pt, fill: stroke-color, weight: "bold", label),
|
|
150
|
+
),
|
|
151
|
+
)
|
|
152
|
+
})
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/// Main entry point.
|
|
156
|
+
///
|
|
157
|
+
/// - schema (dictionary): result of `json("FIELDS.json")`
|
|
158
|
+
/// - backgrounds (array): list of image paths / bytes, one per page
|
|
159
|
+
/// - values (dictionary): field name → value; omit to render blank
|
|
160
|
+
/// - debug (bool): when true, draw colored overlays on each field
|
|
161
|
+
#let render-form(schema: none, backgrounds: (), values: (:), debug: false) = {
|
|
162
|
+
assert(schema != none, message: "render-form: `schema` is required")
|
|
163
|
+
assert(backgrounds.len() > 0, message: "render-form: `backgrounds` is required")
|
|
164
|
+
let pages = schema.pages
|
|
165
|
+
let fields = schema.fields
|
|
166
|
+
|
|
167
|
+
// Track how many radio buttons we have seen per group so far
|
|
168
|
+
let radio-counters = (:)
|
|
169
|
+
|
|
170
|
+
for (i, page-info) in pages.enumerate() {
|
|
171
|
+
let page-num = i + 1
|
|
172
|
+
let page-fields = fields.filter(f => f.page == page-num)
|
|
173
|
+
|
|
174
|
+
let bg = backgrounds.at(i)
|
|
175
|
+
let pw = page-info.width * 1pt
|
|
176
|
+
let ph = page-info.height * 1pt
|
|
177
|
+
|
|
178
|
+
page(
|
|
179
|
+
width: pw,
|
|
180
|
+
height: ph,
|
|
181
|
+
margin: 0pt,
|
|
182
|
+
)[
|
|
183
|
+
// Background image (the original PDF page rasterised as PNG)
|
|
184
|
+
#place(top + left, image(bg, width: pw, height: ph, fit: "stretch"))
|
|
185
|
+
|
|
186
|
+
// Field overlays
|
|
187
|
+
#for field in page-fields.filter(f => ("text", "checkbox", "radio", "combobox", "listbox").contains(lower(
|
|
188
|
+
f.type,
|
|
189
|
+
))) {
|
|
190
|
+
let x = field.bbox.at(0) * 1pt
|
|
191
|
+
let y = field.bbox.at(1) * 1pt
|
|
192
|
+
let w = (field.bbox.at(2) - field.bbox.at(0)) * 1pt
|
|
193
|
+
let h = (field.bbox.at(3) - field.bbox.at(1)) * 1pt
|
|
194
|
+
|
|
195
|
+
let field-type = lower(field.type)
|
|
196
|
+
let val = values.at(field.name, default: none)
|
|
197
|
+
|
|
198
|
+
// --- Radio: resolve group-level value to per-button boolean ---
|
|
199
|
+
if field-type == "radio" {
|
|
200
|
+
let group-name = field.name
|
|
201
|
+
let idx = radio-counters.at(group-name, default: 0)
|
|
202
|
+
radio-counters.insert(group-name, idx + 1)
|
|
203
|
+
val = radio-button-selected(field, val, idx)
|
|
204
|
+
}
|
|
205
|
+
|
|
206
|
+
place(
|
|
207
|
+
top + left,
|
|
208
|
+
dx: x,
|
|
209
|
+
dy: y,
|
|
210
|
+
render-field(field-type, val, w, h, field),
|
|
211
|
+
)
|
|
212
|
+
|
|
213
|
+
if debug {
|
|
214
|
+
place(
|
|
215
|
+
top + left,
|
|
216
|
+
dx: x,
|
|
217
|
+
dy: y,
|
|
218
|
+
debug-overlay(field-type, field.name, w, h),
|
|
219
|
+
)
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
// Zero-width fence to break PDF viewer text-selection grouping
|
|
223
|
+
place(top + left, dx: x, dy: y, text(size: 0.001pt, "\u{FEFF}"))
|
|
224
|
+
}
|
|
225
|
+
]
|
|
226
|
+
}
|
|
227
|
+
}
|
|
Binary file
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
#import "@local/quillmark-helper:0.1.0": data
|
|
2
|
+
|
|
3
|
+
#set page(width: 8.5in, height: 11in, margin: 0in)
|
|
4
|
+
#set text(font: "Arimo", size: 10pt)
|
|
5
|
+
|
|
6
|
+
// Background
|
|
7
|
+
#place(image("assets/page1.png", width: 100%, height: 100%))
|
|
8
|
+
|
|
9
|
+
#let tf(dx, dy, content) = place(dx: dx, dy: dy, content)
|
|
10
|
+
#let check(dx, dy, is_checked) = if is_checked { place(dx: dx, dy: dy, text(weight: "bold", size: 12pt)[✓]) }
|
|
11
|
+
|
|
12
|
+
// Mode of Transportation
|
|
13
|
+
#let mode = data.at("transportation_mode", default: "")
|
|
14
|
+
#check(40pt, 67pt, mode == "pmv")
|
|
15
|
+
#check(173pt, 67pt, mode == "airplane")
|
|
16
|
+
#check(243pt, 67pt, mode == "bus")
|
|
17
|
+
#check(286pt, 67pt, mode == "train")
|
|
18
|
+
#check(336pt, 67pt, mode == "motorcycle")
|
|
19
|
+
#check(411pt, 67pt, mode == "other")
|
|
20
|
+
|
|
21
|
+
// Fields
|
|
22
|
+
#tf(40pt, 100pt)[#data.at("departure_date", default: "")]
|
|
23
|
+
#tf(120pt, 100pt)[#data.at("final_destination", default: "")]
|
|
24
|
+
|
|
25
|
+
// Itinerary Rows (via CARDS)
|
|
26
|
+
#{
|
|
27
|
+
let row = 0
|
|
28
|
+
let dy-start = 160pt
|
|
29
|
+
let dy-step = 40pt
|
|
30
|
+
if "CARDS" in data {
|
|
31
|
+
for card in data.CARDS {
|
|
32
|
+
if card.CARD == "itinerary" and row < 5 {
|
|
33
|
+
let dy = dy-start + (row * dy-step)
|
|
34
|
+
tf(80pt, dy)[#card.at("date", default: "")]
|
|
35
|
+
tf(135pt, dy)[#card.at("departure_point", default: "")]
|
|
36
|
+
tf(300pt, dy)[#card.at("arrival_point", default: "")]
|
|
37
|
+
tf(450pt, dy)[#card.at("rest_length", default: "")]
|
|
38
|
+
tf(515pt, dy)[#card.at("mileage", default: "")]
|
|
39
|
+
row = row + 1
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Notes
|
|
46
|
+
#tf(40pt, 360pt)[#data.at("notes", default: "")]
|
|
47
|
+
|
|
48
|
+
// Acknowledgements
|
|
49
|
+
#tf(40pt, 420pt)[#data.at("organization", default: "")]
|
|
50
|
+
#tf(500pt, 420pt)[#data.at("briefed_date", default: "")]
|
|
51
|
+
|
|
52
|
+
#tf(40pt, 450pt)[#data.at("briefee_name", default: "")]
|
|
53
|
+
#tf(270pt, 450pt)[#data.at("briefee_grade", default: "")]
|
|
54
|
+
|
|
55
|
+
#tf(40pt, 480pt)[#data.at("briefer_name", default: "")]
|
|
56
|
+
#tf(270pt, 480pt)[#data.at("briefer_grade", default: "")]
|
|
57
|
+
|
|
58
|
+
// Emergency Contact
|
|
59
|
+
#tf(40pt, 500pt)[#text(size: 16pt, weight: "bold")[EMERGENCY CONTACT]]
|
|
60
|
+
#tf(40pt, 520pt)[#text(size: 12pt)[#data.at("emergency_contact", default: "")]]
|
|
@@ -1,29 +1,29 @@
|
|
|
1
|
-
Quill:
|
|
2
|
-
name: taro
|
|
3
|
-
version: 0.1.0
|
|
4
|
-
backend: typst
|
|
5
|
-
plate_file: plate.typ
|
|
6
|
-
example_file: example.md
|
|
7
|
-
description: A simple document template for testing
|
|
8
|
-
|
|
9
|
-
fields:
|
|
10
|
-
author:
|
|
11
|
-
title: Author of document
|
|
12
|
-
type: string
|
|
13
|
-
ice_cream:
|
|
14
|
-
title: favorite ice cream flavor
|
|
15
|
-
type: string
|
|
16
|
-
default: taro
|
|
17
|
-
title:
|
|
18
|
-
title: title of document
|
|
19
|
-
type: string
|
|
20
|
-
|
|
21
|
-
cards:
|
|
22
|
-
quotes:
|
|
23
|
-
title: Inspirational Quotes
|
|
24
|
-
description: A collection of quotes about taro ice cream
|
|
25
|
-
fields:
|
|
26
|
-
author:
|
|
27
|
-
title: Quote author
|
|
28
|
-
type: string
|
|
29
|
-
description: The person who said this quote
|
|
1
|
+
Quill:
|
|
2
|
+
name: taro
|
|
3
|
+
version: 0.1.0
|
|
4
|
+
backend: typst
|
|
5
|
+
plate_file: plate.typ
|
|
6
|
+
example_file: example.md
|
|
7
|
+
description: A simple document template for testing
|
|
8
|
+
|
|
9
|
+
fields:
|
|
10
|
+
author:
|
|
11
|
+
title: Author of document
|
|
12
|
+
type: string
|
|
13
|
+
ice_cream:
|
|
14
|
+
title: favorite ice cream flavor
|
|
15
|
+
type: string
|
|
16
|
+
default: taro
|
|
17
|
+
title:
|
|
18
|
+
title: title of document
|
|
19
|
+
type: string
|
|
20
|
+
|
|
21
|
+
cards:
|
|
22
|
+
quotes:
|
|
23
|
+
title: Inspirational Quotes
|
|
24
|
+
description: A collection of quotes about taro ice cream
|
|
25
|
+
fields:
|
|
26
|
+
author:
|
|
27
|
+
title: Quote author
|
|
28
|
+
type: string
|
|
29
|
+
description: The person who said this quote
|
|
@@ -1,27 +1,27 @@
|
|
|
1
|
-
---
|
|
2
|
-
QUILL: taro@0.1
|
|
3
|
-
author: Nibs
|
|
4
|
-
ice_cream: Taro
|
|
5
|
-
title: "My Favorite Ice Cream Flavor"
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
I love Taro ice cream for its subtly sweet, nutty flavor and creamy, earthy undertones that set it apart from more common flavors. Its unique purple hue and smooth texture make it both visually striking and deliciously comforting. Here are some quotes from satisfied customers:
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
---
|
|
12
|
-
CARD: quotes
|
|
13
|
-
author: Albert Einstein
|
|
14
|
-
---
|
|
15
|
-
Without taro ice cream, life would be a mistake.
|
|
16
|
-
|
|
17
|
-
---
|
|
18
|
-
CARD: quotes
|
|
19
|
-
author: Friedrich Nietzsche
|
|
20
|
-
---
|
|
21
|
-
He who has taro ice cream in his heart will never be alone.
|
|
22
|
-
|
|
23
|
-
---
|
|
24
|
-
CARD: quotes
|
|
25
|
-
author: Mark Twain
|
|
26
|
-
---
|
|
1
|
+
---
|
|
2
|
+
QUILL: taro@0.1
|
|
3
|
+
author: Nibs
|
|
4
|
+
ice_cream: Taro
|
|
5
|
+
title: "My Favorite Ice Cream Flavor"
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
I love Taro ice cream for its subtly sweet, nutty flavor and creamy, earthy undertones that set it apart from more common flavors. Its unique purple hue and smooth texture make it both visually striking and deliciously comforting. Here are some quotes from satisfied customers:
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
CARD: quotes
|
|
13
|
+
author: Albert Einstein
|
|
14
|
+
---
|
|
15
|
+
Without taro ice cream, life would be a mistake.
|
|
16
|
+
|
|
17
|
+
---
|
|
18
|
+
CARD: quotes
|
|
19
|
+
author: Friedrich Nietzsche
|
|
20
|
+
---
|
|
21
|
+
He who has taro ice cream in his heart will never be alone.
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
CARD: quotes
|
|
25
|
+
author: Mark Twain
|
|
26
|
+
---
|
|
27
27
|
The secret of getting ahead is getting started... with taro ice cream.
|
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
#import "@local/quillmark-helper:0.1.0": data, eval-markup, parse-date
|
|
2
|
-
|
|
3
|
-
#set text(font: "Figtree")
|
|
4
|
-
|
|
5
|
-
// Advanced: Use show filter to color text
|
|
6
|
-
#show regex("(?i)taro"): it => text(fill: purple)[#it]
|
|
7
|
-
|
|
8
|
-
// Filters like `String` render to code mode automatically,
|
|
9
|
-
#underline(data.title)
|
|
10
|
-
|
|
11
|
-
// When using filters in markup mode,
|
|
12
|
-
// add `#` before the template expression to enter code mode.
|
|
13
|
-
*Author: #data.author*
|
|
14
|
-
|
|
15
|
-
*Favorite Ice Cream: #data.ice_cream*__
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
#eval-markup(data.BODY)
|
|
19
|
-
|
|
20
|
-
// Present each sub-document programatically
|
|
21
|
-
#for card in data.CARDS {
|
|
22
|
-
if card.CARD == "quotes" [
|
|
23
|
-
*#card.author*: _#eval-markup(card.BODY)_
|
|
24
|
-
]
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
// Include an image with a dynamic asset
|
|
29
|
-
#if "picture" in data {
|
|
30
|
-
image(data.picture)
|
|
31
|
-
}
|
|
1
|
+
#import "@local/quillmark-helper:0.1.0": data, eval-markup, parse-date
|
|
2
|
+
|
|
3
|
+
#set text(font: "Figtree")
|
|
4
|
+
|
|
5
|
+
// Advanced: Use show filter to color text
|
|
6
|
+
#show regex("(?i)taro"): it => text(fill: purple)[#it]
|
|
7
|
+
|
|
8
|
+
// Filters like `String` render to code mode automatically,
|
|
9
|
+
#underline(data.title)
|
|
10
|
+
|
|
11
|
+
// When using filters in markup mode,
|
|
12
|
+
// add `#` before the template expression to enter code mode.
|
|
13
|
+
*Author: #data.author*
|
|
14
|
+
|
|
15
|
+
*Favorite Ice Cream: #data.ice_cream*__
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
#eval-markup(data.BODY)
|
|
19
|
+
|
|
20
|
+
// Present each sub-document programatically
|
|
21
|
+
#for card in data.CARDS {
|
|
22
|
+
if card.CARD == "quotes" [
|
|
23
|
+
*#card.author*: _#eval-markup(card.BODY)_
|
|
24
|
+
]
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
// Include an image with a dynamic asset
|
|
29
|
+
#if "picture" in data {
|
|
30
|
+
image(data.picture)
|
|
31
|
+
}
|
|
@@ -1,31 +1,31 @@
|
|
|
1
|
-
# Example .quillignore for usaf_memo template
|
|
2
|
-
# This demonstrates the .quillignore functionality
|
|
3
|
-
|
|
4
|
-
# Ignore temporary and backup files
|
|
5
|
-
*.tmp
|
|
6
|
-
*.bak
|
|
7
|
-
*~
|
|
8
|
-
*.swp
|
|
9
|
-
|
|
10
|
-
# Ignore build artifacts
|
|
11
|
-
target/
|
|
12
|
-
dist/
|
|
13
|
-
build/
|
|
14
|
-
|
|
15
|
-
# Ignore OS-specific files
|
|
16
|
-
.DS_Store
|
|
17
|
-
Thumbs.db
|
|
18
|
-
desktop.ini
|
|
19
|
-
|
|
20
|
-
# Ignore version control
|
|
21
|
-
.git/
|
|
22
|
-
.svn/
|
|
23
|
-
|
|
24
|
-
# Ignore editor files
|
|
25
|
-
.vscode/
|
|
26
|
-
.idea/
|
|
27
|
-
*.sublime-*
|
|
28
|
-
|
|
29
|
-
# Ignore log files
|
|
30
|
-
*.log
|
|
1
|
+
# Example .quillignore for usaf_memo template
|
|
2
|
+
# This demonstrates the .quillignore functionality
|
|
3
|
+
|
|
4
|
+
# Ignore temporary and backup files
|
|
5
|
+
*.tmp
|
|
6
|
+
*.bak
|
|
7
|
+
*~
|
|
8
|
+
*.swp
|
|
9
|
+
|
|
10
|
+
# Ignore build artifacts
|
|
11
|
+
target/
|
|
12
|
+
dist/
|
|
13
|
+
build/
|
|
14
|
+
|
|
15
|
+
# Ignore OS-specific files
|
|
16
|
+
.DS_Store
|
|
17
|
+
Thumbs.db
|
|
18
|
+
desktop.ini
|
|
19
|
+
|
|
20
|
+
# Ignore version control
|
|
21
|
+
.git/
|
|
22
|
+
.svn/
|
|
23
|
+
|
|
24
|
+
# Ignore editor files
|
|
25
|
+
.vscode/
|
|
26
|
+
.idea/
|
|
27
|
+
*.sublime-*
|
|
28
|
+
|
|
29
|
+
# Ignore log files
|
|
30
|
+
*.log
|
|
31
31
|
logs/
|