render markdown for summary, description, highlights properties

This commit is contained in:
Reorx 2023-02-11 00:33:46 +08:00
parent ca72902ed7
commit 9a8175c742
6 changed files with 127 additions and 6 deletions

View File

@ -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

92
package-lock.json generated
View File

@ -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",

View File

@ -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"
}
}

25
src/lib/markdown.js Normal file
View File

@ -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)
}

View File

@ -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,
}
}
}

View File

@ -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) { %>