parsav  Diff

Differences From Artifact [43aca48007]:

To Artifact [ee058ed0af]:


     1      1   -- vim: ft=terra
     2      2   local pstr = lib.mem.ptr(int8)
     3      3   local terra cs(s: rawstring)
     4      4   	return pstr { ptr = s, ct = lib.str.sz(s) }
     5      5   end
     6      6   
            7  +local terra 
            8  +push_promo_header(co: &lib.srv.convo, acc: &lib.str.acc, rter: &lib.store.actor, rid: uint64)
            9  +	acc:lpush('<div class="lede"><div class="promo"><img src="'):push(rter.avatar,0):lpush('"><a href="/')
           10  +	if rter.origin ~= 0 then acc:lpush('@') end
           11  +	acc:push(rter.xid,0):lpush('" class="username">')
           12  +	lib.render.nym(rter, 0, acc, true)
           13  +	acc:lpush('</a> retweeted</div>')
           14  +	if co.who.id == rter.id then
           15  +		acc:lpush('<a href="/post/'):shpush(rid):lpush('/del" class="del">✖</a>')
           16  +	end
           17  +end
           18  +			
     7     19   local terra 
     8     20   render_tweet(co: &lib.srv.convo, p: &lib.store.post, acc: &lib.str.acc)
     9         -	var author: &lib.store.actor
           21  +	var author: &lib.store.actor = nil
           22  +	var retweeter: &lib.store.actor = nil
    10     23   	for j = 0, co.actorcache.top do
    11         -		if p.author == co.actorcache(j).ptr.id then
    12         -			author = co.actorcache(j).ptr
           24  +		if p.author == co.actorcache(j).ptr.id then author    = co.actorcache(j).ptr end
           25  +		if p.rtdby  == co.actorcache(j).ptr.id then retweeter = co.actorcache(j).ptr end
           26  +		if author ~= nil and (p.rtdby == 0 or retweeter ~= nil) then
    13     27   			goto foundauth
    14     28   		end
    15     29   	end
    16         -	author = co.actorcache:insert(co.srv:actor_fetch_uid(p.author)).ptr
           30  +	if author == nil then
           31  +		author = co.actorcache:insert(co.srv:actor_fetch_uid(p.author)).ptr
           32  +	end
           33  +	if p.rtdby ~= 0 and retweeter == nil then
           34  +		retweeter = co.actorcache:insert(co.srv:actor_fetch_uid(p.rtdby)).ptr
           35  +	end
    17     36   
    18     37   	::foundauth::
    19     38   	var avistr: lib.str.acc if author.origin == 0 then
    20     39   		avistr:compose('/avi/',author.handle)
    21     40   	end
    22     41   	var timestr: int8[26] lib.osclock.ctime_r(&p.posted, &timestr[0])
    23     42   
    24         -	var bhtml = lib.smackdown.html([lib.mem.ptr(int8)] {ptr=p.body,ct=0}) defer bhtml:free()
           43  +	var bhtml = lib.smackdown.html([lib.mem.ptr(int8)] {ptr=p.body,ct=0})
           44  +	defer bhtml:free()
    25     45   
    26     46   	var idbuf: int8[lib.math.shorthand.maxlen]
    27     47   	var idlen = lib.math.shorthand.gen(p.id, idbuf)
    28     48   	var permalink: lib.str.acc permalink:compose('/post/',{idbuf,idlen})
    29         -	var fullname = lib.render.nym(author,0,nil) defer fullname:free()
           49  +	var fullname = lib.render.nym(author,0,nil, false) defer fullname:free()
    30     50   	var tpl = data.view.tweet {
    31     51   		text = bhtml;
    32     52   		subject = cs(lib.coalesce(p.subject,''));
    33     53   		nym = fullname;
    34     54   		when = cs(&timestr[0]);
    35     55   		avatar = cs(author.avatar);
    36     56   		acctlink = cs(author.xid);
    37     57   		permalink = permalink:finalize();
    38         -		attr = ''
           58  +		attr = pstr{'',0};
           59  +		stats = pstr{'',0};
    39     60   	}
           61  +	if p.rts + p.likes > 0 then
           62  +		var s: lib.str.acc s:init(128)
           63  +		s:lpush('<div class="stats">')
           64  +		if p.rts   > 0 then s:lpush('<div class="rt">'  ):ipush(p.rts  ):lpush('</div>') end
           65  +		if p.likes > 0 then s:lpush('<div class="like">'):ipush(p.likes):lpush('</div>') end
           66  +		s:lpush('</div>')
           67  +		tpl.stats = s:finalize()
           68  +	end
    40     69   
    41     70   	var attrbuf: int8[32]
    42     71   	if p.accent ~= -1 and p.accent ~= co.ui_hue then
    43     72   		var hdecbuf: int8[21]
    44     73   		var hdec = lib.math.decstr(p.accent, &hdecbuf[20])
    45     74   		lib.str.cpy(&attrbuf[0], ' style="--hue:')
    46     75   		lib.str.cpy(&attrbuf[14], hdec)
    47     76   		var len = &hdecbuf[20] - hdec 
    48     77   		lib.str.cpy(&attrbuf[14] + len, '"')
    49     78   		tpl.attr = &attrbuf[0]
    50     79   	end
    51     80   
    52     81   	defer tpl.permalink:free()
    53         -	if acc ~= nil then tpl:append(acc) return [lib.mem.ptr(int8)]{ptr=nil,ct=0} end
    54         -	var txt = tpl:tostr()
    55         -	return txt
           82  +	if acc ~= nil then
           83  +		if retweeter ~= nil then push_promo_header(co, acc, retweeter, p.rtact) end
           84  +		tpl:append(acc)
           85  +		if retweeter ~= nil then acc:lpush('</div>') end
           86  +		if p.rts + p.likes > 0 then tpl.stats:free() end
           87  +		return [lib.mem.ptr(int8)]{ptr=nil,ct=0}
           88  +	end
           89  +
           90  +	if retweeter ~= nil then
           91  +		var rta: lib.str.acc rta:init(512)
           92  +		push_promo_header(co, &rta, retweeter, p.rtact)
           93  +		tpl:append(&rta) rta:lpush('</div>')
           94  +		return rta:finalize()
           95  +	else
           96  +		var txt = tpl:tostr()
           97  +		if p.rts + p.likes > 0 then tpl.stats:free() end
           98  +		return txt
           99  +	end
    56    100   end
    57    101   return render_tweet