Desarrollo de funcionalidades

← Acerca del dise帽o del sitio Apuntes Jekyll →
Tabla de contenido 馃搫

Funcionalidades

Ahora voy a explicar en parte como desarroll茅 algunas funcionalidades para los bloques de c贸digo que muestra el siguiente dise帽o:

img - bloques de c贸digo

Algo importante es entender como vamos a desarrolar la funcionalidad para que sea sencillo de reutilizar. En Jekyll tenemos archivos Markdown para escribir p谩ginas con un formato agradable y tambi茅n jekyll tiene los includes que es una forma efectiva de reutilizar bloques de c贸digo y contenido en diferentes partes de nuestro sitio web. En resumen la sintaxis que quiero lograr es parecido a lo siguiente:

random-post.md
1
2
3
4
5
{% include codeHeader.html %}
```js
const myvar = "hello world";
console.log(myvar);
```

Copiar al portapapeles

Paso 1: Crear el archivo include

Primero, necesitamos crear un archivo include que contendr谩 el fragmento de HTML para la cabecera o parte superior de los bloques de c贸digo. Para creamos el archivo codeHeader.html en la carpeta de los includes:

  • 1
    
    touch _includes/codeHeader.html
    
  • 1
    
    type null > _includes/codeHeader.html
    

Vamos a empezar por el bot贸n para copiar al portapapeles. Para ello a帽adimos el siguiente fragmento al archivo:

codeHeader.html
<div class="code-header">
	<button onclick="copyCode(this)">
		<i class="fa-regular fa-clipboard"></i>
	</button>
</div>

Como estoy enfocado en desarrollar la funcionalidad, no voy a extender este art铆culo en cuanto a los estilos, eso quiz谩s lo comente en otro momento. Por ahora lo importante es entender que tenemos un bot贸n que llama o mejor dicho invoca a la funci贸n copyCode(this) y esto es importante ya que vamos a estar programando esta funci贸n en javascript en otro archivo (esto es algo personal, ya que se podr铆a escribir el c贸digo de javascript en el mismo include entre etiquetas script).

Paso 2: Crear un archivo js

En otro archivo que voy a llamar copyClipboard.js que podemos crear dentro de la carpeta assets en el proyecto:

  • 1
    
    touch assets/copyClipboard.js
    
  • 1
    
    type null > assets/copyClipboard.js
    

no olvidar incluir este script en el layout principal. Ej:
<script src="/fullstack-python/copyClipboard.js"></script>

Ahora, antes de continuar con ense帽ar el c贸digo, vamos a ver como se renderiza en el navegador cuando escribimos una p谩gina y usamos el include:

  • <div class="code-header">
    	<button onclick="copyCode(this)">
    		<i class="fa-regular fa-clipboard"></i>
    	</button>
    </div>
    <div class="highlight">
    	<pre class="highlight">
    		<code>
    			...
    		</code>
    	</pre>
    </div>
    
  • random-post.md
    1
    2
    3
    4
    5
    
    {% include codeHeader.html %}
    ```js
    const myvar = "hello world";
    console.log(myvar);
    ```
    

Como podemos observar, todos los elementos que corresponden al bloque de c贸digo, se generan a la misma altura que nuestro fragmento del include, lo que significa que para seleccionar a ese elemento hermano, podemos utilizar las propiedades del DOM en javascript para acceder a los elementos relacionados.

Entonces escribamos la funci贸n para copiar al portapapeles:

assets/clipBoard.js
1
2
3
4
5
6
function copyCode(e) {
	const parent = e.parentElement;
	const code = parent.nextElementSibling.textContent;
	window.navigator.clipboard.writeText(code.trim());
	alert("Copiado!");
}

Paso 3: Resumen

  • parentNode: Para acceder al elemento padre.
  • nextElementSibling: Para obtener el siguiente hermano.
  • previousElementSibling: Para obtener el hermano anterior.
  • querySelector: Para seleccionar hermanos espec铆ficos utilizando selectores CSS.

Ejemplo parentNode:

1
2
3
4
5
6
7
8
9
10
11
<div id="contenedor">
    <p id="parrafo1">Soy el primer p谩rrafo.</p>
    <p id="parrafo2">Soy el segundo p谩rrafo.</p>
    <p id="parrafo3">Soy el tercer p谩rrafo.</p>
</div>

<script>
    const parrafo2 = document.getElementById('parrafo2');
    const padre = parrafo2.parentNode // Obtiene al padre (#contenedor)
    console.log(padre)
</script>

Ejemplo nextElementSibling:

1
2
3
4
5
6
7
8
9
10
11
<div>
    <p id="parrafo1">Soy el primer p谩rrafo.</p>
    <p id="parrafo2">Soy el segundo p谩rrafo.</p>
</div>

<script>
    const primerParrafo = document.getElementById('parrafo1');
    const segundoParrafo = primerParrafo.nextElementSibling; // Selecciona el siguiente hermano

    console.log(segundoParrafo.textContent); // Imprime: "Soy el segundo p谩rrafo."
</script>

Desglose del C贸digo de copyCliboard

  1. window.navigator:
    • window es el objeto global en un entorno de navegador que representa la ventana del navegador.
    • navigator es una propiedad del objeto window que proporciona informaci贸n sobre el navegador y su configuraci贸n.
  2. clipboard:
    • clipboard es una propiedad del objeto navigator que permite interactuar con el portapapeles del sistema. Esta API permite leer y escribir datos en el portapapeles de manera program谩tica.
  3. writeText():
    • writeText() es un m茅todo de la API del portapapeles que permite escribir texto en el portapapeles. Acepta un argumento: una cadena de texto que se desea copiar.
  4. code.trim():
    • code es la variable que contiene el texto a copiar.
    • trim() es un m茅todo de cadena en JavaScript que elimina los espacios en blanco al principio y al final de la cadena.

Paso 4: resultado demo

See the Pen copy-clipboard by EniDev911 (@EniDev911) on CodePen.



← Acerca del dise帽o del sitio Apuntes Jekyll →