Browse Source

Move site specificities to their respective directory

pull/5/head
Miraty 3 months ago
parent
commit
af34f93f38
  1. 3
      .gitignore
  2. 25
      README.md
  3. 40
      antopie/end.inc.html
  4. 6
      antopie/head.inc.html
  5. 0
      antopie/img/logo.webp
  6. 2
      antopie/manifeste-sur-le-contenu.md
  7. 143
      antopie/style.less
  8. 138
      compil.php
  9. 52
      inc/debut.php
  10. 53
      inc/footer.php
  11. 147
      style.less

3
.gitignore

@ -3,4 +3,7 @@ temp/*
mdp.php
antopie/css
antopie/*.html
!antopie/*.inc.html
/docs
/miraty
.directory

25
README.md

@ -4,25 +4,14 @@ Ceci est le code source du générateur de sites statiques qui créé le [site w
# Utilisation
Placer les pages dans `<site>/md/<page>.md`. Le format est principalement du Markdown Extra mais il est aussi possible de rajouter de l'HTML et du PHP. Elles sont ensuite transformées par `compil.php` en pages HTML statiques, placées dans `<site>/<page>.html`
`compil.php <chemin du site> <destination> <nom du site>`
`compil.php <site> <destination>`
Avec `site` qui est le dossier contenant le site et pour `destination` :
Avec `destination` :
* Pour déployer en DNS en liant vers `page`, utiliser `dns`.
* Pour déployer en Onion en liant vert `page`, utiliser `onion`.
* Pour déployer en DNS en liant vert `page.html`, ignorer ce dernier argument.
Les droits d'écriture sont requis sur `<site>/css` et `temp/` par l'user qui exécute PHP.
`compil.php` va chercher à utiliser [static-compress](https://github.com/neosmart/static-compress) dans `/usr/local/bin/static-compress` pour compresser les fichiers CSS et HTML créés.
* Pour déployer en DNS en liant vert `page.html`, utiliser `local`.
```
$ cargo install static-compress
$ sudo mv ~/.cargo/bin/static-compress /usr/local/bin/
```
Exemple de commande pour tester le développement en local après avoir modifié le site : `php compil.php antopie local && python3 -m http.server -b 127.0.0.1 -d antopie`
Exemple pour le site d'Antopie : `compil.php antopie local Antopie`
# Bibliothèques utilisées
@ -33,12 +22,6 @@ Le dossier `bibli` contient les dépendances incluses dans le générateur de si
| less.php | Compilateur Less en PHP | https://github.com/wikimedia/less.php |
| parsedown | Compilateur Markdown en PHP | https://parsedown.org |
Il y a aussi une dépendance spécifique au site d'Antopie :
| Nom | Description | Source |
| --------- | ------------------- | ---------------------------------------- |
| fontello | Pack d'icônes | http://fontello.com |
# Licence
Le générateur de sites web d'Antopie est un logiciel libre ; vous pouvez le diffuser et le modifier suivant les termes de la GNU Affero General Public License telle que publiée par la Free Software Foundation ; soit la version 3 de cette licence, soit (à votre convenance) une version ultérieure.

40
antopie/end.inc.html

@ -0,0 +1,40 @@
<footer class="antopie">
<div class="liensfooter centre">
<div class="lienfooter">
<a href="<?php formerUrlLocale("contact"); ?>" class="bouton">
Me contacter
</a>
</div>
<?php if (DESTINATION === "onion") { ?>
<div class="lienfooter">
<a href="https://antopie.org/<?= $pathParts['filename'] ?>" class="bouton">
Accès <abbr title="Domain Name System">DNS</abbr>
</a>
</div>
<?php } else { ?>
<div class="lienfooter">
<a href="http://antopieee25qeh4bvllwomq5pzrjmpvldbn2b653okyopkq5h7f7ilad.onion/<?= $pathParts['filename'] ?>" class="bouton">
Accès Onion
</a>
</div>
<?php } ?>
</div>
<div class="interlude">
<div class="traitinterlude">
<hr>
</div>
</div>
<div class="textefooter">
Services auto-hébergés avec datalove à Paris.
<br>
Le <a href="<?php echo clearnetOrOnion("https://code.antopie.org", "http://antcode5h4tntfei362x7eydifyxdjskjisv5pezk2othlh7oho2zhyd.onion"); ?>/miraty/web">code source de ce site</a> est publié sous <abbr title="GNU Affero General Public License version 3 ou toute version ultérieure"><a href="LICENSE.html">AGPLv3</a>+</abbr>.
<br>
Kopimi · <a href="<?= $pathParts['filename'] ?>.md">Document source</a>
</div>
</footer>

6
antopie/head.inc.html

@ -0,0 +1,6 @@
<link rel="icon" type="image/webp" href="img/icons/16.webp" sizes="16x16">
<link rel="icon" type="image/webp" href="img/icons/32.webp" sizes="32x32">
<link rel="icon" type="image/webp" href="img/icons/64.webp" sizes="64x64">
<link rel="icon" type="image/webp" href="img/icons/128.webp" sizes="128x128">
<link rel="icon" type="image/webp" href="img/icons/256.webp" sizes="256x256">
<link rel="icon" type="image/webp" href="img/icons/512.webp" sizes="512x512">

0
antopie/img/antopiev5-500.webp → antopie/img/logo.webp

Before

Width:  |  Height:  |  Size: 4.1 KiB

After

Width:  |  Height:  |  Size: 4.1 KiB

2
antopie/manifeste-sur-le-contenu.md

@ -2,7 +2,7 @@
Antopie est hostile à la propagation de contenus droitistes, et est susceptible d'appliquer une modération en conséquence.
Le terme droitiste peut par exemple comprendre *essentialiste*, *spéciste*, *genriste*, *raciste*, *nationaliste*, *autoritariste*, *capitaliste*, *propriétariste*, *productiviste*, *capacitiste*, *socio-normativiste*, *théiste*, *spiritualiste* ou *conspirationniste*.
Le terme droitiste peut par exemple comprendre *essentialiste*, *spéciste*, *socionormativiste*, *genriste*, *masculiniste*, *hétérosexualiste*, *raciste*, *nationaliste*, *autoritariste*, *capitaliste*, *propriétariste*, *productiviste*, *théiste*, *spiritualiste* ou *conspirationniste*.
Ceci a été exprimé plus dans le but de guider les personnes dans leur choix de service avant leur établissement sur Antopie que de limiter l'expression des personnes qui sont déjà dessus. Aussi, si vous êtes d'accord avec ce qui est dit dans ce manifeste, vous ne devriez pas avoir besoin de vérifier la compatibilité de tout ce que vous dites avec. La modération sur Antopie est faite avec bienveillance et est ouverte à discussion. L'immense majorité des contenus retirés d'Antopie sont du spam ou sont publiés par des personnes n'ayant pas lu ce manifeste.

143
antopie/style.less

@ -0,0 +1,143 @@
.action::before {
content: "➡ ";
}
.grid {
display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr;
grid-gap: 30px;
@media (min-width: 2500px) {
grid-template-columns: 1fr 1fr 1fr 1fr 1fr;
}
@media (min-width: 3000px) {
grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr;
}
@media (max-width: 1500px) {
grid-template-columns: 1fr 1fr 1fr;
}
@media (max-width: 1000px) {
grid-template-columns: 1fr 1fr;
}
@media (max-width: 600px) {
grid-template-columns: 1fr;
}
}
.metaService {
margin: 6px;
margin-bottom: 0px;
}
.metasService {
display: flex;
flex-direction: row;
justify-content: center;
font-size: 0.7em;
}
.logoService {
text-align: center;
}
.elLogoServ {
max-width: 150px;
max-height: 100px;
}
.descService {
padding-top: 5px;
padding-bottom: 10px;
text-align: left;
}
.domService {
font-family: monospace;
overflow-wrap: anywhere;
margin-top: -6px;
font-size: 0.8em;
@media @light {
color: @darkerColor;
}
@media @dark {
color: @lightlessColor;
}
}
#lienHeader {
margin: 0px;
padding: 30px;
padding-bottom: 20px;
margin-left: 35px;
margin-right: 35px;
@media (max-width: 600px) {
padding: 0px;
margin-top: 20px;
margin-left: 20px;
margin-right: 20px;
}
}
footer.antopie {
display: flex;
flex-direction: column;
}
.logofooter {
padding-left: 6%;
margin-top: 20px;
text-align: center;
}
.interlude {
display: flex;
justify-content: center;
}
.traitinterlude > hr {
display: none;
}
.traitinterlude {
border-top: 2px gray dashed;
width: 450px;
}
.liensfooter {
display: flex;
flex-direction: row;
padding: 20px;
}
.lienfooter {
margin: 10px;
}
h1.titreService {
font-size: 1.3em;
text-align: center;
margin: 0px;
padding-bottom: 0px;
padding-top: 0px;
}
@media (max-width: 800px) {
.basfooter {
flex-direction: column;
}
.logofooter {
padding: 0px;
}
}

138
compil.php

@ -1,20 +1,48 @@
#!/usr/bin/php
<?php
if (php_sapi_name() === "cli") {
define("SITE", $argv[1]);
if (php_sapi_name() !== "cli")
exit("Must be run from CLI");
define("FIND", "/usr/bin/find");
define("GZIP", "/usr/bin/gzip");
define("ROOT", dirname($_SERVER['SCRIPT_FILENAME']));
define("SITE", $argv[1]);
if (isset($argv[2]))
define("DESTINATION", $argv[2]);
else
define("DESTINATION", "local");
if (isset($argv[3]))
define("SITE_TITLE", $argv[3]);
else
define("SITE_TITLE", SITE);
require ROOT . "/bibli/parsedown/Parsedown.php";
require ROOT . "/bibli/parsedown-extra/ParsedownExtra.php";
// Less > CSS
require ROOT . "/bibli/less.php/lib/Less/Autoloader.php";
Less_Autoloader::register();
$options = array('cache_dir' => SITE . '/css', 'compress' => true);
if (file_exists(SITE . "/style.less"))
$lessFiles = array(ROOT . '/style.less' => '', SITE . '/style.less' => '');
else
$lessFiles = array(ROOT . '/style.less' => '');
require "bibli/parsedown/Parsedown.php";
require "bibli/parsedown-extra/ParsedownExtra.php";
define("CSS_FILENAME", Less_Cache::Get($lessFiles, $options));
exec("/usr/bin/find " . SITE . " -name '*.gmi' -o -name '*.md'", $pages);
exec(FIND . " " . SITE . " -name '*.gmi' -o -name '*.md'", $pages);
require "inc/url.php";
require "inc/url.php";
foreach ($pages as $page) {
foreach ($pages as $page) {
$pathParts = pathinfo($page);
$pathParts = pathinfo($page);
// Convert Gemtext to Markdown
// Convert Gemtext to Markdown
if ($pathParts['extension'] === "gmi") {
$gmilines = explode("\n", file_get_contents($page));
if (substr($gmilines[0], 0, 2) === "# ")
@ -26,9 +54,18 @@ if (php_sapi_name() === "cli") {
if (substr($line, 0, 2) === "=>") {
preg_match("/=> +(.[^ ]+)/", $line, $lnUrl);
preg_match("/=> +.[^ ]+ +(.+)/", $line, $lnTitle);
// Escape Markdown special characters
$mdSpecial = array("[", "]", "(", ")");
$htmlEntities = array("&#91;", "&#93;", "&#40;", "&#41;");
$lnUrl[1] = str_replace($mdSpecial, $htmlEntities, $lnUrl[1]);
$urlPathParts = pathinfo(parse_url($lnUrl[1], PHP_URL_PATH));
// .gmi > .md for local links
if (!str_contains($lnUrl[1], ":") AND $urlPathParts['extension'] === "gmi") // If it's a local link
$lnUrl[1] = $urlPathParts['dirname'] . "/" . $urlPathParts['filename'] . ".md";
if (isset($lnTitle[1])) {
$lnTitle[1] = str_replace($mdSpecial, $htmlEntities, $lnTitle[1]);
$gmilines[$key] = "[" . $lnTitle[1] . "](" . $lnUrl[1] . ")";
@ -41,47 +78,52 @@ if (php_sapi_name() === "cli") {
foreach ($gmilines as $line) {
$code = $code . "\n" . $line;
}
file_put_contents($pathParts['dirname'] . "/" . $pathParts['filename'] . ".md", $code);
}
// Execute PHP code
ob_start();
eval("?>" . file_get_contents($pathParts['dirname'] . "/" . $pathParts['filename'] . ".md"));
$pageContent = ob_get_contents();
ob_end_clean();
// Compile Markdown to HTML with Parsedown
$Parsedown = new ParsedownExtra;
$Parsedown = $Parsedown->setUrlsLinked(false);
$Parsedown = $Parsedown->setMarkupEscaped(false);
$Parsedown = $Parsedown->setBreaksEnabled(true);
$pageContent = $Parsedown->text($pageContent);
// .md > .html for local links
$pageContent = preg_replace('#<a href="(?!.*:)(.*)\.md">#', '<a href="$1.html">', $pageContent);
// pages/exemple.md > temp/exemple.temp
// Exécute le PHP vers du HTML
ob_start();
eval("?>" . $code);
$contenuPage = ob_get_contents();
ob_end_clean();
// temp/exemple.temp > temp2/exemple.temp2
// Compile le Markdown vers du HTML
$Parsedown = new ParsedownExtra;
$Parsedown = $Parsedown->setUrlsLinked(false);
$Parsedown = $Parsedown->setMarkupEscaped(false);
$Parsedown = $Parsedown->setBreaksEnabled(true);
$contenuPage = $Parsedown->text($contenuPage);
// temp2/exemple.temp2 > exemple.html
// Ajoute header et footer au HTML
ob_start();
require "inc/debut.php";
if ($pathParts['filename'] === "index") {
echo "<div class='centre'>";
} else {
echo "<article>";
}
echo $contenuPage;
if ($pathParts['filename'] === "index") {
echo "</div>";
} else {
echo "</article>";
}
require "inc/footer.php";
file_put_contents($pathParts['dirname'] . "/" . $pathParts['filename'] . ".html", ob_get_contents());
ob_end_clean();
// Add header and footer to HTML
ob_start();
require "inc/debut.php";
if ($pathParts['filename'] === "index") {
echo "<div class='centre'>";
} else {
echo "<article>";
}
echo $pageContent;
if ($pathParts['filename'] === "index") {
echo "</div>";
} else {
echo "</article>";
}
require "inc/footer.php";
file_put_contents($pathParts['dirname'] . "/" . $pathParts['filename'] . ".html", ob_get_contents());
ob_end_clean();
// exemple.html > exemple.html.gz
// Compresse les fichiers textes statiques HTML & CSS
exec('/usr/local/bin/static-compress -c zopfli "' . SITE . '/*.html" "' . SITE . '/*.js" "' . SITE . '/css/*.css"');
} else {
exit("Must be run from CLI");
// Gzip compression
exec(GZIP . " --keep --fast --force " . $pathParts['dirname'] . "/" . $pathParts['filename'] . ".html");
}
exec(GZIP . " --keep --fast --force " . SITE . "/css/" . CSS_FILENAME);

52
inc/debut.php

@ -3,59 +3,33 @@
<head>
<meta charset="UTF-8">
<title><?php
if (!is_null($title))
echo $title . " · Antopie";
if (isset($title) AND !is_null($title))
echo $title . " · " . SITE_TITLE;
else
echo "Antopie";
echo SITE_TITLE;
?></title>
<meta name="distribution" content="global">
<meta name="robots" content="index, follow">
<meta name="viewport" content="width=device-width, initial-scale=1">
<link type="text/css" rel="stylesheet" href="/css/<?= CSS_FILENAME ?>">
<?php
require_once 'bibli/less.php/lib/Less/Autoloader.php';
Less_Autoloader::register();
$options = array('cache_dir' => SITE . '/css', 'compress' => true);
$lessFiles = array('style.less' => '');
$cssFileName = Less_Cache::Get($lessFiles, $options);
if (file_exists(SITE . "/head.inc.html"))
echo file_get_contents(SITE . "/head.inc.html");
?>
<link type="text/css" rel="stylesheet" href="css/<?= $cssFileName ?>">
<?php if (SITE == "antopie") { ?>
<link rel="icon" type="image/webp" href="img/icons/16.webp" sizes="16x16">
<link rel="icon" type="image/webp" href="img/icons/32.webp" sizes="32x32">
<link rel="icon" type="image/webp" href="img/icons/64.webp" sizes="64x64">
<link rel="icon" type="image/webp" href="img/icons/128.webp" sizes="128x128">
<link rel="icon" type="image/webp" href="img/icons/256.webp" sizes="256x256">
<link rel="icon" type="image/webp" href="img/icons/512.webp" sizes="512x512">
<?php } ?>
</head>
<body>
<header>
<?php
if (SITE === "antopie") {
?>
<a id="lienHeader" href=".">
<a id="lienHeader" href="/">
<div class="logo">
<img src="img/antopiev5-500.webp" width="500" height="94" alt="Antopie" />
<?php
if (file_exists(SITE . "/img/logo.webp"))
echo '<img src="img/logo.webp" ' . getimagesize(SITE . "/img/logo.webp")[3] . ' alt="' . SITE_TITLE . '" />';
else
echo SITE_TITLE;
?>
</div>
</a>
<?php
} else {
?>
<a id="lienHeader" href=".">
<div class="logo"><?= SITE ?></div>
</a>
<?php
}
?>
</header>
<main>

53
inc/footer.php

@ -1,55 +1,10 @@
</main>
<?php if (SITE === "antopie") { ?>
<footer class="antopie">
<div class="liensfooter centre">
<div class="lienfooter">
<a href="<?php formerUrlLocale("contact"); ?>" class="bouton">
Me contacter
</a>
</div>
<?php if (DESTINATION === "onion") { ?>
<?php
if (file_exists(SITE . "/end.inc.html"))
require SITE . "/end.inc.html";
?>
<div class="lienfooter">
<a href="https://antopie.org/<?= $pathParts['filename'] ?>" class="bouton">
Accès <abbr title="Domain Name System">DNS</abbr>
</a>
</div>
<?php } else { ?>
<div class="lienfooter">
<a href="http://antopieee25qeh4bvllwomq5pzrjmpvldbn2b653okyopkq5h7f7ilad.onion/<?= $pathParts['filename'] ?>" class="bouton">
Accès Onion
</a>
</div>
<?php } ?>
</div>
<div class="interlude">
<div class="traitinterlude">
<hr>
</div>
</div>
<div class="textefooter">
Services auto-hébergés avec datalove à Paris.
<br>
Le <a href="<?php echo clearnetOrOnion("https://code.antopie.org", "http://antcode5h4tntfei362x7eydifyxdjskjisv5pezk2othlh7oho2zhyd.onion"); ?>/miraty/web">code source de ce site</a> est publié sous <abbr title="GNU Affero General Public License version 3 ou toute version ultérieure"><a href="LICENSE.html">AGPLv3</a>+</abbr>.
<br>
Kopimi · <a href="<?= $pathParts['filename'] ?>.md">Document source</a>
</div>
</footer>
<?php } else if (SITE === "docs") { ?>
<footer>
Site créé avec Base Antopie
<br>
Documentation sous <abbr title="Creative Commons Attribution et Partage dans les mêmes conditions">CC BY-SA</abbr>.
<br>
<a href="<?= $pathParts['filename'] ?>.md">Source du contenu</a> | Kopimi
</footer>
<?php } ?>
</body>
</html>

147
style.less

@ -174,7 +174,7 @@ strong {
pre, code, var, samp {
font-family: monospace;
overflow: scroll;
overflow: scroll;
padding: 5px;
border-radius: 10px;
font-style: normal;
@ -216,77 +216,6 @@ p {
padding-bottom: 10px;
}
.action::before {
content: "➡ ";
}
.grid {
display: grid;
grid-template-columns: 1fr 1fr 1fr 1fr;
grid-gap: 30px;
@media (min-width: 2500px) {
grid-template-columns: 1fr 1fr 1fr 1fr 1fr;
}
@media (min-width: 3000px) {
grid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr;
}
@media (max-width: 1500px) {
grid-template-columns: 1fr 1fr 1fr;
}
@media (max-width: 1000px) {
grid-template-columns: 1fr 1fr;
}
@media (max-width: 600px) {
grid-template-columns: 1fr;
}
}
.metaService {
margin: 6px;
margin-bottom: 0px;
}
.metasService {
display: flex;
flex-direction: row;
justify-content: center;
font-size: 0.7em;
}
.logoService {
text-align: center;
}
.elLogoServ {
max-width: 150px;
max-height: 100px;
}
.descService {
padding-top: 5px;
padding-bottom: 10px;
text-align: left;
}
.domService {
font-family: monospace;
overflow-wrap: anywhere;
margin-top: -6px;
font-size: 0.8em;
@media @light {
color: @darkerColor;
}
@media @dark {
color: @lightlessColor;
}
}
.centre {
text-align: center;
justify-content: center;
@ -315,75 +244,23 @@ article {
text-align: center;
}
.interlude {
display: flex;
justify-content: center;
}
.traitinterlude > hr {
display: none;
}
.traitinterlude {
border-top: 2px gray dashed;
width: 450px;
}
footer {
text-align: center;
}
footer.antopie {
display: flex;
flex-direction: column;
}
.logofooter {
padding-left: 6%;
margin-top: 20px;
text-align: center;
}
.liensfooter {
display: flex;
flex-direction: row;
padding: 20px;
}
.lienfooter {
margin: 10px;
}
/* ----------------------- HEADER ------------------------ */
#lienHeader {
margin: 0px;
padding: 30px;
padding-bottom: 20px;
margin-left: 35px;
margin-right: 35px;
@media (max-width: 600px) {
padding: 0px;
margin-top: 20px;
margin-left: 20px;
margin-right: 20px;
}
}
header {
display: flex;
justify-content: center;
}
// ----- TITRES -----
// ----- TITLES -----
h1, h2, h3, h4, h5, h6 {
font-weight: normal;
line-height: 100%;
}
h1:not(.titreService) {
h1 {
font-size: 250%;
text-align: center;
margin: 0px;
@ -391,12 +268,6 @@ h1:not(.titreService) {
padding-top: 15px;
}
h1.titreService {
font-size: 1.3em;
text-align: center;
margin: 0px;
}
h2 {
font-size: 200%;
margin-top: 50px;
@ -422,15 +293,3 @@ h5 {
h6 {
font-size: 107%;
}
@media (max-width: 800px) {
.basfooter {
flex-direction: column;
}
.logofooter {
padding: 0px;
}
}