You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
293 lines
7.7 KiB
PHP
293 lines
7.7 KiB
PHP
<?php
|
|
|
|
use Mni\FrontYAML\Parser;
|
|
use function _\orderBy;
|
|
use function _\filter;
|
|
use function _\find;
|
|
|
|
class Book
|
|
{
|
|
public $files = [];
|
|
|
|
public function __construct($folder)
|
|
{
|
|
$this->read($folder);
|
|
}
|
|
public function read($folder)
|
|
{
|
|
$folders = glob("$folder/*", GLOB_ONLYDIR);
|
|
foreach ($folders as $folder) {
|
|
//$this->files[] = $folder . "/";
|
|
$this->read($folder);
|
|
}
|
|
$files = array_filter(glob("$folder/*md"), "is_file");
|
|
foreach ($files as $file) {
|
|
$this->files[] = $file;
|
|
}
|
|
}
|
|
|
|
public function findPageById(string $uuid)
|
|
{
|
|
$content = $this->getContents();
|
|
$page = find($content, ["uuid" => $uuid]);
|
|
return $page;
|
|
}
|
|
|
|
public function editPage($task, $request)
|
|
{
|
|
$content = $this->getContents();
|
|
if ($task == "delete") {
|
|
$parsed = json_decode(file_get_contents("php://input"), true);
|
|
$body = find($content, ["uuid" => $parsed["id"]]);
|
|
} else {
|
|
$body = $request->getParsedBody();
|
|
}
|
|
|
|
$page = find($content, ["uuid" => $body["uuid"]]);
|
|
$image = $request->getUploadedFiles();
|
|
$member = Session::get("member");
|
|
|
|
if ($task != "create") {
|
|
$path =
|
|
date("Y", date($page["rawCreated"])) .
|
|
"/" .
|
|
date("m", date($page["rawCreated"]));
|
|
} else {
|
|
$path = date("Y") . "/" . date("m");
|
|
}
|
|
|
|
if (isset($image["feature_image"])) {
|
|
if ($task != "create") {
|
|
$feature =
|
|
"/assets/images/blog/" .
|
|
$path .
|
|
"/" .
|
|
$image["feature_image"]->getClientFileName();
|
|
} else {
|
|
$feature =
|
|
"/assets/images/blog/" .
|
|
$path .
|
|
"/" .
|
|
$image["feature_image"]->getClientFileName();
|
|
}
|
|
|
|
FileUploader::uploadFile(
|
|
"../public/assets/images/blog/" . $path . "/",
|
|
$image["feature_image"]
|
|
);
|
|
} else {
|
|
if (isset($body["feature_image"])) {
|
|
$url = explode("/", $body["feature_image"]);
|
|
$feature =
|
|
"/" .
|
|
$url[3] .
|
|
"/" .
|
|
$url[4] .
|
|
"/" .
|
|
$url[5] .
|
|
"/" .
|
|
$url[6] .
|
|
"/" .
|
|
$url[7] .
|
|
"/" .
|
|
$url[8];
|
|
} else {
|
|
$task == "create" ? ($feature = "") : ($feature = $body["feature"]);
|
|
}
|
|
}
|
|
|
|
if ($task == "delete") {
|
|
$deleted = "true";
|
|
$body["menu"] ? ($body["menu"] = "true") : ($body["menu"] = "false");
|
|
$body["published"]
|
|
? ($body["published"] = "true")
|
|
: ($body["published"] = "false");
|
|
$body["featured"]
|
|
? ($body["featured"] = "true")
|
|
: ($body["featured"] = "false");
|
|
} else {
|
|
$deleted = isset($page["deleted"]) ? $page["deleted"] : "false";
|
|
}
|
|
|
|
$created =
|
|
$task != "create"
|
|
? new \Moment\Moment($page["rawCreated"])
|
|
: new \Moment\Moment();
|
|
$updated = new \Moment\Moment();
|
|
|
|
//grab current index from settings and update
|
|
$id = $task != "create" ? $body["id"] : Settings::getCurrentIndex();
|
|
$uuid = $task != "create" ? $body["uuid"] : StringTools::createUUID();
|
|
// now that variables are done, set to body object and then convert to markdown to save
|
|
|
|
$body["id"] = $id;
|
|
$body["uuid"] = $uuid;
|
|
$body["feature"] = $feature;
|
|
$body["path"] = $path;
|
|
$body["author"] = $member["handle"];
|
|
$body["created"] = $created->format("Y-m-d\TH:i:sP");
|
|
$body["updated"] = $updated->format("Y-m-d\TH:i:sP");
|
|
$body["deleted"] = $deleted;
|
|
|
|
$write = DocTools::objectToMD($body);
|
|
|
|
// if layout is index, change path to file
|
|
|
|
if ($body["layout"] == "index") {
|
|
$writePath = "../content/pages/start/index.md";
|
|
} else {
|
|
$writePath = "../content/pages/" . $path . "/" . $body["slug"] . ".md";
|
|
}
|
|
|
|
$status = DocTools::writePages($task, $path, $writePath, $write);
|
|
|
|
if ($status) {
|
|
$response = [
|
|
"message" => "File edited. Nice work",
|
|
"type" => $task == "write" ? "postUpdated" : "postAdded",
|
|
"id" => $uuid,
|
|
];
|
|
|
|
//TODO: When form submission is successful, make new form token
|
|
$form_token = md5(uniqid(microtime(), true));
|
|
Session::set("form_token", $form_token);
|
|
|
|
//once saved, update menu
|
|
$body["path"] = $path;
|
|
Settings::updateMenu($body);
|
|
Settings::updateTags();
|
|
//if new page added, update current index in Settings file
|
|
if ($task == "create") {
|
|
Settings::updateIndex();
|
|
}
|
|
} else {
|
|
$response = [
|
|
"message" => "Uh oh. File save problem. Don't panic",
|
|
"type" => "postError",
|
|
"id" => $uuid,
|
|
];
|
|
}
|
|
|
|
return $response;
|
|
}
|
|
|
|
public function getPages(int $page, int $limit, string $sort = null)
|
|
{
|
|
$content = $this->getContents();
|
|
|
|
$published = filter($content, function ($item) {
|
|
return $item["published"] == true && $item["deleted"] == false;
|
|
});
|
|
$deleted = filter($content, function ($item) {
|
|
return $item["deleted"] == true;
|
|
});
|
|
|
|
$all = $content;
|
|
$filter = isset($sort) ? $sort : "all";
|
|
switch ($filter) {
|
|
case "published":
|
|
$filtered = $published;
|
|
break;
|
|
case "deleted":
|
|
$filtered = $deleted;
|
|
break;
|
|
default:
|
|
$filtered = $content;
|
|
break;
|
|
}
|
|
$numOfPages = ceil(count($filtered) / ($limit + 1));
|
|
$folder = [];
|
|
|
|
if (count($filtered) != 0) {
|
|
if (count($filtered) < $limit) {
|
|
$limit = count($filtered) - 1;
|
|
}
|
|
$range = $page * $limit - $limit;
|
|
|
|
if ($range != 0) {
|
|
$range = $range + 1;
|
|
}
|
|
for ($i = 0; $i <= $limit; $i++) {
|
|
if (isset($filtered[$i + $range])) {
|
|
array_push($folder, $filtered[$i + $range]);
|
|
} else {
|
|
//chill out
|
|
}
|
|
}
|
|
}
|
|
|
|
$prev = $page - 1;
|
|
if ($prev <= 0) {
|
|
$prev = $numOfPages;
|
|
}
|
|
|
|
$next = $page + 1;
|
|
if ($next > $numOfPages) {
|
|
$next = 1;
|
|
}
|
|
|
|
return [
|
|
"pages" => $folder,
|
|
"numOfPages" => $numOfPages,
|
|
"entryCount" => count($filtered),
|
|
"paginate" => [
|
|
"sort" => $sort,
|
|
"nextPage" => $next,
|
|
"prevPage" => $prev,
|
|
],
|
|
"stats" => [
|
|
"all" => count($all),
|
|
"published" => count($published),
|
|
"deleted" => count($deleted),
|
|
],
|
|
];
|
|
}
|
|
public function getContents()
|
|
{
|
|
//move page collection to utiltiy class
|
|
$parser = new Parser();
|
|
$contents = [];
|
|
foreach ($this->files as $file) {
|
|
$doc = $parser->parse(file_get_contents($file), false);
|
|
$meta = $doc->getYAML();
|
|
$page = [
|
|
"id" => $meta["id"],
|
|
"uuid" => $meta["uuid"],
|
|
"title" => $meta["title"],
|
|
"feature" => $meta["feature"],
|
|
"path" => $meta["path"],
|
|
"layout" => $meta["layout"],
|
|
"tags" => $meta["tags"],
|
|
"author" => $meta["author"],
|
|
"created" => date("Y M D d", $meta["created"]),
|
|
"updated" => date("Y M D d", $meta["updated"]),
|
|
"rawCreated" => $meta["created"],
|
|
"rawUpdated" => $meta["updated"],
|
|
"createdYear" => date("Y", $meta["created"]),
|
|
"createdMonth" => date("m", $meta["created"]),
|
|
"deleted" => $meta["deleted"],
|
|
"menu" => $meta["menu"],
|
|
"featured" => $meta["featured"],
|
|
"published" => $meta["published"],
|
|
"slug" => $meta["slug"],
|
|
"filePath" => $file,
|
|
"content" => $doc->getContent(),
|
|
];
|
|
//checks for duplicates
|
|
$uuid = $meta["uuid"];
|
|
$found = current(
|
|
array_filter($contents, function ($item) use ($uuid) {
|
|
return isset($item["uuid"]) && $uuid == $item["uuid"];
|
|
})
|
|
);
|
|
|
|
// if uuid is not present, add it
|
|
if (!$found) {
|
|
array_push($contents, $page);
|
|
}
|
|
}
|
|
$contents = orderBy($contents, ["id"], ["desc"]);
|
|
return $contents;
|
|
}
|
|
}
|