@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.
Files changed (102) hide show
  1. package/LICENSE +201 -201
  2. package/README.md +39 -39
  3. package/index.d.ts +2 -2
  4. package/index.js +8 -8
  5. package/package.json +41 -41
  6. package/quills/af4141/0.1.0/Quill.yaml +88 -88
  7. package/quills/af4141/0.1.0/design/TASK.md +19 -19
  8. package/quills/af4141/0.1.0/example.md +35 -35
  9. package/quills/af4141/0.1.0/packages/typst-af4141/FIELDS.json +3169 -3169
  10. package/quills/af4141/0.1.0/packages/typst-af4141/form.typ +538 -538
  11. package/quills/af4141/0.1.0/packages/typst-af4141/lib.typ +227 -227
  12. package/quills/af4141/0.1.0/packages/typst-af4141/typst.toml +7 -7
  13. package/quills/af4141/0.1.0/plate.typ +48 -48
  14. package/quills/classic_resume/0.1.0/Quill.yaml +118 -118
  15. package/quills/classic_resume/0.1.0/example.md +232 -232
  16. package/quills/classic_resume/0.1.0/packages/ttq-classic-resume/LICENSE +21 -21
  17. package/quills/classic_resume/0.1.0/packages/ttq-classic-resume/README.md +38 -38
  18. package/quills/classic_resume/0.1.0/packages/ttq-classic-resume/src/components.typ +184 -184
  19. package/quills/classic_resume/0.1.0/packages/ttq-classic-resume/src/layout.typ +42 -42
  20. package/quills/classic_resume/0.1.0/packages/ttq-classic-resume/src/lib.typ +5 -5
  21. package/quills/classic_resume/0.1.0/packages/ttq-classic-resume/typst.toml +26 -26
  22. package/quills/classic_resume/0.1.0/plate.typ +44 -44
  23. package/quills/cmu_letter/0.1.0/.quillignore +30 -30
  24. package/quills/cmu_letter/0.1.0/Quill.yaml +64 -64
  25. package/quills/cmu_letter/0.1.0/assets/cmu-wordmark.svg +174 -174
  26. package/quills/cmu_letter/0.1.0/example.md +30 -30
  27. package/quills/cmu_letter/0.1.0/packages/tonguetoquill-cmu-letter/LICENSE +21 -21
  28. package/quills/cmu_letter/0.1.0/packages/tonguetoquill-cmu-letter/fonts/README.txt +100 -100
  29. package/quills/cmu_letter/0.1.0/packages/tonguetoquill-cmu-letter/src/backmatter.typ +13 -13
  30. package/quills/cmu_letter/0.1.0/packages/tonguetoquill-cmu-letter/src/config.typ +39 -39
  31. package/quills/cmu_letter/0.1.0/packages/tonguetoquill-cmu-letter/src/frontmatter.typ +72 -72
  32. package/quills/cmu_letter/0.1.0/packages/tonguetoquill-cmu-letter/src/lib.typ +47 -47
  33. package/quills/cmu_letter/0.1.0/packages/tonguetoquill-cmu-letter/src/mainmatter.typ +42 -42
  34. package/quills/cmu_letter/0.1.0/packages/tonguetoquill-cmu-letter/src/primitives.typ +70 -70
  35. package/quills/cmu_letter/0.1.0/packages/tonguetoquill-cmu-letter/src/utils.typ +85 -85
  36. package/quills/cmu_letter/0.1.0/packages/tonguetoquill-cmu-letter/typst.toml +17 -17
  37. package/quills/cmu_letter/0.1.0/plate.typ +19 -19
  38. package/quills/daf4392/0.1.0/Quill.yaml +110 -0
  39. package/quills/daf4392/0.1.0/assets/arimo-v35-latin-700.ttf +0 -0
  40. package/quills/daf4392/0.1.0/assets/arimo-v35-latin-700italic.ttf +0 -0
  41. package/quills/daf4392/0.1.0/assets/arimo-v35-latin-italic.ttf +0 -0
  42. package/quills/daf4392/0.1.0/assets/arimo-v35-latin-regular.ttf +0 -0
  43. package/quills/daf4392/0.1.0/assets/page1.png +0 -0
  44. package/quills/daf4392/0.1.0/example.md +33 -0
  45. package/quills/daf4392/0.1.0/packages/daf4392page2_pkg/FIELDS.json +9 -0
  46. package/quills/daf4392/0.1.0/packages/daf4392page2_pkg/form.typ +14 -0
  47. package/quills/daf4392/0.1.0/packages/daf4392page2_pkg/lib.typ +227 -0
  48. package/quills/daf4392/0.1.0/packages/daf4392page2_pkg/out/debug.typ +4 -0
  49. package/quills/daf4392/0.1.0/packages/daf4392page2_pkg/out/example.typ +4 -0
  50. package/quills/daf4392/0.1.0/packages/daf4392page2_pkg/page1.png +0 -0
  51. package/quills/daf4392/0.1.0/packages/daf4392page2_pkg/typst.toml +7 -0
  52. package/quills/daf4392/0.1.0/plate.typ +60 -0
  53. package/quills/taro/0.1.0/Quill.yaml +29 -29
  54. package/quills/taro/0.1.0/example.md +26 -26
  55. package/quills/taro/0.1.0/plate.typ +31 -31
  56. package/quills/usaf_memo/0.1.0/.quillignore +30 -30
  57. package/quills/usaf_memo/0.1.0/Quill.yaml +209 -209
  58. package/quills/usaf_memo/0.1.0/example.md +54 -54
  59. package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/LICENSE +21 -21
  60. package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/fonts/Cinzel/LICENSE +93 -93
  61. package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/fonts/CopperplateCC/LICENSE.md +79 -79
  62. package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/fonts/NimbusRomanNo9L/GNU General Public License.txt +339 -339
  63. package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/src/backmatter.typ +28 -28
  64. package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/src/body.typ +332 -332
  65. package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/src/config.typ +63 -63
  66. package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/src/frontmatter.typ +114 -114
  67. package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/src/indorsement.typ +118 -118
  68. package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/src/lib.typ +55 -55
  69. package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/src/mainmatter.typ +32 -32
  70. package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/src/primitives.typ +272 -272
  71. package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/src/utils.typ +377 -377
  72. package/quills/usaf_memo/0.1.0/packages/tonguetoquill-usaf-memo/typst.toml +16 -16
  73. package/quills/usaf_memo/0.1.0/plate.typ +74 -74
  74. package/quills/usaf_memo/0.2.0/.quillignore +30 -30
  75. package/quills/usaf_memo/0.2.0/Quill.yaml +219 -219
  76. package/quills/usaf_memo/0.2.0/example.md +55 -55
  77. package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/.gitignore +6 -6
  78. package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/LICENSE +21 -21
  79. package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/fonts/Cinzel/LICENSE +93 -93
  80. package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/fonts/CopperplateCC/LICENSE.md +79 -79
  81. package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/fonts/NimbusRomanNo9L/GNU General Public License.txt +339 -339
  82. package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/backmatter.typ +28 -28
  83. package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/body.typ +333 -333
  84. package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/config.typ +64 -64
  85. package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/frontmatter.typ +114 -114
  86. package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/indorsement.typ +118 -118
  87. package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/lib.typ +55 -55
  88. package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/mainmatter.typ +32 -32
  89. package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/primitives.typ +293 -293
  90. package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/src/utils.typ +374 -374
  91. package/quills/usaf_memo/0.2.0/packages/tonguetoquill-usaf-memo/typst.toml +27 -27
  92. package/quills/usaf_memo/0.2.0/plate.typ +75 -75
  93. package/templates/af4141.md +88 -88
  94. package/templates/cmu_letter_template.md +37 -37
  95. package/templates/daf4392.md +33 -0
  96. package/templates/loc.md +78 -78
  97. package/templates/pass_request.md +43 -43
  98. package/templates/rebuttal.md +55 -55
  99. package/templates/taro.md +26 -26
  100. package/templates/templates.json +55 -49
  101. package/templates/usaf_template.md +23 -23
  102. 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
+ }
@@ -0,0 +1,4 @@
1
+ // debug.typ (generated � renders form with debug overlays)
2
+ #import "../form.typ": form
3
+
4
+ #form(debug: true)
@@ -0,0 +1,4 @@
1
+ // example.typ (edit this file to fill the form)
2
+ #import "../form.typ": form
3
+
4
+ #form()
@@ -0,0 +1,7 @@
1
+ [package]
2
+ name = "daf4392page2-pkg"
3
+ version = "0.1.0"
4
+ entrypoint = "form.typ"
5
+ authors = ["formalizer"]
6
+ license = "Apache-2.0"
7
+ description = "Fillable form package generated by formalizer"
@@ -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/