mirror of
https://github.com/HeyPuter/puter.git
synced 2026-10-01 01:26:48 +00:00
168 lines
6.2 KiB
JavaScript
168 lines
6.2 KiB
JavaScript
/*
|
|
* Copyright (C) 2024 Puter Technologies Inc.
|
|
*
|
|
* This file is part of Puter.
|
|
*
|
|
* Puter is free software: you can redistribute it and/or modify
|
|
* it under the terms of the GNU Affero General Public License as published
|
|
* by the Free Software Foundation, either version 3 of the License, or
|
|
* (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU Affero General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Affero General Public License
|
|
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
*/
|
|
const {encode} = require('html-entities');
|
|
const path_ = require('path');
|
|
const fs_ = require('fs');
|
|
|
|
const generate_puter_page_html = ({
|
|
env,
|
|
|
|
manifest,
|
|
gui_path,
|
|
|
|
app_origin,
|
|
api_origin,
|
|
|
|
meta,
|
|
|
|
gui_params,
|
|
}) => {
|
|
const e = encode;
|
|
|
|
const {
|
|
title,
|
|
description,
|
|
short_description,
|
|
company,
|
|
canonical_url,
|
|
} = meta;
|
|
|
|
gui_params = {
|
|
...meta,
|
|
...gui_params,
|
|
app_origin,
|
|
api_origin,
|
|
gui_origin: app_origin,
|
|
};
|
|
|
|
const asset_dir = env === 'dev'
|
|
? '/src' : '/dist' ;
|
|
// const asset_dir = '/dist';
|
|
|
|
return `<!DOCTYPE html>
|
|
<html lang="en">
|
|
|
|
<head>
|
|
<title>${e(title)}</title>
|
|
<meta name="author" content="${e(company)}">
|
|
<meta name="description" content="${e((description).replace(/\n/g, " "))}">
|
|
<meta name="facebook-domain-verification" content="e29w3hjbnnnypf4kzk2cewcdaxym1y" />
|
|
<link rel="canonical" href="${e(canonical_url)}">
|
|
|
|
<!-- Meta meta tags -->
|
|
<meta property="og:url" content="${app_origin}">
|
|
<meta property="og:type" content="website">
|
|
<meta property="og:title" content="${e(title)}">
|
|
<meta property="og:description" content="${e((short_description).replace(/\n/g, " "))}">
|
|
<meta property="og:image" content="${asset_dir}/images/screenshot.png">
|
|
|
|
<!-- Twitter meta tags -->
|
|
<meta name="twitter:card" content="summary_large_image">
|
|
<meta property="twitter:domain" content="puter.com">
|
|
<meta property="twitter:url" content="${app_origin}">
|
|
<meta name="twitter:title" content="${e(title)}">
|
|
<meta name="twitter:description" content="${e((short_description).replace(/\n/g, " "))}">
|
|
<meta name="twitter:image" content="${asset_dir}/images/screenshot.png">
|
|
|
|
<!-- favicons -->
|
|
<link rel="apple-touch-icon" sizes="57x57" href="${asset_dir}/favicons/apple-icon-57x57.png">
|
|
<link rel="apple-touch-icon" sizes="60x60" href="${asset_dir}/favicons/apple-icon-60x60.png">
|
|
<link rel="apple-touch-icon" sizes="72x72" href="${asset_dir}/favicons/apple-icon-72x72.png">
|
|
<link rel="apple-touch-icon" sizes="76x76" href="${asset_dir}/favicons/apple-icon-76x76.png">
|
|
<link rel="apple-touch-icon" sizes="114x114" href="${asset_dir}/favicons/apple-icon-114x114.png">
|
|
<link rel="apple-touch-icon" sizes="120x120" href="${asset_dir}/favicons/apple-icon-120x120.png">
|
|
<link rel="apple-touch-icon" sizes="144x144" href="${asset_dir}/favicons/apple-icon-144x144.png">
|
|
<link rel="apple-touch-icon" sizes="152x152" href="${asset_dir}/favicons/apple-icon-152x152.png">
|
|
<link rel="apple-touch-icon" sizes="180x180" href="${asset_dir}/favicons/apple-icon-180x180.png">
|
|
<link rel="icon" type="image/png" sizes="192x192" href="${asset_dir}/favicons/android-icon-192x192.png">
|
|
<link rel="icon" type="image/png" sizes="32x32" href="${asset_dir}/favicons/favicon-32x32.png">
|
|
<link rel="icon" type="image/png" sizes="96x96" href="${asset_dir}/favicons/favicon-96x96.png">
|
|
<link rel="icon" type="image/png" sizes="16x16" href="${asset_dir}/favicons/favicon-16x16.png">
|
|
<link rel="manifest" href="${asset_dir}/manifest.json">
|
|
<meta name="msapplication-TileColor" content="#ffffff">
|
|
<meta name="msapplication-TileImage" content="${asset_dir}/favicons/ms-icon-144x144.png">
|
|
<meta name="theme-color" content="#ffffff">
|
|
|
|
<!-- Preload images when applicable -->
|
|
<link rel="preload" as="image" href="${asset_dir}/images/wallpaper.webp">
|
|
|
|
<!-- Files from JSON (may be empty) -->
|
|
${
|
|
((env == 'dev' && manifest?.css_paths)
|
|
? manifest.css_paths.map(path => `<link rel="stylesheet" href="${path}">\n`)
|
|
: []).join('')
|
|
}
|
|
<!-- END Files from JSON -->
|
|
</head>
|
|
|
|
<body>
|
|
<script>window.puter_gui_enabled = true;</script>
|
|
${
|
|
((env == 'dev' && manifest?.lib_paths)
|
|
? manifest.lib_paths.map(path => `<script type="text/javascript" src="${path}"></script>\n`)
|
|
: []).join('')
|
|
}
|
|
|
|
<script>
|
|
window.icons = {};
|
|
|
|
${(() => {
|
|
if ( !(env == 'dev' && manifest) ) return '';
|
|
const html = [];
|
|
fs_.readdirSync(path_.join(gui_path, 'src/icons')).forEach(file => {
|
|
// skip dotfiles
|
|
if(file.startsWith('.'))
|
|
return;
|
|
// load image
|
|
let buff = new Buffer.from(fs_.readFileSync(path_.join(gui_path, 'src/icons') + '/' + file));
|
|
// convert to base64
|
|
let base64data = buff.toString('base64');
|
|
// add to `window.icons`
|
|
if(file.endsWith('.png'))
|
|
html.push(`window.icons['${file}'] = "data:image/png;base64,${base64data}";\n`);
|
|
else if(file.endsWith('.svg'))
|
|
html.push(`window.icons['${file}'] = "data:image/svg+xml;base64,${base64data}";\n`);
|
|
})
|
|
return html.join('');
|
|
})()}
|
|
</script>
|
|
|
|
${
|
|
((env == 'dev' && manifest?.js_paths)
|
|
? manifest.js_paths.map(path => `<script type="module" src="${path}"></script>\n`)
|
|
: []).join('')
|
|
}
|
|
<!-- Load the GUI script -->
|
|
<script ${ env == 'dev' ? ' type="module"' : ''} src="${(env == 'dev' && manifest?.index) || '/dist/gui.js'}"></script>
|
|
<!-- Initialize GUI when document is loaded -->
|
|
<script>
|
|
window.addEventListener('load', function() {
|
|
gui(${JSON.stringify(gui_params)});
|
|
});
|
|
</script>
|
|
<div id="templates" style="display: none;"></div>
|
|
</body>
|
|
|
|
</html>`;
|
|
};
|
|
|
|
module.exports = {
|
|
generate_puter_page_html,
|
|
};
|