mercoledì 12 ottobre 2011

Anteprima di contenuti

In un'applicazione basata su un CMS che prevede un'anteprima del contenuto da visualizzare, è possibile utilizzare una funzione che tronca in maniera intelligente il contenuto di un campo.

Ipotizziamo di avere un repeater (strumento molto versatile e utile per avere una pubblicazione personalizzata di dati da un Data Source) che ha il compito di pubblicare solo un'anteprima del contenuto di una notizia.
La sorgente dati prevede due campi che per semplicità chiamiamo "titolo" e "contenuto".
Nel itemtemplate del repeater mettiamo le due label che si occuperanno di rendere a video il nostro contenuto dinamico.


Il codice, molto semplificato sarà:
<asp:Repeater ID="Repeater_anteprima_pagina" runat="server" DataSourceID="ADS_titolo_sezione">
  <ItemTemplate>
    <asp:Label ID="Label_titolo" runat="server" Text='<%# Eval("titolo") %>'></asp:Label>
    <asp:Label ID="Label_contenuto" runat="server" Text='<%# tronca(Eval("contenuto"),500) %>'/>
  </ItemTemplate>
</asp:Repeater>
Come si nota il testo delle due label è dinamico e viene utilizzato il metodo EVAL. Solo nella Label dedicata al contenuto il testo dinamico presenta delle differenze dall'applicazione del metodo classico.
     Text='<%# tronca(Eval("contenuto"),500) %>'
Nel code-behind vediamo cosa è strutturata questa funzione chiamata tronca.

 Function tronca(ByVal input As String, ByVal lunghezza As Integer)
        Dim output As String = input
        Dim ultimospazio As Integer


        If output.Length > lunghezza And lunghezza > 0 Then
            output = output.Substring(0, lunghezza)
            If input.Substring(output.Length, 1) = " " Then
                output = output & "...>>>"
            Else
                ultimospazio = output.LastIndexOf(" ")
                If ultimospazio = -1 Then
                    output = output & "...>>>"
                Else : output = output.Substring(0, ultimospazio) & " ... "
                End If
            End If

        End If

        Dim strOutput As String
        Dim opzioni As New Regex("<(.|\n)+?>")
        strOutput = opzioni.Replace(output, "")
        strOutput = Replace(strOutput, "<", "&lt;")
        strOutput = Replace(strOutput, ">", "&gt;")
        output = strOutput
        Return output


    End Function
Come si può notare la funzione prevede due valori in ingresso: l'input che è una stringa (il contenuto findamentalmente) e lunghezza che è il valore che è stato espresso quando è richiamata la funzione (nel nostro esempio 500).
La funzione come primo passo individua se la stringa da esaminare è più lunga della lunghezza desiderata. Se si, la stringa viene subito tagliata alla lunghezza desiderata con il metodo Substring. Successivamente, esamina se l'ultimo carattere della stringa tagliata è uno spazio. Se affermativo, agguinge la stringa "...>>>" che dà l'idea della continuazione della stringa stessa. In caso negativo, ricerca dal fondo della substringa la prima occorrenza del carattere spazio, lo indicizza e taglia nuovamente la stringa a quel valore.

Successivamente la funzione esamina la stringa in uscita per verificare la presenza di caratteri html (nel caso in cui si fosse riempito il contenuto con strumenti tipo Rich Text), li reinterpreta in modo che in video possano essere interpretati correttamente.
Tale funzione permette 2 risultati importanti:
  1. tronca il contenuto allo spazio, in modo da non interrompere la frase sul più bello
  2. reinterpreta i caratteri html in modo che la frase non si tronchi all'interno di un tag html, impedendo la giusta reinterpretazione a video.

Nessun commento:

Posta un commento