obsidian-bases

Par kepano · obsidian-skills

Créez et modifiez des Bases Obsidian (fichiers .base) avec des vues, des filtres, des formules et des résumés. À utiliser lorsque vous travaillez avec des fichiers .base, que vous créez des vues de type base de données pour des notes, ou lorsque l'utilisateur mentionne les Bases, les vues en tableau, les vues en cartes, les filtres ou les formules dans Obsidian.

npx skills add https://github.com/kepano/obsidian-skills --skill obsidian-bases

Compétence Obsidian Bases

Flux de travail

  1. Créer le fichier : Créez un fichier .base dans le vault avec un contenu YAML valide
  2. Définir la portée : Ajoutez des filters pour sélectionner les notes (par tag, dossier, propriété ou date)
  3. Ajouter des formules (optionnel) : Définissez les propriétés calculées dans la section formulas
  4. Configurer les vues : Ajoutez une ou plusieurs vues (table, cards, list ou map) avec order spécifiant les propriétés à afficher
  5. Valider : Vérifiez que le fichier est un YAML valide sans erreurs de syntaxe. Vérifiez que toutes les propriétés et formules référencées existent. Problèmes courants : chaînes non échappées contenant des caractères YAML spéciaux, guillemets mal appairés dans les expressions de formule, référence à formula.X sans définir X dans formulas
  6. Tester dans Obsidian : Ouvrez le fichier .base dans Obsidian pour confirmer que la vue s'affiche correctement. S'il affiche une erreur YAML, vérifiez les règles de guillemets ci-dessous

Schéma

Les fichiers base utilisent l'extension .base et contiennent du YAML valide.

# Les filtres globaux s'appliquent À TOUTES les vues de la base
filters:
  # Peut être une seule chaîne de filtre
  # OU un objet filtre récursif avec and/or/not
  and: []
  or: []
  not: []

# Définissez les propriétés de formule qui peuvent être utilisées dans toutes les vues
formulas:
  formula_name: 'expression'

# Configurez les noms d'affichage et les paramètres des propriétés
properties:
  property_name:
    displayName: "Display Name"
  formula.formula_name:
    displayName: "Formula Display Name"
  file.ext:
    displayName: "Extension"

# Définissez les formules de synthèse personnalisées
summaries:
  custom_summary_name: 'values.mean().round(3)'

# Définissez une ou plusieurs vues
views:
  - type: table | cards | list | map
    name: "View Name"
    limit: 10                    # Optionnel : limiter les résultats
    groupBy:                     # Optionnel : grouper les résultats
      property: property_name
      direction: ASC | DESC
    filters:                     # Filtres spécifiques à la vue
      and: []
    order:                       # Propriétés à afficher dans l'ordre
      - file.name
      - property_name
      - formula.formula_name
    summaries:                   # Mappez les propriétés aux formules de synthèse
      property_name: Average

Syntaxe des filtres

Les filtres réduisent les résultats. Ils peuvent être appliqués globalement ou par vue.

Structure des filtres

# Filtre unique
filters: 'status == "done"'

# AND - toutes les conditions doivent être vraies
filters:
  and:
    - 'status == "done"'
    - 'priority > 3'

# OR - au moins une condition peut être vraie
filters:
  or:
    - 'file.hasTag("book")'
    - 'file.hasTag("article")'

# NOT - exclure les éléments correspondants
filters:
  not:
    - 'file.hasTag("archived")'

# Filtres imbriqués
filters:
  or:
    - file.hasTag("tag")
    - and:
        - file.hasTag("book")
        - file.hasLink("Textbook")
    - not:
        - file.hasTag("book")
        - file.inFolder("Required Reading")

Opérateurs de filtre

Opérateur Description
== égal à
!= pas égal à
> supérieur à
< inférieur à
>= supérieur ou égal à
<= inférieur ou égal à
&& et logique
\|\| ou logique
<code>!</code> non logique

Propriétés

Trois types de propriétés

  1. Propriétés de note - Du frontmatter : note.author ou simplement author
  2. Propriétés de fichier - Métadonnées du fichier : file.name, file.mtime, etc.
  3. Propriétés de formule - Valeurs calculées : formula.my_formula

Référence des propriétés de fichier

Propriété Type Description
file.name String Nom du fichier
file.basename String Nom du fichier sans extension
file.path String Chemin complet du fichier
file.folder String Chemin du dossier parent
file.ext String Extension du fichier
file.size Number Taille du fichier en octets
file.ctime Date Date de création
file.mtime Date Date de modification
file.tags List Tous les tags du fichier
file.links List Liens internes du fichier
file.backlinks List Fichiers liés à ce fichier
file.embeds List Embeds dans la note
file.properties Object Toutes les propriétés du frontmatter

Le mot-clé this

  • Dans la zone de contenu principal : fait référence au fichier base lui-même
  • Lors d'un embedding : fait référence au fichier qui intègre
  • Dans la barre latérale : fait référence au fichier actif du contenu principal

Syntaxe des formules

Les formules calculent des valeurs à partir de propriétés. Définies dans la section formulas.

formulas:
  # Arithmétique simple
  total: "price * quantity"

  # Logique conditionnelle
  status_icon: 'if(done, "✅", "⏳")'

  # Formatage de chaîne
  formatted_price: 'if(price, price.toFixed(2) + " dollars")'

  # Formatage de date
  created: 'file.ctime.format("YYYY-MM-DD")'

  # Calculer les jours depuis création (utilisez .days pour Duration)
  days_old: '(now() - file.ctime).days'

  # Calculer les jours jusqu'à la date limite
  days_until_due: 'if(due_date, (date(due_date) - today()).days, "")'

Fonctions clés

Fonctions les plus couramment utilisées. Pour la référence complète de tous les types (Date, String, Number, List, File, Link, Object, RegExp), consultez FUNCTIONS_REFERENCE.md.

Fonction Signature Description
date() date(string): date Analyser une chaîne en date (YYYY-MM-DD HH:mm:ss)
now() now(): date Date et heure actuelles
today() today(): date Date actuelle (heure = 00:00:00)
if() if(condition, trueResult, falseResult?) Conditionnel
duration() duration(string): duration Analyser une chaîne de durée
file() file(path): file Obtenir un objet fichier
link() link(path, display?): Link Créer un lien

Type Duration

Lors de la soustraction de deux dates, le résultat est un type Duration (pas un nombre).

Champs Duration : duration.days, duration.hours, duration.minutes, duration.seconds, duration.milliseconds

IMPORTANT : Duration ne supporte PAS .round(), .floor(), .ceil() directement. Accédez d'abord à un champ numérique (comme .days), puis appliquez les fonctions numériques.

# CORRECT : Calculer les jours entre deux dates
"(date(due_date) - today()).days"                    # Retourne le nombre de jours
"(now() - file.ctime).days"                          # Jours depuis création
"(date(due_date) - today()).days.round(0)"           # Jours arrondis

# FAUX - causera une erreur :
# "((date(due) - today()) / 86400000).round(0)"      # Duration ne supporte pas la division puis round

Arithmétique des dates

# Unités de durée : y/year/years, M/month/months, d/day/days,
#                   w/week/weeks, h/hour/hours, m/minute/minutes, s/second/seconds
"now() + \"1 day\""       # Demain
"today() + \"7d\""        # Une semaine à partir d'aujourd'hui
"now() - file.ctime"      # Retourne Duration
"(now() - file.ctime).days"  # Obtenir les jours en nombre

Types de vues

Vue Table

views:
  - type: table
    name: "My Table"
    order:
      - file.name
      - status
      - due_date
    summaries:
      price: Sum
      count: Average

Vue Cards

views:
  - type: cards
    name: "Gallery"
    order:
      - file.name
      - cover_image
      - description

Vue List

views:
  - type: list
    name: "Simple List"
    order:
      - file.name
      - status

Vue Map

Nécessite les propriétés latitude/longitude et le plugin Maps community.

views:
  - type: map
    name: "Locations"
    # Paramètres spécifiques à la carte pour les propriétés lat/lng

Formules de synthèse par défaut

Nom Type d'entrée Description
Average Number Moyenne mathématique
Min Number Plus petit nombre
Max Number Plus grand nombre
Sum Number Somme de tous les nombres
Range Number Max - Min
Median Number Médiane mathématique
Stddev Number Écart-type
Earliest Date Date la plus ancienne
Latest Date Date la plus récente
Range Date Latest - Earliest
Checked Boolean Nombre de valeurs vraies
Unchecked Boolean Nombre de valeurs fausses
Empty Any Nombre de valeurs vides
Filled Any Nombre de valeurs non vides
Unique Any Nombre de valeurs uniques

Exemples complets

Base Task Tracker

filters:
  and:
    - file.hasTag("task")
    - 'file.ext == "md"'

formulas:
  days_until_due: 'if(due, (date(due) - today()).days, "")'
  is_overdue: 'if(due, date(due) < today() && status != "done", false)'
  priority_label: 'if(priority == 1, "🔴 High", if(priority == 2, "🟡 Medium", "🟢 Low"))'

properties:
  status:
    displayName: Status
  formula.days_until_due:
    displayName: "Days Until Due"
  formula.priority_label:
    displayName: Priority

views:
  - type: table
    name: "Active Tasks"
    filters:
      and:
        - 'status != "done"'
    order:
      - file.name
      - status
      - formula.priority_label
      - due
      - formula.days_until_due
    groupBy:
      property: status
      direction: ASC
    summaries:
      formula.days_until_due: Average

  - type: table
    name: "Completed"
    filters:
      and:
        - 'status == "done"'
    order:
      - file.name
      - completed_date

Base Reading List

filters:
  or:
    - file.hasTag("book")
    - file.hasTag("article")

formulas:
  reading_time: 'if(pages, (pages * 2).toString() + " min", "")'
  status_icon: 'if(status == "reading", "📖", if(status == "done", "✅", "📚"))'
  year_read: 'if(finished_date, date(finished_date).year, "")'

properties:
  author:
    displayName: Author
  formula.status_icon:
    displayName: ""
  formula.reading_time:
    displayName: "Est. Time"

views:
  - type: cards
    name: "Library"
    order:
      - cover
      - file.name
      - author
      - formula.status_icon
    filters:
      not:
        - 'status == "dropped"'

  - type: table
    name: "Reading List"
    filters:
      and:
        - 'status == "to-read"'
    order:
      - file.name
      - author
      - pages
      - formula.reading_time

Index Daily Notes

filters:
  and:
    - file.inFolder("Daily Notes")
    - '/^\d{4}-\d{2}-\d{2}$/.matches(file.basename)'

formulas:
  word_estimate: '(file.size / 5).round(0)'
  day_of_week: 'date(file.basename).format("dddd")'

properties:
  formula.day_of_week:
    displayName: "Day"
  formula.word_estimate:
    displayName: "~Words"

views:
  - type: table
    name: "Recent Notes"
    limit: 30
    order:
      - file.name
      - formula.day_of_week
      - formula.word_estimate
      - file.mtime

Embedding Bases

Embed dans les fichiers Markdown :

![[MyBase.base]]

<!-- Vue spécifique -->
![[MyBase.base#View Name]]

Règles de guillemets YAML

  • Utilisez des guillemets simples pour les formules contenant des guillemets doubles : 'if(done, "Yes", "No")'
  • Utilisez des guillemets doubles pour les chaînes simples : "My View Name"
  • Échappez correctement les guillemets imbriqués dans les expressions complexes

Dépannage

Erreurs de syntaxe YAML

Caractères spéciaux non échappés : Les chaînes contenant :, {, }, [, ], ,, &, *, #, ?, |, -, <, >, =, !, %, @, ` doivent être guillemées.

# FAUX - deux-points dans une chaîne non guillemée
displayName: Status: Active

# CORRECT
displayName: "Status: Active"

Guillemets mal appairés dans les formules : Quand une formule contient des guillemets doubles, enveloppez la formule entière dans des guillemets simples.

# FAUX - guillemets doubles dans des guillemets doubles
formulas:
  label: "if(done, "Yes", "No")"

# CORRECT - guillemets simples enveloppant les guillemets doubles
formulas:
  label: 'if(done, "Yes", "No")'

Erreurs de formule courantes

Math Duration sans accès au champ : Soustraire deux dates retourne une Duration, pas un nombre. Accédez toujours à .days, .hours, etc.

# FAUX - Duration n'est pas un nombre
"(now() - file.ctime).round(0)"

# CORRECT - accédez d'abord à .days, puis arrondissez
"(now() - file.ctime).days.round(0)"

Vérifications null manquantes : Les propriétés peuvent ne pas exister sur toutes les notes. Utilisez if() pour protéger.

# FAUX - plante si due_date est vide
"(date(due_date) - today()).days"

# CORRECT - protégez avec if()
'if(due_date, (date(due_date) - today()).days, "")'

Référence à des formules indéfinies : Assurez-vous que chaque formula.X dans order ou properties a une entrée correspondante dans formulas.

# Ceci échouera silencieusement si 'total' n'est pas défini dans formulas
order:
  - formula.total

# Correction : définissez-la
formulas:
  total: "price * quantity"

Références

Skills similaires