{"id":3154,"date":"2019-12-07T11:19:35","date_gmt":"2019-12-07T10:19:35","guid":{"rendered":"https:\/\/esferas.org\/msqlu\/?p=3154"},"modified":"2019-12-08T09:58:43","modified_gmt":"2019-12-08T08:58:43","slug":"pandoc-y-sus-capacidades","status":"publish","type":"post","link":"https:\/\/esferas.org\/msqlu\/2019\/12\/07\/pandoc-y-sus-capacidades\/","title":{"rendered":"pandoc y sus capacidades"},"content":{"rendered":"<div class='__iawmlf-post-loop-links' style='display:none;' data-iawmlf-post-links='[{&quot;id&quot;:483,&quot;href&quot;:&quot;https:\\\/\\\/manpages.debian.org\\\/buster\\\/equivs\\\/equivs-build.1.en.html&quot;,&quot;archived_href&quot;:&quot;https:\\\/\\\/web-wp.archive.org\\\/web\\\/20260415125807\\\/https:\\\/\\\/manpages.debian.org\\\/buster\\\/equivs\\\/equivs-build.1.en.html&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-04-19 04:39:48&quot;,&quot;http_code&quot;:200}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-19 04:39:48&quot;,&quot;http_code&quot;:200},&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:484,&quot;href&quot;:&quot;https:\\\/\\\/puppet.com\\\/docs&quot;,&quot;archived_href&quot;:&quot;https:\\\/\\\/web-wp.archive.org\\\/web\\\/20240418043420\\\/https:\\\/\\\/www.puppet.com\\\/docs\\\/&quot;,&quot;redirect_href&quot;:&quot;https:\\\/\\\/www.puppet.com\\\/docs&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-04-19 04:39:48&quot;,&quot;http_code&quot;:206}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-19 04:39:48&quot;,&quot;http_code&quot;:206},&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:485,&quot;href&quot;:&quot;https:\\\/\\\/docs.ansible.com&quot;,&quot;archived_href&quot;:&quot;&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[],&quot;broken&quot;:false,&quot;last_checked&quot;:null,&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:486,&quot;href&quot;:&quot;https:\\\/\\\/pandoc.org\\\/MANUAL.html#pandocs-markdown&quot;,&quot;archived_href&quot;:&quot;https:\\\/\\\/web-wp.archive.org\\\/web\\\/20260415125833\\\/https:\\\/\\\/pandoc.org\\\/MANUAL.html&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-04-19 04:39:48&quot;,&quot;http_code&quot;:200}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-19 04:39:48&quot;,&quot;http_code&quot;:200},&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:487,&quot;href&quot;:&quot;https:\\\/\\\/pandoc.org\\\/MANUAL.html&quot;,&quot;archived_href&quot;:&quot;https:\\\/\\\/web-wp.archive.org\\\/web\\\/20260415125833\\\/https:\\\/\\\/pandoc.org\\\/MANUAL.html&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-04-19 04:39:49&quot;,&quot;http_code&quot;:206}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-19 04:39:49&quot;,&quot;http_code&quot;:206},&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:488,&quot;href&quot;:&quot;https:\\\/\\\/www.w3schools.com\\\/tags\\\/tag_a.asp&quot;,&quot;archived_href&quot;:&quot;https:\\\/\\\/web-wp.archive.org\\\/web\\\/20260415125846\\\/https:\\\/\\\/www.w3schools.com\\\/tags\\\/tag_a.asp&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-04-19 04:39:50&quot;,&quot;http_code&quot;:200}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-19 04:39:50&quot;,&quot;http_code&quot;:200},&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:258,&quot;href&quot;:&quot;https:\\\/\\\/pandoc.org\\\/MANUAL.html#metadata-blocks&quot;,&quot;archived_href&quot;:&quot;https:\\\/\\\/web-wp.archive.org\\\/web\\\/20260415112852\\\/https:\\\/\\\/pandoc.org\\\/MANUAL.html&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[{&quot;date&quot;:&quot;2026-04-19 04:39:48&quot;,&quot;http_code&quot;:200}],&quot;broken&quot;:false,&quot;last_checked&quot;:{&quot;date&quot;:&quot;2026-04-19 04:39:48&quot;,&quot;http_code&quot;:200},&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:489,&quot;href&quot;:&quot;https:\\\/\\\/pandoc.org\\\/MANUAL.html#extension-link_attributes&quot;,&quot;archived_href&quot;:&quot;https:\\\/\\\/web-wp.archive.org\\\/web\\\/20260415125833\\\/https:\\\/\\\/pandoc.org\\\/MANUAL.html&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[],&quot;broken&quot;:false,&quot;last_checked&quot;:null,&quot;process&quot;:&quot;done&quot;},{&quot;id&quot;:490,&quot;href&quot;:&quot;https:\\\/\\\/pandoc.org\\\/MANUAL.html#default-files&quot;,&quot;archived_href&quot;:&quot;https:\\\/\\\/web-wp.archive.org\\\/web\\\/20260415125833\\\/https:\\\/\\\/pandoc.org\\\/MANUAL.html&quot;,&quot;redirect_href&quot;:&quot;&quot;,&quot;checks&quot;:[],&quot;broken&quot;:false,&quot;last_checked&quot;:null,&quot;process&quot;:&quot;done&quot;}]'><\/div>\n<p>Resulta que acostumbro a crear p\u00e1ginas web de aterrizaje en servidores que llamo administrativos porque no tienen en su p\u00e1gina principal un prop\u00f3sito concreto como un blog o un wiki, pero si disponen de aplicaciones web en URL internos como estad\u00edsticas web y herramientas administrativas para gestionar bases de datos o directorios LDAP o, incluso, un monitorizador de recursos.<\/p>\n\n\n\n<!--more-->\n\n\n\n<p>Todos ellos son accesibles directamente desde fuera pero a m\u00ed me gusta saber qu\u00e9 tengo instalado y mantenido en una \u00fanica p\u00e1gina. <\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2019\/12\/imagen.png\" alt=\"\" class=\"wp-image-3156\" width=\"283\" height=\"456\" srcset=\"https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2019\/12\/imagen.png 429w, https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2019\/12\/imagen-186x300.png 186w\" sizes=\"auto, (max-width: 283px) 100vw, 283px\" \/><\/figure><\/div>\n\n\n\n<p>De esta forma puedo proteger todos los acceso en un \u00fanico punto con el servidor web empleando el m\u00f3dulo de autorizaciones normalizado y si a eso le a\u00f1ado una conexi\u00f3n segura forzada m\u00e1s o menos queda listo para enfrentarse al mundo. Hay otras medidas, pero ya no tienen que ver con lo que quiero contar aqu\u00ed. <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;VirtualHost *:443>\n        ServerName  tlp.zeine.es\n        ServerAlias tlp\n        ServerAdmin admin@eine.es\n\n        DocumentRoot \/var\/www\/html\/tlp.zeine.es\n        &lt;Directory \/var\/www\/html\/tlp.zeine.es>\n                Options FollowSymLinks\n                AllowOverride None\n                Require all granted\n        &lt;\/Directory>\n\n        LogLevel warn\n        ErrorLog \/var\/log\/apache2\/tlp.zeine.es\/error.log \n        CustomLog \/var\/log\/apache2\/tlp.zeine.es\/access.log combined\n\n        Include \/etc\/apache2\/ssl.conf\n\n        &lt;Location \/>\n                AuthType Basic\n                AuthBasicProvider ldap\n                AuthName \"Herramientas administrativas\"\n                AuthLDAPURL \"ldap:\/\/localhost\/ou=users,dc=zeine,dc=es?uid?sub?(objectClass=*)\"\n                Require valid-user\n        &lt;\/Location>\n\n        Include \/etc\/apache2\/sites-conf\/tlp.zeine.es\/*.conf\n&lt;\/VirtualHost><\/code><\/pre>\n\n\n\n<p>Indicarle a Apache que el URL ra\u00edz est\u00e1 bajo control de acceso permite quedarse tranquilo en este aspecto porque abrir un nuevo navegador e ir a una URL interior nos ense\u00f1a lo mismo que comenzar por el \u00edndice:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large is-resized\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2019\/12\/Captura-de-pantalla-2019-12-07-11-37-33.png\" alt=\"\" class=\"wp-image-3165\" width=\"537\" height=\"221\" srcset=\"https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2019\/12\/Captura-de-pantalla-2019-12-07-11-37-33.png 903w, https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2019\/12\/Captura-de-pantalla-2019-12-07-11-37-33-300x124.png 300w, https:\/\/esferas.org\/msqlu\/wp-content\/uploads\/sites\/12\/2019\/12\/Captura-de-pantalla-2019-12-07-11-37-33-768x317.png 768w\" sizes=\"auto, (max-width: 537px) 100vw, 537px\" \/><\/figure><\/div>\n\n\n\n<p>Para realizar todos estos ajustes en el servidor las empaquetado en formato <em>deb<\/em>, un paquete por cada servidor empleando herramientas como <a href=\"https:\/\/manpages.debian.org\/buster\/equivs\/equivs-build.1.en.html\">equivs<\/a>, por lo que es sencillo que sean f\u00e1ciles de integrar y respetuosas con las reglas.  <\/p>\n\n\n\n<blockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\"><p>S\u00ed, es verdad que podr\u00eda utilizar sistemas como <em><a href=\"https:\/\/puppet.com\/docs\">puppet<\/a><\/em> o <em><a href=\"https:\/\/docs.ansible.com\/\">Ansible<\/a><\/em> pero de momento estoy muy perezoso con el asunto. \u00bf Por qu\u00e9 ? Porque cualquier de los dos requiere una curva de aprendizaje para la que no tengo tiempo ahora mismo. Tambi\u00e9n que hay ciertos vaivenes de cuando en cuando con su <em>popularidad<\/em> y no termino de decidirme por uno u otro. Si no trabajase solo algo de \u00e9sto habr\u00eda adoptado ya, siempre quiero aprender cosas \u00fatiles o con posibilidades, pero as\u00ed no encuentro el impulso para ello. <\/p><\/blockquote>\n\n\n\n<p>Cuando llega el momento de crear la p\u00e1gina \u00edndice del servidor no quiero escribir a mano el c\u00f3digo HTML as\u00ed que empleo el lenguaje <a href=\"https:\/\/pandoc.org\/MANUAL.html#pandocs-markdown\">markdown<\/a> y un programa externo llamado <a href=\"https:\/\/pandoc.org\/MANUAL.html\">pandoc<\/a> que realiza toda la magia.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>![](\/images\/zeine-logo.png)\n\n### Aplicaciones administrativas\n\n* [Administraci\u00f3n de MySQL (phpmyadmin)](https:\/\/tlp.zeine.es\/mysql){target=\"\\_blank\"}\n* [Monitorizaci\u00f3n del sistema (munin)](https:\/\/tlp.zeine.es\/munin){target=\"\\_blank\"}\n\n### Estad\u00edsticas web \n\n* Servidores:\n  * [P\u00e1gina principal](https:\/\/tlp.zeine.es\/awstats\/awstats.pl?config=zeine.es){target=\"\\_blank\"}\n  * [Versi\u00f3n\n  antigua](https:\/\/tlp.zeine.es\/awstats\/awstats.pl?config=antigua.zeine.es){target=\"\\_blank\"}\n  * [Zona\nadministrativa](https:\/\/tlp.zeine.es\/awstats\/awstats.pl?config=tlp.zeine.es){target=\"\\_blank\"}\n* Aplicaciones web:\n  * [Nube bajo\nNextcloud](https:\/\/tlp.zeine.es\/awstats\/awstats.pl?config=nube.zeine.es){target=\"\\_blank\"}\n  * [Correo v\u00eda\nweb](https:\/\/tlp.zeine.es\/awstats\/awstats.pl?config=correo.zeine.es){target=\"\\_blank\"}\n  * [Listas de\ncorreo](https:\/\/tlp.zeine.es\/awstats\/awstats.pl?config=listas.zeine.es){target=\"\\_blank\"}\n<\/code><\/pre>\n\n\n\n<p>Es tan sencillo como indicarle lo siguiente:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ pandoc -f markdown -t html -o index.html index.md<\/code><\/pre>\n\n\n\n<p>Y el resultado es de lo m\u00e1s apa\u00f1ado como se ve en la imagen superior. Le faltan detalles, claro, porque la conversi\u00f3n se realiza a trav\u00e9s de complementos (integrados en el propio programa) y estos necesitan m\u00e1s informaci\u00f3n.<\/p>\n\n\n\n<p>La lista de par\u00e1metros esenciales para tener un documento HTML correcto es:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><strong>standalone<\/strong>: para a\u00f1adir el encabezado y el pi\u00e9 HTML con las directivas correctas. <\/li><li><strong>metadata<\/strong> KEY=[VAL] que define aquellos valores que queremos incluir como el t\u00edtulo (<em>title<\/em>) o el lenguaje (<em>lang<\/em>). Sirven tambi\u00e9n para emplearlos en las plantillas de conversi\u00f3n, que son otro mecanismo fant\u00e1stico pero que a\u00fan no he necesitado. <\/li><\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">Enlaces abriendo en otra ventana o pesta\u00f1a<\/h4>\n\n\n\n<p>Uno de los problemas tontos que me he encontrado con el archivo <em>index.html<\/em> resultante es que los enlaces HTML son muy b\u00e1sicos. Teniendo en cuenta que las aplicaciones que suelen abrir no tienen una forma sencilla de volver atr\u00e1s, a esta p\u00e1gina principal, y que es posible que quiera abrir varias de ellas al mismo tiempo, he pensado que si los enlaces HTML ya lo hiciesen por m\u00ed estar\u00eda genial. <\/p>\n\n\n\n<p>As\u00ed es como he descubierto que el enlace <em>markdown<\/em> en versi\u00f3n simple (entendido desde el punto de vista de <em>pandoc<\/em>) ser\u00eda:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>[Texto del enlace](https:\/\/example.com)<\/code><\/pre>\n\n\n\n<p>se me queda corto para lo que quiero. Tengo la opci\u00f3n de escribir directamente el c\u00f3digo HTML pero entonces pierde la gracia. <\/p>\n\n\n\n<p>El componente que crea el c\u00f3digo admite la siguiente construcci\u00f3n: <\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>[Texto del enlace](https:\/\/example.com){target=\"\\_blank\"}\n<\/code><\/pre>\n\n\n\n<p>para definir los atributos de la <a href=\"https:\/\/www.w3schools.com\/tags\/tag_a.asp\">etiqueta a<\/a> de html y aunque tengo que a\u00f1ad\u00edrselos a todos porque a\u00fan no s\u00e9 c\u00f3mo declararlos como predeterminados sigue siendo c\u00f3modo y r\u00e1pido. A prop\u00f3sito, el car\u00e1cter subrayado est\u00e1 escapado porque <em>markdown<\/em> lo reconoce como directiva de s\u00edntaxis.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Metadatos<\/h4>\n\n\n\n<p>Cuando tienes que pasarle un par de valores como metadatos hacerlo en la l\u00ednea de \u00f3rdenes es sencillo a pesar de que algunos como el t\u00edtulo pueden ser largos. Pero si empiezan a crecer es mejor utilizar el mecanismo de reconocimientos de bloques de metadatos. <\/p>\n\n\n\n<p>Empleando el formato <em>YAML<\/em> es posible a\u00f1adir esos metadatos en el propio c\u00f3digo fuente <em>markdown<\/em> de esta manera:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>---\ntitle: TITULO\nlang: es\n---\n![](\/images\/zeine-logo.png)\n\n### Aplicaciones administrativas\n\n* [Administraci\u00f3n de MySQL (phpmyadmin)](https:\/\/tlp.zeine.es\/mysql){target=\"\\_blank\"}\n* [Monitorizaci\u00f3n del sistema (munin)](https:\/\/tlp.zeine.es\/munin){target=\"\\_blank\"}\n<\/code><\/pre>\n\n\n\n<p>Por lo que el resultado empleando el par\u00e1metro <em>&#8211;standalone<\/em> est\u00e1 correctamente completo:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;!DOCTYPE html>\n&lt;html xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\" lang=\"es\" xml:lang=\"es\">\n&lt;head>\n  &lt;meta charset=\"utf-8\" \/>\n  &lt;meta name=\"generator\" content=\"pandoc\" \/>\n  &lt;meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0, user-scalable=yes\" \/>\n  &lt;title>TITULO&lt;\/title>\n  &lt;style type=\"text\/css\">\n      code{white-space: pre-wrap;}\n      span.smallcaps{font-variant: small-caps;}<\/code><\/pre>\n\n\n\n<p>Y hasta aqu\u00ed lo que he descubierto esta ma\u00f1ana de s\u00e1bado y que me va a facilitar mucho la vida ampliando esta t\u00e9cnica de un paquete por cada servidor. <\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Referencias<\/h3>\n\n\n\n<ul class=\"wp-block-list\"><li><a href=\"https:\/\/pandoc.org\/MANUAL.html#metadata-blocks\">Pandoc User\u2019s Guide: metadata block<\/a><\/li><li><a href=\"https:\/\/pandoc.org\/MANUAL.html#extension-link_attributes\">Pandoc User&#8217;s Guide: link_atributes<\/a><\/li><li><a href=\"https:\/\/pandoc.org\/MANUAL.html#default-files\">Pandoc User&#8217;s Guide: default files<\/a> <\/li><\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Resulta que acostumbro a crear p\u00e1ginas web de aterrizaje en servidores que llamo administrativos porque no tienen en su p\u00e1gina principal un prop\u00f3sito concreto como un blog o un wiki, pero si disponen de aplicaciones web en URL internos como estad\u00edsticas web y herramientas administrativas para gestionar bases de datos o directorios LDAP o, incluso, [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_import_markdown_pro_load_document_selector":0,"_import_markdown_pro_submit_text_textarea":"","webmentions_disabled_pings":false,"webmentions_disabled":false,"footnotes":""},"categories":[2],"tags":[18,734,918,919],"class_list":["post-3154","post","type-post","status-publish","format-standard","hentry","category-software","tag-administracion-de-sistemas","tag-markdown","tag-pandoc","tag-yaml"],"_links":{"self":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/3154","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/comments?post=3154"}],"version-history":[{"count":11,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/3154\/revisions"}],"predecessor-version":[{"id":3168,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/posts\/3154\/revisions\/3168"}],"wp:attachment":[{"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/media?parent=3154"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/categories?post=3154"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/esferas.org\/msqlu\/wp-json\/wp\/v2\/tags?post=3154"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}