Aller au contenu

Outils péda & activités pour apprendre

  • Conditions générales
  • La pédagothèque
  • Plan du site
  • Qui suis-je ?
Outils péda & activités pour apprendre

Plan du site

Pages

  • Conditions générales
  • La pédagothèque
  • Plan du site
  • Qui suis-je ?

Articles par catégorie

  • Catégorie : Le cerveau et l'apprentissage
    • Réinventer la pédagogie : enseignants, animateurs, parents unis dans l’apprentissage
    • 6 idées de supports pédagogiques DIY à créer cet été (avec des enfants, ados ou adultes)
    • Comprendre le cerveau : la neuroplasticité – partie 1
    • Créer des ressources pédagogiques : 8 convictions qui m’ont amenée à lancer ce site
    • Comment le cerveau apprend : les bases expliquées simplement
    • Accueil

Si vous avez aimé l'article, vous êtes libres de le partager.

© 2025 Outils péda & activités pour apprendre - Thème WordPress par Kadence WP

/* ========= Pédagothèque – Script de secours (Footer) ========= */ (function(){ // 1) Ton lien CSV publié (output=csv) const CSV_URL = "https://docs.google.com/spreadsheets/d/e/2PACX-1vQ_CeDxJ9lsHni8E3LzfvOTcn5p7dM2wm-DS6_uDPfyu_vsa_v0jTbmmx_pnDbSiRg8ikAsQFp3NPRG/pub?gid=216051477&single=true&output=csv"; // 2) (Optionnel) Lien de secours au format gviz (si tu le crées) : // Exemple: https://docs.google.com/spreadsheets/d/ID/gviz/tq?tqx=out:csv&sheet=NOM_FEUILLE const FALLBACK_URL = "https://www.creerpourapprendre.fr/"; // <- laisse vide si tu n'en as pas // ===== Utilitaires const $ = s => document.querySelector(s); const esc = s => String(s ?? "").replace(/[&<>"']/g, m => m==="&"?"&":m==="<"?"<":m===">"?">":m==='"'?""":"'"); const norm = s => (s||"").toLowerCase().normalize("NFD").replace(/\p{Diacritic}/gu,"").replace(/[^a-z0-9]+/g,"_").replace(/^_+|_+$/g,""); const CANON = { titre:["titre","nom","titre_ressource"], url_source:["url_source","url","lien","lien_source","adresse","adresse_url"], cycle:["cycle","cycles"], discipline:["discipline","disciplines","matiere","matieres"], type_ressource:["type_ressource","type","categorie","cat"], mini_resume:["mini_resume","resume","description_courte","description"], duree_minutes:["duree_minutes","duree","durée","duree_min","temps"], licence:["licence","license","rights","droit","droits"], accessibilite:["accessibilite","accessibilite_s","access","accessibilite_tags"], note_qualite_0_100:["note_qualite_0_100","note","score","qualite","qualite_score"], date_dernier_controle:["date_dernier_controle","controle","verif","maj","date_maj","mise_a_jour"], tags_libres:["tags_libres","tags","mots_cles","keywords","motcles"], gratuit:["gratuit","gratuit_payant","payant"], image_url:["image_url","image","visuel","illustration"] }; function parseCSV(text){ const rows=[]; let cur=[], field='', inQ=false; for(let i=0;ir.length && r.some(x=>(x||'').trim()!=='')); } function toRecords(rows, debug){ const rawH = rows[0].map(h=>h.trim()), normH = rawH.map(norm), idx={}; Object.entries(CANON).forEach(([canon,vars])=>{ for(const v of vars){ const i=normH.indexOf(norm(v)); if(i!==-1){idx[canon]=i;return;} } const j=normH.indexOf(norm(canon)); if(j!==-1) idx[canon]=j; }); if(debug) debug.innerHTML = `Debug — ${rows.length-1} ligne(s) chargée(s).
En-têtes : ${rawH.map(h=>`${esc(h)}`).join(' · ')}
Mapping : ${ Object.keys(CANON).map(k=>`${k} → ${idx[k]!==undefined?'OK':'manquant'}`).join(' · ') }`; return rows.slice(1).map(r=>{ const o={}; Object.keys(CANON).forEach(k=>{ const i=idx[k]; o[k]=(i!==undefined && r[i]!=null)? r[i].trim() : ""; }); return o; }); } function cardHTML(x){ const titre=x.titre||'Sans titre', url=x.url_source||'#', cycle=x.cycle||'', discipline=x.discipline||'', type=x.type_ressource||'', resume=x.mini_resume||'', duree=x.duree_minutes||'', licence=x.licence||'', access=x.accessibilite||'', qual=x.note_qualite_0_100||'', dateC=x.date_dernier_controle||'', image=x.image_url||'', gratuit=(x.gratuit||'').toLowerCase()==='oui'?'Gratuit':''; return `

${esc(titre)}

${type? `${esc(type)}`:''} ${discipline? `${esc(discipline)}`:''} ${gratuit? `${esc(gratuit)}`:''}
${image? ``:''}

${esc(resume)}

    ${cycle? `
  • Cycle : ${esc(cycle)}
  • `:''} ${duree? `
  • Durée : ${esc(duree)} min
  • `:''} ${licence? `
  • Licence : ${esc(licence)}
  • `:''} ${access? `
  • Access. : ${esc(access)}
  • `:''}
Voir la ressource
`; } function render(records, grid, debug, status){ grid.innerHTML = records.map(cardHTML).join(''); const n = grid.querySelectorAll('.card').length; if(debug) debug.innerHTML += `
Cartes générées : ${n}`; if(n===0 && status){ status.innerHTML = "ℹ️ Aucune carte générée. Vérifie que la première ligne de données contient au moins titre et url_source."; } } function onceDomReady(fn){ if(document.readyState === 'complete' || document.readyState === 'interactive'){ setTimeout(fn, 0); } else document.addEventListener('DOMContentLoaded', fn, {once:true}); } async function fetchCSV(url, debug, status){ if(debug) debug.textContent = "Debug — JS footer actif, chargement…"; try{ const resp = await fetch(url, {cache:'no-store', credentials:'omit'}); if(debug) debug.innerHTML += `
HTTP: ${resp.status} ${resp.statusText}`; if(!resp.ok) throw new Error(`HTTP ${resp.status}`); const txt = await resp.text(); if(debug){ const preview = txt.split('\n').slice(0,2).join('\n'); debug.innerHTML += `
Extrait:
${esc(preview)}
`; } return txt; }catch(e){ if(status) status.innerHTML = "❌ Échec du chargement CSV à l’URL 1."; if(debug) debug.innerHTML += `
Erreur 1 : ${esc(e.message)}`; throw e; } } async function init(){ const debug = $('#debug'), status=$('#status'), grid=$('#grid'), filters=$('#filters'); if(!grid){ console.warn("Pedagotheque: #grid introuvable"); return; } if(status) status.textContent = "Chargement des ressources…"; let txt; try{ txt = await fetchCSV(CSV_URL, debug, status); }catch(e){ if(FALLBACK_URL){ if(debug) debug.innerHTML += `
→ Tentative avec l’URL de secours…`; try{ txt = await fetchCSV(FALLBACK_URL, debug, status); }catch(e2){ if(status) status.innerHTML = "❌ Impossible de charger le CSV (URL principale et de secours)."; return; } }else{ return; } } const rows = parseCSV(txt); if(!rows.length){ if(status) status.innerHTML="❌ CSV vide ou mal formé."; return; } const records = toRecords(rows, debug); render(records, grid, debug, status); // Facettes dynamiques const uniq = arr => Array.from(new Set(arr.filter(Boolean))).sort((a,b)=>a.localeCompare(b,'fr',{sensitivity:'base'})); const make = (el,name,vals)=>{ if(!el) return; el.innerHTML = vals.map(v=>``).join(''); }; const facetCycle=$('#facet-cycle'), facetDis=$('#facet-discipline'), facetType=$('#facet-type'), facetAcc=$('#facet-access'); make(facetCycle,'cycle', uniq(records.map(x=>x.cycle))); make(facetDis,'discipline', uniq(records.map(x=>x.discipline))); make(facetType,'type', uniq(records.map(x=>x.type_ressource))); const accSplit = records.flatMap(x => (x.accessibilite||'').split(/[;,]/).map(s=>s.trim()).filter(Boolean)); make(facetAcc,'access', uniq(accSplit)); if(filters){ function getChecks(name){ return Array.from(filters.querySelectorAll(`input[name="${name}"]:checked`)).map(i=>i.value.toLowerCase()); } function matches(card){ const qv = ($('#q')?.value || '').trim().toLowerCase(); const cycles = getChecks('cycle'), dis=getChecks('discipline'), types=getChecks('type'), accs=getChecks('access'); const dm = parseInt($('#dur')?.value || '0', 10); const any = qv || cycles.length || dis.length || types.length || accs.length || (dm>0); if(!any) return true; const txt = (card.dataset.titre + ' ' + card.dataset.text).toLowerCase(); if (qv && !txt.includes(qv)) return false; if (cycles.length && !cycles.includes((card.dataset.cycle||'').toLowerCase())) return false; if (dis.length && !dis.includes((card.dataset.discipline||'').toLowerCase())) return false; if (types.length && !types.includes((card.dataset.type||'').toLowerCase())) return false; if (accs.length){ const v=(card.dataset.access||'').toLowerCase(); if (!accs.some(a => v.includes(a))) return false; } if (!Number.isNaN(dm) && dm>0){ const d=parseInt(card.dataset.duree || '999', 10); if (d > dm) return false; } return true; } function sortCards(list){ const mode = $('#sort')?.value || 'pertinence'; const toDate = s => new Date(s||'1970-01-01').getTime(); return list.sort((a,b)=>{ if(mode==='date') return toDate(b.dataset.date)-toDate(a.dataset.date); if(mode==='qualite') return (parseInt(b.dataset.qualite||'0',10))-(parseInt(a.dataset.qualite||'0',10)); if(mode==='duree') return (parseInt(a.dataset.duree||'0',10))-(parseInt(b.dataset.duree||'0',10)); return 0; }); } function apply(){ const cards = Array.from($('#grid').querySelectorAll('.card')); const vis = cards.filter(c=>matches(c)); const sorted = sortCards(vis); cards.forEach(c=>c.style.display='none'); sorted.forEach(c=>c.style.display=''); const cnt = $('#results-count'); if(cnt) cnt.textContent = `${sorted.length} ressource${sorted.length>1?'s':''} trouvée${sorted.length>1?'s':''}`; } filters.hidden=false; filters.addEventListener('input', apply); apply(); } if(status) status.textContent = ""; } onceDomReady(init); })();
Manage Consent
To provide the best experiences, we use technologies like cookies to store and/or access device information. Consenting to these technologies will allow us to process data such as browsing behavior or unique IDs on this site. Not consenting or withdrawing consent, may adversely affect certain features and functions.
Functional Toujours activé
The technical storage or access is strictly necessary for the legitimate purpose of enabling the use of a specific service explicitly requested by the subscriber or user, or for the sole purpose of carrying out the transmission of a communication over an electronic communications network.
Preferences
The technical storage or access is necessary for the legitimate purpose of storing preferences that are not requested by the subscriber or user.
Statistics
The technical storage or access that is used exclusively for statistical purposes. The technical storage or access that is used exclusively for anonymous statistical purposes. Without a subpoena, voluntary compliance on the part of your Internet Service Provider, or additional records from a third party, information stored or retrieved for this purpose alone cannot usually be used to identify you.
Marketing
The technical storage or access is required to create user profiles to send advertising, or to track the user on a website or across several websites for similar marketing purposes.
Gérer les options Gérer les services Gérer {vendor_count} fournisseurs En savoir plus sur ces finalités
View preferences
{title} {title} {title}
  • Conditions générales
  • La pédagothèque
  • Plan du site
  • Qui suis-je ?