ReText: Editor de Markdown y ReStructuredText (Características)

Actualmente para escribir ciertos artículos estoy utilizando Markdown, específicamente MultiMarkdown. Es relativamente fácil trabajar con él en un simple editor de texto. Sin embargo para probar ciertas funcionalidades de marcado recurro a un editor de Markdown en sí; concretamente, ReText.

De acuerdo a su página oficial:

ReText es un editor simple pero potente para lenguajes de marcado Markdown y reStructuredText. ReText está escrito en lenguaje Python y funciona en Linux y otras plataformas compatibles con POSIX.

¿Por qué ReText?

Ya he dado algunas de mis razones en este artículo, y si bien es cierto que existen otros editores más completos y modernos, en lo posible, prefiero la simplicidad.

 

retext-img-01

 

ReText utiliza los siguientes paquetes:

  • python-markdown — Soporte para Markdown.
  • python-docutils — Soporte para ReStructuredText.
  • python-enchant — Soporte para corrección de ortografía.

Instalación

Debian GNU/Linux y derivados:

sudo apt install retext

Fedora:

sudo dnf install retext

Arch Linux:

yaourt -S retext

Características

  • Soporta extensiones extras de Markdown.
  • Tabs.
  • Resaltado de sintaxis HTML.
  • Exporta a HTML, ODF, PDF, Google Docs.
  • Soporta generación de páginas Web.
  • Revisión de ortografía.
  • Marcado Markdown/ReStructuredText.
  • Vista previa de código HTML.

Otras características que no difieren de la mayoría de los editores:

  • Búsqueda de texto.
  • Cambio de la tipografía predeterminada.
  • Atajos para negrita/cursiva/subrayado.
  • Pantalla completa.
  • Menú desplegable con etiquetas HTML y símbolos (caracteres especiales).

 

retext-img-02

 

Este editor viene de forma predeterminada con una configuración austera, no trae incorporado todas las extensiones extras, ni plantillas de: estilos (CSS) para el área de previsualización, esquema de colores para el área de edición —en otras palabras es parco—.

Sin embargo el usuario puede aumentar sus características de acuerdo a sus exigencias convirtiéndolo en un editor bastante completo e intuitivo con unos simples pasos. Para ello debemos configurar ciertas preferencias, las cuales se encuentran en el menú: Editar –> Preferences:

Nos encontraremos con:

Comportamiento:

  • Guardar automáticamente los documentos.
  • Restaurar la geometría de la ventana.
  • Restaurar el estado de la vista preliminar.
  • Abrir enlaces externos en la ventana ReText.
  • Abrir archivos desconocidos en texto plano.
  • Markdown extensiones.

Editor:

  • Resaltado en la línea actual.
  • Mostrar números de línea.
  • Insertar espacios mediante Tab.
  • Ancho de Tabulación.
  • Mostrar margen derecho en la columna.

Interface:

  • Nombre del tema de iconos.
  • Archivo de esquema de color.
  • Archivo de estilos CSS.

 

retext-img-04

 

Como verán, en mi configuración utilizo casi todas la opciones, sin embargo, el tema que más me interesa es el de implementar más extensiones. Oficialmente Python-markdown soporta:

Nombre Extensión
Extra markdown.extensions.extra
Abbreviations markdown.extensions.abbr
Attribute Lists markdown.extensions.attr_list
Definition Lists markdown.extensions.def_list
Fenced Code Blocks markdown.extensions.fenced_code
Footnotes markdown.extensions.footnotes
Tables markdown.extensions.tables
Smart Strong markdown.extensions.smart_strong
Admonition markdown.extensions.admonition
CodeHilite markdown.extensions.codehilite
HeaderId markdown.extensions.headerid
Meta-Data markdown.extensions.meta
New Line to Break markdown.extensions.nl2br
Sane Lists markdown.extensions.sane_lists
SmartyPants markdown.extensions.smarty
Table of Contents markdown.extensions.toc
WikiLinks markdown.extensions.wikilinks

De las cuales vienen de forma predeterminada:

  • Extra
    • Abbreviations (Abreviaturas).
    • Attribute Lists (Listas de Atributo).
    • Definition Lists (Listas de Definición).
    • Fenced Code Blocks (Bloques de Código Cercados).
    • Footnotes (Notas al Pie).
    • Tables (Tablas).
    • Smart Strong (Énfasis Inteligente).

No obstante, vemos que también podremos incorporar otras extensiones bastante útiles. Particularmente incorporé algunas, con las predeterminadas ya se puede tener un editor decente.

New Line to Break (Nueva Linea para romper): Esta extensión me libró de tener que dejar “dos espacios” al final de cada línea para hacer un salto como es habitual en el Markdown de John Gruber. Ahora cada vez que ejecuto ENTER al final de la línea —sin dejar espacios— se crea automáticamente una pausa dura, y el texto continúa en la siguiente línea.

CodeHilite (Resaltado de Código): Añade resaltado de sintaxis de código para bloques de código Python Markdown estándar usando Pygments. Y aunque no es necesario en ReText colocar el identificador del lenguaje, siempre lo hago como una buena práctica.

Por ejemplo:

```python
class Person:

     # constructor or initializer
    def __init__(self, name): 
          self.name = name

     # method which returns a string
     def whoami(self):
          return "You are " + self.name
```

En este ejemplo utilicé python como identificador del lenguaje, ya que se trata de un código en python, obviamente. Pygments admite un gran número de lenguajes: Bash, C, C++, CSS, Go, Haskell, Java, Js, Perl, HTML y muchos más.

En caso de utilizar la tabulación de 4 espacios en lugar de tres o más acentos invertidos (`) para el código cercado —fenced—, se deben escribir :: y luego el identificador del lenguaje a utilizar:

    ::python
    class Person:

        # constructor or initializer
        def __init__(self, name): 
        self.name = name

 

retext-img-05

 

SmartyPants (Tipografía Inteligente): Básicamente yo la utilizo para convertir guiones  – –  y  – – –  en n-dash (–) y m-dash (—), guión corto y largo respectivamente. Esto me simplifica escribir — cada vez que lo necesito. No obstante, SmartyPants admite más conversiones, estas fueron explayadas en el artículo MultiMarkdown Sintaxis.

Table of Contents (Tabla de Contenidos): Por defecto todas las Cabeceras —Headers— tendrán un id único desde h1 hasta h6. Cuando se introduce la opción “[TOC]” en el lugar que consideremos apropiado, automáticamente creará un índice anidado con todas las Cabeceras, esto resulta muy práctico, sobre todo en artículos extensos con muchas secciones.

Otras extensiones interesantes

Adominition: Añade admoniciones del tipo rST-style a los documentos de Markdown. Una admonición es un concejo, nota, o una advertencia. La extensión Admonition utiliza la siguiente sintaxis:

!!! type "Título de la admonición"
    Cualquier número de otros elementos de Markdown con sangría.

Este es un segundo párrafo regular.

Dónde type se utilizará como nombre de la clase CSS y como título predeterminado. Por ejemplo:

!!! note
    Aquí el título se capitalizará automáticamente.

Con título personalizado:

!!! important "Título personalizado"
    No elimine las configuraciones contenidas...

El título se escribe dentro de comillas, también se pueden escribir las comillas sin contenido —en blanco— de esta forma:

!!! important "" 
    Se trata de un cuadro de advertencia sin un título.

rST sugiere los siguientes types (tipos): attention, caution, danger, error, hint, important, note, tip, warning.

HeaderId: Genera automáticamente los atributos de identificación para los elementos de encabezado h1-h6 en el documento HTML resultante. Sin embargo, esta opción está próxima a ser obsoleta. Se insta la utilización de [TOC] —Table of Contents— en su lugar, esta ofrece más características.

Meta-Data: La extensión de Meta-Data añade una sintaxis para la definición de meta-datos sobre un documento. Sigue la sintaxis del MultiMarkdown. Actualmente, esta extensión no utiliza los metadatos de cualquier manera, sino que simplemente se ofrece como un atributo Meta de una instancia de Markdown para el uso de otras extensiones o directamente por el código python.

Sane Lists: Esta extensión es bastante interesante, básicamente lo que nos permite es utilizar un lista ordenada y continuar con una lista desordenada; esto no se puede hacer con la sintaxis original de Markdown. Por ejemplo:

1. Item ordenado 1
2. Item ordenado 2

*  Item desornedado 1
*  Item desornenado 2

producirá la salida:

<ol>
  <li>Item ordenado 1</li>
  <li>Item ordenado 2</li>
</ol>

<ul>
  <li>Item desornedado 1</li>
  <li>Item desornenado 2</li>
</ul>

En el caso de Markdown, generaría una lista desordenada como comportamiento predeterminado. A diferencia del comportamiento por defecto de Markdown, si una línea en blanco no está incluida entre los elementos de la lista, los diferentes tipos de listas se ignoran por completo. Esto se corresponde con el comportamiento de párrafos.

Por ejemplo:

Un párrafo regular.
* No es un elemento de la lista.

1. Elemento de la lista ordenada.
* No es un elemento de la lista separada.

Producirá:

<p>Un párrafo regular.
* No es un elemento de la lista.</p>

<ol>
  <li>Elemento de la lista ordenada
  * No es un elemento de la lista separada.</li>
</ol>

 

retext-img-12
WikiLinks: Añade soporte para enlaces WikiLinks, cualquier palabra contenida [[entre corchetes]] se convierte en un enlace.

Mathjax: Aunque no figura en la lista de extensiones, ReText cuenta con una extensión “virtual” mathjax que permite procesar matemáticas Mathjax.

 

retext-img-06

¿Cómo incluir las extensiones?

Una vez que tengamos definidas las extensiones que deseamos incorporar a ReText, nos dirigimos al menú Editar –> Preferences y en la caja de entrada se nos pide que introduzcamos las extensiones separadas por “coma”. Algo a tener en cuenta es que debemos utilizar la extensión en sí, no el nombre completo. Por ejemplo en el caso de: markdown.extensions.codehilite debemos utilizar codehilite

También es posible incluirlas directamente en el archivo de configuración de extensiones —utiliza tu editor favorito—:

vim ~/.config/markdown-extensions.txt

Mi archivo de configuración contendría: codehilite, mathjax, nl2br, sane_lists, smarty, toc. En la siguiente imagen utilizo la interfaz gráfica para introducir mis extensiones:

 

retext-img-07

Personalizar Interface

En ReTex no trae la opción de escoger determinados temas de estilos como en muchos editores en este campo, dónde traen una gama de estilos CSS, como colores claros/oscuros, estilo GitHub y otros.

En nuestro caso debemos crear o descargar dichos temas por nuestra cuenta y luego importarlos desde el menú Editar –> Preferences y en Stylesheet file: clic en botón (none) —o Tabular si no usamos el mouse— para desplegar el selector de archivos y buscamos nuestro tema guardado.

Otra manera de hacerlo es editando el archivo de configuración de ReTex, en mi caso —Debian Mate Desktop— se encuentra en ~/.config/ReText project/ReText.conf y agregamos la ubicación de nuestro archivo de estilo en la línea styleSheet —debe ser una ruta absoluta—.

Todas las opciones del editor se pueden configurar en el archivo ReText.conf, sin embargo hay opciones como: previewState, recentFileList y windowGeometry, que nunca deben configurarse manualmente, aunque —en mi opinión— lo mejor es usar el modo gráfico para todos los ajustes.

Ejemplo:

vim ~/.config/ReText project/ReText.conf 

Luego editar la línea:

styleSheet=/home/usuario/Descargas/Styles/Mi_estilo.css

Personalmente utilizo un par de estilos muy simples y agradables a la vista: doc-less.css, incluido en el paquete MultiMarkdown de Fletcher Penney, y el tema sudo.css creado por @oneohthree.

 

Algunos temas de estilos CSS —simples— que pueden ir bien en ReText:

 

Descargar estilos CSS

 

De la misma manera podemos personalizar la zona de edición, para ello debemos configurar un fichero previamente, y luego importarlo como hicimos anteriormente con el de estilo CSS, pero en este caso en el área Color scheme file:. ¿Qué contendría?, específicamente color de: etiquetas, comentarios, citas etc.

Aunque yo lo uso tal cual viene —predeterminado—, este podría ser un ejemplo de mi archivo.color:

htmltags = blue
htmlcomments = #abc
blockquotes = red

Estos son los posibles nombres de color: htmltags, htmlsymbols, htmlquotes, htmlcomments, markdownlinks, blockquotes, restdirectives, restroles.

Para deshabilitar los temas, seleccionamos nuevamente el botón para elegir Stylesheet file o Color scheme file y damos cancelar en el selector de archivos.

La mayoría de las configuraciones en Preferencias se producirán al iniciar ReText nuevamente. No he encontrado una opción de refrescar los cambios en vivo.

Exportar utilizando MultiMarkdown u otro convertidor

Si bien es cierto que ReText trabaja con python-markdown, es posible que queramos utilizar por equis razones MultiMarkdown, Pandoc, u otro para exportar nuestro documento.

Básicamente una extensión de exportación es un archivo de escritorio situado en RETEXT_PREFIX/share/retext/export-extensions. Los prefijos soportados actualmente son /usr y ~/.local, el archivo de extensión de exportación debe tener una extensión .desktop.

Esta es una estructura básica de un archivo de exportación:

[Desktop entry]
# First line is optional

Key1=Value1
Key2=Value2

...

Las claves soportadas actualmente son: Name, Name[locale], Icon, Exec, MimeType, FileFilter and DefaultExtension.

Argumentos para cadena de clave Exec:

Clave Descripción
%if Nombre de archivo de entrada (Markdown o ReST)
%html Introducir nombre del archivo HTML
%of Nombre del archivo de salida (activará un cuadro de diálogo para permitir al usuario seleccionar uno)

Voy a ejemplificar con Multimarkdown que es el que utilizo habitualmente para editar y exportar a HTML:

1. Creamos los directorios y nuestro archivo .desktop en ~/.local/share/

mkdir -p ~/.local/share/retex/export-extensions

cd ~/.local/share/retex/export-extensions

touch multimarkdown.desktop  ## Creamos el archivo .desktop

2. Editamos nuestro archivo .desktop —utiliza tu editor favorito—

vim multimarkdown.desktop

3. Mi archivo contendrá las siguientes líneas:

[Desktop Entry]
Name=Export to HTML (MultiMardown)
Name[es]=Exportar a HTML (MultiMarkdown)
Exec=/usr/local/bin/multimarkdown -o %of %if
X-ReText-FileFilter=HTML Files (*.htm *.html)
X-ReText-DefaultExtension=(*.html)

 

retext-img-14

Línea de Comandos

Aunque no veo un motivo específico, es bueno resaltar que también se puede utilizar la línea de comandos para exportar nuestros documentos:

Sintaxis:

python -m markdown [options] [args]

Ejemplos:

python -m markdown input_file.txt > output_file.html

Si no deseamos llamar al ejecutable python directamente —usando la bandera -m—, podemos utilizar un script markdown_py:

markdown_py input_file.txt > output_file.html

Más información:

python -m markdown --help

markdown_py --help
Python-Markdown utiliza markdown_py como un nombre de secuencia de comandos porque la implementación Perl ya ha tomado el nombre más evidente de markdown. Además, la configuración por defecto de Python en algunos sistemas un script denominado markdown.py causaría que falle mediante la importación en sí en lugar de la biblioteca de markdown. Por lo tanto, el guión ha sido nombrado markdown_py como un compromiso. Si prefieres un nombre diferente para la secuencia de comandos en el sistema, se sugiere que se cree un enlace simbólico a markdown_py con su nombre preferido.

Usando extensiones extras

python -m markdown -x markdown.extensions.footnotes \
-x markdown.extensions.codehilite input_file.txt > output_file.html

Dónde:

-x: Especifica las extensión que vamos a utilizar.
input_file.txt : Es nuestro documento de tipo markdown.
output_file.html: Es la salida direccionada de nuestro archivo .html

Conclusiones

Lo que se puede extrañar de este editor es la falta de sincronización de ambos paneles Editor/Preview cuando usamos el scroll, actúan de forma independiente a diferencia de la mayoría de los editores. Y aunque es algo natural para mí puede resultar incómodo para otros.

Por lo demás estoy bastante conforme con sus características y rendimiento. Te toca a ti investigar las bondades de este liviano pero potente editor y ver si se ajusta a tus exigencias.

Fuente:

http://sourceforge.net/projects/retext/
https://pythonhosted.org/Markdown/extensions/

¿Te resultó interesante? Compártelo ...



Percaff_TI99

Publicado por Percaff_TI99

http://gutl.jovenclub.cu/ » Forma parte de GUTL desde el 10 agosto, 2013. Amante de la ciencia y tecnología en general. Usuario de GNU/Linux desde hace varios años.