const fs = require('fs') var path = require('path') /* arguments: all index convert assets */ // settings const ignoreFiles = ['_navbar.md', '_sidbar.md'] const basePath = '/' const basePathAssets = './' const uriSuffix = '.html' const anchorPrefix = '#' const assetsFolder = 'assets' const gitUrl = 'https://github.com/Mint-System/Knowledge/blob/master/' const wikiImage = /!\[\[([^\]]+\..+)\]\]/g const embededContent = /!\[\[([^\]]*)\]\]/g const wikiLink = /\[\[([^\]]*)\]\]/g function sanitizeName(file) { return file.toLocaleLowerCase() .replace(/\s+/g, '-') .replace('---', '-') } function sanitizeAssetname(file) { return file.toLocaleLowerCase() .replace(/\s+/g, '-') .replace('---', '-') .replace(/ö/g, 'o') .replace(/ü/g, 'u') .replace(/ä/g, 'a') } const groupBy = key => array => array.reduce((objectsByKeyValue, obj) => { const value = obj[key]; objectsByKeyValue[value] = (objectsByKeyValue[value] || []).concat(obj); return objectsByKeyValue; }, {}); function convert(content, file) { // convert wiki image links // ![[image.png]] -> let matches = content.match(wikiImage) || [] for (i = 0; i < matches.length; i++) { let match = matches[i] let image = sanitizeAssetname(match.match(/!\[\[([^\]]*)/)[1]) content = content.replace(match, `![](${basePathAssets}${image})`) } // convert embeded content links // ![[Content]] -> !!!include(content.md)!!! matches = content.match(embededContent) || [] for (i = 0; i < matches.length; i++) { let match = matches[i] let title = sanitizeName(match.match(/\[\[([^\]|#]*)/)[1]) content = content.replace(embededContent, `!!!include(${title}.md)!!!`) } // convert wiki links // [[href#anchor|title] -> [title > anchor](href#anchor) matches = content.match(wikiLink) || [] for (i = 0; i < matches.length; i++) { let match = matches[i] let href = match.match(/\[\[([^\]|#]*)/)[1] let title = match.match(/\[\[([^\]|#]*)/)[1] let anchor = null // set anchor if (match.indexOf('#') > 0) { anchor = match.match(/#([^\||\]]*)/)[1] // combine title and href text title = `${title} > ${anchor}` // sanitize anchor link anchor = sanitizeName(anchor) } // set title and href if (match.indexOf('|') > 0) { href = match.match(/\[\[([^\||#]*)/)[1] title = match.match(/\|(.*)\]\]/)[1] } // sanitize href href = sanitizeName(href ? href : file.replace('\.md', '')) let mdLink = `[${title}](${basePath}${href}${uriSuffix}${anchor ? (anchorPrefix + anchor) : ''})` content = content.replace(match, mdLink) } return content } // Build vars var links = [] var files = [] var args = process.argv.slice(2); var firstArg = args[0] if (!firstArg || ['all', 'index'].indexOf(firstArg) >= 0) { // log console.log('Build title index ...') // loop all markdown files fs.readdirSync(__dirname).filter(file => (file.slice(-3) === '.md') && (ignoreFiles.indexOf(file) != 0)).forEach((file) => { // get markdown content var content = fs.readFileSync(file, 'utf8') // get wiki links matches = content.match(wikiLink) || [] // create backlink list for (i = 0; i < matches.length; i++) { let match = matches[i] links.push({ source: file.replace('\.md', ''), target: match.match(/\[\[([^\]|#]*)/)[1] }) } // create file link list files.push({ source: file.replace('\.md', ''), target: file, firstLetter: file[0].toUpperCase() }) }) // log console.log('Building title index finished.') } if (!firstArg || ['all', 'convert'].indexOf(firstArg) > 0) { // log console.log('Convert files ...') // process all markdown files fs.readdirSync(__dirname).filter(file => (file.slice(-3) === '.md') && (ignoreFiles.indexOf(file) != 0)).forEach((file) => { // get markdown content let content = fs.readFileSync(file, 'utf8') // set new file name let newfile = sanitizeName(file) // Get file name let fileName = file.replace('\.md', '') // convert content content = convert(content, file) // get backlinks let backLinks = links.filter(link => link.target === fileName) // remove duplicates backLinks = Array.from(new Set(backLinks.map(o => JSON.stringify(o)))).map(s => JSON.parse(s)) content = content + [ '\n', '\n', '' ].join('') // Delete existing file fs.unlinkSync(file) // write content to new file fs.writeFileSync(newfile, content, 'utf8') }) // log console.log('Converting files finished.') } if (!firstArg || ['all', 'index'].indexOf(firstArg) > 0) { // log console.log('Build glossary ...') // Group files by first letter groupedFiles = groupBy('firstLetter')(files) content = [ '# Glossary', '\n' ] Object.keys(groupedFiles).forEach(function(key) { content.push(`## ${key}`) content.push('\n','\n') groupedFiles[key].forEach((link) => { content.push(`[${link.source}](${sanitizeName(link.target)}) `) content.push('\n') }) content.push('\n') }) // write content to index file fs.writeFileSync('glossary.md', content.join(''), 'utf8') // log console.log('Building glossary finished.') } if (!firstArg || ['all', 'assets'].indexOf(firstArg) > 0) { // log console.log('Move assets ...') // Loop all asset files fs.readdirSync(path.join(__dirname, assetsFolder)).forEach((file) => { // set new file name newfile = sanitizeAssetname(file) // move asset file fs.renameSync(path.join(__dirname, assetsFolder, file), path.join(__dirname, newfile)) }) // log console.log('Moving assets finished.') }