<?php
/**
* This file is part of Aksara CMS, both framework and publishing
* platform.
*
* @author Aby Dahana <[email protected]>
* @copyright (c) Aksara Laboratory <https://aksaracms.com>
* @license MIT License
*
* This source file is subject to the MIT license that is bundled
* with this source code in the LICENSE.txt file.
*
* When the signs is coming, those who don't believe at "that time"
* have only two choices, commit suicide or become brutal.
*/
if (! function_exists('recommendation_generator')) {
/**
* Table of content generator
*
* @param string $content
*/
function recommendation_generator($content = null, $recommendations = [], int $per_paragraph = 5)
{
// Reformat recommendation object into array
$recommendations = json_decode(json_encode($recommendations), true);
// Split the text into paragraphs
$paragraphs = explode('</p>', $content);
$updatedContent = '';
$applied = false;
if (sizeof($paragraphs) < $per_paragraph) {
// Paragraph is lower than minimum, change default minimum setting
$per_paragraph = sizeof($paragraphs);
}
foreach ($paragraphs as $index => $paragraph) {
// If the paragraph is not empty, add the closing </p> tag
if (! empty(trim($paragraph))) {
$paragraph .= "</p>";
}
// Add the paragraph to the updated text
$updatedContent .= $paragraph;
// Add additional content after every 5th paragraph
if (0 == ($index + 1) % $per_paragraph && ! empty(trim($paragraph)) && isset($recommendations[($index / $per_paragraph)])) {
$applied = true;
$updatedContent .= '<div class="alert alert-info callout"><p class="mb-0">' . phrase('Peoples also read') . '</p><a href="' . $recommendations[($index / $per_paragraph)]['link'] . '" class="--xhr">' . $recommendations[($index / $per_paragraph)]['title'] . '</a></div>';
}
}
if (! $applied && $recommendations) {
$updatedContent .= '<div class="alert alert-info callout"><p class="mb-0">' . phrase('Peoples also read') . '</p><a href="' . $recommendations[0]['link'] . '" class="--xhr">' . $recommendations[0]['title'] . '</a></div>';
}
return $updatedContent;
}
}
if (! function_exists('toc_generator')) {
/**
* Table of content generator
*
* @param string $content
*/
function toc_generator($content = null)
{
$toc = null; // Start the table of contents
$pattern = '/<h([1-6])[^>]*>(.*?)<\/h\1>/i'; // Regex pattern to find headings (h1 to h6)
$matches = [];
// Find all headings in the content
preg_match_all($pattern, $content, $matches, PREG_SET_ORDER);
foreach ($matches as $key => $match) {
$level = $match[1]; // Heading level (e.g., 1 for h1, 2 for h2)
$title = $match[2]; // The text inside the heading
$slug = format_slug($title); // Create a URL-friendly ID
// Add ID attribute to the heading in the content
$content = str_replace($match[0], "<h$level id=\"$slug\" class=\"fw-bold\">$title</h$level>", $content);
// Add a list item to the TOC
$toc .= "<li class=\"toc-level-$level\"><a href=\"#$slug\" class=\"lead\">$title</a></li>";
}
if ($toc) {
$toc = '<ul class="mb-0">' . $toc . '</ul>';
}
return [$toc, $content];
}
}
|