pidgin/nest

Update to hugo-theme-learn 2.5.0

19 months ago, Elliott Sales de Andrade
50afdb25d25a
Update to hugo-theme-learn 2.5.0

The latest version improves compatibility with latest Hugo and adds several enhancements. This enables us to drop most of our vendored copies of the theme files.

* Mermaid is now a theme option, so we don't need to overlay a copy of the partial with it removed.
* Custom CSS has a theme option to load it, so we don't need to add it to `custom-header.html`.
* It now uses the [recommended colour style variant customization](https://learn.netlify.app/en/basics/style-customization/#yours-variant) instead of copying the theme's CSS. Most of the sidebar seemed unchanged from the default, but I copied them anyway to prevent them changing.
* Dropping the copy of the theme CSS means moving our customized fixed-max-width style on the body to the custom CSS.
* I moved the footer into `custom-footer.html` so that most partials would not need to be copied; this does mean it's no longer a bubble that's the width of the content, but I always found that weird anyway. Some new CSS is necessary to make it centred properly.
* I found many of the partials and the JavaScript were functionally the same as the original theme's copy, so I removed them.

Testing Done:
Opened up a few pages and saw things were roughly equivalent, except the footer as noted above.

The only regression I believe is that the ToC is no longer automatically added on 'long' pages. However, it's still there on hover of the ToC icon.

Reviewed at https://reviews.imfreedom.org/r/1933/
/**
* Tracks the progress of migrating content
* from the the old site to the new site
*/
/*****************************************************************************
* Imports
*****************************************************************************/
const fs = require('fs')
const path = require('path')
const front = require('front-matter')
/*****************************************************************************
* Set Up
*****************************************************************************/
const filepath = __dirname.replace(/\/tools(\/)?$/, '/hugo/content')
const obsoleteRegex = /\s#(\s+)?obsolete(\s+)?$/i
const mdRegex = /\.md$/
const migrating = []
const obsoleted = []
/*****************************************************************************
* Execution
*****************************************************************************/
const paths = fs
.readFileSync(path.join(__dirname, 'paths.txt'), 'utf8')
.split('\n')
// Sift each URL
paths.forEach(path => {
if (obsoleteRegex.test(path)) {
obsoleted.push(path.replace(obsoleteRegex, ''))
} else {
migrating.push(path)
}
})
/** Information on new content */
const nestPages = getMdPaths(path.join(__dirname, '../hugo/content/'))
// discard translated content
.filter(path => !/\.\w+\.md$/.test(path))
.map(path => {
const frontMatter = getFrontMatter(path)
const replaces = castReplacesDataToArray(frontMatter.replaces)
return {
replaces,
path,
pathOnSite: path
// convert to relative file path
.replace(filepath, '')
// remove file extension
.replace(/\.md$/, '')
// remove _index
.replace(/\/_index(\.\w\w)?$/, ''),
}
})
/*****************************************************************************
* Generate Stats
*****************************************************************************/
const pathsToMigrate = migrating.length
const pathsObsoleted = paths.length - pathsToMigrate
const covered = new Set()
nestPages.forEach(page => page.replaces.forEach(path => covered.add(path)))
const missing = migrating.filter(path => !covered.has(path))
const pathsCovered = migrating.reduce(
(acc, path) => acc + (covered.has(path) ? 1 : 0),
0
)
const percentComplete = ((pathsCovered / pathsToMigrate) * 100).toPrecision(2)
console.log(missing.length, 'paths remaining')
missing.forEach(path => console.log(` ${path}`))
console.log()
console.log(`
STATS:
tracking ${paths.length} pages
${pathsCovered}/${pathsToMigrate} (${percentComplete}%) migrated
${pathsObsoleted} obsoleted
`)
/*****************************************************************************
* Generate redirection mapping
*****************************************************************************/
// TODO: Generate redirection instructions
/*****************************************************************************
* Helpers
*****************************************************************************/
/**
* Retrieves front matter from markdown files
* @param {string} path path to markdown file
*/
function getFrontMatter(path) {
try {
const data = fs.readFileSync(path, 'utf8')
const { attributes } = front(data)
return attributes
} catch (error) {
console.log(error)
}
}
/**
* creates a list of all markdown files in a directory
* @param {string} directory directory to search for markdown files
*/
function getMdPaths(directory) {
let output = []
let items = fs.readdirSync(directory).map(i => path.join(directory, i))
while (items.length) {
const item = items.pop()
const stat = fs.statSync(item)
if (stat.isDirectory()) {
items.push(...fs.readdirSync(item).map(i => path.join(item, i)))
} else if (stat.isFile() && mdRegex.test(item)) {
output.push(item)
}
}
return output.sort()
}
/**
*
* @param {void|string|string[]} replaces
*/
function castReplacesDataToArray(replaces) {
if (!replaces) {
return []
} else if (typeof replaces === 'string') {
return [replaces]
} else if (Array.isArray(replaces)) {
return replaces
}
throw new Error(
`expected replaces of ${path} to be falsey, string or an array`
)
}