Wenn Sie das LibreOffice Forum nutzen, dann spenden Sie bitte und helfen uns das Forum zu erhalten!
💚 Das LibreOffice Forum braucht Ihre Hilfe! 💚
DANKE >><< DANKE

Ihre Spende wird für die Deckung der laufenden Kosten der kommenden 12 Monate sowie den Ausbau 🌱 des LibreOffice Forums verwendet.
🌷 Stand: 85 Spenden. Bisher höchste Spende: 200 Euro!!! 53% fehlen uns noch bis zum Spendenziel 🌷
💚 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 💚
🤗 VIELEN DANK AN ALLE SPENDER - NUR DANK EUCH KÖNNEN WIR DAS FORUM ERHALTEN UND WEITERENTWICKELN 🤗

Frage: Text hinter Feldbefehl per Makro ändern

Alles zur Programmierung im LibreOffice.
Antworten
teertinker
Beiträge: 12
Registriert: Fr 26. Apr 2013, 13:32

Frage: Text hinter Feldbefehl per Makro ändern

Beitrag von teertinker » Do 7. Sep 2023, 12:29

Hallo,
ich habe vor einiger Zeit mit etwas Unterstützung durch das Forum ein kleines Makro geschrieben, das bestimmte Textbausteine nach einem Muster in Feldbefehle umwandelt
\cite{...}
Das klappt ganz prima. Nun möchte ich jedoch für für ein spezifisches Muster
\cite{_3_...}

den Text des Musters löschen und nur den Feldbefehl ('ReferenceMark') behalten.

Es ist m.E. nur ein kleiner Schritt, aber ich habe leider längere Zeit nicht mehr mit der Makrofunktion gearbeiten, so dass ich mir nicht selbst zu helfen weiß. Evtl. hat jemand einen Tipp für mich.

Meine Idee bisher ist in der Routine subCreate einzusetzen und einen leeren String einzufügen. Aber damit bekomme ich bisher leider nur den Feldbefehl modifiziert und nicht den Text im Dokument.

Code: Alles auswählen

REM  *****  BASIC  *****

private sSelection as string	'Selected text
private oDoc as object			'Points to the current document
private oRefMarks as object		'Document references

private b as integer
private dia As Object
private frm As Object

'************************* Replace JabRef reference field with cite key***************************
	'example  Jabref field-->\cite{_1_Mehringer965} 
Sub Main	


	BasicLibraries.LoadLibrary("JabRefConverterLib")
	DialogLibraries.LoadLibrary("JabRefConverterLib")
	frm = DialogLibraries.JabRefConverterLib.JabRefConvert
	dia = CreateUnoDialog(frm)
	dia.Execute()
End Sub


	
Sub FromTextToReference
Dim SearchDesc As Object
Dim Doc As Object
 dim j as integer ' counter for message box
  dim l as integer ' counter for message box 
   dim k as integer ' counter for message box 

Doc = ThisComponent

Dim SearchDescRegExp As Object  
SearchDescRegExp = Doc.createSearchDescriptor
SearchDescRegExp.SearchString = "\\cite\{[^\}]+\}"
SearchDescRegExp.SearchRegularExpression = True
Found = Doc.findFirst (SearchDescRegExp)


J=0
l=0
k=0


b=100

' b necessary for plain \cite{key} to prevent a mix up with existing jabref citations because jabref has an internal identifier for every instance of a citation
' eg. JR_cite_1_Simmel ...JR_cite0_1_Simmel  .... 
' by using b we start with JR_cite100_1_Simmel to prevent double usage. 


Do Until IsNull(Found)
	Controller = Doc.CurrentController
	VC = Controller.ViewCursor
	VC.gotoRange(Found,False)
    subEventReference(j,l,k)
    Found = Doc.findNext( Found.End, SearchDescRegExp)
Loop
If Not IsNull(dia) then
       dia.endExecute()
   End If
Msgbox ("Conversion to JabRef Reference successful " & chr(13) & + CStr(k) + " (in-text) citations "  & chr(13) & + CStr(j) + " empty citations " & chr(13) & + CStr(l) + " manually added \cite{keys} " & chr(13) &   chr(13) & " Now you can refresh the fields using Jabref. ", ,"OK")

End Sub



Sub FromReferenceToText
 dim temp as string


 Dim i As Integer, oRefmarks, oRefmarkNames()
 dim j as integer
  dim l as integer
 
  oRefmarks = ThisComponent.getReferenceMarks()
  oRefmarkNames = oRefmarks.getElementNames()


j=0
l=0 

'  insert a string at every reference mark
For i = 0 To Ubound( oRefmarkNames )
ref = oRefmarkNames(i)
If instr(ref, "JR_cite") Then
  temp=ref
   if left(temp,7)="JR_cite" then
       temp = mid(temp,8)
   end if

if instr(temp, "_3_")=0 Then
anchor = oRefmarks.getByName( ref).getanchor
rr= anchor.gettext.createtextcursorbyrange(anchor)
rr.string="\cite{" +temp + "}"
  J=j+1
else
' for empty citations.	
anchor = oRefmarks.getByName( ref).getanchor
rr= anchor.gettext.createtextcursorbyrange(anchor)
rr.string="\cite{" +temp + "}"
  l=l+1	
end if

End if
Next

'problem: empty citations don't get disposed.
	' solution: a) dispose all remaining jabref references. in a second loop
For i = 0 To Ubound( oRefmarkNames )
  ref = oRefmarkNames(i)
    If instr(ref(i), "JR_cite") Then
	On Error Resume Next 
 	oRefmarks.getByName( ref ).dispose()
	

End if
Next
If Not IsNull(dia) then
       dia.endExecute()
   End If
Msgbox ("Conversion to plain text code successful "  & chr(13) & + CStr(j) + " (in-text) citations "  & chr(13) & CStr(l) + " empty citations ", ,"OK")


End Sub 



'************************* Create a reference that JabRef can process ***************************
	'example \cite{_1_Mehringer965}-> to Jabref field
	'example \cite{Mehringer965}-> to JabRef field
Sub subEventReference(j,l,k as integer)
dim oRefField as object
 Dim i As Integer, oRefmarks, oRefmarkNames()

 
oDoc = ThisComponent
oRefMarks = oDoc.Referencemarks
oRefmarkNames = oRefmarks.getElementNames()


oRefField = oDoc.createInstance("com.sun.star.text.ReferenceMark")
oSel = oDoc.getCurrentSelection().getByIndex(0)
	if left(oSel.getString,6)="\cite{" then
		sSelection = "JR_cite"+mid(oSel.getString,7)
		sSelection = left (sSelection,len(sSelection)-1)
					' just count empty citations
					if InStr(oSel.getString, "_3_")<>0 then
					 j=j+1
					end if
					if InStr(oSel.getString, "_2_")<>0 or InStr(oSel.getString, "_1_") then
					 k=k+1
					end if


'	routine to handle plain \cite{key} -> ad an unique identifiy (a) 

	     if InStr(oSel.getString, "_1_")=0 and InStr(oSel.getString, "_2_")=0 and InStr(oSel.getString, "_3_")=0 then
	   	    sSelection = "JR_cite"+CStr(b)+"_1_"+mid(oSel.getString,7)
			sSelection = left (sSelection,len(sSelection)-1)

			' routine to prevent doubling of the same JR_cite[b]
				For i = 0 To Ubound( oRefmarkNames )
				If instr(oRefmarkNames(i),sSelection) Then
				
				 b=b+1
				 sSelection = "JR_cite"+CStr(b)+"_1_"+mid(oSel.getString,7)
				 sSelection = left (sSelection,len(sSelection)-1)
				End if
	    		Next
		
			l=l+1
	   
	   
	     end if


	end if
subCreate(oRefField,sSelection)

End sub

'********************* Create the field (sub routine) ***********************
Sub subCreate(oField as object, sText as string)
dim sRefname as string
oField.setName(sText, oRefField)
oDoc.currentController.ViewCursor.Text.insertTextContent(oDoc.currentController.ViewCursor, oField, True)
End sub


Benutzeravatar
karolus
Beiträge: 1979
Registriert: Fr 10. Dez 2010, 10:01

Re: Frage: Text hinter Feldbefehl per Makro ändern

Beitrag von karolus » Do 7. Sep 2023, 12:56

Hallo
Du hast die Aufgabenstellung einigermassen gut beschrieben, du hast auch einen grossen Haufen schwurbeligen Basic-Quelltext mitgeliefert. Leider befürchte ich daß hier nicht jeder :

Code: Alles auswählen

	BasicLibraries.LoadLibrary("JabRefConverterLib")
	DialogLibraries.LoadLibrary("JabRefConverterLib")
die beiden Libraries aus dem Hut zaubern kann!

Die werden wir hoffentlich nicht brauchen, aber ein auf das wesentliche reduzierte Writer-document mit dem man arbeiten könnte wäre recht nützlich, um DIR helfen zu KÖNNEN!
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.1.2 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)

teertinker
Beiträge: 12
Registriert: Fr 26. Apr 2013, 13:32

Re: Frage: Text hinter Feldbefehl per Makro ändern

Beitrag von teertinker » Do 7. Sep 2023, 18:22

Hallo Karolus,
der Quelltext ist mir in der Tat recht peinlich und eher das Ergebnis von Versuch/Irrtum, als vernünftiger Programmierung.
Die "Library" enthält ein kleines GUI Fenster um die Textsegmente in Feldbefehle umzuwandeln.
-> in einer Erweiterung verpackt findet sich die Library hier: https://github.com/teertinker/JabRef_Li ... _Converter

Die angehängten Bilddateien zeigen, was derzeit gemacht wird. Das Textdokument.odt(ich habe versucht dort den Code der Erweiterung zu importieren) enthält die angelegten Feldbefehle , die produziert werden und noch mit dem Text unterlegt sind, den ich gerne entfernen würde.

Nach zusätzlicher Prüfung kommt auch noch eine andere Alternative in Frage, die evtl. noch einfacher ist. Alle Feldbefehle mit \cite{...} unabhängig von der Nummer können als leeres Feld ausgegeben werden.
Dateianhänge
Textdokument.odt
(20.05 KiB) 10-mal heruntergeladen
Bildschirmfoto vom 2020-10-16 20-25-55.png
Bildschirmfoto vom 2020-10-16 20-25-55.png (54.68 KiB) 573 mal betrachtet
Bildschirmfoto vom 2020-10-16 20-31-34.png
Bildschirmfoto vom 2020-10-16 20-31-34.png (52.11 KiB) 573 mal betrachtet

teertinker
Beiträge: 12
Registriert: Fr 26. Apr 2013, 13:32

Re: Frage: Text hinter Feldbefehl per Makro ändern

Beitrag von teertinker » Sa 9. Sep 2023, 09:04

Ich habe das Problem selbst gelöst. Danke. Ich benötige keine Hilfe mehr.

Benutzeravatar
karolus
Beiträge: 1979
Registriert: Fr 10. Dez 2010, 10:01

Re: Frage: Text hinter Feldbefehl per Makro ändern

Beitrag von karolus » Sa 9. Sep 2023, 10:44

Hallo
Danke, ich hatte dran gearbeitet, aber keine offensichtliche Methode gefunden den Text zu ersetzen, OHNE daß die Referenz verschwindet, … das nächste was ich ausprobiert hätte wäre direkt auf der ( !während die Datei aus LO geschlossen ist!) enthaltenen »content.xml« die referenz-nodes zu suchen und zu manipulieren?

Es wäre nett wenn du uns mitteilst WIE du es gelöst hast!
LO7.4.7.2 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO7.6.1.2 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)

Antworten