Jump to content
Ativa o menu
Alternar menu de preferências
Alternar menu pessoal
Não autenticado(a)
Your IP address will be publicly visible if you make any edits.

Blog de usuário:Alisson002/Como converter artigos do AsianWiki pra cá

De Dublapédia

Queria ensinar vocês a converter artigos do AsianWiki (seja de doramas, filmes asiáticos, live-actions de anime, etc.), pois é de lá que me baseio na criação dos meus artigos — na maioria doramas e filmes coreanos. A maioria dos artigos lá possui imagens dos personagens, o que, junto com as páginas de anime, sempre foi um diferencial desta wiki desde o início.

Eu tinha feito esse tutorial para que outras pessoas pudessem ajudar na criação de novos artigos de doramas, já que apenas eu e mais uns dois usuários criamos páginas do gênero. Notei que, depois que fiquei sumido daqui, a criação dessas páginas diminuiu e muitas das que eram feitas por outros usuários vinham sem imagens, mesmo usando o AsianWiki como base. Talvez isso aconteça porque o tutorial antigo era cheio de processos manuais e complicados para muita gente; então, resolvi pedir ao Gemini para criar um app HTML para simplificar essa conversão.

Segue o tutorial abaixo:

Copiar código-fonte do AsianWiki editar

  • Primeiramente vá até o final da página que pretende converter e clique em "View Source" e copie o código à partir de "==Cast==", até o fim de Additional Cast Members (até o fim da lista).

Convertendo para o formato da Wiki editar

  • Código do APP:

Caso não queira baixar, cole o texto abaixo dentro de um arquivo .html e abra no seu navegador:

<!DOCTYPE html>
<html lang="pt-BR">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Conversor AsianWiki ➜ Dublagem Wiki</title>
    <style>
        :root {
            --bg-color: #0d1117;
            --container-bg: #161b22;
            --text-color: #c9d1d9;
            --border-color: #30363d;
            --input-bg: #010409;
            --primary-color: #58a6ff;
            --accent-color: #238636;
            --accent-hover: #2ea043;
            --clear-color: #da3633;
            --copy-color: #1f6feb;
        }

        body {
            font-family: 'Segoe UI', system-ui, sans-serif;
            background-color: var(--bg-color);
            color: var(--text-color);
            margin: 0;
            padding: 20px;
            display: flex;
            flex-direction: column;
            align-items: center;
        }

        .container {
            width: 100%;
            max-width: 900px;
            background: var(--container-bg);
            padding: 25px;
            border-radius: 10px;
            box-shadow: 0 8px 24px rgba(0,0,0,0.5);
            border: 1px solid var(--border-color);
        }

        h1 { text-align: center; color: var(--primary-color); margin-bottom: 25px; }
        label { font-weight: bold; margin-bottom: 10px; display: block; color: #8b949e; }

        textarea {
            width: 100%;
            height: 250px;
            padding: 12px;
            border: 1px solid var(--border-color);
            border-radius: 6px;
            font-family: 'Consolas', monospace;
            font-size: 14px;
            background-color: var(--input-bg);
            color: var(--text-color);
            box-sizing: border-box;
        }

        .controls { display: flex; justify-content: space-between; margin: 20px 0; }

        button {
            padding: 12px 24px;
            font-size: 15px;
            font-weight: 600;
            color: white;
            border: none;
            border-radius: 6px;
            cursor: pointer;
            transition: 0.2s;
        }

        .btn-convert { background-color: var(--accent-color); }
        .btn-convert:hover { background-color: var(--accent-hover); }
        .btn-clear { background-color: var(--clear-color); }
        .btn-copy { background-color: var(--copy-color); width: 100%; margin-top: 20px; }
    </style>
</head>
<body>

<div class="container">
    <h1>Conversor AsianWiki ➜ Dublagem Wiki</h1>
    
    <label>Código Fonte AsianWiki:</label>
    <textarea id="inputData" placeholder="Cole o wikitext do AsianWiki aqui..."></textarea>
    
    <div class="controls">
        <button class="btn-convert" onclick="converter()">Converter para Padrão Wiki</button>
        <button class="btn-clear" onclick="limparTudo()">Limpar</button>
    </div>

    <label>Resultado para Dublagem Wiki:</label>
    <textarea id="outputData" readonly></textarea>
    
    <button class="btn-copy" onclick="copiarResultado()">Copiar Resultado</button>
</div>

<script>
    function formatarTagsPequenas(texto) {
        if (!texto) return '';
        // Captura qualquer coisa dentro de parênteses que contenha "ep" ou "ép"
        // Ex: (ep.1), ( ep. 1 ), (ép.1-2), (ep.1, 2)
        return texto.replace(/\(([^)]*é?p\.[^)]*)\)/gi, "{{Pequena2|($1)}}");
    }

    function processarNomeAtor(nomeCru, seenActors) {
        if (!nomeCru) return '?';
        let link = nomeCru, display = nomeCru;

        if (nomeCru.includes('{{!}}')) {
            let partes = nomeCru.split('{{!}}');
            link = partes[0].trim();
            display = partes[1].trim();
        } else if (nomeCru.includes('|')) {
            let partes = nomeCru.split('|');
            link = partes[0].trim();
            display = partes[1].trim();
        }

        // Se o ator ainda não foi visto, usamos apenas [[Nome]] (sem o ano/link extra)
        if (!seenActors.has(display)) {
            seenActors.add(display);
            return `[[${display}]]`;
        } else {
            // Se já foi visto e o link for diferente do display (tem ano), mantém o link completo
            return (link === display) ? `[[${display}]]` : `[[${link}|${display}]]`;
        }
    }

    function converter() {
        const input = document.getElementById('inputData').value;
        const linhas = input.split('\n');
        let seenActors = new Set();
        let elencoAdicional = [];
        let resultado = `==Elenco==\n{| class="wikitable-large"\n! width="50" |Imagens\n!Personagens\n!Intérpretes Originais\n!Dubladores\n`;
        
        let lendoCast = false, lendoAdicional = false, dadosCast = {};

        for (let linha of linhas) {
            linha = linha.trim();
            if (!linha) continue;

            // Identificar Cabeçalhos
            let matchCabecalho = linha.match(/^={2,3}\s*(.*?)\s*={2,3}$/);
            if (matchCabecalho && !linha.toLowerCase().includes('additional cast')) {
                let tit = matchCabecalho[1].replace(/'s Group|& His Group| Group/gi, "");
                resultado += `|-\n! colspan="4" align="center" |${tit}\n`;
                continue;
            }

            // Identificar Início do Elenco Adicional
            if (linha.toLowerCase().includes('additional cast members:') || linha.toLowerCase().includes('==additional cast==')) {
                lendoAdicional = true;
                continue;
            }

            // Processar Elenco Adicional
            if (lendoAdicional && linha.startsWith('*')) {
                let matchAdd = linha.match(/\*\s*\[\[(.*?)\]\]\s*-\s*(.*)/);
                if (matchAdd) {
                    let ator = processarNomeAtor(matchAdd[1], seenActors);
                    let char = formatarTagsPequenas(matchAdd[2].trim());
                    elencoAdicional.push(`*${char} (${ator}): ?`);
                }
                continue;
            }

            // Bloco de Imagens (CastPictures)
            if (linha.startsWith('{{CastPictures')) { 
                lendoCast = true; 
                dadosCast = {}; 
                continue; 
            }

            if (lendoCast && linha === '}}') {
                lendoCast = false;
                let chaves = Object.keys(dadosCast).map(k => parseInt(k)).filter(n => !isNaN(n));
                let maxNum = chaves.length > 0 ? Math.max(...chaves) : 0;

                for (let j = 1; j <= maxNum; j++) {
                    if (dadosCast[`${j}picture`]) {
                        let img = dadosCast[`${j}picture`].replace('File:', 'Arquivo:');
                        let ator = processarNomeAtor(dadosCast[`${j}name`], seenActors);
                        let char = formatarTagsPequenas(dadosCast[`${j}charactername`] || '?');
                        resultado += `|-\n| style="padding:0;" |[[${img}|80px]]\n|${char}\n|${ator}\n|?\n`;
                    }
                }
                continue;
            }

            if (lendoCast) {
                let matchProp = linha.match(/^\|(\d+[a-z]+)\s*=\s*(.*)/i);
                if (matchProp) dadosCast[matchProp[1].toLowerCase()] = matchProp[2].trim();
            }
        }

        resultado += `|}`;
        if (elencoAdicional.length > 0) {
            resultado += `\n\n===Elenco Adicional===\n` + elencoAdicional.join('\n');
        }
        document.getElementById('outputData').value = resultado;
    }

    function limparTudo() {
        document.getElementById('inputData').value = '';
        document.getElementById('outputData').value = '';
    }

    function copiarResultado() {
        const output = document.getElementById('outputData');
        output.select();
        navigator.clipboard.writeText(output.value);
        const btn = document.querySelector('.btn-copy');
        btn.innerText = "Copiado!";
        setTimeout(() => btn.innerText = "Copiar Resultado", 2000);
    }
</script>
</body>
</html>