Skip to content

Commit

Permalink
Add pagination and tree structure for posts
Browse files Browse the repository at this point in the history
  • Loading branch information
Clément committed Jul 17, 2024
1 parent f7ca30e commit 4d50f9a
Show file tree
Hide file tree
Showing 10 changed files with 183 additions and 23 deletions.
22 changes: 22 additions & 0 deletions content/posts/ia.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
---
title L'IA 🧠 va-t-elle remplacer la recherche web classique ?
date 2024-05-20T15:12:42+00:00
category Technologie
abstract L'intelligence artificielle est partout. Tout le monde en parle ... Cet article vous propose de découvrir un cas intéressant et très puissant.
author Damien ACCORSI
---
{

}
---

{%markdown%}
La question se pose ...

Quelques mots-clé : #veilletechno #googlesearch #ia #notopensource

Cette publication n'a pas vocation a approfondir et à répondre à la question mais plutôt à partager l'existence d'une solution intéressante et qui a été présentée à l'un des suricates comme le futur remplaçant de google search.

![Perplexity va-t-il remplacer Google Search ?](/actualites/images/800x600/image-14219ee739c6a17b76d59f1d55b73776ea8b5e0e.png)

{%endmarkdown%}
69 changes: 69 additions & 0 deletions content/posts/manipuler-pdf.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
---
title Quels logiciels libres pour manipuler des fichiers PDF ?
date 2024-05-03T08:43:47+00:00
category univers du libre
abstract Manipuler des fichiers PDF est chose courante ; il existe une série de logiciels libres qui permet de procéder à la majorité des manipulations que l'on est en droit d'attendre de tels outils.
author Damien ACCORSI
---
{

}
---

{%markdown%}
Nous sommes tous amenés, à un moment ou à un autre, dans notre vie personnelle ou professionnelle, à manipuler des PDF.

Tout le monde connait Acrobat Reader et autres services en ligne tels que Ilovepdf.

Mais existe-t-il des logiciels libres pour procéder aux même opérations ? Si oui quels sont ces outils ?


## Consulter des PDF

**Evince** est un visionneur de documents pour GNOME. Il permet de visualiser des PDFs et de les imprimer

## Modifier et produire des PDF

**Libreoffice** permet d'exporter les documents que l'on rédige en PDF.

Moins connu, **Libreoffice Draw** permet quant à lui d'ouvrir des PDF existant et d'en éditer le contenu.

## Découper, extraire, fusionner des fichiers PDF en masse (en ligne de commande)

PDFtk permet facilement de découper un fichier PDF via la commande `pdftk file.pdf burst`

Il est également possible d'extraire un lot de pages `pdftk file.pdf cat 3-5 output pages-3-to-5.pdf`

Enfin, il est possible de concaténer des fichiers PDF, exemple : `pdftk file1.pdf file2.pdf cat output file1-file2-merged.pdf`

D'autres opérations sont possibles.

Pour un équivalent graphique, je vous renvoie vers PDF Chain qui m'a permis, par exemple, de découvrir qu'on pouvait intégrer des pièces jointes quelconques dans un PDF.


![](/actualites/images/500x500/image-b0158969619b6e2215ff928a68a0cd882228d06a.png)

## Découper, extraire, fusionner des PDFs naturellement

Pour un usage plus grand public, je ne peux que vous conseiller de vous tourner vers PDF Arranger.

Il permet de procéder aux même opérations que les outils précédemment cités, avec l'avantage de travailler sur des éléments visuels car l'interface intègre une prévisualisation des pages, une sélection à la souris et des menus contextuels - bref un ensemble plus intuitif pour les utilisations qui ne sont pas familiers avec la ligne de commande.

![](/actualites/images/500x500/image-3a7f8c0e10a091e5b7d8d5ac1d454ff27f1edf6d.png)

----

Voilà, vous savez désormais quoi utiliser pour :


- 🖨 Imprimer un document PDF
- ⤵ tourner les pages d'un document PDF
- ✂ découper un document PDF page par page
- 🖇 fusionner plusieurs documents PDF
- 🔎 extraire des sections de pages d'un document PDF


Vous n'avez plus aucune excuse pour diffuser des données confidentielles sur des services en ligne "gratuits" ;)


{%endmarkdown%}
File renamed without changes.
25 changes: 25 additions & 0 deletions content/posts/xs-compromise.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
---
title La lib de compression Xz compromise ...
date 2024-04-03T13:13:26+00:00
category Technologie
abstract Une porte dérobée introduite dans la lib de compression Xz a été fortuitement découverte par un développeur PostgreSQL ...
author Damien ACCORSI
---
{

}
---

{%markdown%}
La bibliothèque partagée de compression Xz (liblzma) a été compromise par l'un de ses 2 principaux développeurs. Une porte dérobée a été introduite et fortuitement découverte par un développeur du projet PostgreSQL qui [évoque humblement sa découverte sur Mastodon](https://mastodon.social/@AndresFreundTec/112180083704606941) : « I accidentally found a security issue while benchmarking postgres changes »

L'ingéniosité de l'attaque est de passer par un contributeur au long court et par une démarche très ingénieuse ; [Ytterbium décrit en détail l'attaque dans un long journal publié sur LinuxFR](https://linuxfr.org/users/ytterbium/journaux/xz-liblzma-compromis).

Une fois n'est pas coutume : le problème des dépendances "invisibles" (et pour autant stratégiques) se pose ...

![Dépendances](https://imgs.xkcd.com/comics/dependency.png)

(source: https://xkcd.com/2347/ )


{%endmarkdown%}
35 changes: 30 additions & 5 deletions content/templates/jinja2/post-list.html
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@
<div class="container">
<nav class='navbar navbar-light bg-light static-top'>
<a>Catégories :</a>
<a href='/posts/'>Tout</a>
<a href='/posts/page1.html'>Tout</a>
{% for category in object.categories %}
<a href='/posts/category/{{category}}.html'>{{ category|replace('-', ' ')|title }}</a>
<a href='/posts/category/{{category}}/page1.html'>{{ category|replace('-', ' ')|title }}</a>
{% endfor %}
</nav>
</div>
Expand All @@ -17,8 +17,7 @@
<div class="blog__post card rounded-20 " style="max-width: ; min-width: ">
<div class="card-body">
<div class="card-text" style="height: 400px">

<a class="card-link footer-link" href="/posts/{{post.slug}}.html">
<a class="card-link footer-link" href="/posts/articles/{% if post.rel_folder_path != '' %}{{post.rel_folder_path}}/{% endif %}{{post.slug}}.html">
<h2 class="blog__post__text__title">{{ post.title }}</h2>
</a>

Expand All @@ -42,7 +41,7 @@ <h2 class="blog__post__text__title">{{ post.title }}</h2>
<div class="blog__post__text__bottom__btn">
<a
class="btn btn-primary btn-round"
href="/posts/{{post.slug}}.html"
href="/posts/articles/{% if post.rel_folder_path != '' %}{{post.rel_folder_path}}/{% endif %}/{{post.slug}}.html"
>
Lire la suite ...
</a>
Expand All @@ -57,5 +56,31 @@ <h2 class="blog__post__text__title">{{ post.title }}</h2>
</div>
{% endfor %}
</div>
<div>
{% if object.page > 1 %}
{% if object.category != "" %}
<a href="/posts/category/{{object.category}}/page{{object.page-1}}.html">Page précédente</a>
{% else %}
<a href="/posts/page{{object.page-1}}.html">Page précédente</a>
{% endif %}
{% endif %}

{% if object.page < object.nb_pages %}
{% if object.category != "" %}
<a href="/posts/category/{{object.category}}/page{{object.page+1}}.html">Page suivante</a>
{% else %}
<a href="/posts/page{{object.page+1}}.html">Page suivante</a>
{% endif %}
{% endif %}
</div>
<div>
Pages :
{% for page in range(1, object.nb_pages+1) %}
{% if object.category != "" %}
<a href="/posts/category/{{object.category}}/page{{page}}.html">{{page}}</a>
{% else %}
<a href="/posts/page{{page}}.html">{{page}}</a>
{% endif %}
{% endfor %}
</div>
{% endblock %}
4 changes: 3 additions & 1 deletion content/templates/jinja2/post.html
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,7 @@

<h1>{{ object.title }}</h1>
{{ object.content|safe }}
<a href="/posts">Tous les posts</a>
<div>
<a href="/posts/page1.html">Tous les posts</a>
</div>
{% endblock %}
34 changes: 25 additions & 9 deletions jssg/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@

from django.core.management.commands.runserver import Command as runserver

from math import ceil

class Document:
"""A document.
Expand Down Expand Up @@ -302,30 +304,44 @@ class PostList :
metadata = {"page_header_h1":"Posts"}
category = ""

def __init__(self, category = "") -> None:
def __init__(self, category = "", page = 1) -> None:
self.category = category
self.page = page
self.posts_by_page = settings.JFME_NUMBER_OF_POSTS_BY_PAGE
if self.category == "" :
self.nb_pages = ceil(len(list(Post.load_glob(all=True))) / self.posts_by_page) # number of posts / number of posts by page
else :
self.nb_pages = ceil(len(list(filter(lambda p: p.metadata["category"] == self.category, Post.load_glob(all=True)))) / self.posts_by_page) # number of posts of the category / number of posts by page

@classmethod
def load_post_list_with_category(cls, category) :
return cls(category)
def load_post_list_with_category(cls, category, page) :
return cls(category, page)

@property
def categories(self) :
cat = set()
for post in Post.load_glob(all = True) :
if post.metadata["category"] != "" :
cat.add(post.metadata["category"])
return cat
return sorted(cat)

@classmethod
def get_categories(cls) :
return [{"category": category} for category in cls().categories]
def get_categories_and_pages(cls) :
t = []
for category in cls().categories :
t += [{"category": category, "page":page} for page in range(1, cls(category).nb_pages + 1)]
return t


@classmethod
def get_pages(cls) :
return [{"page": page} for page in range(1, cls().nb_pages+1)]

@property
def posts(self) :
posts = sorted(Post.load_glob(), key=lambda p: p.timestamp, reverse=True)
posts = sorted(Post.load_glob(all=True), key=lambda p: p.timestamp, reverse=True)
if self.category == "" :
return posts
return posts[self.posts_by_page*(self.page-1):self.posts_by_page*(self.page)]
else :
return filter(lambda p: p.metadata["category"] == self.category, posts)
return list(filter(lambda p: p.metadata["category"] == self.category, posts))[self.posts_by_page*(self.page-1):self.posts_by_page*(self.page)]

1 change: 1 addition & 0 deletions jssg/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@
JFME_POSTS_DIRS = [path / "posts" for path in JFME_CONTENT_DIRS]
JFME_TEMPLATES_DIRS = [path / "templates" for path in JFME_CONTENT_DIRS]
JFME_STATIC_DIRS = [path / "static" for path in JFME_CONTENT_DIRS]
JFME_NUMBER_OF_POSTS_BY_PAGE = 3



Expand Down
14 changes: 7 additions & 7 deletions jssg/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@


# print([p for p in Page.get_pages()])
# print([p for p in PostList.get_categories()])
# print([p for p in PostList.get_categories_and_pages()])

urlpatterns = [
distill_path(
Expand All @@ -41,25 +41,25 @@

distill_path("atom.xml", views.PostFeedsView(), name="atom_feed"),
distill_path(
"posts/",
"posts/page<int:page>.html",
views.PostListView.as_view(),
name = "post-index",
distill_file = "posts/index.html"
distill_func = PostList.get_pages
),
distill_path(
"posts/category/<slug:category>.html",
"posts/category/<slug:category>/page<int:page>.html",
views.PostListView.as_view(),
name = "post-category",
distill_func = PostList.get_categories
distill_func = PostList.get_categories_and_pages
),
distill_path(
"posts/<slug:slug>.html",
"posts/articles/<slug:slug>.html",
views.PostView.as_view(),
name="post",
distill_func=Post.get_posts,
),
distill_path(
"posts/<path:dir>/<slug:slug>.html",
"posts/articles/<path:dir>/<slug:slug>.html",
views.PostView.as_view(),
name="post",
distill_func=Post.get_posts,
Expand Down
2 changes: 1 addition & 1 deletion jssg/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -87,4 +87,4 @@ def get_object(self, queryset=None) -> Model:
if "category" not in self.kwargs.keys() :
self.kwargs["category"] = ""
print(self.kwargs["category"])
return PostList.load_post_list_with_category(self.kwargs["category"])
return PostList.load_post_list_with_category(self.kwargs["category"], self.kwargs["page"])

0 comments on commit 4d50f9a

Please sign in to comment.