Tutorial básico de quickjs.
Qué es:
Quickjs es un entorno de ejecución (motor) de javascript que cumple en gran medida con el estandar de javascript.
Sirve para interpretar, ejecutar o compilar codigo javascript.
Cómo se compara a Node.js y a Chrome:
Quickjs es mucho más pequeño que node o v8. Se ejecuta de forma rápida sin esperar al cargar scripts y ocupa poco espacio, lo que lo hace ideal para crear pequeños scripts y utilidades para la consola de comandos de Linux, Windows o Termux.
Como se instala:
Puedes descargarlo de su página oficial, de github y compilarlo o utilizando apt-get install quickjs
A parte del javascript estandar que más trae:
Trae 2 librerías preinstaladas que podemos importar. std y os.
La librería std trae varias funciones del lenguaje de C y la librería os trae hilos, funciones para abrir procesos, y varias utilidades.
Al lio:
holaMundo.js
console.log("Hola mundo");
Puedes ejecutarlo con el comando qjs holaMundo.js
También puedes compilarlo con qjsc -o holaMundo holaMundo.js
correrCualquierComando.js
import * as std from "std";
let run = comando => {
let prog = std.popen(comando, "r");
let r, msg = "";
while ((r = prog.getline()) != null) {
msg += r + "\n";
}
return msg;
}
console.log( run("ls") );
console.log( run("ls && pwd") );
generadorDeArchivos.js
import * as std from "std";
console.log(`Generador de archivos 2021
Genera el esqueleto de archivos para no tener que escribir a mano partes recurrentes de archivos comunes.
1. Proyecto HTML
2. Reporte de Seguridad
Selecciona el número correspondiente a la opción que deseas.`);
let opcionUsuario = +std.in.getline();
if (opcionUsuario === 1) {
let fd = std.open("index.html", "w");
fd.puts(`<!DOCTYPE html>
<html lang="en">
<head prefix="og:http://ogp.me/ns#">
<meta charset="utf-8">
<link rel="icon" href="data:;base64,iVBORw0KGgo=">
<title>Index.html</title>
<!--
<meta property="og:type" content="website">
-->
<link rel="stylesheet" href="./code.css">
<meta name="theme-color" content="#ffffff">
</head>
<body>
<script src="./main.js"></script>
</body>
</html>`);
fd.close();
fd = std.open("main.js", "w");
fd.close();
fd = std.open("code.css", "w");
fd.puts(`body {
margin: 0 0 0 0; /* Remove ugly left side border */
text-size-adjust: none; /* Fix Android Big Text */
text-rendering: optimizeLegibility; /* Improve text */
}
/* Media query */
@media (min-width: 0px) and (orientation:landscape) {
body {
font-size: 1.1vw;
}
}`);
fd.close();
} else if (opcionUsuario === 2) {
console.log("Esta opción se programará en el futuro");
}
scraper.js
import * as std from "std";
let run = comando => {
let prog = std.popen(comando, "r");
let r, msg = "";
while ((r = prog.getline()) != null) {
msg += r + "\n";
}
return msg;
}
let getTargetAndSelector = () => {
let returnValues = {};
for(let i in scriptArgs) {
if (scriptArgs[i] == "-t" || scriptArgs[i] == "--target") {
returnValues.target = scriptArgs[+i+1];
} else if (scriptArgs[i] == "-s" || scriptArgs[i] == "--selector") {
returnValues.selector = scriptArgs[+i+1];
}
}
if (returnValues.target && returnValues.selector) {
return [returnValues.target, returnValues.selector];
} else {
throw `Usage:
-t --target Url to download
-s --selector Selector to use
Example: qjs scraper.js -t https://example.com -s h1`;
}
}
let result = run(`curl ${getTargetAndSelector()[0]} -A "Mozilla/5.0" --silent | pup ${getTargetAndSelector()[1]}`);
console.log(result);
Puedes compilarlos y meterlos en bin y darle permisos para usarlos como cualquier otro comando sin necesidad de estar en la misma carpeta que el código.
qjsc -o scraper scraper.js && cp scraper ~/../usr/bin/ && chmod +775 ~/../usr/bin/scraper
scraper -t https://example.com -s a
Documentación Official Quickjs: https://bellard.org/quickjs/quickjs.html
Documentación Herramienta Pup para usar selectores en la linea de comandos: https://github.com/ericchiang/pup
Pedir un solo CARÁCTER ALFANUMERICO (a-z, 1..9, ¿+¿/ etc) mediante una función. por favor
Cita de: open_18 en 8 Noviembre 2021, 22:28 PM
Pedir un solo CARÁCTER ALFANUMERICO (a-z, 1..9, ¿+¿/ etc) mediante una función. por favor
import * as std from "std"; // importa libreria std para manejo de archivos en quickjs
const pedirUnSoloCaracter = texto => { // funcion para pedir un caracter
console.log(texto); // texto a mostrar al usuario solicitando el caracter
const fd = std.open("/dev/stdout", "r") // abre el archivo de salida estandar en modo lectura
const linea = fd.getline(); // lee toda la linea
fd.close(); // cierra el archivo
if (linea.length > 1) { // La linea contiene mas de un caracter
throw new Error("Mas de un caracter");
} else if (! /[a-zA-Z0-9]/.test(linea) ) { // alfanumerico
if (linea === "ñ" || linea === "ç") { // maneja caracteres extra que no contempla la expresión regular a-zA-Z
return linea;
}
// else implicito { // si no es alfanumerico o alguno de los caracteres manejados, tira el error
throw new Error("El caracter no es una letra o un numero");
} else {
// retorna el caracter
return linea;
}
}
/* Instrucciones del programa */
try { // meneja las excepciones
const caracter = pedirUnSoloCaracter("Introduce un caracter"); // pide un caracter
console.log("El caracter introducido es " + caracter); // muestra el caracter si no hubo errores
} catch (err) { // captura posibles errores
console.log(err); // muestra el error.
}