selfdefined/.eleventy.js

187 lines
5.1 KiB
JavaScript
Raw Normal View History

📄 Add Detail Pages for Definitions (#75) * fix: untrack definitions in dist * feat(detail pages): update item link * feat(detail pages): add layout * feat(detail pages): render whole definition content * feat(detail pages): remove definitons from homepage * 🧹 def list component * feat(layout): render site footer in all pages * feat(detail pages): rename definition root class && move css into partials * chore: abstract further css into own files * feat(detail pages): update headling level of definition content * feat(styles): set box sizing * feat(styles): add margin bottom utility * feat(styles): selection * feat(components): sub page header own component * feat(detail pages): add sections * feat(style): mian headline * feat(page layout): rename page content grid * feat(page layout): add wide content class * feat(detail pages): set document title * feat(detail pages): set uniform document title for docs and definitions * feat(page title): add comment * feat(detail pages): add meta description * feat(detail pages): wrap def header in article tag * chore: set up ava * feat(filters): move permalink function into file, add test * chore: rename _temp to _util, remove creation script * feat(detail pages): helper function to find additional definitions * chore: move helpers to single directory * feat(detail pages): create shortcode for further definition navigation * feat(detail pages): fix find defs function * feat(detail pages): shortcode for browse nav markup * chore: fix collection mock data * feat(detail pages): render browse nav * feat(detail pages): style browse nav, style improvements * feat(detail pages): test redirect * feat(detail pages): client side redirect * feat(homepage): set title * 💅 * feat(detail pages): incorporate design changes * feat(detail pages): hide browse headlines * feat(detail pages): label lists * feat(footer): add aria label * feat(detail pages): redice heading level in md * feat(detail pages): spacing in browse nav * feat(detail pages): reduce line height * feat(detail pages): set max width w/o breaking homepage * feat(detail pages): replace in-definition definition links * 🧹 * feat(detail pages): recover spacing utility * 🧹 * chore(packages): update ava * config: specify nvm version * 💅 * 💅
2020-03-09 23:47:06 +01:00
const definitionPermalink = require('./11ty/helpers/definitionPermalink');
const renderDefinitionContentNextEntries = require('./11ty/shortcodes/renderDefinitionContentNextEntries');
const findExistingDefinition = require('./11ty/filters/helpers/findExistingDefinition');
2020-01-17 08:52:42 +01:00
module.exports = function(config) {
// Add a filter using the Config API
config.addFilter('linkTarget', definitionPermalink);
config.addFilter('linkIfExistsInCollection', (word, collection) => {
2020-01-17 08:52:42 +01:00
const existingDefinition = findExistingDefinition(word, collection);
if (existingDefinition) {
return `<a href="${definitionPermalink(
2020-01-17 08:52:42 +01:00
existingDefinition.data.slug
)}">${word}</a>`;
}
return `<span>${word}</span>`;
2020-01-17 08:52:42 +01:00
});
config.addFilter('linkSubTermIfDefined', (subTermData, collection) => {
2020-01-17 08:52:42 +01:00
const existingDefinition = findExistingDefinition(
subTermData.full_title,
collection
);
if (existingDefinition) {
return `<a href="${definitionPermalink(
2020-01-17 08:52:42 +01:00
existingDefinition.data.slug
)}">${subTermData.text}</a>`;
}
return `<span>${subTermData.text}</span>`;
2020-01-17 08:52:42 +01:00
});
// just a debug filter to lazily inspect the content of anything in a template
2020-01-17 08:52:42 +01:00
config.addFilter('postInspect', function(post) {
console.log(post);
2020-01-17 08:52:42 +01:00
});
2019-11-17 22:30:46 +01:00
config.addShortcode('definitionFlag', (flag) => {
2019-11-15 23:24:12 +01:00
const cleanText = new Map([
2020-01-17 08:52:42 +01:00
[
'avoid',
{
class: 'avoid',
text: 'Avoid'
}
],
[
'better-alternative',
{
class: 'better',
text: 'Better alternate'
}
],
[
'tool',
{
class: 'tool',
text: ''
}
]
]);
2019-11-15 23:24:12 +01:00
if (flag) {
const info = cleanText.get(flag.level.toLowerCase());
2019-11-15 23:24:12 +01:00
2020-01-17 08:52:42 +01:00
const sep = flag.text && info.text ? '—' : '';
const text = flag.text ? [info.text, flag.text].join(sep) : info.text;
2019-11-15 23:24:12 +01:00
📄 Add Detail Pages for Definitions (#75) * fix: untrack definitions in dist * feat(detail pages): update item link * feat(detail pages): add layout * feat(detail pages): render whole definition content * feat(detail pages): remove definitons from homepage * 🧹 def list component * feat(layout): render site footer in all pages * feat(detail pages): rename definition root class && move css into partials * chore: abstract further css into own files * feat(detail pages): update headling level of definition content * feat(styles): set box sizing * feat(styles): add margin bottom utility * feat(styles): selection * feat(components): sub page header own component * feat(detail pages): add sections * feat(style): mian headline * feat(page layout): rename page content grid * feat(page layout): add wide content class * feat(detail pages): set document title * feat(detail pages): set uniform document title for docs and definitions * feat(page title): add comment * feat(detail pages): add meta description * feat(detail pages): wrap def header in article tag * chore: set up ava * feat(filters): move permalink function into file, add test * chore: rename _temp to _util, remove creation script * feat(detail pages): helper function to find additional definitions * chore: move helpers to single directory * feat(detail pages): create shortcode for further definition navigation * feat(detail pages): fix find defs function * feat(detail pages): shortcode for browse nav markup * chore: fix collection mock data * feat(detail pages): render browse nav * feat(detail pages): style browse nav, style improvements * feat(detail pages): test redirect * feat(detail pages): client side redirect * feat(homepage): set title * 💅 * feat(detail pages): incorporate design changes * feat(detail pages): hide browse headlines * feat(detail pages): label lists * feat(footer): add aria label * feat(detail pages): redice heading level in md * feat(detail pages): spacing in browse nav * feat(detail pages): reduce line height * feat(detail pages): set max width w/o breaking homepage * feat(detail pages): replace in-definition definition links * 🧹 * feat(detail pages): recover spacing utility * 🧹 * chore(packages): update ava * config: specify nvm version * 💅 * 💅
2020-03-09 23:47:06 +01:00
return `<p class="definition-content__signal definition-content__signal--${info.class}">${text}</p>`;
2019-11-15 23:24:12 +01:00
}
📄 Add Detail Pages for Definitions (#75) * fix: untrack definitions in dist * feat(detail pages): update item link * feat(detail pages): add layout * feat(detail pages): render whole definition content * feat(detail pages): remove definitons from homepage * 🧹 def list component * feat(layout): render site footer in all pages * feat(detail pages): rename definition root class && move css into partials * chore: abstract further css into own files * feat(detail pages): update headling level of definition content * feat(styles): set box sizing * feat(styles): add margin bottom utility * feat(styles): selection * feat(components): sub page header own component * feat(detail pages): add sections * feat(style): mian headline * feat(page layout): rename page content grid * feat(page layout): add wide content class * feat(detail pages): set document title * feat(detail pages): set uniform document title for docs and definitions * feat(page title): add comment * feat(detail pages): add meta description * feat(detail pages): wrap def header in article tag * chore: set up ava * feat(filters): move permalink function into file, add test * chore: rename _temp to _util, remove creation script * feat(detail pages): helper function to find additional definitions * chore: move helpers to single directory * feat(detail pages): create shortcode for further definition navigation * feat(detail pages): fix find defs function * feat(detail pages): shortcode for browse nav markup * chore: fix collection mock data * feat(detail pages): render browse nav * feat(detail pages): style browse nav, style improvements * feat(detail pages): test redirect * feat(detail pages): client side redirect * feat(homepage): set title * 💅 * feat(detail pages): incorporate design changes * feat(detail pages): hide browse headlines * feat(detail pages): label lists * feat(footer): add aria label * feat(detail pages): redice heading level in md * feat(detail pages): spacing in browse nav * feat(detail pages): reduce line height * feat(detail pages): set max width w/o breaking homepage * feat(detail pages): replace in-definition definition links * 🧹 * feat(detail pages): recover spacing utility * 🧹 * chore(packages): update ava * config: specify nvm version * 💅 * 💅
2020-03-09 23:47:06 +01:00
return '<p class="definition-content__signal"></p>';
2019-11-15 23:24:12 +01:00
});
📄 Add Detail Pages for Definitions (#75) * fix: untrack definitions in dist * feat(detail pages): update item link * feat(detail pages): add layout * feat(detail pages): render whole definition content * feat(detail pages): remove definitons from homepage * 🧹 def list component * feat(layout): render site footer in all pages * feat(detail pages): rename definition root class && move css into partials * chore: abstract further css into own files * feat(detail pages): update headling level of definition content * feat(styles): set box sizing * feat(styles): add margin bottom utility * feat(styles): selection * feat(components): sub page header own component * feat(detail pages): add sections * feat(style): mian headline * feat(page layout): rename page content grid * feat(page layout): add wide content class * feat(detail pages): set document title * feat(detail pages): set uniform document title for docs and definitions * feat(page title): add comment * feat(detail pages): add meta description * feat(detail pages): wrap def header in article tag * chore: set up ava * feat(filters): move permalink function into file, add test * chore: rename _temp to _util, remove creation script * feat(detail pages): helper function to find additional definitions * chore: move helpers to single directory * feat(detail pages): create shortcode for further definition navigation * feat(detail pages): fix find defs function * feat(detail pages): shortcode for browse nav markup * chore: fix collection mock data * feat(detail pages): render browse nav * feat(detail pages): style browse nav, style improvements * feat(detail pages): test redirect * feat(detail pages): client side redirect * feat(homepage): set title * 💅 * feat(detail pages): incorporate design changes * feat(detail pages): hide browse headlines * feat(detail pages): label lists * feat(footer): add aria label * feat(detail pages): redice heading level in md * feat(detail pages): spacing in browse nav * feat(detail pages): reduce line height * feat(detail pages): set max width w/o breaking homepage * feat(detail pages): replace in-definition definition links * 🧹 * feat(detail pages): recover spacing utility * 🧹 * chore(packages): update ava * config: specify nvm version * 💅 * 💅
2020-03-09 23:47:06 +01:00
config.addShortcode(
'renderDefinitionContentNextEntries',
renderDefinitionContentNextEntries
);
// NOTE (ovlb): this will not be remembered as the best code ive written. if anyone seeing this has a better solution then the following to achieve sub groups of the definitions: i am happy to get rid of it
2020-01-17 08:52:42 +01:00
config.addCollection('tableOfContent', (collection) => {
const allItems = collection
.getFilteredByGlob('./11ty/definitions/*.md')
2020-01-17 08:52:42 +01:00
.filter((word) => !word.data.skip_in_table_of_content)
.sort((a, b) => {
2020-01-17 08:52:42 +01:00
const { title: firstTitle } = a.data;
const { title: secondTitle } = b.data;
const sortA = firstTitle.toLowerCase().replace(/^-/, '');
const sortB = secondTitle.toLowerCase().replace(/^-/, '');
// `localeCompare()` is super cool: http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare
2020-01-17 08:52:42 +01:00
return sortA.localeCompare(sortB);
});
const split = {
notLetters: {
title: '#',
definitions: []
},
aToE: {
title: 'AE',
definitions: []
},
fToL: {
title: 'FL',
definitions: []
},
mToS: {
title: 'MS',
definitions: []
},
tToZ: {
title: 'TZ',
definitions: []
}
2020-01-17 08:52:42 +01:00
};
2020-01-17 08:52:42 +01:00
allItems.forEach((word) => {
const { title } = word.data;
const { notLetters, aToE, fToL, mToS, tToZ } = split;
const sortableTitle = title.replace(/^-/, '');
2020-01-17 08:52:42 +01:00
if (/^[a-e]/gim.test(sortableTitle)) {
return aToE.definitions.push(word);
}
if (/^[f-l]/i.test(sortableTitle)) {
2020-01-17 08:52:42 +01:00
return fToL.definitions.push(word);
}
if (/^[m-s]/i.test(sortableTitle)) {
2020-01-17 08:52:42 +01:00
return mToS.definitions.push(word);
}
if (/^[t-z]/i.test(sortableTitle)) {
2020-01-17 08:52:42 +01:00
return tToZ.definitions.push(word);
}
// no reg ex as the fallback to avoid testing for emojis and numbers
2020-01-17 08:52:42 +01:00
notLetters.definitions.push(word);
});
2020-01-17 08:52:42 +01:00
return Object.keys(split).map((key) => {
const { title, definitions } = split[key];
2020-01-17 08:52:42 +01:00
return { title, definitions };
});
});
2020-01-17 08:52:42 +01:00
config.addCollection('definedWords', (collection) => {
2019-11-15 20:09:21 +01:00
return collection
2020-01-17 08:52:42 +01:00
.getFilteredByGlob('./11ty/definitions/*.md')
.filter((word) => word.data.defined)
.sort((a, b) => {
// `localeCompare()` is super cool: http://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/localeCompare
return a.data.title
.toLowerCase()
.localeCompare(b.data.title.toLowerCase());
});
});
2019-11-17 22:30:20 +01:00
const mdIt = require('markdown-it')({
html: true
2020-01-17 08:52:42 +01:00
});
const prism = require('markdown-it-prism');
const anchor = require('markdown-it-anchor');
2019-11-17 22:30:20 +01:00
2020-01-17 08:52:42 +01:00
mdIt.use(prism);
mdIt.use(anchor);
2019-11-17 22:30:20 +01:00
config.setLibrary('md', mdIt);
// You can return your Config object (optional).
return {
dir: {
input: '11ty',
output: 'dist'
},
templateFormats: ['njk', 'md'],
htmlTemplateEngine: 'njk',
markdownTemplateEngine: 'njk'
};
};