Parseador de Blockquotes en Markdown - Freecodecamp #129 Daily Challenge

2 min

Markdown Blockquote Parser

Enunciado

Dado un string que contiene un bloque de cita en formato Markdown, devuelve su equivalente en HTML.

Reglas del blockquote en Markdown:

  • Puede comenzar con cero o más espacios
  • Luego un símbolo mayor que (>)
  • Uno o más espacios
  • El texto de la cita

El resultado debe envolver el texto en <blockquote>...</blockquote>.

Ejemplo:

Entrada: > this is a quote Salida: <blockquote>this is a quote</blockquote>

Análisis y Casos de Prueba

¿Qué buscamos? Detectar y convertir líneas de blockquote Markdown a HTML, respetando los espacios y el formato.

Casos de prueba clave:

EntradaSalida esperada
”> Esto es una cita”<blockquote>Esto es una cita</blockquote>
” > Cita con espacios iniciales”<blockquote>Cita con espacios iniciales</blockquote>
”> Texto con espacios después del símbolo”<blockquote>Texto con espacios después del símbolo</blockquote>
”Esto no es una cita”Esto no es una cita
”>“<blockquote></blockquote>
"" o ” “"" o " " (sin blockquote)

Solución y Explicación

Estrategia

Usamos una expresión regular para identificar líneas de blockquote, permitiendo espacios antes y después del símbolo >. Si hay match, extraemos el texto y lo envolvemos en <blockquote>. Si no, devolvemos la línea original.

Código JavaScript

// Devuelve el HTML de un blockquote Markdown (una sola línea)
function parseBlockquote(markdown) {
  const blockquoteRegex = /^\s*>+\s*(.*)$/
  const match = markdown.match(blockquoteRegex)
  if (match) {
    return `<blockquote>${match[1].trim()}</blockquote>`
  }
  return markdown
}

Análisis de Complejidad

  • Tiempo: O(n)O(n), donde nn es la longitud de la línea (una pasada para buscar y otra para limpiar).
  • Espacio: O(n)O(n), proporcional al tamaño de la entrada y salida.

Edge Cases y Mejoras

  • ¿Y si hay varias líneas? La función original solo procesa una línea. Para textos multilínea, podemos mejorarla así:
// Procesa blockquotes en textos multilínea
function parseBlockquotesMultiline(markdown) {
  return markdown
    .split('\n')
    .map((line) => {
      const match = line.match(/^\s*>+\s*(.*)$/)
      if (match) {
        return `<blockquote>${match[1].trim()}</blockquote>`
      }
      return line
    })
    .join('\n')
}

Así, cada línea se analiza y solo las que cumplen el formato se transforman.

Aprendizajes y Reflexión

  • Las expresiones regulares son potentes para parsear formatos simples como Markdown.
  • Pensar en casos edge y entradas reales (multilínea, espacios, líneas vacías) hace la solución más robusta.
  • El patrón de “dividir, mapear, unir” es muy útil para procesar texto línea a línea.

Recursos