Writer: Ricerca di gruppi di righe vuote.

Creare una macro - Scrivere uno script - Usare le API
Rispondi
Nomen
Messaggi: 7
Iscritto il: sabato 13 novembre 2010, 23:07

Writer: Ricerca di gruppi di righe vuote.

Messaggio da Nomen »

Salve a tutti,
Come da soggetto stavo cercando di creare una macro che trovi gruppi di linee vuote. Credevo di aver risolto ma mi sono arenato davanti ad uno scoglio che non riesco a passare.
Il problema è che le righe di codice da me scritte intercettano anche eventuali immagine fra le righe vuote, cosa che io non vorrei.
Ecco qui il codice da me scritto:

Codice: Seleziona tutto

REM  *****  BASIC  *****
option explicit

Sub Main
	dim vCur
	dim rFound
	'creo un viewcursor
	vCur = thisComponent.getCurrentController.getViewCursor()
	'richiamo la function
    rFound = findMultiBlankLines(vCur, "")
   	if IsNull(rFound) then 
   		msgbox("Nothing")
    else
    	'seleziono il range risultante
        vCur.gotoRange(rFound,false)
    end if
End Sub

function findMultiBlankLines(oCursor, style)
  Dim cur as Variant
  Dim r as Variant
  Dim check as boolean
  Dim pSearch as Variant
  Dim pFound as Variant
  dim cline as integer	
  
  
  on error goto findMultiBlankLinesKO
  
  'creo un textcursor  
  cur = thisComponent.getText.createTextCursor()
  'sposto il cursore alla fine del cursore passato alla funzione
  cur.gotorange(oCursor.getEnd,false)
  cur.CollapsetoEnd
  'creo un secondo textcursor che servirà come risultato della funzione
  r = thisComponent.getText.createTextCursor()
  'check diventerà vero nel caso si trovi gruppi di linee vuote
  check=false
  'creo il searchdescriptor
  pSearch = thisComponent.createSearchDescriptor
  pSearch.SearchRegularExpression = True
  pSearch.SearchCaseSensitive=False
  pSearch.SearchString="^$" 'regex per righe vuote
  pSearch.SearchBackwards = False
  
  'eseguo la ricerca
  pFound = thisComponent.findnext(cur.getend,pSearch)
  Do while not isNull(pFound)
     'adesso che è stata trovata una linea vuota
     'imposto il contatore di linee vuote a 0
  	 cline=0
  	 'sposto il cursore all'inizio del range trovato
     cur.gotoRange(pFound.getstart,false)
     'controllo se lo style del paragrafo sia o come quello passato con style o style sia vuoto
     if cur.ParaStyleName = style or style="" then
     	'eseguo un ciclo che avanzerà di un paragrafo a volta
     	Do while cur.gotoNextParagraph(False)
     	   'seleziono il paragrafo
     	   cur.gotoEndOfParagraph(True)
     	   'controllo che sia vuoto e che lo stile sia corrispondente o a quello passato o che style sia vuoto
     	   if trim(cur.string)="" and (cur.ParaStyleName = style or style="") then 
     	   	  'se si aggiungo uno al contatore delle linee vuote
       	      cline=cline+1
       	   else
       	      'esco dal do loop che continua a ciclare i paragrafi sequenzialmente
       	      exit do
           end if
		Loop 
		'se il contatore delle linee vuote è maggiore di 0
		'ho trovato un gruppo di linee vuote
		if cline>0 then
		   'uso il secondo textcursor(r) per creare un range da inviare come risposta alla function
       	   r.gotoRange(pFound.getstart,false)
       	   r.gotoRange(cur.getstart,true)
       	   'setto check vero perchè ho trovato un gruppo di linee vuote
       	   check=true
       	   'esco dal do loop che continua a cercare righe vuote
       	   exit do
       	end if	
     end if
     'se sono qui non ho trovato gruppi di linee vuote e allora eseguo un'altra ricerca dalla fine del cursore
     pFound = thisComponent.findnext(cur.getend,pSearch)
  Loop	 
  
  if check then
  	findMultiBlankLines=r   
  else
  	findMultiBlankLines=nothing
  end if
  on error goto 0
  exit function
   
  findMultiBlankLinesKO:
  msgbox ("Error " & Err & ": " & Error$ & chr(13) & "in findMultiBlankLinesKO !")
  findMultiBlankLines=nothing
  On Error Goto 0   
end function
Allego anche un documento odt con un testo di esempio.

Saluto tutti e spero in un vostro aiuto.
Allegati
TestLinee.odt
Documento di esempio per ricerca gruppi di linee vuote.
(16.9 KiB) Scaricato 105 volte
Ultima modifica di Nomen il sabato 16 agosto 2014, 14:12, modificato 2 volte in totale.
OpenOffice 4.1.0 su Windows 7
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Writer: Ricerca di gruppi di righe vuote.

Messaggio da patel »

la linea cline=0 inserita dentro il loop non ti permette di contare il numero di righe vuote
Comunque se il tuo obiettivo è quello di rimuovere le righe vuote doppie

Codice: Seleziona tutto

Sub RemoveDuplicatesLines
  Dim oCurs1, oCurs2

  REM The first cursor will start by selecting the first paragraph
  oCurs1 = ThisComponent.getText.createTextCursor()
  oCurs1.gotoStart(False)
  oCurs1.gotoEndOfParagraph(True)

  REM The second cursor will start by selecting the second paragraph
  oCurs2 = ThisComponent.getText.createTextCursor()
  oCurs2.gotoStart(False)
  oCurs2.gotoNextParagraph(False)
  oCurs2.gotoEndOfParagraph(True)

  Dim s1$
  Dim s2$
  s1 = Trim(oCurs1.getString())
  Do
    s2 = Trim(oCurs2.getString())
    If s1 = s2 Then
      oCurs2.gotoNextParagraph(True)
      oCurs2.setString("")
    Else
      oCurs1.gotoNextParagraph(False)
      oCurs1.gotoEndOfParagraph(True)
      s1 = Trim(oCurs1.getString())
      If NOT oCurs2.gotoNextParagraph(False) Then Exit Do
    End If
  Loop Until NOT oCurs2.gotoEndOfParagraph(True)
End Sub
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
Nomen
Messaggi: 7
Iscritto il: sabato 13 novembre 2010, 23:07

Re: Writer: Ricerca di gruppi di righe vuote.

Messaggio da Nomen »

Prima di tutto ti ringrazio per l'interessamento e per la soluzione da te proposta che funziona a meraviglia se uno volesse eliminare le linee vuote al volo.

Quello che vorrei fare io invece è selezionare il gruppo di linee vuote e solo in un momento successivo (in pratica lasciando all'utente la scelta di cancellarle o meno) cancellarle. Il top sarebbe capire attraverso un metodo od una proprietà se il paragrafo, il cursore, o la selezione contenessero immagini ma mi pare di non aver trovato suddetto metodo.
Il codice da me scritto funziona e seleziona gruppi di linee vuote ma purtroppo seleziona anche eventuali immagini nel mezzo ed è proprio questa pecca che vorrei risolvere.

Ciao e grazie di nuovo.
OpenOffice 4.1.0 su Windows 7
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Writer: Ricerca di gruppi di righe vuote.

Messaggio da patel »

Nomen ha scritto: Il codice da me scritto funziona e seleziona gruppi di linee vuote ma purtroppo seleziona anche eventuali immagini nel mezzo ed è proprio questa pecca che vorrei risolvere.
a me non sembra che funzioni, come fai ad affermarlo ?
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
Nomen
Messaggi: 7
Iscritto il: sabato 13 novembre 2010, 23:07

Re: Writer: Ricerca di gruppi di righe vuote.

Messaggio da Nomen »

Può darsi che tu abbia provato il codice prima della modifica di oggi alle 13:12 dove, in effetti, c'era un nome di un etichetta di riga sbagliata per la gestione degli errori... chiedo scusa per la svista ma avevo commentato la gestione degli errori prima di postare il codice.
Adesso ho ritestato e funziona anche se non nel modo che vorrei ;P

Ciao e grazie per il tempo ^^
OpenOffice 4.1.0 su Windows 7
patel
Volontario attivo
Volontario attivo
Messaggi: 4020
Iscritto il: venerdì 30 aprile 2010, 8:04
Località: Livorno

Re: Writer: Ricerca di gruppi di righe vuote.

Messaggio da patel »

Hai allegato un file senza macro, io vi ho incollato il codice da te postato e non succede niente, hai bisgno di aiuto o no ? se no possiamo chiudere qui.
-------------------
Libre Office 7.5.3.2 su Windows 11
allega un file di esempio, guadagnerai tempo tu e lo farai risparmiare a chi ti aiuta
Nomen
Messaggi: 7
Iscritto il: sabato 13 novembre 2010, 23:07

Re: Writer: Ricerca di gruppi di righe vuote.

Messaggio da Nomen »

Prova a fare questi semplici passi:
1) apri il file odt che ho allegato.
2) aggiungi un modulo fra le macro basic che hai e ci copi incolli il codice.
3) richiami la sub main con un pulsante sulla barra degli strumenti.
4) vedrai del testo selezionato che corrisponde ad un gruppo di linee vuote.

Io di un suggerimento avrei bisogno e, nel caso tu sapessi darmelo, te ne sarei grato. Precisamente il suggerimento dovrebbe riguardare il modo per ovviare al comportamento sbagliato del codice da me scritto, probabilmente per mia incopetenza, riguardo alla selezione di immagini all'interno di gruppi di linee vuote.

Ciao
OpenOffice 4.1.0 su Windows 7
Rispondi