const color1 = "#ED225D";
const fontSize = Math.hypot(innerWidth, innerHeight) / Math.hypot(1920, 1080) * 60;
var message = "tecnologia não é neutra";
sinonimos_db = loadJSON("https://raw.githubusercontent.com/Vamoss/sinonimos-local/main/db/db_compiled.json");
createCanvas(windowWidth, windowHeight);
textAlign(CENTER, CENTER);
hiddenInput = createInput(message);
hiddenInput.addClass('hiddenInput');
hiddenInput.position(0, 0);
hiddenInput.size(innerWidth, innerHeight);
hiddenInput.input(updateWords);
var style = document.createElement('style');
font-size: ${fontSize}px;
.hiddenInput::selection {
color: rgb(255 255 100 / 40%) !important;
document.head.appendChild(style);
message = hiddenInput.value();
text("(Type to change the message)", width/2, height-fontSize);
const centerY = height / 2;
let x = (width - messageWidth) / 2;
wordsArr.forEach((word, index) => {
drawWord(word, x, centerY);
var wordSpace = textWidth(word + " ");
textSize(fontSize * 0.8);
synonymsArr[index].forEach((synonym, index2) => {
var i = Math.floor(index2 - synonymsArr[index].length / 2);
col.setAlpha(max(255 - abs(i * 50), 50))
drawWord(synonym, x, centerY + i * fontSize * 1.1, i);
function drawWord(word, x, y, index) {
[...word].forEach(char => {
var tW = textWidth(char)/2;
var y1 = y + noise(x1 / 1000 + time, yIni / 1000) * 800 - 400;
var y2 = y + noise(x2 / 1000 + time, yIni / 1000) * 800 - 400;
var angle = atan2(y2 - y1, x2 - x1);
var yy = y + noise(x / 1000 + time, yIni / 1000) * 800 - 400;
var lineAngle = index/20 * (x - xIni)/40;
rotate(angle + lineAngle);
function onMessageChanged(){
wordsArr = message.split(" ");
wordsArr.forEach(word => {
synonymsArr.push(sinonimos(word, true));
messageWidth = textWidth(message);
function removerPontuacao(texto) {
const regex = /[!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~]|[\u00C0-\u00FF]/g;
return texto.replace(regex, '');
function sinonimos(palavra, buscarVariantes = false) {
palavra = palavra.toLocaleLowerCase();
palavra = removerPontuacao(palavra);
var index = sinonimos_db.palavras.indexOf(palavra);
if(index == -1 && buscarVariantes){
index = sinonimos_db.palavras.indexOf(masculiniza(palavra));
index = sinonimos_db.palavras.indexOf(singulariza(palavra));
index = sinonimos_db.palavras.indexOf(singulariza(masculiniza(palavra)));
return sinonimos_db.sinonimos[index].map(i => sinonimos_db.palavras[i]);
function singulariza(palavra) {
if(palavra.slice(-2)=="ns"){
return palavra.substring(0, l-2) + "m";
}else if(palavra.slice(-3)=="ões"){
return palavra.substring(0, l-3) + "ão";
}else if(palavra.slice(-2)=="es"){
return palavra.substring(0, l-2);
}else if(palavra.slice(-3)=="eis"){
return palavra.substring(0, l-3) + "il";
}else if(palavra.slice(-3)=="ais"){
return palavra.substring(0, l-3) + "al";
}else if(palavra.slice(-3)=="óis"){
return palavra.substring(0, l-3) + "ol";
}else if(palavra.slice(-2)=="is"){
return palavra.substring(0, l-1) + "l";
}else if(palavra.slice(-1)=="s"){
return palavra.substring(0, l-1);
function masculiniza(palavra) {
if(palavra.slice(-3)=="tra"){
return palavra.substring(0, l-1) + "o";
}else if(palavra.slice(-2)=="ra"){
return palavra.substring(0, l-1);
}else if(palavra.slice(-1)=="a"){
return palavra.substring(0, l-1) + "o";
}else if(palavra.slice(-2)=="as"){
return palavra.substring(0, l-2) + "os";