Ask Your Question

Macro for writer needed for conditional capitalizing

asked 2016-11-17 01:19:00 +0100

Cam gravatar image

updated 2016-11-17 01:27:03 +0100

Hi guys. I do offline transcription and closed captioning for lectures, documentaries, etc. When there are multiple speakers, we differentiate them with >> (double chevrons). I need LO Writer to automatically capitalize after putting a >> for the beginning of the next sentence.

For example:

>> We have a lot to do today.
>> Okay, I'm ready. Let's get to it.

So, basically I need the text to see >> as some sort of punctuation to trigger autocaps. Any help is GREATLY appreciated, as I'm a noob when it comes to writing macros. (Would it be possible to do a Record Macro for this?)

Thanks guys

edit retag flag offensive close merge delete

1 Answer

Sort by » oldest newest most voted

answered 2016-11-17 02:07:45 +0100

Lupp gravatar image

updated 2016-12-30 23:12:07 +0100

(Edited: Code enhanced with respect to the comments below by @Cam. The Sub will now recreate the view cursor as it was before the run.)

"Would it be possible to do a Record Macro for this?"
I didn't think so but tried and it worked.
To be clear: I had to do a 'F&R' searching for a RegEx and performing a 'Find All'. The text pieces found were changed to upper case then. The procedure will not be triggered automatically, but will process the complete text if called once after the typing. A second run will not change anything again.
The RegEx I used was >> {0,1}[:alpha:] meaning the "some sort of punctuation" character pair followed by zero or one spaces and one ordinary character. You may abandon the optional space or remove the quantifier to get exactly one.
I did not care about returning to any specific position. The changed text portions remain selected on 'End Sub'.

REM  *****  BASIC  *****
Option Explicit

Sub ChangeToUpperAfterSpecialCharacterPair

dim document   as object
dim dispatcher as object

document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("")

REM Start manual insertion 1
Dim theDoc As Object, theViewCursor As Object, theOldStart As Object, theOldEnd As Object
REM End manual insertion 1

dim args1(21) as new
args1(0).Name = "SearchItem.StyleFamily"
args1(0).Value = 2
args1(1).Name = "SearchItem.CellType"
args1(1).Value = 0
args1(2).Name = "SearchItem.RowDirection"
args1(2).Value = true
args1(3).Name = "SearchItem.AllTables"
args1(3).Value = false
args1(4).Name = "SearchItem.SearchFiltered"
args1(4).Value = false
args1(5).Name = "SearchItem.Backward"
args1(5).Value = false
args1(6).Name = "SearchItem.Pattern"
args1(6).Value = false
args1(7).Name = "SearchItem.Content"
args1(7).Value = false
args1(8).Name = "SearchItem.AsianOptions"
args1(8).Value = false
args1(9).Name = "SearchItem.AlgorithmType"
args1(9).Value = 1
args1(10).Name = "SearchItem.SearchFlags"
args1(10).Value = 65536
args1(11).Name = "SearchItem.SearchString"
args1(11).Value = ">> {0,1}[:alpha:]"
args1(12).Name = "SearchItem.ReplaceString"
args1(12).Value = ""
args1(13).Name = "SearchItem.Locale"
args1(13).Value = 255
args1(14).Name = "SearchItem.ChangedChars"
args1(14).Value = 2
args1(15).Name = "SearchItem.DeletedChars"
args1(15).Value = 2
args1(16).Name = "SearchItem.InsertedChars"
args1(16).Value = 2
args1(17).Name = "SearchItem.TransliterateFlags"
args1(17).Value = 1280
args1(18).Name = "SearchItem.Command"
args1(18).Value = 1
args1(19).Name = "SearchItem.SearchFormatted"
args1(19).Value = false
args1(20).Name = "SearchItem.AlgorithmType2"
args1(20).Value = 2
args1(21).Name = "Quiet"
args1(21).Value = true

dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args1())

dispatcher.executeDispatch(document, ".uno:ChangeCaseToUpper", "", 0, Array())

REM Start manual insertion 2
REM End manual insertion 2

End Sub

The resulting Sub is a wee little monster. But what of it?

See also this demo.

edit flag offensive delete link more


AWESOME!!!! Thank you SO much. This works perfectly! All I have to do is assign a shortcut button and I'm all set. Cool beans and thanks again!


Cam gravatar imageCam ( 2016-11-20 00:12:55 +0100 )edit

and I also added

dispatcher.executeDispatch(document, ".uno:Escape", "", 0, Array())

at the end to deselect the text so I won't accidentally overwrite it.

Cam gravatar imageCam ( 2016-11-20 00:55:08 +0100 )edit

Is there a way to have the cursor return to the last place that I was typing before I ran the macro?

Cam gravatar imageCam ( 2016-12-30 09:01:34 +0100 )edit

Yes, of course. If you are interested in the ways the LibO API works and how it is accessd in BASIC, you should read the famous texts ("Book" and "Useful Macro Information" )by Andrew Pitonyak.

Lupp gravatar imageLupp ( 2016-12-30 12:11:00 +0100 )edit

Awseome! Thank you guys!

Cam gravatar imageCam ( 2017-01-13 09:57:57 +0100 )edit
Login/Signup to Answer

Question Tools

1 follower


Asked: 2016-11-17 01:19:00 +0100

Seen: 119 times

Last updated: Dec 30 '16