vb.org Archive

vb.org Archive (https://vborg.vbsupport.ru/index.php)
-   vB4 General Discussions (https://vborg.vbsupport.ru/forumdisplay.php?f=251)
-   -   Forcing Capitalization with PHP (https://vborg.vbsupport.ru/showthread.php?t=283275)

Lotus28 05-21-2012 10:19 PM

Forcing Capitalization with PHP
 
I am using this simple php code to force thread titles to capitalize the first letter of each word:

Code:


$smallwords = array( 'a','of','the');

$words = explode(' ', $vbulletin->GPC['subject']);

foreach ($words as $key => $word) {
    if (!$key or !in_array($word, $smallwords)) $words[$key] = ucwords($word);
 }
 
$vbulletin->GPC['subject'] = implode(' ' , $words);

I also want to be able to force certain words to be ALL CAPS in the title... do you know what I would need to add to this code to specify certain words so that they will always be caps when displayed in the titles? Thanks!

kh99 05-22-2012 12:14 AM

Maybe something like this:

Code:

$smallwords = array( 'a','of','the');
$capwords = array('ALLCAPS', 'ABC', XYZ');

$words = explode(' ', $vbulletin->GPC['subject']);

foreach ($words as $key => $word) {
    $capword = strtoupper($word);
    if (in_array($capword, $capwords)) $words[$key] = $capword;
    else if (!$key or !in_array($word, $smallwords)) $words[$key] = ucwords($word);
 }
 
$vbulletin->GPC['subject'] = implode(' ' , $words);


Lotus28 05-22-2012 12:38 AM

LEGENDARY! Just one small issue. If someone types a title in all caps, because we disabled shouting... nothing applies, it doesn't cap the first letter of each word and doesn't do all caps on the right words, any idea? Thanks!

kh99 05-22-2012 12:51 AM

Which hook are you using for your code (assuming it's in a plugin)?

Lotus28 05-22-2012 12:59 AM

newthread_post_start

kh99 05-22-2012 01:30 AM

That happens because the no shouting function is called in the data manager, which is after your code runs. I think you could solve that by using a hook in the data manager (and you'd need to change your code accordingly), but it's too late at night for me to work it out. :)

ETA: well, there is one thing you can do that doesn't take a lot of working out - you could edit the file includes/class_dm_threadpost.php and put your code at the end of the function verify_title() (around line 107), and change your code to use $title in place of $vbulletin->GPC['subject']. But you probably don't want to edit files because it causes a problem when you upgrade.

Lotus28 05-24-2012 03:04 AM

Hi what if I disabled the built-in shouting feature, then put additional code in the plugin to disable all caps? I could put it right before the other code in the plugin, would that work?

kh99 05-24-2012 11:58 AM

You could do that. But I think I figured out another way: use hook data_start and this code:

Code:

if (is_subclass_of($this, 'vB_DataManager_ThreadPost') && is_array($this->validfields['title']))
{
    global $smallwords, $capwords;
    $smallwords = array( 'a','of','the');
    $capwords = array('ALLCAPS', 'ABC', 'XYZ');

    $this->validfields['title'][VF_CODE] = '
        global $smallwords, $capwords;
        $retval = $dm->verify_title($data);

        $words = explode(" ", $data);
        foreach ($words as $key => $word) {
            $capword = strtoupper($word);
            if (in_array($capword, $capwords))
            {
                $words[$key] = $capword;
            }
            else if (!$key or !in_array($word, $smallwords)) $words[$key] = ucwords($word);
        }
        $data = implode(" " , $words);
        return $retval;
    ';
}


RedTurtle 09-25-2012 03:18 PM

Quote:

Originally Posted by kh99 (Post 2332307)
You could do that. But I think I figured out another way: use hook data_start and this code:

Code:

if (is_subclass_of($this, 'vB_DataManager_ThreadPost') && is_array($this->validfields['title']))
{
    global $smallwords, $capwords;
    $smallwords = array( 'a','of','the');
    $capwords = array('ALLCAPS', 'ABC', 'XYZ');

    $this->validfields['title'][VF_CODE] = '
        global $smallwords, $capwords;
        $retval = $dm->verify_title($data);

        $words = explode(" ", $data);
        foreach ($words as $key => $word) {
            $capword = strtoupper($word);
            if (in_array($capword, $capwords))
            {
                $words[$key] = $capword;
            }
            else if (!$key or !in_array($word, $smallwords)) $words[$key] = ucwords($word);
        }
        $data = implode(" " , $words);
        return $retval;
    ';
}


Wow what a helpful thread!! Thank you for posting this solution.

I have one question kh99 -- I have a lot of words that I would like to be left capitalized (lots of acronyms that are used on the forum). Is there a way I can have an external file in which I can enter the acronyms and have this plugin call that file rather than me having to add them all into the plugin code?

Thank you! :)

EDIT #1: Currently this code doesn't seem to work for 2 words that need to be capitalized in the same thread. It will leave the first one capitalized but then make the second one lowercase on all letters except for the first one. So if I need ABC and XYZ both left capitalized the thread will make ABC and Xyz.

EDIT #2: Alternatively is there a way that it just leaves any all capitalized word which is less than X number of characters alone?

EDIT #3: In regards to my EDIT #1, it seems that it wasn't working because there was a question mark at the end of the capitalized word. Any way to have a question mark or exclamation mark at the end of a ALL CAPS word not make the all caps word become lowercase?

kh99 09-25-2012 06:27 PM

Oh, yeah, not taking punctuation into consideration was an oversight on my part. I can fix it but it might take a while until I get to it. (Or maybe someone else will post a fix first).

RedTurtle 09-25-2012 06:46 PM

Thanks a lot kh99.

Definitely looking forward to your next version of it.

And I'm sorry about the PM, I don't know how but somehow didn't see your notice about it in your signature. Won't happen again! :(

--------------- Added [DATE]1348668746[/DATE] at [TIME]1348668746[/TIME] ---------------

Hi guys,

Based somewhat off of kh99's previous code I went ahead and wrote some new code for my purposes. Not sure if anyone else would find this useful or not but I figured I would share it just in case.

This code does the following:
  1. Automatically capitalizes first letter of every word.
  2. Ignores user defined small words (a, the, of, and, etc).
  3. Ignores user defined acronyms (USA, LOL, BRB, etc) and will capitalize them if they are not entered in all caps.
  4. Allows you to define a max length for capitalized words. If a thread has a word in all caps longer than the max length, it will change it from all caps to only capitalizing the first letter of that word. Prevents "shouting" and also helps cover any acronyms that were not specifically declared in the capital words list by ignoring any words entered in all caps that are less than the defined max length.
  5. Correctly handles punctuation marks and having a punctuation mark at the end of a word on the capital words list won't mess it up. 'USA!' will match 'USA' on the list.

One thing to be careful about -- enter all of your words in lowercase.

I hope this is helpful to someone else! :)

Here's the code:

[Look at next post for code]

Edit: If someone could help make it so that I could read an external file for the capitalized words list, that might be a neater solution. Not exactly sure how to go about doing that.

Edit #2: Ok it looks like there is an issue I'm having trouble getting rid of. If the letter 'i' is entered in lowercase such as in the sentence "i really like cake with a tiny bit of icing" it will capitalize the letter 'i' which it should do but then it will also capitalize every other instance of the letter 'i' anywhere it occurs. The output will be: "I Really LIke Cake WIth a TIny BIt of IcIng".

RedTurtle 09-26-2012 11:56 PM

Ok finally got some more time to look at the code and have it working now:

Using ucwords now instead of my previous method. Let me know if you have any issues with it. :D

PHP Code:

if (is_subclass_of($this'vB_DataManager_ThreadPost') && is_array($this->validfields['title']))
{
    global 
$exclude_words$capital_words$max_length ;
    
$exclude_words = array("the","a","of","is"); // Exclude analyzing these words
    
$capital_words = array("brb","lol"); // Capital exclusives (leave in lowercase in array)
    
$max_length 5// Maximum word length, anything over is case-lowered
    
    
$this->validfields['title'][VF_CODE] = '
        global $exclude_words, $capital_words, $max_length ;
        $retval = $dm->verify_title($data);

        $words = explode(" ",$data);
        
        foreach ($words as $word) {
 if (!in_array(strtolower($word),$exclude_words))
   {
     if(in_array(preg_replace("/[^a-zA-Z]/","",strtolower($word)),$capital_words))
     $newWord[] = strtoupper($word);
     elseif(strlen($word) >=$max_length && !in_array(strtolower($word),$capital_words)) $newWord[] = ucwords(strtolower($word));
     else $newWord[] = ucwords($word);
   }
 else $newWord[] = strtolower($word);
}

                    
                    $data = implode(" ",$newWord);

        return $retval;
    '
;



CAG CheechDogg 10-15-2013 10:24 AM

Great plugin here you guys ! I have one question for you kh99 ...

How could I use this to make sure that only one acronym in any posts created is always capitalized, i.e., when someone post a reply or a new thread and in the message they use the acronym (usa) and you always wanted it to be (USA), is this possible?


All times are GMT. The time now is 12:42 AM.

Powered by vBulletin® Version 3.8.12 by vBS
Copyright ©2000 - 2025, vBulletin Solutions Inc.

X vBulletin 3.8.12 by vBS Debug Information
  • Page Generation 0.01713 seconds
  • Memory Usage 1,765KB
  • Queries Executed 10 (?)
More Information
Template Usage:
  • (1)ad_footer_end
  • (1)ad_footer_start
  • (1)ad_header_end
  • (1)ad_header_logo
  • (1)ad_navbar_below
  • (4)bbcode_code_printable
  • (1)bbcode_php_printable
  • (1)bbcode_quote_printable
  • (1)footer
  • (1)gobutton
  • (1)header
  • (1)headinclude
  • (6)option
  • (1)post_thanks_navbar_search
  • (1)printthread
  • (13)printthreadbit
  • (1)spacer_close
  • (1)spacer_open 

Phrase Groups Available:
  • global
  • postbit
  • showthread
Included Files:
  • ./printthread.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/class_bbcode_alt.php
  • ./includes/class_bbcode.php
  • ./includes/functions_bigthree.php 

Hooks Called:
  • init_startup
  • init_startup_session_setup_start
  • init_startup_session_setup_complete
  • cache_permissions
  • fetch_threadinfo_query
  • fetch_threadinfo
  • fetch_foruminfo
  • style_fetch
  • cache_templates
  • global_start
  • parse_templates
  • global_setup_complete
  • printthread_start
  • bbcode_fetch_tags
  • bbcode_create
  • bbcode_parse_start
  • bbcode_parse_complete_precache
  • bbcode_parse_complete
  • printthread_post
  • printthread_complete