Странное поведение lua-кода (конфиг AwesomeWM)

С этим фрагментом кода в моем rc.lua (файл конфигурации AwesomeWM) я получаю то, что вы видите на изображении ниже:

mybattmon = wibox.widget.textbox()
function battery_status ()
  local output={}
  local fd=io.popen("acpi", "r")
  local line=fd:read()
  while line do
    local battery_load = string.match(line, "(%d*)%%")
    local discharging
    if string.match(line, "Discharging")=="Discharging"
    then
      discharging="-"
    elseif string.match(line, "Charging")=="Charging"
      then
      discharging="⚡"
    else 
      discharging=""
    end
--    if tonumber(battery_load) < 10 then fontColor="red" else fontColor="black" end
--    table.insert(output,"<span color='" ..fontColor.. "'>")
    table.insert(output,discharging.. "" ..battery_load.. "%")
--    table.insert(output,"</span>")
    line=fd:read() --read next line
  end
  return table.concat(output,"|")
end
my_battmon_timer = timer({ timeout = 2 })
my_battmon_timer:connect_signal("timeout", function() 
  mybattmon:set_markup( '<span background="#92B0A0" font="' .. font .. '"color="#000">BAT: ' .. battery_status() .. '</span>' )
end)
my_battmon_timer:start()

Хорошо

Если я раскомментирую три закомментированные строки (которые предназначены для изменения цвета, когда батарея разряжается ниже 10%), я получаю следующее:

Неправильно

Вертикальная полоса должна отделяться, когда я ставлю вторую батарею.

Кто-нибудь понимает, почему три строки, меняющие цвет, заставляют вставлять полосы до и после текста?


person Alejandro DC    schedule 19.05.2015    source источник


Ответы (1)


Вы вставляете каналы, когда в таблице более одного элемента.

Ваш исходный код фактически такой (для корпуса с одной батареей):

local output={}
table.insert(output, "a")
print(table.concat(output, "|"))
# a

Ваша некомментированная версия кода выглядит следующим образом:

local output={}
table.insert(output, "pre-a")
table.insert(output, "a")
table.insert(output, "post-a")
print(table.concat(output, "|"))
# pre-a|a|post-a

Вы хотите отформатировать строку span как одну запись в таблице.

if tonumber(battery_load) < 10 then fontColor="red" else fontColor="black" end
local batstr = "<span color='" ..fontColor.. "'>"
batstr = batstr..discharging.. "" ..battery_load.. "%"
batstr = batstr.."</span>"
table.insert(output,batstr)
person Etan Reisner    schedule 19.05.2015
comment
table.concat вставляет строку concat между каждым элементом таблицы. Ваша таблица обычно содержит одну запись для каждой батареи. Код без комментариев добавляет две дополнительные записи в таблицу для каждой батареи. Открывающий и закрывающий теги span. Для этого table.concat втыкает трубу между теми. Замените интервалы видимыми/печатными символами, и вы увидите проблему более четко. - person Etan Reisner; 19.05.2015
comment
Большое спасибо! Я не знал, что это функция table.concat, я думал, что это то же самое, что и table.insert, но без указания позиции (т.е. в конце). Спасибо за объяснение. Это сработало. - person Alejandro DC; 19.05.2015
comment
table.insert не требует позиции (вы не указываете ее ни в одном из ваших вызовов). И table.insert ничего не возвращает, а table.concat явно возвращает. - person Etan Reisner; 19.05.2015