selfdefined/.eleventy.js

182 lines
4.7 KiB
JavaScript
Raw Normal View History

2020-05-28 16:26:44 -07: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) {
2020-05-28 16:26:44 -07:00
// Add a filter using the Config API
config.addFilter('linkTarget', definitionPermalink)
config.addFilter('linkIfExistsInCollection', (word, collection) => {
const existingDefinition = findExistingDefinition(word, collection)
if (existingDefinition) {
return `<a href="${definitionPermalink(existingDefinition.data.slug)}">${word}</a>`
}
return `<span>${word}</span>`
})
config.addFilter('linkSubTermIfDefined', (subTermData, collection) => {
const existingDefinition = findExistingDefinition(subTermData.full_title, collection)
if (existingDefinition) {
return `<a href="${definitionPermalink(existingDefinition.data.slug)}">${subTermData.text}</a>`
}
return `<span>${subTermData.text}</span>`
})
// just a debug filter to lazily inspect the content of anything in a template
config.addFilter('postInspect', function(post) {
console.log(post)
})
config.addShortcode('definitionFlag', (flag) => {
const cleanText = new Map([
[
'avoid',
{
class: 'avoid',
text: 'Avoid'
}
],
[
'better-alternative',
{
class: 'better',
text: 'Better alternate'
}
],
[
'tool',
{
class: 'tool',
text: ''
}
],
[
'warning',
{
class: 'warning',
text: ''
}
]
])
if (flag) {
const info = cleanText.get(flag.level.toLowerCase())
const sep = flag.text && info.text ? '—' : ''
const text = flag.text ? [ info.text, flag.text ].join(sep) : info.text
return `<p class="definition-content__signal definition-content__signal--${info.class}">${text}</p>`
}
return '<p class="definition-content__signal"></p>'
})
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
config.addCollection('tableOfContent', (collection) => {
const allItems = collection
.getFilteredByGlob('./11ty/definitions/*.md')
.filter((word) => !word.data.skip_in_table_of_content)
.sort((a, b) => {
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
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: []
}
}
allItems.forEach((word) => {
const { title } = word.data
const { notLetters, aToE, fToL, mToS, tToZ } = split
const sortableTitle = title.replace(/^-/, '')
if (/^[a-e]/gim.test(sortableTitle)) {
return aToE.definitions.push(word)
}
if (/^[f-l]/i.test(sortableTitle)) {
return fToL.definitions.push(word)
}
if (/^[m-s]/i.test(sortableTitle)) {
return mToS.definitions.push(word)
}
if (/^[t-z]/i.test(sortableTitle)) {
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())
})
})
const mdIt = require('markdown-it')({
html: true
})
const prism = require('markdown-it-prism')
const anchor = require('markdown-it-anchor')
mdIt.use(prism)
mdIt.use(anchor)
config.setLibrary('md', mdIt)
// You can return your Config object (optional).
return {
dir: {
input: '11ty',
output: 'dist'
},
templateFormats: [ 'njk', 'md' ],
htmlTemplateEngine: 'njk',
markdownTemplateEngine: 'njk'
}
}