From e5244b8259fbb136c55f177b4c1862dfe655b145 Mon Sep 17 00:00:00 2001 From: Georgy Litvinov Date: Mon, 6 Jul 2020 11:39:01 +0200 Subject: [PATCH] Added check for headings in tables --- Redaction/Configuration.xba | 2 +- Redaction/Translations.xba | 15 ++++++ Redaction/Validation.xba | 89 ++++++++++++++++++++++++++++++++++-- build.gradle | 2 +- description.xml | 2 +- translations.ods | Bin 26643 -> 26767 bytes 6 files changed, 104 insertions(+), 6 deletions(-) diff --git a/Redaction/Configuration.xba b/Redaction/Configuration.xba index 0b43673..caca05c 100644 --- a/Redaction/Configuration.xba +++ b/Redaction/Configuration.xba @@ -1,7 +1,7 @@ Public Const redactionExtensionName As String = "cleanAndValidate" -Public Const redactionExtensionVersion = "0.8.4" +Public Const redactionExtensionVersion = "0.8.5" Function initRedactionConfiguration() On Error Goto exceptionHandler Dim regFactory As Object diff --git a/Redaction/Translations.xba b/Redaction/Translations.xba index a61d3b3..172da14 100644 --- a/Redaction/Translations.xba +++ b/Redaction/Translations.xba @@ -230,6 +230,9 @@ Function getRussian(identifier As String) As String Case "inPageStyle" getRussian = "стиля страниц" Exit Function + Case "table" + getRussian = "таблице" + Exit Function Case Else getRussian = "Перевод не найден" End Select @@ -442,6 +445,9 @@ Function getEnglish(identifier As String) As String Case "inPageStyle" getEnglish = "of page style" Exit Function + Case "table" + getEnglish = "table" + Exit Function Case Else getEnglish = "No translation" End Select @@ -653,6 +659,9 @@ Function getCroatian(identifier As String) As String Case "inPageStyle" getCroatian = "stil stranice" Exit Function + Case "table" + getCroatian = "stola" + Exit Function Case Else getCroatian = "No translation" End Select @@ -864,6 +873,9 @@ Function getSerbian(identifier As String) As String Case "inPageStyle" getSerbian = "стил странице" Exit Function + Case "table" + getSerbian = "стола" + Exit Function Case Else getSerbian = "No translation" End Select @@ -1075,6 +1087,9 @@ Function getBosnian(identifier As String) As String Case "inPageStyle" getBosnian = "stil stranice" Exit Function + Case "table" + getBosnian = "stola" + Exit Function Case Else getBosnian = "No translation" End Select diff --git a/Redaction/Validation.xba b/Redaction/Validation.xba index 30d75bb..a6e03d3 100644 --- a/Redaction/Validation.xba +++ b/Redaction/Validation.xba @@ -1,6 +1,6 @@ -Sub markval7 +Sub markval9 End Sub @@ -28,6 +28,7 @@ Sub validateButton Dim sectionsReport As String Dim outlinePageStylesReport As String Dim outlineInNotesReport As String + Dim oulineInTablesReport As String Dim badText As Boolean Dim badNumberings As Boolean Dim needExtendedInfo As Boolean @@ -40,9 +41,13 @@ Sub validateButton sectionsReport = checkSectionsInTables outlineInNotesReport = checkNotesOutline() outlinePageStylesReport = checkHeadingsInHeadersFooters + oulineInTablesReport = checkHeadingsInTextTables If outlineInNotesReport <> "" Then MsgBox outlineInNotesReport EndIf + If oulineInTablesReport <> "" Then + MsgBox oulineInTablesReport + EndIf If outlinePageStylesReport <> "" Then MsgBox outlinePageStylesReport EndIf @@ -68,7 +73,7 @@ Sub validateButton printNumberingSymbols(needExtendedInfo) - If badText OR badNumberings OR footnotesReport <> "" OR graphicsReport <> "" Or outlineInNotesReport <> "" Or sectionsReport <> "" OR outlinePageStylesReport <> "" Then + If badText OR badNumberings OR footnotesReport <> "" OR graphicsReport <> "" Or outlineInNotesReport <> "" Or sectionsReport <> "" OR oulineInTablesReport <> "" OR outlinePageStylesReport <> "" Then MsgBox getTranslation("validationWarning") If badText Then MsgBox getTranslation("validationBadSymbolsNotification") @@ -286,6 +291,85 @@ Function checkHeadingsInHeadersFooters As String checkHeadingsInHeadersFooters = result End Function +Function checkHeadingsInTextTables(oText As Object) As String + Dim enum1Element As Object + Dim enum1 As Object + Dim enum2 As Object + Dim thisPortion As Object + Dim footnoteText As Object + Dim label As String + Dim labelNum As Integer + Dim i As Integer + Dim count As Integer + Dim cell As Object + Dim cellText As Object + Dim firstCellName As String + Dim result As String + result = "" + enum1 = ThisComponent.Text.createEnumeration + While enum1.hasMoreElements + enum1Element = enum1.nextElement + If enum1Element.supportsService("com.sun.star.text.TextTable") Then + firstCellName = enum1Element.getCellByPosition(0,0).cellName + cellNames = enum1Element.cellNames + For i = LBound(cellNames) To Ubound(cellNames) + cell = enum1Element.getCellByName(cellNames(i)) + cellText = cell.getText() + If cellNames(i) = firstCellName Then + If isHeadingNotFirstInText(cellText) Then + result = result & getTranslation("foundHeadingIn") & " " & getTranslation("table") & " " & enum1Element.TableName & chr(10) + EndIf + Else + If isHeadingsInText(cellText) Then + result = result & getTranslation("foundHeadingIn") & " " & getTranslation("table") & " " & enum1Element.TableName & chr(10) + EndIf + EndIf + Next i + EndIf + Wend + checkHeadingsInTextTables = result +End Function + +Function isHeadingNotFirstInText(oText As Object) As Boolean + Dim enum1Element As Object + Dim enum1 As Object + Dim enum2 As Object + Dim thisPortion As Object + Dim footnoteText As Object + Dim label As String + Dim labelNum As Integer + Dim i As Integer + Dim count As Integer + Dim cell As Object + Dim cellText As Object + Dim first As Boolean + first = true + enum1 = oText.createEnumeration + While enum1.hasMoreElements + enum1Element = enum1.nextElement + If enum1Element.supportsService("com.sun.star.text.Paragraph") Then + If Not first Then + If enum1Element.OutlineLevel > 0 Then + isHeadingNotFirstInText = true + Exit Function + EndIf + EndIf + ElseIf enum1Element.supportsService("com.sun.star.text.TextTable") Then + cellNames = enum1Element.cellNames + For i = LBound(cellNames) To Ubound(cellNames) + cell = enum1Element.getCellByName(cellNames(i)) + cellText = cell.getText() + If isHeadingsInText(cellText) Then + isHeadingNotFirstInText = true + Exit Function + EndIf + Next i + EndIf + first = false + Wend + isHeadingNotFirstInText = false +End Function + Function isHeadingsInText(oText As Object) As Boolean Dim enum1Element As Object Dim enum1 As Object @@ -322,7 +406,6 @@ Function isHeadingsInText(oText As Object) As Boolean isHeadingsInText = false End Function - Private Sub printNumberingSymbols(needExtendedInfo) Dim families As Object Dim numStyles As Object diff --git a/build.gradle b/build.gradle index e16a9e1..b3fb503 100644 --- a/build.gradle +++ b/build.gradle @@ -1,4 +1,4 @@ -def releaseVersion = "0.8.4" +def releaseVersion = "0.8.5" task oxt(type: Zip) { dependsOn = [ 'setVersion','setVersionInBasicCode' ] from './' diff --git a/description.xml b/description.xml index 1601ebd..8be7fd4 100644 --- a/description.xml +++ b/description.xml @@ -1,7 +1,7 @@ - + Cleaning and validation documents for publishing in html and epub with pagination diff --git a/translations.ods b/translations.ods index 9adcef20adc73d436c536124ff2e3e28cb6600ec..5a3a20a9eb45f621c2a2f998ff91cb466398840c 100644 GIT binary patch delta 5411 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 X|9)`7fA(L`G|_u@%s5nt8{_`~1ZKA; delta 5279 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 RNf1aA;pD)KlWu!E`9DJ-nr{FA