2
respostas

[Projeto] Quebra de linhas e formatação do texto

Olá pessoal, boa tarde!

Estou me aventurando na criação de um código que me permita fazer algumas formatações em um arquivo da bíblia, o qual será inserido em um aplicativo específico para pessoas com deficiência visual fazerem a leitura em Braille. Para isso, separei os livros da Bíblia em arquivos .txt e salvei cada um deles em uma única pasta . O que quero fazer é:

  • criar um cabeçalho conforme o exemplo: "PAS#01-Genesis', sendo que o número e o nome serão definidos de acordo com o nome do arquivo em questão;
  • separar os versículos por linhas, pois em uma mesma linha pode conter dois ou mais versículos;
  • identificar o número de cada capítulo;
  • inserir o número do capítulo seguido por ":" à frente de cada versículo a qual pertence, como: (capítulo 01, versículo 30) 1:30;

Abaixo segue o código que estou usando mas que não tem dado resultado e também um exemplo de como está o arquivo e outro de como quero que fique.

Meu código

const fs = require('fs');
const path = require('path');

const pasta = 'C:\\Users\\Paula\\OneDrive\\Área de Trabalho\\Pastoral';

fs.readdir(pasta, (err, arquivos) => {
    if (err) throw err;

    arquivos.forEach(arquivo => {
        if (arquivo.endsWith('.txt')) {
            fs.readFile(path.join(pasta, arquivo), 'utf8', (err, conteudo) => {
                if (err) throw err;

                const sentencas = conteudo.split(''); // Divide o texto em linhas
                sentencas.forEach(sentenca => {
                    const regex = /(\d+)([a-zA-Z])/g; // Regex para encontrar números seguidos por letras
                    const matches = sentenca.match(regex);

                    if (matches) {
                        matches.forEach(match => {
                            console.log(match); // Exibe cada número seguido por letras
                        });
                    } else {
                        // Se não houver matches, imprime a sentença original
                        console.log(sentenca);
                    }
                });
            });
        }
    });
});

Como está:

GÊNESIS 1 A humanidade, ponto alto da cria­ção — 1No princípio, Deus criou o céu e a terra. 2A terra estava sem forma e vazia; as trevas cobriam o abismo e um vento impetuoso soprava sobre as águas. 3Deus disse: “Que exista a luz!” E a luz começou a existir. 4Deus viu que a luz era boa. E Deus separou a luz das trevas: 5à luz Deus chamou “dia”, e às trevas chamou “noite”. Hou­ve uma tarde e uma manhã: foi o primeiro dia. 6Deus disse: “Que exista um fir­ma­mento no meio das águas para separar águas de águas!” 7Deus fez o fir­ma­mento para separar as águas que estão acima do firma­mento das águas que estão abaixo do firma­mento. E assim se fez. 8E Deus chamou ao firmamento “céu”. Houve uma tarde e uma manhã: foi o segundo dia. 9Deus disse: “Que as águas que es­tão debaixo do céu se ajuntem num só lugar, e apareça o chão seco”. E assim se fez. 10E Deus chamou ao chão seco “terra”, e ao conjunto das águas “mar”. E Deus viu que era bom. 11Deus disse: “Que a terra produza relva, ervas que produzam semente, e árvores que deem frutos sobre a terra, frutos que contenham semente, cada uma segundo a sua es­pécie”. E assim se fez. 12E a terra pro­duziu relva, ervas que produzem semente, cada uma segundo a sua espécie, e árvores que dão fruto com a semente, cada uma segundo a sua es­pécie. E Deus viu que era bom. 13Houve uma tarde e uma manhã: foi o terceiro dia.

Como quero que fique: PAS#01-GÊNESIS 1:1 No princípio, Deus criou o céu e a terra. 1:2 A terra estava sem forma e vazia; as trevas cobriam o abismo e um vento impetuoso soprava sobre as águas. 1:3 Deus disse: “Que exista a luz!” E a luz começou a existir. 1:4 Deus viu que a luz era boa. E Deus separou a luz das trevas: 1:5 à luz Deus chamou “dia”, e às trevas chamou “noite”. Houve uma tarde e uma manhã: foi o primeiro dia. 1:6 Deus disse: “Que exista um firmamento no meio das águas para separar águas de águas!” 1:7 Deus fez o firmamento para separar as águas que estão acima do firmamento das águas que estão abaixo do firmamento. E assim se fez. 1:8 E Deus chamou ao firmamento “céu”. Houve uma tarde e uma manhã: foi o segundo dia. 1:9 Deus disse: “Que as águas que estão debaixo do céu se ajuntem num só lugar, e apareça o chão seco”. E assim se fez. 2:1 Assim foram concluídos o céu e a terra com todo o seu exército. 2:2 No sétimo dia, Deus terminou todo o seu trabalho; e no sétimo dia, ele descansou de todo o seu trabalho. 2:3 Deus então abençoou e santificou o sétimo dia, porque foi nesse dia que Deus descansou de todo o seu trabalho como criador. 2:4 Essa é a história da criação do céu e da terra. Quando Javé Deus fez a terra e o céu,

Se puderem me ajudar a encontrar o que falta, ficarei muito grata!

2 respostas

Bom dia, Paula! Tudo bem?

Que projeto incrível e significativo você está desenvolvendo! Vamos tentar ajustar o seu código para que ele atenda às suas necessidades de formatação.

Pelo que você descreveu, precisamos fazer algumas alterações no seu código para que ele consiga:

  1. Criar o cabeçalho correto para cada arquivo.
  2. Separar os versículos corretamente em linhas diferentes.
  3. Inserir o número do capítulo e o versículo no formato desejado.

Aqui está uma sugestão de como você pode modificar o seu código:

const fs = require('fs');
const path = require('path');

const pasta = 'C:\\Users\\Paula\\OneDrive\\Área de Trabalho\\Pastoral';

fs.readdir(pasta, (err, arquivos) => {
    if (err) throw err;

    arquivos.forEach(arquivo => {
        if (arquivo.endsWith('.txt')) {
            fs.readFile(path.join(pasta, arquivo), 'utf8', (err, conteudo) => {
                if (err) throw err;

                // Extrai o nome do livro da Bíblia a partir do nome do arquivo
                const nomeLivro = path.basename(arquivo, '.txt').toUpperCase();
                
                // Cria o cabeçalho
                const cabecalho = `PAS#01-${nomeLivro}\n`;

                // Divide o conteúdo em versículos usando regex
                const regexVersiculos = /(\d+)([^\d]+)/g;
                let resultado = cabecalho;
                let match;
                let capituloAtual = 1;

                while ((match = regexVersiculos.exec(conteudo)) !== null) {
                    const numeroVersiculo = match[1];
                    const textoVersiculo = match[2].trim();

                    // Determina o capítulo atual
                    if (numeroVersiculo === '1' && resultado !== cabecalho) {
                        capituloAtual++;
                    }

                    // Adiciona o versículo formatado ao resultado
                    resultado += `${capituloAtual}:${numeroVersiculo} ${textoVersiculo}\n`;
                }

                // Salva o resultado formatado em um novo arquivo
                fs.writeFile(path.join(pasta, `formatado_${arquivo}`), resultado, 'utf8', (err) => {
                    if (err) throw err;
                    console.log(`Arquivo formatado_${arquivo} salvo com sucesso!`);
                });
            });
        }
    });
});

Aqui estão algumas das mudanças que fiz:

  • Extraí o nome do livro a partir do nome do arquivo para criar o cabeçalho.
  • Usei uma expressão regular para identificar os versículos, assumindo que eles começam com um número seguido de texto.
  • Adicionei lógica para incrementar o número do capítulo quando um novo versículo 1 é encontrado.
  • Salvei o resultado formatado em um novo arquivo para não sobrescrever o original.

Espero que essas alterações ajudem a alcançar o formato desejado. Teste o código e veja se ele atende às suas necessidades.

Bons estudos!

Olá Armano, bom dia! Muito obrigada pela ajuda! Infelizmente ainda não cheguei no resultado que quero, mas vou continuar estudando para conseguir!