From 9a8175c74200526340f0c57ffec808e95030afd9 Mon Sep 17 00:00:00 2001 From: Reorx Date: Sat, 11 Feb 2023 00:33:46 +0800 Subject: [PATCH] render markdown for summary, description, highlights properties --- README.md | 1 + package-lock.json | 92 ++++++++++++++++++++++++++++++++++++++ package.json | 1 + src/lib/markdown.js | 25 +++++++++++ src/themes/data.js | 2 + src/themes/reorx/index.ejs | 12 ++--- 6 files changed, 127 insertions(+), 6 deletions(-) create mode 100644 src/lib/markdown.js diff --git a/README.md b/README.md index 67ddc82..e11fbd3 100755 --- a/README.md +++ b/README.md @@ -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 diff --git a/package-lock.json b/package-lock.json index 31acb87..8a9f605 100644 --- a/package-lock.json +++ b/package-lock.json @@ -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", diff --git a/package.json b/package.json index 5305af1..7755a2e 100644 --- a/package.json +++ b/package.json @@ -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" } } diff --git a/src/lib/markdown.js b/src/lib/markdown.js new file mode 100644 index 0000000..1471970 --- /dev/null +++ b/src/lib/markdown.js @@ -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) +} diff --git a/src/themes/data.js b/src/themes/data.js index c6d91ce..7c02a15 100644 --- a/src/themes/data.js +++ b/src/themes/data.js @@ -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, } } } diff --git a/src/themes/reorx/index.ejs b/src/themes/reorx/index.ejs index ff5862c..d7adc73 100644 --- a/src/themes/reorx/index.ejs +++ b/src/themes/reorx/index.ejs @@ -13,7 +13,7 @@ function linkInDiv(url) { <% } %> <%- linkInDiv(cv.basics.url) %> <% if (cv.basics.summary) { %> -
<%= cv.basics.summary %>
+
<%- fn.renderMarkdown(cv.basics.summary) %>
<% } %>
<% if (cv.basics.email) { %> @@ -110,12 +110,12 @@ function dateRange(item, level) { <%- dateRange(item, 2) %>
<%= item.position %>
-
<%= item.summary %>
+
<%- fn.renderMarkdown(item.summary) %>
<% if (item.highlights && item.highlights.length > 0) { %>
@@ -139,12 +139,12 @@ function dateRange(item, level) {

<%= item.name %>

<%- dateRange(item, 2) %> -
<%= item.description %>
+
<%- fn.renderMarkdown(item.description) %>
<% if (item.highlights && item.highlights.length > 0) { %>
@@ -173,7 +173,7 @@ function dateRange(item, level) {

<%= item.name %>

<%- dateRange(item, 1) %> -
<%= item.description %>
+
<%- fn.renderMarkdown(item.description) %>
<% if (item.keywords && item.keywords.length > 0) { %>
<% for (const kw of item.keywords) { %>