cv-tools-cli 2.0.0__py3-none-any.whl

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 (46) hide show
  1. cv_tools/__init__.py +7 -0
  2. cv_tools/__main__.py +5 -0
  3. cv_tools/api.py +123 -0
  4. cv_tools/bib.py +122 -0
  5. cv_tools/charset.py +142 -0
  6. cv_tools/cli.py +384 -0
  7. cv_tools/doctor.py +185 -0
  8. cv_tools/engine.py +320 -0
  9. cv_tools/loader.py +424 -0
  10. cv_tools/markup.py +614 -0
  11. cv_tools/migrate.py +222 -0
  12. cv_tools/model.py +192 -0
  13. cv_tools/render/__init__.py +1 -0
  14. cv_tools/render/html.py +581 -0
  15. cv_tools/render/latex.py +154 -0
  16. cv_tools/schema/cv-v2.schema.json +707 -0
  17. cv_tools/starter/cv.yaml +129 -0
  18. cv_tools/starter/publications.bib +55 -0
  19. cv_tools/templates/html/cv.css +252 -0
  20. cv_tools/templates/html/cv.html.jinja +19 -0
  21. cv_tools/templates/html/icons/github.svg +1 -0
  22. cv_tools/templates/html/icons/linkedin.svg +1 -0
  23. cv_tools/templates/html/icons/orcid.svg +1 -0
  24. cv_tools/templates/html/icons/twitter.svg +1 -0
  25. cv_tools/templates/html/macros.jinja +89 -0
  26. cv_tools/templates/latex/cv.tex.jinja +45 -0
  27. cv_tools/templates/latex/layouts/dated.jinja +12 -0
  28. cv_tools/templates/latex/layouts/entries-inline.jinja +23 -0
  29. cv_tools/templates/latex/layouts/entries.jinja +29 -0
  30. cv_tools/templates/latex/layouts/list.jinja +24 -0
  31. cv_tools/templates/latex/layouts/pairs.jinja +14 -0
  32. cv_tools/templates/latex/layouts/publications.jinja +14 -0
  33. cv_tools/templates/latex/layouts/text.jinja +10 -0
  34. cv_tools/templates/latex/orcid.pdf +0 -0
  35. cv_tools/templates/latex/packages.txt +47 -0
  36. cv_tools/templates/latex/resume.cls +265 -0
  37. cv_tools/templates/latex/unicode.txt +398 -0
  38. cv_tools/v1.py +484 -0
  39. cv_tools/validate.py +165 -0
  40. cv_tools/watch.py +76 -0
  41. cv_tools_cli-2.0.0.dist-info/METADATA +498 -0
  42. cv_tools_cli-2.0.0.dist-info/RECORD +46 -0
  43. cv_tools_cli-2.0.0.dist-info/WHEEL +5 -0
  44. cv_tools_cli-2.0.0.dist-info/entry_points.txt +2 -0
  45. cv_tools_cli-2.0.0.dist-info/licenses/LICENSE +21 -0
  46. cv_tools_cli-2.0.0.dist-info/top_level.txt +1 -0
@@ -0,0 +1,129 @@
1
+ # yaml-language-server: $schema=https://cv-tools.phonethk.com/schema/v2.json
2
+ # Your CV, written by cv-tools init. Edit it, then run: cv-tools build cv.yaml
3
+ version: 2
4
+ name: John Doe
5
+
6
+ contact:
7
+ - - url: https://www.johndoeportfolio.com
8
+ - orcid: 0000-0000-0000-0000
9
+ - linkedin: https://linkedin.com/in/johndoe
10
+ - - johndoe@email.com
11
+ - Curriculum Vitae, {date}
12
+
13
+ sections:
14
+ - title: Education
15
+ layout: entries-inline
16
+ entries:
17
+ - title: Fictional University
18
+ location: Imaginaria, Wonderland
19
+ date: September 2021 - June 2024
20
+ subtitle: Bachelor of Science in *Computer Science*
21
+ note: '**Magna Cum Laude**'
22
+ details:
23
+ - "Thesis Title: *An Exploration of ['Quantum Computing'](https://en.wikipedia.org/wiki/Quantum_computing) in Virtual Environments*"
24
+ - 'Supervisor: Dr. Alice Wonder'
25
+ - title: Imaginary Institute of Technology
26
+ location: Nowhere City, Utopia
27
+ date: August 2018 - May 2021
28
+ subtitle: Associate Degree in Artificial Intelligence
29
+ details:
30
+ - 'Supervisor: Dr. Bob Builder'
31
+
32
+ - title: Professional Experience
33
+ layout: entries
34
+ entries:
35
+ - title: Tech Innovations Inc.
36
+ date: July 2024 - Present
37
+ subtitle: Software Engineer
38
+ bullets:
39
+ - Developed and maintained cloud-based solutions for various enterprise clients.
40
+ - Led a team of developers in designing scalable software architectures.
41
+ - Improved system performance by 30% through code optimization and database restructuring.
42
+ - title: NextGen Robotics
43
+ date: June 2022 - June 2024
44
+ subtitle: Robotics Engineer
45
+ bullets:
46
+ - Designed and implemented autonomous navigation systems for industrial robots.
47
+ - Collaborated with cross-functional teams to integrate machine learning models into robotic platforms.
48
+
49
+ - title: Teaching and Volunteering
50
+ layout: entries
51
+ entries:
52
+ - title: Virtual Coding Academy
53
+ date: January 2020 - December 2021
54
+ subtitle: Instructor
55
+ note: 'Supervisor: Dr. Eve Code'
56
+ details:
57
+ - Department of Computer Science
58
+ - Imaginaria, Wonderland
59
+ bullets:
60
+ - Taught introductory and advanced courses in Python programming.
61
+ - Mentored students on their final projects and provided guidance on coding best practices.
62
+ - title: Tech Youth Initiative
63
+ date: July 2019 - June 2020
64
+ subtitle: Volunteer Coordinator
65
+ details:
66
+ - Nowhere City, Utopia
67
+ bullets:
68
+ - Organized coding boot camps and hackathons for underprivileged youth.
69
+ - Managed a team of volunteers and ensured smooth operation of all events.
70
+
71
+ - title: Honors and Awards
72
+ layout: list
73
+ entries:
74
+ - Dean's List (2023, 2022)
75
+ - Best Paper Award at Tech Innovations Conference (2023)
76
+ - Outstanding Graduate Award, Fictional University (2024)
77
+
78
+ - newpage
79
+
80
+ - title: Certifications
81
+ layout: entries
82
+ entries:
83
+ - title: Certified Kubernetes Administrator
84
+ date: Graduated December 2023
85
+ subtitle: Cloud Native Computing Foundation
86
+ - title: AWS Certified Solutions Architect
87
+ date: Graduated March 2022
88
+ subtitle: Amazon Web Services
89
+
90
+ - title: Skills
91
+ layout: pairs
92
+ entries:
93
+ - title: Spoken Languages
94
+ text: English (Fluent), Spanish (Intermediate)
95
+ - title: Programming Languages
96
+ text: Python, Java, C++, SQL, JavaScript
97
+ - title: Tools and Technologies
98
+ text: AWS, Docker, Kubernetes, TensorFlow, Git, Jenkins, Linux, Jira
99
+
100
+ - title: Professional Activities
101
+ layout: list
102
+ description: Served/ing as a reviewer for
103
+ entries:
104
+ - text: Journals
105
+ bullets:
106
+ - Journal of Artificial Intelligence Research (JAIR)
107
+ - Journal of Machine Learning Research (JMLR)
108
+ - text: Conferences
109
+ bullets:
110
+ - IEEE Conference on Computer Vision and Pattern Recognition (CVPR)
111
+ - International Conference on Learning Representations (ICLR)
112
+
113
+ - title: Invited Talks/Workshops
114
+ layout: dated
115
+ entries:
116
+ - date: Nov. 2023
117
+ text: "'AI in Everyday Life', Invited talk, Tech Conference 2023, Imaginaria."
118
+ - date: Oct. 2022
119
+ text: "'Cloud Computing for Beginners', Workshop, FutureTech Expo 2022, Nowhere City."
120
+ - date: May 2024
121
+ text: "'Robotics in Modern Industry', Guest lecture, Imaginary Institute of Technology."
122
+ - date: Aug. 2023
123
+ text: "'Building Scalable Systems with Docker and Kubernetes', Workshop, DevOps World 2023, Tech City."
124
+ - date: Sep. 2022
125
+ text: "'Ethics in AI', Panel discussion, Ethics in Technology Conference 2022, Metropolis."
126
+
127
+ - title: Publications
128
+ layout: publications
129
+ bib: publications.bib
@@ -0,0 +1,55 @@
1
+ @article{doe2024quantum,
2
+ author = {John Doe and Jane Smith and Alice Wonder},
3
+ title = {Quantum Computing: Bridging the Gap Between Theory and Application},
4
+ journal = {Journal of Computer Science},
5
+ year = {2024},
6
+ url = {https://example.com/quantum-computing-paper}
7
+ }
8
+
9
+ @article{doe2022autonomous,
10
+ author = {John Doe and Bob Builder and Eve Code},
11
+ title = {Autonomous Robots: Navigating the Challenges of Real-World Environments},
12
+ journal = {International Journal of Robotics},
13
+ year = {2022},
14
+ url = {https://example.com/autonomous-robots-paper}
15
+ }
16
+
17
+ @inproceedings{doe2021ai,
18
+ author = {John Doe and Charlie Tech},
19
+ title = {AI-Driven Cloud Solutions: Enhancing Efficiency and Scalability},
20
+ booktitle = {Conference on Cloud Computing},
21
+ year = {2021},
22
+ url = {https://example.com/ai-cloud-solutions-paper}
23
+ }
24
+
25
+ @article{doe2023network,
26
+ author = {John Doe and Alice Wonder},
27
+ title = {Optimizing Network Protocols for High-Performance Computing},
28
+ journal = {Journal of High-Performance Computing},
29
+ year = {2023},
30
+ url = {https://example.com/network-optimization-paper}
31
+ }
32
+
33
+ @inproceedings{doe2022robotics,
34
+ author = {John Doe and Bob Builder},
35
+ title = {Robotics in Industry 4.0: Trends and Innovations},
36
+ booktitle = {International Conference on Robotics and Automation},
37
+ year = {2022},
38
+ url = {https://example.com/robotics-industry-paper}
39
+ }
40
+
41
+ @book{doe2021machine,
42
+ author = {John Doe and Eve Code},
43
+ title = {Machine Learning for Engineers: A Comprehensive Guide},
44
+ publisher = {Tech Publishers},
45
+ year = {2021},
46
+ url = {https://example.com/machine-learning-book}
47
+ }
48
+
49
+ @article{doe2020data,
50
+ author = {John Doe and Charlie Tech and Jane Smith},
51
+ title = {Data-Driven Insights: Leveraging Big Data for Strategic Decisions},
52
+ journal = {Data Science Journal},
53
+ year = {2020},
54
+ url = {https://example.com/data-driven-insights-paper}
55
+ }
@@ -0,0 +1,252 @@
1
+ /* cv-tools HTML preview, imitating resume.cls. Vertical spacing was measured against the PDF. */
2
+
3
+ .cv-document {
4
+ /* Latin Modern Math prints the math symbols CMU lacks (FONT_RANGES). */
5
+ --cv-serif: "CMU Serif", "Latin Modern Math", "Latin Modern Roman", "Computer Modern Serif", "Times New Roman", Times, serif;
6
+ --cv-mono: "CMU Typewriter Text", "Latin Modern Math", "Latin Modern Mono", "Courier New", Courier, monospace;
7
+ --cv-link: #0000ff; /* hyperref urlcolor=blue */
8
+ --cv-baseline: 13.6pt;
9
+ --cv-word-spacing: -0.09em;
10
+ --cv-page-height: 11in;
11
+ --cv-page-break: rgba(0, 0, 0, 0.18);
12
+ color-scheme: light;
13
+ }
14
+
15
+ .cv-document *,
16
+ .cv-document *::before,
17
+ .cv-document *::after {
18
+ box-sizing: border-box;
19
+ margin: 0;
20
+ padding: 0;
21
+ }
22
+
23
+ /* A faint line marks every 11in of a page box that outgrows its page. */
24
+ .cv-document .cv-page {
25
+ position: relative;
26
+ width: 8.5in;
27
+ min-height: var(--cv-page-height);
28
+ margin: 0 auto 0.25in;
29
+ padding: 0.6in 0.55in;
30
+ background-color: #fff;
31
+ background-image: repeating-linear-gradient(
32
+ to bottom,
33
+ transparent 0,
34
+ transparent calc(var(--cv-page-height) - 1px),
35
+ var(--cv-page-break) calc(var(--cv-page-height) - 1px),
36
+ var(--cv-page-break) var(--cv-page-height)
37
+ );
38
+ box-shadow: 0 1px 4px rgba(0, 0, 0, 0.25);
39
+ /* The paper's edges clip, as in the PDF. */
40
+ overflow-x: clip;
41
+ color: #000;
42
+ font-family: var(--cv-serif);
43
+ font-size: 10.95pt;
44
+ font-weight: normal;
45
+ font-style: normal;
46
+ line-height: var(--cv-baseline);
47
+ text-align: justify;
48
+ /* TeX can shrink spaces to fit a line and browsers cannot, so they start narrower. */
49
+ word-spacing: var(--cv-word-spacing);
50
+ font-kerning: normal;
51
+ font-variant-ligatures: common-ligatures;
52
+ font-synthesis: none;
53
+ overflow-wrap: normal;
54
+ hyphens: manual;
55
+ -webkit-text-size-adjust: none;
56
+ text-size-adjust: none;
57
+ }
58
+
59
+ .cv-document .cv-page:last-child { margin-bottom: 0; }
60
+
61
+ @media print {
62
+ .cv-document .cv-page {
63
+ margin: 0;
64
+ box-shadow: none;
65
+ background-image: none;
66
+ break-after: page;
67
+ }
68
+ .cv-document .cv-page:last-child { break-after: auto; }
69
+ }
70
+
71
+ /* Taller bold and italic faces must not make a line taller (TeX keeps \baselineskip). */
72
+ .cv-document :is(strong, em, a, span, sup, code) { line-height: 1; }
73
+ .cv-document :is(.cv-dated-row, .cv-dated-date) > * { line-height: var(--cv-baseline); }
74
+
75
+ .cv-document strong { font-weight: bold; }
76
+ .cv-document em { font-style: italic; }
77
+ .cv-document sup { font-size: 8pt; line-height: 0; vertical-align: 3.5pt; }
78
+ .cv-document a { color: inherit; text-decoration: none; }
79
+ .cv-document .cv-link { color: var(--cv-link); }
80
+
81
+ /* Four spaces or a tab (\quad), and runs of spaces that TeX keeps. */
82
+ .cv-document .cv-space { white-space: pre-wrap; }
83
+ .cv-document .cv-quad { display: inline-block; width: 1em; }
84
+
85
+ /* {latex: ...} values show as source. */
86
+ .cv-document .cv-latex {
87
+ font-family: var(--cv-mono);
88
+ font-size: 0.9em;
89
+ white-space: pre-wrap;
90
+ color: #5c3b00;
91
+ background: #fff3d1;
92
+ outline: 1px dashed #c48a00;
93
+ outline-offset: -1px;
94
+ padding: 0 0.15em;
95
+ border-radius: 2px;
96
+ }
97
+
98
+ /* An empty editable value stays clickable. */
99
+ .cv-document[data-editable="true"] [data-path]:empty {
100
+ display: inline-block;
101
+ min-width: 0.5em;
102
+ min-height: 1em;
103
+ }
104
+
105
+ /* ---------------------------------------------------------------- header */
106
+
107
+ /* \printname: \huge bold upper case, centred, then \bigskip. */
108
+ .cv-document .cv-header { margin-bottom: 15.8pt; word-spacing: normal; }
109
+ /* Without contact lines the name paragraph ends with an empty line. */
110
+ .cv-document .cv-header.cv-no-contact { margin-bottom: 34.55pt; }
111
+
112
+ .cv-document .cv-name {
113
+ margin-top: -4.5pt;
114
+ margin-bottom: 9pt;
115
+ font-size: 20.74pt;
116
+ font-weight: bold;
117
+ /* TeX uses the narrower 12pt design of the bold font at this size. */
118
+ letter-spacing: -0.018em;
119
+ line-height: 25pt;
120
+ text-align: center;
121
+ text-transform: uppercase;
122
+ }
123
+
124
+ /* \printaddress: \centerline, then \smallskip. A wide line overflows both margins. */
125
+ .cv-document .cv-contact {
126
+ margin: 0 -100% 3pt;
127
+ text-align: center;
128
+ white-space: nowrap;
129
+ }
130
+
131
+ .cv-document .cv-url {
132
+ color: var(--cv-link);
133
+ font-family: var(--cv-mono);
134
+ }
135
+
136
+ .cv-document .cv-icon { display: inline-block; line-height: 0; }
137
+ .cv-document .cv-icon-svg { display: inline-block; height: 1em; width: auto; }
138
+ /* \orcidicon: the height plus depth of $|$ (0.75em + 0.25em), lowered by the depth. */
139
+ .cv-document .cv-icon-orcid .cv-icon-svg { width: 1em; vertical-align: -0.25em; }
140
+ /* \colorfaLinkedinSquare: \raisebox{-0.7pt}. The SVG box reaches 0.143em below the baseline. */
141
+ .cv-document .cv-icon-linkedin { color: rgb(5, 97, 153); }
142
+ .cv-document .cv-icon-linkedin .cv-icon-svg { width: 0.857em; vertical-align: calc(-0.143em - 0.7pt); }
143
+ /* \colorfaGithub: \large, \raisebox{-1.3pt}. */
144
+ .cv-document .cv-icon-github { color: #000; font-size: 12pt; }
145
+ .cv-document .cv-icon-github .cv-icon-svg { width: 0.857em; vertical-align: calc(-0.143em - 1.3pt); }
146
+ /* \colorfaTwitter: \large, \raisebox{-1.5pt}. */
147
+ .cv-document .cv-icon-twitter { color: rgb(17, 95, 143); font-size: 12pt; }
148
+ .cv-document .cv-icon-twitter .cv-icon-svg { width: 0.928em; vertical-align: calc(-0.143em - 1.5pt); }
149
+
150
+ /* -------------------------------------------------------------- sections */
151
+
152
+ /* rSection: \medskip, title, \medskip, \hrule, then a list indented by 1.5em. */
153
+ .cv-document .cv-section { margin-top: 12.8pt; }
154
+ /* TeX discards glue at the top of a page. */
155
+ .cv-document .cv-page > .cv-section:first-child { margin-top: 0; }
156
+
157
+ .cv-document .cv-section-title {
158
+ padding-bottom: 2.75pt;
159
+ border-bottom: 0.4pt solid #000;
160
+ font-size: 1em;
161
+ font-weight: bold;
162
+ line-height: var(--cv-baseline);
163
+ text-transform: uppercase;
164
+ }
165
+ /* TeX puts the rule below the title's depth. */
166
+ .cv-document .cv-section-title.cv-depth-1 { padding-bottom: 4.85pt; }
167
+ .cv-document .cv-section-title.cv-depth-2 { padding-bottom: 5.5pt; }
168
+
169
+ .cv-document .cv-section-body {
170
+ padding-top: 3pt;
171
+ padding-left: 1.5em;
172
+ }
173
+
174
+ .cv-document .cv-description { margin-bottom: 6.8pt; }
175
+
176
+ /* "left \hfill right": .cv-hfill is the only space that stretches; .cv-sp spaces keep their width. */
177
+ .cv-document .cv-line {
178
+ min-height: var(--cv-baseline);
179
+ text-align: justify;
180
+ text-align-last: justify;
181
+ word-spacing: normal;
182
+ }
183
+ .cv-document .cv-sp { display: inline-block; white-space: pre; }
184
+
185
+ /* entries (rSubsection): the date and note end a space or two before the margin. */
186
+ .cv-document .cv-layout-entries .cv-date { padding-right: 0.66em; }
187
+ .cv-document .cv-layout-entries .cv-note.cv-right { padding-right: 0.33em; }
188
+ .cv-document .cv-layout-entries .cv-entry + .cv-entry { margin-top: 12.9pt; }
189
+ .cv-document .cv-layout-entries .cv-entry.cv-no-bullets + .cv-entry { margin-top: 9.5pt; }
190
+ .cv-document .cv-layout-entries .cv-section-body { padding-bottom: 6.2pt; }
191
+ /* \item[]\vspace{-2em} of an entry without bullets pulls up what follows. */
192
+ .cv-document .cv-layout-entries .cv-entry.cv-no-bullets:last-child { margin-bottom: -4.5pt; }
193
+ .cv-document .cv-layout-entries-inline .cv-entry + .cv-entry { margin-top: 12.3pt; }
194
+ .cv-document .cv-layout-entries-inline .cv-section-body { padding-bottom: 6.7pt; }
195
+
196
+ /* Bullets: \textbullet, the text indented by 1em, the label 0.5em before it. */
197
+ .cv-document .cv-bullets {
198
+ list-style: none;
199
+ margin-top: 3.75pt;
200
+ padding-left: 1em;
201
+ }
202
+ .cv-document .cv-layout-entries-inline .cv-bullets { margin-top: 1.5pt; }
203
+ .cv-document .cv-bullet { position: relative; margin-top: 1.1pt; }
204
+ .cv-document .cv-bullet::before,
205
+ .cv-document .cv-list-item::before {
206
+ content: "\2022";
207
+ position: absolute;
208
+ right: 100%;
209
+ margin-right: 0.5em;
210
+ }
211
+
212
+ /* list: itemize[leftmargin=*], nested items with an en dash. */
213
+ .cv-document .cv-list { list-style: none; padding-left: 1em; padding-bottom: 1.5pt; }
214
+ .cv-document .cv-list-item { position: relative; margin-top: 6.6pt; }
215
+ .cv-document .cv-list-item:first-child { margin-top: 0; }
216
+ .cv-document .cv-sublist { list-style: none; padding-left: 1.83em; }
217
+ .cv-document .cv-subitem { position: relative; margin-top: 6.6pt; }
218
+ .cv-document .cv-subitem::before {
219
+ content: "\2013";
220
+ position: absolute;
221
+ right: 100%;
222
+ margin-right: 0.5em;
223
+ }
224
+
225
+ /* pairs: "title:" on the left, the text on the right. */
226
+ .cv-document .cv-pairs { padding-bottom: 0.5pt; }
227
+
228
+ /* dated: tabular{p{0.5cm} p{1cm} p{14cm}}; the first row's strut is 0.7\baselineskip. */
229
+ .cv-document .cv-dated { padding-top: 2.25pt; }
230
+ .cv-document .cv-description + .cv-dated { padding-top: 0; }
231
+ .cv-document .cv-dated { margin-bottom: -1.5pt; }
232
+ .cv-document .cv-dated-row {
233
+ display: grid;
234
+ grid-template-columns: 0.5cm 1cm 14cm;
235
+ column-gap: 12pt;
236
+ padding-left: 6pt;
237
+ }
238
+ .cv-document .cv-dated-date {
239
+ grid-column: 1 / 3;
240
+ display: grid;
241
+ grid-template-columns: 0.5cm 1cm;
242
+ column-gap: 12pt;
243
+ }
244
+ .cv-document .cv-dated-row > .cv-text { grid-column: 3; text-align: justify; }
245
+
246
+ /* text: one paragraph per entry, \parskip apart. */
247
+ .cv-document .cv-text-entry + .cv-text-entry { margin-top: 6.8pt; }
248
+
249
+ /* publications: justified items, \itemsep apart. */
250
+ .cv-document .cv-publications { list-style: none; }
251
+ .cv-document .cv-section-body > .cv-publications:first-child { padding-top: 0.75pt; }
252
+ .cv-document .cv-citation { text-align: justify; margin-bottom: 6.8pt; }
@@ -0,0 +1,19 @@
1
+ {#- Inline content stays on one line, because spaces between inline elements print. -#}
2
+ {% import "macros.jinja" as m %}
3
+ <div class="cv-document" data-source-format="{{ source_format }}" data-editable="{{ 'true' if editable else 'false' }}">
4
+ {% for page in pages %}
5
+ <div class="cv-page"{{ page.where }}>
6
+ {% if loop.first %}
7
+ <header class="cv-header{% if not contact %} cv-no-contact{% endif %}">
8
+ {{ field("h1", "cv-name", name) }}
9
+ {% for line in contact %}
10
+ {{ m.contact_line(line) }}
11
+ {% endfor %}
12
+ </header>
13
+ {% endif %}
14
+ {% for section in page.sections %}
15
+ {{ m.section(section) }}
16
+ {% endfor %}
17
+ </div>
18
+ {% endfor %}
19
+ </div>
@@ -0,0 +1 @@
1
+ <svg class="cv-icon-svg" viewBox="0 -857 857 1000" aria-hidden="true" focusable="false"><path fill="currentColor" transform="scale(1,-1)" d="M429 786C192 786 0 594 0 357C0 168 123 7 293 -50C315 -54 323 -40 323 -29C323 -18 322 15 322 51C322 51 202 26 177 102C177 102 158 151 130 164C130 164 91 191 133 190C133 190 176 187 199 146C236 80 298 99 323 110C327 137 338 157 350 168C255 179 155 215 155 379C155 426 172 464 199 494C195 505 181 549 204 608C240 619 321 564 321 564C355 573 393 579 429 579C465 579 502 573 536 564C536 564 617 619 653 608C676 549 662 505 658 494C685 464 702 426 702 379C702 214 601 179 506 168C522 155 535 129 535 89V-29C535 -40 542 -54 564 -50C734 7 857 168 857 357C857 594 666 786 429 786ZM162 170C161 168 158 167 155 169C152 171 150 174 151 176C152 178 155 178 158 177C161 175 163 172 162 170ZM180 151C178 149 174 150 171 153C168 156 168 160 170 162C172 164 176 163 179 160C182 157 182 153 180 151ZM196 126C194 124 190 126 187 130C184 134 184 138 187 140C190 142 194 141 196 137C199 133 199 128 196 126ZM220 103C218 100 213 100 209 104C205 107 203 113 206 115C208 118 214 117 218 113C221 110 222 105 220 103ZM252 89C251 86 245 83 241 85C236 86 233 91 234 94C235 97 240 99 244 98C249 96 253 92 252 89ZM287 86C287 83 283 80 278 80C272 79 268 82 268 86C268 89 272 92 277 92C282 93 287 90 287 86ZM319 92C320 89 316 85 311 84C306 83 302 85 301 88C300 92 304 96 309 97C314 98 318 95 319 92Z"/></svg>
@@ -0,0 +1 @@
1
+ <svg class="cv-icon-svg" viewBox="0 -857 857 1000" aria-hidden="true" focusable="false"><path fill="currentColor" transform="scale(1,-1)" d="M132 68V455H261V68ZM270 575C270 538 241 508 196 508C152 508 124 538 124 575C124 613 154 642 198 642C242 642 269 613 270 575ZM596 68V275C596 327 577 363 531 363C495 363 474 339 465 316C462 308 461 296 461 285V68H332C334 419 332 455 332 455H461V399H460C477 426 507 464 576 464C661 464 725 409 725 290V68ZM857 625C857 714 785 786 696 786H161C72 786 0 714 0 625V89C0 0 72 -71 161 -71H696C785 -71 857 0 857 89Z"/></svg>
@@ -0,0 +1 @@
1
+ <svg class="cv-icon-svg" viewBox="0 0 256 256" aria-hidden="true" focusable="false"><path fill="#A6CE39" d="M256,128c0,70.7-57.3,128-128,128C57.3,256,0,198.7,0,128C0,57.3,57.3,0,128,0C198.7,0,256,57.3,256,128z"/><path fill="#FFFFFF" d="M86.3,186.2H70.9V79.1h15.4v48.4V186.2z M108.9,79.1h41.6c39.6,0,57,28.3,57,53.6c0,27.5-21.5,53.6-56.8,53.6h-41.8V79.1z M124.3,172.4h24.5c34.9,0,42.9-26.5,42.9-39.7c0-21.5-13.7-39.7-43.7-39.7h-23.7V172.4z M88.7,56.8c0,5.5-4.5,10.1-10.1,10.1c-5.6,0-10.1-4.6-10.1-10.1c0-5.6,4.5-10.1,10.1-10.1C84.2,46.7,88.7,51.3,88.7,56.8z"/></svg>
@@ -0,0 +1 @@
1
+ <svg class="cv-icon-svg" viewBox="0 -857 928 1000" aria-hidden="true" focusable="false"><path fill="currentColor" transform="scale(1,-1)" d="M904 629C872 615 836 606 800 602C837 624 866 659 879 701C844 680 806 665 765 657C732 692 685 714 633 714C533 714 453 633 453 534C453 520 455 506 458 493C308 501 175 572 86 681C70 654 61 623 61 590C61 528 93 472 142 440C112 441 84 450 60 463V461C60 373 122 301 205 284C190 280 173 278 157 278C145 278 134 279 123 281C146 210 213 158 292 156C230 107 152 79 68 79C53 79 40 79 25 81C105 30 199 0 301 0C632 0 814 275 814 513C814 521 815 528 814 536C849 562 879 593 904 629Z"/></svg>
@@ -0,0 +1,89 @@
1
+ {#- field() is a Python function, which Jinja calls much faster than a macro. -#}
2
+
3
+ {# ---------------------------------------------------------------- header #}
4
+
5
+ {% macro contact_line(line) -%}
6
+ <p class="cv-contact"{{ line.where }}>{% for item in line['items'] %}{% if item.joiner == "space" %}{{ " " }}{% elif item.joiner is not none %}{{ field("span", "cv-sep", item.joiner) }}{% endif %}{{ contact_item(item) }}{% endfor %}</p>
7
+ {%- endmacro %}
8
+
9
+ {% macro contact_item(item) -%}
10
+ {% if item.kind == "text" %}{{ field("span", "cv-contact-text", item.field) }}
11
+ {%- elif item.kind == "url" %}{{ link("cv-url", item) }}{{ item.field.html }}</{{ "a" if item.href else "span" }}>
12
+ {%- else %}{{ link("cv-icon cv-icon-" ~ item.kind, item) }}{% if item.field.latex %}{{ item.field.html }}{% else %}{% include "icons/" ~ item.kind ~ ".svg" %}{% endif %}</{{ "a" if item.href else "span" }}>
13
+ {%- endif %}
14
+ {%- endmacro %}
15
+
16
+ {#- <a> with a safe target, else <span>. -#}
17
+ {% macro link(cls, item) -%}
18
+ <{{ "a" if item.href else "span" }} class="{{ cls }}"{% if item.href %} href="{{ item.href }}"{% endif %}{% if item.kind in ICON_LABELS %} aria-label="{{ ICON_LABELS[item.kind] }}"{% endif %}{{ item.field.attrs }}>
19
+ {%- endmacro %}
20
+
21
+ {# -------------------------------------------------------------- sections #}
22
+
23
+ {% macro section(s) -%}
24
+ <section class="cv-section cv-layout-{{ s.layout }}"{{ s.where }} data-layout="{{ s.layout }}">
25
+ {{ field("h2", s.title_class, s.title) }}
26
+ <div class="cv-section-body">
27
+ {% if s.description is not none %}
28
+ {{ field("p", "cv-description", s.description) }}
29
+ {% endif %}
30
+ {% if s.layout in ("entries", "entries-inline") %}
31
+ {% for e in s.entries %}
32
+ {{ entry(e) }}
33
+ {% endfor %}
34
+ {% elif s.layout == "list" %}
35
+ {% if s.entries %}
36
+ <ul class="cv-list">
37
+ {% for e in s.entries %}
38
+ <li class="cv-list-item"{{ e.where }}>{{ field("span", "cv-text", e.text) }}{% if e.bullets %}<ul class="cv-sublist">{% for b in e.bullets %}{{ field("li", "cv-subitem", b) }}{% endfor %}</ul>{% endif %}</li>
39
+ {% endfor %}
40
+ </ul>
41
+ {% endif %}
42
+ {% elif s.layout == "pairs" %}
43
+ <div class="cv-pairs">
44
+ {% for e in s.entries %}
45
+ <div class="cv-pair cv-line"{{ e.where }}><span class="cv-pair-title">{{ field("span", "cv-title", e.title) }}:</span>{% if e.text is not none %}{{ HFILL }}{% endif %}{{ field("span", "cv-text cv-right", e.text) }}</div>
46
+ {% endfor %}
47
+ </div>
48
+ {% elif s.layout == "dated" %}
49
+ <div class="cv-dated">
50
+ {% for e in s.entries %}
51
+ <div class="cv-dated-row"{{ e.where }}>{% if e.date is not none %}<span class="cv-dated-date"{{ e.date.attrs }}><span class="cv-month">{{ e.date.month }}</span><span class="cv-year">{{ e.date.year }}</span></span>{% else %}<span class="cv-dated-date"></span>{% endif %}{{ field("span", "cv-text", e.text) }}</div>
52
+ {% endfor %}
53
+ </div>
54
+ {% elif s.layout == "text" %}
55
+ {% for e in s.entries %}
56
+ <div class="cv-text-entry"{{ e.where }}>{{ field("p", "cv-paragraph", e.text) }}</div>
57
+ {% endfor %}
58
+ {% elif s.layout == "publications" %}
59
+ {% if s.citations %}
60
+ <ul class="cv-publications">
61
+ {% for c in s.citations %}
62
+ <li class="cv-citation" data-readonly>{{ c }}</li>
63
+ {% endfor %}
64
+ </ul>
65
+ {% endif %}
66
+ {% endif %}
67
+ </div>
68
+ </section>
69
+ {%- endmacro %}
70
+
71
+ {#- entries and entries-inline (v1 experience and education). -#}
72
+ {% macro entry(e) -%}
73
+ <div class="cv-entry{% if not e.bullets %} cv-no-bullets{% endif %}"{{ e.where }}>
74
+ <div class="cv-line"><span class="cv-head">{{ field("strong", "cv-title", e.title) }}{% if e.location is not none %},{{ SP }}{{ field("span", "cv-location", e.location) }}{% endif %}</span>{% if e.date is not none %}{{ HFILL }}{% endif %}{{ field("em", "cv-date cv-right", e.date) }}</div>
75
+ {% if e.note_left %}
76
+ <div class="cv-line">{{ field("span", "cv-subtitle", e.subtitle) }}{{ field("span", "cv-note", e.note) }}</div>
77
+ {% else %}
78
+ <div class="cv-line">{{ field("span", "cv-subtitle", e.subtitle) }}{% if e.note is not none %}{{ HFILL }}{% endif %}{{ field("span", "cv-note cv-right", e.note) }}</div>
79
+ {% endif %}
80
+ {% if e.show_details %}
81
+ {% for d in e.details %}
82
+ {{ field("div", "cv-detail", d) }}
83
+ {% endfor %}
84
+ {% endif %}
85
+ {% if e.bullets %}
86
+ <ul class="cv-bullets">{% for b in e.bullets %}{{ field("li", "cv-bullet", b) }}{% endfor %}</ul>
87
+ {% endif %}
88
+ </div>
89
+ {%- endmacro %}
@@ -0,0 +1,45 @@
1
+ {#- Spaces and line breaks inside TeX arguments reproduce cv-tools 1.x exactly. -#}
2
+ {%- import 'layouts/entries.jinja' as entries -%}
3
+ {%- import 'layouts/entries-inline.jinja' as entries_inline -%}
4
+ {%- import 'layouts/list.jinja' as list -%}
5
+ {%- import 'layouts/pairs.jinja' as pairs -%}
6
+ {%- import 'layouts/dated.jinja' as dated -%}
7
+ {%- import 'layouts/text.jinja' as text -%}
8
+ {%- import 'layouts/publications.jinja' as publications -%}
9
+ % Generated by cv-tools {{ version }}. Compile with pdflatex next to resume.cls and orcid.pdf.
10
+
11
+ \documentclass{resume}
12
+
13
+ % ====================== Heading Section ====================== %
14
+ \name{ {{name}} }
15
+ {%- if addresses %}
16
+
17
+ % ====================== Sub-heading Section ====================== %
18
+ {%- for address in addresses %}
19
+ \address{ {{- address -}} }
20
+ {%- endfor %}
21
+ {%- endif %}
22
+
23
+ \begin{document}
24
+
25
+ {% for section in sections -%}
26
+ {%- if section.layout == 'entries' -%}
27
+ {{- entries.render(section) -}}
28
+ {%- elif section.layout == 'entries-inline' -%}
29
+ {{- entries_inline.render(section) -}}
30
+ {%- elif section.layout == 'list' -%}
31
+ {{- list.render(section) -}}
32
+ {%- elif section.layout == 'pairs' -%}
33
+ {{- pairs.render(section) -}}
34
+ {%- elif section.layout == 'dated' -%}
35
+ {{- dated.render(section) -}}
36
+ {%- elif section.layout == 'text' -%}
37
+ {{- text.render(section) -}}
38
+ {%- elif section.layout == 'publications' -%}
39
+ {{- publications.render(section) -}}
40
+ {%- elif section.layout == 'newpage' -%}
41
+ \newpage
42
+ {%- endif -%}
43
+ {%- endfor %}
44
+
45
+ \end{document}
@@ -0,0 +1,12 @@
1
+ {#- v1 "talks": a table with the date split into two columns. -#}
2
+ {% macro render(section) %}
3
+ % ====================== {{ section.comment }} Section ====================== %
4
+ \begin{rSection}{ {{ section.title }} }
5
+ {%- if section.description %}{{ section.description }}\par{% endif %}
6
+ \begin{tabular}{p{0.5cm} p{1cm} p{14cm}}
7
+ {%-for entry in section.entries %}
8
+ {{ entry.month }} & {{ entry.year }} & {{ entry.text }} \\
9
+ {%-endfor%}
10
+ \end{tabular}
11
+ \end{rSection}
12
+ {% endmacro %}
@@ -0,0 +1,23 @@
1
+ {#- v1 "education": entries separated by \medskip, details as extra lines. -#}
2
+ {% macro render(section) %}
3
+ % ====================== {{ section.comment }} Section ====================== %
4
+ \begin{rSection}{ {{-section.title-}} }
5
+ {%- if section.description %}{{ section.description }}\par{% endif %}
6
+ {% for entry in section.entries %}
7
+ {\textbf{ {{-entry.title-}} }{% if entry.location is not none %}, {{ entry.location }}{% endif %}} \hfill {\em {{ entry.date }}}
8
+ \\ {{ entry.subtitle }} \hfill {{ entry.note }}
9
+ {%-for detail in entry.details-%}
10
+ \\ {{ detail }}
11
+ {%-endfor %}
12
+ {%- if entry.bullets -%}
13
+ \begin{list}{\textbullet}{\leftmargin=1em}
14
+ \setlength{\itemsep}{-0.5em} \vspace{-0.5em}
15
+ {%- for bullet in entry.bullets -%}
16
+ \item {{ bullet }}
17
+ {%- endfor -%}
18
+ \end{list}
19
+ {%- endif -%}
20
+ \medskip
21
+ {% endfor %}
22
+ \end{rSection}
23
+ {% endmacro %}
@@ -0,0 +1,29 @@
1
+ {#- v1 "experience": one rSubsection per entry. -#}
2
+ {%-macro render(section)-%}
3
+ {% for _ in [section] %}
4
+ {{ _render_section(section) }}
5
+ {% endfor %}
6
+ {% endmacro %}
7
+
8
+ {%-macro _render_section(section)-%}
9
+ % ====================== {{ section.comment }} Section ====================== %
10
+ \begin{rSection}{ {{-section.title-}} }
11
+ {%- if section.description %}{{ section.description }}\par{% endif %}
12
+ {% for entry in section.entries %}
13
+ \begin{rSubsection}
14
+ {\textbf{ {{-entry.title-}} }{% if entry.location is not none %}, {{ entry.location }}{% endif %}}
15
+ { {{ entry.date }} }
16
+ { {{ entry.subtitle }} }
17
+ { {{- entry.note -}} }
18
+ { {{- entry.details | join('\\\\') -}} }
19
+ {%-if entry.bullets-%}
20
+ {%-for bullet in entry.bullets-%}
21
+ \item {{ bullet}}
22
+ {%-endfor%}
23
+ {% else %}
24
+ \item[]\vspace{-2em}
25
+ {%-endif-%}
26
+ \end{rSubsection}
27
+ {% endfor %}
28
+ \end{rSection}
29
+ {% endmacro %}