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.
121 lines
3.8 KiB
PHTML
121 lines
3.8 KiB
PHTML
3 years ago
|
<?php
|
||
|
use League\CommonMark\Environment\Environment;
|
||
|
use League\CommonMark\Extension\CommonMark\CommonMarkCoreExtension;
|
||
|
use League\CommonMark\Extension\Strikethrough\StrikethroughExtension;
|
||
|
use League\CommonMark\Extension\Attributes\AttributesExtension;
|
||
|
use League\CommonMark\Extension\FrontMatter\FrontMatterExtension;
|
||
|
use League\CommonMark\Extension\FrontMatter\Output\RenderedContentWithFrontMatter;
|
||
|
use League\CommonMark\MarkdownConverter;
|
||
|
use League\CommonMark\CommonMarkConverter;
|
||
|
use function _\orderBy;
|
||
|
|
||
|
class Contents
|
||
|
{
|
||
|
public $files = [];
|
||
|
public $config = [];
|
||
|
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;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
function getAll()
|
||
|
{
|
||
|
$environment = new Environment($this->config);
|
||
|
$environment->addExtension(new CommonMarkCoreExtension());
|
||
|
|
||
|
// Add the extension
|
||
|
$environment->addExtension(new FrontMatterExtension());
|
||
|
|
||
|
//Add Strikethrough rendering
|
||
|
$environment->addExtension(new StrikethroughExtension());
|
||
|
|
||
|
//add attributes to elements in markdown
|
||
|
$environment->addExtension(new AttributesExtension());
|
||
|
|
||
|
// Instantiate the converter engine and start converting some Markdown!
|
||
|
$converter = new MarkdownConverter($environment);
|
||
|
|
||
|
$contents = [];
|
||
|
foreach ($this->files as $file) {
|
||
|
//get meta and html from file
|
||
|
$result = $converter->convertToHtml(file_get_contents($file));
|
||
|
$meta = [];
|
||
|
if ($result instanceof RenderedContentWithFrontMatter) {
|
||
|
$meta = $result->getFrontMatter();
|
||
|
}
|
||
|
|
||
|
//get raw markdown from file
|
||
|
$frontMatterExtension = new FrontMatterExtension();
|
||
|
$parsed = $frontMatterExtension
|
||
|
->getFrontMatterParser()
|
||
|
->parse(file_get_contents($file));
|
||
|
|
||
|
//never trust the front end. clean it up
|
||
|
$sanitizer = HtmlSanitizer\Sanitizer::create([
|
||
|
"extensions" => ["basic", "image", "list", "code"],
|
||
|
"tags" => [
|
||
|
"img" => [
|
||
|
"allowed_attributes" => ["src", "alt", "title", "class"],
|
||
|
"allowed_hosts" => null,
|
||
|
"allow_relative_links" => true,
|
||
|
],
|
||
|
],
|
||
|
]);
|
||
|
|
||
|
$scrubbed = $sanitizer->sanitize($result->getContent());
|
||
|
|
||
|
//sort attributes into page object
|
||
|
$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" => $parsed->getContent(),
|
||
|
"html" => $scrubbed,
|
||
|
];
|
||
|
//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;
|
||
|
}
|
||
|
}
|