protected function getInput() { $this->params = $this->element->attributes(); $label = $this->get('label'); $format = $this->get('format'); $date = JFactory::getDate(); $tz = new DateTimeZone(JFactory::getApplication()->getCfg('offset')); $date->setTimeZone($tz); if ($format) { if (strpos($format, '%') !== false) { require_once JPATH_PLUGINS . '/system/nnframework/helpers/text.php'; $format = NNText::dateToDateFormat($format); } $html = $date->format($format, 1); } else { $html = $date->format('', 1); } if ($label) { $html = JText::sprintf($label, $html); } return '<div class="nn_block nn_title">' . $html . '</div>'; }
protected function getInput() { $this->params = $this->element->attributes(); $label = $this->get('label'); $format = $this->get('format'); $date = JFactory::getDate(); $tz = new DateTimeZone(JFactory::getApplication()->getCfg('offset')); $date->setTimeZone($tz); if ($format) { if (strpos($format, '%') !== false) { require_once dirname(__DIR__) . '/helpers/text.php'; $format = NNText::dateToDateFormat($format); } $html = $date->format($format, true); } else { $html = $date->format('', true); } if ($label) { $html = JText::sprintf($label, $html); } return '</div><div>' . $html; }
public function convertDateToString($string, $extra) { // Check if string could be a date if (strpos($string, '-') == false || preg_match('#[a-z]#i', $string) || !strtotime($string)) { return $string; } if (!$extra) { $extra = JText::_('DATE_FORMAT_LC2'); } if (strpos($extra, '%') !== false) { $extra = NNText::dateToDateFormat($extra); } return JHtml::_('date', $string, $extra); }
function processArticle($id, $art, $text = '', $type = 'article', $ignores = array(), $first = 0) { if (!$first) { // do second pass $text = $this->processArticle($id, $art, $text, $type, $ignores, 1); } if ($first) { // first pass: search for normal tags and tags around tags $regex = '#\\{(/?(?:[^\\}]*\\{[^\\}]*\\})*[^\\}]*)\\}#si'; } else { $regex_close = '#\\{/' . $this->params->tags . '\\}#si'; if (preg_match($regex_close, $text)) { return $text; } // second pass: only search for normal tags $regex = '#\\{(/?[^\\{\\}]+)\\}#si'; } if (!preg_match_all($regex, $text, $matches, PREG_SET_ORDER)) { return $text; } $db = JFactory::getDBO(); $query = $db->getQuery(true); $type = $type == 'k2' && !$this->params->dbselects_k2 ? '' : $type; $selects = $type == 'k2' ? $this->params->dbselects_k2 : $this->params->dbselects_content; if (in_array($id, array('current', 'self', '{id}', '{title}', '{alias}'))) { if (isset($art->id)) { $id = $art->id; } else { if (isset($art->link) && preg_match('#&id=([0-9]*)#', $art->link, $match)) { $id = $match['1']; } else { if ($this->option == 'com_content' && JFactory::getApplication()->input->get('view') == 'article') { $id = JFactory::getApplication()->input->getInt('id', 0); } } } } foreach ($matches as $match) { $data = trim($match['1']); if (!(strpos($data, 'intro') === false)) { $selects[] = 'introtext'; } else { if (!(strpos($data, 'full') === false)) { $selects[] = 'fulltext'; } else { if (!(strpos($data, 'text') === false)) { $selects[] = 'introtext'; $selects[] = 'fulltext'; } } } } $selects = array_unique($selects); $selects = 'a.`' . implode('`, a.`', $selects) . '`'; $query->select($selects); if ($type == 'article') { $query->select('CASE WHEN CHAR_LENGTH(a.alias) THEN CONCAT_WS(":", a.id, a.alias) ELSE a.id END AS slug')->select('CASE WHEN CHAR_LENGTH(c.alias) THEN CONCAT_WS(":", c.id, c.alias) ELSE c.id END AS catslug')->select('c.parent_id AS parent')->join('LEFT', '#__categories AS c ON c.id = a.catid'); } $query->from('#__content as a'); $where = 'a.title = ' . $db->quote(NNText::html_entity_decoder($id)); $where .= ' OR a.alias = ' . $db->quote(NNText::html_entity_decoder($id)); if (is_numeric($id)) { $where .= ' OR a.id = ' . $id; } $query->where('(' . $where . ')'); $ignore_language = isset($ignores['ignore_language']) ? $ignores['ignore_language'] : $this->params->ignore_language; if (!$ignore_language) { $query->where('a.language in (' . $db->quote(JFactory::getLanguage()->getTag()) . ',' . $db->quote('*') . ')'); } $ignore_state = isset($ignores['ignore_state']) ? $ignores['ignore_state'] : $this->params->ignore_state; if (!$ignore_state) { $jnow = JFactory::getDate(); $now = $jnow->toSQL(); $nullDate = $db->getNullDate(); if ($type == 'k2') { $query->where('a.published = 1 AND trash = 0'); } else { $query->where('a.state = 1'); } $query->where('( a.publish_up = ' . $db->quote($nullDate) . ' OR a.publish_up <= ' . $db->quote($now) . ' )')->where('( a.publish_down = ' . $db->quote($nullDate) . ' OR a.publish_down >= ' . $db->quote($now) . ' )'); } $ignore_access = isset($ignores['ignore_access']) ? $ignores['ignore_access'] : $this->params->ignore_access; if (!$ignore_access) { $query->where('a.access IN(' . implode(', ', $this->params->aid) . ')'); } $query->order('a.ordering'); $db->setQuery($query); $article = $db->loadObject(); if (!$article) { return '<!-- ' . JText::_('AA_ACCESS_TO_ARTICLE_DENIED') . ' -->'; } if (isset($article->attribs)) { self::addParams($article, json_decode($article->attribs)); } else { if (isset($article->params)) { self::addParams($article, json_decode($article->params)); } } if (isset($article->images)) { self::addParams($article, json_decode($article->images)); } if (isset($article->urls)) { self::addParams($article, json_decode($article->urls)); } $ifregex = '#\\{if:([^\\}]+)\\}(.*?)(?:\\{else\\}(.*?))?\\{/if\\}#si'; if (preg_match_all($ifregex, $text, $ifs, PREG_SET_ORDER) > 0) { foreach ($ifs as $if) { $eval = trim($if['1']); if (preg_match('#(^.*?[><=]\\s*([\'"]))(.*)\\2#si', $eval, $match)) { $eval = str_replace($match['0'], $match['1'] . html_entity_decode($match['3']) . $match['2'], $eval); } $eval = str_replace('=', '==', $eval); $eval = '$pass = ( ( $article->' . $eval . ' ) ? 1 : 0 );'; $eval = str_replace('$article->!', '!$article->', $eval); // trim the text that needs to be checked and replace weird spaces $eval = preg_replace('#(\\$article->[a-z0-9-_]*)#', 'trim(str_replace(chr(194) . chr(160), " ", \\1))', $eval); $pass = 0; eval($eval); if (!$pass) { $text = str_replace($if['0'], isset($if['3']) ? $if['3'] : '', $text); } else { $text = str_replace($if['0'], $if['2'], $text); } } } if (!preg_match_all($regex, $text, $matches, PREG_SET_ORDER)) { return $text; } foreach ($matches as $match) { $data = trim($match['1']); $ok = 0; $str = ''; $data = explode(':', $data, 2); $tag = trim($data['0']); $extra = isset($data['1']) ? trim($data['1']) : ''; if ($tag == '/link') { $str = '</a>'; $ok = 1; } else { if ($tag == '/div') { $str = '</div>'; $ok = 1; } else { if ($tag == 'div' || strpos($tag, 'div ') === 0) { if ($tag != 'div') { $extra = str_replace('div ', '', $tag) . ':' . $extra; } $str = ''; if ($extra) { $extra = explode('|', $extra); $extras = new stdClass(); foreach ($extra as $e) { if (!(strpos($e, ':') === false)) { list($key, $val) = explode(':', $e, 2); $extras->{$key} = $val; } } if (isset($extras->class)) { $str .= 'class="' . $extras->class . '"'; } $style = array(); if (isset($extras->width)) { if (is_numeric($extras->width)) { $extras->width .= 'px'; } $style[] = 'width:' . $extras->width; } if (isset($extras->height)) { if (is_numeric($extras->height)) { $extras->height .= 'px'; } $style[] = 'height:' . $extras->height; } if (isset($extras->align)) { $style[] = 'float:' . $extras->align; } else { if (isset($extras->float)) { $style[] = 'float:' . $extras->float; } } if (!empty($style)) { $str .= ' style="' . implode(';', $style) . ';"'; } } $str = trim('<div ' . trim($str)) . '>'; $ok = 1; } else { if ($tag == 'link' || $tag == 'url' || !(strpos($tag, 'readmore') === false)) { if (isset($article->id)) { $slug = 'id=' . $article->slug; if ($article->catid) { $slug .= '&catid=' . $article->catslug; } $link = 'index.php?option=com_content&view=article&' . $slug; $component = JComponentHelper::getComponent('com_content'); $menus = JFactory::getApplication()->getMenu('site'); $menuitems = $menus->getItems('component_id', $component->id); $id = 0; if (is_array($menuitems)) { foreach ($menuitems as $item) { if (isset($item->query['view']) && $item->query['view'] == 'article' && isset($item->query['id']) && $item->query['id'] == $article->id) { $id = $item->id; break; } } if (!$id) { foreach ($menuitems as $item) { if (isset($item->query['view']) && in_array($item->query['view'], array('category', 'categories')) && isset($item->query['id']) && $item->query['id'] == $article->catid) { $id = $item->id; break; } } } if (!$id) { foreach ($menuitems as $item) { if (isset($item->query['view']) && in_array($item->query['view'], array('category', 'categories')) && isset($item->query['id']) && $item->query['id'] == $article->parent) { $id = $item->id; break; } } } } if ($id) { $link .= '&Itemid=' . $id; } $link = JRoute::_($link); if ($tag == 'link') { $str = '<a href="' . $link . '">'; } else { if ($tag == 'url') { $str = $link; } else { // load the content language file $lang = JFactory::getLanguage(); $lang->load('com_content'); $class = 'readmore'; $readmore = ''; if ($extra) { $extra = explode('|', $extra); if (trim($extra['0'])) { $readmore = JText::sprintf(trim($extra['0']), $article->title); if (!$readmore) { $readmore = $extra['0']; } } if (isset($extra['1'])) { $class = trim($extra['1']); } } if (!$readmore) { if (isset($article->alternative_readmore) && $article->alternative_readmore) { $readmore = $article->alternative_readmore; } else { if (!$this->params->config->get('show_readmore_title', 0)) { $readmore = JText::_('COM_CONTENT_READ_MORE_TITLE'); } else { $readmore = JText::_('COM_CONTENT_READ_MORE'); } } if ($this->params->config->get('show_readmore_title', 0)) { $readmore .= JHtml::_('string.truncate', $article->title, $this->params->config->get('readmore_limit')); } } if ($class == 'readmore') { $str = '<p class="' . $class . '"><a href="' . $link . '">' . $readmore . '</a></p>'; } else { $str = '<a class="' . $class . '" href="' . $link . '">' . $readmore . '</a>'; } } } $ok = 1; } } else { if ($tag == 'image-intro' && isset($article->image_intro) || $tag == 'image-fulltext' && isset($article->image_fulltext)) { if ($tag == 'image-intro') { $class = 'img-intro-' . htmlspecialchars($article->float_intro); $caption = $article->image_intro_caption ? 'class="caption" title="' . htmlspecialchars($article->image_intro_caption) . '" ' : ''; $src = htmlspecialchars($article->image_intro); $alt = htmlspecialchars($article->image_intro_alt); } else { $class = 'img-fulltext-' . htmlspecialchars($article->float_fulltext); $caption = $article->image_fulltext_caption ? 'class="caption" title="' . htmlspecialchars($article->image_fulltext_caption) . '" ' : ''; $src = htmlspecialchars($article->image_fulltext); $alt = htmlspecialchars($article->image_fulltext_alt); } $str = '<div class="' . $class . '"><img ' . $caption . 'src="' . $src . '" alt="' . $alt . '"/></div>'; $ok = 1; } else { if (strpos($tag, 'text') === 0 || strpos($tag, 'intro') === 0 || strpos($tag, 'full') === 0) { // TEXT data $article->text = ''; if (!(strpos($tag, 'intro') === false)) { if (isset($article->introtext)) { $article->text = $article->introtext; $ok = 1; } } else { if (!(strpos($tag, 'full') === false)) { if (isset($article->fulltext)) { $article->text = $article->fulltext; $ok = 1; } } else { if (!(strpos($tag, 'text') === false)) { if (isset($article->introtext) && isset($article->fulltext)) { $article->text = $article->introtext . $article->fulltext; $ok = 1; } } } } $str = $article->text; if ($extra) { $attribs = explode(':', $extra); $max = 0; $strip = 0; $noimages = 0; foreach ($attribs as $attrib) { $attrib = trim($attrib); switch ($attrib) { case 'strip': $strip = 1; break; case 'noimages': $noimages = 1; break; default: $max = $attrib; break; } } $word_limit = !(strpos($max, 'word') === false); if ($strip) { // remove pagenavcounter $str = preg_replace('#(<' . 'div class="pagenavcounter">.*?</div>)#si', ' ', $str); // remove pagenavbar $str = preg_replace('#(<' . 'div class="pagenavbar">(<div>.*?</div>)*</div>)#si', ' ', $str); // remove scripts $str = preg_replace('#(<' . 'script[^a-z0-9].*?</script>)#si', ' ', $str); $str = preg_replace('#(<' . 'noscript[^a-z0-9].*?</noscript>)#si', ' ', $str); // remove other tags $str = preg_replace('#(<' . '/?[a-z][a-z0-9]?.*?>)#si', ' ', $str); // remove double whitespace $str = trim(preg_replace('#\\s+#s', ' ', $str)); if ($max) { $orig_len = strlen($str); if ($word_limit) { // word limit $str = trim(preg_replace('#^(([^\\s]+\\s*){' . (int) $max . '}).*$#s', '\\1', $str)); if (strlen($str) < $orig_len) { if (preg_match('#[^a-z0-9]$#si', $str)) { $str .= ' '; } if ($this->params->use_ellipsis) { $str .= '...'; } } } else { // character limit $max = (int) $max; if ($max < $orig_len) { $str = rtrim(substr($str, 0, $max - 3)); if (preg_match('#[^a-z0-9]$#si', $str)) { $str .= ' '; } if ($this->params->use_ellipsis) { $str .= '...'; } } } } } else { if ($noimages) { // remove images $str = preg_replace('#(<p><' . 'img\\s.*?></p>|<' . 'img\\s.*?>)#si', ' ', $str); } } if (!$strip && $max && ($word_limit || (int) $max < strlen($str))) { $max = (int) $max; // store pagenavcounter & pagenav (exclude from count) preg_match('#<' . 'div class="pagenavcounter">.*?</div>#si', $str, $pagenavcounter); $pagenavcounter = isset($pagenavcounter['0']) ? $pagenavcounter['0'] : ''; if ($pagenavcounter) { $str = str_replace($pagenavcounter, '<!-- ARTA_PAGENAVCOUNTER -->', $str); } preg_match('#<' . 'div class="pagenavbar">(<div>.*?</div>)*</div>#si', $str, $pagenav); $pagenav = isset($pagenav['0']) ? $pagenav['0'] : ''; if ($pagenav) { $str = str_replace($pagenav, '<!-- ARTA_PAGENAV -->', $str); } // add explode helper strings around tags $explode_str = '<!-- ARTA_TAG -->'; $str = preg_replace('#(<\\/?[a-z][a-z0-9]?.*?>|<!--.*?-->)#si', $explode_str . '\\1' . $explode_str, $str); $str_array = explode($explode_str, $str); $str = array(); $tags = array(); $count = 0; $is_script = 0; foreach ($str_array as $i => $str_part) { if (fmod($i, 2)) { // is tag $str[] = $str_part; preg_match('#^<(\\/?([a-z][a-z0-9]*))#si', $str_part, $tag); if (!empty($tag)) { if ($tag['1'] == 'script') { $is_script = 1; } if (!$is_script && strpos($str_part, '/>') === false && !in_array($tag['2'], array('area', 'br', 'hr', 'img', 'input', 'param'))) { $tags[] = $tag['1']; } if ($tag['1'] == '/script') { $is_script = 0; } } } else { if ($is_script) { $str[] = $str_part; } else { if ($word_limit) { // word limit if ($str_part) { $words = explode(' ', trim($str_part)); $word_count = count($words); if ($max < $count + $word_count) { $words_part = array(); $word_count = 0; foreach ($words as $word) { if ($word) { $word_count++; } if ($max < $count + $word_count) { break; } $words_part[] = $word; } $string = rtrim(implode(' ', $words_part)); if (preg_match('#[^a-z0-9]$#si', $string)) { $string .= ' '; } if ($this->params->use_ellipsis) { $string .= '...'; } $str[] = $string; break; } $count += $word_count; } $str[] = $str_part; } else { // character limit if ($max < $count + strlen($str_part)) { // strpart has to be cut off $maxlen = $max - $count; if ($maxlen < 3) { $string = ''; if (preg_match('#[^a-z0-9]$#si', $str_part)) { $string .= ' '; } if ($this->params->use_ellipsis) { $string .= '...'; } $str[] = $string; } else { $string = rtrim(substr($str_part, 0, $maxlen - 3)); if (preg_match('#[^a-z0-9]$#si', $string)) { $string .= ' '; } if ($this->params->use_ellipsis) { $string .= '...'; } $str[] = $string; } break; } $count += strlen($str_part); $str[] = $str_part; } } } } // revers sort open tags krsort($tags); $tags = array_values($tags); $count = count($tags); for ($i = 0; $i < 3; $i++) { foreach ($tags as $ti => $tag) { if ($tag['0'] == '/') { for ($oi = $ti + 1; $oi < $count; $oi++) { $opentag = $tags[$oi]; if ($opentag == $tag) { break; } if ('/' . $opentag == $tag) { unset($tags[$ti]); unset($tags[$oi]); break; } } } } } foreach ($tags as $tag) { // add closing tag to end of string if ($tag['0'] != '/') { $str[] = '</' . $tag . '>'; } } $str = implode('', $str); $str = str_replace(array('<!-- ARTA_PAGENAVCOUNTER -->', '<!-- ARTA_PAGENAV -->'), array($pagenavcounter, $pagenav), $str); } } // Fix links in pagination to point to the included article instead of the main article // This doesn't seem to work correctly and causes issues with other links in the article // So commented out untill I find a better solution /*if ($art && isset($art->id) && $art->id) { $str = str_replace('view=article&id=' . $art->id, 'view=article&id=' . $article->id, $str); }*/ } else { if (ctype_alnum(str_replace(array('-', '_'), '', $tag))) { // Get data from db columns if (isset($article->{$tag})) { $str = $article->{$tag}; $ok = 1; } if ($ok && !(strpos($str, '-') == false) && !preg_match('#[a-z]#i', $str) && strtotime($str)) { if (!$extra) { $extra = JText::_('DATE_FORMAT_LC2'); } if (!(strpos($extra, '%') === false)) { $extra = NNText::dateToDateFormat($extra); } $str = JHtml::_('date', $str, $extra); } } } } } } } } if ($ok) { $text = str_replace($match['0'], $str, $text); } } return $text; }
static function dateToDateFormat($dateFormat) { require_once __DIR__ . '/text.php'; return NNText::dateToDateFormat($dateFormat); }