From 9e9ea99c61982eeacbc5dbcd8a9937bed9b75a5c Mon Sep 17 00:00:00 2001 From: fershad Date: Fri, 20 Aug 2021 19:18:09 +0800 Subject: [PATCH 1/6] tryout auto escape md --- package-lock.json | 17 +++++++++++++++++ package.json | 1 + .../snow/cases/detect-snow-cover/process.md | 2 +- src/routes/guide/[slug].svelte | 3 ++- src/routes/guides.json.js | 6 ++++-- 5 files changed, 25 insertions(+), 4 deletions(-) diff --git a/package-lock.json b/package-lock.json index ed04609..c9bd838 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "bluebird": "^3.7.2", "cheerio": "^1.0.0-rc.10", "cookie": "^0.4.1", + "escape-goat": "^4.0.0", "file-saver": "^2.0.5", "got": "^11.8.2", "jszip": "^3.7.1", @@ -1108,6 +1109,17 @@ "node": ">=6" } }, + "node_modules/escape-goat": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", + "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", @@ -4334,6 +4346,11 @@ "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", "dev": true }, + "escape-goat": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-goat/-/escape-goat-4.0.0.tgz", + "integrity": "sha512-2Sd4ShcWxbx6OY1IHyla/CVNwvg7XwZVoXZHcSu9w9SReNP1EzzD5T8NWKIR38fIqEns9kDWKUQTXXAmlDrdPg==" + }, "escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", diff --git a/package.json b/package.json index 2d44c95..0be9587 100644 --- a/package.json +++ b/package.json @@ -38,6 +38,7 @@ "bluebird": "^3.7.2", "cheerio": "^1.0.0-rc.10", "cookie": "^0.4.1", + "escape-goat": "^4.0.0", "file-saver": "^2.0.5", "got": "^11.8.2", "jszip": "^3.7.1", diff --git a/src/guides/snow/cases/detect-snow-cover/process.md b/src/guides/snow/cases/detect-snow-cover/process.md index fd467f6..752424f 100644 --- a/src/guides/snow/cases/detect-snow-cover/process.md +++ b/src/guides/snow/cases/detect-snow-cover/process.md @@ -93,7 +93,7 @@ Cool, we have raster data. But why do you have multiple files of the same locati How does the NDSI indicator work?

The Normalized Difference Snow Index (NDSI) is derived from the green and short wave infrared bands. This formula shows snow cover over land areas.

Since snow absorbs most of the incident radiation in the SWIR while clouds do not, this enables NDSI to distinguish snow from clouds. This formula is commonly used in snow/ice cover mapping application as well as glacier monitoring.

-

A value of NDSI > 0.0 is considered to have some snow present. A value with NDSI <= 0.0 is a snow-free land surface.

+

A value of NDSI > 0.0 is considered to have some snow present. A value with NDSI <= 0.0 is a snow-free land surface.

Enough dry theory. Now it's down to the nitty-gritty. diff --git a/src/routes/guide/[slug].svelte b/src/routes/guide/[slug].svelte index f02fa81..4f87af4 100644 --- a/src/routes/guide/[slug].svelte +++ b/src/routes/guide/[slug].svelte @@ -39,6 +39,7 @@ // let downloads import {toast} from '@zerodevx/svelte-toast' + import {htmlEscape, htmlUnescape} from 'escape-goat'; import {onMount} from 'svelte' import {choice as selected, location, range} from '$lib/store' @@ -183,7 +184,7 @@
{#if guide} - {@html guide.content.process[0]} + {@html htmlUnescape(guide.content.process[0])} {/if}
diff --git a/src/routes/guides.json.js b/src/routes/guides.json.js index d8062fc..df39474 100644 --- a/src/routes/guides.json.js +++ b/src/routes/guides.json.js @@ -4,6 +4,7 @@ import marked from 'marked'; import grayMatter from 'gray-matter' const __dirname = path.resolve(path.dirname('')); import * as cheerio from 'cheerio'; +import {htmlEscape, htmlUnescape} from 'escape-goat'; const mode = process.env.NODE_ENV const guidesPath = mode === 'development' ? __dirname : '/opt/build/repo' @@ -58,13 +59,14 @@ export async function get({ const html = await marked(content, { renderer }) - + const optimHTML = await imageSrc(html) + const escapedHTML = htmlEscape(optimHTML) guides.push({ case: data.case, content: data.content, - html: optimHTML + html: escapedHTML }) } From 0903162c5b4cc8c5cea0709009375f4e14c7384e Mon Sep 17 00:00:00 2001 From: fershad Date: Fri, 20 Aug 2021 19:24:44 +0800 Subject: [PATCH 2/6] change svelte config --- src/routes/guide/[slug].svelte | 2 +- src/routes/guides.json.js | 4 ++-- svelte.config.js | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/routes/guide/[slug].svelte b/src/routes/guide/[slug].svelte index 4f87af4..5732e7b 100644 --- a/src/routes/guide/[slug].svelte +++ b/src/routes/guide/[slug].svelte @@ -184,7 +184,7 @@
{#if guide} - {@html htmlUnescape(guide.content.process[0])} + {@html guide.content.process[0]} {/if}
diff --git a/src/routes/guides.json.js b/src/routes/guides.json.js index df39474..fe9f1b7 100644 --- a/src/routes/guides.json.js +++ b/src/routes/guides.json.js @@ -61,12 +61,12 @@ export async function get({ }) const optimHTML = await imageSrc(html) - const escapedHTML = htmlEscape(optimHTML) + const escapedHTML = htmlEscape(html) guides.push({ case: data.case, content: data.content, - html: escapedHTML + html: optimHTML }) } diff --git a/svelte.config.js b/svelte.config.js index f1b7d16..0cc7129 100644 --- a/svelte.config.js +++ b/svelte.config.js @@ -4,7 +4,7 @@ import md from 'mdsvex'; import adapter from '@sveltejs/adapter-netlify'; const config = { - extensions: [".svelte", ".md", '.svx'], + extensions: [".svelte", '.svx'], preprocess: [ md.mdsvex(), preprocess({ From 32db12b3dc979b1ada103df69f392297f6d08c4a Mon Sep 17 00:00:00 2001 From: fershad Date: Fri, 20 Aug 2021 19:39:25 +0800 Subject: [PATCH 3/6] use mdsvex --- svelte.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/svelte.config.js b/svelte.config.js index 0cc7129..40f6633 100644 --- a/svelte.config.js +++ b/svelte.config.js @@ -6,7 +6,7 @@ import adapter from '@sveltejs/adapter-netlify'; const config = { extensions: [".svelte", '.svx'], preprocess: [ - md.mdsvex(), + md.mdsvex({ extensions: ['.svx', '.md'] }), preprocess({ defaults: { style: 'postcss' From b11637dafe664852edc90ef7150ffb8f4d5bfb8f Mon Sep 17 00:00:00 2001 From: fershad Date: Fri, 20 Aug 2021 19:41:39 +0800 Subject: [PATCH 4/6] use mdsvex --- svelte.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/svelte.config.js b/svelte.config.js index 40f6633..eb3b217 100644 --- a/svelte.config.js +++ b/svelte.config.js @@ -4,7 +4,7 @@ import md from 'mdsvex'; import adapter from '@sveltejs/adapter-netlify'; const config = { - extensions: [".svelte", '.svx'], + extensions: [".svelte", ".md", '.svx'], preprocess: [ md.mdsvex({ extensions: ['.svx', '.md'] }), preprocess({ From af96da9d9a45c5d752f46fcb1dc17f441d39f0ab Mon Sep 17 00:00:00 2001 From: fershad Date: Fri, 20 Aug 2021 20:39:29 +0800 Subject: [PATCH 5/6] use vite plugin --- package-lock.json | 129 +++++++++++++++++++++++++++++++++++++++++++++- package.json | 3 +- svelte.config.js | 4 ++ 3 files changed, 134 insertions(+), 2 deletions(-) diff --git a/package-lock.json b/package-lock.json index c9bd838..96b991f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -40,7 +40,8 @@ "prettier": "~2.3.2", "prettier-plugin-svelte": "^2.3.1", "svelte": "^3.42.1", - "svelte-preprocess": "^4.7.4" + "svelte-preprocess": "^4.7.4", + "vite-plugin-md": "^0.11.0" }, "engines": { "node": ">=14.13" @@ -1937,6 +1938,15 @@ "node": ">=10" } }, + "node_modules/linkify-it": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.2.tgz", + "integrity": "sha512-gDBO4aHNZS6coiZCKVhSNh43F9ioIL4JwRjLZPkoLIY4yZFwg264Y5lu2x6rb1Js42Gh6Yqm2f6L2AJcnkzinQ==", + "dev": true, + "dependencies": { + "uc.micro": "^1.0.1" + } + }, "node_modules/lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", @@ -1996,6 +2006,37 @@ "sourcemap-codec": "^1.4.4" } }, + "node_modules/markdown-it": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.2.0.tgz", + "integrity": "sha512-Wjws+uCrVQRqOoJvze4HCqkKl1AsSh95iFAeQDwnyfxM09divCBSXlDR1uTvyUP3Grzpn4Ru8GeCxYPM8vkCQg==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.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==", + "dev": true + }, + "node_modules/markdown-it/node_modules/entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "dev": true, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, "node_modules/marked": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/marked/-/marked-2.1.3.tgz", @@ -2029,6 +2070,12 @@ "svelte": "3.x" } }, + "node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", + "dev": true + }, "node_modules/mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", @@ -3421,6 +3468,12 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "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==", + "dev": true + }, "node_modules/uniqs": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", @@ -3505,6 +3558,22 @@ "fsevents": "~2.3.2" } }, + "node_modules/vite-plugin-md": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/vite-plugin-md/-/vite-plugin-md-0.11.0.tgz", + "integrity": "sha512-sEwJQ0nBawYCEnMGEGsvxA6WM2sBXBFa0SMEAlMiNxivzDCR2/HWc/5qzZAh6ZJ66mivW+1WDruVVtiq/3EqLA==", + "dev": true, + "dependencies": { + "gray-matter": "^4.0.3", + "markdown-it": "^12.2.0" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "vite": "^2.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -4982,6 +5051,15 @@ "integrity": "sha512-EHKqr/+ZvdKCifpNrJCKxBTgk5XupZA3y/aCPY9mxfgBzmgh93Mt/WqjjQ38oMxXuvDokaKiM3lAgvSH2sjtHg==", "dev": true }, + "linkify-it": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-3.0.2.tgz", + "integrity": "sha512-gDBO4aHNZS6coiZCKVhSNh43F9ioIL4JwRjLZPkoLIY4yZFwg264Y5lu2x6rb1Js42Gh6Yqm2f6L2AJcnkzinQ==", + "dev": true, + "requires": { + "uc.micro": "^1.0.1" + } + }, "lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", @@ -5035,6 +5113,33 @@ "sourcemap-codec": "^1.4.4" } }, + "markdown-it": { + "version": "12.2.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-12.2.0.tgz", + "integrity": "sha512-Wjws+uCrVQRqOoJvze4HCqkKl1AsSh95iFAeQDwnyfxM09divCBSXlDR1uTvyUP3Grzpn4Ru8GeCxYPM8vkCQg==", + "dev": true, + "requires": { + "argparse": "^2.0.1", + "entities": "~2.1.0", + "linkify-it": "^3.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==", + "dev": true + }, + "entities": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-2.1.0.tgz", + "integrity": "sha512-hCx1oky9PFrJ611mf0ifBLBRW8lUUVRlFolb5gWRfIELabBlbp9xZvrqZLZAs+NxFnbfQoeGd8wDkygjg7U85w==", + "dev": true + } + } + }, "marked": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/marked/-/marked-2.1.3.tgz", @@ -5059,6 +5164,12 @@ "vfile-message": "^2.0.4" } }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", + "dev": true + }, "mimic-response": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-1.0.1.tgz", @@ -6008,6 +6119,12 @@ "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "dev": true }, + "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==", + "dev": true + }, "uniqs": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz", @@ -6072,6 +6189,16 @@ "rollup": "^2.38.5" } }, + "vite-plugin-md": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/vite-plugin-md/-/vite-plugin-md-0.11.0.tgz", + "integrity": "sha512-sEwJQ0nBawYCEnMGEGsvxA6WM2sBXBFa0SMEAlMiNxivzDCR2/HWc/5qzZAh6ZJ66mivW+1WDruVVtiq/3EqLA==", + "dev": true, + "requires": { + "gray-matter": "^4.0.3", + "markdown-it": "^12.2.0" + } + }, "which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", diff --git a/package.json b/package.json index 0be9587..cbf49eb 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,8 @@ "prettier": "~2.3.2", "prettier-plugin-svelte": "^2.3.1", "svelte": "^3.42.1", - "svelte-preprocess": "^4.7.4" + "svelte-preprocess": "^4.7.4", + "vite-plugin-md": "^0.11.0" }, "type": "module", "dependencies": { diff --git a/svelte.config.js b/svelte.config.js index eb3b217..6f4df2a 100644 --- a/svelte.config.js +++ b/svelte.config.js @@ -2,6 +2,7 @@ import preprocess from 'svelte-preprocess' import md from 'mdsvex'; import adapter from '@sveltejs/adapter-netlify'; +import Markdown from 'vite-plugin-md' const config = { extensions: [".svelte", ".md", '.svx'], @@ -19,6 +20,9 @@ const config = { // hydrate the
element in src/app.html target: '#svelte', adapter: adapter(), + vite: () => ({ + plugins: [Markdown()] + }) } }; From 2298db0658f8bdb58dc1eb1f7d20750a68db3e3c Mon Sep 17 00:00:00 2001 From: fershad Date: Fri, 20 Aug 2021 20:41:11 +0800 Subject: [PATCH 6/6] use vite plugin --- svelte.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/svelte.config.js b/svelte.config.js index 6f4df2a..1dc3a6c 100644 --- a/svelte.config.js +++ b/svelte.config.js @@ -21,7 +21,7 @@ const config = { target: '#svelte', adapter: adapter(), vite: () => ({ - plugins: [Markdown()] + plugins: [Markdown] }) } };