wiki-grav/plugins/anchors/twig/AnchorsTwigExtension.php
2022-05-27 15:44:01 +02:00

143 lines
3.5 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace Grav\Plugin;
class AnchorsTwigExtension extends \Twig_Extension
{
private $config;
public function __construct($config)
{
$this->config = $config;
}
public function getName()
{
return 'AnchorsTwigExtension';
}
public function getFunctions()
{
return [
new \Twig_SimpleFunction('anchors', [$this, 'anchorsFunction'])
];
}
/**
* Get a list of anchors link
*
* @param $content
* @param $tag
* @return string
*/
public function anchorsFunction($content, $tag = 'h2', $terms = null)
{
$configTags = array_map('trim', explode(',',$this->config));
if (in_array($tag, $configTags)){
$textMenu = [];
$rx = '/<'.$tag.'>(.*)<\/'.$tag.'>/';
preg_match_all($rx, $content, $group);
if (!empty($group[1])){
if (!empty($terms)){
$termsArray = array_map('trim', explode(',',$terms));
$elements = array_diff($group[1],$termsArray);
}else{
$elements = $group[1];
}
foreach($elements as $element){
$textMenu[] = $element;
}
$html = $this->getHtmlTag($textMenu);
}else{
$html = '';
}
}else{
$tag = current($configTags);
$html = $this->anchorsFunction($tag, $content);
}
return $html;
}
/**
* Mount the html of anchors link
*
* @param $itens
* @return string
*/
private function getHtmlTag($itens)
{
$html = '';
$html .= '<ul class="items-menus-page">';
foreach($itens as $item){
$html .= '<li><a href="#'.$this->getUrl($item).'">'.$this->textLimit($item, 50, false).'</a></li>';
}
$html .= '</ul>';
return $html;
}
/**
* Get url whithout special characters
*
* @param $text
* @return string
*/
private function getUrl($text)
{
$rx1 = array('ä','ã','à','á','â','ê','ë','è','é','ï','ì','í','ö','õ','ò','ó','ô','ü','ù','ú','û','À','Á','Â','Ã','É','Ê','Ô','Í','Ó','Õ','Ú','ñ','Ñ','ç','Ç');
$rx2 = '/\'/';
$rx3 = '/[& \+\$,:;=\?@"#\{\}\|\^~\[`%!\'<>\]\.\/\(\)\*ºª]/';
$rx4 = '/-{2,}/';
$rx5 = '/\^-+|-+$/';
$urlAnchor1 = str_replace('', '-', str_replace($rx1, '', $text));
$urlAnchor2 = preg_replace($rx2, '', $urlAnchor1);
$urlAnchor3 = preg_replace($rx3, '-', $urlAnchor2);
$urlAnchor4 = $this->textLimit(preg_replace($rx4, '-', $urlAnchor3), 64);
$urlAnchor5 = preg_replace($rx5, '', $urlAnchor4);
$urlAnchorFinal = strtolower($urlAnchor5);
return $urlAnchorFinal;
}
/**
* It limit characters total in exit
*
* @param $text
* @param $limit
* @param bool|true $url //verify if type content is url or title
* @return string
*/
private function textLimit($text, $limit, $url = true)
{
$count = strlen($text);
if ( $count >= $limit ) {
if ($url){
$text = substr($text, 0, $limit);
return $text;
}else {
$text = substr($text, 0, strrpos(substr($text, 0, $limit), ' ')) . '...';
return $text;
}
}
else{
return $text;
}
}
}