Last active
May 27, 2025 00:47
-
-
Save dajare/3924560 to your computer and use it in GitHub Desktop.
LibreOffice Macro - straight quotes to curly
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
sub StraightQuotes2CurlyQuotes | |
' Thanks to Tintazul for refinements | |
' https://gist.github.com/Tintazul/deb5e137cabf86ddf4c2 | |
' Now updated to work with LibreOffice Writer Version: 5.0.x | |
rem ---------------------------------------------------------------------- | |
rem define variables | |
dim document as object | |
dim dispatcher as object | |
dim undo as object | |
rem ---------------------------------------------------------------------- | |
rem create single undo action | |
undo = ThisComponent.UndoManager | |
undo.enterUndoContext("Educate quotes") | |
rem ---------------------------------------------------------------------- | |
rem get access to the document | |
document = ThisComponent.CurrentController.Frame | |
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper") | |
rem ---------------------------------------------------------------------- | |
dim args1(18) as new com.sun.star.beans.PropertyValue | |
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.Backward" | |
args1(4).Value = false | |
args1(5).Name = "SearchItem.Pattern" | |
args1(5).Value = false | |
args1(6).Name = "SearchItem.Content" | |
args1(6).Value = false | |
args1(7).Name = "SearchItem.AsianOptions" | |
args1(7).Value = false | |
args1(8).Name = "SearchItem.AlgorithmType" | |
args1(8).Value = 1 | |
args1(9).Name = "SearchItem.SearchFlags" | |
args1(9).Value = 65536 | |
args1(10).Name = "SearchItem.SearchString" | |
args1(10).Value = CHR$(34)+"\<" | |
args1(11).Name = "SearchItem.ReplaceString" | |
args1(11).Value = "“" | |
args1(12).Name = "SearchItem.Locale" | |
args1(12).Value = 255 | |
args1(13).Name = "SearchItem.ChangedChars" | |
args1(13).Value = 2 | |
args1(14).Name = "SearchItem.DeletedChars" | |
args1(14).Value = 2 | |
args1(15).Name = "SearchItem.InsertedChars" | |
args1(15).Value = 2 | |
args1(16).Name = "SearchItem.TransliterateFlags" | |
args1(16).Value = 1280 | |
args1(17).Name = "SearchItem.Command" | |
args1(17).Value = 3 | |
args1(18).Name = "Quiet" | |
args1(18).Value = true | |
dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args1()) | |
rem ---------------------------------------------------------------------- | |
dim args2(18) as new com.sun.star.beans.PropertyValue | |
args2(0).Name = "SearchItem.StyleFamily" | |
args2(0).Value = 2 | |
args2(1).Name = "SearchItem.CellType" | |
args2(1).Value = 0 | |
args2(2).Name = "SearchItem.RowDirection" | |
args2(2).Value = true | |
args2(3).Name = "SearchItem.AllTables" | |
args2(3).Value = false | |
args2(4).Name = "SearchItem.Backward" | |
args2(4).Value = false | |
args2(5).Name = "SearchItem.Pattern" | |
args2(5).Value = false | |
args2(6).Name = "SearchItem.Content" | |
args2(6).Value = false | |
args2(7).Name = "SearchItem.AsianOptions" | |
args2(7).Value = false | |
args2(8).Name = "SearchItem.AlgorithmType" | |
args2(8).Value = 1 | |
args2(9).Name = "SearchItem.SearchFlags" | |
args2(9).Value = 65536 | |
args2(10).Name = "SearchItem.SearchString" | |
args2(10).Value = CHR$(34)+"([\[\(])" | |
args2(11).Name = "SearchItem.ReplaceString" | |
args2(11).Value = "“$1" | |
args2(12).Name = "SearchItem.Locale" | |
args2(12).Value = 255 | |
args2(13).Name = "SearchItem.ChangedChars" | |
args2(13).Value = 2 | |
args2(14).Name = "SearchItem.DeletedChars" | |
args2(14).Value = 2 | |
args2(15).Name = "SearchItem.InsertedChars" | |
args2(15).Value = 2 | |
args2(16).Name = "SearchItem.TransliterateFlags" | |
args2(16).Value = 1280 | |
args2(17).Name = "SearchItem.Command" | |
args2(17).Value = 3 | |
args2(18).Name = "Quiet" | |
args2(18).Value = true | |
dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args2()) | |
rem ---------------------------------------------------------------------- | |
dim args3(18) as new com.sun.star.beans.PropertyValue | |
args3(0).Name = "SearchItem.StyleFamily" | |
args3(0).Value = 2 | |
args3(1).Name = "SearchItem.CellType" | |
args3(1).Value = 0 | |
args3(2).Name = "SearchItem.RowDirection" | |
args3(2).Value = true | |
args3(3).Name = "SearchItem.AllTables" | |
args3(3).Value = false | |
args3(4).Name = "SearchItem.Backward" | |
args3(4).Value = false | |
args3(5).Name = "SearchItem.Pattern" | |
args3(5).Value = false | |
args3(6).Name = "SearchItem.Content" | |
args3(6).Value = false | |
args3(7).Name = "SearchItem.AsianOptions" | |
args3(7).Value = false | |
args3(8).Name = "SearchItem.AlgorithmType" | |
args3(8).Value = 1 | |
args3(9).Name = "SearchItem.SearchFlags" | |
args3(9).Value = 65536 | |
args3(10).Name = "SearchItem.SearchString" | |
args3(10).Value = "\>"+CHR$(34) | |
args3(11).Name = "SearchItem.ReplaceString" | |
args3(11).Value = "”" | |
args3(12).Name = "SearchItem.Locale" | |
args3(12).Value = 255 | |
args3(13).Name = "SearchItem.ChangedChars" | |
args3(13).Value = 2 | |
args3(14).Name = "SearchItem.DeletedChars" | |
args3(14).Value = 2 | |
args3(15).Name = "SearchItem.InsertedChars" | |
args3(15).Value = 2 | |
args3(16).Name = "SearchItem.TransliterateFlags" | |
args3(16).Value = 1280 | |
args3(17).Name = "SearchItem.Command" | |
args3(17).Value = 3 | |
args3(18).Name = "Quiet" | |
args3(18).Value = true | |
dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args3()) | |
rem ---------------------------------------------------------------------- | |
dim args4(18) as new com.sun.star.beans.PropertyValue | |
args4(0).Name = "SearchItem.StyleFamily" | |
args4(0).Value = 2 | |
args4(1).Name = "SearchItem.CellType" | |
args4(1).Value = 0 | |
args4(2).Name = "SearchItem.RowDirection" | |
args4(2).Value = true | |
args4(3).Name = "SearchItem.AllTables" | |
args4(3).Value = false | |
args4(4).Name = "SearchItem.Backward" | |
args4(4).Value = false | |
args4(5).Name = "SearchItem.Pattern" | |
args4(5).Value = false | |
args4(6).Name = "SearchItem.Content" | |
args4(6).Value = false | |
args4(7).Name = "SearchItem.AsianOptions" | |
args4(7).Value = false | |
args4(8).Name = "SearchItem.AlgorithmType" | |
args4(8).Value = 1 | |
args4(9).Name = "SearchItem.SearchFlags" | |
args4(9).Value = 65536 | |
args4(10).Name = "SearchItem.SearchString" | |
args4(10).Value = "([,.;!?\]\)])"+CHR$(34) | |
args4(11).Name = "SearchItem.ReplaceString" | |
args4(11).Value = "$1”" | |
args4(12).Name = "SearchItem.Locale" | |
args4(12).Value = 255 | |
args4(13).Name = "SearchItem.ChangedChars" | |
args4(13).Value = 2 | |
args4(14).Name = "SearchItem.DeletedChars" | |
args4(14).Value = 2 | |
args4(15).Name = "SearchItem.InsertedChars" | |
args4(15).Value = 2 | |
args4(16).Name = "SearchItem.TransliterateFlags" | |
args4(16).Value = 1280 | |
args4(17).Name = "SearchItem.Command" | |
args4(17).Value = 3 | |
args4(18).Name = "Quiet" | |
args4(18).Value = true | |
dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args4()) | |
rem ---------------------------------------------------------------------- | |
dim args5(18) as new com.sun.star.beans.PropertyValue | |
args5(0).Name = "SearchItem.StyleFamily" | |
args5(0).Value = 2 | |
args5(1).Name = "SearchItem.CellType" | |
args5(1).Value = 0 | |
args5(2).Name = "SearchItem.RowDirection" | |
args5(2).Value = true | |
args5(3).Name = "SearchItem.AllTables" | |
args5(3).Value = false | |
args5(4).Name = "SearchItem.Backward" | |
args5(4).Value = false | |
args5(5).Name = "SearchItem.Pattern" | |
args5(5).Value = false | |
args5(6).Name = "SearchItem.Content" | |
args5(6).Value = false | |
args5(7).Name = "SearchItem.AsianOptions" | |
args5(7).Value = false | |
args5(8).Name = "SearchItem.AlgorithmType" | |
args5(8).Value = 1 | |
args5(9).Name = "SearchItem.SearchFlags" | |
args5(9).Value = 65536 | |
args5(10).Name = "SearchItem.SearchString" | |
args5(10).Value = CHR$(39)+"\<" | |
args5(11).Name = "SearchItem.ReplaceString" | |
args5(11).Value = "‘" | |
args5(12).Name = "SearchItem.Locale" | |
args5(12).Value = 255 | |
args5(13).Name = "SearchItem.ChangedChars" | |
args5(13).Value = 2 | |
args5(14).Name = "SearchItem.DeletedChars" | |
args5(14).Value = 2 | |
args5(15).Name = "SearchItem.InsertedChars" | |
args5(15).Value = 2 | |
args5(16).Name = "SearchItem.TransliterateFlags" | |
args5(16).Value = 1280 | |
args5(17).Name = "SearchItem.Command" | |
args5(17).Value = 3 | |
args5(18).Name = "Quiet" | |
args5(18).Value = true | |
dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args5()) | |
rem ---------------------------------------------------------------------- | |
dim args6(18) as new com.sun.star.beans.PropertyValue | |
args6(0).Name = "SearchItem.StyleFamily" | |
args6(0).Value = 2 | |
args6(1).Name = "SearchItem.CellType" | |
args6(1).Value = 0 | |
args6(2).Name = "SearchItem.RowDirection" | |
args6(2).Value = true | |
args6(3).Name = "SearchItem.AllTables" | |
args6(3).Value = false | |
args6(4).Name = "SearchItem.Backward" | |
args6(4).Value = false | |
args6(5).Name = "SearchItem.Pattern" | |
args6(5).Value = false | |
args6(6).Name = "SearchItem.Content" | |
args6(6).Value = false | |
args6(7).Name = "SearchItem.AsianOptions" | |
args6(7).Value = false | |
args6(8).Name = "SearchItem.AlgorithmType" | |
args6(8).Value = 1 | |
args6(9).Name = "SearchItem.SearchFlags" | |
args6(9).Value = 65536 | |
args6(10).Name = "SearchItem.SearchString" | |
args6(10).Value = CHR$(39)+"([\[\(])" | |
args6(11).Name = "SearchItem.ReplaceString" | |
args6(11).Value = "‘$1" | |
args6(12).Name = "SearchItem.Locale" | |
args6(12).Value = 255 | |
args6(13).Name = "SearchItem.ChangedChars" | |
args6(13).Value = 2 | |
args6(14).Name = "SearchItem.DeletedChars" | |
args6(14).Value = 2 | |
args6(15).Name = "SearchItem.InsertedChars" | |
args6(15).Value = 2 | |
args6(16).Name = "SearchItem.TransliterateFlags" | |
args6(16).Value = 1280 | |
args6(17).Name = "SearchItem.Command" | |
args6(17).Value = 3 | |
args6(18).Name = "Quiet" | |
args6(18).Value = true | |
dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args6()) | |
rem ---------------------------------------------------------------------- | |
dim args7(18) as new com.sun.star.beans.PropertyValue | |
args7(0).Name = "SearchItem.StyleFamily" | |
args7(0).Value = 2 | |
args7(1).Name = "SearchItem.CellType" | |
args7(1).Value = 0 | |
args7(2).Name = "SearchItem.RowDirection" | |
args7(2).Value = true | |
args7(3).Name = "SearchItem.AllTables" | |
args7(3).Value = false | |
args7(4).Name = "SearchItem.Backward" | |
args7(4).Value = false | |
args7(5).Name = "SearchItem.Pattern" | |
args7(5).Value = false | |
args7(6).Name = "SearchItem.Content" | |
args7(6).Value = false | |
args7(7).Name = "SearchItem.AsianOptions" | |
args7(7).Value = false | |
args7(8).Name = "SearchItem.AlgorithmType" | |
args7(8).Value = 1 | |
args7(9).Name = "SearchItem.SearchFlags" | |
args7(9).Value = 65536 | |
args7(10).Name = "SearchItem.SearchString" | |
args7(10).Value = "'" | |
args7(11).Name = "SearchItem.ReplaceString" | |
args7(11).Value = "’" | |
args7(12).Name = "SearchItem.Locale" | |
args7(12).Value = 255 | |
args7(13).Name = "SearchItem.ChangedChars" | |
args7(13).Value = 2 | |
args7(14).Name = "SearchItem.DeletedChars" | |
args7(14).Value = 2 | |
args7(15).Name = "SearchItem.InsertedChars" | |
args7(15).Value = 2 | |
args7(16).Name = "SearchItem.TransliterateFlags" | |
args7(16).Value = 1280 | |
args7(17).Name = "SearchItem.Command" | |
args7(17).Value = 3 | |
args7(18).Name = "Quiet" | |
args7(18).Value = true | |
dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args7()) | |
rem ---------------------------------------------------------------------- | |
rem close the undo action | |
undo.leaveUndoContext | |
end sub |
Thanks for the code! I had to update it a little bit to get it to work on my copy of LibreOffice, version 5.2.0.4. Not sure exactly why the extra SearchItem.AlgorithmType2 with value 2 needed to be added to this particular Find and Replace, but without it in my particular document I ended up with literal a little "$1”" in my text. Recording a new macro added this in. Annoyingly I can't reproduce the problem in an empty document...
https://gist.github.com/flexo/ae3758b744cf5aef852e851018a184dc
I just wanted to say thank you, I had the same problem but had no idea how to fix it. Your fix worked and I never would have figured it out otherwise!
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Thanks for the code! I had to update it a little bit to get it to work on my copy of LibreOffice, version 5.2.0.4. Not sure exactly why the extra SearchItem.AlgorithmType2 with value 2 needed to be added to this particular Find and Replace, but without it in my particular document I ended up with literal a little "$1”" in my text. Recording a new macro added this in. Annoyingly I can't reproduce the problem in an empty document...
https://gist.github.com/flexo/ae3758b744cf5aef852e851018a184dc