---
name: html_to_markdown
kind: function
lang: go
domain: core
version: "1.0.0"
purity: pure
signature: "func HtmlToMarkdown(html string) string"
description: "Convierte HTML a markdown legible. Parser recursivo del DOM via golang.org/x/net/html. MVP best-effort: soporta headings, parrafos, links, strong/em, code, pre, listas, blockquote, img, br, hr. Skippea script/style/noscript y sus descendientes. Texto plano con whitespace colapsado. Entidades HTML decodificadas."
tags: [html, markdown, converter, parsing, text, core, pendiente-usar]
params:
  - name: html
    desc: "String HTML completo o fragmento a convertir. Puede incluir doctype, head y body, o ser solo un fragmento de markup."
output: "Markdown legible derivado del HTML, mejor esfuerzo. Headings ATX, links en formato [text](href), listas con - o 1., bloques de codigo con backticks. Multiples lineas en blanco colapsadas a una. Nunca retorna error."
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: ""
imports:
  - "golang.org/x/net/html"
  - "golang.org/x/net/html/atom"
tested: true
tests:
  - "h1 heading"
  - "h2 heading"
  - "h3 heading"
  - "h4 heading"
  - "h5 heading"
  - "h6 heading"
  - "paragraph"
  - "link"
  - "link with no text falls back to href"
  - "strong"
  - "b tag"
  - "em"
  - "i tag"
  - "code inline"
  - "pre block"
  - "pre block preserves content"
  - "unordered list"
  - "unordered list second item"
  - "ordered list"
  - "ordered list second item"
  - "br becomes newline"
  - "hr becomes dashes"
  - "img with alt and src"
  - "img with empty alt"
  - "blockquote"
  - "script tag skipped"
  - "script content not in output"
  - "style tag skipped"
  - "noscript skipped"
  - "div wrapping does not add markup"
  - "html entities decoded"
  - "multiple blank lines collapsed"
  - "nested strong inside link"
  - "html comment skipped"
test_file_path: "functions/core/html_to_markdown_test.go"
file_path: "functions/core/html_to_markdown.go"
---

## Ejemplo

```go
md := HtmlToMarkdown(`<h1>Title</h1><p>Hello <strong>world</strong>.</p><a href="/path">link</a>`)
// md = "# Title\n\nHello **world**.\n\n[link](/path)"
```

## Notas

Funcion pura sin efectos secundarios. No extrae el "articulo principal" como hace el Python
con readabilipy/readability — convierte el HTML completo tal como llega. Para el caso de
uso del enricher fetch_webpage esto es suficiente: el HTML ya fue descargado por el caller.

Elementos soportados (por prioridad):
- h1..h6 → # .. ######
- p → parrafo con linea en blanco antes y despues
- a href → [text](href)
- strong/b → **text**
- em/i → *text*
- code (inline) → `text`
- pre → bloque con fences
- ul/ol/li → listas con - o 1.
- br → newline
- hr → ---
- img alt src → ![alt](src) (tambien lee data-src como fallback)
- blockquote → > text (prefija cada linea)

Skipped (arbol completo ignorado): script, style, noscript.
Comentarios HTML: ignorados.
Todo lo demas (div, span, section, article, etc.): emite texto descendiente sin marcado.
