Blog de usuário:Alisson002/Como converter artigos do AsianWiki pra cá
Mais ações
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
- Baixe o app e execute no navegador: https://www.mediafire.com/file/1rqvbfygvong77t/AsianWiki_para_Dublagem_Wiki.html/file
- Após copiar o cast no código-fonte, basta colar no app e copiar o resultado para o artigo a ser criado.
- 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>


