Source: index.js

const chalk = require('chalk');
const language = require('./app/module/language');

var display = [
    [
        {
            palabra: "It",
            estado: 1,
            id:"it"
        },
        {
            palabra: " ",
            estado: 1,
            id:""
        },
        {
            palabra: "is",
            estado: 1,
            id:"is"
        },
        {
            palabra: " ",
            estado: 0,
            id:""
        },
        {
            palabra: "twenty",
            estado: 0,
            id:"m_20"
        }
    ],
    [
        {
            palabra: "quarter",
            estado: 0,
            id:"m_15"
        },
        {
            palabra: " ",
            estado: 0,
            id:""
        },
        {
            palabra: "half",
            estado: 0,
            id:"m_30"
        }
    ],
    [
        {
            palabra: "ten",
            estado: 0,
            id:"m_10"
        },
        {
            palabra: "five",
            estado: 0,
            id:"m_5"
        },
        {
            palabra: " ",
            estado: 0,
            id:""
        },
        {
            palabra: "past",
            estado: 0,
            id:"past"
        }
    ],
    [
        {
            palabra: "to",
            estado: 0,
            id:"to"
        },
        {
            palabra: " ",
            estado: 0,
            id:""
        },
        {
            palabra: "twelve",
            estado: 0,
            id:"h_0"
        },
        {
            palabra: "one",
            estado: 0,
            id:"h_1"
        }
    ],
    [
        {
            palabra: "two",
            estado: 0,
            id:"h_2"
        },
        {
            palabra: "three",
            estado: 0,
            id:"h_3"
        },
        {
            palabra: "four",
            estado: 0,
            id:"h_4"
        }
    ],
    [
        {
            palabra: "five",
            estado: 0,
            id:"h_5"
        },
        {
            palabra: "six",
            estado: 0,
            id:"h_6"
        },
        {
            palabra: "seven",
            estado: 0,
            id:"h_7"
        }
    ],
    [
        {
            palabra: "eight",
            estado: 0,
            id:"h_8"
        },
        {
            palabra: "nine",
            estado: 0,
            id:"h_9"
        },
        {
            palabra: "ten",
            estado: 0,
            id:"h_10"
        }
    ],
    [
        {
            palabra: " ",
            estado: 0,
            id:""
        },
        {
            palabra: " ",
            estado: 0,
            id:""
        },
        {
            palabra: " ",
            estado: 0,
            id:""
        },
        {
            palabra: "eleven",
            estado: 0,
            id:"h_11"
        },
        {
            palabra: " ",
            estado: 0,
            id:""
        },
        {
            palabra: " ",
            estado: 0,
            id:""
        },
        {
            palabra: " ",
            estado: 0,
            id:""
        }
    ],
    [
        {
            palabra: " ",
            estado: 0,
            id:""
        },
        {
            palabra: "O'Clock",
            estado: 0,
            id:"m_0"
        },
        {
            palabra: " ",
            estado: 0,
            id:""
        },
        {
            palabra: "now",
            estado: 1,
            id:"now"
        }
    ],
]


console.log(chalk.greenBright("---WordClock---"))

/**
 * Reinicia el display a sus valores por defecto
 * 
 */
function resetDisplay(){
    display.map(fila=>{
        fila.map(columna=>{
            if(columna.id=="it"||columna.id=="is"||columna.id=="now"){
                display[display.indexOf(fila)][fila.indexOf(columna)].estado=1
            }else{
                display[display.indexOf(fila)][fila.indexOf(columna)].estado=0
            }
        })
    })
}

/**
 * Crea la presentacion por pantalla y actualiza segun el estado del objeto display
 */
function actualizar_display() {
    console.clear()
    display.map(fila => {
        var show = []
        fila.map(columna => {
            //evaluar si la columna tiene un estado activo o inactivo y guardar el estado
            if (columna.estado == 0) {
                show.push(chalk.gray(columna.palabra))
            }else{
                show.push(chalk.yellowBright(columna.palabra))
            }
        })
        console.log(show.join(""))
    })
}

/**
 * Actualiza el estado a activo
 * @param  {string} id Recibe el id del elemento a actualizar
 */
function cambiar_estado(id){
    display.map(fila=>{
        fila.map(columna=>{
            //buscar la hora correspondiente mediante el id y cambiar su estado a 1
            if(columna.id==id){
                display[display.indexOf(fila)][fila.indexOf(columna)].estado=1
            }
        })
    })
}

/**
 * Funcion de inicio. Configura la hora y los minutos y llama a las funciones que cambian los estados de cada palabra
 * @param  {*}
 * @return  {*}
 */
function hora() {
    resetDisplay()
    var now = new Date();
    var hour = now.getHours();
    var minute = now.getMinutes();
    var offset;
    var next;

    hour = hour % 12;
    minute = minute - minute % 5;

    if (minute > 30) {//si hay mas de 30 minutos
        //activa la hora pasada tanto
        cambiar_estado("h_"+(hour+1))

        //activa el to 
        cambiar_estado("to")

    } else {
        //activa la hora correspondiente
        cambiar_estado("h_"+hour)
        if (minute !== 0) {
            //activa la palabra pasado /past
            cambiar_estado("past")
        }
    }


    offset = (minute > 30) ? (60 - minute) : minute;

    minutes = {
        0: "m_0",
        5: "m_5",
        10:"m_10",
        15:"m_15",
        20:"m_20",
        30:"m_30",
    };

    if (offset in minutes) {
        //activa los minutos
        cambiar_estado("m_"+offset)

    } else if (offset === 25) {
        cambiar_estado("m_20")
        cambiar_estado("m_25")
    }

    now.setTime(Date.now());
    next = new Date(now.getTime());
    next.setMinutes(minute + 5);
    next.setSeconds(0);
    next.setMilliseconds(0);
    actualizar_display()
}

/**
 * Permite reemplazar el array de display por el correspondiente segun el idioma seleccionado
 * @param {string} lang idioma a cambiar
 */
function cambiar_idioma(lang){
    if(lang=="es"||lang=="en"||lang=="eo"){
        display=language[lang]
    }else{
        console.log("argumento desconocido, usando idioma por defecto")
    }
    
}

cambiar_idioma(process.argv[2])

setInterval(hora,60000)