#!/usr/bin/env node import fs from 'fs' import path from 'path' import walk from 'walk-sync' import frontmatter from '../../lib/read-frontmatter.js' import getDocumentType from '../../lib/get-document-type.js' import languages from '../../lib/languages.js' import ExtendedMarkdown from '../../lib/liquid-tags/extended-markdown.js' const extendedMarkdownTags = Object.keys(ExtendedMarkdown.tags) const linkString = /{% [^}]*?link.*? (\/.*?) ?%}/m const linksArray = new RegExp(linkString.source, 'gm') // This script turns `{% link / %} style content into children: [ -/ ] frontmatter arrays. // // It MUST be run after script/content-migrations/remove-map-topics.js. // // NOTE: The results won't work with the TOC handling currently in production, so the results must NOT // be committed until the updated handling is in place. const walkOpts = { includeBasePath: true, directories: false, } const fullDirectoryPaths = Object.values(languages).map((langObj) => path.join(process.cwd(), langObj.dir, 'content') ) const indexFiles = fullDirectoryPaths .map((fullDirectoryPath) => walk(fullDirectoryPath, walkOpts)) .flat() .filter((file) => file.endsWith('index.md')) const englishHomepageData = { children: '', externalProducts: '', } indexFiles.forEach((indexFile) => { const relativePath = indexFile.replace(/^.+\/content\//, '') const documentType = getDocumentType(relativePath) const { data, content } = frontmatter(fs.readFileSync(indexFile, 'utf8')) // Save the English homepage frontmatter props... if (documentType === 'homepage' && !indexFile.includes('/translations/')) { englishHomepageData.children = data.children englishHomepageData.externalProducts = data.externalProducts } // ...and reuse them in the translated homepages, in case the translated files are out of date if (documentType === 'homepage' && indexFile.includes('/translations/')) { data.children = englishHomepageData.children data.externalProducts = englishHomepageData.externalProducts } const linkItems = content.match(linksArray) if (!linkItems) return // Turn the `{% link / %}` list into an array of / items if (documentType === 'product' || documentType === 'mapTopic') { data.children = getLinks(linkItems) } if (documentType === 'category') { const childMapTopics = linkItems.filter((item) => item.includes('topic_')) data.children = childMapTopics.length ? getLinks(childMapTopics) : getLinks(linkItems) } // Fix this one weird file if (relativePath === 'discussions/guides/index.md') { data.children = [ '/best-practices-for-community-conversations-on-github', '/finding-your-discussions', '/granting-higher-permissions-to-top-contributors', ] } // Remove the Table of Contents section and leave any body text before it. let newContent = content .replace(/^#*? Table of contents[\s\S]*/im, '') .replace('