up wiki land

This commit is contained in:
Tykayn 2025-08-22 18:19:20 +02:00 committed by tykayn
parent 391a212034
commit e533c273b2
10 changed files with 1116 additions and 182 deletions

View file

@ -41,6 +41,11 @@
<i class="bi bi-people"></i> Groupes OSM-FR
</a>
</li>
<li class="nav-item">
<a class="nav-link {% if app.request.get('_route') == 'app_admin_wiki_recent_changes' %}active{% endif %}" href="{{ path('app_admin_wiki_recent_changes') }}">
<i class="bi bi-clock-history"></i> Changements récents
</a>
</li>
</ul>
</div>
</div>

View file

@ -58,7 +58,13 @@
<div class="card h-100">
<div class="card-header bg-primary text-white">
<h3>Sections en anglais</h3>
<span class="badge bg-light text-dark">{{ en_page.sections }} sections</span>
<span class="badge bg-light text-dark">
{% if detailed_comparison.adjusted_en_section_count is defined %}
{{ detailed_comparison.adjusted_en_section_count }} sections ({{ en_page.sections }} avec "Contents")
{% else %}
{{ en_page.sections }} sections
{% endif %}
</span>
</div>
<div class="card-body">
<h4>Sections alignées par hiérarchie</h4>
@ -67,6 +73,9 @@
<li class="list-group-item title-level-{{ section.en.level }}">
{# <span class="badge bg-secondary">h{{ section.en.level }}</span> #}
{{ section.en.title }}
{% if detailed_comparison.en_hierarchy_errors is defined and loop.index0 in detailed_comparison.en_hierarchy_errors %}
<span class="badge bg-danger ms-2" title="Hiérarchie incorrecte">!</span>
{% endif %}
</li>
{% endfor %}
@ -74,6 +83,9 @@
<li class="list-group-item list-group-item-warning title-level-{{ section.level }}">
{# <span class="badge bg-secondary">h{{ section.level }}</span> #}
{{ section.title }}
{% if detailed_comparison.en_hierarchy_errors is defined and (detailed_comparison.section_comparison.common|length + loop.index0) in detailed_comparison.en_hierarchy_errors %}
<span class="badge bg-danger ms-2" title="Hiérarchie incorrecte">!</span>
{% endif %}
</li>
{% endfor %}
</ul>
@ -84,7 +96,13 @@
<div class="card h-100">
<div class="card-header bg-info text-white">
<h3>Sections en français</h3>
<span class="badge bg-light text-dark">{{ fr_page.sections }} sections</span>
<span class="badge bg-light text-dark">
{% if detailed_comparison.adjusted_fr_section_count is defined %}
{{ detailed_comparison.adjusted_fr_section_count }} sections ({{ fr_page.sections }} avec "Sommaire")
{% else %}
{{ fr_page.sections }} sections
{% endif %}
</span>
</div>
<div class="card-body">
<h4>Sections alignées par hiérarchie</h4>
@ -93,6 +111,9 @@
<li class="list-group-item title-level-{{ section.fr.level }}">
{# <span class="badge bg-secondary">h{{ section.fr.level }}</span> #}
{{ section.fr.title }}
{% if detailed_comparison.fr_hierarchy_errors is defined and loop.index0 in detailed_comparison.fr_hierarchy_errors %}
<span class="badge bg-danger ms-2" title="Hiérarchie incorrecte">!</span>
{% endif %}
</li>
{% endfor %}
@ -100,7 +121,9 @@
<li class="list-group-item list-group-item-info title-level-{{ section.level }}">
{# <span class="badge bg-secondary">h{{ section.level }}</span> #}
{{ section.title }}
{% if detailed_comparison.fr_hierarchy_errors is defined and (detailed_comparison.section_comparison.common|length + loop.index0) in detailed_comparison.fr_hierarchy_errors %}
<span class="badge bg-danger ms-2" title="Hiérarchie incorrecte">!</span>
{% endif %}
</li>
{% endfor %}
</ul>
@ -227,59 +250,41 @@
<div class="card-body">
<h4>Liens uniquement en anglais
({{ detailed_comparison.link_comparison.en_only|length }})</h4>
<h4>Comparaison des liens côte à côte</h4>
<div class="table-responsive">
<table class="table table-sm table-warning">
<table class="table table-sm">
<thead>
<tr>
<th>Texte</th>
<th>URL</th>
<th class="bg-primary text-white">Texte EN</th>
<th class="bg-primary text-white">URL EN</th>
<th class="bg-info text-white">Texte FR</th>
<th class="bg-info text-white">URL FR</th>
</tr>
</thead>
<tbody>
{% for link in detailed_comparison.link_comparison.en_only %}
{% set en_links = detailed_comparison.link_comparison.en_only %}
{% set fr_links = detailed_comparison.link_comparison.fr_only %}
{% set max_links = max(en_links|length, fr_links|length) %}
{% for i in 0..(max_links - 1) %}
<tr>
<td>{{ link.text }}</td>
<td><a href="{{ link.href }}" target="_blank"
class="small">{{ link.href|slice(0, 30) }}...</a></td>
{% if i < en_links|length %}
<td class="bg-light">{{ en_links[i].text }}</td>
<td class="bg-light"><a href="{{ en_links[i].href }}" target="_blank" class="small">{{ en_links[i].href|slice(0, 30) }}...</a></td>
{% else %}
<td class="bg-light"></td>
<td class="bg-light"></td>
{% endif %}
{% if i < fr_links|length %}
<td>{{ fr_links[i].text }}</td>
<td><a href="{{ fr_links[i].href }}" target="_blank" class="small">{{ fr_links[i].href|slice(0, 30) }}...</a></td>
{% else %}
<td></td>
<td></td>
{% endif %}
</tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card h-100">
<div class="card-header bg-info text-white">
<h3>Liens en français</h3>
<span class="badge bg-light text-dark">{{ fr_page.link_count }} liens</span>
</div>
<div class="card-body">
<h4>Liens uniquement en français
({{ detailed_comparison.link_comparison.fr_only|length }})</h4>
<div class="table-responsive">
<table class="table table-sm table-info">
<thead>
<tr>
<th>Texte</th>
<th>URL</th>
</tr>
</thead>
<tbody>
{% for link in detailed_comparison.link_comparison.fr_only %}
<tr>
<td>{{ link.text }}</td>
<td><a href="{{ link.href }}" target="_blank"
class="small">{{ link.href|slice(0, 30) }}...</a></td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
@ -377,7 +382,13 @@
<ul class="list-group mb-3">
<li class="list-group-item d-flex justify-content-between align-items-center">
Sections
<span class="badge bg-primary rounded-pill">{{ en_page.sections }}</span>
<span class="badge bg-primary rounded-pill">
{% if detailed_comparison.adjusted_en_section_count is defined %}
{{ detailed_comparison.adjusted_en_section_count }}
{% else %}
{{ en_page.sections }}
{% endif %}
</span>
</li>
<li class="list-group-item d-flex justify-content-between align-items-center">
Mots
@ -510,7 +521,13 @@
<ul class="list-group mb-3">
<li class="list-group-item d-flex justify-content-between align-items-center">
Sections
<span class="badge bg-primary rounded-pill">{{ en_page.sections }}</span>
<span class="badge bg-primary rounded-pill">
{% if detailed_comparison.adjusted_en_section_count is defined %}
{{ detailed_comparison.adjusted_en_section_count }}
{% else %}
{{ en_page.sections }}
{% endif %}
</span>
</li>
<li class="list-group-item d-flex justify-content-between align-items-center">
Mots
@ -547,7 +564,13 @@
<ul class="list-group mb-3">
<li class="list-group-item d-flex justify-content-between align-items-center">
Sections
<span class="badge bg-info rounded-pill">{{ fr_page.sections }}</span>
<span class="badge bg-info rounded-pill">
{% if detailed_comparison.adjusted_fr_section_count is defined %}
{{ detailed_comparison.adjusted_fr_section_count }}
{% else %}
{{ fr_page.sections }}
{% endif %}
</span>
</li>
<li class="list-group-item d-flex justify-content-between align-items-center">
Mots

View file

@ -96,26 +96,103 @@
</div>
<div class="card-body">
{% if local_groups|length > 0 %}
<!-- Filtres -->
<div class="mb-4">
<div class="btn-group" role="group" aria-label="Filtres">
<button type="button" class="btn btn-outline-primary active filter-btn" data-filter="all">Tous</button>
<button type="button" class="btn btn-outline-primary filter-btn" data-filter="wiki">Wiki</button>
<button type="button" class="btn btn-outline-primary filter-btn" data-filter="framacalc">Framacalc</button>
<button type="button" class="btn btn-outline-primary filter-btn" data-filter="has-wiki">Avec page wiki</button>
<button type="button" class="btn btn-outline-primary filter-btn" data-filter="no-wiki">Sans page wiki</button>
</div>
</div>
<div class="row row-cols-1 row-cols-md-2 row-cols-lg-3 g-4">
{% for group in local_groups %}
<div class="col">
<div class="card h-100">
{% set source = group.source|default('wiki') %}
{% set has_wiki = group.has_wiki_page|default(true) %}
{% set filter_classes = source ~ ' ' ~ (has_wiki ? 'has-wiki' : 'no-wiki') %}
<div class="col group-item {{ filter_classes }}">
<div class="card h-100 {% if source == 'framacalc' and not has_wiki %}border-danger{% endif %}">
{% if source == 'framacalc' %}
<div class="card-header bg-light">
<span class="badge bg-secondary">Framacalc</span>
{% if has_wiki %}
<span class="badge bg-success">Page wiki</span>
{% else %}
<span class="badge bg-danger">Pas de page wiki</span>
{% endif %}
</div>
{% endif %}
<div class="card-body">
<h5 class="card-title">{{ group.name }}</h5>
{% if group.description %}
<p class="card-text">{{ group.description }}</p>
{% endif %}
{% if source == 'framacalc' and group.contact %}
<p class="card-text"><small class="text-muted">Contact: {{ group.contact }}</small></p>
{% endif %}
{% if source == 'framacalc' and group.website %}
<p class="card-text">
<a href="{{ group.website }}" target="_blank" class="btn btn-sm btn-outline-secondary">
<i class="bi bi-globe"></i> Site web
</a>
</p>
{% endif %}
</div>
<div class="card-footer">
<a href="{{ group.url }}" target="_blank"
class="btn btn-sm btn-outline-primary">
<i class="bi bi-box-arrow-up-right"></i> Voir sur le wiki
</a>
{% if source == 'wiki' or has_wiki %}
<a href="{{ group.url }}" target="_blank"
class="btn btn-sm btn-outline-primary">
<i class="bi bi-box-arrow-up-right"></i> Voir sur le wiki
</a>
{% else %}
<a href="https://wiki.openstreetmap.org/wiki/Special:Search?search={{ group.name|url_encode }}"
target="_blank" class="btn btn-sm btn-outline-danger">
<i class="bi bi-search"></i> Rechercher sur le wiki
</a>
{% endif %}
</div>
</div>
</div>
{% endfor %}
</div>
<!-- JavaScript pour les filtres -->
<script>
document.addEventListener('DOMContentLoaded', function() {
const filterButtons = document.querySelectorAll('.filter-btn');
const groupItems = document.querySelectorAll('.group-item');
filterButtons.forEach(button => {
button.addEventListener('click', function() {
// Remove active class from all buttons
filterButtons.forEach(btn => btn.classList.remove('active'));
// Add active class to clicked button
this.classList.add('active');
const filter = this.getAttribute('data-filter');
// Show/hide items based on filter
groupItems.forEach(item => {
if (filter === 'all') {
item.style.display = 'block';
} else {
if (item.classList.contains(filter)) {
item.style.display = 'block';
} else {
item.style.display = 'none';
}
}
});
});
});
});
</script>
{% else %}
<div class="alert alert-info">
<p><i class="bi bi-info-circle"></i> Aucun groupe local n'a été trouvé.</p>

View file

@ -3,120 +3,122 @@
{% block title %}Suggestion de page Wiki à améliorer{% endblock %}
{% block body %}
<div class="container mt-4">
{% include 'admin/_wiki_navigation.html.twig' %}
<h1>Suggestion de page Wiki à améliorer</h1>
<p class="lead">Voici une page wiki qui a besoin d'être améliorée.</p>
<div class="container mt-4">
{% include 'admin/_wiki_navigation.html.twig' %}
<div class="card mb-4">
<div class="card-header bg-primary text-white">
<h2>{{ page.key }}</h2>
</div>
<div class="card-body">
<div class="alert alert-info">
<h3>Raisons d'amélioration</h3>
<p>{{ page.reason }}</p>
<h1>Suggestion de page Wiki à améliorer</h1>
<p class="lead">Voici une page wiki qui a besoin d'être améliorée.</p>
<div class="card mb-4">
<div class="card-header bg-primary text-white">
<h2>{{ page.key }}</h2>
</div>
<div class="card-body">
<div class="alert alert-info">
<h3>Raisons d'amélioration</h3>
<p>{{ page.reason }}</p>
</div>
<div class="row">
<div class="col-md-6">
<div class="card h-100">
<div class="card-header bg-primary text-white">
<h3>Version anglaise</h3>
<p class="mb-0">
<small>Dernière modification: {{ page.en_page.last_modified }}</small>
</p>
<div class="row">
<div class="col-md-6">
<div class="card h-100">
<div class="card-header bg-primary text-white">
<h3>Version anglaise</h3>
<p class="mb-0">
<small>Dernière modification: {{ page.en_page.last_modified }}</small>
</p>
</div>
<div class="card-body">
<ul class="list-group mb-3">
<li class="list-group-item d-flex justify-content-between align-items-center">
Sections
<span class="badge bg-primary rounded-pill">{{ page.en_page.sections }}</span>
</li>
<li class="list-group-item d-flex justify-content-between align-items-center">
Mots
<span class="badge bg-primary rounded-pill">{{ page.en_page.word_count|default(0) }}</span>
</li>
<li class="list-group-item d-flex justify-content-between align-items-center">
Liens
<span class="badge bg-primary rounded-pill">{{ page.en_page.link_count|default(0) }}</span>
</li>
</ul>
<div class="d-grid gap-2">
<a href="{{ page.en_page.url }}" target="_blank" class="btn btn-outline-primary">
<i class="bi bi-box-arrow-up-right"></i> Voir la page anglaise
</a>
</div>
</div>
</div>
<div class="card-body">
<ul class="list-group mb-3">
<li class="list-group-item d-flex justify-content-between align-items-center">
Sections
<span class="badge bg-primary rounded-pill">{{ page.en_page.sections }}</span>
</li>
<li class="list-group-item d-flex justify-content-between align-items-center">
Mots
<span class="badge bg-primary rounded-pill">{{ page.en_page.word_count|default(0) }}</span>
</li>
<li class="list-group-item d-flex justify-content-between align-items-center">
Liens
<span class="badge bg-primary rounded-pill">{{ page.en_page.link_count|default(0) }}</span>
</li>
</ul>
<div class="d-grid gap-2">
<a href="{{ page.en_page.url }}" target="_blank" class="btn btn-outline-primary">
<i class="bi bi-box-arrow-up-right"></i> Voir la page anglaise
</a>
</div>
<div class="col-md-6">
<div class="card h-100">
<div class="card-header bg-info text-white">
<h3>Version française</h3>
{% if page.fr_page %}
<p class="mb-0">
<small>Dernière modification: {{ page.fr_page.last_modified }}</small>
</p>
{% else %}
<p class="mb-0">
<small>Page non existante</small>
</p>
{% endif %}
</div>
<div class="card-body">
{% if page.fr_page %}
<ul class="list-group mb-3">
<li class="list-group-item d-flex justify-content-between align-items-center">
Sections
<span class="badge bg-info rounded-pill">{{ page.fr_page.sections }}</span>
</li>
<li class="list-group-item d-flex justify-content-between align-items-center">
Mots
<span class="badge bg-info rounded-pill">{{ page.fr_page.word_count|default(0) }}</span>
</li>
<li class="list-group-item d-flex justify-content-between align-items-center">
Liens
<span class="badge bg-info rounded-pill">{{ page.fr_page.link_count|default(0) }}</span>
</li>
</ul>
<div class="d-grid gap-2">
<a href="{{ page.fr_page.url }}" target="_blank" class="btn btn-outline-info">
<i class="bi bi-box-arrow-up-right"></i> Voir la page française
</a>
</div>
{% else %}
<div class="alert alert-warning">
<p><i class="bi bi-exclamation-triangle"></i> <strong>La page wiki pour la clé
"{{ page.key }}" n'existe pas en français.</strong></p>
<p>Vous pouvez contribuer en créant cette page sur le wiki OpenStreetMap.</p>
</div>
<div class="d-grid gap-2">
<a href="https://wiki.openstreetmap.org/w/index.php?title=FR:Key:{{ page.key }}&action=edit"
target="_blank" class="btn btn-success">
<i class="bi bi-plus-circle"></i> Créer la page française
</a>
</div>
{% endif %}
</div>
</div>
</div>
</div>
<div class="col-md-6">
<div class="card h-100">
<div class="card-header bg-info text-white">
<h3>Version française</h3>
{% if page.fr_page %}
<p class="mb-0">
<small>Dernière modification: {{ page.fr_page.last_modified }}</small>
</p>
{% else %}
<p class="mb-0">
<small>Page non existante</small>
</p>
{% endif %}
</div>
<div class="card-body">
{% if page.fr_page %}
<ul class="list-group mb-3">
<li class="list-group-item d-flex justify-content-between align-items-center">
Sections
<span class="badge bg-info rounded-pill">{{ page.fr_page.sections }}</span>
</li>
<li class="list-group-item d-flex justify-content-between align-items-center">
Mots
<span class="badge bg-info rounded-pill">{{ page.fr_page.word_count|default(0) }}</span>
</li>
<li class="list-group-item d-flex justify-content-between align-items-center">
Liens
<span class="badge bg-info rounded-pill">{{ page.fr_page.link_count|default(0) }}</span>
</li>
</ul>
<div class="d-grid gap-2">
<a href="{{ page.fr_page.url }}" target="_blank" class="btn btn-outline-info">
<i class="bi bi-box-arrow-up-right"></i> Voir la page française
</a>
</div>
{% else %}
<div class="alert alert-warning">
<p><i class="bi bi-exclamation-triangle"></i> <strong>La page wiki pour la clé "{{ page.key }}" n'existe pas en français.</strong></p>
<p>Vous pouvez contribuer en créant cette page sur le wiki OpenStreetMap.</p>
</div>
<div class="d-grid gap-2">
<a href="https://wiki.openstreetmap.org/wiki/FR:Key:{{ page.key }}" target="_blank" class="btn btn-success">
<i class="bi bi-plus-circle"></i> Créer la page française
</a>
</div>
{% endif %}
</div>
</div>
<div class="mt-4 d-grid gap-2">
<a href="{{ path('app_admin_wiki_compare', {'key': page.key}) }}" class="btn btn-primary">
<i class="bi bi-arrows-angle-expand"></i> Voir la comparaison détaillée
</a>
<a href="{{ path('app_admin_wiki_random_suggestion') }}" class="btn btn-secondary">
<i class="bi bi-shuffle"></i> Autre suggestion aléatoire
</a>
</div>
</div>
</div>
<div class="mt-4 d-grid gap-2">
<a href="{{ path('app_admin_wiki_compare', {'key': page.key}) }}" class="btn btn-primary">
<i class="bi bi-arrows-angle-expand"></i> Voir la comparaison détaillée
</a>
<a href="{{ path('app_admin_wiki_random_suggestion') }}" class="btn btn-secondary">
<i class="bi bi-shuffle"></i> Autre suggestion aléatoire
</a>
</div>
<div class="mt-3">
<a href="{{ path('app_admin_wiki') }}" class="btn btn-secondary">
<i class="bi bi-arrow-left"></i> Retour à la liste des pages wiki
</a>
</div>
</div>
<div class="mt-3">
<a href="{{ path('app_admin_wiki') }}" class="btn btn-secondary">
<i class="bi bi-arrow-left"></i> Retour à la liste des pages wiki
</a>
</div>
</div>
{% endblock %}

View file

@ -0,0 +1,87 @@
{% extends 'base.html.twig' %}
{% block title %}Changements récents Wiki OSM{% endblock %}
{% block body %}
<div class="container mt-4">
{% include 'admin/_wiki_navigation.html.twig' %}
<h1>Changements récents Wiki OpenStreetMap</h1>
<p class="lead">Liste des changements récents dans l'espace de noms français du wiki OpenStreetMap.</p>
{% if last_updated %}
<div class="alert alert-info">
<i class="bi bi-info-circle"></i> Dernière mise à jour : {{ last_updated|date('d/m/Y H:i') }}
</div>
{% endif %}
<div class="card mb-4">
<div class="card-header bg-primary text-white">
<h2>Changements récents</h2>
<p class="mb-0">
<a href="https://wiki.openstreetmap.org/w/index.php?hidebots=1&hidepreviousrevisions=1&hidecategorization=1&hideWikibase=1&hidelog=1&hidenewuserlog=1&namespace=202&limit=500&days=30&enhanced=1&title=Special:RecentChanges&urlversion=2"
target="_blank" class="text-white">
<i class="bi bi-box-arrow-up-right"></i> Voir sur le wiki OSM
</a>
</p>
</div>
<div class="card-body">
{% if recent_changes|length > 0 %}
<div class="table-responsive">
<table class="table table-striped table-hover">
<thead class="thead-dark">
<tr>
<th>Page</th>
<th>Date</th>
<th>Utilisateur</th>
<th>Commentaire</th>
<th>Taille</th>
<th>Actions</th>
</tr>
</thead>
<tbody>
{% for change in recent_changes %}
<tr>
<td>
<strong>{{ change.page_name }}</strong>
</td>
<td>{{ change.timestamp }}</td>
<td>{{ change.user }}</td>
<td>{{ change.comment }}</td>
<td>{{ change.change_size }}</td>
<td>
<a href="{{ change.page_url }}" target="_blank" class="btn btn-sm btn-outline-primary">
<i class="bi bi-box-arrow-up-right"></i> Voir
</a>
</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% else %}
<div class="alert alert-info">
<p><i class="bi bi-info-circle"></i> Aucun changement récent n'a été trouvé.</p>
</div>
{% endif %}
</div>
</div>
<div class="card mb-4">
<div class="card-header">
<h2>À propos des changements récents</h2>
</div>
<div class="card-body">
<p>Cette page affiche les changements récents dans l'espace de noms français (FR:) du wiki OpenStreetMap.</p>
<p>Ces informations sont utiles pour suivre les traductions manquantes et les mises à jour des pages wiki.</p>
<p>Les données sont mises à jour automatiquement toutes les heures.</p>
</div>
</div>
<div class="mt-3">
<a href="{{ path('app_admin_wiki') }}" class="btn btn-secondary">
<i class="bi bi-arrow-left"></i> Retour à la liste des pages wiki
</a>
</div>
</div>
{% endblock %}