Migrando Oficialmente Do Drupal Para O Hugo ( ataliba.eti.br voltou !!!! )

Conforme eu havia falado aqui estava fazendo todo um processo de migração do Drupal para o Hugo . Como este blog voltou a ser oficialmente para os famosos geeks/nerds então eu vou começar com aqueles posts que todos os leitores daqui curtem. E, até eu recuperar o domínio do antigo blog “Ateu de péssimo humor” vou tentar postar aqui o que eu achar que devo postar …

Mas este não é o assunto do post. O assunto oficial do post mesmo é a migração. Mas que tal contar um pequeno histórico deste espaço web que começou, sim, em 2000, ainda em uma hospedagem gratuita que fornecia PHP.

O Início

Meu histórico na web é bem antigo. Já tive trocentas páginas que começaram no Geocities e passaram por diversos locais. Mas, como este post tem um foco no site aqui ( e na migração ) vou pular para a primeira versão deste site.

Pelo que me lembro, este site chamava The Matrix e era hospedado no f2s ( acho que era isto ). Um provedor gratuito que na época fornecia PHP sem base de dados. Com isto eu acabei pegando um script do Aurélio e modificando para que ele se tornasse meu blog e era onde eu postava as coias por aqui.

Era outra época, e CMS não era uma realidade como hoje. Então ele funcinou muito tempo até a primeira versão do blog com CMS, que aconteceu se não me engano em 2003 ou 2004.

Era um código PHP super tosco que eu fiz, que gerenciava todo o conteúdo que ia desde os posts padrão que eu fazia por aqui, até, fotologs, que eram uma febre naquela época. Ou seja, eu fiz do zero um CMS para me atender naquele momento, mesmo que já estivessem disponíveis softwares para este fim.

Como começaram a vir tecnologias novas eu comecei a ficar meio chateado com tudo, e o hábito de postar e implementar o que eu precisava começou a ficar meio chato. Aí, eu acabei começando a pensar no uso de um CMS. E acabei optando pelo Drupal, na época.

E na época, acho que em 2005, eu precisei fazer alguns hacks para importar da minha base do meu CMS para o Drupal. Foi fácil fazer isto na época porque eu sabia o modelo relacional inteiro do meu banco e o Drupal, em versões mais antigas era menos chato de integrar.

E fiquei neste até 2018, que foi o ano em que o blog foi invadido, porque havia anos que eu não criava vergonha na cara para migrar o conteúdo, ou, até, atualizasse o Drupal.

Porque demorou tanto a fazer isto aqui ?

Conheça o conceito: família e trabalho. 2018 foi um ano complexo em todos estes quesitos e eu deixei muita coisa sem cuidados. E o blog foi um destes.

E por isto demorou até este final de semana que eu tirei para mexer em trocentas coisas ( vide o Tokenbb já implementado no Louco Por Android ).

E como foi feito o processo ?

O processo em si foi bem complexo. Durou na realidade por volta de umas 6 horas de trabalho, que acabaram se resolvendo no final quando eu tive a chance de achar um script que uma alma muito boa deixou disponível na internet.

Sim, mais alguém saiu também do Drupal para o Hugo. E, no fim, o script dele resolvia um grande problema que eu tinha que era tentar manter pelo menos as mesmas urls dos posts, para ter um trabalho menor na edição das urls no Disqus.

E este script ( código abaixo, onde só mudei algumas coisinhas do original ) simplesmente pega o conteúdo do corpo do post e configura tudo diretamente no arquivo .md do Hugo. Ou seja, o processo é todo bem tranquilo e foi feito extraindo do conteúdo da minha base que está hospedada na Dreamhost.

Ou seja, eu penei para descobrir que não havia perdido todo o meu conteúdo e que, ele, na realidade, estava é em outra tabela, se não me engano node_field_content_body. Se está errado me desculpem, mas era mais ou menos isto.

Com isto descoberto eu precisei entender o que estava errado e porque o negócio não recuperava o conteúdo dos posts. E, aí, eu achei.

$body = field_get_items(‘node’,$node, ‘body’);

Com esta linha eu consegui recuperar o conteúdo do meu post ( ou seja, o corpo de cada post ) e inserir na variável que no fim, grava no arquivo. Lógico, isto parece bem simples agora, mas … deu um trampo do caramba para chegar nesta conclusão.

O código

Portanto, para quem quiser dar uma olhada no código que eu usei, é este aqui …

fetchCol();
$nodes = node_load_multiple($nids);
foreach($nodes as $node) {
  $front_matter = array(
    'title' => $node->title,
    'date' => date('c', $node->created),
    'lastmod' => date('c', $node->changed),
    'draft' => 'false',
  );
  if (count($node->taxonomy_vocabulary_2[LANGUAGE_NONE])) {
    $tags = taxonomy_term_load_multiple(
      array_column(
        $node->taxonomy_vocabulary_2[LANGUAGE_NONE],
        'tid'
      )
    );
    $front_matter['tags'] = array_column($tags, 'name');
  }
  if (count($node->taxonomy_vocabulary_1[LANGUAGE_NONE])) {
    $cat = taxonomy_term_load_multiple(
      array_column(
        $node->taxonomy_vocabulary_1[LANGUAGE_NONE],
        'tid'
      )
    );
    $front_matter['categories'] = array_column($cat, 'name');
  }
  $path = drupal_get_path_alias('node/'.$node->nid);
  if ($path != 'node/'.$node->nid) {
    $stringCorrigida = str_replace('content', 'post', $path);
    $front_matter['url'] = '/'.$stringCorrigida;
    $content_dir = explode('/', $path);
    $content_dir = end($content_dir);
  }
  else {
    $content_dir = $node->nid;
  }

  $front_matter['type'] = 'posts';

  $content = json_encode(
    $front_matter,
    JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES|JSON_UNESCAPED_UNICODE
  );
  $content .= "\n\n";
  $tmp_file = '/tmp/node.html';
  $body = field_get_items('node',$node, 'body');
  // $body[0]['value'];
  //file_put_contents($tmp_file, $node->body['fr'][0]['value']);
  file_put_contents($tmp_file, $body[0]['value']);
  $body = $body[0]['value'];
 // $body = shell_exec('html2markdown '.$tmp_file);
  unlink($tmp_file);
  //$body = $node->body['fr'][0]['value'];
  $content .= $body;
  //$dir_name = '/home/usuario/hugo/content/'.$node->type.'/'.$content_dir;
  $dir_name = '/home/usuario/hugo/content/'.$node->type.'/';
  mkdir($dir_name, 0777, true);
  file_put_contents($dir_name.'/'.$content_dir.'.md', $content);
}

E agora é se feliz com um processo de publicação todo baseado em Shell script + rync + vim + Hugo :-)