diff --git a/.gitignore b/.gitignore index 03dc07f..4c49bd7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1 @@ .env -pasta_publica/analytics/* -pasta_publica/!analytics/README.md \ No newline at end of file diff --git a/README.md b/README.md index ac248bb..e328c1c 100644 --- a/README.md +++ b/README.md @@ -3,16 +3,26 @@ ## O que você vai encontrar aqui? +### As instruções a seguir são para o prefixo eM + Aqui, você encontrará: -- 2 arquivos (ark_lista.yml e ark_lista.json) contendo uma lista de todos os identificadores ARK gerados pela Editora Moan. Nesses, arquivos há o identificador, o título, o tipo de objeto (formato), o autor e um link para o arquivo com os metadados completos. Substitua pelos seus ARK; +- 2 arquivos (ark_lista.yml e ark_lista.json) contendo uma lista de todos os identificadores ARK gerados pela Editora Moan com o prefixo eM. Nesses, arquivos há o identificador, o título, o tipo de objeto (formato), o autor e um link para o arquivo com os metadados completos. Substitua pelos seus ARK; - O arquivo gerar_ark.py para poder gerar os identificadores ARK da Editora Moan. Você poderá personalizar para o seu uso site_base para o endereço web que você vai colocar este repositório. Outro ponto importante é colocar um redirecionamento no seu servidor para cair no seu site_base toda vez que alguém estiver buscando um ARK. Colocamos o seguinte redirecionamento para funcionar com o index.php: "^/ark:(.*)$" o que captura tudo que começa com "/ark:" após o seu domínio. E redirecionamos para "$site_base/?ark=$1". Isto é, o ARK, sem o rótulo, estará no parâmetro "ark". Mais um detalhe importante... Se você não usar nenhum tratamento para quando os seus ARK forem acessados por leitura de um qr code, retire essa importação e todas as chamadas da função registrarAcessoQrCode. O arquivo "funcaoQRCode.php" possui uma chamada para o arquivo .env, mas .env nao está aqui porque são os dados do banco de dados. Se vc quiser usar a função de qr code, coloque um arquivo .env com os dados de conexão do seu banco de dados, conforme o arquivo "funcaoQRCode.php". Crie o banco de dados conforme a tabela de qr code usada no arquivo "funcaoQRCode.php"; - Os demais arquivos são os ARK com todos os seus metadados. Cada ARK possui um único arquivo YAML e uma cópia na versão JSON. Substitua pelos seus ARK. Os arquivos ark_lista estão na raiz do repositório, mas cada ARK YAML completo está na pasta yaml e os JSON, na pasta json. -## Sobre os nomes dos arquivos +#### Sobre os nomes dos arquivos Um exemplo de um identificador ARK pode ser "ark:777/a55/d3.By2". Como você pode observar, isso seria problemático para uso em URL e, por isso, uma pequena substituição será feita para nomear os arquivos ARK neste repositório. -Os ":" (dois pontos) serão substituídos por \_dp\_; o "." (ponto), por \_p\_ e a "/" (barra), por \_b\_. Assim — o arquivo que conteria todos os metadados do hipotético ARK dado como exemplo no parágrafo anterior — seria "ark_dp_777_b_a55_b_d3_p_By2.yml" ou sua cópia em JSON, "ark_dp_777_b_a55_b_d3_p_By2.json". \ No newline at end of file +Os ":" (dois pontos) serão substituídos por \_dp\_; o "." (ponto), por \_p\_ e a "/" (barra), por \_b\_. Assim — o arquivo que conteria todos os metadados do hipotético ARK dado como exemplo no parágrafo anterior — seria "ark_dp_777_b_a55_b_d3_p_By2.yml" ou sua cópia em JSON, "ark_dp_777_b_a55_b_d3_p_By2.json". + +### Instruções para o prefixo M + + + +## Observações + +Agora usamos o Plausible Analytics para as estatísticas de acesso ARK. Configure o seu. diff --git a/pasta_publica/LogicaPrefixos/processarPrefixo_eM.php b/pasta_publica/LogicaPrefixos/processarPrefixo_eM.php index 81c7184..946e6d8 100644 --- a/pasta_publica/LogicaPrefixos/processarPrefixo_eM.php +++ b/pasta_publica/LogicaPrefixos/processarPrefixo_eM.php @@ -28,32 +28,33 @@ function processarPrefixo_eM($NAAN, $ark_sem_NAAN, $tem_interrogacao, $resto) { // Acesse o valor da chave 'apontamento' $apontamento = $metadados['apontamento'] ?? ''; + $titulo = $metadados['título'] ?? ''; } else { - return ['ok' => true, 'destino' => '', 'msg' => 'Erro ao decodificar o JSON no arquivo com os metadados do '.$ark_formatado.'. Informe o problema ao responsável.']; + return ['ok' => true, 'destino' => '', 'msg' => 'Erro ao decodificar o JSON no arquivo com os metadados do '.$ark_formatado.'. Informe o problema ao responsável.', 'titulo' => '']; } if($tem_interrogacao){ - return ['ok' => true, 'destino' => $site_base.$caminho_arquivo_ark, 'msg' => $ark_formatado.' encontrado. Direcionando para os metadados...']; + return ['ok' => true, 'destino' => $site_base.$caminho_arquivo_ark, 'msg' => $ark_formatado.' encontrado. Direcionando para os metadados...', 'titulo' => $titulo]; } if ($apontamento){ - return ['ok' => true, 'destino' => $apontamento.$resto, 'msg' => $ark_formatado.' encontrado. Direcionando...']; + return ['ok' => true, 'destino' => $apontamento.$resto, 'msg' => $ark_formatado.' encontrado. Direcionando...', 'titulo' => $titulo]; } - return ['ok' => true, 'destino' => $site_base.$caminho_arquivo_ark, 'msg' => $ark_formatado.' encontrado. Mas sem um apontamento configurado. Direcionando para os metadados...']; + return ['ok' => true, 'destino' => $site_base.$caminho_arquivo_ark, 'msg' => $ark_formatado.' encontrado. Mas sem um apontamento configurado. Direcionando para os metadados...', 'titulo' => $titulo]; } - return ['ok' => false, 'destino' => '', 'msg' => $ark_formatado.' nao encontrado.']; + return ['ok' => false, 'destino' => '', 'msg' => $ark_formatado.' não encontrado.', 'titulo' => '']; } -?> \ No newline at end of file +?> diff --git a/pasta_publica/analytics/plausible.php b/pasta_publica/analytics/plausible.php new file mode 100644 index 0000000..973949f --- /dev/null +++ b/pasta_publica/analytics/plausible.php @@ -0,0 +1,5 @@ + + + + + diff --git a/pasta_publica/atualizarServidor.py b/pasta_publica/atualizarServidor.py deleted file mode 100644 index d65ee06..0000000 --- a/pasta_publica/atualizarServidor.py +++ /dev/null @@ -1,64 +0,0 @@ -import os -import shutil -import subprocess - -def copiar_arquivos_e_pastas(arquivos, origem, destino): - - # Imprime o caminho absoluto do destino - print("Caminho absoluto do destino:", os.path.abspath(destino)) - - # Se o destino for o servidor-web/livro.online/ark, apaga o diretório de destino inteiro - if destino == os.path.abspath('../servidor-web/livro.online/ark'): - print("Apagando diretório de destino...") - shutil.rmtree(destino) - - # Percorre a lista de arquivos e pastas - for item in arquivos: - origem_item = os.path.join(origem, item) - destino_item = os.path.join(destino, item) - - # Se for uma pasta, copia recursivamente - if os.path.isdir(origem_item): - shutil.copytree(origem_item, destino_item, dirs_exist_ok=True) - else: - # Se for um arquivo, copia - shutil.copy2(origem_item, destino_item) - -# Diretório de origem é o diretório atual -diretorio_origem = os.getcwd() -# Diretório de destino -diretorio_destino = os.path.abspath('../servidor-web/livro.online/ark') # Aqui você pode colocar o diretório correto de acordo com a estrutura do seu projeto - -# Lista de arquivos e pastas a serem copiados -arquivos_e_pastas = ['json', 'yaml', 'ark_lista.json', 'ark_lista.yml', 'funcaoQRCode.php', 'index.php'] - -# Chama a função para copiar os arquivos e pastas -copiar_arquivos_e_pastas(arquivos_e_pastas, diretorio_origem, diretorio_destino) - -print("Arquivos e pastas copiados com sucesso no servidor-web!") - -diretorio_livro_p_online = os.path.abspath('../site-moan-quarto-config/site-livroonline') # Aqui você pode colocar o diretório correto de acordo com a estrutura do seu projeto - -# Navega para o diretorio_livro_p_online -os.chdir(diretorio_livro_p_online) - -# Executa os comandos do terminal -""" -comandos = [ - 'quarto render publicacoes.qmd --cache-refresh', - 'git add publicacoes.qmd', - 'git commit -m "publicação novo"', - 'git push' -] -""" -comandos = ['quarto render publicacoes.qmd --cache-refresh'] - -for comando in comandos: - subprocess.run(comando, shell=True) - -print("Servidor atualizado!") - -RESET = "\033[0m" -RED = "\033[91m" - -print(RED+"\n======== ATENÇÃO!!! Ainda é preciso atualizar o github!!! ========\n"+RESET) \ No newline at end of file diff --git a/pasta_publica/funcaoQRCode.php b/pasta_publica/funcaoQRCode.php deleted file mode 100644 index 49f5ff2..0000000 --- a/pasta_publica/funcaoQRCode.php +++ /dev/null @@ -1,64 +0,0 @@ -connect_error) { - die("Falha na conexão: " . $conexao->connect_error); - } - - $endereco_ip = $_SERVER['REMOTE_ADDR']; - $data_acesso = date('Y-m-d H:i:s'); - - // Consulta SQL para inserir dados - $sql = "INSERT INTO acessos_qr_code (chave, url_destino, ip, data_acesso) VALUES (?, ?, ?, ?)"; - - // Preparar a consulta - $stmt = $conexao->prepare($sql); - - // Verificar se a consulta está pronta - if ($stmt) { - // Vincular parâmetros - $stmt->bind_param('ssss', $chave, $destino_redirecionamento, $endereco_ip, $data_acesso); - - // Executar a consulta - if ($stmt->execute()) { - /* echo "Registro inserido com sucesso!"; */ - } else { - /* echo "Erro ao inserir o registro: " . $stmt->error; */ - } - - // Fechar a consulta - $stmt->close(); - } else { - /* echo "Erro na preparação da consulta: " . $conexao->error; */ - } - - // Fechar a conexão com o banco de dados - $conexao->close(); - } -} -?> diff --git a/pasta_publica/index.php b/pasta_publica/index.php index 9acab26..7ec4e52 100644 --- a/pasta_publica/index.php +++ b/pasta_publica/index.php @@ -24,7 +24,7 @@ function reduzirArk($tamanho, $pedacos) { function limpar_ark($str){ // Lista de caracteres a serem removidos - $caracteresParaRemover = array('<', '>', ':', ';', '(', ')', '&', '$'); + $caracteresParaRemover = array('<', '>', ':', ';', '(', '&', ')', '$'); // Substitui os caracteres da lista por uma string vazia $stringLimpa = str_replace($caracteresParaRemover, '', $str); @@ -47,7 +47,7 @@ function init() { $ark = ""; - return ['ok'=>false,'destino'=>'','msg'=>'Nenhum ARK foi passado...','qrark'=> false,'ark'=>'']; + return ['ok'=>false,'destino'=>'','msg'=>'Nenhum ARK foi passado...','qrark'=> false,'ark_full'=>'', 'tem_interrogacao'=>false]; } @@ -67,22 +67,39 @@ function init() { // Remova a barra no início $ark= substr($ark, 1); } + + $tem_interrogacao = false; + + // remove até 2 interrogações no final e marca flag. Ark para consultar metadados se coloca uma interrogacao no final. Duas interrogacoes verifica a persistencia, o tempo de existencia do ark, mas aqui na Editora Moan nao implementamos isso + $ark = rtrim($ark); + for ($k = 0; $k < 2; $k++) { + if (substr($ark, -1) === '?') { + $tem_interrogacao = true; + $ark = substr($ark, 0, -1); + } + } $pedacos = explode("/", $ark); + + // ARK completo “sem o prefixo ark:” e sem barra inicial, fixo: + $ark_full = implode("/", array_filter($pedacos, fn($p) => $p !== '')); $NAAN = $pedacos[0]; //NAAN é o número de registro da Editora Moan na Ark Alliance $ark_sem_NAAN = reduzirArk(count($pedacos), $pedacos); + + // sem NAAN + $ark_base = implode("/", array_slice($pedacos, 1)); - $ark_completo_sem_NAAN = $ark_sem_NAAN; - - $ark_completo_sem_NAAN = ltrim($ark_completo_sem_NAAN, '/'); + if ($ark === '') { - return ['ok'=>false,'destino'=>'','msg'=>'ARK vazio.','qrark'=>$qrark,'ark'=>'']; + return ['ok'=>false,'destino'=>'','msg'=>'ARK vazio.','qrark'=>$qrark,'ark_full'=>'', 'tem_interrogacao'=>false]; } + + //-------------------------- PREFIXOS ARK -------------------------- $prefixo_editora = "eM"; @@ -90,12 +107,12 @@ function init() { $buscar_ark = null; - if (str_starts_with($ark_completo_sem_NAAN, $prefixo_editora)) { + if (str_starts_with($ark_base, $prefixo_editora)) { // Prefixo eM require __DIR__ . '/LogicaPrefixos/processarPrefixo_eM.php'; $buscar_ark = 'processarPrefixo_eM'; - } elseif (str_starts_with($ark_completo_sem_NAAN, $prefixo_museu_da_matematica)) { + } elseif (str_starts_with($ark_base, $prefixo_museu_da_matematica)) { // Prefixo M require __DIR__ . '/LogicaPrefixos/processarPrefixo_M.php'; $buscar_ark = 'processarPrefixo_M'; @@ -107,7 +124,7 @@ function init() { //-------------------------- FIM PREFIXOS ARK -------------------------- if (!is_callable($buscar_ark)) { - return ['ok'=>false,'destino'=>'','msg'=>'Prefixo ARK desconhecido.','qrark'=>$qrark,'ark'=>$ark_completo_sem_NAAN]; + return ['ok'=>false,'destino'=>'','msg'=>'Prefixo ARK desconhecido.','qrark'=>$qrark,'ark_full'=>$ark_full, 'tem_interrogacao'=>$tem_interrogacao]; } @@ -117,8 +134,10 @@ function init() { $identificador_ark = false; - $resultado = ['ok'=>false,'destino'=>'','msg'=>'ARK não encontrado.Erro não identificado.','qrark'=>$qrark,'ark'=>$ark_completo_sem_NAAN]; - + $resultado = ['ok'=>false,'destino'=>'','msg'=>'ARK não encontrado.Erro não identificado.','qrark'=>$qrark,'ark'=>$ark_full, 'tem_interrogacao'=>$tem_interrogacao]; + + + do { $resto = ""; @@ -145,29 +164,6 @@ function init() { break; } - $len_ark_sem_NAAN = strlen($ark_sem_NAAN); - - $tem_interrogacao = false; - - - if($ark_sem_NAAN[$len_ark_sem_NAAN-1] == "?"){// Um ARK com ? é uma pergunta para saber seus metadados e, por isso, em vez da obra em si, temos que retornar os metadados do ARK - - $tem_interrogacao = true; - - $ark_sem_NAAN = substr($ark_sem_NAAN, 0, -1); - - }//Fecha if - - - $len_ark_sem_NAAN = strlen($ark_sem_NAAN); - - if($ark_sem_NAAN[$len_ark_sem_NAAN-1] == "?"){// É executado duas vezes porque um ARK, pela especificação, pode conter duas interrogações e nesse caso deveria retornar se o arquivo é temporário ou não. Mas na Editora Moan não implementamos isso. - - $ark_sem_NAAN = substr($ark_sem_NAAN, 0, -1); - - }//Fecha if - - $resultado = $buscar_ark($NAAN, $ark_sem_NAAN, $tem_interrogacao, $resto); @@ -177,8 +173,12 @@ function init() { } while ($tamanho > 1 && !$identificador_ark); - $resultado['qrark'] = $qrark; - $resultado['ark'] = $ark_completo_sem_NAAN; + + + $resultado['qrark'] = $qrark; + $resultado['ark_full'] = $ark_full; // <-- use este no JS/analytics + $resultado['tem_interrogacao'] = $tem_interrogacao; + return $resultado; @@ -192,10 +192,32 @@ $destino = $conteudo["destino"]; $msg = $conteudo["msg"]; -$ark = $conteudo["ark"]; +$arkFull = $conteudo['ark_full'] ?? ''; $qrark = $conteudo["qrark"]; +$tem_interrogacao = $conteudo['tem_interrogacao']; + +function slug_titulo($s) { + $s = trim((string)$s); + if ($s === '') return ''; + + // remove acentos + $s = iconv('UTF-8', 'ASCII//TRANSLIT//IGNORE', $s); + $s = strtolower($s); + + // troca tudo que não é letra/número por hífen + $s = preg_replace('/[^a-z0-9]+/', '-', $s); + $s = trim($s, '-'); + + // limita tamanho (pra não virar um trem sem freio) + return substr($s, 0, 80); +} + +$tituloSlug = slug_titulo($conteudo['titulo'] ?? ''); + + + ?> @@ -207,22 +229,21 @@ $qrark = $conteudo["qrark"];