Seite 1 von 1

Makro aufzeichnen & Formatierung ... bzw. allgemein: Ersetzungen mit Formatattributen

Verfasst: Mi 28. Sep 2016, 21:34
von Butch
Ich beschäftige mich im Moment mit Makros und bin auf ein schwieriges Problem gestoßen.

Im Wesentlichen versuche ich durch ‚Makro aufzeichnen‘ Folgendes machen:

Alle Textteile in fett sollen ersetzt werden durch Text mit Präfix <STRONG> und Suffix </STRONG>, jene in kursiv durch Text mit Präfix <EM> und Suffix </EM>, usw.

Das funktioniert ‚manuell‘ tadellos:

Suchen & Ersetzen, unter Weitere Optionen ‚Regulärer Ausdruck‘ aktivieren, für Suchen .* eingeben (= beliebig viele beliebige Zeichen) und unter Format/Schriftart/Stil fett auswählen, für Ersetzen <STRONG>$0</STRONG> einsetzen und unter Format Standard auswählen (angezeigt wird ‚Nicht kursiv, normal‘), Alles Ersetzen. Funktioniert. (Ich mache das dann auch noch z.B. für fett&kursiv, für bestimmte Schriftgrößen usw.)

Wird dasselbe in ‚Makro aufzeichnen‘ gemacht, ergibt sich offensichtlich das Problem, dass die gewählten Formatierungen nicht im Makro gespeichert werden. Macht man also zwei Makros, die das Obige machen sollen, unterscheiden sich diese, wenn man sie im LO Basic anschaut, überhaupt nicht (außer in den Eintragungen für Suchen und Ersetzen natürlich).

Ist dieses Problem bereits bekannt? Gibt es ein Workaround? Wie könnte man in den Makros die Formatierungen zumindest manuell eintragen?

Re: Makro aufzeichnen & Formatierung

Verfasst: Fr 30. Sep 2016, 10:34
von Butch
Ich habe mich in der Zwischenzeit viel damit beschäftigt (gezwungenermaßen, weil ich eine Lösung brauche), und kann jetzt Folgendes berichten:

- Das Problem, dass 'Makro aufzeichnen' die beim Suchen&Ersetzen angewandten Formatattribute nicht speichert, ist schon vielfach beschrieben worden. 'Makro aufzeichnen' ist für diesen Zweck einfach nicht geeignet. (Ungut dabei: Man kann es ewig lang machen und versuchen, es taucht aber weit und breit kein Hinweis darauf, dass man von Vornherein Sinnloses tut.)

- Ich habe also ein eigenes Makro geschrieben, das die von mir gewünschten Ersetzungen macht. Vielleicht könnte es (evtl. nur in einzelnen Teilen -- ist gut dokumentiert und anpassungsfähig) noch für jemanden anderen nützlich sein.

- Die Frage von Ersetzungen speziell in Verbindung mit Absatzenden/Zeilenumbrüchen usw. ist ja ein so lästiges wie uraltes Thema bei LO (das trotz allem jahrelangem Bemühen der Gemeinde und allen Tipps am Ende für fast jeden Benutzer, der damit konfrontiert ist, extrem mühsam bleibt -- das Ganze ist einfach alles andere als anwenderfreundlich konzipiert, leider).
Was ich in meinem Makro einfach nicht schaffe, ist dieser Punkt:
Suchen nach Zeichenkette am Absatzende und Zeichenkette am Anfang des nächsten Absatzes. Bei mir geht es darum, dass jetzt am Absatzende <br> steht und (dort, wo ich im Text zweimal hintereinander Enter angewandt habe) dann in einer sonst leeren Zeile nochmals <br>. Ich möchte aber, dass beide <br> am Ende des Absatzes stehen.

- Was ich in meinem Makro auch nicht schaffe:
Wie soll das Ganze nur im aktuell ausgewählten (markierten) Textbereich erfolgen?

Igendwelche Tipps zu diesen zwei Punkten?

Code: Alles auswählen

Sub Format2Html
  ' ------------
  ' Butch's notes:
  ' ------------
  ' bold        : <B>           CharWeight      FontWeight.BOLD       .NORMAL  *)
  ' italic      : <I>           CharPosture     FontSlant.ITALIC      .NONE
  ' underlined  : <U>           CharUnderline   FontUnderline.SINGLE  .NONE
  ' -------------
  ' 16pt        : <BIG><BIG>    Dim CharHeight As Long ... **)
  ' 14pt        : <BIG>
  ' 10pt        : <SMALL>
  ' 8pt         : <SMALL><SMALL>
  ' ------------
  ' lbreak      : <BR>
  ' ------------
  ' *)          :               SrchAttributes(0).Name = "CharWeight"
  '                             SrchAttributes(0).Value =com.sun.star.awt.FontWeight.BOLD
  '                             oReplace.SetSearchAttributes(SrchAttributes())
  ' ------------
  ' **)         :               Dim CharHeight As Long
  '                             CharHeight = "16"
  '                             SrchAttributes(0).Value = CharHeight
  '                             oReplace.SetSearchAttributes(SrchAttributes())
  ' ------------
  ' original code : AndrewMacro.odt; other hints:
  ' https://www.openoffice.org/api/docs/common/ref/com/sun/star/style/CharacterProperties.html
  ' https://forum.openoffice.org/en/forum/viewtopic.php?f=20&t=60896

  Dim oDoc As Object
  Dim oReplace As Object
  Dim SrchAttributes(0) As New com.sun.star.beans.PropertyValue
  Dim ReplAttributes(0) As New com.sun.star.beans.PropertyValue
  Dim CharHeight As Long                            ' B.

  oDoc = ThisComponent
  oReplace = oDoc.createReplaceDescriptor

  oReplace.SearchRegularExpression=True
  oReplace.searchAll=True

REM : LBREAK first

  oReplace.SearchString = "$"
  oReplace.ReplaceString = "<br>\n"
  oDoc.replaceAll(oReplace)
  
REM : For all the following: Replace ANY TEXT & include STYLES

  oReplace.SearchString = ".*"

  oReplace.searchStyles=True

REM : BOLD
  
  oReplace.ReplaceString = "<b>&</b>"

  SrchAttributes(0).Name = "CharWeight"
  SrchAttributes(0).Value =com.sun.star.awt.FontWeight.BOLD
  oReplace.SetSearchAttributes(SrchAttributes())

  REM ReplAttributes(0).Name = "CharWeight"
  REM x ReplAttributes(0).Value =com.sun.star.awt.FontWeight.NORMAL
  REM ReplAttributes(0).Value =com.sun.star.awt.FontWeight.BOLD
  REM oReplace.SetReplaceAttributes(ReplAttributes())

  oDoc.replaceAll(oReplace)

REM : ITALIC

  oReplace.ReplaceString = "<i>&</i>"

  SrchAttributes(0).Name = "CharPosture"
  SrchAttributes(0).Value =com.sun.star.awt.FontSlant.ITALIC
  oReplace.SetSearchAttributes(SrchAttributes())

  oDoc.replaceAll(oReplace)

REM : 16PT

  oReplace.ReplaceString = "<big><big>&</big></big>"

  CharHeight = "16"
  SrchAttributes(0).Name = "CharHeight"
  SrchAttributes(0).Value = CharHeight
  oReplace.SetSearchAttributes(SrchAttributes())

  oDoc.replaceAll(oReplace)

REM : 14PT

  oReplace.ReplaceString = "<big>&</big>"

  CharHeight = "14"
  SrchAttributes(0).Name = "CharHeight"
  SrchAttributes(0).Value = CharHeight
  oReplace.SetSearchAttributes(SrchAttributes())

  oDoc.replaceAll(oReplace)

REM : 10PT

  oReplace.ReplaceString = "<small>&</small>"

  CharHeight = "10"
  SrchAttributes(0).Name = "CharHeight"
  SrchAttributes(0).Value = CharHeight
  oReplace.SetSearchAttributes(SrchAttributes())

  oDoc.replaceAll(oReplace)

REM : 8PT

  oReplace.ReplaceString = "<small><small>&</small></small>"

  CharHeight = "8"
  SrchAttributes(0).Name = "CharHeight"
  SrchAttributes(0).Value = CharHeight
  oReplace.SetSearchAttributes(SrchAttributes())

  oDoc.replaceAll(oReplace)

End Sub