Generador de descomposición de caracteres chinos

Parámetros de visualización del carácter
Fondo:
Espere, por favor. Si la generación de la imagen tarda demasiado, recargue la página (Ctrl + R).

Esta herramienta permite generar la descomposición por trazos con flechas de un carácter chino.

Este generador de descomposición de caracteres chinos ha sido posible gracias al excelente proyecto Make me a Hanzi de Shaunak Kishore.

function updateCharacter() { document.querySelector('#target').innerHTML = ''; var char = document.querySelector('.js-char').value var size = document.querySelector('.js-size').value var couleur = document.querySelector('input[name="couleur"]:checked').value; console.log(couleur); createChar(char, size, couleur); } document.querySelector('#blanc').onclick =function (){ document.querySelector('#blanc').checked = true; document.querySelector('#noir').checked = false; console.log(document.querySelector('input[name="couleur"]:checked').value); updateCharacter() }; document.querySelector('#noir').onclick =function (){ document.querySelector('#blanc').checked = false; document.querySelector('#noir').checked = true; console.log(document.querySelector('input[name="couleur"]:checked').value); updateCharacter() }; function createChar(char, size, couleur) { fetch("https://learn-chinese.online/00/script/strokegen.php?key=jeazlkj651654fdSDDfqsf&char=" + char) .then(response => { if (!response.ok) { throw new Error('Network response was not ok'); } return response.json(); }) .then(charData => { result = JSON.parse(charData); console.log(result); var stroke = result.strokes; var median = result.medians; if(couleur == 'white'){ document.querySelector('#target').style.backgroundColor = "white"; var charFond = 'lightgray'; var charColor = 'black'; } else { document.querySelector('#target').style.backgroundColor = "black"; var charColor = 'white'; var charFond = '#4d4d4d'; } // se crean los trazos del fondo, es decir, el carácter completo en gris for(var i = 0, j = stroke.length; i'; } for(var i = 0, j = stroke.length; i 2) { coordonate2 = median[i][median[i].length - 3]; // se obtiene el antepenúltimo punto mediano para calcular el ángulo de rotación de la flecha } else { coordonate2 = median[i][median[i].length - 2]; // se obtiene el antepenúltimo punto mediano para calcular el ángulo de rotación de la flecha } coordonate2 =coordonate2.toString().split(','); var p2x = parseInt(coordonate2[0], 10); var p2y = parseInt(coordonate2[1], 10); // console.log('coordonate2 n°'+i + ' : ' + p2x +' ' +p2y); var angleDeg = Math.atan2(p1y - p2y, p1x - p2x) * 180 / Math.PI; var angleDeRotation = angleDeg -90; // para colocar la flecha en el eje var paths = paths + ''; var arrow = ''; document.getElementById('target').innerHTML += ` `+fullPaths + paths + arrow+``; } }) .catch(error => { console.error('There has been a problem with your fetch operation:', error); }); } document.querySelector('.js-char-form').addEventListener('submit', function(evt) { evt.preventDefault(); updateCharacter(); }); document.querySelector('.js-size-form').addEventListener('submit', function(evt) { evt.preventDefault(); updateCharacter(); }); window.onload = function() { updateCharacter(); } // === Captura del div #target === document.querySelector('#captureBtn').addEventListener('click', function () { const target = document.getElementById('target'); html2canvas(target, { backgroundColor: null, // conserva el color real del fondo useCORS: true, // importante si los SVG provienen de otro origen scale: 2 // mejor resolución }).then(canvas => { // Crea un enlace de descarga // Obtiene el carácter ingresado const char = document.querySelector('.js-char').value.trim() || 'caractere'; // Limpia el nombre (evita caracteres ilegales para un nombre de archivo) const safeName = char.replace(/[\\\/:*?"<>|]/g, '_'); // Crea el enlace de descarga const link = document.createElement('a'); link.download = safeName + '.png'; link.href = canvas.toDataURL('image/png'); link.click(); }).catch(error => { console.error('Error al capturar:', error); alert('La captura ha fallado. Intente recargar la página.'); }); });