PDA

View Full Version : Parsing BBCode to HTML


weicool
06-16-2007, 04:47 PM
Hey everyone,

I'm currently pulling the latest posts from one of my forums directly from the database and putting it on my main site (non-vB).

However, unsurprisingly, there is a bunch of BBCode mixed within the text (the pagetext column of the post table). How can I parse this BBCode to return HTML? Which vB file must I include and which function should I use?

Brad
06-17-2007, 12:07 AM
This should be all you need; :)

/*
Include and call the bbcode class
*/
require_once(DIR . '/includes/class_bbcode.php');
$bbcode =& new vB_BbCodeParser($vbulletin, fetch_tag_list());

/*
An example of using the class to parse data that contains bbcode
*/
$text = 'Some text with bbcode in it';

/* $forumid can be set to;
- 'calendar' (follows bbcode rules for the calendar)
- 'privatemessage' (follows bbcode rules for PMs)
- 'usernote' (follows bbcode rules for usernotes)
- 'signature' (follows bbcode rules for signatures)
- 'nonforum' (follows "global" bbcode rules as defined in vBoptions)
- 'announcement' (follows bbcode rules for announcements)
- 'Any vaild forumid' (example; 1, 2, 17, etc). Will follow bbcode rules for specified forumid. The array "$forum" must be defined and the function "fetch_foruminfo" must be defined for this to work.
*/
$forumid = 'nonforum'; // just to make things simple..;0

$allowsmilie = true; // parse smilies? true = yes, false = no.

// ## The code below will convert the bbcode to html using the rules above.
$parsed_text = $bbcode->parse($text, $forumid, $allowsmilie);

weicool
06-17-2007, 06:31 AM
This should be all you need; :)

/*
Include and call the bbcode class
*/
require_once(DIR . '/includes/class_bbcode.php');
$bbcode =& new vB_BbCodeParser($vbulletin, fetch_tag_list());

/*
An example of using the class to parse data that contains bbcode
*/
$text = 'Some text with bbcode in it';

/* $forumid can be set to;
- 'calendar' (follows bbcode rules for the calendar)
- 'privatemessage' (follows bbcode rules for PMs)
- 'usernote' (follows bbcode rules for usernotes)
- 'signature' (follows bbcode rules for signatures)
- 'nonforum' (follows "global" bbcode rules as defined in vBoptions)
- 'announcement' (follows bbcode rules for announcements)
- 'Any vaild forumid' (example; 1, 2, 17, etc). Will follow bbcode rules for specified forumid. The array "$forum" must be defined and the function "fetch_foruminfo" must be defined for this to work.
*/
$forumid = 'nonforum'; // just to make things simple..;0

$allowsmilie = true; // parse smilies? true = yes, false = no.

// ## The code below will convert the bbcode to html using the rules above.
$parsed_text = $bbcode->parse($text, $forumid, $allowsmilie);


Thanks a lot! :D

However, when I tried to do that, I get this error message:

Fatal error: Class 'vBulletinHook' not found in /mnt/w0800/d09/s41/b027ae64/www/forums/includes/class_bbcode.php on line 2347

Looking at the code in class_bbcode.php, it seems to abruptly call on a vBulletinHook without ever declaring it. I'm very new to PHP...

What would be the problem here?

Dismounted
06-17-2007, 06:52 AM
You'll need to have this above that code:
$curdir = cwd();
chdir('./PATH/TO/FORUMS/');
require_once('./global.php');
chdir($curdir);

weicool
06-17-2007, 04:49 PM
Almost seems to work...but still a little error:

$bbcode =& new vB_BbCodeParser($vbulletin, fetch_tag_list());

That line seems to be problematic.

I get the following error message:

Fatal error: Call to a member function query_read_slave() on a non-object in /mnt/w0800/d09/s41/b027ae64/www/forums/includes/class_bbcode.php on line 198

weicool
06-18-2007, 06:25 PM
Can someone please give me the last bit of information I need to get this thing working...?

Augusto
09-03-2007, 01:23 AM
here's a working sample of it that works in the forum installation directory:

<?php

require_once('global.php');
require_once('includes/class_bbcode.php');
$bbcode =& new vB_BbCodeParser($vbulletin, fetch_tag_list()); // call the bbcode class
$text = 'Some text with bbcode in it'; // data that contains bbcode
$forumid = 'nonforum'; // (follows "global" bbcode rules as defined in vBoptions)
$allowsmilie = true; // parse smilies? true = yes, false = no.
$parsed_text = $bbcode->parse($text, $forumid, $allowsmilie); // Parse the text
echo("<html>");
echo($parsed_text);
echo("</html>");

?>

save it as "testparser.php" and simply run it in your forum installation directory as www.yourforum.com/forum/testparser.php

it should print this: "Some text with bbcode in it"

XManuX
09-05-2007, 09:30 AM
I'm having exactly the same error message :

Fatal error: Call to a member function on a non-object in /path/class_bbcode.php on line 198

I'm trying to acheive the same thing : parsing bbcodes in posts that i am currently displaying outside the forum (non-vb.)

my code is :

$cwd = getcwd();
$vbpath = $_SERVER['DOCUMENT_ROOT'] . get_option('vbb_VBRPATH');
chdir($vbpath);
require_once('./global.php');
chdir($cwd);
require_once($vbpath . '/includes/class_bbcode.php');
$bbcode =& new vB_BbCodeParser($vbulletin, fetch_tag_list());


no errors displayed since i added the last line :confused:

@Augusto : i tried your test successfully.

dolbex
11-09-2007, 02:39 AM
I am still having a really tough time with pulling this off in 3.6. I continue to get the error:

Fatal error: Call to a member function query_read_slave() on a non-object in /var/www/newspail3/forums/includes/class_bbcode.php on line 213

from outside the forum directory.

--------------- Added 1194608789 at 1194608789 ---------------

Figured this out.

I had these examples embedded within functions. I don't quite understand why they wouldn't work but I assigned $bbcode when I was inside my forum directory

chdir(FORUM_DIRECTORY);
require_once(FORUM_DIRECTORY . 'global.php');
require_once(FORUM_DIRECTORY . 'includes/class_bbcode.php');
$bbcode =& new vB_BbCodeParser($vbulletin, fetch_tag_list());
chdir ($curdir);

I then passed $bbcode into the function and that worked.

jonbach
06-09-2009, 04:16 AM
I can confirm the last post. This method does not work when part of a function, which is a big problem when integrating into some existing sites.

This works:
$cwd = getcwd();
chdir("/mypath");
include("/mypath/global.php");
include("/mypath/includes/class_bbcode.php");
$bb_parser =& new vB_BbCodeParser($vbulletin, fetch_tag_list());
chdir($cwd);

function bb_convert_works($bb_parser, $text){
$parsed_text = $bb_parser->do_parse($text);
return $parsed_text;
}

$text = "Google (http://www.google.com)";
echo bb_convert_works($bb_parser, $text);

This does NOT work:
function bb_convert_doesnt_work($text){
$cwd = getcwd();
chdir("/mypath");
include("/mypath/global.php");
include("/mypath/includes/class_bbcode.php");
$bb_parser =& new vB_BbCodeParser($vbulletin, fetch_tag_list());
chdir($cwd);
$parsed_text = $bb_parser->do_parse($text);
return $parsed_text;
}

$text = "Google (http://www.google.com)";
echo bb_convert_doesnt_work($text);

The errors I get when I try the second code are:
Warning: array_keys() [function.array-keys]: The first argument should be an array in [path]/includes/functions.php on line 4227

Warning: Invalid argument supplied for foreach() in [path]/includes/functions.php on line 4227

Fatal error: Call to a member function query_read_slave() on a non-object in /mypath/includes/functions.php on line 3189

I have plenty of experience in PHP, but I haven't encountered a problem like this before. I really would prefer to not have to hack this together by hard coding the conversion code everywhere I need it. Does anyone have any ideas on why it breaks when within a function?

Dismounted
06-09-2009, 06:49 AM
global.php cannot be included outside of global scope.

vcor
08-11-2009, 09:40 PM
global.php cannot be included outside of global scope.

Could you explain that a bit more? I'm good with PHP, but never seen this kind of problem before. Does this mean global.php has to be modified to work from functions? Hopefully not, as I suspect it's a big task.

Likely should be another thread, but I also get identical the error:
Fatal error: Call to a member function query_read_slave() on a non-object in /mypath/includes/functions.php on line 3189

This error has only started to appear over the last few weeks (with v3.8.3), and I've not made any code changes, nor have I seen this error in the last year or so (I carefully track PHP errors).

Similar to jonbach's function, I use a function to handle creating threads:


function newThread() {
... initialization stuff

chdir($forumDir);
require_once('./global.php');
require_once(DIR . '/includes/functions_databuild.php'); // for new thread

... forum actions

chdir($curDir);
}


This has been working perfectly for quite a while (many vBulletin versions over a year or so), so it's also puzzling why it's worked before and lately generates errors.