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("",("${color4}${font %s}"):format(font_i(9))) :gsub("",("${font_b %s}"):format(font_b(9))) :gsub("","${color}${font}") :gsub("","") end function parse_entry(contents) local ret = "" for paragraph in contents:gmatch("

(.-)

") 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()