Hi Michelle. I did this a few years ago and modified it a few times too. You 
will find an array of words that you want to keep lowercase in the script— 
first you see the array capitalized, then you see it lowercase (the way you 
want it).

I found, after using my original script, that there were exceptions: words like 
“MacBook” and “iPhone” and “iTunes” needed to stay capitalized as they are. I 
made a list of words like those and put them in a text file. You would do this 
too. The name of the file doesn’t matter as it will be stored as a property. 
Next time you run the script, it will not ask you to locate the file as it will 
already know where it is. You can edit that file as time goes by— easier than 
editing the script since it’s just a list of words. You could delete this 
section of the script of course.

I also found that even though you don’t want to capitalize words like “a” and 
“an” you might need to anyway. For example, if you have a sentence like “A 
horse is not a good house pet” you want the first “a” to be capitalized and the 
second “a” not to be. So I added code to test whether I was leading a sentence 
with one of those words. You could throw this part of the script out too.

I also found that I was messing up URLs. Some are case-sensitive. So, if it’s a 
URL, I save it and put it back. In my case I knew that the URL would be on a 
line by itself, so I test for that. This should be generalized but I didn’t do 
it.

I also set this script up to allow you to display a dialog box asking whether 
you want to use the regular Change Case box or this new one. But it is 
commented out here. 

Hoping this helps and makes sense. Here’s the script.

property the_file : ""
--If there is no value for "the_file" there will be the next time you run the 
script.
-- by Christian Boyce, [email protected], www.christianboyce.com
-- Using "grep" throughout.
-- February 18th, 2011. Corrected Step 2 for single-quotes. 
-- Revised June 4th, 2011. Changed initial case change step to better method.
-- Revised again June 22nd, 2011. Was making errors by mistakenly affecting 
URLs. 
-- Revised/corrected June 24th, 2011 to catch case where there aren't any links.
-- Created new method in which lines that begin with "http" are stored, and 
later put back into the changed text. Much more efficient than working line by 
line. Other speed improvements also. 
--
--This script, with the "on run {} and "end run" wrapper, works when it is
--in the Menu Scripts folder, inside the BBEdit folder, inside the Application 
Support folder,
--in your user Library ("~/Library/Application Support/BBEdit/Menu Scripts/").
--
--The script gives the option of using the original Change Case command.
(*
-- we would use this On Run handler if we put the script into the Menu Scripts 
folder.
--
on run
        -- The run handler is called when the script is invoked normally,
        -- such as from BBEdit's Scripts menu.
        changecaseformichelle()
end run
*)
--
(*
--commented out because we are not going to attach to a menu item after all
on menuselect()
        -- The menuselect() handler gets called when the script is invoked
        -- by BBEdit as a menu script.
        -- true means we do the changecaseformichelle script instead of the 
normal command
        -- false means we do the normal command
        --
        set the_status to changecaseformichelle()
        return the_status
end menuselect
*)
--
-- this would be called "on changecaseformichelle() if we wanted to put this in 
the Menu Scripts folder.
on run {}
        (*
        -- User gets to choose whether to use standard Change Case or this 
modified version. Added 2-14-2011. Happy Valentine's Day.
        set the_button to display dialog "Would you like to use the standard 
Change Case, or Michelle's version?" buttons {"Standard", "Michelle's"} default 
button "Michelle's"
        *)
        --set the_button to button returned of the_button-- as if it had been 
clicked.
        set the_button to "Michelle's"
        
        if the_button is "Michelle's" then
                set the_exceptions_upper to {"A", "An", "And", "As", "At", 
"But", "By", "For", "From", "In", "Into", "It", "Nor", "Of", "On", "Onto", 
"Or", "so", "The", "To", "with"}
                set the_exceptions_lower to {"a", "an", "and", "as", "at", 
"but", "by", "for", "from", "in", "into", "it", "nor", "of", "on", "onto", 
"or", "so", "the", "to", "with"}
                
                -- Reading exceptions from a file
                if the_file = "" then
                        set the_file to choose file with prompt "Choose the 
file where you store the exceptions."
                end if
                set the_text to read the_file
                set replace_with to paragraphs of the_text
                
                -- we will use "replace_with" in Part 4 below--
                
                tell application "BBEdit"
                        
                        replace ".http" using "\\rhttp" searching in selection 
of project window 1 options {search mode:grep, starting at top:false, wrap 
around:false, backwards:false, case sensitive:false, match words:false, extend 
selection:false}
                        --
                        set the_text to the selection
                        set theCountOfLines to count of lines of the_text
                        set numberOfCharacters to number of characters of 
the_text
                        set startingPoint to characterOffset of the_text
                        set endingPoint to (startingPoint + (length of 
the_text))
                        
                        -- Storing line number and content of every link from 
the original text. Then we make changes, then we restore with original link 
text. Brilliant move. 
                        try
                                set we_have_links to "false"
                                set link_line_text to contents of every line of 
the_text whose contents starts with "http"
                                set link_line_numbers to startLine of every 
line of the_text whose contents starts with "http"
                                set we_have_links to "true"
                        end try
                        --PART ONE: Capitalize The Words.
                        change case the_text making capitalize words
                        
                        --Fixing numbers
                        set the_numbers to {"1St", "2Nd", "3Rd", "4Th", "5Th", 
"6Th", "7Th", "8Th", "9Th", "0Th", "11Th", "12Th", "13Th"}
                        set the_fixed_numbers to {"1st", "2nd", "3rd", "4th", 
"5th", "6th", "7th", "8th", "9th", "0th", "11th", "12th", "13th"}
                        tell the_text
                                repeat with k from 1 to count of the_numbers
                                        replace item k of the_numbers using 
item k of the_fixed_numbers
                                end repeat
                        end tell
                        --/ixing numbers
                        
                        --PART TWO: Look for the exceptions and fix them.
                        --loop through the_exceptions_upper
                        repeat with j from 1 to count of the_exceptions_upper
                                -- Added the "hyphenated word" case here.
                                set the_search_string to 
"(([>]+)|(\\s+)|(\\r+)|(-+))" & item j of the_exceptions_upper
                                set the_replace_string to "\\1" & item j of 
the_exceptions_lower
                                
                                -- All parts of hyphenated words get capitalized
                                set the_hyphenation_search_string to item j of 
the_exceptions_lower & "-"
                                set the_hyphenation_replace_string to item j of 
the_exceptions_upper & "-"
                                
                                -- Also handle the case where the hyphen is 
leading.
                                set the_hyphenation_search_string2 to "-" & 
item j of the_exceptions_lower
                                set the_hyphenation_replace_string2 to "-" & 
item j of the_exceptions_upper
                                
                                tell the_text
                                        replace the_search_string using 
the_replace_string options {match words:true, search mode:grep}
                                        -- All parts of hyphenated words get 
capitalized
                                        replace the_hyphenation_search_string 
using the_hyphenation_replace_string options {match words:true}
                                        replace the_hyphenation_search_string2 
using the_hyphenation_replace_string2 options {match words:true}
                                end tell
                        end repeat
                        
                        --PART THREE: look for words that start sentences etc 
and Capitalize them.
                        --Fast Method: canned GREPS.
                        --Note: this could be written as one grep statement, in 
this form:
                        --(a|b|c|d) with a, b, c, and d being the first 
argument from each 
                        --replace below. But that's messy to read.
                        
                        tell the_text
                                -- one or more returns, one or more returns and 
any number of spaces
                                replace "(\\r+\\s*)(\\w)" using "\\1\\u\\2" 
options {search mode:grep}
                                
                                -- first word after period, exclamation point, 
question mark, with at least one space following the punctuation
                                replace "([\\.!\\?]\\s+)(\\w)" using 
"\\1\\u\\2" options {search mode:grep}
                                
                                -- colon, colon and any number of spaces
                                replace "(:\\s*)(\\w)" using "\\1\\u\\2" 
options {search mode:grep}
                                
                                -- two dashes, two dashes and any number of 
spaces
                                replace "(--\\s*)(\\w)" using "\\1\\u\\2" 
options {search mode:grep}
                                
                                -- open parenthesis, open parenthesis and any 
number of spaces
                                replace "(\\(\\s*)(\\w)" using "\\1\\u\\2" 
options {search mode:grep}
                                
                                -- one or more open double quote (curly)
                                replace "(\\s+)([“]+)(\\w+)" using 
"\\1\\2\\u\\3" options {search mode:grep} --searching in theCharacters
                                
                                -- open double quote (straight), open double 
quote (straight) space
                                replace "(\\s+)([\"]+)(\\w+)" using 
"\\1\\2\\u\\3" options {search mode:grep} --searching in theCharacters
                                
                                
                                --PART FOUR: do the special case 
capitalizations, using "find_what" and "replace_with" lists at top of script. 
If you add something to "find_what" you have to add something to "replace_with" 
too. Example: change "pdf" to "PDF."
                                -- GREP
                                -- Reading from a file
                                
                                repeat with i from 1 to count of replace_with
                                        set the_search_string to 
"(([>]*)|(\\s+)|(\\r+)|(\\()|([\"]+))" & "(?i)" & item i of replace_with
                                        set the_replace_string to "\\1" & item 
i of replace_with
                                        replace the_search_string using 
the_replace_string options {match words:true, search mode:grep}
                                end repeat
                        end tell
                        
                        --PART FIVE: now put the links back in
                        if we_have_links is "true" then
                                repeat with i from 1 to count of link_line_text
                                        set contents of line (item i of 
link_line_numbers) of front text window to item i of link_line_text
                                end repeat
                        end if
                        
                        --PART SIX: set the selection to be what it was when 
the script started
                        tell front text window
                                if endingPoint is greater than 
numberOfCharacters then
                                        select (characters startingPoint 
through (endingPoint - 1))
                                else
                                        select (characters startingPoint 
through endingPoint)
                                end if
                        end tell
                end tell
                
                
                return "true"
        else
                
                return "false"
        end if
end run
> On Oct 20, 2015, at 6:21 PM, Michelle <[email protected]> wrote:
> 
> Can anyone help me with this?  I have the following, very helpful AppleScript 
> that capitalizes the first letter of every word that I select/highlight:
> 
> tell application "BBEdit"
>  tell window 1
>  if selection as text is "" then
>  set cursorPoint to characterOffset of selection
>  find "\\b\\w <smb://b//w>" options {search mode:grep, backwards:true} with 
> selecting match
>  set selection to (grep substitution of "\\U&")
>  select insertion point before character cursorPoint
>  else
>  change case selection making capitalize words with replacing target
>  end if
>  end tell
> end tell
> 
> It does what it's supposed to do perfectly.  However, I also need it to make 
> (or keep) all of the following words lower-case: 
> 
> a
> an
> and
> as
> at
> but
> by
> for
> from
> in
> into
> it
> nor
> of
> on
> onto
> or
> so
> the
> to
> with
> 
> Basically, I need it to convert selected text to "Title Case."  For example, 
> both "converts a selected string of words to title case" and "CONVERTS A 
> SELECTED STRING OF WORDS TO TITLE CASE" need to become "Converts a Selected 
> String of Words to Title Case." 
> 
> I'd greatly appreciate the help.
> 
> Thank you!


--
Check out the One-Minute Macman Blog!
oneminutemacman.christianboyce.com <http://oneminutemacman.christianboyce.com/>

Christian Boyce
Christian Boyce and Associates
Mac, iPhone, and iPad Consultants

For appointments, please call the office: 424-354-3548.
We do not make appointments by email or text.

Now Playing on The Boyce Blog: How to Password-protect your documents 
<http://christianboyce.blogspot.com/>

(Join The Boyce Blog mailing list 
<https://confirmsubscription.com/h/d/15BCAA37978B70C5> and never miss a post! 
Plus, every 100th signer-upper gets a coffee cup!)

Current weather in Santa Monica, CA: Fair, 76° F 

-- 
This is the BBEdit Talk public discussion group. If you have a 
feature request or would like to report a problem, please email
"[email protected]" rather than posting to the group.
Follow @bbedit on Twitter: <http://www.twitter.com/bbedit>

--- 
You received this message because you are subscribed to the Google Groups 
"BBEdit Talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].

Reply via email to