render markdown for summary, description, highlights properties
This commit is contained in:
parent
ca72902ed7
commit
9a8175c742
|
|
@ -188,6 +188,7 @@ Solutions:
|
|||
|
||||
## TODO
|
||||
|
||||
- [x] Supports Markdown in `summary` and `description` properties
|
||||
- [ ] Allows switching themes in Editor
|
||||
- [ ] Allows customizing primary color for the current theme
|
||||
- [ ] Export PDF directly
|
||||
|
|
|
|||
|
|
@ -16,6 +16,7 @@
|
|||
"dayjs": "^1.11.7",
|
||||
"ejs": "^3.1.8",
|
||||
"iconify-icon": "^1.0.3",
|
||||
"markdown-it": "^13.0.1",
|
||||
"object-path": "^0.11.8"
|
||||
},
|
||||
"devDependencies": {
|
||||
|
|
@ -713,6 +714,17 @@
|
|||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/entities": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz",
|
||||
"integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==",
|
||||
"engines": {
|
||||
"node": ">=0.12"
|
||||
},
|
||||
"funding": {
|
||||
"url": "https://github.com/fb55/entities?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/esbuild": {
|
||||
"version": "0.16.17",
|
||||
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz",
|
||||
|
|
@ -1477,6 +1489,14 @@
|
|||
"integrity": "sha512-ymToLHqL02udwVdbkowNpzjFd6UzozMtshPQKVi5k1EjKRqKqBrOnE9QbLEb0/pV76SAiIT13hdL8R6suc+f3g==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/linkify-it": {
|
||||
"version": "4.0.1",
|
||||
"resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz",
|
||||
"integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==",
|
||||
"dependencies": {
|
||||
"uc.micro": "^1.0.1"
|
||||
}
|
||||
},
|
||||
"node_modules/local-pkg": {
|
||||
"version": "0.4.3",
|
||||
"resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz",
|
||||
|
|
@ -1513,6 +1533,31 @@
|
|||
"sourcemap-codec": "^1.4.8"
|
||||
}
|
||||
},
|
||||
"node_modules/markdown-it": {
|
||||
"version": "13.0.1",
|
||||
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz",
|
||||
"integrity": "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==",
|
||||
"dependencies": {
|
||||
"argparse": "^2.0.1",
|
||||
"entities": "~3.0.1",
|
||||
"linkify-it": "^4.0.1",
|
||||
"mdurl": "^1.0.1",
|
||||
"uc.micro": "^1.0.5"
|
||||
},
|
||||
"bin": {
|
||||
"markdown-it": "bin/markdown-it.js"
|
||||
}
|
||||
},
|
||||
"node_modules/markdown-it/node_modules/argparse": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
|
||||
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
|
||||
},
|
||||
"node_modules/mdurl": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
|
||||
"integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g=="
|
||||
},
|
||||
"node_modules/merge-stream": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
|
||||
|
|
@ -1958,6 +2003,11 @@
|
|||
"node": ">=8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/uc.micro": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
|
||||
"integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA=="
|
||||
},
|
||||
"node_modules/uglify-js": {
|
||||
"version": "3.17.4",
|
||||
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz",
|
||||
|
|
@ -2604,6 +2654,11 @@
|
|||
"jake": "^10.8.5"
|
||||
}
|
||||
},
|
||||
"entities": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz",
|
||||
"integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q=="
|
||||
},
|
||||
"esbuild": {
|
||||
"version": "0.16.17",
|
||||
"resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.16.17.tgz",
|
||||
|
|
@ -3079,6 +3134,14 @@
|
|||
"integrity": "sha512-ymToLHqL02udwVdbkowNpzjFd6UzozMtshPQKVi5k1EjKRqKqBrOnE9QbLEb0/pV76SAiIT13hdL8R6suc+f3g==",
|
||||
"dev": true
|
||||
},
|
||||
"linkify-it": {
|
||||
"version": "4.0.1",
|
||||
"resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz",
|
||||
"integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==",
|
||||
"requires": {
|
||||
"uc.micro": "^1.0.1"
|
||||
}
|
||||
},
|
||||
"local-pkg": {
|
||||
"version": "0.4.3",
|
||||
"resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.4.3.tgz",
|
||||
|
|
@ -3103,6 +3166,30 @@
|
|||
"sourcemap-codec": "^1.4.8"
|
||||
}
|
||||
},
|
||||
"markdown-it": {
|
||||
"version": "13.0.1",
|
||||
"resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.1.tgz",
|
||||
"integrity": "sha512-lTlxriVoy2criHP0JKRhO2VDG9c2ypWCsT237eDiLqi09rmbKoUetyGHq2uOIRoRS//kfoJckS0eUzzkDR+k2Q==",
|
||||
"requires": {
|
||||
"argparse": "^2.0.1",
|
||||
"entities": "~3.0.1",
|
||||
"linkify-it": "^4.0.1",
|
||||
"mdurl": "^1.0.1",
|
||||
"uc.micro": "^1.0.5"
|
||||
},
|
||||
"dependencies": {
|
||||
"argparse": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
|
||||
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q=="
|
||||
}
|
||||
}
|
||||
},
|
||||
"mdurl": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz",
|
||||
"integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g=="
|
||||
},
|
||||
"merge-stream": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz",
|
||||
|
|
@ -3418,6 +3505,11 @@
|
|||
"is-number": "^7.0.0"
|
||||
}
|
||||
},
|
||||
"uc.micro": {
|
||||
"version": "1.0.6",
|
||||
"resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz",
|
||||
"integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA=="
|
||||
},
|
||||
"uglify-js": {
|
||||
"version": "3.17.4",
|
||||
"resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.17.4.tgz",
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@
|
|||
"dayjs": "^1.11.7",
|
||||
"ejs": "^3.1.8",
|
||||
"iconify-icon": "^1.0.3",
|
||||
"markdown-it": "^13.0.1",
|
||||
"object-path": "^0.11.8"
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -0,0 +1,25 @@
|
|||
/* Until "2023020922 vite ERR_IMPORT_ASSERTION_TYPE_MISSING" is resolved, micromark cannot be used
|
||||
import { micromark } from 'micromark';
|
||||
import {
|
||||
gfm,
|
||||
gfmHtml,
|
||||
} from 'micromark-extension-gfm';
|
||||
|
||||
export function renderMarkdown(text) {
|
||||
return micromark(text, {
|
||||
extensions: [gfm()],
|
||||
htmlExtensions: [gfmHtml()]
|
||||
})
|
||||
}
|
||||
*/
|
||||
|
||||
import MarkdownIt from 'markdown-it';
|
||||
|
||||
const md = new MarkdownIt()
|
||||
|
||||
export function renderMarkdown(text, inline = false) {
|
||||
if (inline) {
|
||||
return md.renderInline(text)
|
||||
}
|
||||
return md.render(text)
|
||||
}
|
||||
|
|
@ -1,5 +1,6 @@
|
|||
import { reformatDate } from '../lib/date';
|
||||
import { getIconSVG } from '../lib/icons';
|
||||
import { renderMarkdown } from '../lib/markdown';
|
||||
|
||||
export function getRenderData(cvData) {
|
||||
return {
|
||||
|
|
@ -9,6 +10,7 @@ export function getRenderData(cvData) {
|
|||
reformatDate,
|
||||
getIconSVG,
|
||||
noSchemaURL,
|
||||
renderMarkdown,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -13,7 +13,7 @@ function linkInDiv(url) {
|
|||
<% } %>
|
||||
<%- linkInDiv(cv.basics.url) %>
|
||||
<% if (cv.basics.summary) { %>
|
||||
<div class="summary"><%= cv.basics.summary %></div>
|
||||
<div class="summary"><%- fn.renderMarkdown(cv.basics.summary) %></div>
|
||||
<% } %>
|
||||
<div class="contact row">
|
||||
<% if (cv.basics.email) { %>
|
||||
|
|
@ -110,12 +110,12 @@ function dateRange(item, level) {
|
|||
<%- dateRange(item, 2) %>
|
||||
</div>
|
||||
<div class="position row fz-4"><%= item.position %></div>
|
||||
<div class="summary row"><%= item.summary %></div>
|
||||
<div class="summary row"><%- fn.renderMarkdown(item.summary) %></div>
|
||||
<% if (item.highlights && item.highlights.length > 0) { %>
|
||||
<div class="highlights row">
|
||||
<ul>
|
||||
<% for (const hl of item.highlights) { %>
|
||||
<li><%= hl %></li>
|
||||
<li><%- fn.renderMarkdown(hl, true) %></li>
|
||||
<% } %>
|
||||
</ul>
|
||||
</div>
|
||||
|
|
@ -139,12 +139,12 @@ function dateRange(item, level) {
|
|||
<h3><%= item.name %></h3>
|
||||
<%- dateRange(item, 2) %>
|
||||
</div>
|
||||
<div class="row lh-para"><%= item.description %></div>
|
||||
<div class="row lh-para"><%- fn.renderMarkdown(item.description) %></div>
|
||||
<% if (item.highlights && item.highlights.length > 0) { %>
|
||||
<div class="highlights row">
|
||||
<ul>
|
||||
<% for (const hl of item.highlights) { %>
|
||||
<li><%= hl %></li>
|
||||
<li><%- fn.renderMarkdown(hl, true) %></li>
|
||||
<% } %>
|
||||
</ul>
|
||||
</div>
|
||||
|
|
@ -173,7 +173,7 @@ function dateRange(item, level) {
|
|||
<h3><%= item.name %></h3>
|
||||
<%- dateRange(item, 1) %>
|
||||
</div>
|
||||
<div class="description row lh-para"><%= item.description %></div>
|
||||
<div class="description row lh-para"><%- fn.renderMarkdown(item.description) %></div>
|
||||
<% if (item.keywords && item.keywords.length > 0) { %>
|
||||
<div class="keywords row">
|
||||
<% for (const kw of item.keywords) { %>
|
||||
|
|
|
|||
Loading…
Reference in New Issue