---
name: render_markdown_table
kind: function
lang: py
domain: core
version: "1.0.0"
purity: pure
signature: "def render_markdown_table(rows: list, columns: list = None, max_rows: int = 0) -> str"
description: "Renderiza una lista de diccionarios como tabla Markdown GitHub-flavored. Resuelve columnas desde las claves del primer dict o desde un orden explicito, normaliza None/bool, escapa pipes, convierte saltos de linea a <br> y permite truncar filas."
tags: [markdown, table, render, obsidian]
uses_functions: []
uses_types: []
returns: []
returns_optional: false
error_type: ""
imports: []
params:
  - name: rows
    desc: "lista de diccionarios, uno por fila; cada dict mapea nombre de columna a valor de celda"
  - name: columns
    desc: "orden explicito de columnas; si None usa las claves del primer dict preservando orden de insercion; con rows vacio y None devuelve string vacio"
  - name: max_rows
    desc: "numero maximo de filas a renderizar; 0 = todas; si N>0 y hay mas de N filas trunca a N y anade una linea final '_... N de M filas_' fuera de la tabla"
output: "string con la tabla Markdown (header + separador |---| + filas); string vacio cuando no hay filas ni columnas explicitas"
tested: true
tests: ["caso normal", "rows vacio", "rows vacio con columns", "columns explicitas ordenan", "escape de pipes", "none bool y saltos de linea", "max rows truncado", "max rows sin truncar"]
test_file_path: "python/functions/core/render_markdown_table_test.py"
file_path: "python/functions/core/render_markdown_table.py"
---

## Ejemplo

```python
rows = [
    {"nombre": "Alice", "edad": 30, "activo": True},
    {"nombre": "Bob", "edad": 25, "activo": False},
]
md = render_markdown_table(rows)
# | nombre | edad | activo |
# |---|---|---|
# | Alice | 30 | true |
# | Bob | 25 | false |

# Con columnas explicitas y truncado:
muchas = [{"n": i} for i in range(100)]
md2 = render_markdown_table(muchas, columns=["n"], max_rows=10)
# Renderiza solo 10 filas y termina con: _... 10 de 100 filas_
```

## Cuando usarla

Cuando tengas una lista de registros (`list[dict]`) y quieras volcarla a una tabla Markdown lista para Obsidian, un README o un comentario de PR. Util para resumir consultas o datasets en notas: pasa `columns` para fijar el orden y `max_rows` para no saturar la nota con cientos de filas.
