Zum Inhalt springen

Wikipedia:Technik/Text/Basic/OOo Calc2Dokuwiki

aus Wikipedia, der freien Enzyklopädie

Dieses StarOffice-Makro Calc2Dokuwiki (lucsorel.com) konvertiert Tabellen der OpenOffice-Tabellenkalkulation in MediaWiki- oder DokuWiki-Tabellen. Die Konvertierung von writer-Tabellen ist schon in den writer integriert. Dessen Zweckentfremdung zur Konvertierung von calc-Tabellen funktioniert nur eingeschränkt (über Inhalte einfügen im rtf-Format). Dieses Makro konvertiert die Tabellen direkt.

Installation

über Extras / Extension Manager / Hinzufügen ...

Konvertierung

Über das calc-Menü

Extras/Makros/Makros Verwalten/OpenOffice.org Basic

ein neues Makro anlegen. Dort unten stehenden Code via Zwischenablage eingefügen.

Anwendung

Vor dem Makroaufruf die gewünschten Zeilen / Spalten markieren.

Falls nicht alle Zeilen und Spalten benötigt werden, kann vor der Konvertierung eine Filterung erfolgen. Zeilen und Spalten können wie folgt gefiltert werden:

  1. Zeilen mit Autofilter filtern.
  2. Gefilterte Zeilen markieren, kopieren und mit Inhalte einfügen (ohne Formeln) in ein anderes Tabellenblatt einfügen. Dort die nicht benötigten Spalten löschen. Anschließend können die verbleibenden Zellen markiert und mit dem Makro konvertiert werden. Die Selektion sollte nur genau die benötigten Spalten und Zeilen umfassen. Andernfalls entstehen leere Zeilen und Spalten.

Code

<syntaxhighlight lang="basic"> REM ***** Calc2Dokuwiki ***** ' Calc2Dokuwiki is an extension for OpenOffice.org 2.x which converts ' a selection of cells (in Calc, the spreadsheet module) into a table ' in Dokuwiki code. The code of this extension is distributed under ' the LGPL and the CeCILL licenses. ' Copyright (C) 2007 Luc Sorel luc.sorel at gmail.com ' Erweitert von dokuwiki auf mediawiki (C) LoKiLeCh

REM ***** LGPL ***** ' This library is free software; you can redistribute it and/or ' modify it under the terms of the GNU Lesser General Public ' License as published by the Free Software Foundation; either ' version 2.1 of the License, or (at your option) any later version. ' ' This library is distributed in the hope that it will be useful, ' but WITHOUT ANY WARRANTY; without even the implied warranty of ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ' Lesser General Public License for more details. ' ' You should have received a copy of the GNU Lesser General Public ' License along with this library; if not, write to the Free Software ' Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

REM ***** CeCILL ***** ' This software is governed by the CeCILL license under French ' law and abiding by the rules of distribution of free software. ' You can use, modify and/or redistribute the software under the ' terms of the CeCILL license as circulated by CEA, CNRS and INRIA ' at the following URL "http://www.cecill.info". ' ' As a counterpart to the access to the source code and rights ' to copy, modify and redistribute granted by the license, users ' are provided only with a limited warranty and the software's author, ' the holder of the economic rights, and the successive licensors have ' only limited liability. ' ' In this respect, the user's attention is drawn to the risks ' associated with loading, using, modifying and/or developing ' or reproducing the software by the user in light of its specific ' status of free software, that may mean that it is complicated ' to manipulate, and that also therefore means that it is reserved ' for developers and experienced professionals having in-depth ' computer knowledge. Users are therefore encouraged to load and ' test the software's suitability as regards their requirements in ' conditions enabling the security of their systems and/or data ' to be ensured and, more generally, to use and operate it in ' the same conditions as regards security. ' ' The fact that you are presently reading this means that you have ' had knowledge of the CeCILL license and that you accept its terms.

option explicit

dim mode as string


function CellStringNFormat(myCell as object) as string

 dim myStrg, myBoldStyle as string
 dim delim as string
 myStrg = myCell.String
 ' If the cell is empty, returns a [space] otherwise Dokuwiki will merges cells in the row
 if mode = "m" then
  delim = "|| "
 else
  delim = "| "
 endif


 if (len(myStrg) = 0) then
   CellStringNFormat = delim
   exit function
 endif
 ' Add text format (bold, italic), underline type (true or false), and horisontal alignment (left, center, right)
 if ((myCell.charWeight = com.sun.star.awt.FontWeight.BOLD) or (myCell.charWeight = com.sun.star.awt.FontWeight.ULTRABOLD)) then myStrg = "**" & myStrg & "**"
 if (myCell.charPosture = com.sun.star.awt.FontSlant.ITALIC) then myStrg = "//" & myStrg & "//"
 if not(myCell.CharUnderline = com.sun.star.awt.FontUnderline.NONE) then myStrg = "__" & myStrg & "__"
 if (myCell.HoriJustify = com.sun.star.table.CellHoriJustify.RIGHT) then myStrg = "  " & myStrg
 if (myCell.HoriJustify = com.sun.star.table.CellHoriJustify.CENTER) then myStrg = "  " & myStrg & "  "
 if (myCell.HoriJustify = com.sun.star.table.CellHoriJustify.LEFT) then myStrg = myStrg & "  "
 if (myCell.HoriJustify = com.sun.star.table.CellHoriJustify.STANDARD) then myStrg = "  " & myStrg
 ' Add cell style (heading or standard)
 if mode = "d" then
  if (InStr(myCell.CellStyle,"heading")>0) then
    myStrg = "^" & myStrg
  else
    myStrg = delim & myStrg
  end if
 else
  if (InStr(myCell.CellStyle,"heading")>0) then
    myStrg = "!" & myStrg
  else
    myStrg = delim & myStrg
  end if
 endif
 ' Return Dokuwiki code for the cell
 CellStringNFormat = myStrg

end function

sub writeTableCode(myZone as object, myWriterDocText as object, textCursor as object, optional idSel as integer)

 dim coordZone as object
 dim rowMax, colMax, idCol, idRow as integer
 dim myCellString as string
 dim endParagraph as integer
 endParagraph = com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK
 coordZone = myZone.RangeAddress
 colMax = coordZone.EndColumn-coordZone.StartColumn
 rowMax = coordZone.EndRow-coordZone.StartRow
 if (IsMissing(idSel)) then
   myWriterDocText.insertString(textCursor,"Table", false)
 else
   myWriterDocText.insertString(textCursor,"Table " & (idSel+1), false)
 end if
 myWriterDocText.insertControlCharacter(textCursor,endParagraph,false)
 if mode = "m" then
    myWriterDocText.insertString(textCursor, "{|  class=" & chr(34) & "wikitable sortable" & chr(34), false)
    myWriterDocText.insertControlCharacter(textCursor, endParagraph, false)
endif
 for idRow = 0 to rowMax
   for idCol = 0 to colMax
     myCellString = CellStringNFormat(myZone.getCellByPosition(idCol,idRow))
     if idCol = 0 and mode = "m" then myCellString = right(myCellString,len(myCellString)-1)
     myWriterDocText.insertString(textCursor, myCellString,false)
   next idCol
  if mode = "m" then
  else
    myWriterDocText.insertString(textCursor, "|", false)
   endif
   myWriterDocText.insertControlCharacter(textCursor, endParagraph, false)
if mode = "m" then
    myWriterDocText.insertString(textCursor, "|-", false)
    myWriterDocText.insertControlCharacter(textCursor, endParagraph, false)
endif
 next idRow


  if mode = "m" then
    myWriterDocText.insertString(textCursor, "|}", false)
    myWriterDocText.insertControlCharacter(textCursor, endParagraph, false)
endif
 myWriterDocText.insertControlCharacter(textCursor, endParagraph, false)

end sub

function doesDisplayHelp(myCalcDoc as object) as boolean

 dim myZone, coordZone as object
 dim rowMax, colMax as integer
 dim cellString as string
 myZone = myCalcDoc.CurrentSelection
 if myZone.supportsService("com.sun.star.sheet.SheetCellRanges") then
   ' It's a multiple selection -> do not display help information
   doesDisplayHelp = false
   exit function
 else
   ' Single selection
   coordZone = myZone.RangeAddress
   colMax = coordZone.EndColumn-coordZone.StartColumn
   rowMax = coordZone.EndRow-coordZone.StartRow
   if ((colMax > 0) or (rowMax > 0)) then
     doesDisplayHelp = false
     exit function
   else
     cellString = LCase(myZone.getCellByPosition(0, 0).String)
     if (cellString = "help") then
       doesDisplayHelp = true
       exit function
     else
       doesDisplayHelp = false
       exit function
     endif
   endif
 endif
 doesDisplayHelp = false

end function

Sub Calc2Dokuwiki_Main

 dim myCalcDoc as Object
 dim rowMax, colMax, idCol, idRow, idSel as integer
 dim myCellString as string
 dim propFichier()
 dim myWriterDoc, myWriterDocText, textCursor as object
 dim endParagraph as integer
 dim helpString as string
 mode = inputbox("Bitte geben Sie den gewünschten Dokumententyp an! m für mediawiki d für dokuwiki","Dokumententyp definieren", "m")
 endParagraph = com.sun.star.text.ControlCharacter.PARAGRAPH_BREAK
 myCalcDoc = ThisComponent
 if doesDisplayHelp(myCalcDoc) then
   ' Display help information if desired (= one cell selection with word 'help' typed in it, without the quote)
   helpString = "Calc2Dokuwiki converts a selection of cells into a table in Dokuwiki code. The code is generated in a new Writer document ready to be copy-pasted in your Dokuwiki website!"
   helpString = helpString + Chr(13) + Chr(13) + "A multiple selection of cells ouputs as many tables (in the same Writer document) as selections."
   msgBox(helpString,0,"Calc2Dokuwiki - help")
 else
   myWriterDoc = StarDesktop.LoadComponentFromURL("private:factory/swriter","_blank",0,propFichier)
   myWriterDocText = myWriterDoc.Text
   textCursor = myWriterDocText.createTextCursor()
   ' Add help access information at the beginning of the document
   myWriterDocText.insertString(textCursor, "HELP: To read a short user guide about Calc2Dokuwiki extension, type 'help' (without the quotes) in a Calc cell, select this cell, and press the extension button again.", false)
   myWriterDocText.insertControlCharacter(textCursor, endParagraph, false)
   myWriterDocText.insertControlCharacter(textCursor, endParagraph, false)
   ' Parse the Calc selected cells and produce Dokuwiki code
   if myCalcDoc.CurrentSelection.supportsService("com.sun.star.sheet.SheetCellRanges") then
     for idSel = 0 to (myCalcDoc.CurrentSelection.count - 1)
       writeTableCode(myCalcDoc.CurrentSelection(idSel), myWriterDocText, textCursor, idSel)
     next idSel
   else
     writeTableCode(myCalcDoc.CurrentSelection, myWriterDocText, textCursor)
   endif
 end if

End Sub </syntaxhighlight>