Este site foi desenvolvido utilizando a combinaĆ§Ć£o poderosa do šŸ”§ Jekyll, o tema šŸŽØ Minimal e scripts em šŸ Python. A minha intenĆ§Ć£o era criar uma plataforma para exibir de forma automĆ”tica e organizada os meus artigos no šŸ’¼ Linkedin, os Gists no šŸ™ Github e atĆ© mesmo os meus livros no šŸ“š Goodreads.

Jekyll e Minimal šŸ–Œļø

O Jekyll Ć© um gerador de sites estĆ”ticos que simplifica o processo de criaĆ§Ć£o e manutenĆ§Ć£o de sites. Com o Jekyll, pude tirar proveito das suas funcionalidades de compilaĆ§Ć£o automĆ”tica, gerenciamento de layouts e facilidade na criaĆ§Ć£o de pĆ”ginas dinĆ¢micas.

O tema Minimal foi escolhido como base para o design deste site. Sua estĆ©tica limpa e minimalista se encaixou perfeitamente com a proposta do site. O tema Minimal tambĆ©m oferece uma estrutura bem organizada, com diferentes seƧƵes que facilitaram a apresentaĆ§Ć£o de conteĆŗdo de maneira clara e intuitiva.

Scripts em Python šŸ

A personalizaĆ§Ć£o desse site envolveu a escrita de scripts em Python para compilar e integrar o conteĆŗdo das minhas diferentes plataformas. Eu criei esses scripts para extrair os artigos do Linkedin, os Gists do Github e os dados dos meus livros no Goodreads. Com esses dados em mĆ£os, o Jekyll se encarregou de renderizar as pĆ”ginas estĆ”ticas de acordo com o layout definido pelo tema Minimal.

A escolha do Python como linguagem de programaĆ§Ć£o se deu pela sua versatilidade e pela ampla gama de bibliotecas disponĆ­veis para manipulaĆ§Ć£o de dados, web scraping e integraĆ§Ć£o com APIs. Essas caracterĆ­sticas foram essenciais para automatizar o processo de coleta de dados e tornar a atualizaĆ§Ć£o do site mais eficiente.

Compartilho aqui um dos scripts que transforma o HTML fornecido pelo Linkedin em uma solicitaĆ§Ć£o de meus dados pessoais, em um arquivo markdown no formato adequado para o Jekyll:


import json
import os
import shutil
from bs4 import BeautifulSoup
from markdownify import markdownify
from unidecode import unidecode

# Caminho para o diretĆ³rio do LinkedIn Archive
linkedin_archive_path = './resources/'

# Caminho para o diretĆ³rio de saĆ­da das pĆ”ginas Jekyll
output_path = './'

# Processar posts
posts_directory = os.path.join(linkedin_archive_path, 'Articles/Articles')
if os.path.exists(posts_directory):
    # Criar diretĆ³rio de saĆ­da para os posts das pĆ”ginas Jekyll
    jekyll_posts_directory = os.path.join(output_path, '_posts')
    os.makedirs(jekyll_posts_directory, exist_ok=True)

    # Iterar sobre os arquivos de posts no diretĆ³rio do LinkedIn Archive
    for filename in os.listdir(posts_directory):
        post_file = os.path.join(posts_directory, filename)
        if os.path.isfile(post_file):
            with open(post_file, 'r') as f:
                post_data = f.read()

                # Parsear o conteĆŗdo HTML do post
                soup = BeautifulSoup(post_data, 'html.parser')
                
                # Extrair o tĆ­tulo do post
                title_element = soup.find('h1')
                if title_element:
                    title_link = title_element.find('a')
                    if title_link:
                        title = title_link.text.strip()
                    else:
                        title = title_element.text.strip()
                else:
                    title = "No Title"

                # Se nĆ£o hĆ” tĆ­tulo, pular para o prĆ³ximo post
                if title == "No Title":
                    continue

                # Extrair a data de criaĆ§Ć£o e publicaĆ§Ć£o do post
                created = soup.find('p', class_='created').text.split('on ')[1].strip()
                published = soup.find('p', class_='published').text.split('on ')[1].strip()

                #NĆ£o publica rascunhos
                if len(published) < 5:
                    continue    

                # Extrair o conteĆŗdo do post e convertĆŖ-lo para Markdown
                content = soup.find('div').prettify()
                markdown_lines = content.splitlines()
                markdown_content = "\n".join(line.strip() for line in markdown_lines)

                # Criar arquivo de post no formato Jekyll
                # Omitir a data e hora do valor de created
                created_date = created.split()[0]
                jekyll_post_filename = f"{created_date.replace(' ', '_')}-{unidecode(title).replace(' ', '-').replace(':', 'h').lower()}.markdown"

                jekyll_post_file = os.path.join(jekyll_posts_directory, jekyll_post_filename)
                with open(jekyll_post_file, 'w') as jekyll_f:
                    jekyll_f.write('---\n')
                    jekyll_f.write(f"layout: post\n")
                    jekyll_f.write(f"language: pt\n")
                    jekyll_f.write(f"categories: artigos\n")
                    # Verificar se o tƭtulo contƩm ":" e substituir por "-"
                    jekyll_f.write(f"title: {title.replace(':', '-')}\n")
                    jekyll_f.write(f"url: {unidecode(title).replace(' ', '-').lower()}\n")
                    jekyll_f.write(f"date: {created}\n")
                    jekyll_f.write('---\n')
                    jekyll_f.write(markdown_content)
                    print(f"Criado o arquivo {jekyll_post_filename}")


Hospedagem no GitHub Pages šŸŒ

Este site estĆ” hospedado no GitHub Pages, uma plataforma de hospedagem gratuita fornecida pelo GitHub. O GitHub Pages permite a publicaĆ§Ć£o direta de sites estĆ”ticos a partir de repositĆ³rios do GitHub. Com a integraĆ§Ć£o entre o Jekyll e o GitHub Pages, foi possĆ­vel automatizar a compilaĆ§Ć£o e a atualizaĆ§Ć£o do site sempre que houver alteraƧƵes no cĆ³digo ou nos dados.

Espero que essa breve explicaĆ§Ć£o sobre o desenvolvimento deste site tenha sido Ćŗtil.

Obrigado por visitar! šŸ˜Š

Page Speed

Pagespeed report:

Google Page Speed report Google Page Speed report