Breaking

Funciones con acceso a archivos reales, carpetas, y portapapeles.

Implementar funcionalidades con acceso a archivos reales, carpetas, y portapapeles en un entorno web requiere tecnologías específicas como File API, Clipboard API, y en algunos casos, el uso de frameworks o servidores backend si se necesitan operaciones de archivo locales o persistentes. Sin embargo, debido a limitaciones de seguridad en los navegadores modernos, ciertas acciones como abrir carpetas o guardar con ubicaciones específicas solo son posibles dentro de contextos controlados (como aplicaciones de escritorio o en entornos con permisos específicos, como aplicaciones creadas con Electron). 

 

Funciones principales y su implementación:

1. Abrir un archivo en el editor

Usamos la File API para abrir archivos.

function abrirArchivo() {
    const input = document.createElement("input");
    input.type = "file";
    input.accept = ".txt,.html,.css,.js"; // Extensiones permitidas
    input.onchange = (e) => {
        const file = e.target.files[0];
        if (file) {
            const reader = new FileReader();
            reader.onload = (event) => {
                document.getElementById("html").textContent = event.target.result;
                mostrarVista("html"); // Muestra la vista HTML
            };
            reader.readAsText(file);
        }
    };
    input.click();
}

 

2. Abrir una carpeta

Abrir carpetas directamente no es compatible con navegadores debido a restricciones de seguridad. Sin embargo, en aplicaciones como Electron, puedes usar bibliotecas como fs. Para la web, podrías simular cargando múltiples archivos:

function abrirCarpeta() {
    alert("Los navegadores no permiten abrir carpetas directamente.");
    console.log("Función no soportada en la web estándar.");
}
const { dialog } = require("electron");
const fs = require("fs");
const path = require("path");

function abrirCarpeta() {
  // Abre un cuadro de diálogo para seleccionar una carpeta
  dialog
    .showOpenDialog({
      properties: ["openDirectory"], // Permite seleccionar una carpeta
    })
    .then((result) => {
      if (!result.canceled) {
        const folderPath = result.filePaths[0];
        console.log(`Carpeta seleccionada: ${folderPath}`);

        // Leer los archivos de la carpeta
        fs.readdir(folderPath, (err, files) => {
          if (err) {
            console.error("Error al leer la carpeta:", err);
          } else {
            console.log("Archivos en la carpeta:");
            files.forEach((file) => {
              console.log(file);
            });
          }
        });
      } else {
        console.log("El usuario canceló la selección de carpeta.");
      }
    })
    .catch((err) => {
      console.error("Error al abrir el diálogo de selección de carpeta:", err);
    });
} 

 

3. Guardar contenido (Archivo actual)

Implementamos Blob para guardar contenido como archivo.

function guardar() {
    const contenido = document.getElementById("html").textContent; // Contenido de la vista actual
    const blob = new Blob([contenido], { type: "text/plain" });
    const a = document.createElement("a");
    a.href = URL.createObjectURL(blob);
    a.download = "archivo.txt"; // Nombre por defecto
    a.click();
    console.log("Archivo guardado.");
}

 

4. Guardar con nuevo nombre o ubicación

Similar a guardar, pero con la opción de modificar el nombre.

function guardarComo() {
    const nuevoNombre = prompt("Introduce el nuevo nombre del archivo", "archivo.txt");
    if (nuevoNombre) {
        const contenido = document.getElementById("html").textContent;
        const blob = new Blob([contenido], { type: "text/plain" });
        const a = document.createElement("a");
        a.href = URL.createObjectURL(blob);
        a.download = nuevoNombre;
        a.click();
        console.log(`Archivo guardado como ${nuevoNombre}`);
    }
}

 

5. Cerrar la aplicación

Esto es posible solo en entornos controlados como Electron. En un navegador, solo podemos simularlo:

function salir() {
    alert("Simulando el cierre de la aplicación...");
    window.close(); // No funciona en navegadores modernos sin permisos especiales
    console.log("Cierre simulado.");
}

Aquí tienes un ejemplo de cómo podría lucir una función salir() en una API utilizando JavaScript con NodeJs y Express: 

// Importar las dependencias necesarias
const express = require('express');
const app = express();

// Middleware para manejar JSON
app.use(express.json());

// Ruta para la función 'salir'
app.post('/salir', (req, res) => {
    // Aquí puedes manejar la lógica para cerrar sesión o desconectar al usuario
    const { usuarioId } = req.body;

    if (!usuarioId) {
        return res.status(400).json({ mensaje: 'Se requiere un ID de usuario.' });
    }

    // Lógica para cerrar sesión
    // Por ejemplo, eliminar tokens, limpiar sesiones, etc.
    console.log(`Usuario con ID ${usuarioId} ha salido.`);

    // Responder al cliente
    res.status(200).json({ mensaje: 'Usuario ha salido correctamente.' });
});

// Configurar el puerto
const PORT = 3000;
app.listen(PORT, () => {
    console.log(`Servidor ejecutándose en el puerto ${PORT}`);
});

 En este ejemplo, la ruta /salir recibe el ID de un usuario en el cuerpo de la solicitud (JSON), lo utiliza para manejar la lógica asociada con la acción de "salir" y devuelve una respuesta indicando que se completó exitosamente.

 

6. Copiar al portapapeles

Usamos Clipboard API para copiar texto.

function copiar() {
    const texto = document.getElementById("html").textContent; // Contenido a copiar
    navigator.clipboard.writeText(texto)
        .then(() => alert("Texto copiado al portapapeles."))
        .catch(() => alert("Error al copiar al portapapeles."));
}

 

7. Cortar texto

Igual que copiar, pero eliminamos el texto después.

function cortar() {
    const contenido = document.getElementById("html");
    navigator.clipboard.writeText(contenido.textContent)
        .then(() => {
            contenido.textContent = ""; // Elimina contenido
            alert("Texto cortado.");
        })
        .catch(() => alert("Error al cortar texto."));
}

 

8. Pegar desde el portapapeles

Leemos el contenido del portapapeles y lo pegamos.

function pegar() {
    navigator.clipboard.readText()
        .then((texto) => {
            const contenido = document.getElementById("html");
            contenido.textContent += texto; // Añade el texto
            alert("Texto pegado.");
        })
        .catch(() => alert("Error al pegar texto."));
}

 

9. Insertar etiquetas en el código

Podemos añadir etiquetas específicas al contenido de la vista.

function tag() {
    const contenido = document.getElementById("html");
    const etiqueta = prompt("Introduce la etiqueta a insertar (ejemplo: 
)"); if (etiqueta) { contenido.textContent += `\n${etiqueta}`; console.log(`Etiqueta ${etiqueta} insertada.`); alert(`Etiqueta ${etiqueta} agregada.`); } }

 

10. Modificar texto

Se permite reemplazar contenido.

function text() {
    const contenido = document.getElementById("html");
    const nuevoTexto = prompt("Introduce el nuevo texto para reemplazar:");
    if (nuevoTexto !== null) {
        contenido.textContent = nuevoTexto;
        console.log("Texto modificado.");
        alert("Texto reemplazado.");
    }
}

 

11. Actualizar vistas en tiempo real

Implementamos un evento para detectar cambios y actualizar.

function activarTiempoReal() {
    const contenido = document.getElementById("html");
    contenido.addEventListener("input", () => {
        console.log("Actualización en tiempo real:");
        document.querySelector(".vista.visible").textContent = contenido.textContent;
    });
    alert("Edición en tiempo real activada.");
}
 

Consideraciones:

  • Restricciones del navegador: Algunas funcionalidades avanzadas (como abrir carpetas y cerrar la aplicación) no son posibles directamente en navegadores sin APIs adicionales o entornos como Electron.
  • Seguridad: El acceso al sistema de archivos está limitado para proteger al usuario.
  • Extensibilidad: Este código puede integrarse en aplicaciones más robustas utilizando servidores o herramientas como Electron, Nodejs y Express.

Aquí tienes un ejemplo de cómo crear las funciones abrirCarpeta() y salir() en una aplicación basada en Electron: 

const { app, BrowserWindow, dialog } = require('electron');

let mainWindow;

// Crear una ventana principal
function createMainWindow() {
    mainWindow = new BrowserWindow({
        width: 800,
        height: 600,
        webPreferences: {
            nodeIntegration: true,
            contextIsolation: false,
        },
    });

    mainWindow.loadFile('index.html');
    mainWindow.on('closed', () => (mainWindow = null));
}

// Función para abrir una carpeta
function abrirCarpeta() {
    const selectedPaths = dialog.showOpenDialogSync(mainWindow, {
        properties: ['openDirectory'],
    });

    if (selectedPaths && selectedPaths.length > 0) {
        console.log('Carpeta seleccionada:', selectedPaths[0]);
        // Aquí puedes enviar el camino al renderer o manejarlo en el backend
        return selectedPaths[0];
    } else {
        console.log('No se seleccionó ninguna carpeta.');
        return null;
    }
}

// Función para salir de la aplicación
function salir() {
    console.log('Saliendo de la aplicación...');
    app.quit();
}

// Evento listo para crear la ventana principal
app.whenReady().then(() => {
    createMainWindow();

    app.on('activate', () => {
        if (BrowserWindow.getAllWindows().length === 0) {
            createMainWindow();
        }
    });
});

// Evento de salida
app.on('window-all-closed', () => {
    if (process.platform !== 'darwin') {
        app.quit();
    }
});

// Exportar las funciones si es necesario
module.exports = { abrirCarpeta, salir };

 

Notas:

  • Función abrirCarpeta: Utiliza el módulo dialog de Electron para mostrar un cuadro de diálogo que permita seleccionar una carpeta. El camino de la carpeta seleccionada es registrado en la consola o puede ser utilizado en tu aplicación.
  • Función salir: Cierra la aplicación llamando a app.quit().

 

 


 

 

 

 

 

 

Publicar un comentario

Artículo Anterior Artículo Siguiente