diff --git a/ePublishing/Endnotes.xba b/ePublishing/Endnotes.xba new file mode 100644 index 0000000..68bf1aa --- /dev/null +++ b/ePublishing/Endnotes.xba @@ -0,0 +1,293 @@ + + +Global Const endnoteFieldPrefix = "custom_endnote_" +Global Const endnoteInTextAnchorSuffix = "-text_anchor" +Global Const endnoteInBodyAnchorSuffix = "-body_anchor" + +Sub convertEndnotesExecution + Dim oSelections As Object + Dim oAnchor1 As Object + Dim oAnchor2 As Object + Dim oAnchor1Name As String + Dim oAnchor2Name As String + Dim foundEndNotes() As Object + Dim textSelection As Object + Dim nativeEndnotesCounter As Integer + Dim customEndnotesCounter As Integer + If IsNull(ThisComponent) Then + MsgBox getTranslation("something weird happened error text") + Exit Sub + End If + oSelections = ThisComponent.getCurrentSelection() + If IsNull(oSelections) Then + MsgBox getTranslation("something weird happened error text") + Exit Sub + End If + objectsCount = oSelections.getCount() + If objectsCount > 1 Then + MsgBox getTranslation("too much selections") + Exit Sub + End If + textSelection = oSelections.getByIndex(0) + foundEndNotes() = findEndNotesInSelection(textSelection) + nativeEndnotesCounter = UBound(foundEndNotes(0)) + customEndnotesCounter = UBound(foundEndNotes(1)) + If (nativeEndnotesCounter = -1 And customEndnotesCounter = -1 ) Then + MsgBox getTranslation("EndnotesNotFound") + Exit Sub + EndIf + If ( customEndnotesCounter = -1 ) Then + 'only native found window convert to custom? + 'Window Select paragraph for endnotes output or cancel + runEndnotesConversionDialog(foundEndNotes(0)) + Exit Sub + EndIf + If (nativeEndnotesCounter = -1 ) Then + 'only custom endnotes found. Window convert to native? + Exit Sub + EndIf + 'both custom and native endnotes found + 'convert to custom all or + 'convert to native + + +End Sub + +Sub runEndnotesConversionDialog(foundEndNotes As Variant) + Dim dialog As Object + waitingForDialog = true + dialog = notModalDialog("EndnotesConversion") + dialog.getControl("found").SetText(getTranslation("EndnotesNativeDialogFound") & CStr(UBound(foundEndNotes)+1)) + dialog.getControl("description").SetText(getTranslation("EndnotesNativeDialogDescriptionSelect")) + dialog.getControl("cancel").Label = getTranslation("buttonCancel") + dialog.getControl("start").Label = getTranslation("buttonOk") + dialog.setvisible(true) + Do While waitingForDialog + If dialog.getControl("cancel").model.state = 1 then + exit Do + EndIf + If dialog.getControl("start").model.state = 1 then + convertEndnotesToCustom(foundEndNotes) + exit Do + EndIf + wait (100) + Loop + dialog.dispose + +End Sub + +Sub convertEndnotesToCustom(foundEndNotes As Variant) + Dim oViewCursor As Object + Dim outputPosition As Object + Dim endnoteSigns() As String + Dim fieldPrefix As String + Dim i As Integer + oViewCursor = ThisComponent.CurrentController.getViewCursor() + oViewCursor.goToStartOfLine(false) + outputPosition = oViewCursor.Text.createTextCursorByRange(oViewCursor) + endnoteSigns = getEndnoteSigns(foundEndNotes) + fieldPrefix = createEndnoteFieldPrefix() + For i = LBound(foundEndNotes) To Ubound(foundEndNotes) + convertNativeEndnoteToCustom(endnoteSigns(i), foundEndNotes(i),outputPosition,fieldPrefix, i) + Next i +End Sub + +Function createEndnoteFieldPrefix As String + Dim names() As String + Dim i As Integer + Dim prefix As String + names = ThisComponent.getTextFieldMasters().getElementNames() + For i = 0 To 10000 + prefix = endnoteFieldPrefix & i & "_" + If NOT startsWithInArray(prefix, names) Then + createEndnoteFieldPrefix = prefix + Exit Function + EndIf + Next i + createEndnoteFieldPrefix = prefix +End Function + +Function startsWithInArray(prefix As String, names As Variant) As Boolean + Dim i As Long + For i = LBound(names) To Ubound(names) + If InStr(names(i), "com.sun.star.text.fieldmaster.User." & prefix) = 1 Then + startsWithInArray = true + Exit Function + EndIf + Next i + startsWithInArray = false +End Function + + +Sub convertNativeEndnoteToCustom(sign As String, nativeEndNoteTextRange As Object,outputPosition As Object, fieldPrefix As String, num As Integer) + 'Globalscope.BasicLibraries.LoadLibrary( "MRILib" ) + Dim oViewCursor As Object + Dim oTextCursor As Object + Dim endNote As Object + Dim anchorInBody As Object + Dim anchorInText As Object + Dim bodyAnchorName As String + Dim textAnchorName As String + endNote = nativeEndNoteTextRange.Footnote + oViewCursor = ThisComponent.CurrentController.getViewCursor() + oViewCursor.goToRange(nativeEndNoteTextRange.Footnote.Text.Start,false) + oViewCursor.goToRange(nativeEndNoteTextRange.Footnote.Text.End,true) + unoCut() + oViewCursor.goToRange(outputPosition,false) + getEndnotePara() + oViewCursor.ParaStyleName = "Endnote" + anchorInBody = createEndnoteSign(outputPosition, sign, fieldPrefix & num, true) + addEndnoteSpacer(fieldPrefix) + unoPaste() + outputPosition = oViewCursor.End + oViewCursor.goToRange(nativeEndNoteTextRange,false) + endNote.dispose() + anchorInText = createEndnoteSign(oViewCursor, sign, fieldPrefix & num, false) + bodyAnchorName = fieldPrefix & num & endnoteInBodyAnchorSuffix + textAnchorName = fieldPrefix & num & endnoteInTextAnchorSuffix + anchorInBody.goRight(1,true) + anchorInText.goRight(1,true) + createAnchor(anchorInBody, bodyAnchorName ) + createAnchor(anchorInText,textAnchorName ) + createLink(anchorInBody,anchorInBody.String, textAnchorName) + createLink(anchorInText,anchorInText.String, bodyAnchorName) + + +End Sub + +Sub getEndnotePara() + Dim oViewCursor As Object + Dim oTextCursor As Object + oViewCursor = ThisComponent.CurrentController.getViewCursor() + oTextCursor = oViewCursor.Text.createTextCursorByRange(oViewCursor.Start) + oTextCursor.gotoStartOfParagraph(false) + oTextCursor.gotoEndOfParagraph(true) + If Len(oTextCursor.String) > 0 Then + oViewCursor.Text.insertControlCharacter(oViewCursor.End,com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK,False) + EndIf +End Sub + +Function createEndnoteSign(cursor As Object,sign As String,fieldName As String, inBody As Boolean) As Object + Dim oField As Object 'Field to insert + Dim oFieldMaster As Object + Dim oTextCursor As Object + Dim oMasters As Object + oTextCursor = cursor.Text.createTextCursorByRange(cursor.Start) + If inBody Then + oTextCursor.CharStyleName = "Endnote Symbol" + Else + oTextCursor.CharStyleName = "Endnote anchor" + EndIf + oField = ThisComponent.createInstance("com.sun.star.text.textfield.User") + oMasters = ThisComponent.getTextFieldMasters() + If oMasters.hasByName("com.sun.star.text.FieldMaster.User" & "." & fieldName) Then + oFieldMaster = oMasters.getByName("com.sun.star.text.FieldMaster.User" & "." & fieldName) + oFieldMaster.Name = fieldName + oFieldMaster.Content = sign + Else + oFieldMaster = ThisComponent.createInstance("com.sun.star.text.FieldMaster.User") + oFieldMaster.Name = fieldName + oFieldMaster.Content = sign + EndIf + oField.attachTextFieldMaster(oFieldMaster) + oTextCursor.Text.insertTextContent(oTextCursor, oField, False) + oTextCursor.CharStyleName = "Standard" + oTextCursor.goLeft(1,false) + createEndnoteSign = oTextCursor +End Function + +Sub addEndnoteSpacer(fieldPrefix As String) + Dim oViewCursor As Object + oViewCursor = ThisComponent.CurrentController.getViewCursor() + insertUserField(oViewCursor,fieldPrefix & "spacer"," ") +End Sub + + + + +Function getEndnoteSigns(foundEndNotes As Variant) As Variant + Dim i As Integer + Dim signs() As String + For i = LBound(foundEndNotes) To Ubound(foundEndNotes) + AddToArray(signs, foundEndNotes(i).String) + Next i + getEndnoteSigns = signs +End Function + + + +Function notModalDialog(dialogName As String) As Variant + Dim windowProvider As Object + Dim containerWindow As Object + Dim handler As Object + Dim dialogUrl As String + Dim dialog As Object + containerWindow = ThisComponent.getCurrentController().getFrame().getContainerWindow() + dialogUrl = "vnd.sun.star.script:ePublishing." & dialogName & "?location=application" + windowProvider = CreateUnoService("com.sun.star.awt.ContainerWindowProvider") + dialog = windowProvider.createContainerWindow(dialogUrl, "", containerWindow, handler) + notModalDialog = dialog +End Function + + + +Function findEndNotesInSelection(textSelection) As Variant + Dim nativeEndNotes() As Object + Dim customEndNotes() As Object + Dim outerArray() As Object + findEndNotesInSelection = Array() + + Dim enum1Element As Object + Dim cellEnumElement As Object + Dim enum1 As Object + Dim enum2 As Object + Dim curNum As Integer + Dim i As Integer + Dim cell As Object + Dim cellEnum As Object + + enum1 = textSelection.createEnumeration + While enum1.hasMoreElements + enum1Element = enum1.nextElement + If enum1Element.supportsService("com.sun.star.text.Paragraph") Then + findEndNotesInParagraph(enum1Element, nativeEndNotes, customEndNotes) + ElseIf enum1Element.supportsService("com.sun.star.text.TextTable") Then + cellNames = enum1Element.cellNames + For i = LBound(cellNames) To Ubound(cellNames) + cell = enum1Element.getCellByName(cellNames(i)) + cellEnum = cell.getText().createEnumeration() + While cellEnum.hasMoreElements + cellEnumElement = cellEnum.nextElement + If cellEnumElement.supportsService("com.sun.star.text.Paragraph") Then + findEndNotesInParagraph(cellEnumElement, nativeEndNotes, customEndNotes) + EndIf + Wend + Next i + EndIf + Wend + + addToArray(outerArray, nativeEndNotes) + addToArray(outerArray, customEndNotes) + findEndNotesInSelection = outerArray +End Function + +Sub findEndNotesInParagraph(enum1Element As Object,nativeEndNotes As Variant, customEndNotes As Variant) + Dim textPortions As Object + Dim thisPortion As Object + Dim footnoteText As Object + Dim label As String + Dim labelNum As Long + If enum1Element.OutlineLevel = level Then + curNum = 1 + EndIf + textPortions = enum1Element.createEnumeration + While textPortions.hasMoreElements + thisPortion = textPortions.nextElement + If isTargetNote(thisPortion,1) Then + AddToArray(nativeEndNotes, thisPortion) +' ElseIf isCustomEndnote(thisPortion) +' AddToArray(customEndNotesd, thisPortion) + EndIf + Wend +End Sub + \ No newline at end of file diff --git a/ePublishing/EndnotesConversion.xdl b/ePublishing/EndnotesConversion.xdl new file mode 100644 index 0000000..4105650 --- /dev/null +++ b/ePublishing/EndnotesConversion.xdl @@ -0,0 +1,10 @@ + + + + + + + + + + \ No newline at end of file diff --git a/ePublishing/Translations.xba b/ePublishing/Translations.xba index 969b546..0f86bfa 100644 --- a/ePublishing/Translations.xba +++ b/ePublishing/Translations.xba @@ -271,6 +271,15 @@ Function getRussian(identifier As String) As String Case "FootnotesConfigDialogNotesPerPageRangeLabel" getRussian = "Введите диапазон страниц" Exit Function + Case "EndnotesNativeDialogFound" + getRussian = "Найдено концевых сносок: " + Exit Function + Case "EndnotesNativeDialogDescriptionSelect" + getRussian = "Для вывода концевых сносок установите курсор в нужном параграфе и нажмите кнопку Применить" + Exit Function + Case "EndnotesNotFound" + getRussian = "В текущем выделении концевых сносок не найдено. Выделите текст с концевыми сносками." + Exit Function Case Else getRussian = "Перевод не найден" End Select @@ -1526,4 +1535,4 @@ Function getBosnian(identifier As String) As String getBosnian = "No translation" End Select End Function - + \ No newline at end of file diff --git a/ePublishing/dialog.xlb b/ePublishing/dialog.xlb index 32cc790..a461644 100644 --- a/ePublishing/dialog.xlb +++ b/ePublishing/dialog.xlb @@ -4,4 +4,5 @@ + \ No newline at end of file diff --git a/ePublishing/script.xlb b/ePublishing/script.xlb index ea7d1b6..a64f1f6 100644 --- a/ePublishing/script.xlb +++ b/ePublishing/script.xlb @@ -11,4 +11,5 @@ + \ No newline at end of file diff --git a/translations.ods b/translations.ods index 05ada73..379967c 100644 Binary files a/translations.ods and b/translations.ods differ