143 lines
3.5 KiB
PHP
143 lines
3.5 KiB
PHP
<?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;
|
||
}
|
||
}
|
||
}
|