Comunidad Gambas-es
Extendiendo la clase String - Paragraph - Versión para impresión

+- Comunidad Gambas-es (https://gambas-es.org)
+-- Foro: Gambas (https://gambas-es.org/forum-3.html)
+--- Foro: Aplicaciones/Fragmentos de Código (https://gambas-es.org/forum-8.html)
+--- Tema: Extendiendo la clase String - Paragraph (/thread-530.html)



Extendiendo la clase String - Paragraph - tincho - 12-08-2021

Hola a todos.
Aquí les propongo una función que formatea un texto en párrafos, opcionalmente se puede indicar "html5" para que agregue los tags  <p></p>.
Por favor si alguien tiene una mejor idea por favor no dude en compartirla.
Código:
'' Paragraph validation, double space NO, Space at the beginning and/or at the end NO, line breaks at the beginning and/or at the end NO etc.

Public Function Paragraph(strInput As String, Optional strMod As String) As String
 
  Dim strOut As String
  Dim strTmp As String
  Dim int As Integer
  Dim stxLines As New String[] ' List of lines as they come in txt
  Dim str As String
  Dim strCap As String
  Dim strParagraph As String
  Dim stxParagraph As New String[]
  '
  strTmp = Replace(strInput, "\n ", "\n")
  strTmp = Replace(strInput, "\n\n", "\n")
  strTmp = Replace(strInput, "\t\n", "\n")
  strTmp = Replace(strInput, "\n\t", "\n")
 
  ' Work by paragraph
  strParagraph = ""
 
  For int = 0 To stxLines.Max
    If stxLines[int] <> "" Then
      str = String.Trim(stxLines[int])
      strCap = String.Left(str)
      Select int
        Case 0
          stxParagraph.Add(str)
        Case Else
          If String.UCase(strCap) = strCap Then
            stxParagraph.Add(str)
          Else
            stxParagraph[stxParagraph.Max] = stxParagraph[stxParagraph.Max] & " " & str
          Endif
      End Select
    Endif
  Next
 
  Select String.LCase(strMod)
    Case "html", "html5"
      For int = 0 To stxParagraph.Max
        ' Proceed to validate the characters, in this case for XHTML 1.0
        strParagraph = XmlValidate(stxParagraph[int], "utf8")
        strParagraph = ReTager(strParagraph)
        If InStr(strParagraph, "<h") > 0 Then
          stxParagraph[int] = "\n" & strParagraph & "\n"
        Else
          stxParagraph[int] = "<p>" & strParagraph & "</p>"
        Endif
        
      Next
  End Select
 
  strOut = stxParagraph.Join("\n")
 
  Return strOut
 
End
Saludos.


RE: Extendiendo la clase String - Paragraph - Shordi - 12-08-2021

Esto es útil... pero yo añadiría un parámetro más con la posibilidad del comportamiento inverso. Hay textos divididos en párrafos que puede interesar "desparrafizar" Big Grin Big Grin Big Grin

Saludos


RE: Extendiendo la clase String - Paragraph - tincho - 12-08-2021

(12-08-2021, 11:26)Shordi escribió: Esto es útil... pero yo añadiría un parámetro más con la posibilidad del comportamiento inverso. Hay textos divididos en párrafos que puede interesar "desparrafizar"

Si, claro podría ser, técnicamente es posible, pero dos párrafos convertidos en uno solo? mmmm.....
Saludos.


RE: Extendiendo la clase String - Paragraph - cogier - 13-08-2021

Su programa se bloquea en la línea 19. No puedo averiguar qué es la "Toolbox". Echa un vistazo a 'asciidoctor', puede ser de interés.

[Imagen: Toolbox.png]


RE: Extendiendo la clase String - Paragraph - tincho - 14-08-2021

(13-08-2021, 16:42)cogier escribió: Su programa se bloquea en la línea 19. No puedo averiguar qué es la "Toolbox". Echa un vistazo a 'asciidoctor', puede ser de interés.

Ok, si es un método de otra clase, pero no es necesaria era solo para quitar de la lista los textos vacíos, pero lo cambiare a esta forma:
Código:
  'stxLines = Toolbox.ArrayNoVaccum(Split(strTmp, "\n"))
 
  ' Work by paragraph
  strParagraph = ""
 
  For int = 0 To stxLines.Max
    If stxLines[int] <> "" Then
      str = String.Trim(stxLines[int])
    strCap = String.Left(str)
    Select int
      Case 0
        stxParagraph.Add(str)
      Case Else
        If String.UCase(strCap) = strCap Then
          stxParagraph.Add(str)
        Else
          stxParagraph[stxParagraph.Max] = stxParagraph[stxParagraph.Max] & " " & str
        Endif
    End Select
    Endif
  Next
Saludos.