function formatDateString(dateStr) {
if (/^\d{4}-\d{2}-\d{2}$/.test(dateStr)) {
const parts = dateStr.split('-');
const result = `${parts[2]}.${parts[1]}.${parts[0]}`;
return result;
} else {
const d = new Date(dateStr);
if (!isNaN(d)) {
const result = d.toLocaleDateString('it-IT', {
day: '2-digit',
month: '2-digit',
year: 'numeric'
}).replace(/\//g, '.');
return result;
}
return dateStr;
}
}
function formatTimeString(dateStr) {
if (/(AM|PM)/i.test(dateStr)) {
dateStr = "Jan 1, 1970 " + dateStr;
}
const d = new Date(dateStr);
if (!isNaN(d)) {
const formatted = d.toLocaleTimeString('it-IT', {
hour: '2-digit',
minute: '2-digit'
});
return formatted;
}
return dateStr;
}
let today = new Date();
let currentYear = today.getFullYear();
let currentMonth = today.getMonth() + 1;
function createCalendar(year, month) {
const calendarDiv = document.getElementById('calendar');
const daysOfWeek = ['Lun', 'Mar', 'Mer', 'Gio', 'Ven', 'Sab', 'Dom'];
const date = new Date(year, month - 1);
let html = '
';
// Headers
html += daysOfWeek.map(day => `
${day}
`).join('');
let firstDayIndex = (date.getDay() + 6) % 7;
let daysInMonth = new Date(year, month, 0).getDate();
// Empty cells at start
for (let i = 0; i < firstDayIndex; i++) {
html += '';
}
for (let day = 1; day <= daysInMonth; day++) {
let currentDate = new Date(year, month - 1, day);
const formattedDate = currentDate.toLocaleDateString('en-US', {
month: 'short',
day: '2-digit',
year: 'numeric'
});
let isToday = (currentDate.getDate() === today.getDate() &&
currentDate.getMonth() === today.getMonth() &&
currentDate.getFullYear() === today.getFullYear());
let todayClass = isToday ? " today" : "";
// try to match any of the possible date fields from the event
let eventObj = [...eventi, ...eventi26].find(evento => {
const evDate = evento.date || evento.startDate || evento.endDate;
return evDate === formattedDate;
});
let extraClass = eventObj ? ' has-event' : '';
const eventDateAttr = eventObj ? (eventObj.date || eventObj.startDate || eventObj.endDate || '') : '';
html += `
${day}
${eventObj ? `` : ''}
`;
}
let remainingCells = 7 - ((firstDayIndex + daysInMonth) % 7);
if (remainingCells < 7) {
for (let i = 0; i < remainingCells; i++) {
html += '';
}
}
const totalRows = Math.ceil((firstDayIndex + daysInMonth + remainingCells) / 7);
for (let i = totalRows; i < 6; i++) {
for (let j = 0; j < 7; j++) {
html += '';
}
}
html += '
';
calendarDiv.innerHTML = html;
document.getElementById('current-month').textContent = `${date.toLocaleString('it-IT', { month: 'long' }).toUpperCase()} ${year}`;
setTimeout(checkEvents, 50);
}
function changeMonth(delta) {
currentMonth += delta;
if (currentMonth < 1) {
currentMonth = 12;
currentYear--;
} else if (currentMonth > 12) {
currentMonth = 1;
currentYear++;
}
createCalendar(currentYear, currentMonth);
}
function checkEvents() {
document.querySelectorAll('.day').forEach(day => {
const calendarDateStr = day.getAttribute('calendar-date');
const calendarDate = new Date(calendarDateStr);
[...eventi, ...eventi26].forEach(evento => {
let eventStart, eventEnd;
if (evento.startDate || evento.endDate) {
eventStart = new Date(evento.startDate || evento.endDate);
eventEnd = new Date(evento.endDate || evento.startDate);
} else if (evento.date) {
eventStart = new Date(evento.date);
eventEnd = new Date(evento.date);
} else {
return;
}
if (calendarDate >= eventStart && calendarDate <= eventEnd) {
day.classList.add('has-event');
const formattedStart = formatDateString(evento.startDate || evento.date);
const formattedEnd = formatDateString(evento.endDate || evento.date);
const dateDisplay = (formattedStart === formattedEnd)
? formattedStart
: `Dal ${formattedStart} al ${formattedEnd}`;
const btn = day.querySelector('.event-dot');
if (btn) {
btn.setAttribute("data-date", dateDisplay);
} else {
day.innerHTML += ``;
}
}
});
});
}
function showEventDetails(button) {
const imageUrl = button.getAttribute('data-image');
const title = button.getAttribute('data-title');
const description = button.getAttribute('data-description');
const time = button.getAttribute('data-time');
const author = button.getAttribute('data-author');
const company = button.getAttribute('data-company');
// the event may supply a date, a datetime, or both; prefer data-date for display
const dateVal = button.getAttribute('data-date') || button.getAttribute('data-datetime') || '';
const imageContainer = document.querySelector(".event-image-container");
const dateContainer = document.querySelector(".datadescrizione");
const titleContainer = document.querySelector(".titolodescrizione");
const descriptionContainer = document.querySelector(".descrizioneoverlay");
const authorContainer = document.querySelector(".autoredescrizione");
const companyContainer = document.querySelector(".compagniadescrizione");
if (imageContainer) {
imageContainer.innerHTML = ``;
}
if (dateContainer) {
dateContainer.innerHTML = dateVal || time || '';
}
if (titleContainer) {
titleContainer.textContent = title;
}
if (descriptionContainer) {
descriptionContainer.textContent = description;
}
if (authorContainer) {
authorContainer.textContent = author;
}
if (companyContainer) {
companyContainer.textContent = company;
}
const detailsSection = button.closest('.div-eventicc')?.querySelector('.div-cdx');
if (detailsSection) {
detailsSection.classList.add('show');
}
}
const eventi = [];
const eventi26 = [];
// Check events after a short delay to see if they get populated
setTimeout(() => {
}, 1000);
// If the calendar is already rendered, re-run the event check so late-loaded CMS items show up.
if (typeof checkEvents === 'function') {
// If the DOM isn't ready yet, schedule for after it is.
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', checkEvents);
} else {
setTimeout(checkEvents, 0);
}
}
document.addEventListener("DOMContentLoaded", function () {
createCalendar(currentYear, currentMonth);
});
document.addEventListener("DOMContentLoaded", function () {
document.querySelectorAll('.testoStoria').forEach(function (el) {
let cleaned = el.innerHTML.replace(/ /g, ' ');
cleaned = cleaned.replace(/\s\s+/g, ' ');
el.innerHTML = cleaned.trim();
});
});
"Il Rumore delle Pagine" è una rassegna letteraria performativa che indaga e ricerca la materialità del testo letterario. La letteratura performativa oltrepassa la concezione tradizionale dellapresentazione di libri, andando a sperimentare e supportare il dialogo che si genera tra testoscritto, voce, ritmo, movimento, corpo, spazio e persone. La cultura della performatività ridefinisce il rapporto tra testo e lettore. L’idea di un lettore passivoviene messa in discussione: al suo posto subentrano una pluralità di lettori (e lettrici) cheattraversando l’atto della lettura fanno esperienza di un contatto con se stessi e con gli altri. Leparole condivise nell’atto della lettura risuonano in una zona intima che, grazie alla vibrazionedell’esperienza collettiva, ci permette di cogliere nuovi spunti di noi, degli altri e del mondo. Il progetto è concepito per permettere al pubblico di sperimentare modalità differenti dipartecipazione e di interazione tra il testo, la performance e il contesto sociale. Ma quali forme di vita può prendere un testo letterario? La rassegna proporrà presentazioni di libridi autori locali e nazionali, reading performativi, spettacoli, laboratorio di scrittura, storytelling,narrazioni di racconti vita e momenti di dialogo e riflessione. Dare centralità dell’atto performativo come strumento di coinvolgimento e comunicazione, inoltre,permette: da un lato di avvicinare in modo originale alla lettura un pubblico giovane – odiversamente giovane –, dall’altro di riprendere e valorizzare elementi di oralità importanti nellatradizione culturale sarda.
10/03/2026
Questo è il titolo dell'evento
Organizzatore/i
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.