Files
browser-scripts-builder/src/readmefile.ts
2022-06-08 10:29:48 -05:00

79 lines
2.2 KiB
TypeScript

import { readdirSync, readFileSync, writeFileSync } from 'fs'
import { UserScriptMetaFull } from './types'
export interface readmeData {
meta: UserScriptMetaFull
error: string | null
}
export function updateReadmeFile(fileList: readmeData[]) {
let readmeFile = getReadmeFileName()
if (readmeFile !== null) {
let [readmeStart, readmeEnd] = readReadmeFile(readmeFile)
let installLinks = fileList.map(readmeDataToString).join('\n')
let installLinksAll = `<!-- START INSTALL LINKS -->
## Installs
${installLinks}
<!-- END INSTALL LINKS -->`
let content = readmeStart + installLinksAll + readmeEnd
writeFileSync(readmeFile, content)
}
}
function readmeDataErrorString(error: string | null): string {
if (error === null) return ''
error = error
.split('\n')
.map(line => ` ${line}`)
.join('\n')
return `\n\n${error}`
}
function readmeDataToString(readmeData: readmeData): string {
let { meta, error } = readmeData
let errStr = error !== null ? '~~' : ''
let errMsg = readmeDataErrorString(error)
return `- ${errStr}[${meta.name}](${meta.downloadURL})})${errStr}${errMsg}`
}
function getReadmeFileName(): string | null {
let files = readdirSync('.')
for (let name of files) {
if (/^readme\.md$/i.test(name)) {
return name
}
}
return null
}
function readReadmeFile(readmeFile: string): [string, string] {
const content = readFileSync(readmeFile).toString()
const regex =
/<!-- START INSTALL LINKS -->(?:.|\n)*?<!-- END INSTALL LINKS -->/
const index = regex.exec(content)?.index
let contentPre = '',
contentPost = ''
if (index === undefined) {
contentPre = content
} else {
let content_replace = content.replace(regex, '')
contentPre = content_replace.slice(0, index)
contentPost = content_replace.slice(index)
}
if (contentPre.trimEnd().length === 0) contentPre = ''
else contentPre = contentPre.trimEnd() + '\n\n'
if (contentPost.trimStart().length === 0) contentPost = '\n'
else contentPost = '\n\n' + contentPost.trimStart()
return [contentPre, contentPost]
}