New search function et drag and drop clean
This commit is contained in:
@ -266,7 +266,6 @@ func (h *Handler) generateHomeMarkdown() string {
|
||||
// En-tête
|
||||
sb.WriteString("# 📚 Index des Notes\n\n")
|
||||
sb.WriteString("_Mise à jour automatique • " + time.Now().Format("02/01/2006 à 15:04") + "_\n\n")
|
||||
sb.WriteString("---\n\n")
|
||||
|
||||
// Construire l'arborescence
|
||||
tree, err := h.buildFileTree()
|
||||
@ -278,7 +277,16 @@ func (h *Handler) generateHomeMarkdown() string {
|
||||
|
||||
// Compter le nombre de notes
|
||||
noteCount := h.countNotes(tree)
|
||||
|
||||
// Section des tags (en premier)
|
||||
h.generateTagsSection(&sb)
|
||||
|
||||
// Statistiques
|
||||
sb.WriteString(fmt.Sprintf("**%d note(s) au total**\n\n", noteCount))
|
||||
sb.WriteString("---\n\n")
|
||||
|
||||
// Titre de l'arborescence
|
||||
sb.WriteString("## 📂 Toutes les notes\n\n")
|
||||
|
||||
// Générer l'arborescence en Markdown
|
||||
h.generateMarkdownTree(&sb, tree, 0)
|
||||
@ -286,6 +294,29 @@ func (h *Handler) generateHomeMarkdown() string {
|
||||
return sb.String()
|
||||
}
|
||||
|
||||
// generateTagsSection génère la section des tags avec comptage
|
||||
func (h *Handler) generateTagsSection(sb *strings.Builder) {
|
||||
tags := h.idx.GetAllTagsWithCount()
|
||||
|
||||
if len(tags) == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
sb.WriteString("## 🏷️ Tags\n\n")
|
||||
sb.WriteString("<div class=\"tags-cloud\">\n")
|
||||
|
||||
for _, tc := range tags {
|
||||
// Créer un lien HTML discret et fonctionnel
|
||||
sb.WriteString(fmt.Sprintf(
|
||||
`<a href="#" class="tag-item" hx-get="/api/search?query=tag:%s" hx-target="#search-results" hx-swap="innerHTML"><kbd class="tag-badge">#%s</kbd> <mark class="tag-count">%d</mark></a>`,
|
||||
tc.Tag, tc.Tag, tc.Count,
|
||||
))
|
||||
sb.WriteString("\n")
|
||||
}
|
||||
|
||||
sb.WriteString("</div>\n\n")
|
||||
}
|
||||
|
||||
// countNotes compte le nombre de fichiers .md dans l'arborescence
|
||||
func (h *Handler) countNotes(node *TreeNode) int {
|
||||
count := 0
|
||||
|
||||
@ -638,3 +638,33 @@ func extractFrontMatter(path string) (frontMatter, error) {
|
||||
fm, _, err := ExtractFrontMatterAndBody(path)
|
||||
return frontMatter{Tags: fm.Tags}, err
|
||||
}
|
||||
|
||||
// TagCount représente un tag avec son nombre d'utilisations
|
||||
type TagCount struct {
|
||||
Tag string
|
||||
Count int
|
||||
}
|
||||
|
||||
// GetAllTagsWithCount retourne tous les tags avec leur nombre d'utilisations, triés par popularité
|
||||
func (i *Indexer) GetAllTagsWithCount() []TagCount {
|
||||
i.mu.RLock()
|
||||
defer i.mu.RUnlock()
|
||||
|
||||
result := make([]TagCount, 0, len(i.tags))
|
||||
for tag, files := range i.tags {
|
||||
result = append(result, TagCount{
|
||||
Tag: tag,
|
||||
Count: len(files),
|
||||
})
|
||||
}
|
||||
|
||||
// Trier par popularité (nombre décroissant), puis par nom alphabétique
|
||||
sort.Slice(result, func(a, b int) bool {
|
||||
if result[a].Count == result[b].Count {
|
||||
return result[a].Tag < result[b].Tag
|
||||
}
|
||||
return result[a].Count > result[b].Count
|
||||
})
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user