hot fix for open graph image rendering
This commit is contained in:
commit
6f2a8cfb4b
6 changed files with 148 additions and 139 deletions
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
# Fipamo means to save
|
# Fipamo means to save
|
||||||
|
|
||||||
The Fipamo project was born from a need for a simple, easy to use no data blog platform that doesn't require much effort to set up and maintain. Fipamo uses Markdown to handle posts and renders them to flat html so you can serve them from anywhere. No complicated set ups. No long list of dependencies. Just write and publish.
|
The Fipamo project was born from a need for a simple, easy to use no data blog platform that doesn't require much effort to set up and maintain. Fipamo uses Markdown to handle posts and renders them to flat html so you can serve them from anywhere. No complicated set ups. No long list of dependencies. Just set up and go.
|
||||||
|
|
||||||
Because nobody has time for all that.
|
Because nobody has time for all that.
|
||||||
|
|
||||||
|
|
|
@ -13,14 +13,15 @@ class MailerAPI
|
||||||
|
|
||||||
public static function handleMail($request, $body, $response)
|
public static function handleMail($request, $body, $response)
|
||||||
{
|
{
|
||||||
//if testing, verify session is active
|
// if testing, verify session is active
|
||||||
if ($body["mail_task"] == "TESTING") {
|
// add clean method for sending programmtic emails
|
||||||
|
if ($body['mail_task'] == 'TESTING') {
|
||||||
if (Session::active()) {
|
if (Session::active()) {
|
||||||
$result = Mailer::sendmail($body);
|
$result = Mailer::sendmail($body);
|
||||||
} else {
|
} else {
|
||||||
$result = [
|
$result = [
|
||||||
"message" => "You need to be logged in for this, champ.",
|
'message' => 'You need to be logged in for this, champ.',
|
||||||
"type" => "MAILER_ERROR",
|
'type' => 'MAILER_ERROR',
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -2,13 +2,11 @@
|
||||||
|
|
||||||
namespace brain\init;
|
namespace brain\init;
|
||||||
|
|
||||||
use Psr\Http\Message\ResponseInterface as Response;
|
use brain\utility\HandleCors;
|
||||||
use Psr\Http\Message\ServerRequestInterface as Request;
|
|
||||||
use Slim\Factory\AppFactory;
|
use Slim\Factory\AppFactory;
|
||||||
use Slim\Views\Twig;
|
use Slim\Views\Twig;
|
||||||
use Slim\Views\TwigMiddleware;
|
|
||||||
// Fipamo Core Classes
|
// Fipamo Core Classes
|
||||||
use brain\utility\HandleCors;
|
use Slim\Views\TwigMiddleware;
|
||||||
|
|
||||||
class App
|
class App
|
||||||
{
|
{
|
||||||
|
@ -18,18 +16,18 @@ class App
|
||||||
// set up cors
|
// set up cors
|
||||||
new HandleCors();
|
new HandleCors();
|
||||||
$app = AppFactory::create();
|
$app = AppFactory::create();
|
||||||
$twig = Twig::create("../brain/views/");
|
$twig = Twig::create('../brain/views/');
|
||||||
$app->add(TwigMiddleware::create($app, $twig));
|
$app->add(TwigMiddleware::create($app, $twig));
|
||||||
//set up routing
|
// set up routing
|
||||||
$app->get(
|
$app->get(
|
||||||
"/[{first}[/{second}[/{third}[/{fourth}[/{fifth}]]]]]",
|
'/[{first}[/{second}[/{third}[/{fourth}[/{fifth}]]]]]',
|
||||||
"brain\controller\RouteControl:get"
|
"brain\controller\RouteControl:get"
|
||||||
);
|
);
|
||||||
$app->post(
|
$app->post(
|
||||||
"/[{first}[/{second}[/{third}[/{fourth}]]]]",
|
'/[{first}[/{second}[/{third}[/{fourth}]]]]',
|
||||||
"brain\controller\RouteControl:post"
|
"brain\controller\RouteControl:post"
|
||||||
);
|
);
|
||||||
//start the app
|
// start the app
|
||||||
|
|
||||||
$app->run();
|
$app->run();
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,34 +2,34 @@
|
||||||
|
|
||||||
namespace brain\utility;
|
namespace brain\utility;
|
||||||
|
|
||||||
use Mni\FrontYAML\Parser;
|
use function _\filter;
|
||||||
|
use function _\find;
|
||||||
use brain\data\Book;
|
use brain\data\Book;
|
||||||
use brain\data\Settings;
|
use brain\data\Settings;
|
||||||
|
use Mni\FrontYAML\Parser;
|
||||||
use function _\find;
|
|
||||||
use function _\filter;
|
|
||||||
|
|
||||||
class Sorting
|
class Sorting
|
||||||
{
|
{
|
||||||
private static $_tags = [];
|
private static $_tags = [];
|
||||||
private static $_archive = [];
|
private static $_archive = [];
|
||||||
|
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
public static function tags()
|
public static function tags()
|
||||||
{
|
{
|
||||||
$pages = (new Book("../content/pages"))->getContents();
|
$pages = (new Book('../content/pages'))->getContents();
|
||||||
foreach ($pages as $page) {
|
foreach ($pages as $page) {
|
||||||
$temp = [];
|
$temp = [];
|
||||||
$temp = explode(",", $page["tags"]);
|
$temp = explode(',', $page['tags']);
|
||||||
foreach ($temp as $tag) {
|
foreach ($temp as $tag) {
|
||||||
$label = trim($tag);
|
$label = trim($tag);
|
||||||
if (!find(self::$_tags, ["tag_name" => $label])) {
|
if (!find(self::$_tags, ['tag_name' => $label])) {
|
||||||
array_push(self::$_tags, [
|
array_push(self::$_tags, [
|
||||||
"tag_name" => $label,
|
'tag_name' => $label,
|
||||||
"slug" => StringTools::safeString($label),
|
'slug' => StringTools::safeString($label),
|
||||||
"pages" => self::tagPages($label, $pages),
|
'pages' => self::tagPages($label, $pages),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -42,12 +42,12 @@ class Sorting
|
||||||
{
|
{
|
||||||
$tagged = [];
|
$tagged = [];
|
||||||
foreach ($pages as $page) {
|
foreach ($pages as $page) {
|
||||||
if (strpos($page["tags"], $tag) !== false) {
|
if (strpos($page['tags'], $tag) !== false) {
|
||||||
array_push($tagged, [
|
array_push($tagged, [
|
||||||
"title" => $page["title"],
|
'title' => $page['title'],
|
||||||
"slug" => $page["slug"],
|
'slug' => $page['slug'],
|
||||||
"path" => $page["path"],
|
'path' => $page['path'],
|
||||||
"feature" => $page["feature"],
|
'feature' => $page['feature'],
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -57,48 +57,49 @@ class Sorting
|
||||||
|
|
||||||
public static function archive()
|
public static function archive()
|
||||||
{
|
{
|
||||||
$pages = (new Book("../content/pages"))->getContents();
|
$pages = (new Book('../content/pages'))->getContents();
|
||||||
$years = [];
|
$years = [];
|
||||||
$archive = [];
|
$archive = [];
|
||||||
foreach ($pages as $page) {
|
foreach ($pages as $page) {
|
||||||
//$year = date("Y", date($page["rawCreated"]));
|
// $year = date("Y", date($page["rawCreated"]));
|
||||||
$date = explode("/", $page["path"]);
|
$date = explode('/', $page['path']);
|
||||||
//echo $page["title"] . " : " . $year . "\n";
|
// echo $page["title"] . " : " . $year . "\n";
|
||||||
if (!find($years, ["year" => trim($date[0])])) {
|
if (!find($years, ['year' => trim($date[0])])) {
|
||||||
$findPages = filter($pages, ["createdYear" => trim($date[0])]);
|
$findPages = filter($pages, ['createdYear' => trim($date[0])]);
|
||||||
//var_dump($findPages);
|
// var_dump($findPages);
|
||||||
array_push($years, [
|
array_push($years, [
|
||||||
"year" => trim($date[0]),
|
'year' => trim($date[0]),
|
||||||
"count" => count($findPages),
|
'count' => count($findPages),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
foreach ($years as $year) {
|
foreach ($years as $year) {
|
||||||
$sorted = [];
|
$sorted = [];
|
||||||
$filtered = filter($pages, ["createdYear" => $year["year"]]);
|
$filtered = filter($pages, ['createdYear' => $year['year']]);
|
||||||
|
|
||||||
foreach ($filtered as $obj) {
|
foreach ($filtered as $obj) {
|
||||||
$month = date("m", date($obj["rawCreated"]));
|
$month = date('m', date($obj['rawCreated']));
|
||||||
if (!find($sorted, ["month" => $month])) {
|
if (!find($sorted, ['month' => $month])) {
|
||||||
$perMonth = filter($pages, [
|
$perMonth = filter($pages, [
|
||||||
"path" => $year["year"] . "/" . $month,
|
'path' => $year['year'].'/'.$month,
|
||||||
"deleted" => false,
|
'deleted' => false,
|
||||||
"published" => true,
|
'published' => true,
|
||||||
"layout" => "page",
|
'layout' => 'page',
|
||||||
]);
|
]);
|
||||||
array_push($sorted, [
|
array_push($sorted, [
|
||||||
"month" => $month,
|
'month' => $month,
|
||||||
"full_month" => date("F", date($obj["rawCreated"])),
|
'full_month' => date('F', date($obj['rawCreated'])),
|
||||||
"count" => count($perMonth),
|
'count' => count($perMonth),
|
||||||
"pages" => $perMonth,
|
'pages' => $perMonth,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
array_push(self::$_archive, [
|
array_push(self::$_archive, [
|
||||||
"year" => $year["year"],
|
'year' => $year['year'],
|
||||||
"year_data" => $sorted,
|
'year_data' => $sorted,
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
return self::$_archive;
|
return self::$_archive;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,78 +110,86 @@ class Sorting
|
||||||
$pageOption = [];
|
$pageOption = [];
|
||||||
|
|
||||||
$pageInfo = [
|
$pageInfo = [
|
||||||
"keywords" => isset($settings["global"]["keywords"])
|
'keywords' => isset($settings['global']['keywords'])
|
||||||
? $settings["global"]["keywords"]
|
? $settings['global']['keywords']
|
||||||
: "fipamo, blog, jamstack, php, markdown, js",
|
: 'fipamo, blog, jamstack, php, markdown, js',
|
||||||
"description" => $settings["global"]["descriptions"],
|
'description' => $settings['global']['descriptions'],
|
||||||
"image" =>
|
'image' => $settings['global']['base_url'].$settings['global']['background'],
|
||||||
$settings["global"]["base_url"] . $settings["global"]["background"],
|
'baseURL' => $settings['global']['base_url'],
|
||||||
"baseURL" => $settings["global"]["base_url"],
|
|
||||||
];
|
];
|
||||||
|
|
||||||
$taglist = explode(",", $page["tags"]);
|
$taglist = explode(',', $page['tags']);
|
||||||
$tags = [];
|
$tags = [];
|
||||||
foreach ($taglist as $tag) {
|
foreach ($taglist as $tag) {
|
||||||
$label = trim($tag);
|
$label = trim($tag);
|
||||||
array_push($tags, [
|
array_push($tags, [
|
||||||
"label" => $label . " ",
|
'label' => $label.' ',
|
||||||
"slug" => StringTools::safeString($label),
|
'slug' => StringTools::safeString($label),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
$meta = [
|
$meta = [
|
||||||
"who" => $page["author"],
|
'who' => $page['author'],
|
||||||
"when" => $page["created"],
|
'when' => $page['created'],
|
||||||
"tags" => $tags,
|
'tags' => $tags,
|
||||||
];
|
];
|
||||||
|
|
||||||
//render markdown content and clean it
|
// render markdown content and clean it
|
||||||
$parser = new Parser();
|
$parser = new Parser();
|
||||||
$rendered = $parser->parse($page["content"]);
|
$rendered = $parser->parse($page['content']);
|
||||||
$sanitizer = \HtmlSanitizer\Sanitizer::create([
|
$sanitizer = \HtmlSanitizer\Sanitizer::create([
|
||||||
"extensions" => ["basic", "image", "list", "code"],
|
'extensions' => ['basic', 'image', 'list', 'code'],
|
||||||
"tags" => [
|
'tags' => [
|
||||||
"img" => [
|
'img' => [
|
||||||
"allowed_attributes" => ["src", "alt", "title", "class"],
|
'allowed_attributes' => ['src', 'alt', 'title', 'class'],
|
||||||
"allowed_hosts" => null,
|
'allowed_hosts' => null,
|
||||||
],
|
],
|
||||||
],
|
],
|
||||||
]);
|
]);
|
||||||
|
|
||||||
$preclean = $sanitizer->sanitize($rendered->getContent());
|
$preclean = $sanitizer->sanitize($rendered->getContent());
|
||||||
|
|
||||||
//just clean renderd string for now, Sanitize doesn't like relative img urls
|
// just clean renderd string for now, Sanitize doesn't like relative img urls
|
||||||
//so another option is needed
|
// so another option is needed
|
||||||
$cleaned = strip_tags($rendered->getContent(), [
|
$cleaned = strip_tags($rendered->getContent(), [
|
||||||
"a",
|
'a',
|
||||||
"br",
|
'br',
|
||||||
"p",
|
'p',
|
||||||
"strong",
|
'strong',
|
||||||
"br",
|
'br',
|
||||||
"img",
|
'img',
|
||||||
"iframe",
|
'iframe',
|
||||||
"ul",
|
'ul',
|
||||||
"li",
|
'li',
|
||||||
"i",
|
'i',
|
||||||
"em",
|
'em',
|
||||||
"h1",
|
'h1',
|
||||||
"h2",
|
'h2',
|
||||||
"h3",
|
'h3',
|
||||||
"pre",
|
'pre',
|
||||||
"code",
|
'code',
|
||||||
]);
|
]);
|
||||||
//$cleaned = preg_replace('/(?:\r\n|[\r\n]){2,}/', "\n\n", $cleaned);
|
|
||||||
//$cleaned = html_entity_decode($cleaned, ENT_QUOTES, "UTF-8");
|
|
||||||
|
|
||||||
//if page feature isn't empty, replace page info meta image
|
// if page feature isn't empty, find image from list and set it as background image
|
||||||
if ($page["feature"] != "" || $page["feature"] != null) {
|
// if it is empty, just use global background
|
||||||
$pageInfo["image"] = $pageInfo["baseURL"] . $page["feature"];
|
if ($page['feature'] != '' || $page['feature'] != null) {
|
||||||
|
$media = explode(',', $page['feature']);
|
||||||
|
$set = false;
|
||||||
|
foreach ($media as $file) {
|
||||||
|
$item = trim($file);
|
||||||
|
$ext = pathinfo($item, PATHINFO_EXTENSION);
|
||||||
|
|
||||||
|
if ($ext != 'mp4' && !$set) {
|
||||||
|
$pageInfo['image'] = $pageInfo['baseURL'].$item;
|
||||||
|
$set = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($page["layout"] == "index") {
|
if ($page['layout'] == 'index') {
|
||||||
//$template = $this->theme . "/index.twig";
|
// $template = $this->theme . "/index.twig";
|
||||||
//$location = "../public/index.html";
|
// $location = "../public/index.html";
|
||||||
//$dir = null;
|
// $dir = null;
|
||||||
|
|
||||||
$recent = [];
|
$recent = [];
|
||||||
$featured = [];
|
$featured = [];
|
||||||
|
@ -188,26 +197,26 @@ class Sorting
|
||||||
$pages = (new Book())->getContents();
|
$pages = (new Book())->getContents();
|
||||||
foreach ($pages as $item) {
|
foreach ($pages as $item) {
|
||||||
if (
|
if (
|
||||||
!$item["deleted"] &&
|
!$item['deleted'] &&
|
||||||
$item["published"] &&
|
$item['published'] &&
|
||||||
$item["menu"] != "true"
|
$item['menu'] != 'true'
|
||||||
) {
|
) {
|
||||||
if (count($recent) < $limit) {
|
if (count($recent) < $limit) {
|
||||||
array_push($recent, [
|
array_push($recent, [
|
||||||
"path" => $item["path"],
|
'path' => $item['path'],
|
||||||
"slug" => $item["slug"],
|
'slug' => $item['slug'],
|
||||||
"title" => $item["title"],
|
'title' => $item['title'],
|
||||||
"feature" => $item["feature"],
|
'feature' => $item['feature'],
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($item["featured"] == true) {
|
if ($item['featured'] == true) {
|
||||||
if (count($featured) < $limit) {
|
if (count($featured) < $limit) {
|
||||||
array_push($featured, [
|
array_push($featured, [
|
||||||
"path" => $item["path"],
|
'path' => $item['path'],
|
||||||
"slug" => $item["slug"],
|
'slug' => $item['slug'],
|
||||||
"title" => $item["title"],
|
'title' => $item['title'],
|
||||||
"feature" => $item["feature"],
|
'feature' => $item['feature'],
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -215,34 +224,35 @@ class Sorting
|
||||||
}
|
}
|
||||||
|
|
||||||
$pageOptions = [
|
$pageOptions = [
|
||||||
"title" => $page["title"],
|
'title' => $page['title'],
|
||||||
"background" => $page["feature"],
|
'background' => $page['feature'],
|
||||||
"content" => $page["html"], //$cleaned,
|
'content' => $page['html'], // $cleaned,
|
||||||
"meta" => $meta,
|
'meta' => $meta,
|
||||||
"recent" => $recent,
|
'recent' => $recent,
|
||||||
"featured" => $featured,
|
'featured' => $featured,
|
||||||
"info" => $pageInfo,
|
'info' => $pageInfo,
|
||||||
"menu" => $settings["menu"],
|
'menu' => $settings['menu'],
|
||||||
"dynamicRender" => $settings["global"]["dynamicRender"],
|
'dynamicRender' => $settings['global']['dynamicRender'],
|
||||||
"media" => $page["media"],
|
'media' => $page['media'],
|
||||||
"files" => $page["docs"],
|
'files' => $page['docs'],
|
||||||
];
|
];
|
||||||
} else {
|
} else {
|
||||||
//$template = $this->theme . "/page.twig";
|
// $template = $this->theme . "/page.twig";
|
||||||
//$location = "../public/" . $page["path"] . "/" . $page["slug"] . ".html";
|
// $location = "../public/" . $page["path"] . "/" . $page["slug"] . ".html";
|
||||||
//$dir = "../public/" . $page["path"];
|
// $dir = "../public/" . $page["path"];
|
||||||
$pageOptions = [
|
$pageOptions = [
|
||||||
"title" => $page["title"],
|
'title' => $page['title'],
|
||||||
"background" => $page["feature"],
|
'background' => $page['feature'],
|
||||||
"content" => $page["html"], //$cleaned,
|
'content' => $page['html'], // $cleaned,
|
||||||
"meta" => $meta,
|
'meta' => $meta,
|
||||||
"info" => $pageInfo,
|
'info' => $pageInfo,
|
||||||
"menu" => $settings["menu"],
|
'menu' => $settings['menu'],
|
||||||
"dynamicRender" => $settings["global"]["dynamicRender"],
|
'dynamicRender' => $settings['global']['dynamicRender'],
|
||||||
"media" => $page["media"],
|
'media' => $page['media'],
|
||||||
"files" => $page["docs"],
|
'files' => $page['docs'],
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
return $pageOptions;
|
return $pageOptions;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,9 +10,9 @@
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"autoload": {
|
"autoload": {
|
||||||
"psr-4": {
|
"psr-4": {
|
||||||
"brain\\":"brain"
|
"brain\\": "brain"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"support": {
|
"support": {
|
||||||
"source": "https://code.playvicio.us/Are0h/Fipamo",
|
"source": "https://code.playvicio.us/Are0h/Fipamo",
|
||||||
|
@ -34,4 +34,4 @@
|
||||||
"symfony/yaml": "^5.4",
|
"symfony/yaml": "^5.4",
|
||||||
"olegatro/html-sanitizer-relative": "^1.0"
|
"olegatro/html-sanitizer-relative": "^1.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -1,7 +1,7 @@
|
||||||
<?php
|
<?php
|
||||||
|
|
||||||
require "../vendor/autoload.php";
|
require '../vendor/autoload.php';
|
||||||
|
|
||||||
use brain\init\App as App;
|
use brain\init\App;
|
||||||
|
|
||||||
new App();
|
new App();
|
||||||
|
|
Loading…
Reference in a new issue