242 lines
6.9 KiB
Python
Executable File
242 lines
6.9 KiB
Python
Executable File
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>
|
|
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) |