Benutzer:Yomomo/ Inhaltsverzeichnisbearbeitungsprogramm
Zielsetzung
BearbeitenIch 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
BearbeitenREM ***** 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
BearbeitenMan 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
BearbeitenMarkiere 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
BearbeitenDanke 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.