diff --git a/README.md b/README.md index 360aae8..19acef5 100755 --- a/README.md +++ b/README.md @@ -4,7 +4,7 @@ mkht.php is a PHP script for building Gemini, Markdown and HTML/CSS sites from s Place your pages tree in `/src/*/*.(gmi|md)`. -Optionnal files: +Optional files: * `/config.ini` * `/style.less` * `/logo.png` diff --git a/mkht.php b/mkht.php index 5405ac7..3684c24 100755 --- a/mkht.php +++ b/mkht.php @@ -1,7 +1,7 @@ #!/usr/bin/php CSS // Create CSS output directory if needed if (!file_exists(SITE . "/css")) - mkdir(SITE . "/css", 0755); + mkdir(SITE . "/css", 0755); require ROOT . "/less.php/lib/Less/Autoloader.php"; Less_Autoloader::register(); $colorScheme = array( - "darkColor" => "black", - "lightColor" => "white", - "mainColor" => "red", + "darkColor" => "black", + "lightColor" => "white", + "mainColor" => "red", ); $options = array( - 'cache_dir' => SITE . '/css', - 'compress' => true, + 'cache_dir' => SITE . '/css', + 'compress' => true, ); if (file_exists(SITE . "/style.less")) - $lessFiles = array(ROOT . '/style.less' => '', SITE . '/style.less' => ''); + $lessFiles = array(ROOT . '/style.less' => '', SITE . '/style.less' => ''); else - $lessFiles = array(ROOT . '/style.less' => ''); + $lessFiles = array(ROOT . '/style.less' => ''); define("CSS_FILENAME", Less_Cache::Get($lessFiles, $options, $colorScheme)); // URLs don't end with .html on the Antopie website function formerUrlLocale($page) { - if (DESTINATION === "dns" OR DESTINATION === "onion") { - echo $page; - } else { - echo $page . ".html"; - } + if (DESTINATION === "dns" OR DESTINATION === "onion") { + echo $page; + } else { + echo $page . ".html"; + } } // Determine whether links need to use Onion or DNS function clearnetOrOnion($clearnetUrl, $onionUrl) { - if (DESTINATION === "onion") { - return $onionUrl; - } else { - return $clearnetUrl; - } + if (DESTINATION === "onion") { + return $onionUrl; + } else { + return $clearnetUrl; + } } exec(FIND . " " . SITE . "/src -name '*.gmi' -o -name '*.md'", $pages); foreach ($pages as $page) { - $pathParts = pathinfo(str_replace("/src", "", $page)); + $pathParts = pathinfo(str_replace("/src", "", $page)); - // Create parent directory if needed - if (!file_exists($pathParts['dirname'])) - mkdir($pathParts['dirname'], 0755, true); + // Create parent directory if needed + if (!file_exists($pathParts['dirname'])) + mkdir($pathParts['dirname'], 0755, true); - // Execute PHP code - ob_start(); - eval("?>" . file_get_contents($page)); - file_put_contents($pathParts['dirname'] . "/" . $pathParts['basename'], ob_get_contents()); - ob_end_clean(); + // Execute PHP code + ob_start(); + eval("?>" . file_get_contents($page)); + file_put_contents($pathParts['dirname'] . "/" . $pathParts['basename'], ob_get_contents()); + ob_end_clean(); - // Convert Gemtext to Markdown - if ($pathParts['extension'] === "gmi") { - $gmilines = explode("\n", file_get_contents($pathParts['dirname'] . "/" . $pathParts['basename'])); + // Convert Gemtext to Markdown + if ($pathParts['extension'] === "gmi") { + $gmilines = explode("\n", file_get_contents($pathParts['dirname'] . "/" . $pathParts['basename'])); - foreach ($gmilines as $key => $line) { - if (substr($line, 0, 2) === "=>") { - preg_match("/=> +(.[^ ]+)/", $line, $lnUrl); - preg_match("/=> +.[^ ]+ +(.+)/", $line, $lnTitle); + foreach ($gmilines as $key => $line) { + if (substr($line, 0, 2) === "=>") { + preg_match("/=> +(.[^ ]+)/", $line, $lnUrl); + preg_match("/=> +.[^ ]+ +(.+)/", $line, $lnTitle); - $urlPathParts = pathinfo(parse_url($lnUrl[1], PHP_URL_PATH)); + $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"; + // .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])) { - $gmilines[$key] = "[" . $lnTitle[1] . "](" . $lnUrl[1] . ")"; - } else { - $gmilines[$key] = "[" . $lnUrl[1] . "](" . $lnUrl[1] . ")"; - } - } - } - $code = ""; - foreach ($gmilines as $line) { - $code = $code . "\n" . $line; - } - file_put_contents($pathParts['dirname'] . "/" . $pathParts['filename'] . ".md", $code); - } + if (isset($lnTitle[1])) { + $gmilines[$key] = "[" . $lnTitle[1] . "](" . $lnUrl[1] . ")"; + } else { + $gmilines[$key] = "[" . $lnUrl[1] . "](" . $lnUrl[1] . ")"; + } + } + } + $code = ""; + foreach ($gmilines as $line) { + $code = $code . "\n" . $line; + } + file_put_contents($pathParts['dirname'] . "/" . $pathParts['filename'] . ".md", $code); + } - // Compile Markdown to HTML with Parsedown - $markdown = file_get_contents($pathParts['dirname'] . "/" . $pathParts['filename'] . ".md"); - if (preg_match("/# (.*)\\n/", $markdown, $matches)) // If a main heading is found - $title = $matches[1]; // Then it will be the HTML page - else - $title = NULL; - require_once ROOT . "/parsedown/Parsedown.php"; - require_once ROOT . "/parsedown-extra/ParsedownExtra.php"; - $Parsedown = new ParsedownExtra; - $Parsedown = $Parsedown->setUrlsLinked(false); - $Parsedown = $Parsedown->setMarkupEscaped(false); - $Parsedown = $Parsedown->setBreaksEnabled(true); - $pageContent = $Parsedown->text($markdown); + // Compile Markdown to HTML with Parsedown + $markdown = file_get_contents($pathParts['dirname'] . "/" . $pathParts['filename'] . ".md"); + if (preg_match("/# (.*)\\n/", $markdown, $matches)) // If a main heading is found + $title = $matches[1]; // Then it will be the HTML page <title> + else + $title = NULL; + require_once ROOT . "/parsedown/Parsedown.php"; + require_once ROOT . "/parsedown-extra/ParsedownExtra.php"; + $Parsedown = new ParsedownExtra; + $Parsedown = $Parsedown->setUrlsLinked(false); + $Parsedown = $Parsedown->setMarkupEscaped(false); + $Parsedown = $Parsedown->setBreaksEnabled(true); + $pageContent = $Parsedown->text($markdown); - // .md > .html for local links - $pageContent = preg_replace('#<a href="(?!.*:)(.*)\.md">#', '<a href="$1.html">', $pageContent); + // .md > .html for local links + $pageContent = preg_replace('#<a href="(?!.*:)(.*)\.md">#', '<a href="$1.html">', $pageContent); - // Add header and footer to HTML + // Add header and footer to HTML - $urlPath = str_replace(SITE, "", $pathParts['dirname']); - $relativePathToRoot = ""; - for ($i = substr_count($urlPath, "/") ; $i > 0 ; $i--) - $relativePathToRoot .= "../"; + $urlPath = str_replace(SITE, "", $pathParts['dirname']); + $relativePathToRoot = ""; + for ($i = substr_count($urlPath, "/") ; $i > 0 ; $i--) + $relativePathToRoot .= "../"; - ob_start(); + ob_start(); - ?> - <!DOCTYPE html> - <html lang="<?php +?> + <!DOCTYPE html> + <html lang="<?php - preg_match("#\.([a-zA-Z-]{2,5})\.#", $pathParts['basename'], $lang); - if (isset($lang[1])) { - echo $lang[1]; - } else { - preg_match("#/([a-z]{2})(/|$)#", $pathParts['dirname'], $lang); - if (isset($lang[1])) - echo $lang[1]; - else - echo $config['defaultLang']; - } + preg_match("#\.([a-zA-Z-]{2,5})\.#", $pathParts['basename'], $lang); + if (isset($lang[1])) { + echo $lang[1]; + } else { + preg_match("#/([a-z]{2})(/|$)#", $pathParts['dirname'], $lang); + if (isset($lang[1])) + echo $lang[1]; + else + echo $config['defaultLang']; + } - ?>"> - <head> - <meta charset="UTF-8"> - <?php - if (isset($title) AND !is_null($title) AND isset($config['siteTitle'])) - echo "<title>" . $title . " · " . $config['siteTitle'] . ""; - else if (isset($title) AND !is_null($title)) - echo "" . $title . ""; - else if (isset($config['siteTitle'])) - echo "" . $config['siteTitle'] . ""; - ?> - - - - - - + ?>"> + + + " . $title . " · " . $config['siteTitle'] . ""; + else if (isset($title) AND !is_null($title)) + echo "" . $title . ""; + else if (isset($config['siteTitle'])) + echo "" . $config['siteTitle'] . ""; + ?> + + + + - -
- - '; - else - echo $config['siteTitle']; - ?> - -
- + if (file_exists(SITE . "/head.inc.html")) + echo file_get_contents(SITE . "/head.inc.html"); +?> + - '; - } else { - echo "
"; - } - echo $pageContent; - if ($config['centerIndex'] AND $pathParts['filename'] === "index") { - echo ""; - } else { - echo "
"; - } - if (file_exists(SITE . "/end.inc.html")) - require SITE . "/end.inc.html"; - echo ""; - file_put_contents($pathParts['dirname'] . "/" . $pathParts['filename'] . ".html", ob_get_contents()); - ob_end_clean(); + + +
+ +'; + else + echo $config['siteTitle']; +?> + +
+' . $pageContent . ""; + else + echo "
" . $pageContent . "
"; + if (file_exists(SITE . "/end.inc.html")) + require SITE . "/end.inc.html"; + echo ""; + + file_put_contents($pathParts['dirname'] . "/" . $pathParts['filename'] . ".html", ob_get_contents()); + ob_end_clean(); + + // Gzip compression + exec(GZIP . " --keep --fast --force " . $pathParts['dirname'] . "/" . $pathParts['filename'] . ".html"); } exec(GZIP . " --keep --fast --force " . SITE . "/css/" . CSS_FILENAME); diff --git a/style.less b/style.less index e48b11c..a899a91 100755 --- a/style.less +++ b/style.less @@ -3,85 +3,85 @@ @smallWidthScreen: ~"(max-width: 420px)"; ::selection { - @media @light { - color: @lightColor; - background-color: @darkColor; - } - @media @dark { - color: @darkColor; - background-color: @lightColor; - } + @media @light { + color: @lightColor; + background-color: @darkColor; + } + @media @dark { + color: @darkColor; + background-color: @lightColor; + } } * { - padding: 0px; - margin: 0px; + padding: 0px; + margin: 0px; - @media @light { - scrollbar-color: @darkColor @lightColor; - } + @media @light { + scrollbar-color: @darkColor @lightColor; + } - @media @dark { - scrollbar-color: @lightColor @darkColor; - } + @media @dark { + scrollbar-color: @lightColor @darkColor; + } } body { - font-family: system-ui, sans-serif; - font-size: 30px; - line-height: 42px; - margin: 20px; + font-family: system-ui, sans-serif; + font-size: 30px; + line-height: 42px; + margin: 20px; - @media @light { - background-color: @lightColor; - color: @darkColor; - } + @media @light { + background-color: @lightColor; + color: @darkColor; + } - @media @dark { - background-color: @darkColor; - color: @lightColor; - } + @media @dark { + background-color: @darkColor; + color: @lightColor; + } - @media @smallWidthScreen { - font-size: 26px; - line-height: 38px; - } + @media @smallWidthScreen { + font-size: 26px; + line-height: 38px; + } } main { - margin-left: 20%; + margin-left: 20%; margin-right: 20%; - @media (max-width: 1400px) { - margin-left: 10%; - margin-right: 10%; + @media (max-width: 1400px) { + margin-left: 10%; + margin-right: 10%; } @media (max-width: 800px) { - margin-left: 0px; - margin-right: 0px; - padding-left: 0px; + margin-left: 0px; + margin-right: 0px; + padding-left: 0px; padding-right: 0px; } } a, a:visited { text-decoration: underline; - transition-property: color, border-color; - transition-duration: 0.05s; - transition-timing-function: linear; + transition-property: color, border-color; + transition-duration: 0.05s; + transition-timing-function: linear; - @media @light { - background-color: @lightColor; - color: @darkColor; - } + @media @light { + background-color: @lightColor; + color: @darkColor; + } - @media @dark { - background-color: @darkColor; - color: @lightColor; - } + @media @dark { + background-color: @darkColor; + color: @lightColor; + } - &:hover, &:focus { + &:hover, &:focus { text-decoration: none; color: @mainColor; } @@ -89,19 +89,19 @@ a, a:visited { .button { border-width: 2px; - border-style: solid; + border-style: solid; padding: 8px 16px 8px 16px; margin: 5px; display: inline-block; border-radius: 14px; text-decoration: none; - @media @light { - border-color: @darkColor; - } - @media @dark { - border-color: @lightColor; - } + @media @light { + border-color: @darkColor; + } + @media @dark { + border-color: @lightColor; + } &:hover, &:focus { color: @mainColor; @@ -111,9 +111,9 @@ a, a:visited { } .smallButton { - .button(); - font-size: 80%; - padding: 0px 16px 0px 16px; + .button(); + font-size: 80%; + padding: 0px 16px 0px 16px; } img { @@ -125,21 +125,21 @@ img { display: block; margin: auto; margin-top: 20px; - margin-bottom: 20px; + margin-bottom: 20px; } .border { - border-width: 1px; - border-style: solid; + border-width: 1px; + border-style: solid; border-radius: 5px; - @media @light { - border-color: @darkColor; - } + @media @light { + border-color: @darkColor; + } - @media @dark { - border-color: @lightColor; - } + @media @dark { + border-color: @lightColor; + } } strong { @@ -148,14 +148,14 @@ strong { pre, code, var, samp { font-family: monospace; - overflow: auto; + overflow: auto; font-style: normal; - border-radius: 15px; - word-break: break-all; + border-radius: 15px; + word-break: break-all; } abbr[title] { - text-decoration: dotted underline; + text-decoration: dotted underline; } address { @@ -181,8 +181,8 @@ p { } header, footer, .centered { - text-align: center; - justify-content: center; + text-align: center; + justify-content: center; } footer { @@ -201,21 +201,21 @@ h1 { font-size: 70px; text-align: center; padding-top: 15px; - margin-bottom: 20px; + margin-bottom: 20px; - @media @smallWidthScreen { - font-size: 45px; - } + @media @smallWidthScreen { + font-size: 45px; + } } h2 { font-size: 60px; - margin-top: 30px; + margin-top: 30px; margin-bottom: 15px; - @media @smallWidthScreen { - font-size: 40px; - } + @media @smallWidthScreen { + font-size: 40px; + } } h3 { @@ -223,7 +223,7 @@ h3 { margin-top: 30px; margin-bottom: 15px; - @media @smallWidthScreen { - font-size: 35px; - } + @media @smallWidthScreen { + font-size: 35px; + } }