Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
032e551858 | ||
|
|
a3192ec559 | ||
|
|
826daabc72 | ||
|
|
53bb02063a | ||
|
|
10bb283a44 | ||
|
|
eda39d07ba | ||
|
|
845d7ecdcb | ||
|
|
027a7875d8 | ||
|
|
47a022161c | ||
|
|
31d9a8b706 | ||
|
|
d424a4c7c3 | ||
|
|
e44e8a6d18 | ||
|
|
3f0fff42d4 | ||
|
|
25ff248b92 | ||
|
|
ed934ea5d9 | ||
|
|
f7dd491553 | ||
|
|
4ba60b1c21 | ||
|
|
31217aa641 | ||
|
|
82ad8a9134 | ||
|
|
6155a21a24 | ||
|
|
3c441f117a | ||
|
|
67c968e390 | ||
|
|
1544fd140f | ||
|
|
cab5a4cbcf | ||
|
|
d58261f8c2 | ||
|
|
2e8eefda7f | ||
|
|
2cae390404 | ||
|
|
e285ccf5d5 | ||
|
|
74611fa707 | ||
|
|
11c990f1e4 | ||
|
|
b8e3840d7a | ||
|
|
6d497a238d | ||
|
|
6b32473727 | ||
|
|
8dcbbab181 | ||
|
|
0e029a9ab6 | ||
|
|
c838fba60c | ||
|
|
6fd8441419 | ||
|
|
67b6643c69 | ||
|
|
d4f8712d11 | ||
|
|
22d89d4bb3 | ||
|
|
3eee3913c0 | ||
|
|
001f5d471a | ||
|
|
fc2668008d | ||
|
|
a5bcf0c054 | ||
|
|
0c2c45d633 | ||
|
|
0fdb5f3787 | ||
|
|
f78e521d8f | ||
|
|
b15bc7b15a | ||
|
|
37e26bd7ec | ||
|
|
ace12bc24e | ||
|
|
e1ef71971c | ||
|
|
4df8d59202 | ||
|
|
a0ce3998db | ||
|
|
8e93c814e8 | ||
|
|
c1c2a71277 | ||
|
|
7941dade8c | ||
|
|
810ff3ce36 | ||
|
|
30da06e1fe | ||
|
|
e8af6e713c | ||
|
|
10b1c4087f | ||
|
|
256eb02dee | ||
|
|
cd48fc3112 | ||
|
|
b4556376d0 | ||
|
|
9d37e9e677 | ||
|
|
9f03b70611 | ||
|
|
8b2cbb1f0e | ||
|
|
734918433a | ||
|
|
0dd7dad766 | ||
|
|
94e69f97c5 | ||
|
|
756f7625a3 | ||
|
|
62044e48d3 | ||
|
|
ec4d7831b2 | ||
|
|
6e0347e424 | ||
|
|
d84beef9c1 | ||
|
|
d458a866e6 | ||
|
|
51325fe8ec | ||
|
|
10b8dec786 | ||
|
|
af2b44d3a4 | ||
|
|
36341648ba | ||
|
|
b8d331ca23 | ||
|
|
12ad71707a | ||
|
|
3b93d63d20 | ||
|
|
e54476c931 | ||
|
|
7aa02e0ef5 | ||
|
|
18701a3c56 | ||
|
|
464f3aef39 | ||
|
|
42c912e1a3 | ||
|
|
a4bf722bdc | ||
|
|
ce0dcb0f46 | ||
|
|
dfe69ff4ea | ||
|
|
eb18f54220 | ||
|
|
fee1b668c9 | ||
|
|
fd9244ede4 | ||
|
|
7c09baa243 | ||
|
|
c61c508ce8 | ||
|
|
f3785042f2 | ||
|
|
2a4aedce5e | ||
|
|
0ba992352a | ||
|
|
e79ab36292 | ||
|
|
20997473a4 | ||
|
|
c601559059 | ||
|
|
cae8acda27 | ||
|
|
2dcdfc745a | ||
|
|
18db97629f | ||
|
|
f5251c89f9 | ||
|
|
ab2dc22213 | ||
|
|
cfe7535c32 | ||
|
|
f8d2e3ea08 | ||
|
|
6a367bebec | ||
|
|
219236f167 | ||
|
|
2feb3e88cc | ||
|
|
a1a02500e4 | ||
|
|
5d9f57fec4 | ||
|
|
30a8041fa8 | ||
|
|
ff1cf74a00 | ||
|
|
5ad44a8056 | ||
|
|
b5ea457491 | ||
|
|
eaf8d2e0bb | ||
|
|
616663ffe0 | ||
|
|
1cd182b3a9 | ||
|
|
ccd4f4d051 |
No files matched your search
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 7.3 KiB |
|
After Width: | Height: | Size: 11 KiB |
|
After Width: | Height: | Size: 44 KiB |
|
After Width: | Height: | Size: 4.7 KiB |
|
After Width: | Height: | Size: 64 KiB |
|
After Width: | Height: | Size: 86 KiB |
|
After Width: | Height: | Size: 662 B |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 3.4 KiB |
|
After Width: | Height: | Size: 15 KiB |
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="1000" height="1000"><metadata><rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/"><rdf:Description><dc:creator>RealFaviconGenerator</dc:creator><dc:source>https://realfavicongenerator.net</dc:source></rdf:Description></rdf:RDF></metadata><g clip-path="url(#SvgjsClipPath1046)"><rect width="1000" height="1000" fill="#ffffff"></rect><g transform="matrix(3.3333333333333335,0,0,3.3333333333333335,0,0)"><svg xmlns="http://www.w3.org/2000/svg" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" width="300" height="300" viewBox="0 0 300 300"><image width="300" height="300" xlink:href="data:image/png;base64,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 truncated
|
||||||
|
After Width: | Height: | Size: 11 KiB |
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
"name": "Hyperling.com",
|
||||||
|
"short_name": "Hyperling",
|
||||||
|
"icons": [
|
||||||
|
{
|
||||||
|
"src": "/web-app-manifest-192x192.png?v=20261102",
|
||||||
|
"sizes": "192x192",
|
||||||
|
"type": "image/png",
|
||||||
|
"purpose": "maskable"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"src": "/web-app-manifest-512x512.png?v=20261102",
|
||||||
|
"sizes": "512x512",
|
||||||
|
"type": "image/png",
|
||||||
|
"purpose": "maskable"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"theme_color": "#ffffff",
|
||||||
|
"background_color": "#ffffff",
|
||||||
|
"display": "standalone"
|
||||||
|
}
|
||||||
|
After Width: | Height: | Size: 6.1 KiB |
|
After Width: | Height: | Size: 39 KiB |
@@ -25,7 +25,9 @@ function kill-project {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function reload-project {
|
function reload-project {
|
||||||
# Nothing to do, run.sh and main.js automatically uses the latest files.
|
# Not much to do, run.sh and main.js automatically uses the latest files.
|
||||||
|
rm -v files/photos/index.html
|
||||||
|
# TBD/TODO: Call check_photos.sh once it has been pulled from run.sh.
|
||||||
log "Project reloaded successfully!"
|
log "Project reloaded successfully!"
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
# 2025-10-15 Hyperling
|
||||||
|
# Create script which does the photo checking so that it can be called by
|
||||||
|
# scripts other than just run.sh, such as if it needs used in check_git.sh.
|
||||||
|
|
||||||
|
## Setup ##
|
||||||
|
|
||||||
|
DIR="$(dirname -- "${BASH_SOURCE[0]}")"
|
||||||
|
PROG="$(basename -- "${BASH_SOURCE[0]}")"
|
||||||
|
cd $DIR
|
||||||
|
DIR="`pwd`"
|
||||||
|
NAME="'$PROG'"
|
||||||
|
|
||||||
|
function log {
|
||||||
|
echo -e "`date` : $NAME - $1"
|
||||||
|
}
|
||||||
|
|
||||||
|
## Parameters ##
|
||||||
|
|
||||||
|
ports="$1"
|
||||||
|
|
||||||
|
## Main ##
|
||||||
|
|
||||||
|
count=1
|
||||||
|
http_code=0
|
||||||
|
port="${ports%% *}"
|
||||||
|
photos_uri=":$port/photos/"
|
||||||
|
beg_time="$SECONDS"
|
||||||
|
while [[ $http_code != "200" ]]; do
|
||||||
|
log "Sleeping for '$count' while waiting for $photos_uri to come up."
|
||||||
|
sleep $count
|
||||||
|
log "Checking if $photos_uri is available."
|
||||||
|
http_code="`curl --silent --fail -w '\n%{http_code}' localhost$photos_uri | tail -n 1`"
|
||||||
|
log "Check for $photos_uri responded with '$http_code'."
|
||||||
|
if (( $count >= 10 )); then
|
||||||
|
log "Giving up on loading $photos_uri after '$count' attempts."
|
||||||
|
break
|
||||||
|
else
|
||||||
|
count=$(( count + 1 ))
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
end_time="$SECONDS"
|
||||||
|
time="$(( $end_time - $beg_time ))"
|
||||||
|
log "Finished checking for /photos/ after '$time' seconds."
|
||||||
|
|
||||||
|
exit 0
|
||||||
@@ -14,6 +14,8 @@ const execSync = require('child_process').execSync;
|
|||||||
|
|
||||||
const fs = require('fs');
|
const fs = require('fs');
|
||||||
|
|
||||||
|
const { minify } = require('html-minifier-terser');
|
||||||
|
|
||||||
//// Global Variables ////
|
//// Global Variables ////
|
||||||
|
|
||||||
const DEBUG = false;
|
const DEBUG = false;
|
||||||
@@ -24,12 +26,16 @@ let pages = [];
|
|||||||
const pages_dir = "./pages/";
|
const pages_dir = "./pages/";
|
||||||
const file_types = ["php", "sh"];
|
const file_types = ["php", "sh"];
|
||||||
|
|
||||||
|
let assets = [];
|
||||||
|
const asset_dir = "./assets/";
|
||||||
|
const asset_types = ['png', 'svg', 'ico', 'webmanifest', 'jpg'];
|
||||||
|
|
||||||
let ports = [];
|
let ports = [];
|
||||||
// Check parameters for numeric port numbers.
|
// Check parameters for numeric port numbers.
|
||||||
process.argv.forEach(function (val, index, array) {
|
process.argv.forEach(function (val, index, array) {
|
||||||
console.log("Parameter", index + ':', val, !isNaN(val));
|
console.log(now() + ": Parameter", index + ':', val, !isNaN(val));
|
||||||
if (!isNaN(val)) {
|
if (!isNaN(val)) {
|
||||||
console.log("Adding Port", val)
|
console.log(now() + ": Adding Port", val)
|
||||||
ports.push(val);
|
ports.push(val);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -44,25 +50,76 @@ const stringsToRemove = [
|
|||||||
|
|
||||||
//// Functions ////
|
//// Functions ////
|
||||||
|
|
||||||
|
// Compact HTML and remove unnecessary content like comments and whitespace.
|
||||||
|
// May help with performance for slower connections. Also more professional.
|
||||||
|
async function mini(html) {
|
||||||
|
//console.log(`html=${html}`);
|
||||||
|
const minified = await minify(html, {
|
||||||
|
collapseWhitespace: true,
|
||||||
|
removeComments: true,
|
||||||
|
minifyJS: true,
|
||||||
|
minifyCSS: true
|
||||||
|
});
|
||||||
|
//console.log(`minified=${minified}`);
|
||||||
|
return minified.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Check extension and guess a MIME type.
|
||||||
|
function getMIME(extension) {
|
||||||
|
let mime;
|
||||||
|
switch (extension) {
|
||||||
|
case "apk":
|
||||||
|
mime = "application/vnd.android.package-archive";
|
||||||
|
break;
|
||||||
|
case "jpg":
|
||||||
|
case "jpeg":
|
||||||
|
mime = "image/jpeg";
|
||||||
|
break;
|
||||||
|
case "png":
|
||||||
|
mime = "image/png";
|
||||||
|
break;
|
||||||
|
case "html":
|
||||||
|
mime = "text/html";
|
||||||
|
break;
|
||||||
|
case "zip":
|
||||||
|
mime = "application/zip";
|
||||||
|
break;
|
||||||
|
case "md":
|
||||||
|
case "txt":
|
||||||
|
case "csv":
|
||||||
|
mime = "text/*";
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
mime = "application/" + extension;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return mime;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Print datetime for logging.
|
||||||
|
function now() {
|
||||||
|
return new Date().toISOString();
|
||||||
|
}
|
||||||
|
|
||||||
/* Code exists inside a main function so that we may use async/await.
|
/* Code exists inside a main function so that we may use async/await.
|
||||||
*/
|
*/
|
||||||
async function main() {
|
async function main() {
|
||||||
console.log("...Starting Main...");
|
console.log(now() + ": ...Starting Main...");
|
||||||
|
|
||||||
// Getting dates in Node.js is awful, just use Linux.
|
// Getting dates in Node.js is awful, just use Linux.
|
||||||
const start_datetime = "" + await execSync('date "+%Y-%m-%dT%H:%M:%S%:z"');
|
const start_datetime = "" + await execSync('date "+%Y-%m-%dT%H:%M:%S%:z"');
|
||||||
const start_datetime_trimmed = start_datetime.trim();
|
const start_datetime_trimmed = start_datetime.trim();
|
||||||
|
|
||||||
console.log("Set app to return HTML documents.");
|
console.log(now() + ": Set app to return HTML documents.");
|
||||||
app.use(function (req, res, next) {
|
app.use(function (req, res, next) {
|
||||||
res.contentType('text/html');
|
res.contentType('text/html');
|
||||||
next();
|
next();
|
||||||
});
|
});
|
||||||
|
|
||||||
/* Loop through all file in the pages subdirectory and add the allowed
|
/* Loop through all files in the pages subdirectory and add the allowed
|
||||||
// file types into the pages array for automatic router creation.
|
// file types into the pages array for automatic router creation.
|
||||||
*/
|
*/
|
||||||
console.log("...Starting Main...");
|
console.log(now() + ": ...Starting Pages...");
|
||||||
let ls = await fs.promises.readdir(pages_dir);
|
let ls = await fs.promises.readdir(pages_dir);
|
||||||
if (DEBUG) console.log("DEBUG: Results of ls, ", ls);
|
if (DEBUG) console.log("DEBUG: Results of ls, ", ls);
|
||||||
for (let file of ls) {
|
for (let file of ls) {
|
||||||
@@ -72,14 +129,35 @@ async function main() {
|
|||||||
if (file_types.includes(file_type)) {
|
if (file_types.includes(file_type)) {
|
||||||
if (DEBUG) console.log("DEBUG: Hooray!", file, "is being added.");
|
if (DEBUG) console.log("DEBUG: Hooray!", file, "is being added.");
|
||||||
pages[file_name] = pages_dir + file;
|
pages[file_name] = pages_dir + file;
|
||||||
console.log(" * Added page", file);
|
console.log(now() + ": * Added page", file);
|
||||||
} else {
|
} else {
|
||||||
if (DEBUG) console.log("DEBUG: ", file, "is not an approved type, skipping.");
|
if (DEBUG) console.log("DEBUG: ", file, "is not an approved type, skipping.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
console.log(" * Pages loaded: ", pages);
|
console.log(now() + ": * Pages loaded: ", pages);
|
||||||
//return; // Stop execution FORTESTING
|
//return; // Stop execution FORTESTING
|
||||||
|
|
||||||
|
/* Loop through the assets folder and grab favicons, manifests, etc. and
|
||||||
|
// allow them to be accessed via the root of the website, such as a favicon
|
||||||
|
// at 'https://hyperling.com/favicon.ico'. May help with SEO!
|
||||||
|
*/
|
||||||
|
console.log(now() + ": ...Starting Assets...");
|
||||||
|
let ls_assets = await fs.promises.readdir(asset_dir);
|
||||||
|
if (DEBUG) console.log("DEBUG: Results of ls_assets, ", ls_assets);
|
||||||
|
for (let file of ls_assets) {
|
||||||
|
let file_test = file.split(".");
|
||||||
|
//let file_name = file_test[0]; // not needed (yet)
|
||||||
|
let file_type = file_test[file_test.length - 1];
|
||||||
|
if (asset_types.includes(file_type)) {
|
||||||
|
if (DEBUG) console.log("DEBUG: Hooray!", file, "is being added.");
|
||||||
|
assets[file] = asset_dir + file;
|
||||||
|
console.log(now() + ": * Added asset", file);
|
||||||
|
} else {
|
||||||
|
if (DEBUG) console.log("DEBUG: ", file, "is not an approved type, skipping.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
console.log(now() + ": * Assets loaded: ", assets);
|
||||||
|
|
||||||
/* Create both an XML and HTML sitemap based on these entries. XML is used for
|
/* Create both an XML and HTML sitemap based on these entries. XML is used for
|
||||||
// bots like SEO scrapers. HTML will be for human users looking for a list of
|
// bots like SEO scrapers. HTML will be for human users looking for a list of
|
||||||
// all pages. Some are not in the menu. Generated an example XML sitemap at
|
// all pages. Some are not in the menu. Generated an example XML sitemap at
|
||||||
@@ -134,8 +212,13 @@ async function main() {
|
|||||||
<strong>Web Pages (Alphabetical)</strong>
|
<strong>Web Pages (Alphabetical)</strong>
|
||||||
<ul>
|
<ul>
|
||||||
`;
|
`;
|
||||||
|
let robots_txt = `
|
||||||
|
User-agent: *
|
||||||
|
Allow: /
|
||||||
|
Sitemap: https://hyperling.com/sitemap.xml
|
||||||
|
`;
|
||||||
|
|
||||||
console.log("...Adding Routes...");
|
console.log(now() + ": ...Adding Routes...");
|
||||||
let router = express.Router();
|
let router = express.Router();
|
||||||
|
|
||||||
/* AUTOMATIC METHOD BASED ON OBJECT/ARRAY OF WEB SCRIPTS
|
/* AUTOMATIC METHOD BASED ON OBJECT/ARRAY OF WEB SCRIPTS
|
||||||
@@ -143,19 +226,20 @@ async function main() {
|
|||||||
*/
|
*/
|
||||||
// TBD/TODO would be great to log this as "DATE: ADDRESS hit ROUTER requesting RESOURCE"
|
// TBD/TODO would be great to log this as "DATE: ADDRESS hit ROUTER requesting RESOURCE"
|
||||||
for (let key in pages) {
|
for (let key in pages) {
|
||||||
console.log(" * Creating router for", key);
|
console.log(now() + ": * Creating router for", key);
|
||||||
router.get("/" + key, function (req,res) {
|
router.get("/" + key, async function (req,res) {
|
||||||
console.log(key, "fulfilling request to", req.socket.remoteAddress, "asking for", req.url);
|
console.log(now() + ":", key, "fulfilling request to", req.socket.remoteAddress, "asking for", req.url);
|
||||||
let html = "" + execSync(pages[key]);
|
let html = "" + execSync(pages[key]);
|
||||||
stringsToRemove.forEach(string => {
|
stringsToRemove.forEach(string => {
|
||||||
html = html.replace(string, "");
|
html = html.replace(string, "");
|
||||||
});
|
});
|
||||||
|
html = await mini(html);
|
||||||
res.send(html);
|
res.send(html);
|
||||||
});
|
});
|
||||||
|
|
||||||
/* Append the page to the sitemap variables.
|
/* Append the page to the sitemap variables.
|
||||||
*/
|
*/
|
||||||
console.log(" * * Adding to sitemap.xml");
|
console.log(now() + ": * * Adding to sitemap.xml");
|
||||||
sitemap_xml = sitemap_xml + `
|
sitemap_xml = sitemap_xml + `
|
||||||
<url>
|
<url>
|
||||||
<loc>https://hyperling.com/`+key+`/</loc>
|
<loc>https://hyperling.com/`+key+`/</loc>
|
||||||
@@ -163,7 +247,7 @@ async function main() {
|
|||||||
<priority>0.80</priority>
|
<priority>0.80</priority>
|
||||||
</url>
|
</url>
|
||||||
`;
|
`;
|
||||||
console.log(" * * Adding to sitemap.html");
|
console.log(now() + ": * * Adding to sitemap.html");
|
||||||
sitemap_html = sitemap_html + `
|
sitemap_html = sitemap_html + `
|
||||||
<li>
|
<li>
|
||||||
<b>`+key+`</b>
|
<b>`+key+`</b>
|
||||||
@@ -182,62 +266,66 @@ async function main() {
|
|||||||
</ul></body></html>
|
</ul></body></html>
|
||||||
`;
|
`;
|
||||||
|
|
||||||
|
console.log(now() + ": * Creating routers for assets");
|
||||||
|
for (let key in assets) {
|
||||||
|
console.log(now() + ": * * Adding /" + key);
|
||||||
|
router.get('/' + key, function (req, res) {
|
||||||
|
console.log(now() + ": asset response to", req.socket.remoteAddress, "asking for", req.url)
|
||||||
|
|
||||||
|
// Build variables.
|
||||||
|
const file = "./assets/" + req.path;
|
||||||
|
const extensions = req.path.split(".");
|
||||||
|
const extension = extensions[extensions.length-1];
|
||||||
|
let mime = getMIME(extension);
|
||||||
|
|
||||||
|
// Return the file
|
||||||
|
res.contentType(mime);
|
||||||
|
let f = fs.createReadStream(file)
|
||||||
|
.on("error", function(e) {
|
||||||
|
res.contentType("text/plain");
|
||||||
|
res.send(404, "Asset Not Found");
|
||||||
|
})
|
||||||
|
.pipe(res)
|
||||||
|
;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// Provide sitemap.xml file for "SEO".
|
// Provide sitemap.xml file for "SEO".
|
||||||
// TBD/TODO would be great to log this as "DATE: ADDRESS hit ROUTER requesting RESOURCE"
|
// TBD/TODO would be great to log this as "DATE: ADDRESS hit ROUTER requesting RESOURCE"
|
||||||
console.log(" * Creating router for sitemap.xml");
|
console.log(now() + ": * Creating router for sitemap.xml");
|
||||||
router.get('/sitemap.xml', function (req, res) {
|
router.get('/sitemap.xml', function (req, res) {
|
||||||
console.log("sitemap.xml being provided to", req.socket.remoteAddress)
|
console.log(now() + ": sitemap.xml being provided to", req.socket.remoteAddress)
|
||||||
res.contentType('text/xml');
|
res.contentType('text/xml');
|
||||||
res.send(sitemap_xml);
|
res.send(sitemap_xml);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Provide human-usable sitemap links.
|
// Provide human-usable sitemap links.
|
||||||
// TBD/TODO would be great to log this as "DATE: ADDRESS hit ROUTER requesting RESOURCE"
|
// TBD/TODO would be great to log this as "DATE: ADDRESS hit ROUTER requesting RESOURCE"
|
||||||
console.log(" * Creating router for sitemap*");
|
console.log(now() + ": * Creating router for sitemap*");
|
||||||
router.get('/sitemap*', function (req, res) {
|
router.get('/sitemap*', async function (req, res) {
|
||||||
console.log("sitemap.html being provided to", req.socket.remoteAddress)
|
console.log(now() + ": sitemap.html being provided to", req.socket.remoteAddress)
|
||||||
res.send(sitemap_html);
|
html = await mini(sitemap_html);
|
||||||
|
res.send(mini(html));
|
||||||
|
});
|
||||||
|
|
||||||
|
// Provide a robots.txt for where search engines should find things.
|
||||||
|
console.log(now() + ": * Creating router for robots.txt");
|
||||||
|
router.get('/robots.txt', function (req, res) {
|
||||||
|
console.log(now() + ": robots.txt being provided to", req.socket.remoteAddress)
|
||||||
|
res.send(robots_txt);
|
||||||
});
|
});
|
||||||
|
|
||||||
// Return a resource from the files folder.
|
// Return a resource from the files folder.
|
||||||
// TBD/TODO would be great to log this as "DATE: ADDRESS hit ROUTER requesting RESOURCE"
|
// TBD/TODO would be great to log this as "DATE: ADDRESS hit ROUTER requesting RESOURCE"
|
||||||
console.log(" * Creating router for files");
|
console.log(now() + ": * Creating router for files");
|
||||||
router.get('/files*', function (req, res) {
|
router.get('/files*', function (req, res) {
|
||||||
console.log("file response to", req.socket.remoteAddress, "asking for", req.url)
|
console.log(now() + ": file response to", req.socket.remoteAddress, "asking for", req.url)
|
||||||
|
|
||||||
// Build variables.
|
// Build variables.
|
||||||
const file = "." + req.path;
|
const file = "." + req.path;
|
||||||
const extensions = req.path.split(".");
|
const extensions = req.path.split(".");
|
||||||
const extension = extensions[extensions.length-1];
|
const extension = extensions[extensions.length-1];
|
||||||
|
let mime = getMIME(extension);
|
||||||
// Check extension and guess a MIME type.
|
|
||||||
let mime;
|
|
||||||
switch (extension) {
|
|
||||||
case "apk":
|
|
||||||
mime = "application/vnd.android.package-archive";
|
|
||||||
break;
|
|
||||||
case "jpg":
|
|
||||||
case "jpeg":
|
|
||||||
mime = "image/jpeg";
|
|
||||||
break;
|
|
||||||
case "png":
|
|
||||||
mime = "image/png";
|
|
||||||
break;
|
|
||||||
case "html":
|
|
||||||
mime = "text/html";
|
|
||||||
break;
|
|
||||||
case "zip":
|
|
||||||
mime = "application/zip";
|
|
||||||
break;
|
|
||||||
case "md":
|
|
||||||
case "txt":
|
|
||||||
case "csv":
|
|
||||||
mime = "text/*";
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
mime = "application/" + extension;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return the file
|
// Return the file
|
||||||
res.contentType(mime);
|
res.contentType(mime);
|
||||||
@@ -251,27 +339,29 @@ async function main() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// Originally a test, now a catch-all redirection to Home!
|
// Originally a test, now a catch-all redirection to Home!
|
||||||
console.log(" * Creating router for redirection");
|
console.log(now() + ": * Creating router for redirection");
|
||||||
router.get('/*', function (req, res) {
|
router.get('/*', async function (req, res) {
|
||||||
// WARNING: These are huge so only look when you need to.
|
// WARNING: These are huge so only look when you need to.
|
||||||
//console.log(req);
|
//console.log(req);
|
||||||
//console.log(res);
|
//console.log(res);
|
||||||
console.log("*wildcard* replying to", req.socket.remoteAddress, "asking for", req.url)
|
console.log(now() + ": *wildcard* replying to", req.socket.remoteAddress, "asking for", req.url)
|
||||||
let html = "" + execSync("./pages/home.php");
|
let html = "" + execSync("./pages/home.php");
|
||||||
stringsToRemove.forEach(string => {
|
stringsToRemove.forEach(string => {
|
||||||
html = html.replace(string, "");
|
html = html.replace(string, "");
|
||||||
});
|
});
|
||||||
|
html = await mini(html);
|
||||||
res.send(html);
|
res.send(html);
|
||||||
});
|
});
|
||||||
|
|
||||||
app.use('', router);
|
app.use('', router);
|
||||||
|
|
||||||
console.log("...Adding Ports...");
|
console.log(now() + ": ...Adding Ports...");
|
||||||
ports.forEach(port => {
|
ports.forEach(port => {
|
||||||
app.listen(port);
|
app.listen(port);
|
||||||
console.log(" * Now listening on port " + port + ".");
|
console.log(now() + ": * Now listening on port " + port + ".");
|
||||||
|
console.log(now() + ": * URL: http://localhost:" + port);
|
||||||
});
|
});
|
||||||
console.log("Done! Now we wait...");
|
console.log(now() + ": Done! Now we wait...");
|
||||||
}
|
}
|
||||||
|
|
||||||
//// Program Execution ////
|
//// Program Execution ////
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
{
|
{
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"express": ">=4.18.1 < 5.0.0"
|
"express": ">=4.18.1 < 5.0.0",
|
||||||
|
"html-minifier-terser": "^7.2.0"
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"start": "./run.sh"
|
"start": "./run.sh"
|
||||||
|
|||||||
@@ -55,8 +55,8 @@
|
|||||||
</div>
|
</div>
|
||||||
<?php
|
<?php
|
||||||
include "subpages/about/notice.php";
|
include "subpages/about/notice.php";
|
||||||
include "subpages/about/health.php";
|
|
||||||
include "subpages/about/stance.php";
|
include "subpages/about/stance.php";
|
||||||
|
include "subpages/about/health.php";
|
||||||
|
|
||||||
include "helpers/body_close.php";
|
include "helpers/body_close.php";
|
||||||
?>
|
?>
|
||||||
@@ -1,8 +1,6 @@
|
|||||||
#!/usr/bin/php
|
#!/usr/bin/php
|
||||||
<!--
|
|
||||||
Synonym for home page.
|
|
||||||
-->
|
|
||||||
<?php
|
<?php
|
||||||
|
/* Synonym for home page. */
|
||||||
if (!isset($GLOBALS["HEADER_TITLE"])) {
|
if (!isset($GLOBALS["HEADER_TITLE"])) {
|
||||||
$GLOBALS["HEADER_TITLE"] = "Apps";
|
$GLOBALS["HEADER_TITLE"] = "Apps";
|
||||||
}
|
}
|
||||||
@@ -40,7 +38,7 @@
|
|||||||
convenient group:
|
convenient group:
|
||||||
</p>
|
</p>
|
||||||
<ul class="indent"><li>
|
<ul class="indent"><li>
|
||||||
<a href="https://git.hyperling.com/me/env-obtainium-hyperling/src/branch/main/obtainium-export.json"
|
<a href="https://git.hyperling.com/me/env-obtainium-hyperling/raw/branch/prod/obtainium-export.json"
|
||||||
target="_blank" rel="noopener noreferrer"
|
target="_blank" rel="noopener noreferrer"
|
||||||
>
|
>
|
||||||
[obtainium-export.json] | Hyperling's Apps
|
[obtainium-export.json] | Hyperling's Apps
|
||||||
@@ -91,17 +89,73 @@
|
|||||||
-->
|
-->
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="row" id="fdroid">
|
||||||
|
<h4 class="col-12 header">F-Droid Repository</h4>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row text">
|
||||||
|
<div class="col-12 text">
|
||||||
|
<strong>F-Droid App Store</strong>
|
||||||
|
<p>
|
||||||
|
If you prefer F-Droid over Obtainium, that's an option too!
|
||||||
|
Just visit the link below, click the link in the center,
|
||||||
|
and choose 'Add repository' when F-Droid opens.
|
||||||
|
</p>
|
||||||
|
<ul class="indent">
|
||||||
|
<li>
|
||||||
|
<a href="https://fdroid.hyperling.com"
|
||||||
|
target="_blank" rel="noopener noreferrer"
|
||||||
|
>[fdroid.Hyperling.com]</a>
|
||||||
|
or
|
||||||
|
<a href="https://fdroid.link/#https://fdroid.hyperling.com/fdroid/repo">
|
||||||
|
[open with F-Droid]</a>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
<p>
|
||||||
|
It should recognize if any apps are already installed,
|
||||||
|
and depending on your settings will notify of changes
|
||||||
|
or auto-update for you.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="row" id="android">
|
<div class="row" id="android">
|
||||||
<h3 class="col-12 header">Android Apps</h3>
|
<h3 class="col-12 header">Android Apps</h3>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row center text">
|
<div class="row center text">
|
||||||
|
|
||||||
<div class="col-12 text border" id="expense">
|
<div class="col-4 text border" id="sunset">
|
||||||
<a href="https://git.hyperling.com/me/flutter-expense-tracker/releases">
|
<a href="https://git.hyperling.com/me/flutter-sunset-alarm/releases"
|
||||||
|
target="_blank" rel="noopener noreferrer">
|
||||||
|
<figure>
|
||||||
|
<img class="app-icon" loading="lazy" alt="<<sunset.png>>"
|
||||||
|
src="https://git.hyperling.com/me/flutter-sunset-alarm/raw/branch/main/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png"
|
||||||
|
>
|
||||||
|
<figcaption>
|
||||||
|
Sunset Timer
|
||||||
|
</figcaption>
|
||||||
|
</figure>
|
||||||
|
</a>
|
||||||
|
<p>
|
||||||
|
Set an alarm to go off X minutes before sunset. (Linux & Android)
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
[<a href="https://git.hyperling.com/me/flutter-sunset-alarm/releases/download/latest/sunset_alarm-arm64-v8a-release.apk/"
|
||||||
|
target="_blank" rel="noopener noreferrer">APK</a>]
|
||||||
|
[<a href="https://git.hyperling.com/me/flutter-sunset-alarm/"
|
||||||
|
target="_blank" rel="noopener noreferrer">Source Code</a>]
|
||||||
|
[<a href="https://git.hyperling.com/me/flutter-sunset-alarm/releases"
|
||||||
|
target="_blank" rel="noopener noreferrer">Obtainium URL</a>]
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-4 text border" id="expense">
|
||||||
|
<a href="https://git.hyperling.com/me/flutter-expense-tracker/releases"
|
||||||
|
target="_blank" rel="noopener noreferrer">
|
||||||
<figure>
|
<figure>
|
||||||
<img class="app-icon" loading="lazy" alt="<<expense.png>>"
|
<img class="app-icon" loading="lazy" alt="<<expense.png>>"
|
||||||
src="/files/media/icons/expense.png"
|
src="https://git.hyperling.com/me/flutter-expense-tracker/raw/branch/main/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png"
|
||||||
>
|
>
|
||||||
<figcaption>
|
<figcaption>
|
||||||
Recurring Expense Tracker
|
Recurring Expense Tracker
|
||||||
@@ -111,78 +165,25 @@
|
|||||||
<p>
|
<p>
|
||||||
Keep track of repeating expenses and
|
Keep track of repeating expenses and
|
||||||
view projections of their effect on your finances.
|
view projections of their effect on your finances.
|
||||||
First app written with Flutter.
|
(Linux & Android)
|
||||||
</p>
|
</p>
|
||||||
<p>
|
<p>
|
||||||
<!--[<s><a>F-Droid</a></s>]-->
|
[<a href="https://git.hyperling.com/me/flutter-expense-tracker/releases/download/latest/ExpenseTracker.apk"
|
||||||
|
target="_blank" rel="noopener noreferrer">APK</a>]
|
||||||
[<a href="https://git.hyperling.com/me/flutter-expense-tracker/"
|
[<a href="https://git.hyperling.com/me/flutter-expense-tracker/"
|
||||||
target="_blank" rel="noopener noreferrer">Source Code</a>]
|
target="_blank" rel="noopener noreferrer">Source Code</a>]
|
||||||
[<a href="https://git.hyperling.com/me/flutter-expense-tracker/releases"
|
[<a href="https://git.hyperling.com/me/flutter-expense-tracker/releases"
|
||||||
target="_blank" rel="noopener noreferrer">APKs / Obtainium URL</a>]
|
target="_blank" rel="noopener noreferrer">Obtainium URL</a>]
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-12 text border" id="tictactoe">
|
<div class="col-4 text border" id="timer">
|
||||||
<a href="https://git.hyperling.com/me/android-tictactoe/releases">
|
|
||||||
<figure>
|
|
||||||
<img class="app-icon" loading="lazy" alt="<<tictactoe.png>>"
|
|
||||||
src="/files/media/icons/tictactoe.png"
|
|
||||||
>
|
|
||||||
<figcaption>
|
|
||||||
Tic-Tac-Toe
|
|
||||||
</figcaption>
|
|
||||||
</figure>
|
|
||||||
</a>
|
|
||||||
<p>
|
|
||||||
Play against a friend or a range of AIs.
|
|
||||||
Written to practice Kotlin/Compose.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
<!--[<s><a>F-Droid</a></s>]-->
|
|
||||||
[<a href="https://git.hyperling.com/me/android-tictactoe/"
|
|
||||||
target="_blank" rel="noopener noreferrer">Source Code</a>]
|
|
||||||
[<a href="https://git.hyperling.com/me/android-tictactoe/releases"
|
|
||||||
target="_blank" rel="noopener noreferrer">APKs / Obtainium URL</a>]
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-12 text border" id="ctfu">
|
|
||||||
<a href="https://git.hyperling.com/me/android-carb-up/releases"
|
|
||||||
target="_blank" rel="noopener noreferrer">
|
|
||||||
<figure>
|
|
||||||
<img class="app-icon" loading="lazy" alt="<<ctfu.png>>"
|
|
||||||
src="/files/media/icons/ctfu.png"
|
|
||||||
>
|
|
||||||
<figcaption>
|
|
||||||
Carb Up! BETA
|
|
||||||
</figcaption>
|
|
||||||
</figure>
|
|
||||||
</a>
|
|
||||||
<p>
|
|
||||||
Calculate cost-effective foods on a High Carb Low Fat lifestyle.
|
|
||||||
</p>
|
|
||||||
<p>
|
|
||||||
<!--[<a href="https://play.google.com/store/apps/details?id=com.hyperling.carbupbeta"
|
|
||||||
target="_blank" rel="noopener noreferrer">Play Store</a>]-->
|
|
||||||
[<a href="https://git.hyperling.com/me/android-carb-up/"
|
|
||||||
target="_blank" rel="noopener noreferrer">Source Code</a>]
|
|
||||||
[<a href="https://git.hyperling.com/me/android-carb-up/releases"
|
|
||||||
target="_blank" rel="noopener noreferrer">APKs / Obtainium URL</a>]
|
|
||||||
</p>
|
|
||||||
<!--<p>
|
|
||||||
<s>
|
|
||||||
[<a target="_blank" rel="noopener noreferrer">F-Droid</a>]
|
|
||||||
</s>
|
|
||||||
</p>-->
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="col-12 text border" id="timer">
|
|
||||||
<a href="https://git.hyperling.com/me/android-infinite-timer/releases"
|
<a href="https://git.hyperling.com/me/android-infinite-timer/releases"
|
||||||
target="_blank" rel="noopener noreferrer"
|
target="_blank" rel="noopener noreferrer"
|
||||||
>
|
>
|
||||||
<figure>
|
<figure>
|
||||||
<img class="app-icon" loading="lazy" alt="<<infinitetimer.png>>"
|
<img class="app-icon" loading="lazy" alt="<<infinitetimer.png>>"
|
||||||
src="/files/media/icons/infinitetimer.png"
|
src="https://git.hyperling.com/me/android-infinite-timer/raw/branch/main/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png"
|
||||||
>
|
>
|
||||||
<figcaption>
|
<figcaption>
|
||||||
Infinite Timer
|
Infinite Timer
|
||||||
@@ -195,24 +196,50 @@
|
|||||||
<p>
|
<p>
|
||||||
<!--[<a href="https://play.google.com/store/apps/details?id=com.hyperling.apps.infinitetimer"
|
<!--[<a href="https://play.google.com/store/apps/details?id=com.hyperling.apps.infinitetimer"
|
||||||
target="_blank" rel="noopener noreferrer">Play Store</a>]-->
|
target="_blank" rel="noopener noreferrer">Play Store</a>]-->
|
||||||
|
[<a href="https://git.hyperling.com/me/android-infinite-timer/releases/download/latest/InfiniteTimer.apk"
|
||||||
|
target="_blank" rel="noopener noreferrer">APK</a>]
|
||||||
[<a href="https://git.hyperling.com/me/android-infinite-timer/"
|
[<a href="https://git.hyperling.com/me/android-infinite-timer/"
|
||||||
target="_blank" rel="noopener noreferrer">Source Code</a>]
|
target="_blank" rel="noopener noreferrer">Source Code</a>]
|
||||||
[<a href="https://git.hyperling.com/me/android-infinite-timer/releases"
|
[<a href="https://git.hyperling.com/me/android-infinite-timer/releases"
|
||||||
target="_blank" rel="noopener noreferrer">APKs / Obtainium URL</a>]
|
target="_blank" rel="noopener noreferrer">Obtainium URL</a>]
|
||||||
</p>
|
</p>
|
||||||
<!--<p>
|
|
||||||
<s>
|
|
||||||
[<a target="_blank" rel="noopener noreferrer">F-Droid</a>]
|
|
||||||
</s>
|
|
||||||
</p>-->
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-12 text border" id="sleep">
|
</div>
|
||||||
|
|
||||||
|
<div class="row center text">
|
||||||
|
|
||||||
|
<div class="col-3 text border" id="ctfu">
|
||||||
|
<a href="https://git.hyperling.com/me/android-carb-up/releases"
|
||||||
|
target="_blank" rel="noopener noreferrer">
|
||||||
|
<figure>
|
||||||
|
<img class="app-icon" loading="lazy" alt="<<ctfu.png>>"
|
||||||
|
src="https://git.hyperling.com/me/android-carb-up/raw/branch/main/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png"
|
||||||
|
>
|
||||||
|
<figcaption>
|
||||||
|
Carb Up!
|
||||||
|
</figcaption>
|
||||||
|
</figure>
|
||||||
|
</a>
|
||||||
|
<p>
|
||||||
|
Calculate cost-effective foods on a High Carb Low Fat lifestyle.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
[<a href="https://git.hyperling.com/me/android-carb-up/releases/download/latest/CarbUp.apk"
|
||||||
|
target="_blank" rel="noopener noreferrer">APK</a>]
|
||||||
|
[<a href="https://git.hyperling.com/me/android-carb-up/"
|
||||||
|
target="_blank" rel="noopener noreferrer">Source Code</a>]
|
||||||
|
[<a href="https://git.hyperling.com/me/android-carb-up/releases"
|
||||||
|
target="_blank" rel="noopener noreferrer">Obtainium URL</a>]
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-3 text border" id="sleep">
|
||||||
<a href="https://git.hyperling.com/me/android-45-minute-rule/releases"
|
<a href="https://git.hyperling.com/me/android-45-minute-rule/releases"
|
||||||
target="_blank" rel="noopener noreferrer">
|
target="_blank" rel="noopener noreferrer">
|
||||||
<figure>
|
<figure>
|
||||||
<img class="app-icon" loading="lazy" alt="<<t45mr.png>>"
|
<img class="app-icon" loading="lazy" alt="<<t45mr.png>>"
|
||||||
src="/files/media/icons/t45mr.png"
|
src="https://git.hyperling.com/me/android-45-minute-rule/raw/branch/main/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png"
|
||||||
>
|
>
|
||||||
<figcaption>
|
<figcaption>
|
||||||
45 Minute Rule
|
45 Minute Rule
|
||||||
@@ -225,25 +252,48 @@
|
|||||||
<p>
|
<p>
|
||||||
<!--[<a href="https://play.google.com/store/apps/details?id=com.hyperling.apps.the45minuterule"
|
<!--[<a href="https://play.google.com/store/apps/details?id=com.hyperling.apps.the45minuterule"
|
||||||
target="_blank" rel="noopener noreferrer">Play Store</a>]-->
|
target="_blank" rel="noopener noreferrer">Play Store</a>]-->
|
||||||
|
[<a href="https://git.hyperling.com/me/android-45-minute-rule/releases/download/latest/The45MinuteRule.apk"
|
||||||
|
target="_blank" rel="noopener noreferrer">APK</a>]
|
||||||
[<a href="https://git.hyperling.com/me/android-45-minute-rule/"
|
[<a href="https://git.hyperling.com/me/android-45-minute-rule/"
|
||||||
target="_blank" rel="noopener noreferrer">Source Code</a>]
|
target="_blank" rel="noopener noreferrer">Source Code</a>]
|
||||||
[<a href="https://git.hyperling.com/me/android-45-minute-rule/releases"
|
[<a href="https://git.hyperling.com/me/android-45-minute-rule/releases"
|
||||||
target="_blank" rel="noopener noreferrer">APKs / Obtainium URL</a>]
|
target="_blank" rel="noopener noreferrer">Obtainium URL</a>]
|
||||||
</p>
|
</p>
|
||||||
<!--<p>
|
|
||||||
<s>
|
|
||||||
[<a target="_blank" rel="noopener noreferrer">F-Droid</a>]
|
|
||||||
</s>
|
|
||||||
</p>-->
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="col-12 text border" id="games">
|
<div class="col-3 text border" id="tictactoe">
|
||||||
|
<a href="https://git.hyperling.com/me/android-tictactoe/releases"
|
||||||
|
target="_blank" rel="noopener noreferrer">
|
||||||
|
<figure>
|
||||||
|
<img class="app-icon" loading="lazy" alt="<<tictactoe.png>>"
|
||||||
|
src="https://git.hyperling.com/me/android-tictactoe/raw/branch/main/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png"
|
||||||
|
>
|
||||||
|
<figcaption>
|
||||||
|
Tic-Tac-Toe
|
||||||
|
</figcaption>
|
||||||
|
</figure>
|
||||||
|
</a>
|
||||||
|
<p>
|
||||||
|
Play against a friend or a range of AIs.
|
||||||
|
Written to practice Kotlin/Compose.
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
[<a href="https://git.hyperling.com/me/android-tictactoe/releases/download/latest/TicTacToe.apk"
|
||||||
|
target="_blank" rel="noopener noreferrer">APK</a>]
|
||||||
|
[<a href="https://git.hyperling.com/me/android-tictactoe/"
|
||||||
|
target="_blank" rel="noopener noreferrer">Source Code</a>]
|
||||||
|
[<a href="https://git.hyperling.com/me/android-tictactoe/releases"
|
||||||
|
target="_blank" rel="noopener noreferrer">Obtainium URL</a>]
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-3 text border" id="games">
|
||||||
<a href="https://git.hyperling.com/me/android-hypergames/releases"
|
<a href="https://git.hyperling.com/me/android-hypergames/releases"
|
||||||
target="_blank" rel="noopener noreferrer"
|
target="_blank" rel="noopener noreferrer"
|
||||||
>
|
>
|
||||||
<figure>
|
<figure>
|
||||||
<img class="app-icon" loading="lazy" alt="<<hypergames.png>>"
|
<img class="app-icon" loading="lazy" alt="<<hypergames.png>>"
|
||||||
src="/files/media/icons/hypergames.png"
|
src="https://git.hyperling.com/me/android-hypergames/raw/branch/dev/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png"
|
||||||
>
|
>
|
||||||
<figcaption>
|
<figcaption>
|
||||||
HyperGames
|
HyperGames
|
||||||
@@ -257,19 +307,15 @@
|
|||||||
<p>
|
<p>
|
||||||
<!--[<a href="https://play.google.com/store/apps/details?id=apps.hyperling.com.platformer"
|
<!--[<a href="https://play.google.com/store/apps/details?id=apps.hyperling.com.platformer"
|
||||||
target="_blank" rel="noopener noreferrer">Play Store</a>]-->
|
target="_blank" rel="noopener noreferrer">Play Store</a>]-->
|
||||||
|
[<a href="https://git.hyperling.com/me/android-hypergames/releases/download/latest/HyperGames.apk"
|
||||||
|
target="_blank" rel="noopener noreferrer">APK</a>]
|
||||||
[<a href="https://git.hyperling.com/me/android-hypergames/"
|
[<a href="https://git.hyperling.com/me/android-hypergames/"
|
||||||
target="_blank" rel="noopener noreferrer">Source Code</a>]
|
target="_blank" rel="noopener noreferrer">Source Code</a>]
|
||||||
[<a href="https://git.hyperling.com/me/android-hypergames/releases"
|
[<a href="https://git.hyperling.com/me/android-hypergames/releases"
|
||||||
target="_blank" rel="noopener noreferrer">APKs / Obtainium URL</a>]
|
target="_blank" rel="noopener noreferrer">Obtainium URL</a>]
|
||||||
</p>
|
</p>
|
||||||
<!--
|
|
||||||
<p>
|
|
||||||
<s>
|
|
||||||
[<a target="_blank" rel="noopener noreferrer">F-Droid</a>]
|
|
||||||
</s>
|
|
||||||
</p>
|
|
||||||
-->
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row" id="other">
|
<div class="row" id="other">
|
||||||
@@ -281,7 +327,9 @@
|
|||||||
For a full list of software including my Ansible automation,
|
For a full list of software including my Ansible automation,
|
||||||
Docker setup, source code for this website, and other
|
Docker setup, source code for this website, and other
|
||||||
fun/random toys, check out
|
fun/random toys, check out
|
||||||
<a href="https://git.hyperling.com/me" target="_blank">My Projects</a>.
|
<a href="https://git.hyperling.com/me"
|
||||||
|
target="_blank" rel="noopener noreferrer"
|
||||||
|
>My Projects</a>.
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
#!/usr/bin/php
|
#!/usr/bin/php
|
||||||
<!--
|
|
||||||
Alias for where Books menu item should go.
|
|
||||||
-->
|
|
||||||
<?php
|
<?php
|
||||||
|
/* Alias for where Books menu item should go. */
|
||||||
if (!isset($GLOBALS["HEADER_TITLE"])) {
|
if (!isset($GLOBALS["HEADER_TITLE"])) {
|
||||||
$GLOBALS["HEADER_TITLE"] = "Books";
|
$GLOBALS["HEADER_TITLE"] = "Books";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,6 +47,12 @@
|
|||||||
<ul class="indent"><li>
|
<ul class="indent"><li>
|
||||||
<a href="mailto:me@hyperling.com">me@hyperling.com</a>
|
<a href="mailto:me@hyperling.com">me@hyperling.com</a>
|
||||||
</li></ul>
|
</li></ul>
|
||||||
|
<p>
|
||||||
|
Other methods such as a few messaging clients can be found here:
|
||||||
|
</p>
|
||||||
|
<ul class="indent"><li>
|
||||||
|
<a href="https://blog.hyperling.com/contact">blog.hyperling.com/contact</a>
|
||||||
|
</li></ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<?php
|
<?php
|
||||||
|
|||||||
@@ -1,10 +1,19 @@
|
|||||||
#!/usr/bin/php
|
#!/usr/bin/php
|
||||||
<!--
|
|
||||||
Alias for the support page with a more common name.
|
|
||||||
-->
|
|
||||||
<?php
|
<?php
|
||||||
|
/* Alias for the support page with a more common name. */
|
||||||
if (!isset($GLOBALS["HEADER_TITLE"])) {
|
if (!isset($GLOBALS["HEADER_TITLE"])) {
|
||||||
$GLOBALS["HEADER_TITLE"] = "Donate";
|
$GLOBALS["HEADER_TITLE"] = "Donate";
|
||||||
}
|
}
|
||||||
include "support.php";
|
include "helpers/body_open.php";
|
||||||
|
|
||||||
|
include "subpages/support/header.php";
|
||||||
|
|
||||||
|
include "subpages/support/donate.php";
|
||||||
|
|
||||||
|
include "subpages/support/support.php";
|
||||||
|
|
||||||
|
// 2025-01-04 Not really looking for this type of thing.
|
||||||
|
//include "subpages/support/gifts.php";
|
||||||
|
|
||||||
|
include "helpers/body_close.php";
|
||||||
?>
|
?>
|
||||||
@@ -1,8 +1,6 @@
|
|||||||
#!/usr/bin/php
|
#!/usr/bin/php
|
||||||
<!--
|
|
||||||
Page to provide links for Freedom eBook.
|
|
||||||
-->
|
|
||||||
<?php
|
<?php
|
||||||
|
/* Page to provide links for Freedom eBook. */
|
||||||
$GLOBALS["ADVISORY"] = false;
|
$GLOBALS["ADVISORY"] = false;
|
||||||
if (!isset($GLOBALS["HEADER_TITLE"])) {
|
if (!isset($GLOBALS["HEADER_TITLE"])) {
|
||||||
$GLOBALS["HEADER_TITLE"] = "Freedom";
|
$GLOBALS["HEADER_TITLE"] = "Freedom";
|
||||||
@@ -29,7 +27,7 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-12 text">
|
<div class="col-12 text">
|
||||||
<p>
|
<p>
|
||||||
Click the link below to download the 4-page PDF:
|
Use the links below to download the 4-page PDF:
|
||||||
</p>
|
</p>
|
||||||
<ul class="indent">
|
<ul class="indent">
|
||||||
<li>
|
<li>
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
#!/usr/bin/php
|
#!/usr/bin/php
|
||||||
<!--
|
|
||||||
Page to provide ways people can support me.
|
|
||||||
-->
|
|
||||||
<?php
|
<?php
|
||||||
|
/* Page to provide ways people can support me. */
|
||||||
//$GLOBALS["ADVISORY"] = false;
|
//$GLOBALS["ADVISORY"] = false;
|
||||||
if (!isset($GLOBALS["HEADER_TITLE"])) {
|
if (!isset($GLOBALS["HEADER_TITLE"])) {
|
||||||
$GLOBALS["HEADER_TITLE"] = "Health";
|
$GLOBALS["HEADER_TITLE"] = "Health";
|
||||||
@@ -30,7 +28,7 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-12 text">
|
<div class="col-12 text">
|
||||||
<p>
|
<p>
|
||||||
Click the link below to download the 10-page PDF:
|
Use the links below to download the 10-page PDF:
|
||||||
</p>
|
</p>
|
||||||
<ul class="indent">
|
<ul class="indent">
|
||||||
<li>
|
<li>
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
#!/usr/bin/php
|
#!/usr/bin/php
|
||||||
<?php
|
<?php
|
||||||
$show_advisory = true;
|
$show_advisory = false;
|
||||||
if ($show_advisory) echo '
|
if ($show_advisory) echo '
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<p><!-- Gap Area --></p>
|
<p><!-- Gap Area --></p>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row center title" id="advisory">
|
<div class="row center title" id="advisory">
|
||||||
<i><h2 class="col-12 title">Latest Announcement</h2></i>
|
<h2 class="col-12 title"><i class="purple">Latest Announcement</i></h2>
|
||||||
<a href="/freedom/">
|
<a href="/freedom/">
|
||||||
<div class="col-12 text">
|
<div class="col-12 text">
|
||||||
<u class="orange">2025-09-28</u>
|
<u class="orange">2025-09-28</u>
|
||||||
|
|||||||
@@ -29,8 +29,12 @@
|
|||||||
height: 237px; /* 69*3[banner stripes] + 15*2[padding top+bot] */
|
height: 237px; /* 69*3[banner stripes] + 15*2[padding top+bot] */
|
||||||
}
|
}
|
||||||
.banner-image01 {
|
.banner-image01 {
|
||||||
background-image: url("/files/media/icons/home.jpg");
|
background-image: url("/banner-image01.jpg");
|
||||||
}
|
}
|
||||||
.banner-image02 {
|
.banner-image02 {
|
||||||
background-image: url("/files/media/icons/contact.jpg");
|
background-image: url("/banner-image02.jpg");
|
||||||
|
}
|
||||||
|
|
||||||
|
.banner-anchor {
|
||||||
|
text-decoration: none;
|
||||||
}
|
}
|
||||||
@@ -5,28 +5,35 @@
|
|||||||
$GLOBALS["SHOW_BANNER_PICS"] = true;
|
$GLOBALS["SHOW_BANNER_PICS"] = true;
|
||||||
}
|
}
|
||||||
$show_pics = $GLOBALS["SHOW_BANNER_PICS"];
|
$show_pics = $GLOBALS["SHOW_BANNER_PICS"];
|
||||||
$banner_width = $show_pics ? 6 : 12;
|
$banner_width_desktop = $show_pics ? 6 : 12;
|
||||||
|
$banner_width_mobile = $show_pics ? 8 : 12;
|
||||||
?>
|
?>
|
||||||
<a href='/about/'>
|
<a class="banner-anchor" href='/'>
|
||||||
<div class="row">
|
<div class="row banner-desktop">
|
||||||
<?php if ($show_pics) echo '
|
<?php if ($show_pics) echo '
|
||||||
<div class="col-3 header center banner-image banner-image01">
|
<div class="col-3 header center banner-image banner-image01"></div>
|
||||||
<!-<img src="/files/media/icons/home.jpg"
|
|
||||||
alt="<<banner01.jpg>>"
|
|
||||||
>-->
|
|
||||||
</div>
|
|
||||||
';?>
|
';?>
|
||||||
<div class="col-<?php echo "$banner_width"; ?> header">
|
<div class="col-<?php echo "$banner_width_desktop"; ?> header">
|
||||||
<div class="banner-top">Peace</div>
|
<div class="banner-top">Peace</div>
|
||||||
<div class="banner-middle">Love</div>
|
<div class="banner-middle">Love</div>
|
||||||
<div class="banner-bottom">Happiness</div>
|
<div class="banner-bottom">Happiness</div>
|
||||||
</div>
|
</div>
|
||||||
<?php if ($show_pics) echo '
|
<?php if ($show_pics) echo '
|
||||||
<div class="col-3 header center banner-image banner-image02">
|
<div class="col-3 header center banner-image banner-image02"></div>
|
||||||
<!--<img src="/files/media/icons/contact.jpg"
|
';?>
|
||||||
alt="<<banner02.jpg>>"
|
|
||||||
>-->
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="row banner-mobile">
|
||||||
|
<?php if ($show_pics) echo '
|
||||||
|
<div class="col-2 header center banner-image banner-image01"></div>
|
||||||
|
';?>
|
||||||
|
<div class="col-<?php echo "$banner_width_mobile"; ?> header">
|
||||||
|
<div class="banner-top">Peace</div>
|
||||||
|
<div class="banner-middle">Love</div>
|
||||||
|
<div class="banner-bottom">Happiness</div>
|
||||||
|
</div>
|
||||||
|
<?php if ($show_pics) echo '
|
||||||
|
<div class="col-2 header center banner-image banner-image02"></div>
|
||||||
';?>
|
';?>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
|
||||||
|
<!-- Old, no longer needed
|
||||||
|
<link rel="icon" sizes="32x32" href="/favicon.ico">
|
||||||
|
<link rel="icon" sizes="192x192" href="/favicon.ico">
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- https://favicon.io, added the ?v=20261102 manually. -->
|
||||||
|
<link rel="icon" type="image/png" sizes="32x32" href="/favicon-32x32.png?v=20261102">
|
||||||
|
<link rel="icon" type="image/png" sizes="16x16" href="/favicon-16x16.png?v=20261102">
|
||||||
|
<!-- Not needed, covered in the realfavicongenerator section.
|
||||||
|
<link rel="manifest" href="/site.webmanifest">
|
||||||
|
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- https://realfavicongenerator.net , added the sizes=any manually. -->
|
||||||
|
<link rel="icon" type="image/png" href="/favicon-96x96.png?v=20261102" sizes="96x96" />
|
||||||
|
<link rel="icon" type="image/svg+xml" href="/favicon.svg?v=20261102" sizes="any" />
|
||||||
|
<link rel="shortcut icon" href="/favicon.ico?v=20261102" />
|
||||||
|
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png?v=20261102" />
|
||||||
|
<meta name="apple-mobile-web-app-title" content="Hyperling" />
|
||||||
|
<link rel="manifest" href="/site.webmanifest?v=20261102" />
|
||||||
@@ -7,28 +7,71 @@
|
|||||||
}
|
}
|
||||||
/* */
|
/* */
|
||||||
|
|
||||||
p,li,code,a,pre {
|
/*** Fonts ***/
|
||||||
font-size: medium;
|
|
||||||
|
html, body {
|
||||||
|
font-family: system-ui, sans-serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
b,figcaption {
|
/* * /
|
||||||
font-size: large;
|
h1, h2, h3, h4, h5, h6 {
|
||||||
font-weight: bold;
|
font-family: 'Space Grotesk', Georgia, system-ui, Consolas, sans-serif;
|
||||||
|
}
|
||||||
|
/* */
|
||||||
|
|
||||||
|
code, pre, .mono {
|
||||||
|
font-family:
|
||||||
|
ui-monospace,
|
||||||
|
SFMono-Regular,
|
||||||
|
Menlo, Monaco,
|
||||||
|
Consolas,
|
||||||
|
"Liberation Mono",
|
||||||
|
"Courier New",
|
||||||
|
monospace
|
||||||
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
strong,img {
|
/*** Font Sizes ***/
|
||||||
font-size: larger;
|
|
||||||
font-weight: bolder;
|
html {
|
||||||
|
font-size: 16px;
|
||||||
|
/* Attempt to prevent Firefox sizing inconsistencies. * /
|
||||||
|
-webkit-text-size-adjust: 100%;
|
||||||
|
-moz-text-size-adjust: 100%;
|
||||||
|
-ms-text-size-adjust: 100%;
|
||||||
|
text-size-adjust: 100%;
|
||||||
|
/* */
|
||||||
}
|
}
|
||||||
|
|
||||||
h6,h5 {
|
code, pre { font-size: 0.8rem; }
|
||||||
font-size: larger;
|
|
||||||
}
|
|
||||||
|
|
||||||
h4,h3 {
|
body { font-size: 1rem; }
|
||||||
font-size: x-large;
|
p, li, a { font-size: 1rem; }
|
||||||
}
|
|
||||||
|
|
||||||
h2,h1 {
|
b { font-size: 1.05rem; }
|
||||||
font-size: xx-large;
|
figcaption { font-size: 1.1rem; }
|
||||||
}
|
strong { font-size: 1.2rem; }
|
||||||
|
img { font-size: 1.25rem; }
|
||||||
|
|
||||||
|
/* More Subtle */
|
||||||
|
h6 { font-size: 1.3rem; }
|
||||||
|
h5 { font-size: 1.4rem; }
|
||||||
|
h4 { font-size: 1.5rem; }
|
||||||
|
h3 { font-size: 1.6rem; }
|
||||||
|
h2 { font-size: 1.7rem; }
|
||||||
|
h1 { font-size: 1.8rem; }
|
||||||
|
/* */
|
||||||
|
|
||||||
|
/* More Pronounced * /
|
||||||
|
h6 { font-size: 1.30rem; }
|
||||||
|
h5 { font-size: 1.55rem; }
|
||||||
|
h4 { font-size: 1.80rem; }
|
||||||
|
h3 { font-size: 1.95rem; }
|
||||||
|
h2 { font-size: 2.10rem; }
|
||||||
|
h1 { font-size: 2.35rem; }
|
||||||
|
/* */
|
||||||
|
|
||||||
|
/*** Font Weights ***/
|
||||||
|
|
||||||
|
b, figcaption { font-weight: bold; }
|
||||||
|
strong, img { font-weight: bolder; }
|
||||||
@@ -10,12 +10,9 @@
|
|||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<title>Hyperling<?php echo($GLOBALS["HEADER_TITLE"]); ?></title>
|
<title>Hyperling<?php echo($GLOBALS["HEADER_TITLE"]); ?></title>
|
||||||
<link rel="icon" sizes="32x32"
|
<?php
|
||||||
href="/files/media/icons/favicon.ico"
|
include "favicon.php";
|
||||||
>
|
?>
|
||||||
<link rel="icon" sizes="192x192"
|
|
||||||
href="/files/media/icons/favicon.ico"
|
|
||||||
>
|
|
||||||
<!-- CSS -->
|
<!-- CSS -->
|
||||||
<style>
|
<style>
|
||||||
<?php include "main.css"; ?>
|
<?php include "main.css"; ?>
|
||||||
@@ -30,16 +27,18 @@
|
|||||||
<?php include "banner.css"; ?>
|
<?php include "banner.css"; ?>
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<meta property="og:title" content="Hyperling"/>
|
<meta property="og:title" content="Hyperling">
|
||||||
<meta property="og:description" content="Apps, eBooks, media, and other resources from the brands Hyperling and HyperVegan."/>
|
<meta property="og:description" content="Apps, eBooks, media, and other resources from the brands Hyperling and HyperVegan.">
|
||||||
<meta property="og:site_name" content="Hyperling"/>
|
<meta property="og:site_name" content="Hyperling">
|
||||||
<meta property="og:url" content="https://hyperling.com/"/>
|
<meta property="og:url" content="https://hyperling.com/">
|
||||||
<meta property="og:type" content="website"/>
|
<meta property="og:type" content="website">
|
||||||
<meta property="og:image" content="https://hyperling.com/files/media/icons/home.jpg"/>
|
<meta property="og:image" content="https://hyperling.com/files/media/icons/home.jpg">
|
||||||
<meta name="referrer" content="same-origin"/>
|
<meta name="referrer" content="same-origin">
|
||||||
|
|
||||||
<meta name="twitter:card" content="summary_large_image" />
|
<meta name="twitter:card" content="summary_large_image">
|
||||||
<meta name="twitter:title" content="Hyperling" />
|
<meta name="twitter:title" content="Hyperling">
|
||||||
<meta name="twitter:description" content="Apps, eBooks, media, and other resources from the brands Hyperling and HyperVegan." />
|
<meta name="twitter:description" content="Apps, eBooks, media, and other resources from the brands Hyperling and HyperVegan.">
|
||||||
<meta name="twitter:image" content="https://hyperling.com/files/media/icons/home.jpg" />
|
<meta name="twitter:image" content="https://hyperling.com/files/media/icons/home.jpg">
|
||||||
|
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
</head>
|
</head>
|
||||||
@@ -21,24 +21,57 @@
|
|||||||
.col-11 {width: 91.66%;}
|
.col-11 {width: 91.66%;}
|
||||||
.col-12 {width: 100%;}
|
.col-12 {width: 100%;}
|
||||||
|
|
||||||
|
.row {
|
||||||
|
border: 1px solid #131313;
|
||||||
|
border-radius: 4px;
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
align-items: stretch;
|
||||||
|
}
|
||||||
|
|
||||||
[class*="col-"] {
|
[class*="col-"] {
|
||||||
float: left;
|
|
||||||
padding: 15px;
|
padding: 15px;
|
||||||
|
|
||||||
/* FORTESTING, otherwise disable */
|
/* FORTESTING, otherwise disable */
|
||||||
/*border: 1px solid green;*/
|
/*border: 1px solid green;*/
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Ensure columns are respected as if they always exist. */
|
/* Handle mobile devices a bit better, making columns break out as rows. */
|
||||||
.row::after {
|
|
||||||
content: "";
|
.banner-desktop { display: flex; }
|
||||||
clear: both;
|
.banner-mobile { display: none; }
|
||||||
display: table;
|
|
||||||
|
/* Phones */
|
||||||
|
@media (max-width: 767px) {
|
||||||
|
[class*="col-"] {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
.row {
|
/* Tablets */
|
||||||
border: 1px solid #131313;
|
@media (min-width: 768px) and (max-width: 1023px) {
|
||||||
border-radius: 4px;
|
.col-1, .col-2, .col-3, .col-4, .col-5, .col-6 {
|
||||||
|
width: 50%;
|
||||||
|
}
|
||||||
|
.col-7, .col-8, .col-9, .col-10, .col-11, .col-12 {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Both Mobiles */
|
||||||
|
@media (max-width: 1023px) {
|
||||||
|
[class*="col-"] {
|
||||||
|
float: none;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
.banner-image {display: none; }
|
||||||
|
.banner-desktop { display: none; }
|
||||||
|
.banner-mobile { display: flex; }
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Desktop */
|
||||||
|
@media (min-width: 1024px) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Make the menu items centered and layout horizontal. **/
|
/** Make the menu items centered and layout horizontal. **/
|
||||||
@@ -51,12 +84,12 @@
|
|||||||
.menu-list {
|
.menu-list {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
list-style-type: none;
|
list-style-type: none;
|
||||||
padding-left: 0px;
|
|
||||||
}
|
}
|
||||||
.menu_item {
|
.menu-item {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
padding: 0px;
|
|
||||||
white-space: nowrap;
|
white-space: nowrap;
|
||||||
|
margin: 0.1rem;
|
||||||
|
padding: 0.1rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Be able to position anything easily. **/
|
/** Be able to position anything easily. **/
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
#!/usr/bin/php
|
#!/usr/bin/php
|
||||||
|
<!--
|
||||||
<div class="row header menu">
|
<div class="row header menu">
|
||||||
<ul class="menu-list">
|
<ul class="menu-list">
|
||||||
<li class="col-3 menu-item"><a href="/">Home</a></li>
|
<li class="col-3 menu-item"><a href="/">Home</a></li>
|
||||||
@@ -16,4 +17,64 @@
|
|||||||
</li>
|
</li>
|
||||||
<li class="col-3 menu-item"><a href="/photos/">Photos</a></li>
|
<li class="col-3 menu-item"><a href="/photos/">Photos</a></li>
|
||||||
</ul>
|
</ul>
|
||||||
|
-->
|
||||||
|
<!--
|
||||||
|
<ul class="menu-list">
|
||||||
|
<li class="col-3 menu-item"></li>
|
||||||
|
<li class="col-3 menu-item">
|
||||||
|
<a href="https://blog.hyperling.com"
|
||||||
|
target="_blank" rel="noopener noreferrer"
|
||||||
|
>Blog</a>
|
||||||
|
</li>
|
||||||
|
<li class="col-3 menu-item">
|
||||||
|
<a href="https://recipes.hyperling.com"
|
||||||
|
target="_blank" rel="noopener noreferrer"
|
||||||
|
>Recipes</a>
|
||||||
|
</li>
|
||||||
|
<li class="col-3 menu-item"></li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
-->
|
||||||
|
|
||||||
|
<div class="menu row header center">
|
||||||
|
<div class="menu-list col-12">
|
||||||
|
<strong>Main:</strong>
|
||||||
|
<a class="menu-item" href="/apps/">Apps</a>
|
||||||
|
<a class="menu-item" href="/about/">About</a>
|
||||||
|
<a class="menu-item" href="/contact/">Contact</a>
|
||||||
|
<a class="menu-item" href="/support/">Support</a>
|
||||||
|
<strong>Media:</strong>
|
||||||
|
<a class="menu-item"
|
||||||
|
href="https://git.hyperling.com/me/"
|
||||||
|
target="_blank" rel="noopener noreferrer"
|
||||||
|
>Code</a>
|
||||||
|
<a class="menu-item"
|
||||||
|
href="https://works.hyperling.com/categories/books/"
|
||||||
|
target="_blank" rel="noopener noreferrer"
|
||||||
|
>Books</a>
|
||||||
|
<a class="menu-item"
|
||||||
|
href="https://works.hyperling.com/videos/"
|
||||||
|
target="_blank" rel="noopener noreferrer"
|
||||||
|
>Videos</a>
|
||||||
|
<a class="menu-item"
|
||||||
|
href="/photos/"
|
||||||
|
>Photos</a>
|
||||||
|
<strong>Blog:</strong>
|
||||||
|
<a class="menu-item"
|
||||||
|
href="https://blog.hyperling.com/categories/articles/"
|
||||||
|
target="_blank" rel="noopener noreferrer"
|
||||||
|
>Articles</a>
|
||||||
|
<a class="menu-item"
|
||||||
|
href="https://recipes.hyperling.com/categories/recipes/"
|
||||||
|
target="_blank" rel="noopener noreferrer"
|
||||||
|
>Recipes</a>
|
||||||
|
<a class="menu-item"
|
||||||
|
href="https://blog.hyperling.com/categories/musings/"
|
||||||
|
target="_blank" rel="noopener noreferrer"
|
||||||
|
>Poetry</a>
|
||||||
|
<a class="menu-item"
|
||||||
|
href="https://recipes.hyperling.com/categories/guides/"
|
||||||
|
target="_blank" rel="noopener noreferrer"
|
||||||
|
>Guides</a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -1,8 +1,6 @@
|
|||||||
#!/usr/bin/php
|
#!/usr/bin/php
|
||||||
<!--
|
|
||||||
Landing page, keeping it apps and development projects like old WordPress site.
|
|
||||||
-->
|
|
||||||
<?php
|
<?php
|
||||||
|
/* Landing page, keeping it apps and development projects like old WordPress site. */
|
||||||
if (!isset($GLOBALS["HEADER_TITLE"])) {
|
if (!isset($GLOBALS["HEADER_TITLE"])) {
|
||||||
$GLOBALS["HEADER_TITLE"] = "Announcements";
|
$GLOBALS["HEADER_TITLE"] = "Announcements";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -111,7 +111,7 @@ cat << EOF
|
|||||||
Speaking of lifestyle, that is something else I learned from listening
|
Speaking of lifestyle, that is something else I learned from listening
|
||||||
to my new role models. "Sleep Water Sugar" as Durianrider used to say.
|
to my new role models. "Sleep Water Sugar" as Durianrider used to say.
|
||||||
The
|
The
|
||||||
<a href="https://files.hyperling.com/media/HealthPriorities.pdf"
|
<a href="/files/media/documents/HealthPriorities.pdf"
|
||||||
target="_blank">PDF</a>
|
target="_blank">PDF</a>
|
||||||
on my main
|
on my main
|
||||||
<a href="/about/#health" target="_blank">Health</a>
|
<a href="/about/#health" target="_blank">Health</a>
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
#!/usr/bin/php
|
#!/usr/bin/php
|
||||||
<!--
|
|
||||||
Page for my video links.
|
|
||||||
-->
|
|
||||||
<?php
|
<?php
|
||||||
|
/* Page for my video links. */
|
||||||
if (!isset($GLOBALS["HEADER_TITLE"])) {
|
if (!isset($GLOBALS["HEADER_TITLE"])) {
|
||||||
$GLOBALS["HEADER_TITLE"] = "Media";
|
$GLOBALS["HEADER_TITLE"] = "Media";
|
||||||
}
|
}
|
||||||
@@ -109,7 +107,7 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-12 text">
|
<div class="col-12 text">
|
||||||
<p>
|
<p>
|
||||||
I don't have social media, so where do my photos and videos go?
|
I don't have social media, so where do my personal photos and videos go?
|
||||||
Try right here!
|
Try right here!
|
||||||
</p>
|
</p>
|
||||||
<ul class="indent"><li>
|
<ul class="indent"><li>
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ cd $DIR/..
|
|||||||
photos_all=./files/photos/all.html
|
photos_all=./files/photos/all.html
|
||||||
photos=./pages/photos.sh
|
photos=./pages/photos.sh
|
||||||
|
|
||||||
# If the all script does not exist,call the generator and ignore its output.
|
# If the all script does not exist, call the generator and ignore its output.
|
||||||
if [[ ! -e $photos_all ]]; then
|
if [[ ! -e $photos_all ]]; then
|
||||||
$photos > /dev/null
|
$photos > /dev/null
|
||||||
fi
|
fi
|
||||||
|
|||||||
@@ -2,6 +2,10 @@
|
|||||||
# 2024-01-21 Hyperling
|
# 2024-01-21 Hyperling
|
||||||
# Transition away from PhotoPrism. Helps to save system resources and downsize.
|
# Transition away from PhotoPrism. Helps to save system resources and downsize.
|
||||||
|
|
||||||
|
## TBD ##
|
||||||
|
# - Have links at the top of the ALL page for jumping between years.
|
||||||
|
## End TBD
|
||||||
|
|
||||||
## Static Variables ##
|
## Static Variables ##
|
||||||
DIR=`dirname $0`
|
DIR=`dirname $0`
|
||||||
a="a target='_blank' rel='noopener noreferrer'"
|
a="a target='_blank' rel='noopener noreferrer'"
|
||||||
@@ -146,14 +150,14 @@ function build_album_pages {
|
|||||||
echo -en "\t\t\t\t<$a href='/$photo'>" >> $subpage
|
echo -en "\t\t\t\t<$a href='/$photo'>" >> $subpage
|
||||||
# Determine what type of media it is, and how to display it.
|
# Determine what type of media it is, and how to display it.
|
||||||
if [[ $photo == *".mp4" ]]; then
|
if [[ $photo == *".mp4" ]]; then
|
||||||
echo -e "\t\t\t\t\t<video width='320px' controls>" >> $subpage
|
echo -e "\t\t\t\t\t<video width='320px' preload='none' controls>" >> $subpage
|
||||||
echo -e "\t\t\t\t\t\t<source src='/$photo' type=video/mp4>" >> $subpage
|
echo -e "\t\t\t\t\t\t<source src='/$photo' type=video/mp4>" >> $subpage
|
||||||
echo -e "\t\t\t\t\t\tYour browser does not support videos." >> $subpage
|
echo -e "\t\t\t\t\t\tYour browser does not support videos." >> $subpage
|
||||||
echo -e "\t\t\t\t\t</video>" >> $subpage
|
echo -e "\t\t\t\t\t</video>" >> $subpage
|
||||||
elif [[ $photo == *".md" || $photo == *".txt" ]]; then
|
elif [[ $photo == *".md" || $photo == *".txt" ]]; then
|
||||||
echo -e "\t\t\t\t\t<p>`cat $photo`</p>" >> $subpage
|
echo -e "\t\t\t\t\t<p>`cat $photo`</p>" >> $subpage
|
||||||
else
|
else
|
||||||
echo -e "\t\t\t\t\t<img src='/$photo' alt=''>" >> $subpage
|
echo -e "\t\t\t\t\t<img loading='lazy' alt='' src='/$photo'>" >> $subpage
|
||||||
fi
|
fi
|
||||||
# Check if it needs an extra descriptive detail.
|
# Check if it needs an extra descriptive detail.
|
||||||
echo -en "\t\t\t\t\t<p>$filename" >> $subpage
|
echo -en "\t\t\t\t\t<p>$filename" >> $subpage
|
||||||
@@ -229,11 +233,11 @@ function build_all_page {
|
|||||||
dir_name="${dir_name//_/ }"
|
dir_name="${dir_name//_/ }"
|
||||||
dir_name="${dir_name//-/ }"
|
dir_name="${dir_name//-/ }"
|
||||||
|
|
||||||
media="<img src='$media_uri' alt='' style='width:100%'>"
|
media="<img style='width:100%' loading='lazy' alt='' src='$media_uri'>"
|
||||||
|
|
||||||
# Determine how to show the file.
|
# Determine how to show the file.
|
||||||
if [[ $media_uri == *".mp4" ]]; then
|
if [[ $media_uri == *".mp4" ]]; then
|
||||||
media="<video controls style='width:100%'>"
|
media="<video style='width:100%' preload='none' controls>"
|
||||||
media="${media}<source src='$media_uri' type=video/mp4>"
|
media="${media}<source src='$media_uri' type=video/mp4>"
|
||||||
media="${media}Your browser does not support videos."
|
media="${media}Your browser does not support videos."
|
||||||
media="${media}</video>"
|
media="${media}</video>"
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
#!/usr/bin/php
|
#!/usr/bin/php
|
||||||
<!--
|
|
||||||
Lists of items which I'd like to share such as gear and frequently used apps.
|
|
||||||
-->
|
|
||||||
<?php
|
<?php
|
||||||
|
/* Lists of items which I'd like to share such as gear and frequently used apps. */
|
||||||
if (!isset($GLOBALS["HEADER_TITLE"])) {
|
if (!isset($GLOBALS["HEADER_TITLE"])) {
|
||||||
$GLOBALS["HEADER_TITLE"] = "Resources";
|
$GLOBALS["HEADER_TITLE"] = "Resources";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
#!/usr/bin/php
|
#!/usr/bin/php
|
||||||
<!--
|
|
||||||
Page for my resume and work skill links.
|
|
||||||
-->
|
|
||||||
<?php
|
<?php
|
||||||
|
/* Page for my resume and work skill links. */
|
||||||
if (!isset($GLOBALS["HEADER_TITLE"])) {
|
if (!isset($GLOBALS["HEADER_TITLE"])) {
|
||||||
$GLOBALS["HEADER_TITLE"] = "Resume";
|
$GLOBALS["HEADER_TITLE"] = "Resume";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,34 @@
|
|||||||
<h2 class="col-12 header">Announcements</h2>
|
<h2 class="col-12 header">Announcements</h2>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12 text">
|
||||||
|
<strong><a href="/apps/#sunset/">2026-10-01</a></strong>
|
||||||
|
<p>
|
||||||
|
Sunset Alarm has been finished! Check it out
|
||||||
|
<a href="/apps/#sunset">here</a>.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-12 text">
|
||||||
|
<strong><a href="https://fdroid.hyperling.com/">2026-07-04</a></strong>
|
||||||
|
<p>
|
||||||
|
My F-Droid repo is now available for those not using Obtainium.
|
||||||
|
<a href="https://fdroid.hyperling.com/"
|
||||||
|
target="_blank" rel="noopener noreferrer"
|
||||||
|
>Find it here</a>!
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
Watch the announcement:
|
||||||
|
<a href="https://odysee.com/@HyperVegan:2/20260707-HyperVegan-FDroidRepo:a"
|
||||||
|
target="_blank" rel="noopener noreferrer"
|
||||||
|
>HyperVegan: "F-Droid Repository"</a>
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col-12 text">
|
<div class="col-12 text">
|
||||||
<strong><a href="/freedom/">2025-09-28</a></strong>
|
<strong><a href="/freedom/">2025-09-28</a></strong>
|
||||||
@@ -24,9 +52,10 @@
|
|||||||
</p>
|
</p>
|
||||||
";?>
|
";?>
|
||||||
<p>
|
<p>
|
||||||
|
Watch the announcement:
|
||||||
<a href="https://odysee.com/@HyperVegan:2/20251003-Announcements:0"
|
<a href="https://odysee.com/@HyperVegan:2/20251003-Announcements:0"
|
||||||
target="_blank" rel="noopener noreferrer"
|
target="_blank" rel="noopener noreferrer"
|
||||||
>Watch the announcement here | (HyperVegan: "Announcements: Skipped Midfest, Voluntary Sovereignty eBook, CheapRVLiving Interview")</a>
|
>HyperVegan: "Announcements: Skipped Midfest, Voluntary Sovereignty eBook, CheapRVLiving Interview"</a>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -49,12 +78,12 @@
|
|||||||
</p>
|
</p>
|
||||||
";?>
|
";?>
|
||||||
<p>
|
<p>
|
||||||
|
Watch the announcement:
|
||||||
<a href="https://odysee.com/@HyperVegan:2/20250402-HyperVegan-ExpenseTrackerApp:4"
|
<a href="https://odysee.com/@HyperVegan:2/20250402-HyperVegan-ExpenseTrackerApp:4"
|
||||||
target="_blank" rel="noopener noreferrer"
|
target="_blank" rel="noopener noreferrer"
|
||||||
>Watch the announcement here | (HyperVegan: "Expense Tracker App")</a>
|
>HyperVegan: "Expense Tracker App"</a>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</a>
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row">
|
<div class="row">
|
||||||
@@ -77,9 +106,10 @@
|
|||||||
</p>
|
</p>
|
||||||
";?>
|
";?>
|
||||||
<p>
|
<p>
|
||||||
|
Watch the announcement:
|
||||||
<a href="https://odysee.com/@HyperVegan:2/20240306_MyHealthProtocol-Book:9"
|
<a href="https://odysee.com/@HyperVegan:2/20240306_MyHealthProtocol-Book:9"
|
||||||
target="_blank" rel="noopener noreferrer"
|
target="_blank" rel="noopener noreferrer"
|
||||||
>Watch the announcement here | (HyperVegan: "My Health Protocol | eBook")</a>
|
>HyperVegan: "My Health Protocol | eBook"</a>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -101,9 +131,10 @@
|
|||||||
</p>
|
</p>
|
||||||
";?>
|
";?>
|
||||||
<p>
|
<p>
|
||||||
|
Watch the announcement:
|
||||||
<a href="https://odysee.com/@HyperVegan:2/20240401_NewYearNewApp:1"
|
<a href="https://odysee.com/@HyperVegan:2/20240401_NewYearNewApp:1"
|
||||||
target="_blank" rel="noopener noreferrer"
|
target="_blank" rel="noopener noreferrer"
|
||||||
>Watch the announcement here | (HyperVegan: "New Year, New App")</a>
|
>HyperVegan: "New Year, New App"</a>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -1,7 +1,7 @@
|
|||||||
#!/usr/bin/php
|
#!/usr/bin/php
|
||||||
<!-- How people can support me with currency if they so desire. -->
|
<!-- How people can support me with currency if they so desire. -->
|
||||||
<div class="row" id="donate">
|
<div class="row" id="donate">
|
||||||
<h2 class="col-12 header">Donate</h2>
|
<h2 class="col-12 header">One-Time Gifts</h2>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="row text">
|
<div class="row text">
|
||||||
@@ -21,21 +21,43 @@
|
|||||||
<div class="header">
|
<div class="header">
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
<strong><code>XMR | Monero</code></strong>
|
<a href="monero:4ATk6owoMki46CuVfyAHS57FB5deqVFudTsaifQC1cfmcaQemgPEftcjZcW9DmcyfrfdRjxHQ9m4JAVSorYTgm6h8JnT7ao">
|
||||||
|
<b class="mono">XMR | Monero</b>
|
||||||
|
</a>
|
||||||
<div class="code"><code>4ATk6owoMki46CuVfyAHS57FB5deqVFudTsaifQC1cfmcaQemgPEftcjZcW9DmcyfrfdRjxHQ9m4JAVSorYTgm6h8JnT7ao</code></div>
|
<div class="code"><code>4ATk6owoMki46CuVfyAHS57FB5deqVFudTsaifQC1cfmcaQemgPEftcjZcW9DmcyfrfdRjxHQ9m4JAVSorYTgm6h8JnT7ao</code></div>
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
<strong><code>BTC | Bitcoin</code></strong>
|
<a href="bitcoin:bc1qsfe8dkvry3d34kztz449gkq67wq8fu2nkgfkh0?">
|
||||||
|
<b class="mono">BTC | Bitcoin</b>
|
||||||
|
</a>
|
||||||
<div class="code"><code>bc1qsfe8dkvry3d34kztz449gkq67wq8fu2nkgfkh0</code></div>
|
<div class="code"><code>bc1qsfe8dkvry3d34kztz449gkq67wq8fu2nkgfkh0</code></div>
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
<strong><code>LTC | Litecoin</code></strong>
|
<a href="bitcoincash:qzr00gaqeldlu3amjdn59f2y73276v8jwu6vanays2">
|
||||||
|
<b class="mono">BCH | Bitcoin Cash</b>
|
||||||
|
</a>
|
||||||
|
<div class="code"><code>qzr00gaqeldlu3amjdn59f2y73276v8jwu6vanays2</code></div>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<a href="litecoin:ltc1qavmpu5d6ljntxsd6jj548m4yys83zwscl0dzkx">
|
||||||
|
<b class="mono">LTC | Litecoin</b>
|
||||||
|
</a>
|
||||||
<div class="code"><code>ltc1qavmpu5d6ljntxsd6jj548m4yys83zwscl0dzkx</code></div>
|
<div class="code"><code>ltc1qavmpu5d6ljntxsd6jj548m4yys83zwscl0dzkx</code></div>
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
<strong><code>LBC | Odysee's Coin</code></strong>
|
<!-- TBD
|
||||||
|
<a href="">
|
||||||
|
<strong><code>ETH | Ethereum</code></strong>
|
||||||
|
</a>
|
||||||
|
<div class="code"><code></code></div>
|
||||||
|
<br>
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!--
|
||||||
|
<a href=""><strong><code>LBC | Odysee's Coin</code></strong></a>
|
||||||
<div class="code"><code>bDWP6qZajtm9Q9EkryKTorRwKFd5eDbPJj</code></div>
|
<div class="code"><code>bDWP6qZajtm9Q9EkryKTorRwKFd5eDbPJj</code></div>
|
||||||
<br>
|
<br>
|
||||||
|
-->
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -45,7 +67,7 @@
|
|||||||
<div class="header">
|
<div class="header">
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
<strong><code>Zelle</code></strong>
|
<b class="mono">Zelle</b>
|
||||||
<div class="code">
|
<div class="code">
|
||||||
<code>me@hyperling.com</code>
|
<code>me@hyperling.com</code>
|
||||||
<br>
|
<br>
|
||||||
@@ -54,7 +76,7 @@
|
|||||||
</div>
|
</div>
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
<strong><code>Venmo</code></strong>
|
<b class="mono">Venmo</b>
|
||||||
<div class="code">
|
<div class="code">
|
||||||
<code>
|
<code>
|
||||||
@HyperVegan
|
@HyperVegan
|
||||||
@@ -66,8 +88,69 @@
|
|||||||
</code>
|
</code>
|
||||||
</code>
|
</code>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<?php
|
||||||
|
if (false) {
|
||||||
|
echo <<<HTML
|
||||||
|
<strong><code>PayPal</code></strong>
|
||||||
|
<div class="code">
|
||||||
|
<code>
|
||||||
|
@HyperVegan
|
||||||
<br>
|
<br>
|
||||||
|
<br>
|
||||||
|
<code>[<a href="https://account.venmo.com/u/HyperVegan"
|
||||||
|
target="_blank" rel="noopener noreferrer"
|
||||||
|
>Account Page</a>]
|
||||||
|
</code>
|
||||||
|
</code>
|
||||||
|
</div>
|
||||||
|
HTML;
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
<br> <!-- Keeps border cnsistent. -->
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<?php
|
||||||
|
if (false) {
|
||||||
|
echo <<<HTML
|
||||||
|
<div class="col-12 center border">
|
||||||
|
<strong class="spacing">Preference 4 - International USD</strong>
|
||||||
|
<p>Send international currencies to a fiat-based account.</p>
|
||||||
|
<div class="header">
|
||||||
|
<br>
|
||||||
|
<p>This section is a Work In Progress.</p>
|
||||||
|
|
||||||
|
<strong><code>Wise</code></strong>
|
||||||
|
<div class="code">
|
||||||
|
<!-- TBD
|
||||||
|
<code>me@hyperling.com</code>
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
<img src="/files/media/icons/zelle.png" alt="<<zelle.png>>">
|
||||||
|
-->
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<strong><code>Revolut</code></strong>
|
||||||
|
<div class="code">
|
||||||
|
<!-- TBD
|
||||||
|
<code>
|
||||||
|
@HyperVegan
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
<code>[<a href="https://account.venmo.com/u/HyperVegan"
|
||||||
|
target="_blank" rel="noopener noreferrer"
|
||||||
|
>Account Page</a>]
|
||||||
|
</code>
|
||||||
|
</code>
|
||||||
|
-->
|
||||||
|
</div>
|
||||||
|
<br>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
HTML;
|
||||||
|
}
|
||||||
|
?>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
#!/usr/bin/php
|
||||||
|
<div class="row">
|
||||||
|
<h1 class="col-12 title">Donation Methods</h1>
|
||||||
|
<?php if (isset($GLOBALS["SHOW_BANNER_PICS"])
|
||||||
|
&& !$GLOBALS["SHOW_BANNER_PICS"])
|
||||||
|
echo '
|
||||||
|
<div class="col-12 header center" >
|
||||||
|
<img src="/files/media/icons/support.jpg" alt="<<support.jpg>>">
|
||||||
|
</div>
|
||||||
|
';?>
|
||||||
|
<div class="col-12 header center">
|
||||||
|
<p>
|
||||||
|
Anything is very much appreciated!!
|
||||||
|
Thank you for considering me!
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
#!/usr/bin/php
|
||||||
|
<!-- How people can support me in a recurring manner.. -->
|
||||||
|
<div class="row" id="donate">
|
||||||
|
<h2 class="col-12 header">Recurring Support</h2>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="row text">
|
||||||
|
|
||||||
|
<div class="col-6 center border">
|
||||||
|
<strong class="spacing">Preference 1 - Liberapay</strong>
|
||||||
|
|
||||||
|
<p>Send weekly / monthly / yearly without any sort of brokerage fees!</p>
|
||||||
|
|
||||||
|
<a href="https://liberapay.com/HyperVegan/donate"
|
||||||
|
target="_blank" rel="noopener noreferrer"
|
||||||
|
>
|
||||||
|
<img alt="Donate using Liberapay"
|
||||||
|
src="https://liberapay.com/assets/widgets/donate.svg"
|
||||||
|
alt="liberapay.com/HyperVegan/donate"
|
||||||
|
>
|
||||||
|
|
||||||
|
<br/>
|
||||||
|
<br/>
|
||||||
|
|
||||||
|
<img src="https://img.shields.io/liberapay/patrons/HyperVegan.svg?logo=liberapay">
|
||||||
|
<br/>
|
||||||
|
<img src="https://img.shields.io/liberapay/receives/HyperVegan.svg?logo=liberapay">
|
||||||
|
<br/>
|
||||||
|
<img src="https://img.shields.io/liberapay/goal/HyperVegan.svg?logo=liberapay">
|
||||||
|
</a>
|
||||||
|
|
||||||
|
<p>I also suggest donating to Liberapay for making this possible.</p>
|
||||||
|
<a href="https://en.liberapay.com/Liberapay/"
|
||||||
|
target="_blank" rel="noopener noreferrer"
|
||||||
|
>Donate to the platform.</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-6 center border">
|
||||||
|
<strong class="spacing">Preference 2 - Ko-fi</strong>
|
||||||
|
<p>Monthly donations with 5% brokerage fee. Also supports one-time tips.</p>
|
||||||
|
<a href="https://ko-fi.com/hypervegan"
|
||||||
|
target="_blank" rel="noopener noreferrer"
|
||||||
|
>
|
||||||
|
<img alt="Donate using Ko-fi"
|
||||||
|
src="https://storage.ko-fi.com/cdn/opengraph_assets/default_creator_og/hz_profile_page.png"
|
||||||
|
alt="ko-fi.com/hypervegan"
|
||||||
|
height=200
|
||||||
|
>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Requires using Stripe, which asks for last 4 of social. Pass for now.
|
||||||
|
<div class="col-4 center border">
|
||||||
|
<strong class="spacing">Preference 3 - Buy Me A Coffee</strong>
|
||||||
|
<p>5% brokerage fee.</p>
|
||||||
|
<a href="https://buymeacoffee.com/hypervegan"
|
||||||
|
target="_blank" rel="noopener noreferrer"
|
||||||
|
>
|
||||||
|
<img alt="Donate using Ko-fi"
|
||||||
|
src="https://storage.ko-fi.com/cdn/opengraph_assets/default_creator_og/hz_profile_page.png"
|
||||||
|
alt="buymeacoffee.com/hypervegan"
|
||||||
|
>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
-->
|
||||||
|
|
||||||
|
</div>
|
||||||
@@ -1,30 +1,17 @@
|
|||||||
#!/usr/bin/php
|
#!/usr/bin/php
|
||||||
<!--
|
|
||||||
Page to provide ways people can support me.
|
|
||||||
-->
|
|
||||||
<?php
|
<?php
|
||||||
|
/* Page to provide ways people can support me. */
|
||||||
if (!isset($GLOBALS["HEADER_TITLE"])) {
|
if (!isset($GLOBALS["HEADER_TITLE"])) {
|
||||||
$GLOBALS["HEADER_TITLE"] = "Support";
|
$GLOBALS["HEADER_TITLE"] = "Support";
|
||||||
}
|
}
|
||||||
include "helpers/body_open.php";
|
include "helpers/body_open.php";
|
||||||
?>
|
|
||||||
<div class="row">
|
include "subpages/support/header.php";
|
||||||
<h1 class="col-12 title">Support</h1>
|
|
||||||
<?php if (isset($GLOBALS["SHOW_BANNER_PICS"])
|
include "subpages/support/support.php";
|
||||||
&& !$GLOBALS["SHOW_BANNER_PICS"])
|
|
||||||
echo '
|
|
||||||
<div class="col-12 header center" >
|
|
||||||
<img src="/files/media/icons/support.jpg" alt="<<support.jpg>>">
|
|
||||||
</div>
|
|
||||||
';?>
|
|
||||||
<div class="col-12 header center">
|
|
||||||
<p>
|
|
||||||
Anything is very much appreciated!! Thank you for considering me!
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</div>
|
|
||||||
<?php
|
|
||||||
include "subpages/support/donate.php";
|
include "subpages/support/donate.php";
|
||||||
|
|
||||||
// 2025-01-04 Not really looking for this type of thing.
|
// 2025-01-04 Not really looking for this type of thing.
|
||||||
//include "subpages/support/gifts.php";
|
//include "subpages/support/gifts.php";
|
||||||
|
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
#!/usr/bin/php
|
#!/usr/bin/php
|
||||||
<!--
|
<?php
|
||||||
|
/*
|
||||||
Old page for my video links.
|
Old page for my video links.
|
||||||
Deprecated 2024-03-06 for /media.
|
Deprecated 2024-03-06 for /media.
|
||||||
-->
|
*/
|
||||||
<?php
|
|
||||||
if (!isset($GLOBALS["HEADER_TITLE"])) {
|
if (!isset($GLOBALS["HEADER_TITLE"])) {
|
||||||
$GLOBALS["HEADER_TITLE"] = "Videos";
|
$GLOBALS["HEADER_TITLE"] = "Videos";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -80,28 +80,42 @@ fi
|
|||||||
|
|
||||||
log "Check if any system dependencies need installed."
|
log "Check if any system dependencies need installed."
|
||||||
progs=""
|
progs=""
|
||||||
if [[ ! `which php` ]]; then
|
if [[ ! `which php 2>/dev/null` ]]; then
|
||||||
echo "- Installing PHP"
|
echo "- Installing PHP"
|
||||||
progs="$progs php-cli"
|
progs_apt="$progs_apt php-cli"
|
||||||
|
progs_pm="$progs_pm php"
|
||||||
fi
|
fi
|
||||||
if [[ ! `which node` ]]; then
|
if [[ ! `which node 2>/dev/null` ]]; then
|
||||||
echo "- Installing Node"
|
echo "- Installing Node"
|
||||||
progs="$progs nodejs"
|
progs="$progs nodejs"
|
||||||
fi
|
fi
|
||||||
if [[ ! `which npm` ]]; then
|
if [[ ! `which npm 2>/dev/null` ]]; then
|
||||||
echo "- Installing NPM"
|
echo "- Installing NPM"
|
||||||
progs="$progs npm"
|
progs_apt="$progs_apt npm"
|
||||||
|
progs_pm="$progs_pm " # comes with Node.js
|
||||||
fi
|
fi
|
||||||
if [[ ! `which curl` ]]; then
|
if [[ ! `which curl 2>/dev/null` ]]; then
|
||||||
echo "- Installing Curl"
|
echo "- Installing Curl"
|
||||||
progs="$progs curl"
|
progs="$progs curl"
|
||||||
fi
|
fi
|
||||||
if [[ ! `which ps` ]]; then
|
if [[ ! `which ps 2>/dev/null` ]]; then
|
||||||
echo "- Installing PS"
|
echo "- Installing PS"
|
||||||
progs="$progs procps"
|
progs_apt="$progs_apt procps"
|
||||||
|
progs_pm="$progs_pm procps-ng"
|
||||||
fi
|
fi
|
||||||
if [[ -n "$progs" ]]; then
|
if [[ -n "$progs" || -n "$progs_apt" || -n "$progs_pm" ]]; then
|
||||||
|
if [[ `which apt 2>/dev/null` ]]; then
|
||||||
|
echo "Using APT..."
|
||||||
|
progs="$progs $progs_apt"
|
||||||
$sudo apt-get install -y $progs
|
$sudo apt-get install -y $progs
|
||||||
|
elif [[ `which pacman 2>/dev/null` ]]; then
|
||||||
|
echo "Using pacman..."
|
||||||
|
progs="$progs $progs_pm"
|
||||||
|
$sudo pacman -Sy --noconfirm $progs
|
||||||
|
else
|
||||||
|
echo "ERROR: Please install these programs then try again: $progs"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# Directories and allowed page types are executable, others are not.
|
# Directories and allowed page types are executable, others are not.
|
||||||
@@ -123,35 +137,15 @@ log "Removing old index files."
|
|||||||
find files/photos/ -name "*".html -print -delete
|
find files/photos/ -name "*".html -print -delete
|
||||||
{
|
{
|
||||||
check_main photos
|
check_main photos
|
||||||
count=1
|
$DIR/check_photos.sh "$ports"
|
||||||
http_code=0
|
|
||||||
port="${ports%% *}"
|
|
||||||
photos_uri=":$port/photos/"
|
|
||||||
beg_time="$SECONDS"
|
|
||||||
while [[ $http_code != "200" ]]; do
|
|
||||||
log "Sleeping for '$count' while waiting for $photos_uri to come up."
|
|
||||||
sleep $count
|
|
||||||
log "Checking if $photos_uri is available."
|
|
||||||
http_code="`curl --silent --fail -w '\n%{http_code}' localhost$photos_uri | tail -n 1`"
|
|
||||||
log "Check for $photos_uri responded with '$http_code'."
|
|
||||||
if (( $count >= 10 )); then
|
|
||||||
log "Giving up on loading $photos_uri after '$count' attempts."
|
|
||||||
break
|
|
||||||
else
|
|
||||||
count=$(( count + 1 ))
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
end_time="$SECONDS"
|
|
||||||
time="$(( $end_time - $beg_time ))"
|
|
||||||
log "Finished checking for /photos/ after '$time' seconds."
|
|
||||||
} &
|
} &
|
||||||
|
|
||||||
## Main ##
|
## Main ##
|
||||||
|
|
||||||
log "Start local cronjob."
|
log "Start check_git."
|
||||||
while true; do
|
while true; do
|
||||||
check_main cronjob
|
check_main check_git
|
||||||
$DIR/cronjob.sh
|
$DIR/check_git.sh
|
||||||
sleep 30
|
sleep 30
|
||||||
done &
|
done &
|
||||||
|
|
||||||
|
|||||||