[Code]: Fonction qui génère un calendrier en emacs lisp
11 réponses
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
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
Nobody can fix the economy. Nobody can be trusted with their finger on the button. Nobody's perfect. VOTE FOR NOBODY.
Xavier Maillard <zedek@gnu-rox.org> 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
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
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
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 :
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
Xavier Maillard <zedek@gnu-rox.org> 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 :
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) ».
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 :
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
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
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.
À 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
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
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.
> 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