diff options
| author | Camil Staps | 2021-06-23 09:25:36 +0200 | 
|---|---|---|
| committer | Camil Staps | 2021-06-23 09:25:36 +0200 | 
| commit | 9b8045e9ff6fc02dde1f0e14ecb419d852352633 (patch) | |
| tree | fd0a206697ca520079f7737f9f669c80787ffc35 | |
| parent | Replace menuItem mixin in sidebar layout with single menu mixin (diff) | |
Setup infrastructure for articles written in markdown
| -rw-r--r-- | gulpfile.js | 28 | ||||
| -rw-r--r-- | package-lock.json | 153 | ||||
| -rw-r--r-- | package.json | 4 | ||||
| -rw-r--r-- | resources/md/2021-06-22-clean-sandbox.md | 7 | ||||
| -rw-r--r-- | resources/pug/finals/articles/2021-06-22-clean-sandbox.pug | 12 | ||||
| -rw-r--r-- | resources/pug/finals/articles/index.pug | 12 | ||||
| -rw-r--r-- | resources/pug/include/layout-articles.pug | 8 | ||||
| -rw-r--r-- | resources/pug/include/layout-sidebar.pug | 7 | ||||
| -rw-r--r-- | resources/sass/style.scss | 9 | 
9 files changed, 230 insertions, 10 deletions
| diff --git a/gulpfile.js b/gulpfile.js index f6eef2d..824a788 100644 --- a/gulpfile.js +++ b/gulpfile.js @@ -1,11 +1,14 @@  var gulp = require('gulp'),  	changed = require('gulp-changed'), +	hljs = require('highlight.js'), +	md = require('jstransformer')(require('jstransformer-markdown-it')),  	minifyhtml = require('gulp-minify-html'),  	notify = require('gulp-notify'),  	pug = require('gulp-pug-3'),  	sass = require('gulp-sass-next');  var config = { +	mdPath:   './resources/md',  	pugPath:  './resources/pug',  	sassPath: './resources/sass',  } @@ -33,7 +36,29 @@ function html() {  	return gulp.src(src)  		.pipe(changed(dst, {extension: 'html'}))  		.pipe(pug({ -			basedir: config.pugPath + '/include' +			basedir: config.pugPath + '/include', +			filters: { +				markdown: (text, options) => { +					options = Object.assign({ +						highlight: (str, lang) => { +							if (lang && hljs.getLanguage(lang)) { +								try { +									return hljs.highlight(str, {language: lang}).value; +								} catch (__) {} +							} + +							try { +								return hljs.highlightAuto(str).value; +							} catch (__) {} + +							return ''; +						}, +						langPrefix: 'lang-', +						linkify: true, +					}, options); +					return md.render(text, options).body; +				} +			}  		}))  		.pipe(minifyhtml())  		.pipe(gulp.dest(dst)); @@ -59,6 +84,7 @@ function fonts() {  }  function watch() { +	gulp.watch(config.mdPath + '/**/*.md', html);  	gulp.watch(config.pugPath + '/**/*.pug', html);  	gulp.watch(config.sassPath + '/**/*.scss', css);  } diff --git a/package-lock.json b/package-lock.json index 53be700..c82d1eb 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,9 @@          "gulp-minify-html": "^1.0.6",          "gulp-notify": "^4.0.0",          "gulp-pug-3": "^1.2.2", -        "gulp-sass-next": "^6.0.0" +        "gulp-sass-next": "^6.0.0", +        "highlight.js": "^11.0.1", +        "jstransformer-markdown-it": "^2.1.0"        }      },      "node_modules/@babel/helper-validator-identifier": { @@ -251,6 +253,15 @@        "integrity": "sha1-PrTWEpc/xrbcbvM49W91nyrFw6Y=",        "dev": true      }, +    "node_modules/argparse": { +      "version": "1.0.10", +      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", +      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", +      "dev": true, +      "dependencies": { +        "sprintf-js": "~1.0.2" +      } +    },      "node_modules/arr-diff": {        "version": "4.0.0",        "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -2481,9 +2492,9 @@        }      },      "node_modules/gulp-changed": { -      "version": "4.0.2", -      "resolved": "https://registry.npmjs.org/gulp-changed/-/gulp-changed-4.0.2.tgz", -      "integrity": "sha512-rAvQt+ByaqrMuJLwucvxC+MC02Vh8ksiJ16hoQlk4xnmlHiLJMque2aXXQMmyocQac3RIjNRcyr7iG1TNH15GA==", +      "version": "4.0.3", +      "resolved": "https://registry.npmjs.org/gulp-changed/-/gulp-changed-4.0.3.tgz", +      "integrity": "sha512-oIymgTNmmIvdqRRpdtohmELix81q+CA/D9DgVCvaM4Ulai0xgalf+XS6A95JwskbxRGQKtzzhMmdWZEuikX67w==",        "dev": true,        "dependencies": {          "make-dir": "^3.0.0", @@ -3287,6 +3298,15 @@          "node": ">=0.10.0"        }      }, +    "node_modules/highlight.js": { +      "version": "11.0.1", +      "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.0.1.tgz", +      "integrity": "sha512-EqYpWyTF2s8nMfttfBA2yLKPNoZCO33pLS4MnbXQ4hECf1TKujCt1Kq7QAdrio7roL4+CqsfjqwYj4tYgq0pJQ==", +      "dev": true, +      "engines": { +        "node": ">=12.0.0" +      } +    },      "node_modules/homedir-polyfill": {        "version": "1.0.3",        "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", @@ -3789,6 +3809,18 @@          "promise": "^7.0.1"        }      }, +    "node_modules/jstransformer-markdown-it": { +      "version": "2.1.0", +      "resolved": "https://registry.npmjs.org/jstransformer-markdown-it/-/jstransformer-markdown-it-2.1.0.tgz", +      "integrity": "sha1-aewwzkUYvtWZezjwJ2SOjChekvc=", +      "dev": true, +      "dependencies": { +        "markdown-it": "^8.0.0" +      }, +      "engines": { +        "node": ">=7" +      } +    },      "node_modules/just-debounce": {        "version": "1.0.0",        "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", @@ -3980,6 +4012,15 @@          "node": ">= 0.8"        }      }, +    "node_modules/linkify-it": { +      "version": "2.2.0", +      "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", +      "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", +      "dev": true, +      "dependencies": { +        "uc.micro": "^1.0.1" +      } +    },      "node_modules/load-json-file": {        "version": "1.1.0",        "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", @@ -4252,6 +4293,22 @@          "node": ">=0.10.0"        }      }, +    "node_modules/markdown-it": { +      "version": "8.4.2", +      "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", +      "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", +      "dev": true, +      "dependencies": { +        "argparse": "^1.0.7", +        "entities": "~1.1.1", +        "linkify-it": "^2.0.0", +        "mdurl": "^1.0.1", +        "uc.micro": "^1.0.5" +      }, +      "bin": { +        "markdown-it": "bin/markdown-it.js" +      } +    },      "node_modules/matchdep": {        "version": "2.0.0",        "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", @@ -4294,6 +4351,12 @@          "node": ">=0.10.0"        }      }, +    "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/memoizee": {        "version": "0.3.10",        "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.3.10.tgz", @@ -6175,6 +6238,12 @@          "node": ">=0.10.0"        }      }, +    "node_modules/sprintf-js": { +      "version": "1.0.3", +      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", +      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", +      "dev": true +    },      "node_modules/sshpk": {        "version": "1.16.1",        "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", @@ -6650,6 +6719,12 @@        "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",        "dev": true      }, +    "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/unc-path-regex": {        "version": "0.1.2",        "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", @@ -7396,6 +7471,15 @@        "integrity": "sha1-PrTWEpc/xrbcbvM49W91nyrFw6Y=",        "dev": true      }, +    "argparse": { +      "version": "1.0.10", +      "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", +      "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", +      "dev": true, +      "requires": { +        "sprintf-js": "~1.0.2" +      } +    },      "arr-diff": {        "version": "4.0.0",        "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", @@ -9370,9 +9454,9 @@        }      },      "gulp-changed": { -      "version": "4.0.2", -      "resolved": "https://registry.npmjs.org/gulp-changed/-/gulp-changed-4.0.2.tgz", -      "integrity": "sha512-rAvQt+ByaqrMuJLwucvxC+MC02Vh8ksiJ16hoQlk4xnmlHiLJMque2aXXQMmyocQac3RIjNRcyr7iG1TNH15GA==", +      "version": "4.0.3", +      "resolved": "https://registry.npmjs.org/gulp-changed/-/gulp-changed-4.0.3.tgz", +      "integrity": "sha512-oIymgTNmmIvdqRRpdtohmELix81q+CA/D9DgVCvaM4Ulai0xgalf+XS6A95JwskbxRGQKtzzhMmdWZEuikX67w==",        "dev": true,        "requires": {          "make-dir": "^3.0.0", @@ -9976,6 +10060,12 @@          }        }      }, +    "highlight.js": { +      "version": "11.0.1", +      "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-11.0.1.tgz", +      "integrity": "sha512-EqYpWyTF2s8nMfttfBA2yLKPNoZCO33pLS4MnbXQ4hECf1TKujCt1Kq7QAdrio7roL4+CqsfjqwYj4tYgq0pJQ==", +      "dev": true +    },      "homedir-polyfill": {        "version": "1.0.3",        "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.3.tgz", @@ -10385,6 +10475,15 @@          "promise": "^7.0.1"        }      }, +    "jstransformer-markdown-it": { +      "version": "2.1.0", +      "resolved": "https://registry.npmjs.org/jstransformer-markdown-it/-/jstransformer-markdown-it-2.1.0.tgz", +      "integrity": "sha1-aewwzkUYvtWZezjwJ2SOjChekvc=", +      "dev": true, +      "requires": { +        "markdown-it": "^8.0.0" +      } +    },      "just-debounce": {        "version": "1.0.0",        "resolved": "https://registry.npmjs.org/just-debounce/-/just-debounce-1.0.0.tgz", @@ -10562,6 +10661,15 @@          "resolve": "^1.1.7"        }      }, +    "linkify-it": { +      "version": "2.2.0", +      "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-2.2.0.tgz", +      "integrity": "sha512-GnAl/knGn+i1U/wjBz3akz2stz+HrHLsxMwHQGofCDfPvlf+gDKN58UtfmUquTY4/MXeE2x7k19KQmeoZi94Iw==", +      "dev": true, +      "requires": { +        "uc.micro": "^1.0.1" +      } +    },      "load-json-file": {        "version": "1.1.0",        "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", @@ -10801,6 +10909,19 @@          "object-visit": "^1.0.0"        }      }, +    "markdown-it": { +      "version": "8.4.2", +      "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-8.4.2.tgz", +      "integrity": "sha512-GcRz3AWTqSUphY3vsUqQSFMbgR38a4Lh3GWlHRh/7MRwz8mcu9n2IO7HOh+bXHrR9kOPDl5RNCaEsrneb+xhHQ==", +      "dev": true, +      "requires": { +        "argparse": "^1.0.7", +        "entities": "~1.1.1", +        "linkify-it": "^2.0.0", +        "mdurl": "^1.0.1", +        "uc.micro": "^1.0.5" +      } +    },      "matchdep": {        "version": "2.0.0",        "resolved": "https://registry.npmjs.org/matchdep/-/matchdep-2.0.0.tgz", @@ -10836,6 +10957,12 @@          }        }      }, +    "mdurl": { +      "version": "1.0.1", +      "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", +      "integrity": "sha1-/oWy7HWlkDfyrf7BAP1sYBdhFS4=", +      "dev": true +    },      "memoizee": {        "version": "0.3.10",        "resolved": "https://registry.npmjs.org/memoizee/-/memoizee-0.3.10.tgz", @@ -12375,6 +12502,12 @@          "extend-shallow": "^3.0.0"        }      }, +    "sprintf-js": { +      "version": "1.0.3", +      "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", +      "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", +      "dev": true +    },      "sshpk": {        "version": "1.16.1",        "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", @@ -12786,6 +12919,12 @@        "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",        "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 +    },      "unc-path-regex": {        "version": "0.1.2",        "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", diff --git a/package.json b/package.json index 3979ff7..8b08ffe 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,9 @@      "gulp-minify-html": "^1.0.6",      "gulp-notify": "^4.0.0",      "gulp-pug-3": "^1.2.2", -    "gulp-sass-next": "^6.0.0" +    "gulp-sass-next": "^6.0.0", +    "highlight.js": "^11.0.1", +    "jstransformer-markdown-it": "^2.1.0"    },    "dependencies": {      "@fortawesome/fontawesome-free": "^5.15.3", diff --git a/resources/md/2021-06-22-clean-sandbox.md b/resources/md/2021-06-22-clean-sandbox.md new file mode 100644 index 0000000..623a080 --- /dev/null +++ b/resources/md/2021-06-22-clean-sandbox.md @@ -0,0 +1,7 @@ +Example of an article with markdown. + +See https://camilstaps.gitlab.io/clean-sandbox. + +```js +let xyz = 5; +``` diff --git a/resources/pug/finals/articles/2021-06-22-clean-sandbox.pug b/resources/pug/finals/articles/2021-06-22-clean-sandbox.pug new file mode 100644 index 0000000..cd343dd --- /dev/null +++ b/resources/pug/finals/articles/2021-06-22-clean-sandbox.pug @@ -0,0 +1,12 @@ +extends /layout-articles.pug + +block prepend menu +	- var page = '2021-06-22-clean-sandbox' + +block subtitle +	| Clean Sandbox +block subtitleDate +	| 22 June 2021 + +block page +	include:markdown ../../../md/2021-06-22-clean-sandbox.md diff --git a/resources/pug/finals/articles/index.pug b/resources/pug/finals/articles/index.pug new file mode 100644 index 0000000..17951c7 --- /dev/null +++ b/resources/pug/finals/articles/index.pug @@ -0,0 +1,12 @@ +extends /layout-articles.pug + +block prepend menu +	- var page = '' + +block subtitle +	| Home + +block page +	p. +		This is a collection of some software-related articles I wrote. +		Perhaps it will be larger than this one day. diff --git a/resources/pug/include/layout-articles.pug b/resources/pug/include/layout-articles.pug new file mode 100644 index 0000000..88b1aea --- /dev/null +++ b/resources/pug/include/layout-articles.pug @@ -0,0 +1,8 @@ +extends layout-sidebar.pug + +block append menu +	- var base_url = '/articles/' +	+menu( +		{name: 'Home', link: ''}, +		{name: 'Clean Sandbox', year: 2021, month: 6, day: 22}, +	) diff --git a/resources/pug/include/layout-sidebar.pug b/resources/pug/include/layout-sidebar.pug index 68c1ac2..8cf7d5a 100644 --- a/resources/pug/include/layout-sidebar.pug +++ b/resources/pug/include/layout-sidebar.pug @@ -6,10 +6,15 @@ block content  			ul.nav.nav-pills.nav-stacked  				block menu  					mixin menu(...items) +						- const pad_zero = n => n < 10 ? '0' + n : n; +  						each item in items  							if typeof item.link == 'undefined'  								- item.link = item.name.toLowerCase().replace(/\W/g, '-') +							unless typeof item.year == 'undefined' || typeof item.month == 'undefined' || typeof item.day == 'undefined' +								- item.link = item.year + '-' + pad_zero(item.month) + '-' + pad_zero(item.day) + '-' + item.link +  							li(role='presentation', class=(page == item.link) ? 'active' : '')  								a(href=base_url + (item.link == '' ? '' : item.link + '.html'))= item.name @@ -22,5 +27,5 @@ block content  		div.col-lg-2.col-md-2.text-right  			block subtitle-right -		div.col-lg-9.col-md-8.text-justify +		div.col-lg-9.col-md-8.text-justify.markdown  			block page diff --git a/resources/sass/style.scss b/resources/sass/style.scss index 7afe3b4..e401645 100644 --- a/resources/sass/style.scss +++ b/resources/sass/style.scss @@ -92,6 +92,15 @@ span.tt {  	font-family: monospace;  } +/* markdown is used for page content, but h1 - h3 are already used for the page + * title and subtitle. So we adapt the font size of the headings in the + * markdown content so that they are not larger than the page title. */ +.markdown { +	h1 { font-size: 18px; } /* size of h4 */ +	h2 { font-size: 14px; } /* size of h5 */ +	h3 { font-size: 12px; } /* size of h5 */ +} +  footer {  	padding: 1em 0;  } | 
