news/plugins/anchors/twig/AnchorsTwigExtension.php

143 lines
3.5 KiB
PHP
Raw Normal View History

<?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;
}
}
}