OVH Cloud OVH Cloud

[Code]: Fonction qui génère un calendrier en emacs lisp

11 réponses
Avatar
Xavier Maillard
Bonsoir,

J'aimerais savoir si quelqu'un disposerait d'une fonction bien
faite capable de me générer un calendrier (à la manière de la
commande cal) en Emacs Lisp.

J'ai un premier jet de prêt mais malheureusement, je l'ai
très mal fait et du coup, il ne fonctionne correctement que pour
le mois de Juillet de cette année ;)

En fait je me prends la tête comme un fou pour essayer de gérer
*tous* les cas de figures et c'est surtout pour ça que je
commence à être agacé.

Si vous avez ça en stock, je suis preneur.

P.S: l'idéal serait qu'il soit prêt à être utilisé sur une page
web (sans tables et avec listes et CSS).

P.P.S: pour vous faire une idée de ce à quoi ressemble le mien,
rendez-vous à l'adresse: http://www.gnu-rox.org/blog/
--
Hito no kokoro wa kawareru mono

10 réponses

1 2
Avatar
Pascal Bourguignon
Xavier Maillard writes:

Bonsoir,

J'aimerais savoir si quelqu'un disposerait d'une fonction bien
faite capable de me générer un calendrier (à la manière de la
commande cal) en Emacs Lisp.



M-x calendar RET

P.S: l'idéal serait qu'il soit prêt à être utilisé sur une page
web (sans tables et avec listes et CSS).



Faudra voir le source: C-h f calendar RET C-x o C-e C-u 3 C-b RET

--
__Pascal Bourguignon__ http://www.informatimago.com/

Nobody can fix the economy. Nobody can be trusted with their finger
on the button. Nobody's perfect. VOTE FOR NOBODY.
Avatar
drkm
Pascal Bourguignon writes:

Faudra voir le source: C-h f calendar RET C-x o C-e C-u 3 C-b RET



'M-x find-fun <RET> calendar', en somme ?-)

--drkm
Avatar
drkm
Xavier Maillard writes:

En fait je me prends la tête comme un fou pour essayer de gérer
*tous* les cas de figures et c'est surtout pour ça que je
commence à être agacé.



L'idée de Pascal, de réutiliser 'calendar', est la bonne ÀMHA.

P.S: l'idéal serait qu'il soit prêt à être utilisé sur une page
web (sans tables et avec listes et CSS).



Bof. L'important est d'obtenir le calendrier. Le transformer
en quelque chose d'exploitable est à partir de là pas trop
compliqué. Tu peux t'inspirer du code suivant :

(let ((calendar-week-start-day 1))
(with-current-buffer (get-buffer-create "*zedek-calendar*")
(erase-buffer)
(generate-calendar-month 7 2005 0)))

Il génère un buffer, « *zedek-calendar* » (attention, le
contenu est écrasé à chaque évaluation), contenant le clandrier
d'un mois, de la forme :

July 2005
Mo Tu We Th Fr Sa Su
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

L'intérêt de fixer 'calendar-week-start-day' est d'être sûr de
sa valeur (afin de pouvoir analyser correctement le calendrier).

À partir de là, tu devrais pouvoir te débrouiller. En fait, je
ne vois pas exactement ce que tu veux, ce que tu entends par
« prêt à être utilisé sur une page web (sans tables et avec
listes et CSS) ».

--drkm
Avatar
drkm
drkm writes:

À partir de là, tu devrais pouvoir te débrouiller.



Bon. Je me suis amusé à regarder de plus près. Ceci
t'aide-t-il ?

(defun zdk:get-weeks (month year)
"Retourne le calendrier du mois MONTH de l'année YEAR.
Le calendrier est un vecteur de 6 semaines. Les deux dernières
semaines peuvent être nil. Chaque semaine est un vecteur de 7
jours (un jour est le numéro dans la semaine), du lundi au
dimanche. Les premiers jours de la première semaine peuvent être
nil."
(let ((calendar-week-start-day 1)
(weeks (make-vector 6 nil))
(day nil)
(w 0))
(with-temp-buffer
(erase-buffer)
(generate-calendar-month 7 2005 0)
(goto-char (point-min))
(line-move 1)
(end-of-line)
(while (condition-case nil
(progn (forward-char) t)
(end-of-buffer))
(let ((wk (make-vector 7 nil)))
(aset weeks w wk)
(dotimes (i 7)
(setq day (string-to-number
(buffer-substring (point) (+ 3 (point)))))
(when (> day 0)
(aset wk i day))
(forward-char 3)))
(incf w)))
weeks))

;; Je te laisse générer les noms de mois et de jours d'après des
;; variables de configuration.
;;
;; Si tu veux un source XHTML vraiment lisible, tu peux utiliser
;; 'format' pour que chaque élément fasse 2 caractères de long.
;;
(defun* zdk:insert-html-calendar (month year &optional (indent ""))
"... <à toi de voir>"
(insert indent "<ul class='zdk.calendar'>n"
indent " <li class='zdk.cal.head'>n"
indent " <ul>n"
indent " ")
(dolist (d '("Lu" "Ma" "Me" "Je" "Ve" "Sa" "Di"))
(insert " <li>" d "</li>"))
(insert "n"
indent " </ul>n")
(let ((weeks (zdk:get-weeks month year))
(i 0)
(w nil))
(while (setq w (aref weeks i))
(insert indent " <li class='zdk.cal.week'>n"
indent " <ul>n"
indent " ")
(dotimes (d 7)
(insert " <li>"
(if (aref w d) (int-to-string (aref w d)) " ")
"</li>"))
(insert "n"
indent " </ul>n"
indent " </li>n")
(incf i)))
(insert indent "</ul>n"))

Finalement, je ne suis pas certain que l'idée des vecteurs soit
bonne. A priori, lorsque j'ai commencé l'analyse du buffer, cela
semblait une bonne idée, car le nombre d'élément est connu et
fixe. Mais je pense que 'zdk:insert-html-calendar' serait plus
simple si 'zdk:get-weeks' générait des listes.

Pour la sortie, je te laisse adapter. Le code généré est
notamment plus large que 80 caractères, que je m'impose en
général comme limite. Mais il est intéressant dans ce cas
d'avoir un code qui fois 6 fois moins de lignes (enfin, un peu
plus, quand même).

Et enfin, le code n'est pas (presque) pas testé, et
perfectible. À tes risques et périls.

PS: Il faut vraiment que je me mette à adapter MML. Je sens
que ce code y gagnerait en lisibilité sur Usenet.

--drkm
Avatar
drkm
drkm writes:

(dotimes (d 7)
(insert " <li>"
(if (aref w d) (int-to-string (aref w d)) " ")
"</li>"))



Évidemment, il est préférable, si tu veux un calendrier
CSS-ready, d'attribuer une classe aux jours, et d'éviter le
point dans les noms de classe :

(dotimes (d 7)
(insert " <li class='zdk-cal-day'>"
(if (aref w d) (int-to-string (aref w d)) " ")
"</li>"))

Bien qu'en CSS, '.zdk-cal-day' ou '.zdk-cal-week li', dans ce
cas, c'est kif-kif.

--drkm
Avatar
Pascal Bourguignon
drkm writes:
Pascal Bourguignon writes:

Faudra voir le source: C-h f calendar RET C-x o C-e C-u 3 C-b RET



'M-x find-fun <RET> calendar', en somme ?-)



Oui, mais en passant par la case Help et en touchant les $20,000.

--
__Pascal Bourguignon__ http://www.informatimago.com/

Nobody can fix the economy. Nobody can be trusted with their finger
on the button. Nobody's perfect. VOTE FOR NOBODY.
Avatar
drkm
Pascal Bourguignon writes:

et en touchant les $20,000.



Je prends :-)

--drkm
Avatar
Xavier Maillard
On 5 Jul 2005, Pascal Bourguignon wrote:

Xavier Maillard writes:

> Bonsoir,
>
> J'aimerais savoir si quelqu'un disposerait d'une fonction
> bien faite capable de me générer un calendrier (à la manière
> de la commande cal) en Emacs Lisp.

M-x calendar RET



/o La misère, je n'y ai pas pensé :)
--
Xavier Maillard

main(){printf(&unix["21%six12"],(unix)["have"]+"fun"-0x60);}
Avatar
Xavier Maillard
On 5 Jul 2005, drkm wrote:

Pascal Bourguignon writes:

> et en touchant les $20,000.

Je prends :-)



Idem :)
--
Xavier Maillard

main(){printf(&unix["21%six12"],(unix)["have"]+"fun"-0x60);}
Avatar
Xavier Maillard
On 5 Jul 2005, drkm wrote:

Xavier Maillard writes:
À partir de là, tu devrais pouvoir te débrouiller. En fait, je
ne vois pas exactement ce que tu veux, ce que tu entends par
« prêt à être utilisé sur une page web (sans tables et avec
listes et CSS) ».



C'est une très bonne base pour débuter ;) En fait le problème
principal est vraiment d'avoir un calendrier "réaliste" et "bon".
Après, il n'y a plus aucune difficulté pour moi pour "réinsérer"
la bête au sein de mon propre code (notamment pour activer des
liens, etc ...).

Je te remercie pour ton aide.
--
Registered Linux-User #340967 with the Linux Counter, http://counter.li.org.
1 2