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

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

Other languages:
English • ‎français • ‎italiano

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