É possível para Conky exibir o Tempo em palavras e não em números?

10

Quero que Conky mostre o tempo usando palavras e não números.

O que eu quero fazer é mais ou menos a aparência do Pebble Watch ( relógio vermelho ).

insira a descrição da imagem aqui

Como na imagem, mesmo que apenas a hora e não a data possam ser exibidas.

Isso é possível?

Uri Herrera
fonte
na verdade, usar imagens me parece muito mais difícil ... Eu nunca programei em Lua ou usei Conky antes, mas vi um bom desafio de segunda-feira de manhã e levei duas horas do início ao fim, incluindo a resposta: P
Gerhard Burger
Tudo bem, foi apenas um pensamento que eu tinha. Ainda não tentei qual das respostas funciona melhor.
Uri Herrera

Respostas:

9

Solução de script Lua

Isso é realmente possível usando o script Lua. Você pode usar o script abaixo (a conversão numérica é obtida em rosettacode.org ).

O script pode fazer uma opção chata, que traduzirá 12:45 para "doze e quarenta e cinco" e uma ótima opção que o traduzirá para "um quarto para um". Ele também faz uma opção Uri Herrera, que faz a hora em negrito;)

Também atualiza automaticamente quando o tempo muda.

words = {"one ", "two ", "three ", "four ", "five ", "six ", "seven ", "eight ", "nine "}
levels = {"thousand ", "million ", "billion ", "trillion ", "quadrillion ", "quintillion ", "sextillion ", "septillion ", "octillion ", [0] = ""}
iwords = {"ten ", "twenty ", "thirty ", "forty ", "fifty ", "sixty ", "seventy ", "eighty ", "ninety "}
twords = {"eleven ", "twelve ", "thirteen ", "fourteen ", "fifteen ", "sixteen ", "seventeen ", "eighteen ", "nineteen "}

function digits(n)
  local i, ret = -1
  return function()
    i, ret = i + 1, n % 10
    if n > 0 then
      n = math.floor(n / 10)
      return i, ret
    end
  end
end

level = false
function getname(pos, dig)
  level = level or pos % 3 == 0
  if(dig == 0) then return "" end
  local name = (pos % 3 == 1 and iwords[dig] or words[dig]) .. (pos % 3 == 2 and "hundred " or "")
  if(level) then name, level = name .. levels[math.floor(pos / 3)], false end
  return name
end

function numberToWord(number)
    if(number == 0) then return "zero" end
    vword = ""
    for i, v in digits(number) do
      vword = getname(i, v) .. vword
    end

    for i, v in ipairs(words) do
      vword = vword:gsub("ty " .. v, "ty-" .. v)
      vword = vword:gsub("ten " .. v, twords[i])
    end
    return vword
end

function conky_boringTime()
    hour = os.date("%H") + 0
    minute = os.date("%M") + 0
    return numberToWord(hour) .. numberToWord(minute)
end

function conky_awesomeTime()
    hour = os.date("%H") + 0
    minute = os.date("%M") + 0
    hour = hour % 12
    if(hour == 0) then 
        hour, nextHourWord = 12, "one " 
    else
        nextHourWord = numberToWord(hour+1)
    end
    hourWord = numberToWord(hour)
    if(minute == 0 ) then 
        return hourWord .. "o'clock"
    elseif(minute == 30) then
        return "half past " .. hourWord
    elseif(minute == 15) then
        return "a quarter past " .. hourWord 
    elseif(minute == 45) then
        return "a quarter to " .. nextHourWord 
    else
        if(minute < 30) then
            return numberToWord(minute) .. "past " .. hourWord
        else
            return numberToWord(60-minute) .. "to " .. nextHourWord
        end
    end
end

function conky_getHourWord()
    return numberToWord(os.date("%H") + 0)
end

function conky_getMinuteWord()
    return numberToWord(os.date("%M") + 0)
end

Agora salve-o em algum lugar, para o propósito desta pergunta, assuma que o salvamos como ~/.config/conky/scripts/pretty_time.lua

Agora edite seu .conkyrc, antes de TEXTadicionar uma linha

lua_load ~/.config/conky/scripts/pretty_time.lua

isso carrega o script para que possamos acessar as funções.

Em seguida, no local apropriado abaixo TEXT, você pode chamar as funções da seguinte maneira (conky adiciona automaticamente o conky_prefixo)

TEXT
...
${color grey}Boring time:$color ${lua boringTime}
${color grey}Awesome time:$color ${lua awesomeTime}
${color grey}Special Uri Herrera:$color ${font Aria:bold} ${lua getHourWord}$font ${lua getMinuteWord}
...

Isso resultará em

insira a descrição da imagem aqui

Se você quer os segundos, não deve ser muito difícil se adicionar.

Gerhard Burger
fonte
Ótimo! funciona bem, agora descubra como alterar o tamanho do texto.
Uri Herrera
3

Sim, é possível, mas apenas através de scripts Lua. Você precisará de um script que capte números e produza palavras. Muitos frameworks como o Django possuem esse recurso, mas você pode estar sozinho, a menos que haja uma biblioteca Lua equivalente para ele:

function conky_translate_number(number) {
    if (number == 1) { 
        return "one";
    } else {
        return "not a clue";
    }
}

Você pode simplesmente escrever um script Python que aproveite o Django para a tradução usando sua linguagem de modelagem.

Naftuli Kay
fonte
Ok obrigado, você pode adicionar um exemplo?
Uri Herrera
Feito, rudimentar, mas sim. I pode elaborar se você gostaria, mas parece fora do âmbito da pergunta para lhe ensinar Python em sua totalidade :)
Naftuli Kay
É um pouco complicado do que eu pensava, eu estava pensando mais sobre como usar imagens que contenham palavras completas (uma, duas, três etc.) e que cada uma dessas imagens mudaria de acordo com o tempo, por isso, se forem 12 : 22 exibiria doze vinte e dois.
Uri Herrera
@UriHerrera, na verdade, é bastante factível, veja a minha resposta
Gerhard Burger
2

você pode escrever um script python para isso usando a pynum2wordbiblioteca disponível nesta página do sourceforge

Basicamente, o que faz é:

>>> import num2word
>>> num2word.to_card(10)
'ten'
>>> num2word.to_card(100)
'one hundred'
>>> num2word.to_card(1025)
'one thousand and twenty-five'

um exemplo trivial é o que eu fiz aqui:

>>> import datetime
>>> import num2word
>>> now = datetime.datetime.now()
>>> t = datetime.time(now.hour, now.minute, now.second).strftime('%H:%M:%S').split(':')
>>> print "%s hours %s minutes and %s seconds" %(num2word.to_card(t[0]), num2word.to_card(t[1]), num2word.to_card(t[2]))
>>> two hours thirty one minutes and fifteen seconds

Agora, para tornar isso renderizado pelo conky, crie um diretório dentro do seu diretório de configuração conky, por exemplo, ~/.conky/pyscripts/e coloque a pynum2wordbiblioteca dentro dele, agora crie outro arquivo, diga timeToWorde coloque este script neste arquivo:

#!/bin/python
import datetime
import num2word
now = datetime.datetime.now()
t = datetime.time(now.hour, now.minute, now.second).strftime('%H:%M:%S').split(':')
print "%s hours %s minutes and %s seconds" %(num2word.to_card(t[0]), num2word.to_card(t[1]), num2word.to_card(t[2]))

Você pode alterar a formatação da hora e incluir a data também, se desejar. Para opções de formatação, consulte esta página .

abra o arquivo de configuração conky /etc/conky/conky.confe coloque esta linha em algum lugar:

{execpi 30 ~/.conky/pyscripts/timeToWord}

O que essa linha faz é executar o arquivo de script a cada 30 segundos e atualizar a saída na janela conky.

É claro que você pode colocar livremente os arquivos de script em qualquer diretório, mas verifique se a pynum2wordbiblioteca está no mesmo diretório.

Gufran
fonte
Interessante, mas diga que não sei como adicionar isso ao Conky. Como adiciono ou O que o arquivo Conky faz para importar a biblioteca? então mostra a hora assim.
Uri Herrera
Acabei de atualizar a resposta, revise.
Gufran
0

Você não poderia criar uma fonte de símbolo que consiste em imagens da palavra escrita para cada numeral? Do que você deve apenas escolher essa fonte (se possível) para a exibição do tempo.

diamy27
fonte
É isso mesmo, surpreendentemente, o Conky não carrega todas as fontes. Eu tenho fontes que Conky simplesmente não carrega e são padronizadas como Arial ou Times New Roman. Sem mencionar que todo o trabalho de criação de uma fonte significa. Também a imagem que usei é um exemplo, gostaria de ter Horas em uma fonte em negrito e Minutos em uma fonte Fina / Leve.
Uri Herrera
Isso nem funcionaria para números maiores que nove.
Alistair Buxton