diff --git a/client/nuxt.config.js b/client/nuxt.config.js index 8311fe4d5ea7ffc621df01f30cffbb58a87a8e40..7ab7cc738b5bd8ce392db0b84be570729801a4cd 100644 --- a/client/nuxt.config.js +++ b/client/nuxt.config.js @@ -32,6 +32,7 @@ export default { // Plugins to run before rendering page: https://go.nuxtjs.dev/config-plugins plugins: [ + { src: '~/plugins/sanitizedHtml.js', mode: 'client' }, ], // Auto import components: https://go.nuxtjs.dev/config-components @@ -52,6 +53,7 @@ export default { modules: [ // https://go.nuxtjs.dev/axios '@nuxtjs/axios', + '@nuxtjs/markdownit' ], // Axios module configuration: https://go.nuxtjs.dev/config-axios diff --git a/client/package.json b/client/package.json index 1ce733bb6476100da7423faf81b1f0cc6184a844..9e960dbdab9b5055a3f4539de5464bd47c5ecf9c 100644 --- a/client/package.json +++ b/client/package.json @@ -18,8 +18,10 @@ }, "dependencies": { "@nuxtjs/axios": "^5.13.6", + "@nuxtjs/markdownit": "^2.0.0", "core-js": "^3.35.0", "d3": "^7.1.1", + "dompurify": "^2.4.7", "lodash": "^4.17.21", "nuxt": "^2.17.3", "plotly.js-dist": "^2.28.0", diff --git a/client/pages/gwas.vue b/client/pages/gwas.vue index 3ac0360acd94848981c6cce4e991acba0302c370..8d9a397a802059c637049e6aac6b5422a7f5ada5 100644 --- a/client/pages/gwas.vue +++ b/client/pages/gwas.vue @@ -17,7 +17,7 @@ :class="{ 'selected-table': selectedInitTable === table.tableName }" :color="selectedInitTable === table.tableName ? 'blue lighten-4' : ''"> <v-card-title>{{ table.name }}</v-card-title> - <v-card-text>{{ table.desc }}</v-card-text> + <v-card-text v-sanitized-html="$md.render(table.desc)"></v-card-text> <v-card-text> <div> <strong>{{ table.nb_snps.toLocaleString() }}</strong> @@ -166,6 +166,10 @@ section h2 { word-break: normal; } +.init-table-card .v-card__text { + font-size: 16px; +} + .card-buttons { justify-content: end; } diff --git a/client/plugins/sanitizedHtml.js b/client/plugins/sanitizedHtml.js new file mode 100644 index 0000000000000000000000000000000000000000..408c4e3e775339322850fe643803fd6bfec76998 --- /dev/null +++ b/client/plugins/sanitizedHtml.js @@ -0,0 +1,12 @@ +import Vue from 'vue' +import DOMPurify from 'dompurify' + +/** + * Use DOMpurify to sanitize html or markdown strings. + * This directive should be used instead of the native v-html. + */ +Vue.directive('sanitized-html', { + bind: (el, binding) => { + el.innerHTML = DOMPurify.sanitize(binding.value) + }, +}) diff --git a/client/yarn.lock b/client/yarn.lock index 0c545c08874ca0c897049caddcfa0dbea0d2bacd..c6166e2c25e28bfe8c53ba17c3b00cd04a24d786 100644 --- a/client/yarn.lock +++ b/client/yarn.lock @@ -1786,6 +1786,24 @@ defu "^6.0.0" eslint-webpack-plugin "^2.6.0" +"@nuxtjs/markdownit-loader@^1.1.1": + version "1.2.0" + resolved "https://registry.yarnpkg.com/@nuxtjs/markdownit-loader/-/markdownit-loader-1.2.0.tgz#02e31b778bdbb61c13a5991021d660a21393b2c2" + integrity sha512-D6m4578NavamwD03nOU3H3NkS2zYfFJSMChUczlCGDx05DgAoenY4GdCmML1CnAEH/Cv6Bf230RIwDnD926oyQ== + dependencies: + highlight.js "^10.5.0" + loader-utils "^1.1.0" + markdown-it "^8.3.1" + +"@nuxtjs/markdownit@^2.0.0": + version "2.0.0" + resolved "https://registry.yarnpkg.com/@nuxtjs/markdownit/-/markdownit-2.0.0.tgz#5fcd35afdb78f328ba2dbc1f678f0c0bb9ea85f9" + integrity sha512-YAEK/s0IzdWK1L74WKTQSMcvNhGgOW0xIWdu5VMxDo1NkNpm/0CbJZgSPt1JYAnT8r8r6wVQ5SY1v/1MZanPlQ== + dependencies: + "@nuxtjs/markdownit-loader" "^1.1.1" + defu "^3.2.2" + raw-loader "^4.0.2" + "@nuxtjs/proxy@^2.1.0": version "2.1.0" resolved "https://registry.npmjs.org/@nuxtjs/proxy/-/proxy-2.1.0.tgz" @@ -4007,6 +4025,11 @@ define-property@^2.0.2: is-descriptor "^1.0.2" isobject "^3.0.1" +defu@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/defu/-/defu-3.2.2.tgz#be20f4cc49b9805d54ee6b610658d53894942e97" + integrity sha512-8UWj5lNv7HD+kB0e9w77Z7TdQlbUYDVWqITLHNqFIn6khrNHv5WQo38Dcm1f6HeNyZf0U7UbPf6WeZDSdCzGDQ== + defu@^5.0.0: version "5.0.1" resolved "https://registry.npmjs.org/defu/-/defu-5.0.1.tgz" @@ -4161,6 +4184,11 @@ domhandler@^5.0.2, domhandler@^5.0.3: dependencies: domelementtype "^2.3.0" +dompurify@^2.4.7: + version "2.4.7" + resolved "https://registry.yarnpkg.com/dompurify/-/dompurify-2.4.7.tgz#277adeb40a2c84be2d42a8bcd45f582bfa4d0cfc" + integrity sha512-kxxKlPEDa6Nc5WJi+qRgPbOAbgTpSULL+vI3NUXsZMlkJxTqYI9wg5ZTay2sFrdZRWHPWNi+EdAhcJf81WtoMQ== + domutils@^1.5.1: version "1.7.0" resolved "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz" @@ -4286,9 +4314,9 @@ enquirer@^2.3.5, enquirer@^2.3.6: dependencies: ansi-colors "^4.1.1" -entities@^1.1.1: +entities@^1.1.1, entities@~1.1.1: version "1.1.2" - resolved "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz" + resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz#bdfa735299664dfafd34529ed4f8522a275fea56" integrity sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w== entities@^2.0.0: @@ -5451,6 +5479,11 @@ he@1.2.0, he@^1.2.0: resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== +highlight.js@^10.5.0: + version "10.7.3" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-10.7.3.tgz#697272e3991356e40c3cac566a74eef681756531" + integrity sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A== + hmac-drbg@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz" @@ -6301,6 +6334,13 @@ lines-and-columns@^1.1.6: resolved "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz" integrity "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA= sha512-8ZmlJFVK9iCmtLz19HpSsR8HaAMWBT284VMNednLwlIMDP2hJDCIhUp0IZ2xUcZ+Ob6BM0VvCSJwzASDM45NLQ==" +linkify-it@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/linkify-it/-/linkify-it-2.2.0.tgz#e3b54697e78bf915c70a38acd78fd09e0058b1cf" + integrity sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw== + dependencies: + uc.micro "^1.0.1" + lint-staged@^10.5.4: version "10.5.4" resolved "https://registry.npmjs.org/lint-staged/-/lint-staged-10.5.4.tgz" @@ -6552,6 +6592,17 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" +markdown-it@^8.3.1: + version "8.4.2" + resolved "https://registry.yarnpkg.com/markdown-it/-/markdown-it-8.4.2.tgz#386f98998dc15a37722aa7722084f4020bdd9b54" + integrity sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ== + dependencies: + argparse "^1.0.7" + entities "~1.1.1" + linkify-it "^2.0.0" + mdurl "^1.0.1" + uc.micro "^1.0.5" + markdown-table@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/markdown-table/-/markdown-table-2.0.0.tgz" @@ -6616,6 +6667,11 @@ mdn-data@2.0.30: resolved "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz" integrity sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA== +mdurl@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/mdurl/-/mdurl-1.0.1.tgz#fe85b2ec75a59037f2adfec100fd6c601761152e" + integrity sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g== + memfs@^3.4.3: version "3.5.3" resolved "https://registry.npmjs.org/memfs/-/memfs-3.5.3.tgz" @@ -8575,6 +8631,14 @@ range-parser@^1.2.1, range-parser@~1.2.1: resolved "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz" integrity sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg== +raw-loader@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/raw-loader/-/raw-loader-4.0.2.tgz#1aac6b7d1ad1501e66efdac1522c73e59a584eb6" + integrity sha512-ZnScIV3ag9A4wPX/ZayxL/jZH+euYb6FcUinPcgiQW0+UBtEv0O6Q3lGd3cqJ+GHH+rksEv3Pj99oxJ3u3VIKA== + dependencies: + loader-utils "^2.0.0" + schema-utils "^3.0.0" + rc9@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/rc9/-/rc9-2.1.1.tgz" @@ -10023,6 +10087,11 @@ ua-parser-js@^1.0.37: resolved "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-1.0.37.tgz" integrity sha512-bhTyI94tZofjo+Dn8SN6Zv8nBDvyXTymAdM3LDI/0IboIUwTu1rEhW7v2TfiVsoYWgkQ4kOVqnI8APUFbIQIFQ== +uc.micro@^1.0.1, uc.micro@^1.0.5: + version "1.0.6" + resolved "https://registry.yarnpkg.com/uc.micro/-/uc.micro-1.0.6.tgz#9c411a802a409a91fc6cf74081baba34b24499ac" + integrity sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA== + ufo@^1.3.2: version "1.3.2" resolved "https://registry.npmjs.org/ufo/-/ufo-1.3.2.tgz"