From 161e7446e6523a5ce77eabde260fd0024e49a32f Mon Sep 17 00:00:00 2001 From: Jasper De Moor Date: Sun, 22 Dec 2019 16:53:13 +0100 Subject: [PATCH 01/10] markdown transformer --- packages/configs/default/index.json | 1 + packages/configs/default/package.json | 3 +- packages/examples/markdown/package.json | 16 +++++++++ packages/examples/markdown/src/index.md | 11 ++++++ packages/transformers/marked/package.json | 23 ++++++++++++ .../marked/src/MarkedTransformer.js | 35 +++++++++++++++++++ yarn.lock | 14 +++++++- 7 files changed, 101 insertions(+), 2 deletions(-) create mode 100644 packages/examples/markdown/package.json create mode 100644 packages/examples/markdown/src/index.md create mode 100644 packages/transformers/marked/package.json create mode 100644 packages/transformers/marked/src/MarkedTransformer.js diff --git a/packages/configs/default/index.json b/packages/configs/default/index.json index b521c98ec2a..54626fd497d 100644 --- a/packages/configs/default/index.json +++ b/packages/configs/default/index.json @@ -19,6 +19,7 @@ "*.less": ["@parcel/transformer-less"], "*.css": ["@parcel/transformer-postcss", "@parcel/transformer-css"], "*.sss": ["@parcel/transformer-sugarss"], + "*.md": ["@parcel/transformer-markdown-html"], "*.{htm,html}": [ "@parcel/transformer-posthtml", "@parcel/transformer-html" diff --git a/packages/configs/default/package.json b/packages/configs/default/package.json index b621bf10412..58cf444d8a5 100644 --- a/packages/configs/default/package.json +++ b/packages/configs/default/package.json @@ -52,6 +52,7 @@ "@parcel/transformer-sugarss": "^2.0.0-alpha.3.1", "@parcel/transformer-toml": "^2.0.0-alpha.3.1", "@parcel/transformer-typescript-types": "^2.0.0-alpha.3.1", - "@parcel/transformer-yaml": "^2.0.0-alpha.3.1" + "@parcel/transformer-yaml": "^2.0.0-alpha.3.1", + "@parcel/transformer-markdown-html": "^2.0.0-alpha.3.1" } } diff --git a/packages/examples/markdown/package.json b/packages/examples/markdown/package.json new file mode 100644 index 00000000000..f8ba2b758a4 --- /dev/null +++ b/packages/examples/markdown/package.json @@ -0,0 +1,16 @@ +{ + "name": "@parcel/markdown-example", + "version": "2.0.0-alpha.3.2", + "license": "MIT", + "private": true, + "scripts": { + "demo": "parcel src/*.md" + }, + "devDependencies": { + "parcel": "^2.0.0-alpha.3.2" + }, + "dependencies": { + "react": "^16.6.3", + "react-dom": "^16.6.3" + } +} diff --git a/packages/examples/markdown/src/index.md b/packages/examples/markdown/src/index.md new file mode 100644 index 00000000000..e37c2a38f62 --- /dev/null +++ b/packages/examples/markdown/src/index.md @@ -0,0 +1,11 @@ +# Header 1 + +This is some content + +## Header 2 + +This is some more content + +```js +let hello = 'world'; +``` diff --git a/packages/transformers/marked/package.json b/packages/transformers/marked/package.json new file mode 100644 index 00000000000..f10602db322 --- /dev/null +++ b/packages/transformers/marked/package.json @@ -0,0 +1,23 @@ +{ + "name": "@parcel/transformer-markdown-html", + "version": "2.0.0-alpha.3.1", + "license": "MIT", + "publishConfig": { + "access": "public" + }, + "repository": { + "type": "git", + "url": "https://github.com/parcel-bundler/parcel.git" + }, + "main": "lib/MarkedTransformer.js", + "source": "src/MarkedTransformer.js", + "engines": { + "parcel": "^2.0.0-alpha.1.1" + }, + "dependencies": { + "@parcel/plugin": "^2.0.0-alpha.3.1", + "@parcel/utils": "^2.0.0-alpha.3.1", + "marked": "^0.8.0", + "highlight.js": "^9.17.1" + } +} diff --git a/packages/transformers/marked/src/MarkedTransformer.js b/packages/transformers/marked/src/MarkedTransformer.js new file mode 100644 index 00000000000..6c80d6129cc --- /dev/null +++ b/packages/transformers/marked/src/MarkedTransformer.js @@ -0,0 +1,35 @@ +// @flow + +import {Transformer} from '@parcel/plugin'; +import {promisify} from '@parcel/utils'; +import marked from 'marked'; +import hljs from 'highlight.js'; + +let markedParse = promisify(marked.parse); + +export default new Transformer({ + async transform({asset}) { + asset.type = 'html'; + + let markedOptions = { + renderer: new marked.Renderer(), + highlight: (code: string, lang: string) => { + return hljs.highlight(lang, code).value; + }, + pedantic: false, + gfm: true, + breaks: false, + sanitize: false, + smartLists: true, + smartypants: false, + xhtml: false, + }; + + let code = await asset.getCode(); + let res = await markedParse(code, markedOptions); + + asset.setCode(res); + + return [asset]; + }, +}); diff --git a/yarn.lock b/yarn.lock index 683664ab1f5..784107cb83c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6534,7 +6534,7 @@ gulplog@^1.0.0: dependencies: glogg "^1.0.0" -handlebars@^4.0.3, handlebars@^4.1.0: +handlebars@^4.0.3, handlebars@^4.1.0, handlebars@^4.5.3: version "4.5.3" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.5.3.tgz#5cf75bd8714f7605713511a56be7c349becb0482" integrity sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA== @@ -6654,6 +6654,13 @@ hex-color-regex@^1.1.0: resolved "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz#4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e" integrity sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ== +highlight.js@^9.17.1: + version "9.17.1" + resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.17.1.tgz#14a4eded23fd314b05886758bb906e39dd627f9a" + integrity sha512-TA2/doAur5Ol8+iM3Ov7qy3jYcr/QiJ2eDTdRF4dfbjG7AaaB99J5G+zSl11ljbl6cIcahgPY6SKb3sC3EJ0fw== + dependencies: + handlebars "^4.5.3" + highlight.js@~9.12.0: version "9.12.0" resolved "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.12.0.tgz#e6d9dbe57cbefe60751f02af336195870c90c01e" @@ -8340,6 +8347,11 @@ marked@^0.6.1: resolved "https://registry.yarnpkg.com/marked/-/marked-0.6.3.tgz#79babad78af638ba4d522a9e715cdfdd2429e946" integrity sha512-Fqa7eq+UaxfMriqzYLayfqAE40WN03jf+zHjT18/uXNuzjq3TY0XTbrAoPeqSJrAmPz11VuUA+kBPYOhHt9oOQ== +marked@^0.8.0: + version "0.8.0" + resolved "https://registry.yarnpkg.com/marked/-/marked-0.8.0.tgz#ec5c0c9b93878dc52dd54be8d0e524097bd81a99" + integrity sha512-MyUe+T/Pw4TZufHkzAfDj6HarCBWia2y27/bhuYkTaiUnfDYFnCP3KUN+9oM7Wi6JA2rymtVYbQu3spE0GCmxQ== + matchdep@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/matchdep/-/matchdep-2.0.0.tgz#c6f34834a0d8dbc3b37c27ee8bbcb27c7775582e" From 3184a39648eef854ac619b91c95993c121df412f Mon Sep 17 00:00:00 2001 From: Jasper De Moor Date: Sun, 22 Dec 2019 17:20:54 +0100 Subject: [PATCH 02/10] add template and frontmatter --- packages/examples/markdown/src/index.md | 5 ++++ .../{marked => markdown}/package.json | 4 ++- .../src/MarkedTransformer.js | 29 +++++++++++++++---- yarn.lock | 12 ++++++++ 4 files changed, 43 insertions(+), 7 deletions(-) rename packages/transformers/{marked => markdown}/package.json (85%) rename packages/transformers/{marked => markdown}/src/MarkedTransformer.js (52%) diff --git a/packages/examples/markdown/src/index.md b/packages/examples/markdown/src/index.md index e37c2a38f62..d66de734dde 100644 --- a/packages/examples/markdown/src/index.md +++ b/packages/examples/markdown/src/index.md @@ -1,3 +1,8 @@ +--- +title: Parcel Markdown Example +description: Demonstrating the capabilities of markdown using Parcel 2 +--- + # Header 1 This is some content diff --git a/packages/transformers/marked/package.json b/packages/transformers/markdown/package.json similarity index 85% rename from packages/transformers/marked/package.json rename to packages/transformers/markdown/package.json index f10602db322..e167586b6d2 100644 --- a/packages/transformers/marked/package.json +++ b/packages/transformers/markdown/package.json @@ -18,6 +18,8 @@ "@parcel/plugin": "^2.0.0-alpha.3.1", "@parcel/utils": "^2.0.0-alpha.3.1", "marked": "^0.8.0", - "highlight.js": "^9.17.1" + "highlight.js": "^9.17.1", + "front-matter": "^3.0.2", + "mustache": "^3.2.0" } } diff --git a/packages/transformers/marked/src/MarkedTransformer.js b/packages/transformers/markdown/src/MarkedTransformer.js similarity index 52% rename from packages/transformers/marked/src/MarkedTransformer.js rename to packages/transformers/markdown/src/MarkedTransformer.js index 6c80d6129cc..50ed557af9c 100644 --- a/packages/transformers/marked/src/MarkedTransformer.js +++ b/packages/transformers/markdown/src/MarkedTransformer.js @@ -1,17 +1,34 @@ // @flow - import {Transformer} from '@parcel/plugin'; import {promisify} from '@parcel/utils'; import marked from 'marked'; import hljs from 'highlight.js'; +import fm from 'front-matter'; +import Mustache from 'mustache'; + +const DEFAULT_TEMPLATE = ` + + + + + + {{title}} + + + {{{ body }}} + +`; -let markedParse = promisify(marked.parse); +const markedParse = promisify(marked.parse); export default new Transformer({ async transform({asset}) { asset.type = 'html'; - let markedOptions = { + let code = await asset.getCode(); + let {body, attributes} = fm(code); + + attributes.body = await markedParse(body, { renderer: new marked.Renderer(), highlight: (code: string, lang: string) => { return hljs.highlight(lang, code).value; @@ -23,10 +40,10 @@ export default new Transformer({ smartLists: true, smartypants: false, xhtml: false, - }; + }); - let code = await asset.getCode(); - let res = await markedParse(code, markedOptions); + let template = DEFAULT_TEMPLATE; + let res = Mustache.render(template, attributes); asset.setCode(res); diff --git a/yarn.lock b/yarn.lock index 784107cb83c..6c71fdce052 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5935,6 +5935,13 @@ from2@^2.1.0: inherits "^2.0.1" readable-stream "^2.0.0" +front-matter@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/front-matter/-/front-matter-3.0.2.tgz#2401cd05fcf22bd0de48a104ffb4efb1ff5c8465" + integrity sha512-iBGZaWyzqgsrPGsqrXZP6N4hp5FzSKDi18nfAoYpgz3qK5sAwFv/ojmn3VS60SOgLvq6CtojNqy0y6ZNz05IzQ== + dependencies: + js-yaml "^3.13.1" + fs-constants@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fs-constants/-/fs-constants-1.0.0.tgz#6be0de9be998ce16af8afc24497b9ee9b7ccd9ad" @@ -8740,6 +8747,11 @@ murmurhash-js@^1.0.0: resolved "https://registry.yarnpkg.com/murmurhash-js/-/murmurhash-js-1.0.0.tgz#b06278e21fc6c37fa5313732b0412bcb6ae15f51" integrity sha1-sGJ44h/Gw3+lMTcysEEry2rhX1E= +mustache@^3.2.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/mustache/-/mustache-3.2.0.tgz#1c68e0bf77817a92e8a9216e35c53bbb342345f6" + integrity sha512-n5de2nQ1g2iz3PO9cmq/ZZx3W7glqjf0kavThtqfuNlZRllgU2a2Q0jWoQy3BloT5A6no7sjCTHBVn1rEKjx1Q== + mute-stdout@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/mute-stdout/-/mute-stdout-1.0.1.tgz#acb0300eb4de23a7ddeec014e3e96044b3472331" From 6a91f57fc0293f5009eb0f91248c093f7032c554 Mon Sep 17 00:00:00 2001 From: Jasper De Moor Date: Sun, 22 Dec 2019 17:26:15 +0100 Subject: [PATCH 03/10] allow custom templates --- packages/examples/markdown/src/index.md | 1 + packages/examples/markdown/src/template.html | 12 ++++++++++++ .../transformers/markdown/src/MarkedTransformer.js | 10 +++++++++- 3 files changed, 22 insertions(+), 1 deletion(-) create mode 100644 packages/examples/markdown/src/template.html diff --git a/packages/examples/markdown/src/index.md b/packages/examples/markdown/src/index.md index d66de734dde..b16fdabb681 100644 --- a/packages/examples/markdown/src/index.md +++ b/packages/examples/markdown/src/index.md @@ -1,6 +1,7 @@ --- title: Parcel Markdown Example description: Demonstrating the capabilities of markdown using Parcel 2 +template: ./template.html --- # Header 1 diff --git a/packages/examples/markdown/src/template.html b/packages/examples/markdown/src/template.html new file mode 100644 index 00000000000..945cffd4bed --- /dev/null +++ b/packages/examples/markdown/src/template.html @@ -0,0 +1,12 @@ + + + + + + + CUSTOM TEMPLATE: {{title}} + + + {{{ body }}} + + diff --git a/packages/transformers/markdown/src/MarkedTransformer.js b/packages/transformers/markdown/src/MarkedTransformer.js index 50ed557af9c..e4466540904 100644 --- a/packages/transformers/markdown/src/MarkedTransformer.js +++ b/packages/transformers/markdown/src/MarkedTransformer.js @@ -22,7 +22,7 @@ const DEFAULT_TEMPLATE = ` const markedParse = promisify(marked.parse); export default new Transformer({ - async transform({asset}) { + async transform({asset, resolve, options}) { asset.type = 'html'; let code = await asset.getCode(); @@ -43,6 +43,14 @@ export default new Transformer({ }); let template = DEFAULT_TEMPLATE; + if (attributes.template) { + let templateLocation = await resolve(asset.filePath, attributes.template); + template = await options.inputFS.readFile(templateLocation, 'utf-8'); + asset.addIncludedFile({ + filePath: templateLocation, + }); + } + let res = Mustache.render(template, attributes); asset.setCode(res); From a823f927f57ee6f96edb1a177e26f277f051abf1 Mon Sep 17 00:00:00 2001 From: Jasper De Moor Date: Sun, 22 Dec 2019 17:40:18 +0100 Subject: [PATCH 04/10] update markdown test --- .../core/integration-tests/test/markdown.js | 36 ++++++++----------- 1 file changed, 15 insertions(+), 21 deletions(-) diff --git a/packages/core/integration-tests/test/markdown.js b/packages/core/integration-tests/test/markdown.js index e32055e1ba2..af7769419c3 100644 --- a/packages/core/integration-tests/test/markdown.js +++ b/packages/core/integration-tests/test/markdown.js @@ -1,34 +1,28 @@ import assert from 'assert'; import path from 'path'; -import {bundle, assertBundleTree, outputFS} from '@parcel/test-utils'; +import {bundle, assertBundles, outputFS, distDir} from '@parcel/test-utils'; -describe.skip('markdown', function() { +describe.only('markdown', function() { it('should support bundling Markdown', async function() { let b = await bundle( path.join(__dirname, '/integration/markdown/index.md'), ); - await assertBundleTree(b, { - name: 'index.html', - assets: ['index.md'], - childBundles: [ - { - type: 'png', - assets: ['100x100.png'], - childBundles: [], - }, - ], - }); + await assertBundles(b, [ + { + name: 'index.html', + assets: ['index.md'], + }, + { + type: 'png', + assets: ['100x100.png'], + }, + ]); - let files = await outputFS.readdir(path.join(__dirname, '/dist')); let html = await outputFS.readFile( - path.join(__dirname, '/dist/index.html'), + path.join(distDir, 'index.html'), + 'utf8', ); - for (let file of files) { - let ext = file.match(/\.([0-9a-z]+)(?:[?#]|$)/i)[0]; - if (file !== 'index.html' && ext !== '.map') { - assert(html.includes(file)); - } - } + assert(html.includes('

heading1

')); }); }); From 6a47cb584ec67297b181213639049b5760045ac7 Mon Sep 17 00:00:00 2001 From: Jasper De Moor Date: Wed, 25 Dec 2019 11:10:58 +0100 Subject: [PATCH 05/10] Return raw html by default --- .../transformers/markdown/src/MarkedTransformer.js | 13 +------------ 1 file changed, 1 insertion(+), 12 deletions(-) diff --git a/packages/transformers/markdown/src/MarkedTransformer.js b/packages/transformers/markdown/src/MarkedTransformer.js index e4466540904..703862afa7f 100644 --- a/packages/transformers/markdown/src/MarkedTransformer.js +++ b/packages/transformers/markdown/src/MarkedTransformer.js @@ -6,18 +6,7 @@ import hljs from 'highlight.js'; import fm from 'front-matter'; import Mustache from 'mustache'; -const DEFAULT_TEMPLATE = ` - - - - - - {{title}} - - - {{{ body }}} - -`; +const DEFAULT_TEMPLATE = '{{{ body }}}'; const markedParse = promisify(marked.parse); From 5e3ac0fc07be1ffeb9255e307c5913fb84b91003 Mon Sep 17 00:00:00 2001 From: Jasper De Moor Date: Wed, 25 Dec 2019 11:12:00 +0100 Subject: [PATCH 06/10] enable all tests --- packages/core/integration-tests/test/markdown.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/integration-tests/test/markdown.js b/packages/core/integration-tests/test/markdown.js index af7769419c3..59ee59025fc 100644 --- a/packages/core/integration-tests/test/markdown.js +++ b/packages/core/integration-tests/test/markdown.js @@ -2,7 +2,7 @@ import assert from 'assert'; import path from 'path'; import {bundle, assertBundles, outputFS, distDir} from '@parcel/test-utils'; -describe.only('markdown', function() { +describe('markdown', function() { it('should support bundling Markdown', async function() { let b = await bundle( path.join(__dirname, '/integration/markdown/index.md'), From a08831b1d20931424645dee98245304095636dc9 Mon Sep 17 00:00:00 2001 From: Jasper De Moor Date: Sun, 2 Feb 2020 10:53:55 +0100 Subject: [PATCH 07/10] . --- yarn.lock | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/yarn.lock b/yarn.lock index 516734adbf7..6476b9302a0 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6667,7 +6667,7 @@ gulplog@^1.0.0: dependencies: glogg "^1.0.0" -handlebars@^4.0.3, handlebars@^4.1.0, handlebars@^4.5.3: +handlebars@^4.0.3, handlebars@^4.5.3: version "4.5.3" resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.5.3.tgz#5cf75bd8714f7605713511a56be7c349becb0482" integrity sha512-3yPecJoJHK/4c6aZhSvxOyG4vJKDshV36VHp0iVCDVh7o9w2vwi3NSnL2MMPj3YdduqaBcu7cGbggJQM0br9xA== @@ -6678,6 +6678,17 @@ handlebars@^4.0.3, handlebars@^4.1.0, handlebars@^4.5.3: optionalDependencies: uglify-js "^3.1.4" +handlebars@^4.4.0: + version "4.7.2" + resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.7.2.tgz#01127b3840156a0927058779482031afe0e730d7" + integrity sha512-4PwqDL2laXtTWZghzzCtunQUTLbo31pcCJrd/B/9JP8XbhVzpS5ZXuKqlOzsd1rtcaLo4KqAn8nl8mkknS4MHw== + dependencies: + neo-async "^2.6.0" + optimist "^0.6.1" + source-map "^0.6.1" + optionalDependencies: + uglify-js "^3.1.4" + har-schema@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" From b1cb591af3b719ca56cb21ce07325c21cd0e8445 Mon Sep 17 00:00:00 2001 From: Jasper De Moor Date: Sun, 2 Feb 2020 11:40:03 +0100 Subject: [PATCH 08/10] attempt at magic --- packages/examples/markdown/package.json | 2 +- packages/examples/markdown/src/style.css | 6 ++++++ packages/examples/markdown/src/template.html | 19 ++++++++++--------- 3 files changed, 17 insertions(+), 10 deletions(-) create mode 100644 packages/examples/markdown/src/style.css diff --git a/packages/examples/markdown/package.json b/packages/examples/markdown/package.json index f8ba2b758a4..c2be1eb96af 100644 --- a/packages/examples/markdown/package.json +++ b/packages/examples/markdown/package.json @@ -4,7 +4,7 @@ "license": "MIT", "private": true, "scripts": { - "demo": "parcel src/*.md" + "demo": "parcel build src/*.md --no-cache" }, "devDependencies": { "parcel": "^2.0.0-alpha.3.2" diff --git a/packages/examples/markdown/src/style.css b/packages/examples/markdown/src/style.css new file mode 100644 index 00000000000..bdb423caeb5 --- /dev/null +++ b/packages/examples/markdown/src/style.css @@ -0,0 +1,6 @@ +@import 'highlight.js/styles/github.css'; + +main, +html { + margin: 0; +} diff --git a/packages/examples/markdown/src/template.html b/packages/examples/markdown/src/template.html index 945cffd4bed..580be6b2149 100644 --- a/packages/examples/markdown/src/template.html +++ b/packages/examples/markdown/src/template.html @@ -1,12 +1,13 @@ - - - - - CUSTOM TEMPLATE: {{title}} - - - {{{ body }}} - + + + + + CUSTOM TEMPLATE: {{title}} + + + + {{{ body }}} + From a7dc7b1ce905b7f1ad9f3ad07420b1a010295f96 Mon Sep 17 00:00:00 2001 From: Jasper De Moor Date: Sun, 2 Feb 2020 11:40:30 +0100 Subject: [PATCH 09/10] magic? --- packages/configs/default/index.json | 1 + packages/packagers/markdown-html/package.json | 24 +++++++++ .../src/MarkdownHtmlTransformer.js | 39 +++++++++++++++ .../{markdown => markdown-html}/package.json | 3 +- .../markdown-html/src/MarkedTransformer.js | 45 +++++++++++++++++ .../markdown/src/MarkedTransformer.js | 49 ------------------- 6 files changed, 110 insertions(+), 51 deletions(-) create mode 100644 packages/packagers/markdown-html/package.json create mode 100644 packages/packagers/markdown-html/src/MarkdownHtmlTransformer.js rename packages/transformers/{markdown => markdown-html}/package.json (90%) create mode 100644 packages/transformers/markdown-html/src/MarkedTransformer.js delete mode 100644 packages/transformers/markdown/src/MarkedTransformer.js diff --git a/packages/configs/default/index.json b/packages/configs/default/index.json index 49ba54612c9..7d4311e181f 100644 --- a/packages/configs/default/index.json +++ b/packages/configs/default/index.json @@ -49,6 +49,7 @@ "*.css": "@parcel/packager-css", "*.js": "@parcel/packager-js", "*.ts": "@parcel/packager-ts", + "*.md": "@parcel/packager-markdown-html", "*": "@parcel/packager-raw" }, "resolvers": ["@parcel/resolver-default"], diff --git a/packages/packagers/markdown-html/package.json b/packages/packagers/markdown-html/package.json new file mode 100644 index 00000000000..1b3018aeb8c --- /dev/null +++ b/packages/packagers/markdown-html/package.json @@ -0,0 +1,24 @@ +{ + "name": "@parcel/packager-markdown-html", + "version": "2.0.0-alpha.3.1", + "license": "MIT", + "publishConfig": { + "access": "public" + }, + "repository": { + "type": "git", + "url": "https://github.com/parcel-bundler/parcel.git" + }, + "main": "lib/MarkdownHtmlTransformer.js", + "source": "src/MarkdownHtmlTransformer.js", + "engines": { + "node": ">= 10.0.0", + "parcel": "^2.0.0-alpha.1.1" + }, + "dependencies": { + "@parcel/plugin": "^2.0.0-alpha.3.1", + "@parcel/types": "^2.0.0-alpha.3.1", + "@parcel/utils": "^2.0.0-alpha.3.1", + "mustache": "^3.2.0" + } +} diff --git a/packages/packagers/markdown-html/src/MarkdownHtmlTransformer.js b/packages/packagers/markdown-html/src/MarkdownHtmlTransformer.js new file mode 100644 index 00000000000..60acb0d734f --- /dev/null +++ b/packages/packagers/markdown-html/src/MarkdownHtmlTransformer.js @@ -0,0 +1,39 @@ +// @flow +import assert from 'assert'; +import {Packager} from '@parcel/plugin'; +import {replaceURLReferences} from '@parcel/utils'; +import Mustache from 'mustache'; + +export default new Packager({ + async package({bundle, bundleGraph}) { + let assets = []; + bundle.traverseAssets(asset => { + assets.push(asset); + }); + + assert.equal(assets.length, 1, 'MD bundles may only contain one asset'); + + let asset = assets[0]; + let code = await asset.getCode(); + + // Look for a template + let bundles = bundleGraph.getSiblingBundles(bundle); + if (bundles.length === 1) { + let entryAsset = bundles[0].getMainEntry(); + if (entryAsset) { + let template = await entryAsset.getCode(); + code = Mustache.render(template, { + body: code, + // $FlowFixMe + ...asset.meta, + }); + } + } + + return replaceURLReferences({ + bundle, + bundleGraph, + contents: code, + }); + }, +}); diff --git a/packages/transformers/markdown/package.json b/packages/transformers/markdown-html/package.json similarity index 90% rename from packages/transformers/markdown/package.json rename to packages/transformers/markdown-html/package.json index e167586b6d2..af92d0c1f48 100644 --- a/packages/transformers/markdown/package.json +++ b/packages/transformers/markdown-html/package.json @@ -19,7 +19,6 @@ "@parcel/utils": "^2.0.0-alpha.3.1", "marked": "^0.8.0", "highlight.js": "^9.17.1", - "front-matter": "^3.0.2", - "mustache": "^3.2.0" + "front-matter": "^3.0.2" } } diff --git a/packages/transformers/markdown-html/src/MarkedTransformer.js b/packages/transformers/markdown-html/src/MarkedTransformer.js new file mode 100644 index 00000000000..574b58b5ac6 --- /dev/null +++ b/packages/transformers/markdown-html/src/MarkedTransformer.js @@ -0,0 +1,45 @@ +// @flow +import {Transformer} from '@parcel/plugin'; +import {promisify} from '@parcel/utils'; +import marked from 'marked'; +import hljs from 'highlight.js'; +import fm from 'front-matter'; + +const markedParse = promisify(marked.parse); + +export default new Transformer({ + async transform({asset}) { + asset.type = 'md'; + + let code = await asset.getCode(); + let {body, attributes} = fm(code); + + for (let key in attributes) { + asset.meta[key] = attributes[key]; + } + + asset.setCode( + await markedParse(body, { + renderer: new marked.Renderer(), + highlight: (code: string, lang: string) => { + return hljs.highlight(lang, code).value; + }, + pedantic: false, + gfm: true, + breaks: false, + sanitize: false, + smartLists: true, + smartypants: false, + xhtml: false, + }), + ); + + if (attributes.template) { + asset.addDependency({ + moduleSpecifier: attributes.template, + }); + } + + return [asset]; + }, +}); diff --git a/packages/transformers/markdown/src/MarkedTransformer.js b/packages/transformers/markdown/src/MarkedTransformer.js deleted file mode 100644 index 703862afa7f..00000000000 --- a/packages/transformers/markdown/src/MarkedTransformer.js +++ /dev/null @@ -1,49 +0,0 @@ -// @flow -import {Transformer} from '@parcel/plugin'; -import {promisify} from '@parcel/utils'; -import marked from 'marked'; -import hljs from 'highlight.js'; -import fm from 'front-matter'; -import Mustache from 'mustache'; - -const DEFAULT_TEMPLATE = '{{{ body }}}'; - -const markedParse = promisify(marked.parse); - -export default new Transformer({ - async transform({asset, resolve, options}) { - asset.type = 'html'; - - let code = await asset.getCode(); - let {body, attributes} = fm(code); - - attributes.body = await markedParse(body, { - renderer: new marked.Renderer(), - highlight: (code: string, lang: string) => { - return hljs.highlight(lang, code).value; - }, - pedantic: false, - gfm: true, - breaks: false, - sanitize: false, - smartLists: true, - smartypants: false, - xhtml: false, - }); - - let template = DEFAULT_TEMPLATE; - if (attributes.template) { - let templateLocation = await resolve(asset.filePath, attributes.template); - template = await options.inputFS.readFile(templateLocation, 'utf-8'); - asset.addIncludedFile({ - filePath: templateLocation, - }); - } - - let res = Mustache.render(template, attributes); - - asset.setCode(res); - - return [asset]; - }, -}); From 9ac6d5170c221f45eb158d584dcd3e37b2c7a9c5 Mon Sep 17 00:00:00 2001 From: Jasper De Moor Date: Sat, 8 Feb 2020 19:05:02 +0100 Subject: [PATCH 10/10] remove packager --- packages/configs/default/index.json | 1 - packages/examples/markdown/package.json | 2 +- packages/packagers/markdown-html/package.json | 24 --------- .../src/MarkdownHtmlTransformer.js | 39 -------------- .../transformers/markdown-html/package.json | 3 +- .../markdown-html/src/MarkedTransformer.js | 52 +++++++++++-------- 6 files changed, 32 insertions(+), 89 deletions(-) delete mode 100644 packages/packagers/markdown-html/package.json delete mode 100644 packages/packagers/markdown-html/src/MarkdownHtmlTransformer.js diff --git a/packages/configs/default/index.json b/packages/configs/default/index.json index 7c487267d20..6086c9f49fd 100644 --- a/packages/configs/default/index.json +++ b/packages/configs/default/index.json @@ -51,7 +51,6 @@ "*.css": "@parcel/packager-css", "*.js": "@parcel/packager-js", "*.ts": "@parcel/packager-ts", - "*.md": "@parcel/packager-markdown-html", "*": "@parcel/packager-raw" }, "resolvers": ["@parcel/resolver-default"], diff --git a/packages/examples/markdown/package.json b/packages/examples/markdown/package.json index c2be1eb96af..30a5421b97c 100644 --- a/packages/examples/markdown/package.json +++ b/packages/examples/markdown/package.json @@ -4,7 +4,7 @@ "license": "MIT", "private": true, "scripts": { - "demo": "parcel build src/*.md --no-cache" + "demo": "parcel src/*.md --no-cache" }, "devDependencies": { "parcel": "^2.0.0-alpha.3.2" diff --git a/packages/packagers/markdown-html/package.json b/packages/packagers/markdown-html/package.json deleted file mode 100644 index 1b3018aeb8c..00000000000 --- a/packages/packagers/markdown-html/package.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "name": "@parcel/packager-markdown-html", - "version": "2.0.0-alpha.3.1", - "license": "MIT", - "publishConfig": { - "access": "public" - }, - "repository": { - "type": "git", - "url": "https://github.com/parcel-bundler/parcel.git" - }, - "main": "lib/MarkdownHtmlTransformer.js", - "source": "src/MarkdownHtmlTransformer.js", - "engines": { - "node": ">= 10.0.0", - "parcel": "^2.0.0-alpha.1.1" - }, - "dependencies": { - "@parcel/plugin": "^2.0.0-alpha.3.1", - "@parcel/types": "^2.0.0-alpha.3.1", - "@parcel/utils": "^2.0.0-alpha.3.1", - "mustache": "^3.2.0" - } -} diff --git a/packages/packagers/markdown-html/src/MarkdownHtmlTransformer.js b/packages/packagers/markdown-html/src/MarkdownHtmlTransformer.js deleted file mode 100644 index 60acb0d734f..00000000000 --- a/packages/packagers/markdown-html/src/MarkdownHtmlTransformer.js +++ /dev/null @@ -1,39 +0,0 @@ -// @flow -import assert from 'assert'; -import {Packager} from '@parcel/plugin'; -import {replaceURLReferences} from '@parcel/utils'; -import Mustache from 'mustache'; - -export default new Packager({ - async package({bundle, bundleGraph}) { - let assets = []; - bundle.traverseAssets(asset => { - assets.push(asset); - }); - - assert.equal(assets.length, 1, 'MD bundles may only contain one asset'); - - let asset = assets[0]; - let code = await asset.getCode(); - - // Look for a template - let bundles = bundleGraph.getSiblingBundles(bundle); - if (bundles.length === 1) { - let entryAsset = bundles[0].getMainEntry(); - if (entryAsset) { - let template = await entryAsset.getCode(); - code = Mustache.render(template, { - body: code, - // $FlowFixMe - ...asset.meta, - }); - } - } - - return replaceURLReferences({ - bundle, - bundleGraph, - contents: code, - }); - }, -}); diff --git a/packages/transformers/markdown-html/package.json b/packages/transformers/markdown-html/package.json index af92d0c1f48..e167586b6d2 100644 --- a/packages/transformers/markdown-html/package.json +++ b/packages/transformers/markdown-html/package.json @@ -19,6 +19,7 @@ "@parcel/utils": "^2.0.0-alpha.3.1", "marked": "^0.8.0", "highlight.js": "^9.17.1", - "front-matter": "^3.0.2" + "front-matter": "^3.0.2", + "mustache": "^3.2.0" } } diff --git a/packages/transformers/markdown-html/src/MarkedTransformer.js b/packages/transformers/markdown-html/src/MarkedTransformer.js index 574b58b5ac6..a34ddd331e0 100644 --- a/packages/transformers/markdown-html/src/MarkedTransformer.js +++ b/packages/transformers/markdown-html/src/MarkedTransformer.js @@ -4,40 +4,46 @@ import {promisify} from '@parcel/utils'; import marked from 'marked'; import hljs from 'highlight.js'; import fm from 'front-matter'; +import Mustache from 'mustache'; const markedParse = promisify(marked.parse); export default new Transformer({ - async transform({asset}) { - asset.type = 'md'; + async transform({asset, resolve, options}) { + asset.type = 'html'; let code = await asset.getCode(); let {body, attributes} = fm(code); - for (let key in attributes) { - asset.meta[key] = attributes[key]; - } - - asset.setCode( - await markedParse(body, { - renderer: new marked.Renderer(), - highlight: (code: string, lang: string) => { - return hljs.highlight(lang, code).value; - }, - pedantic: false, - gfm: true, - breaks: false, - sanitize: false, - smartLists: true, - smartypants: false, - xhtml: false, - }), - ); + let parsedCode = await markedParse(body, { + renderer: new marked.Renderer(), + highlight: (code: string, lang: string) => { + return hljs.highlight(lang, code).value; + }, + pedantic: false, + gfm: true, + breaks: false, + sanitize: false, + smartLists: true, + smartypants: false, + xhtml: false, + }); if (attributes.template) { - asset.addDependency({ - moduleSpecifier: attributes.template, + let templateLocation = await resolve(asset.filePath, attributes.template); + let template = await options.inputFS.readFile(templateLocation, 'utf-8'); + asset.addIncludedFile({ + filePath: templateLocation, }); + + asset.setCode( + Mustache.render(template, { + body: parsedCode, + ...attributes, + }), + ); + } else { + asset.setCode(parsedCode); } return [asset];