diff --git a/Addons.xcu b/Addons.xcu index 27958a2..091132a 100644 --- a/Addons.xcu +++ b/Addons.xcu @@ -4,27 +4,7 @@ oor:name="Addons" oor:package="org.openoffice.Office"> - - - - com.sun.star.text.GlobalDocument,com.sun.star.text.TextDocument,com.sun.star.text.WebDocument - - - Extension for document publishing preparation - Расширение для подготовки рукописей к изданию - - - macro:///IPHRedaction.Validation.validate - - - _self - - - %origin%/icons/img-48 - - - - + @@ -40,9 +20,6 @@ _self - - %origin%/IPHRedaction/validate - @@ -57,9 +34,6 @@ _self - - %origin%/IPHRedaction/testfont - @@ -76,9 +50,6 @@ _self - - %origin%/IPHRedaction/validate - @@ -86,7 +57,7 @@ Чистка - Purification + Cleaning macro:///IPHRedaction.Clean.cleanButton @@ -94,14 +65,30 @@ _self - - %origin%/IPHRedaction/testfont - - - - + + + + macro:///IPHRedaction.Clean.cleanButton + + + + %origin%/icons/clean.png + + + + + + macro:///IPHRedaction.Validation.validateButton + + + + %origin%/icons/validate.png + + + + diff --git a/IPHRedaction/Clean.xba b/IPHRedaction/Clean.xba index 1c2d123..590f934 100644 --- a/IPHRedaction/Clean.xba +++ b/IPHRedaction/Clean.xba @@ -1,479 +1,503 @@ -Sub fixFrequentMistakes +Sub cleanButton Dim description As String - description = "Вы уверены, что хотите запустить исправление часто встречающихся ошибок?" + Dim statusIndicator as Object + statusIndicator = ThisComponent.getCurrentController.statusIndicator + description = "Вы уверены, что хотите выполнить чистку документа?" 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("(?<=[:space:])[:space:]+","") - 'Не должно быть ни одного пробела в начале абзацев - AskAndReplace("^[:space:]+","") - 'Не должно быть пробелов в конце абзацев - AskAndReplace("[:space:]+$","") - 'Не должно быть пустых абзацев - AskAndReplace("^$","") - 'Не должно быть пробелов перед знаками пунктуации .,;:?!)]}»¡¿”‘’ - AskAndReplace("[:space:]+(?=[\.,;:?!\)\]\}»¡¿”‘’])","") - 'Между словом том и цифрой должен быть неразрывный пробел, а не обычный - AskAndReplace("(?<=\b[тТ](ом|\.))\ (?=[:digit:])",NBSP) - 'Между словом серия и цифрой должен быть неразрывный пробел, а не обычный - AskAndReplace("(?<=\b[сС](ерия|\.))\ +(?=[:digit:])",NBSP) - 'Между словом часть и цифрой должен быть неразрывный пробел, а не обычный - AskAndReplace("(?<=\b[чЧ](асть|\.))\ +(?=[:digit:])",NBSP) - 'Между числом и "г." должен быть неразрывный пробел, а не обычный - AskAndReplace("(?<=[0-9])[:space:]*г(?=\.)",NBSP & "г") - 'Между инициалами и Фамилией должен быть неразрывный пробел, а не обычный - AskAndReplace("(?<=[:upper:]\.[:space:][:upper:]\.)\ (?=[:upper:][:lower:]+)",NBSP) - 'Между Фамилией и инициалами должен быть неразрывный пробел, а не обычный - AskAndReplace("(?<=[:upper:][:lower:]{1,30})\ (?=[:upper:]\.[:space:][:upper:]\.)",NBSP) - - 'Не должно быть пробелов после скобок [({ и кавычек «„ - AskAndReplace("(?<=[\(\[\{«„])[:space:]","") - 'Между "и" и "т." должен быть неразрывный пробел, а не обычный - AskAndReplace("(?<=\bи)\ (?=т\.)",NBSP) - 'Между "т." и "е./н./д./п./к." должен быть неразрывный пробел, а не обычный - AskAndReplace("(?<=\bт)\.\ ?(?=[ендпк]\.)","." & NBSP) - - 'Между буквами среднее тире должно обрамляться пробелами - AskAndReplace("(?<=[:alpha:])–(?=[:alpha:])",NBSP & "–" & NBSP) - 'Между буквами дефис-минус, цифровое тире и длинное тире заменяется на среднее тире - AskAndReplace("(?<=[:alpha:][:space:])[-‒—](?=[:space:][:alpha:])","–") - 'Между двумя цифрами и тире между ними не долнжо быть пробелов. А также тире должно быть цифровым - AskAndReplace("(?<=[:digit:])(?:[:space:])?[-‒–—](?:[:space:])?(?=[:digit:])","‒") - - 'Между двумя римскими цифрами и тире между ними не долнжо быть пробелов. А также тире должно быть средним - AskAndReplace("(?<=[MDCLXVI])(?:[:space:])?[-‒–—](?:[:space:])?(?=[MDCLXVI])","–") - - 'Между буквой и угловой открывающейся скобкой должен быть пробел - AskAndReplace("(?<=[:alpha:])<(?=…>)",space & "<") - 'Между угловой закрывающейся скобкой и буквой должен быть пробел - AskAndReplace("(?<=<…)>(?=[:alpha:])",">" & space) + saveDocument + doNotTrack + statusIndicator.Start("Чистка документа начата, подождите",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("(?<=[:alpha:])<(?=…>)"," <") - AskAndReplace("(?<=<…)>(?=[:alpha:])","> ") - AskAndReplace("(?<=[:alpha:])–(?=[:alpha:])"," – ") - StopTracking -End Sub - - -Sub executeRemoveConsequentSpaces - StartTracking - AskAndReplace("(?<=[: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("(?<=[:digit:])(?:[:space:])?[-‒–—](?:[:space:])?(?=[:digit:])","‒") - StopTracking -End Sub - -Sub executeReplaceLongDashWithSpacesBetweenWords - StartTracking - AskAndReplace("(?<=[:alpha:][:space:])[-‒—](?=[:space:][:alpha:])","–") - StopTracking -End Sub - -Sub executeRemoveSpacesAfterOpenedQuoteOrBracket - StartTracking - AskAndReplace("(?<=[\(\[\{«„])[:space:]","") - StopTracking -End Sub - - -Sub executeNonBreakingSpaceBetweenLastnameAndInitials - StartTracking - AskAndReplace("(?<=[^.!?][:space:][:upper:][:lower:]{1,30})\ (?=[:upper:]\.[:upper:]\.)"," ") - StopTracking -End Sub - - -Sub executeNonBreakingSpaceBetweenInitialsAndLastName - StartTracking - AskAndReplace("(?<=[:upper:]\.[:upper:]\.)\ (?=[:upper:][:lower:]+)"," ") - StopTracking -End Sub - -Sub executeNonBreakingSpaceBetweenEtc - StartTracking - AskAndReplace("(?<=\bи)\ (?=т\.)"," ") - AskAndReplace("(?<=\bт)\.\ ?(?=[ендпк]\.)",". ") - StopTracking -End Sub - -'Sub executeNonBreakingSpaceAfterPageOrVolume -' StartTracking -' AskAndReplace("(?<=\b[сСтТ]\.)[:space:](?=[:digit:])"," ") -' StopTracking -'End Sub - -Sub executeNonBreakingSpaceBetweenVol - StartTracking - AskAndReplace("(?<=\b[тТ](ом|\.))[:space:](?=[:digit:])"," ") - StopTracking -End Sub - -Sub executeNonBreakingSpaceBetweenSeries - StartTracking - AskAndReplace("(?<=\b[сС](ерия|\.))[:space:](?=[:digit:])"," ") - StopTracking -End Sub - -Sub executeNonBreakingSpaceBetweenPart - StartTracking - AskAndReplace("(?<=\b[чЧ](асть|\.))[:space:]+(?=[:digit:])"," ") - StopTracking -End Sub - - -Sub executeNonBreakingSpaceBetweenYear - StartTracking - AskAndReplace("(?<=[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) < 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() > 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 > 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("com.sun.star.frame.DispatchHelper") + dispatcher.executeDispatch(document, ".uno:Save", "", 0, Array()) + dispatcher.executeDispatch(document, ".uno:Reload", "", 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 >= 57344 AND char <= 63743 then - result = result & "Символ "& Chr(char) &" сноски "& i &" находится в диапазоне для частного использования"& chr(10) - 'Mri footnote - 'footNote.setLabel(Left(label,j-1) & "*" & Right(label,charNum-j)) - End If - Next j - Next i - If result <> "" then - MsgBox result +Private Sub saveDocument() + + dim document as object + dim dispatcher as object + document = ThisComponent.CurrentController.Frame + dispatcher = createUnoService("com.sun.star.frame.DispatchHelper") + dispatcher.executeDispatch(document, ".uno:Save", "", 0, Array()) + +end Sub + +Private Sub cleanFormatting + + 'Не должно быть символов табуляции + AskAndReplace("\t","") + 'Не должно быть подряд больше одного пробела + AskAndReplace("(?<=[:space:])[:space:]+","") + 'Не должно быть ни одного пробела в начале абзацев + AskAndReplace("^[:space:]+","") + 'Не должно быть пустых абзацев + AskAndReplace("^$","") + + 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 = "" + srch(0).Name = "CharFontName" + SDesc.SetSearchAttributes(srch()) + founds = Thiscomponent.findFirst(SDesc) + do while not isNull(founds) + curFont = founds.CharFontName + If curFont <> "IPH Astra Serif" AND curFont <> "" Then + If Not DocHasCharStyle(oDoc,curFont) Then + oProps() = Array(CreateProperty("CharFontName", 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("com.sun.star.frame.DispatchHelper") + 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 = true + 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 = 0 + args1(10).Name = "SearchItem.SearchFlags" + args1(10).Value = 65536 + args1(11).Name = "SearchItem.SearchString" + args1(11).Value = "Базовый" + 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 = 3 + args1(19).Name = "SearchItem.SearchFormatted" + args1(19).Value = false + args1(20).Name = "SearchItem.AlgorithmType2" + args1(20).Value = 1 + args1(21).Name = "Quiet" + args1(21).Value = true + dispatcher.executeDispatch(document, ".uno:ExecuteSearch", "", 0, args1()) +End Sub + +Private Sub doNotTrack + 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 + + + +Private Sub removeDirectFormatting + Dim oDescriptor 'The search descriptor + dim dispatcher as Object + dispatcher = createUnoService("com.sun.star.frame.DispatchHelper") + dim document as Object + document = ThisComponent.CurrentController.Frame + Dim oViewCursor As Object 'View cursor + oViewCursor = ThisComponent.CurrentController.getViewCursor() + oViewCursor.gotoStart(false) + oViewCursor.gotoEnd(true) + dispatcher.executeDispatch(document, ".uno:ResetAttributes", "", 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, ".uno:ResetAttributes", "", 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, ".uno:ResetAttributes", "", 0, Array()) + next + + oViewCursor.gotoStart(false) +End Sub + +Private Sub resetFootnotesStyle + Dim oDescriptor 'The search descriptor + dim dispatcher as Object + dispatcher = createUnoService("com.sun.star.frame.DispatchHelper") + dim document as Object + document = ThisComponent.CurrentController.Frame + Dim oViewCursor As Object 'View cursor + oViewCursor = ThisComponent.CurrentController.getViewCursor() + allNotes= thisComponent.FootNotes + for x = 0 to allNotes.Count -1 + aNote = allNotes.getByIndex(x) + aNote.Anchor.CharStyleName="Footnote anchor" + oEnum = aNote.Text.createEnumeration() + Do While oEnum.hasMoreElements() + oCurPar = oEnum.nextElement() + oCurPar.ParaStyleName = "Footnote" + Loop + Next +End Sub + +Private Sub removeUnusedStyles + '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) + 'calls: getStyleNames + Dim sUsed() as String, sMsg$,iAnswer%, bStop as boolean + sUsed() = getStyleNames(oFamily,bLocalized:=True,bUsed:=False,bUserDef:=true) + If uBound(sUsed()) > -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 = "" + 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) <> 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 + "([^" + identifier+ "]*)" + 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 = "" + endTextRange = oTextCursor.getEnd() + oTextCursor.goToRange(found.start,false) + oTextCursor.goRight(Len(leftEnclosure), true) + oTextCursor.String = "" + found = Thiscomponent.findNext(endTextRange, SDesc) + Loop +End Sub + + +Private Function compileSearchString(identifier) + compileSearchString = "<"+identifier+">"+"(.*?)"+"</"+identifier+">" +End Function + +Private Function compileLeftEnclosure(identifier) + compileLeftEnclosure = "<"+identifier+">" +End Function + +Private Function compileRightEnclosure(identifier) + compileRightEnclosure = "</"+identifier+">" +End Function + + +Private Sub toTextBold + styleNames = Array("CharWeight") + styleValues = Array(com.sun.star.awt.FontWeight.BOLD) + convertFormatToEnclosure(CHR(867), styleNames, styleValues) +End Sub + +Private Sub fromTextBold + styleNames = Array("CharWeight") + styleValues = Array(com.sun.star.awt.FontWeight.BOLD) + convertEnclosuresToFormat(CHR(867), styleNames, styleValues) +End Sub + +Private Sub toTextItalic + styleNames = Array("CharPosture") + styleValues = Array(com.sun.star.awt.FontSlant.ITALIC) + convertFormatToEnclosure(CHR(868), styleNames, styleValues) +End Sub + +Private Sub fromTextItalic + styleNames = Array("CharPosture") + styleValues = Array(com.sun.star.awt.FontSlant.ITALIC) + convertEnclosuresToFormat(CHR(868), styleNames, styleValues) +End Sub + +Private Sub toTextStrikeout + styleNames = Array("CharStrikeout") + styleValues = Array(com.sun.star.awt.FontStrikeout.SINGLE) + convertFormatToEnclosure(CHR(869), styleNames, styleValues) + +End Sub + +Private Sub fromTextStrikeout + styleNames = Array("CharStrikeout") + styleValues = Array(com.sun.star.awt.FontStrikeout.SINGLE) + convertEnclosuresToFormat(CHR(869), styleNames, styleValues) +End Sub + + +Private Sub toTextUnderline + styleNames = Array("CharUnderline") + styleValues = Array(com.sun.star.awt.FontUnderline.SINGLE) + convertFormatToEnclosure(CHR(870), styleNames, styleValues) +End Sub + +Private Sub fromTextUnderline + styleNames = Array("CharUnderline") + styleValues = Array(com.sun.star.awt.FontUnderline.SINGLE) + convertEnclosuresToFormat(CHR(870), styleNames, styleValues) +End Sub + +Private Sub toTextSuperscript + styleNames = Array("CharEscapementHeight","CharEscapement") + styleValues = Array(58,101) + convertFormatToEnclosure(CHR(871), styleNames, styleValues) +End Sub + +Private Sub fromTextSuperscript + styleNames = Array("CharEscapementHeight","CharEscapement") + styleValues = Array(58,101) + convertEnclosuresToFormat(CHR(871), styleNames, styleValues) +End Sub + +Private Sub toTextSubscript + styleNames = Array("CharEscapementHeight","CharEscapement") + styleValues = Array(58,-101) + convertFormatToEnclosure(CHR(872), styleNames, styleValues) +End Sub + +Private Sub fromTextSubscript + styleNames = Array("CharEscapementHeight","CharEscapement") + styleValues = Array(58,-101) + convertEnclosuresToFormat(CHR(872), styleNames, styleValues) +End Sub + +Private Sub toTextSparce + styleNames = Array("CharKerning") + For i=70 To 70 + styleValues = Array(i) + convertFormatToEnclosure(CHR(873) & i, styleNames, styleValues) + Next +End Sub + +Private Sub fromTextSparce + styleNames = Array("CharKerning") + For i=70 To 70 + styleValues = Array(i) + convertEnclosuresToFormat(CHR(873) & 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 = "Автор" Or sName = "Автор по-английски" Or sName = "Ключевые слова" Or sName = "Текст списка литературы" Or sName = "Эпиграф" or sName = "Цитирование" or sName = "Сведения об авторе" or sName = "Аннотация" Then + chkUse = False + Endif + If chkUse AND chkUDef then + bas_Pusharray sNames(),sName + Endif + Next + getStyleNames = sNames() + End Function + + 'very simple routine appending some element to an array which can be undimensioned (LBound > UBound) + Sub bas_PushArray(xArray(),vNextElement) + Dim iUB%,iLB% + iLB = lBound(xArray()) + iUB = uBound(xArray()) + If iLB > 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 + \ No newline at end of file diff --git a/IPHRedaction/testfont_16.bmp b/IPHRedaction/testfont_16.bmp deleted file mode 100644 index 80c0ab2..0000000 Binary files a/IPHRedaction/testfont_16.bmp and /dev/null differ diff --git a/IPHRedaction/testfont_26.bmp b/IPHRedaction/testfont_26.bmp deleted file mode 100644 index 28151c3..0000000 Binary files a/IPHRedaction/testfont_26.bmp and /dev/null differ diff --git a/IPHRedaction/testfont_26.png b/IPHRedaction/testfont_26.png deleted file mode 100644 index d0c7f62..0000000 Binary files a/IPHRedaction/testfont_26.png and /dev/null differ diff --git a/IPHRedaction/validate_26.bmp b/IPHRedaction/validate_26.bmp deleted file mode 100644 index 6745b6c..0000000 Binary files a/IPHRedaction/validate_26.bmp and /dev/null differ diff --git a/IPHRedaction/validate_26.png b/IPHRedaction/validate_26.png deleted file mode 100644 index d0c7f62..0000000 Binary files a/IPHRedaction/validate_26.png and /dev/null differ diff --git a/description.xml b/description.xml index 83dbb8a..0e91011 100644 --- a/description.xml +++ b/description.xml @@ -29,8 +29,8 @@ - - + + diff --git a/icons/addon_icon.png b/icons/addon_icon.png new file mode 100644 index 0000000..ab29643 Binary files /dev/null and b/icons/addon_icon.png differ diff --git a/icons/clean.png b/icons/clean.png new file mode 100644 index 0000000..d3646ab Binary files /dev/null and b/icons/clean.png differ diff --git a/icons/img-16.png b/icons/img-16.png deleted file mode 100644 index 8e3ea0e..0000000 Binary files a/icons/img-16.png and /dev/null differ diff --git a/icons/img-22.png b/icons/img-22.png deleted file mode 100644 index 060a7c1..0000000 Binary files a/icons/img-22.png and /dev/null differ diff --git a/icons/img-256.png b/icons/img-256.png deleted file mode 100644 index 04905be..0000000 Binary files a/icons/img-256.png and /dev/null differ diff --git a/icons/img-32.png b/icons/img-32.png deleted file mode 100644 index 22c8788..0000000 Binary files a/icons/img-32.png and /dev/null differ diff --git a/icons/img-48.png b/icons/img-48.png deleted file mode 100644 index b455f2b..0000000 Binary files a/icons/img-48.png and /dev/null differ diff --git a/icons/validate.png b/icons/validate.png new file mode 100644 index 0000000..4a554a3 Binary files /dev/null and b/icons/validate.png differ diff --git a/redaction.oxt b/redaction.oxt new file mode 100644 index 0000000..b2e7d03 Binary files /dev/null and b/redaction.oxt differ