Benutzer:Yomomo/ Wiki2OO Writer
Zielsetzung
BearbeitenEntwicklung eines Programms, das Wiki Quellcode in OpenOffice Writer übersetzt. Das bedeutet auch: Tabellen und Formeln in Wiki source werden als Tabellen und Formeln in Writer dargestellt (und NICHT als Bilder oder so). Das Programm ist noch am Anfang und ich bin dabei Erklärungen zu schreiben, die es hoffentlich anderen Entwicklern es ermöglichen werden, das Programm weiter zu entwickeln.
Was das Programm schon machen kann
Bearbeiten- Ein Buch aus einer Wiki-TOC_Seite erstellen
- Verschiedene Eigenschaften gleichzeitig erstellen, wie Hyperlinks (zu Wikipedia, Wikibooks und Internet), Fett, Italic, BigFond, Sub- und Superscript, Endnote und Footnote, in beliebiger Reihe.
- Bilder einbeziehen (Funktion noch nicht vollständig)
- Formel erstellen (auch komplizierte, mit Integralen)
- Tabellen erstellen (auch komplizierte, mit verbundenen Zellen) (noch nur mit {| am Anfang) (der Text der Zellen wird auch bearbeitet)
Was das Programm noch nicht machen kann
Bearbeiten- Kaffee, Wunder und viel anderes, wie z.B.:
- Schnell sein (ist sehr langsam, also inzwischen meditieren!)
- Fehlerbehandlung
- Dokumentation fehlt noch.
- ...
Grundsätzlich ist doch das Programm fertig (die notwendigen Algorithmen sind vorhanden), es braucht noch Arbeit um alle Fälle einzubeziehen...
Das Programm selber
BearbeitenREM ***** BASIC *****
Sub Main
createBookFromTOCSite
End Sub
'oText.insertControlCharacter(oViewCursor,_com.sun.star.text.ControlCharacter.LINE_BREAK, false)
'!!!! REMARK !!!!
'I created some procedures when I still was inexperienced, so some of them are rather
'primitiv, but they are functioning, so,because of the time needed, I left them like
'this. If you have fun with it, you are welcome to improve them
sub createBookFromTOCSite
dim tocDoc
dim tocVC
dim tocTC
'dim oodu
dim neon
dim mycunt
dim myctc
dim adressDoc
dim oCuad
dim titstring as string
dim savedir as string
dim titplus as integer
dim tits1 as integer
dim tits2 as integer
dim noArgs()
titplus=1
savedir = InputBox("give the path where your browser saves files","see your browser and adjust its tools","file:///home/georg/Λήψεις/",1440 *2 , 1440 * 4 )
tocDoc=thisComponent
tocVC = tocDoc.CurrentController.getViewCursor 'und erzeugt einen ViewCursor
tocTC = tocDoc.Text.CreateTextCursor 'der TextCursor kommtamAnfangdesTextes
tocTC.goToEnd(false)
tocTC.goToStart(false)
tocVC.gotoRange(tocTC,false) 'a text cursor can't go to the end of a line
If NOT tocVC.isAtStartOfLine() Then
tocVC.gotoStartOfLine(false)
EndIf
tocVC.gotoEndOfLine(true) 'so we have to use the view cursor.
titstring = tocVC.String 'nimmt den selected Text
neon = StarDesktop.LoadComponentFromUrl("private:factory/swriter", "_blank", 0, noArgs())
mycunt = neon.CurrentController.getViewCursor 'und erzeugt einen ViewCursor
myntc = neon.getText().createTextCursor()
neon.insertControlCharacter(mycunt,_com.sun.star.text.ControlCharacter.LINE_BREAK, false)
adressDoc = StarDesktop.LoadComponentFromUrl("private:factory/swriter", "_blank", 0, noArgs())
oCuad = adressDoc.CurrentController.getViewCursor 'und erzeugt einen ViewCursor
Do While tocVC.goDown(1,true) 'so lang oVC immer noch nach unten gehen kann
'wird der Text bearbeitet
tocVC.goUp(1,True) 'man muss aber doch am Anfang anfangen
'for documentation see the first part of this sub
If Left(titstring,2) ="==" Then
titstring=Left(titstring,Len(titstring)-2)
titstring=Right(titstring,Len(titstring)-2)
titplus=2
tits1=tits1+1
' titstring = tits1 & "." & titstring
tits2=0
mycunt.getText().insertString(mycunt,titstring,true)
mycunt.gotoStartOfLine(true)
mycunt.NumberingLevel = "Level 1"
mycunt.ParaStyleName = "Heading 1"
mycunt.gotoEndOfLine(false)
mycunt.getText().insertString(mycunt,chr$(13),false)
EndIf
If Left(titstring,1) ="*" Then
titstring=Right(titstring,Len(titstring)-1)
l=instr(titstring,"[[")
tit2=tit2+1
'code to change wiki hyperlink in hyperlink and chapter title
'https://de.wikibooks.org/w/index.php?title=
Do While inStr(titstring,"]]")=0
If inStr(titstring,"]]")<>0 Then
Exit Do
EndIf
skipLine(tocVC,tocTC)
titstring =titstring + tocVC.String 'read the marked text
Loop
k=inStr(titstring,"|")
u=inStr(titstring,"]]")
wikiAdress= "https://de.wikibooks.org/w/index.php?title=" & Mid(titstring,l+2,k-l-2)&"&action=raw"
oCuad.Text.insertString(oCuad,wikiadress,true)
oCuad.HyperLinkTarget = wikiAdress
oCuad.HyperLinkURL = wikiAdress
titstring= Mid(titstring, k+1,u-k-1)
' titstring = tit0 & "." & tit1 & "." & tit2 & "." & titstring
mycunt.getText().insertString(mycunt,titstring,true)
mycunt.gotoStartOfLine(true)
mycunt.NumberingLevel = "Level " & (titPlus)
mycunt.ParaStyleName = "Heading " & (titPlus)
mycunt.gotoEndOfLine(false)
mycunt.getText().insertString(mycunt,CHR$(13),false)
callChapterFromInternet(adressDoc,mycunt, savedir)
neon.insertControlCharacter(mycunt,_com.sun.star.text.ControlCharacter.LINE_BREAK, false)
oodu.dispose()
EndIf
skipLine(tocVC,tocTC)
titstring = tocVC.String 'read the marked text
DO While NOT instr(titstring,"==")=0
If not instr(titstring,"*")=0 then
exit do
endif
skipLine(tocVC,tocTC)
titstring = oVC.String 'read the marked text
tocVC.goDown(1,false) 'go to next line
tocVC.gotoEndOfLine(false) 'go to the end of the next line
Loop
Loop
'until hier the whole book is downloaded but with minimal processing
'we must go again to the beginning of the whole text and process it
mynTC.goToStart(false)
mycunt.goToStart(false)
do
Wiki2OpOffWr(mycunt, myntc, tits, titplus)
loop while myntc.gotonextparagraph(false)
oIndex = neon.createInstance("com.sun.star.text.ContentIndex")
oIndex.CreateFromOutline = True
myntc.gotoStart(False)
neon.getText().insertTextContent(myntc, oIndex, False)
oIndex.update()
dim embed as String
embed = InputBox("embed the images now?","y for yes or something else for no","y",1440 *2 , 1440 * 4 )
If embed="y" then
EmbedLinkedGraphics(neon)
endif
end Sub
sub callChapterFromInternet(Optional addoc,Optional rtc, Optional savedir as string)
dim document as object
dim dispatcher as object
dim n as Integer
dim m as Integer
dim i as Integer
document = addoc.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:OpenHyperlinkOnCursor", "", 0, Array())
i=0
m=0
'file1= "file:///home/georg/Λήψεις/index.php"
Do While Not FileExists(savedir &"index.php")
wait(100)
m=m+100
If m>10000 then
'MsgBox("waited too long for the Internet, link not found!", 0, "Error")
rtc.Text.insertString(rtc,"no link found: " & addoc.CurrentController.getViewCursor.Text.getString & CHR$(13),false)
exit sub
EndIf
Loop
wait(2000)
n = FreeFile()
Open savedir &"index.php" For Append Access Read Write As #n
seek(#n,1)
rtc.Text.insertString(rtc, s1 & CHR$(13),false)
Do
Line Input #n, s1
s2=s1
If Left(s1,1)="*" then
s1=s1 & "&&§"
endif
Do while left(s2,1)="#"
If EOF(#n) then
s1=s1 & "&&&"
exit do
endif
Line Input #n, s2
s1=s1 & "&&&" & s2
loop
rtc.Text.insertString(rtc, s1 & CHR$(13),false)
Loop until EOF(#n)
close #n
kill(savedir & "index.php")
End sub
'this is a simple replace procedure. At the beginning of the main sub (wiki2opoffwr)
'many of the characteristic characterfollows (eg [[ at the beginning or ]] at the end
'of a wiki hyperlink) are replaced through other symbols (eg <§wl) that make the
'programming easier. Some keywords will be deleted (replaced through ""), because I
'didnt find them so important(eg style in a table), but if you want to, you can also
'change the code and take tham under concern
Sub myReplace(oDescriptor, oDoc, mySearchStr, myReplaceStr)
With oDescriptor
.SearchString = mySearchStr
.ReplaceString = myReplaceStr
End With
oDoc.ReplaceAll(oDescriptor)
End Sub
sub selectParagraph(optional mycunt, optional myntc)
mynTC.goToStartofParagraph(false)
mycunt.gotoRange(mynTC,false)
mynTC.gotoendofparagraph(true)
mycunt.gotoRange(mynTC,true) 'a text cursor can't go to the end of a line
end Sub
'this procedure moves the cursors to the next line
'the view cursor can read lines but not paragraphs so it goes to the beginning of the next line
'the text cursor can read paragraphs, sentences and words, but not lines
'both cursors can move right and left but only the view cursor can move up and down
'If you write true, then text in the movement will be selected, if there was text already selected
'it will be selected too. so if you do something with the cursor like set string, the whole selected
'text will be replaced
Sub skipLine(Optional oVC,Optional oTC)
oVC.goRight(1,false) 'go to next line
If NOT oVC.isAtStartOfLine() Then
oVC.gotoStartOfLine(false)
EndIf
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
End Sub
sub gotostartofparagraph(Optional cvc, Optional ctc)
ctc.gotostartofparagraph(false)
cvc.gotoRange(cTC,false)
end sub
function getparagrstr(optional ctc )as string
ctc.gotostartofParagraph(false)
ctc.gotoendofparagraph(true)
if instr(ctc.string,"{|")>0 then
getparagrstr=ltrim(ctc.string)
else
getparagrstr=(ctc.string)
endif
end function
'this procedure creates the headings of each chapter. In wiki syntax, == === and so on will be used
'this is replaced through numbers, the text remains as it is. At the end of the main procedure is
'also a TOC (Table Of Contents) created, so, everything will be automatic. This means, if you want to
'add a chapter later in your book, you can do it (you have to choose the right parameter for the title)
'the level of the chapter depends on the number of =. so == is the first level. The chapter title (and
'number) is determined through the Hyperlink of the chapter and the order in all chapters
'this is something to do later....
'this procedure will be called in a loop, and every time it is called, the appropriate value will be changed
'eg tit1 for the value of the first level. so if you have in wiki source text a == for a second time,
'then the value of tit1 will change to 2 und the number of all subchapters will begin with 2...
Sub createTOC(Optional oCurs, tit0 As string, titl1 as Integer, titl2 as Integer, titl3 as Integer, titl4 as Integer, Optional titPlus as Integer)
dim tit1 As Integer
dim tit2 As Integer
dim tit3 As Integer
dim tit4 As Integer
dim sexForm as String
sexForm=oCurs.string
tit1=titl1 : tit2=titl2 : tit3=titl3 : tit4=titl4
'!!!!! Documentation is for all parts similar !!!!! This is the first part !!!
If Left(sexForm,5) ="=====" Then
sexForm=mid(sexForm,6,Len(sexForm)-10)
tit4=tit4+1
sexForm = tit0 & "." & tit1 & "." & tit2 & "." & tit3 & "." & tit4 & "." & sexForm 'four levels
oCurs.String=sexForm
oCurs.NumberingLevel = "Level " & (4+titPlus) 'attribute of the text, in order to include it in the TOC
oCurs.ParaStyleName = "Heading " & (4+titPlus) 'attribute of the text, so that it looks like heading
oCurs.goleft(1,false) : oCurs.goright(1,false)
EndIf
'for documentation see the first part of this sub
If Left(sexForm,4) ="====" Then
sexForm=mid(sexForm,5,Len(sexForm)-8)
tit3=tit3+1
sexForm = tit0 & "." & tit1 & "." & tit2 & "." & tit3 & "." & sexForm 'four levels
tit4=0
oCurs.String=sexForm
oCurs.NumberingLevel = "Level " & (3+titPlus)
oCurs.ParaStyleName = "Heading " & (3+titPlus)
oCurs.goleft(1,false) : oCurs.goright(1,false)
EndIf
'for documentation see the first part of this sub
If Left(sexForm,3) ="===" Then
sexForm=mid(sexForm,4,Len(sexForm)-6)
tit2=tit2+1
sexForm = tit0 & "." & tit1 & "." & tit2 & "." & sexForm
tit4=0
tit3=0
oCurs.String=sexForm
oCurs.NumberingLevel = "Level " & (2+titPlus)
oCurs.ParaStyleName = "Heading " & (2+titPlus)
oCurs.goleft(1,false) : oCurs.goright(1,false)
EndIf
'for documentation see the first part of this sub
If Left(sexForm,2) ="==" Then
sexForm=mid(sexForm,3,Len(sexForm)-4)
tit1=tit1+1
sexForm = tit0 & "." & tit1 & "." & sexForm
tit4=0
tit3=0
tit2=0
oCurs.String=sexForm
oCurs.NumberingLevel = "Level " & (1+titPlus)
oCurs.ParaStyleName = "Heading " & (1+titPlus)
oCurs.goleft(1,false) : oCurs.goright(1,false)
EndIf
sexForm=CHR$(13)'move one line down
titl1=tit1 : titl2=tit2 : titl3=tit3 : titl4=tit4
End Sub
'******* CREATETABLE *********
'this sub creates a table when you find {| in wiki source. Of course there are other tables in wiki
'this is TODO. This sub reads in the first part the number of lines(y) und columnes (x). Then we
'create a table with x col und y rows. the cursor goes (hopefully) then again to the beginning of
'the table and reads one line after the other (|- shows a new row, | or ! a new column, a new element
' in a row). so we know in which column and row we are and the content will be added to the right cell.
'A bug because of the wiki source code (sometimes you have an extra |- at the beginning or the end of the
'table) was solved with ignoring the first and deleting the last row (which didint contain anything) of
'the table. This sub is not gut for complex tables (eg with merged and splitted cells)
'for more complicated tables there is code needed, that reads the complex elements almost one after the
'other and then adds them to the table. this is TODO
'******* CREATETABLE *********
Sub createTable(Optional neon, Optional ovc,Optional otc)
Dim y as Integer 'counts rows
Dim x as Integer 'counts columns of the table
Dim m as Integer 'counts lines of the document and rows ofthe table, used as sign and iterates
Dim k as Integer 'counts lines of the document and col of the table, used as sign and iterates
Dim p as Integer 'counts lines of the document and col of the table, used as sign and iterates
Dim r as Integer 'counts lines of the document and col of the table, used as sign and iterates
Dim z as Integer 'iterates
Dim w as Integer 'iterates
Dim tabcou as Integer 'iterates
Dim title as String 'for the title of the text or as dummy
dim mTC 'text cursor to mark the position of the title
dim xTC 'text cursor to mark the position of the title
Dim oTable 'creates the table
Dim oInsertPoint 'gets the end of the element
Dim oCellNames 'reads the cells
dim oCursor 'a cell cursor
dim sexForm as String 'the section of the text of the source code
dim sexForm1 as String 'the section of the text of the source code
dim sexForm2 as String 'the section of the text of the source code
dim sexForm5 as String 'the section of the text of the source code
dim s2 as String 'the section of the text of the source code
dim oRows 'for the rows of the table
mTC = otc.text.CreateTextCursor
xTC = otc.Text.CreateTextCursor
otc.gotoendofparagraph(false)
xtc.gotorange(otc,false)
otc.gotostartofparagraph(false)
mtc.gotoRange(otc,false)
sexform=getparagrstr(otc)
'print sexform
sexForm1= ""
y=1
x=0
m=0
k=0
z=0
tabcou=0
dim lintc
lintc = otc.text.CreateTextCursor
lintc.gotorange(otc,false)
do
If Left(sexForm,2) ="|+" Then
lintc.gotonextparagraph(false)
sexform=getparagrstr(lintc)
Ltrim(sexform)
endif
If Left(sexForm,2) ="{|" Then
x=x+1
If x>1 then
do
lintc.gotonextparagraph(false)
sexform=getparagrstr(lintc)
Ltrim(sexform)
' print sexform
loop while Left(sexForm,2)<>"|}"
' x=x-1
endif
endif
If Left(sexForm,2) ="|}" Then x=x-1
If (Left(sexForm,1) ="|" or "!")and right(left(sexform,2),1)<>"-" then k=1
If Left(sexForm,2) ="|-" AND k>0 Then m=m+1
lintc.gotonextparagraph(false)
sexform=getparagrstr(lintc)
loop while x>0
sexform=getparagrstr(otc)
'print sexform & m
r=m+1
'print m
y=1
x=0
m=0
k=0
z=0
rem READ THE NUMBER OF LINES AND COLUMNS IN THE TABLE
Do 'read the lines of the source code until you find the end of the table |}
'sometimes there is a title in the table after the code |+. This part reads this title and places
'it BEFORE (this means OUTSIDE) the table.
If Left(sexForm,2)="|+" Then 'if you have the code for the beginning of the title
title=Right(sexForm, Len(sexForm)-2)
otc.gotonextparagraph(false)
sexform=getparagrstr(otc)
Do While Left(sexForm,1) <> "|" And Left(sexForm,1) <> "!" 'if its not a new row or column which starts with | Or !
title=title & sexform
otc.gotonextparagraph(false)
sexform=getparagrstr(otc)
Loop 'until you find the next column or line
' print "tit " & title
EndIf 'so you have the whole title unter the string title. This will be added before the table later
'all rows have the same number of columns so we need to count them only in the first line y=1
If y=1 Then
If (instr(sexForm,"||")<> 0 OR instr(sexForm,"!!")<> 0) then
x=x+1
sexform2=sexform
If instr(sexForm,"||")<> 0 then
Do While instr(sexform,"||")<>0
x=x+1
sexform=mid(sexform,instr(sexForm,"||")+2)
Loop
endif
sexform=sexform2
if instr(sexForm,"!!")<> 0 then
Do While instr(sexForm,"!!")<> 0
x=x+1
sexform=mid(sexform,instr(sexForm,"!!")+2)
Loop
endif
elseIf (Left(sexForm,1) = "|" OR Left(sexForm,1) = "!") AND (Right(Left(sexForm,2),1)<>"-" AND Right(Left(sexForm,2),1)<>"}" )Then '
x=x+1
EndIf
If instr(sexform,"colspan")<>0 then
x=x+(ASC(mid(sexform,instr(sexform,"colspan")+9,1))-ASC(0))-1
Endif
EndIf
If Left(sexForm,2) ="|}" then y=y+1
If Left(sexForm,2) ="|-" AND x>0 Then
y=y+1
ElseIf Left(sexForm,2) ="|-" AND x=0 Then
z=2 'in order to ignore a |- at the beginning of the table source code, which actually is no row
EndIf 'this z =2 will be then used by the creation of the table
otc.gotonextparagraph(false)
sexform=getparagrstr(otc)
'print sexform & y
Loop While y<2 'Left(sexForm,2) <>"|}" ' ( tabcou>0)' or
y=r
'so here we have read the number of rows and columns
k=0
m=0
Dim tbor
dim xWid
'create table to insert content
oTable = neon.createInstance( "com.sun.star.text.TextTable" )
oTable.initialize(y,x) 'y rows, x columns
oTable.BackColor=RGB(240,240,240)
xtc.gotorange(mtc,false)
If title<>"" then
mtc.getText().insertString(mtc , title & CHR$(13), false)
xtc.gotorange(mtc,false)
mtc.gotopreviousparagraph(false)
createtextelement(neon,mtc)
endif
xtc.text.insertTextContent(xtc , oTable, False)
otc.gotorange(xtc,false)
sexform=getparagrstr(otc)
sexForm1=""
'so now we find one cell after the other and insert its content
if left(sexform,2)="{|" then
otc.gotonextparagraph(false)
sexform=getparagrstr(otc)
endif
Do While Left(sexForm,2) <>"|}"
If Left(sexForm,2)="|}" Then
exit do
endif
If Left(sexForm,2) ="|-" Then 'if you have the code for a line
If z=0 Then
m=0
otc.gotonextparagraph(false)'dont do anything with sexform, its no cell content
sexform=getparagrstr(otc)
k=k+1 'GO TO NEXT line, k is counting lines
ElseIf z=2 Then
oVC.String=""
z=0 'ignore a |- at the beginning of the table, it s no row, contains only attributes i didnt need
EndIf
EndIf
'here we need the next column in a row, which means in a not complex table: we have the next cell
'So we read in the source code its content and add it in the table
'The text of the cell can include also attributes. We also deal with them here
'a column begins with | or ! if its not followd by the characters exclluded here
If (Left(sexForm,1) = "|" OR Left(sexForm,1) = "!") AND Right(Left(sexForm,2),1)<>"-" And Left(sexForm,2)<>"|+" Then
If m<x then
If Left(sexForm,2)="|}" Then 'at the end of the table leave the loop
Exit Do
EndIf
' print x & " xy " & y & " " & m & " mk " & k & " sex " & sexform
oCell=oTable.getCellByPosition(m, k)'open the m column k row cell,WARNING: it s the opposite from initialise table
oCelTC = oCell.Text.createTextCursor 'create a text cursor in the text of the cell
oCelTC.CharHeight=9 'determine the general fontsize of the text in the cells (i prefer it small)
if instr(sexform,"||")<>0 OR instr(sexform,"!!")<>0 then
If (instr(sexform,"||")> instr(sexform,"!!") And instr(sexform, "!!")<>0) Or instr(sexform,"||")=0 then
sexform2=sexform
sexform = left(sexform2, instr(sexform2,"!!")-1)
sexform2 = right(sexform2,len(sexform2)- instr(sexform2,"!!"))
else
sexform2=sexform
sexform = left(sexform2, instr(sexform2,"||")-1)
sexform2 = right(sexform2,len(sexform2)- instr(sexform2,"||"))
endif
otc.string= sexform2
If Len(sexform2)<>0 then
otc.gotopreviousparagraph(false)
endif
endif
sexform2=""
'here we deal with the attributes, like class style etc In the most cases i ignore them. Of course
'in all cases we dont need their text, so i remove it
IF inStr(sexForm,"style=" )<>0 or inStr(sexForm,"class=" )<>0 or inStr(sexForm,"align=" )<>0 or instr(sexform, "colspan")<>0 or instr(sexform, "rowspan")<>0 then
sexform2=mid(sexform,2,instr(mid(sexform,2),"|"))
sexform=left(sexform,1) & mid(sexform,len(sexform2)+2)
endif
'I leave everything about style out...
' IF inStr(sexForm2,"style=" & CHR$(34) )<>0 then
'but if you want to, you can do something here!
' endIf
'I ignore also the class attribute
' IF inStr(sexForm,"class=" & CHR$(34) )<>0 then
'but if you want to, you can do something here!
' EndIf
'But I dont ignore alignment. Later i should add code about left and right alignment: TODO
If inStr(sexForm2,"align" )<>0 then
If inStr(sexForm2,"center")<>0 Then oCelTC.ParaAdjust = com.sun.star.style.ParagraphAdjust.CENTER
If inStr(sexForm2,"right")<>0 Then oCelTC.ParaAdjust = com.sun.star.style.ParagraphAdjust.RIGHT
If inStr(sexForm2,"left")<>0 Then oCelTC.ParaAdjust = com.sun.star.style.ParagraphAdjust.LEFT
EndIF
'this is a special style for languages, i ignore it too
Do while inStr(sexForm,"{{lang|" )<>0
oVC.String=""
sexform1=right(sexForm,Len(sexForm)-inStr(sexform,"{{lang|")-8 )
w=inStr(sexform1,"|")
sexForm=Left(sexForm, inStr(sexform,"{{lang|")-2)& mid(sexform1,w+1)
w=inStr(sexForm,"}}")
sexform1 = mid(sexForm,w+2)
sexForm=Left(sexForm,w-1)
sexForm = sexForm & " " & sexform1
Loop 'I do in this case loop, because this {{lang can show up more than one times in one cell
'I dont ignore the Bold attribute, which is declared through ! instead of | at the beginning of the source code
If Left(sexForm,1) = "!" Then
oCelTC.CharWeight = com.sun.star.awt.FontWeight.BOLD
else
oCelTC.CharWeight = com.sun.star.awt.FontWeight.NORMAL
EndIf
'the width can also be arranged here
if inStr(sexForm2,"width:" )<>0 then
dim celpro
celpro=otable.TableColumnSeparators
Dim colo(ubound(celpro())) As Integer
dim bc as integer
dim ac as integer
dim it as integer
dim sexform9 as string
if instr(sexform2, "colspan")<>0 then
bc=cint(mid(sexform2,instr(sexform2,"colspan")+9,2))-1
endif
it=m
do
If it>0 then
colo(it)=celpro(it-1).position+cint(mid(sexform2,inStr(sexForm2,"width:" )+6,2))*100
else 'position is giving us the percentage pro 10000 of the distance from the left side
colo(it)=cint(mid(sexform2,inStr(sexForm2,"width:" )+6,2))*100
endif 'if you move a line more right than the next line, it will not be done
ac=it 'so I created an iterating subroutine (movesep) to move the next lines
movesep(celpro,colo(ac),ac,x-2)'if this is neseccary
if it<x-1 then celpro(it).position=colo(it)
it=it+1
loop while it<m+bc
otable.TableColumnSeparators=celpro
it=0
endif
'Here we actually add the read and cleaned up text of the cell to the cell itsself
'for this we use the sub createtabletextelement, you can find it later
If Len(sexform)>0 then
sexForm=Right(sexForm,Len(sexForm)-1)'remove the | or ! character at the beginning
endif
if instr(sexform2, "colspan")<>0 then
sexform=mid(sexform2,instr(sexform2, "colspan"),11) & sexform
'print sexform
endif
if instr(sexform2, "rowspan")<>0 then
sexform=mid(sexform2,instr(sexform2, "rowspan"),11) & sexform
endif
sexform2=""
oceltc.string=sexform
oceltc.gotostart(false)
Do
sexform=getparagrstr(oceltc)
if instr(sexform,"file:")<>0 then createGraph(neon,oVC,oceltc)
createTextElement(neon,oceltc)
Loop while oceltc.gotonextparagraph(false)
Do
otc.gotonextparagraph(false)
sexform=getparagrstr(otc) : LTrim(sexform)
If left(sexform,1)="*" or left(sexform,1)="#" then
oCelTC.CharHeight=7
oceltc.text.insertstring(oceltc,sexform ,false)
createtextobject(sexform,neon,ovc,oceltc)
else
otc.gotopreviousparagraph(false)
exit do
endif
loop while left(sexform,1)="*" or left(sexform,1)="#"
Do
otc.gotonextparagraph(false)
sexform=getparagrstr(otc)
If left(sexform,2)="{|" then
do
oceltc.text.insertstring(oceltc,sexform & CHR$(13) ,false)
otc.gotonextparagraph(false) : sexform=getparagrstr(otc)
loop while left(sexform,2)<>"|}"
oceltc.text.insertstring(oceltc,sexform ,false)
oceltc.gotostart(false)
sexform=getparagrstr(oceltc)
createtextobject(sexform,neon,ovc,oceltc)
else
otc.gotopreviousparagraph(false)
exit do
endif
loop while left(sexform,2)<>"|}"
'if the last row has no content (bug) remove it:Here we read what is in the last row
If sexForm<>"|}" Then
If k=y-1 then
sexForm5=sexForm5 & sexForm
EndIf
EndIf
EndIf
m=m+1 'GO TO NEXT COLUMN AND CELL
EndIf
otc.gotonextparagraph(false)
sexform=getparagrstr(otc)
If Left(sexForm,2)="|}" Then
exit do
endif
Loop
'If the last line doesnt contain anything (bug) then remove it
If sexForm5="" Then
oRows=oTable.getRows()
oRows.removeByIndex(k,1)
EndIF
dim tabc
k=0
do
oCellNames = oTable.getCellNames()
if k>UBound(oCellNames()) then
exit do
endif
tabc = oTable.createCursorByCellName(oCellNames(k))
ocell=oTable.getcellbyname(oCellNames(k))
sexform2=ocell.string
oCelTC = oCell.Text.createTextCursor 'create a text cursor in the text of the cell
if instr(sexform2, "colspan")<>0 and instr(sexform2, "rowspan")=0 then
w=ASC(mid(sexform2,instr(sexform2,"colspan")+9,1))-ASC(0)-1
oceltc.gotostartofparagraph(false) : oceltc.goright(instr(sexform2, "colspan")-1,false)
oceltc.goright(11,true) : oceltc.string="" : oceltc.gotostartofparagraph(false)
IF tabc.goright(w,true) then
tabc.mergeRange()
endif
endif
if instr(sexform2, "colspan")=0 and instr(sexform2, "rowspan")<>0 then
w=ASC(mid(sexform2,instr(sexform2,"rowspan")+9,1))-ASC(0)-1
oceltc.gotostartofparagraph(false) : oceltc.goright(instr(sexform2, "rowspan")-1,false)
oceltc.goright(11,true) : oceltc.string="" : oceltc.gotostartofparagraph(false)
IF tabc.godown(w,true) then
tabc.mergeRange()
endif
endif
if instr(sexform2, "colspan")<>0 and instr(sexform2, "rowspan")<>0 then
w=ASC(mid(sexform2,instr(sexform2,"colspan")+9,1))-ASC(0)-1
m=ASC(mid(sexform2,instr(sexform2,"rowspan")+9,1))-ASC(0)-1
oceltc.gotostartofparagraph(false) : oceltc.goright(instr(sexform2, "rowspan")-1,false)
oceltc.goright(11,true) : oceltc.string="" : oceltc.gotostartofparagraph(false) : oceltc.gotoendofparagraph(true)
sexform2=oceltc.string : oceltc.gotostartofparagraph(false) : oceltc.goright(instr(sexform2, "colspan")-1,false)
oceltc.goright(11,true) : oceltc.string="" : oceltc.gotostartofparagraph(false)
IF tabc.goright(w,true) And tabc.godown(m,true) then
tabc.mergeRange()
endif
endif
k=k+1
loop while k<UBound(oCellNames())+1
tbor = oTable.TableBorder
xWid = tbor.LeftLine : xWid.OuterLineWidth = 15 : xWid.InnerLineWidth = 15 : xWid.LineDistance=60 : tbor.LeftLine = xWid
xWid = tbor.RightLine : xWid.OuterLineWidth = 15 : xWid.InnerLineWidth = 15 : xWid.LineDistance=60 : tbor.RightLine = xWid
xWid = tbor.TopLine : xWid.OuterLineWidth = 15 : xWid.InnerLineWidth = 15 : xWid.LineDistance=60 : tbor.TopLine = xWid
xWid = tbor.BottomLine : xWid.OuterLineWidth = 15 : xWid.InnerLineWidth = 15 : xWid.LineDistance=60 : tbor.BottomLine = xWid
oTable.TableBorder=tbor
'Delete the text for the table:
otc.gotonextparagraph(false)
otc.gotorange(xtc,true)'select the text
otc.string=""'delete it
otc.gotorange(xtc,false)'move the cursor right after the table
otc.gotostartofparagraph(false) : otc.gotoendofparagraph(true)
End Sub
sub movesep(optional celpro , optional colon as integer, optional j as integer, optional k as integer)
dim h,t as integer
if j<k then
h=j
if celpro(j).position<colon then
j=j+1 : t=t+1
movesep(celpro,colon,j,k)
celpro(h).position=colon+26*t
endif
endif
end sub
'this is to insert media from Wiki.
'The picture is adjusted to the document with a steady width and the respective height.
'the loading of the graph doesnt work in OO 3.1 but the right URL is created
sub createGraph(Optional neon, Optional evc,Optional etc)
Dim oInsertPoint 'Where the graph will be inserted in the auxiliary doc
Dim oInsertPoin 'Where the table will be inserted in the target doc
Dim oGraph 'the graphic object
dim sexForm3 as String
dim sexForm4 as String
dim sexForm5 as String
dim sexForm8 as String
sexForm3=getparagrstr(etc)
etc.string="" 'delete the text
Do While inStr(sexForm3, "file:")<>0 'see if there is a media file in the string
If inStr(sexForm3, "file:")=0 Then
etc.string=sexform3
createtextelement(neon,etc)
exit Do
EndIf
If inStr(sexForm3, "[!")<>0 then 'by gallery there is no [! and there is only one file per paragraph
sexForm4= Left(sexForm3,inStr(sexForm3, "[!")-1)'get the part of the string before the title of the graph
endif
sexForm3=Mid(sexForm3,inStr(sexForm3, "file:")+5)'the name of the Wikimedia file (yet not the URL)
etc.text.insertstring(etc,sexform4,false)'if there is text before the name of the graph, insert it
'now find the mediawiki URL of the graph. We need MD5 crypto code to create the full wikimedia name
Dim strFullPathName as String
Dim objDecrypt
dim texthash
objDecrypt = CreateUnoService("org.openoffice.Cryptographic.CryptographicService")
sexForm8=Ltrim(rtrim(Left(sexForm3,inStr(sexForm3, "|")-1))) 'take the title of the graph
'the following is necessary to create the right md5 signature
Do While inStr(sexForm8," ")<>0 'in case there is gap instead of _ in the name, replace it with _
sexForm8=left(sexForm8,inStr(sexForm8," ")-1) & "_" & mid(sexForm8,inStr(sexForm8," ")+1)
Loop 'this is necessary to create the right md5 signature
TextHash = objDecrypt.GetTextHash(sexForm8 , "MD5") 'hier is created the full wikimedia URL of the file
' sexform5="http://www.massachusetts-prenuptial-agreements.com/wp-content/uploads/2011/05/Sunset-1.jpg"
sexForm5="https://upload.wikimedia.org/wikipedia/commons/" & Left(TextHash,1) & "/" & Left(TextHash,2) & "/" & sexForm8
sexForm4= ltrim(Mid(sexForm3,inStr(sexForm3, "|")+1,inStr(sexForm3, "]]")-inStr(sexForm3, "|")-1 ))'get the caption of the graph
if instr(sexform4,"!?&")<>0 then
sexForm4= Mid(sexForm4,inStr(sexForm4, "!?&")+3)'remove upright if there
sexForm4= Mid(sexForm4,inStr(sexForm4, "|")+1)'remove upright if there
endif
sexForm3= Mid(sexForm3,inStr(sexForm3, "]]")+2 )'get the rest of the string (if any) after the name of the graph
'so, up to here: sexform5 is the URL, sexform4 the caption, sexform3 the rest (if any) of the string
oframe = neon.createInstance("com.sun.star.text.TextFrame")'crate a frame for the picture
oframe.width=7200 'with a suitable width for two columns
oframe.height=4200
dim frm
dim frmtc
frm=oframe.gettext() 'in order to create a text cursor in the frame
oGraph = neon.createInstance("com.sun.star.text.GraphicObject")'create a graph object
oGraph.GraphicURL = sexForm5 'give the right URL
oGraph.width=7000 'with a suitable width for two columns
oGraph.height=4000
oGraph.AnchorType = com.sun.star.text.TextContentAnchorType.AS_CHARACTER
oframe.AnchorType = com.sun.star.text.TextContentAnchorType.AS_CHARACTER
etc.getText().insertTextContent(etc , oframe, false)'insert the frame in the text
'etc.Text.insertstring(etc, CHR$(13),false)
frmtc=frm.createTextCursor()'this is the frame text cursor, but you must first insert the frame!
'etc.HyperLinkTarget = sexForm5
'etc.HyperLinkURL = sexForm5
frmtc.gotostart(false)
frmtc.getText().insertTextContent(frmtc , oGraph, true)
If len(sexform4)=0 then 'if there is no caption
sexform4="Link" 'make a caption with the word link
endif 'we need it just in case the graph will not be downloaded
frmtc.text.insertstring(frmtc, sexform4,true)'the mediawiki URL is added here,in case the image is
frmtc.HyperLinkTarget = sexForm5 'not downloaded (then you can call it manually and insert it)
frmtc.HyperLinkURL = sexForm5
etc.goleft(1,false)
If len(sexform3)>0 then 'if there is more text, work with it
etc.gotoendofparagraph(false)
endif
Loop
createtextelement(neon,etc)
'etc.gotoendofparagraph(false)
'etc.Text.insertstring(etc, CHR$(13),false)
End Sub
sub embedlinkedGraphics(Optional neon)
dim oDP
dim s1 as String
dim s2 as string
s1 = "com.sun.star.drawing.GraphicObjectShape"
s2 = "com.sun.star.text.TextGraphicObject"
oDP = neon.getDrawPage()
For i=0 To oDP.getCount()-1
oGraph = oDP.getByIndex(i)
If oGraph.supportsService(s1) OR oGraph.supportsService(s2) Then
If InStr(oGraph.GraphicURL, "vnd.sun") = 0 Then
If oGraph.supportsService(s1) Then
REM Convert a GraphicObjectShape.
oAnchor = oGraph.getAnchor()
oText = oAnchor.getText()
oGraph_2 = neon.createInstance("com.sun.star.graphic.GraphicObject")
oGraph_2.GraphicObjectFillBitmap = oGraph.GraphicObjectFillBitmap
oGraph_2.Size = oGraph.Size
oGraph_2.Position = oGraph.Position
oText.insertTextContent(oAnchor, oGraph_2, False)
oText.removeTextContent(oGraph)
EmbedLinkedGraphic = True
ElseIf oGraph.supportsService(s2) Then
REM Convert a TextGraphicObject.
Dim oBitmaps
Dim sNewURL$
Dim sName$
sName$ = oGraph.LinkDisplayName
oBitmaps = neon.createInstance( "com.sun.star.drawing.BitmapTable" )
oBitmaps.insertByName( sName, oGraph.GraphicURL )
sNewURL$ = oBitmaps.getByName( sName )
oGraph.GraphicURL = sNewURL
EndIf
End If
End If
Next
end sub
sub createNumbering(optional neon, Optional cvc,Optional ctc)
dim onumrules
dim sexform
dim sexform1
oNumRules = neon.createInstance("com.sun.star.text.NumberingRules") 'create numbering rules
' print "number"
sexform=getparagrstr(ctc)
ctc.string=""
do While instr(sexForm,"&&&")<>0
sexForm1=mid(sexForm,instr(sexForm,"&&&"))
sexForm1=right(sexForm1,Len(sexForm1)-3)
sexForm=left(sexForm,instr(sexForm,"&&&")-1)
ctc.NumberingRules = oNumRules
if Left(sexform,5)="#####" then
ctc.NumberingLevel=4
sexform=right(sexForm,Len(sexform)-5)
elseif Left(sexform,4)="####" then
ctc.NumberingLevel=3
sexform=right(sexForm,Len(sexform)-4)
elseif Left(sexform,3)="###" then
ctc.NumberingLevel=2
sexform=right(sexForm,Len(sexform)-3)
elseif Left(sexform,2)="##" then
ctc.NumberingLevel=1
sexform=right(sexForm,Len(sexform)-2)
else
ctc.NumberingLevel=0
sexform=right(sexForm,Len(sexform)-1)
endif
ctc.text.insertString(ctc,right(sexForm,len(sexform)),false)
createTextElement( neon, cTC)
ctc.gotoendofparagraph(false)
ctc.text.insertString(ctc, CHR$(13),false)
sexForm=sexform1
If Len(sexForm1)<4 then
sexForm=""
exit do
endif
Loop
ctc.gotostartofparagraph(false)
ctc.gotoendofparagraph(true)
ctc.NumberingRules = NONE
ctc.gotoendofparagraph(false)
end sub
sub createBullets(Optional neon, Optional cvc,Optional ctc)
dim onumrules
oNumRules = neon.createInstance("com.sun.star.text.NumberingRules") 'create numbering rules
' print "bullet"
sexform=getparagrstr(ctc)
ctc.string=""
Do While Left(sexForm,1)= " " 'remove empty spaces left ....
sexForm=Right(sexForm,Len(sexForm)-1)
Loop
oRule1 = oNumRules.getByIndex(0)
oRule2 = oNumRules.getByIndex(1)
oRule3 = oNumRules.getByIndex(2)
oRule4 = oNumRules.getByIndex(3)
oRule5 = oNumRules.getByIndex(4)
for i = 0 to UBOUND(oRule1)
if oRule1(i).Name = "NumberingType" Then
oRule1(i).Value = com.sun.star.style.NumberingType.CHAR_SPECIAL
End If
if oRule2(i).Name = "NumberingType" Then
oRule2(i).Value = com.sun.star.style.NumberingType.CHAR_SPECIAL
End If
if oRule3(i).Name = "NumberingType" Then
oRule3(i).Value = com.sun.star.style.NumberingType.CHAR_SPECIAL
End If
if oRule4(i).Name = "NumberingType" Then
oRule4(i).Value = com.sun.star.style.NumberingType.CHAR_SPECIAL
End If
if oRule5(i).Name = "NumberingType" Then
oRule5(i).Value = com.sun.star.style.NumberingType.CHAR_SPECIAL
End If
next i
oNumRules.replaceByIndex(0, oRule1)
oNumRules.replaceByIndex(1, oRule2)
oNumRules.replaceByIndex(2, oRule3)
sexForm=Left(sexForm,Len(sexform)-3)
'print sexform
ctc.NumberingRules = oNumRules
if Left(sexform,5)="*****" then
ctc.NumberingLevel=2
sexform=right(sexForm,Len(sexform)-5)
elseif Left(sexform,4)="****" then
ctc.NumberingLevel=2
sexform=right(sexForm,Len(sexform)-4)
elseif Left(sexform,3)="***" then
ctc.NumberingLevel=2
sexform=right(sexForm,Len(sexform)-3)
elseif Left(sexform,2)="**" then
ctc.NumberingLevel=1
sexform=right(sexForm,Len(sexform)-2)
elseif Left(sexform,1)="*" then
ctc.NumberingLevel=0
sexform=right(sexForm,Len(sexform)-1)
endif
ctc.TExt.insertString(ctc,sexform,true)
if instr(sexform,"File:")<>0 then creategraph(neon,cvc,ctc)
createTextElement( neon, cTC)
' createtextobject(getparagrstr(ctc),neon,cvc,ctc)
ctc.gotostartofparagraph(false)
ctc.gotoendofparagraph(false)
ctc.TExt.insertString(ctc,CHR$(13),false)
ctc.gotostartofparagraph(false)
ctc.gotoendofparagraph(true)
ctc.NumberingRules = NONE
ctc.gotoendofparagraph(false)
sexform=""
end sub
'the following subroutine is editing strings. It s finding out if there is a mathematical formula or
'a reference, a subscript, a fontsize etc. Because this method is using a loop reading "<" in the string
'all relative code should begin with "<". This is why in the beginning of the main routine all relavent
'code is changed if needed (with myreplace), for example [[w: is changed to <§wl, which should mean hyperlinkwikipedia.
'I have created another subroutine for tables or other fields, because the treatment is not the same
'I use endnotes for references. Footnotes are not used yet, but I suppose there will be something for them too!
Sub createTextElement(Optional neon,Optional ctC)'Optional cVC,
dim i as Integer
dim j as Integer
dim k as Integer
dim sexForm0 as String
dim sexForm1 as String
dim sexForm2 as String
dim vInsertPoin
dim sform() as string
dim cvc
dim ntc
REM FIND WHERE A SPECIFIC EXPRESSION STARTS (MATH OR SUPER AND SUBSCRIPT OR HYPERLINK ect.)
sexform=getparagrstr(ctc)
Do While InStr(sexForm, "<§") <>0
REM SPOT AND TRANSLATE A FOOTNOTE REFERENCE IN OPEN OFFICE FORM
If InStr(sexForm, "<§fn")<>0 Then
createFootnote(ctc)
EndIf
REM SPOT AND TRANSLATE A ENDNOTE REFERENCE IN OPEN OFFICE FORM
If InStr(sexForm, "<§rf")<>0 Then
createEndnote(neon,ctc)
EndIf
REM SPOT AND TRANSLATE THE WIKIPEDIA HYPERLINK IN OPEN OFFICE FORM
If InStr(sexForm, "<§wl")<>0 Then
createWikipediaHyperlink(ctc)
EndIf
REM SPOT AND TRANSLATE THE WIKIBOOKS HYPERLINK IN OPEN OFFICE FORM
If InStr(sexForm, "<§wb")<>0 Then
createWikibookHyperlink(ctc)
EndIf
REM SPOT AND TRANSLATE GENERAN INTERNET HYPERLINK IN OPEN OFFICE FORM
If InStr(sexForm, "<§nl")<>0 Then
createInternetLink(ctc)
EndIf
REM SPOT AND FORM THE WIKI BIG CHARACTERS
If InStr(sexForm, "<§bf")<>0 Then
createBigFont(ctc)
EndIf
REM SPOT AND FORM THE WIKI BIG CHARACTERS
If InStr(sexForm, "<§bl")<>0 Then
createBold(ctc)
EndIf
REM SPOT AND FORM THE WIKI BIG CHARACTERS
If InStr(sexForm, "<§it")<>0 Then
createItalic(ctc)
EndIf
REM SPOT AND TRANSLATE THE SUBSCRIPT IN OPEN OFFICE FORM
If InStr(sexForm, "<§sb")<>0 Then
createSubscript(ctc)
EndIf
REM SPOT AND TRANSLATE THE SUPERSCRIPT IN OPEN OFFICE FORM
If InStr(sexForm, "<§sp")<>0 Then
createSuperscript(ctc)
EndIf
'IN MANY CASES THE LOOP DOESNT WORK RIGHT, SO I PUT AN END TO IT!:
i=i+1
If i>42 Then
' vComp.Text.insertString(vInsertPoint, "!!! IF YOU SEE THIS MESSAGE, THEN YOU PROBABLY HAVE AN UNEXPECTED ELEMENT THAT BEGINS WITH < IN STRING: " & sexForm & " !!!",false)
' vComp.Text.insertString(vInsertPoint, " SEE THE INSTRUCTIONS, MAYBE YOU CAN ELIMINATE THIS BUG YOURSELF!",false)
' vInsertPoint = vComp.Text.getEnd()
Exit Do
EndIf
If befor=3 then
Exit Do
EndIf
sexform=getparagrstr(ctc)
Loop
k=0
Do While InStr(sexForm, "<§mt") <>0
REM SPOT AND TRANSLATE THE FORMULA IN OPEN OFFICE FORM
sexForm0=cutFormula(cTC,k)
k=k+1
oObj = neon.CreateInstance("com.sun.star.text.TextEmbeddedObject")'CREATE IN THE TARGET DOC A FORMULA OBJECT
oObj.CLSID = "078B7ABA-54FC-457F-8551-6147e776a997"
oObj.AnchorType = com.sun.star.text.TextContentAnchorType.AS_CHARACTER'ANCHOR THE FORMULA AS A CHARACTER, YOU CAN FIND IT INSIDE A SENTENCE!
cvc=neon.CurrentController.getViewCursor
ntc=neon.Text.createtextcursor()
ntc.gotorange(cvc,false)
cvc.gotorange(ctc,false)
cvc.Text.insertTextContent(cvc , oObj, False)'AND THEN THE FORMULA BOX
Dim tbor
If Len(sexform)<(len(sexform0)+15) then 'if the formula is not part of a paragraph, then put it in a box
tbor = oObj.LeftBorder : tbor.OuterLineWidth = 40 : oObj.LeftBorder=tbor
tbor = oObj.RightBorder : tbor.OuterLineWidth = 40 : oObj.RightBorder=tbor
tbor = oObj.TopBorder : tbor.OuterLineWidth = 40 : oObj.TopBorder=tbor
tbor = oObj.BottomBorder : tbor.OuterLineWidth = 40 : oObj.BottomBorder=tbor
Endif
oObj.EmbeddedObject.Component.Formula = createFormula(sexForm0)
sexform=getparagrstr(ctc)
cvc.gotorange(ntc,false)
Loop
End Sub
'this sub creates an Endnote
Sub createEndnote(Optional neon, Optional etc)' Optional evc,
Dim endnot 'endnote object
Dim sexForm0 As String 'auxiliary string
Dim sexForm4 As String 'auxiliary string
Dim sexForm5 As String 'auxiliary string
Dim l As Integer 'used to mark the end position of the reference
Dim f As Integer
Dim k As Integer
Dim u As Integer
Dim ftC 'cursor controller of the endnote
endnot=neon.createInstance("com.sun.star.text.Endnote")'create the endnote object
sexform0=getparagrstr(etc)
f=instr(sexForm0,"<§rf")
etc.gotostartofparagraph(false)
etc.goright(f-1,false)
neon.Text.insertTextContent(etc, endnot, false)
ftC=endnot.getText().createTextCursor
ftC.gotoEnd(false)
l= instr(mid(sexform0,f+4),">")
sexForm4=mid(sexform0,f+4,l)
k=inStr(sexForm0, "</ref")
sexForm5=mid(sexForm0,f+l+4, k-f-l-4) 'the reference
ftC.getText().insertString(ftC , sexForm5, true)
createTExtElement(endnot,ftc)
If inStr(sexForm4, "name=" & CHR$(34)) Then
sexForm4=(Mid(sexForm4, inStr(sexForm4,"name=" & CHR$(34))+6,inStr(Mid(sexForm4, inStr(sexForm4,"name=" & CHR$(34))+7),CHR$(34))))
EndIf
etc.goright(k-f+6,true)
etc.string=""
etc.goleft(1,false) : etc.goright(1,false)
etc.getText().insertString(etc,"(" & sexForm4 & ")",true)
etc.CharPosture=com.sun.star.awt.FontSlant.ITALIC
etc.CharEscapement=25
etc.CharEscapementHeight=65
etc.goright(Len(sexForm4)+2,false)
etc.goleft(1,false) : etc.goright(1,false)
etc.CharPosture=com.sun.star.awt.FontSlant.NONE
etc.CharEscapement=0
etc.CharEscapementHeight=100
End Sub
Sub createFootnote(Optional neon,Optional etc)' Optional evc,
Dim footnot 'endnote object
Dim sexForm0 As String 'auxiliary string
Dim sexForm4 As String 'auxiliary string
Dim sexForm5 As String 'auxiliary string
Dim l As Integer 'used to mark the end position of the reference
Dim f As Integer
Dim k As Integer
Dim u As Integer
Dim ftC 'cursor controller of the endnote
footnot=neon.createInstance("com.sun.star.text.Footnote")'create the endnote object
sexform0=getparagrstr(etc)
f=instr(sexForm0,"<§rf")
etc.gotostartofparagraph(false)
etc.goright(f-1,false)
neon.Text.insertTextContent(etc, footnot, false)
ftC=footnot.getText().createTextCursor
ftC.gotoEnd(false)
l= instr(mid(sexform0,f+4),">")
sexForm4=mid(sexform0,f+4,l)
k=inStr(sexForm0, "</ref")
sexForm5=mid(sexForm0,f+l+4, k-f-l-4) 'the reference
ftC.getText().insertString(ftC , sexForm5, true)
createTExtElement(footnot,ftc)
If inStr(sexForm4, "name=" & CHR$(34)) Then
sexForm4=(Mid(sexForm4, inStr(sexForm4,"name=" & CHR$(34))+6,inStr(Mid(sexForm4, inStr(sexForm4,"name=" & CHR$(34))+7),CHR$(34))))
EndIf
etc.goright(k-f+6,true)
etc.string=""
etc.goleft(1,false) : kvc.goright(1,false)
etc.getText().insertString(etc,"(" & sexForm4 & ")",true)
etc.CharPosture=com.sun.star.awt.FontSlant.ITALIC
etc.CharEscapement=25
etc.CharEscapementHeight=65
etc.goright(Len(sexForm4)+2,false)
etc.goleft(1,false) : etc.goright(1,false)
etc.CharPosture=com.sun.star.awt.FontSlant.NONE
etc.CharEscapement=0
etc.CharEscapementHeight=100
End Sub
Sub createWikipediaHyperlink(Optional etc)' Optional evc,
Dim wikiAdress As String
Dim sexForm0 As String
Dim sexForm1 As String
Dim l As Integer
Dim k As Integer
Dim u As Integer
k=0
l=0
u=0
sexform0=getparagrstr(etc)
l= InStr(sexForm0, "<§wl")
sexform1=mid(sexForm0,l+4)
k=inStr(sexform1,"|")-1
u=inStr(sexform1,"]]")
wikiAdress= "https://de.wikipedia.org/wiki/" & Left(sexForm1,k)
etC.goToStartofParagraph(false)
etC.goright(l-1,false)
etC.goright(k+5,true)
etC.String= ""
etC.goright(u-k-2,true)
etC.HyperLinkTarget = wikiAdress
etC.HyperLinkURL = wikiAdress
etC.goleft(1,false) : etC.goright(1,false)
etC.goright(2,true)
etC.String= ""
etC.goleft(1,false) : etC.goright(1,false)
End Sub
Sub createWikibookHyperlink(Optional etc)'Optional evc,
'print "wiki"
Dim wikiAdress As String
Dim sexForm0 As String
Dim sexForm1 As String
Dim l As Integer
Dim k As Integer
Dim u As Integer
k=0
l=0
u=0
sexform0=getparagrstr(etc)
l= InStr(sexForm0, "<§wb")
sexform1=mid(sexForm0,l+4)
k=inStr(sexform1,"|")-1
u=inStr(sexform1,"]]")
wikiAdress= "https://de.wikibooks.org/wiki/" & Left(sexForm1,k)
etC.goToStartofParagraph(false)
' evc.gotorange(etc,false)
etC.goright(l-1,false)
etC.goright(k+5,true)
' Print evc.string
etC.String= ""
etC.goright(u-k-2,true)
etC.HyperLinkTarget = wikiAdress
etC.HyperLinkURL = wikiAdress
etC.goleft(1,false) : etC.goright(1,false)
etC.goright(2,true)
etC.String= ""
etC.goleft(1,false) : etC.goright(1,false)
End Sub
Sub createInternetlink(Optional etc)'Optional evc,
Dim wikiAdress As String
Dim sexForm0 As String
Dim sexForm1 As String
Dim l As Integer
Dim k As Integer
Dim u As Integer
k=0
l=0
u=0
sexform0=getparagrstr(etc)
l= InStr(sexForm0, "<§nl")
sexform1=mid(sexForm0,l+4)
If instr(sexform1,"|")=0 then
k=inStr(sexform1," ")
else
k=inStr(sexform1,"|")
endif
u=inStr(sexform1,"]")
wikiAdress= Left(sexForm1,k-1)
etC.goToStartofParagraph(false)
etc.goright(l-1,false)
etc.goright(k+4,true)
etc.String= ""
etc.goright(u-k-1,true)
etc.HyperLinkTarget = wikiAdress
etc.HyperLinkURL = wikiAdress
etc.goleft(1,false) : etc.goright(1,false)
etc.goright(1,true)
etc.String= ""
End Sub
Sub createBigFont(Optional etc)'Optional evc,
Dim sexForm0 As String
Dim l As Integer
Dim k As Integer
k=0
l=0
sexform0=getparagrstr(etc)
k=inStr(sexForm0,"<§bf>")
l= InStr(mid(sexForm0,inStr(sexForm0,"<§bf>")+5),"§&")
etC.goToStartofParagraph(false)
etc.goright(k-1,false)
etc.goright(5,true)
etc.String= ""
etc.goright(l-1,true)
k=etc.CharHeight
etc.CharHeight =15
etc.goleft(1,false) : etc.goright(1,false)
etc.goright(2,true)
etc.String= ""
etc.CharHeight =k
etc.goleft(1,false) : etc.goright(1,false)
End Sub
Sub createBold(Optional etc)'Optional evc,
Dim wikiAdress As String
Dim sexForm0 As String
Dim l As Integer
Dim k As Integer
k=0
l=0
sexform0=getparagrstr(etc)
k=inStr(sexForm0,"<§bl>")
l= InStr(mid(sexForm0,inStr(sexForm0,"<§bl>")+5),"<§bl>")
etC.goToStartofParagraph(false)
etc.goright(k-1,false)
etc.goright(5,true)
etc.String= ""
etc.goright(l-1,true)
etc.CharWeight = com.sun.star.awt.FontWeight.BOLD
etc.goright(1,false)
etc.goleft(1,false)
etc.goright(5,true)
etc.String= ""
etc.CharWeight = com.sun.star.awt.FontWeight.NORMAL
etc.goright(0,false)
End Sub
Sub createItalic(Optional etc)'Optional evc,
Dim sexForm0 As String
Dim l As Integer
Dim k As Integer
k=0
l=0
sexform0=getparagrstr(etc)
k=inStr(sexForm0,"<§it>")
l= InStr(mid(sexForm0,inStr(sexForm0,"<§it>")+5),"<§it>")
etC.goToStartofParagraph(false)
etc.goright(k-1,false)
etc.goright(5,true)
etc.String= ""
etc.goright(l-1,true)
etc.CharPosture=com.sun.star.awt.FontSlant.ITALIC
etc.goleft(1,false) : etc.goright(1,false)
etc.goright(5,true)
etc.String= ""
etc.CharPosture=com.sun.star.awt.FontSlant.NONE
etc.goright(0,false)
End Sub
Sub createSubscript (Optional etc)'Optional evc,
Dim sexForm0 As String
Dim l As Integer
Dim k As Integer
k=0
l=0
sexform0=getparagrstr(etc)
k=inStr(sexForm0,"<§sb>")
l= InStr(mid(sexForm0,inStr(sexForm0,"<§sb>")+5),"§!")
etC.goToStartofParagraph(false)
etc.goright(k-1,false)
etc.goright(5,true)
etc.String= ""
etc.goright(l-1,true)
etc.CharEscapement =-17
etc.CharEscapementHeight =76
etc.goleft(1,false) : etc.goright(1,false)
etc.goright(2,true)
etc.String= ""
etc.CharEscapement =0
etc.CharEscapementHeight =100
etc.goright(0,false)
End Sub
Sub createSuperscript(Optional etc)'Optional evc,
Dim sexForm0 As String
Dim l As Integer
Dim k As Integer
k=0
l=0
sexform0=getparagrstr(etc)
k=inStr(sexForm0,"<§sp>")
l= InStr(mid(sexForm0,inStr(sexForm0,"<§sp>")+5),"§!")
etC.goToStartofParagraph(false)
etc.goright(k-1,false)
etc.goright(5,true)
etc.String= ""
etc.goright(l-1,true)
etc.CharEscapement =17
etc.CharEscapementHeight =76
etc.goleft(1,false) : etc.goright(1,false)
etc.goright(2,true)
etc.String= ""
etc.CharEscapement =0
etc.CharEscapementHeight =100
etc.goright(0,false)
End Sub
function cutFormula(Optional etc, optional k as integer) as String
dim sexForm0 as String
dim s1 as String
dim i as Integer
dim j as Integer
sexForm0=getparagrstr(etc)
j=instr(sexform0,"<§mt")
sexForm0=Right(sexForm0,Len(sexForm0)-j-5) 'linken <§mth> Teil weg
i=inStr(sexForm0,"</math>")
etc.gotostartofparagraph(false)
etc.goright(j-1+k,false)
etc.goright(i+12,true)
etc.string=""
etc.goleft(0,false)
sexForm0=Left(sexForm0,i-1) 'rechten </math> Teil weg
cutformula=sexform0
End function
Function createFormula(Optional sexForm7 as String) as STring
Dim sexForm as String
Dim s1 as String
Dim i as Integer
i=0
sexForm=sexForm7
'print sexform
do While instr(sexform, "sqrt[")
s1=mid(sexform, instr(sexform,"sqrt")+5)
sexform= left(sexform, instr(sexform,"sqrt")-1) & "nroot" & "{" & Left(s1,instr(s1,"]")-1) & "}" & mid(s1,instr(s1,"]")+1)
loop
While instr(sexform,"\")
i= instr(sexform,"\")
s1=Right(Left(sexForm,i+3),4)
rem FIND AND CREATE MATRIX
If s1="\bmx" Then
myMatrix(sexForm,i)
REM FIND AND CREATE UNDERBRACE (WORKS ALSO FOR UNDERBRACE IN UNDERBRACE)
ElseIf s1="\und" Then
myUnderbrace(sexForm, i)
REM FIND AND CREATE OVERBRACE (WORKS ALSO FOR OVERBRACE IN OVERBRACE)
ElseIf s1="\ove" Then
myOverbrace(sexForm, i)
REM FIND AND CREATE FRACTION
ElseIf s1="\fra" Then
sexform=myFraction(sexForm,i)
REM FIND AND CREATE LIMITS FOR INTEGRALS SUMS AND SO ON
ElseIf s1="\lim" or s1="\nol" Then
sexform=myLimits(sexForm,i)
REM FIND AND CREATE NROOT already made at the beginning of this subroutine!!!!
' ElseIf s1="\sqr" Then
' print sexform
' sexform=myRoots(sexForm,i)
' print sexform
Else
sexform=Left(sexform,i-1) & "WARNING: " & s1 & " has not been taken into consider!" & right(sexform,Len(sexform)-i-4)
EndIf
Wend
createFormula=sexForm
End function
sub myMatrix(sexForm as String, i as Integer)
Dim sexForm3 as String
Dim sexForm4 as String
Dim s2 as String
dim k as Integer
k=0
sexForm3= Left(sexForm,i) & "matrix{"
sexForm= sexForm3 & Right(sexForm,Len(sexForm)-i-4)
While k < Len(sexForm)
s2 = Left(sexForm,i+k+2)
If Right(s2,1)="&" Then
sexForm3=Left(sexForm,i+k)
sexForm=sexForm3 & " # " & Right(sexForm, Len(sexForm)-k-i-2)
EndIf
If Right(s2,2)="\\" Then
sexForm3=Left(sexForm,i+k)
sexForm=sexForm3 & " ## " & Right(sexForm, Len(sexForm)-k-i-2)
EndIf
If Right(s2,4)="}emx" Then
sexForm4=Left(sexForm,i+k-1)
sexForm=sexForm4 & Right(sexForm, Len(sexForm)-k-i-2)
k=Len(sexForm)+1
EndIf
k=k+1
Wend
k=0
End Sub
REM FIND AND CREATE UNDERBRACE (WORKS ALSO FOR UNDERBRACE IN UNDERBRACE)
Sub myUnderbrace(Optional sexForm as String, Optional i as Integer)
Dim sexForm3 as String
Dim sexForm4 as String
Dim s1 as String
Dim s2 as String
Dim k as Integer
Dim m as Integer
k=i+4
Do While k < Len(sexForm)
s2 = Left(sexForm,k+4)
s1= Right(s2,5)
If s1="}}_{{" Then
sexForm3= Left(sexForm,i)
sexForm= sexForm3 & "{" & Right(sexForm,Len(sexForm)-i-11) '\underbrace weg
k=k-9
m=k
Do While m < Len(sexForm)
s2 = Left(sexForm,m+1)
s1= Right(s2,1)
If s1="}" Then
s2 = Left(sexForm,m+2)
s1= Right(s2,2)
If s1="}}" then
sexForm3= Left(sexForm,k)
sexForm4= Right(sexForm,Len(sexForm)-k-1)
sexForm= sexForm3 & " underbrace " & Left(sexForm4,m-k) & "}" & Right(sexForm4,Len(sexForm4)-m+k)
m= Len(sexForm)
k= Len(sexForm)
EndIf
EndIf
m=m+1
Loop
EndIf
k=k+1
Loop
End Sub
REM FIND AND CREATE OVERBRACE (WORKS ALSO FOR OVERBRACE IN OVERBRACE)
Sub myOverbrace(Optional sexForm as String, Optional i as Integer)
Dim sexForm3 as String
Dim sexForm4 as String
Dim s1 as String
Dim s2 as String
Dim k as Integer
Dim m as Integer
k=i+4
Do While k < Len(sexForm)
s2 = Left(sexForm,k+4)
s1= Right(s2,5)
If s1="}}^{{" Then
sexForm3= Left(sexForm,i)
sexForm= sexForm3 & "{" & Right(sexForm,Len(sexForm)-i-10) '\overbrace weg
k=k-8
m=k
Do While m < Len(sexForm)
s1= Right(Left(sexForm,m+1),1)
If s1="}" Then
s1= Right( Left(sexForm,m+2),2)
If s1="}}" then
sexForm3= Left(sexForm,k)
sexForm4= Right(sexForm,Len(sexForm)-k-1)
sexForm= sexForm3 & " overbrace " & Left(sexForm4,m-k) & "}" & Right(sexForm4,Len(sexForm4)-m+k)
m= Len(sexForm)
k= Len(sexForm)
EndIf
EndIf
m=m+1
Loop
EndIf
k=k+1
Loop
End Sub
function myFraction(Optional sexForm0 as String,Optional l as Integer) as string
Dim sexForm as String
Dim sexForm3 as String
Dim s1 as String
Dim i as Integer
Dim j as Integer
Dim k as Integer
Dim m as Integer
Dim klac as Integer
sexForm=sexForm0
i=l
sexForm3=Left(sexForm,i-1)'save left side of der Formula
sexForm= Right(sexForm,Len(sexForm)-i-4) 'right side without \frac
k=instr(sexform,"{")'begin looking for paranthesis in sexform
klac=1
Do While k< Len(sexForm)
s1= Right(Left(sexForm,k+1),1)
If s1="{" then
klac=klac+1
endif
if s1="}" then
klac=klac-1
endif
If klac=0 then
j=k
exit do
endif
k=k+1
Loop
k=k+instr(mid(sexform,k+1),"{")-1
Do While k< Len(sexForm)
s1= Right(Left(sexForm,k+1),1)
If s1="{" then
klac=klac+1
elseif s1="}" then
klac=klac-1
endif
If klac=0 then
m=k
exit do
endif
k=k+1
Loop
sexform0=sexForm3 & "{" & Left(sexform,j+1) & " over " & mid(sexform,j+2,m-j-1) & "}" & right(sexform,len(sexform)-m)
myfraction=sexform0
End function
function myLimits(Optional sexForm as String, Optional i as Integer) as string
dim sexform1 as string
dim sexform2 as string
dim sexform3 as string
dim k%
sexform1=left(sexform,i-1)
If instr(sexform,"\lim")=0 then
sexform3=ltrim(right(sexform,len(sexform)-instr(sexform,"\nolim")-8))
elseif instr(sexform,"\nolim")=0 then
sexform3=ltrim(right(sexform,len(sexform)-instr(sexform,"\lim")-6))
elseif instr(sexform,"\nolim")>instr(sexform,"\lim") then
sexform3=ltrim(right(sexform,len(sexform)-instr(sexform,"\lim")-6))
else
sexform3=ltrim(right(sexform,len(sexform)-instr(sexform,"\nolim")-8))
endif
If left(sexform3,1)="_" then
sexform3=ltrim(right(sexform3,len(sexform3)-1))
if left(sexform3,1)="{" then
sexform2=left(sexform3,jumpParentPairs(sexform3,"{","}"))
sexform3=ltrim(right(sexform3,len(sexform3)-len(sexform2)))
if left(sexform3,1)="^" then
sexform2=" from " & sexform2 & " to " & right(sexform3,len(sexform3)-1)
else
sexform2=" from " & sexform2 & " " & sexform3
endif
else
if instr(sexform3,"^")=0 or instr(sexform3,"^")>instr(sexform3," ") then
sexform2= " from " & mid(sexform3,2)
else
sexform2= " from " & mid(sexform3,2,1) & " to " & right(sexform3,len(sexform3)-3)
endif
endif
else
sexform2= " to " & right(sexform3,len(sexform3)-1)
endif
myLimits=sexform1+sexform2
end function
function myRoots(Optional sexForm as String, Optional i as Integer) as string
dim sexform1
print "sqr1! " & sexform
if instr(sexform,"sqrt[")=0 then
myroots=left(sexform,i-1) & right(sexform, len(sexform)-i-5)
else
sexform1=ltrim(right(sexform, len(sexform)-i-5))
myroots=left(sexform,i-1) & " nroot{" & Left(sexform1,jumpParentPairs(sexform,"[","]") & "}" & right(sexform1, len(sexform1)-len(Left(sexform1,jumpParentPairs(sexform,"[","]")))
endif
print "sqr2! " & sexform
end function
function jumpParentPairs(Optional sexForm as String, Optional s1 as string, Optional s2 as string) as integer
dim i as integer
dim count as integer
count=0
jumpParentPairs=FALSE
for i=1 to Len(sexform)
if mid(sexform,i,1) = s1 then count=count+1
if mid(sexform,i,1) = s2 then count=count-1
if count=0 then
jumpParentPairs=i
exit function
endif
next
end function
sub createTextObject(optional sexform, optional neon,optional cvc,optional ctc)
If Left(sexForm,1)="#" Then
createNumbering(neon , cVC,ctc)
EndIF
If Left(sexForm,1)="*" Then
createBullets(neon, cVC,ctc)
EndIF
If inStr(sexForm, "File:") then
createGraph(neon,cVC,cTC)
EndIf
If inStr(sexForm, "<Gallery>") then
selectParagraph(cvc,ctc)
ctc.string=""
ctc.gotonextparagraph(false)
do while inStr(sexForm, "</Gallery>")=0
createGraph(neon,cVC,cTC)
ctc.gotonextparagraph(false)
sexform= getparagrstr(ctc)
Loop
ctc.string=""
EndIf
REM FIND OUT IF YOU HAVE A TABLE AND THEN CREATE THE TABLE WITH ITS CELL-CONTENTS.
REM A TABLE BEGINS ALWAYS AT STARTOFLINE
If inStr(sexForm,"{|" ) <>0 Then
createTable(neon , cVC, cTC)
sexform=""
EndIf
end sub
Sub Wiki2OpOffWr(optional neon, optional cVC,optional cTC,optional tits as string,optional titplus as integer)
Dim oObj
Dim oInsertPoint 'Where the outcome will be inserted
Dim vInsertPoint 'Where the outcome will be inserted
Dim vInsertPoint2 'Where the outcome will be inserted
Dim oVC As Object 'ViewCursor
' Dim cVC As Object 'ViewCursor
Dim oTC As Object 'TextCursor
Dim newText 'wichtig! hier wird der neue Text gespeichert
Dim wikiAd
Dim sexFormU As String 'Hier kommt der Titel der Seite
Dim sexForm As String 'hier kommen die jeweiligen Formelnabschnitte
Dim oMasters
Dim oField
Dim y As Integer 'entscheidet ob # oder * addiert wird
Dim oPar
Dim oSec
Dim osecEnum
Dim oEnum
Dim tit0 As Integer
Dim tit1 As Integer
Dim tit2 As Integer
Dim tit3 As Integer
Dim tit4 As Integer
dim oCurs
dim oIndex
dim noArgs()
sexForm1=""
tit1=0 : tit2=0 : tit3=0 : tit4=0
Dim oDescriptor
oDescriptor = neon.createReplaceDescriptor()
myReplace(oDescriptor, neon, "datei:", "file:")
myReplace(oDescriptor, neon, "image:", "file:")
myReplace(oDescriptor, neon, "[File:", "!File:")
myReplace(oDescriptor, neon, "|mini", "")
myReplace(oDescriptor, neon, "|upright=", "|!?&upright=")
myReplace(oDescriptor, neon, "|thumb", "")
myReplace(oDescriptor, neon, "|left", "")
myReplace(oDescriptor, neon, "|links", "")
myReplace(oDescriptor, neon, "|right", "")
myReplace(oDescriptor, neon, "|rechts", "")
myReplace(oDescriptor, neon, "[[w:", "<§wl")'wl for wikilink
myReplace(oDescriptor, neon, "[[", "<§wb")'wb for wikibook
myReplace(oDescriptor, neon, "[htt", "<§nlhtt")'nl for netlink
myReplace(oDescriptor, neon, "<ref", "<§rf")'rf for reference
myReplace(oDescriptor, neon, "<sup", "<§sp")'sp for superscript
myReplace(oDescriptor, neon, "<sub", "<§sb")'sb for subscript
myReplace(oDescriptor, neon, "<big", "<§bf")'bf for bigfont
myReplace(oDescriptor, neon, "<mat", "<§mt")'mt for math
myReplace(oDescriptor, neon, "'''", "<§bl>")'bl for Bold
myReplace(oDescriptor, neon, "''", "<§it>")'it for Italics
myReplace(oDescriptor, neon, "</sub>", "§!")
myReplace(oDescriptor, neon, "</sup>", "§!")
myReplace(oDescriptor, neon, "</big>", "§&")
myReplace(oDescriptor, neon, "__FORCETOC__", " ")
myReplace(oDescriptor, neon, "/<br />", CHR$(13))
myReplace(oDescriptor, neon, " ", " ")
myReplace(oDescriptor, neon, "\\ ", "\\\ ")
myReplace(oDescriptor, neon, "\ ", " ")
myReplace(oDescriptor, neon, "\begin{matrix}", "\bmx")
myReplace(oDescriptor, neon, "\end{matrix}", "}emx")
myReplace(oDescriptor, neon, "\div", " div ")
myReplace(oDescriptor, neon, "\dotsm", " dotsaxis ")
myReplace(oDescriptor, neon, "\dotsc", " dotslow ")
myReplace(oDescriptor, neon, "\dotsb", " dotsaxis ")
myReplace(oDescriptor, neon, "\cdot", " cdot ")
myReplace(oDescriptor, neon, "\dot", " dot ")
myReplace(oDescriptor, neon, "\sum", " sum ")
myReplace(oDescriptor, neon, "\int", " int ")
myReplace(oDescriptor, neon, "\iint", " iint ")
myReplace(oDescriptor, neon, "\iiint", "iiint")
myReplace(oDescriptor, neon, "\oint", "lint")
myReplace(oDescriptor, neon, "\sqrt", "sqrt")
myReplace(oDescriptor, neon, "\Leftrightarrow", " dlrarrow ")
myReplace(oDescriptor, neon, "\boldsymbol", " ")
myReplace(oDescriptor, neon, "\bold", " ")
myReplace(oDescriptor, neon, "\mathrm", " ")
myReplace(oDescriptor, neon, "\,", CHR$(34) & " " & CHR$(34))
'Greek alphabet in Math
myReplace(oDescriptor, neon, "\alpha" , "%alpha")
myReplace(oDescriptor, neon, "\beta" , "β")
myReplace(oDescriptor, neon, "\gamma" , "γ")
myReplace(oDescriptor, neon, "\delta" , "δ")
myReplace(oDescriptor, neon, "\epsilon", "ε")
myReplace(oDescriptor, neon, "\rho" , "ρ")
myReplace(oDescriptor, neon, "\omega" , "ω")
myReplace(oDescriptor, neon, "\pi" , "π")
myReplace(oDescriptor, neon, "\phi" , "φ")
myReplace(oDescriptor, neon, "\theta" , "θ")
selectParagraph(cvc, ctc)
sexForm = cVC.String 'nimmt den selected Text
Do
selectParagraph(cvc, ctc)
sexForm = cVC.String 'nimmt den selected Text
If instr(sexform," style=")<>0 then
sexFormU=Right(sexform, Len(sexform)-instr(sexform," style=")-10)
sexFormU=Right(sexform, Len(sexform)-instr(sexform,CHR$(34))-1)
sexForm=Left(sexform, instr(sexform," style=")-1) & sexFormU
selectParagraph(cvc, ctc)
cVC.String=sexform 'nimmt den selected Text
EndIF
If Left(sexForm,2)="==" Then
createTOC( cVC,tits,tit1,tit2,tit3,tit4,titplus)
' Print "1"
EndIF
createTextObject(sexform, neon,cvc,ctc)
REM FIND OUT IF YOU HAVE SIMPLE TEXT OR A TEXT-ELEMENT THAT BEGINS WITH <,
REM LIKE, FORMULA, AND THEN INSERT THE SIMPLE TEXT OR THIS ELEMENT
createTextElement(neon,ctC)
y=y+1
If y>1520 Then
Print("Error2!")
exit Sub
EndIf
Loop While ctC.gotonextparagraph(false) 'so lang oVC immer noch nach unten gehen kann
'wird der Text bearbeitet
' myReplace(oDescriptor, neon, "|", "")
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
BearbeitenZiel ist, dass es automatisch wird, wie bei wikibooks Buch erstellen. Bis jetzt, muss man ein Dokument mit den Kapiteln erstellen (gewöhnlich hat jedes Buch ein Inhaltverzeichnis) und dann die Macro aktivieren. Dazu wird nach dem Pfad gefragt, wo Dokumente aus dem Browser automatisch gespeichert werden. Der Browser soll also so eingestellt sein, dass Dokumente automatisch in einem Dir gespeichert werden. Außerdem muss man vorher die Einstellungen von gedit oder das entsprechende Programm (das txt Dokumente öffnet) so einrichten, dass es keine Zeilen ohne (newline) entstehen und auch das Programm, das die MD5 Kodierung erzeugt in OpenOffice installieren. Der Rest geht automatisch (außer wenn bei einem Kapitel weitergeleitet wird).
Programm zum Wikidownload
BearbeitenREM ***** BASIC *****
Sub Main
createBookFromTOCSite
End Sub
'oText.insertControlCharacter(oViewCursor,_com.sun.star.text.ControlCharacter.LINE_BREAK, false)
'!!!! REMARK !!!!
'I created some procedures when I still was inexperienced, so some of them are rather
'primitiv, but they are functioning, so,because of the time needed, I left them like
'this. If you have fun with it, you are welcome to improve them
sub createBookFromTOCSite
dim tocDoc
dim tocVC
dim tocTC
'dim oodu
dim neon
dim mycunt
dim myctc
dim adressDoc
dim oCuad
dim titstring as string
dim Filenamen as string
dim savedir as string
dim titplus as integer
dim tits1 as integer
dim tits2 as integer
dim v as integer
dim noArgs()
v=0
titplus=1
savedir = InputBox("give the path where your browser saves files","see your browser and adjust its tools","file:///home/yomomo/Downloads/wiki3",1440 *2 , 1440 * 4 )
tocDoc=thisComponent
tocVC = tocDoc.CurrentController.getViewCursor 'und erzeugt einen ViewCursor
tocTC = tocDoc.Text.CreateTextCursor 'der TextCursor kommtamAnfangdesTextes
tocTC.goToEnd(false)
tocTC.goToStart(false)
tocVC.gotoRange(tocTC,false) 'a text cursor can't go to the end of a line
If NOT tocVC.isAtStartOfLine() Then
tocVC.gotoStartOfLine(false)
EndIf
tocVC.gotoEndOfLine(true) 'so we have to use the view cursor.
titstring = tocVC.String 'nimmt den selected Text
neon = StarDesktop.LoadComponentFromUrl("private:factory/swriter", "_blank", 0, noArgs())
mycunt = neon.CurrentController.getViewCursor 'und erzeugt einen ViewCursor
myntc = neon.getText().createTextCursor()
adressDoc = StarDesktop.LoadComponentFromUrl("private:factory/swriter", "_blank", 0, noArgs())
oCuad = adressDoc.CurrentController.getViewCursor 'und erzeugt einen ViewCursor
Do While tocVC.goDown(1,true) 'so lang oVC immer noch nach unten gehen kann
'wird der Text bearbeitet
tocVC.goUp(1,True) 'man muss aber doch am Anfang anfangen
If Left(titstring,1) ="*" Then
'code to change wiki hyperlink in hyperlink and chapter title
'https://de.wikibooks.org/w/index.php?title=
Do While inStr(titstring,"]]")=0
If inStr(titstring,"]]")<>0 Then
Exit Do
EndIf
skipLine(tocVC,tocTC)
titstring =titstring + tocVC.String 'read the marked text
Loop
'Print titstring
If inStr(titstring,"|") = 0 then
Filenamen=Mid(titstring,inStr(titstring,"[[")+2,inStr(titstring,"]]")-4)
else
Filenamen=Mid(titstring,inStr(titstring,"[[")+2,inStr(titstring,"|")-4)
ENDIf
'Print Filenamen
wikiAdress= "https://de.wikibooks.org/w/index.php?title=" & Filenamen &"&action=raw"
oCuad.Text.insertString(oCuad,wikiadress,true)
oCuad.HyperLinkTarget = wikiAdress
oCuad.HyperLinkURL = wikiAdress
titstring= Mid(titstring, k+1,u-k-1)
' titstring = tit0 & "." & tit1 & "." & tit2 & "." & titstring
mycunt.getText().insertString(mycunt,titstring,true)
mycunt.getText().insertString(mycunt,CHR$(13),false)
callChapterFromInternet(adressDoc,mycunt, savedir,Filenamen,v)
v=v+1
EndIf
skipLine(tocVC,tocTC)
titstring = tocVC.String 'read the marked text
Loop
'until hier the whole book is downloaded but with minimal processing
'we must go again to the beginning of the whole text and process it
end Sub
sub callChapterFromInternet(Optional addoc,Optional rtc, Optional savedir as string, Optional Fname as string, Optional k as Integer)
dim document as object
dim dispatcher as object
dim n as Integer
dim m as Integer
dim i as Integer
document = addoc.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
dispatcher.executeDispatch(document, ".uno:OpenHyperlinkOnCursor", "", 0, Array())
'Print("hier")
i=0
m=0
'file1= "file:///home/georg/Λήψεις/index.php"
'wait(2000)
Do While instr(Fname, "/")<>0
Fname=mid(Fname, instr(Fname, "/")+2)
Loop
Do While instr(Fname, ":")<>0
Fname=mid(Fname, instr(Fname, ":")+2)
'Fname=mid(Fname, instr(Fname, "/")+2)
Loop
'Print fname
wait(4000)
'Print (Fname)
FileCopy("file:///home/yomomo/Downloads/wiki3/index.php", "file:///home/yomomo/Downloads/wiki3/"& k & " " & Fname &".odt" )
kill("file:///home/yomomo/Downloads/wiki3/index.php")
End sub
'this is a simple replace procedure. At the beginning of the main sub (wiki2opoffwr)
'many of the characteristic characterfollows (eg [[ at the beginning or ]] at the end
'of a wiki hyperlink) are replaced through other symbols (eg <§wl) that make the
'programming easier. Some keywords will be deleted (replaced through ""), because I
'didnt find them so important(eg style in a table), but if you want to, you can also
'change the code and take tham under concern
Sub skipLine(Optional oVC,Optional oTC)
oVC.goRight(1,false) 'go to next line
If NOT oVC.isAtStartOfLine() Then
oVC.gotoStartOfLine(false)
EndIf
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
End Sub
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 [1] und allgemein an openoffice Dokumentationsseite.