Go Back   vb.org Archive > vBulletin 3 Discussion > vB3 Programming Discussions
FAQ Community Calendar Today's Posts Search

Reply
 
Thread Tools Display Modes
  #1  
Old 02-10-2008, 01:41 PM
Tefra's Avatar
Tefra Tefra is offline
 
Join Date: Mar 2005
Posts: 68
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default Autolink strings in custom mod

I have created a custom terminology/glossary mod for vb, and i have also included a simple function to auto link to other terms. but i have two major issues. It breaks html tags.

Any help is appreciated, the preg_replace in line 15 is the vbulletin method to highlight strings, if that helps...

PHP Code:
function terms_build_relation($message$intermid 0)
{
    global 
$db;

    
$words         = array();
    
$keywords     $db->escape_string(strip_tags($message));
    
$sql         $db->query_read("SELECT term_id, term_title FROM ".VBSED_PREFIX."terms WHERE MATCH(term_title) AGAINST('$keywords') ".iif($intermid"AND term_id <> $intermid"'')." AND term_active = 1");
                    
    while(
$sim $db->fetch_array($sql)) {    $words[$sim['term_id']] = $sim['term_title']; }
    
    
$message str_replace('\"''"'$message);
    foreach (
$words AS $key => $rep)
    {
        if(
in_array(strtolower($rep), array('http''https''ftp'))) continue; //Not Good Enough
        
$message preg_replace('#(?<=[\s"\]>()]|^)(' $rep ')(([.,:;-?!()\s"<\[]|$))#siU''[term='.$key.']\\1[/term]\\2'$message1);
    }
    
$message ereg_replace('\\[term=([0-9]+)\\]([^\\[]*)\\[/term\\]''<em><a href="'.VBSED_TERMS_URL.'item=\\1">\\2</a></em>'$message);
    
$message ereg_replace('\\[term=([0-9]+)\\]([^\\[]*)\\[/term\\]''\\2'$message); // BUG Step 1!!! Remove any open term bbcode
    
return $message;    

The second issue is that sometimes it breaks into other autolinked terms, that's why in the end i replace any open term bbcode.

For example, there are the terms "system" and "system registry". In a 3rd term definition there is the string "system registry". In the first pass it replaces the "system" term but in the second pass it tries to replace the whole string "system registry" Here comes in hand the removal of the empty term bbcode. This isn't a great issue as the first one as i believe if the first issue is fixed this will also be gone.

You can check it out here
Here is an example breaking img tag with the tag parameter.
Reply With Quote
  #2  
Old 02-12-2008, 10:00 AM
Tefra's Avatar
Tefra Tefra is offline
 
Join Date: Mar 2005
Posts: 68
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Here is a different version which seems to be working better without breaking the original html tags at least. The process is based on this highlight function.

PHP Code:
function terms_build_relation($message$intermid 0)
{
    global 
$db;

    
$words         = array();
    
$keywords     $db->escape_string(strip_tags($message));
    
$sql         $db->query_read("SELECT term_id, term_title FROM ".VBSED_PREFIX."terms WHERE MATCH(term_title) AGAINST('$keywords') ".iif($intermid"AND term_id <> $intermid"'')." AND term_active = 1");            
    while(
$sim     $db->fetch_array($sql)) {    $words[$sim['term_id']] = $sim['term_title']; }
    
$message str_replace('\"''"'$message);
    
$pattern '#(?!<.*?)(%s)(?![^<>]*?>)#i';
    foreach (
$words AS $key => $word)
    {
        
$word         =     '\b' preg_quote($word) . '\b';
        
$replace     =     '<em><a href="'.VBSED_TERMS_URL.'item='.$key.'">\1</a></em>';
        
$search     =     sprintf($pattern$word);
        
$message     =     preg_replace($search$replace$message1);
    }
    return 
$message;    

Reply With Quote
  #3  
Old 02-12-2008, 04:19 PM
cheesegrits's Avatar
cheesegrits cheesegrits is offline
 
Join Date: May 2006
Posts: 500
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Personally I found it worth shelling out the 20 drinking vouchers on GALS, despite the slightly Beta-ish status and a few shortcomings. It works very well, has popup definitions as well as click throughs. And the stats keeping is interesting, being able to see how many folk actually click through to a given definition.

Maybe not as much fun as writing your own, but if you are pressed for time, definitely worth a look.

-- hugh
Reply With Quote
  #4  
Old 02-12-2008, 07:25 PM
Tefra's Avatar
Tefra Tefra is offline
 
Join Date: Mar 2005
Posts: 68
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
Default

Hrm the gals works with predefined keywords, the auto links in my case are produced dynamically with a query, this gives me the option to extend the autolinks to other sections custom pages, other mods etc etc

Well i don't want to pay for a whole product just to borrow some regex, more important i don't even know if it works like i want. With the last version of that function i solved my problem with broken html tags but there is still the occasional issue with the links over links.

e.g
PHP Code:
<em><a href="http://www.3dacc.net/terms.php?item=439"><em><a href="http://www.3dacc.net/terms.php?item=374">port</a></emscanning</a></em
Reply With Quote
Reply


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT. The time now is 07:44 PM.


Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2024, vBulletin Solutions Inc.
X vBulletin 3.8.12 by vBS Debug Information
  • Page Generation 0.07103 seconds
  • Memory Usage 2,224KB
  • Queries Executed 13 (?)
More Information
Template Usage:
  • (1)SHOWTHREAD
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_header_end
  • (1)ad_header_logo
  • (1)ad_navbar_below
  • (1)ad_showthread_beforeqr
  • (1)ad_showthread_firstpost
  • (1)ad_showthread_firstpost_sig
  • (1)ad_showthread_firstpost_start
  • (3)bbcode_php
  • (1)footer
  • (1)forumjump
  • (1)forumrules
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (1)navbar
  • (3)navbar_link
  • (120)option
  • (4)post_thanks_box
  • (4)post_thanks_button
  • (1)post_thanks_javascript
  • (1)post_thanks_navbar_search
  • (4)post_thanks_postbit_info
  • (4)postbit
  • (4)postbit_onlinestatus
  • (4)postbit_wrapper
  • (1)spacer_close
  • (1)spacer_open
  • (1)tagbit_wrapper 

Phrase Groups Available:
  • global
  • inlinemod
  • postbit
  • posting
  • reputationlevel
  • showthread
Included Files:
  • ./showthread.php
  • ./global.php
  • ./includes/init.php
  • ./includes/class_core.php
  • ./includes/config.php
  • ./includes/functions.php
  • ./includes/class_hook.php
  • ./includes/modsystem_functions.php
  • ./includes/functions_bigthree.php
  • ./includes/class_postbit.php
  • ./includes/class_bbcode.php
  • ./includes/functions_reputation.php
  • ./includes/functions_post_thanks.php 

Hooks Called:
  • init_startup
  • init_startup_session_setup_start
  • init_startup_session_setup_complete
  • cache_permissions
  • fetch_postinfo_query
  • fetch_postinfo
  • fetch_threadinfo_query
  • fetch_threadinfo
  • fetch_foruminfo
  • style_fetch
  • cache_templates
  • global_start
  • parse_templates
  • global_setup_complete
  • showthread_start
  • showthread_getinfo
  • forumjump
  • showthread_post_start
  • showthread_query_postids
  • showthread_query
  • bbcode_fetch_tags
  • bbcode_create
  • showthread_postbit_create
  • postbit_factory
  • postbit_display_start
  • post_thanks_function_post_thanks_off_start
  • post_thanks_function_post_thanks_off_end
  • post_thanks_function_fetch_thanks_start
  • post_thanks_function_fetch_thanks_end
  • post_thanks_function_thanked_already_start
  • post_thanks_function_thanked_already_end
  • fetch_musername
  • postbit_imicons
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • postbit_display_complete
  • post_thanks_function_can_thank_this_post_start
  • tag_fetchbit_complete
  • forumrules
  • navbits
  • navbits_complete
  • showthread_complete