Macro per l'identificazione di un testo compreso tra due stringhe di delimitazione

    From The Document Foundation Wiki
    < Macros‎ | Writer
    This page is a translated version of the page Macros/Writer/007 and the translation is 100% complete.


    Other languages:

    Descrizione

    Questa macro in Basic per Writer identifica un testo compreso tra due stringhe usate come delimitatori (es. una stringa "delimitatore iniziale" ed una "delimitatore finale"). Ad esempio il testo che si trova tra l'inizio e la fine di una spiegazione.

    Il principio è quello di cercare un "delimitatore iniziale" univoco, che costituisce il punto iniziale per la ricerca del "delimitatore finale". Queste due posizioni vengono selezionate tramite il cursore visibile a partire dalla fine del "delimitatore iniziale" e fino all'inizio del "delimitatore finale".

    La ricerca viene eseguita usando il metodo createSearchDescriptor dell'interfaccia com.sun.star.util.XSearchable[1] in abbinamento al servizio com.sun.star.util.SearchDescriptor[2] al fine di definire le proprietà della ricerca, tra cui: il testo da ricercare, la sensibilità alle maiuscole e minuscole, l'uso delle espressioni regolari, ecc.

    Il sevizio com.sun.star.text.XTextViewCursor[3] è usato per visualizzare il testo trovato.

    Codice

    Nel codice che segue i delimitatori di inizio e fine sono rispettivamente "inizio della spiegazione" e "fine della spiegazioni".

    Option Explicit
    
    Sub SearchText()
        '''Cerca ed evidenzia il testo trovato che è compreso tra due delimitatori'''
    
        Dim oDoc As Object ' com.sun.star.text.GenericTextDocument, com.sun.star.util.XSearchable
        Dim oSearchZone As Object ' com.sun.star.util.SearchDescriptor
        Dim oFoundZone As Object ' com.sun.star.uno.XInterface
        Dim oFoundAfterZone As Object ' com.sun.star.uno.XInterface
        Dim oCursVisible As Object ' com.sun.star.text.XTextViewCursor
    
        oDoc = ThisComponent ' com.sun.star.util.XSearchable compliant document
        oSearchZone = oDoc.createSearchDescriptor()
        With oSearchZone ' com.sun.star.util.SearchDescriptor
            .SearchString = "inizio della spiegazione"
        End With
        oFoundZone = oDoc.findFirst(oSearchZone)
    
        If Not(IsNull(oFoundZone)) Then
            With oSearchZone ' com.sun.star.util.SearchDescriptor
                .SearchString = "fine della spiegazione"
            End With
            oFoundAfterZone = oDoc.findNext(oFoundZone.End, oSearchZone)
            If Not(IsNull(oFoundAfterZone)) Then
                oCursVisible = oDoc.currentcontroller.viewCursor
                With oCursVisible ' com.sun.star.text.text.XTextViewCursor
                    .gotoRange(oFoundZone.End, false)
                    .gotoRange(oFoundAfterZone.Start, True)
                    MsgBox .String, MB_ICONINFORMATION, "Testo trovato!"
                End With
            Else
                MsgBox "il delimitatore finale NON è stato trovato", MB_ICONINFORMATION, "Ricerca del testo"
            End If
        Else
            MsgBox "il delimitatore iniziale NON è stato trovato", MB_ICONINFORMATION, "Ricerca del testo"
        End If
    
    End Sub ' SearchText

    Con Pythonː

    # -*- coding: utf-8 -*-
    from __future__ import unicode_literals
    
    MB_ICONINFORMATION = 64
    
    def SearchText():
        """Cerca ed evidenzia il testo trovato che è compreso tra due delimitatori
        
        oSearchZone         com.sun.star.util.SearchDescriptor
        oFound(After)Zone   com.sun.star.uno.XInterface
        oCursVisible        com.sun.star.text.XTextViewCursor
        """
        oDoc = XSCRIPTCONTEXT.getDocument()  # documento conforme a com.sun.star.util.XSearchable
        oSearchZone = oDoc.createSearchDescriptor()
        oSearchZone.SearchString = "inizio della spiegazione"
        oFoundZone = oDoc.findFirst(oSearchZone)
        if oFoundZone:
            oSearchZone.SearchString = 'fine della spiegazione'
            oFoundAfterZone = oDoc.findNext(oFoundZone.End, oSearchZone)
            if oFoundAfterZone:
                oCursVisible = oDoc.CurrentController.ViewCursor
                oCursVisible.gotoRange(oFoundZone.End, False)
                oCursVisible.gotoRange(oFoundAfterZone.Start, True)
                MsgBox(oCursVisible.String,MB_ICONINFORMATION, "Testo trovato!")
            else:
                MsgBox('il delimitatore finale NON è stato trovato',MB_ICONINFORMATION, "Ricerca del testo")
        else:
            MsgBox("il delimitatore iniziale NON è stato trovato",MB_ICONINFORMATION, 'Ricerca del testo')
    
    def MsgBox(prompt="", buttons=MB_ICONINFORMATION, title=""):  # Ricerca del testo
        pass

    Quando eseguite delle macro in Python lo standard output non è disponibile. La pagina dell'Aiuto in linea Input/Output su schermo illustra delle alternative.

    File ODT di prova con la macro

    Note