mirror of
https://github.com/pezkuwichain/pezkuwi-fellows.git
synced 2026-04-26 05:07:56 +00:00
Introduce RFC mdBook web page (#60)
- Closes https://github.com/polkadot-fellows/RFCs/issues/53 - Preview available [here](https://paritytech.github.io/RFCs/).  --- ### What it does - The workflow gathers the source markdown files of RFCs - approved ones, and proposed ones (from open PRs). - The proposed RFCs are separated into new (<7 days since PR created) and stale (>30 days since PR updated). - The RFCs are extended with a table of contents, and a link to the source. - The RFCs are build into a web page using [mdBook](https://github.com/rust-lang/mdBook). - The built web page gets pushed to `gh-pages` branch - to be published in Github Pages. - The workflow is triggered on merge to `main`, and periodically once a day.
This commit is contained in:
@@ -0,0 +1,38 @@
|
||||
/**
|
||||
* mdBook relies on the creation of a special SUMMARY.md file
|
||||
* https://rust-lang.github.io/mdBook/format/summary.html
|
||||
* This script constructs the summary out of the available source files.
|
||||
*/
|
||||
|
||||
const fs = require('fs');
|
||||
const summaryPath = "mdbook/src/SUMMARY.md"
|
||||
|
||||
module.exports = async ({github, context}) => {
|
||||
fs.writeFileSync(summaryPath, "# Summary\n\n[Introduction](introduction.md)\n") // Starting point.
|
||||
|
||||
const appendRfcsToSummary = (dirPath) => {
|
||||
for (const filename of fs.readdirSync(dirPath)) {
|
||||
if (!filename.endsWith(".md")) continue;
|
||||
const filePath = dirPath + filename
|
||||
const text = fs.readFileSync(filePath)
|
||||
const title = text.toString().split(/\n/)
|
||||
.find(line => line.startsWith("# ") || line.startsWith(" # "))
|
||||
.replace("# ", "")
|
||||
// Relative path, without the src prefix (format required by mdbook)
|
||||
const relativePath = filePath.replace("mdbook/src/", "")
|
||||
fs.appendFileSync(summaryPath, `- [${title}](${relativePath})\n`)
|
||||
}
|
||||
}
|
||||
|
||||
fs.appendFileSync(summaryPath, "\n---\n\n# Approved\n\n")
|
||||
appendRfcsToSummary("mdbook/src/approved/")
|
||||
|
||||
fs.appendFileSync(summaryPath, "\n---\n\n# Newly Proposed\n\n")
|
||||
appendRfcsToSummary("mdbook/src/new/")
|
||||
|
||||
fs.appendFileSync(summaryPath, "\n---\n\n# Proposed\n\n")
|
||||
appendRfcsToSummary("mdbook/src/proposed/")
|
||||
|
||||
fs.appendFileSync(summaryPath, "\n---\n\n# Stale\n\n")
|
||||
appendRfcsToSummary("mdbook/src/stale/")
|
||||
}
|
||||
@@ -0,0 +1,74 @@
|
||||
/**
|
||||
* This scripts gathers source markdown files of approved and proposed RFCS into the mdbook/src directory.
|
||||
*/
|
||||
|
||||
const fs = require('fs');
|
||||
|
||||
// The amount of days that an RFC is considered "new".
|
||||
// Counted from the creation of a given PR.
|
||||
const NEW_RFC_PERIOD_DAYS = 7
|
||||
|
||||
// The amount of days that an RFC is considered "stale".
|
||||
// Counted from the last update on a PR.
|
||||
const STALE_RFC_PERIOD_DAYS = 30
|
||||
|
||||
const dateDaysBefore = (daysBefore) => {
|
||||
const result = new Date()
|
||||
result.setDate(result.getDate() - daysBefore)
|
||||
return result
|
||||
}
|
||||
|
||||
[
|
||||
"mdbook/src/approved",
|
||||
"mdbook/src/new",
|
||||
"mdbook/src/stale",
|
||||
"mdbook/src/proposed"
|
||||
].forEach(path => fs.mkdirSync(path, {resursive: true}))
|
||||
|
||||
const TOC = "**Table of Contents**\n\n<\!-- toc -->\n"
|
||||
|
||||
module.exports = async ({github, context}) => {
|
||||
const owner = 'polkadot-fellows'
|
||||
const repo = 'RFCs'
|
||||
const prs = await github.paginate(github.rest.pulls.list, {owner, repo, state: 'open'})
|
||||
|
||||
/*
|
||||
The open PRs are potential proposed RFCs.
|
||||
We iterate over them and filter those that include a new RFC markdown file.
|
||||
*/
|
||||
for (const pr of prs) {
|
||||
const addedMarkdownFiles = (
|
||||
await github.rest.pulls.listFiles({
|
||||
owner, repo,
|
||||
pull_number: pr.number,
|
||||
})
|
||||
).data.filter(
|
||||
(file) => file.status === "added" && file.filename.startsWith("text/") && file.filename.includes(".md"),
|
||||
);
|
||||
if (addedMarkdownFiles.length !== 1) continue;
|
||||
const [rfcFile] = addedMarkdownFiles;
|
||||
const rawText = await (await fetch(rfcFile.raw_url)).text();
|
||||
|
||||
const isNew = new Date(pr.created_at) > dateDaysBefore(NEW_RFC_PERIOD_DAYS)
|
||||
const isStale = new Date(pr.updated_at) < dateDaysBefore(STALE_RFC_PERIOD_DAYS)
|
||||
const status = isNew ? 'new' : (isStale ? 'stale' : 'proposed')
|
||||
|
||||
const filename = rfcFile.filename.replace("text/", "")
|
||||
|
||||
fs.writeFileSync(
|
||||
`mdbook/src/${status}/${filename}`,
|
||||
`[(source)](${pr.html_url})\n\n`
|
||||
+ TOC
|
||||
+ rawText
|
||||
)
|
||||
}
|
||||
|
||||
// Copy the approved (already-merged) RFCs markdown files, first adding a source link at the top and a TOC.
|
||||
for (const file of fs.readdirSync("text/")) {
|
||||
if (!file.endsWith(".md")) continue;
|
||||
const text = `[(source)](https://github.com/polkadot-fellows/RFCs/blob/main/text/${file})\n\n`
|
||||
+ TOC
|
||||
+ fs.readFileSync(`text/${file}`)
|
||||
fs.writeFileSync(`mdbook/src/approved/${file}`, text)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user