public function hashToHtmlAttributes($attrs)
 {
     $str = trim(implode(' ', array_map(function ($attrName) use($attrs) {
         $attrVal = $attrs[$attrName];
         $quote = '"';
         if (is_null($attrVal) || $attrVal === true) {
             return $attrName;
         } elseif ($attrVal === false) {
             return '';
         } elseif (is_array($attrVal)) {
             switch ($attrName) {
                 case 'class':
                     $attrVal = implode(' ', array_filter($attrVal));
                     break;
                 case 'style':
                     array_walk($attrVal, function (&$val, $key) {
                         $val = $key . ': ' . $val;
                     });
                     $attrVal = implode('; ', $attrVal) . ';';
                     break;
                     // Default to json, for data-* attributes
                 // Default to json, for data-* attributes
                 default:
                     $quote = '\'';
                     $attrVal = json_encode($attrVal);
                     break;
             }
         } else {
             return $attrName . '="' . $attrVal . '"';
         }
         return $attrName . '=' . $quote . $attrVal . $quote;
     }, array_keys($attrs))));
     return TemplateHelper::getRaw($str);
 }
 /**
  * Our function called via Twig; it can do anything you want
  *
  * @return string
  */
 public function lettering($text = null, $class = 'chars')
 {
     if (!$text || strlen($text) === 0 || !method_exists(craft()->lettering, $class)) {
         return $text;
     }
     $dom = new LetteringDom();
     $dom->loadHTML(mb_convert_encoding('<div id="workingNode">' . $text . '</div>', 'HTML-ENTITIES', $this->encoding));
     $workingNode = $dom->getElementById('workingNode');
     $fragment = $dom->createDocumentFragment();
     foreach ($workingNode->childNodes as $node) {
         if ($node->nodeType !== 1) {
             continue;
         }
         $value = $node->nodeValue;
         $result = craft()->lettering->{$class}($value, $class);
         $node->nodeValue = '';
         $tempFragment = new LetteringDom();
         $tempFragment->loadHTML(mb_convert_encoding($result[$class], 'HTML-ENTITIES', $this->encoding));
         foreach ($tempFragment->getElementsByTagName('body')->item(0)->childNodes as $tempNode) {
             $tempNode = $node->ownerDocument->importNode($tempNode, true);
             $node->appendChild($tempNode);
         }
         $node->setAttribute('aria-label', trim(strip_tags($value)));
         $fragment->appendChild($node->cloneNode(true));
     }
     $workingNode->parentNode->replaceChild($fragment, $workingNode);
     $result = TemplateHelper::getRaw(preg_replace('~<(?:!DOCTYPE|/?(?:html|head|body))[^>]*>\\s*~i', '', $dom->saveHTML()));
     if (strlen(trim($result)) === 0) {
         $result = craft()->lettering->{$class}($text);
         return $result ? $result[$class] : $text;
     }
     return $result;
 }
 public function videoEmbed($input)
 {
     $originalPath = craft()->path->getTemplatesPath();
     $myPath = craft()->path->getPluginsPath() . 'videoembedutility/templates/';
     craft()->path->setTemplatesPath($myPath);
     $markup = craft()->templates->render('_vimeoEmbed.html', array('player_url' => $this->videoPlayerUrl($input)));
     craft()->path->setTemplatesPath($originalPath);
     return TemplateHelper::getRaw($markup);
 }
 public function stripP($content)
 {
     $content = preg_replace('/(<p>|<\\/p>)/i', '', (string) trim($content));
     $content = preg_replace('/<br(\\s)?(\\/)?>/i', '', (string) trim($content));
     return TemplateHelper::getRaw($content);
 }
 /**
  * @inheritdoc
  * @return string
  */
 public function getLink()
 {
     return TemplateHelper::getRaw("<a href='" . $this->getCpEditUrl() . "'>" . substr($this->number, 0, 7) . "</a>");
 }
 public function renderJSONLD($object = array())
 {
     $result = craft()->seomatic->renderJSONLD($object);
     return TemplateHelper::getRaw(rtrim($result));
 }
 public function doxterTypography($source = '')
 {
     return TemplateHelper::getRaw(typogrify($source));
 }
 public function videoEmbed($input)
 {
     $originalPath = craft()->path->getTemplatesPath();
     $videos = $this->getAllVideos($input);
     $videoUrls = [];
     foreach ($videos as $count => $videoPlayerUrl) {
         array_push($videoUrls, $this->videoPlayerUrl($videoPlayerUrl));
     }
     $videoUrls = array_filter($videoUrls);
     if (!empty($videoUrls)) {
         $videoMarkup = [];
         foreach ($videoUrls as $count => $url) {
             $myPath = craft()->path->getPluginsPath() . 'videoembedutility/templates/';
             craft()->path->setTemplatesPath($myPath);
             array_push($videoMarkup, craft()->templates->render('_vimeoEmbed.html', ['player_url' => $url]));
         }
         $markup = implode('', $videoMarkup);
     } else {
         $markup = $input;
     }
     craft()->path->setTemplatesPath($originalPath);
     return TemplateHelper::getRaw($markup);
 }
 /**
  * @param $html
  * @return \Twig_Markup
  */
 public function typographer($html)
 {
     $html = SmartyPantsTypographer::defaultTransform($html);
     return TemplateHelper::getRaw($html);
 }