如何实现AwesomeWM textclock小部件的序数日期?

时间:2017-07-23 11:42:57

标签: linux lua calendar window-managers awesome-wm

我正在使用AwesomeWM v4.0-170-g6c24848-dirty,针对Lua 5.3.3进行编译;我开始自定义我的小部件。

其中一个是时钟,技术上wibox.widget.textclock()。我已经能够改变format以更改顺序,添加自定义消息,例如“今天是星期日,2017年7月23日”,但是......没有关于序数的线索。

我的意思是如何将'rd'添加到 23rd ,并根据当前日期进行更改,例如 21 st 22 nd 24

我尝试在格式之前添加ordinal变量,然后在if-else语句中根据日期确定其值。但是,这不起作用:我既不能在函数外“使用”日期格式,也不能在format内实现变量。

据我所知,字符串中的变量可以像下面的例子一样实现:

print("Hello " .. name .. ", the value of key " .. k .. " is " .. v .. "!")

但是,这不适用于此。我的线索已经用完了,你能给我一个灯吗?

到目前为止,我编写了一个通用的'th'日期格式:

mytextclock = wibox.widget.textclock(" %a %dth %B, %H:%M ", 60)

......其产出将是:每周一天,HH,MM。

2 个答案:

答案 0 :(得分:0)

<强>背景

首先,我考虑了两个选项来解决问题:

<强> 1。从整个输出字符串中选择日期:在程序处理之后,在Lua中使用某种Bash echo $2(考虑类似dayoftheweek day month hh:mm的输出)等效...

<强> 2。从头开始单独处理变量day :这意味着找到一种方法来获取变量而不使用整个字符串,一旦我们拥有它...

...稍后使用if-else结构处理它,这会根据其值改变输出。

出于速度原因,我使用了第二种方式。我发现从一开始就更容易和更清晰地获取变量,而不是将一些代码行专用于从输出中提取。

所以我开始使用%d作为我的主要变量来工作,这在Lua中用来表示日期中的日期。 (source

这里的主要交易是将%d的内容转换为字符串:

day = "%d" -- This is supposed to be an integer now.
daynumber = tostring(day) -- Converts it to a string.
lastdigit = tostring(day, -1)
print(lastdigit) -- Output: d.

BOOM!失败。这不起作用,我希望有人可以在评论中说出原因。如果我打印最新的char(-1),输出总是d,如果我尝试-2,我会得到全天的值。

我的主要理论基于事实输入:

a = "%d"
print(a)
Lua解释器中的

(shell中的$ lua)只返回%d,根本没有整数;但这只是一个假设。更重要的是,据我所知,%d在日期上下文中使用,而不是独立地作为变量的值。

可能的解决方案:

day = os.date("%d") -- First of all we grab the day from the system time.

-- As Lua displays the day with two digits, we are storing both of them in variables in order to process them separately later.
firstdigit = string.sub(day, 0, 1) 
lastdigit = string.sub(day, -1) 

-- We don't want Awesome to display '01st August' or '08th September'. We are going to suppress the '0'.
if firstdigit == "0" then
  day = lastdigit
end

-- Now we want to display the day with its respective ordinal: 1st, 2nd, 3rd, 4th... we are going to process the last digit for this.
if lastdigit == "1" then
  ordinal = "st"
elseif lastdigit == "2" then
  ordinal = "nd"
elseif lastdigit == "3" then
  ordinal = "rd"
else
  ordinal = "th"
end

-- Finally, we display the final date.
mytextclock = wibox.widget.textclock(" %a " ..day..ordinal.. " %B %H:%M ", 60)

...所以我们得到以下输出:

1st

2nd

3rd

5th

答案 1 :(得分:0)

我的conky文件中包含以下内容:

${exec /home/..../scripts/date-ordinal.sh}

date-ordinal.sh包含:

#!/bin/bash

the_Day=$(date +'%d')

case $the_Day in
    1,21,31)
        echo "st"
        ;;
    2,22)
        echo "nd"
        ;;
    3,23)
        echo "rd"
        ;;
    *)
        echo "th"
        ;;
esac