*** consiste à analyser, dans les éditoriaux et articles de presse, les revendications portées tant par les acteurs politiques institutionnels que non institutionnels afin d’analyser les liens entre émetteur de revendications, cibles des revendications, le degré de contestation et le contenu substantiel de ces revendications ## Notes de bas de page ```dataviewjs // === DONNÉES === const page = dv.current(); const file = page.file; const outlinks = file.outlinks.length; const inlinks = file.inlinks.length; const qualite = Math.max(0, Math.min(100, page["qualité"] ?? 0)); // === CALCUL PROGRESSION (0–100) === const max_links = 30; const s_out = Math.min(outlinks / max_links, 1) * 40; const s_in = Math.min(inlinks / max_links, 1) * 30; const s_qual = qualite * 0.3; const total = Math.round(s_out + s_in + s_qual); // === ICÔNES === const iconEmoji = total <= 25 ? "🌱" : total <= 50 ? "🌿" : total <= 75 ? "🌳" : "🦚"; const iconLabel = total <= 25 ? "🌱 Graine" : total <= 50 ? "🌿 Jeune pousse" : total <= 75 ? "🌳 Arbre mature" : "🦚 Forêt"; // === MISE À JOUR YAML SANS CRÉER DE NOUVELLES CLÉS === const tfile = app.workspace.getActiveFile(); const cache = app.metadataCache.getFileCache(tfile); // 1. Si pas de frontmatter → on ne touche à rien if (cache?.frontmatter) { await app.fileManager.processFrontMatter(tfile, fm => { // 2. On met à jour seulement si la propriété existe déjà if (Object.prototype.hasOwnProperty.call(fm, "progression")) { fm.progression = total; } if (Object.prototype.hasOwnProperty.call(fm, "icon")) { fm.icon = iconEmoji; } }); } // === AFFICHAGE === dv.table( ["Liens sortants", "Liens entrants", "Qualité", "Progression"], [[outlinks, inlinks, `${qualite}/100`, `${iconLabel} — ${total}/100`]] ); ```