epublishing/ePublishing/Footnotes.xba

310 lines
10 KiB
Text
Raw Normal View History

2020-03-13 16:36:45 +01:00
<?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="Footnotes" script:language="StarBasic" script:moduleType="normal">sub footMark8
2020-03-13 16:42:10 +01:00
End Sub
2020-03-13 16:40:24 +01:00
Sub openFootNotesDialog
2020-03-13 16:36:45 +01:00
Dim dialog As Object
DialogLibraries.LoadLibrary(&quot;ePublishing&quot;)
dialog = CreateUnoDialog(DialogLibraries.ePublishing.FootnotesConfig)
2020-05-05 14:01:41 +02:00
dialog.getControl(&quot;buttonOK&quot;).Label = getTranslation(&quot;buttonOk&quot;)
dialog.getControl(&quot;buttonCancel&quot;).Label = getTranslation(&quot;buttonCancel&quot;)
dialog.getControl(&quot;configText1&quot;).setText(getTranslation(&quot;configText1&quot;))
dialog.getControl(&quot;configText2&quot;).setText(getTranslation(&quot;configText2&quot;))
dialog.getControl(&quot;configText3&quot;).setText(getTranslation(&quot;configText3&quot;))
dialog.getControl(&quot;configText4&quot;).setText(getTranslation(&quot;configText4&quot;))
dialog.getControl(&quot;configText5&quot;).setText(getTranslation(&quot;configText5&quot;))
dialog.getControl(&quot;notesTypeLabel&quot;).setText(getTranslation(&quot;FootnotesConfigDialogNotesTypeLabel&quot;))
dialog.getControl(&quot;PerPageRangeLabel&quot;).setText(getTranslation(&quot;FootnotesConfigDialogNotesPerPageRangeLabel&quot;))
dialog.getControl(&quot;groupByPages&quot;).Model.Label = getTranslation(&quot;FootnotesConfigDialogNotesPerPage&quot;)
dialog.getControl(&quot;groupByHeadings&quot;).Model.Label = getTranslation(&quot;FootnotesConfigDialogNotesByHeadingsLabel&quot;)
2020-05-05 14:01:41 +02:00
dialog.Title = getTranslation(&quot;footnotesConfigDialogTitle&quot;)
Dim nCount As Integer
nCount = dialog.getControl(&quot;lb_notes_types&quot;).getItemCount()
dialog.getControl(&quot;lb_notes_types&quot;).addItem( getTranslation(&quot;FootnotesConfigDialogFootnotesName&quot;), nCount )
dialog.getControl(&quot;lb_notes_types&quot;).addItem( getTranslation(&quot;FootnotesConfigDialogEndnotesName&quot;), nCount + 1 )
dialog.getControl(&quot;lb_notes_types&quot;).selectItemPos( 0, True )
2020-05-05 14:01:41 +02:00
dialog.setVisible(true)
2020-03-13 16:36:45 +01:00
Select Case dialog.Execute()
Case 1
setFootnotesNumberingFrom(dialog)
Case 0
End Select
dialog.dispose()
End Sub
Sub setFootnotesNumberingFrom(dialog As Object)
2020-03-13 16:36:45 +01:00
Dim statusIndicator as Object
Dim targetLevel As Integer
Dim stringLevelInput As String
Dim stringPageRangeInput As String
Dim noteType As Integer
2020-03-13 16:36:45 +01:00
statusIndicator = ThisComponent.getCurrentController.statusIndicator
dialog.setVisible(false)
doNotTrack
stringLevelInput = dialog.getControl(&quot;level&quot;).getText
stringPageRangeInput = dialog.getControl(&quot;pageRange&quot;).getText
noteType = dialog.getControl(&quot;lb_notes_types&quot;).getSelectedItemPos()
If (stringLevelInput &lt;&gt; &quot;&quot;) Then
targetLevel = CInt(stringLevelInput)
If targetLevel &gt; -1 AND targetLevel &lt; 11 Then
statusIndicator.Start(getTranslation(&quot;statusNumberingInProcess&quot;),100)
setFootnotesNumberingLevel(targetLevel,noteType)
Else
MsgBox getTranslation(&quot;numberingInputOutOfRange&quot;)
EndIf
EndIf
2020-03-13 16:36:45 +01:00
If (stringPageRangeInput &lt;&gt; &quot;&quot;) Then
Dim pageNums() As Integer
getPageNumsFrom(stringPageRangeInput, pageNums())
2020-05-05 14:01:41 +02:00
statusIndicator.Start(getTranslation(&quot;statusNumberingInProcess&quot;),100)
setNotesPaginatedNumbering(noteType, pageNums())
2020-03-13 16:36:45 +01:00
EndIf
statusIndicator.end()
2021-05-20 14:17:50 +02:00
MsgBox getTranslation(&quot;statusNumberingFinished&quot;)
2020-03-13 16:36:45 +01:00
End Sub
Sub setNotesPaginatedNumbering(noteType As Integer, pageNums() As Integer)
2021-05-20 14:17:50 +02:00
Dim allNotes As Object
Dim statusIndicator as Object
2020-03-13 16:36:45 +01:00
Dim i As Integer
2021-05-20 14:17:50 +02:00
Dim curNote As Object
Dim curPage As String
Dim prevPage As String
2021-05-20 14:17:50 +02:00
Dim curNum As Integer
Dim notesToValidate() As Object
2020-03-13 16:36:45 +01:00
statusIndicator = ThisComponent.getCurrentController.statusIndicator
2020-05-05 14:01:41 +02:00
statusIndicator.Start(getTranslation(&quot;statusNumberingInProcess&quot;),30)
curNum = 1
2021-05-20 14:17:50 +02:00
prevPage = &quot;&quot;
If noteType = 0 Then
allNotes = thisComponent.FootNotes
Else
allNotes = thisComponent.EndNotes
EndIf
For i = 0 to allNotes.Count -1
curNote = allNotes.getByIndex(i)
curPage = getPageNumberVCurs(curNote.Anchor)
If ( IsInArray(pageNums, CInt(curPage) ) ) Then
If (curPage &lt;&gt; prevPage) Then
curNum = 1
prevPage = curPage
EndIf
2021-05-20 14:17:50 +02:00
label = curNote.getLabel
If label = &quot;&quot; Or IsNumeric(label) Then
curNote.setLabel(CStr(curNum))
addToArray(notesToValidate,curnote)
curNum = curNum + 1
EndIf
EndIf
Next i
&apos;Second pass in case layout has changed
For i = 0 To Ubound(notesToValidate)
curNote = notesToValidate(i)
curPage = getPageNumberVCurs(curNote.Anchor)
If (curPage &lt;&gt; prevPage) Then
curNum = 1
prevPage = curPage
EndIf
curNote.setLabel(CStr(curNum))
curNum = curNum + 1
Next i
statusIndicator.end()
2021-05-20 14:17:50 +02:00
End Sub
2020-03-13 16:36:45 +01:00
Sub setFootnotesNumberingLevel(level As Integer,noteType As Integer)
Dim enum1Element 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
Dim statusIndicator as Object
2021-05-20 14:17:50 +02:00
statusIndicator = ThisComponent.getCurrentController.statusIndicator
statusIndicator.Start(getTranslation(&quot;statusNumberingInProcess&quot;),30)
2020-03-13 16:36:45 +01:00
curNum = 1
enum1 = ThisComponent.Text.createEnumeration
While enum1.hasMoreElements
enum1Element = enum1.nextElement
If enum1Element.supportsService(&quot;com.sun.star.text.Paragraph&quot;) Then
2021-05-20 14:17:50 +02:00
traverseNoteParagraphs(curNum, enum1Element ,noteType, level)
2020-03-13 16:36:45 +01:00
ElseIf enum1Element.supportsService(&quot;com.sun.star.text.TextTable&quot;) 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(&quot;com.sun.star.text.Paragraph&quot;) Then
2021-05-20 14:17:50 +02:00
traverseNoteParagraphs(curNum, cellEnumElement ,noteType, level)
2020-03-13 16:36:45 +01:00
EndIf
Wend
Next i
EndIf
Wend
statusIndicator.end()
2020-03-13 16:40:24 +01:00
End Sub
2021-05-20 14:17:50 +02:00
Sub traverseNoteParagraphs(curNum As Integer, enum1Element As Object, noteType As Integer, level As Integer)
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, noteType) Then
footnoteText = thisPortion.Footnote
label = footnoteText.getLabel
If label = &quot;&quot; Then
If level &gt; 0 Then
footnoteText.setLabel(CStr(curNum))
curNum = curNum + 1
EndIf
Else
If IsNumeric(label) Then
If level &lt; 1 Then
footnoteText.setLabel(&quot;&quot;)
Else
footnoteText.setLabel(CStr(curNum))
curNum = curNum + 1
EndIf
EndIf
EndIf
EndIf
Wend
End Sub
Function isTargetNote(portion As Object, noteType As Integer) As Boolean
2021-05-20 14:17:50 +02:00
If ( portion.TextPortionType &lt;&gt; &quot;Footnote&quot; ) Then
isTargetNote = false
2021-05-20 14:17:50 +02:00
Exit Function
EndIf
If ( isEndNote(portion) = CBool(noteType) ) Then
isTargetNote = true
Exit Function
EndIf
2021-05-20 14:17:50 +02:00
isTargetNote = false
End Function
&apos;Sub testRange
&apos; Dim pageNums() As Integer
&apos; getPageNumsFrom(&quot;9-10,8-12,-111-099,99,102,105,187,187&quot;,pageNums())
&apos;End Sub
Sub getPageNumsFrom(inputString As String, pageNums() As Integer)
Dim ranges() As String
ranges = split(inputString,&quot;,&quot;)
For i = Lbound(ranges) To (Ubound(ranges))
processNumRange(ranges(i),pageNums())
Next i
End Sub
Function IsInArray(array As Variant, content As Variant) As Boolean
IsInArray = false
For i = LBound(array) To UBound(array)
inArr = array(i)
If inArr = content Then
IsInArray = true
2021-05-20 14:17:50 +02:00
Exit Function
EndIf
Next i
End Function
Sub processNumRange(range As String, pageNums() As Integer)
Dim rangeParts() As String
Dim firstValue As String
Dim secondValue As String
Dim firstNum As Integer
Dim secondNum As Integer
rangeParts = split( range, &quot;-&quot;)
2021-05-19 20:19:47 +02:00
If UBound(rangeParts) = 1 Then
firstValue = trim(rangeParts(0))
secondValue = trim(rangeParts(1))
2021-05-19 20:19:47 +02:00
If ( IsNumeric(firstValue) And IsNumeric(secondValue)) Then
firstNum = CInt(firstValue)
secondNum = CInt(secondValue)
If firstNum &lt;= secondNum Then
For i = firstNum To secondNum
If (NOT IsInArray(pageNums, i)) Then
addToArray(pageNums, i)
EndIf
Next i
EndIf
EndIf
EndIf
If UBound(rangeParts) = 0 Then
firstValue = trim(rangeParts(0))
2021-05-19 20:19:47 +02:00
If IsNumeric(firstValue) Then
firstNum = CInt(firstValue)
If (NOT IsInArray(pageNums, firstNum)) Then
addToArray(pageNums, firstNum)
EndIf
EndIf
EndIf
End Sub
Function isEndNote(portion As Object) As Boolean
If (IsEmpty(portion.Start.EndNote)) Then
isEndNote = false
Else
isEndNote = true
EndIf
End Function
2020-03-13 16:40:24 +01:00
Private Sub doNotTrack
2020-03-21 16:35:38 +01:00
Dim dispatcher As Object
Dim document As Object
2020-03-13 16:40:24 +01:00
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())
2020-03-13 16:36:45 +01:00
End Sub
Sub FixFootnotes()
Dim description As String
Dim allNotes As Object
Dim aNote As Object
Dim oViewCursor As Object
turnOffTracking
AcceptAllTrackedChanges
oViewCursor = ThisComponent.currentController.getViewCursor()
&apos;Globalscope.BasicLibraries.LoadLibrary( &quot;MRILib&quot; )
allNotes = ThisComponent.FootNotes
For x = 0 to allNotes.Count -1
aNote = allNotes.getByIndex(x)
anchor = aNote.anchor
oViewCursor.goToRange(anchor,false)
oViewCursor.collapseToStart()
oViewCursor.goToRange(anchor,true)
unoCut()
oViewCursor.goLeft(1,false)
unoPaste()
Next
End Sub
2020-03-13 17:48:46 +01:00
</script:module>