initial commit, add files
commit
5b2dd977c1
|
@ -0,0 +1,3 @@
|
|||
*.swp
|
||||
|
||||
/webroot/
|
|
@ -0,0 +1,23 @@
|
|||
Copyright 2024 Jan Danielzick aka. BodgeMaster
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright notice,
|
||||
this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||
this list of conditions and the following disclaimer in the documentation
|
||||
and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
“AS IS” AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||||
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
|
||||
OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
||||
OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
||||
NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
@ -0,0 +1,61 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
function assemble_index {
|
||||
# $1 src
|
||||
# $2 webroot
|
||||
# $3 directory below src
|
||||
# $4 template directory
|
||||
|
||||
sed -e 's/^ //' <<< "
|
||||
import json
|
||||
properties = json.loads('''$(cat "$1/$3/properties.json")''')
|
||||
index_path = ''
|
||||
print('''
|
||||
echo 'Assembling index:'
|
||||
type=$(ls "$1/$3/" | grep "content\\..*body" | sed -e 's/^content\.//;s/body$//')
|
||||
echo \" - Type: \$type\"
|
||||
echo ' - Title: ''' + properties['page title'] + ''''
|
||||
echo ' - Slogan: ''' + properties['section slogan'] + ''''
|
||||
echo ' - Custom CSS: ''' + properties['inject css'] + ''''
|
||||
sed -e 's/%TITLE%/''' + properties['page title'] + '''/;s/%SLOGAN%/''' +properties['section slogan']+ '''/;s/%ADDITIONAL_STYLE%/''' +properties['inject css']+ '''/' < $4/html_begin.template > $2/$3/index.\$type
|
||||
cat $1/$3/content.\${type}body >> $2/$3/index.\$type
|
||||
cat $4/html_end.template >> $2/$3/index.\$type
|
||||
''')
|
||||
" | python3 | bash
|
||||
}
|
||||
|
||||
function copy_additional_files {
|
||||
# $1 src
|
||||
# $2 webroot
|
||||
# $3 directory below src
|
||||
|
||||
sed -e 's/^ //' <<< "
|
||||
import json
|
||||
properties = json.loads('''$(cat "$1/$3/properties.json")''')
|
||||
for additional_file in properties['additional files']:
|
||||
print('cp --no-dereference -v \"$1/$3/' + additional_file + '\" \"$2/$3/' + additional_file + '\"')
|
||||
" | python3 | bash
|
||||
}
|
||||
|
||||
function build {
|
||||
# $1 src
|
||||
# $2 webroot
|
||||
# $3 template directory
|
||||
|
||||
original_ifs="$IFS"
|
||||
IFS=$'\n'
|
||||
for dir in $(cd "$1" && find . -type d)
|
||||
do
|
||||
echo ">> $dir"
|
||||
[ ! -d "$2/dir" ] && mkdir "$2/$dir"
|
||||
assemble_index "$1" "$2" "$dir" "$3"
|
||||
copy_additional_files "$1" "$2" "$dir"
|
||||
done
|
||||
IFS="$original_ifs"
|
||||
}
|
||||
|
||||
echo ">>> Cleaning webroots:"
|
||||
./reset.sh
|
||||
|
||||
echo ">>> Building external:"
|
||||
build src webroot templates
|
|
@ -0,0 +1,10 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
function recreate_directory {
|
||||
echo ">> $1"
|
||||
rm -r $1
|
||||
mkdir $1
|
||||
touch $1/.keep
|
||||
}
|
||||
|
||||
recreate_directory webroot
|
|
@ -0,0 +1,7 @@
|
|||
<h1 class="home">
|
||||
Test Page
|
||||
</h1>
|
||||
<p>
|
||||
This is a test page created to check whether I have everything I need
|
||||
in my framework.
|
||||
</p>
|
|
@ -0,0 +1 @@
|
|||
<p>Just another page.</p>
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"section slogan": "Iek! Iek!",
|
||||
"page title": "Example A",
|
||||
"additional files": [],
|
||||
"inject css": ""
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
___
|
||||
.·*¯¯___¯¯*·.
|
||||
/ .*¯ ¯*. \
|
||||
: / \ :
|
||||
| : <o> <o> : |
|
||||
| | A | |
|
||||
| : ; |
|
||||
; \ .___. / :
|
||||
/ ,*·-----·*. \
|
||||
ˇ*·.* *.·*ˇ
|
||||
/ / \ \
|
||||
| : : |
|
||||
| | | |
|
||||
| : : |
|
||||
| : ; |
|
||||
\,*---------*./
|
||||
: ;
|
||||
\ . /
|
||||
| / \ |
|
||||
| | | |
|
||||
| | | |
|
||||
| | | |
|
||||
|____| |____|
|
||||
/____; :____\
|
||||
[_____] [_____]
|
||||
|
|
@ -0,0 +1 @@
|
|||
<p>This is not actually php, just a file to demonstrate that this also deals with PHP.</p>
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"section slogan": "Ook! Ook!",
|
||||
"page title": "Example B",
|
||||
"additional files": ["test.txt", "Hi.txt"],
|
||||
"inject css": ""
|
||||
}
|
|
@ -0,0 +1,11 @@
|
|||
_____ ____
|
||||
/ | / /
|
||||
/ . | / / .*¯¯¯¯¯¯¯¯| /¯¯¯/ .*¯¯¯¯¯¯¯¯¯/ /¯¯¯¯¯¯¯¯¯/
|
||||
/ /| | / / / ,––––, / / / / ,–––––. / / ,––––. /
|
||||
/ / | | / / / / / / / / / / V / / V
|
||||
/ / | | / / / / / / / / / / / ’–––*/
|
||||
/ / | | / / / / / / / / / / / ,–––./
|
||||
/ / | |/ / / / / / / / / / / /
|
||||
/ / | ' / / ’––––’ / / / / ’–––––.*/ / ’–––––.*/
|
||||
/___/ |_____/ |_________.* /___/ |__________/ /__________/
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"section slogan": "Meow!",
|
||||
"page title": "Test",
|
||||
"additional files": ["style.css"],
|
||||
"inject css": ""
|
||||
}
|
|
@ -0,0 +1,335 @@
|
|||
:root {
|
||||
--body-background: #d0d0d0;
|
||||
--header-background: #d11a11;
|
||||
--header-text: #ffffff;
|
||||
--nav-background: #8f0303;
|
||||
--nav-background-hover: #b72200;
|
||||
--nav-text: #ffffff;
|
||||
--main-bg-color: #ffffff;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
body:not(.embed) {
|
||||
background-color: var(--body-background);
|
||||
}
|
||||
|
||||
body * {
|
||||
font-family: sans-serif;
|
||||
}
|
||||
|
||||
header {
|
||||
background-color: var(--header-background);
|
||||
width: 100%;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
header * {
|
||||
color: var(--header-text);
|
||||
text-decoration: none;
|
||||
text-align: center;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
header h1 {
|
||||
font-size: 3em;
|
||||
padding: 0.35em 0 0 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
header h2 {
|
||||
font-size: 1em;
|
||||
font-style: italic;
|
||||
padding: 0 0 0.5em 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
nav {
|
||||
margin: 0;
|
||||
display: table;
|
||||
table-layout: fixed;
|
||||
width: 100%;
|
||||
position: sticky;
|
||||
top: 0;
|
||||
background-color: var(--nav-background);
|
||||
}
|
||||
|
||||
nav * {
|
||||
color: var(--nav-text);
|
||||
text-decoration: none;
|
||||
text-align: center;
|
||||
font-weight: lighter;
|
||||
display: table-cell;
|
||||
vertical-align: middle;
|
||||
background-color: var(--nav-background);
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
nav a {
|
||||
padding-top: 0.7em;
|
||||
padding-bottom: 0.4em;
|
||||
}
|
||||
|
||||
nav a:hover {
|
||||
background-color: var(--nav-background-hover);
|
||||
}
|
||||
|
||||
main {
|
||||
/* TODO: snap to use all available space on small screens */
|
||||
width: 90%;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
border: 1px solid #505050;
|
||||
border-top: none;
|
||||
padding: 0 0.5em;
|
||||
background-color: var(--main-bg-color);
|
||||
}
|
||||
body.embed {
|
||||
background-color: var(--main-bg-color);
|
||||
}
|
||||
|
||||
main h1 {
|
||||
margin: 0;
|
||||
font-size: 1.5em;
|
||||
font-weight: bold;
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
padding-top: 0.5em;
|
||||
padding-bottom: 0.3em;
|
||||
}
|
||||
body.embed h1 {
|
||||
margin: 0;
|
||||
font-size: 1.5em;
|
||||
font-weight: bold;
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
padding-top: 0.5em;
|
||||
padding-bottom: 0.3em;
|
||||
}
|
||||
|
||||
main h1.main {
|
||||
padding-bottom: 0;
|
||||
}
|
||||
body.embed h1.main {
|
||||
padding-bottom: 0;
|
||||
}
|
||||
|
||||
main h1.sub {
|
||||
font-size: 1em;
|
||||
font-style: italic;
|
||||
font-weight: bold;
|
||||
padding-top: 0;
|
||||
padding-bottom: 0.5em;
|
||||
}
|
||||
body.embed h1.sub {
|
||||
font-size: 1em;
|
||||
font-style: italic;
|
||||
font-weight: bold;
|
||||
padding-top: 0;
|
||||
padding-bottom: 0.5em;
|
||||
}
|
||||
|
||||
main h1.home {
|
||||
width: fit-content;
|
||||
text-align: center;
|
||||
font-size: 3.5em;
|
||||
padding: 0.8em 0.4em 0 0.4em;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
margin-bottom: 0.28em;
|
||||
border-bottom: 1px solid;
|
||||
}
|
||||
|
||||
main h2 {
|
||||
margin: 0;
|
||||
font-size: 1.2em;
|
||||
font-weight: bold;
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
padding-top: 0.5em;
|
||||
padding-bottom: 0.3em;
|
||||
}
|
||||
body.embed h2 {
|
||||
margin: 0;
|
||||
font-size: 1.2em;
|
||||
font-weight: bold;
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
padding-top: 0.5em;
|
||||
padding-bottom: 0.3em;
|
||||
}
|
||||
|
||||
main h2.main {
|
||||
padding-bottom: 0;
|
||||
}
|
||||
body.embed h2.main {
|
||||
padding-bottom: 0;
|
||||
}
|
||||
|
||||
main h2.sub {
|
||||
font-size: 0.8em;
|
||||
font-style: italic;
|
||||
font-weight: bold;
|
||||
padding-top: 0;
|
||||
padding-bottom: 0.5em;
|
||||
}
|
||||
body.embed h2.sub {
|
||||
font-size: 0.8em;
|
||||
font-style: italic;
|
||||
font-weight: bold;
|
||||
padding-top: 0;
|
||||
padding-bottom: 0.5em;
|
||||
}
|
||||
|
||||
main h3 {
|
||||
margin: 0;
|
||||
font-size: 1em;
|
||||
font-weight: bold;
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
padding-top: 0.5em;
|
||||
padding-bottom: 0.3em;
|
||||
}
|
||||
body.embed h3 {
|
||||
margin: 0;
|
||||
font-size: 1em;
|
||||
font-weight: bold;
|
||||
padding-left: 0;
|
||||
padding-right: 0;
|
||||
padding-top: 0.5em;
|
||||
padding-bottom: 0.3em;
|
||||
}
|
||||
|
||||
main h3.main {
|
||||
padding-bottom: 0;
|
||||
}
|
||||
body.embed h3.main {
|
||||
padding-bottom: 0;
|
||||
}
|
||||
|
||||
main h3.sub {
|
||||
font-size: 0.7em;
|
||||
font-style: italic;
|
||||
font-weight: bold;
|
||||
padding-top: 0;
|
||||
padding-bottom: 0.5em;
|
||||
}
|
||||
body.embed h3.sub {
|
||||
font-size: 0.7em;
|
||||
font-style: italic;
|
||||
font-weight: bold;
|
||||
padding-top: 0;
|
||||
padding-bottom: 0.5em;
|
||||
}
|
||||
|
||||
main p {
|
||||
margin: 0;
|
||||
padding: 0 0.8em;
|
||||
padding-bottom: 0.5em;
|
||||
font-size: 1em;
|
||||
}
|
||||
body.embed p {
|
||||
margin: 0;
|
||||
padding: 0 0.8em;
|
||||
padding-bottom: 0.5em;
|
||||
font-size: 1em;
|
||||
}
|
||||
|
||||
main p.note {
|
||||
font-size: 0.75em;
|
||||
font-style: italic;
|
||||
}
|
||||
body.embed p.note {
|
||||
font-size: 0.75em;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
main p.center {
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
text-align: center;
|
||||
}
|
||||
body.embed p.center {
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
main div.center {
|
||||
width: fit-content;
|
||||
max-width: 100%;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
main div.center_contents_vertically {
|
||||
overflow: auto;
|
||||
white-space: nowrap;
|
||||
}
|
||||
main div.center_contents_vertically * {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
iframe {
|
||||
border: none;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
input[type="range"] {
|
||||
height: 1em;
|
||||
vertical-align: bottom;
|
||||
}
|
||||
|
||||
input[type="submit"] {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
dialog#show-img::backdrop {
|
||||
background: rgba(0,0,0,0.8);
|
||||
}
|
||||
dialog#show-img {
|
||||
background: transparent;
|
||||
border: none;
|
||||
}
|
||||
|
||||
dialog#show-img p {
|
||||
color: white;
|
||||
font-size: 0.8em;
|
||||
width: 100%;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
dialog#show-img img {
|
||||
display: block;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
max-height: 80vh;
|
||||
max-width: 90vw;
|
||||
}
|
||||
|
||||
footer {
|
||||
margin: 0;
|
||||
padding-top: 0.5em;
|
||||
padding-bottom: 0.5em;
|
||||
}
|
||||
|
||||
footer p {
|
||||
text-align: center;
|
||||
margin: auto;
|
||||
font-size: 0.7em;
|
||||
color: #888A85;
|
||||
}
|
||||
|
||||
footer a {
|
||||
text-decoration: none;
|
||||
color: #555753;
|
||||
}
|
||||
|
||||
footer a:hover {
|
||||
text-decoration: underline;
|
||||
color: #888A85;
|
||||
}
|
|
@ -0,0 +1,18 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title> LostCave - %TITLE% </title>
|
||||
<link rel="stylesheet" type="text/css" href="/style.css" />
|
||||
<style> %ADDITIONAL_STYLE% </style>
|
||||
</head>
|
||||
<body>
|
||||
<header>
|
||||
<h1> LostCave </h1>
|
||||
<h2> %SLOGAN% </h2>
|
||||
</header>
|
||||
<nav>
|
||||
<a href="/"> HOME </a>
|
||||
<a href="/example_a"> EXAMPLE A </a>
|
||||
<a href="/example_b"> EXAMPLE B </a>
|
||||
</nav>
|
||||
<main>
|
|
@ -0,0 +1,44 @@
|
|||
</main>
|
||||
<dialog id="show-img"></dialog>
|
||||
<footer>
|
||||
<p>This page uses code from <a href="https://lostcave.ddnss.de/">https://lostcave.ddnss.de</a>.</p>
|
||||
</footer>
|
||||
<script>
|
||||
var dialog_show_img = document.getElementById("show-img");
|
||||
dialog_show_img.addEventListener("click", function(event) {
|
||||
event.target.close();
|
||||
}, false)
|
||||
|
||||
var images = document.getElementsByTagName("img");
|
||||
for (var i=0; i<images.length; i++) {
|
||||
images[i].addEventListener(
|
||||
"click",
|
||||
function(event) {
|
||||
dialog_show_img.innerHTML = event.target.outerHTML;
|
||||
dialog_show_img.appendChild(document.createElement('p')).innerText = event.target.getAttribute("alt");
|
||||
if (event.target.width<300 || event.target.height<300) {
|
||||
width = event.target.width * 2;
|
||||
dialog_show_img.children[0].style = "width: " + width + "px; image-rendering: pixelated;"
|
||||
}
|
||||
dialog_show_img.children[0].addEventListener(
|
||||
"click",
|
||||
function(e){
|
||||
dialog_show_img.close();
|
||||
},
|
||||
false
|
||||
);
|
||||
dialog_show_img.children[1].addEventListener(
|
||||
"click",
|
||||
function(e){
|
||||
dialog_show_img.close();
|
||||
},
|
||||
false
|
||||
);
|
||||
dialog_show_img.showModal();
|
||||
},
|
||||
false
|
||||
);
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
Loading…
Reference in New Issue