Abstraer un calendario mensual

propuesto por josejuan

Implementa una API para tu lenguaje preferido, que permita generar un calendario mensual de tal forma que tu API pueda ser utilizada para generar calendarios en cualquier soporte (texto, html, una API gráfica, etc...).

Enunciado
Es frecuente tener que presentar un calendario, pero no siempre disponemos de una API que nos permita generar ese calendario en la forma en que nosotros necesitamos.

El desafío consiste en escribir un API que permita generar calendarios mensuales (indicando por ejemplo el primer mes a generar, el número de filas y columnas en meses que deben generarse y el primer día de la semana que queremos considerar) pero sin renderizarlos a una salida en particular (texto, html, ...) el renderizado debe poderse especificar fuera de tu API, de tal forma que pueda ser reutilizada para generar calendarios en múltiples soportes.

Por ejemplo, supongamos que tenemos implementada nuestra API
void renderCalendar(renderCallBack, columns, rows, firstYearMonth, firstWeekDay)


Entonces, alguien debería poder crear una función como renderizarComoTexto, llamar a la función con algo como
renderCalendar( renderizarComoTexto, 2, 2, 2014-7, Monday )

y obtener un calendario en modo texto como por ejemplo
     July - 2014      |     August - 2014
 Mo Tu We Th Fr Sa Su |  Mo Tu We Th Fr Sa Su
     1  2  3  4  5  6 |               1  2  3
  7  8  9 10 11 12 13 |   4  5  6  7  8  9 10
 14 15 16 17 18 19 20 |  11 12 13 14 15 16 17
 21 22 23 24 25 26 27 |  18 19 20 21 22 23 24
 28 29 30 31          |  25 26 27 28 29 30 31
                      |
---------------------------------------------
   September - 2014   |     October - 2014
 Mo Tu We Th Fr Sa Su |  Mo Tu We Th Fr Sa Su
  1  2  3  4  5  6  7 |         1  2  3  4  5
  8  9 10 11 12 13 14 |   6  7  8  9 10 11 12
 15 16 17 18 19 20 21 |  13 14 15 16 17 18 19
 22 23 24 25 26 27 28 |  20 21 22 23 24 25 26
 29 30                |  27 28 29 30 31


Entonces sin modificar tu API otra persona debería poder escribir una función como renderizarComoHtml, llamar ahora como
    renderCalendar( renderizarComoHtml, 2, 2, 2014-7, Monday )

y obtener un calendario en HTML como por ejemplo


Y así, tu API de generar calendarios es independiente de dónde y como se renderice.

Ver todo el enunciado

Preguntas sobre el desafío
  • No entiendo por qué hay que indicar el día de la semana para el 1 de cada mes, ¿no se puede sacar a partir de la fecha?. Y podiéndose modificar, ¿para que querría alguien un calendario que marcase como jueves el 1 de julio de 2014?

    Hola Drabor, que yo sepa, las semanas pueden empezar (según culturas) en Lunes, Sábado o Domingo (véase http://es.wikipedia.org/wiki/Semana#Comienzo_de_la_semana ) pero, ya por poco ¿porqué no permitir todos? ;)

Plantea tu pregunta

2 Soluciones

Dar mi solución

Dar mi solución