Example #1
1
 public function testAttributes()
 {
     $parser = new JBBCode\Parser();
     $builder = new JBBCode\CodeDefinitionBuilder('img', '<img src="{param}" height="{height}" alt="{alt}" />');
     $parser->addCodeDefinition($builder->setUseOption(true)->setParseContent(false)->build());
     $expected = 'Multiple <img src="http://jbbcode.com/img.png" height="50" alt="alt text" /> options.';
     $code = 'Multiple [img height="50" alt="alt text"]http://jbbcode.com/img.png[/img] options.';
     $parser->parse($code);
     $result = $parser->getAsHTML();
     $this->assertEquals($expected, $result);
     $code = 'Multiple [img height=50 alt="alt text"]http://jbbcode.com/img.png[/img] options.';
     $parser->parse($code);
     $result = $parser->getAsHTML();
     $this->assertEquals($expected, $result);
 }
Example #2
1
 /**
  * parseBBcode
  * @return void
  */
 public function parseBBcode()
 {
     $dom = new \DomDocument();
     $dom->loadHTML($this->html);
     $finder = new \DomXPath($dom);
     $nodes = $finder->query("//*[contains(concat(' ', normalize-space(@class), ' '), ' cacheLogText ')]");
     $parser = new JBBCode\Parser();
     $parser->addCodeDefinitionSet(new JBBCode\DefaultCodeDefinitionSet());
     foreach ($this->bbcode_colors as $color) {
         $builder = new JBBCode\CodeDefinitionBuilder($color, '<span style="color: ' . $color . ';">{param}</span>');
         $parser->addCodeDefinition($builder->build());
     }
     foreach ($nodes as $node) {
         $raw_log = $node->ownerDocument->saveHTML($node);
         $raw_log = trim(str_replace(array('<td class="cacheLogText" colspan="2">', '</td>'), '', $raw_log));
         $log = preg_replace('/<br>$/', '', $raw_log);
         $parser->parse($log);
         $node->nodeValue = $parser->getAsHtml();
     }
     //$smileyVisitor = new JBBCode\visitors\SmileyVisitor();
     //$parser->accept($smileyVisitor);
     $this->html = htmlspecialchars_decode($dom->saveHtml());
     $bbcodes = array_keys($this->bbcode_smileys);
     $images = array_values($this->bbcode_smileys);
     foreach ($images as $k => &$image) {
         $image = '<img src="../images/icons/' . $image . '" alt="' . $bbcodes[$k] . '" />';
     }
     foreach ($bbcodes as &$bbcode) {
         $bbcode = '[' . $bbcode . ']';
     }
     $this->html = str_replace($bbcodes, $images, $this->html);
 }
Example #3
1
 /**
  * Convert BBCode to HTML.
  * 
  * @param string $bbcode
  * @return string
  */
 public static function bbcode($bbcode)
 {
     $parser = new \JBBCode\Parser();
     $parser->addCodeDefinitionSet(new \JBBCode\DefaultCodeDefinitionSet());
     $builder = new \JBBCode\CodeDefinitionBuilder('quote', '<blockquote>{param}</blockquote>');
     $parser->addCodeDefinition($builder->build());
     $builder = new \JBBCode\CodeDefinitionBuilder('code', '<pre><code>{param}</code></pre>');
     $builder->setParseContent(false);
     $parser->addCodeDefinition($builder->build());
     $parser->parse($bbcode);
     $html = $parser->getAsHtml();
     return Filters\HTMLFilter::clean($html);
 }
Example #4
0
 protected function getNewParser()
 {
     $parser = new JBBCode\Parser();
     if ($this->parser == null) {
         $this->parser = $parser;
     }
     $parser->addCodeDefinition(new \Extension\bbcode\JBBCode\myCodes\Titles());
     $parser->addCodeDefinition(new \Extension\bbcode\JBBCode\myCodes\Lis());
     $parser->addCodeDefinition(new \Extension\bbcode\JBBCode\myCodes\ListItem());
     return $parser;
 }
Example #5
0
 protected function processCommentBBCode($comment)
 {
     if ($this->_bbcode_processor === null) {
         $parser = new \JBBCode\Parser();
         $definitions = array();
         $builder = new \Foolz\FoolFuuka\Model\BBCode\Code();
         array_push($definitions, $builder);
         $builder = new \JBBCode\CodeDefinitionBuilder('spoiler', '<span class="spoiler">{param}</span>');
         array_push($definitions, $builder->build());
         $builder = new \JBBCode\CodeDefinitionBuilder('sub', '<sub>{param}</sub>');
         $builder->setNestLimit(1);
         array_push($definitions, $builder->build());
         $builder = new \JBBCode\CodeDefinitionBuilder('sup', '<sup>{param}</sup>');
         $builder->setNestLimit(1);
         array_push($definitions, $builder->build());
         $builder = new \JBBCode\CodeDefinitionBuilder('eqn', '<script type="math/tex; mode=display">{param}</script>');
         array_push($definitions, $builder->build());
         $builder = new \JBBCode\CodeDefinitionBuilder('math', '<script type="math/tex">{param}</script>');
         array_push($definitions, $builder->build());
         $builder = new \JBBCode\CodeDefinitionBuilder('b', '<strong>{param}</strong>');
         array_push($definitions, $builder->build());
         $builder = new \JBBCode\CodeDefinitionBuilder('i', '<em>{param}</em>');
         array_push($definitions, $builder->build());
         $builder = new \JBBCode\CodeDefinitionBuilder('o', '<span class="overline">{param}</span>');
         array_push($definitions, $builder->build());
         $builder = new \JBBCode\CodeDefinitionBuilder('s', '<span class="strikethrough">{param}</span>');
         array_push($definitions, $builder->build());
         $builder = new \JBBCode\CodeDefinitionBuilder('u', '<span class="underline">{param}</span>');
         array_push($definitions, $builder->build());
         $definitions = Hook::forge('Foolz\\FoolFuuka\\Model\\Comment::processCommentBBCode#var.definitions')->setObject($this)->setParam('definitions', $definitions)->execute()->get($definitions);
         foreach ($definitions as $definition) {
             $parser->addCodeDefinition($definition);
         }
         $this->_bbcode_processor = $parser;
     }
     // work around for dealing with quotes in BBCode tags
     $comment = str_replace('&quot;', '"', $comment);
     $comment = $this->_bbcode_processor->parse($comment)->getAsBBCode();
     $comment = str_replace('"', '&quot;', $comment);
     return $this->_bbcode_processor->parse($comment)->getAsHTML();
 }
Example #6
0
function markup(&$body, $track_cites = false)
{
    global $board, $config, $markup_urls;
    $modifiers = extract_modifiers($body);
    $body = preg_replace('@<tinyboard (?!escape )([\\w\\s]+)>(.+?)</tinyboard>@us', '', $body);
    $body = preg_replace('@<(tinyboard) escape ([\\w\\s]+)>@i', '<$1 $2>', $body);
    if (isset($modifiers['raw html']) && $modifiers['raw html'] == '1') {
        return array();
    }
    $body = str_replace("\r", '', $body);
    $body = utf8tohtml($body);
    if (mysql_version() < 50503) {
        $body = mb_encode_numericentity($body, array(0x10000, 0xffffff, 0, 0xffffff), 'UTF-8');
    }
    $parser = new JBBCode\Parser();
    foreach ($config['markup'] as $markup) {
        if (is_string($markup[1])) {
            $builder = new JBBCode\CodeDefinitionBuilder($markup[0], $markup[1]);
            if ($markup[2] == "option") {
                $builder->setUseOption(true);
            } else {
                if ($markup[2] == "false") {
                    $builder->setParseContent(false);
                }
            }
            $parser->addCodeDefinition($builder->build());
        }
    }
    foreach ($config['old_markup'] as $markup) {
        if (is_string($markup[1])) {
            $body = preg_replace($markup[0], $markup[1], $body);
        } elseif (is_callable($markup[1])) {
            $body = preg_replace_callback($markup[0], $markup[1], $body);
        }
    }
    $parser->addCodeDefinition($builder->build());
    $parser->parse($body);
    $body = $parser->getAsHtml();
    if ($config['markup_urls']) {
        $markup_urls = array();
        $body = preg_replace_callback('/((?:https?:\\/\\/|ftp:\\/\\/|irc:\\/\\/)[^\\s<>()"]+?(?:\\([^\\s<>()"]*?\\)[^\\s<>()"]*?)*)((?:\\s|<|>|"|\\.||\\]|!|\\?|,|&#44;|&quot;)*(?:[\\s<>()"]|$))/', 'markup_url', $body, -1, $num_links);
        if ($num_links > $config['max_links']) {
            error($config['error']['toomanylinks']);
        }
    }
    if ($config['markup_repair_tidy']) {
        $body = str_replace('  ', ' &nbsp;', $body);
    }
    if ($config['auto_unicode']) {
        $body = unicodify($body);
        if ($config['markup_urls']) {
            foreach ($markup_urls as &$url) {
                $body = str_replace(unicodify($url), $url, $body);
            }
        }
    }
    $tracked_cites = array();
    // Cites
    if (isset($board) && preg_match_all('/(^|\\s)?&gt;&gt;(\\d+?)([\\s,.)?]|$)/m', $body, $cites, PREG_SET_ORDER | PREG_OFFSET_CAPTURE)) {
        if (count($cites[0]) > $config['max_cites']) {
            error($config['error']['toomanycites']);
        }
        $skip_chars = 0;
        $body_tmp = $body;
        $search_cites = array();
        foreach ($cites as $matches) {
            $search_cites[] = '`id` = ' . $matches[2][0];
        }
        $search_cites = array_unique($search_cites);
        $query = query(sprintf('SELECT `thread`, `id` FROM ``posts_%s`` WHERE ' . implode(' OR ', $search_cites), $board['uri'])) or error(db_error());
        $cited_posts = array();
        while ($cited = $query->fetch(PDO::FETCH_ASSOC)) {
            $cited_posts[$cited['id']] = $cited['thread'] ? $cited['thread'] : false;
        }
        foreach ($cites as $matches) {
            $cite = $matches[2][0];
            // preg_match_all is not multibyte-safe
            foreach ($matches as &$match) {
                $match[1] = mb_strlen(substr($body_tmp, 0, $match[1]));
            }
            if (isset($cited_posts[$cite])) {
                $replacement = '<a onclick="highlightReply(\'' . $cite . '\');" href="' . $config['root'] . $board['dir'] . $config['dir']['res'] . ($cited_posts[$cite] ? $cited_posts[$cite] : $cite) . '.html#' . $cite . '">' . '&gt;&gt;' . $cite . '</a>';
                $body = mb_substr_replace($body, $matches[1][0] . $replacement . $matches[3][0], $matches[0][1] + $skip_chars, mb_strlen($matches[0][0]));
                $skip_chars += mb_strlen($matches[1][0] . $replacement . $matches[3][0]) - mb_strlen($matches[0][0]);
                if ($track_cites && $config['track_cites']) {
                    $tracked_cites[] = array($board['uri'], $cite);
                }
            }
        }
    }
    // Cross-board linking
    if (preg_match_all('/(^|\\s)&gt;&gt;&gt;\\/(' . $config['board_regex'] . 'f?)\\/(\\d+)?([\\s,.)?]|$)/um', $body, $cites, PREG_SET_ORDER | PREG_OFFSET_CAPTURE)) {
        if (count($cites[0]) > $config['max_cites']) {
            error($config['error']['toomanycross']);
        }
        $skip_chars = 0;
        $body_tmp = $body;
        if (isset($cited_posts)) {
            // Carry found posts from local board >>X links
            foreach ($cited_posts as $cite => $thread) {
                $cited_posts[$cite] = $config['root'] . $board['dir'] . $config['dir']['res'] . ($thread ? $thread : $cite) . '.html#' . $cite;
            }
            $cited_posts = array($board['uri'] => $cited_posts);
        } else {
            $cited_posts = array();
        }
        $crossboard_indexes = array();
        $search_cites_boards = array();
        foreach ($cites as $matches) {
            $_board = $matches[2][0];
            $cite = @$matches[3][0];
            if (!isset($search_cites_boards[$_board])) {
                $search_cites_boards[$_board] = array();
            }
            $search_cites_boards[$_board][] = $cite;
        }
        $tmp_board = $board['uri'];
        foreach ($search_cites_boards as $_board => $search_cites) {
            $clauses = array();
            foreach ($search_cites as $cite) {
                if (!$cite || isset($cited_posts[$_board][$cite])) {
                    continue;
                }
                $clauses[] = '`id` = ' . $cite;
            }
            $clauses = array_unique($clauses);
            if ($board['uri'] != $_board) {
                if (!openBoard($_board)) {
                    continue;
                }
                // Unknown board
            }
            if (!empty($clauses)) {
                $cited_posts[$_board] = array();
                $query = query(sprintf('SELECT `thread`, `id` FROM ``posts_%s`` WHERE ' . implode(' OR ', $clauses), $board['uri'])) or error(db_error());
                while ($cite = $query->fetch(PDO::FETCH_ASSOC)) {
                    $cited_posts[$_board][$cite['id']] = $config['root'] . $board['dir'] . $config['dir']['res'] . ($cite['thread'] ? $cite['thread'] : $cite['id']) . '.html#' . $cite['id'];
                }
            }
            $crossboard_indexes[$_board] = $config['root'] . $board['dir'] . $config['file_index'];
        }
        // Restore old board
        if ($board['uri'] != $tmp_board) {
            openBoard($tmp_board);
        }
        foreach ($cites as $matches) {
            $_board = $matches[2][0];
            $cite = @$matches[3][0];
            // preg_match_all is not multibyte-safe
            foreach ($matches as &$match) {
                $match[1] = mb_strlen(substr($body_tmp, 0, $match[1]));
            }
            if ($cite) {
                if (isset($cited_posts[$_board][$cite])) {
                    $link = $cited_posts[$_board][$cite];
                    $replacement = '<a ' . ($_board == $board['uri'] ? 'onclick="highlightReply(\'' . $cite . '\');" ' : '') . 'href="' . $link . '">' . '&gt;&gt;&gt;/' . $_board . '/' . $cite . '</a>';
                    $body = mb_substr_replace($body, $matches[1][0] . $replacement . $matches[4][0], $matches[0][1] + $skip_chars, mb_strlen($matches[0][0]));
                    $skip_chars += mb_strlen($matches[1][0] . $replacement . $matches[4][0]) - mb_strlen($matches[0][0]);
                    if ($track_cites && $config['track_cites']) {
                        $tracked_cites[] = array($_board, $cite);
                    }
                }
            } elseif (isset($crossboard_indexes[$_board])) {
                $replacement = '<a href="' . $crossboard_indexes[$_board] . '">' . '&gt;&gt;&gt;/' . $_board . '/' . '</a>';
                $body = mb_substr_replace($body, $matches[1][0] . $replacement . $matches[4][0], $matches[0][1] + $skip_chars, mb_strlen($matches[0][0]));
                $skip_chars += mb_strlen($matches[1][0] . $replacement . $matches[4][0]) - mb_strlen($matches[0][0]);
            }
        }
    }
    $tracked_cites = array_unique($tracked_cites, SORT_REGULAR);
    $body = preg_replace("/^\\s*&gt;.*\$/m", '<span class="quote">$0</span>', $body);
    if ($config['strip_superfluous_returns']) {
        $body = preg_replace('/\\s+$/', '', $body);
    }
    $body = preg_replace("/\n/", '<br/>', $body);
    if ($config['markup_repair_tidy']) {
        $tidy = new tidy();
        $body = str_replace("\t", '&#09;', $body);
        $body = $tidy->repairString($body, array('doctype' => 'omit', 'bare' => true, 'literal-attributes' => true, 'indent' => false, 'show-body-only' => true, 'wrap' => 0, 'output-bom' => false, 'output-html' => true, 'newline' => 'LF', 'quiet' => true), 'utf8');
        $body = str_replace("\n", '', $body);
    }
    // replace tabs with 8 spaces
    $body = str_replace("\t", '        ', $body);
    return $tracked_cites;
}
Example #7
0
<?php

define('URL', 'http://forum.mods.de/bb/');
require_once './bbcode/Parser.php';
require_once 'ModsCodeDefinitions.php';
$parser = new JBBCode\Parser();
$parser->addCodeDefinitionSet(new JBBCode\DefaultCodeDefinitionSet());
$builder = new QuoteCodeDefinition();
$builder->setUseOption(true);
$parser->addCodeDefinition($builder);
$builder = new QuoteCodeDefinition();
$parser->addCodeDefinition($builder);
$builder = new YouTubeCodeDefinition();
$parser->addCodeDefinition($builder);
function holeBoardAlsXML($page)
{
    $boardUrl = URL . 'xml/board.php?BID=14';
    if (isset($page)) {
        if ($page < 1) {
            $page = 1;
        }
    } else {
        $page = 1;
    }
    $boardUrl .= '&page=' . $page;
    return simplexml_load_file($boardUrl);
}
function holeThreadAlsXML($threadId, $page)
{
    $threadUrl = URL . 'xml/thread.php?TID=' . $threadId . '&page=' . $page;
    return simplexml_load_file($threadUrl);
Example #8
0
 /**
  * Gets html from bbcode.
  *
  * @param string $bbcode
  * @return string
  */
 public function getHtmlFromBBCode($bbcode)
 {
     require_once APPLICATION_PATH . '/libraries/jbbcode/Parser.php';
     $parser = new \JBBCode\Parser();
     $parser->addCodeDefinitionSet(new \JBBCode\DefaultCodeDefinitionSet());
     $builder = new \JBBCode\CodeDefinitionBuilder('quote', '<div class="quote">{param}</div>');
     $parser->addCodeDefinition($builder->build());
     $builder = new \JBBCode\CodeDefinitionBuilder('list', '<ul>{param}</ul>');
     $parser->addCodeDefinition($builder->build());
     $builder = new \JBBCode\CodeDefinitionBuilder('*', '<li>{param}</li>');
     $parser->addCodeDefinition($builder->build());
     $builder = new \JBBCode\CodeDefinitionBuilder('email', '<a href="mailto:{param}">{param}</a>');
     $parser->addCodeDefinition($builder->build());
     $builder = new \JBBCode\CodeDefinitionBuilder('img', '<img src="{param}" alt="Image">');
     $parser->addCodeDefinition($builder->build());
     $builder = new \JBBCode\CodeDefinitionBuilder('i', '<em>{param}</em>');
     $parser->addCodeDefinition($builder->build());
     $builder = new \JBBCode\CodeDefinitionBuilder('u', '<u>{param}</u>');
     $parser->addCodeDefinition($builder->build());
     $builder = new \JBBCode\CodeDefinitionBuilder('url', '<a href="{option}">{param}</a>');
     $builder->setUseOption(true)->setOptionValidator(new \JBBCode\validators\UrlValidator());
     $parser->addCodeDefinition($builder->build());
     $builder = new \JBBCode\CodeDefinitionBuilder('code', '<pre class="code">{param}</pre>');
     $builder->setParseContent(false);
     $parser->addCodeDefinition($builder->build());
     $parser->parse($bbcode);
     return $parser->getAsHTML();
 }
Example #9
0
     {
         parent::__construct();
         $this->setTagName("quote");
     }
     public function asHtml(JBBCode\ElementNode $el)
     {
         $result = "\n";
         foreach (preg_split("/\\R/", $this->getContent($el)) as $line) {
             $result .= "> " . $line . "\n";
         }
         return $result . "\n";
     }
 }
 $parser = new JBBCode\Parser();
 $builder = new JBBCode\CodeDefinitionBuilder('i', '/{param}/');
 $parser->addCodeDefinition($builder->build());
 $builder = new JBBCode\CodeDefinitionBuilder('u', '_{param}_');
 $parser->addCodeDefinition($builder->build());
 $builder = new JBBCode\CodeDefinitionBuilder('b', '*{param}*');
 $parser->addCodeDefinition($builder->build());
 $parser->addCodeDefinition(new QuoteWithOption());
 $parser->addCodeDefinition(new QuoteWithoutOption());
 $builder = new JBBCode\CodeDefinitionBuilder('code', '{param}');
 $parser->addCodeDefinition($builder->build());
 $builder = (new JBBCode\CodeDefinitionBuilder('color', '{param}'))->setUseOption(true);
 $parser->addCodeDefinition($builder->build());
 $builder = (new JBBCode\CodeDefinitionBuilder('size', '{param}'))->setUseOption(true);
 $parser->addCodeDefinition($builder->build());
 $parser->parse($message);
 $message = $parser->getAsHtml();
 // build the informational table