2026-03-10 21:07:19 +01:00
|
|
|
#!/usr/bin/env node
|
|
|
|
|
// Patches the extracted Obsidian asar for browser use:
|
|
|
|
|
// 1. Removes Content-Security-Policy meta tag
|
|
|
|
|
// 2. Injects shim-loader.js script (non-deferred, before all other scripts)
|
2026-03-12 22:32:39 +01:00
|
|
|
// 3. Injects favicon link
|
2026-03-10 21:07:19 +01:00
|
|
|
|
|
|
|
|
const fs = require("fs");
|
|
|
|
|
const path = require("path");
|
|
|
|
|
|
|
|
|
|
const asarDir = process.argv[2];
|
|
|
|
|
if (!asarDir) {
|
|
|
|
|
console.error("Usage: node patch-obsidian.js <extracted-asar-dir>");
|
|
|
|
|
process.exit(1);
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-10 22:31:01 +01:00
|
|
|
function patchHtml(filePath) {
|
|
|
|
|
if (!fs.existsSync(filePath)) {
|
|
|
|
|
console.warn(`[patch] Skipping (not found): ${filePath}`);
|
|
|
|
|
return;
|
|
|
|
|
}
|
2026-03-10 21:07:19 +01:00
|
|
|
|
2026-03-10 22:31:01 +01:00
|
|
|
let html = fs.readFileSync(filePath, "utf-8");
|
2026-03-10 21:07:19 +01:00
|
|
|
|
2026-03-10 22:31:01 +01:00
|
|
|
// Remove CSP meta tag
|
|
|
|
|
html = html.replace(
|
|
|
|
|
/\s*<meta\s+http-equiv="Content-Security-Policy"[^>]*>\s*/g,
|
|
|
|
|
"\n",
|
|
|
|
|
);
|
2026-03-10 21:07:19 +01:00
|
|
|
|
2026-03-12 22:32:39 +01:00
|
|
|
// Inject favicon into <head>
|
|
|
|
|
html = html.replace(
|
|
|
|
|
"</head>",
|
|
|
|
|
' <link rel="icon" type="image/png" href="favicon.png">\n</head>',
|
|
|
|
|
);
|
|
|
|
|
|
2026-03-10 22:31:01 +01:00
|
|
|
// Inject shim-loader before the first <script> tag
|
|
|
|
|
html = html.replace(
|
2026-03-10 21:07:19 +01:00
|
|
|
'<script type="text/javascript"',
|
2026-03-10 22:31:01 +01:00
|
|
|
'<script type="text/javascript" src="shim-loader.js"></script>\n' +
|
|
|
|
|
'<script type="text/javascript"',
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
fs.writeFileSync(filePath, html);
|
|
|
|
|
console.log(`[patch] Patched ${filePath}`);
|
|
|
|
|
}
|
2026-03-10 21:07:19 +01:00
|
|
|
|
2026-03-10 22:31:01 +01:00
|
|
|
patchHtml(path.join(asarDir, "index.html"));
|