зеркало из https://github.com/github/docs.git
106 строки
3.3 KiB
JavaScript
Executable File
106 строки
3.3 KiB
JavaScript
Executable File
#!/usr/bin/env node
|
|
|
|
// [start-readme]
|
|
//
|
|
// Run this script to test-render all the translation files that have been changed (when compared to the `main` branch).
|
|
//
|
|
// [end-readme]
|
|
|
|
import { fileURLToPath } from 'url'
|
|
import path from 'path'
|
|
import renderContent from '../lib/render-content/index.js'
|
|
import loadSiteData from '../lib/site-data.js'
|
|
import { loadPages } from '../lib/page-data.js'
|
|
import languages from '../lib/languages.js'
|
|
import { promisify } from 'util'
|
|
import ChildProcess, { execSync } from 'child_process'
|
|
import fs from 'fs'
|
|
import frontmatter from '../lib/frontmatter.js'
|
|
import chalk from 'chalk'
|
|
import { YAMLException } from 'js-yaml'
|
|
|
|
const __dirname = path.dirname(fileURLToPath(import.meta.url))
|
|
|
|
const exec = promisify(ChildProcess.exec)
|
|
|
|
main()
|
|
|
|
async function main() {
|
|
const siteData = await loadAndPatchSiteData()
|
|
const pages = await loadPages()
|
|
const contextByLanguage = {}
|
|
for (const lang in languages) {
|
|
const langObj = languages[lang]
|
|
const [crowdinLangCode] = langObj.dir === '' ? 'en' : langObj.dir.split('/').slice(1)
|
|
if (!crowdinLangCode) continue
|
|
contextByLanguage[crowdinLangCode] = {
|
|
site: siteData[langObj.code].site,
|
|
currentLanguage: langObj.code,
|
|
currentVersion: 'free-pro-team@latest',
|
|
}
|
|
}
|
|
|
|
const rootDir = path.join(__dirname, '..')
|
|
|
|
const changedFilesRelPaths = execSync(
|
|
'git -c diff.renameLimit=10000 diff --name-only origin/main | egrep "^translations/.*/.+.md$"',
|
|
{ maxBuffer: 1024 * 1024 * 100 }
|
|
)
|
|
.toString()
|
|
.split('\n')
|
|
.filter((path) => path !== '' && !path.endsWith('README.md'))
|
|
.sort()
|
|
|
|
console.log(`Found ${changedFilesRelPaths.length} translated files.`)
|
|
|
|
for (const relPath of changedFilesRelPaths) {
|
|
const fullPath = path.join(rootDir, relPath)
|
|
const lang = relPath.split('/')[1]
|
|
const context = {
|
|
...contextByLanguage[lang],
|
|
pages,
|
|
page: pages.find((page) => page.fullPath === fullPath),
|
|
redirects: {},
|
|
}
|
|
if (!context.page && !relPath.includes('data/reusables')) continue
|
|
const fileContents = await fs.promises.readFile(fullPath, 'utf8')
|
|
const { content } = frontmatter(fileContents)
|
|
try {
|
|
await renderContent.liquid.parseAndRender(content, context)
|
|
} catch (err) {
|
|
console.log(chalk.bold(relPath))
|
|
console.log(chalk.red(` error message: ${err.message}`))
|
|
}
|
|
}
|
|
}
|
|
|
|
async function loadAndPatchSiteData(filesWithKnownIssues = {}) {
|
|
try {
|
|
const siteData = loadSiteData()
|
|
return siteData
|
|
} catch (error) {
|
|
if (error instanceof YAMLException && error.mark) {
|
|
const relPath = error.mark.name
|
|
if (!filesWithKnownIssues[relPath]) {
|
|
// Note the file as problematic
|
|
filesWithKnownIssues[relPath] = true
|
|
|
|
// This log is important as it will get ${relPath} written to a logfile
|
|
console.log(chalk.bold(relPath))
|
|
console.log(chalk.red(` error message: ${error.toString()}`))
|
|
|
|
// Reset the file
|
|
console.warn(`resetting file "${relPath}" due to loadSiteData error: ${error.toString()}`)
|
|
await exec(`script/reset-translated-file.js --prefer-main ${relPath}`)
|
|
|
|
// Try to load the site data again
|
|
return loadAndPatchSiteData(filesWithKnownIssues)
|
|
} else {
|
|
console.error(`FATAL: Tried to reset file "${relPath}" but still had errors`)
|
|
}
|
|
}
|
|
|
|
throw error
|
|
}
|
|
}
|