BBCode markup; provides automatic integration with lightbox. Author: Hydra, NoWhereMan Author URI: http://flatpress.sf.net */ require(plugin_getdir('bbcode') .'/inc/stringparser_bbcode.class.php'); require(plugin_getdir('bbcode') .'/panels/admin.plugin.panel.bbcode.php'); /** * Setups the plugin. */ function plugin_bbcode_startup() { // defintions part // load options $bbconf = plugin_getoptions('bbcode'); // get defaults if not configured define('BBCODE_ESCAPE_HTML', isset($bbconf['escape-html']) ? $bbconf['escape-html'] : true ); define('BBCODE_ENABLE_COMMENTS', isset($bbconf['comments']) ? $bbconf['comments'] : false ); define('BBCODE_USE_EDITOR', isset($bbconf['editor']) ? $bbconf['editor'] : true ); define('BBCODE_URL_MAXLEN', isset($bbconf['url-maxlen']) ? $bbconf['url-maxlen'] : 40 ); if (!file_exists('getfile.php')) { define('BBCODE_USE_WRAPPER', false); } else { $funcs = explode(',', ini_get('disable_functions')); if (in_array('readfile', $funcs)) { define('BBCODE_USE_WRAPPER', false); } else { define('BBCODE_USE_WRAPPER', true); } } // filter part #add_filter('comment_text', 'plugin_bbcode_comment'); add_filter('title_save_pre', 'wp_specialchars', 1); if (BBCODE_ESCAPE_HTML) { add_filter('content_save_pre', 'wp_specialchars', 1); } add_filter('pre_comment_author_name', 'wp_specialchars'); add_filter('pre_comment_content', 'wp_specialchars'); add_filter('the_content', 'BBCode', 1); add_filter('the_excerpt', 'BBCode', 1); add_filter('the_content', 'plugin_bbcode_undoHtml', 30); if (BBCODE_USE_EDITOR) { add_filter('editor_toolbar', 'plugin_bbcode_toolbar'); } if (BBCODE_ENABLE_COMMENTS) { add_filter('comment_text', 'plugin_bbcode_comment', 1); } } plugin_bbcode_startup(); /** * Adds special stlye definitions into the HTML head. * */ function plugin_bbcode_style() { echo " \n"; echo ' \n"; echo " \n"; } add_action('wp_head', 'plugin_bbcode_style'); /** * Remaps the URL so that there's no hint to your attachs/ directory. * * @param string $d * @return boolean */ function bbcode_remap_url(&$d) { // NWM: "attachs/" is interpreted as a keyword, and it is translated to the actual path of ATTACHS_DIR // CHANGE! we use the getfile.php script to mask the actual path of the attachs dir! // DMKE: I got an idea about an integer-id based download/media manager... work-in-progress if (strpos($d, ':') === false) { // if is relative url // absolute path, relative to this server if ($d[0] == '/') { /* BLOG_BASEURL contains a trailing slash in the end. If $d begins with a slash, we first strip it otherwise the string would look like http://mysite.com/flatpress//path/you/entered ^^ ugly double slash :P */ $d = BLOG_BASEURL . substr($d, 1); } if (substr($d, 0, 8) == 'attachs/') { $d = BBCODE_USE_WRAPPER ? 'getfile.php?f='. basename($d) .'&dl=true' : substr_replace ($d, ATTACHS_DIR, 0, 8 ); return true; } if (substr($d, 0, 7) == 'images/') { $d = substr_replace ($d, IMAGES_DIR, 0, 7 ); $d = BBCODE_USE_WRAPPER ? 'getfile.php?f='. basename($d) : $d; } return true; } if (strpos($d, 'www.') === 0) { $d = 'http://' . $d; } return false; } /** * Function to link documents. * * @param string $action * @param array $attributes * @param string $content * @param mixed $params Not used * @param mixed $node_object Not used * @return string */ function do_bbcode_url ($action, $attributes, $content, $params, $node_object) { if ($action == 'validate') { return true; } // the code was specified as follows: [url]http://.../[/url] if (!isset ($attributes['default'])) { // cut url if longer than > BBCODE_URL_MAXLEN $url = $content; if (($l = strlen($url)) > BBCODE_URL_MAXLEN) { $t = (int)(BBCODE_URL_MAXLEN / 2); $content = substr($url, 0, $t) .' … '. substr($url, $l-$t); } } else { // else the code was specified as follows: [url=http://.../]Text[/url] $url = $attributes['default']; } $local = bbcode_remap_url($url); $the_url = $local ? (BLOG_BASEURL . $url) : $url; // DMKE: uh? $content = $content; $rel = isset($attributes['rel']) ? ' rel="' . $attributes['rel'] . '"' : ''; $extern = !$local ? ' class="externlink" title="Go to '.$the_url.'"' : ''; return ''. $content .''; } /** * Function to include images. * * @param string $action * @param array $attributes * @param string $content * @param mixed $params Not used * @param mixed $node_object Not used * @return string */ function do_bbcode_img($action, $attributes, $content, $params, $node_object) { if ($action == 'validate') { return true; } if (!isset($attributes['default'])) { return '[No valid img specified]'; } $absolutepath = $actualpath = $attributes['default']; // NWM: "images/" is interpreted as a keyword, and it is translated to the actual path of IMAGES_DIR $image_is_local = bbcode_remap_url($actualpath); $float = ' class="center" '; $popup_start = ''; $popup_end = ''; $alt = $title = basename($actualpath); $img_size = array(); // let's disable socket functions for remote files // slow remote servers may otherwise lockup the system if ($image_is_local) { $img_info = array(); $img_size = @getimagesize($actualpath, $img_info); $absolutepath = BLOG_BASEURL . $actualpath; if (function_exists('iptcparse')) { if ($img_size['mime'] == 'image/jpeg') { // tiffs won't be supported if(is_array($img_info)) { $iptc = iptcparse($img_info["APP13"]); $title = @$iptc["2#005"][0]? wp_specialchars($iptc["2#005"][0]) : $title; $alt = isset($iptc["2#120"][0])? wp_specialchars($iptc["2#120"][0],1) : $title; } } } } $orig_w = $width = isset($img_size[0]) ? $img_size[0] : 0; $orig_h = $height = isset($img_size[1]) ? $img_size[1] : 0; $thumbpath = null; // default: resize to 0, which means leaving it as it is, as width and hight will be ignored ;) $scalefact = 0; /* scale attribute has priority over width and height if scale is set popup is set to true automatically, unless it is explicitly set to false */ if (isset($attributes['scale'])) { if (substr($attributes['scale'], -1, 1) == '%') { // Format: NN%. We ignore % $val = substr($attributes['scale'], 0, -1); } else { $val = $attributes['scale']; } $scalefact = $val / 100.0; $width = (int)($scalefact * $width); $height = (int)($scalefact * $height); } elseif (isset($attributes['width']) && isset($attributes['height'])) { // if both width and height are set, we assume proportions are ok $width = (int)$attributes['width']; $height = (int)$attributes['height']; } elseif (isset($attributes['width'])) { // if only width is set we calc proportions $scalefact = $orig_w? ($attributes['width'] / $orig_w) : 0; $width = (int)$attributes['width']; $height = (int)($scalefact * $orig_h); } elseif (isset($attributes['height'])) { // if only height is set we calc proportions $scalefact = $orig_w? ($attributes['height'] / $orig_h) : 0; $height = (int)$attributes['height']; $width = (int)($scalefact * $orig_w); } if ($height < $orig_h) { $attributes['popup'] = true; } if ($height != $orig_h) { #bbcode_img_scale_filter($actualpath, $img_props, $newsize) $thumbpath = apply_filters( 'bbcode_img_scale', $actualpath, $img_size, array($width, $height) ); } if (isset($attributes['popup']) && ($attributes['popup'])) { $pop_width = $orig_w ? $orig_w : 800; $pop_height = $orig_h ? $orig_h : 600; $popup = ' onclick="Popup=window.open("'. $absolutepath .'","Popup","toolbar=no,location=no,status=no," ."menubar=no,scrollbars=yes,resizable=yes,width=' . $pop_width .',height='. $pop_height .'"); return false;"'; // Plugin hook, here lightbox attachs $popup = apply_filters('bbcode_img_popup', $popup, $absolutepath); $popup_start = $attributes['popup'] == 'true' ? '' : ''; $popup_end = $attributes['popup'] == 'true' ? '' : ''; } $img_width = $width ? ' width="'.$width.'"' : ''; $img_height = $height ? ' height="'.$height.'"' : '' ; if (isset($attributes['float'])) { $float = ($attributes['float'] == 'left' || $attributes['float'] == 'right') ? ' class="float'. $attributes['float'] .'"' : ' class="center"'; } $src = $thumbpath ? (BLOG_BASEURL . $thumbpath) : $absolutepath; // $attributes['default']) $pop = $popup_start ? '' : ' title="'.$title.'" '; return $popup_start .''. $alt. ''. $popup_end; } /** * Function for embedding videos * * @param string $action * @param array $attr * @param string $content * @param mixed $params Not used * @param mixed $node_object Not used * @return string */ function do_bbcode_video($action, $attr, $content, $params, $node_object) { if ($action == 'validate') { return true; } $vurl = parse_url($attr['default']); if (isset($attr['type'])) { $type = $attr['type']; } else { // is it http://www.MYSITE.com or http://MYSITE.com ? $web = explode('.', $vurl['host']); array_pop($web); $type = isset($web[1]) ? $web[1] : $web[0]; } $query = utils_kexplode($vurl['query'], '=&'); $the_url = null; $others = ''; switch ($type) { case 'google': $the_url = "http://video.google.com/googleplayer.swf?docid={$query['docid']}"; $others = ''; break; case 'youtube': $the_url = "http://youtube.com/v/{$query['v']}"; break; case 'default': default: $the_url = null; } if ($the_url) { $width = isset($attr['width']) ? $attr['width'] : '400'; $height = isset($attr['height']) ? $attr['height'] : '326'; $float = isset($attr['float']) ? "style=\"float: {$attr['float']}\" " : ''; return '' . $others .''; } return '[unsupported video]'; } /** * Function to return code * * @param string $action * @param array $attributes * @param string $content * @param mixed $params Not used * @param mixed $node_object Not used * @return string */ function do_bbcode_code ($action, $attributes, $content, $params, $node_object) { if ($action == 'validate') { return true; } $temp_str = $content; $temp_str = str_replace('
', chr(10), $temp_str); $temp_str = str_replace(chr(10). chr(10), chr(10), $temp_str); $temp_str = str_replace(chr(32), ' ', $temp_str); if (!BBCODE_ESCAPE_HTML) { $temp_str = wp_specialchars($temp_str); } $a = ''; if (function_exists('plugin_syntaxhighlighter_foot')) { if (isset($attributes['default'])) { $a = $attributes['default']; $p = explode(':', $a); plugin_syntaxhighlighter_add($p[0]); } } if ($a) { $a = ' class="'. $a; } return ''. $temp_str .''; } /** * Function to return html * * @param string $action * @param array $attributes * @param string $content * @param mixed $params Not used * @param mixed $node_object Not used * @return string */ function do_bbcode_html ($action, $attributes, $content, $params, $node_object) { if ($action == 'validate') { return true; } static $count = 0; // NWM: life is hell -___-' if (!isset($GLOBALS['BBCODE_TEMP_HTML'])) { $GLOBALS['BBCODE_TEMP_HTML'] = array(); } $GLOBALS['BBCODE_TEMP_HTML'][$count] = $content; $str = ""; $count++; return $str; } /** * Function to colorize text. * * @param string $action * @param array $attributes * @param string $content * @param mixed $params Not used * @param mixed $node_object Not used * @return string */ function do_bbcode_color ($action, $attributes, $content, $params, $node_object) { if ($action == 'validate') { return true; } return ''. $content .''; } /** * Function to set font size. * * @param string $action * @param array $attributes * @param string $content * @param mixed $params Not used * @param mixed $node_object Not used * @return string */ function do_bbcode_size ($action, $attributes, $content, $params, $node_object) { if ($action == 'validate') { return true; } return ''. $content .''; } /** * Function to align elements. * * @param string $action * @param array $attributes * @param string $content * @param mixed $params Not used * @param mixed $node_object Not used * @return string */ function do_bbcode_align($action, $attr, $content, $params, $node_object) { return '
'. $content .'
'; } /** * Function to make a list. * * @param string $action * @param array $attributes * @param string $content * @param mixed $params Not used * @param mixed $node_object Not used * @return string */ function do_bbcode_list ($action, $attributes, $content, $params, $node_object) { if ($action == 'validate') { return true; } if (isset($attributes['default']) && $attributes['default'] == '#' ) { $list = 'ol'; } else { $list = 'ul'; } return "<$list>$content"; } /** * Initializes the BBCode parser. * * @return object */ function &plugin_bbcode_init() { static $bbcode = null; if (!defined('BBCODE_INIT_DONE')) { $bbcode = new StringParser_BBCode(); // If you set it to false the case-sensitive will be ignored for all codes $bbcode->setGlobalCaseSensitive(false); $bbcode->setMixedAttributeTypes(true); $BBCODE_TAGS_SIMPLE = array( 'b' => 'strong', 'i' => 'em', 'quote' => 'blockquote', 'blockquote', 'strong', 'em', 'ins', 'del', 'hr','h2','h3','h4','h5','h6' // u for underlined: see below ); foreach ($BBCODE_TAGS_SIMPLE as $key => $val) { if (!is_numeric($key)) { $bbtag = $key; $htmltag = $val; } else { $htmltag = $bbtag = $val; } $bbcode->addCode ( $bbtag, 'simple_replace', null, array( 'start_tag' => "<$htmltag>", 'end_tag' => "" ), 'inline', array( 'listitem', 'block', 'inline', 'link' ), array() ); $bbcode->setCodeFlag($bbtag, 'closetag', BBCODE_CLOSETAG_MUSTEXIST); } /* other tags */ $bbcode->addCode( 'u', 'simple_replace', null, array( 'start_tag' => '', 'end_tag' => '' ), 'inline', array( 'listitem', 'block', 'inline', 'link'), array() ); $bbcode->addCode( 'color', 'callback_replace', 'do_bbcode_color', array( 'usecontent_param' => array('default') ), 'inline', array( 'listitem', 'block', 'inline', 'link' ), array() ); $bbcode->setCodeFlag('color', 'closetag', BBCODE_CLOSETAG_MUSTEXIST); $bbcode->addCode( 'size', 'callback_replace', 'do_bbcode_size', array( 'usecontent_param' => array('default') ), 'inline', array( 'listitem', 'block', 'inline', 'link' ), array() ); $bbcode->setCodeFlag('color', 'closetag', BBCODE_CLOSETAG_MUSTEXIST); $bbcode->addCode( 'code', 'usecontent', 'do_bbcode_code', array(), 'inline', array( 'listitem', 'block', 'inline', 'link' ), array() ); $bbcode->setCodeFlag('code', 'closetag', BBCODE_CLOSETAG_MUSTEXIST); $bbcode->addCode( 'html', 'usecontent', 'do_bbcode_html', array(), 'inline', array( 'listitem', 'block', 'inline', 'link' ), array() ); $bbcode->setCodeFlag('html', 'closetag', BBCODE_CLOSETAG_MUSTEXIST); $bbcode->addCode( 'url', 'callback_replace', 'do_bbcode_url', array( 'usecontent_param' => array('default', 'new') ), 'link', array( 'listitem', 'block', 'inline' ), array('link') ); $bbcode->addCode( 'img', 'callback_replace_single', 'do_bbcode_img', array( 'usecontent_param' => array( 'default', 'float', 'alt', 'popup', 'width', 'height', 'title' ) ), 'image', array( 'listitem', 'block', 'inline', 'link' ), array()); $bbcode->setCodeFlag('img', 'closetag', 'BBCODE_CLOSETAG_FORBIDDEN'); $bbcode->addCode( 'video', 'callback_replace_single', 'do_bbcode_video', array( 'usecontent_param' => array( 'default', 'float', 'width', 'height' ) ), 'image', array( 'listitem', 'block', 'inline', 'link' ), array() ); $bbcode->setCodeFlag('video', 'closetag', 'BBCODE_CLOSETAG_FORBIDDEN'); $bbcode->addCode ( 'list', 'callback_replace', 'do_bbcode_list', array( 'start_tag' => '' ), 'list', array( 'block', 'listitem' ), array() ); $bbcode->setCodeFlag('list', 'closetag', BBCODE_CLOSETAG_MUSTEXIST); $bbcode->setCodeFlag('list', 'paragraph_type', BBCODE_PARAGRAPH_BLOCK_ELEMENT); $bbcode->setCodeFlag('list', 'opentag.before.newline', BBCODE_NEWLINE_DROP); $bbcode->setCodeFlag('list', 'closetag.before.newline', BBCODE_NEWLINE_DROP); $bbcode->addCode( '*', 'simple_replace', null, array( 'start_tag' => '
  • ', 'end_tag' => '
  • ' ), 'listitem', array('list'), array() ); $bbcode->setCodeFlag('*', 'closetag', BBCODE_CLOSETAG_OPTIONAL); $bbcode->setCodeFlag('*', 'paragraphs', false); $bbcode->addCode( 'align', 'callback_replace', 'do_bbcode_align', array( 'usecontent_param' => array('default') ), 'block', array( 'listitem', 'block', 'inline', 'link' ), array() ); define('BBCODE_INIT_DONE', true); // DMKE: there's no bbcode_init filter defined $bbcode = apply_filters('bbcode_init', $bbcode); } return $bbcode; } /** * Enter description here... * * @param string $text * @return string */ function BBCode($text) { $bbcode =& plugin_bbcode_init(); return $bbcode->parse($text); } /** * Adds a Toolbar to admin panels write entry. * * @global $_FP_SMARTY */ function plugin_bbcode_toolbar() { global $_FP_SMARTY; // get all available images $indexer = new fs_filelister(IMAGES_DIR); $imageslist = $indexer->getList(); array_unshift($imageslist, '--'); $_FP_SMARTY->assign('images_list', $imageslist); // get all available attachements $indexer = new fs_filelister(ATTACHS_DIR); $attachslist = $indexer->getList(); array_unshift($attachslist, '--'); $_FP_SMARTY->assign('attachs_list', $attachslist); // DMKE: does not work #$bblang = lang_load('plugin:bbcode'); #$_FP_SMARTY->assign('bblang', $bblang); echo "\n"; echo ''."\n"; echo $_FP_SMARTY->fetch('plugin:bbcode/toolbar'); echo "\n"; } /** * Simplified codes for comments. * * @param string $text * @return strng */ function plugin_bbcode_comment($text) { $bbcode = new StringParser_BBCode(); // If you set it to false the case-sensitive will be ignored for all codes $bbcode->setGlobalCaseSensitive (false); $bbcode->setMixedAttributeTypes(true); $bbcode->addCode( 'b', 'simple_replace', null, array( 'start_tag' => '', 'end_tag' => '' ), 'inline', array( 'listitem', 'block', 'inline', 'link' ), array() ); $bbcode->addCode( 'strong', 'simple_replace', null, array( 'start_tag' => '', 'end_tag' => '' ), 'inline', array( 'listitem', 'block', 'inline', 'link' ), array() ); $bbcode->addCode( 'i', 'simple_replace', null, array( 'start_tag' => '', 'end_tag' => '' ), 'inline', array( 'listitem', 'block', 'inline', 'link' ), array() ); $bbcode->addCode( 'em', 'simple_replace', null, array( 'start_tag' => '', 'end_tag' => '' ), 'inline', array( 'listitem', 'block', 'inline', 'link' ), array() ); $bbcode->addCode( 'ins', 'simple_replace', null, array( 'start_tag' => '', 'end_tag' => '' ), 'inline', array( 'listitem', 'block', 'inline', 'link' ), array()); $bbcode->addCode( 'u', 'simple_replace', null, array( 'start_tag' => '', 'end_tag' => '' ), 'inline', array( 'listitem', 'block', 'inline', 'link' ), array()); $bbcode->addCode( 'del', 'simple_replace', null, array( 'start_tag' => '', 'end_tag' => '' ), 'inline', array( 'listitem', 'block', 'inline', 'link' ), array()); $bbcode->addCode( 'strike', 'simple_replace', null, array( 'start_tag' => '', 'end_tag' => '' ), 'inline', array( 'listitem', 'block', 'inline', 'link' ), array()); $bbcode->addCode( 'blockquote', 'simple_replace', null, array( 'start_tag' => '

    ', 'end_tag' => '

    ' ), 'inline', array( 'listitem', 'block', 'inline', 'link' ), array() ); $bbcode->addCode( 'quote', 'simple_replace', null, array( 'start_tag' => '

    ', 'end_tag' => '

    ' ), 'inline', array( 'listitem', 'block', 'inline', 'link' ), array() ); $bbcode->addCode( 'pre', 'simple_replace', null, array( 'start_tag' => '
    ',
    			'end_tag' => '
    ' ), 'inline', array( 'listitem', 'block', 'inline', 'link' ), array()); $bbcode->addCode( 'code', 'usecontent', 'do_bbcode_code', array(), 'inline', array( 'listitem', 'block', 'inline', 'link' ), array() ); return $bbcode->parse($text); } /** * This is for [html] tag postprocess * * @param unknown_type $match * @return unknown */ function plugin_bbcode_undoHtmlCallback($match) { //builtin function (see core.wp-formatting) return clean_pre($match[1]); } /** * Enter description here... * * @param string $text * @return string */ function plugin_bbcode_undoHtml($text) { #return preg_replace_callback('|(.*)|sU', 'plugin_bbcode_undoHtmlCallback', $text); if (isset($GLOBALS['BBCODE_TEMP_HTML'])) { foreach ($GLOBALS['BBCODE_TEMP_HTML'] as $n => $content) { // html_entity_decode($content) $content = str_replace('<', '<', $content); $content = str_replace('>', '>', $content); $text = str_replace("", $content, $text); } $GLOBALS['BBCODE_TEMP_HTML'] = array(); } return $text; } ?>