148 lines
5.1 KiB
Lua
148 lines
5.1 KiB
Lua
line_width = 200
|
|
function indent_entry(contents,init,break_at)
|
|
if contents:len() <= break_at then
|
|
return contents -- Done
|
|
end
|
|
|
|
local begin_tag,end_tag = contents:find("<(.-)>",init)
|
|
if not begin_tag or begin_tag > break_at then
|
|
-- No tag exists or next tag is behind preferred break
|
|
-- Find last space before break, if no space break word at break_at
|
|
for i=break_at,init,-1 do -- Iterate backwards over string
|
|
if contents:sub(i,i) == " " then
|
|
break_at = i
|
|
break;
|
|
end
|
|
end
|
|
contents = contents:sub(1,break_at) .. "\n" .. contents:sub(break_at+1)
|
|
init = break_at+1 -- Not necessarily same value as passed to the function
|
|
break_at = break_at + line_width
|
|
debug = "No tag or tag behind break."
|
|
elseif end_tag < break_at then
|
|
-- Next tag is before preferred break
|
|
-- Increase break_at by length of tag and iterate (init = end_tag)
|
|
init = end_tag
|
|
break_at = break_at + 1 + end_tag - begin_tag
|
|
debug = "Tag entirely before break"
|
|
else
|
|
-- Case break_at in the middle of tag:
|
|
-- Increase break at by length of tag
|
|
init = end_tag + 1
|
|
break_at = break_at + 1 + end_tag - begin_tag
|
|
debug = "Tag in the middle of break"
|
|
end
|
|
return indent_entry(contents,init,break_at)
|
|
end
|
|
function parse_paragraph(par)
|
|
return indent_entry(par:gsub("\n", " "),1,line_width)
|
|
end
|
|
function substitute_tags(content)
|
|
return content:gsub("<code>",("${color4}${font %s}"):format(font_i(9)))
|
|
:gsub("<b>",("${font_b %s}"):format(font_b(9)))
|
|
:gsub("</(.-)>","${color}${font}")
|
|
:gsub("<a(.-)>","")
|
|
end
|
|
function parse_entry(contents)
|
|
local ret = ""
|
|
for paragraph in contents:gmatch("<p>(.-)</p>") do
|
|
if ret ~= "" then
|
|
ret = ret .. "\n\n" -- Add line break on all except first entry
|
|
end
|
|
ret = ret .. parse_paragraph(paragraph)
|
|
end
|
|
return substitute_tags(ret)
|
|
end
|
|
function format_entry(entry)
|
|
local entry_contents = parse_entry(entry.summary)
|
|
local res = ('${color2}${font %s}%s\n'):format(font(12),entry.title)
|
|
res = ('%s${color}${font}%s'):format(res,entry_contents)
|
|
res = ('%s${color3}${font %s}${alignr} Uppdated: %s\n\n'):format(res,font(8),os.date("%x",entry.updated_parsed))
|
|
return res
|
|
end
|
|
function conky_print()
|
|
local f = assert(get_file_handle('rb'))
|
|
local content = f:read("*all")
|
|
f:close()
|
|
return content
|
|
end
|
|
function fetch_feed()
|
|
local imap4 = require "imap4"
|
|
local Message = require "pop3.message"
|
|
|
|
local connection = imap4('imap.gmail.com', 993)
|
|
|
|
assert(connection:isCapable('IMAP4rev1'))
|
|
|
|
connection:login('****', '****')
|
|
|
|
-- Select INBOX with read only permissions.
|
|
local info = connection:examine('INBOX')
|
|
print(info.exist, info.recent)
|
|
|
|
-- List info on the 4 most recent mails.
|
|
for _,v in pairs(connection:fetch('RFC822', (info.exist-4)..':*')) do
|
|
print("-------------------------")
|
|
local msg = Message(v.RFC822)
|
|
print("ID: ", msg:id())
|
|
print("subject: ", msg:subject())
|
|
print("to: ", msg:to())
|
|
print("from: ", msg:from())
|
|
print("from addr: ", msg:from_address())
|
|
print("reply: ", msg:reply_to())
|
|
print("reply addr: ", msg:reply_address())
|
|
print("trunc: ", msg:is_truncated())
|
|
for i,v in ipairs(msg:full_content()) do
|
|
if v.text then print(" ", i , "TEXT: ", v.type, #v.text)
|
|
else print(" ", i , "FILE: ", v.type, v.file_name or v.name, #v.data) end
|
|
end
|
|
end
|
|
|
|
-- close connection
|
|
connection:logout()
|
|
-- Fetch over http
|
|
local http_request = require "http.request"
|
|
local url = "https://www.archlinux.org/feeds/news/"
|
|
local headers, stream = assert(http_request.new_from_uri(url):go())
|
|
local body = assert(stream:get_body_as_string())
|
|
if headers:get ":status" ~= "200" then
|
|
error(body)
|
|
end
|
|
a,s,c = headers:geti(3)
|
|
p="%a+, (%d+) (%a+) (%d+) (%d+):(%d+):(%d+) GMT"
|
|
day,month,year,hour,min,sec=s:match(p)
|
|
MON={Jan=1,Feb=2,Mar=3,Apr=4,May=5,Jun=6,Jul=7,Aug=8,Sep=9,Oct=10,Nov=11,Dec=12}
|
|
month=MON[month]
|
|
offset=os.time()-os.time(os.date("!*t"))
|
|
retrieved = os.date("%x",os.time({day=day,month=month,year=year,hour=hour,min=min,sec=sec})+offset)
|
|
|
|
-- Parse
|
|
local feedparser = require("feedparser")
|
|
entries = feedparser.parse(body).entries
|
|
s = entries[2].summary
|
|
local res = ('${alignr}${font %s}Retrieved: %s\n'):format(font(8),retrieved)
|
|
for key,entry in pairs(entries) do
|
|
res = res .. format_entry(entry)
|
|
end
|
|
|
|
-- Save to cache
|
|
local file = get_file_handle("w")
|
|
io.output(file)
|
|
io.write(res)
|
|
io.close(file)
|
|
return parsed
|
|
end
|
|
function font(size)
|
|
return ('DejaVu Sans:size=%d'):format(size)
|
|
end
|
|
function font_b(size)
|
|
return ('DejaVu Sans:bold:size=%d'):format(size)
|
|
end
|
|
function font_i(size)
|
|
return ('DejaVu Sans:italic:size=%d'):format(size)
|
|
end
|
|
function get_file_handle(opt)
|
|
local filename = '/home/kuba/.conky/arch/cache'
|
|
return io.open(filename, opt)
|
|
end
|
|
s = fetch_feed()
|