import os import yaml from bs4 import BeautifulSoup import json import copy import shutil # Caminho para o arquivo _quarto.yml quarto_config_file = "_quarto.yml" with open(quarto_config_file) as f: quarto_config = yaml.safe_load(f) # Extrair as informações do arquivo _quarto.yml # funcao para iterar os capítulos def extrair_arquivos_qmd(objeto, capitulos_arquivos_html): if isinstance(objeto, list): for elemento in objeto: extrair_arquivos_qmd(elemento, capitulos_arquivos_html) elif isinstance(objeto, dict): if 'part' in objeto: extrair_arquivos_qmd(objeto['part'], capitulos_arquivos_html) if 'chapters' in objeto: extrair_arquivos_qmd(objeto['chapters'], capitulos_arquivos_html) elif isinstance(objeto, str) and objeto.endswith('.qmd'): capitulos_arquivos_html.append(objeto[:-4]) # pegando o local dos arquivos html pasta_livro_renderizado = quarto_config["project"]["output-dir"] # pegando o campo controle-moan para verificar se é um dicionário é_dicionário = quarto_config["controle-moan"]["dicionario"] # pegando os capítulos capitulos = quarto_config["book"]["chapters"] capitulos_arquivo_html = [] extrair_arquivos_qmd(capitulos, capitulos_arquivo_html) # altera os arquivos html for index, output_file in enumerate(capitulos_arquivo_html): # Caminho completo para o arquivo HTML arquivo_html = os.path.join(pasta_livro_renderizado, output_file + ".html") # conta os elementos que serão uma referencia / Ele começa em 0 na abertura de um novo capítulo ref_num = 0 # Abre o arquivo HTML with open(arquivo_html, "r", encoding="utf-8") as f: content = f.read() # Cria um objeto BeautifulSoup soup = BeautifulSoup(content, "html.parser") # Encontre a tag 'main' no documento main_tag = soup.find("main") # Crie o elemento script com os metadados script_tag = soup.new_tag('script', data="moan-metadados") #pegar apenas a url do livro url_livro = os.path.basename(pasta_livro_renderizado) script_tag.string = f'var metadados = {{livroUrl: "{url_livro}"}};' script_tag.string += f'var modelo_antigo = true;' # Adicione o script ao cabeçalho (head) do HTML soup.head.append(script_tag) # Se existir o ark, colocar os dados nas tags object do primeiro capítulo do livro if "ark" in quarto_config["moan-dados"] and index == 0: ark = quarto_config["moan-dados"]["ark"] # Substitua "." por "_p_" e "/" por "_b_" em 'ark' ark = ark.replace(".", "_p_").replace("/", "_b_") # Adicione "ark_dp_" ao início de 'ark' ark = "ark_dp_" + ark # Encontre as tags object com id "metadados_livro_yml" e "metadados_livro_json" obj_metadados_yml = main_tag.find("object", {"id": "metadados_livro_yml"}) obj_metadados_json = main_tag.find("object", {"id": "metadados_livro_json"}) if obj_metadados_yml and obj_metadados_json: # Defina o atributo "data" das tags object obj_metadados_yml["data"] = "https://ark.livro.online/yaml/" + ark + ".yml" obj_metadados_json["data"] = "https://ark.livro.online/json/" + ark + ".json" # Verifique se o arquivo "postos-de-venda.json" existe json_file_path = "postos-de-venda.json" if os.path.exists(json_file_path) and index == 0: # O arquivo JSON existe, abra-o e extraia as chaves e valores with open(json_file_path, "r", encoding="utf-8") as json_file: postos_de_venda = json.load(json_file) # Crie uma nova lista não ordenada para armazenar os links ul = soup.new_tag("ul", id="postos-de-venda") for key, value in postos_de_venda.items(): li = soup.new_tag("li") # Verifica se "@" está presente no valor if "@" in value: # Se "@" estiver presente, crie um link de e-mail (mailto) link = soup.new_tag("a", href=f"mailto:{value}") link.string = f"{key}: {value}" # Texto do link é a chave seguida de dois pontos e o valor else: # Se "@" não estiver presente, crie um link normal link = soup.new_tag("a", href=value) link.string = key # Texto do link é a chave li.append(link) ul.append(li) # Encontre a tag "section" com ID "versão-impressa" section_versao_impressa = main_tag.find("section", id="versão-impressa") if section_versao_impressa: # Adicione a lista não ordenada de links à seção "versão-impressa" section_versao_impressa.append(ul) # Copie o arquivo JSON para a pasta especificada em "pasta_livro_renderizado" dest_file = os.path.join(pasta_livro_renderizado, "postos-de-venda.json") shutil.copy(json_file_path, dest_file) # Copiar a imagem og.jpg que está na pasta img e serve para usar no open graph # Pasta onde o arquivo og.jpg está localizado pasta_img = "img" # Caminho completo para o arquivo og.jpg caminho_original = os.path.join(pasta_img, "og.jpg") # Verifica se o arquivo og.jpg existe na pasta img if os.path.exists(caminho_original): # Caminho completo para a pasta de destino na pasta livro_renderizado caminho_destino = os.path.join(pasta_livro_renderizado, "img") # Certifica-se de que a pasta de destino exista os.makedirs(caminho_destino, exist_ok=True) # Copia o arquivo og.jpg para a pasta de destino shutil.copy(caminho_original, caminho_destino) print("Arquivo og.jpg foi copiado com sucesso.") else: print("O arquivo og.jpg não foi encontrado na pasta img.") # Coloca o conteudo dentro de uma div com id chamado de papel, substituindo o conteudo original da tag main pela div papel # Crie uma div com id "papel" div_papel = soup.new_tag('div', id='papel') # Copie a tag main main_content_copy = copy.copy(main_tag.contents) # Limpe o conteúdo da tag
main_tag.clear() # Adicione a cópia do conteúdo à div "papel" for item_copy in main_content_copy: div_papel.append(item_copy) # Acrescentar a div_papel na tag main main_tag.append(div_papel) # Salva o arquivo HTML modificado with open(arquivo_html, "w", encoding="utf-8") as f: f.write(str(soup)) # Nos livros antigos que já possuía referencias, o arquivo com as referencias será copiado para a pasta do livro renderizado. origem = "ref_capitulos.json" destino = os.path.join(pasta_livro_renderizado, "ref_capitulos.json") # Copia o arquivo para a pasta de destino shutil.copy(origem, destino)