diff --git a/Addons.xcu b/Addons.xcu index cb8d691..056cb00 100644 --- a/Addons.xcu +++ b/Addons.xcu @@ -238,29 +238,6 @@ - - - - Books - Книги - - - - - macro:///ePublishing.Books.setUniqPageStyles - - - _self - - - - Make page styles unique - Сделать стили страниц уникальными - - - - - @@ -298,6 +275,21 @@ + + + com.sun.star.text.TextDocument,com.sun.star.text.WebDocument + + + Set unique style for each page + Каждой странице уникальный стиль + + + macro:///ePublishing.Books.setUniqPageStyles + + + _self + + com.sun.star.text.TextDocument,com.sun.star.text.WebDocument diff --git a/ePublishing/Archive.xba b/ePublishing/Archive.xba index 10ff7fe..6ff92c5 100644 --- a/ePublishing/Archive.xba +++ b/ePublishing/Archive.xba @@ -494,15 +494,15 @@ Sub replaceParaStyle End Sub -Function getIndex(a, v) +Function getIndex(array As variant, value As variant) As Integer Dim id As Integer Dim nRight As Integer Dim nLen As Integer id = 0 - nRight = uBound(a) - nLen = len(v) + nRight = uBound(array) + nLen = len(value) while id <= nRight - if a(id) = v then + If array(id) = value Then getIndex = id exit Function Else diff --git a/ePublishing/Books.xba b/ePublishing/Books.xba index 587fbf2..834847d 100644 --- a/ePublishing/Books.xba +++ b/ePublishing/Books.xba @@ -1,25 +1,249 @@ -Sub markBooks3 +Sub markBooks5 End Sub -Sub makeUniquePages +Sub setUniqPageStyles Dim pageStyleBreaks As Variant + Dim filteredDupStyles As Variant pageStyleBreaks = getPageStyleBreaks() Dim pageCount As Integer - Dim i As Integer + Dim pageStyleNames() As String + Dim pageNumbers() As Integer + Dim pageStarts() As Object + Dim pageCounter As Integer + pageStyleNames = pageStyleBreaks(0) + pageNumbers = pageStyleBreaks(1) + pageStarts = pageStyleBreaks(2) 'Globalscope.BasicLibraries.LoadLibrary( "MRILib" ) pageCount = thiscomponent.currentController.pageCount - Dim styleNames(pageCount - 1) As String - For i = 0 To pageCount - 1 - If i = 0 Then - + Dim fullChain(pageCount - 1) As String + Dim dupNames() As String + Dim dupCounters() As Integer + Dim chainNum As Integer + Dim pageStyleFamily As Object + Dim pageStyle As Object + pageStyleFamily = ThisComponent.StyleFamilies.getByName("PageStyles") + chainNum = 0 + For pageCounter = 1 To pageCount + If pageNumbers(chainNum) = pageCounter Then + fullChain(pageCounter - 1) = pageStyleNames(chainNum) + If Ubound(pageNumbers) > chainNum Then + chainNum = chainNum + 1 + EndIf + Else + pageStyle = pageStyleFamily.getByName(fullChain(pageCounter - 1 - 1)) + fullChain(pageCounter - 1) = pageStyle.FollowStyle EndIf - Next i + Dim dupPosition As Integer + dupPosition = getIndex(dupNames, fullChain(pageCounter - 1) ) + If dupPosition = -1 Then + addToArray(dupNames, fullChain(pageCounter - 1)) + addToArray(dupCounters, 1) + Else + dupCounters(dupPosition) = dupCounters(dupPosition) + 1 + EndIf + Next pageCounter + + filteredDupStyles = filterPageStyleNames(dupNames,dupCounters) + filteredDupStyles = createDupNames(filteredDupStyles) + Dim duplicateNames() As String + Dim initNames() As String + Dim dupName As String + duplicateNames = filteredDupStyles(2) + initNames = filteredDupStyles(0) + createPageStyleClones(filteredDupStyles) + + chainNum = 0 + Dim curName As String + Dim pageStart As Object + Dim prevPageStyle As Object + Dim index As Integer + For pageCounter = 1 To pageCount + If pageNumbers(chainNum) = pageCounter Then + index = getIndex(initNames, pageStyleNames(chainNum)) + If index > -1 Then + pageStart = pageStarts(chainNum) + dupName = getDuplicate(duplicateNames(index)) + pageStart.pageDescName = dupName + fullChain(pageCounter - 1) = dupName + EndIf + If Ubound(pageNumbers) > chainNum Then + chainNum = chainNum + 1 + EndIf + Else + curName = fullChain(pageCounter - 1) + index = getIndex(initNames, curName) + If index > -1 Then + dupName = getDuplicate(duplicateNames(index)) + prevPageStyle = pageStyleFamily.getByName(fullChain(pageCounter - 1 - 1)) + prevPageStyle.FollowStyle = dupName + fullChain(pageCounter - 1) = dupName + EndIf + EndIf + Next pageCounter + MsgBox getTranslation(allPagesHaveUniqPageStyle) +End Sub + +Function getDuplicate(duplicateNames() As String) As String + Dim index As Integer + Dim dupName As String + For index = LBound(duplicateNames) To Ubound(duplicateNames) + dupName = duplicateNames(index) + If dupName <> "" Then + getDuplicate = dupName + duplicateNames(index) = "" + Exit Function + EndIf + Next index +End Function + + +Sub createPageStyleClones(filteredDupStyles As Variant) + 'Globalscope.BasicLibraries.LoadLibrary( "MRILib" ) + Dim oViewCursor As Object + Dim initialNames() As String + Dim dupNames() As Variant + Dim initialName As String + Dim style As Object + initialNames = filteredDupStyles(0) + dupNames = filteredDupStyles(2) + Dim pageStyleFamily As Object + pageStyleFamily = ThisComponent.StyleFamilies.getByName("PageStyles") + oViewCursor = ThisComponent.CurrentController.getViewCursor() + oViewCursor.goToEnd(False) + Dim index As Integer + Dim dupInedx As Integer + insertPageBreak() + Dim duplicates() As String + Dim duplicate As String + Dim pageStyleOriginals As Integer + Dim newStyle As Object + For index = LBound(initialNames) To Ubound(initialNames) + initialName = initialNames(index) + style = pageStyleFamily.getByName(initialName) + oViewCursor.PageDescName = style.Name + duplicates = dupNames(index) + For dupIndex = LBound(duplicates) To Ubound(duplicates) + duplicate = duplicates(dupIndex) + createPageStyleByExample(duplicate) + newStyle = pageStyleFamily.getByName(duplicate) + newStyle.FollowStyle = style.Name + Next + Next + backspace End Sub +Function createDupNames(dupStyles As Variant) As Variant + Dim newDupStyles(2) As Variant + Dim counters() As Integer + Dim initNames() As String + Dim initName As String + initNames = dupStyles(0) + counters = dupStyles(1) + Dim newDupNames() As Variant + Dim i As Integer + Dim nameIt As Integer + For i = LBound(counters) To UBound(counters) + ReDim newNames(counters(i) - 1) As String + addToArray(newDupNames, newNames) + + initName = initNames(i) + For nameIt = LBound(newNames) To UBound(newNames) + newNames(nameIt) = createDupName(initName, newDupNames) + newDupNames(UBound(newDupNames)) = newNames + Next nameIt + + Next i + + newDupStyles(0) = initNames + newDupStyles(1) = counters + newDupStyles(2) = newDupNames + createDupNames = newDupStyles +End Function + +Function createDupName(initName As String, newDupNames As Variant ) + Dim pageStyleFamily As Object + pageStyleFamily = ThisComponent.StyleFamilies.getByName("PageStyles") + Dim proposeName As String + Dim i As Integer + Dim postfix As String + Dim prefixName As String + prefixName = getPrefixName(initName) + For i = 1 To 10000 + proposeName = prefixName & i + If NOT pageStyleFamily.hasByName(proposeName) And Not IsInArrays(newDupNames, proposeName) Then + createDupName = proposeName + Exit Function + EndIf + Next i + +End Function + +Function getPrefixName(initName As String) As String + Dim num As Integer + Dim tmpName As String + tmpName = Trim(initName) + If tmpName = "" Then + getPrefixName = "" + Exit Function + EndIf + num = Asc(Right(tmpName, 1)) + Do while num >= 48 AND num <= 57 + tmpName = Trim(Left(tmpName, Len(tmpName) - 1)) + If tmpName = "" Then + getPrefixName = "" + Exit Function + EndIf + num = Asc(Right(tmpName, 1)) + Loop + If tmpName = "Статья" Then + Dim result As String + result = Trim(initName) & " стр." + getPrefixName = result + Exit Function + EndIf + If Len(tmpName) > 4 AND Right(tmpName,4) = "стр." Then + getPrefixName = tmpName + Exit Function + EndIf + getPrefixName = tmpName & " " +End Function + + +Function IsInArrays(newDupNames As Variant, proposeName As String) As Boolean + 'Globalscope.BasicLibraries.LoadLibrary( "MRILib" ) + Dim i As Integer + Dim names() As String + For i = LBound(newDupNames) To Ubound(newDupNames) + names = newDupNames(i) + If getIndex(names, proposeName) > -1 Then + IsInArrays = True + Exit Function + EndIf + Next i + IsInArrays = False +End Function + +Function filterPageStyleNames(names() As String, counters() As Integer) As Variant + Dim i As Integer + Dim filteredNames() As String + Dim filteredCounters() As Integer + For i=Lbound(counters) To Ubound(counters) + If counters(i) > 1 Then + addToArray(filteredNames, names(i)) + addToArray(filteredCounters, counters(i)) + EndIf + Next i + Dim filteredDups(1) As Variant + filteredDups(0) = filteredNames + filteredDups(1) = filteredCounters + filterPageStyleNames = filteredDups +End Function + + Function getPageStyleBreaks() Dim enum1 As Object @@ -30,12 +254,13 @@ Function getPageStyleBreaks() Dim oViewCursor As Object Dim anchor As Object Dim oSavePosition As Object - Dim pageStyleBreaks(1) As Variant + Dim pageStyleBreaks(2) As Variant Dim pageStyleNames() As String Dim pageNumbers() As Integer + Dim pageStarts() As Object oViewCursor = ThisComponent.CurrentController.getViewCursor() - enum1 = ThisComponent.Text.createEnumeration() +' Globalscope.BasicLibraries.LoadLibrary( "MRILib" ) Dim i As Integer i = 0 Dim first As Boolean @@ -43,15 +268,22 @@ Function getPageStyleBreaks() While enum1.hasMoreElements enum1Element = enum1.nextElement If enum1Element.supportsService("com.sun.star.text.Paragraph") OR enum1Element.supportsService("com.sun.star.text.TextTable") Then - If enum1Element.BreakType = com.sun.star.style.BreakType.PAGE_BEFORE AND NOT IsMissing(enum1Element.PageDescName) AND NOT IsNull(enum1Element.PageDescName) AND NOT IsEmpty(enum1Element.PageDescName) Then +' MRi enum1Element + If NOT isEmpty(enum1Element.PageDescName) And enum1Element.PageDescName <> "" Then pageStyleName = enum1Element.PageStyleName addToArray(pageStyleNames(),pageStyleName) - oViewCursor.goToRange(enum1Element.Anchor,false) + If enum1Element.supportsService("com.sun.star.text.Paragraph") Then + oViewCursor.goToRange(enum1Element.Anchor,false) + ElseIf enum1Element.supportsService("com.sun.star.text.TextTable") Then + oViewCursor.goToRange(enum1Element.getCellByPosition(0,0).getStart(),false) + EndIf addToArray(pageNumbers(),CInt(oViewCursor.Page)) + addToArray(pageStarts(),enum1Element) first = false ElseIf first Then addToArray(pageStyleNames(), enum1Element.PageStyleName) addToArray(pageNumbers(),1) + addToArray(pageStarts(),enum1Element) first = false EndIf @@ -60,10 +292,11 @@ Function getPageStyleBreaks() Wend pageStyleBreaks(0) = pageStyleNames pageStyleBreaks(1) = pageNumbers + pageStyleBreaks(2) = pageStarts getPageStyleBreaks = pageStyleBreaks End Function -Sub setUniqPageStyles +Sub setUniqPageStylesDEPRECATED Dim prevPageName As String Dim firstPageName As String Dim pageName As String diff --git a/ePublishing/Translations.xba b/ePublishing/Translations.xba index 5505160..50b1706 100644 --- a/ePublishing/Translations.xba +++ b/ePublishing/Translations.xba @@ -234,6 +234,9 @@ Function getRussian(identifier As String) As String Exit Function Case "PageConfigMM" getRussian = "мм" + Exit Function + Case "allPagesHaveUniqPageStyle" + getRussian = "Каждой странице в документе назначен уникальный стиль" Exit Function Case Else getRussian = "Перевод не найден" @@ -461,6 +464,9 @@ Function getEnglish(identifier As String) As String Exit Function Case "PageConfigMM" getEnglish = "mm" + Exit Function + Case "allPagesHaveUniqPageStyle" + getEnglish = "Every page in document now have unique page style" Exit Function Case Else getEnglish = "No translation" diff --git a/translations.ods b/translations.ods index d8a7a7d..39dfb6b 100644 Binary files a/translations.ods and b/translations.ods differ