Hexo incluye dos librerías de resaltado de sintaxis,highlight.js y prismjs. En este tutorial mostramos como integrar los resaltados de sintaxis dentro de plantillas.
Como usar bloques de código en tus artículos
Hexo soporta dos formas de escribir un bloque de código: Tag Plugin - Code Block and Tag Plugin - Backtick Code Block:
{% codeblock [title] [lang:language] [url] [link text] [additional options] %} |
La tercera sintaxis es mediante un bloque de código enjaulado de Markdown, y Hexo lo extiende para permitir más funcionalidades. Consulta Tag Plugin Docs para encontrar las opciones disponibles.
Consejo: Hexo permite escribir artículos en cualquier formato, mientras el renderizado correspondiente esté instalado. Puede ser markdown, ejs, swig, nunjucks, pug, asciidoc, etc. Independientemente del formato usado, esas tres sintaxis de los bloques de código estarán siempre disponibles.
Configuración
versiones anteriores a v7.0.0:
# _config.yml |
v7.0.0+:
# _config.yml |
El YAML superior es la configuración por defecto de Hexo.
Deshabilitado
versiones inferiores a v7.0.0:
# _config.yml |
v7.0.0+:
# _config.yml |
Cuando highlight.enable
y prismjs.enable
son false
(en versiones inferiores a v7.0.0) o syntax_highlighter
está vacío (v7.0.0+), la salida HTML del bloque de código es controlada por el renderizador correspondiente. Por ejemplo, marked.js
(usado por hexo-renderer-marked
, el renderizador de markdown por defecto de Hexo) añadirá la clase class
del lenguaje de código en <code>
:
```yaml |
<pre> |
Cuando no se habilita ningún resaltador de sintaxis, se puede instalar un complemento de terceros como resaltador de sintaxis, o usar un resaltador de sintaxis en el navegador (p. ej. highlight.js
y prism.js
soportan igualmente su funcionamiento en el navegador).
Highlight.js
versiones anteriores a v7.0.0:
# _config.yml |
v7.0.0+:
# _config.yml |
highlight.js
está habilitado por defecto y es usado como resaltador desde el servidor en Hexo; requiere ser deshabilitado en caso de preferir ejecutar highlight.js
en lado del navegador.
“Desde el servidor” significa, que el resaltado de sintaxis es generado al ejecutar
hexo generate
ohexo server
.
auto_detect
auto_detect
es una característica de highlight.js
que detecta el lenguaje usado en el bloque de código automáticamente.
Consejo: Cuando se quiere usar el “resaltado de un sublenguaje”, habilite
auto_detect
y no indique el lenguaje cuando escriba el bloque de código.
Aviso
auto_detect
es muy exigente en recursos. No lo habilite, a no ser que realmente necesite “resaltado de sublenguaje” o prefiera no indicar el lenguaje cuando escriba bloques de código.
line_number
highlight.js
no soporta la numeración de líneas.
Hexo incluye el número de línea encapsulando la salida dentro de <figure>
y <table>
:
<figure class="highlight yaml"> |
No es el comportamiento de highlight.js
y requiere CSS personalizado para los elementos <figure>
y <table>
; algunos temas incluyen este soporte.
También puedes observar que todas las class
no incluyen el prefijo hljs-
, volveremos sobre esto más adelante.
line_threshold (+6.1.0)
Acepta un límite para solo mostrar números de línea siempre que el número de líneas del bloque de código exceda dicho límite. Por defecto es 0
.
tab_replace
Reemplaza los tabuladores dentro del bloque de código con la cadena de texto indicada. Por defecto son dos espacios.
exclude_languages (+6.1.0)
Solo encapsula con <pre><code class="lang"></code></pre>
y no renderiza todas las etiquetas (span
, y br
) dentro del contenido si hay lenguajes que soportan esta opción.
wrap
Hexo envuelve la salida dentro de <figure>
y <table>
para permitir la numeración de líneas. Se necesita deshabilitar tanto line_number
como wrap
para reverir al comportamiento de highlight.js
:
<pre><code class="yaml"> |
AvisoBecause
line_number
feature relies onwrap
, you can’t disablewrap
withline_number
enabled: If you setline_number
totrue
,wrap
will be automatically enabled.
hljs
Cuando hljs
se marca como true
, todas la salida HTML prefijará class
con hljs-
(independientemente si wrap
está habilitado o no):
<pre><code class="yaml hljs"> |
Consejo: Cuando
line_number
está desactivado confalse
,wrap
es falso yhljs
estrue
, puedes entonces usarhighlight.js
como tema directamente en tu sitio.
PrismJS
versiones inferiores a v7.0.0:
# _config.yml |
v7.0.0+:
# _config.yml |
Prismjs está deshabilitado por defecto. Debe establecer highlight.enable
a false
(versiones inferiores a v7.0.0) o indicar syntax_highlighter
como prismjs
(v7.0.0+) antes de activar prismjs.
preprocess
La versión incluida de prismjs en Hexo permite tanto el resaltado en el lado del navegador (preprocess
a false
) como en lado del servidor (preprocess
a true
).
Cuando se usa desde el servidor (estableciendo preprocess
a true
), solo necesita incluir el tema prismjs (con la hoja de estilo css) en su sitio web. Cuando se activa del lado del navegador (preprocess
debe ser false
), debe incluir la librería javascript.
Prismjs está diseñado para usarse en el navegador, por lo tanto bajo el modo preprocess
el complemento prismjs está soportado de forma limitada:
- Numeración de líneas: Solo se necesita
prism-line-numbers.css
, No es necesario incluirprism-line-numbers.js
en el sitio web. Hexo generará el marcado HTML requerido. - Mostrado de lenguajes: Hexo añadirá siempre el atributo
data-language
mientras el lenguaje se indique para el bloque de código. - Cualquier otro complemento de prism que no necesite marcado HTML especial está soportado tan bien, pero se deberá incluir el JavaScript requerido por dichos complementos.
Todos los complementos están permitidos si preprocess
se establece como false
. A continuación hay una serie de elementos a los que se debe prestar atención:
- Numeración de líneas: Hexo no generará el marcado HTML requerido cuando
preprocess
se desactiva confalse
. Se require tantoprism-line-numbers.css
comoprism-line-numbers.js
. - Mostrar lenguajes: Hexo mostrará siempre el atributo
data-language
mientras el lenguaje del bloque de código esté incluido. - Resaltado de línea: Tanto HexoTag Plugin - Code Block como
soportan este reslatado de sintaxis (opciónmark
). Cuando se incluye la opciónmark
, Hexo generará el correspondiente marcado HTML.
line_number
Cuando las dos opciones preprocess
y line_number
se activan con true
, solo se necesita incluir prism-line-numbers.css
para permitir que la numeración de líneas funcione. Si preprocess
y line_number
son falsas, necesitarás tanto prism-line-numbers.css
como prism-line-numbers.js
.
line_threshold (+6.1.0)
Acepta un límite opcional para mostrar únicamente números de línea en caso de que el número de líneas del bloque de código supere dicho límite. Por defecto es 0
.
tab_replace
Reemplazo de \t
dentro del bloque de código con la cadena indicada. Por defecto es 2 espacios.
Más información relevante
El código fuente detrás del resaltado de sintaxis en Hexo está disponible en: