Zum Inhalt springen

Benutzer:Yomomo/ Inhaltsverzeichnisbearbeitungsprogramm

Aus Wikibooks

Zielsetzung

[Bearbeiten]

Ich wollte die Möglichkeit haben, eine Seite mit den ganzen Inhaltsverzeichnissen zu erzeugen, also nicht nur Kapitel und Unterkapitel (mit / verbunden), sondern auch Abschnitte (mit # verbunden). Das finde ich für die Buchprojekte, die ich angefangen habe, notwendig. Es wäre vielleicht schon besser, einen der Softwareentwickler von Wikipedia zu fragen, in solchen Sachen bin ich aber oft einfach dumm und egoistisch... Ich hab aber schon gesucht und das einzige ähnliches, dass ich gefunden habe, war in einem Logik-Buch auf Englisch. Es sah aber so aus, das man doch nicht direkt das Inhaltsverzeichnis einer Seite in einer anderen einbeziehen kann. Die Leute haben extra Seiten vorbereitet (siehe z.B. Predicate Logic). Das Inhaltsverzeichnis von jeder Seite "händisch" zu machen, wäre eine unglaubliche Menge in Arbeit. Ich wollte ein Programm dafür entwickeln.

Da ich kein Programmierer bin und nur mal so C++ und Java im Rahmen meines Studiums in Physik gelernt habe, waren meine Möglichkeiten begrenzt. Ich hab mich entschlossen, eine Macro in LibreOffice zu entwickeln, da die Programmiersprache da mir ähnlich zur C++ aussah und das für mich am einfachsten wäre. Das Programm ist sehr "empfindlich" und funktioniert nur unter bestimmten Voraussetzungen. Für mich ist aber das wichtigste: es funktioniert so, wie ich das brauche.

Ich hoffe, das es sich auch für andere hilfreich erweist.

Das Programm selber

[Bearbeiten]
REM  *****  BASIC  *****

Sub Main
MyWikiTocGR
End Sub



Sub MyWikiTocGR


	Dim oDoc As Object 'hier kommt der Text als Objekt zu bearbeitung
	Dim oVC As Object  'ViewCursor
	Dim oCC		   'wird nicht benutzt
	Dim s1 As String   'wird benutzt, um Teile einer Zeile zu schneiden
	Dim s2 As String   'ebenfalls
	Dim s3 As String   'erzeugt # und * für die Nummerierung in Wiki
	Dim oTC As Object  'TextCursor
	Dim Mark As Object 'merkt die Stelle des Cursors
	Dim wikiAdress As String  'wichtig! hier wird der neue Text gespeichert
	Dim capTitle As String  'Hier kommt der Titel der Seite
REM				'Er ist notwendig für die Links in Wikiform
	Dim secTitle As String  'hier kommen die jeweiligen Abschnittstiteln 
	Dim secTitleO		'wird nicht benutzt
	Dim i As Integer	'Iterationshilfe
	Dim j As Integer	'entscheidet ob # oder * addiert wird
	Dim k As Integer	'Iterationshilfe
	Dim m As Integer	'entscheidet ob # oder * addiert wird
	REM Dim secTitle As String   nicht benutzt
	i=0
	j=0
	k=2
	m=0
	s3="#"  'ein # wird sowieso am Anfang vom jeden Abschnitt addiert
    REM On Error goto EH
    capTitle = InputBox("gib den Titel an","gib den Titel an","gib den Titel an",1440 *2 , 1440 * 4 )
rem  hier wird ein InputBox erzeugt. Man nimmt mit CopyPaste den Titel der Seite. Den braucht man für die links
rem  Mit dem Box ist dann dieses Programm viel einfacher

    wikiAdress = CHR$(13)& "{| class= ""wikitable  mw collapsible"" " & CHR$(13) & "!" & CHR$(13) & "[["& capTitle &"|" & capTitle & "]]" & CHR$(13) & "|-"  & CHR$(13) & "|"& CHR$(13)
rem ich wollte, dass die Inhalte als Tabellen erscheinen; Geschmackssache

    oDoc = ThisComponent
rem Man nimmt das gerade geöffnete Dokument

    oVC = oDoc.CurrentController.getViewCursor 'und erzeugt einen ViewCursor

    Mark = oDoc.Text.CreateTextCursorByRange(oVC)'markiert die position des view cursor.

    oTC = oDoc.Text.CreateTextCursor 'der TextCursor kommt am Anfang des Textes

    REM oPC = oDoc.Text.CreateTextCursor 'nicht benutzt
    

REM Iteration um leere Paragraphen am Anfang zu ignorieren
    While oTC.isEndOfParagraph 
    oTC.gotoNextParagraph(false)
    Wend
    
    
    oVC.gotoRange(oTC,false) 'a text cursor can't go to the end of a line
    REM While oTC.gotoNextParagraph(False) hat nichts gebracht
    oVC.gotoEndOfLine(true)  'so we have to use the view cursor.
    
    secTitle = oVC.String 'nimmt den selected Text
    REM secTitleO=secTitle nicht gebraucht



REm IterationA: wählt jedes Mal den nächsten Kapitelabschnitt und 
Rem wandelt die Kapitelzahlen in # und * um

    Do While oVC.goDown(1,true)  'so lang oVC immer noch nach unten gehen kann
				'wird der Text bearbeitet
 	oVC.goUp(1,True)	'man muss aber doch am Anfang anfangen
  

rem kurze Iteration um leere Zeichen am Anfang des Abschnitttitels zu schneiden
    s1= " "			
    
    	While  s1 = " "  
        s2 = Left(secTitle,i+1)
        s1= Right(s2,1)
		i=i+1
    	Wend
    	secTitle=Right(secTitle,Len(secTitle)-i+1)
    	i=0
		REm secTitleO=secTitle


rem IterationB: bis wir keine Zahlen im Inhaltverzeichnis haben, also das Leerzeichen bearbeiten wir den Abschnittstitel
    	Do While  s1 <> " "  


    	REM If s1="1" OR s1="2" OR s1="3" OR s1="4" OR s1="5" OR s1="6" OR s1="7" OR s1="8" OR s1="9" OR s1="0"  Then 
 			REM secTitleO="#"&secTitle0  nicht benutzt
 			     

REM nächsten Buchstabe wählen
   			s2 = Left(secTitle,k)
        	s1=Right(s2,1)
        

Rem wenn er wieder eine Zahl ist, bitte den weiteren Buchstabe lesen
    		If s1="1" OR s1="2" OR s1="3" OR s1="4" OR s1="5" OR s1="6" OR s1="7" OR s1="8" OR s1="9" OR s1="0"  Then 
     			k=k+1
    			s2 = Left(secTitle,k)
        		s1=Right(s2,1)
        		m=1

rem für Debugging
        	rem	 print "A2"& s2 & "T" & secTitle &"K" & k & "S" & s1 &"M"&m &"S3" &s3 &"j"&j

rem  wenn ein Punkt zwischen den Zahlen vorkommt, dann haben wir einen Unterabschnitt
rem wir brauchen also # oder * (hab ich abwechselnd gemacht, Geschmackssache)
			elseIf s1= "." then
        		rem print "s2"& s2 & "T" & secTitle &"K" & k & "S" & s1 &"M"&m &"S3" &s3 &"j"&j
        		k=k+1
    			s2 = Left(secTitle,k)
        		s1=Right(s2,1)
        	 endif	
        		if m=0 then 
        			
        			if j=0 then
        			if s1=" " then 
        			k=k
        			else
        			s3= s3 &"*"
        			j=1
        			endif
        			elseif j=1 then
        			s3= s3 &"#"
        			j=0
        		rem	print "kk" & j
        		rem	endif 
        			endif
        		else 
        		m=0
     		REM	print "A2"& secTitle &"R" & s3  'für Debugging
				endif
			rem endif

   		
	 		
     	REm	print "W"&  secTitle &"Z" & s1 'für debugging
   		
 		
	   	Loop	'Ende IterationB	
    			secTitle =  Right(secTitle,Len(secTitle)-k) 'Zahlen aus dem Abschnittstitel schneiden
     		REm	print "T"& secTitle &"K" & k & "S" & s1  'für Debugging
   REM  	oDoc.Text.insertString(Mark,wikiAdress & "|}" & CHR$(13),false)  nicht benutzt


REM Reinitialisierung
       s1= " "
    	k=2

rem neues Link wird zugefügt
    wikiAdress =  wikiAdress & s3 & "[[" & capTitle & "#" & secTitle & "|" & secTitle & "]]" & CHR$(13)


    REM oDoc.Text.insertString(Mark,wikiAdress & CHR$(13) & "|}" & CHR$(13),false)
    REM print wikiAdress 'für Debugging

    oVC.goRight(1,false)  'go to next line
    oVC.gotoEndOfLine(true)  'go to the end of the next line and mark the line
    oTC.gotoNextParagraph(false)  'go to the beginning of the next line
    secTitle = oVC.String 'read the marked text

	rem print "H"&secTitle
	j=0  'reinitialize
	s3="#"  'reinitialize
 

REM	oVC.goUp(1,True) 'no good idea

rem end of iterationA
    Loop


rem the last title is still there, so we have to process it
    	While  s1 = " "  
        s2 = Left(secTitle,i+1)
        s1= Right(s2,1)
		i=i+1
    	Wend
    	
    	secTitle= Right(secTitle,Len(secTitle)-i-1)

rem  Close the adress text
    wikiAdress =  wikiAdress & s3 & "[[" & capTitle & "#" & secTitle & "|" & secTitle & "]]" & CHR$(13)
    REM Wend

rem export the adresstext in document
    oDoc.Text.insertString(Mark,wikiAdress & "|}" & CHR$(13),false)

    REM oDoc.Modified = false 'avoid Save being called if doc closed without further edits.
    REM EH: End 'end normal execution.
    'error handler.
    REM MsgBox "You may have illegal file name characters in the first line." & Chr(13)_
    REM & Chr(13) & filename,,"AN ERROR OCCURRED"
    End Sub

Wie man das Programm in Macros installiert

[Bearbeiten]

Man wählt von Menu in LibreOfficeWriter Tools → macros → organise macros → LibreOfficeBasic

Ein neues Fenster kommt vor.

Wähle "Organizer" (unten links) → neues Fenster

und dann Libraries (Oben). Wöhle hier new → Box um Name zu geben. Gib einen Name deine Wahl (z.B. MyWiki) und OK

Im Organizer Fenster goto Modules, klicke neu, gib einen Name (z.B. MyWikiTOC), klick OK, vom Unterfensterlinks wähle deine neue Module (MyWikiTOC) und klick EDIT!

Ein neues Fenster kommt vor. KopiePaste das Programm vom vorherigen Abschnitt hier und speichere es.

Fertig!

Wie man das Programm benutzt

[Bearbeiten]

Markiere mit Kopie das Inhaltsverzeichnis der Seite

Kopiere es in einem Textbearbeiter (z.B. gEdit)

Lasse den Titel "Inhaltsverzeichnis" aus. Der Text muss mit dem ersten Zahl anfangen. Öffne ein LibreOffice Dokument und kopiere da das Inhaltsverzeichnis (Anfang beim ersten Zahl).

Wähle Tools → Macros → run Macro

Wähle die Macro MyWikiTOC und führe sie aus.

Den erzeugten Text kopieren und in Wikiseite deiner Wahl einfügen!

Vorsicht! Es gibt vielen Bugs!

Danksagung

[Bearbeiten]

Danke an den Leuten, die mir mal C++, Java (und früher PASCAL) beigebracht haben.

Danke an Pitonyak für sein Buch über Macros

Danke an JohnV, sein Programm hab ich als Gerüst benutzt.