111
This commit is contained in:
commit
d842848254
2278 files changed
+362039
No files matched your search
@@ -0,0 +1,48 @@
|
||||
import fs from 'node:fs'
|
||||
import path from 'node:path'
|
||||
import { fileURLToPath } from 'node:url'
|
||||
|
||||
const [, , sourceHtmlArg, outputPrefixArg] = process.argv
|
||||
if (!sourceHtmlArg || !outputPrefixArg) {
|
||||
throw new Error(
|
||||
'Usage: node scripts/extract-page.mjs <source-html-path> <output-prefix>\n' +
|
||||
'Example: npm run extract:page -- ./snapshots/about.html about\n' +
|
||||
'Writes src/generated/<prefix>-page-body.html, <prefix>-assets.json, <prefix>-inline-scripts.txt'
|
||||
)
|
||||
}
|
||||
|
||||
const currentFile = fileURLToPath(import.meta.url)
|
||||
const rootDir = path.resolve(path.dirname(currentFile), '..')
|
||||
const sourceHtmlPath = path.resolve(rootDir, sourceHtmlArg)
|
||||
const outDir = path.resolve(rootDir, 'src', 'generated')
|
||||
|
||||
const html = fs.readFileSync(sourceHtmlPath, 'utf8')
|
||||
const bodyMatch = html.match(/<body[^>]*>([\s\S]*?)<\/body>/i)
|
||||
if (!bodyMatch) throw new Error(`Failed to extract <body> from ${sourceHtmlArg}`)
|
||||
|
||||
let bodyHtml = bodyMatch[1]
|
||||
bodyHtml = bodyHtml.replace(/<script\b[^>]*>[\s\S]*?<\/script>/gi, '')
|
||||
|
||||
const links = Array.from(html.matchAll(/<link[^>]+href="([^"]+)"[^>]*>/gi)).map((m) => m[1])
|
||||
const scripts = Array.from(html.matchAll(/<script[^>]+src="([^"]+)"[^>]*><\/script>/gi)).map(
|
||||
(m) => m[1]
|
||||
)
|
||||
const inlineScripts = Array.from(
|
||||
html.matchAll(/<script\b(?![^>]*\bsrc=)[^>]*>([\s\S]*?)<\/script>/gi)
|
||||
)
|
||||
.map((m) => m[1].trim())
|
||||
.filter(Boolean)
|
||||
|
||||
fs.writeFileSync(path.join(outDir, `${outputPrefixArg}-page-body.html`), bodyHtml, 'utf8')
|
||||
fs.writeFileSync(
|
||||
path.join(outDir, `${outputPrefixArg}-assets.json`),
|
||||
JSON.stringify({ scripts, links }, null, 2),
|
||||
'utf8'
|
||||
)
|
||||
fs.writeFileSync(
|
||||
path.join(outDir, `${outputPrefixArg}-inline-scripts.txt`),
|
||||
inlineScripts.join('\n/*__INLINE_SPLIT__*/\n'),
|
||||
'utf8'
|
||||
)
|
||||
|
||||
console.log(`Generated files for ${outputPrefixArg}`)
|
||||
Reference in new issue
Block a user