pidgin/nest
Clone
Summary
Browse
Changes
Graph
Update the contact page for Discourse and the mailing lists shutdown
16 months ago, Gary Kramlich
dd47cbb736b0
Update the contact page for Discourse and the mailing lists shutdown
Testing Done:
ran `codespell` and `npm run hugo:server`
Reviewed at https://reviews.imfreedom.org/r/2166/
/**
* 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`
)
}