Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 4 additions & 9 deletions .github/workflows/check-all-english-links.yml
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,11 @@ jobs:
run: npm run build
- name: Run script
run: script/check-english-links.js > broken_links.md
- name: Check if any broken links
- if: ${{ failure() }}
name: Get title for issue
id: check
run: |
if [ "$(grep '0 broken links found' broken_links.md)" ]; then
echo ::set-output name=continue::no
else
echo "::set-output name=continue::yes"
echo "::set-output name=title::$(head -1 broken_links.md)"
fi
- if: ${{ steps.check.outputs.continue == 'yes' }}
run: echo "::set-output name=title::$(head -1 broken_links.md)"
- if: ${{ failure() }}
name: Create issue from file
uses: peter-evans/create-issue-from-file@35e304e2a12caac08c568247a2cb46ecd0c3ecc5
with:
Expand Down
7 changes: 7 additions & 0 deletions script/content-migrations/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# Content migration scripts

This directory stores scripts that modify content and/or data files. Because
writers are updating content all the time, scripts in here require more
cross-team coordination and planning before they are run. Make sure to consider
whether a script added here also needs to be run on translation files or if we
can wait for the changes to come in organically via Crowdin.
73 changes: 73 additions & 0 deletions script/content-migrations/update-developer-site-links.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
#!/usr/bin/env node

const fs = require('fs')
const path = require('path')
const walk = require('walk-sync')
const frontmatter = require('@github-docs/frontmatter')
const loadPages = require('../../lib/pages')
const patterns = require('../../lib/patterns')
const loadRedirects = require('../../lib/redirects/precompile')
const allVersions = Object.keys(require('../../lib/all-versions'))

// get all content and data files
const files = ['content', 'data'].map(dir => {
return walk(path.join(process.cwd(), dir), { includeBasePath: true, directories: false })
.filter(file => file.endsWith('.md') && !file.endsWith('README.md'))
}).flat()

// match [foo](/v3) and [bar](/v4) Markdown links
const linkRegex = new RegExp('\\(/v[34].*?\\)', 'g')

main()

async function main () {
// we need to load the pages so we can get the redirects
const englishPages = (await loadPages()).filter(p => p.languageCode === 'en')
const redirects = await loadRedirects(englishPages)

for (const file of files) {
const { data, content } = frontmatter(fs.readFileSync(file, 'utf8'))

const links = content.match(linkRegex)
if (!links) continue

// remove parentheses: (/v3) -> /v3
// also remove trailing slash before closing parens if there is one
const devLinks = links
.map(link => link.replace('(', '').replace(/\/?\)/, ''))

let newContent = content

for (const devLink of devLinks) {
const [link, fragment] = devLink.split(/\/?#/)

let redirect = redirects[link]

if (!redirect) {
console.log(`no redirect found for ${devLink} in ${file}`)
continue
}

// do some cleanup
redirect = redirect
// remove language code segment
.replace(patterns.getLanguageCode, '')
// remove version segment
.replace(new RegExp(`/(${allVersions.join('|')})`), '')

// re-add the fragment
const newLink = fragment
? redirect + '#' + fragment
: redirect

// first remove any trailing slashes from the old link,
// then replace with the new link
newContent = newContent
.replace(`${devLink}/`, devLink)
.replace(devLink, newLink)
}

fs.writeFileSync(file, frontmatter.stringify(newContent, data, { lineWidth: 10000 }))
}
console.log('Done!')
}