Cleaning button...

This commit is contained in:
Georgy Litvinov 2019-10-16 22:38:09 +03:00
parent 981407460f
commit 69b0ac3bbd
17 changed files with 511 additions and 500 deletions

View file

@ -4,27 +4,7 @@
oor:name="Addons"
oor:package="org.openoffice.Office">
<node oor:name="AddonUI">
<node oor:name="AddonMenu">
<node oor:name="pro.litvinovg.IPHRedaction" oor:op="replace">
<prop oor:name="Context" oor:type="xs:string">
<value>com.sun.star.text.GlobalDocument,com.sun.star.text.TextDocument,com.sun.star.text.WebDocument</value>
</prop>
<prop oor:name="Title" oor:type="xs:string">
<value xml:lang="en">Extension for document publishing preparation</value>
<value xml:lang="ru">Расширение для подготовки рукописей к изданию</value>
</prop>
<prop oor:name="URL" oor:type="xs:string">
<value>macro:///IPHRedaction.Validation.validate</value>
</prop>
<prop oor:name="Target" oor:type="xs:string">
<value>_self</value>
</prop>
<prop oor:name="ImageIdentifier" oor:type="xs:string">
<value>%origin%/icons/img-48</value>
</prop>
</node>
</node>
<node oor:name="OfficeToolBar">
<node oor:name="OfficeToolBar">
<node oor:name="pro.litvinovg.IPHRedaction.panel" oor:op="replace">
<node oor:name="ToolBarItems">
<node oor:name="buttonValidate" oor:op="replace">
@ -40,9 +20,6 @@
<prop oor:name="Target" oor:type="xs:string">
<value>_self</value>
</prop>
<prop oor:name="ImageIdentifier" oor:type="xs:string">
<value>%origin%/IPHRedaction/validate</value>
</prop>
</node>
<node oor:name="buttonClean" oor:op="replace">
<prop oor:name="Context" oor:type="xs:string">
@ -57,9 +34,6 @@
<prop oor:name="Target" oor:type="xs:string">
<value>_self</value>
</prop>
<prop oor:name="ImageIdentifier" oor:type="xs:string">
<value>%origin%/IPHRedaction/testfont</value>
</prop>
</node>
</node>
<node oor:name="buttonValidate" oor:op="replace">
@ -76,9 +50,6 @@
<prop oor:name="Target" oor:type="xs:string">
<value>_self</value>
</prop>
<prop oor:name="ImageIdentifier" oor:type="xs:string">
<value>%origin%/IPHRedaction/validate</value>
</prop>
</node>
<node oor:name="buttonClean" oor:op="replace">
<prop oor:name="Context" oor:type="xs:string">
@ -86,7 +57,7 @@
</prop>
<prop oor:name="Title" oor:type="xs:string">
<value xml:lang="ru">Чистка</value>
<value xml:lang="en">Purification</value>
<value xml:lang="en">Cleaning</value>
</prop>
<prop oor:name="URL" oor:type="xs:string">
<value>macro:///IPHRedaction.Clean.cleanButton</value>
@ -94,14 +65,30 @@
<prop oor:name="Target" oor:type="xs:string">
<value>_self</value>
</prop>
<prop oor:name="ImageIdentifier" oor:type="xs:string">
<value>%origin%/IPHRedaction/testfont</value>
</prop>
</node>
</node>
</node>
<node oor:name="Images">
<node oor:name="image-clean-button" oor:op="replace">
<prop oor:name="URL" oor:type="xs:string">
<value>macro:///IPHRedaction.Clean.cleanButton</value>
</prop>
<node oor:name="UserDefinedImages">
<prop oor:name="ImageBigURL">
<value>%origin%/icons/clean.png</value>
</prop>
</node>
</node>
<node oor:name="image-verify-button" oor:op="replace">
<prop oor:name="URL" oor:type="xs:string">
<value>macro:///IPHRedaction.Validation.validateButton</value>
</prop>
<node oor:name="UserDefinedImages">
<prop oor:name="ImageBigURL">
<value>%origin%/icons/validate.png</value>
</prop>
</node>
</node>
</node>
</node>
</oor:component-data>

View file

@ -1,479 +1,503 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE script:module PUBLIC "-//OpenOffice.org//DTD OfficeDocument 1.0//EN" "module.dtd">
<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Clean" script:language="StarBasic">Sub fixFrequentMistakes
<script:module xmlns:script="http://openoffice.org/2000/script" script:name="Clean" script:language="StarBasic">Sub cleanButton
Dim description As String
description = "Вы уверены, что хотите запустить исправление часто встречающихся ошибок?"
Dim statusIndicator as Object
statusIndicator = ThisComponent.getCurrentController.statusIndicator
description = &quot;Вы уверены, что хотите выполнить чистку документа?&quot;
If NOT confirm(description) Then
Exit Sub
EndIf
saveDocument()
saveVersion("Перед выполнением макроса Ошибки")
StopTracking
Dim statusIndicator as Object
Dim NBSP As String
Dim space As String
NBSP = " "
space = " "
statusIndicator = ThisComponent.getCurrentController.statusIndicator
statusIndicator.Start("Исправление ошибок начато, подождите",30)
'Не должно быть символов табуляции
AskAndReplace("\t","")
'Не должно быть подряд больше одного пробела
AskAndReplace("(?&lt;=[:space:])[:space:]+","")
'Не должно быть ни одного пробела в начале абзацев
AskAndReplace("^[:space:]+","")
'Не должно быть пробелов в конце абзацев
AskAndReplace("[:space:]+$","")
'Не должно быть пустых абзацев
AskAndReplace("^$","")
'Не должно быть пробелов перед знаками пунктуации .,;:?!)]}»¡¿”‘’
AskAndReplace("[:space:]+(?=[\.,;:?!\)\]\}»¡¿”‘’])","")
'Между словом том и цифрой должен быть неразрывный пробел, а не обычный
AskAndReplace("(?&lt;=\b[тТ](ом|\.))\ (?=[:digit:])",NBSP)
'Между словом серия и цифрой должен быть неразрывный пробел, а не обычный
AskAndReplace("(?&lt;=\b[сС](ерия|\.))\ +(?=[:digit:])",NBSP)
'Между словом часть и цифрой должен быть неразрывный пробел, а не обычный
AskAndReplace("(?&lt;=\b[чЧ](асть|\.))\ +(?=[:digit:])",NBSP)
'Между числом и "г." должен быть неразрывный пробел, а не обычный
AskAndReplace("(?&lt;=[0-9])[:space:]*г(?=\.)",NBSP &amp; "г")
'Между инициалами и Фамилией должен быть неразрывный пробел, а не обычный
AskAndReplace("(?&lt;=[:upper:]\.[:space:][:upper:]\.)\ (?=[:upper:][:lower:]+)",NBSP)
'Между Фамилией и инициалами должен быть неразрывный пробел, а не обычный
AskAndReplace("(?&lt;=[:upper:][:lower:]{1,30})\ (?=[:upper:]\.[:space:][:upper:]\.)",NBSP)
'Не должно быть пробелов после скобок [({ и кавычек «„
AskAndReplace("(?&lt;=[\(\[\{«„])[:space:]","")
'Между "и" и "т." должен быть неразрывный пробел, а не обычный
AskAndReplace("(?&lt;=\bи)\ (?=т\.)",NBSP)
'Между "т." и "е./н./д./п./к." должен быть неразрывный пробел, а не обычный
AskAndReplace("(?&lt;=\bт)\.\ ?(?=[ендпк]\.)","." &amp; NBSP)
'Между буквами среднее тире должно обрамляться пробелами
AskAndReplace("(?&lt;=[:alpha:])(?=[:alpha:])",NBSP &amp; "" &amp; NBSP)
'Между буквами дефис-минус, цифровое тире и длинное тире заменяется на среднее тире
AskAndReplace("(?&lt;=[:alpha:][:space:])[-‒—](?=[:space:][:alpha:])","")
'Между двумя цифрами и тире между ними не долнжо быть пробелов. А также тире должно быть цифровым
AskAndReplace("(?&lt;=[:digit:])(?:[:space:])?[-‒–—](?:[:space:])?(?=[:digit:])","")
'Между двумя римскими цифрами и тире между ними не долнжо быть пробелов. А также тире должно быть средним
AskAndReplace("(?&lt;=[MDCLXVI])(?:[:space:])?[-‒–—](?:[:space:])?(?=[MDCLXVI])","")
'Между буквой и угловой открывающейся скобкой должен быть пробел
AskAndReplace("(?&lt;=[:alpha:])&lt;(?=…&gt;)",space &amp; "&lt;")
'Между угловой закрывающейся скобкой и буквой должен быть пробел
AskAndReplace("(?&lt;=&lt;…)&gt;(?=[:alpha:])","&gt;" &amp; space)
saveDocument
doNotTrack
statusIndicator.Start(&quot;Чистка документа начата, подождите&quot;,30)
cleanFormatting
statusIndicator.end()
saveAndreload()
End Sub
Sub cleanButton
MsgBox "Clean Works!"
End Sub
Sub workaroundForDiacriticKerningBug
AskAndReplace("([:print:][\u0300-\u036F])","$1")
End Sub
Private Sub saveAndreload()
Sub executeCitationCorrection
StartTracking
AskAndReplace("(?&lt;=[:alpha:])&lt;(?=…&gt;)"," &lt;")
AskAndReplace("(?&lt;=&lt;…)&gt;(?=[:alpha:])","&gt; ")
AskAndReplace("(?&lt;=[:alpha:])(?=[:alpha:])"," ")
StopTracking
End Sub
Sub executeRemoveConsequentSpaces
StartTracking
AskAndReplace("(?&lt;=[:space:])[:space:]+","")
StopTracking
End Sub
Sub removeBadCharacters
StartTracking
AskAndReplace("[\uE000-\uF8FF]+","")
checkAllFootnotes
StopTracking
showTrackedChanges
End Sub
Sub executeRemoveSpacesBeforeStops
StartTracking
AskAndReplace("[:space:]+(?=[\.,;:?!\)\]\}»¡¿”‘’])","")
'removed “
StopTracking
End Sub
Sub executeNumericDashBetweenNumbers
StartTracking
AskAndReplace("(?&lt;=[:digit:])(?:[:space:])?[-‒–—](?:[:space:])?(?=[:digit:])","")
StopTracking
End Sub
Sub executeReplaceLongDashWithSpacesBetweenWords
StartTracking
AskAndReplace("(?&lt;=[:alpha:][:space:])[-‒—](?=[:space:][:alpha:])","")
StopTracking
End Sub
Sub executeRemoveSpacesAfterOpenedQuoteOrBracket
StartTracking
AskAndReplace("(?&lt;=[\(\[\{«„])[:space:]","")
StopTracking
End Sub
Sub executeNonBreakingSpaceBetweenLastnameAndInitials
StartTracking
AskAndReplace("(?&lt;=[^.!?][:space:][:upper:][:lower:]{1,30})\ (?=[:upper:]\.[:upper:]\.)"," ")
StopTracking
End Sub
Sub executeNonBreakingSpaceBetweenInitialsAndLastName
StartTracking
AskAndReplace("(?&lt;=[:upper:]\.[:upper:]\.)\ (?=[:upper:][:lower:]+)"," ")
StopTracking
End Sub
Sub executeNonBreakingSpaceBetweenEtc
StartTracking
AskAndReplace("(?&lt;=\bи)\ (?=т\.)"," ")
AskAndReplace("(?&lt;=\bт)\.\ ?(?=[ендпк]\.)",". ")
StopTracking
End Sub
'Sub executeNonBreakingSpaceAfterPageOrVolume
' StartTracking
' AskAndReplace("(?&lt;=\b[сСтТ]\.)[:space:](?=[:digit:])"," ")
' StopTracking
'End Sub
Sub executeNonBreakingSpaceBetweenVol
StartTracking
AskAndReplace("(?&lt;=\b[тТ](ом|\.))[:space:](?=[:digit:])"," ")
StopTracking
End Sub
Sub executeNonBreakingSpaceBetweenSeries
StartTracking
AskAndReplace("(?&lt;=\b[сС](ерия|\.))[:space:](?=[:digit:])"," ")
StopTracking
End Sub
Sub executeNonBreakingSpaceBetweenPart
StartTracking
AskAndReplace("(?&lt;=\b[чЧ](асть|\.))[:space:]+(?=[:digit:])"," ")
StopTracking
End Sub
Sub executeNonBreakingSpaceBetweenYear
StartTracking
AskAndReplace("(?&lt;=[0-9])[:space:]*г(?=\.)"," г")
StopTracking
End Sub
Sub StartTracking
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
document = ThisComponent.CurrentController.Frame
dim trackProperties(0) as new com.sun.star.beans.PropertyValue
trackProperties(0).Name = "TrackChanges"
trackProperties(0).Value = true
dispatcher.executeDispatch(document, ".uno:TrackChanges", "", 0, trackProperties())
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ShowTrackedChanges"
args1(0).Value = true
dispatcher.executeDispatch(document, ".uno:ShowTrackedChanges", "", 0, args1())
End Sub
Sub StopTracking
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
document = ThisComponent.CurrentController.Frame
dim trackProperties(0) as new com.sun.star.beans.PropertyValue
trackProperties(0).Name = "TrackChanges"
trackProperties(0).Value = false
dispatcher.executeDispatch(document, ".uno:TrackChanges", "", 0, trackProperties())
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ShowTrackedChanges"
args1(0).Value = true
dispatcher.executeDispatch(document, ".uno:ShowTrackedChanges", "", 0, args1())
End Sub
Sub executeRemoveWhiteBackground
Dim description As String
Dim searchPattern As String
searchPattern = ""
description = "Вы уверены, что хотите заменить белый фон на прозрачный в текущем документе?"
If NOT confirm(description) Then
Exit Sub
EndIf
Dim statusIndicator as Object
statusIndicator = ThisComponent.getCurrentController.statusIndicator
statusIndicator.Start("Замена белого фона на прозрачный начата",100)
Dim SrchAttributes(1) as new com.sun.star.beans.PropertyValue
Dim ReplAttributes(1) as new com.sun.star.beans.PropertyValue
SrchAttributes(0).Name = "CharBackTransparent"
SrchAttributes(0).Value = False
SrchAttributes(1).Name = "CharBackColor"
SrchAttributes(1).Value = 16777215
ReplAttributes(0).Name = "CharBackTransparent"
ReplAttributes(0).Value = True
ReplAttributes(1).Name = "CharBackColor"
ReplAttributes(1).Value = -1
setAttributesBySearchPattern(searchPattern,SrchAttributes,ReplAttributes)
statusIndicator.end()
End Sub
Sub ReplaceEverywhere(SearchString,oReplaceString)
Dim oDoc,oText,oViewCursor,oStart,oEnd,oFind,FandR As Object
oDoc = ThisComponent
oText = oDoc.Text
Footnotes = oDoc.Footnotes
oViewCursor = oDoc.CurrentController.getViewCursor
oStart = oViewCursor.Text.createTextCursorByRange(oViewCursor.Start)
FandR = oDoc.createReplaceDescriptor
With FandR
.SearchString = SearchString
.ReplaceString = oReplaceString
.SearchRegularExpression=True
.searchAll=True
End With
If Not oViewCursor.isCollapsed then
oEnd = oViewCursor.Text.createTextCursorByRange(oViewCursor.End)
End If
If isEmpty(oEnd) then 'Do whole document.
oDoc.replaceAll(FandR)
Else 'Do selection.
Do
oFind = oDoc.FindNext(oStart.End,FandR)
If isNull(oFind) then
Exit Do
End If
If oViewCursor.Text.compareRegionEnds(oFind,oEnd) &lt; 0 then
Exit Do
End If
oFind.setString(FandR.ReplaceString)
oFind = oDoc.FindNext(oFind.End,FandR)
Loop
EndIf
End Sub
Function IsAnythingSelected(oDoc As Object) As Boolean
Dim oSelections 'Contains all of the selections
Dim oSel
'Contains one specific selection
Dim oCursor
'Text cursor to check for a collapsed range
REM Assume nothing is selected
IsAnythingSelected = False
If IsNull(ThisComponent) Then
Exit Function
End If
' The current selection in the current controller.
'If there is no current controller, it returns NULL.
oSelections = ThisComponent.getCurrentSelection()
If IsNull(oSelections) Then
Exit Function
End If
If oSelections.getCount() = 0 Then
Exit Function
End If
If oSelections.getCount() &gt; 1 Then
REM There is more than one selection so return True
IsAnythingSelected = True
Exit Function
End If
REM There is only one selection so obtain the first selection
oSel = oSelections.getByIndex(0)
lenght = Len(oSel.String)
If lenght &gt; 0 Then
IsAnythingSelected = True
End If
End Function
Sub AskAndReplace(SearchString, oReplaceString)
Dim SrchAttributes(0) as new com.sun.star.beans.PropertyValue
Dim ReplAttributes(0) as new com.sun.star.beans.PropertyValue
If IsAnythingSelected() Then
oSelections = ThisComponent.getCurrentSelection()
ReplaceInSelection(SearchString, oReplaceString)
thisComponent.currentController.select(oSelections)
Else
ReplaceFormatting(SearchString,oReplaceString,SrchAttributes,ReplAttributes, true)
' ReplaceEverywhere(SearchString, oReplaceString)
End If
End Sub
Sub ReplaceInSelection(SearchString,oReplaceString)
rem ----------------------------------------------------------------------
rem define variables
dim document as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem ----------------------------------------------------------------------
dim args1(21) 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.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 = 71680
args1(11).Name = "SearchItem.SearchString"
args1(11).Value = SearchString
args1(12).Name = "SearchItem.ReplaceString"
args1(12).Value = oReplaceString
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 = 1024
args1(18).Name = "SearchItem.Command"
args1(18).Value = 3
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())
end Sub
sub insertSpecialCharacterInFont(sCharacter As String, sFont As String)
rem ----------------------------------------------------------------------
rem define variables
dim document as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem ----------------------------------------------------------------------
dim args1(1) as new com.sun.star.beans.PropertyValue
args1(0).Name = "Symbols"
args1(0).Value = sCharacter
args1(1).Name = "FontName"
args1(1).Value = sFont
dispatcher.executeDispatch(document, ".uno:InsertSymbol", "", 0, args1())
end Sub
Sub searchAndRemoveDirectFormatting(searchString)
oViewCursor = thisComponent.getCurrentController.getViewCursor
oViewCursor.jumpToFirstPage
oSearch = ThisComponent.createSearchDescriptor()
oSearch.SearchString = searchString
oSearch.SearchRegularExpression=True
oSearch.searchAll=True
oFound = ThisComponent.findFirst(oSearch)
Do While Not IsNull(oFound)
oTextCursor = oFound.Text.createTextCursor()
oFound.setString(oFound.getString)
oFound = ThisComponent.findNext(oFound.End, oSearch)
Loop
End Sub
sub RemoveStyleByName(styleName As String)
Dim oDoc as Object
Dim propertySetInfo As Object
oDoc = ThisComponent
oFamilies = thiscomponent.StyleFamilies
sElements() = oFamilies.getElementNames()
For i = 0 to oFamilies.count -1
oFamily = oFamilies.getByName(sElements(i))
For j = 0 to oFamily.getCount -1
oStyle = oFamily.getByIndex(j)
If oStyle.Name = styleName Then
oFamily.removeByName(oStyle.Name)
Exit For
EndIf
Next
Next
End Sub
sub showTrackedChanges
dim document as object
dim dispatcher as object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:AcceptTrackedChanges", "", 0, Array())
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "ShowTrackedChanges"
args2(0).Value = true
dispatcher.executeDispatch(document, ".uno:ShowTrackedChanges", "", 0, args2())
dispatcher = createUnoService(&quot;com.sun.star.frame.DispatchHelper&quot;)
dispatcher.executeDispatch(document, &quot;.uno:Save&quot;, &quot;&quot;, 0, Array())
dispatcher.executeDispatch(document, &quot;.uno:Reload&quot;, &quot;&quot;, 0, Array())
end sub
End Sub
Sub checkAllFootnotes()
Dim footnotes As Object
Dim count as Integer
Dim charNum as Long
Dim char As Long
Dim label As String
Dim result As String
result = ""
footnotes = ThisComponent.Footnotes
count = footnotes.getCount
For i = 0 to count-1
footnote = footnotes.getByIndex(i)
' Mri footnote
label = footnote.Label
charNum = Len(label)
For j = 1 to charNum
char = Asc(Right(Left(label,j),1))
If char &gt;= 57344 AND char &lt;= 63743 then
result = result &amp; "Символ "&amp; Chr(char) &amp;" сноски "&amp; i &amp;" находится в диапазоне для частного использования"&amp; chr(10)
'Mri footnote
'footNote.setLabel(Left(label,j-1) &amp; "*" &amp; Right(label,charNum-j))
End If
Next j
Next i
If result &lt;&gt; "" then
MsgBox result
Private Sub saveDocument()
dim document as object
dim dispatcher as object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService(&quot;com.sun.star.frame.DispatchHelper&quot;)
dispatcher.executeDispatch(document, &quot;.uno:Save&quot;, &quot;&quot;, 0, Array())
end Sub
Private Sub cleanFormatting
&apos;Не должно быть символов табуляции
AskAndReplace(&quot;\t&quot;,&quot;&quot;)
&apos;Не должно быть подряд больше одного пробела
AskAndReplace(&quot;(?&lt;=[:space:])[:space:]+&quot;,&quot;&quot;)
&apos;Не должно быть ни одного пробела в начале абзацев
AskAndReplace(&quot;^[:space:]+&quot;,&quot;&quot;)
&apos;Не должно быть пустых абзацев
AskAndReplace(&quot;^$&quot;,&quot;&quot;)
replaceBaseWithStandard
convertFormattingToText
manualFontsToCharStyle
removeDirectFormatting
convertFormattingFromText
resetFootnotesStyle
removeUnusedStyles
End Sub
Sub manualFontsToCharStyle
Dim oDoc
oDoc = Thiscomponent
Dim srch(0) as new com.sun.star.beans.PropertyValue
SDesc = Thiscomponent.createSearchDescriptor()
SDesc.SearchAll = true
SDesc.ValueSearch = false
SDesc.SearchStyles = false
SDesc.SearchRegularExpression = false
SDesc.SearchString = &quot;&quot;
srch(0).Name = &quot;CharFontName&quot;
SDesc.SetSearchAttributes(srch())
founds = Thiscomponent.findFirst(SDesc)
do while not isNull(founds)
curFont = founds.CharFontName
If curFont &lt;&gt; &quot;IPH Astra Serif&quot; AND curFont &lt;&gt; &quot;&quot; Then
If Not DocHasCharStyle(oDoc,curFont) Then
oProps() = Array(CreateProperty(&quot;CharFontName&quot;, curFont))
CreateCharacterStyle(curFont, oProps())
End If
founds.CharStyleNames = Array(curFont)
End If
founds = Thiscomponent.findNext(founds.getend, SDesc)
loop
End Sub
Private Sub replaceBaseWithStandard
dim document as Object
dim dispatcher as object
document = ThisComponent.CurrentController.Frame
dispatcher = createUnoService(&quot;com.sun.star.frame.DispatchHelper&quot;)
dim args1(21) as new com.sun.star.beans.PropertyValue
args1(0).Name = &quot;SearchItem.StyleFamily&quot;
args1(0).Value = 2
args1(1).Name = &quot;SearchItem.CellType&quot;
args1(1).Value = 0
args1(2).Name = &quot;SearchItem.RowDirection&quot;
args1(2).Value = true
args1(3).Name = &quot;SearchItem.AllTables&quot;
args1(3).Value = false
args1(4).Name = &quot;SearchItem.SearchFiltered&quot;
args1(4).Value = false
args1(5).Name = &quot;SearchItem.Backward&quot;
args1(5).Value = false
args1(6).Name = &quot;SearchItem.Pattern&quot;
args1(6).Value = true
args1(7).Name = &quot;SearchItem.Content&quot;
args1(7).Value = false
args1(8).Name = &quot;SearchItem.AsianOptions&quot;
args1(8).Value = false
args1(9).Name = &quot;SearchItem.AlgorithmType&quot;
args1(9).Value = 0
args1(10).Name = &quot;SearchItem.SearchFlags&quot;
args1(10).Value = 65536
args1(11).Name = &quot;SearchItem.SearchString&quot;
args1(11).Value = &quot;Базовый&quot;
args1(12).Name = &quot;SearchItem.ReplaceString&quot;
args1(12).Value = &quot;Основной текст&quot;
args1(13).Name = &quot;SearchItem.Locale&quot;
args1(13).Value = 255
args1(14).Name = &quot;SearchItem.ChangedChars&quot;
args1(14).Value = 2
args1(15).Name = &quot;SearchItem.DeletedChars&quot;
args1(15).Value = 2
args1(16).Name = &quot;SearchItem.InsertedChars&quot;
args1(16).Value = 2
args1(17).Name = &quot;SearchItem.TransliterateFlags&quot;
args1(17).Value = 1280
args1(18).Name = &quot;SearchItem.Command&quot;
args1(18).Value = 3
args1(19).Name = &quot;SearchItem.SearchFormatted&quot;
args1(19).Value = false
args1(20).Name = &quot;SearchItem.AlgorithmType2&quot;
args1(20).Value = 1
args1(21).Name = &quot;Quiet&quot;
args1(21).Value = true
dispatcher.executeDispatch(document, &quot;.uno:ExecuteSearch&quot;, &quot;&quot;, 0, args1())
End Sub
Private Sub doNotTrack
dispatcher = createUnoService(&quot;com.sun.star.frame.DispatchHelper&quot;)
document = ThisComponent.CurrentController.Frame
dim trackProperties(0) as new com.sun.star.beans.PropertyValue
trackProperties(0).Name = &quot;TrackChanges&quot;
trackProperties(0).Value = false
dispatcher.executeDispatch(document, &quot;.uno:TrackChanges&quot;, &quot;&quot;, 0, trackProperties())
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = &quot;ShowTrackedChanges&quot;
args1(0).Value = true
dispatcher.executeDispatch(document, &quot;.uno:ShowTrackedChanges&quot;, &quot;&quot;, 0, args1())
End Sub
Private Sub removeDirectFormatting
Dim oDescriptor &apos;The search descriptor
dim dispatcher as Object
dispatcher = createUnoService(&quot;com.sun.star.frame.DispatchHelper&quot;)
dim document as Object
document = ThisComponent.CurrentController.Frame
Dim oViewCursor As Object &apos;View cursor
oViewCursor = ThisComponent.CurrentController.getViewCursor()
oViewCursor.gotoStart(false)
oViewCursor.gotoEnd(true)
dispatcher.executeDispatch(document, &quot;.uno:ResetAttributes&quot;, &quot;&quot;, 0, Array())
footNotes = thisComponent.Footnotes
For x = 0 to footNotes.Count -1
aNote = footNotes.getByIndex(x)
footNoteText = aNote.getText()
oTextcursor = footNoteText.createTextCursor()
oViewCursor.gotoRange(oTextcursor.getStart(),false)
oViewCursor.gotoEnd(true)
dispatcher.executeDispatch(document, &quot;.uno:ResetAttributes&quot;, &quot;&quot;, 0, Array())
Next
endNotes = thisComponent.Endnotes
for x = 0 to endNotes.Count -1
aNote = endNotes.getByIndex(x)
endNoteText = aNote.getText()
oTextcursor = endNoteText.createTextCursor()
oViewCursor.gotoRange(oTextcursor.getStart(),false)
oViewCursor.gotoEnd(true)
dispatcher.executeDispatch(document, &quot;.uno:ResetAttributes&quot;, &quot;&quot;, 0, Array())
next
oViewCursor.gotoStart(false)
End Sub
Private Sub resetFootnotesStyle
Dim oDescriptor &apos;The search descriptor
dim dispatcher as Object
dispatcher = createUnoService(&quot;com.sun.star.frame.DispatchHelper&quot;)
dim document as Object
document = ThisComponent.CurrentController.Frame
Dim oViewCursor As Object &apos;View cursor
oViewCursor = ThisComponent.CurrentController.getViewCursor()
allNotes= thisComponent.FootNotes
for x = 0 to allNotes.Count -1
aNote = allNotes.getByIndex(x)
aNote.Anchor.CharStyleName=&quot;Footnote anchor&quot;
oEnum = aNote.Text.createEnumeration()
Do While oEnum.hasMoreElements()
oCurPar = oEnum.nextElement()
oCurPar.ParaStyleName = &quot;Footnote&quot;
Loop
Next
End Sub
Private Sub removeUnusedStyles
&apos;calls: RemoveUnusedStyles
Dim sElements() as string, oFamilies, oFamily, sFamily$, sLabel, oDlg, i%
Dim oDoc as object
oDoc = ThisComponent
oFamilies = thiscomponent.StyleFamilies
sElements() = oFamilies.getElementNames()
For i = 0 to uBound(sElements()) -2
oFamily = oFamilies.getByName(sElements(i))
removeUnusedStyle(oFamily,sElements(i),True)
Next
End Sub
Private Sub removeUnusedStyle(oFamily,sFamily as string, bAsk as Boolean)
&apos;calls: getStyleNames
Dim sUsed() as String, sMsg$,iAnswer%, bStop as boolean
sUsed() = getStyleNames(oFamily,bLocalized:=True,bUsed:=False,bUserDef:=true)
If uBound(sUsed()) &gt; -1 then
For i = 0 to uBound(sUsed())
oFamily.removeByName(sUsed(i))
Next
EndIf
End Sub
Private Sub convertFormatToEnclosure(identifier, styleNames, styleValues)
leftEnclosure = compileLeftEnclosure(identifier)
rightEnclosure = compileRightEnclosure(identifier)
Dim oTextCursor As Object
Dim startTextRange As Object
Dim endTextRange As Object
Dim foundString As String
Dim SrchAttributes(Ubound(styleNames)) as new com.sun.star.beans.PropertyValue
For i = 0 To Ubound(styleNames)
SrchAttributes(i).Name = styleNames(i)
SrchAttributes(i).Value = styleValues(i)
Next i
SDesc = Thiscomponent.createSearchDescriptor()
SDesc.SearchAll = true
SDesc.SearchRegularExpression = true
SDesc.SearchString = &quot;&quot;
SDesc.searchStyles = false
SDesc.SetSearchAttributes(SrchAttributes)
found = Thiscomponent.findFirst(SDesc)
Do While not isNull(found)
oTextCursor = found.Text.createTextCursor()
oTextCursor.goToRange(found.Start, false)
oTextCursor.goToRange(found.End, true)
For i = 0 To Ubound(styleNames)
oTextCursor.setPropertyToDefault(styleNames(i))
Next i
foundString = found.getString()
If Len(foundString) &lt;&gt; 0 Then
oTextCursor.collapseToEnd()
oTextCursor.String = rightEnclosure
endTextRange = oTextCursor.getEnd()
oTextCursor.goToRange(found.start,false)
oTextCursor.String = leftEnclosure
EndIf
found = Thiscomponent.findNext(found.End, SDesc)
Loop
End Sub
Private Sub convertEnclosuresToFormat(identifier, styleNames, styleValues)
Dim oTextCursor As Object
Dim startTextRange As Object
Dim endTextRange As Object
Dim leftEnclosure As String
Dim rightEnclosure As String
leftEnclosure = compileLeftEnclosure(identifier)
rightEnclosure = compileRightEnclosure(identifier)
SDesc = Thiscomponent.createSearchDescriptor()
SDesc.SearchAll = true
SDesc.SearchRegularExpression = true
SDesc.SearchString = leftEnclosure + &quot;([^&quot; + identifier+ &quot;]*)&quot; + rightEnclosure
found = Thiscomponent.findFirst(SDesc)
Do While not isNull(found)
oTextCursor = found.Text.createTextCursor()
oTextCursor.goToRange(found.Start, false)
oTextCursor.goToRange(found.End, true)
oTextCursor.setPropertyValues(styleNames, styleValues)
oTextCursor.collapseToEnd()
oTextCursor.goLeft(Len(rightEnclosure), true)
oTextCursor.String = &quot;&quot;
endTextRange = oTextCursor.getEnd()
oTextCursor.goToRange(found.start,false)
oTextCursor.goRight(Len(leftEnclosure), true)
oTextCursor.String = &quot;&quot;
found = Thiscomponent.findNext(endTextRange, SDesc)
Loop
End Sub
Private Function compileSearchString(identifier)
compileSearchString = &quot;&lt;&quot;+identifier+&quot;&gt;&quot;+&quot;(.*?)&quot;+&quot;&lt;/&quot;+identifier+&quot;&gt;&quot;
End Function
Private Function compileLeftEnclosure(identifier)
compileLeftEnclosure = &quot;&lt;&quot;+identifier+&quot;&gt;&quot;
End Function
Private Function compileRightEnclosure(identifier)
compileRightEnclosure = &quot;&lt;/&quot;+identifier+&quot;&gt;&quot;
End Function
Private Sub toTextBold
styleNames = Array(&quot;CharWeight&quot;)
styleValues = Array(com.sun.star.awt.FontWeight.BOLD)
convertFormatToEnclosure(CHR(867), styleNames, styleValues)
End Sub
Private Sub fromTextBold
styleNames = Array(&quot;CharWeight&quot;)
styleValues = Array(com.sun.star.awt.FontWeight.BOLD)
convertEnclosuresToFormat(CHR(867), styleNames, styleValues)
End Sub
Private Sub toTextItalic
styleNames = Array(&quot;CharPosture&quot;)
styleValues = Array(com.sun.star.awt.FontSlant.ITALIC)
convertFormatToEnclosure(CHR(868), styleNames, styleValues)
End Sub
Private Sub fromTextItalic
styleNames = Array(&quot;CharPosture&quot;)
styleValues = Array(com.sun.star.awt.FontSlant.ITALIC)
convertEnclosuresToFormat(CHR(868), styleNames, styleValues)
End Sub
Private Sub toTextStrikeout
styleNames = Array(&quot;CharStrikeout&quot;)
styleValues = Array(com.sun.star.awt.FontStrikeout.SINGLE)
convertFormatToEnclosure(CHR(869), styleNames, styleValues)
End Sub
Private Sub fromTextStrikeout
styleNames = Array(&quot;CharStrikeout&quot;)
styleValues = Array(com.sun.star.awt.FontStrikeout.SINGLE)
convertEnclosuresToFormat(CHR(869), styleNames, styleValues)
End Sub
Private Sub toTextUnderline
styleNames = Array(&quot;CharUnderline&quot;)
styleValues = Array(com.sun.star.awt.FontUnderline.SINGLE)
convertFormatToEnclosure(CHR(870), styleNames, styleValues)
End Sub
Private Sub fromTextUnderline
styleNames = Array(&quot;CharUnderline&quot;)
styleValues = Array(com.sun.star.awt.FontUnderline.SINGLE)
convertEnclosuresToFormat(CHR(870), styleNames, styleValues)
End Sub
Private Sub toTextSuperscript
styleNames = Array(&quot;CharEscapementHeight&quot;,&quot;CharEscapement&quot;)
styleValues = Array(58,101)
convertFormatToEnclosure(CHR(871), styleNames, styleValues)
End Sub
Private Sub fromTextSuperscript
styleNames = Array(&quot;CharEscapementHeight&quot;,&quot;CharEscapement&quot;)
styleValues = Array(58,101)
convertEnclosuresToFormat(CHR(871), styleNames, styleValues)
End Sub
Private Sub toTextSubscript
styleNames = Array(&quot;CharEscapementHeight&quot;,&quot;CharEscapement&quot;)
styleValues = Array(58,-101)
convertFormatToEnclosure(CHR(872), styleNames, styleValues)
End Sub
Private Sub fromTextSubscript
styleNames = Array(&quot;CharEscapementHeight&quot;,&quot;CharEscapement&quot;)
styleValues = Array(58,-101)
convertEnclosuresToFormat(CHR(872), styleNames, styleValues)
End Sub
Private Sub toTextSparce
styleNames = Array(&quot;CharKerning&quot;)
For i=70 To 70
styleValues = Array(i)
convertFormatToEnclosure(CHR(873) &amp; i, styleNames, styleValues)
Next
End Sub
Private Sub fromTextSparce
styleNames = Array(&quot;CharKerning&quot;)
For i=70 To 70
styleValues = Array(i)
convertEnclosuresToFormat(CHR(873) &amp; i, styleNames, styleValues)
Next
End Sub
Private Sub convertFormattingToText
toTextBold
toTextItalic
toTextStrikeout
toTextUnderline
toTextSuperscript
toTextSubscript
toTextSparce
End Sub
Private Sub convertFormattingFromText
fromTextSparce
fromTextSuperscript
fromTextSubscript
fromTextUnderline
fromTextStrikeout
fromTextItalic
fromTextBold
End Sub
Private Function confirm(description)
If MsgBox (description, 4) =6 Then
confirm = true
Else
confirm = false
EndIf
End Function
Private Sub ReplaceFormatting(SearchString,oReplaceString,SrchAttributes,ReplAttributes, searchStyles)
Dim oReplace
oReplace = ThisComponent.createReplaceDescriptor()
oReplace.SearchString = SearchString
oReplace.ReplaceString = oReplaceString
oReplace.SearchRegularExpression=True
oReplace.SearchCaseSensitive = True
oReplace.searchAll=True
If Not IsEmpty(SrchAttributes(0).Value) Then
oReplace.SetSearchAttributes(SrchAttributes())
oReplace.searchStyles = searchStyles
End If
If Not IsEmpty(ReplAttributes(0).Value) Then
oReplace.SetReplaceAttributes(ReplAttributes())
End If
ThisComponent.replaceAll(oReplace)
End Sub
Private Function getStyleNames(oFamily,bLocalized as Boolean, _
optional bUsed, optional bUserDef)
Dim oStyle,i%,sNames$(),sName$,chkUse as Boolean, chkUDef as Boolean
For i = 0 to oFamily.getCount -1
oStyle = oFamily.getByIndex(i)
If bLocalized then
sName = oStyle.DisplayName
Else
sName = oStyle.getName
Endif
If (vartype(bUsed) = 11)then
chkUse = (bUsed EQV oStyle.isInUse)
Else
chkUse = True
Endif
If (vartype(bUserDef) = 11) then
chkUDef = (bUserDef EQV oStyle.isUserDefined)
Else
chkUDef = True
EndIf
If sName = &quot;Автор&quot; Or sName = &quot;Автор по-английски&quot; Or sName = &quot;Ключевые слова&quot; Or sName = &quot;Текст списка литературы&quot; Or sName = &quot;Эпиграф&quot; or sName = &quot;Цитирование&quot; or sName = &quot;Сведения об авторе&quot; or sName = &quot;Аннотация&quot; Then
chkUse = False
Endif
If chkUse AND chkUDef then
bas_Pusharray sNames(),sName
Endif
Next
getStyleNames = sNames()
End Function
&apos;very simple routine appending some element to an array which can be undimensioned (LBound &gt; UBound)
Sub bas_PushArray(xArray(),vNextElement)
Dim iUB%,iLB%
iLB = lBound(xArray())
iUB = uBound(xArray())
If iLB &gt; iUB then
iUB = iLB
redim xArray(iLB To iUB)
Else
iUB = iUB +1
redim preserve xArray(iLB To iUB)
Endif
xArray(iUB) = vNextElement
End Sub
</script:module>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 822 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 837 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 837 B

View file

@ -29,8 +29,8 @@
</extension-description>
<icon>
<default xlink:href="icons/img-48.png" />
<high-contrast xlink:href="icons/img-48.png" />
<default xlink:href="icons/addon_icon.png" />
<high-contrast xlink:href="icons/addon_icon.png" />
</icon>
</description>

BIN
icons/addon_icon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.1 KiB

BIN
icons/clean.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 910 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.3 KiB

BIN
icons/validate.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

BIN
redaction.oxt Normal file

Binary file not shown.