TOC de Markdown en Ruby
Un script completo: parsear los encabezados y emitir un índice anidado.
#!/usr/bin/env ruby
# Construye una tabla de contenidos anidada a partir de encabezados markdown.
DOC = <<~MARKDOWN
# Getting started
## Install
## First run
# Concepts
## Tours and sets
### Stars
# FAQ
MARKDOWN
entries = DOC.lines.filter_map do |line|
next unless line =~ /\A(#+)\s+(.+)/
depth = Regexp.last_match(1).length
title = Regexp.last_match(2).strip
slug = title.downcase.gsub(/[^a-z0-9]+/, "-")
[depth, title, slug]
end
entries.each do |depth, title, slug|
puts "#{" " * (depth - 1)}- [#{title}](##{slug})"
end
puts "#{entries.length} headings"
Cómo funciona
filter_mapconserva solo las líneas que coinciden con la regexp de encabezados.Regexp.last_matchextrae la profundidad y el título.gsubconvierte los títulos en slugs; la sangría viene de la profundidad del encabezado.
Palabras clave y builtins usados aquí
doendnextputsunless
El intento, en números
- Líneas
- 26
- Caracteres a escribir
- 560
- Tokens
- 125
- Ritmo de tres estrellas
- 75 tpm
Al ritmo de tres estrellas de 75 tokens por minuto, este intento toma unos 100 segundos.
Paso 2 de 2 en Bis; paso 29 de 29 en Fundamentos del lenguaje.