selfdefined/.eleventy.js

150 lines
4.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const makeItemLink = (slug) => `#${slug}`
const findExistingDefinition = (word, collection) => collection.find(item => item.data.title === word)
module.exports = function (config) {
// Add a filter using the Config API
config.addFilter('linkTarget', makeItemLink);
config.addFilter('linkIfExistsInCollection', (word, collection) => {
const existingDefinition = findExistingDefinition(word, collection)
if (existingDefinition) {
return `<a href=${makeItemLink(existingDefinition.data.slug)}>${word}</a>`
}
return word
})
config.addFilter('linkSubTermIfDefined', (subTermData, collection) => {
const existingDefinition = findExistingDefinition(subTermData.full_title, collection)
if (existingDefinition) {
return `<a href=${makeItemLink(existingDefinition.data.slug)} aria-label="${subTermData.full_title}">${subTermData.text}</a>`
}
return subTermData.text
})
// just a debug filter to lazily inspect the content of anything in a template
config.addFilter('postInspect', function (post) {
console.log(post);
})
config.addPassthroughCopy({'_site/css/': 'assets/css/'})
config.addShortcode("definitionFlag", (flag) => {
const cleanText = new Map([
['avoid', {
class: 'avoid',
text: 'Avoid'
}],
['better-alternative', {
class: 'better',
text: 'Better alternate'
}],
['tool', {
class: 'tool',
text: ''
}]
])
if (flag) {
const info = cleanText.get(flag.level)
const sep = flag.text && info.text ? '—' : ''
const text = flag.text ? [info.text, flag.text].join(sep) : info.text
return `<p class="word__signal word__signal--${info.class}">${text}</p>`
}
return '<p class="word__signal"></p>'
});
// 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
config.addCollection('tableOfContent', collection => {
const allItems = collection
.getFilteredByGlob('./11ty/definitions/*.md')
.filter(word => !word.data.skip_in_table_of_content)
.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())
})
const split = {
notLetters: {
title: '#',
definitions: []
},
aToE: {
title: 'AE',
definitions: []
},
fToL: {
title: 'FL',
definitions: []
},
mToS: {
title: 'MS',
definitions: []
},
tToZ: {
title: 'TZ',
definitions: []
}
}
allItems.forEach(word => {
const { title, skip_in_table_of_content } = word.data
const { notLetters, aToE, fToL, mToS, tToZ } = split
if (/^[a-e]/gmi.test(title)) {
return aToE.definitions.push(word)
}
if (/^[f-l]/i.test(title)) {
return fToL.definitions.push(word)
}
if (/^[m-s]/i.test(title)) {
return mToS.definitions.push(word)
}
if (/^[t-z]/i.test(title)) {
return tToZ.definitions.push(word)
}
// no reg ex as the fallback to avoid testing for emojis and numbers
notLetters.definitions.push(word)
})
return Object.keys(split).map(key => {
const { title, definitions } = split[key]
return { title, definitions }
})
})
config.addCollection('definedWords', collection => {
return collection
.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())
})
})
// You can return your Config object (optional).
return {
dir: {
input: '11ty',
output: 'dist'
},
templateFormats: ['njk', 'md'],
htmlTemplateEngine: 'njk',
markdownTemplateEngine: 'njk',
passthroughFileCopy: true
};
};