diff --git a/package-lock.json b/package-lock.json index ed04609..96b991f 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", @@ -39,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" @@ -1108,6 +1110,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", @@ -1925,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", @@ -1984,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", @@ -2017,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", @@ -3409,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", @@ -3493,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", @@ -4334,6 +4415,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", @@ -4965,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", @@ -5018,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", @@ -5042,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", @@ -5991,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", @@ -6055,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 2d44c95..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": { @@ -38,6 +39,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..5732e7b 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' diff --git a/src/routes/guides.json.js b/src/routes/guides.json.js index d8062fc..fe9f1b7 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,8 +59,9 @@ export async function get({ const html = await marked(content, { renderer }) - + const optimHTML = await imageSrc(html) + const escapedHTML = htmlEscape(html) guides.push({ case: data.case, diff --git a/svelte.config.js b/svelte.config.js index f1b7d16..1dc3a6c 100644 --- a/svelte.config.js +++ b/svelte.config.js @@ -2,11 +2,12 @@ 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'], preprocess: [ - md.mdsvex(), + md.mdsvex({ extensions: ['.svx', '.md'] }), preprocess({ defaults: { style: 'postcss' @@ -19,6 +20,9 @@ const config = { // hydrate the
element in src/app.html target: '#svelte', adapter: adapter(), + vite: () => ({ + plugins: [Markdown] + }) } };